Skip to content

Commit 178b39e

Browse files
committed
v0.4.0: Pressboi telemetry parity, firmware_key mapping, transducer docs
Add torque_avg and combined homed flag to firmware telemetry output to match Pressboi wire format. Add firmware_key fields to telemetry.json so the app can map abbreviated wire keys to canonical names. Copy transducer/ documentation folder from Pressboi. Made-with: Cursor
1 parent fc19eaa commit 178b39e

6 files changed

Lines changed: 220 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,21 @@
22

33
All notable changes to the Fillhead firmware will be documented in this file.
44

5+
## [0.4.0] - 2026-03-18
6+
7+
### Pressboi Parity (Telemetry)
8+
- Added `torque_avg` (wire key `ta`) to firmware telemetry — average of M0/M1 torque, matching Pressboi's `torque_avg` field
9+
- Added combined `homed` flag (wire key `hm`) to firmware telemetry — 1 when both machine and cartridge homing are complete, matching Pressboi's single `homed` field
10+
11+
### Telemetry Key Mapping
12+
- Added `firmware_key` field to all `telemetry.json` entries where the firmware wire key differs from the canonical name (e.g. `force_load_cell``flc`, `current_pos``cp`)
13+
- Added `derived_from` annotations for fields computed on the app side (`motors_enabled`, `force_source`)
14+
15+
### Documentation
16+
- Added `transducer/` folder with HX711 load cell interface documentation (`README.md`) and Ruggeduino Arduino sketch (`hx711_arduino.ino`)
17+
18+
---
19+
520
## [0.3.0] - 2026-03-18
621

722
### ForceSensor Port (CRITICAL)

