Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MCP23017 TCS3472_I2C WattBob_TextLCD mbed-rtos mbed
main.cpp
- Committer:
- IonSystems
- Date:
- 2014-12-05
- Revision:
- 28:bdf2bf56f97b
- Parent:
- 27:47a7bc902587
File content as of revision 28:bdf2bf56f97b:
bool operationMode = true; //the MBED starts in operation mode. #include "mbed.h" Serial pc(USBTX, USBRX); Serial glcd(p13, p14); #include "rtos.h" #include "Language.h" DigitalIn languageButton(p30); Language currentLanguage = ENGLISH; #include <sstream> #include <string> #include "mbedStorage.h" #include "mbedLCD.h" #include "stateMachine.h" #include "FPGAcomms.h" #ifndef serialComm #define serialComm #include "serialCommunication.h" #endif DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); StateMachine stateMachine; //Boolean values to easily enable and disable certain features for individual testing bool colourSensor = true; bool cardReader = true; bool sorter = true; bool dispensor = true; bool testFunctions = true; bool serialComms = true; int mode = 0; //mode select int maintenanceModeSelect = 0; //Call to check if an MBED button is pressed bool buttonPressed(int buttonNumber) { if(buttonNumber > -1 && buttonNumber < 4) { return par_port->read_bit(buttonNumber + 8); } return false; } //Run a mode, defined by 'mode'. void checkSortDispenseButtons() { if(buttonPressed(3)) { mode = !mode; } /* NOTICE: Enable the modes below for more maintenace functions, good for debugging. */ /* if(mode == 0) { //Dispense Mode printLCD("Dispense Mode"); operationMode=false; if(buttonPressed(0)) { printLCD("Red Button pressed"); dispense(RED); } else if(buttonPressed(1)) { printLCD("Green Button pressed"); dispense(GREEN); } else if(buttonPressed(2)) { printLCD("Blue Button pressed"); dispense(BLUE); } } *//*else if(mode == 1) { //Sort Mode printLCD("Sort Mode"); operationMode=false; if(buttonPressed(0)) { log("Red Button pressed"); sort(RED); } else if(buttonPressed(1)) { log("Green Button pressed"); sort(GREEN); } else if(buttonPressed(2)) { log("Blue Button pressed"); sort(BLUE); } }*//* else if(mode == 2) { //Bin/Recycle Mode printLCD("Bin/Recycle Mode"); operationMode=false; if(buttonPressed(0)) { log("Bin button pressed"); sort(BIN); } else if(buttonPressed(1)) { log("Recycle Button"); recycle(); } } */ /*else if(mode == 4) { //Card Reader Mode operationMode= true; if(cardReader && cardDetect) { cardAcquisition(); }*/ if(mode == 0) { //Storage Mode operationMode=true; stringstream ss; ss << "Operation: " << "R:" << redAmount << "G:" << greenAmount << "B:" << blueAmount << "RE:" << recycleAmount; string tmp = ss.str(); printLCD(tmp.c_str()); wait(0.1); if(buttonPressed(0)) { //log("Dispense all button pressed"); dispenseAll(); } else if(buttonPressed(1)) { //log("Clear stored numbers button pressed"); writeFile(0,0,0,recycleAmount); redAmount = 0; greenAmount = 0; blueAmount = 0; printLCD("Cleared values"); } else if(buttonPressed(2)) { //log("Increment all stored values by 2."); redAmount += 2; greenAmount += 2; blueAmount += 2; writeFile(redAmount,greenAmount,blueAmount,recycleAmount); printLCD("set values to 2"); } } else if(mode == 1) { operationMode = false; stringstream ss; ss << maintenanceModeSelect; string mainModeSelect = ss.str(); printLCD("Maintenance: " + mainModeSelect); wait(0.1); //Maintenance Mode if(buttonPressed(0)) { //Next maintenance function maintenanceModeSelect++; if(maintenanceModeSelect > 13) maintenanceModeSelect = 0; } else if(buttonPressed(1)) { //Previous maintenance function maintenanceModeSelect--; if(maintenanceModeSelect < 0) maintenanceModeSelect = 13; } else if(buttonPressed(2)) { //Process Instruction switch(maintenanceModeSelect) { case 0://RB_LEFT: printLCD("Moving Red/Blue Slider left."); maintain(RB_LEFT); break; case 1://RB_CENTRE: printLCD("Centering Red/Blue Slider."); maintain(RB_CENTRE); break; case 2://RB_RIGHT: printLCD("Moving Red/Blue Slider right."); maintain(RB_RIGHT); break; case 3://GO_UP: printLCD("Moving Green Slider up."); maintain(GO_UP); break; case 4://GO_CENTRE: printLCD("Centering Green Slider."); maintain(GO_CENTRE); break; case 5://GO_DOWN: printLCD("Moving Green Slider down."); maintain(GO_DOWN); break; case 6://BR_LEFT: printLCD("Moving Bin Slider left."); maintain(BR_LEFT); break; case 7://BR_RIGHT: printLCD("Moving Bin Slider right."); maintain(BR_RIGHT); break; case 8://R_PUSH: printLCD("Pushing red dispensor"); maintain(R_PUSH); break; case 9://R_HOME: printLCD("Homing red dispensor"); maintain(R_HOME); break; case 10://GB_LEFT: printLCD("Pushing green dispensor"); maintain(GB_LEFT); break; case 11://GB_CENTRE: printLCD("Centre green/blue dispensor"); maintain(GB_CENTRE); break; case 12://GB_RIGHT: printLCD("Pushing blue dispensor"); maintain(GB_RIGHT ); break; case 13: //MaintenanceEND printLCD("Ending Maintenance Mode"); maintain(maintenanceEND); break; } printLCD("Ready for next command"); wait(1); } } } //Coordinate changing language on PC and Arduino. void changeLanguage() { currentLanguage = nextLanguage(currentLanguage); //Change the language on teh MBED. sendLanguageCharacter(); //Tell PC & Arduino to change language. wait(1); } /* void sortFunction() * Read sensor and sort according to the colour. */ void sortFunction() { //Read the colour twice and make sure both are the same. If not then return and try again. Thread::wait(100); Colour colour = readColourSensor(); Thread::wait(100); Colour colour2 = readColourSensor(); if(colour != colour2) { return; } //Ensure a bin read is valid by ensuring it is the same as earlier. Prevents a bin read being valid if the chip is out of place on the sensor. if(colour == BIN) { Thread::wait(100); Colour binCheck = readColourSensor(); if(binCheck != colour) { return; } } //log("Sorting colour"); sort(colour); } //Run sortFunction with a small delay between iterations, pulses LED. void sortMode(void const* args) { while(colourSensor && sorter) { if(operationMode) { led2 = 1; sortFunction(); led2 = 0; Thread::wait(50); } } } bool pcReady = false; //Defines whether the PC is ready to accept characters on the COM port. //handles dispensing from a card, changing language void dispenseFunction() { if(!pcReady) { if(pc.getc() == '*') { pcReady = true; } } else { //Check language button if(languageButton) { changeLanguage(); } if(cardReader && cardDetect) { //Read card int cardNumber = cardAcquisition(); //Send message to pc pc.putc('*'); wait(0.5); //Send card number to pc pc.printf("%i\n",cardNumber); int red = 0; int green = 0; int blue = 0; //Get order from pc, convert characters to integers. red = (int) pc.getc() - '0'; green = (int) pc.getc() - '0'; blue = (int) pc.getc() - '0'; //Check if there are enough chips to dispense order Thread::wait(100); if(red > redAmount || green > greenAmount || blue > blueAmount) { //If not then do not dispense pc.putc('<'); pcReady = false; } else if(red ==0 && green == 0 && blue ==0) { pc.putc('@'); pcReady = false; } else { //Otherwise there are enough tokens so dispense the order pc.putc('>'); //Display order on LCD glcd.putc(27); glcd.putc(18); glcd.putc(red + '0'); //Convert int to char glcd.putc(green + '0');//Convert int to char glcd.putc(blue + '0');//Convert int to char glcd.putc(255); //Dispense Order dispenseOrder(red,green,blue); //Display finished dispensing on lcd glcd.putc(27); glcd.putc(19); glcd.putc(255); //Reset pc ready pcReady = false; wait(1); pc.putc('('); } } } } //Runs dispenseFunction with a small delay between iterations, pulses LED. void dispenseMode(void const* args) { while(true) { if(operationMode) { led3 = 1; dispenseFunction(); led3 =0; Thread::wait(50); } } } int main() { led1 = 0; setupLCD(); printLCD("Welcome to the Chipin Sorter"); Thread::wait(1000); readChipNumbers(); printStoredChipValues(); printLCD("Resetting all sliders"); maintain(maintenanceEND); //reset sliders on FPGA printLCD(""); Thread::wait(1000); sendLanguageCharacter(); //Synchronise language on PC and arduino Thread sortThread(sortMode); //Start the sorting thread. if(!languageButton) { //Decide whether to start in operation mode or maintenance mode. operationMode = true; mode = 0; } else { operationMode = false; mode = 1; } Thread dispenseThread(dispenseMode); //Start the dispensing thread. while(true) { led1 = 1; //pulse led1 led4 = cardDetect; if(!operationMode) { //Check for maintenance commands if in maintenance mode. checkSerial(); } if(testFunctions) checkSortDispenseButtons(); //Run the MBED modes if enabled. Thread::wait(100); led1=0; Thread::wait(100); } }