demo new haven display

Dependencies:   LCD Menu ButtonCtrl TimeManagement EventLog AddressMap emic2

ESCM 2000 Control and Display application provides interface for the LPC1768 processor boards with the ECSM 2000 system.

This application implements SW interface : - RX 485 Receive from physical system - RX 485 Interface to send toECOM / ESCM board - CAN Interface to send to ECOM / ESCM board - 4x40 LCD with menu controls - RTC configuration -EMIC2 Sound Card - GPIO Extender to push buttons etc

Committer:
foxbrianr
Date:
Thu Jul 25 00:45:01 2019 +0000
Revision:
3:ecaf9963341b
Parent:
1:a16e53a9e991
Child:
5:65f21c0b6b79
Baseline for testing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
foxbrianr 0:91f25a0f819c 1 #include "mbed.h"
foxbrianr 3:ecaf9963341b 2 #include "rtos.h"
foxbrianr 3:ecaf9963341b 3
foxbrianr 0:91f25a0f819c 4 #include "LCD.h"
foxbrianr 0:91f25a0f819c 5
foxbrianr 3:ecaf9963341b 6 #include "ButtonController.h"
foxbrianr 3:ecaf9963341b 7
foxbrianr 3:ecaf9963341b 8 #include "ESCMControlApp.h"
foxbrianr 3:ecaf9963341b 9
foxbrianr 3:ecaf9963341b 10 #include "Menu.h"
foxbrianr 3:ecaf9963341b 11 #include "EditTimeMenu.h"
foxbrianr 3:ecaf9963341b 12 #include "DisplayCodesMenu.h"
foxbrianr 3:ecaf9963341b 13
foxbrianr 3:ecaf9963341b 14 //#include "EditDateMenu.h"
foxbrianr 3:ecaf9963341b 15 //#include "EditAddressMenu.h"
foxbrianr 3:ecaf9963341b 16 //#include "DisplayFaultAddressMenu.h"
foxbrianr 3:ecaf9963341b 17
foxbrianr 3:ecaf9963341b 18 #include "Navigator.h"
foxbrianr 3:ecaf9963341b 19 #include "Selection.h"
foxbrianr 3:ecaf9963341b 20
foxbrianr 3:ecaf9963341b 21 DigitalOut led1(LED1);
foxbrianr 3:ecaf9963341b 22 DigitalOut led2(LED2);
foxbrianr 3:ecaf9963341b 23 DigitalOut led3(LED3);
foxbrianr 3:ecaf9963341b 24 DigitalOut led4(LED4);
foxbrianr 3:ecaf9963341b 25
foxbrianr 3:ecaf9963341b 26
foxbrianr 3:ecaf9963341b 27 Thread gpioThread (osPriorityHigh, 2000);
foxbrianr 3:ecaf9963341b 28
foxbrianr 3:ecaf9963341b 29 Thread ioThread (osPriorityHigh, 2000);
foxbrianr 3:ecaf9963341b 30
foxbrianr 3:ecaf9963341b 31 Thread soundThread(osPriorityLow, 2000);
foxbrianr 3:ecaf9963341b 32
foxbrianr 3:ecaf9963341b 33 Thread displayThread(osPriorityNormal, 2000);
foxbrianr 3:ecaf9963341b 34
foxbrianr 3:ecaf9963341b 35
foxbrianr 3:ecaf9963341b 36 //EventQueue messageQueue(32 * EVENTS_EVENT_SIZE);
foxbrianr 3:ecaf9963341b 37
foxbrianr 3:ecaf9963341b 38 typedef struct {
foxbrianr 3:ecaf9963341b 39 int event;
foxbrianr 3:ecaf9963341b 40 char msg[40];
foxbrianr 3:ecaf9963341b 41 } event_t;
foxbrianr 3:ecaf9963341b 42
foxbrianr 3:ecaf9963341b 43
foxbrianr 3:ecaf9963341b 44
foxbrianr 3:ecaf9963341b 45 CircularBuffer<event_t, 64> event_queue;
foxbrianr 3:ecaf9963341b 46 CircularBuffer<event_t, 64> playback_queue;
foxbrianr 3:ecaf9963341b 47
foxbrianr 0:91f25a0f819c 48
foxbrianr 0:91f25a0f819c 49 Serial pc(USBTX, USBRX); // tx, rx
foxbrianr 0:91f25a0f819c 50
foxbrianr 3:ecaf9963341b 51 LCD lcd;
foxbrianr 3:ecaf9963341b 52
foxbrianr 3:ecaf9963341b 53
foxbrianr 3:ecaf9963341b 54
foxbrianr 3:ecaf9963341b 55 Menu rootMenu ("root menu");
foxbrianr 3:ecaf9963341b 56 EditTimeMenu editTime ("Edit Time");
foxbrianr 3:ecaf9963341b 57 //EditDateMenu editDate ("Edit Date");
foxbrianr 3:ecaf9963341b 58 //EditAddressMenu editAdress ("Edit Addresses");
foxbrianr 3:ecaf9963341b 59
foxbrianr 3:ecaf9963341b 60 DisplayCodesMenu showEvents ("Display Events" );
foxbrianr 3:ecaf9963341b 61
foxbrianr 3:ecaf9963341b 62
foxbrianr 3:ecaf9963341b 63 Navigator navigator(&rootMenu, &lcd);
foxbrianr 3:ecaf9963341b 64
foxbrianr 3:ecaf9963341b 65
foxbrianr 3:ecaf9963341b 66 Menu * currentMenu = &showEvents;
foxbrianr 3:ecaf9963341b 67
foxbrianr 3:ecaf9963341b 68 ButtonController controller(&navigator);
foxbrianr 3:ecaf9963341b 69
foxbrianr 3:ecaf9963341b 70
foxbrianr 3:ecaf9963341b 71 ESCMControlApp escmController;
foxbrianr 3:ecaf9963341b 72
foxbrianr 3:ecaf9963341b 73 void toggleLed1(void* obj)
foxbrianr 3:ecaf9963341b 74 {
foxbrianr 3:ecaf9963341b 75 led1 = !led1;
foxbrianr 3:ecaf9963341b 76 }
foxbrianr 3:ecaf9963341b 77 void toggleLed2(void* obj)
foxbrianr 3:ecaf9963341b 78 {
foxbrianr 3:ecaf9963341b 79 led2 = !led2;
foxbrianr 3:ecaf9963341b 80 }
foxbrianr 3:ecaf9963341b 81 void toggleLed3(void* obj)
foxbrianr 3:ecaf9963341b 82 {
foxbrianr 3:ecaf9963341b 83 led3 = !led3;
foxbrianr 3:ecaf9963341b 84 }
foxbrianr 3:ecaf9963341b 85 void toggleLed4()
foxbrianr 3:ecaf9963341b 86 {
foxbrianr 3:ecaf9963341b 87 led4 = !led4;
foxbrianr 3:ecaf9963341b 88 }
foxbrianr 3:ecaf9963341b 89 /***********************************************************************
foxbrianr 3:ecaf9963341b 90 * Thread to read GPIO and handle events
foxbrianr 3:ecaf9963341b 91 ***********************************************************************/
foxbrianr 3:ecaf9963341b 92
foxbrianr 3:ecaf9963341b 93 void ReadGPIOExtender(void const *name)
foxbrianr 3:ecaf9963341b 94 {
foxbrianr 3:ecaf9963341b 95 uint8_t code = 0;
foxbrianr 3:ecaf9963341b 96
foxbrianr 3:ecaf9963341b 97 pc.printf("Starting %s task\n", name );
foxbrianr 3:ecaf9963341b 98
foxbrianr 3:ecaf9963341b 99 led4 = !led4;
foxbrianr 3:ecaf9963341b 100
foxbrianr 3:ecaf9963341b 101 while (true) {
foxbrianr 3:ecaf9963341b 102
foxbrianr 3:ecaf9963341b 103 controller.update();
foxbrianr 3:ecaf9963341b 104
foxbrianr 3:ecaf9963341b 105 code = controller.currentValue & 0x1F; // filter code(s)
foxbrianr 3:ecaf9963341b 106
foxbrianr 3:ecaf9963341b 107 if (code)
foxbrianr 3:ecaf9963341b 108 {
foxbrianr 3:ecaf9963341b 109 event_t e;
foxbrianr 3:ecaf9963341b 110 e.event = code;
foxbrianr 3:ecaf9963341b 111
foxbrianr 3:ecaf9963341b 112 if (!event_queue.full()){
foxbrianr 3:ecaf9963341b 113 pc.printf("<%02x>\n",e.event);
foxbrianr 3:ecaf9963341b 114 event_queue.push(e);
foxbrianr 3:ecaf9963341b 115 }
foxbrianr 3:ecaf9963341b 116
foxbrianr 3:ecaf9963341b 117 }
foxbrianr 3:ecaf9963341b 118
foxbrianr 3:ecaf9963341b 119 led4 = !led4;
foxbrianr 3:ecaf9963341b 120 Thread::wait(10);
foxbrianr 3:ecaf9963341b 121 }
foxbrianr 3:ecaf9963341b 122
foxbrianr 3:ecaf9963341b 123
foxbrianr 3:ecaf9963341b 124 }
foxbrianr 3:ecaf9963341b 125
foxbrianr 3:ecaf9963341b 126 /***********************************************************************
foxbrianr 3:ecaf9963341b 127 * Thread to read GPIO and handle events
foxbrianr 3:ecaf9963341b 128 ***********************************************************************/
foxbrianr 3:ecaf9963341b 129
foxbrianr 3:ecaf9963341b 130 void ESCMController_Update(void const *name)
foxbrianr 3:ecaf9963341b 131 {
foxbrianr 3:ecaf9963341b 132
foxbrianr 3:ecaf9963341b 133 pc.printf("Starting %s task\n", name );
foxbrianr 3:ecaf9963341b 134
foxbrianr 3:ecaf9963341b 135
foxbrianr 3:ecaf9963341b 136 while(1) {
foxbrianr 3:ecaf9963341b 137
foxbrianr 3:ecaf9963341b 138 escmController.update();
foxbrianr 3:ecaf9963341b 139
foxbrianr 3:ecaf9963341b 140 Thread::wait(1000);
foxbrianr 3:ecaf9963341b 141 }
foxbrianr 3:ecaf9963341b 142 }
foxbrianr 3:ecaf9963341b 143
foxbrianr 3:ecaf9963341b 144
foxbrianr 3:ecaf9963341b 145 /***********************************************************************
foxbrianr 3:ecaf9963341b 146 * Update LCD Display Thread
foxbrianr 3:ecaf9963341b 147 ***********************************************************************/
foxbrianr 3:ecaf9963341b 148
foxbrianr 3:ecaf9963341b 149 void UpdateDisplay(void const *name)
foxbrianr 3:ecaf9963341b 150 {
foxbrianr 3:ecaf9963341b 151
foxbrianr 3:ecaf9963341b 152 pc.printf("Starting %s task\n", name );
foxbrianr 3:ecaf9963341b 153
foxbrianr 3:ecaf9963341b 154 lcd.init();
foxbrianr 3:ecaf9963341b 155 lcd.locate(0,0);
foxbrianr 3:ecaf9963341b 156 lcd.cls();
foxbrianr 3:ecaf9963341b 157
foxbrianr 3:ecaf9963341b 158 lcd.writeLine (0, "Initializing System..");
foxbrianr 3:ecaf9963341b 159
foxbrianr 3:ecaf9963341b 160 event_t ex;// = (event_t*)(event_queue.alloc());
foxbrianr 3:ecaf9963341b 161 int event =0;
foxbrianr 3:ecaf9963341b 162
foxbrianr 3:ecaf9963341b 163 currentMenu->update_needed = 1;
foxbrianr 3:ecaf9963341b 164
foxbrianr 3:ecaf9963341b 165 while (true) {
foxbrianr 3:ecaf9963341b 166
foxbrianr 3:ecaf9963341b 167 #if 1
foxbrianr 3:ecaf9963341b 168
foxbrianr 3:ecaf9963341b 169 while (!event_queue.empty()) {
foxbrianr 3:ecaf9963341b 170 event_queue.pop(ex);
foxbrianr 3:ecaf9963341b 171
foxbrianr 3:ecaf9963341b 172 switch(ex.event)
foxbrianr 3:ecaf9963341b 173 {
foxbrianr 3:ecaf9963341b 174 case 0x01://up
foxbrianr 3:ecaf9963341b 175 currentMenu->pressUp();
foxbrianr 3:ecaf9963341b 176 break;
foxbrianr 3:ecaf9963341b 177
foxbrianr 3:ecaf9963341b 178 case 0x02://down
foxbrianr 3:ecaf9963341b 179 currentMenu->pressDown();
foxbrianr 3:ecaf9963341b 180 break;
foxbrianr 3:ecaf9963341b 181
foxbrianr 3:ecaf9963341b 182 case 0x04://clear
foxbrianr 3:ecaf9963341b 183 currentMenu->pressClear();
foxbrianr 3:ecaf9963341b 184 break;
foxbrianr 3:ecaf9963341b 185
foxbrianr 3:ecaf9963341b 186 case 0x08://mode
foxbrianr 3:ecaf9963341b 187 currentMenu->pressMode();
foxbrianr 3:ecaf9963341b 188 break;
foxbrianr 3:ecaf9963341b 189
foxbrianr 3:ecaf9963341b 190 case 0x10://set
foxbrianr 3:ecaf9963341b 191 currentMenu->pressSet();
foxbrianr 3:ecaf9963341b 192 break;
foxbrianr 3:ecaf9963341b 193 default:
foxbrianr 3:ecaf9963341b 194 break;
foxbrianr 3:ecaf9963341b 195 }
foxbrianr 3:ecaf9963341b 196 }
foxbrianr 3:ecaf9963341b 197
foxbrianr 3:ecaf9963341b 198 currentMenu->lcd = &lcd;
foxbrianr 3:ecaf9963341b 199 currentMenu->display(&lcd);
foxbrianr 3:ecaf9963341b 200 #endif
foxbrianr 3:ecaf9963341b 201
foxbrianr 3:ecaf9963341b 202 led3 = !led3;
foxbrianr 3:ecaf9963341b 203
foxbrianr 3:ecaf9963341b 204 Thread::wait(50);
foxbrianr 3:ecaf9963341b 205
foxbrianr 3:ecaf9963341b 206 }
foxbrianr 3:ecaf9963341b 207 }
foxbrianr 3:ecaf9963341b 208
foxbrianr 3:ecaf9963341b 209 /***********************************************************************
foxbrianr 3:ecaf9963341b 210 * Play sounds
foxbrianr 3:ecaf9963341b 211 * TODO: should have its own queue.
foxbrianr 3:ecaf9963341b 212 ***********************************************************************/
foxbrianr 3:ecaf9963341b 213
foxbrianr 3:ecaf9963341b 214 void PlaySound(void const *name)
foxbrianr 3:ecaf9963341b 215 {
foxbrianr 3:ecaf9963341b 216 char msg[40];
foxbrianr 3:ecaf9963341b 217
foxbrianr 3:ecaf9963341b 218 event_t e;
foxbrianr 3:ecaf9963341b 219
foxbrianr 3:ecaf9963341b 220 pc.printf("Starting %s task\n", name );
foxbrianr 3:ecaf9963341b 221
foxbrianr 3:ecaf9963341b 222 while (true) {
foxbrianr 3:ecaf9963341b 223
foxbrianr 3:ecaf9963341b 224 while (!playback_queue.empty()) {
foxbrianr 3:ecaf9963341b 225 playback_queue.pop(e);
foxbrianr 3:ecaf9963341b 226
foxbrianr 3:ecaf9963341b 227 sprintf(msg, "Unit %d is open\r",e.event);
foxbrianr 3:ecaf9963341b 228 speaker.speakf("S");//Speak command starts with "S"
foxbrianr 3:ecaf9963341b 229 speaker.speakf(msg); // Send the desired string to convert to speech
foxbrianr 3:ecaf9963341b 230 speaker.speakf("\r"); //marks end of speak command
foxbrianr 3:ecaf9963341b 231 speaker.ready(); //ready waits for speech to finish from last command with a ":" response
foxbrianr 3:ecaf9963341b 232 led2 = !led2;
foxbrianr 3:ecaf9963341b 233 }
foxbrianr 3:ecaf9963341b 234 Thread::wait(2000);
foxbrianr 3:ecaf9963341b 235 }
foxbrianr 3:ecaf9963341b 236 }
foxbrianr 3:ecaf9963341b 237
foxbrianr 3:ecaf9963341b 238 /***********************************************************************
foxbrianr 3:ecaf9963341b 239 * Main Loop
foxbrianr 3:ecaf9963341b 240 ***********************************************************************/
foxbrianr 0:91f25a0f819c 241
foxbrianr 0:91f25a0f819c 242 int main() {
foxbrianr 3:ecaf9963341b 243
foxbrianr 3:ecaf9963341b 244 led1=1;
foxbrianr 3:ecaf9963341b 245 led1=!led1;
foxbrianr 3:ecaf9963341b 246
foxbrianr 0:91f25a0f819c 247 pc.printf("\n\r");
foxbrianr 0:91f25a0f819c 248 pc.printf("=====================================\n\r");
foxbrianr 0:91f25a0f819c 249 pc.printf("= LCD TEST =\n\r");
foxbrianr 0:91f25a0f819c 250 pc.printf("=====================================\n\r");
foxbrianr 0:91f25a0f819c 251
foxbrianr 3:ecaf9963341b 252 escmController.init();
foxbrianr 3:ecaf9963341b 253 escmController.tx485Message(0);
foxbrianr 3:ecaf9963341b 254 led1=!led1;
foxbrianr 3:ecaf9963341b 255
foxbrianr 3:ecaf9963341b 256 #if 0
foxbrianr 3:ecaf9963341b 257 Menu ledMenu1("Events menu");
foxbrianr 3:ecaf9963341b 258 Menu ledMenu2("Address menu");
foxbrianr 3:ecaf9963341b 259 Menu ledMenu3("Set Time");
foxbrianr 3:ecaf9963341b 260 Menu ledMenu4("Set Date");
foxbrianr 0:91f25a0f819c 261
foxbrianr 3:ecaf9963341b 262 //Add any selections
foxbrianr 3:ecaf9963341b 263 ledMenu1.add(Selection(&toggleLed1, 0, NULL, "Toggle LED1"));
foxbrianr 3:ecaf9963341b 264 ledMenu1.add(Selection(&toggleLed2, 0, NULL, "Toggle LED2"));
foxbrianr 3:ecaf9963341b 265 ledMenu1.add(Selection(&toggleLed3, 0, NULL, "Toggle LED3"));
foxbrianr 3:ecaf9963341b 266 ledMenu1.add(Selection(&toggleLed4, 0, NULL, "Toggle LED4"));
foxbrianr 3:ecaf9963341b 267 ledMenu1.add(Selection(NULL, 0, &rootMenu, "Go back"));
foxbrianr 3:ecaf9963341b 268
foxbrianr 3:ecaf9963341b 269 //add a selection to go back up in the menu hierarchy.
foxbrianr 3:ecaf9963341b 270 // Do this by letting the child menu point to the previous menu
foxbrianr 3:ecaf9963341b 271
foxbrianr 3:ecaf9963341b 272 ledMenu2.add(Selection(&toggleLed4, 0, NULL, "Current Address Code"));
foxbrianr 3:ecaf9963341b 273 ledMenu2.add(Selection(NULL, 0, &rootMenu, "Go back"));
foxbrianr 3:ecaf9963341b 274
foxbrianr 3:ecaf9963341b 275 ledMenu3.add(Selection(&toggleLed4, 0, NULL, "Current Time"));
foxbrianr 3:ecaf9963341b 276 ledMenu3.add(Selection(NULL, 0, &rootMenu, "Go back"));
foxbrianr 3:ecaf9963341b 277
foxbrianr 3:ecaf9963341b 278 ledMenu4.add(Selection(&toggleLed4, 0, NULL, "Current Date"));
foxbrianr 3:ecaf9963341b 279 ledMenu4.add(Selection(NULL, 0, &rootMenu, "Go back"));
foxbrianr 3:ecaf9963341b 280
foxbrianr 3:ecaf9963341b 281 #endif
foxbrianr 0:91f25a0f819c 282
foxbrianr 0:91f25a0f819c 283
foxbrianr 3:ecaf9963341b 284 //add submenus to the root (as selections with child parameters set to the submenus)
foxbrianr 3:ecaf9963341b 285 // rootMenu.add(Selection(NULL, 0, &showEvents, "View Events"));
foxbrianr 3:ecaf9963341b 286 // rootMenu.add(Selection(NULL, 1, &editAdress, "Modify Addresses"));
foxbrianr 3:ecaf9963341b 287 rootMenu.add(Selection(NULL, 2, &editTime, "Set Time"));
foxbrianr 3:ecaf9963341b 288 // rootMenu.add(Selection(NULL, 3, &editDate, "Set Date"));
foxbrianr 3:ecaf9963341b 289
foxbrianr 3:ecaf9963341b 290 led1=!led1;
foxbrianr 3:ecaf9963341b 291
foxbrianr 3:ecaf9963341b 292 ioThread.start (callback(ESCMController_Update , (void *)"io"));
foxbrianr 0:91f25a0f819c 293
foxbrianr 3:ecaf9963341b 294 gpioThread.start (callback(ReadGPIOExtender , (void *)"gpio"));
foxbrianr 3:ecaf9963341b 295
foxbrianr 3:ecaf9963341b 296 soundThread.start(callback(PlaySound, (void *)"audio"));
foxbrianr 3:ecaf9963341b 297
foxbrianr 3:ecaf9963341b 298 displayThread.start (callback(UpdateDisplay, (void *)"display"));
foxbrianr 3:ecaf9963341b 299
foxbrianr 3:ecaf9963341b 300 escmController.say("Welcome");
foxbrianr 3:ecaf9963341b 301
foxbrianr 3:ecaf9963341b 302 uint32_t frameCount = 0;
foxbrianr 3:ecaf9963341b 303
foxbrianr 0:91f25a0f819c 304 while(1) {
foxbrianr 3:ecaf9963341b 305 wait_ms(500);
foxbrianr 3:ecaf9963341b 306 frameCount++;
foxbrianr 3:ecaf9963341b 307 led1=!led1;
foxbrianr 3:ecaf9963341b 308
foxbrianr 0:91f25a0f819c 309 }
foxbrianr 0:91f25a0f819c 310 }
foxbrianr 0:91f25a0f819c 311