1
1
use crate :: error:: Error ;
2
2
use crate :: { FtInner , PinUse } ;
3
3
use ftdi_mpsse:: { MpsseCmdBuilder , MpsseCmdExecutor } ;
4
- use std:: result:: Result ;
5
- use std:: { cell:: RefCell , sync:: Mutex } ;
4
+ use std:: sync:: { Arc , Mutex } ;
6
5
7
6
/// FTDI output pin.
8
7
///
@@ -13,7 +12,7 @@ use std::{cell::RefCell, sync::Mutex};
13
12
#[ derive( Debug ) ]
14
13
pub struct OutputPin < ' a , Device : MpsseCmdExecutor > {
15
14
/// Parent FTDI device.
16
- mtx : & ' a Mutex < RefCell < FtInner < Device > > > ,
15
+ mtx : & ' a Arc < Mutex < FtInner < Device > > > ,
17
16
/// GPIO pin index. 0-7 for the FT232H.
18
17
idx : u8 ,
19
18
}
@@ -25,34 +24,33 @@ where
25
24
Error < E > : From < E > ,
26
25
{
27
26
pub ( crate ) fn new (
28
- mtx : & ' a Mutex < RefCell < FtInner < Device > > > ,
27
+ mtx : & ' a Arc < Mutex < FtInner < Device > > > ,
29
28
idx : u8 ,
30
29
) -> Result < OutputPin < ' a , Device > , Error < E > > {
31
- let lock = mtx. lock ( ) . expect ( "Failed to aquire FTDI mutex" ) ;
32
- let mut inner = lock . borrow_mut ( ) ;
33
- inner . direction |= 1 << idx;
34
- inner . allocate_pin ( idx, PinUse :: Output ) ;
30
+ let mut lock = mtx. lock ( ) . expect ( "Failed to aquire FTDI mutex" ) ;
31
+
32
+ lock . direction |= 1 << idx;
33
+ lock . allocate_pin ( idx, PinUse :: Output ) ;
35
34
let cmd: MpsseCmdBuilder = MpsseCmdBuilder :: new ( )
36
- . set_gpio_lower ( inner . value , inner . direction )
35
+ . set_gpio_lower ( lock . value , lock . direction )
37
36
. send_immediate ( ) ;
38
- inner . ft . send ( cmd. as_slice ( ) ) ?;
37
+ lock . ft . send ( cmd. as_slice ( ) ) ?;
39
38
Ok ( OutputPin { mtx, idx } )
40
39
}
41
40
42
41
pub ( crate ) fn set ( & self , state : bool ) -> Result < ( ) , Error < E > > {
43
- let lock = self . mtx . lock ( ) . expect ( "Failed to aquire FTDI mutex" ) ;
44
- let mut inner = lock. borrow_mut ( ) ;
42
+ let mut lock = self . mtx . lock ( ) . expect ( "Failed to aquire FTDI mutex" ) ;
45
43
46
44
if state {
47
- inner . value |= self . mask ( ) ;
45
+ lock . value |= self . mask ( ) ;
48
46
} else {
49
- inner . value &= !self . mask ( ) ;
47
+ lock . value &= !self . mask ( ) ;
50
48
} ;
51
49
52
50
let cmd: MpsseCmdBuilder = MpsseCmdBuilder :: new ( )
53
- . set_gpio_lower ( inner . value , inner . direction )
51
+ . set_gpio_lower ( lock . value , lock . direction )
54
52
. send_immediate ( ) ;
55
- inner . ft . send ( cmd. as_slice ( ) ) ?;
53
+ lock . ft . send ( cmd. as_slice ( ) ) ?;
56
54
57
55
Ok ( ( ) )
58
56
}
91
89
#[ derive( Debug ) ]
92
90
pub struct InputPin < ' a , Device : MpsseCmdExecutor > {
93
91
/// Parent FTDI device.
94
- mtx : & ' a Mutex < RefCell < FtInner < Device > > > ,
92
+ mtx : & ' a Arc < Mutex < FtInner < Device > > > ,
95
93
/// GPIO pin index. 0-7 for the FT232H.
96
94
idx : u8 ,
97
95
}
@@ -103,28 +101,27 @@ where
103
101
Error < E > : From < E > ,
104
102
{
105
103
pub ( crate ) fn new (
106
- mtx : & ' a Mutex < RefCell < FtInner < Device > > > ,
104
+ mtx : & ' a Arc < Mutex < FtInner < Device > > > ,
107
105
idx : u8 ,
108
106
) -> Result < InputPin < ' a , Device > , Error < E > > {
109
- let lock = mtx. lock ( ) . expect ( "Failed to aquire FTDI mutex" ) ;
110
- let mut inner = lock . borrow_mut ( ) ;
111
- inner . direction &= !( 1 << idx) ;
112
- inner . allocate_pin ( idx, PinUse :: Input ) ;
107
+ let mut lock = mtx. lock ( ) . expect ( "Failed to aquire FTDI mutex" ) ;
108
+
109
+ lock . direction &= !( 1 << idx) ;
110
+ lock . allocate_pin ( idx, PinUse :: Input ) ;
113
111
let cmd: MpsseCmdBuilder = MpsseCmdBuilder :: new ( )
114
- . set_gpio_lower ( inner . value , inner . direction )
112
+ . set_gpio_lower ( lock . value , lock . direction )
115
113
. send_immediate ( ) ;
116
- inner . ft . send ( cmd. as_slice ( ) ) ?;
114
+ lock . ft . send ( cmd. as_slice ( ) ) ?;
117
115
Ok ( InputPin { mtx, idx } )
118
116
}
119
117
120
118
pub ( crate ) fn get ( & self ) -> Result < bool , Error < E > > {
121
- let lock = self . mtx . lock ( ) . expect ( "Failed to aquire FTDI mutex" ) ;
122
- let mut inner = lock. borrow_mut ( ) ;
119
+ let mut lock = self . mtx . lock ( ) . expect ( "Failed to aquire FTDI mutex" ) ;
123
120
124
121
let mut buffer = [ 0u8 ; 1 ] ;
125
122
let cmd: MpsseCmdBuilder = MpsseCmdBuilder :: new ( ) . gpio_lower ( ) . send_immediate ( ) ;
126
- inner . ft . send ( cmd. as_slice ( ) ) ?;
127
- inner . ft . recv ( & mut buffer) ?;
123
+ lock . ft . send ( cmd. as_slice ( ) ) ?;
124
+ lock . ft . recv ( & mut buffer) ?;
128
125
129
126
Ok ( ( buffer[ 0 ] & self . mask ( ) ) != 0 )
130
127
}
0 commit comments