1
1
use crate :: args:: CheatArgs ;
2
2
use crate :: config:: Config ;
3
3
use crate :: net:: connect;
4
- use crate :: serial:: read_cobs_frame ;
4
+ use crate :: serial:: SerialStream ;
5
5
use anyhow:: { bail, Context , Result } ;
6
6
use firefly_types:: { serial, Encode } ;
7
7
use std:: io:: { Read , Write } ;
@@ -34,7 +34,7 @@ pub fn cheat_emulator(args: &CheatArgs) -> Result<()> {
34
34
stream. read ( & mut buf) . context ( "read response" ) ?;
35
35
let resp = serial:: Response :: decode ( & buf) . context ( "decode response" ) ?;
36
36
if let serial:: Response :: Cheat ( result) = resp {
37
- println ! ( "✅ response: {result}" ) ;
37
+ println ! ( "✅ response: {result}" ) ;
38
38
return Ok ( ( ) ) ;
39
39
}
40
40
}
@@ -44,39 +44,30 @@ pub fn cheat_emulator(args: &CheatArgs) -> Result<()> {
44
44
/// Run cheat on the connected device.
45
45
pub fn cheat_device ( args : & CheatArgs , port : & str ) -> Result < ( ) > {
46
46
println ! ( "⏳️ connecting..." ) ;
47
- let mut stream = serialport:: new ( port, args. baud_rate )
47
+ let port = serialport:: new ( port, args. baud_rate )
48
48
. timeout ( Duration :: from_secs ( 5 ) )
49
49
. open ( )
50
50
. context ( "open the serial port" ) ?;
51
+ let mut stream = SerialStream :: new ( port) ;
51
52
52
53
{
53
- let buf = serialize_request ( args) ?;
54
+ let cmd = parse_command ( & args. command , & args. root ) ?;
55
+ let val = parse_value ( & args. value ) ?;
56
+ let req = serial:: Request :: Cheat ( cmd, val) ;
54
57
println ! ( "⌛ sending request..." ) ;
55
- stream. write_all ( & buf) . context ( "send request" ) ?;
56
- stream. flush ( ) . context ( "flush request" ) ?;
58
+ stream. send ( & req) ?;
57
59
}
58
60
59
61
println ! ( "⌛ waiting for response..." ) ;
60
- let mut buf = Vec :: new ( ) ;
61
62
for _ in 0 ..5 {
62
- let mut chunk = vec ! [ 0 ; 64 ] ;
63
- let n = stream. read ( & mut chunk) . context ( "read response" ) ?;
64
- buf. extend_from_slice ( & chunk[ ..n] ) ;
65
- loop {
66
- let ( frame, rest) = read_cobs_frame ( & buf) ;
67
- buf = Vec :: from ( rest) ;
68
- if frame. is_empty ( ) {
69
- break ;
70
- }
71
- match serial:: Response :: decode ( & frame) . context ( "decode response" ) {
72
- Ok ( serial:: Response :: Cheat ( result) ) => {
73
- println ! ( "✅ response: {result}" ) ;
74
- return Ok ( ( ) ) ;
75
- }
76
- Ok ( serial:: Response :: Log ( log) ) => println ! ( "🪵 {log}" ) ,
77
- Ok ( _) => ( ) ,
78
- Err ( err) => println ! ( "❌ ERROR(cli): {err}" ) ,
63
+ match stream. next ( ) {
64
+ Ok ( serial:: Response :: Cheat ( result) ) => {
65
+ println ! ( "✅ response: {result}" ) ;
66
+ return Ok ( ( ) ) ;
79
67
}
68
+ Ok ( serial:: Response :: Log ( log) ) => println ! ( "🪵 {log}" ) ,
69
+ Ok ( _) => ( ) ,
70
+ Err ( err) => println ! ( "❌ ERROR(cli): {err}" ) ,
80
71
}
81
72
}
82
73
bail ! ( "timed out waiting for response" )
0 commit comments