definition/telemetry.json

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"main_state": {
33
"type": "string",
44
"default": "standby",
5+
"firmware_key": "fillhead_state",
56
"help": "Overall fillhead system state",
67
"gui_var": "fillhead_main_state_var"
78
},
@@ -55,6 +56,7 @@
5556
"heater_state": {
5657
"type": "int",
5758
"default": 0,
59+
"firmware_key": "h_st",
5860
"map": {
5961
"0": "off",
6062
"1": "active"
@@ -65,6 +67,7 @@
6567
"vacuum_state": {
6668
"type": "int",
6769
"default": 0,
70+
"firmware_key": "vac_st",
6871
"map": {
6972
"0": "off",
7073
"1": "pulldown",
@@ -81,12 +84,14 @@
8184
"type": "float",
8285
"default": 0.0,
8386
"precision": 1,
84-
"help": "Current motor torque percentage for injector",
87+
"firmware_key": "inj_t0",
88+
"help": "Current motor torque percentage for injector (motor 0)",
8589
"gui_var": "fillhead_injector_torque_var"
8690
},
8791
"injector_homed": {
8892
"type": "int",
8993
"default": 0,
94+
"firmware_key": "inj_h_mach",
9095
"map": {
9196
"0": "not homed",
9297
"1": "homed"
@@ -99,6 +104,7 @@
99104
"type": "float",
100105
"default": 0.0,
101106
"precision": 2,
107+
"firmware_key": "inj_cumulative_ml",
102108
"help": "Total volume dispensed since last cartridge home",
103109
"gui_var": "fillhead_injection_cumulative_ml_var"
104110
},
@@ -107,6 +113,7 @@
107113
"type": "float",
108114
"default": 0.0,
109115
"precision": 2,
116+
"firmware_key": "inj_active_ml",
110117
"help": "Volume dispensed in current injection operation",
111118
"gui_var": "fillhead_injection_active_ml_var"
112119
},
@@ -115,17 +122,19 @@
115122
"type": "float",
116123
"default": 0.0,
117124
"precision": 2,
125+
"firmware_key": "inj_tgt_ml",
118126
"help": "Target volume for current injection operation",
119127
"gui_var": "fillhead_injection_target_ml_var"
120128
},
121129
"motors_enabled": {
122130
"type": "bool",
123131
"default": 1,
132+
"derived_from": ["enabled0", "enabled1"],
124133
"map": {
125134
"0": "disabled",
126135
"1": "enabled"
127136
},
128-
"help": "Global motor power enable status",
137+
"help": "Global motor power enable status (derived from enabled0 AND enabled1)",
129138
"gui_var": "fillhead_motors_enabled_var"
130139
},
131140
"inj_valve_pos": {
@@ -167,6 +176,7 @@
167176
"type": "float",
168177
"default": 0.0,
169178
"precision": 1,
179+
"firmware_key": "vac_valve_torque",
170180
"help": "Current motor torque percentage for vacuum valve",
171181
"gui_var": "fillhead_vac_valve_motor_torque_var"
172182
},
@@ -185,6 +195,7 @@
185195
"type": "float",
186196
"default": 25.0,
187197
"precision": 1,
198+
"firmware_key": "h_pv",
188199
"help": "Current material temperature from thermocouple",
189200
"gui_var": "fillhead_temp_c_var"
190201
},
@@ -193,6 +204,7 @@
193204
"type": "float",
194205
"default": 70.0,
195206
"precision": 1,
207+
"firmware_key": "h_sp",
196208
"help": "Target temperature setpoint for PID controller",
197209
"gui_var": "fillhead_heater_setpoint_var"
198210
},
@@ -201,6 +213,7 @@
201213
"type": "float",
202214
"default": 0.5,
203215
"precision": 2,
216+
"firmware_key": "vac_pv",
204217
"help": "Current vacuum pressure reading",
205218
"gui_var": "fillhead_vacuum_psig_var"
206219
},
@@ -209,6 +222,7 @@
209222
"type": "float",
210223
"default": 0.0,
211224
"precision": 2,
225+
"firmware_key": "flc",
212226
"help": "Force from load cell sensor",
213227
"gui_var": "fillhead_force_load_cell_var"
214228
},
@@ -217,6 +231,7 @@
217231
"type": "float",
218232
"default": 0.0,
219233
"precision": 2,
234+
"firmware_key": "fmt",
220235
"help": "Force calculated from motor torque",
221236
"gui_var": "fillhead_force_motor_torque_var"
222237
},
@@ -225,24 +240,28 @@
225240
"type": "float",
226241
"default": 1000.0,
227242
"precision": 1,
243+
"firmware_key": "fl",
228244
"help": "Maximum force limit for current operation",
229245
"gui_var": "fillhead_force_limit_var"
230246
},
231247
"force_source": {
232248
"type": "string",
233249
"default": "load_cell",
234-
"help": "Source of force reading: load_cell or motor_torque",
250+
"derived_from": ["force_mode"],
251+
"help": "Source of force reading: load_cell or motor_torque (derived from force_mode)",
235252
"gui_var": "fillhead_force_source_var"
236253
},
237254
"force_adc_raw": {
238255
"type": "int",
239256
"default": 0,
257+
"firmware_key": "far",
240258
"help": "Raw ADC value from HX711 load cell amplifier (for calibration)",
241259
"gui_var": "fillhead_force_adc_raw_var"
242260
},
243261
"force_mode": {
244262
"type": "string",
245263
"default": "load_cell",
264+
"firmware_key": "fm",
246265
"help": "Active force sensing mode (load_cell or motor_torque)",
247266
"gui_var": "fillhead_force_mode_var"
248267
},
@@ -251,6 +270,7 @@
251270
"type": "float",
252271
"default": 0.0,
253272
"precision": 3,
273+
"firmware_key": "j",
254274
"help": "Energy expended during current move (force x distance integrated at 50Hz)",
255275
"gui_var": "fillhead_joules_var"
256276
},
@@ -279,6 +299,7 @@
279299
"type": "float",
280300
"default": 0.0,
281301
"precision": 2,
302+
"firmware_key": "cp",
282303
"help": "Current position of press axis",
283304
"gui_var": "fillhead_current_pos_var"
284305
},
@@ -287,6 +308,7 @@
287308
"type": "float",
288309
"default": 0.0,
289310
"precision": 2,
311+
"firmware_key": "rp",
290312
"help": "Preset retract position for the press",
291313
"gui_var": "fillhead_retract_pos_var"
292314
},
@@ -295,6 +317,7 @@
295317
"type": "float",
296318
"default": 0.0,
297319
"precision": 2,
320+
"firmware_key": "tp",
298321
"help": "Target position for current move operation",
299322
"gui_var": "fillhead_target_pos_var"
300323
},
@@ -303,6 +326,7 @@
303326
"type": "float",
304327
"default": 0.0,
305328
"precision": 2,
329+
"firmware_key": "ep",
306330
"help": "Actual position where last move ended (force trigger or completion)",
307331
"gui_var": "fillhead_endpoint_var"
308332
},
@@ -311,6 +335,7 @@
311335
"type": "float",
312336
"default": 0.0,
313337
"precision": 2,
338+
"firmware_key": "sp",
314339
"help": "Position where press threshold was crossed (press started)",
315340
"gui_var": "fillhead_startpoint_var"
316341
},
@@ -319,6 +344,7 @@
319344
"type": "float",
320345
"default": 2.0,
321346
"precision": 2,
347+
"firmware_key": "pt",
322348
"help": "Force threshold for energy/startpoint recording",
323349
"gui_var": "fillhead_press_threshold_var"
324350
},
@@ -327,12 +353,14 @@
327353
"type": "float",
328354
"default": 0.0,
329355
"precision": 1,
356+
"firmware_key": "ta",
330357
"help": "Average motor torque percentage",
331358
"gui_var": "fillhead_torque_avg_var"
332359
},
333360
"homed": {
334361
"type": "int",
335362
"default": 0,
363+
"firmware_key": "hm",
336364
"map": {
337365
"0": "not homed",
338366
"1": "homed"
@@ -343,6 +371,7 @@
343371
"home_sensor_m0": {
344372
"type": "int",
345373
"default": 0,
374+
"firmware_key": "hs0",
346375
"map": {
347376
"0": "inactive",
348377
"1": "active"
@@ -353,6 +382,7 @@
353382
"home_sensor_m1": {
354383
"type": "int",
355384
"default": 0,
385+
"firmware_key": "hs1",
356386
"map": {
357387
"0": "inactive",
358388
"1": "active"
@@ -363,6 +393,7 @@
363393
"polarity": {
364394
"type": "string",
365395
"default": "normal",
396+
"firmware_key": "pol",
366397
"help": "Coordinate system polarity (normal or inverted)",
367398
"gui_var": "fillhead_polarity_var"
368399
}

inc/config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
* @{
4545
*/
4646
#define STATUS_MESSAGE_BUFFER_SIZE 256 ///< Standard buffer size for composing status and error messages.
47-
#define FIRMWARE_VERSION "0.3.0"
47+
#define FIRMWARE_VERSION "0.4.0"
4848
/** @} */
4949

5050
//==================================================================================================

src/injector_controller.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2294,15 +2294,18 @@ const char* Injector::getTelemetryString() {
22942294

22952295
// Stage 2: Pressboi-compatible fields (appended if space remains)
22962296
if (n > 0 && (size_t)n < sizeof(m_telemetryBuffer) - 1) {
2297+
int homed = (m_homingMachineDone && m_homingCartridgeDone) ? 1 : 0;
22972298
std::snprintf(m_telemetryBuffer + n, sizeof(m_telemetryBuffer) - n,
22982299
",fmt:%.1f,flc:%.2f,far:%ld,fl:%.1f,j:%.4f,"
22992300
"cp:%.3f,rp:%.2f,tp:%.2f,"
23002301
"ep:%.3f,sp:%.3f,pt:%.1f,"
2302+
"ta:%.1f,hm:%d,"
23012303
"hs0:%d,hs1:%d,fm:%s,pol:%s",
23022304
force_motor_torque, force_load_cell, (long)force_adc_raw,
23032305
force_limit, (float)m_joules,
23042306
machine_pos_mm, retract_pos, target_pos,
23052307
m_endpoint_mm, m_press_startpoint_mm, m_press_threshold_kg,
2308+
avg_torque, homed,
23062309
getHomeSensorStateM0() ? 1 : 0, getHomeSensorStateM1() ? 1 : 0,
23072310
m_force_mode, m_polarity);
23082311
}

0 commit comments

Comments
 (0)