canbus: add a clear node id admin command

This broadcasts a command to clear the id for all nodes running
the bootloader, which should prevent ID collisions.

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Eric Callahan 2022-04-13 15:04:52 -04:00
parent 26c89e8b0e
commit 1e79868003
No known key found for this signature in database
GPG Key ID: 7027245FBBDDF59A

View File

@ -93,6 +93,7 @@ canboot_sendf(uint8_t* data, uint16_t size)
// Available commands and responses // Available commands and responses
#define CANBUS_CMD_QUERY_UNASSIGNED 0x00 #define CANBUS_CMD_QUERY_UNASSIGNED 0x00
#define CANBUS_CMD_SET_NODEID 0x01 #define CANBUS_CMD_SET_NODEID 0x01
#define CANBUS_CMD_CLEAR_NODE_ID 0x02
#define CANBUS_RESP_NEED_NODEID 0x20 #define CANBUS_RESP_NEED_NODEID 0x20
// Helper to verify a UUID in a command matches this chip's UUID // Helper to verify a UUID in a command matches this chip's UUID
@ -124,6 +125,13 @@ can_process_query_unassigned(uint32_t id, uint32_t len, uint8_t *data)
} }
} }
static void
can_process_clear_node_id(void)
{
canbus_assigned_id = 0;
canbus_set_filter(canbus_assigned_id);
}
static void static void
can_id_conflict(void) can_id_conflict(void)
{ {
@ -161,6 +169,9 @@ can_process(uint32_t id, uint32_t len, uint8_t *data)
case CANBUS_CMD_SET_NODEID: case CANBUS_CMD_SET_NODEID:
can_process_set_nodeid(id, len, data); can_process_set_nodeid(id, len, data);
break; break;
case CANBUS_CMD_CLEAR_NODE_ID:
can_process_clear_node_id();
break;
} }
} }