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:
Wed Nov 12 20:14:45 2014 +0000
Revision:
10:8c0696b99692
Parent:
7:6ba00694f9cd
Child:
12:814a8fdbb6f7
works with serial and buttons, ready for demo tomorrow 13-11-14

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 10:8c0696b99692 59 setupLCD();
IonSystems 10:8c0696b99692 60 printLCD("Welcome to the Chipin Sorter");
IonSystems 10:8c0696b99692 61 wait(1);
IonSystems 10:8c0696b99692 62 break;
IonSystems 10:8c0696b99692 63 case READING_RGB_VALUES:
IonSystems 10:8c0696b99692 64 readChipNumbers();
IonSystems 10:8c0696b99692 65 break;
IonSystems 10:8c0696b99692 66 case DISPENSE_RED:
IonSystems 10:8c0696b99692 67 dispense(RED);
IonSystems 10:8c0696b99692 68 break;
IonSystems 10:8c0696b99692 69 case DISPENSE_GREEN:
IonSystems 10:8c0696b99692 70 dispense(GREEN);
IonSystems 10:8c0696b99692 71 break;
IonSystems 10:8c0696b99692 72 case DISPENSE_BLUE:
IonSystems 10:8c0696b99692 73 dispense(BLUE);
IonSystems 10:8c0696b99692 74 break;
IonSystems 10:8c0696b99692 75 case SORT_RED:
IonSystems 10:8c0696b99692 76 sort(RED);
IonSystems 10:8c0696b99692 77 break;
IonSystems 10:8c0696b99692 78 case SORT_GREEN:
IonSystems 10:8c0696b99692 79 sort(GREEN);
IonSystems 10:8c0696b99692 80 break;
IonSystems 10:8c0696b99692 81 case SORT_BLUE:
IonSystems 10:8c0696b99692 82 sort(BLUE);
IonSystems 10:8c0696b99692 83 break;
IonSystems 10:8c0696b99692 84 case SORT_BIN:
IonSystems 10:8c0696b99692 85 sort(BIN);
IonSystems 10:8c0696b99692 86 break;
IonSystems 10:8c0696b99692 87 case SORT_RECYCLE:
IonSystems 10:8c0696b99692 88 sort(RECYCLE);
IonSystems 10:8c0696b99692 89 break;
IonSystems 10:8c0696b99692 90 /* case WAITING_FOR_ACK:
IonSystems 10:8c0696b99692 91 checkSerial();
IonSystems 10:8c0696b99692 92 break;
IonSystems 10:8c0696b99692 93 case WAITING_FOR_CHAR:
IonSystems 10:8c0696b99692 94 log("About to check serial");
IonSystems 10:8c0696b99692 95 printLCD("WAITING_FOR_CHAR");
IonSystems 10:8c0696b99692 96 checkSerial();
IonSystems 10:8c0696b99692 97 break;*/
IonSystems 10:8c0696b99692 98
IonSystems 6:e64796f1f384 99 }
IonSystems 10:8c0696b99692 100 }
IonSystems 6:e64796f1f384 101
IonSystems 10:8c0696b99692 102
IonSystems 10:8c0696b99692 103 void processMessage(char c){
IonSystems 6:e64796f1f384 104 switch(c){
IonSystems 10:8c0696b99692 105 case 'a' : //Dispense red
IonSystems 10:8c0696b99692 106 dispense(RED);
IonSystems 10:8c0696b99692 107 sendCharacter('A');
IonSystems 6:e64796f1f384 108 break;
IonSystems 10:8c0696b99692 109 case 'b' : //dispense green
IonSystems 10:8c0696b99692 110 dispense(GREEN);
IonSystems 10:8c0696b99692 111 sendCharacter('B');
IonSystems 6:e64796f1f384 112 break;
IonSystems 10:8c0696b99692 113 case 'c': //dispense blue
IonSystems 10:8c0696b99692 114 dispense(BLUE);
IonSystems 10:8c0696b99692 115 sendCharacter('C');
IonSystems 6:e64796f1f384 116 break;
IonSystems 6:e64796f1f384 117 case 'C':// Read card command
IonSystems 6:e64796f1f384 118 sendCharacter('R'); //Notify PC that command has been recieved
IonSystems 6:e64796f1f384 119 printLCD("Reading Card");
IonSystems 6:e64796f1f384 120 //read card here
IonSystems 6:e64796f1f384 121 char value = ' ';
IonSystems 6:e64796f1f384 122 for(int num = 1;num <= 6;num++){
IonSystems 6:e64796f1f384 123 value = readBit(num);
IonSystems 6:e64796f1f384 124 // sendCharacter('R');
IonSystems 6:e64796f1f384 125 sendCharacter(value);
IonSystems 6:e64796f1f384 126 printLCD("Bit read");
IonSystems 6:e64796f1f384 127 //wait(0.1);
IonSystems 6:e64796f1f384 128 }
IonSystems 6:e64796f1f384 129 sendCharacter('C'); //Tells PC that the card has been read
IonSystems 6:e64796f1f384 130 printLCD("Card read done");
IonSystems 6:e64796f1f384 131 break;
IonSystems 6:e64796f1f384 132 case 'X':
IonSystems 6:e64796f1f384 133 sendCharacter('X'); //Notify the PC that this is an MBED
IonSystems 6:e64796f1f384 134 printLCD("Connected to PC");
IonSystems 6:e64796f1f384 135 break;
IonSystems 6:e64796f1f384 136 case 'd': //Dispense a chip
IonSystems 6:e64796f1f384 137 sendCharacter('D');
IonSystems 6:e64796f1f384 138 printLCD("Dispensing chip");
IonSystems 6:e64796f1f384 139
IonSystems 6:e64796f1f384 140 //read from color sensor
IonSystems 6:e64796f1f384 141 //convert readings to colour
IonSystems 6:e64796f1f384 142 //convert colour to 3-bit colour code
IonSystems 6:e64796f1f384 143 //set the FPGA colour inputs to the colour code
IonSystems 6:e64796f1f384 144 startSort = true;
IonSystems 6:e64796f1f384 145 break;
IonSystems 10:8c0696b99692 146
IonSystems 10:8c0696b99692 147 case 'o':
IonSystems 10:8c0696b99692 148
IonSystems 10:8c0696b99692 149 break;
IonSystems 10:8c0696b99692 150
IonSystems 10:8c0696b99692 151 case 'p':
IonSystems 10:8c0696b99692 152 break;
IonSystems 10:8c0696b99692 153
IonSystems 10:8c0696b99692 154 case 'q':
IonSystems 10:8c0696b99692 155 break;
IonSystems 10:8c0696b99692 156
IonSystems 10:8c0696b99692 157 case 's':
IonSystems 10:8c0696b99692 158 break;
IonSystems 10:8c0696b99692 159
IonSystems 10:8c0696b99692 160 case 't':
IonSystems 10:8c0696b99692 161 break;
IonSystems 10:8c0696b99692 162
IonSystems 10:8c0696b99692 163 case 'u':
IonSystems 10:8c0696b99692 164 break;
IonSystems 10:8c0696b99692 165
IonSystems 10:8c0696b99692 166
IonSystems 10:8c0696b99692 167
IonSystems 10:8c0696b99692 168 case 'v':
IonSystems 10:8c0696b99692 169 break;
IonSystems 10:8c0696b99692 170
IonSystems 10:8c0696b99692 171 case 'w':
IonSystems 10:8c0696b99692 172 break;
IonSystems 10:8c0696b99692 173 case 'j':
IonSystems 10:8c0696b99692 174 sort(RED);
IonSystems 10:8c0696b99692 175 sendCharacter('J');
IonSystems 10:8c0696b99692 176 break;
IonSystems 10:8c0696b99692 177 case 'k':
IonSystems 10:8c0696b99692 178 sort(GREEN);
IonSystems 10:8c0696b99692 179 sendCharacter('K');
IonSystems 10:8c0696b99692 180 break;
IonSystems 10:8c0696b99692 181 case 'l':
IonSystems 10:8c0696b99692 182 sort(BLUE);
IonSystems 10:8c0696b99692 183 sendCharacter('L');
IonSystems 10:8c0696b99692 184 break;
IonSystems 10:8c0696b99692 185
IonSystems 10:8c0696b99692 186
IonSystems 10:8c0696b99692 187
IonSystems 10:8c0696b99692 188
IonSystems 10:8c0696b99692 189
IonSystems 10:8c0696b99692 190
IonSystems 10:8c0696b99692 191
IonSystems 10:8c0696b99692 192
IonSystems 10:8c0696b99692 193
IonSystems 10:8c0696b99692 194
IonSystems 10:8c0696b99692 195
IonSystems 10:8c0696b99692 196
IonSystems 10:8c0696b99692 197 /*case 't'://Test 180 servo
IonSystems 6:e64796f1f384 198 sendCharacter('T');
IonSystems 6:e64796f1f384 199 printLCD("Servo signal on");
IonSystems 6:e64796f1f384 200 servoTest = true;
IonSystems 6:e64796f1f384 201 break;
IonSystems 6:e64796f1f384 202 case 'w'://Test 180 servo
IonSystems 6:e64796f1f384 203 sendCharacter('W');
IonSystems 6:e64796f1f384 204 printLCD("Servo signal off");
IonSystems 6:e64796f1f384 205 servoTest = false;
IonSystems 10:8c0696b99692 206 break;*/
IonSystems 10:8c0696b99692 207 }
IonSystems 10:8c0696b99692 208 }
IonSystems 6:e64796f1f384 209
IonSystems 10:8c0696b99692 210 /*else if (operationMode){
IonSystems 6:e64796f1f384 211 switch(c){
IonSystems 6:e64796f1f384 212 case 'n':// Start sorting
IonSystems 6:e64796f1f384 213 sendCharacter('N'); //Confirm to PC that we are processing the instruction.
IonSystems 6:e64796f1f384 214 startSort = true; //Pulse the startSort control line to FPGA
IonSystems 6:e64796f1f384 215 wait(0.1);
IonSystems 6:e64796f1f384 216 startSort = false;
IonSystems 6:e64796f1f384 217 break;
IonSystems 6:e64796f1f384 218 case 'o': //Start dispensing
IonSystems 6:e64796f1f384 219 sendCharacter('O');
IonSystems 6:e64796f1f384 220 startDispense = true; //Pulse the startDispense control line to FPGA
IonSystems 6:e64796f1f384 221 wait(0.1);
IonSystems 6:e64796f1f384 222 startDispense = false;
IonSystems 6:e64796f1f384 223 break;
IonSystems 6:e64796f1f384 224 case 'p': //
IonSystems 6:e64796f1f384 225 sendCharacter('P');
IonSystems 6:e64796f1f384 226 break;
IonSystems 6:e64796f1f384 227 }
IonSystems 6:e64796f1f384 228 }
IonSystems 10:8c0696b99692 229 }*/
IonSystems 10:8c0696b99692 230 bool checkSerial(){
IonSystems 10:8c0696b99692 231 log("Checking serial");
IonSystems 10:8c0696b99692 232 printLCD("");
IonSystems 10:8c0696b99692 233 if(pc.readable()){
IonSystems 10:8c0696b99692 234 log("serial port is readable, reading char and processing");
IonSystems 10:8c0696b99692 235 char c = pc.getc();
IonSystems 10:8c0696b99692 236 processMessage(c);
IonSystems 10:8c0696b99692 237 return true;
IonSystems 10:8c0696b99692 238 }else{
IonSystems 10:8c0696b99692 239 log("serial port not readable, doing nothing");
IonSystems 10:8c0696b99692 240 return false;
IonSystems 10:8c0696b99692 241 }
IonSystems 6:e64796f1f384 242 }
IonSystems 10:8c0696b99692 243 bool readCharacter(){
IonSystems 10:8c0696b99692 244 char c = pc.getc(); //wait for a serial character to be recieved.
IonSystems 10:8c0696b99692 245 processMessage(c); //Do something, based on the character recieved.
IonSystems 10:8c0696b99692 246 return true;
IonSystems 6:e64796f1f384 247 }
IonSystems 6:e64796f1f384 248
IonSystems 10:8c0696b99692 249