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:
9:046247707ffb
Parent:
8:3313aa7f9082
Child:
10:55e35536d493
--- a/main.cpp	Thu Jan 22 19:14:46 2015 +0000
+++ b/main.cpp	Thu Jan 22 23:04:42 2015 +0000
@@ -1,7 +1,6 @@
 #include "mbed.h"
 #include "USBSerial.h"
 #include "MODSERIAL.h"
-#include "InterruptIn.h"
 
 // Constants
 #define LEDON       0               // Low active for LEDs - turns LED on
@@ -58,9 +57,12 @@
 int i, j;                           // index variables
 int status = 0x00;                  // return value
 
-int prox_irq(void)
+uint8_t led_com_state = LEDOFF;
+uint8_t prox_irq_state = 0;         // interrupt state passed from service routine
+
+void prox_irq(void)
 {
-    return 0;
+    prox_irq_state = 1;
 }
 
 int init_periph(void)
@@ -79,6 +81,9 @@
     // Prox & EEPROM
     i2c.frequency(I2CRATE);                                             // I2C speed = 400Kbps
     prox_int.mode(PullUp);                                              // pull up proximity sensor interrupt at MCU
+    prox_int.fall(&prox_irq);
+    prox_int.enable_irq();
+    cdc.printf("Interrupt active");
     
     // LEDs                                                             // Cycle through the LEDs.
     led_err.write(LEDON);
@@ -176,37 +181,36 @@
     return i2c_err;                                                     // 0 = ACK received, 1 = NAK/failure
 }
 
+
 // GPIO messages = 0xDD, r/w#, value, 0x7E, 0xXX, 0xXX - last two are fillers where CRC goes for RFID
 int gpio_rd()
 {
-    led_err.write(LEDON);
-    led_com.write(LEDON);
-rfid_int.write(0);
-rfid_isp.write(0);
-cdc.putc( led_err.read());//       && 0x01);                 // read all of the GPIO pins and store in a single byte
-cdc.putc( led_com.read());//  << 1) && 0x02);
-cdc.putc( rfid_int.read());// << 2) && 0x04);
-cdc.putc( rfid_isp.read());// << 3) && 0x08);
-
+    gpio_buffer[2]  = ( led_err.read()        & 0x01);                  // read all of the GPIO pins and store in a single byte
+    gpio_buffer[2] |= ((led_com_state   << 1) & 0x02);                  // use of led_com_state allows the led to be ON during this call, but send back the pre-call state.
+    gpio_buffer[2] |= ((rfid_int.read() << 2) & 0x04);
+    gpio_buffer[2] |= ((rfid_isp.read() << 3) & 0x08);
+    gpio_buffer[2] |= ((rfid_rst.read() << 4) & 0x10);
+    gpio_buffer[2] |= ((rfid_pwr.read() << 5) & 0x20);
     
     return ERR_NONE;
 }
 
 int gpio_wr()
 {
-    cdc.putc(gpio_buffer[2]);
-    cdc.putc(gpio_buffer[2] && 0x01);
-    cdc.putc(gpio_buffer[2] && 0x02);
-    cdc.putc(gpio_buffer[2] && 0x04);
-    cdc.putc(gpio_buffer[2] && 0x08);
-    cdc.putc(gpio_buffer[2] && 0x10);
-    cdc.putc(gpio_buffer[2] && 0x20);
-    led_err.write(gpio_buffer[2] && 0x01);                              // any bit set will write a 0
-    led_com.write(gpio_buffer[2] && 0x02);                              // any bit set will write a 0
-    rfid_int.write(gpio_buffer[2] && 0x04);                             // any bit set will write a 0
-    rfid_isp.write(gpio_buffer[2] && 0x05);                             // any bit set will write a 0
-    rfid_rst.write(gpio_buffer[2] && 0x10);                             // any bit set will write a 0
-    rfid_pwr.write(gpio_buffer[2] && 0x20);                             // any bit set will write a 0
+    if ((gpio_buffer[2] & 0x02) == 0x00) 
+    {
+        led_com_state = LEDON;
+    }
+    else 
+    {
+        led_com_state = LEDOFF;
+    }
+    led_err.write(gpio_buffer[2] & 0x01);                              
+    led_com.write(led_com_state);                              
+    rfid_int.write(gpio_buffer[2] & 0x04);                             
+    rfid_isp.write(gpio_buffer[2] & 0x08);                             
+    rfid_rst.write(gpio_buffer[2] & 0x10);                             
+    rfid_pwr.write(gpio_buffer[2] & 0x20);                             
     return ERR_NONE;
 }
     
@@ -243,15 +247,24 @@
 {
     // initialize everything
 
-    wait(2.0);
-   
+    wait(5.0);                                                          // gives a chance to connect the COM port - this can be removed for production
+
     init_periph();
     
-    
     while(1)
     {
-        led_com.write(LEDOFF);                                          // turn off communication LED
-        while(!cdc.readable());                                         // spin here until a message comes in from the host PC
+        led_com.write(led_com_state);                                   // turn off communication LED unless it was specifically turned on by GPIO command
+        while(!cdc.readable())
+        {
+            if(prox_irq_state == 1)
+            {
+                prox_irq_state = 0;
+                cdc.putc(0xFF);
+                cdc.putc(0x7E);
+                cdc.putc(0x0F);
+                cdc.putc(0xF0);
+            }
+        }                                         // spin here until a message comes in from the host PC
         led_com.write(LEDON);                                           // Message received - turn on LED
         bool end_mark = FALSE;
         uint8_t crcCount = sizeof(cdc_buffer_rx);                       // use tx buffer size to start