Xsens / Mbed 2 deprecated MTi-1_fwu_example

Dependencies:   mbed-rtos mbed

Revision:
3:93d0057b0690
Parent:
1:7f19a1b1a9df
Child:
4:5c5eff85eea1
diff -r 7f19a1b1a9df -r 93d0057b0690 main.cpp
--- a/main.cpp	Tue Nov 24 12:49:45 2015 +0000
+++ b/main.cpp	Tue Dec 22 12:34:39 2015 +0100
@@ -65,8 +65,8 @@
 	|----------------|---------------|-------------------------|
 	|   Signal       | Nucleo F401   | Mti-1s Dev board header |
 	|----------------|---------------|-------------------------|
-	|    SCL         |    PB8        |       11                |
-	|    SDA         |    PB9        |       9                 |
+	|    SCL         |    PB8        |       9                 |
+	|    SDA         |    PB9        |       11                |
 	|    DRDY        |    PB3        |       15                |
 	|    ADD0        |    PB13       |       17                |
 	|    ADD1        |    PB14       |       19                |
@@ -140,6 +140,7 @@
 #define BUS_MODE_I2C
 //#define BUS_MODE_UART
 
+static void updateUartBaudrate();
 
 /*!	\brief Instance of MtInterface. Should be initialized by createMtInterface().
 */
@@ -155,6 +156,7 @@
 */
 static DigitalInOut resetLine(MT_RESET, PIN_INPUT, OpenDrain, 1);
 
+
 /*!	\brief Instance of the firmware updater
 */
 static FwUpdate *g_fwUpdate = NULL;
@@ -175,7 +177,7 @@
 #endif
 
 #ifdef BUS_MODE_UART
-	mtInterface = new MtInterfaceUart;
+	mtInterface = new MtInterfaceUart(115200);
 #endif
 }
 
@@ -208,14 +210,17 @@
 		pc.printf("Firmware update ready\r\n");
 	else if (result == FWU_Failed)
 		pc.printf("Firmware update failed\r\n");
+	
+	if (mtInterface->busFormat() == XBF_Uart)
+		updateUartBaudrate();
 }
 
+
 /*! \brief Sends a XMID_GotoConfig message to the Module
 */
 static void gotoConfig()
 {
-	XbusMessage xbusMessage = {XMID_GotoConfig};
-	xbusMessage.m_length = 0;
+	XbusMessage xbusMessage(XMID_GotoConfig);
 	mtInterface->sendXbusMessage(&xbusMessage);
 }
 
@@ -320,8 +325,7 @@
 	if (stayInBootloader)
 	{
 		wait(0.02);
-		XbusMessage xbusMessage = {XMID_GotoBootLoader};
-		xbusMessage.m_length = 0;
+		XbusMessage xbusMessage(XMID_GotoBootLoader);
 		mtInterface->sendXbusMessage(&xbusMessage);
 	} else
 	{
@@ -329,6 +333,50 @@
 	}
 }
 
+
+/*!	\brief Try to find the correct uart baudrate
+*/
+static void updateUartBaudrate()
+{
+	if (mtInterface->busFormat() != XBF_Uart)
+		return;
+	
+	pc.printf("Detecting uart baudrate of module\r\n");
+	
+	const int nofBaudrates = 2;
+	int baudrates[nofBaudrates] = {921600, 115200};
+	
+	bool success = false;
+	for (int n = 0; n < nofBaudrates; n++)
+	{
+		((MtInterfaceUart*)mtInterface)->setBaudrate(baudrates[n]);
+		pc.printf("Baudrate set to %d\r\n", baudrates[n]);
+		XbusMessage gotoConfigMessage(XMID_GotoConfig);
+		XbusMessage* result = mtInterface->sendAndWait(&gotoConfigMessage);
+		success = result && result->m_mid == XMID_GotoConfigAck;
+		mtInterface->releaseXbusMessage(result);
+		if (success)
+			break;
+	}
+	if (success)
+		pc.printf("Detecting uart baudrate of module done\r\n");
+	else
+		pc.printf("Detecting uart baudrate of module failed\r\n");
+}
+
+bool isInBootloader()
+{
+	XbusMessage fwRevisionMessage(XMID_ReqFirmwareRevision);
+	XbusMessage* ack = mtInterface->sendAndWait(&fwRevisionMessage);
+
+	bool result = false;
+	if (ack && ack->m_mid == XMID_FirmwareRevision)
+		result = ack->m_data[0] == 255;
+
+	mtInterface->releaseXbusMessage(ack);
+	return result;
+}
+
 /*!	\brief C-wrapper for sendXbusMessage callback function of FwUpdate.
 */
 static void sendXbusMessageWrapper(XbusMessage const* xbusMessage)
