
ControllerBox directs electromechanical equipment in restaurants to display information.
Dependencies: TextLCD MbedJSONValue libMotiv picojson mbed-rtos mbed
Fork of Mbed_MotiVControllerBox by
libMotiv/Controller.cpp
- Committer:
- TimWoo
- Date:
- 2015-01-06
- Revision:
- 5:e22a1ae893d2
- Parent:
- 3:21c8adb97c8f
- Child:
- 6:32e6f0048bf1
File content as of revision 5:e22a1ae893d2:
#include <string> #include <stdlib.h> #include "TextLCD.h" #include "Controller.h" #include "Device.h" #include "Table.h" #include "Flower.h" #include "picojson.h" #include "MotiVAPI.h" #include "EthernetInterface.h" #include "HTTPClient.h" #include <exception> #include <iostream> #include <sstream> //Flower commands // fRESET = 0, // fPETAL_SPD = 1, // fBLINK_SPD = 2, // fBLINK_PERIOD = 3, // fLED_INTENSITY = 4, // fPETAL_POS = 10, // fLED_TABLE_FREE = 20, // fLED_TABLE_RES = 21, // fLED_FOOD = 22, // fLED_DRINK = 23, // fLED_SERVICE = 24, // fLED_CLR = 29, //// Flower version 2 commands n/a for now. //// fPISTIL_SPD = 3, //// fPETAL1_POS = 11, //// fPETAL2_POS = 12, //// fPETAL3_POS = 13, //// fPETAL4_POS = 14, //// fPETAL5_POS = 15, //// fPETAL6_POS = 16, //// fPISTIL_POS_FOOD = 30, //// fPISTIL_POS_DRINKS = 31, //// fPISTIL_POS_SERVICE = 32 // fTABLE_FREE = 50, // fTABLE_ACTIVE = 51, // fTABLE_RES = 52, // fTABLE_END = 53, // fFOOD_ORDERED = 54, // fDRINKS_ORDERED = 55, // fSERVICE_REQ = 56, // fPETALS_CLOSE = 60, // fLAMP_ACT = 100, // fDEMO1 = 101, // fDEMO2 = 102 //Flower commands v2 //Functie Waarde(n) Doel // //Primaire functies // //0* 0 Reset (Zet alle waarden terug naar default) //1* 0 – 100 Zet bewegingssnelheid van de bladeren (0 langzaam, 100 snel) //2 0 – 100 Zet knippersnelheid van de verlichting (in %) //3 0 – 255 Zet knipperlengte van de verlichting (in sec) //4 0 – 100 Zet de lichtintensiteit van de LEDstrip (0 – 100 %) //5 0 – 100 Zet bewegingssnelheid van de stampers (Niet beschikbaar in bloem versie 1) //6 0 – 255 Zet tijd //10* 0 – 100 Zet de positie van de bloembladeren (0 dicht, 100 open) //11 – 18 0 – 100 Zet de positie van (max. 8) individuele bloembladeren (0 dicht, 100 open) (Niet beschikbaar in bloem versie 1) //20* 0 … 1 Zet led “tafel vrij” //21* 0 … 1 Zet led “tafel gereserveerd” //22* 0 … 1 Zet led F(ood) //23* 0 … 1 Zet led D(rink) //24* 0 … 1 Zet led S(ervice) //29 0 … 1 Zet led verlichting (standaard wit) //30 0 – 100 Zet hoogte van stamper F(ood) (Niet beschikbaar in bloem versie 1) //31 0 – 100 Zet hoogte van stamper D(rink) (Niet beschikbaar in bloem versie 1) //32 0 – 100 Zet hoogte van stamper S(ervice) (Niet beschikbaar in bloem versie 1) //Complexe functies //50* 1 Zet bloem naar stand “Tafel vrij” (Gesloten groen) //51* 1 Zet bloem naar stand “Tafel in gebruik” (Open groen) //52* 1 Zet bloem naar stand “Tafel gereserveerd” (Gesloten rood) //53* 1 Zet bloem naar stand “Zittingstijd om” (Open rood) //54* 0 – 100 Zet bloem naar stand “Eten besteld” met x% bestelstatus //55* 0 – 100 Zet bloem naar stand “Drank besteld” met x% bestelstatus //56* 0 – 100 Zet bloem naar stand “Bediening gevraagd” met x% bestelstatus //60 1 Bloem sluit al naar gelang de ingestelde tijd //61 1 Zet bloem naar status “zittingstijd om”. (“Gereserveerd rood knipperen”) //100 1 Lampfunctie (Bloem opent een klein beetje en fungeert als lamp) //101 1 Demostand 1 (Bloem gaat continu open en dicht en alle leds wisselen) //102 0 – 100 Demostand 2 (Bloem opent naar stand X en statusleds wisselen) //#include "MotiVAPI.h" //Test endpoint: http://demo.motiv.jvanbaarsen.com/demo/test using namespace std; void debug_build_number() { printf("\r\n\r\nBuild "); printf(__DATE__); printf(" - "); printf(__TIME__); printf("\r\n\r\n"); } Controller::Controller() {} Controller::Controller(TextLCD *lcd/*, EthernetInterface *eth*/) : initialized(false), lcd(lcd), status(WAITING) { debug_build_number(); //show build info printf("Controller constructor\r\n"); mAPI = new MotiVAPI("http://core.motiv.jvanbaarsen.com/v1/"); //Initialize API setStatus(WAITING); displayStatus(); } void Controller::init() { initialized = true; mAPI->init(); initTables(); } void Controller::printDesc(int c) { // string desc = flower->getCommandDesc(c); // lcdWriteLine(2, desc); } Controller::cStatus Controller::getStatus() { return this->status; } string Controller::statusString() { switch(status) { case READY: return "ready"; case WAITING: return "waiting"; case BUSY: return "busy"; case ERROR: return "error"; case INIT: return "intializing"; default: return "unknown"; } } void Controller::setStatus(cStatus status) { this->status = status; displayStatus(); } void Controller::displayStatus() { printf("Controller::displayStatus()\r\n"); this->lcd->locate(0,0); this->lcd->clearLine(); this->lcd->locate(0,0); this->lcd->printf("Status: %s", statusString()); } void Controller::lcdWriteLine(int row, string str) { this->lcd->locate(0,row); this->lcd->clearLine(); this->lcd->locate(0,row); this->lcd->printf("%s", str); } //void Controller::nextCommand() //{ // std::vector<MCommand>::iterator it; // it = commandList->begin(); // it = commandList->insert(it, commandList->back()); // it = commandList->begin(); // commandList->pop_back(); // it = commandList->begin(); // MCommand command = *it; // printDesc(command->getCmd()); //} void Controller::prevCommand() { } void Controller::sendCommandDem() { } void Controller::printCommandList() { if(!initialized) { printf("Error: Controller must be initialized before calling %s!\r\n", __PRETTY_FUNCTION__); return; } printf("\r\nCommand list printing\r\n\r\n"); if(commandList.size()) { printf("The command list contains %d commands\r\n", commandList.size()); for(std::vector<MCommand>::iterator it = commandList.begin(); it != commandList.end(); ++it) { /* std::cout << *it; ... */ it->print(); } } else { printf("Command list empty\r\n"); } } void Controller::initTables() { printf("initTables\r\n"); picojson::array allTables = mAPI->getTablesAll().get("tables").get<picojson::array>(); printf("get first table\r\n"); picojson::value table = (picojson::value)allTables.begin(); int tableId = table.get("id"); printf("First table id is %d\r\n", tableId); //for (picojson::array::iterator iter = list.begin(); iter != list.end(); ++iter) { // printf("menu item value =%s\r\n", (*iter).get("v").get<string>().c_str()); // } } void Controller::testRequest() { mAPI->getTablesAll(); } //Controller::Controller(TextLCD *lcd): // status(WAITING), // lcd(lcd) //{ // debug_build_number(); // printf("Controller constructor\r\n"); //// this->lcd = lcd; // //setStatus(WAITING); //// mAPI = new MotiVAPI("http://core.motiv.jvanbaarsen.com/v1/"); // displayStatus(); //// devices.push_back(new <Device>Flower(1)); //// devices.append(new Flower(2)); //// devices.append(new Flower(3)); // //// tables.append(new Table(1)); //// tables.append(new Table(2)); //// tables.append(new Table(3)); // // //tables stores Tables // //Tables can be updated with information // //Tables can be asked for commands to send // //Tables will check changes between new info (this API update) and old info (previous API update) // //Tables can use the Flower interface to build commands // // // //Would like to have: // //Sending commands in different thread than receiving api update // //Commands then put into shared object commandQueue (FIFO) // //// initTables(); // //// Test //// Table table(1); //// Table table2(2); //// vector<MCommand> insertVector; //// insertVector = table.update(1,0,0,0); //// printf("Updated first table\r\n"); //// commandList.insert(commandList.begin(), insertVector.begin(), insertVector.end()); //// printCommandList(); //// insertVector = table2.update(2,0,0,0); //// printf("Updated second table\r\n"); //// commandList.insert(commandList.begin(), insertVector.begin(), insertVector.end()); //}