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
main.cpp
- Committer:
- foxbrianr
- Date:
- 2019-07-25
- Revision:
- 3:ecaf9963341b
- Parent:
- 1:a16e53a9e991
- Child:
- 5:65f21c0b6b79
File content as of revision 3:ecaf9963341b:
#include "mbed.h" #include "rtos.h" #include "LCD.h" #include "ButtonController.h" #include "ESCMControlApp.h" #include "Menu.h" #include "EditTimeMenu.h" #include "DisplayCodesMenu.h" //#include "EditDateMenu.h" //#include "EditAddressMenu.h" //#include "DisplayFaultAddressMenu.h" #include "Navigator.h" #include "Selection.h" DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); Thread gpioThread (osPriorityHigh, 2000); Thread ioThread (osPriorityHigh, 2000); Thread soundThread(osPriorityLow, 2000); Thread displayThread(osPriorityNormal, 2000); //EventQueue messageQueue(32 * EVENTS_EVENT_SIZE); typedef struct { int event; char msg[40]; } event_t; CircularBuffer<event_t, 64> event_queue; CircularBuffer<event_t, 64> playback_queue; Serial pc(USBTX, USBRX); // tx, rx LCD lcd; Menu rootMenu ("root menu"); EditTimeMenu editTime ("Edit Time"); //EditDateMenu editDate ("Edit Date"); //EditAddressMenu editAdress ("Edit Addresses"); DisplayCodesMenu showEvents ("Display Events" ); Navigator navigator(&rootMenu, &lcd); Menu * currentMenu = &showEvents; ButtonController controller(&navigator); ESCMControlApp escmController; void toggleLed1(void* obj) { led1 = !led1; } void toggleLed2(void* obj) { led2 = !led2; } void toggleLed3(void* obj) { led3 = !led3; } void toggleLed4() { led4 = !led4; } /*********************************************************************** * Thread to read GPIO and handle events ***********************************************************************/ void ReadGPIOExtender(void const *name) { uint8_t code = 0; pc.printf("Starting %s task\n", name ); led4 = !led4; while (true) { controller.update(); code = controller.currentValue & 0x1F; // filter code(s) if (code) { event_t e; e.event = code; if (!event_queue.full()){ pc.printf("<%02x>\n",e.event); event_queue.push(e); } } led4 = !led4; Thread::wait(10); } } /*********************************************************************** * Thread to read GPIO and handle events ***********************************************************************/ void ESCMController_Update(void const *name) { pc.printf("Starting %s task\n", name ); while(1) { escmController.update(); Thread::wait(1000); } } /*********************************************************************** * Update LCD Display Thread ***********************************************************************/ void UpdateDisplay(void const *name) { pc.printf("Starting %s task\n", name ); lcd.init(); lcd.locate(0,0); lcd.cls(); lcd.writeLine (0, "Initializing System.."); event_t ex;// = (event_t*)(event_queue.alloc()); int event =0; currentMenu->update_needed = 1; while (true) { #if 1 while (!event_queue.empty()) { event_queue.pop(ex); switch(ex.event) { case 0x01://up currentMenu->pressUp(); break; case 0x02://down currentMenu->pressDown(); break; case 0x04://clear currentMenu->pressClear(); break; case 0x08://mode currentMenu->pressMode(); break; case 0x10://set currentMenu->pressSet(); break; default: break; } } currentMenu->lcd = &lcd; currentMenu->display(&lcd); #endif led3 = !led3; Thread::wait(50); } } /*********************************************************************** * Play sounds * TODO: should have its own queue. ***********************************************************************/ void PlaySound(void const *name) { char msg[40]; event_t e; pc.printf("Starting %s task\n", name ); while (true) { while (!playback_queue.empty()) { playback_queue.pop(e); sprintf(msg, "Unit %d is open\r",e.event); speaker.speakf("S");//Speak command starts with "S" speaker.speakf(msg); // Send the desired string to convert to speech speaker.speakf("\r"); //marks end of speak command speaker.ready(); //ready waits for speech to finish from last command with a ":" response led2 = !led2; } Thread::wait(2000); } } /*********************************************************************** * Main Loop ***********************************************************************/ int main() { led1=1; led1=!led1; pc.printf("\n\r"); pc.printf("=====================================\n\r"); pc.printf("= LCD TEST =\n\r"); pc.printf("=====================================\n\r"); escmController.init(); escmController.tx485Message(0); led1=!led1; #if 0 Menu ledMenu1("Events menu"); Menu ledMenu2("Address menu"); Menu ledMenu3("Set Time"); Menu ledMenu4("Set Date"); //Add any selections ledMenu1.add(Selection(&toggleLed1, 0, NULL, "Toggle LED1")); ledMenu1.add(Selection(&toggleLed2, 0, NULL, "Toggle LED2")); ledMenu1.add(Selection(&toggleLed3, 0, NULL, "Toggle LED3")); ledMenu1.add(Selection(&toggleLed4, 0, NULL, "Toggle LED4")); ledMenu1.add(Selection(NULL, 0, &rootMenu, "Go back")); //add a selection to go back up in the menu hierarchy. // Do this by letting the child menu point to the previous menu ledMenu2.add(Selection(&toggleLed4, 0, NULL, "Current Address Code")); ledMenu2.add(Selection(NULL, 0, &rootMenu, "Go back")); ledMenu3.add(Selection(&toggleLed4, 0, NULL, "Current Time")); ledMenu3.add(Selection(NULL, 0, &rootMenu, "Go back")); ledMenu4.add(Selection(&toggleLed4, 0, NULL, "Current Date")); ledMenu4.add(Selection(NULL, 0, &rootMenu, "Go back")); #endif //add submenus to the root (as selections with child parameters set to the submenus) // rootMenu.add(Selection(NULL, 0, &showEvents, "View Events")); // rootMenu.add(Selection(NULL, 1, &editAdress, "Modify Addresses")); rootMenu.add(Selection(NULL, 2, &editTime, "Set Time")); // rootMenu.add(Selection(NULL, 3, &editDate, "Set Date")); led1=!led1; ioThread.start (callback(ESCMController_Update , (void *)"io")); gpioThread.start (callback(ReadGPIOExtender , (void *)"gpio")); soundThread.start(callback(PlaySound, (void *)"audio")); displayThread.start (callback(UpdateDisplay, (void *)"display")); escmController.say("Welcome"); uint32_t frameCount = 0; while(1) { wait_ms(500); frameCount++; led1=!led1; } }