HF-TMC51x0 Driver (TMC5130 & TMC5160) 0.1.0-dev
Hardware Agnostic C++ Driver for the TMC51x0 (TMC5130 & TMC5160)
Loading...
Searching...
No Matches
espnow_protocol.hpp
Go to the documentation of this file.
1
12#pragma once
13
14#include <cstdint>
15#include <cstring>
16#include "freertos/FreeRTOS.h"
17#include "freertos/queue.h"
19#include "esp_log.h"
20
21// Include security definitions for pairing support
22#include "espnow_security.hpp"
23
24// ------------- ESPNOW CONFIG -------------
25
26// Sync byte at start of every message
27static constexpr uint8_t ESPNOW_SYNC_BYTE = 0xAA;
28
29// Protocol version (must match remote controller)
30static constexpr uint8_t ESPNOW_PROTOCOL_VERSION = 1;
31
32// Device ID for this fatigue tester (must match remote controller device registry)
33static constexpr uint8_t DEVICE_ID_FATIGUE_TESTER = 1;
34
35// Max payload bytes in our custom packet
36static constexpr size_t ESPNOW_MAX_PAYLOAD = 200;
37
38// WiFi/ESP-NOW channel
39static constexpr uint8_t WIFI_CHANNEL = 1;
40
41// Remote controller (UI board) MAC address (STA interface).
42// If set non-zero, the test unit can send responses immediately (without waiting
43// to "learn" the sender MAC from the first inbound ESPNOW message).
44//
45// Update this when the remote controller prints its MAC, e.g.:
46// Remote Controller MAC (STA): B0:81:84:96:90:10
47static constexpr uint8_t UI_BOARD_MAC[6] = { 0xB0, 0x81, 0x84, 0x96, 0x90, 0x10 };
48
49// ------------- MESSAGE TYPES -------------
50
60enum class MsgType : uint8_t {
63 ConfigRequest, // = 3
64 ConfigResponse, // = 4
65 ConfigSet, // = 5
66 ConfigAck, // = 6
67 Command, // = 7
68 CommandAck, // = 8
69 StatusUpdate, // = 9
70 Error, // = 10
71 ErrorClear, // = 11
72 TestComplete, // = 12
73
74 // Fatigue-test extensions
75 BoundsResult = 13,
76
77 // Security / Pairing messages (20-29 range)
78 PairingRequest = 20,
79 PairingResponse = 21,
80 PairingConfirm = 22,
81 PairingReject = 23,
82 Unpair = 24,
83};
84
90enum class TestState : uint8_t {
91 Idle = 0,
92 Running,
93 Paused,
95 Error
96};
97
103enum class CommandId : uint8_t {
104 Start = 1,
105 Pause = 2,
106 Resume = 3,
107 Stop = 4,
108 // Dedicated bounds-finding command (independent of starting the test).
110 // Set manual bounds (center distance from left stop, degrees).
111 SetManualBounds = 6,
114 ManualBoundsJog = 9,
116 ManualBoundsCancel = 11,
117 ManualBoundsReZero = 12,
120};
121
130#pragma pack(push, 1)
141#pragma pack(pop)
142
143// ------------- PACKET STRUCTURES -------------
144
159#pragma pack(push, 1)
161 uint8_t sync; // always ESPNOW_SYNC_BYTE
162 uint8_t version; // protocol version
163 uint8_t device_id; // device type ID
164 uint8_t type; // MsgType
165 uint8_t id; // sequence ID
166 uint8_t len; // payload length (0..ESPNOW_MAX_PAYLOAD)
167};
168
179 uint16_t crc; // CRC over [hdr + payload[0..len-1]]
180};
181#pragma pack(pop)
182
192#pragma pack(push, 1)
194 // Base fields (17 bytes) - required, always present
195 uint32_t cycle_amount; // Target number of cycles (0 = infinite)
196 float oscillation_vmax_rpm; // Max oscillation velocity (RPM) - directly to TMC5160 VMAX
197 float oscillation_amax_rev_s2; // Oscillation acceleration (rev/s²) - directly to TMC5160 AMAX
198 uint32_t dwell_time_ms; // Dwell time at endpoints (milliseconds)
199 uint8_t bounds_method; // 0 = stallguard, 1 = encoder
200
201 // Extended fields (16 bytes) - optional, for bounds finding configuration
202 float bounds_search_velocity_rpm; // Search speed during bounds finding (RPM)
203 float stallguard_min_velocity_rpm; // Minimum velocity threshold for StallGuard2 (RPM)
204 float stall_detection_current_factor; // Current reduction factor (0.0-1.0)
205 float bounds_search_accel_rev_s2; // Acceleration during bounds finding (rev/s²)
206
207 // Extended v2 field (optional)
208 // StallGuard threshold (SGT). Valid range is typically [-64, 63].
209 // 127 means "use test config default".
211};
212
217 uint8_t ok; // 1 = success, 0 = failure
218 uint8_t err_code; // optional error code
219};
220
225 uint8_t command_id; // CommandId enum value
226};
227
232 uint32_t cycle_number;
233 uint8_t state; // TestState enum value
234 uint8_t err_code; // error code if state == Error
235 // 1 = bounds may be reused (motor still energized + within validity window)
236 // 0 = bounds invalid, must re-run bounds finding
237 // 255 = unknown/unspecified (backward compatibility)
239};
240
245 uint8_t err_code;
246 uint32_t at_cycle;
247};
248#pragma pack(pop)
249
250// ------------- SETTINGS STRUCTURE -------------
251
260 uint32_t cycle_amount = 300;
261 float oscillation_vmax_rpm = 60.0f;
263 uint32_t dwell_time_ms = 500;
265
266 // Extended configuration for bounds finding (configurable via remote controller)
271
272 int8_t stallguard_sgt = 0;
273};
274
281 bool orientation_flipped = false;
282 // Future UI settings can be added here (e.g., brightness, contrast, etc.)
283};
284
294
295// ------------- EVENTS -------------
296
342
350 union {
351 TestUnitSettings config; // Config data (includes extended float fields)
352 struct { uint32_t cycle; TestState state; uint8_t err_code; } status;
353 struct { uint8_t err_code; uint32_t at_cycle; } error;
354 struct {
355 uint8_t peer_mac[6];
356 uint8_t device_type;
360 struct { float target_deg; } manual_jog;
364};
365
366// ------------- CRC16-CCITT FUNCTION -------------
367
375inline uint16_t Crc16Ccitt(const uint8_t* data, size_t len) noexcept
376{
377 uint16_t crc = 0xFFFF;
378 for (size_t i = 0; i < len; ++i) {
379 crc ^= static_cast<uint16_t>(data[i]) << 8;
380 for (int j = 0; j < 8; ++j) {
381 if (crc & 0x8000) {
382 crc = (crc << 1) ^ 0x1021;
383 } else {
384 crc <<= 1;
385 }
386 }
387 }
388 return crc;
389}
Compatibility include wrapper for ESP-IDF headers when building with -Wpedantic in C++.
static constexpr uint8_t DEVICE_ID_FATIGUE_TESTER
Definition espnow_protocol.hpp:33
static constexpr size_t ESPNOW_MAX_PAYLOAD
Definition espnow_protocol.hpp:36
MsgType
Wire-level message type identifiers.
Definition espnow_protocol.hpp:60
@ PairingConfirm
Final confirmation.
@ BoundsResult
@ StatusUpdate
@ TestComplete
@ ConfigRequest
@ ConfigResponse
@ PairingRequest
Initiate pairing (broadcast)
@ PairingResponse
Response with HMAC proof.
@ Unpair
Remove a paired device.
@ PairingReject
Explicit rejection.
@ DeviceDiscovery
TestState
Protocol-visible test states encoded in STATUS_UPDATE.
Definition espnow_protocol.hpp:90
CommandId
Command IDs for COMMAND message type.
Definition espnow_protocol.hpp:103
@ ManualBoundsArmPlaced
Arm at left stop: engage motor, set reference.
@ ManualBoundsReZero
Re-zero motor position at current location.
@ ManualBoundsConfirm
Confirm bounds (center_deg f32, local_gap_deg f32)
@ ManualBoundsStart
Start manual bounds: disengage motor.
@ ManualBoundsCancel
Cancel manual bounds finding.
@ StartWithManualBounds
Start test reusing cached manual bounds (center, gap, fix_offset)
@ ManualBoundsJog
Jog to absolute position (float degrees)
@ RunBoundsFinding
@ StartWithManualRealign
Start test after manual encoder realignment (skip hard-drive)
static constexpr uint8_t UI_BOARD_MAC[6]
Definition espnow_protocol.hpp:47
static constexpr uint8_t WIFI_CHANNEL
Definition espnow_protocol.hpp:39
static constexpr uint8_t ESPNOW_SYNC_BYTE
Definition espnow_protocol.hpp:27
static constexpr uint8_t ESPNOW_PROTOCOL_VERSION
Definition espnow_protocol.hpp:30
ProtoEventType
Higher-level events emitted by the protocol layer.
Definition espnow_protocol.hpp:306
@ CommandManualBoundsConfirm
@ CommandManualBoundsArmPlaced
@ PairingComplete
Pairing completed successfully.
@ CommandStartWithManualBounds
@ PairingFailed
Pairing failed (rejected or timeout)
@ PeerUnpaired
A peer was unpaired.
@ CommandStartWithManualRealign
uint16_t Crc16Ccitt(const uint8_t *data, size_t len) noexcept
Compute CRC16-CCITT (poly 0x1021, init 0xFFFF).
Definition espnow_protocol.hpp:375
ESP-NOW security and pairing protocol definitions.
static constexpr size_t MAX_DEVICE_NAME_LEN
Maximum device name length.
Definition espnow_security.hpp:120
Payload for BOUNDS_RESULT.
Definition espnow_protocol.hpp:131
float min_degrees_from_center
Definition espnow_protocol.hpp:136
float global_min_degrees
Definition espnow_protocol.hpp:138
uint8_t bounded
1=mechanical stops detected; 0=unbounded default window used
Definition espnow_protocol.hpp:133
uint8_t reserved
Definition espnow_protocol.hpp:135
float global_max_degrees
Definition espnow_protocol.hpp:139
uint8_t ok
1=success (bounded or intentionally unbounded default); 0=failure
Definition espnow_protocol.hpp:132
float max_degrees_from_center
Definition espnow_protocol.hpp:137
uint8_t cancelled
1=cancelled by user/STOP/PAUSE
Definition espnow_protocol.hpp:134
Payload for COMMAND message.
Definition espnow_protocol.hpp:224
uint8_t command_id
Definition espnow_protocol.hpp:225
Payload for CONFIG_ACK.
Definition espnow_protocol.hpp:216
uint8_t ok
Definition espnow_protocol.hpp:217
uint8_t err_code
Definition espnow_protocol.hpp:218
Payload for CONFIG_SET / CONFIG_RESPONSE.
Definition espnow_protocol.hpp:193
float oscillation_amax_rev_s2
Definition espnow_protocol.hpp:197
float bounds_search_accel_rev_s2
Definition espnow_protocol.hpp:205
float stall_detection_current_factor
Definition espnow_protocol.hpp:204
float stallguard_min_velocity_rpm
Definition espnow_protocol.hpp:203
int8_t stallguard_sgt
Definition espnow_protocol.hpp:210
uint8_t bounds_method
Definition espnow_protocol.hpp:199
uint32_t dwell_time_ms
Definition espnow_protocol.hpp:198
float oscillation_vmax_rpm
Definition espnow_protocol.hpp:196
uint32_t cycle_amount
Definition espnow_protocol.hpp:195
float bounds_search_velocity_rpm
Definition espnow_protocol.hpp:202
Payload for ERROR.
Definition espnow_protocol.hpp:244
uint32_t at_cycle
Definition espnow_protocol.hpp:246
uint8_t err_code
Definition espnow_protocol.hpp:245
ESP-NOW packet header (wire format) - 6 bytes.
Definition espnow_protocol.hpp:160
uint8_t sync
Definition espnow_protocol.hpp:161
uint8_t version
Definition espnow_protocol.hpp:162
uint8_t len
Definition espnow_protocol.hpp:166
uint8_t id
Definition espnow_protocol.hpp:165
uint8_t type
Definition espnow_protocol.hpp:164
uint8_t device_id
Definition espnow_protocol.hpp:163
Full packet representation (header + max payload + CRC field).
Definition espnow_protocol.hpp:176
uint16_t crc
Definition espnow_protocol.hpp:179
EspNowHeader hdr
Definition espnow_protocol.hpp:177
uint8_t payload[ESPNOW_MAX_PAYLOAD]
Definition espnow_protocol.hpp:178
Protocol event structure pushed through FreeRTOS queues.
Definition espnow_protocol.hpp:348
uint8_t err_code
Definition espnow_protocol.hpp:352
TestState state
Definition espnow_protocol.hpp:352
struct ProtoEvent::@27::@32 manual_jog
char device_name[MAX_DEVICE_NAME_LEN]
Definition espnow_protocol.hpp:357
union ProtoEvent::@27 data
struct ProtoEvent::@27::@28 status
uint8_t peer_mac[6]
Definition espnow_protocol.hpp:355
float target_deg
Definition espnow_protocol.hpp:360
float total_range_deg
Definition espnow_protocol.hpp:361
uint32_t cycle
Definition espnow_protocol.hpp:352
float right_backoff_deg
Definition espnow_protocol.hpp:361
uint8_t device_type
Definition espnow_protocol.hpp:356
struct ProtoEvent::@27::@30 pairing
struct ProtoEvent::@27::@29 error
ProtoEventType type
Definition espnow_protocol.hpp:349
float center_distance_deg
Definition espnow_protocol.hpp:359
struct ProtoEvent::@27::@34 manual_start
uint32_t at_cycle
Definition espnow_protocol.hpp:353
struct ProtoEvent::@27::@33 manual_confirm
TestUnitSettings config
Definition espnow_protocol.hpp:351
float left_backoff_deg
Definition espnow_protocol.hpp:361
struct ProtoEvent::@27::@31 manual_bounds
Complete settings structure containing both test unit and UI settings.
Definition espnow_protocol.hpp:290
TestUnitSettings test_unit
Test machine settings (synced via ESP-NOW)
Definition espnow_protocol.hpp:291
UISettings ui
UI board settings (local only)
Definition espnow_protocol.hpp:292
Payload for STATUS_UPDATE.
Definition espnow_protocol.hpp:231
uint8_t bounds_valid
Definition espnow_protocol.hpp:238
uint32_t cycle_number
Definition espnow_protocol.hpp:232
uint8_t err_code
Definition espnow_protocol.hpp:234
uint8_t state
Definition espnow_protocol.hpp:233
Test unit settings - synchronized with test machine via ESP-NOW.
Definition espnow_protocol.hpp:259
float bounds_search_velocity_rpm
Search speed during bounds finding (RPM, 0 = use test config default)
Definition espnow_protocol.hpp:267
float stall_detection_current_factor
Current reduction factor (0.0-1.0, 0 = use test config default)
Definition espnow_protocol.hpp:269
uint32_t cycle_amount
Target cycles (0 = infinite)
Definition espnow_protocol.hpp:260
bool bounds_method_stallguard
true = StallGuard2, false = encoder
Definition espnow_protocol.hpp:264
float oscillation_amax_rev_s2
Acceleration during oscillation (rev/s²)
Definition espnow_protocol.hpp:262
int8_t stallguard_sgt
StallGuard threshold [-64..63], 127 = use test config default.
Definition espnow_protocol.hpp:272
float stallguard_min_velocity_rpm
Min velocity for StallGuard2 (RPM, 0 = use test config default)
Definition espnow_protocol.hpp:268
uint32_t dwell_time_ms
Dwell at endpoints (ms)
Definition espnow_protocol.hpp:263
float bounds_search_accel_rev_s2
Search acceleration (rev/s², 0 = use test config default)
Definition espnow_protocol.hpp:270
float oscillation_vmax_rpm
Max velocity during oscillation (RPM)
Definition espnow_protocol.hpp:261
UI board settings - stored locally, never synchronized with test unit.
Definition espnow_protocol.hpp:280
bool orientation_flipped
Whether display orientation is flipped.
Definition espnow_protocol.hpp:281