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:
- 76:fda2e34ff19d
- Parent:
- 71:f03727ff0f99
- Child:
- 77:8c792719a1fc
--- a/src/d7a_com.cpp Fri Dec 16 16:04:27 2016 +0000
+++ b/src/d7a_com.cpp Tue Dec 20 09:30:14 2016 +0000
@@ -8,8 +8,9 @@
#include "d7a_fs.h"
#include "d7a_modem.h"
#include "d7a_sys.h"
-#include "circular.h"
+#include "cbuffer.h"
+#define LocalCBuffer CBuffer<uint8_t, 1024>
#define XON_SIGNAL (0x0001 << 0)
#define START_SIGNAL (0x0001 << 1)
@@ -35,7 +36,7 @@
DigitalOut* rts;
InterruptIn* cts;
- CircularBuffer* rx_buf;
+ LocalCBuffer* rx_buf;
// min data in buffer before parsing body
d7a_com_rx_msg_t msg;
@@ -56,7 +57,7 @@
// Data treatment threads
Thread* rx_thread;
- Serial* serial;
+ RawSerial* serial;
// Tx Thread
Thread* tx_thread;
@@ -75,8 +76,8 @@
@param void
@return void
*/
-void d7a_com_rx_thread( void const *p );
-void d7a_com_tx_thread( void const *p );
+void d7a_com_rx_thread();
+void d7a_com_tx_thread();
/**
@@ -99,12 +100,12 @@
//if (g_com_ctx.rx_started)
{
// unlock data parsing thread
- if (g_com_ctx.state == SEARCH_HEADER && g_com_ctx.rx_buf->available() >= KAL_COM_HEADER_LEN)
+ if (g_com_ctx.state == SEARCH_HEADER && g_com_ctx.rx_buf->available_data() >= 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.rx_buf->available() >= g_com_ctx.msg.blen)
+ else if (g_com_ctx.state == SEARCH_BODY && g_com_ctx.rx_buf->available_data() >= g_com_ctx.msg.blen)
{
g_com_ctx.state = PARSE_BODY;
g_com_ctx.data_parsing->release();
@@ -142,7 +143,7 @@
g_com_ctx.tx_seq = 0;
g_com_ctx.rx_seq = 0;
- g_com_ctx.serial = new Serial(config->tx, config->rx);
+ g_com_ctx.serial = new RawSerial(config->tx, config->rx);
g_com_ctx.rts = new DigitalOut(config->rts);
g_com_ctx.cts = new InterruptIn(config->cts);
g_com_ctx.data_parsing = new Semaphore(0);
@@ -150,21 +151,20 @@
g_com_ctx.cts->rise(&cts_isr);
- g_com_ctx.rx_buf = new CircularBuffer(1024);
+ g_com_ctx.rx_buf = new LocalCBuffer;
- /* XXX: Unknown bug:
- Baud rate can be found with high error rate (> 4%).
- It is here manualy corrected after an oscilloscope measure.
- Normal Baudrate should be 115200.
- */
- //g_com_ctx.serial->baud(117000); // XXX
- g_com_ctx.serial->baud(115200); // XXX
- //g_com_ctx.serial->baud(57600); // XXX
+ g_com_ctx.serial->baud(115200);
g_com_ctx.serial->format(8, SerialBase::None, 1);
g_com_ctx.serial->attach(&rx_isr, Serial::RxIrq);
- g_com_ctx.tx_thread = new Thread(d7a_com_tx_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE*4);
- g_com_ctx.rx_thread = new Thread(d7a_com_rx_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE*4);
+ g_com_ctx.tx_thread = new Thread(osPriorityHigh, DEFAULT_STACK_SIZE*2, NULL);
+ g_com_ctx.rx_thread = new Thread(osPriorityHigh, DEFAULT_STACK_SIZE*2, NULL);
+
+ osStatus err = g_com_ctx.rx_thread->start(d7a_com_rx_thread);
+ ASSERT(err == osOK, "Failed to start d7a_com_rx_thread (err: %d)\r\n", err);
+
+ err = g_com_ctx.tx_thread->start(d7a_com_tx_thread);
+ ASSERT(err == osOK, "Failed to start d7a_com_tx_thread (err: %d)\r\n", err);
return D7A_ERR_NONE;
}
@@ -360,16 +360,18 @@
*/
static void parse_packet_header(void)
{
+ FPRINT("\r\n");
+
uint8_t header[KAL_COM_HEADER_LEN];
uint8_t seqnum;
- ASSERT(g_com_ctx.rx_buf->available() >= KAL_COM_HEADER_LEN, "Not enough data for header\r\n");
+ ASSERT(g_com_ctx.rx_buf->available_data() >= KAL_COM_HEADER_LEN, "Not enough data for header\r\n");
g_com_ctx.skipped_bytes = 0;
header[0] = g_com_ctx.rx_buf->pop();
- while (g_com_ctx.rx_buf->available() >= KAL_COM_HEADER_LEN - 1)
+ while (g_com_ctx.rx_buf->available_data() >= KAL_COM_HEADER_LEN - 1)
{
header[1] = g_com_ctx.rx_buf->pop();
@@ -392,13 +394,13 @@
g_com_ctx.state = SEARCH_BODY;
// Start parsing if data is already available
- if (g_com_ctx.rx_buf->available() >= g_com_ctx.msg.blen)
+ if (g_com_ctx.rx_buf->available_data() >= g_com_ctx.msg.blen)
{
g_com_ctx.state = PARSE_BODY;
g_com_ctx.data_parsing->release();
}
- //DPRINT("COM header found (id: %02X seq: %d body: %d/%d bytes)\r\n", g_com_ctx.msg.id, seqnum, g_com_ctx.rx_buf->available(), g_com_ctx.msg.blen);
+ //DPRINT("COM header found (id: %02X seq: %d body: %d/%d bytes)\r\n", g_com_ctx.msg.id, seqnum, g_com_ctx.rx_buf->available_data(), g_com_ctx.msg.blen);
break;
}
else
@@ -418,7 +420,7 @@
*/
static void parse_packet_body(void)
{
- ASSERT(g_com_ctx.rx_buf->available() >= g_com_ctx.msg.blen, "Not enough data for body\r\n");
+ ASSERT(g_com_ctx.rx_buf->available_data() >= 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)
{
@@ -445,7 +447,7 @@
g_com_ctx.state = SEARCH_HEADER;
// Start parsing if data is already available
- if (g_com_ctx.rx_buf->available() >= KAL_COM_HEADER_LEN)
+ if (g_com_ctx.rx_buf->available_data() >= KAL_COM_HEADER_LEN)
{
g_com_ctx.state = PARSE_HEADER;
g_com_ctx.data_parsing->release();
@@ -454,7 +456,7 @@
// Thread for parsing packets from RX buffer.
-void d7a_com_rx_thread( void const *p )
+void d7a_com_rx_thread()
{
FPRINT("(id:0x%08x)\r\n", osThreadGetId());
while (true)
@@ -473,7 +475,7 @@
}
}
-void d7a_com_tx_thread( void const *p )
+void d7a_com_tx_thread()
{
FPRINT("(id:0x%08x)\r\n", osThreadGetId());
