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 Dec 03 17:49:41 2014 +0000
Revision:
24:8868101d01d0
Parent:
23:f9e7e64784be
Child:
27:47a7bc902587
Commented the .h files from top to bottom, got half way through FPGAcomms

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