@@ -56,20 +56,20 @@ In each way a CommandInterface struct is created and the Commands trait is imple
56
56
Option 1 is simpler as hid-io-protocol can handle all processing from a hidraw interface. Device libraries usually go for this.
57
57
58
58
``` rust
59
- type BufChunk = U64 ;
60
- type IdLen = U10 ;
61
- type MessageLen = U256 ;
62
- type RxBuf = U8 ;
63
- type SerializationLen = U276 ;
64
- type TxBuf = U8 ;
59
+ const BufChunk : usize = U64 ;
60
+ const IdLen : usize = U10 ;
61
+ const MessageLen : usize = U256 ;
62
+ const RxBuf : usize = U8 ;
63
+ const SerializationLen : usize = U276 ;
64
+ const TxBuf : usize = U8 ;
65
65
66
66
let ids = [
67
67
HidIoCommandID :: SupportedIDs ,
68
68
/* Add supported ids */
69
69
/* This is the master list, if it's not listed here comamnds will not work */
70
70
];
71
71
72
- let intf = CommandInterface :: <TxBuf , RxBuf , BufChunk , MessageLen , SerializationLen , IdLen >:: new (& ids ). unwrap ();
72
+ let intf = CommandInterface :: <TxBuf , RxBuf , BufChunk , MessageLen , { MessageLen - 1 }, { MessageLen - 4 }, SerializationLen , IdLen >:: new (& ids ). unwrap ();
73
73
}
74
74
75
75
// The max length must equal BufChunk (e.g. 64 bytes)
@@ -101,16 +101,15 @@ match intf.tx_bytebuf.dequeue() {
101
101
}
102
102
103
103
struct CommandInterface <
104
- TX : ArrayLength <Vec <u8 , N >>,
105
- RX : ArrayLength <Vec <u8 , N >>,
106
- N : ArrayLength <u8 >,
107
- H : ArrayLength <u8 >,
108
- S : ArrayLength <u8 >,
109
- ID : ArrayLength <HidIoCommandID > + ArrayLength <u8 >,
110
- > where
111
- H : core :: fmt :: Debug ,
112
- H : Sub <B1 >,
113
- {
104
+ const TX : usize ,
105
+ const RX : usize ,
106
+ const N : usize ,
107
+ const H : usize ,
108
+ const HSUB1 : usize ,
109
+ const HSUB4 : usize ,
110
+ const S : usize ,
111
+ const ID : usize ,
112
+ > {
114
113
ids : Vec <HidIoCommandID , ID >,
115
114
rx_bytebuf : buffer :: Buffer <RX , N >,
116
115
rx_packetbuf : HidIoPacketBuffer <H >,
@@ -119,20 +118,19 @@ struct CommandInterface<
119
118
}
120
119
121
120
impl <
122
- TX : ArrayLength <Vec <u8 , N >>,
123
- RX : ArrayLength <Vec <u8 , N >>,
124
- N : ArrayLength <u8 >,
125
- H : ArrayLength <u8 >,
126
- S : ArrayLength <u8 >,
127
- ID : ArrayLength <HidIoCommandID > + ArrayLength <u8 >,
128
- > CommandInterface <TX , RX , N , H , S , ID >
129
- where
130
- H : core :: fmt :: Debug ,
131
- H : Sub <B1 >,
121
+ const TX : usize ,
122
+ const RX : usize ,
123
+ const N : usize ,
124
+ const H : usize ,
125
+ const HSUB1 : usize ,
126
+ const HSUB4 : usize ,
127
+ const S : usize ,
128
+ const ID : usize ,
129
+ > CommandInterface <TX , RX , N , H , HSUB1 , HSUB4 , S , ID >
132
130
{
133
131
fn new (
134
132
ids : & [HidIoCommandID ],
135
- ) -> Result <CommandInterface <TX , RX , N , H , S , ID >, CommandError > {
133
+ ) -> Result <CommandInterface <TX , RX , N , H , HSUB1 , HSUB4 , S , ID >, CommandError > {
136
134
// Make sure we have a large enough id vec
137
135
let ids = match Vec :: from_slice (ids ) {
138
136
Ok (ids ) => ids ,
@@ -191,10 +189,7 @@ where
191
189
/// Process rx buffer until empty
192
190
/// Handles flushing tx->rx, decoding, then processing buffers
193
191
/// Returns the number of buffers processed
194
- pub fn process_rx (& mut self ) -> Result <u8 , CommandError >
195
- where
196
- <H as Sub <B1 >>:: Output : ArrayLength <u8 >,
197
- {
192
+ pub fn process_rx (& mut self ) -> Result <u8 , CommandError > {
198
193
// Decode bytes into buffer
199
194
while (self . rx_packetbuffer_decode ()? {
200
195
// Process rx buffer
@@ -216,18 +211,17 @@ where
216
211
/// S - Serialization buffer size
217
212
/// ID - Max number of HidIoCommandIDs
218
213
impl <
219
- TX : ArrayLength <Vec <u8 , N >>,
220
- RX : ArrayLength <Vec <u8 , N >>,
221
- N : ArrayLength <u8 >,
222
- H : ArrayLength <u8 >,
223
- S : ArrayLength <u8 >,
224
- ID : ArrayLength <HidIoCommandID > + ArrayLength <u8 >,
225
- > Commands <H , ID > for CommandInterface <TX , RX , N , H , S , ID >
226
- where
227
- H : core :: fmt :: Debug + Sub <B1 >,
228
- {
214
+ const TX : usize ,
215
+ const RX : usize ,
216
+ const N : usize ,
217
+ const H : usize ,
218
+ const HSUB1 : usize ,
219
+ const HSUB4 : usize ,
220
+ const S : usize ,
221
+ const ID : usize ,
222
+ > Commands <H , ID > for CommandInterface <TX , RX , N , H , HSUB1 , HSUB4 , S , ID > {
229
223
fn default_packet_chunk (& self ) -> u32 {
230
- < N as Unsigned > :: to_u32 ()
224
+ N as u32
231
225
}
232
226
233
227
fn tx_packetbuffer_send (& mut self , buf : & mut HidIoPacketBuffer <H >) -> Result <(), CommandError > {
@@ -247,8 +241,8 @@ where
247
241
// was serialized
248
242
// The first byte is a serde type and is dropped
249
243
let data = & self . serial_buf;
250
- for pos in (1 .. data . len ()). step_by (< N as Unsigned > :: to_usize () ) {
251
- let len = core :: cmp :: min (< N as Unsigned > :: to_usize () , data . len () - pos );
244
+ for pos in (1 .. data . len ()). step_by (N ) {
245
+ let len = core :: cmp :: min (N , data . len () - pos );
252
246
match self
253
247
. tx_bytebuf
254
248
. enqueue (match Vec :: from_slice (& data [pos .. len + pos ]) {
@@ -279,7 +273,7 @@ hid-io-core uses Option 2 as different threads handle byte ingest and message ha
279
273
280
274
``` rust
281
275
struct CommandInterface {}
282
- impl Commands <mailbox :: HidIoPacketBufferDataSize , U0 > for CommandInterface {
276
+ impl Commands <mailbox :: HidIoPacketBufferDataSize , 0 > for CommandInterface {
283
277
fn tx_packetbuffer_send (
284
278
& mut self ,
285
279
buf : & mut mailbox :: HidIoPacketBuffer ,
0 commit comments