X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fao_packet.c;h=ba5595126dd5656e25a2cb9fbd2e821a55d00873;hp=7d277d70594e9f3cbfa6471f43995216ad9e950f;hb=cd0d495d7ef276956e730196476daa70a4359918;hpb=c5ec6fcfa1bd17aad0f85d2fbe603f1d125836e6 diff --git a/src/ao_packet.c b/src/ao_packet.c index 7d277d70..ba559512 100644 --- a/src/ao_packet.c +++ b/src/ao_packet.c @@ -31,9 +31,18 @@ static __xdata uint8_t ao_packet_master_sleeping; void ao_packet_send(void) { + ao_led_on(AO_LED_RED); ao_config_get(); ao_mutex_get(&ao_radio_mutex); + if (tx_used && tx_packet.len == 0) { + memcpy(&tx_packet.d, tx_data, tx_used); + tx_packet.len = tx_used; + tx_packet.seq++; + tx_used = 0; + ao_wakeup(&tx_data); + } ao_radio_idle(); + ao_radio_done = 0; RF_CHANNR = ao_config.radio_channel; ao_dma_set_transfer(ao_radio_dma, &tx_packet, @@ -47,9 +56,10 @@ ao_packet_send(void) DMA_CFG1_PRIORITY_HIGH); ao_dma_start(ao_radio_dma); RFST = RFST_STX; - __critical while (!ao_radio_dma_done) - ao_sleep(&ao_radio_dma_done); + __critical while (!ao_radio_done) + ao_sleep(&ao_radio_done); ao_mutex_put(&ao_radio_mutex); + ao_led_off(AO_LED_RED); } uint8_t @@ -57,6 +67,7 @@ ao_packet_recv(void) { uint8_t dma_done; + ao_led_on(AO_LED_GREEN); ao_config_get(); ao_mutex_get(&ao_radio_mutex); ao_radio_idle(); @@ -74,22 +85,28 @@ ao_packet_recv(void) ao_dma_start(ao_radio_dma); RFST = RFST_SRX; __critical while (!ao_radio_dma_done) - if (ao_sleep(&ao_radio_dma_done) != 0) { - printf("recv timeout\n"); flush(); + if (ao_sleep(&ao_radio_dma_done) != 0) ao_radio_abort(); - } dma_done = ao_radio_dma_done; ao_mutex_put(&ao_radio_mutex); + ao_led_off(AO_LED_GREEN); if (dma_done & AO_DMA_DONE) { - printf ("rssi %d status %x\n", rx_packet.rssi, rx_packet.status); flush(); - if (!(rx_packet.status & PKT_APPEND_STATUS_1_CRC_OK)) { - printf ("bad crc\n"); flush(); -// return AO_DMA_ABORTED; - } - if (rx_packet.packet.len) { - if (rx_packet.packet.seq == rx_seq + 1 && rx_used == rx_len) - { + if (!(rx_packet.status & PKT_APPEND_STATUS_1_CRC_OK)) + return AO_DMA_ABORTED; + if (rx_packet.packet.len == AO_PACKET_SYN) { + rx_seq = rx_packet.packet.seq; + tx_packet.seq = rx_packet.packet.ack; + tx_packet.ack = rx_seq; + } else if (rx_packet.packet.len) { + if (rx_packet.packet.seq == (uint8_t) (rx_seq + (uint8_t) 1) && rx_used == rx_len) { +#if 0 + printf ("rx len %3d seq %3d ack %3d\n", + rx_packet.packet.len, + rx_packet.packet.seq, + rx_packet.packet.ack); + flush(); +#endif memcpy(rx_data, rx_packet.packet.d, rx_packet.packet.len); rx_used = 0; rx_len = rx_packet.packet.len; @@ -109,14 +126,12 @@ ao_packet_recv(void) void ao_packet_slave(void) { - tx_packet.addr = ao_serial_number; ao_radio_set_packet(); + tx_packet.addr = ao_serial_number; + tx_packet.len = AO_PACKET_SYN; while (ao_packet_enable) { ao_packet_recv(); - ao_led_toggle(AO_LED_GREEN); - ao_delay(AO_MS_TO_TICKS(100)); ao_packet_send(); - ao_led_toggle(AO_LED_RED); } ao_exit(); } @@ -132,15 +147,13 @@ ao_packet_master(void) tx_packet.addr = ao_serial_number; tx_packet.len = AO_PACKET_SYN; while (ao_packet_enable) { - ao_led_on(AO_LED_RED); - ao_delay(AO_MS_TO_TICKS(100)); ao_packet_send(); - ao_led_off(AO_LED_RED); - ao_led_on(AO_LED_GREEN); - ao_alarm(AO_MS_TO_TICKS(1000)); + ao_alarm(AO_MS_TO_TICKS(100)); status = ao_packet_recv(); - ao_led_off(AO_LED_GREEN); if (status & AO_DMA_DONE) { + /* if we can transmit data, do so */ + if (tx_used && tx_packet.len == 0) + continue; ao_packet_master_sleeping = 1; ao_delay(AO_MS_TO_TICKS(1000)); ao_packet_master_sleeping = 0; @@ -152,32 +165,20 @@ ao_packet_master(void) void ao_packet_flush(void) { - if (!tx_used) - return; - - /* Wait for previous packet to be received + /* If there is data to send, and this is the master, + * then poke the master to send all queued data */ - while (tx_packet.len) - ao_sleep(&tx_packet); - - /* Prepare next packet - */ - if (tx_used) { - memcpy(&tx_packet.d, tx_data, tx_used); - tx_packet.len = tx_used; - tx_packet.seq++; - tx_used = 0; - - if (ao_packet_master_sleeping) - ao_wake_task(&ao_packet_task); - } + if (tx_used && ao_packet_master_sleeping) + ao_wake_task(&ao_packet_task); } void ao_packet_putchar(char c) { - while (tx_used == AO_PACKET_MAX && ao_packet_enable) + while (tx_used == AO_PACKET_MAX && ao_packet_enable) { ao_packet_flush(); + ao_sleep(&tx_data); + } if (ao_packet_enable) tx_data[tx_used++] = c; @@ -186,8 +187,12 @@ ao_packet_putchar(char c) char ao_packet_getchar(void) __critical { - while (rx_used == rx_len && ao_packet_enable) + while (rx_used == rx_len && ao_packet_enable) { + /* poke the master to get more data */ + if (ao_packet_master_sleeping) + ao_wake_task(&ao_packet_task); ao_sleep(&rx_data); + } if (!ao_packet_enable) return 0; @@ -201,8 +206,11 @@ ao_packet_echo(void) __reentrant uint8_t c; while (ao_packet_enable) { c = ao_packet_getchar(); - if (ao_packet_enable) + if (ao_packet_enable) { putchar(c); + if (c == (uint8_t) '\n' || c == (uint8_t) '\r') + flush(); + } } ao_exit(); } @@ -221,18 +229,14 @@ ao_packet_forward(void) __reentrant else ao_add_task(&ao_packet_task, ao_packet_slave, "slave"); ao_add_task(&ao_packet_echo_task, ao_packet_echo, "echo"); - while ((c = getchar()) != '~') { + while ((c = getchar()) != '~') ao_packet_putchar(c); - if (c == '\n') - ao_packet_flush(); - } 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); } -#endif } __code struct ao_cmds ao_packet_cmds[] = {