Skip to content

Commit 47ed447

Browse files
committed
♻️ Binary Stream
1 parent 3d1fedc commit 47ed447

File tree

8 files changed

+36
-34
lines changed

8 files changed

+36
-34
lines changed

Marlin/src/core/mstring.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,5 +319,5 @@ class MString {
319319
#ifndef TS_SIZE
320320
#define TS_SIZE 63
321321
#endif
322-
typedef MString<TS_SIZE, DISABLED(UNSAFE_MSTRING)> TString;
322+
typedef MString<TS_SIZE> TString;
323323
#define TS(V...) TString(V)

Marlin/src/feature/binary_stream.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
#include "binary_stream.h"
2929

3030
char* SDFileTransferProtocol::Packet::Open::data = nullptr;
31-
size_t SDFileTransferProtocol::data_waiting, SDFileTransferProtocol::transfer_timeout, SDFileTransferProtocol::idle_timeout;
31+
size_t SDFileTransferProtocol::data_waiting;
32+
TDelay<SDFileTransferProtocol::TIMEOUT> SDFileTransferProtocol::transfer_timeout;
3233
bool SDFileTransferProtocol::transfer_active, SDFileTransferProtocol::dummy_transfer, SDFileTransferProtocol::compression;
3334

3435
BinaryStream binaryStream[NUM_SERIAL];

Marlin/src/feature/binary_stream.h

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ inline int bs_read_serial(const serial_index_t index) {
4040
}
4141

4242
class SDFileTransferProtocol {
43+
public:
44+
static const uint16_t VERSION_MAJOR = 0, VERSION_MINOR = 1, VERSION_PATCH = 0, TIMEOUT = 10000, IDLE_PERIOD = 1000;
45+
4346
private:
4447
struct Packet {
4548
struct [[gnu::packed]] Open {
@@ -128,22 +131,24 @@ class SDFileTransferProtocol {
128131

129132
enum class FileTransfer : uint8_t { QUERY, OPEN, CLOSE, WRITE, ABORT };
130133

131-
static size_t data_waiting, transfer_timeout, idle_timeout;
134+
static size_t data_waiting;
135+
static TDelay<TIMEOUT> transfer_timeout;
132136
static bool transfer_active, dummy_transfer, compression;
133137

134138
public:
135139

136140
static void idle() {
137141
// If a transfer is interrupted and a file is left open, abort it after TIMEOUT ms
138-
const millis_t ms = millis();
139-
if (transfer_active && ELAPSED(ms, idle_timeout)) {
140-
idle_timeout = ms + IDLE_PERIOD;
141-
if (ELAPSED(ms, transfer_timeout)) transfer_abort();
142+
static TDelay<IDLE_PERIOD> idle_timeout;
143+
const uint16_t ms = millis16();
144+
if (transfer_active && idle_timeout.elapsed(ms)) {
145+
idle_timeout.prime(ms);
146+
if (transfer_timeout.elapsed(ms)) transfer_abort();
142147
}
143148
}
144149

145150
static void process(uint8_t packet_type, char *buffer, const uint16_t length) {
146-
transfer_timeout = millis() + TIMEOUT;
151+
transfer_timeout.prime();
147152
switch (static_cast<FileTransfer>(packet_type)) {
148153
case FileTransfer::QUERY:
149154
SERIAL_ECHO(F("PFT:version:"), VERSION_MAJOR, C('.'), VERSION_MINOR, C('.'), VERSION_PATCH);
@@ -193,8 +198,6 @@ class SDFileTransferProtocol {
193198
break;
194199
}
195200
}
196-
197-
static const uint16_t VERSION_MAJOR = 0, VERSION_MINOR = 1, VERSION_PATCH = 0, TIMEOUT = 10000, IDLE_PERIOD = 1000;
198201
};
199202

200203
class BinaryStream {
@@ -206,6 +209,8 @@ class BinaryStream {
206209
enum class StreamState : uint8_t { PACKET_RESET, PACKET_WAIT, PACKET_HEADER, PACKET_DATA, PACKET_FOOTER,
207210
PACKET_PROCESS, PACKET_RESEND, PACKET_TIMEOUT, PACKET_ERROR };
208211

212+
static const uint16_t PACKET_MAX_WAIT = 500, RX_TIMESLICE = 20, MAX_RETRIES = 0, VERSION_MAJOR = 0, VERSION_MINOR = 1, VERSION_PATCH = 0;
213+
209214
struct Packet { // 10 byte protocol overhead, ascii with checksum and line number has a minimum of 7 increasing with line
210215

211216
union Header {
@@ -236,7 +241,7 @@ class BinaryStream {
236241
Footer footer;
237242
uint32_t bytes_received;
238243
uint16_t checksum, header_checksum;
239-
millis_t timeout;
244+
TDelay<PACKET_MAX_WAIT> max_wait;
240245
char* buffer;
241246

242247
void reset() {
@@ -245,7 +250,7 @@ class BinaryStream {
245250
bytes_received = 0;
246251
checksum = 0;
247252
header_checksum = 0;
248-
timeout = millis() + PACKET_MAX_WAIT;
253+
max_wait.prime();
249254
buffer = nullptr;
250255
}
251256
} packet{};
@@ -258,28 +263,28 @@ class BinaryStream {
258263

259264
// fletchers 16 checksum
260265
uint32_t checksum(uint32_t cs, uint8_t value) {
261-
uint16_t cs_low = (((cs & 0xFF) + value) % 255);
262-
return ((((cs >> 8) + cs_low) % 255) << 8) | cs_low;
266+
const uint16_t cs_low = (((cs & 0xFF) + value) % 255);
267+
return ((((cs >> 8) + cs_low) % 255) << 8) | cs_low;
263268
}
264269

265270
// read the next byte from the data stream keeping track of
266271
// whether the stream times out from data starvation
267272
// takes the data variable by reference in order to return status
268273
bool stream_read(uint8_t& data) {
269-
if (stream_state != StreamState::PACKET_WAIT && ELAPSED(millis(), packet.timeout)) {
274+
if (stream_state != StreamState::PACKET_WAIT && packet.max_wait.pending()) {
270275
stream_state = StreamState::PACKET_TIMEOUT;
271276
return false;
272277
}
273278
if (!bs_serial_data_available(card.transfer_port_index)) return false;
274279
data = bs_read_serial(card.transfer_port_index);
275-
packet.timeout = millis() + PACKET_MAX_WAIT;
280+
packet.max_wait.prime();
276281
return true;
277282
}
278283

279284
template<const size_t buffer_size>
280285
void receive(char (&buffer)[buffer_size]) {
281286
uint8_t data = 0;
282-
millis_t transfer_window = millis() + RX_TIMESLICE;
287+
const TDelay<RX_TIMESLICE> transfer_window;
283288

284289
#if HAS_MEDIA
285290
PORT_REDIRECT(SERIAL_PORTMASK(card.transfer_port_index));
@@ -288,7 +293,7 @@ class BinaryStream {
288293
#pragma GCC diagnostic push
289294
#pragma GCC diagnostic ignored "-Warray-bounds"
290295

291-
while (PENDING(millis(), transfer_window)) {
296+
while (transfer_window.pending()) {
292297
switch (stream_state) {
293298
/**
294299
* Data stream packet handling
@@ -446,7 +451,6 @@ class BinaryStream {
446451
SDFileTransferProtocol::idle();
447452
}
448453

449-
static const uint16_t PACKET_MAX_WAIT = 500, RX_TIMESLICE = 20, MAX_RETRIES = 0, VERSION_MAJOR = 0, VERSION_MINOR = 1, VERSION_PATCH = 0;
450454
uint8_t packet_retries, sync;
451455
uint16_t buffer_next_index;
452456
uint32_t bytes_received;

buildroot/tests/STM32F103RE_btt_USB

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Configuration" "$3"
1717
restore_configs
1818
opt_set MOTHERBOARD BOARD_BTT_SKR_CR6 SERIAL_PORT -1 SERIAL_PORT_2 2 TEMP_SENSOR_BED 1
1919
opt_enable CR10_STOCKDISPLAY SDSUPPORT EMERGENCY_PARSER FAN_SOFT_PWM \
20-
NOZZLE_AS_PROBE Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN Z_SAFE_HOMING \
20+
NOZZLE_AS_PROBE Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN Z_SAFE_HOMING WAIT_FOR_BED_HEATER \
2121
PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE \
22-
PROBING_HEATERS_OFF PREHEAT_BEFORE_PROBING
22+
PREHEAT_BEFORE_PROBING PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF
2323
opt_disable NOZZLE_TO_PROBE_OFFSET
2424
exec_test $1 $2 "BigTreeTech SKR CR6 PROBE_ACTIVATION_SWITCH, Probe Tare" "$3"

buildroot/tests/STM32F446VE_fysetc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ exec_test $1 $2 "FYSETC S6 Example" "$3"
1717
# Build with FTDI Eve Touch UI and some features
1818
#
1919
restore_configs
20-
opt_set MOTHERBOARD BOARD_FYSETC_S6_V2_0 SERIAL_PORT 1 X_DRIVER_TYPE TMC2130
20+
opt_set MOTHERBOARD BOARD_FYSETC_S6_V2_0 SERIAL_PORT 1 X_DRIVER_TYPE TMC2130 \
21+
TEMP_SENSOR_PROBE 1 TEMP_PROBE_PIN PB6
2122
opt_enable TOUCH_UI_FTDI_EVE LCD_FYSETC_TFT81050 S6_TFT_PINMAP LCD_LANGUAGE_2 SDSUPPORT CUSTOM_MENU_MAIN \
22-
FIX_MOUNTED_PROBE AUTO_BED_LEVELING_UBL Z_SAFE_HOMING \
23+
FIX_MOUNTED_PROBE PTC_PROBE PTC_BED AUTO_BED_LEVELING_UBL Z_SAFE_HOMING \
2324
EEPROM_SETTINGS PRINTCOUNTER CALIBRATION_GCODE LIN_ADVANCE \
2425
FILAMENT_RUNOUT_SENSOR ADVANCED_PAUSE_FEATURE NOZZLE_PARK_FEATURE
2526
exec_test $1 $2 "FYSETC S6 2 with LCD FYSETC TFT81050" "$3"

buildroot/tests/mega1280

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ exec_test $1 $2 "ZRIB_V52 | DUAL_X_CARRIAGE" "$3"
4949
# Delta Config (generic) + Probeless
5050
#
5151
use_example_configs delta/generic
52-
opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_AUTO_CALIBRATION DELTA_CALIBRATION_MENU
52+
opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER DELTA_AUTO_CALIBRATION DELTA_CALIBRATION_MENU \
53+
LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST
5354
exec_test $1 $2 "RAMPS | DELTA | RRD LCD | DELTA_AUTO_CALIBRATION | DELTA_CALIBRATION_MENU" "$3"
5455

5556
#

buildroot/tests/mega2560

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO NUM_SERVOS 1 \
6363
EXTRUDERS 4 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 TEMP_SENSOR_3 1 TEMP_SENSOR_4 1 FAN_KICKSTART_TIME 500 \
6464
NUM_RUNOUT_SENSORS 4 FIL_RUNOUT2_PIN 44 FIL_RUNOUT3_PIN 45 FIL_RUNOUT4_PIN 46 FIL_RUNOUT5_PIN 47 \
6565
FIL_RUNOUT3_STATE HIGH FILAMENT_RUNOUT_SCRIPT '"M600 T%c"'
66-
opt_enable VIKI2 BOOT_MARLIN_LOGO_ANIMATED SDSUPPORT AUTO_REPORT_SD_STATUS \
66+
opt_enable VIKI2 BOOT_MARLIN_LOGO_ANIMATED SDSUPPORT AUTO_REPORT_SD_STATUS BINARY_FILE_TRANSFER \
6767
Z_PROBE_SERVO_NR Z_SERVO_ANGLES Z_SERVO_MEASURE_ANGLE DEACTIVATE_SERVOS_AFTER_MOVE Z_SERVO_DEACTIVATE_AFTER_STOW \
6868
AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE PROBE_PT_1 PROBE_PT_2 PROBE_PT_3 \
6969
EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL AUTO_REPORT_POSITION \

buildroot/tests/rambo

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,16 @@ set -e
1212
restore_configs
1313
opt_set MOTHERBOARD BOARD_RAMBO \
1414
EXTRUDERS 2 TEMP_SENSOR_0 -2 TEMP_SENSOR_1 1 TEMP_SENSOR_BED 2 \
15-
TEMP_SENSOR_PROBE 1 TEMP_PROBE_PIN 12 \
1615
TEMP_SENSOR_CHAMBER 3 TEMP_CHAMBER_PIN 3 HEATER_CHAMBER_PIN 45 \
1716
GRID_MAX_POINTS_X 16 BACKLASH_MEASUREMENT_FEEDRATE 600 \
1817
AUTO_POWER_E_TEMP 80 FANMUX0_PIN 53 FIL_MOTION1_PIN 45
1918
opt_disable Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN USE_WATCHDOG
20-
opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \
21-
FIX_MOUNTED_PROBE CODEPENDENT_XY_HOMING PIDTEMPBED PTC_PROBE PTC_BED \
22-
PREHEAT_BEFORE_PROBING PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \
23-
EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \
19+
opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER \
20+
FIX_MOUNTED_PROBE EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE \
2421
BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \
2522
NEOPIXEL_LED NEOPIXEL_PIN CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \
2623
PID_PARAMS_PER_HOTEND PID_AUTOTUNE_MENU PID_EDIT_MENU PID_EXTRUSION_SCALING LCD_SHOW_E_TOTAL \
2724
PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 LCD_BED_TRAMMING BED_TRAMMING_INCLUDE_CENTER \
28-
NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR FILAMENT_RUNOUT_DISTANCE_MM FILAMENT_MOTION_SENSOR FILAMENT_SWITCH_AND_MOTION \
29-
ADVANCED_PAUSE_FEATURE FILAMENT_LOAD_UNLOAD_GCODES FILAMENT_UNLOAD_ALL_EXTRUDERS \
30-
PASSWORD_FEATURE PASSWORD_ON_STARTUP PASSWORD_ON_SD_PRINT_MENU PASSWORD_AFTER_SD_PRINT_END PASSWORD_AFTER_SD_PRINT_ABORT \
3125
AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DISTINCT_E_FACTORS \
3226
SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE ONE_CLICK_PRINT NO_SD_AUTOSTART \
3327
BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \
@@ -57,6 +51,7 @@ opt_set MOTHERBOARD BOARD_RAMBO \
5751
opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER REVERSE_ENCODER_DIRECTION SDSUPPORT EEPROM_SETTINGS \
5852
S_CURVE_ACCELERATION X_DUAL_ENDSTOPS Y_DUAL_ENDSTOPS \
5953
ADAPTIVE_STEP_SMOOTHING CNC_COORDINATE_SYSTEMS GCODE_MOTION_MODES \
54+
PASSWORD_FEATURE PASSWORD_ON_STARTUP PASSWORD_ON_SD_PRINT_MENU PASSWORD_AFTER_SD_PRINT_END PASSWORD_AFTER_SD_PRINT_ABORT \
6055
LCD_BED_TRAMMING BED_TRAMMING_INCLUDE_CENTER
6156
opt_disable MIN_SOFTWARE_ENDSTOP_Z MAX_SOFTWARE_ENDSTOPS
6257
exec_test $1 $2 "Rambo CNC Configuration" "$3"
@@ -112,7 +107,7 @@ opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CO
112107
LIN_ADVANCE ADVANCE_K_EXTRA \
113108
INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT EXPERIMENTAL_I2CBUS M100_FREE_MEMORY_WATCHER \
114109
NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE \
115-
ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES \
110+
ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES FILAMENT_UNLOAD_ALL_EXTRUDERS \
116111
PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 M114_DETAIL
117112
opt_disable NOZZLE_CLEAN_PATTERN_CIRCLE
118113
opt_add M100_FREE_MEMORY_DUMPER

0 commit comments

Comments
 (0)