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:
6:98fe30430194
Parent:
4:4eebb4de22a7
Child:
7:b6e31bfdb2af
diff -r 6ef2d954fca3 -r 98fe30430194 main.cpp
--- a/main.cpp	Mon Nov 16 01:26:41 2015 +0000
+++ b/main.cpp	Mon Nov 16 05:10:17 2015 +0000
@@ -29,179 +29,189 @@
 Serial      pc(USBTX, USBRX);
 uint8_t     rxBuffer[5 + 1];
 
-Command     *myCommand;
+Commander 	_commander = Commander();
+Commander 	*commander = &_commander;
+FPGA 		_fpga = FPGA();
+FPGA		*fpga = &fpga;
+
+extern Block _HazBlock;
+Block *HazBlock = &_HazBlock;
+
 bool connectedToPC = false;
 
 void detectPC();
+void initInternal();
+void initPort(int baudRate=kBaudRate);
+int readSwitches();
+void printPCDetectedText();
+bool displayAboardDialog();
+void Rx_interrupt();
+
+
+int main()
+{
+	initInternal();
+	initPort();
+	srand((unsigned)time(NULL));
+	U_LEDS_OFF();
+	lcd->cls();
+	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
+	pc.attach(&Rx_interrupt, Serial::RxIrq);
+
+	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 autonomously.
+			i2cport->write_bit(0, 13);
+			lcd->cls();
+			LCDFL();
+			lcd->printf("Starting sorting operation");
+			wait(1);
+
+			for(;;) {
+				lcd->cls();
+				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 = fpga->checkForBlock();
+					if (i2cport->read_bit(11)) {
+						aboardOperation = displayAboardDialog();
+						// Cancel the aboard
+						if (aboardOperation == false) {
+							lcd->cls();
+							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 blockSize = fpga->checkForSize();
+
+				if (blockSize == HazBlock->size) {
+					//                        detectColour()
+					lcd->cls();
+					lcd->printf("Detecting Colour");
+				}
+			}
+
+		} else if (selection == 2) {
+			// Wait for PC to send '!<pc>init;' command.
+			lcd->cls();
+			LCDFL();
+			lcd->printf("Waiting for PC...");
+			LCDSL();
+			lcd->printf("4: Main Menu");
+
+			int aboardOperation = false;
+			while (connectedToPC == false && aboardOperation == false){
+				aboardOperation = readSwitches() == 4;
+			}
+			if (aboardOperation == true) { break; }
+			else if (connectedToPC == true){
+				lcd->cls();
+				LCDFL();
+				lcd->printf("Connected to PC");
+				LCDSL();
+				lcd->printf("4: Disconnect.");
+			}
+
+			while (aboardOperation == false){
+				aboardOperation = readSwitches() == 4;
+			}
+			if (aboardOperation == true ) { break; }
+		}
+
+	}
+}
+
+/// Called every-time it receives an char from PC.
+void Rx_interrupt(){
+
+}
 
 void initInternal()
 {
-    i2cport = new MCP23017(p9, p10, 0x40);
-    lcd = new WattBob_TextLCD(i2cport);
-    myLED1 = 1;
-    BACKLIGHT_ON(i2cport);
-    lcd->cls();
-    LCDFL();
-    lcd->printf("Initilizing...");
-    myLED2 = 1;
-    return;
+	i2cport = new MCP23017(p9, p10, 0x40);
+	lcd = new WattBob_TextLCD(i2cport);
+	myLED1 = 1;
+	BACKLIGHT_ON(i2cport);
+	lcd->cls();
+	LCDFL();
+	lcd->printf("Initilizing...");
+	myLED2 = 1;
+	return;
 }
 
-void initPort(int baudRate=gBaudRate)
+void initPort(int baudRate=kBaudRate)
 {
-    myLED3 = 1;
-    pc.baud(baudRate);
-    pc.format(8, SerialBase::None, gStopBits);
-    myLED4 = 1;
-    wait (0.1);
-    return;
+	myLED3 = 1;
+	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);
+
+	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;
+	}
+
 }
 
-void detectPC()
+void printPCDetectedText()
 {
-    lcd->cls();
-    LCDFL();
-    lcd->printf("Detected PC.");
-    LCDSL();
-    lcd->printf("Connecting");
-    initPort();
+	lcd->cls();
+	LCDFL();
+	lcd->printf("Detected PC.");
+	LCDSL();
+	lcd->printf("Connecting");
+	initPort();
 }
 
 bool displayAboardDialog()
 {
-    lcd->cls();
-    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;
-    }
+	lcd->cls();
+	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()
-{
-    initInternal();
-    initPort();
-    srand((unsigned)time(NULL));
-    U_LEDS_OFF();
-    lcd->cls();
-    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);
-            lcd->cls();
-            LCDFL();
-            lcd->printf("Starting sorting operation");
-            wait(1);
-
-            for(;;) {
-                lcd->cls();
-                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 = checkForBlock();
-                    if (i2cport->read_bit(11)) {
-                        aboardOperation = displayAboardDialog();
-                        // Cancel the aboard
-                        if (aboardOperation == false) {
-                            lcd->cls();
-                            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()
-                    lcd->cls();
-                    lcd->printf("Detecting Colour");
-                }
-            }
-
-        }
-
-        else if (selection == 2) {
-            // Wait for PC to send '$' char to make sure it's there.
-            lcd->cls();
-            LCDFL();
-            lcd->printf("Waiting for PC...");
-            LCDSL();
-            lcd->printf("4: Main Menu");
-
-        }
-
-    }
-
-
-    FOREVER {
-        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();
-            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("inputstring:%s\r\n%s\r\n<%s>\r\n%s;\r\n", myCommand.inputString, myCommand.commandType, myCommand.commandObject, myCommand.commandString);
-//            decodeCommand(&myCommand);
-
-
-    }
-}
\ No newline at end of file