Files
hexdec/servo_controller/COMMANDS.md
T
2026-10-08 13:27:57 +03:00

1.4 KiB

USB Command Handler

Implementation of command handler for this project.

ACK

Every command returns either an ACK or NACK.

Commands

typedef enum {
	COMMAND_ACK,
	COMMAND_NACK,
	LED_TOGGLE,
	LED_SET,
	SERVO_SET,
	SERVO_SET_ALL,
	ADC_READ_RAW,
	ADC_READ_RAW_ALL,
	ADC_READ,
	ADC_READ_ALL,
	ADC_SET_READ,
	DIGITAL_IN,
	DIGITAL_LEG_OUT,
	POWER_MONITOR_SET_READ,
	POWER_MONITOR_READ,
	SETTINGS_TEST_SAVE,
	SETTINGS_TEST_READ,

	MOVE_COMMAND_START,
	// All the commands going to robot thread go here
	TEST_COMMAND, // 16

	MOVE_COMMAND_END

} commands_e;

Command Structure

#define COMMAND_PREFIX 0x69
#define COMMAND_ID 0x00
#define COMMAND_DATA_SIZE 160
#define COMMAND_HEADER_SIZE 13

struct command_message_t {
	uint8_t prefix;
	uint8_t length;
	uint8_t id;
	uint8_t command;
	int64_t tick;
	uint8_t crc;
	uint8_t data[COMMAND_DATA_SIZE];
} __attribute__((packed));

CRC Calculation Function

uint8_t command_calculate_crc(struct command_message_t *msg) {
	uint32_t sum = 0;
	uint8_t crc = 0;

	uint8_t *byte_ptr = (uint8_t *)msg;
	int loop_length = (sizeof(struct command_message_t) - sizeof(msg->data) + msg->length);

	for (int i = 0; i < loop_length; i++) {
		if (i == (COMMAND_HEADER_SIZE - 1)) { continue; }
		sum += byte_ptr[i];
	}

	crc = 0x100 - (sum & 0xff);

	return crc;
}

Python test script (AI generated)

Command Usage:

python3 scripts/send_cmd.py --help

This script sends/reads commands