kjj
Dependencies: mbed-rtos mbed Xbus
Fork of MTi-1_example by
Revision 19:46e88d37ecef, committed 2015-05-19
- Comitter:
- Alex Young
- Date:
- Tue May 19 15:49:29 2015 +0200
- Parent:
- 18:2073072bad51
- Child:
- 20:38560fa3d2eb
- Commit message:
- Add support for parsing individual xbus messages.
Most xbus messages, except from MTData2 messages have a fixed format. To
make life easy for the user we will parse these and return the parsed
data in the memory pointed to by the XbusMessage data pointer. This way
we can just define structs for the different messages and users can
switch on the mid to decide how to cast the data pointer.
Changed in this revision
| xbus/xbusmessage.h | Show annotated file Show diff for this revision Revisions of this file |
| xbus/xbusparser.c | Show annotated file Show diff for this revision Revisions of this file |
--- a/xbus/xbusmessage.h Tue May 19 14:45:05 2015 +0200
+++ b/xbus/xbusmessage.h Tue May 19 15:49:29 2015 +0200
@@ -26,6 +26,8 @@
enum XsMessageId
{
+ XMID_ReqDid = 0x00,
+ XMID_DeviceId = 0x01,
XMID_GotoConfig = 0x30,
XMID_GotoConfigAck = 0x31,
XMID_GotoMeasurement = 0x10,
@@ -50,7 +52,7 @@
{
enum XsMessageId mid;
uint16_t length;
- uint8_t* data;
+ void* data;
};
size_t XbusMessage_format(uint8_t* raw, struct XbusMessage const* message);
--- 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;
