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 16:09:52 2014 +0000
Revision:
18:12e2c82a5a6c
Parent:
15:0c5f20e15b6a
Child:
19:78d4b78fa736
Added some functions for button presses

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IonSystems 10:8c0696b99692 1 #include "cardReader.h"
IonSystems 10:8c0696b99692 2
IonSystems 10:8c0696b99692 3
IonSystems 10:8c0696b99692 4
IonSystems 10:8c0696b99692 5 Serial pc(USBTX, USBRX);
IonSystems 10:8c0696b99692 6 /* valueToChar(int value):
IonSystems 10:8c0696b99692 7 Expects an int value what it 0 or 1.
IonSystems 10:8c0696b99692 8 Returns the int value as a char.
IonSystems 10:8c0696b99692 9 0 will return '0'
IonSystems 10:8c0696b99692 10 1 will return '1'
IonSystems 10:8c0696b99692 11 Used to read the bits in the card reader.
IonSystems 10:8c0696b99692 12 */
IonSystems 10:8c0696b99692 13 char valueToChar(int value){
IonSystems 10:8c0696b99692 14 if(value == 0){
IonSystems 10:8c0696b99692 15 return '0';
IonSystems 10:8c0696b99692 16 }else if(value == 1){
IonSystems 10:8c0696b99692 17 return '1';
IonSystems 10:8c0696b99692 18 }else{
IonSystems 10:8c0696b99692 19 return NULL;
IonSystems 10:8c0696b99692 20 }
IonSystems 10:8c0696b99692 21 }
IonSystems 10:8c0696b99692 22
IonSystems 10:8c0696b99692 23 void sendCharacter(char ch){
IonSystems 10:8c0696b99692 24 pc.putc(ch);
IonSystems 10:8c0696b99692 25 }
IonSystems 10:8c0696b99692 26
IonSystems 10:8c0696b99692 27 void sendString(char* ch){
IonSystems 10:8c0696b99692 28 pc.puts(ch);
IonSystems 10:8c0696b99692 29 }
IonSystems 10:8c0696b99692 30
IonSystems 10:8c0696b99692 31
IonSystems 6:e64796f1f384 32 char readBit(int bitNumber){
IonSystems 6:e64796f1f384 33 int value = 0;
IonSystems 6:e64796f1f384 34 switch(bitNumber){
IonSystems 6:e64796f1f384 35 case 1:
IonSystems 6:e64796f1f384 36 value = cardBit1;
IonSystems 6:e64796f1f384 37 break;
IonSystems 6:e64796f1f384 38 case 2:
IonSystems 6:e64796f1f384 39 value = cardBit2;
IonSystems 6:e64796f1f384 40 break;
IonSystems 6:e64796f1f384 41 case 3:
IonSystems 6:e64796f1f384 42 value = cardBit3;
IonSystems 6:e64796f1f384 43 break;
IonSystems 6:e64796f1f384 44 case 4:
IonSystems 6:e64796f1f384 45 value = cardBit4;
IonSystems 6:e64796f1f384 46 break;
IonSystems 6:e64796f1f384 47 case 5:
IonSystems 6:e64796f1f384 48 value = cardBit5;
IonSystems 6:e64796f1f384 49 break;
IonSystems 6:e64796f1f384 50 case 6:
IonSystems 6:e64796f1f384 51 value = cardBit6;
IonSystems 6:e64796f1f384 52 break;
IonSystems 6:e64796f1f384 53 }
IonSystems 6:e64796f1f384 54 return valueToChar(value);
IonSystems 10:8c0696b99692 55 }
IonSystems 10:8c0696b99692 56 void processState(StateMachine stateMachine){
IonSystems 10:8c0696b99692 57 switch(stateMachine){
IonSystems 10:8c0696b99692 58 case INITIALISING:
IonSystems 18:12e2c82a5a6c 59
IonSystems 10:8c0696b99692 60 break;
IonSystems 10:8c0696b99692 61 case READING_RGB_VALUES:
IonSystems 10:8c0696b99692 62 readChipNumbers();
IonSystems 10:8c0696b99692 63 break;
IonSystems 10:8c0696b99692 64 case DISPENSE_RED:
IonSystems 10:8c0696b99692 65 dispense(RED);
IonSystems 10:8c0696b99692 66 break;
IonSystems 10:8c0696b99692 67 case DISPENSE_GREEN:
IonSystems 10:8c0696b99692 68 dispense(GREEN);
IonSystems 10:8c0696b99692 69 break;
IonSystems 10:8c0696b99692 70 case DISPENSE_BLUE:
IonSystems 10:8c0696b99692 71 dispense(BLUE);
IonSystems 10:8c0696b99692 72 break;
IonSystems 10:8c0696b99692 73 case SORT_RED:
IonSystems 10:8c0696b99692 74 sort(RED);
IonSystems 10:8c0696b99692 75 break;
IonSystems 10:8c0696b99692 76 case SORT_GREEN:
IonSystems 10:8c0696b99692 77 sort(GREEN);
IonSystems 10:8c0696b99692 78 break;
IonSystems 10:8c0696b99692 79 case SORT_BLUE:
IonSystems 10:8c0696b99692 80 sort(BLUE);
IonSystems 10:8c0696b99692 81 break;
IonSystems 10:8c0696b99692 82 case SORT_BIN:
IonSystems 10:8c0696b99692 83 sort(BIN);
IonSystems 10:8c0696b99692 84 break;
IonSystems 10:8c0696b99692 85 case SORT_RECYCLE:
IonSystems 10:8c0696b99692 86 sort(RECYCLE);
IonSystems 10:8c0696b99692 87 break;
IonSystems 12:814a8fdbb6f7 88 case DISPENSE_ALL:
IonSystems 12:814a8fdbb6f7 89 dispenseAll();
IonSystems 12:814a8fdbb6f7 90 break;
IonSystems 10:8c0696b99692 91 /* case WAITING_FOR_ACK:
IonSystems 10:8c0696b99692 92 checkSerial();
IonSystems 10:8c0696b99692 93 break;
IonSystems 10:8c0696b99692 94 case WAITING_FOR_CHAR:
IonSystems 10:8c0696b99692 95 log("About to check serial");
IonSystems 10:8c0696b99692 96 printLCD("WAITING_FOR_CHAR");
IonSystems 10:8c0696b99692 97 checkSerial();
IonSystems 10:8c0696b99692 98 break;*/
IonSystems 10:8c0696b99692 99
IonSystems 6:e64796f1f384 100 }
IonSystems 10:8c0696b99692 101 }
IonSystems 12:814a8fdbb6f7 102
IonSystems 12:814a8fdbb6f7 103
IonSystems 6:e64796f1f384 104
IonSystems 10:8c0696b99692 105
IonSystems 10:8c0696b99692 106 void processMessage(char c){
IonSystems 6:e64796f1f384 107 switch(c){
IonSystems 10:8c0696b99692 108 case 'a' : //Dispense red
IonSystems 10:8c0696b99692 109 dispense(RED);
IonSystems 10:8c0696b99692 110 sendCharacter('A');
IonSystems 6:e64796f1f384 111 break;
IonSystems 10:8c0696b99692 112 case 'b' : //dispense green
IonSystems 10:8c0696b99692 113 dispense(GREEN);
IonSystems 10:8c0696b99692 114 sendCharacter('B');
IonSystems 6:e64796f1f384 115 break;
IonSystems 10:8c0696b99692 116 case 'c': //dispense blue
IonSystems 10:8c0696b99692 117 dispense(BLUE);
IonSystems 10:8c0696b99692 118 sendCharacter('C');
IonSystems 6:e64796f1f384 119 break;
IonSystems 6:e64796f1f384 120 case 'C':// Read card command
IonSystems 6:e64796f1f384 121 sendCharacter('R'); //Notify PC that command has been recieved
IonSystems 6:e64796f1f384 122 printLCD("Reading Card");
IonSystems 6:e64796f1f384 123 //read card here
IonSystems 6:e64796f1f384 124 char value = ' ';
IonSystems 6:e64796f1f384 125 for(int num = 1;num <= 6;num++){
IonSystems 6:e64796f1f384 126 value = readBit(num);
IonSystems 6:e64796f1f384 127 // sendCharacter('R');
IonSystems 6:e64796f1f384 128 sendCharacter(value);
IonSystems 6:e64796f1f384 129 printLCD("Bit read");
IonSystems 6:e64796f1f384 130 //wait(0.1);
IonSystems 6:e64796f1f384 131 }
IonSystems 6:e64796f1f384 132 sendCharacter('C'); //Tells PC that the card has been read
IonSystems 6:e64796f1f384 133 printLCD("Card read done");
IonSystems 6:e64796f1f384 134 break;
IonSystems 6:e64796f1f384 135 case 'X':
IonSystems 6:e64796f1f384 136 sendCharacter('X'); //Notify the PC that this is an MBED
IonSystems 6:e64796f1f384 137 printLCD("Connected to PC");
IonSystems 6:e64796f1f384 138 break;
IonSystems 6:e64796f1f384 139 case 'd': //Dispense a chip
IonSystems 6:e64796f1f384 140 sendCharacter('D');
IonSystems 6:e64796f1f384 141 printLCD("Dispensing chip");
IonSystems 6:e64796f1f384 142
IonSystems 6:e64796f1f384 143 //read from color sensor
IonSystems 6:e64796f1f384 144 //convert readings to colour
IonSystems 6:e64796f1f384 145 //convert colour to 3-bit colour code
IonSystems 6:e64796f1f384 146 //set the FPGA colour inputs to the colour code
IonSystems 6:e64796f1f384 147 startSort = true;
IonSystems 6:e64796f1f384 148 break;
IonSystems 10:8c0696b99692 149
IonSystems 12:814a8fdbb6f7 150 case 'o': //testServoredBlueLeft
IonSystems 12:814a8fdbb6f7 151 maintain(RB_LEFT);
IonSystems 12:814a8fdbb6f7 152 sendCharacter('O');
IonSystems 10:8c0696b99692 153 break;
IonSystems 10:8c0696b99692 154
IonSystems 10:8c0696b99692 155 case 'p':
IonSystems 12:814a8fdbb6f7 156 maintain(RB_CENTRE);
IonSystems 12:814a8fdbb6f7 157 sendCharacter('P');
IonSystems 10:8c0696b99692 158 break;
IonSystems 10:8c0696b99692 159
IonSystems 10:8c0696b99692 160 case 'q':
IonSystems 12:814a8fdbb6f7 161 maintain(RB_RIGHT);
IonSystems 12:814a8fdbb6f7 162 sendCharacter('O');
IonSystems 10:8c0696b99692 163 break;
IonSystems 10:8c0696b99692 164
IonSystems 10:8c0696b99692 165 case 's':
IonSystems 12:814a8fdbb6f7 166 maintain(GO_UP);
IonSystems 12:814a8fdbb6f7 167 sendCharacter('S');
IonSystems 10:8c0696b99692 168 break;
IonSystems 10:8c0696b99692 169
IonSystems 10:8c0696b99692 170 case 't':
IonSystems 12:814a8fdbb6f7 171 maintain(GO_CENTRE);
IonSystems 12:814a8fdbb6f7 172 sendCharacter('T');
IonSystems 10:8c0696b99692 173 break;
IonSystems 10:8c0696b99692 174
IonSystems 10:8c0696b99692 175 case 'u':
IonSystems 12:814a8fdbb6f7 176 maintain(GO_DOWN);
IonSystems 12:814a8fdbb6f7 177 sendCharacter('U');
IonSystems 10:8c0696b99692 178 break;
IonSystems 10:8c0696b99692 179
IonSystems 10:8c0696b99692 180
IonSystems 10:8c0696b99692 181
IonSystems 10:8c0696b99692 182 case 'v':
IonSystems 12:814a8fdbb6f7 183 maintain(BR_LEFT);
IonSystems 12:814a8fdbb6f7 184 sendCharacter('V');
IonSystems 10:8c0696b99692 185 break;
IonSystems 10:8c0696b99692 186
IonSystems 10:8c0696b99692 187 case 'w':
IonSystems 12:814a8fdbb6f7 188 maintain(BR_LEFT);
IonSystems 12:814a8fdbb6f7 189 sendCharacter('O');
IonSystems 10:8c0696b99692 190 break;
IonSystems 10:8c0696b99692 191 case 'j':
IonSystems 10:8c0696b99692 192 sort(RED);
IonSystems 10:8c0696b99692 193 sendCharacter('J');
IonSystems 10:8c0696b99692 194 break;
IonSystems 10:8c0696b99692 195 case 'k':
IonSystems 10:8c0696b99692 196 sort(GREEN);
IonSystems 10:8c0696b99692 197 sendCharacter('K');
IonSystems 10:8c0696b99692 198 break;
IonSystems 10:8c0696b99692 199 case 'l':
IonSystems 10:8c0696b99692 200 sort(BLUE);
IonSystems 10:8c0696b99692 201 sendCharacter('L');
IonSystems 10:8c0696b99692 202 break;
IonSystems 10:8c0696b99692 203
IonSystems 18:12e2c82a5a6c 204 case '0': //Dispense all
IonSystems 12:814a8fdbb6f7 205 dispenseAll();
IonSystems 18:12e2c82a5a6c 206 sendCharacter('1');
IonSystems 12:814a8fdbb6f7 207 break;
IonSystems 10:8c0696b99692 208
IonSystems 10:8c0696b99692 209
IonSystems 10:8c0696b99692 210
IonSystems 10:8c0696b99692 211
IonSystems 10:8c0696b99692 212
IonSystems 10:8c0696b99692 213
IonSystems 10:8c0696b99692 214
IonSystems 10:8c0696b99692 215
IonSystems 10:8c0696b99692 216
IonSystems 10:8c0696b99692 217
IonSystems 10:8c0696b99692 218
IonSystems 10:8c0696b99692 219 /*case 't'://Test 180 servo
IonSystems 6:e64796f1f384 220 sendCharacter('T');
IonSystems 6:e64796f1f384 221 printLCD("Servo signal on");
IonSystems 6:e64796f1f384 222 servoTest = true;
IonSystems 6:e64796f1f384 223 break;
IonSystems 6:e64796f1f384 224 case 'w'://Test 180 servo
IonSystems 6:e64796f1f384 225 sendCharacter('W');
IonSystems 6:e64796f1f384 226 printLCD("Servo signal off");
IonSystems 6:e64796f1f384 227 servoTest = false;
IonSystems 10:8c0696b99692 228 break;*/
IonSystems 10:8c0696b99692 229 }
IonSystems 10:8c0696b99692 230 }
IonSystems 6:e64796f1f384 231
IonSystems 10:8c0696b99692 232 /*else if (operationMode){
IonSystems 6:e64796f1f384 233 switch(c){
IonSystems 6:e64796f1f384 234 case 'n':// Start sorting
IonSystems 6:e64796f1f384 235 sendCharacter('N'); //Confirm to PC that we are processing the instruction.
IonSystems 6:e64796f1f384 236 startSort = true; //Pulse the startSort control line to FPGA
IonSystems 6:e64796f1f384 237 wait(0.1);
IonSystems 6:e64796f1f384 238 startSort = false;
IonSystems 6:e64796f1f384 239 break;
IonSystems 6:e64796f1f384 240 case 'o': //Start dispensing
IonSystems 6:e64796f1f384 241 sendCharacter('O');
IonSystems 6:e64796f1f384 242 startDispense = true; //Pulse the startDispense control line to FPGA
IonSystems 6:e64796f1f384 243 wait(0.1);
IonSystems 6:e64796f1f384 244 startDispense = false;
IonSystems 6:e64796f1f384 245 break;
IonSystems 6:e64796f1f384 246 case 'p': //
IonSystems 6:e64796f1f384 247 sendCharacter('P');
IonSystems 6:e64796f1f384 248 break;
IonSystems 6:e64796f1f384 249 }
IonSystems 6:e64796f1f384 250 }
IonSystems 10:8c0696b99692 251 }*/
IonSystems 10:8c0696b99692 252 bool checkSerial(){
IonSystems 10:8c0696b99692 253 log("Checking serial");
IonSystems 10:8c0696b99692 254 printLCD("");
IonSystems 10:8c0696b99692 255 if(pc.readable()){
IonSystems 10:8c0696b99692 256 log("serial port is readable, reading char and processing");
IonSystems 10:8c0696b99692 257 char c = pc.getc();
IonSystems 10:8c0696b99692 258 processMessage(c);
IonSystems 10:8c0696b99692 259 return true;
IonSystems 10:8c0696b99692 260 }else{
IonSystems 10:8c0696b99692 261 log("serial port not readable, doing nothing");
IonSystems 10:8c0696b99692 262 return false;
IonSystems 10:8c0696b99692 263 }
IonSystems 6:e64796f1f384 264 }
IonSystems 10:8c0696b99692 265 bool readCharacter(){
IonSystems 10:8c0696b99692 266 char c = pc.getc(); //wait for a serial character to be recieved.
IonSystems 10:8c0696b99692 267 processMessage(c); //Do something, based on the character recieved.
IonSystems 10:8c0696b99692 268 return true;
IonSystems 6:e64796f1f384 269 }
IonSystems 15:0c5f20e15b6a 270 /* Set the PC's laguage to whatever our language is
IonSystems 15:0c5f20e15b6a 271 */
IonSystems 15:0c5f20e15b6a 272 void sendLanguageCharacter(){
IonSystems 15:0c5f20e15b6a 273 switch(currentLanguage){
IonSystems 15:0c5f20e15b6a 274 case ENGLISH:
IonSystems 15:0c5f20e15b6a 275 printLCD("Setting language to English");
IonSystems 15:0c5f20e15b6a 276 sendCharacter('Y');
IonSystems 15:0c5f20e15b6a 277 printLCD("Language set to English");
IonSystems 15:0c5f20e15b6a 278 break;
IonSystems 15:0c5f20e15b6a 279
IonSystems 15:0c5f20e15b6a 280 case FRENCH:
IonSystems 15:0c5f20e15b6a 281 printLCD("Setting language to French");
IonSystems 15:0c5f20e15b6a 282 sendCharacter('Z');
IonSystems 15:0c5f20e15b6a 283 printLCD("Language set to French");
IonSystems 15:0c5f20e15b6a 284 break;
IonSystems 15:0c5f20e15b6a 285
IonSystems 15:0c5f20e15b6a 286 case GERMAN:
IonSystems 15:0c5f20e15b6a 287 printLCD("Setting language to German");
IonSystems 15:0c5f20e15b6a 288 sendCharacter('!');
IonSystems 15:0c5f20e15b6a 289 printLCD("Language set to German");
IonSystems 15:0c5f20e15b6a 290 break;
IonSystems 15:0c5f20e15b6a 291 }
IonSystems 15:0c5f20e15b6a 292 }
IonSystems 6:e64796f1f384 293
IonSystems 10:8c0696b99692 294