X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fao_packet_master.c;h=e721ffba39c948a0d17a5fc35cf45ccfec664eea;hp=a499ce59d055e672580dd08136cf5a513a8554b7;hb=b520c32bcddabd42c07ceafa827694a3ae23a76f;hpb=adf656192441eb7f44792955c86e469145477e29 diff --git a/src/ao_packet_master.c b/src/ao_packet_master.c index a499ce59..e721ffba 100644 --- a/src/ao_packet_master.c +++ b/src/ao_packet_master.c @@ -18,16 +18,15 @@ #include "ao.h" static char -ao_packet_getchar(void) +ao_packet_getchar(void) __critical { char c; - while ((c = ao_packet_pollchar()) == AO_READ_AGAIN) - { + while ((c = ao_packet_pollchar()) == AO_READ_AGAIN) { if (!ao_packet_enable) break; if (ao_packet_master_sleeping) - ao_wake_task(&ao_packet_task); - ao_usb_flush(); + ao_wakeup(&ao_packet_master_sleeping); + flush(); ao_sleep(&ao_stdin_ready); } return c; @@ -36,11 +35,11 @@ ao_packet_getchar(void) static void ao_packet_echo(void) __reentrant { - uint8_t c; + char c; while (ao_packet_enable) { c = ao_packet_getchar(); - if (ao_packet_enable) - ao_usb_putchar(c); + if (c != AO_READ_AGAIN) + putchar(c); } ao_exit(); } @@ -75,32 +74,30 @@ ao_packet_master_check_busy(void) void ao_packet_master(void) { - uint8_t status; - - ao_radio_set_packet(); + ao_config_get(); ao_tx_packet.addr = ao_serial_number; ao_tx_packet.len = AO_PACKET_SYN; ao_packet_master_time = ao_time(); ao_packet_master_delay = AO_PACKET_MASTER_DELAY_SHORT; while (ao_packet_enable) { + memcpy(ao_tx_packet.callsign, ao_config.callsign, AO_MAX_CALLSIGN); ao_packet_send(); if (ao_tx_packet.len) ao_packet_master_busy(); ao_packet_master_check_busy(); ao_alarm(ao_packet_master_delay); - status = ao_packet_recv(); - if (status & AO_DMA_DONE) { + if (ao_packet_recv()) { /* if we can transmit data, do so */ if (ao_packet_tx_used && ao_tx_packet.len == 0) continue; if (ao_rx_packet.packet.len) ao_packet_master_busy(); ao_packet_master_sleeping = 1; - ao_delay(ao_packet_master_delay); + ao_alarm(ao_packet_master_delay); + ao_sleep(&ao_packet_master_sleeping); ao_packet_master_sleeping = 0; } } - ao_radio_set_telemetry(); ao_exit(); } @@ -115,24 +112,27 @@ ao_packet_forward(void) __reentrant ao_set_monitor(0); ao_add_task(&ao_packet_task, ao_packet_master, "master"); ao_add_task(&ao_packet_echo_task, ao_packet_echo, "echo"); - while ((c = ao_usb_getchar()) != '~') { + while ((c = getchar()) != '~') { if (c == '\r') c = '\n'; ao_packet_putchar(c); } + + /* Wait for a second if there is any pending data */ + for (c = 0; (ao_packet_tx_used || ao_tx_packet.len) && c < 10; c++) + ao_delay(AO_MS_TO_TICKS(100)); ao_packet_enable = 0; - ao_radio_abort(); while (ao_packet_echo_task.wchan || ao_packet_task.wchan) { - ao_wake_task(&ao_packet_echo_task); - ao_wake_task(&ao_packet_task); - ao_yield(); + ao_radio_recv_abort(); + ao_wakeup(&ao_stdin_ready); + ao_delay(AO_MS_TO_TICKS(10)); } } __code struct ao_cmds ao_packet_master_cmds[] = { - { 'p', ao_packet_forward, "p Remote packet link." }, - { 0, ao_packet_forward, NULL }, + { ao_packet_forward, "p\0Remote packet link." }, + { 0, NULL }, }; void