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

Committer:
dreamselec
Date:
Mon Nov 16 22:20:11 2015 +0000
Revision:
8:e1da2ae62885
Parent:
7:b6e31bfdb2af
Child:
9:dc8f155b71c8
Ready for PC command parsing testing. Currently only prints command to PC.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreamselec 0:fe5cb0a8fc5a 1 #include "mbed.h"
dreamselec 0:fe5cb0a8fc5a 2 #include "WattBob_TextLCD.h"
dreamselec 0:fe5cb0a8fc5a 3 #include "TCS3472_I2C.h"
dreamselec 0:fe5cb0a8fc5a 4 #include "MCP23017.h"
dreamselec 0:fe5cb0a8fc5a 5 #include <string>
dreamselec 1:92a2a5ef65a8 6 #include <time.h>
dreamselec 2:7a55cb10259f 7 //#include <future>
dreamselec 2:7a55cb10259f 8 #include "globals.h"
dreamselec 2:7a55cb10259f 9 #include "commander.h"
dreamselec 3:843b830ee8bd 10 #include "fpga.h"
dreamselec 0:fe5cb0a8fc5a 11
dreamselec 0:fe5cb0a8fc5a 12 #define BACKLIGHT_ON(INTERFACE) INTERFACE->write_bit(1, 4);
dreamselec 0:fe5cb0a8fc5a 13 #define BACKLIGHT_OFF(INTERFACE) INTERFACE->write_bit(0, 4);
dreamselec 0:fe5cb0a8fc5a 14
dreamselec 0:fe5cb0a8fc5a 15 #define LCDFL() lcd->locate(0,0);
dreamselec 0:fe5cb0a8fc5a 16 #define LCDSL() lcd->locate(1,0);
dreamselec 2:7a55cb10259f 17 #define D_LEDS_OFF() i2cport->write_bit(0, 12); i2cport->write_bit(0, 13); i2cport->write_bit(0, 14); i2cport->write_bit(0, 15);
dreamselec 2:7a55cb10259f 18 #define U_LEDS_OFF() myLED1 = 0; myLED2 = 0; myLED3 = 0; myLED4 = 0;
dreamselec 0:fe5cb0a8fc5a 19
dreamselec 2:7a55cb10259f 20 DigitalOut myLED1(LED1);
dreamselec 2:7a55cb10259f 21 DigitalOut myLED2(LED2);
dreamselec 2:7a55cb10259f 22 DigitalOut myLED3(LED3);
dreamselec 2:7a55cb10259f 23 DigitalOut myLED4(LED4);
dreamselec 0:fe5cb0a8fc5a 24
dreamselec 0:fe5cb0a8fc5a 25 MCP23017 *i2cport;
dreamselec 0:fe5cb0a8fc5a 26 WattBob_TextLCD *lcd;
dreamselec 0:fe5cb0a8fc5a 27
dreamselec 2:7a55cb10259f 28 TCS3472_I2C rgb_sensor(p28, p27);
dreamselec 2:7a55cb10259f 29 Serial pc(USBTX, USBRX);
dreamselec 8:e1da2ae62885 30 uint8_t rxBuffer[kSmallBufferSize + 1];
dreamselec 8:e1da2ae62885 31 int rxIndex = 0;
dreamselec 2:7a55cb10259f 32
dreamselec 6:98fe30430194 33 Commander _commander = Commander();
dreamselec 6:98fe30430194 34 Commander *commander = &_commander;
dreamselec 6:98fe30430194 35 FPGA _fpga = FPGA();
dreamselec 7:b6e31bfdb2af 36 FPGA *fpga = &_fpga;
dreamselec 6:98fe30430194 37
dreamselec 6:98fe30430194 38 extern Block _HazBlock;
dreamselec 6:98fe30430194 39 Block *HazBlock = &_HazBlock;
dreamselec 6:98fe30430194 40
dreamselec 3:843b830ee8bd 41 void detectPC();
dreamselec 6:98fe30430194 42 void initInternal();
dreamselec 7:b6e31bfdb2af 43 void initPort(int baudRate=kDefaultBaudRate);
dreamselec 6:98fe30430194 44 int readSwitches();
dreamselec 6:98fe30430194 45 void printPCDetectedText();
dreamselec 6:98fe30430194 46 bool displayAboardDialog();
dreamselec 6:98fe30430194 47 void Rx_interrupt();
dreamselec 6:98fe30430194 48
dreamselec 6:98fe30430194 49
dreamselec 6:98fe30430194 50 int main()
dreamselec 6:98fe30430194 51 {
dreamselec 6:98fe30430194 52 initInternal();
dreamselec 6:98fe30430194 53 initPort();
dreamselec 6:98fe30430194 54 srand((unsigned)time(NULL));
dreamselec 6:98fe30430194 55 U_LEDS_OFF();
dreamselec 6:98fe30430194 56 lcd->cls();
dreamselec 6:98fe30430194 57 myLED1 = 1;
dreamselec 6:98fe30430194 58
dreamselec 6:98fe30430194 59 // Create a serial intereput for RxIrq so when PC is connected it sends '$' to tell MBED it's there.
dreamselec 6:98fe30430194 60 // https://developer.mbed.org/cookbook/Serial-Interrupts
dreamselec 6:98fe30430194 61 pc.attach(&Rx_interrupt, Serial::RxIrq);
dreamselec 6:98fe30430194 62
dreamselec 6:98fe30430194 63 for (;;) {
dreamselec 6:98fe30430194 64 i2cport->write_bit(1, 12);
dreamselec 6:98fe30430194 65 lcd->printf("1: Start sorting.");
dreamselec 6:98fe30430194 66 LCDSL();
dreamselec 6:98fe30430194 67 i2cport->write_bit(1,13);
dreamselec 6:98fe30430194 68 lcd->printf("2: Connect to PC");
dreamselec 6:98fe30430194 69
dreamselec 6:98fe30430194 70 int selection = 0;
dreamselec 6:98fe30430194 71 do {
dreamselec 6:98fe30430194 72 selection = readSwitches();
dreamselec 6:98fe30430194 73 } while (selection == 1 || selection == 2);
dreamselec 6:98fe30430194 74
dreamselec 6:98fe30430194 75 if (selection == 1) {
dreamselec 6:98fe30430194 76 // User selected op 1: Start sorting autonomously.
dreamselec 6:98fe30430194 77 i2cport->write_bit(0, 13);
dreamselec 6:98fe30430194 78 lcd->cls();
dreamselec 6:98fe30430194 79 LCDFL();
dreamselec 6:98fe30430194 80 lcd->printf("Starting sorting operation");
dreamselec 6:98fe30430194 81 wait(1);
dreamselec 6:98fe30430194 82
dreamselec 6:98fe30430194 83 for(;;) {
dreamselec 6:98fe30430194 84 lcd->cls();
dreamselec 6:98fe30430194 85 lcd->printf("Waiting for block");
dreamselec 6:98fe30430194 86 i2cport->write_bit(1, 15);
dreamselec 6:98fe30430194 87 bool aboardOperation = false;
dreamselec 6:98fe30430194 88
dreamselec 6:98fe30430194 89 int blockInserted = 0;
dreamselec 6:98fe30430194 90 // Wait until a block is breaking the beam, or button 4 is pressed to aboard.
dreamselec 6:98fe30430194 91 do {
dreamselec 6:98fe30430194 92 blockInserted = fpga->checkForBlock();
dreamselec 6:98fe30430194 93 if (i2cport->read_bit(11)) {
dreamselec 6:98fe30430194 94 aboardOperation = displayAboardDialog();
dreamselec 6:98fe30430194 95 // Cancel the aboard
dreamselec 6:98fe30430194 96 if (aboardOperation == false) {
dreamselec 6:98fe30430194 97 lcd->cls();
dreamselec 6:98fe30430194 98 LCDFL();
dreamselec 6:98fe30430194 99 lcd->printf("Waiting for block");
dreamselec 6:98fe30430194 100 }
dreamselec 6:98fe30430194 101 }
dreamselec 6:98fe30430194 102 } while (aboardOperation == false && blockInserted != 1);
dreamselec 6:98fe30430194 103
dreamselec 6:98fe30430194 104 // Break and return to main menu i.e. Start Op, or Connect to PC.
dreamselec 6:98fe30430194 105 if (aboardOperation == true) {
dreamselec 6:98fe30430194 106 break;
dreamselec 6:98fe30430194 107 }
dreamselec 8:e1da2ae62885 108
dreamselec 6:98fe30430194 109 // Cannot aboard any longer. Block is inserted.
dreamselec 8:e1da2ae62885 110 // Detach rx interrupt until block processed.
dreamselec 8:e1da2ae62885 111 NVIC_DisableIRQ(UART1_IRQn);
dreamselec 8:e1da2ae62885 112
dreamselec 6:98fe30430194 113 int blockSize = fpga->checkForSize();
dreamselec 6:98fe30430194 114
dreamselec 6:98fe30430194 115 if (blockSize == HazBlock->size) {
dreamselec 6:98fe30430194 116 // detectColour()
dreamselec 6:98fe30430194 117 lcd->cls();
dreamselec 6:98fe30430194 118 lcd->printf("Detecting Colour");
dreamselec 6:98fe30430194 119 }
dreamselec 8:e1da2ae62885 120
dreamselec 8:e1da2ae62885 121 // Re-Attach rx interrupt
dreamselec 8:e1da2ae62885 122 NVIC_EnableIRQ(UART1_IRQn);
dreamselec 6:98fe30430194 123 }
dreamselec 6:98fe30430194 124
dreamselec 6:98fe30430194 125 } else if (selection == 2) {
dreamselec 8:e1da2ae62885 126 for (;;){
dreamselec 8:e1da2ae62885 127 // Wait for PC to send '!<pc>connect;' command.
dreamselec 6:98fe30430194 128 lcd->cls();
dreamselec 6:98fe30430194 129 LCDFL();
dreamselec 8:e1da2ae62885 130 lcd->printf("Waiting for PC...");
dreamselec 6:98fe30430194 131 LCDSL();
dreamselec 8:e1da2ae62885 132 lcd->printf("4: Main Menu");
dreamselec 6:98fe30430194 133
dreamselec 8:e1da2ae62885 134 int aboardOperation = false;
dreamselec 8:e1da2ae62885 135 while (connectedToPC == false && aboardOperation == false){
dreamselec 8:e1da2ae62885 136 aboardOperation = readSwitches() == 4;
dreamselec 8:e1da2ae62885 137 }
dreamselec 8:e1da2ae62885 138 if (aboardOperation == true) { break; }
dreamselec 8:e1da2ae62885 139 else if (connectedToPC == true){
dreamselec 8:e1da2ae62885 140 lcd->cls();
dreamselec 8:e1da2ae62885 141 LCDFL();
dreamselec 8:e1da2ae62885 142 lcd->printf("Connected to PC");
dreamselec 8:e1da2ae62885 143 LCDSL();
dreamselec 8:e1da2ae62885 144 lcd->printf("4: Disconnect.");
dreamselec 8:e1da2ae62885 145 }
dreamselec 8:e1da2ae62885 146
dreamselec 8:e1da2ae62885 147 while (aboardOperation == false && connectedToPC == true){
dreamselec 8:e1da2ae62885 148 aboardOperation = readSwitches() == 4;
dreamselec 8:e1da2ae62885 149 }
dreamselec 8:e1da2ae62885 150 if (aboardOperation == true ) { break; }
dreamselec 6:98fe30430194 151 }
dreamselec 6:98fe30430194 152 }
dreamselec 6:98fe30430194 153
dreamselec 6:98fe30430194 154 }
dreamselec 6:98fe30430194 155 }
dreamselec 6:98fe30430194 156
dreamselec 6:98fe30430194 157 /// Called every-time it receives an char from PC.
dreamselec 6:98fe30430194 158 void Rx_interrupt(){
dreamselec 8:e1da2ae62885 159 char interruptChar = pc.getc();
dreamselec 6:98fe30430194 160
dreamselec 8:e1da2ae62885 161 NVIC_DisableIRQ(UART1_IRQn);
dreamselec 8:e1da2ae62885 162
dreamselec 8:e1da2ae62885 163 if (interruptChar == CommandTypeValue[Query]){
dreamselec 8:e1da2ae62885 164 commander->decodeCommand(Query);
dreamselec 8:e1da2ae62885 165 }else if (interruptChar == CommandTypeValue[Set]){
dreamselec 8:e1da2ae62885 166 commander->decodeCommand(Set);
dreamselec 8:e1da2ae62885 167 }else if (interruptChar== CommandTypeValue[Reply]){
dreamselec 8:e1da2ae62885 168 commander->decodeCommand(Reply);
dreamselec 8:e1da2ae62885 169 }
dreamselec 8:e1da2ae62885 170
dreamselec 8:e1da2ae62885 171 NVIC_EnableIRQ(UART1_IRQn);
dreamselec 6:98fe30430194 172 }
dreamselec 3:843b830ee8bd 173
dreamselec 4:4eebb4de22a7 174 void initInternal()
dreamselec 4:4eebb4de22a7 175 {
dreamselec 6:98fe30430194 176 i2cport = new MCP23017(p9, p10, 0x40);
dreamselec 6:98fe30430194 177 lcd = new WattBob_TextLCD(i2cport);
dreamselec 6:98fe30430194 178 myLED1 = 1;
dreamselec 6:98fe30430194 179 BACKLIGHT_ON(i2cport);
dreamselec 6:98fe30430194 180 lcd->cls();
dreamselec 6:98fe30430194 181 LCDFL();
dreamselec 6:98fe30430194 182 lcd->printf("Initilizing...");
dreamselec 6:98fe30430194 183 myLED2 = 1;
dreamselec 6:98fe30430194 184 return;
dreamselec 3:843b830ee8bd 185 }
dreamselec 3:843b830ee8bd 186
dreamselec 7:b6e31bfdb2af 187 void initPort(int baudRate)
dreamselec 4:4eebb4de22a7 188 {
dreamselec 6:98fe30430194 189 myLED3 = 1;
dreamselec 6:98fe30430194 190 pc.baud(baudRate);
dreamselec 6:98fe30430194 191 pc.format(8, SerialBase::None, gStopBits);
dreamselec 6:98fe30430194 192 myLED4 = 1;
dreamselec 6:98fe30430194 193 wait (0.1);
dreamselec 6:98fe30430194 194 return;
dreamselec 3:843b830ee8bd 195 }
dreamselec 3:843b830ee8bd 196
dreamselec 4:4eebb4de22a7 197 int readSwitches()
dreamselec 4:4eebb4de22a7 198 {
dreamselec 6:98fe30430194 199
dreamselec 6:98fe30430194 200 if(i2cport->read_bit(8)) {
dreamselec 6:98fe30430194 201 return 1;
dreamselec 6:98fe30430194 202 } else if (i2cport->read_bit(9)) {
dreamselec 6:98fe30430194 203 return 2;
dreamselec 6:98fe30430194 204 } else if (i2cport->read_bit(10)) {
dreamselec 6:98fe30430194 205 return 3;
dreamselec 6:98fe30430194 206 } else if (i2cport->read_bit(11)) {
dreamselec 6:98fe30430194 207 return 4;
dreamselec 6:98fe30430194 208 } else {
dreamselec 6:98fe30430194 209 return 0;
dreamselec 6:98fe30430194 210 }
dreamselec 6:98fe30430194 211
dreamselec 3:843b830ee8bd 212 }
dreamselec 3:843b830ee8bd 213
dreamselec 6:98fe30430194 214 void printPCDetectedText()
dreamselec 4:4eebb4de22a7 215 {
dreamselec 6:98fe30430194 216 lcd->cls();
dreamselec 6:98fe30430194 217 LCDFL();
dreamselec 6:98fe30430194 218 lcd->printf("Detected PC.");
dreamselec 6:98fe30430194 219 LCDSL();
dreamselec 6:98fe30430194 220 lcd->printf("Connecting");
dreamselec 6:98fe30430194 221 initPort();
dreamselec 3:843b830ee8bd 222 }
dreamselec 3:843b830ee8bd 223
dreamselec 4:4eebb4de22a7 224 bool displayAboardDialog()
dreamselec 4:4eebb4de22a7 225 {
dreamselec 6:98fe30430194 226 lcd->cls();
dreamselec 6:98fe30430194 227 LCDFL();
dreamselec 6:98fe30430194 228 lcd->printf("Aboard operation?");
dreamselec 6:98fe30430194 229 LCDSL();
dreamselec 6:98fe30430194 230 lcd->printf("1: YES, 2,3,4: NO");
dreamselec 6:98fe30430194 231 int reply = readSwitches();
dreamselec 6:98fe30430194 232 if (reply == 1) {
dreamselec 6:98fe30430194 233 return true;
dreamselec 6:98fe30430194 234 } else {
dreamselec 6:98fe30430194 235 return false;
dreamselec 6:98fe30430194 236 }
dreamselec 2:7a55cb10259f 237 }