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;
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();
}
void
ao_packet_master(void)
{
- uint8_t status;
-
ao_config_get();
- ao_radio_set_packet();
ao_tx_packet.addr = ao_serial_number;
ao_tx_packet.len = AO_PACKET_SYN;
ao_packet_master_time = ao_time();
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();
}
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