3rd year group project. Electronic and Electrical Engineering. Heriot-Watt University. This is the code for the mbed for the Automatic Little Object Organiser (ALOO).

Dependencies:   MCP23017 TCS3472_I2C WattBob_TextLCD mbed

Revision:
3:843b830ee8bd
Parent:
2:7a55cb10259f
Child:
4:4eebb4de22a7
diff -r 7a55cb10259f -r 843b830ee8bd main.cpp
--- a/main.cpp	Fri Oct 30 07:51:47 2015 +0000
+++ b/main.cpp	Wed Nov 11 03:45:30 2015 +0000
@@ -7,6 +7,7 @@
 //#include <future>
 #include "globals.h"
 #include "commander.h"
+#include "fpga.h"
 
 #define BACKLIGHT_ON(INTERFACE) INTERFACE->write_bit(1, 4);
 #define BACKLIGHT_OFF(INTERFACE) INTERFACE->write_bit(0, 4);
@@ -28,40 +29,169 @@
 
 TCS3472_I2C rgb_sensor(p28, p27);
 Serial      pc(USBTX, USBRX);
+uint8_t     rxBuffer[5 + 1];
 
 Command     myCommand;
+bool connectedToPC = false;
 
-void initPort(){
+void detectPC();
+
+void initInternal(){
+    i2cport = new MCP23017(p9, p10, 0x40);
+    lcd = new WattBob_TextLCD(i2cport);
+    myLED1 = 1;
+    BACKLIGHT_ON(i2cport);
+    CLEAR_LCD();
+    LCDFL();
+    PRINT_LCD("Initilizing...");
+    myLED2 = 1;
+    return;
+}
+
+void initPort(int baudRate=gBaudRate){
     myLED3 = 1;
-    pc.baud(gBaudRate);
+    pc.baud(baudRate);
     pc.format(8, SerialBase::None, gStopBits);
     myLED4 = 1;
     wait (0.1);
+    return;
+}
+
+int readSwitches(){
+    do {
+        if(i2cport->read_bit(8)) {
+            return 1;
+        } else if (i2cport->read_bit(9)) {
+            return 2;
+        } else if (i2cport->read_bit(10)) {
+            return 3;
+        } else if (i2cport->read_bit(11)) {
+            return 4;
+        } else {
+            return 0;
+        }
+    } while (1);
+}
+
+void detectPC(){
+    CLEAR_LCD();
+    LCDFL();
+    lcd->printf("Detected PC.");
+    LCDSL();
+    lcd->printf("Connecting");
+    initPort();
+}
+
+bool displayAboardDialog(){
+    CLEAR_LCD();
+    LCDFL();
+    lcd->printf("Aboard operation?");
+    LCDSL();
+    lcd->printf("1: YES, 2,3,4: NO");
+    int reply = readSwitches();
+    if (reply == 1) { return true; }
+    else { return false; }
 }
 
 int main(){
-        i2cport = new MCP23017(p9, p10, 0x40);
-        lcd = new WattBob_TextLCD(i2cport);
-        myLED1 = 1;
-        BACKLIGHT_ON(i2cport);
-        CLEAR_LCD();
-        LCDFL();
-        PRINT_LCD("Initilizing...");
-        myLED2 = 1;
+        initInternal();
         initPort();
         srand((unsigned)time(NULL));
         U_LEDS_OFF();
         CLEAR_LCD();
         myLED1 = 1;
         
+        // Create a serial intereput for RxIrq so when PC is connected it sends '$' to tell MBED it's there.
+        // https://developer.mbed.org/cookbook/Serial-Interrupts
+        
+        for (;;) {
+            i2cport->write_bit(1, 12);
+            lcd->printf("1: Start sorting.");
+            LCDSL();
+            i2cport->write_bit(1,13);
+            lcd->printf("2: Connect to PC");
+
+            int selection = 0;
+            do {
+                selection = readSwitches();
+            } while (selection == 1 || selection == 2);
+
+            if (selection == 1) {
+                // User selected op 1: Start sorting autonomaously.
+                i2cport->write_bit(0, 13);
+                CLEAR_LCD();
+                LCDFL();
+                lcd->printf("Starting sorting operation");
+                wait(1);
+
+                for(;;) {
+                    CLEAR_LCD();
+                    lcd->printf("Waiting for block");
+                    i2cport->write_bit(1, 15);
+                    bool aboardOperation = false;
+
+                    int blockInserted = 0;
+                    // Wait until a block is breaking the beam, or button 4 is pressed to aboard.
+                    do {
+                        blockInserted = blockIsInserted();
+                        if (i2cport->read_bit(11)) {
+                            aboardOperation = displayAboardDialog();
+                            // Cancel the aboard 
+                            if (aboardOperation == false) {
+                                CLEAR_LCD();
+                                LCDFL();
+                                lcd->printf("Waiting for block");
+                            }
+                        }
+                    } while (aboardOperation == false && blockInserted != 1);
+                    
+                    // Break and return to main menu i.e. Start Op, or Connect to PC.
+                    if (aboardOperation == true) { break; }
+                    // Cannot aboard any longer. Block is inserted.
+                    int largeBlock = blockIsLarge();
+                    
+                    if (largeBlock == hazBlock.blockSizeEnum){
+//                        detectColour()
+                        CLEAR_LCD();
+                        lcd->printf("Detecting Colour");
+                    }
+                   } 
+                    
+                }
+
+                else if (selection == 2) {
+                    // Wait for PC to send '$' char to make sure it's there.
+                    CLEAR_LCD();
+                    LCDFL();
+                    lcd->printf("Waiting for PC...");
+                    LCDSL();
+                    lcd->printf("4: Main Menu");
+                    
+                }
+
+            }
+        
+        
         FOREVER {
-            Type type;
+            pc.printf("In FOREVER\n");
+            Type type = INVALID;
+            pc.printf("Type set to: %i\r\n", type);
             do {
+                pc.printf("In DO-WHILE loop\r\n");
                 type = listenForCommand();
-            } while (type != -1);
+                if (i2cport->read_bit(8)){
+                    pc.printf("Listening\r\n");
+                }
+            } while (type == -1);
+            
+            pc.printf("Command Inbound\r\n");
+            
+            myCommand.typeEnum = type;
+            pc.printf("Type: %i\r\n-------------\r\n", myCommand.typeEnum);
             recieveCommand(&myCommand, type);
-            pc.printf("%s\r\n<%s>\r\n%s;\r\n", myCommand.commandType, myCommand.commandObject, myCommand.commandString);
-            decodeCommand(&myCommand);
+            
+            pc.printf("inputstring:%s\r\n%s\r\n<%s>\r\n%s;\r\n", myCommand.inputString, myCommand.commandType, myCommand.commandObject, myCommand.commandString);
+//            decodeCommand(&myCommand);
             
             
         }