static __pdata uint8_t rx_len, rx_used, tx_used;
static __pdata uint8_t rx_seq;
-static __xdata uint16_t ao_packet_timer_delay;
-static __xdata uint8_t ao_packet_timer_cancelled;
-
static __xdata struct ao_task ao_packet_task;
-static __xdata struct ao_task ao_packet_timer_task;
static __xdata uint8_t ao_packet_enable;
static __xdata uint8_t ao_packet_master_sleeping;
-void
-ao_packet_timer(void) __reentrant
-{
- uint16_t delay;
-
- while (ao_packet_enable) {
-
- /* wait until the timer task is needed
- */
- while (!ao_packet_timer_delay && ao_packet_enable)
- ao_sleep(&ao_packet_timer_delay);
-
- delay = ao_packet_timer_delay;
- ao_packet_timer_delay = 0;
-
- /* pause waiting for either a timeout or
- * a timer cancel
- */
- ao_delay(delay);
-
- /* if not canceled, abort the receive
- */
- if (!ao_packet_timer_cancelled) {
- printf ("packet timeout\n"); flush();
- ao_radio_abort(AO_DMA_TIMEOUT);
- }
- }
- ao_exit();
-}
-
-void
-ao_packet_timer_set(uint16_t delay)
-{
- ao_packet_timer_delay = delay;
- ao_packet_timer_cancelled = 0;
- ao_wakeup(&ao_packet_timer_delay);
-}
-
-void
-ao_packet_timer_cancel(void)
-{
- ao_packet_timer_cancelled = 1;
- ao_packet_timer_delay = 0;
- ao_wake_task(&ao_packet_timer_task);
-}
-
void
ao_packet_send(void)
{
ao_config_get();
ao_mutex_get(&ao_radio_mutex);
ao_radio_idle();
+ ao_radio_done = 0;
RF_CHANNR = ao_config.radio_channel;
ao_dma_set_transfer(ao_radio_dma,
&tx_packet,
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_dma_start(ao_radio_dma);
RFST = RFST_SRX;
__critical while (!ao_radio_dma_done)
- ao_sleep(&ao_radio_dma_done);
+ if (ao_sleep(&ao_radio_dma_done) != 0) {
+ printf("recv timeout\n"); flush();
+ ao_radio_abort();
+ }
dma_done = ao_radio_dma_done;
ao_mutex_put(&ao_radio_mutex);
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;
+ return AO_DMA_ABORTED;
}
- if (rx_packet.packet.len) {
+ 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 == rx_seq + 1 && rx_used == rx_len)
{
+ printf ("rx len %3d seq %3d ack %3d\n",
+ rx_packet.packet.len,
+ rx_packet.packet.seq,
+ rx_packet.packet.ack);
+ flush();
memcpy(rx_data, rx_packet.packet.d, rx_packet.packet.len);
rx_used = 0;
rx_len = rx_packet.packet.len;
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_led_on(AO_LED_GREEN);
ao_packet_recv();
- ao_led_toggle(AO_LED_GREEN);
+ ao_led_off(AO_LED_GREEN);
+ ao_led_on(AO_LED_RED);
ao_delay(AO_MS_TO_TICKS(100));
ao_packet_send();
- ao_led_toggle(AO_LED_RED);
+ ao_led_off(AO_LED_RED);
}
ao_exit();
}
ao_packet_master(void)
{
uint8_t status;
- 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_led_on(AO_LED_RED);
ao_delay(AO_MS_TO_TICKS(100));
ao_packet_send();
- ao_led_toggle(AO_LED_RED);
- ao_packet_timer_set(AO_MS_TO_TICKS(1000));
+ ao_led_off(AO_LED_RED);
+ ao_led_on(AO_LED_GREEN);
+ ao_alarm(AO_MS_TO_TICKS(1000));
status = ao_packet_recv();
- ao_packet_timer_cancel();
+ ao_led_off(AO_LED_GREEN);
if (status & AO_DMA_DONE) {
- ao_led_toggle(AO_LED_GREEN);
ao_packet_master_sleeping = 1;
- ao_sleep(AO_MS_TO_TICKS(1000));
+ ao_delay(AO_MS_TO_TICKS(1000));
ao_packet_master_sleeping = 0;
}
}
char
ao_packet_getchar(void) __critical
{
- while (rx_used == rx_len && ao_packet_enable)
+ while (rx_used == rx_len && ao_packet_enable) {
+ flush();
ao_sleep(&rx_data);
+ }
if (!ao_packet_enable)
return 0;
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')
+ flush();
+ }
}
ao_exit();
}
ao_packet_enable = 1;
ao_cmd_white();
- ao_radio_set_packet();
- if (ao_cmd_lex_c == 'm') {
- while ((c = getchar()) != '~')
- ao_packet_send();
- } else {
- for (;;) {
- ao_packet_recv();
- ao_led_toggle(AO_LED_GREEN);
- if (rx_packet.packet.d[0] == (uint8_t) '@')
- break;
- }
- }
- ao_packet_enable = 0;
- return;
-#if 0
- if (ao_cmd_lex_c == 'm') {
- ao_add_task(&ao_packet_timer_task, ao_packet_timer, "timeout");
+ if (ao_cmd_lex_c == 'm')
ao_add_task(&ao_packet_task, ao_packet_master, "master");
- }
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(AO_DMA_ABORTED);
+ 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[] = {