@@ -6,70 +6,86 @@ use crate::{
6
6
} ,
7
7
utils:: log,
8
8
} ;
9
- use futures:: channel:: oneshot;
9
+ use futures:: { channel:: mpsc, SinkExt } ;
10
+ use futures:: task:: Spawn ;
10
11
use futures:: {
11
- channel:: oneshot :: { Receiver , Sender } ,
12
+ channel:: mpsc :: { Receiver , Sender } ,
12
13
lock:: Mutex ,
13
14
AsyncReadExt , AsyncWrite , AsyncWriteExt ,
14
15
} ;
15
16
use serialport:: SerialPort ;
16
- use std:: { future:: Future , sync:: Arc } ;
17
- use futures:: task:: Spawn ;
17
+ use std:: { future:: Future , sync:: Arc , thread:: JoinHandle } ;
18
18
19
19
pub struct SimpleSerialPort {
20
- read : Arc < Mutex < Box < dyn SerialPort > > > ,
21
- write : Arc < Mutex < Box < dyn SerialPort > > > ,
22
- tx : Sender < UnpiPacket < ' static > > ,
23
- rx : Receiver < UnpiPacket < ' static > > ,
20
+ path : String ,
21
+ baud_rate : u32 ,
22
+ // from the serial port to the coordinator
23
+ serial_to : (
24
+ Option < Sender < UnpiPacket < ' static > > > ,
25
+ Option < Receiver < UnpiPacket < ' static > > > ,
26
+ ) ,
27
+ // from the coordinator to the serial port
28
+ to_serial : (
29
+ Option < Sender < UnpiPacket < ' static > > > ,
30
+ Option < Receiver < UnpiPacket < ' static > > > ,
31
+ ) ,
32
+ read_thread : Option < JoinHandle < ( ) > > ,
33
+ write_thread : Option < JoinHandle < ( ) > > ,
24
34
}
25
35
26
36
impl SimpleSerialPort {
27
37
pub fn new ( path : & str , baud_rate : u32 ) -> Result < Self , CoordinatorError > {
28
- let ( tx, rx) = oneshot:: channel ( ) ;
38
+ let serial_to = mpsc:: channel ( 10 ) ;
39
+ let serial_to = ( Some ( serial_to. 0 ) , Some ( serial_to. 1 ) ) ;
40
+ let to_serial = mpsc:: channel ( 10 ) ;
41
+ let to_serial = ( Some ( to_serial. 0 ) , Some ( to_serial. 1 ) ) ;
29
42
Ok ( SimpleSerialPort {
30
- read : Arc :: new ( Mutex :: new (
31
- serialport:: new ( path, baud_rate)
32
- . timeout ( std:: time:: Duration :: from_millis ( 10 ) )
33
- . open ( )
34
- . map_err ( |_e| CoordinatorError :: SerialOpen ) ?,
35
- ) ) ,
36
- write : Arc :: new ( Mutex :: new (
37
- serialport:: new ( path, baud_rate)
38
- . timeout ( std:: time:: Duration :: from_millis ( 10 ) )
39
- . open ( )
40
- . map_err ( |_e| CoordinatorError :: SerialOpen ) ?,
41
- ) ) ,
42
- tx,
43
- rx,
43
+ path : path. to_string ( ) ,
44
+ baud_rate,
45
+ serial_to,
46
+ to_serial,
47
+ read_thread : None ,
48
+ write_thread : None ,
44
49
} )
45
50
}
46
51
47
- pub async fn start ( & self ) -> Result < ( ) , CoordinatorError > {
48
- let mut read = self . read . lock ( ) . await ;
49
- let mut write = self . write . lock ( ) . await ;
50
- let ( tx, rx) = ( self . tx , self . rx ) ;
51
- let mut buffer = [ 0u8 ; 256 ] ;
52
- let receive = async {
52
+ pub async fn start ( & mut self ) -> Result < ( ) , CoordinatorError > {
53
+ let mut read = serialport:: new ( self . path . clone ( ) , self . baud_rate )
54
+ . timeout ( std:: time:: Duration :: from_millis ( 10 ) )
55
+ . open ( )
56
+ . map_err ( |_e| CoordinatorError :: SerialOpen ) ?;
57
+ let mut write = serialport:: new ( self . path . clone ( ) , self . baud_rate )
58
+ . timeout ( std:: time:: Duration :: from_millis ( 10 ) )
59
+ . open ( )
60
+ . map_err ( |_e| CoordinatorError :: SerialOpen ) ?;
61
+
62
+ let tx = self . serial_to . 0 . take ( ) . unwrap ( ) ;
63
+ let receive_from_serial_send_to_channel = move || {
64
+ let tx = tx;
53
65
loop {
54
- let len = read. read ( & mut buffer) . map_err ( |_e| CoordinatorError :: SerialRead ) ?;
66
+ let mut buffer = [ 0u8 ; 256 ] ;
67
+ let len = read
68
+ . read ( & mut buffer)
69
+ . map_err ( |_e| CoordinatorError :: SerialRead )
70
+ . unwrap ( ) ;
55
71
let packet = UnpiPacket :: from_payload (
56
72
( & buffer[ ..len] , LenTypeInfo :: OneByte ) ,
57
73
( MessageType :: SREQ , Subsystem :: Sys ) ,
58
74
0 ,
59
- ) ?;
75
+ )
76
+ . unwrap ( ) ;
60
77
log ! ( "<<< {:?}" , packet) ;
61
- tx. send ( packet) . map_err ( |_e| CoordinatorError :: SerialWrite ) ?;
78
+ tx. send ( packet)
79
+ . map_err ( |_e| CoordinatorError :: SerialWrite )
80
+ . unwrap ( ) ;
62
81
}
63
82
} ;
64
- let send = async {
65
- loop {
66
- let packet = rx. await . map_err ( |_e| CoordinatorError :: SerialWrite ) ?;
67
- let mut buffer = [ 0u8 ; 256 ] ;
68
- packet. to_bytes ( & mut buffer) ?;
69
- write. write_all ( buffer) . map_err ( |_e| CoordinatorError :: SerialWrite ) ?;
70
-
71
- }
83
+ let rx = self . to_serial . 1 . take ( ) . unwrap ( ) ;
84
+ let receive_from_channel_send_to_serial = || loop {
85
+ let packet = rx. recv ( ) . unwrap ( ) ;
86
+ todo ! ( )
72
87
} ;
88
+
73
89
todo ! ( )
74
90
}
75
91
}
0 commit comments