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;
        
    }
}