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:
Mon Nov 24 14:00:46 2014 +0000
Revision:
17:6a0bb0ad5bb4
Parent:
16:498359d078dc
Child:
18:12e2c82a5a6c
fixed some bugs, great comment i know

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 0:8d54ffcf256e 2 #include "mbed.h"
IonSystems 15:0c5f20e15b6a 3 #include "Language.h"
IonSystems 15:0c5f20e15b6a 4 DigitalIn languageButton(p30);
IonSystems 15:0c5f20e15b6a 5 Language currentLanguage = ENGLISH;
IonSystems 6:e64796f1f384 6 #include <sstream>
IonSystems 12:814a8fdbb6f7 7 #include <string>
IonSystems 15:0c5f20e15b6a 8
IonSystems 17:6a0bb0ad5bb4 9
IonSystems 6:e64796f1f384 10 #include "mbedStorage.h"
IonSystems 6:e64796f1f384 11 #include "rgbLED.h"
IonSystems 6:e64796f1f384 12 #include "mbedLCD.h"
IonSystems 7:6ba00694f9cd 13 #include "stateMachine.h"
IonSystems 8:b7771391adc9 14 #include "FPGAcomms.h"
IonSystems 10:8c0696b99692 15 #ifndef serialComm
IonSystems 10:8c0696b99692 16 #define serialComm
IonSystems 15:0c5f20e15b6a 17
IonSystems 10:8c0696b99692 18 #include "serialCommunication.h"
IonSystems 10:8c0696b99692 19 #endif
IonSystems 10:8c0696b99692 20 #include "testFunctions.h"
IonSystems 5:644bca33c1ca 21
IonSystems 0:8d54ffcf256e 22
IonSystems 11:06f6e82b40a8 23
IonSystems 11:06f6e82b40a8 24
IonSystems 7:6ba00694f9cd 25 StateMachine stateMachine;
IonSystems 7:6ba00694f9cd 26
IonSystems 6:e64796f1f384 27 //Boolean values to easily enable and disable certain features for individual testing
IonSystems 6:e64796f1f384 28 bool colourSensor = true;
IonSystems 6:e64796f1f384 29 bool cardReader = true;
IonSystems 6:e64796f1f384 30 bool sorter = true;
IonSystems 6:e64796f1f384 31 bool dispensor = true;
IonSystems 10:8c0696b99692 32 bool testFunctions = true;
IonSystems 10:8c0696b99692 33 bool serialComms = true;
IonSystems 6:e64796f1f384 34
IonSystems 6:e64796f1f384 35 bool colourDataAcquired = false;
IonSystems 6:e64796f1f384 36 bool chipDetected = false;
IonSystems 12:814a8fdbb6f7 37
IonSystems 3:97668a4cd69d 38
IonSystems 17:6a0bb0ad5bb4 39 int mode = 3;
IonSystems 13:0661d658d9d1 40 int maintenanceModePointer = 0;
IonSystems 14:31ba3e56c788 41 Colour lastColour = NONE;
IonSystems 17:6a0bb0ad5bb4 42 Colour colourStore = NONE;
IonSystems 10:8c0696b99692 43
IonSystems 10:8c0696b99692 44 void checkSortDispenseButtons(){
IonSystems 11:06f6e82b40a8 45
IonSystems 11:06f6e82b40a8 46 if(par_port->read_bit(11)){
IonSystems 12:814a8fdbb6f7 47 mode++;
IonSystems 13:0661d658d9d1 48 if(mode >= 7) mode = 0;
IonSystems 11:06f6e82b40a8 49 }
IonSystems 11:06f6e82b40a8 50
IonSystems 11:06f6e82b40a8 51
IonSystems 13:0661d658d9d1 52 if(mode == 0){ //Dispense Mode
IonSystems 11:06f6e82b40a8 53 printLCD("Dispense Mode");
IonSystems 10:8c0696b99692 54 if(par_port->read_bit(8)){
IonSystems 10:8c0696b99692 55 log("Red Button pressed");
IonSystems 10:8c0696b99692 56 stateMachine = DISPENSE_RED;
IonSystems 10:8c0696b99692 57 processState(stateMachine);
IonSystems 10:8c0696b99692 58 }else if(par_port->read_bit(9)){
IonSystems 10:8c0696b99692 59 log("Green Button pressed");
IonSystems 10:8c0696b99692 60 stateMachine = DISPENSE_GREEN;
IonSystems 10:8c0696b99692 61 processState(stateMachine);
IonSystems 10:8c0696b99692 62 }else if(par_port->read_bit(10)){
IonSystems 10:8c0696b99692 63 log("Blue Button pressed");
IonSystems 10:8c0696b99692 64 stateMachine = DISPENSE_BLUE;
IonSystems 10:8c0696b99692 65 processState(stateMachine);
IonSystems 10:8c0696b99692 66 }
IonSystems 13:0661d658d9d1 67 }else if(mode == 1){ //Sort Mode
IonSystems 11:06f6e82b40a8 68 printLCD("Sort Mode");
IonSystems 10:8c0696b99692 69 if(par_port->read_bit(8)){
IonSystems 10:8c0696b99692 70 log("Red Button pressed");
IonSystems 10:8c0696b99692 71 stateMachine = SORT_RED;
IonSystems 10:8c0696b99692 72 processState(stateMachine);
IonSystems 10:8c0696b99692 73 }else if(par_port->read_bit(9)){
IonSystems 13:0661d658d9d1 74 log("Green Button pressed");
IonSystems 10:8c0696b99692 75 stateMachine = SORT_GREEN;
IonSystems 10:8c0696b99692 76 processState(stateMachine);
IonSystems 10:8c0696b99692 77 }else if(par_port->read_bit(10)){
IonSystems 10:8c0696b99692 78 log("Blue Button pressed");
IonSystems 10:8c0696b99692 79 stateMachine = SORT_BLUE;
IonSystems 10:8c0696b99692 80 processState(stateMachine);
IonSystems 10:8c0696b99692 81 }
IonSystems 11:06f6e82b40a8 82
IonSystems 13:0661d658d9d1 83 }else if(mode == 2){ //Bin/Recycle Mode
IonSystems 11:06f6e82b40a8 84 printLCD("Bin/Recycle Mode");
IonSystems 11:06f6e82b40a8 85 if(par_port->read_bit(8)){
IonSystems 11:06f6e82b40a8 86 log("Bin button pressed");
IonSystems 11:06f6e82b40a8 87 stateMachine = SORT_BIN;
IonSystems 11:06f6e82b40a8 88 processState(stateMachine);
IonSystems 11:06f6e82b40a8 89 }else if(par_port->read_bit(9)){
IonSystems 11:06f6e82b40a8 90 log("Recycle Button");
IonSystems 11:06f6e82b40a8 91 stateMachine = SORT_RECYCLE;
IonSystems 11:06f6e82b40a8 92 processState(stateMachine);
IonSystems 11:06f6e82b40a8 93 }
IonSystems 14:31ba3e56c788 94 }else if(mode == 3){
IonSystems 14:31ba3e56c788 95 printLCD("Colour Sensor Mode"); //Colour Sensing Mode
IonSystems 11:06f6e82b40a8 96 if(colourSensor){
IonSystems 17:6a0bb0ad5bb4 97
IonSystems 17:6a0bb0ad5bb4 98
IonSystems 17:6a0bb0ad5bb4 99 Colour colour = readColourSensor();
IonSystems 17:6a0bb0ad5bb4 100 lastColour = colourStore;
IonSystems 17:6a0bb0ad5bb4 101 colourStore = colour;
IonSystems 15:0c5f20e15b6a 102 /* Tries to prevent a colour mis-read. When a chip is read as BIN or NONE,
IonSystems 15:0c5f20e15b6a 103 the chip may be falling down the tube as the reading was taken. The chip may
IonSystems 15:0c5f20e15b6a 104 also be out of position on the slider. Ignoring the next reading is trying to
IonSystems 15:0c5f20e15b6a 105 prevent a mis-read being valid.
IonSystems 15:0c5f20e15b6a 106 */
IonSystems 17:6a0bb0ad5bb4 107 if(lastColour == NONE){
IonSystems 17:6a0bb0ad5bb4 108
IonSystems 14:31ba3e56c788 109 return;
IonSystems 14:31ba3e56c788 110 }
IonSystems 17:6a0bb0ad5bb4 111
IonSystems 14:31ba3e56c788 112 if(sorter) sort(colour);
IonSystems 14:31ba3e56c788 113 //Put (sorter && colour != BIN) in if statement.
IonSystems 11:06f6e82b40a8 114 }
IonSystems 14:31ba3e56c788 115 //if
IonSystems 13:0661d658d9d1 116 }else if(mode == 4){ //Card Reader Mode
IonSystems 12:814a8fdbb6f7 117 if(cardReader && cardDetect){
IonSystems 12:814a8fdbb6f7 118 cardAcquisition();
IonSystems 12:814a8fdbb6f7 119
IonSystems 12:814a8fdbb6f7 120 }
IonSystems 13:0661d658d9d1 121 }else if(mode == 5){ //Storage Mode
IonSystems 12:814a8fdbb6f7 122 stringstream ss;
IonSystems 12:814a8fdbb6f7 123 ss << "Stored Values " << "R:" << redAmount << "G:" << greenAmount << "B:" << blueAmount;
IonSystems 12:814a8fdbb6f7 124 string tmp = ss.str();
IonSystems 12:814a8fdbb6f7 125 printLCD(tmp.c_str());
IonSystems 12:814a8fdbb6f7 126 wait(0.1);
IonSystems 12:814a8fdbb6f7 127 if(par_port->read_bit(8)){
IonSystems 12:814a8fdbb6f7 128 log("Dispense all button pressed");
IonSystems 12:814a8fdbb6f7 129 stateMachine = DISPENSE_ALL;
IonSystems 12:814a8fdbb6f7 130 processState(stateMachine);
IonSystems 12:814a8fdbb6f7 131 }else if(par_port->read_bit(9)){
IonSystems 12:814a8fdbb6f7 132 log("Clear stored numbers button pressed");
IonSystems 12:814a8fdbb6f7 133 writeFile(0,0,0);
IonSystems 12:814a8fdbb6f7 134 redAmount = 0;greenAmount = 0;blueAmount = 0;
IonSystems 12:814a8fdbb6f7 135 printLCD("Cleared values");
IonSystems 12:814a8fdbb6f7 136
IonSystems 12:814a8fdbb6f7 137 }else if(par_port->read_bit(10)){
IonSystems 16:498359d078dc 138 log("Increment all stored values by 2.");
IonSystems 16:498359d078dc 139 redAmount += 2;greenAmount += 2;blueAmount += 2;
IonSystems 16:498359d078dc 140 writeFile(redAmount,greenAmount,blueAmount);
IonSystems 16:498359d078dc 141
IonSystems 13:0661d658d9d1 142 printLCD("set values to 2");
IonSystems 12:814a8fdbb6f7 143
IonSystems 12:814a8fdbb6f7 144 }
IonSystems 17:6a0bb0ad5bb4 145 }else if(mode == 6){
IonSystems 17:6a0bb0ad5bb4 146 printLCD("Main. Mode: " + maintenanceModeSelect);
IonSystems 17:6a0bb0ad5bb4 147 wait(0.1); //Maintenance Mode
IonSystems 17:6a0bb0ad5bb4 148 //printLCD("Maintenance Mode");
IonSystems 13:0661d658d9d1 149 if(par_port->read_bit(8)){ //Next maintenance function
IonSystems 13:0661d658d9d1 150 maintenanceModePointer++;
IonSystems 13:0661d658d9d1 151 if(maintenanceModePointer > 12) maintenanceModePointer = 0;
IonSystems 13:0661d658d9d1 152 }else if(par_port->read_bit(9)){ //Previous maintenance function
IonSystems 13:0661d658d9d1 153 maintenanceModePointer--;
IonSystems 13:0661d658d9d1 154 if(maintenanceModePointer < 0) maintenanceModePointer = 12;
IonSystems 13:0661d658d9d1 155 }else if(par_port->read_bit(10)){ //Process Instruction
IonSystems 13:0661d658d9d1 156 switch(maintenanceModePointer){
IonSystems 13:0661d658d9d1 157 case 0://RB_LEFT:
IonSystems 14:31ba3e56c788 158 printLCD("Moving Red/Blue Slider left.");
IonSystems 13:0661d658d9d1 159 maintain(RB_LEFT);
IonSystems 13:0661d658d9d1 160 break;
IonSystems 13:0661d658d9d1 161
IonSystems 13:0661d658d9d1 162 case 1://RB_CENTRE:
IonSystems 14:31ba3e56c788 163 printLCD("Centering Red/Blue Slider.");
IonSystems 13:0661d658d9d1 164 maintain(RB_CENTRE);
IonSystems 13:0661d658d9d1 165 break;
IonSystems 13:0661d658d9d1 166
IonSystems 13:0661d658d9d1 167 case 2://RB_RIGHT:
IonSystems 14:31ba3e56c788 168 printLCD("Moving Red/Blue Slider right.");
IonSystems 13:0661d658d9d1 169 maintain(RB_RIGHT);
IonSystems 13:0661d658d9d1 170 break;
IonSystems 13:0661d658d9d1 171
IonSystems 13:0661d658d9d1 172 case 3://GO_UP:
IonSystems 14:31ba3e56c788 173 printLCD("Moving Green Slider up.");
IonSystems 13:0661d658d9d1 174 maintain(GO_UP);
IonSystems 13:0661d658d9d1 175 break;
IonSystems 13:0661d658d9d1 176
IonSystems 13:0661d658d9d1 177 case 4://GO_CENTRE:
IonSystems 14:31ba3e56c788 178 printLCD("Centering Green Slider.");
IonSystems 13:0661d658d9d1 179 maintain(GO_CENTRE);
IonSystems 13:0661d658d9d1 180 break;
IonSystems 13:0661d658d9d1 181
IonSystems 13:0661d658d9d1 182 case 5://GO_DOWN:
IonSystems 14:31ba3e56c788 183 printLCD("Moving Green Slider down.");
IonSystems 13:0661d658d9d1 184 maintain(GO_DOWN);
IonSystems 13:0661d658d9d1 185 break;
IonSystems 13:0661d658d9d1 186
IonSystems 13:0661d658d9d1 187 case 6://BR_LEFT:
IonSystems 14:31ba3e56c788 188 printLCD("Moving Bin Slider left.");
IonSystems 13:0661d658d9d1 189 maintain(BR_LEFT);
IonSystems 13:0661d658d9d1 190 break;
IonSystems 13:0661d658d9d1 191
IonSystems 13:0661d658d9d1 192 case 7://BR_RIGHT:
IonSystems 14:31ba3e56c788 193 printLCD("Moving Bin Slider right.");
IonSystems 13:0661d658d9d1 194 maintain(BR_RIGHT);
IonSystems 13:0661d658d9d1 195 break;
IonSystems 13:0661d658d9d1 196
IonSystems 13:0661d658d9d1 197 case 8://R_PUSH:
IonSystems 14:31ba3e56c788 198 printLCD("Pushing red dispensor");
IonSystems 13:0661d658d9d1 199 maintain(R_PUSH);
IonSystems 13:0661d658d9d1 200 break;
IonSystems 13:0661d658d9d1 201
IonSystems 13:0661d658d9d1 202 case 9://R_HOME:
IonSystems 14:31ba3e56c788 203 printLCD("Homing red dispensor");
IonSystems 14:31ba3e56c788 204 maintain(R_HOME);
IonSystems 13:0661d658d9d1 205 break;
IonSystems 13:0661d658d9d1 206
IonSystems 13:0661d658d9d1 207 case 10://GB_LEFT:
IonSystems 14:31ba3e56c788 208 printLCD("Pushing green dispensor");
IonSystems 13:0661d658d9d1 209 maintain(GB_LEFT);
IonSystems 13:0661d658d9d1 210 break;
IonSystems 13:0661d658d9d1 211
IonSystems 13:0661d658d9d1 212 case 11://GB_CENTRE:
IonSystems 14:31ba3e56c788 213 printLCD("Centre green/blue dispensor");
IonSystems 13:0661d658d9d1 214 maintain(GB_CENTRE);
IonSystems 13:0661d658d9d1 215 break;
IonSystems 13:0661d658d9d1 216
IonSystems 13:0661d658d9d1 217 case 12://GB_RIGHT:
IonSystems 14:31ba3e56c788 218 printLCD("Pushing blue dispensor");
IonSystems 14:31ba3e56c788 219 maintain(GB_RIGHT );
IonSystems 13:0661d658d9d1 220 break;
IonSystems 13:0661d658d9d1 221
IonSystems 13:0661d658d9d1 222
IonSystems 13:0661d658d9d1 223
IonSystems 14:31ba3e56c788 224 } printLCD("Ready for next command");
IonSystems 14:31ba3e56c788 225 wait(1);
IonSystems 13:0661d658d9d1 226 }
IonSystems 12:814a8fdbb6f7 227 }
IonSystems 9:8d78eb55ad5e 228 }
IonSystems 12:814a8fdbb6f7 229
IonSystems 15:0c5f20e15b6a 230 void changeLanguage(){
IonSystems 17:6a0bb0ad5bb4 231 currentLanguage = nextLanguage(currentLanguage); //Change the language on teh MBED.
IonSystems 17:6a0bb0ad5bb4 232 sendLanguageCharacter(); //Tell PC to change language
IonSystems 17:6a0bb0ad5bb4 233 ////Change Language //Tell Arduino to change language.
IonSystems 15:0c5f20e15b6a 234 printLCD("setting language to english");
IonSystems 17:6a0bb0ad5bb4 235 wait(1);
IonSystems 15:0c5f20e15b6a 236 }
IonSystems 6:e64796f1f384 237
IonSystems 6:e64796f1f384 238 int main() {
IonSystems 12:814a8fdbb6f7 239
IonSystems 7:6ba00694f9cd 240 stateMachine = INITIALISING;
IonSystems 8:b7771391adc9 241 processState(stateMachine);
IonSystems 12:814a8fdbb6f7 242 readChipNumbers();
IonSystems 12:814a8fdbb6f7 243 printStoredChipValues();
IonSystems 14:31ba3e56c788 244 //displayOperationMode();
IonSystems 8:b7771391adc9 245 while(true){
IonSystems 10:8c0696b99692 246 if(serialComms){
IonSystems 10:8c0696b99692 247 checkSerial();
IonSystems 12:814a8fdbb6f7 248 }if(testFunctions) checkSortDispenseButtons();
IonSystems 17:6a0bb0ad5bb4 249 //if(languageButton) changeLanguage();
IonSystems 15:0c5f20e15b6a 250
IonSystems 15:0c5f20e15b6a 251
IonSystems 15:0c5f20e15b6a 252
IonSystems 15:0c5f20e15b6a 253
IonSystems 11:06f6e82b40a8 254 wait(0.05);
IonSystems 12:814a8fdbb6f7 255
IonSystems 8:b7771391adc9 256 }
IonSystems 10:8c0696b99692 257 /*char c;
IonSystems 10:8c0696b99692 258 if(c = readCharacter()){
IonSystems 10:8c0696b99692 259 processMessage(c);
IonSystems 10:8c0696b99692 260 }*/
IonSystems 11:06f6e82b40a8 261
IonSystems 11:06f6e82b40a8 262
IonSystems 10:8c0696b99692 263 }
IonSystems 9:8d78eb55ad5e 264
IonSystems 9:8d78eb55ad5e 265
IonSystems 9:8d78eb55ad5e 266
IonSystems 17:6a0bb0ad5bb4 267
IonSystems 8:b7771391adc9 268
IonSystems 17:6a0bb0ad5bb4 269
IonSystems 3:97668a4cd69d 270
IonSystems 10:8c0696b99692 271
IonSystems 10:8c0696b99692 272