summaryrefslogtreecommitdiff
path: root/src/ao_packet_master.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2010-11-26 17:39:40 -0800
committerKeith Packard <keithp@keithp.com>2010-12-22 20:39:40 -0800
commit484b44e81b655f1ecb48256095382a56d2839bae (patch)
tree14446271e5d92b9ea9bee040c7787ba48c616229 /src/ao_packet_master.c
parent07213dc34fa20470a4b36a327a83d75b0f010ebb (diff)
altos: eliminate ao_wake_task
Waking up a task waiting on some random object is a bad idea. Fix the waiters to look for suitable signalling. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/ao_packet_master.c')
-rw-r--r--src/ao_packet_master.c16
1 files changed, 7 insertions, 9 deletions
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));
}
}