kjj

Dependencies:   mbed-rtos mbed Xbus

Fork of MTi-1_example by Xsens

Revision:
26:665d3624f9ab
Parent:
25:01356fb59467
Child:
29:d9310e7b58b5
--- a/main.cpp	Wed May 20 13:58:34 2015 +0200
+++ b/main.cpp	Wed May 20 14:49:54 2015 +0200
@@ -4,6 +4,7 @@
 #include "xbusmessage.h"
 
 #define MEMORY_POOL_SIZE (4)
+#define RESPONSE_QUEUE_SIZE (1)
 #define MAX_XBUS_DATA_SIZE (128)
 
 static Serial pc(PA_2, PA_3);
@@ -12,6 +13,7 @@
 
 MemoryPool<XbusMessage, MEMORY_POOL_SIZE> g_messagePool;
 MemoryPool<uint8_t[MAX_XBUS_DATA_SIZE], MEMORY_POOL_SIZE> g_messageDataPool;
+Queue<XbusMessage, RESPONSE_QUEUE_SIZE> g_responseQueue;
 
 static void* allocateMessageData(size_t bufSize)
 {
@@ -31,15 +33,66 @@
 	}
 }
 
-static void sendCommand(XsMessageId cmdId)
+XbusMessage const* doTransaction(XbusMessage* m)
 {
-	uint8_t buf[8];
-	XbusMessage m = {cmdId};
-	size_t rawLength = XbusMessage_format(buf, &m);
+	uint8_t buf[64];
+	size_t rawLength = XbusMessage_format(buf, m);
 	for (size_t i = 0; i < rawLength; ++i)
 	{
 		mt.putc(buf[i]);
 	}
+
+	osEvent ev = g_responseQueue.get(500);
+	return ev.status == osEventMessage ? (XbusMessage*)ev.value.p : NULL;
+}
+
+static void freeMessage(XbusMessage const* m)
+{
+	if (m->data)
+		deallocateMessageData(m->data);
+	g_messagePool.free((XbusMessage*)m);
+}
+
+static void sendCommand(XsMessageId cmdId)
+{
+	XbusMessage m = {cmdId};
+	XbusMessage const* response = doTransaction(&m);
+
+	if (response)
+	{
+		switch (response->mid)
+		{
+			case XMID_GotoConfigAck:
+				pc.printf("Device went to config mode\n");
+				break;
+
+			case XMID_DeviceId:
+				pc.printf("Device ID: %08X\n", *(uint32_t*)response->data);
+				break;
+
+			case XMID_OutputConfig:
+				{
+					pc.printf("Output configuration\n");
+					OutputConfiguration* conf = (OutputConfiguration*)response->data;
+					for (int i = 0; i < response->length; ++i)
+					{
+						pc.printf("\t%s: %d Hz\n", XbusMessage_dataDescription(conf->dtype), conf->freq);
+						++conf;
+					}
+				}
+				break;
+
+
+			default:
+				pc.printf("Received response MID=%X, length=%d\n", response->mid, response->length);
+				break;
+		}
+		freeMessage(response);
+	}
+	else
+	{
+		pc.printf("Timeout waiting for response.\n");
+	}
 }
 
 static void handlePcCommand(char cmd)
@@ -64,14 +117,6 @@
 	}
 }
 
-static void pcHandler(void)
-{
-	while (pc.readable())
-	{
-		handlePcCommand(pc.getc());
-	}
-}
-
 static void handleDataMessage(struct XbusMessage const* message)
 {
 	pc.printf("MTData2:");
@@ -92,6 +137,7 @@
 		pc.printf(" Status:%X", status);
 	}
 	pc.printf("\n");
+	deallocateMessageData(message->data);
 }
 
 static void mtMessageHandler(struct XbusMessage const* message)
@@ -100,27 +146,11 @@
 	{
 		handleDataMessage(message);
 	}
-	else if (message->mid == XMID_DeviceId)
-	{
-		pc.printf("Device ID: %8X\n", *(uint32_t*)message->data);
-	}
-	else if (message->mid == XMID_OutputConfig)
-	{
-		pc.printf("Output configuration:\n");
-		struct OutputConfiguration* conf = (struct OutputConfiguration*)message->data;
-		for (int i = 0; i < message->length; ++i)
-		{
-			pc.printf("\t%s: %d Hz\n", XbusMessage_dataDescription(conf->dtype), conf->freq);
-			++conf;
-		}
-	}
 	else
 	{
-		pc.printf("Received Xbus message. MID=%X, length=%d\n", message->mid, message->length);
-	}
-	if (message->data)
-	{
-		deallocateMessageData(message->data);
+		XbusMessage* m = g_messagePool.alloc();
+		memcpy(m, message, sizeof(XbusMessage));
+		g_responseQueue.put(m);
 	}
 }
 
@@ -128,7 +158,6 @@
 {
 	pc.baud(921600);
 	pc.format(8, Serial::None, 2);
-	pc.attach(pcHandler, Serial::RxIrq);
 
 	mt.baud(921600);
 	mt.format(8, Serial::None, 2);
@@ -147,6 +176,9 @@
 
 	for (;;)
 	{
-		sleep();
+		while (pc.readable())
+		{
+			handlePcCommand(pc.getc());
+		}
 	}
 }