1- use alloc:: { boxed:: Box , vec, vec:: Vec } ;
2- use core:: convert:: From ;
3-
41use crate :: common:: {
52 calc_checksum, calc_crc, get_byte, get_byte_timeout, ModemError ,
63 ModemResult , ModemTrait , XModemTrait ,
74} ;
5+ #[ cfg( feature = "alloc" ) ]
6+ use alloc:: { vec, vec:: Vec } ;
7+ use core:: convert:: From ;
88use core2:: io:: { Read , Write } ;
9+ #[ cfg( not( feature = "alloc" ) ) ]
10+ use heapless:: Vec ;
911
1012use crate :: variants:: xmodem:: {
1113 common:: { BlockLengthKind , ChecksumKind } ,
@@ -101,8 +103,14 @@ impl XModemTrait for XModem {
101103 // We'll respond with cancel later if the packet number is wrong
102104 let cancel_packet =
103105 packet_num != pnum || ( 255 - pnum) != pnum_1c;
106+ #[ cfg( feature = "alloc" ) ]
104107 let mut data: Vec < u8 > = Vec :: new ( ) ;
108+ #[ cfg( not( feature = "alloc" ) ) ]
109+ let mut data: Vec < u8 , 1024 > = Vec :: new ( ) ;
110+ #[ cfg( feature = "alloc" ) ]
105111 data. resize ( packet_size, 0 ) ;
112+ #[ cfg( not( feature = "alloc" ) ) ]
113+ data. resize ( packet_size, 0 ) . unwrap_or_default ( ) ;
106114 dev. read_exact ( & mut data) ?;
107115 let success = match self . checksum_mode {
108116 ChecksumKind :: Standard => {
@@ -144,7 +152,7 @@ impl XModemTrait for XModem {
144152 if self . errors >= self . max_errors {
145153 dev. write_all ( & [ Consts :: CAN . into ( ) ] ) ?;
146154 return Err ( ModemError :: ExhaustedRetries {
147- errors : Box :: from ( self . errors ) ,
155+ errors : self . errors ,
148156 } ) ;
149157 }
150158 }
@@ -183,7 +191,7 @@ impl XModemTrait for XModem {
183191 if self . errors >= self . max_errors {
184192 // FIXME: Removed a unused 'if let' here. To be re-added?
185193 return Err ( ModemError :: ExhaustedRetries {
186- errors : Box :: from ( self . errors ) ,
194+ errors : self . errors ,
187195 } ) ;
188196 }
189197 }
@@ -208,7 +216,7 @@ impl XModemTrait for XModem {
208216
209217 if self . errors >= self . max_errors {
210218 return Err ( ModemError :: ExhaustedRetries {
211- errors : Box :: from ( self . errors ) ,
219+ errors : self . errors ,
212220 } ) ;
213221 }
214222 }
@@ -221,7 +229,16 @@ impl XModemTrait for XModem {
221229 {
222230 let mut block_num = 0u32 ;
223231 loop {
232+ #[ cfg( feature = "alloc" ) ]
224233 let mut buff = vec ! [ self . pad_byte; self . block_length as usize + 3 ] ;
234+ #[ cfg( not( feature = "alloc" ) ) ]
235+ let mut buff: Vec < u8 , 1029 > = Vec :: new ( ) ;
236+ #[ cfg( not( feature = "alloc" ) ) ]
237+ buff. resize ( self . block_length as usize + 3 , self . pad_byte )
238+ . unwrap_or_default ( ) ;
239+
240+ #[ cfg( feature = "alloc" ) ]
241+ buff. resize ( self . block_length as usize + 3 , self . pad_byte ) ;
225242 let n = inp. read ( & mut buff[ 3 ..] ) ?;
226243 if n == 0 {
227244 return Ok ( ( ) ) ;
@@ -238,12 +255,21 @@ impl XModemTrait for XModem {
238255 match self . checksum_mode {
239256 ChecksumKind :: Standard => {
240257 let checksum = calc_checksum ( & buff[ 3 ..] ) ;
258+ #[ cfg( feature = "alloc" ) ]
241259 buff. push ( checksum) ;
260+ #[ cfg( not( feature = "alloc" ) ) ]
261+ buff. push ( checksum) . unwrap_or_default ( ) ;
242262 }
243263 ChecksumKind :: Crc16 => {
244264 let crc = calc_crc ( & buff[ 3 ..] ) ;
265+ #[ cfg( feature = "alloc" ) ]
245266 buff. push ( ( ( crc >> 8 ) & 0xFF ) as u8 ) ;
267+ #[ cfg( feature = "alloc" ) ]
246268 buff. push ( ( & crc & 0xFF ) as u8 ) ;
269+ #[ cfg( not( feature = "alloc" ) ) ]
270+ buff. push ( ( ( crc >> 8 ) & 0xFF ) as u8 ) . unwrap_or_default ( ) ;
271+ #[ cfg( not( feature = "alloc" ) ) ]
272+ buff. push ( ( & crc & 0xFF ) as u8 ) . unwrap_or_default ( ) ;
247273 }
248274 }
249275
@@ -260,7 +286,7 @@ impl XModemTrait for XModem {
260286
261287 if self . errors >= self . max_errors {
262288 return Err ( ModemError :: ExhaustedRetries {
263- errors : Box :: from ( self . errors ) ,
289+ errors : self . errors ,
264290 } ) ;
265291 }
266292 }
0 commit comments