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.
Dependencies: mbed mbed-rtos Xbus
Diff: xbus/xbusparser.c
- Revision:
- 19:46e88d37ecef
- Parent:
- 17:680f28e00d17
- Child:
- 22:3eab999c5076
--- a/xbus/xbusparser.c Tue May 19 14:45:05 2015 +0200
+++ b/xbus/xbusparser.c Tue May 19 15:49:29 2015 +0200
@@ -15,7 +15,17 @@
#include "xbusparser.h"
#include "xbusdef.h"
+#include "xbusutility.h"
#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+/*!
+ * \brief Max message length for parsed message types.
+ * Unparsed types, e.g. MtData2 packets, will have buffers dynamically
+ * requested, so are not constrained by this value.
+ */
+#define XBUS_MAX_MESSAGE_LENGTH (64)
enum XbusParserState
{
@@ -33,6 +43,7 @@
{
struct XbusParserCallback callbacks;
struct XbusMessage currentMessage;
+ uint8_t rxBuffer[XBUS_MAX_MESSAGE_LENGTH];
uint16_t payloadReceived;
uint8_t checksum;
enum XbusParserState state;
@@ -67,10 +78,60 @@
return parser;
}
-static void prepareForPayload(struct XbusParser* parser)
+static bool canParseMessagePayload(enum XsMessageId mid)
+{
+ switch (mid)
+ {
+ case XMID_DeviceId:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+static void parseMessagePayload(struct XbusParser* parser)
{
- parser->currentMessage.data = parser->callbacks.allocateBuffer(parser->currentMessage.length);
+ switch (parser->currentMessage.mid)
+ {
+ case XMID_DeviceId:
+ {
+ uint32_t* deviceId = parser->callbacks.allocateBuffer(sizeof(uint32_t));
+ if (deviceId)
+ {
+ XbusUtility_readU32(deviceId, parser->rxBuffer);
+ parser->currentMessage.data = deviceId;
+ }
+ else
+ {
+ parser->currentMessage.data = NULL;
+ }
+ }
+ break;
+
+ default:
+ assert(!canParseMessagePayload(parser->currentMessage.mid));
+ break;
+ }
+}
+
+void prepareForPayload(struct XbusParser* parser)
+{
+ parser->currentMessage.data = NULL;
parser->payloadReceived = 0;
+
+ if (canParseMessagePayload(parser->currentMessage.mid))
+ {
+ assert(parser->currentMessage.length < XBUS_MAX_MESSAGE_LENGTH);
+ if (parser->currentMessage.length < XBUS_MAX_MESSAGE_LENGTH)
+ {
+ parser->currentMessage.data = parser->rxBuffer;
+ }
+ }
+ else
+ {
+ parser->currentMessage.data = parser->callbacks.allocateBuffer(parser->currentMessage.length);
+ }
}
void XbusParser_parseByte(struct XbusParser* parser, const uint8_t byte)
@@ -133,7 +194,7 @@
parser->checksum += byte;
if (parser->currentMessage.data)
{
- parser->currentMessage.data[parser->payloadReceived] = byte;
+ ((uint8_t*)parser->currentMessage.data)[parser->payloadReceived] = byte;
}
if (++parser->payloadReceived == parser->currentMessage.length)
{
@@ -147,6 +208,7 @@
((parser->currentMessage.length == 0) ||
parser->currentMessage.data))
{
+ parseMessagePayload(parser);
parser->callbacks.handleMessage(&parser->currentMessage);
}
parser->state = XBPS_Preamble;