X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fao_radio_cmac.c;h=41fbbe1fe7a5b7766e938a4876be56fc4844f1fa;hp=c2757b1629955a847180094172956bdbd49fedc2;hb=4568bc796a6c362ebf7f72ee9a5fa4a9a3c4ba6a;hpb=be117376179126824439d98379079025ca0b245a diff --git a/src/ao_radio_cmac.c b/src/ao_radio_cmac.c index c2757b16..41fbbe1f 100644 --- a/src/ao_radio_cmac.c +++ b/src/ao_radio_cmac.c @@ -21,6 +21,7 @@ #define AO_CMAC_MAX_LEN (128 - AO_CMAC_KEY_LEN) static __xdata uint8_t ao_radio_cmac_mutex; +__pdata int16_t ao_radio_cmac_rssi; static __xdata uint8_t cmac_data[AO_CMAC_MAX_LEN + AO_CMAC_KEY_LEN + 2 + AO_CMAC_KEY_LEN]; static __pdata uint8_t ao_radio_cmac_len; @@ -114,9 +115,12 @@ radio_cmac_recv(uint8_t len, uint16_t timeout) __reentrant i = ao_radio_recv(cmac_data, len + AO_CMAC_KEY_LEN + 2); ao_clear_alarm(); - if (!i) + if (!i) { + ao_radio_cmac_rssi = 0; return AO_RADIO_CMAC_TIMEOUT; + } + ao_radio_cmac_rssi = (int16_t) (((int8_t) cmac_data[len + AO_CMAC_KEY_LEN]) >> 1) - 74; if (!(cmac_data[len + AO_CMAC_KEY_LEN +1] & PKT_APPEND_STATUS_1_CRC_OK)) return AO_RADIO_CMAC_CRC_ERROR; @@ -221,33 +225,46 @@ radio_cmac_recv_cmd(void) __reentrant printf ("PACKET "); for (i = 0; i < len; i++) printf("%02x", cmac_data[i]); - printf ("\n"); + printf (" %d\n", ao_radio_cmac_rssi); } else - printf ("ERROR %d\n", i); + printf ("ERROR %d %d\n", i, ao_radio_cmac_rssi); ao_mutex_put(&ao_radio_cmac_mutex); } static __xdata struct ao_launch_command command; static __xdata struct ao_launch_query query; +static pdata uint16_t launch_serial; +static pdata uint8_t launch_channel; +static pdata uint16_t tick_offset; +static void +launch_args(void) __reentrant +{ + ao_cmd_decimal(); + launch_serial = ao_cmd_lex_i; + ao_cmd_decimal(); + launch_channel = ao_cmd_lex_i; +} static int8_t -launch_query(uint16_t serial, uint8_t channel) +launch_query(void) { uint8_t i; int8_t r = AO_RADIO_CMAC_OK; + tick_offset = ao_time(); for (i = 0; i < 10; i++) { printf ("."); flush(); command.tick = ao_time(); - command.serial = serial; + command.serial = launch_serial; command.cmd = AO_LAUNCH_QUERY; - command.channel = channel; + command.channel = launch_channel; ao_radio_cmac_send(&command, sizeof (command)); r = ao_radio_cmac_recv(&query, sizeof (query), AO_MS_TO_TICKS(500)); if (r == AO_RADIO_CMAC_OK) break; } + tick_offset -= query.tick; printf("\n"); flush(); return r; } @@ -255,17 +272,12 @@ launch_query(uint16_t serial, uint8_t channel) static void launch_report_cmd(void) __reentrant { - uint8_t channel; - uint16_t serial; int8_t r; - ao_cmd_decimal(); - serial = ao_cmd_lex_i; - ao_cmd_decimal(); - channel = ao_cmd_lex_i; + launch_args(); if (ao_cmd_status != ao_cmd_success) return; - r = launch_query(serial, channel); + r = launch_query(); switch (r) { case AO_RADIO_CMAC_OK: if (query.valid) { @@ -273,24 +285,25 @@ launch_report_cmd(void) __reentrant case ao_igniter_ready: case ao_igniter_active: printf ("Armed: "); - switch (query.igniter_status) { - default: - printf("unknown status\n"); - break; - case ao_igniter_ready: - printf("igniter good\n"); - break; - case ao_igniter_open: - printf("igniter bad\n"); - break; - } break; default: - printf("Disarmed\n"); + printf("Disarmed: "); + } + switch (query.igniter_status) { + default: + printf("unknown\n"); + break; + case ao_igniter_ready: + printf("igniter good\n"); + break; + case ao_igniter_open: + printf("igniter bad\n"); + break; } } else { - printf("Invalid channel %d\n", channel); + printf("Invalid channel %d\n", launch_channel); } + printf("Rssi: %d\n", ao_radio_cmac_rssi); break; default: printf("Error %d\n", r); @@ -298,56 +311,91 @@ launch_report_cmd(void) __reentrant } } +static void +launch_arm(void) __reentrant +{ + command.tick = ao_time() - tick_offset; + command.serial = launch_serial; + command.cmd = AO_LAUNCH_ARM; + command.channel = launch_channel; + ao_radio_cmac_send(&command, sizeof (command)); +} + +static void +launch_ignite(void) __reentrant +{ + command.tick = ao_time() - tick_offset; + command.serial = launch_serial; + command.cmd = AO_LAUNCH_FIRE; + command.channel = 0; + ao_radio_cmac_send(&command, sizeof (command)); +} + static void launch_fire_cmd(void) __reentrant { static __xdata struct ao_launch_command command; - uint8_t channel; - uint16_t serial; uint8_t secs; uint8_t i; int8_t r; - uint16_t tick_offset; - ao_cmd_decimal(); - serial = ao_cmd_lex_i; - ao_cmd_decimal(); - channel = ao_cmd_lex_i; + launch_args(); ao_cmd_decimal(); secs = ao_cmd_lex_i; if (ao_cmd_status != ao_cmd_success) return; - tick_offset = ao_time(); - r = launch_query(serial, channel); - tick_offset -= query.tick; + r = launch_query(); + if (r != AO_RADIO_CMAC_OK) { + printf("query failed %d\n", r); + return; + } for (i = 0; i < 4; i++) { printf("arm %d\n", i); flush(); - command.tick = ao_time() - tick_offset; - command.serial = serial; - command.cmd = AO_LAUNCH_ARM; - command.channel = channel; - ao_radio_cmac_send(&command, sizeof (command)); + launch_arm(); } + secs = secs * 10 - 5; if (secs > 100) secs = 100; for (i = 0; i < secs; i++) { printf("fire %d\n", i); flush(); - command.tick = ao_time() - tick_offset; - command.serial = serial; - command.cmd = AO_LAUNCH_FIRE; - command.channel = 0; - ao_radio_cmac_send(&command, sizeof (command)); + launch_ignite(); ao_delay(AO_MS_TO_TICKS(100)); } } +static void +launch_arm_cmd(void) __reentrant +{ + uint8_t i; + int8_t r; + launch_args(); + r = launch_query(); + if (r != AO_RADIO_CMAC_OK) { + printf("query failed %d\n", r); + return; + } + for (i = 0; i < 4; i++) + launch_arm(); +} + +static void +launch_ignite_cmd(void) __reentrant +{ + uint8_t i; + launch_args(); + for (i = 0; i < 4; i++) + launch_ignite(); +} + static __code struct ao_cmds ao_radio_cmac_cmds[] = { { radio_cmac_send_cmd, "s \0Send AES-CMAC packet. Bytes to send follow on next line" }, { radio_cmac_recv_cmd, "S \0Receive AES-CMAC packet. Timeout in ms" }, { launch_report_cmd, "l \0Get remote launch status" }, { launch_fire_cmd, "f \0Fire remote igniter" }, + { launch_arm_cmd, "a \0Arm remote igniter" }, + { launch_ignite_cmd, "i \0Pulse remote igniter" }, { 0, NULL }, };