ControllerBox directs electromechanical equipment in restaurants to display information.

Dependencies:   TextLCD MbedJSONValue libMotiv picojson mbed-rtos mbed

Fork of Mbed_MotiVControllerBox by Tim Wöstemeier

Committer:
TimWoo
Date:
Tue Jan 06 22:41:10 2015 +0000
Revision:
6:32e6f0048bf1
Parent:
5:e22a1ae893d2
Some changes to MbedJSONValue. Makes no difference...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TimWoo 3:21c8adb97c8f 1 #include <string>
TimWoo 3:21c8adb97c8f 2 #include <stdlib.h>
TimWoo 3:21c8adb97c8f 3 #include "TextLCD.h"
TimWoo 3:21c8adb97c8f 4 #include "Controller.h"
TimWoo 3:21c8adb97c8f 5 #include "Device.h"
TimWoo 3:21c8adb97c8f 6 #include "Table.h"
TimWoo 3:21c8adb97c8f 7 #include "Flower.h"
TimWoo 5:e22a1ae893d2 8 #include "picojson.h"
TimWoo 6:32e6f0048bf1 9 #include "MbedJSONValue.h"
TimWoo 5:e22a1ae893d2 10 #include "MotiVAPI.h"
TimWoo 5:e22a1ae893d2 11 #include "EthernetInterface.h"
TimWoo 5:e22a1ae893d2 12 #include "HTTPClient.h"
TimWoo 3:21c8adb97c8f 13
TimWoo 3:21c8adb97c8f 14 #include <exception>
TimWoo 3:21c8adb97c8f 15 #include <iostream>
TimWoo 5:e22a1ae893d2 16 #include <sstream>
TimWoo 5:e22a1ae893d2 17
TimWoo 3:21c8adb97c8f 18 //Flower commands
TimWoo 3:21c8adb97c8f 19 // fRESET = 0,
TimWoo 3:21c8adb97c8f 20 // fPETAL_SPD = 1,
TimWoo 3:21c8adb97c8f 21 // fBLINK_SPD = 2,
TimWoo 3:21c8adb97c8f 22 // fBLINK_PERIOD = 3,
TimWoo 3:21c8adb97c8f 23 // fLED_INTENSITY = 4,
TimWoo 3:21c8adb97c8f 24 // fPETAL_POS = 10,
TimWoo 3:21c8adb97c8f 25 // fLED_TABLE_FREE = 20,
TimWoo 3:21c8adb97c8f 26 // fLED_TABLE_RES = 21,
TimWoo 3:21c8adb97c8f 27 // fLED_FOOD = 22,
TimWoo 3:21c8adb97c8f 28 // fLED_DRINK = 23,
TimWoo 3:21c8adb97c8f 29 // fLED_SERVICE = 24,
TimWoo 3:21c8adb97c8f 30 // fLED_CLR = 29,
TimWoo 3:21c8adb97c8f 31 //// Flower version 2 commands n/a for now.
TimWoo 3:21c8adb97c8f 32 //// fPISTIL_SPD = 3,
TimWoo 3:21c8adb97c8f 33 //// fPETAL1_POS = 11,
TimWoo 3:21c8adb97c8f 34 //// fPETAL2_POS = 12,
TimWoo 3:21c8adb97c8f 35 //// fPETAL3_POS = 13,
TimWoo 3:21c8adb97c8f 36 //// fPETAL4_POS = 14,
TimWoo 3:21c8adb97c8f 37 //// fPETAL5_POS = 15,
TimWoo 3:21c8adb97c8f 38 //// fPETAL6_POS = 16,
TimWoo 3:21c8adb97c8f 39 //// fPISTIL_POS_FOOD = 30,
TimWoo 3:21c8adb97c8f 40 //// fPISTIL_POS_DRINKS = 31,
TimWoo 3:21c8adb97c8f 41 //// fPISTIL_POS_SERVICE = 32
TimWoo 3:21c8adb97c8f 42 // fTABLE_FREE = 50,
TimWoo 3:21c8adb97c8f 43 // fTABLE_ACTIVE = 51,
TimWoo 3:21c8adb97c8f 44 // fTABLE_RES = 52,
TimWoo 3:21c8adb97c8f 45 // fTABLE_END = 53,
TimWoo 3:21c8adb97c8f 46 // fFOOD_ORDERED = 54,
TimWoo 3:21c8adb97c8f 47 // fDRINKS_ORDERED = 55,
TimWoo 3:21c8adb97c8f 48 // fSERVICE_REQ = 56,
TimWoo 3:21c8adb97c8f 49 // fPETALS_CLOSE = 60,
TimWoo 3:21c8adb97c8f 50 // fLAMP_ACT = 100,
TimWoo 3:21c8adb97c8f 51 // fDEMO1 = 101,
TimWoo 3:21c8adb97c8f 52 // fDEMO2 = 102
TimWoo 3:21c8adb97c8f 53 //Flower commands v2
TimWoo 3:21c8adb97c8f 54 //Functie Waarde(n) Doel
TimWoo 3:21c8adb97c8f 55 //
TimWoo 3:21c8adb97c8f 56 //Primaire functies
TimWoo 3:21c8adb97c8f 57 //
TimWoo 3:21c8adb97c8f 58 //0* 0 Reset (Zet alle waarden terug naar default)
TimWoo 3:21c8adb97c8f 59 //1* 0 – 100 Zet bewegingssnelheid van de bladeren (0 langzaam, 100 snel)
TimWoo 3:21c8adb97c8f 60 //2 0 – 100 Zet knippersnelheid van de verlichting (in %)
TimWoo 3:21c8adb97c8f 61 //3 0 – 255 Zet knipperlengte van de verlichting (in sec)
TimWoo 3:21c8adb97c8f 62 //4 0 – 100 Zet de lichtintensiteit van de LEDstrip (0 – 100 %)
TimWoo 3:21c8adb97c8f 63 //5 0 – 100 Zet bewegingssnelheid van de stampers (Niet beschikbaar in bloem versie 1)
TimWoo 3:21c8adb97c8f 64 //6 0 – 255 Zet tijd
TimWoo 3:21c8adb97c8f 65 //10* 0 – 100 Zet de positie van de bloembladeren (0 dicht, 100 open)
TimWoo 3:21c8adb97c8f 66 //11 – 18 0 – 100 Zet de positie van (max. 8) individuele bloembladeren (0 dicht, 100 open) (Niet beschikbaar in bloem versie 1)
TimWoo 3:21c8adb97c8f 67 //20* 0 … 1 Zet led “tafel vrij”
TimWoo 3:21c8adb97c8f 68 //21* 0 … 1 Zet led “tafel gereserveerd”
TimWoo 3:21c8adb97c8f 69 //22* 0 … 1 Zet led F(ood)
TimWoo 3:21c8adb97c8f 70 //23* 0 … 1 Zet led D(rink)
TimWoo 3:21c8adb97c8f 71 //24* 0 … 1 Zet led S(ervice)
TimWoo 3:21c8adb97c8f 72 //29 0 … 1 Zet led verlichting (standaard wit)
TimWoo 3:21c8adb97c8f 73 //30 0 – 100 Zet hoogte van stamper F(ood) (Niet beschikbaar in bloem versie 1)
TimWoo 3:21c8adb97c8f 74 //31 0 – 100 Zet hoogte van stamper D(rink) (Niet beschikbaar in bloem versie 1)
TimWoo 3:21c8adb97c8f 75 //32 0 – 100 Zet hoogte van stamper S(ervice) (Niet beschikbaar in bloem versie 1)
TimWoo 3:21c8adb97c8f 76 //Complexe functies
TimWoo 3:21c8adb97c8f 77 //50* 1 Zet bloem naar stand “Tafel vrij” (Gesloten groen)
TimWoo 3:21c8adb97c8f 78 //51* 1 Zet bloem naar stand “Tafel in gebruik” (Open groen)
TimWoo 3:21c8adb97c8f 79 //52* 1 Zet bloem naar stand “Tafel gereserveerd” (Gesloten rood)
TimWoo 3:21c8adb97c8f 80 //53* 1 Zet bloem naar stand “Zittingstijd om” (Open rood)
TimWoo 3:21c8adb97c8f 81 //54* 0 – 100 Zet bloem naar stand “Eten besteld” met x% bestelstatus
TimWoo 3:21c8adb97c8f 82 //55* 0 – 100 Zet bloem naar stand “Drank besteld” met x% bestelstatus
TimWoo 3:21c8adb97c8f 83 //56* 0 – 100 Zet bloem naar stand “Bediening gevraagd” met x% bestelstatus
TimWoo 3:21c8adb97c8f 84 //60 1 Bloem sluit al naar gelang de ingestelde tijd
TimWoo 3:21c8adb97c8f 85 //61 1 Zet bloem naar status “zittingstijd om”. (“Gereserveerd rood knipperen”)
TimWoo 3:21c8adb97c8f 86 //100 1 Lampfunctie (Bloem opent een klein beetje en fungeert als lamp)
TimWoo 3:21c8adb97c8f 87 //101 1 Demostand 1 (Bloem gaat continu open en dicht en alle leds wisselen)
TimWoo 3:21c8adb97c8f 88 //102 0 – 100 Demostand 2 (Bloem opent naar stand X en statusleds wisselen)
TimWoo 3:21c8adb97c8f 89
TimWoo 3:21c8adb97c8f 90 //#include "MotiVAPI.h"
TimWoo 3:21c8adb97c8f 91
TimWoo 5:e22a1ae893d2 92
TimWoo 5:e22a1ae893d2 93
TimWoo 5:e22a1ae893d2 94
TimWoo 5:e22a1ae893d2 95
TimWoo 3:21c8adb97c8f 96 //Test endpoint: http://demo.motiv.jvanbaarsen.com/demo/test
TimWoo 3:21c8adb97c8f 97 using namespace std;
TimWoo 3:21c8adb97c8f 98
TimWoo 5:e22a1ae893d2 99
TimWoo 5:e22a1ae893d2 100 void debug_build_number()
TimWoo 3:21c8adb97c8f 101 {
TimWoo 5:e22a1ae893d2 102 printf("\r\n\r\nBuild ");
TimWoo 5:e22a1ae893d2 103 printf(__DATE__);
TimWoo 5:e22a1ae893d2 104 printf(" - ");
TimWoo 5:e22a1ae893d2 105 printf(__TIME__);
TimWoo 5:e22a1ae893d2 106 printf("\r\n\r\n");
TimWoo 5:e22a1ae893d2 107 }
TimWoo 3:21c8adb97c8f 108
TimWoo 5:e22a1ae893d2 109 Controller::Controller()
TimWoo 5:e22a1ae893d2 110 {}
TimWoo 3:21c8adb97c8f 111
TimWoo 5:e22a1ae893d2 112 Controller::Controller(TextLCD *lcd/*, EthernetInterface *eth*/)
TimWoo 5:e22a1ae893d2 113 : initialized(false),
TimWoo 5:e22a1ae893d2 114 lcd(lcd),
TimWoo 5:e22a1ae893d2 115 status(WAITING)
TimWoo 5:e22a1ae893d2 116 {
TimWoo 5:e22a1ae893d2 117 debug_build_number(); //show build info
TimWoo 5:e22a1ae893d2 118 printf("Controller constructor\r\n");
TimWoo 3:21c8adb97c8f 119
TimWoo 5:e22a1ae893d2 120 mAPI = new MotiVAPI("http://core.motiv.jvanbaarsen.com/v1/"); //Initialize API
TimWoo 3:21c8adb97c8f 121
TimWoo 5:e22a1ae893d2 122 setStatus(WAITING);
TimWoo 5:e22a1ae893d2 123 displayStatus();
TimWoo 5:e22a1ae893d2 124 }
TimWoo 3:21c8adb97c8f 125
TimWoo 5:e22a1ae893d2 126 void Controller::init()
TimWoo 5:e22a1ae893d2 127 {
TimWoo 5:e22a1ae893d2 128 initialized = true;
TimWoo 5:e22a1ae893d2 129 mAPI->init();
TimWoo 5:e22a1ae893d2 130
TimWoo 5:e22a1ae893d2 131 initTables();
TimWoo 3:21c8adb97c8f 132 }
TimWoo 3:21c8adb97c8f 133
TimWoo 3:21c8adb97c8f 134 void Controller::printDesc(int c)
TimWoo 3:21c8adb97c8f 135 {
TimWoo 3:21c8adb97c8f 136 // string desc = flower->getCommandDesc(c);
TimWoo 3:21c8adb97c8f 137 // lcdWriteLine(2, desc);
TimWoo 3:21c8adb97c8f 138 }
TimWoo 3:21c8adb97c8f 139
TimWoo 3:21c8adb97c8f 140 Controller::cStatus Controller::getStatus()
TimWoo 3:21c8adb97c8f 141 {
TimWoo 3:21c8adb97c8f 142 return this->status;
TimWoo 3:21c8adb97c8f 143 }
TimWoo 3:21c8adb97c8f 144
TimWoo 3:21c8adb97c8f 145 string Controller::statusString()
TimWoo 3:21c8adb97c8f 146 {
TimWoo 3:21c8adb97c8f 147 switch(status) {
TimWoo 3:21c8adb97c8f 148 case READY:
TimWoo 3:21c8adb97c8f 149 return "ready";
TimWoo 3:21c8adb97c8f 150
TimWoo 3:21c8adb97c8f 151 case WAITING:
TimWoo 3:21c8adb97c8f 152 return "waiting";
TimWoo 3:21c8adb97c8f 153
TimWoo 3:21c8adb97c8f 154 case BUSY:
TimWoo 3:21c8adb97c8f 155 return "busy";
TimWoo 3:21c8adb97c8f 156
TimWoo 3:21c8adb97c8f 157 case ERROR:
TimWoo 3:21c8adb97c8f 158 return "error";
TimWoo 3:21c8adb97c8f 159
TimWoo 3:21c8adb97c8f 160 case INIT:
TimWoo 3:21c8adb97c8f 161 return "intializing";
TimWoo 3:21c8adb97c8f 162
TimWoo 3:21c8adb97c8f 163 default:
TimWoo 3:21c8adb97c8f 164 return "unknown";
TimWoo 3:21c8adb97c8f 165 }
TimWoo 3:21c8adb97c8f 166 }
TimWoo 3:21c8adb97c8f 167
TimWoo 3:21c8adb97c8f 168 void Controller::setStatus(cStatus status)
TimWoo 3:21c8adb97c8f 169 {
TimWoo 3:21c8adb97c8f 170 this->status = status;
TimWoo 3:21c8adb97c8f 171 displayStatus();
TimWoo 3:21c8adb97c8f 172 }
TimWoo 3:21c8adb97c8f 173
TimWoo 3:21c8adb97c8f 174 void Controller::displayStatus()
TimWoo 3:21c8adb97c8f 175 {
TimWoo 5:e22a1ae893d2 176 printf("Controller::displayStatus()\r\n");
TimWoo 3:21c8adb97c8f 177 this->lcd->locate(0,0);
TimWoo 3:21c8adb97c8f 178 this->lcd->clearLine();
TimWoo 3:21c8adb97c8f 179 this->lcd->locate(0,0);
TimWoo 3:21c8adb97c8f 180 this->lcd->printf("Status: %s", statusString());
TimWoo 3:21c8adb97c8f 181 }
TimWoo 3:21c8adb97c8f 182
TimWoo 3:21c8adb97c8f 183
TimWoo 3:21c8adb97c8f 184 void Controller::lcdWriteLine(int row, string str)
TimWoo 3:21c8adb97c8f 185 {
TimWoo 3:21c8adb97c8f 186 this->lcd->locate(0,row);
TimWoo 3:21c8adb97c8f 187 this->lcd->clearLine();
TimWoo 3:21c8adb97c8f 188 this->lcd->locate(0,row);
TimWoo 3:21c8adb97c8f 189 this->lcd->printf("%s", str);
TimWoo 3:21c8adb97c8f 190 }
TimWoo 3:21c8adb97c8f 191
TimWoo 3:21c8adb97c8f 192 //void Controller::nextCommand()
TimWoo 3:21c8adb97c8f 193 //{
TimWoo 3:21c8adb97c8f 194 // std::vector<MCommand>::iterator it;
TimWoo 3:21c8adb97c8f 195 // it = commandList->begin();
TimWoo 3:21c8adb97c8f 196 // it = commandList->insert(it, commandList->back());
TimWoo 3:21c8adb97c8f 197 // it = commandList->begin();
TimWoo 3:21c8adb97c8f 198 // commandList->pop_back();
TimWoo 3:21c8adb97c8f 199 // it = commandList->begin();
TimWoo 3:21c8adb97c8f 200 // MCommand command = *it;
TimWoo 3:21c8adb97c8f 201 // printDesc(command->getCmd());
TimWoo 3:21c8adb97c8f 202 //}
TimWoo 3:21c8adb97c8f 203
TimWoo 3:21c8adb97c8f 204 void Controller::prevCommand()
TimWoo 3:21c8adb97c8f 205 {
TimWoo 3:21c8adb97c8f 206
TimWoo 3:21c8adb97c8f 207 }
TimWoo 3:21c8adb97c8f 208
TimWoo 3:21c8adb97c8f 209 void Controller::sendCommandDem()
TimWoo 3:21c8adb97c8f 210 {
TimWoo 3:21c8adb97c8f 211
TimWoo 3:21c8adb97c8f 212 }
TimWoo 3:21c8adb97c8f 213
TimWoo 3:21c8adb97c8f 214 void Controller::printCommandList()
TimWoo 3:21c8adb97c8f 215 {
TimWoo 5:e22a1ae893d2 216 if(!initialized)
TimWoo 5:e22a1ae893d2 217 {
TimWoo 5:e22a1ae893d2 218 printf("Error: Controller must be initialized before calling %s!\r\n", __PRETTY_FUNCTION__);
TimWoo 5:e22a1ae893d2 219 return;
TimWoo 5:e22a1ae893d2 220 }
TimWoo 3:21c8adb97c8f 221 printf("\r\nCommand list printing\r\n\r\n");
TimWoo 3:21c8adb97c8f 222 if(commandList.size()) {
TimWoo 5:e22a1ae893d2 223 printf("The command list contains %d commands\r\n", commandList.size());
TimWoo 3:21c8adb97c8f 224 for(std::vector<MCommand>::iterator it = commandList.begin(); it != commandList.end(); ++it) {
TimWoo 3:21c8adb97c8f 225 /* std::cout << *it; ... */
TimWoo 3:21c8adb97c8f 226 it->print();
TimWoo 3:21c8adb97c8f 227 }
TimWoo 5:e22a1ae893d2 228 } else {
TimWoo 5:e22a1ae893d2 229 printf("Command list empty\r\n");
TimWoo 3:21c8adb97c8f 230 }
TimWoo 3:21c8adb97c8f 231 }
TimWoo 5:e22a1ae893d2 232
TimWoo 5:e22a1ae893d2 233 void Controller::initTables()
TimWoo 5:e22a1ae893d2 234 {
TimWoo 5:e22a1ae893d2 235 printf("initTables\r\n");
TimWoo 6:32e6f0048bf1 236 MbedJSONValue allTables = mAPI->getTablesAll();
TimWoo 6:32e6f0048bf1 237 // .get("tables").get<picojson::array>();
TimWoo 6:32e6f0048bf1 238 //printf("get first table\r\n");
TimWoo 6:32e6f0048bf1 239 // picojson::value table = (picojson::value)allTables.begin();
TimWoo 6:32e6f0048bf1 240 // int tableId = table.get("id");
TimWoo 6:32e6f0048bf1 241 // printf("First table id is %d\r\n", tableId);
TimWoo 6:32e6f0048bf1 242 // //for (picojson::array::iterator iter = list.begin(); iter != list.end(); ++iter) {
TimWoo 5:e22a1ae893d2 243 // printf("menu item value =%s\r\n", (*iter).get("v").get<string>().c_str());
TimWoo 5:e22a1ae893d2 244 // }
TimWoo 5:e22a1ae893d2 245 }
TimWoo 5:e22a1ae893d2 246
TimWoo 5:e22a1ae893d2 247
TimWoo 5:e22a1ae893d2 248 void Controller::testRequest()
TimWoo 5:e22a1ae893d2 249 {
TimWoo 5:e22a1ae893d2 250 mAPI->getTablesAll();
TimWoo 5:e22a1ae893d2 251
TimWoo 5:e22a1ae893d2 252 }
TimWoo 5:e22a1ae893d2 253
TimWoo 5:e22a1ae893d2 254
TimWoo 5:e22a1ae893d2 255
TimWoo 5:e22a1ae893d2 256
TimWoo 5:e22a1ae893d2 257
TimWoo 5:e22a1ae893d2 258
TimWoo 5:e22a1ae893d2 259
TimWoo 5:e22a1ae893d2 260
TimWoo 5:e22a1ae893d2 261
TimWoo 5:e22a1ae893d2 262
TimWoo 5:e22a1ae893d2 263
TimWoo 5:e22a1ae893d2 264
TimWoo 5:e22a1ae893d2 265
TimWoo 5:e22a1ae893d2 266
TimWoo 5:e22a1ae893d2 267
TimWoo 5:e22a1ae893d2 268 //Controller::Controller(TextLCD *lcd):
TimWoo 5:e22a1ae893d2 269 // status(WAITING),
TimWoo 5:e22a1ae893d2 270 // lcd(lcd)
TimWoo 5:e22a1ae893d2 271 //{
TimWoo 5:e22a1ae893d2 272 // debug_build_number();
TimWoo 5:e22a1ae893d2 273 // printf("Controller constructor\r\n");
TimWoo 5:e22a1ae893d2 274 //// this->lcd = lcd;
TimWoo 5:e22a1ae893d2 275 // //setStatus(WAITING);
TimWoo 5:e22a1ae893d2 276 //// mAPI = new MotiVAPI("http://core.motiv.jvanbaarsen.com/v1/");
TimWoo 5:e22a1ae893d2 277 // displayStatus();
TimWoo 5:e22a1ae893d2 278 //// devices.push_back(new <Device>Flower(1));
TimWoo 5:e22a1ae893d2 279 //// devices.append(new Flower(2));
TimWoo 5:e22a1ae893d2 280 //// devices.append(new Flower(3));
TimWoo 5:e22a1ae893d2 281 //
TimWoo 5:e22a1ae893d2 282 //// tables.append(new Table(1));
TimWoo 5:e22a1ae893d2 283 //// tables.append(new Table(2));
TimWoo 5:e22a1ae893d2 284 //// tables.append(new Table(3));
TimWoo 5:e22a1ae893d2 285 //
TimWoo 5:e22a1ae893d2 286 // //tables stores Tables
TimWoo 5:e22a1ae893d2 287 // //Tables can be updated with information
TimWoo 5:e22a1ae893d2 288 // //Tables can be asked for commands to send
TimWoo 5:e22a1ae893d2 289 // //Tables will check changes between new info (this API update) and old info (previous API update)
TimWoo 5:e22a1ae893d2 290 // //Tables can use the Flower interface to build commands
TimWoo 5:e22a1ae893d2 291 //
TimWoo 5:e22a1ae893d2 292 //
TimWoo 5:e22a1ae893d2 293 // //Would like to have:
TimWoo 5:e22a1ae893d2 294 // //Sending commands in different thread than receiving api update
TimWoo 5:e22a1ae893d2 295 // //Commands then put into shared object commandQueue (FIFO)
TimWoo 5:e22a1ae893d2 296 //
TimWoo 5:e22a1ae893d2 297 //// initTables();
TimWoo 5:e22a1ae893d2 298 //
TimWoo 5:e22a1ae893d2 299 //// Test
TimWoo 5:e22a1ae893d2 300 //// Table table(1);
TimWoo 5:e22a1ae893d2 301 //// Table table2(2);
TimWoo 5:e22a1ae893d2 302 //// vector<MCommand> insertVector;
TimWoo 5:e22a1ae893d2 303 //// insertVector = table.update(1,0,0,0);
TimWoo 5:e22a1ae893d2 304 //// printf("Updated first table\r\n");
TimWoo 5:e22a1ae893d2 305 //// commandList.insert(commandList.begin(), insertVector.begin(), insertVector.end());
TimWoo 5:e22a1ae893d2 306 //// printCommandList();
TimWoo 5:e22a1ae893d2 307 //// insertVector = table2.update(2,0,0,0);
TimWoo 5:e22a1ae893d2 308 //// printf("Updated second table\r\n");
TimWoo 5:e22a1ae893d2 309 //// commandList.insert(commandList.begin(), insertVector.begin(), insertVector.end());
TimWoo 5:e22a1ae893d2 310 //}