I2C/SPI/GPIO example for MAX32625PICO board

Dependencies:   SerialInterface USBDevice max32625pico

Fork of PICO_USB_I2C_SPI by Greg Steiert

Revision:
3:aa55728c8e09
Parent:
2:57500e991166
Child:
5:2436ae0a9eb1
--- a/main.cpp	Thu Dec 08 00:06:59 2016 +0000
+++ b/main.cpp	Thu Dec 08 05:23:14 2016 +0000
@@ -1,40 +1,124 @@
 #include "mbed.h"
 #include "max32630fthr.h"
 #include "USBSerial.h"
+#include "SerialInterface.h"
+
+#define UART_MAX_RESP_LENGTH  255
+#define UART_MAX_CMD_LENGTH  255
+#define USB_MAX_RESP_LENGTH  255
+#define USB_MAX_CMD_LENGTH  255
 
 MAX32630FTHR pegasus(MAX32630FTHR::VIO_3V3);
 
 // Hardware serial port over DAPLink
 Serial daplink(P2_1, P2_0);
 
+// Virtual serial port over USB
+USBSerial microUSB;
+
+// Serial Interface Adapter
+SerialInterface serInt;
+
+// Serial Interfaces
+I2C i2c(P3_4, P3_5);
+SPI spi(P5_1, P5_2, P5_0, P5_3);
+
+// Threads
+Thread threadUSB;
+Thread threadUART;
+
 DigitalOut rLED(LED1);
 DigitalOut gLED(LED2);
 DigitalOut bLED(LED3);
 
+void usb_thread()
+{
+    char obuf[USB_MAX_RESP_LENGTH+1];
+    char ibuf[USB_MAX_CMD_LENGTH+1];
+    int i = 0;
+
+    while(1) {
+        if (microUSB.readable()) {
+            ibuf[i]=microUSB.getc();
+            if (ibuf[i]!='\r') {
+                if (i < USB_MAX_CMD_LENGTH) {
+                    i += 1;
+                }
+            } else {
+                rLED = LED_ON;
+                if (i < USB_MAX_CMD_LENGTH) {
+                    ibuf[i]=0;
+//                    microUSB.printf("UART CMD:  %s=", ibuf);
+                    serInt.call(ibuf, obuf);
+                    microUSB.printf("%s\r\n", obuf);
+                } else {
+                    microUSB.printf("[-1]\r\n");
+                }
+                i=0;
+                rLED = LED_OFF;
+            }
+        }
+    }
+}
+
+void uart_thread()
+{
+    char obuf[UART_MAX_RESP_LENGTH+1];
+    char ibuf[UART_MAX_CMD_LENGTH+1];
+    int i = 0;
+
+    while(1) {
+        if (daplink.readable()) {
+            ibuf[i]=daplink.getc();
+            if (ibuf[i]!='\r') {
+                if (i < UART_MAX_CMD_LENGTH) {
+                    i += 1;
+                }
+            } else {
+                bLED = LED_ON;
+                if (i < UART_MAX_CMD_LENGTH) {
+                    ibuf[i]=0;
+//                    daplink.printf("UART CMD:  %s=", ibuf);
+                    serInt.call(ibuf, obuf);
+                    daplink.printf("%s\r\n", obuf);
+                } else {
+                    daplink.printf("[-1]\r\n");
+                }
+                i=0;
+                bLED = LED_OFF;
+            }
+        }
+    }
+}
+
 // main() runs in its own thread in the OS
 // (note the calls to Thread::wait below for delays)
 int main()
 {
-    int c;
-
     daplink.printf("daplink serial port\r\n");
+    microUSB.printf("micro USB serial port\r\n");
     rLED = LED_ON;
     gLED = LED_ON;
     bLED = LED_OFF;
+
+//  Board Initialization
     pegasus.init();
 
-    // Virtual serial port over USB
-    USBSerial microUSB;
-    microUSB.printf("micro USB serial port\r\n");
-    
+//  Serial Interface Setup
+    serInt.init(&i2c, &spi);
 
     rLED = LED_OFF;
+    
+// Start USB serial thread
+    threadUSB.start(usb_thread);
+    
+// Start UART serial thread
+    threadUART.start(uart_thread);
 
+// Start main loop
     while(1) {
-        c = microUSB.getc();
-        microUSB.putc(c);
-        daplink.putc(c);
-        bLED = c & 1;
+        Thread::wait(500);
+        gLED = !gLED;
     }
 }