Skip to content

XM10 Extension Module SDK v2.8.1

Release date: 2026-10-07 | Target boards: Rev 1.1 · Rev 2.0 | Renamed: PC tool folder pc-data-tool


At a glance

  • The PC tool now handles several structs at once. The live view splits into one tab per Module ID, and each module gets its own CSV.
  • A defect in data received over CAN-FD was fixed. When the receive buffer was full, an empty message could slip in (Rev 1.1 · Rev 2.0).
  • The PC tool folder is now pc-data-tool. What it does and how you use it are unchanged.
  • EMG Hub calibration through the XM API — XM_SendEmgHubCalCommand() (Rev 2.0).
  • Example count — Rev 2.0: 45 / Rev 1.1: 40.
  • The bootloader attached to this release is now v1.1.0. Boot is faster, and if the board keeps resetting it stops and waits for a firmware upload (Rev 2.0). Not yet confirmed on a board.

PC data tool — one tab per module

Until now the live view of xm10.py recv drew only the first user Module ID that arrived. Starting with this release it opens one tab per Module ID.

  • A tab is titled with the channel name (when the module has one channel) or the Module ID.
  • Tabs you are not looking at keep saving. Each Module ID gets its own CSV — cdc_phai_<time>_user_0xF0.csv, cdc_phai_<time>_user_0xF1.csv.
  • Turn on Show 0x20 tab to see the 197 Total Data channels as a table (refreshed 5 times a second).
  • The window no longer freezes when data arrives in bursts, and disconnecting or closing the window saves what is still pending.

.xmlog — reconnecting no longer mixes recordings

  • Every reconnect starts a new section in the file. Restarting within the same second no longer overwrites the file.
  • When you export to CSV, each row is decoded with the struct definition that was valid when that row arrived. A module whose definition changed is split into separate CSVs such as ..._user_0xF0_schema2.csv.
  • If you only press Disconnect and then Connect in the window, the .xmlog recorded after that has no channel names (the window keeps them). The current firmware sends the names only once, when the USB connection is newly set up.

The folder was renamed — pc-data-tool

The PC tool folder in the SDK changed from PythonDecoder/ to pc-data-tool/. The files inside and how you use them are the same; only the path changed.

cd Extension_Module\pc-data-tool
python xm10.py demo

If you are still on the v2.8.0 ZIP, that folder is still called PythonDecoder — it is the same tool.


Fixes

Data received over CAN-FD (Rev 1.1 · Rev 2.0)

When the CAN-FD receive buffer was full, the position of the next message to read was computed wrongly, so an empty message could slip in. This affects data received over CAN-FD, such as from the H10 or a sensor hub. The way messages are read was fixed.

Ex.41 IMU Hub Dashboard — channel names now show up (Rev 2.0)

The channel-name list was over 512 B, so it was never sent and the PC only showed ch0, ch1…. Units now go inside the names, which brings the list down to 487 B.

Ex.33 Kinesthetic Teaching

One output line that did not match what the example actually does was removed.


New API — EMG Hub calibration (Rev 2.0)

if (XM_GetButtonEvent(XM_BTN_1) == XM_BTN_CLICK) XM_SendEmgHubCalCommand(XM_EMG_HUB_CAL_OFFSET);  // muscle relaxed
if (XM_GetButtonEvent(XM_BTN_2) == XM_BTN_CLICK) XM_SendEmgHubCalCommand(XM_EMG_HUB_CAL_MVC);     // maximum contraction
bool calib_valid = (XM.status.emg_hub.status_flags & XM_EMG_HUB_STATUS_CALIB_VALID) != 0U;
  • Returns false if the hub is not connected or the command could not be sent.
  • Call it once in a while, for example when a button is pressed. Do not call it on every loop.
  • Ex.42 EMG Hub Biofeedback now uses this function.
  • The EMG Hub is a module still in development. To use it, contact us at https://huphailab.com/contact.

Example count

Rev 2.0 45 / Rev 1.1 40.

  • Ex.37 (FES Hub) removed — the FES Hub cannot currently be connected to the XM10.
  • Ex.36 left out of the Rev 1.1 SDK — it uses a storage feature that exists only on Rev 2.0 (XM_UserNV_*), so it never built on Rev 1.1. It is still in the Rev 2.0 SDK.

Bootloader v1.1.0

The bootloader attached to this release (AGR_Bootloader.bin) is v1.1.0. The same file is used on Rev 1.1 and Rev 2.0 boards. It has not been confirmed on a board yet.

  • Faster boot. The 1–2 seconds when all LEDs stayed off, right after they light up one by one at boot, are gone.
  • If the board keeps resetting, it stops and waits (Rev 2.0). If the board restarts 10 times in a row without the firmware running for 5 seconds, the bootloader stops starting the firmware, blinks all three board LEDs together, and waits for a firmware upload. Upload the firmware again with PhAI Studio to clear it.
  • Boot diagnostics record — to help find the cause when a board keeps resetting, the reset cause and the boot stage are kept on the board. Rev 2.0 firmware also records its own stages.

Boards that already have a bootloader do not need to change it. v2.8.1 firmware also runs with the previous bootloader; in that case the "stop and wait" above does not happen. To replace only the bootloader, do not use Full chip erase in STM32CubeProgrammer; just write AGR_Bootloader.bin at 0x08000000. Your firmware stays in place — see section 3 of the bootloader guide.


Not yet confirmed — please read

  • Not yet confirmed on a board: Ex.41 channel names (in the xm10 tool), Ex.42 calibration (EMG Hub), bootloader v1.1.0 (including the stop-and-wait on repeated resets), the boot diagnostics record, and the Rev 1.1 CAN-FD receive change. These were checked with builds and PC-side tests. Let us know if anything looks off.
  • The current firmware does not send struct definitions (0xEE). So the PC still assumes float32 for user channels (same as v2.8.0). Decoding by struct definition, described above, was checked only with prepared data.

Compatibility

Item Notes
Existing firmware code Rebuild only. No public API removed or renamed
PC data tool Only the folder name changed to pc-data-tool. Same Python packages (pyserial pyqt5 pyqtgraph numpy)
Rev 1.1 CAN-FD receive fix · Ex.36 left out (40 examples)
Rev 2.0 CAN-FD receive fix · EMG Hub calibration API · Ex.41 channel names · boot diagnostics record · stops and waits on repeated resets (with bootloader v1.1.0)
Bootloader Now v1.1.0. Boards that already have a bootloader do not need to change it

Downloads

File For
Rev2.0.zip Rev 2.0 board SDK (45 examples, includes pc-data-tool/)
Rev1.1.zip Rev 1.1 board SDK (40 examples, includes pc-data-tool/)
AGR_Bootloader.bin XM10 bootloader v1.1.0 — for both Rev 1.1 and Rev 2.0 (not yet confirmed on a board)
SUIT_H10_Binary_20260820.zip KIT H10 firmware — same file as v2.6.0
SUIT_ContentsFiles_20260820.zip H10 content files — same file as v2.6.0

The two H10 files are the v2.6.0 ones re-uploaded as-is.

Extract to a short path (e.g. C:\xm10\). A deep path can hit the Windows path-length limit and break the build — that is a path-length problem, not a code problem.