![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
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
Diff: main.cpp
- Revision:
- 6:98fe30430194
- Parent:
- 4:4eebb4de22a7
- Child:
- 7:b6e31bfdb2af
--- 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