This eliminates the packet sequence matching for the first packet,
allowing outstanding send data to arrive from the master instead of
ignoring packets with data until they match the seqno
Signed-off-by: Keith Packard <keithp@keithp.com>
extern __xdata uint8_t ao_packet_enable;
extern __xdata uint8_t ao_packet_master_sleeping;
extern __pdata uint8_t ao_packet_rx_len, ao_packet_rx_used, ao_packet_tx_used;
extern __xdata uint8_t ao_packet_enable;
extern __xdata uint8_t ao_packet_master_sleeping;
extern __pdata uint8_t ao_packet_rx_len, ao_packet_rx_used, ao_packet_tx_used;
+extern __xdata uint8_t ao_packet_restart;
void
ao_packet_send(void);
void
ao_packet_send(void);
__xdata struct ao_task ao_packet_task;
__xdata uint8_t ao_packet_enable;
__xdata struct ao_task ao_packet_task;
__xdata uint8_t ao_packet_enable;
+__xdata uint8_t ao_packet_restart;
#if PACKET_HAS_MASTER
__xdata uint8_t ao_packet_master_sleeping;
#if PACKET_HAS_MASTER
__xdata uint8_t ao_packet_master_sleeping;
/* Check for incoming data at the next sequence and
* for an empty data buffer
*/
/* Check for incoming data at the next sequence and
* for an empty data buffer
*/
- if (ao_rx_packet.packet.seq == (uint8_t) (rx_seq + (uint8_t) 1) &&
+ if ((ao_rx_packet.packet.seq == (uint8_t) (rx_seq + (uint8_t) 1) ||
+ ao_packet_restart) &&
ao_packet_rx_used == ao_packet_rx_len) {
/* Copy data to the receive data buffer and set up the
ao_packet_rx_used == ao_packet_rx_len) {
/* Copy data to the receive data buffer and set up the
ao_wakeup(&ao_stdin_ready);
}
}
ao_wakeup(&ao_stdin_ready);
}
}
/* If the other side has seen the latest data we queued,
* wake up any task waiting to send data and let them go again
/* If the other side has seen the latest data we queued,
* wake up any task waiting to send data and let them go again
{
ao_tx_packet.addr = ao_serial_number;
ao_tx_packet.len = AO_PACKET_SYN;
{
ao_tx_packet.addr = ao_serial_number;
ao_tx_packet.len = AO_PACKET_SYN;
while (ao_packet_enable) {
if (ao_packet_recv()) {
ao_xmemcpy(&ao_tx_packet.callsign, &ao_rx_packet.packet.callsign, AO_MAX_CALLSIGN);
while (ao_packet_enable) {
if (ao_packet_recv()) {
ao_xmemcpy(&ao_tx_packet.callsign, &ao_rx_packet.packet.callsign, AO_MAX_CALLSIGN);