DFX_inspire_service/example/hand_readtest.cpp
2026-08-04 16:09:17 +04:00

50 lines
1.5 KiB
C++

/**
* @file hand_readtest.cpp
* @brief Low-level read diagnostic: send the Inspire "read angleAct" query on a
* serial port and dump the RAW bytes that come back. Isolates whether the
* hand answers position reads (writes are confirmed working).
*
* g++ -std=c++17 -Iinclude example/hand_readtest.cpp -o /tmp/hand_readtest
* /tmp/hand_readtest /dev/ttyUSB0 [slaveid=1] [waitms=15]
*
* Needs the port free (stop inspire_g1 / the container first).
*/
#include "SerialPort.h"
#include <cstdio>
#include <cstdint>
#include <cstdlib>
#include <unistd.h>
static uint8_t checksum(const uint8_t *d, int len)
{
uint8_t s = 0;
for (int i = 2; i < len - 1; i++) s += d[i];
return s;
}
int main(int argc, char **argv)
{
const char *dev = argc > 1 ? argv[1] : "/dev/ttyUSB0";
int slave = argc > 2 ? atoi(argv[2]) : 1;
int waitms = argc > 3 ? atoi(argv[3]) : 15;
SerialPort sp(dev, B115200, 40); // 40ms read timeout
uint8_t q[9] = {0xEB, 0x90, (uint8_t)slave, 0x04, 0x11, 0x0A, 0x06, 0x0C, 0x00};
q[8] = checksum(q, 9);
printf("port=%s slave=%d wait=%dms (query angleAct)\n", dev, slave, waitms);
for (int t = 0; t < 8; t++)
{
sp.flush();
sp.send(q, 9);
usleep(waitms * 1000);
uint8_t buf[128];
size_t n = sp.recv(buf, sizeof(buf));
printf(" try %d: %2zu bytes:", t, n);
for (size_t i = 0; i < n; i++) printf(" %02X", buf[i]);
printf("\n");
usleep(150000);
}
return 0;
}