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:18:27 2015 +0000
Revision:
5:e22a1ae893d2
Parent:
3:21c8adb97c8f
Child:
6:32e6f0048bf1
Malloc call needed for picojson hangs the program silently... Don't see how to debug.; ; Going to try MbedJSONValue library instead

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