X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fao_radio_cmac.c;h=41fbbe1fe7a5b7766e938a4876be56fc4844f1fa;hp=9694b5b3ef7d20cb989d1954d362b16d668bf78c;hb=b33a92e372327158ab21c1bb2d091c58761efe10;hpb=4299b5a36a2f6f9f7bbbc3a1b935dd2357c1fb0f diff --git a/src/ao_radio_cmac.c b/src/ao_radio_cmac.c index 9694b5b3..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,68 +225,177 @@ 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_report_cmd(void) __reentrant +launch_args(void) __reentrant { - static __xdata struct ao_launch_command command; - static __xdata struct ao_launch_query query; - uint8_t channel; - uint16_t serial; - uint8_t i; - ao_cmd_decimal(); - serial = ao_cmd_lex_i; + launch_serial = ao_cmd_lex_i; ao_cmd_decimal(); - channel = ao_cmd_lex_i; - if (ao_cmd_status != ao_cmd_success) - return; - flush(); + launch_channel = ao_cmd_lex_i; +} + +static int8_t +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 = 0; - command.serial = serial; + command.tick = ao_time(); + command.serial = launch_serial; command.cmd = AO_LAUNCH_QUERY; - command.channel = channel; + command.channel = launch_channel; ao_radio_cmac_send(&command, sizeof (command)); - switch (ao_radio_cmac_recv(&query, sizeof (query), AO_MS_TO_TICKS(500))) { - case AO_RADIO_CMAC_OK: - printf("\n"); + 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; +} + +static void +launch_report_cmd(void) __reentrant +{ + int8_t r; + + launch_args(); + if (ao_cmd_status != ao_cmd_success) + return; + r = launch_query(); + switch (r) { + case AO_RADIO_CMAC_OK: + if (query.valid) { switch (query.arm_status) { 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: "); } - return; - default: - continue; + 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", launch_channel); } + printf("Rssi: %d\n", ao_radio_cmac_rssi); + break; + default: + printf("Error %d\n", r); + break; } - printf ("Timeout\n"); +} + +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 secs; + uint8_t i; + int8_t r; + + launch_args(); + ao_cmd_decimal(); + secs = ao_cmd_lex_i; + if (ao_cmd_status != ao_cmd_success) + return; + 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(); + launch_arm(); + } + + secs = secs * 10 - 5; + if (secs > 100) + secs = 100; + for (i = 0; i < secs; i++) { + printf("fire %d\n", i); flush(); + 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 }, };