The MBED firmware used on the Chipin sorter, developed over 12 weeks for a 3rd year university systems project. Chipin is a token sorter, it sorts tokens by colours and dispenses them to order through an online booking system and card reader. This program interfaces with an FPGA, PC and LCD screen to control the sorter. The sorter has an operation mode where it can process orders when a card is entered into the machine. There is also a maintenance mode where the device responds to maintenance instructions such as 'dispense all'. More information at http://www.ionsystems.uk/

Dependencies:   MCP23017 TCS3472_I2C WattBob_TextLCD mbed-rtos mbed

Committer:
IonSystems
Date:
Fri Dec 05 09:53:04 2014 +0000
Revision:
28:bdf2bf56f97b
Parent:
27:47a7bc902587
Commened main

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IonSystems 12:814a8fdbb6f7 1 bool operationMode = true; //the MBED starts in operation mode.
IonSystems 23:f9e7e64784be 2
IonSystems 0:8d54ffcf256e 3 #include "mbed.h"
IonSystems 23:f9e7e64784be 4 Serial pc(USBTX, USBRX);
IonSystems 24:8868101d01d0 5 Serial glcd(p13, p14);
IonSystems 23:f9e7e64784be 6 #include "rtos.h"
IonSystems 15:0c5f20e15b6a 7 #include "Language.h"
IonSystems 15:0c5f20e15b6a 8 DigitalIn languageButton(p30);
IonSystems 15:0c5f20e15b6a 9 Language currentLanguage = ENGLISH;
IonSystems 6:e64796f1f384 10 #include <sstream>
IonSystems 12:814a8fdbb6f7 11 #include <string>
IonSystems 6:e64796f1f384 12 #include "mbedStorage.h"
IonSystems 6:e64796f1f384 13 #include "mbedLCD.h"
IonSystems 7:6ba00694f9cd 14 #include "stateMachine.h"
IonSystems 8:b7771391adc9 15 #include "FPGAcomms.h"
IonSystems 10:8c0696b99692 16 #ifndef serialComm
IonSystems 10:8c0696b99692 17 #define serialComm
IonSystems 10:8c0696b99692 18 #include "serialCommunication.h"
IonSystems 10:8c0696b99692 19 #endif
IonSystems 23:f9e7e64784be 20
IonSystems 23:f9e7e64784be 21
IonSystems 23:f9e7e64784be 22 DigitalOut led1(LED1);
IonSystems 23:f9e7e64784be 23 DigitalOut led2(LED2);
IonSystems 23:f9e7e64784be 24 DigitalOut led3(LED3);
IonSystems 23:f9e7e64784be 25 DigitalOut led4(LED4);
IonSystems 5:644bca33c1ca 26
IonSystems 7:6ba00694f9cd 27 StateMachine stateMachine;
IonSystems 7:6ba00694f9cd 28
IonSystems 6:e64796f1f384 29 //Boolean values to easily enable and disable certain features for individual testing
IonSystems 6:e64796f1f384 30 bool colourSensor = true;
IonSystems 6:e64796f1f384 31 bool cardReader = true;
IonSystems 6:e64796f1f384 32 bool sorter = true;
IonSystems 6:e64796f1f384 33 bool dispensor = true;
IonSystems 10:8c0696b99692 34 bool testFunctions = true;
IonSystems 10:8c0696b99692 35 bool serialComms = true;
IonSystems 6:e64796f1f384 36
IonSystems 28:bdf2bf56f97b 37 int mode = 0; //mode select
IonSystems 18:12e2c82a5a6c 38 int maintenanceModeSelect = 0;
IonSystems 12:814a8fdbb6f7 39
IonSystems 28:bdf2bf56f97b 40 //Call to check if an MBED button is pressed
IonSystems 23:f9e7e64784be 41 bool buttonPressed(int buttonNumber)
IonSystems 23:f9e7e64784be 42 {
IonSystems 23:f9e7e64784be 43 if(buttonNumber > -1 && buttonNumber < 4) {
IonSystems 18:12e2c82a5a6c 44 return par_port->read_bit(buttonNumber + 8);
IonSystems 18:12e2c82a5a6c 45 }
IonSystems 18:12e2c82a5a6c 46 return false;
IonSystems 18:12e2c82a5a6c 47 }
IonSystems 28:bdf2bf56f97b 48 //Run a mode, defined by 'mode'.
IonSystems 23:f9e7e64784be 49 void checkSortDispenseButtons()
IonSystems 23:f9e7e64784be 50 {
IonSystems 23:f9e7e64784be 51
IonSystems 23:f9e7e64784be 52 if(buttonPressed(3)) {
IonSystems 24:8868101d01d0 53 mode = !mode;
IonSystems 23:f9e7e64784be 54 }
IonSystems 27:47a7bc902587 55 /* NOTICE: Enable the modes below for more maintenace functions, good for debugging.
IonSystems 27:47a7bc902587 56 */
IonSystems 27:47a7bc902587 57
IonSystems 23:f9e7e64784be 58
IonSystems 23:f9e7e64784be 59 /*
IonSystems 23:f9e7e64784be 60 if(mode == 0) { //Dispense Mode
IonSystems 11:06f6e82b40a8 61 printLCD("Dispense Mode");
IonSystems 22:8f11d1c178ab 62 operationMode=false;
IonSystems 23:f9e7e64784be 63 if(buttonPressed(0)) {
IonSystems 19:78d4b78fa736 64 printLCD("Red Button pressed");
IonSystems 18:12e2c82a5a6c 65 dispense(RED);
IonSystems 23:f9e7e64784be 66 } else if(buttonPressed(1)) {
IonSystems 19:78d4b78fa736 67 printLCD("Green Button pressed");
IonSystems 18:12e2c82a5a6c 68 dispense(GREEN);
IonSystems 23:f9e7e64784be 69 } else if(buttonPressed(2)) {
IonSystems 19:78d4b78fa736 70 printLCD("Blue Button pressed");
IonSystems 18:12e2c82a5a6c 71 dispense(BLUE);
IonSystems 10:8c0696b99692 72 }
IonSystems 23:f9e7e64784be 73
IonSystems 23:f9e7e64784be 74 } *//*else if(mode == 1) { //Sort Mode
IonSystems 24:8868101d01d0 75 printLCD("Sort Mode");
IonSystems 24:8868101d01d0 76 operationMode=false;
IonSystems 24:8868101d01d0 77 if(buttonPressed(0)) {
IonSystems 24:8868101d01d0 78 log("Red Button pressed");
IonSystems 24:8868101d01d0 79 sort(RED);
IonSystems 24:8868101d01d0 80 } else if(buttonPressed(1)) {
IonSystems 24:8868101d01d0 81 log("Green Button pressed");
IonSystems 24:8868101d01d0 82 sort(GREEN);
IonSystems 24:8868101d01d0 83 } else if(buttonPressed(2)) {
IonSystems 24:8868101d01d0 84 log("Blue Button pressed");
IonSystems 24:8868101d01d0 85 sort(BLUE);
IonSystems 24:8868101d01d0 86 }
IonSystems 23:f9e7e64784be 87
IonSystems 24:8868101d01d0 88 }*//* else if(mode == 2) { //Bin/Recycle Mode
IonSystems 24:8868101d01d0 89 printLCD("Bin/Recycle Mode");
IonSystems 24:8868101d01d0 90 operationMode=false;
IonSystems 24:8868101d01d0 91 if(buttonPressed(0)) {
IonSystems 24:8868101d01d0 92 log("Bin button pressed");
IonSystems 24:8868101d01d0 93 sort(BIN);
IonSystems 24:8868101d01d0 94 } else if(buttonPressed(1)) {
IonSystems 24:8868101d01d0 95 log("Recycle Button");
IonSystems 24:8868101d01d0 96 recycle();
IonSystems 24:8868101d01d0 97 }
IonSystems 24:8868101d01d0 98 } */
IonSystems 23:f9e7e64784be 99 /*else if(mode == 4) { //Card Reader Mode
IonSystems 23:f9e7e64784be 100 operationMode= true;
IonSystems 23:f9e7e64784be 101 if(cardReader && cardDetect) {
IonSystems 23:f9e7e64784be 102 cardAcquisition();
IonSystems 23:f9e7e64784be 103
IonSystems 23:f9e7e64784be 104 }*/
IonSystems 24:8868101d01d0 105 if(mode == 0) { //Storage Mode
IonSystems 23:f9e7e64784be 106 operationMode=true;
IonSystems 23:f9e7e64784be 107 stringstream ss;
IonSystems 24:8868101d01d0 108 ss << "Operation: " << "R:" << redAmount << "G:" << greenAmount << "B:" << blueAmount << "RE:" << recycleAmount;
IonSystems 23:f9e7e64784be 109 string tmp = ss.str();
IonSystems 23:f9e7e64784be 110 printLCD(tmp.c_str());
IonSystems 23:f9e7e64784be 111 wait(0.1);
IonSystems 23:f9e7e64784be 112 if(buttonPressed(0)) {
IonSystems 24:8868101d01d0 113 //log("Dispense all button pressed");
IonSystems 23:f9e7e64784be 114 dispenseAll();
IonSystems 23:f9e7e64784be 115 } else if(buttonPressed(1)) {
IonSystems 24:8868101d01d0 116 //log("Clear stored numbers button pressed");
IonSystems 23:f9e7e64784be 117 writeFile(0,0,0,recycleAmount);
IonSystems 23:f9e7e64784be 118 redAmount = 0;
IonSystems 23:f9e7e64784be 119 greenAmount = 0;
IonSystems 23:f9e7e64784be 120 blueAmount = 0;
IonSystems 23:f9e7e64784be 121 printLCD("Cleared values");
IonSystems 23:f9e7e64784be 122
IonSystems 23:f9e7e64784be 123 } else if(buttonPressed(2)) {
IonSystems 24:8868101d01d0 124 //log("Increment all stored values by 2.");
IonSystems 23:f9e7e64784be 125 redAmount += 2;
IonSystems 23:f9e7e64784be 126 greenAmount += 2;
IonSystems 23:f9e7e64784be 127 blueAmount += 2;
IonSystems 23:f9e7e64784be 128 writeFile(redAmount,greenAmount,blueAmount,recycleAmount);
IonSystems 23:f9e7e64784be 129
IonSystems 23:f9e7e64784be 130 printLCD("set values to 2");
IonSystems 23:f9e7e64784be 131
IonSystems 23:f9e7e64784be 132 }
IonSystems 24:8868101d01d0 133 } else if(mode == 1) {
IonSystems 22:8f11d1c178ab 134 operationMode = false;
IonSystems 18:12e2c82a5a6c 135 stringstream ss;
IonSystems 18:12e2c82a5a6c 136 ss << maintenanceModeSelect;
IonSystems 18:12e2c82a5a6c 137 string mainModeSelect = ss.str();
IonSystems 23:f9e7e64784be 138 printLCD("Maintenance: " + mainModeSelect);
IonSystems 17:6a0bb0ad5bb4 139 wait(0.1); //Maintenance Mode
IonSystems 28:bdf2bf56f97b 140
IonSystems 23:f9e7e64784be 141 if(buttonPressed(0)) { //Next maintenance function
IonSystems 18:12e2c82a5a6c 142 maintenanceModeSelect++;
IonSystems 23:f9e7e64784be 143 if(maintenanceModeSelect > 13) maintenanceModeSelect = 0;
IonSystems 23:f9e7e64784be 144 } else if(buttonPressed(1)) { //Previous maintenance function
IonSystems 18:12e2c82a5a6c 145 maintenanceModeSelect--;
IonSystems 23:f9e7e64784be 146 if(maintenanceModeSelect < 0) maintenanceModeSelect = 13;
IonSystems 23:f9e7e64784be 147 } else if(buttonPressed(2)) { //Process Instruction
IonSystems 23:f9e7e64784be 148 switch(maintenanceModeSelect) {
IonSystems 23:f9e7e64784be 149 case 0://RB_LEFT:
IonSystems 23:f9e7e64784be 150 printLCD("Moving Red/Blue Slider left.");
IonSystems 23:f9e7e64784be 151 maintain(RB_LEFT);
IonSystems 13:0661d658d9d1 152 break;
IonSystems 23:f9e7e64784be 153
IonSystems 23:f9e7e64784be 154 case 1://RB_CENTRE:
IonSystems 23:f9e7e64784be 155 printLCD("Centering Red/Blue Slider.");
IonSystems 23:f9e7e64784be 156 maintain(RB_CENTRE);
IonSystems 13:0661d658d9d1 157 break;
IonSystems 23:f9e7e64784be 158
IonSystems 23:f9e7e64784be 159 case 2://RB_RIGHT:
IonSystems 23:f9e7e64784be 160 printLCD("Moving Red/Blue Slider right.");
IonSystems 23:f9e7e64784be 161 maintain(RB_RIGHT);
IonSystems 13:0661d658d9d1 162 break;
IonSystems 23:f9e7e64784be 163
IonSystems 23:f9e7e64784be 164 case 3://GO_UP:
IonSystems 23:f9e7e64784be 165 printLCD("Moving Green Slider up.");
IonSystems 23:f9e7e64784be 166 maintain(GO_UP);
IonSystems 13:0661d658d9d1 167 break;
IonSystems 23:f9e7e64784be 168
IonSystems 23:f9e7e64784be 169 case 4://GO_CENTRE:
IonSystems 23:f9e7e64784be 170 printLCD("Centering Green Slider.");
IonSystems 23:f9e7e64784be 171 maintain(GO_CENTRE);
IonSystems 13:0661d658d9d1 172 break;
IonSystems 23:f9e7e64784be 173
IonSystems 23:f9e7e64784be 174 case 5://GO_DOWN:
IonSystems 23:f9e7e64784be 175 printLCD("Moving Green Slider down.");
IonSystems 23:f9e7e64784be 176 maintain(GO_DOWN);
IonSystems 13:0661d658d9d1 177 break;
IonSystems 23:f9e7e64784be 178
IonSystems 23:f9e7e64784be 179 case 6://BR_LEFT:
IonSystems 23:f9e7e64784be 180 printLCD("Moving Bin Slider left.");
IonSystems 23:f9e7e64784be 181 maintain(BR_LEFT);
IonSystems 13:0661d658d9d1 182 break;
IonSystems 23:f9e7e64784be 183
IonSystems 23:f9e7e64784be 184 case 7://BR_RIGHT:
IonSystems 23:f9e7e64784be 185 printLCD("Moving Bin Slider right.");
IonSystems 23:f9e7e64784be 186 maintain(BR_RIGHT);
IonSystems 13:0661d658d9d1 187 break;
IonSystems 23:f9e7e64784be 188
IonSystems 23:f9e7e64784be 189 case 8://R_PUSH:
IonSystems 23:f9e7e64784be 190 printLCD("Pushing red dispensor");
IonSystems 23:f9e7e64784be 191 maintain(R_PUSH);
IonSystems 13:0661d658d9d1 192 break;
IonSystems 23:f9e7e64784be 193
IonSystems 23:f9e7e64784be 194 case 9://R_HOME:
IonSystems 23:f9e7e64784be 195 printLCD("Homing red dispensor");
IonSystems 23:f9e7e64784be 196 maintain(R_HOME);
IonSystems 13:0661d658d9d1 197 break;
IonSystems 23:f9e7e64784be 198
IonSystems 23:f9e7e64784be 199 case 10://GB_LEFT:
IonSystems 23:f9e7e64784be 200 printLCD("Pushing green dispensor");
IonSystems 23:f9e7e64784be 201 maintain(GB_LEFT);
IonSystems 13:0661d658d9d1 202 break;
IonSystems 23:f9e7e64784be 203
IonSystems 23:f9e7e64784be 204 case 11://GB_CENTRE:
IonSystems 23:f9e7e64784be 205 printLCD("Centre green/blue dispensor");
IonSystems 23:f9e7e64784be 206 maintain(GB_CENTRE);
IonSystems 13:0661d658d9d1 207 break;
IonSystems 23:f9e7e64784be 208
IonSystems 23:f9e7e64784be 209 case 12://GB_RIGHT:
IonSystems 23:f9e7e64784be 210 printLCD("Pushing blue dispensor");
IonSystems 23:f9e7e64784be 211 maintain(GB_RIGHT );
IonSystems 13:0661d658d9d1 212 break;
IonSystems 23:f9e7e64784be 213
IonSystems 23:f9e7e64784be 214 case 13: //MaintenanceEND
IonSystems 23:f9e7e64784be 215 printLCD("Ending Maintenance Mode");
IonSystems 23:f9e7e64784be 216 maintain(maintenanceEND);
IonSystems 22:8f11d1c178ab 217 break;
IonSystems 12:814a8fdbb6f7 218 }
IonSystems 23:f9e7e64784be 219 printLCD("Ready for next command");
IonSystems 23:f9e7e64784be 220 wait(1);
IonSystems 9:8d78eb55ad5e 221 }
IonSystems 23:f9e7e64784be 222 }
IonSystems 23:f9e7e64784be 223 }
IonSystems 27:47a7bc902587 224 //Coordinate changing language on PC and Arduino.
IonSystems 23:f9e7e64784be 225 void changeLanguage()
IonSystems 23:f9e7e64784be 226 {
IonSystems 17:6a0bb0ad5bb4 227 currentLanguage = nextLanguage(currentLanguage); //Change the language on teh MBED.
IonSystems 27:47a7bc902587 228 sendLanguageCharacter(); //Tell PC & Arduino to change language.
IonSystems 17:6a0bb0ad5bb4 229 wait(1);
IonSystems 23:f9e7e64784be 230 }
IonSystems 23:f9e7e64784be 231
IonSystems 27:47a7bc902587 232 /* void sortFunction()
IonSystems 27:47a7bc902587 233 * Read sensor and sort according to the colour.
IonSystems 27:47a7bc902587 234 */
IonSystems 23:f9e7e64784be 235 void sortFunction()
IonSystems 23:f9e7e64784be 236 {
IonSystems 27:47a7bc902587 237 //Read the colour twice and make sure both are the same. If not then return and try again.
IonSystems 24:8868101d01d0 238 Thread::wait(100);
IonSystems 24:8868101d01d0 239 Colour colour = readColourSensor();
IonSystems 24:8868101d01d0 240 Thread::wait(100);
IonSystems 23:f9e7e64784be 241 Colour colour2 = readColourSensor();
IonSystems 23:f9e7e64784be 242 if(colour != colour2) {
IonSystems 23:f9e7e64784be 243 return;
IonSystems 23:f9e7e64784be 244 }
IonSystems 27:47a7bc902587 245 //Ensure a bin read is valid by ensuring it is the same as earlier. Prevents a bin read being valid if the chip is out of place on the sensor.
IonSystems 24:8868101d01d0 246 if(colour == BIN) {
IonSystems 24:8868101d01d0 247 Thread::wait(100);
IonSystems 23:f9e7e64784be 248 Colour binCheck = readColourSensor();
IonSystems 23:f9e7e64784be 249 if(binCheck != colour) {
IonSystems 23:f9e7e64784be 250 return;
IonSystems 23:f9e7e64784be 251 }
IonSystems 23:f9e7e64784be 252 }
IonSystems 23:f9e7e64784be 253
IonSystems 24:8868101d01d0 254 //log("Sorting colour");
IonSystems 24:8868101d01d0 255 sort(colour);
IonSystems 23:f9e7e64784be 256 }
IonSystems 23:f9e7e64784be 257
IonSystems 28:bdf2bf56f97b 258 //Run sortFunction with a small delay between iterations, pulses LED.
IonSystems 23:f9e7e64784be 259 void sortMode(void const* args)
IonSystems 23:f9e7e64784be 260 {
IonSystems 24:8868101d01d0 261 while(colourSensor && sorter) {
IonSystems 24:8868101d01d0 262 if(operationMode) {
IonSystems 23:f9e7e64784be 263 led2 = 1;
IonSystems 23:f9e7e64784be 264 sortFunction();
IonSystems 23:f9e7e64784be 265 led2 = 0;
IonSystems 23:f9e7e64784be 266 Thread::wait(50);
IonSystems 23:f9e7e64784be 267 }
IonSystems 23:f9e7e64784be 268 }
IonSystems 23:f9e7e64784be 269 }
IonSystems 28:bdf2bf56f97b 270
IonSystems 28:bdf2bf56f97b 271 bool pcReady = false; //Defines whether the PC is ready to accept characters on the COM port.
IonSystems 28:bdf2bf56f97b 272 //handles dispensing from a card, changing language
IonSystems 23:f9e7e64784be 273 void dispenseFunction()
IonSystems 23:f9e7e64784be 274 {
IonSystems 23:f9e7e64784be 275 if(!pcReady) {
IonSystems 23:f9e7e64784be 276 if(pc.getc() == '*') {
IonSystems 23:f9e7e64784be 277 pcReady = true;
IonSystems 23:f9e7e64784be 278 }
IonSystems 23:f9e7e64784be 279 } else {
IonSystems 24:8868101d01d0 280 //Check language button
IonSystems 24:8868101d01d0 281 if(languageButton) {
IonSystems 24:8868101d01d0 282 changeLanguage();
IonSystems 24:8868101d01d0 283 }
IonSystems 23:f9e7e64784be 284 if(cardReader && cardDetect) {
IonSystems 23:f9e7e64784be 285 //Read card
IonSystems 23:f9e7e64784be 286 int cardNumber = cardAcquisition();
IonSystems 23:f9e7e64784be 287
IonSystems 23:f9e7e64784be 288 //Send message to pc
IonSystems 23:f9e7e64784be 289 pc.putc('*');
IonSystems 23:f9e7e64784be 290 wait(0.5);
IonSystems 24:8868101d01d0 291
IonSystems 24:8868101d01d0 292 //Send card number to pc
IonSystems 23:f9e7e64784be 293 pc.printf("%i\n",cardNumber);
IonSystems 24:8868101d01d0 294
IonSystems 23:f9e7e64784be 295 int red = 0;
IonSystems 23:f9e7e64784be 296 int green = 0;
IonSystems 23:f9e7e64784be 297 int blue = 0;
IonSystems 24:8868101d01d0 298
IonSystems 28:bdf2bf56f97b 299 //Get order from pc, convert characters to integers.
IonSystems 23:f9e7e64784be 300 red = (int) pc.getc() - '0';
IonSystems 23:f9e7e64784be 301 green = (int) pc.getc() - '0';
IonSystems 23:f9e7e64784be 302 blue = (int) pc.getc() - '0';
IonSystems 24:8868101d01d0 303
IonSystems 24:8868101d01d0 304 //Check if there are enough chips to dispense order
IonSystems 24:8868101d01d0 305 Thread::wait(100);
IonSystems 24:8868101d01d0 306 if(red > redAmount || green > greenAmount || blue > blueAmount) {
IonSystems 24:8868101d01d0 307 //If not then do not dispense
IonSystems 24:8868101d01d0 308 pc.putc('<');
IonSystems 24:8868101d01d0 309 pcReady = false;
IonSystems 27:47a7bc902587 310 } else if(red ==0 && green == 0 && blue ==0) {
IonSystems 24:8868101d01d0 311 pc.putc('@');
IonSystems 24:8868101d01d0 312 pcReady = false;
IonSystems 27:47a7bc902587 313 } else {
IonSystems 24:8868101d01d0 314 //Otherwise there are enough tokens so dispense the order
IonSystems 24:8868101d01d0 315 pc.putc('>');
IonSystems 24:8868101d01d0 316
IonSystems 24:8868101d01d0 317 //Display order on LCD
IonSystems 24:8868101d01d0 318 glcd.putc(27);
IonSystems 24:8868101d01d0 319 glcd.putc(18);
IonSystems 28:bdf2bf56f97b 320 glcd.putc(red + '0'); //Convert int to char
IonSystems 28:bdf2bf56f97b 321 glcd.putc(green + '0');//Convert int to char
IonSystems 28:bdf2bf56f97b 322 glcd.putc(blue + '0');//Convert int to char
IonSystems 24:8868101d01d0 323 glcd.putc(255);
IonSystems 24:8868101d01d0 324
IonSystems 24:8868101d01d0 325 //Dispense Order
IonSystems 24:8868101d01d0 326 dispenseOrder(red,green,blue);
IonSystems 24:8868101d01d0 327
IonSystems 24:8868101d01d0 328 //Display finished dispensing on lcd
IonSystems 24:8868101d01d0 329 glcd.putc(27);
IonSystems 24:8868101d01d0 330 glcd.putc(19);
IonSystems 24:8868101d01d0 331 glcd.putc(255);
IonSystems 24:8868101d01d0 332
IonSystems 24:8868101d01d0 333 //Reset pc ready
IonSystems 24:8868101d01d0 334 pcReady = false;
IonSystems 24:8868101d01d0 335 wait(1);
IonSystems 24:8868101d01d0 336 pc.putc('(');
IonSystems 24:8868101d01d0 337 }
IonSystems 24:8868101d01d0 338
IonSystems 23:f9e7e64784be 339 }
IonSystems 23:f9e7e64784be 340 }
IonSystems 23:f9e7e64784be 341 }
IonSystems 28:bdf2bf56f97b 342 //Runs dispenseFunction with a small delay between iterations, pulses LED.
IonSystems 23:f9e7e64784be 343 void dispenseMode(void const* args)
IonSystems 23:f9e7e64784be 344 {
IonSystems 24:8868101d01d0 345
IonSystems 24:8868101d01d0 346 while(true) {
IonSystems 24:8868101d01d0 347 if(operationMode) {
IonSystems 23:f9e7e64784be 348 led3 = 1;
IonSystems 23:f9e7e64784be 349 dispenseFunction();
IonSystems 23:f9e7e64784be 350 led3 =0;
IonSystems 24:8868101d01d0 351 Thread::wait(50);
IonSystems 23:f9e7e64784be 352 }
IonSystems 24:8868101d01d0 353
IonSystems 23:f9e7e64784be 354 }
IonSystems 23:f9e7e64784be 355 }
IonSystems 23:f9e7e64784be 356
IonSystems 23:f9e7e64784be 357
IonSystems 23:f9e7e64784be 358 int main()
IonSystems 23:f9e7e64784be 359 {
IonSystems 23:f9e7e64784be 360 led1 = 0;
IonSystems 18:12e2c82a5a6c 361 setupLCD();
IonSystems 18:12e2c82a5a6c 362 printLCD("Welcome to the Chipin Sorter");
IonSystems 24:8868101d01d0 363 Thread::wait(1000);
IonSystems 12:814a8fdbb6f7 364 readChipNumbers();
IonSystems 12:814a8fdbb6f7 365 printStoredChipValues();
IonSystems 23:f9e7e64784be 366 printLCD("Resetting all sliders");
IonSystems 28:bdf2bf56f97b 367 maintain(maintenanceEND); //reset sliders on FPGA
IonSystems 24:8868101d01d0 368 printLCD("");
IonSystems 24:8868101d01d0 369 Thread::wait(1000);
IonSystems 28:bdf2bf56f97b 370 sendLanguageCharacter(); //Synchronise language on PC and arduino
IonSystems 23:f9e7e64784be 371
IonSystems 28:bdf2bf56f97b 372 Thread sortThread(sortMode); //Start the sorting thread.
IonSystems 28:bdf2bf56f97b 373 if(!languageButton) { //Decide whether to start in operation mode or maintenance mode.
IonSystems 27:47a7bc902587 374 operationMode = true;
IonSystems 27:47a7bc902587 375 mode = 0;
IonSystems 27:47a7bc902587 376
IonSystems 27:47a7bc902587 377 } else {
IonSystems 27:47a7bc902587 378 operationMode = false;
IonSystems 27:47a7bc902587 379 mode = 1;
IonSystems 24:8868101d01d0 380 }
IonSystems 28:bdf2bf56f97b 381 Thread dispenseThread(dispenseMode); //Start the dispensing thread.
IonSystems 23:f9e7e64784be 382 while(true) {
IonSystems 28:bdf2bf56f97b 383 led1 = 1; //pulse led1
IonSystems 23:f9e7e64784be 384 led4 = cardDetect;
IonSystems 23:f9e7e64784be 385
IonSystems 28:bdf2bf56f97b 386 if(!operationMode) { //Check for maintenance commands if in maintenance mode.
IonSystems 10:8c0696b99692 387 checkSerial();
IonSystems 23:f9e7e64784be 388 }
IonSystems 28:bdf2bf56f97b 389 if(testFunctions) checkSortDispenseButtons(); //Run the MBED modes if enabled.
IonSystems 24:8868101d01d0 390 Thread::wait(100);
IonSystems 23:f9e7e64784be 391 led1=0;
IonSystems 24:8868101d01d0 392 Thread::wait(100);
IonSystems 23:f9e7e64784be 393 }
IonSystems 10:8c0696b99692 394 }