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:
Sat Nov 29 16:32:57 2014 +0000
Revision:
23:f9e7e64784be
Parent:
22:8f11d1c178ab
Child:
24:8868101d01d0
might be working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IonSystems 10:8c0696b99692 1 #include "cardReader.h"
IonSystems 10:8c0696b99692 2
IonSystems 23:f9e7e64784be 3 char bitToChar(bool bit)
IonSystems 23:f9e7e64784be 4 {
IonSystems 23:f9e7e64784be 5 if(bit == 0) {
IonSystems 23:f9e7e64784be 6 return '0';
IonSystems 23:f9e7e64784be 7 } else if(bit == 1) {
IonSystems 23:f9e7e64784be 8 return '1';
IonSystems 23:f9e7e64784be 9 } else {
IonSystems 23:f9e7e64784be 10 return NULL;
IonSystems 23:f9e7e64784be 11 }
IonSystems 10:8c0696b99692 12 }
IonSystems 10:8c0696b99692 13
IonSystems 23:f9e7e64784be 14 void sendCharacter(char ch)
IonSystems 23:f9e7e64784be 15 {
IonSystems 23:f9e7e64784be 16 pc.putc(ch);
IonSystems 10:8c0696b99692 17 }
IonSystems 10:8c0696b99692 18
IonSystems 23:f9e7e64784be 19 void sendString(char* ch)
IonSystems 23:f9e7e64784be 20 {
IonSystems 23:f9e7e64784be 21 pc.puts(ch);
IonSystems 10:8c0696b99692 22 }
IonSystems 10:8c0696b99692 23
IonSystems 23:f9e7e64784be 24 void processMessage(char c)
IonSystems 23:f9e7e64784be 25 {
IonSystems 23:f9e7e64784be 26 switch(c) {
IonSystems 23:f9e7e64784be 27 case 'a' : { //Dispense red
IonSystems 23:f9e7e64784be 28 dispense(RED);
IonSystems 23:f9e7e64784be 29 sendCharacter('A');
IonSystems 6:e64796f1f384 30 break;
IonSystems 23:f9e7e64784be 31 }
IonSystems 23:f9e7e64784be 32 {
IonSystems 10:8c0696b99692 33 case 'b' : //dispense green
IonSystems 10:8c0696b99692 34 dispense(GREEN);
IonSystems 10:8c0696b99692 35 sendCharacter('B');
IonSystems 23:f9e7e64784be 36 break;
IonSystems 20:6de191ac7ff3 37 }
IonSystems 20:6de191ac7ff3 38 {
IonSystems 10:8c0696b99692 39 case 'c': //dispense blue
IonSystems 10:8c0696b99692 40 dispense(BLUE);
IonSystems 10:8c0696b99692 41 sendCharacter('C');
IonSystems 23:f9e7e64784be 42 break;
IonSystems 20:6de191ac7ff3 43 }
IonSystems 20:6de191ac7ff3 44 {
IonSystems 6:e64796f1f384 45 case 'C':// Read card command
IonSystems 23:f9e7e64784be 46 printLCD("Reading Card");
IonSystems 23:f9e7e64784be 47 break;
IonSystems 20:6de191ac7ff3 48 }
IonSystems 20:6de191ac7ff3 49 {
IonSystems 6:e64796f1f384 50 case 'X':
IonSystems 6:e64796f1f384 51 sendCharacter('X'); //Notify the PC that this is an MBED
IonSystems 6:e64796f1f384 52 printLCD("Connected to PC");
IonSystems 23:f9e7e64784be 53 break;
IonSystems 20:6de191ac7ff3 54 }
IonSystems 20:6de191ac7ff3 55 {
IonSystems 22:8f11d1c178ab 56 case 'd': //Sort Bin
IonSystems 22:8f11d1c178ab 57 sort(BIN);
IonSystems 6:e64796f1f384 58 sendCharacter('D');
IonSystems 23:f9e7e64784be 59 break;
IonSystems 20:6de191ac7ff3 60 }
IonSystems 20:6de191ac7ff3 61 {
IonSystems 23:f9e7e64784be 62
IonSystems 12:814a8fdbb6f7 63 case 'o': //testServoredBlueLeft
IonSystems 12:814a8fdbb6f7 64 maintain(RB_LEFT);
IonSystems 12:814a8fdbb6f7 65 sendCharacter('O');
IonSystems 23:f9e7e64784be 66 break;
IonSystems 20:6de191ac7ff3 67 }
IonSystems 20:6de191ac7ff3 68 {
IonSystems 23:f9e7e64784be 69
IonSystems 10:8c0696b99692 70 case 'p':
IonSystems 12:814a8fdbb6f7 71 maintain(RB_CENTRE);
IonSystems 12:814a8fdbb6f7 72 sendCharacter('P');
IonSystems 23:f9e7e64784be 73 break;
IonSystems 20:6de191ac7ff3 74 }
IonSystems 20:6de191ac7ff3 75 {
IonSystems 23:f9e7e64784be 76
IonSystems 10:8c0696b99692 77 case 'q':
IonSystems 12:814a8fdbb6f7 78 maintain(RB_RIGHT);
IonSystems 12:814a8fdbb6f7 79 sendCharacter('O');
IonSystems 23:f9e7e64784be 80 break;
IonSystems 20:6de191ac7ff3 81 }
IonSystems 20:6de191ac7ff3 82 {
IonSystems 10:8c0696b99692 83 case 's':
IonSystems 12:814a8fdbb6f7 84 maintain(GO_UP);
IonSystems 12:814a8fdbb6f7 85 sendCharacter('S');
IonSystems 23:f9e7e64784be 86 break;
IonSystems 20:6de191ac7ff3 87 }
IonSystems 20:6de191ac7ff3 88 {
IonSystems 10:8c0696b99692 89 case 't':
IonSystems 12:814a8fdbb6f7 90 maintain(GO_CENTRE);
IonSystems 12:814a8fdbb6f7 91 sendCharacter('T');
IonSystems 23:f9e7e64784be 92 break;
IonSystems 20:6de191ac7ff3 93 }
IonSystems 20:6de191ac7ff3 94 {
IonSystems 10:8c0696b99692 95 case 'u':
IonSystems 12:814a8fdbb6f7 96 maintain(GO_DOWN);
IonSystems 12:814a8fdbb6f7 97 sendCharacter('U');
IonSystems 23:f9e7e64784be 98 break;
IonSystems 20:6de191ac7ff3 99 }
IonSystems 23:f9e7e64784be 100
IonSystems 20:6de191ac7ff3 101 {
IonSystems 10:8c0696b99692 102 case 'v':
IonSystems 12:814a8fdbb6f7 103 maintain(BR_LEFT);
IonSystems 12:814a8fdbb6f7 104 sendCharacter('V');
IonSystems 23:f9e7e64784be 105 break;
IonSystems 20:6de191ac7ff3 106 }
IonSystems 20:6de191ac7ff3 107 {
IonSystems 10:8c0696b99692 108 case 'w':
IonSystems 22:8f11d1c178ab 109 maintain(BR_RIGHT);
IonSystems 12:814a8fdbb6f7 110 sendCharacter('O');
IonSystems 23:f9e7e64784be 111 break;
IonSystems 20:6de191ac7ff3 112 }
IonSystems 20:6de191ac7ff3 113 {
IonSystems 10:8c0696b99692 114 case 'j':
IonSystems 10:8c0696b99692 115 sort(RED);
IonSystems 10:8c0696b99692 116 sendCharacter('J');
IonSystems 23:f9e7e64784be 117 break;
IonSystems 20:6de191ac7ff3 118 }
IonSystems 20:6de191ac7ff3 119 {
IonSystems 10:8c0696b99692 120 case 'k':
IonSystems 10:8c0696b99692 121 sort(GREEN);
IonSystems 10:8c0696b99692 122 sendCharacter('K');
IonSystems 23:f9e7e64784be 123 break;
IonSystems 20:6de191ac7ff3 124 }
IonSystems 20:6de191ac7ff3 125 {
IonSystems 10:8c0696b99692 126 case 'l':
IonSystems 10:8c0696b99692 127 sort(BLUE);
IonSystems 10:8c0696b99692 128 sendCharacter('L');
IonSystems 23:f9e7e64784be 129 break;
IonSystems 20:6de191ac7ff3 130 }
IonSystems 20:6de191ac7ff3 131 {
IonSystems 23:f9e7e64784be 132
IonSystems 18:12e2c82a5a6c 133 case '0': //Dispense all
IonSystems 12:814a8fdbb6f7 134 dispenseAll();
IonSystems 18:12e2c82a5a6c 135 sendCharacter('1');
IonSystems 23:f9e7e64784be 136 break;
IonSystems 20:6de191ac7ff3 137 }
IonSystems 20:6de191ac7ff3 138 {
IonSystems 19:78d4b78fa736 139 case '2':
IonSystems 19:78d4b78fa736 140 maintain(GO_CENTRE);
IonSystems 19:78d4b78fa736 141 maintain(RB_CENTRE);
IonSystems 19:78d4b78fa736 142 sendCharacter('3');
IonSystems 23:f9e7e64784be 143 break;
IonSystems 20:6de191ac7ff3 144 }
IonSystems 20:6de191ac7ff3 145 {
IonSystems 20:6de191ac7ff3 146 case '4':
IonSystems 23:f9e7e64784be 147 lift();
IonSystems 23:f9e7e64784be 148 sendCharacter('5');
IonSystems 23:f9e7e64784be 149 break;
IonSystems 20:6de191ac7ff3 150 }
IonSystems 22:8f11d1c178ab 151 {
IonSystems 22:8f11d1c178ab 152 case 'e':
IonSystems 23:f9e7e64784be 153 recycle();
IonSystems 23:f9e7e64784be 154 sendCharacter('E');
IonSystems 23:f9e7e64784be 155 break;
IonSystems 22:8f11d1c178ab 156 }
IonSystems 23:f9e7e64784be 157 }
IonSystems 23:f9e7e64784be 158 }
IonSystems 23:f9e7e64784be 159
IonSystems 23:f9e7e64784be 160 /*else if (operationMode){
IonSystems 23:f9e7e64784be 161 switch(c){
IonSystems 23:f9e7e64784be 162 case 'n':// Start sorting
IonSystems 23:f9e7e64784be 163 sendCharacter('N'); //Confirm to PC that we are processing the instruction.
IonSystems 23:f9e7e64784be 164 startSort = true; //Pulse the startSort control line to FPGA
IonSystems 23:f9e7e64784be 165 wait(0.1);
IonSystems 23:f9e7e64784be 166 startSort = false;
IonSystems 23:f9e7e64784be 167 break;
IonSystems 23:f9e7e64784be 168 case 'o': //Start dispensing
IonSystems 23:f9e7e64784be 169 sendCharacter('O');
IonSystems 23:f9e7e64784be 170 startDispense = true; //Pulse the startDispense control line to FPGA
IonSystems 23:f9e7e64784be 171 wait(0.1);
IonSystems 23:f9e7e64784be 172 startDispense = false;
IonSystems 23:f9e7e64784be 173 break;
IonSystems 23:f9e7e64784be 174 case 'p': //
IonSystems 23:f9e7e64784be 175 sendCharacter('P');
IonSystems 23:f9e7e64784be 176 break;
IonSystems 10:8c0696b99692 177 }
IonSystems 23:f9e7e64784be 178 }
IonSystems 10:8c0696b99692 179 }*/
IonSystems 23:f9e7e64784be 180 bool checkSerial()
IonSystems 23:f9e7e64784be 181 {
IonSystems 10:8c0696b99692 182 printLCD("");
IonSystems 23:f9e7e64784be 183 if(pc.readable()) {
IonSystems 10:8c0696b99692 184 char c = pc.getc();
IonSystems 10:8c0696b99692 185 processMessage(c);
IonSystems 10:8c0696b99692 186 return true;
IonSystems 23:f9e7e64784be 187 } else {
IonSystems 10:8c0696b99692 188 return false;
IonSystems 10:8c0696b99692 189 }
IonSystems 6:e64796f1f384 190 }
IonSystems 23:f9e7e64784be 191 bool readCharacter()
IonSystems 23:f9e7e64784be 192 {
IonSystems 10:8c0696b99692 193 char c = pc.getc(); //wait for a serial character to be recieved.
IonSystems 10:8c0696b99692 194 processMessage(c); //Do something, based on the character recieved.
IonSystems 10:8c0696b99692 195 return true;
IonSystems 6:e64796f1f384 196 }
IonSystems 23:f9e7e64784be 197
IonSystems 15:0c5f20e15b6a 198 /* Set the PC's laguage to whatever our language is
IonSystems 15:0c5f20e15b6a 199 */
IonSystems 23:f9e7e64784be 200 void sendLanguageCharacter()
IonSystems 23:f9e7e64784be 201 {
IonSystems 23:f9e7e64784be 202 switch(currentLanguage) {
IonSystems 15:0c5f20e15b6a 203 case ENGLISH:
IonSystems 23:f9e7e64784be 204 printLCD("Setting language to English");
IonSystems 23:f9e7e64784be 205 sendCharacter('Y');
IonSystems 23:f9e7e64784be 206 printLCD("Language set to English");
IonSystems 23:f9e7e64784be 207 break;
IonSystems 23:f9e7e64784be 208
IonSystems 15:0c5f20e15b6a 209 case FRENCH:
IonSystems 23:f9e7e64784be 210 printLCD("Setting language to French");
IonSystems 23:f9e7e64784be 211 sendCharacter('Z');
IonSystems 23:f9e7e64784be 212 printLCD("Language set to French");
IonSystems 23:f9e7e64784be 213 break;
IonSystems 23:f9e7e64784be 214
IonSystems 15:0c5f20e15b6a 215 case GERMAN:
IonSystems 23:f9e7e64784be 216 printLCD("Setting language to German");
IonSystems 23:f9e7e64784be 217 sendCharacter('!');
IonSystems 23:f9e7e64784be 218 printLCD("Language set to German");
IonSystems 23:f9e7e64784be 219 break;
IonSystems 15:0c5f20e15b6a 220 }
IonSystems 23:f9e7e64784be 221 }
IonSystems 6:e64796f1f384 222
IonSystems 10:8c0696b99692 223