summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ao.h4
-rw-r--r--src/ao_packet.c2
-rw-r--r--src/ao_packet_master.c16
-rw-r--r--src/ao_packet_slave.c7
-rw-r--r--src/ao_radio.c7
-rw-r--r--src/ao_task.c9
6 files changed, 19 insertions, 26 deletions
diff --git a/src/ao.h b/src/ao.h
index 58659af5..9682e42f 100644
--- a/src/ao.h
+++ b/src/ao.h
@@ -69,10 +69,6 @@ ao_sleep(__xdata void *wchan);
void
ao_wakeup(__xdata void *wchan);
-/* Wake up a specific task */
-void
-ao_wake_task(__xdata struct ao_task *task);
-
/* set an alarm to go off in 'delay' ticks */
void
ao_alarm(uint16_t delay);
diff --git a/src/ao_packet.c b/src/ao_packet.c
index 9896149c..f627e02b 100644
--- a/src/ao_packet.c
+++ b/src/ao_packet.c
@@ -117,7 +117,7 @@ ao_packet_flush(void)
* then poke the master to send all queued data
*/
if (ao_packet_tx_used && ao_packet_master_sleeping)
- ao_wake_task(&ao_packet_task);
+ ao_wakeup(&ao_packet_master_sleeping);
}
#endif /* PACKET_HAS_MASTER */
diff --git a/src/ao_packet_master.c b/src/ao_packet_master.c
index 3b23ad92..0808bc80 100644
--- a/src/ao_packet_master.c
+++ b/src/ao_packet_master.c
@@ -21,16 +21,13 @@ static char
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_wakeup(&ao_packet_master_sleeping);
ao_usb_flush();
ao_sleep(&ao_stdin_ready);
- if (!ao_packet_enable)
- break;
}
return c;
}
@@ -41,7 +38,7 @@ ao_packet_echo(void) __reentrant
uint8_t c;
while (ao_packet_enable) {
c = ao_packet_getchar();
- if (ao_packet_enable)
+ if (c != AO_READ_AGAIN)
ao_usb_putchar(c);
}
ao_exit();
@@ -97,7 +94,8 @@ ao_packet_master(void)
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;
}
}
@@ -126,8 +124,8 @@ ao_packet_forward(void) __reentrant
ao_delay(AO_MS_TO_TICKS(100));
ao_packet_enable = 0;
while (ao_packet_echo_task.wchan || ao_packet_task.wchan) {
- if (ao_packet_echo_task.wchan)
- ao_wake_task(&ao_packet_echo_task);
+ ao_radio_recv_abort();
+ ao_wakeup(&ao_stdin_ready);
ao_delay(AO_MS_TO_TICKS(10));
}
}
diff --git a/src/ao_packet_slave.c b/src/ao_packet_slave.c
index 3040d781..39d04bbb 100644
--- a/src/ao_packet_slave.c
+++ b/src/ao_packet_slave.c
@@ -44,12 +44,13 @@ ao_packet_slave_stop(void)
{
if (ao_packet_enable) {
ao_packet_enable = 0;
- ao_radio_recv_abort();
while (ao_packet_task.wchan) {
- ao_wake_task(&ao_packet_task);
- ao_yield();
+ ao_radio_recv_abort();
+ ao_delay(AO_MS_TO_TICKS(10));
}
+ ao_radio_get();
ao_radio_set_telemetry();
+ ao_radio_put();
}
}
diff --git a/src/ao_radio.c b/src/ao_radio.c
index 362b73aa..7b7c5161 100644
--- a/src/ao_radio.c
+++ b/src/ao_radio.c
@@ -377,8 +377,13 @@ ao_radio_recv(__xdata void *packet, uint8_t size) __reentrant
DMA_CFG1_PRIORITY_HIGH);
ao_dma_start(ao_radio_dma);
RFST = RFST_SRX;
+
+ /* Wait for DMA to be done, for the radio receive process to
+ * get aborted or for a receive timeout to fire
+ */
__critical while (!ao_radio_dma_done && !ao_radio_abort)
- ao_sleep(&ao_radio_dma_done);
+ if (ao_sleep(&ao_radio_dma_done))
+ break;
/* If recv was aborted, clean up by stopping the DMA engine
* and idling the radio
diff --git a/src/ao_task.c b/src/ao_task.c
index 72c9d7d6..35f34b49 100644
--- a/src/ao_task.c
+++ b/src/ao_task.c
@@ -204,12 +204,11 @@ ao_sleep(__xdata void *wchan)
ao_cur_task->wchan = wchan;
}
ao_yield();
+ ao_cur_task->alarm = 0;
if (ao_cur_task->wchan) {
ao_cur_task->wchan = NULL;
- ao_cur_task->alarm = 0;
return 1;
}
- ao_cur_task->alarm = 0;
return 0;
}
@@ -234,12 +233,6 @@ ao_alarm(uint16_t delay)
}
void
-ao_wake_task(__xdata struct ao_task *task)
-{
- task->wchan = NULL;
-}
-
-void
ao_exit(void) __critical
{
uint8_t i;