Skip to content

Commit d5052f1

Browse files
committed
Change to alloc feature
1 parent bb605cf commit d5052f1

File tree

5 files changed

+80
-13
lines changed

5 files changed

+80
-13
lines changed

Cargo.lock

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@ edition = "2021"
1414
all-features = true
1515

1616
[features]
17-
default = []
17+
default = ["heapless", "xmodem", "ymodem", "zmodem"]
1818
xmodem = []
1919
ymodem = []
2020
zmodem = []
21+
alloc = []
2122

2223
[dependencies]
2324
core2 = { version = "0.4.0", default-features = false }
2425
crc16 = "0.4.0"
2526
thiserror-no-std = "2.0.2"
2627
anyhow = { version = "1.0.75", default-features = false }
28+
heapless = { version = "0.8.0", optional = true }

src/common.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
#![allow(dead_code)]
22

3+
#[cfg(feature = "alloc")]
34
extern crate alloc;
45

5-
use alloc::boxed::Box;
6+
#[cfg(feature = "alloc")]
67
use alloc::string::String;
8+
#[cfg(not(feature = "alloc"))]
9+
use heapless::String;
710

811
use anyhow::Result;
912
use core2::io::{Error, Read, Write};
@@ -34,7 +37,7 @@ pub enum ModemError {
3437
/// The number of communications errors exceeded `max_errors` in a single
3538
/// transmission.
3639
#[error("Too many errors, aborting - max errors: {errors}")]
37-
ExhaustedRetries { errors: Box<u32> },
40+
ExhaustedRetries { errors: u32 },
3841

3942
/// The transmission was canceled by the other end of the channel.
4043
#[error("Cancelled by the other party.")]
@@ -142,14 +145,16 @@ pub trait YModemTrait: ModemTrait {
142145
&mut self,
143146
dev: &mut D,
144147
out: &mut W,
145-
file_name: &mut String,
148+
#[cfg(feature = "alloc")] file_name: &mut String,
149+
#[cfg(not(feature = "alloc"))] file_name: &mut String<128>,
146150
file_size: &mut u32,
147151
) -> ModemResult<()>;
148152
fn send<D: Read + Write, R: Read>(
149153
&mut self,
150154
dev: &mut D,
151155
inp: &mut R,
152-
file_name: String,
156+
#[cfg(feature = "alloc")] file_name: String,
157+
#[cfg(not(feature = "alloc"))] file_name: String<128>,
153158
file_size: u64,
154159
) -> ModemResult<()>;
155160
fn send_stream<D: Read + Write, R: Read>(
@@ -162,7 +167,8 @@ pub trait YModemTrait: ModemTrait {
162167
fn send_start_frame<D: Read + Write>(
163168
&mut self,
164169
dev: &mut D,
165-
file_name: String,
170+
#[cfg(feature = "alloc")] file_name: String,
171+
#[cfg(not(feature = "alloc"))] file_name: String<128>,
166172
file_size: u64,
167173
) -> ModemResult<()>;
168174
fn send_end_frame<D: Read + Write>(

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
variant_size_differences
1717
)]
1818

19+
#[cfg(feature = "alloc")]
1920
extern crate alloc;
2021

2122
mod common;

src/variants/api/xmodem.rs

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
use alloc::{boxed::Box, vec, vec::Vec};
2-
use core::convert::From;
3-
41
use 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;
88
use core2::io::{Read, Write};
9+
#[cfg(not(feature = "alloc"))]
10+
use heapless::Vec;
911

1012
use 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

Comments
 (0)