Gabriel Delgado / Mbed 2 deprecated MTi-1_uart

Dependencies:   mbed mbed-rtos Xbus

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;