@@ -385,6 +433,10 @@
 
 	// Initialize the mtInterface object for communicating with the module:
 	createMtInterface();
+	
+	// If Uart mode is used update the baudrate to match the baudrate of the module:
+	if (mtInterface->busFormat() == XBF_Uart)
+		updateUartBaudrate();
 
 	// Reset the module
 	hardwareReset(false);
@@ -407,11 +459,19 @@
 		mtInterface->process();
 
 		XbusMessage* xbusMessage = mtInterface->getXbusMessage();
+		bool updateUartBaudrateRequired = false;
 		if (xbusMessage != NULL)
 		{
 			handleXbusMessage(xbusMessage);
+			updateUartBaudrateRequired = (mtInterface->busFormat() == XBF_Uart && (xbusMessage->m_mid == XMID_ResetAck || xbusMessage->m_mid == XMID_GotoBootLoaderAck));
 			mtInterface->releaseXbusMessage(xbusMessage);
 		}
+		
+		if (updateUartBaudrateRequired)
+		{
+			wait(0.2);
+			updateUartBaudrate();
+		}
 
 		if (pc.readable())
 		{
@@ -430,44 +490,46 @@
 
 			case 'm':
 			{
-				XbusMessage xbusMessage = {XMID_GotoMeasurement};
-				xbusMessage.m_length = 0;
+				XbusMessage xbusMessage(XMID_GotoMeasurement);
 				mtInterface->sendXbusMessage(&xbusMessage);
 			} break;
 
 			case 'r':
 			{
-				XbusMessage xbusMessage = {XMID_Reset};
-				xbusMessage.m_length = 0;
+				XbusMessage xbusMessage(XMID_Reset);
 				mtInterface->sendXbusMessage(&xbusMessage);
 			} break;
 
 			case 'b':
 			{
-				XbusMessage xbusMessage = {XMID_GotoBootLoader};
-				xbusMessage.m_length = 0;
+				XbusMessage xbusMessage(XMID_GotoBootLoader);
 				mtInterface->sendXbusMessage(&xbusMessage);
 			} break;
 
 			case 'v':
 			{
-				XbusMessage xbusMessage = {XMID_ReqFirmwareRevision};
-				xbusMessage.m_length = 0;
+				XbusMessage xbusMessage(XMID_ReqFirmwareRevision);
 				mtInterface->sendXbusMessage(&xbusMessage);
 			} break;
 
 			case 'd':
 			{
-				XbusMessage xbusMessage = {XMID_ReqDid};
-				xbusMessage.m_length = 0;
+				XbusMessage xbusMessage(XMID_ReqDid);
 				mtInterface->sendXbusMessage(&xbusMessage);
 			} break;
 
 			case 'u':
 			{
-				pc.printf("Starting firmware update\r\n");
-				FwUpdate_init(g_fwUpdate);
-				FwUpdate_start(g_fwUpdate);
+				if (isInBootloader())
+				{
+					pc.printf("Starting firmware update\r\n");
+					FwUpdate_init(g_fwUpdate);
+					FwUpdate_start(g_fwUpdate);
+				}
+				else
+				{
+					pc.printf("Firmware update not possible now. First switch module to bootloader.\r\n");
+				}
 			} break;
 
 			case 'x':