Super Vision / Mbed 2 deprecated sv_usb_firmware

Dependencies:   MODSERIAL USBDevice_for_Rev_C_HW mbed

Fork of mbed_sv_firmware_with_init by Bob Recny

Revision:
0:8604e9cc07f2
Child:
1:bd988d267998
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 19 23:16:50 2015 +0000
@@ -0,0 +1,215 @@
+#include "mbed.h"
+#include "USBSerial.h"
+#include "MODSERIAL.h"
+#include "InterruptIn.h"
+
+// Constants
+#define LEDON       0               // Low active for LEDs - turns LED on
+#define LEDOFF      1               // Low active for LEDs - turns LED off
+#define TRUE        1
+#define FALSE       0
+
+
+// Error return values
+#define ERR_NONE                0   // Success
+#define ERR_CDC_BAD_CMD         1
+#define ERR_CDC_NO_TX_ENDMARK   2
+#define ERR_UART_NOT_WRITEABLE  3   // UART has no buffer space
+#define ERR_UART_NO_TX_ENDMARK  4  // message for UART has no 0x7E end-mark
+#define ERR_UART_NO_RX_ENDMARK  5   // message received from UART has no end-mark
+
+
+// I2C addresses
+#define PROX        (0x29 << 1)     // default I2C address of VL6180X, shift into upper 7 bits
+#define EEPROM      (0xA0)          // default I2C address of EEPROM, already shifted
+
+// UART-RFID baud rate
+#define RFIDBAUD    115200          // RFID-FE board default rate = 115.2Kbps
+
+// Peripherals
+USBSerial cdc;                      // CDC Class USB<>Serial adapter.  Needs custom INF, but uses existing Windows drivers.
+MODSERIAL uart(PTA2, PTA1);         // UART port connected to RFID-FE board
+I2C i2c(PTB1, PTB0);                // I2C port connected to VL6180X and EEPROM - note addresses above)
+
+// GPIO signals
+DigitalOut led_err(PTC1);           // Red LED shows error condition (active low)
+DigitalOut led_com(PTC2);           // Yellow LED shows communication activity (active low)
+DigitalOut rfid_int(PTD4);          // RFID FE power control (active high)
+DigitalOut rfid_isp(PTD5);          // RFID FE In-System Programming (active high)
+DigitalOut rfid_rst(PTD6);          // RFID FE Reset (active high)
+DigitalOut rfid_pwr(PTE30);         // RFID power switch on USB board (active high for prototype 1, low for all others)
+DigitalIn rfid_hot(PTE0);           // RFID over-current detection on USB board power switch (active low)
+InterruptIn prox_int(PTD7);         // Proximity sensor interrupt (active low)
+
+// buffers & variables
+uint8_t cdc_buffer_rx[32];          // buffers for cdc (USB-Serial port on PC)
+uint8_t cdc_buffer_tx[32];
+uint8_t uart_buffer_rx[32];         // buffers for uart (RFID-FE board)
+uint8_t uart_buffer_tx[32];
+int i, j;                           // index variables
+int status = 0x00;                  // return value
+
+int prox_irq(void)
+{
+    return 0;
+}
+
+int init_periph(void)
+{
+    // Set up peripherals
+    // RFID
+    uart.baud(RFIDBAUD);                                            // RFID-FE baud rate
+    
+    rfid_int = 0;                                                   // RFID FE power control (active high)
+    rfid_isp = 0;                                                   // RFID FE In-System Programming (active high)
+    rfid_rst = 1;                                                   // RFID FE Reset (active high)
+    rfid_pwr = 1;                                                   // RFID power switch on USB board (active high for prototype 1, low for all others)
+    wait(0.25);                                                     // wait 1/4 second before...
+    rfid_rst = 0;                                                   // ... taking RFID out of reset
+        
+    // Prox
+    return 0;
+}
+
+int rfid_msg(void)
+{
+    bool end_mark = FALSE;
+    int i;
+    uint8_t crcCount = sizeof(uart_buffer_tx);                      // use tx buffer size to start
+    
+    uart.txBufferFlush();                                           // clear out UART buffers
+    uart.rxBufferFlush();
+    
+    for (int i = 0; i < sizeof(uart_buffer_tx); i++)
+    {
+        if (!uart.writeable()) return ERR_UART_NOT_WRITEABLE;       // if no space in uart, return error
+        uart.putc(uart_buffer_tx[i]);                               // send uart message
+                    
+        if (uart_buffer_tx[i] == 0x7E)                              // check for rfid end mark in outbound message
+        {
+            crcCount = 2;                                           // two more bytes for CRC
+            end_mark = TRUE;                                        // end mark was reached
+        }
+        if (crcCount-- == 0)                                        // end of message
+        {
+            if (end_mark == FALSE) return ERR_UART_NO_TX_ENDMARK;   // no end mark detected
+            break;
+        }
+    }
+    
+    end_mark = FALSE;
+    wait(0.5);
+    while(!uart.readable()) printf(".");                            // wait for data from rfid
+    crcCount = sizeof(uart_buffer_rx);                              // use rx buffer size to start
+    for (i = 0; i < sizeof(uart_buffer_rx); i++)
+    {
+        uart_buffer_rx[i] = uart.getc();                            // read a character
+//        cdc.printf("%d, 0x%X\n\r", i, uart_buffer_rx[i]);         // debug
+                
+        if (uart_buffer_rx[i] == 0x7E)                              // check for rfid end mark in inbound message
+        {
+            crcCount = 2;                                           // two more bytes for crc
+            end_mark = TRUE;                                        // end mark was reached
+        }
+        if (crcCount-- == 0)                                        // end of message
+        {
+            if (end_mark == FALSE) return ERR_UART_NO_RX_ENDMARK;  
+            break;
+        }
+    }
+    return ERR_NONE;
+}
+
+
+int prox_msg()
+{
+    return ERR_NONE;    
+}
+
+int gpio_msg()
+{
+    return ERR_NONE;
+}
+
+int eeprom_msg()                    // eeprom to be implemented along with next hardware prototype
+{
+    return ERR_NONE;
+}
+
+int main() 
+{
+    // initialize everything
+   
+    wait(3.0);
+    init_periph();
+    
+    cdc.printf("Starting...\n\r");
+    
+    //while(!cdc.readable());         // spin here until a message comes in from the host PC
+    bool end_mark = FALSE;
+    uint8_t crcCount = sizeof(cdc_buffer_rx);                            // use tx buffer size to start
+    cdc.printf("\n\rCDC Input: ");
+    for (i = 0; i < sizeof(cdc_buffer_rx); i++)
+    {
+        //cdc_buffer_rx[i] = cdc.getc();                             // 
+                    
+        cdc.printf("%X, ",cdc_buffer_rx[i]);
+
+        if (cdc_buffer_rx[i] == 0x7E)                            // check for rfid end mark in outbound message
+        {
+            crcCount = 2;                                       // two more bytes for CRC
+            end_mark = TRUE;                                    // end mark was reached
+        }
+        if (crcCount-- == 0)                                    // end of message
+        {
+            if (end_mark == FALSE) return ERR_UART_NO_TX_ENDMARK; // no end mark detected
+            break;
+        }
+    }
+
+    switch(cdc_buffer_rx[0])
+    {
+        case 0xBB:              // RFID-FE
+            for (i = 0; i < sizeof(cdc_buffer_rx); i++)
+            {
+                uart_buffer_tx[i] = cdc_buffer_rx[i];       // copy USB message to UART for RFID
+            }
+            
+            status = rfid_msg();         // send buffer to RFID and get response according to RFID board
+            
+            for (i = 0; i < sizeof(cdc_buffer_tx); i++)
+            {
+                cdc_buffer_tx[i] = uart_buffer_rx[i];       // copy RFID response back to USB buffer
+            }
+            
+            cdc.printf("\n\rRFID Response: ");
+            
+            for (i = 0; i < sizeof(cdc_buffer_tx); i++)
+            {
+                cdc.printf("%x, ", cdc_buffer_tx[i]);                            // send message back to PC
+                    
+                if (cdc_buffer_tx[i] == 0x7E)                            // check for rfid end mark in outbound message
+                {
+                    crcCount = 2;                                       // two more bytes for CRC
+                    end_mark = TRUE;                                    // end mark was reached
+                }
+                if (crcCount-- == 0)                                    // end of message
+                {
+                    if (end_mark == FALSE) return ERR_CDC_NO_TX_ENDMARK; // no end mark detected
+                    break;
+                }
+            }
+            break;
+        case 0xCC:              // Proximity Sensor
+            prox_msg();
+            break;
+        case 0xDD:              // GPIO (LEDs and RFID-FE control
+            gpio_msg();
+            break;
+        case 0xEE:              // Read/write EEPROM
+            eeprom_msg();
+            break;
+        default:
+            return ERR_CDC_BAD_CMD;
+    }
+}