projects
/
fw
/
altos
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
altos: Send SPI message at flight state changes
[fw/altos]
/
src
/
ao_packet_master.c
diff --git
a/src/ao_packet_master.c
b/src/ao_packet_master.c
index 72bb908a671e4e2f790f1f6492c340627e43468a..b0fdf5a8804288386651c070ba6f5be8f7f703fc 100644
(file)
--- a/
src/ao_packet_master.c
+++ b/
src/ao_packet_master.c
@@
-21,13
+21,12
@@
static char
ao_packet_getchar(void) __critical
{
char c;
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)
if (!ao_packet_enable)
break;
if (ao_packet_master_sleeping)
- ao_wake
_task(&ao_packet_task
);
-
ao_usb_
flush();
+ ao_wake
up(&ao_packet_master_sleeping
);
+ flush();
ao_sleep(&ao_stdin_ready);
}
return c;
ao_sleep(&ao_stdin_ready);
}
return c;
@@
-36,11
+35,11
@@
ao_packet_getchar(void) __critical
static void
ao_packet_echo(void) __reentrant
{
static void
ao_packet_echo(void) __reentrant
{
-
uint8_t
c;
+
char
c;
while (ao_packet_enable) {
c = ao_packet_getchar();
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();
}
}
ao_exit();
}
@@
-75,10
+74,7
@@
ao_packet_master_check_busy(void)
void
ao_packet_master(void)
{
void
ao_packet_master(void)
{
- uint8_t status;
-
ao_config_get();
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_tx_packet.addr = ao_serial_number;
ao_tx_packet.len = AO_PACKET_SYN;
ao_packet_master_time = ao_time();
@@
-90,19
+86,18
@@
ao_packet_master(void)
ao_packet_master_busy();
ao_packet_master_check_busy();
ao_alarm(ao_packet_master_delay);
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;
/* 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_packet_master_sleeping = 0;
}
}
- ao_radio_set_telemetry();
ao_exit();
}
ao_exit();
}
@@
-114,27
+109,32
@@
ao_packet_forward(void) __reentrant
ao_cmd_white();
flush();
ao_cmd_white();
flush();
+#if HAS_MONITOR
ao_set_monitor(0);
ao_set_monitor(0);
+#endif
ao_add_task(&ao_packet_task, ao_packet_master, "master");
ao_add_task(&ao_packet_echo_task, ao_packet_echo, "echo");
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);
}
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_packet_enable = 0;
- ao_radio_abort();
while (ao_packet_echo_task.wchan || ao_packet_task.wchan) {
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_wake
up(&ao_stdin_ready
);
+ ao_
delay(AO_MS_TO_TICKS(10)
);
}
}
__code struct ao_cmds ao_packet_master_cmds[] = {
}
}
__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\0
Remote packet link." },
+ { 0, NULL },
};
void
};
void