Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of d7a_1x by
Diff: src/d7a_com.cpp
- Revision:
- 43:28202405094d
- Parent:
- 37:e04613e021f2
- Child:
- 44:8ebe6b70f932
diff -r c1e7f97ab396 -r 28202405094d src/d7a_com.cpp
--- a/src/d7a_com.cpp Thu Aug 25 09:38:40 2016 +0000
+++ b/src/d7a_com.cpp Tue Aug 30 16:59:12 2016 +0000
@@ -101,28 +101,28 @@
g_com_ctx.rx_buffer[g_com_ctx.write_idx] = g_com_ctx.serial->getc();
//PRINT("-");
- if (g_com_ctx.rx_started)
+ //if (g_com_ctx.rx_started)
{
g_com_ctx.data_available++;
g_com_ctx.write_idx = (g_com_ctx.write_idx >= (g_com_ctx.rx_buffer_size-1))? 0 : g_com_ctx.write_idx+1;
//g_com_ctx.write_idx = (g_com_ctx.write_idx + 1) % g_com_ctx.rx_buffer_size;
+
+ // unlock data parsing thread
+ if (g_com_ctx.state == SEARCH_HEADER && g_com_ctx.data_available >= KAL_COM_HEADER_LEN)
+ {
+ g_com_ctx.state = PARSE_HEADER;
+ g_com_ctx.data_parsing->release();
+ }
+ else if (g_com_ctx.state == SEARCH_BODY && g_com_ctx.data_available >= g_com_ctx.msg.blen)
+ {
+ g_com_ctx.state = PARSE_BODY;
+ g_com_ctx.data_parsing->release();
+ }
}
}
- //ASSERT(g_com_ctx.data_available <= g_com_ctx.rx_buffer_size, "RX Buffer overflow! (%d/%d)\r\n", g_com_ctx.data_available, g_com_ctx.rx_buffer_size);
-
- // unlock data parsing thread
- if (g_com_ctx.state == SEARCH_HEADER && g_com_ctx.data_available >= KAL_COM_HEADER_LEN)
- {
- g_com_ctx.state = PARSE_HEADER;
- g_com_ctx.data_parsing->release();
- }
- else if (g_com_ctx.state == SEARCH_BODY && g_com_ctx.data_available >= g_com_ctx.msg.blen)
- {
- g_com_ctx.state = PARSE_BODY;
- g_com_ctx.data_parsing->release();
- }
+ ASSERT(g_com_ctx.data_available <= g_com_ctx.rx_buffer_size, "RX Buffer overflow! (%d/%d)\r\n", g_com_ctx.data_available, g_com_ctx.rx_buffer_size);
}
/**
@@ -229,7 +229,8 @@
FPRINT("\r\n");
d7a_com_stop_rx();
d7a_com_stop_tx();
-
+
+ g_com_ctx.state = SEARCH_HEADER;
g_com_ctx.data_available = 0;
g_com_ctx.skipped_bytes = 0;
g_com_ctx.write_idx = 0;
@@ -287,6 +288,7 @@
d7a_com_start_tx();
}
+
static void d7a_com_copy_to_linear(uint8_t* linear_buffer, uint16_t read_start, uint16_t length)
{
uint16_t first_part_size;
@@ -322,13 +324,15 @@
//dbg_print_data("%02X ", (uint8_t*)buffer, length);
//DPRINT("\r\n");
- Thread::wait(5);
+ Thread::wait(2);
for (uint32_t i=0 ; i<length ; i++)
{
g_com_ctx.serial->putc(buffer[i]);
}
+ //Thread::wait(2);
+
*(g_com_ctx.rts) = 0;
}
@@ -438,11 +442,13 @@
// This has to be here to avoid going to another process
if (pkt->id == KAL_COM_FLOW_SYS_XON)
{
+ DPRINT("XON\r\n");
g_com_ctx.tx_thread->signal_set(XON_SIGNAL);
FREE(pkt);
}
else if (pkt->id == KAL_COM_FLOW_SYS_XOFF)
{
+ DPRINT("XOFF\r\n");
d7a_sys_xack();
FREE(pkt);
}
@@ -481,6 +487,8 @@
uint8_t header[KAL_COM_HEADER_LEN];
uint8_t seqnum;
+ ASSERT(g_com_ctx.data_available >= KAL_COM_HEADER_LEN, "Not enough data for header\r\n");
+
g_com_ctx.skipped_bytes = 0;
// Lookup fist sync byte
@@ -504,7 +512,15 @@
// search for body
d7a_com_forward_buffer(KAL_COM_HEADER_LEN);
g_com_ctx.state = SEARCH_BODY;
- //DPRINT("COM header found (body %d bytes)\r\n", g_com_ctx.data_needed);
+
+ // Start parsing if data is already available
+ if (g_com_ctx.data_available >= g_com_ctx.msg.blen)
+ {
+ g_com_ctx.state = PARSE_BODY;
+ g_com_ctx.data_parsing->release();
+ }
+
+ DPRINT("COM header found (body %d/%d bytes)\r\n", g_com_ctx.data_available, g_com_ctx.msg.blen);
break;
}
}
@@ -535,6 +551,8 @@
*/
static void parse_packet_body(void)
{
+ ASSERT(g_com_ctx.data_available >= g_com_ctx.msg.blen, "Not enough data for body\r\n");
+
if (KAL_COM_FLOWID(g_com_ctx.msg.id) != KAL_COM_FLOWID_TRC)
{
//DPRINT("Got packet id 0x%02X len %d\r\n", id, len);
@@ -558,6 +576,13 @@
// update buffer indexes
d7a_com_forward_buffer(g_com_ctx.msg.blen);
g_com_ctx.state = SEARCH_HEADER;
+
+ // Start parsing if data is already available
+ if (g_com_ctx.data_available >= KAL_COM_HEADER_LEN)
+ {
+ g_com_ctx.state = PARSE_HEADER;
+ g_com_ctx.data_parsing->release();
+ }
}
@@ -624,9 +649,8 @@
if (KAL_COM_FLOW_SYS_XACK == flow_id)
{
- DPRINT("XOFF\r\n");
+ DPRINT("XACK\r\n");
g_com_ctx.tx_thread->signal_wait(XON_SIGNAL);
- DPRINT("XON\r\n");
}
}
}
