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:
Fri Sep 27 13:20:41 2019 +0000
Revision:
8:f15a5358883c
Parent:
7:0244f1a26545
Child:
10:f221dd1ef77b
Beta 2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
foxbrianr 6:010ceb99f7b0 1 /**************************************************************************
foxbrianr 6:010ceb99f7b0 2 * @file main.cpp
foxbrianr 6:010ceb99f7b0 3 * @brief Main function for ESCM Control System
foxbrianr 6:010ceb99f7b0 4 * Application
foxbrianr 6:010ceb99f7b0 5 * @version: V1.0
foxbrianr 6:010ceb99f7b0 6 * @date: 9/17/2019
foxbrianr 6:010ceb99f7b0 7
foxbrianr 6:010ceb99f7b0 8 *
foxbrianr 6:010ceb99f7b0 9 * @note
foxbrianr 6:010ceb99f7b0 10 * Copyright (C) 2019 E3 Design. All rights reserved.
foxbrianr 6:010ceb99f7b0 11 *
foxbrianr 6:010ceb99f7b0 12 * @par
foxbrianr 6:010ceb99f7b0 13 * E3 Designers LLC is supplying this software for use with Cortex-M3 LPC1768
foxbrianr 6:010ceb99f7b0 14 * processor based microcontroller for the ESCM 2000 Monitor and Display.
foxbrianr 6:010ceb99f7b0 15 * *
foxbrianr 6:010ceb99f7b0 16 * @par
foxbrianr 6:010ceb99f7b0 17 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
foxbrianr 6:010ceb99f7b0 18 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
foxbrianr 6:010ceb99f7b0 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
foxbrianr 6:010ceb99f7b0 20 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
foxbrianr 6:010ceb99f7b0 21 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
foxbrianr 6:010ceb99f7b0 22 *
foxbrianr 6:010ceb99f7b0 23 ******************************************************************************/
foxbrianr 0:91f25a0f819c 24 #include "mbed.h"
foxbrianr 3:ecaf9963341b 25 #include "rtos.h"
foxbrianr 5:65f21c0b6b79 26 #include "stats_report.h"
foxbrianr 6:010ceb99f7b0 27 #include "math.h"
foxbrianr 0:91f25a0f819c 28 #include "LCD.h"
foxbrianr 0:91f25a0f819c 29
foxbrianr 3:ecaf9963341b 30 #include "ButtonController.h"
foxbrianr 3:ecaf9963341b 31
foxbrianr 3:ecaf9963341b 32 #include "ESCMControlApp.h"
foxbrianr 3:ecaf9963341b 33
foxbrianr 3:ecaf9963341b 34 #include "Menu.h"
foxbrianr 3:ecaf9963341b 35 #include "EditTimeMenu.h"
foxbrianr 5:65f21c0b6b79 36 #include "EditAddressMenu.h"
foxbrianr 3:ecaf9963341b 37 #include "DisplayCodesMenu.h"
foxbrianr 5:65f21c0b6b79 38 #include "FactoryResetMenu.h"
foxbrianr 3:ecaf9963341b 39
foxbrianr 5:65f21c0b6b79 40 #define SLEEP_TIME 500 // (msec)
foxbrianr 6:010ceb99f7b0 41 #define PRINT_AFTER_N_LOOPS 10
foxbrianr 3:ecaf9963341b 42
foxbrianr 3:ecaf9963341b 43 DigitalOut led1(LED1);
foxbrianr 3:ecaf9963341b 44 DigitalOut led2(LED2);
foxbrianr 3:ecaf9963341b 45 DigitalOut led3(LED3);
foxbrianr 3:ecaf9963341b 46 DigitalOut led4(LED4);
foxbrianr 3:ecaf9963341b 47
foxbrianr 6:010ceb99f7b0 48 SystemReport *sys_state;
foxbrianr 6:010ceb99f7b0 49 /*-------------------------------------------------------------------
foxbrianr 6:010ceb99f7b0 50 * define displays
foxbrianr 6:010ceb99f7b0 51 *-------------------------------------------------------------------*/
foxbrianr 6:010ceb99f7b0 52 Serial pc(USBTX, USBRX); // tx, rx
foxbrianr 3:ecaf9963341b 53
foxbrianr 6:010ceb99f7b0 54 #define MAX_THREADS 6
foxbrianr 6:010ceb99f7b0 55 Thread * threads [MAX_THREADS];
foxbrianr 0:91f25a0f819c 56
foxbrianr 5:65f21c0b6b79 57 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 58 * define displays
foxbrianr 5:65f21c0b6b79 59 *-------------------------------------------------------------------*/
foxbrianr 3:ecaf9963341b 60 LCD lcd;
foxbrianr 3:ecaf9963341b 61
foxbrianr 5:65f21c0b6b79 62 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 63 * define displays
foxbrianr 5:65f21c0b6b79 64 *-------------------------------------------------------------------*/
foxbrianr 5:65f21c0b6b79 65 Menu rootMenu ("root menu");
foxbrianr 5:65f21c0b6b79 66 EditTimeMenu editTime ("Edit Time");
foxbrianr 5:65f21c0b6b79 67 EditAddressMenu editAddress ("Edit Addresses");
foxbrianr 5:65f21c0b6b79 68 DisplayCodesMenu showEvents ("Display Events" );
foxbrianr 5:65f21c0b6b79 69 FactoryResetMenu factoryReset("Factory Reset" );
foxbrianr 6:010ceb99f7b0 70
foxbrianr 5:65f21c0b6b79 71 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 72 * define display escmBtnController
foxbrianr 5:65f21c0b6b79 73 *-------------------------------------------------------------------*/
foxbrianr 5:65f21c0b6b79 74 ButtonController escmBtnController;
foxbrianr 5:65f21c0b6b79 75
foxbrianr 5:65f21c0b6b79 76 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 77 * define application
foxbrianr 5:65f21c0b6b79 78 *-------------------------------------------------------------------*/
foxbrianr 5:65f21c0b6b79 79 ESCMControlApp escmController;
foxbrianr 3:ecaf9963341b 80
foxbrianr 6:010ceb99f7b0 81 static int dataRxCnt = 0;
foxbrianr 5:65f21c0b6b79 82 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 83 * define led toggles for diagnostics
foxbrianr 5:65f21c0b6b79 84 *-------------------------------------------------------------------*/
foxbrianr 5:65f21c0b6b79 85 void toggleLed1(){ led1 = !led1;}
foxbrianr 5:65f21c0b6b79 86 void toggleLed2(){ led2 = !led2;}
foxbrianr 5:65f21c0b6b79 87 void toggleLed3(){ led3 = !led3;}
foxbrianr 5:65f21c0b6b79 88 void toggleLed4(){ led4 = !led4;}
foxbrianr 3:ecaf9963341b 89
foxbrianr 6:010ceb99f7b0 90 static volatile uint64_t idle;
foxbrianr 6:010ceb99f7b0 91
foxbrianr 7:0244f1a26545 92 #if DEBUG
foxbrianr 7:0244f1a26545 93 OsTaskPerfData_t g_perfData;
foxbrianr 6:010ceb99f7b0 94 void InitPerfData()
foxbrianr 6:010ceb99f7b0 95 {
foxbrianr 6:010ceb99f7b0 96 for (int i=0;i<MAX_THREADS;i++)
foxbrianr 6:010ceb99f7b0 97 {
foxbrianr 6:010ceb99f7b0 98 g_perfData.task[i].counter = 0;
foxbrianr 6:010ceb99f7b0 99 g_perfData.task[i].deltaTime = 0;
foxbrianr 6:010ceb99f7b0 100 g_perfData.task[i].deltaTimeMax = 0;
foxbrianr 6:010ceb99f7b0 101 g_perfData.task[i].deltaTimeMin = 0xFFFFFFFFu;
foxbrianr 6:010ceb99f7b0 102 g_perfData.task[i].deltaTimeAve = 0;
foxbrianr 6:010ceb99f7b0 103
foxbrianr 6:010ceb99f7b0 104 g_perfData.task[i].cycleTimeMax = 0;
foxbrianr 6:010ceb99f7b0 105 g_perfData.task[i].cycleTimeMin = 0xFFFFFFFFu;
foxbrianr 6:010ceb99f7b0 106 g_perfData.task[i].cycleTimeAve = 0;
foxbrianr 6:010ceb99f7b0 107
foxbrianr 6:010ceb99f7b0 108 g_perfData.task[i].timeStamp = 0;
foxbrianr 6:010ceb99f7b0 109 g_perfData.task[i].lastTimeStamp = 0;
foxbrianr 6:010ceb99f7b0 110 }
foxbrianr 6:010ceb99f7b0 111 }
foxbrianr 6:010ceb99f7b0 112
foxbrianr 6:010ceb99f7b0 113 void UpdatePerfDataStart(OsPerfData_t *data)
foxbrianr 6:010ceb99f7b0 114 {
foxbrianr 6:010ceb99f7b0 115 #if 1
foxbrianr 6:010ceb99f7b0 116 if (data != NULL) {
foxbrianr 6:010ceb99f7b0 117 uint64_t now = Kernel::get_ms_count();
foxbrianr 6:010ceb99f7b0 118 data->counter++;
foxbrianr 6:010ceb99f7b0 119 data->timeStamp = now;
foxbrianr 6:010ceb99f7b0 120 data->cycleTime = data->timeStamp - data->lastTimeStamp;
foxbrianr 6:010ceb99f7b0 121 if (data->cycleTime > data->cycleTimeMax ) data->cycleTimeMax = data->cycleTime;
foxbrianr 6:010ceb99f7b0 122 if (data->cycleTime < data->cycleTimeMin ) data->cycleTimeMin = data->cycleTime;
foxbrianr 6:010ceb99f7b0 123 data->cycleTimeAve = (data->cycleTime - data->cycleTimeAve)/2;
foxbrianr 6:010ceb99f7b0 124 data->lastTimeStamp = data->timeStamp;
foxbrianr 6:010ceb99f7b0 125 }
foxbrianr 6:010ceb99f7b0 126 #endif
foxbrianr 6:010ceb99f7b0 127 }
foxbrianr 6:010ceb99f7b0 128
foxbrianr 6:010ceb99f7b0 129 void UpdatePerfDataStop(OsPerfData_t *data)
foxbrianr 6:010ceb99f7b0 130 {
foxbrianr 6:010ceb99f7b0 131 #if 1
foxbrianr 6:010ceb99f7b0 132 if (data != NULL) {
foxbrianr 6:010ceb99f7b0 133 uint64_t now = Kernel::get_ms_count();
foxbrianr 6:010ceb99f7b0 134 data->deltaTime = now - (data->timeStamp);
foxbrianr 6:010ceb99f7b0 135 if (data->deltaTime > data->deltaTimeMax ) data->deltaTimeMax = data->deltaTime;
foxbrianr 6:010ceb99f7b0 136 if (data->deltaTime < data->deltaTimeMin ) data->deltaTimeMin = data->deltaTime;
foxbrianr 6:010ceb99f7b0 137 data->deltaTimeAve = (data->deltaTime + data->deltaTimeAve)/2;
foxbrianr 6:010ceb99f7b0 138 data->timeStamp = now;
foxbrianr 6:010ceb99f7b0 139
foxbrianr 6:010ceb99f7b0 140 }
foxbrianr 6:010ceb99f7b0 141 #endif
foxbrianr 6:010ceb99f7b0 142 }
foxbrianr 6:010ceb99f7b0 143
foxbrianr 6:010ceb99f7b0 144 void ShowPerfData (OsPerfData_t *data)
foxbrianr 6:010ceb99f7b0 145 {
foxbrianr 6:010ceb99f7b0 146 }
foxbrianr 7:0244f1a26545 147 #endif
foxbrianr 5:65f21c0b6b79 148
foxbrianr 3:ecaf9963341b 149 /***********************************************************************
foxbrianr 3:ecaf9963341b 150 * Thread to read GPIO and handle events
foxbrianr 3:ecaf9963341b 151 ***********************************************************************/
foxbrianr 3:ecaf9963341b 152
foxbrianr 6:010ceb99f7b0 153 void ReadGPIOExtender(void)
foxbrianr 3:ecaf9963341b 154 {
foxbrianr 3:ecaf9963341b 155 uint8_t code = 0;
foxbrianr 5:65f21c0b6b79 156
foxbrianr 6:010ceb99f7b0 157 Timer t;
foxbrianr 6:010ceb99f7b0 158
foxbrianr 5:65f21c0b6b79 159 pc.printf("Starting escmBtnController task\n" );
foxbrianr 5:65f21c0b6b79 160 toggleLed4();
foxbrianr 3:ecaf9963341b 161
foxbrianr 3:ecaf9963341b 162 while (true) {
foxbrianr 6:010ceb99f7b0 163 t.reset();
foxbrianr 6:010ceb99f7b0 164 t.start();
foxbrianr 5:65f21c0b6b79 165 escmBtnController.update();
foxbrianr 5:65f21c0b6b79 166 toggleLed4();
foxbrianr 6:010ceb99f7b0 167 ThisThread::sleep_for(50);
foxbrianr 6:010ceb99f7b0 168
foxbrianr 6:010ceb99f7b0 169 t.stop();
foxbrianr 6:010ceb99f7b0 170 //printf("<1> %d ms\n", t.read_ms());
foxbrianr 3:ecaf9963341b 171 }
foxbrianr 3:ecaf9963341b 172 }
foxbrianr 3:ecaf9963341b 173
foxbrianr 3:ecaf9963341b 174 /***********************************************************************
foxbrianr 3:ecaf9963341b 175 * Thread to read GPIO and handle events
foxbrianr 3:ecaf9963341b 176 ***********************************************************************/
foxbrianr 3:ecaf9963341b 177
foxbrianr 6:010ceb99f7b0 178 void ESCMController_Update(void)
foxbrianr 3:ecaf9963341b 179 {
foxbrianr 5:65f21c0b6b79 180
foxbrianr 5:65f21c0b6b79 181 pc.printf("Starting escmIOController task\n" );
foxbrianr 6:010ceb99f7b0 182
foxbrianr 3:ecaf9963341b 183 while(1) {
foxbrianr 6:010ceb99f7b0 184
foxbrianr 7:0244f1a26545 185 #if DEBUG
foxbrianr 6:010ceb99f7b0 186 UpdatePerfDataStart(&g_perfData.task[0]);
foxbrianr 7:0244f1a26545 187 #endif
foxbrianr 3:ecaf9963341b 188 escmController.update();
foxbrianr 6:010ceb99f7b0 189
foxbrianr 7:0244f1a26545 190 #if DEBUG
foxbrianr 6:010ceb99f7b0 191 UpdatePerfDataStop(&g_perfData.task[0]);
foxbrianr 7:0244f1a26545 192 #endif
foxbrianr 6:010ceb99f7b0 193 ThisThread::sleep_for(200);
foxbrianr 3:ecaf9963341b 194 }
foxbrianr 3:ecaf9963341b 195 }
foxbrianr 3:ecaf9963341b 196
foxbrianr 3:ecaf9963341b 197
foxbrianr 3:ecaf9963341b 198 /***********************************************************************
foxbrianr 3:ecaf9963341b 199 * Update LCD Display Thread
foxbrianr 3:ecaf9963341b 200 ***********************************************************************/
foxbrianr 3:ecaf9963341b 201
foxbrianr 5:65f21c0b6b79 202 void UpdateDisplay(void)
foxbrianr 5:65f21c0b6b79 203 {
foxbrianr 5:65f21c0b6b79 204 static int counter = 0;
foxbrianr 5:65f21c0b6b79 205
foxbrianr 5:65f21c0b6b79 206 pc.printf("Starting escmDisplay task\n" );
foxbrianr 5:65f21c0b6b79 207
foxbrianr 5:65f21c0b6b79 208 lcd.init();
foxbrianr 5:65f21c0b6b79 209 lcd.cls();
foxbrianr 5:65f21c0b6b79 210 lcd.locate(0,0);
foxbrianr 5:65f21c0b6b79 211 lcd.printf ("Initializing System..");
foxbrianr 6:010ceb99f7b0 212
foxbrianr 5:65f21c0b6b79 213 toggleLed3();
foxbrianr 6:010ceb99f7b0 214
foxbrianr 7:0244f1a26545 215 Menu *activeMenu = Menu::setCurrentMenu (&showEvents);
foxbrianr 6:010ceb99f7b0 216
foxbrianr 5:65f21c0b6b79 217 while (true) {
foxbrianr 5:65f21c0b6b79 218
foxbrianr 7:0244f1a26545 219 #if DEBUG
foxbrianr 6:010ceb99f7b0 220 UpdatePerfDataStart(&g_perfData.task[2]);
foxbrianr 7:0244f1a26545 221 #endif
foxbrianr 7:0244f1a26545 222 #if AUTO_REFESH_ENABLED
foxbrianr 6:010ceb99f7b0 223 // note force a refresh
foxbrianr 5:65f21c0b6b79 224 if (counter==0) {
foxbrianr 5:65f21c0b6b79 225 activeMenu->update_needed = 1;
foxbrianr 5:65f21c0b6b79 226 counter = 100;
foxbrianr 5:65f21c0b6b79 227 }
foxbrianr 6:010ceb99f7b0 228 counter--;
foxbrianr 6:010ceb99f7b0 229 #endif
foxbrianr 5:65f21c0b6b79 230 if (activeMenu == NULL){
foxbrianr 5:65f21c0b6b79 231 lcd.printf ("ERROR: Invalid Menu Selected..");
foxbrianr 5:65f21c0b6b79 232 continue;
foxbrianr 5:65f21c0b6b79 233 }
foxbrianr 5:65f21c0b6b79 234 else {
foxbrianr 5:65f21c0b6b79 235
foxbrianr 5:65f21c0b6b79 236 if ( activeMenu != Menu::getCurrentMenu() )
foxbrianr 5:65f21c0b6b79 237 {
foxbrianr 5:65f21c0b6b79 238 activeMenu = Menu::getCurrentMenu() ;
foxbrianr 5:65f21c0b6b79 239 activeMenu->update_needed = 1;
foxbrianr 5:65f21c0b6b79 240 }
foxbrianr 5:65f21c0b6b79 241 else
foxbrianr 5:65f21c0b6b79 242 {
foxbrianr 5:65f21c0b6b79 243
foxbrianr 5:65f21c0b6b79 244 escmBtnController.processCmdQueue(activeMenu);
foxbrianr 5:65f21c0b6b79 245 }
foxbrianr 5:65f21c0b6b79 246
foxbrianr 5:65f21c0b6b79 247 activeMenu->DrawDisplay(&lcd);
foxbrianr 5:65f21c0b6b79 248 }
foxbrianr 5:65f21c0b6b79 249
foxbrianr 5:65f21c0b6b79 250 toggleLed3();
foxbrianr 6:010ceb99f7b0 251
foxbrianr 7:0244f1a26545 252 #if DEBUG
foxbrianr 6:010ceb99f7b0 253 UpdatePerfDataStop(&g_perfData.task[2]);
foxbrianr 7:0244f1a26545 254 #endif
foxbrianr 6:010ceb99f7b0 255 ThisThread::sleep_for(10);
foxbrianr 5:65f21c0b6b79 256
foxbrianr 5:65f21c0b6b79 257 }
foxbrianr 5:65f21c0b6b79 258 }
foxbrianr 5:65f21c0b6b79 259 /***********************************************************************
foxbrianr 3:ecaf9963341b 260 * Play sounds
foxbrianr 3:ecaf9963341b 261 * TODO: should have its own queue.
foxbrianr 3:ecaf9963341b 262 ***********************************************************************/
foxbrianr 3:ecaf9963341b 263
foxbrianr 5:65f21c0b6b79 264 void PlaySound(void) // const *name)
foxbrianr 3:ecaf9963341b 265 {
foxbrianr 5:65f21c0b6b79 266 led2 = 1;
foxbrianr 5:65f21c0b6b79 267 pc.printf("Starting escmSound task\n" );
foxbrianr 5:65f21c0b6b79 268
foxbrianr 5:65f21c0b6b79 269 while (1) {
foxbrianr 6:010ceb99f7b0 270
foxbrianr 7:0244f1a26545 271 #if DEBUG
foxbrianr 6:010ceb99f7b0 272 UpdatePerfDataStart(&g_perfData.task[3]);
foxbrianr 7:0244f1a26545 273 #endif
foxbrianr 5:65f21c0b6b79 274 toggleLed2();
foxbrianr 5:65f21c0b6b79 275 escmController.processSoundQueue();
foxbrianr 6:010ceb99f7b0 276
foxbrianr 7:0244f1a26545 277 #if DEBUG
foxbrianr 6:010ceb99f7b0 278 UpdatePerfDataStop(&g_perfData.task[3]);
foxbrianr 7:0244f1a26545 279 #endif
foxbrianr 5:65f21c0b6b79 280 Thread::wait(200);
foxbrianr 3:ecaf9963341b 281 }
foxbrianr 3:ecaf9963341b 282 }
foxbrianr 3:ecaf9963341b 283
foxbrianr 5:65f21c0b6b79 284
foxbrianr 7:0244f1a26545 285 #if DEBUG
foxbrianr 5:65f21c0b6b79 286 /***********************************************************************
foxbrianr 5:65f21c0b6b79 287 * Dumps thread stats
foxbrianr 5:65f21c0b6b79 288 ***********************************************************************/
foxbrianr 5:65f21c0b6b79 289
foxbrianr 5:65f21c0b6b79 290 void PrintSystemStats (void)
foxbrianr 5:65f21c0b6b79 291 {
foxbrianr 5:65f21c0b6b79 292 uint32_t frameCount = 0;
foxbrianr 5:65f21c0b6b79 293 while(1) {
foxbrianr 5:65f21c0b6b79 294 frameCount++;
foxbrianr 5:65f21c0b6b79 295 if ((0 == frameCount) || (PRINT_AFTER_N_LOOPS == frameCount)) {
foxbrianr 5:65f21c0b6b79 296 // Following the main thread wait, report on the current system status
foxbrianr 6:010ceb99f7b0 297 sys_state->report_state();
foxbrianr 6:010ceb99f7b0 298 #if 1
foxbrianr 6:010ceb99f7b0 299
foxbrianr 6:010ceb99f7b0 300 pc.printf("IDLE=%d", idle);
foxbrianr 6:010ceb99f7b0 301 pc.printf("\nThread | cntr | T | Cycle Time | Delta Time ");
foxbrianr 6:010ceb99f7b0 302 pc.printf("\n-------------------------------------------------------------------- ");
foxbrianr 6:010ceb99f7b0 303 pc.printf("\n");
foxbrianr 6:010ceb99f7b0 304
foxbrianr 6:010ceb99f7b0 305 for(int i = 0; i<MAX_THREADS; i++) {
foxbrianr 6:010ceb99f7b0 306 pc.printf("%-8d | %-5d | %-5d | %-5d | %-5d | %-5d | %-5d | %-5d | %-5d \n\r",
foxbrianr 6:010ceb99f7b0 307 i ,
foxbrianr 6:010ceb99f7b0 308 g_perfData.task[i].counter ,
foxbrianr 6:010ceb99f7b0 309 g_perfData.task[i].timeStamp ,
foxbrianr 6:010ceb99f7b0 310 g_perfData.task[i].cycleTimeAve ,
foxbrianr 6:010ceb99f7b0 311 g_perfData.task[i].cycleTimeMax ,
foxbrianr 6:010ceb99f7b0 312 g_perfData.task[i].cycleTimeMin ,
foxbrianr 6:010ceb99f7b0 313 g_perfData.task[i].deltaTimeAve ,
foxbrianr 6:010ceb99f7b0 314 g_perfData.task[i].deltaTimeMax ,
foxbrianr 6:010ceb99f7b0 315 g_perfData.task[i].deltaTimeMin );
foxbrianr 6:010ceb99f7b0 316 }
foxbrianr 6:010ceb99f7b0 317 #else
foxbrianr 5:65f21c0b6b79 318 pc.printf("\nThread | size | free | used | max | ");
foxbrianr 5:65f21c0b6b79 319 pc.printf("\n------------------------------------ ");
foxbrianr 6:010ceb99f7b0 320 pc.printf("\n");
foxbrianr 6:010ceb99f7b0 321
foxbrianr 5:65f21c0b6b79 322 for(int i = 0; i<MAX_THREADS; i++) {
foxbrianr 5:65f21c0b6b79 323 pc.printf("\n%-8d | %4d | %4d | %4d | %4d |",
foxbrianr 5:65f21c0b6b79 324 i,
foxbrianr 5:65f21c0b6b79 325 threads[i]->stack_size(),
foxbrianr 5:65f21c0b6b79 326 threads[i]->free_stack(),
foxbrianr 5:65f21c0b6b79 327 threads[i]->used_stack(),
foxbrianr 5:65f21c0b6b79 328 threads[i]->max_stack()
foxbrianr 5:65f21c0b6b79 329 ) ;
foxbrianr 6:010ceb99f7b0 330
foxbrianr 5:65f21c0b6b79 331 }
foxbrianr 5:65f21c0b6b79 332 #endif
foxbrianr 6:010ceb99f7b0 333
foxbrianr 6:010ceb99f7b0 334 pc.printf("\n------------------------------------ ");
foxbrianr 6:010ceb99f7b0 335 pc.printf("\n");
foxbrianr 6:010ceb99f7b0 336
foxbrianr 5:65f21c0b6b79 337 escmEventLog.save();
foxbrianr 5:65f21c0b6b79 338 frameCount = 0;
foxbrianr 5:65f21c0b6b79 339 }
foxbrianr 5:65f21c0b6b79 340
foxbrianr 6:010ceb99f7b0 341 Thread::wait(200);
foxbrianr 5:65f21c0b6b79 342 }
foxbrianr 5:65f21c0b6b79 343 }
foxbrianr 7:0244f1a26545 344 #endif
foxbrianr 5:65f21c0b6b79 345
foxbrianr 7:0244f1a26545 346
foxbrianr 7:0244f1a26545 347 #if TEST
foxbrianr 7:0244f1a26545 348 /***********************************************************************
foxbrianr 7:0244f1a26545 349 * Handle Terminal Prompts
foxbrianr 7:0244f1a26545 350 * TODO: should have its own queue.
foxbrianr 7:0244f1a26545 351 ***********************************************************************/
foxbrianr 7:0244f1a26545 352
foxbrianr 7:0244f1a26545 353 void TerminalPrompt(void) // const *name)
foxbrianr 7:0244f1a26545 354 {
foxbrianr 7:0244f1a26545 355
foxbrianr 7:0244f1a26545 356 pc.printf("Starting escmTerm task\n" );
foxbrianr 7:0244f1a26545 357
foxbrianr 7:0244f1a26545 358 while (1)
foxbrianr 7:0244f1a26545 359 {
foxbrianr 7:0244f1a26545 360 int c;
foxbrianr 7:0244f1a26545 361 pc.printf("\n>>");
foxbrianr 7:0244f1a26545 362 pc.scanf("%d", &c);
foxbrianr 7:0244f1a26545 363
foxbrianr 7:0244f1a26545 364 /* echo */
foxbrianr 7:0244f1a26545 365 pc.printf("\n%0d",c);
foxbrianr 7:0244f1a26545 366
foxbrianr 7:0244f1a26545 367 if ( c >= 0 && c < 99) {
foxbrianr 7:0244f1a26545 368 ESCMControlApp::postEvent((uint16_t)c,99);
foxbrianr 7:0244f1a26545 369 }
foxbrianr 7:0244f1a26545 370 else if (c==555)
foxbrianr 7:0244f1a26545 371 {
foxbrianr 7:0244f1a26545 372 addressMap.reset();
foxbrianr 7:0244f1a26545 373 }
foxbrianr 7:0244f1a26545 374 else if (c==666)
foxbrianr 7:0244f1a26545 375 {
foxbrianr 7:0244f1a26545 376 escmEventLog.reset();
foxbrianr 7:0244f1a26545 377 }
foxbrianr 7:0244f1a26545 378 else if (c==999)
foxbrianr 7:0244f1a26545 379 {
foxbrianr 7:0244f1a26545 380 pc.printf("\nThread | size | free | used | max | ");
foxbrianr 7:0244f1a26545 381 pc.printf("\n------------------------------------ ");
foxbrianr 7:0244f1a26545 382 for(int i = 0; i<MAX_THREADS; i++) {
foxbrianr 7:0244f1a26545 383 pc.printf("\n%-8d | %4d | %4d | %4d | %4d |",
foxbrianr 7:0244f1a26545 384 i,
foxbrianr 7:0244f1a26545 385 threads[i]->stack_size(),
foxbrianr 7:0244f1a26545 386 threads[i]->free_stack(),
foxbrianr 7:0244f1a26545 387 threads[i]->used_stack(),
foxbrianr 7:0244f1a26545 388 threads[i]->max_stack()
foxbrianr 7:0244f1a26545 389 ) ;
foxbrianr 7:0244f1a26545 390 }
foxbrianr 7:0244f1a26545 391 }
foxbrianr 7:0244f1a26545 392 else
foxbrianr 7:0244f1a26545 393 {
foxbrianr 7:0244f1a26545 394 }
foxbrianr 7:0244f1a26545 395 }
foxbrianr 7:0244f1a26545 396 }
foxbrianr 5:65f21c0b6b79 397 /***********************************************************************
foxbrianr 5:65f21c0b6b79 398 * process incoming messages from rx485 serial (ISR)
foxbrianr 5:65f21c0b6b79 399 ***********************************************************************/
foxbrianr 5:65f21c0b6b79 400
foxbrianr 5:65f21c0b6b79 401 void rx485Message() {
foxbrianr 6:010ceb99f7b0 402
foxbrianr 6:010ceb99f7b0 403 #if 1
foxbrianr 6:010ceb99f7b0 404 dataRxCnt++;
foxbrianr 6:010ceb99f7b0 405 #else
foxbrianr 5:65f21c0b6b79 406 // Note: you need to actually read from the serial to clear the RX interrupt
foxbrianr 5:65f21c0b6b79 407 int dataRxBuffer[4];
foxbrianr 5:65f21c0b6b79 408 int value = rs485port1.getc();
foxbrianr 5:65f21c0b6b79 409
foxbrianr 5:65f21c0b6b79 410 if (value){
foxbrianr 5:65f21c0b6b79 411 dataRxBuffer[dataRxCnt++]=value;
foxbrianr 5:65f21c0b6b79 412
foxbrianr 5:65f21c0b6b79 413 if(dataRxCnt==4) {
foxbrianr 5:65f21c0b6b79 414 cur_address = 10*(dataRxBuffer[0] -0x30) + (dataRxBuffer[1] -0x30);
foxbrianr 5:65f21c0b6b79 415 memset(dataRxBuffer,0,sizeof(dataRxBuffer));
foxbrianr 5:65f21c0b6b79 416 dataRxCnt=0;
foxbrianr 5:65f21c0b6b79 417 }
foxbrianr 5:65f21c0b6b79 418 else
foxbrianr 5:65f21c0b6b79 419 {
foxbrianr 5:65f21c0b6b79 420 // do nothing
foxbrianr 5:65f21c0b6b79 421 }
foxbrianr 5:65f21c0b6b79 422 }
foxbrianr 6:010ceb99f7b0 423 #endif
foxbrianr 5:65f21c0b6b79 424 }
foxbrianr 7:0244f1a26545 425 #endif
foxbrianr 6:010ceb99f7b0 426 /***********************************************************************
foxbrianr 6:010ceb99f7b0 427 * Main Loop
foxbrianr 6:010ceb99f7b0 428 ***********************************************************************/
foxbrianr 6:010ceb99f7b0 429 void backgroundTask(void)
foxbrianr 6:010ceb99f7b0 430 {
foxbrianr 6:010ceb99f7b0 431 idle++;
foxbrianr 6:010ceb99f7b0 432 }
foxbrianr 3:ecaf9963341b 433 /***********************************************************************
foxbrianr 3:ecaf9963341b 434 * Main Loop
foxbrianr 3:ecaf9963341b 435 ***********************************************************************/
foxbrianr 0:91f25a0f819c 436
foxbrianr 5:65f21c0b6b79 437 int main()
foxbrianr 6:010ceb99f7b0 438 { pc.printf("\n\r");
foxbrianr 5:65f21c0b6b79 439
foxbrianr 0:91f25a0f819c 440 pc.printf("=====================================\n\r");
foxbrianr 5:65f21c0b6b79 441 pc.printf("= ESCM 2000 =\n\r");
foxbrianr 5:65f21c0b6b79 442 pc.printf("= %s %s =\n\r", __DATE__ , __TIME__);
foxbrianr 5:65f21c0b6b79 443 pc.printf("= v0.01 =\n\r");
foxbrianr 0:91f25a0f819c 444 pc.printf("=====================================\n\r");
foxbrianr 0:91f25a0f819c 445
foxbrianr 6:010ceb99f7b0 446 sys_state = new SystemReport( SLEEP_TIME * PRINT_AFTER_N_LOOPS /* Loop delay time in ms */);
foxbrianr 6:010ceb99f7b0 447
foxbrianr 6:010ceb99f7b0 448
foxbrianr 6:010ceb99f7b0 449 Kernel::attach_idle_hook(&backgroundTask);
foxbrianr 6:010ceb99f7b0 450
foxbrianr 6:010ceb99f7b0 451 led1=1;
foxbrianr 6:010ceb99f7b0 452 led1=!led1;
foxbrianr 6:010ceb99f7b0 453
foxbrianr 6:010ceb99f7b0 454
foxbrianr 7:0244f1a26545 455 #if DEBUG
foxbrianr 6:010ceb99f7b0 456 InitPerfData();
foxbrianr 7:0244f1a26545 457 #endif
foxbrianr 7:0244f1a26545 458
foxbrianr 8:f15a5358883c 459 // -----------------------------------
foxbrianr 8:f15a5358883c 460 // set LCD configuration
foxbrianr 8:f15a5358883c 461 // -----------------------------------
foxbrianr 6:010ceb99f7b0 462 lcd.init();
foxbrianr 6:010ceb99f7b0 463 lcd.cls();
foxbrianr 6:010ceb99f7b0 464 lcd.locate(0,0);
foxbrianr 6:010ceb99f7b0 465 lcd.printf ("Initializing System..");
foxbrianr 6:010ceb99f7b0 466
foxbrianr 8:f15a5358883c 467 // -----------------------------------
foxbrianr 8:f15a5358883c 468 // set EMIC speaker configuration
foxbrianr 8:f15a5358883c 469 // -----------------------------------
foxbrianr 8:f15a5358883c 470 speaker.volume(18);
foxbrianr 8:f15a5358883c 471 speaker.voice(3);
foxbrianr 8:f15a5358883c 472
foxbrianr 6:010ceb99f7b0 473 escmController.say("Welcome ESCM");
foxbrianr 5:65f21c0b6b79 474
foxbrianr 8:f15a5358883c 475 // -----------------------------------
foxbrianr 5:65f21c0b6b79 476 // initialize main controller
foxbrianr 8:f15a5358883c 477 // -----------------------------------
foxbrianr 3:ecaf9963341b 478 escmController.init();
foxbrianr 0:91f25a0f819c 479
foxbrianr 6:010ceb99f7b0 480 //escmRs485_Input.attach ( &rx485Message );
foxbrianr 6:010ceb99f7b0 481 //addressMap.display(&pc);
foxbrianr 6:010ceb99f7b0 482
foxbrianr 5:65f21c0b6b79 483 toggleLed1();
foxbrianr 5:65f21c0b6b79 484
foxbrianr 8:f15a5358883c 485 // -----------------------------------
foxbrianr 8:f15a5358883c 486 // Setup menus
foxbrianr 8:f15a5358883c 487 // -----------------------------------
foxbrianr 5:65f21c0b6b79 488 rootMenu.add(&showEvents);
foxbrianr 5:65f21c0b6b79 489 rootMenu.add(&editTime);
foxbrianr 5:65f21c0b6b79 490 rootMenu.add(&editAddress);
foxbrianr 5:65f21c0b6b79 491 rootMenu.add(&factoryReset);
foxbrianr 5:65f21c0b6b79 492 Menu::setCurrentMenu (&rootMenu);
foxbrianr 5:65f21c0b6b79 493
foxbrianr 5:65f21c0b6b79 494 toggleLed1();
foxbrianr 3:ecaf9963341b 495
foxbrianr 8:f15a5358883c 496 // -----------------------------------
foxbrianr 8:f15a5358883c 497 // Setup threads
foxbrianr 8:f15a5358883c 498 // -----------------------------------
foxbrianr 5:65f21c0b6b79 499 threads[0] = new Thread(osPriorityNormal5, 0x300 );
foxbrianr 5:65f21c0b6b79 500 threads[1] = new Thread(osPriorityNormal4, 0x500 );
foxbrianr 5:65f21c0b6b79 501 threads[2] = new Thread(osPriorityNormal3, 0x1000 );
foxbrianr 5:65f21c0b6b79 502 threads[3] = new Thread(osPriorityNormal2, 0x400 );
foxbrianr 7:0244f1a26545 503 #if DEBUG
foxbrianr 5:65f21c0b6b79 504 threads[4] = new Thread(osPriorityNormal1, 0x200 );
foxbrianr 7:0244f1a26545 505 #endif
foxbrianr 7:0244f1a26545 506
foxbrianr 7:0244f1a26545 507 #if TEST
foxbrianr 5:65f21c0b6b79 508 threads[5] = new Thread(osPriorityLow, 0x100 );
foxbrianr 7:0244f1a26545 509 #endif
foxbrianr 5:65f21c0b6b79 510
foxbrianr 6:010ceb99f7b0 511
foxbrianr 8:f15a5358883c 512 // -----------------------------------
foxbrianr 8:f15a5358883c 513 // Start threads
foxbrianr 8:f15a5358883c 514 // -----------------------------------
foxbrianr 5:65f21c0b6b79 515 threads[0]->start(ESCMController_Update);
foxbrianr 5:65f21c0b6b79 516 threads[1]->start(ReadGPIOExtender);
foxbrianr 5:65f21c0b6b79 517 threads[2]->start(UpdateDisplay);
foxbrianr 5:65f21c0b6b79 518 threads[3]->start(PlaySound);
foxbrianr 7:0244f1a26545 519 #if DEBUG
foxbrianr 7:0244f1a26545 520 //threads[4]->start(PrintSystemStats);
foxbrianr 7:0244f1a26545 521 #endif
foxbrianr 7:0244f1a26545 522
foxbrianr 7:0244f1a26545 523 #if TEST
foxbrianr 7:0244f1a26545 524 threads[5]->start(TerminalPrompt);
foxbrianr 7:0244f1a26545 525 #endif
foxbrianr 3:ecaf9963341b 526
foxbrianr 8:f15a5358883c 527 // -----------------------------------
foxbrianr 8:f15a5358883c 528 // Loop forever
foxbrianr 8:f15a5358883c 529 // -----------------------------------
foxbrianr 0:91f25a0f819c 530 while(1) {
foxbrianr 5:65f21c0b6b79 531 toggleLed1();
foxbrianr 6:010ceb99f7b0 532 ThisThread::sleep_for(500);
foxbrianr 0:91f25a0f819c 533 }
foxbrianr 0:91f25a0f819c 534 }
foxbrianr 0:91f25a0f819c 535