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:
Tue Sep 17 13:48:57 2019 +0000
Revision:
6:010ceb99f7b0
Parent:
5:65f21c0b6b79
Child:
7:0244f1a26545
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 6:010ceb99f7b0 56 OsTaskPerfData_t g_perfData;
foxbrianr 0:91f25a0f819c 57
foxbrianr 5:65f21c0b6b79 58 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 59 * define displays
foxbrianr 5:65f21c0b6b79 60 *-------------------------------------------------------------------*/
foxbrianr 3:ecaf9963341b 61 LCD lcd;
foxbrianr 3:ecaf9963341b 62
foxbrianr 5:65f21c0b6b79 63 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 64 * define displays
foxbrianr 5:65f21c0b6b79 65 *-------------------------------------------------------------------*/
foxbrianr 5:65f21c0b6b79 66 Menu rootMenu ("root menu");
foxbrianr 5:65f21c0b6b79 67 EditTimeMenu editTime ("Edit Time");
foxbrianr 5:65f21c0b6b79 68 EditAddressMenu editAddress ("Edit Addresses");
foxbrianr 5:65f21c0b6b79 69 DisplayCodesMenu showEvents ("Display Events" );
foxbrianr 5:65f21c0b6b79 70 FactoryResetMenu factoryReset("Factory Reset" );
foxbrianr 6:010ceb99f7b0 71
foxbrianr 5:65f21c0b6b79 72 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 73 * define display escmBtnController
foxbrianr 5:65f21c0b6b79 74 *-------------------------------------------------------------------*/
foxbrianr 5:65f21c0b6b79 75 ButtonController escmBtnController;
foxbrianr 5:65f21c0b6b79 76
foxbrianr 5:65f21c0b6b79 77 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 78 * define application
foxbrianr 5:65f21c0b6b79 79 *-------------------------------------------------------------------*/
foxbrianr 5:65f21c0b6b79 80 ESCMControlApp escmController;
foxbrianr 3:ecaf9963341b 81
foxbrianr 6:010ceb99f7b0 82 static int dataRxCnt = 0;
foxbrianr 5:65f21c0b6b79 83 /*-------------------------------------------------------------------
foxbrianr 5:65f21c0b6b79 84 * define led toggles for diagnostics
foxbrianr 5:65f21c0b6b79 85 *-------------------------------------------------------------------*/
foxbrianr 5:65f21c0b6b79 86 void toggleLed1(){ led1 = !led1;}
foxbrianr 5:65f21c0b6b79 87 void toggleLed2(){ led2 = !led2;}
foxbrianr 5:65f21c0b6b79 88 void toggleLed3(){ led3 = !led3;}
foxbrianr 5:65f21c0b6b79 89 void toggleLed4(){ led4 = !led4;}
foxbrianr 3:ecaf9963341b 90
foxbrianr 6:010ceb99f7b0 91 static volatile uint64_t idle;
foxbrianr 6:010ceb99f7b0 92
foxbrianr 6:010ceb99f7b0 93 void InitPerfData()
foxbrianr 6:010ceb99f7b0 94 {
foxbrianr 6:010ceb99f7b0 95 for (int i=0;i<MAX_THREADS;i++)
foxbrianr 6:010ceb99f7b0 96 {
foxbrianr 6:010ceb99f7b0 97 g_perfData.task[i].counter = 0;
foxbrianr 6:010ceb99f7b0 98 g_perfData.task[i].deltaTime = 0;
foxbrianr 6:010ceb99f7b0 99 g_perfData.task[i].deltaTimeMax = 0;
foxbrianr 6:010ceb99f7b0 100 g_perfData.task[i].deltaTimeMin = 0xFFFFFFFFu;
foxbrianr 6:010ceb99f7b0 101 g_perfData.task[i].deltaTimeAve = 0;
foxbrianr 6:010ceb99f7b0 102
foxbrianr 6:010ceb99f7b0 103 g_perfData.task[i].cycleTimeMax = 0;
foxbrianr 6:010ceb99f7b0 104 g_perfData.task[i].cycleTimeMin = 0xFFFFFFFFu;
foxbrianr 6:010ceb99f7b0 105 g_perfData.task[i].cycleTimeAve = 0;
foxbrianr 6:010ceb99f7b0 106
foxbrianr 6:010ceb99f7b0 107 g_perfData.task[i].timeStamp = 0;
foxbrianr 6:010ceb99f7b0 108 g_perfData.task[i].lastTimeStamp = 0;
foxbrianr 6:010ceb99f7b0 109 }
foxbrianr 6:010ceb99f7b0 110 }
foxbrianr 6:010ceb99f7b0 111
foxbrianr 6:010ceb99f7b0 112 void UpdatePerfDataStart(OsPerfData_t *data)
foxbrianr 6:010ceb99f7b0 113 {
foxbrianr 6:010ceb99f7b0 114 #if 1
foxbrianr 6:010ceb99f7b0 115 if (data != NULL) {
foxbrianr 6:010ceb99f7b0 116 uint64_t now = Kernel::get_ms_count();
foxbrianr 6:010ceb99f7b0 117 data->counter++;
foxbrianr 6:010ceb99f7b0 118 data->timeStamp = now;
foxbrianr 6:010ceb99f7b0 119 data->cycleTime = data->timeStamp - data->lastTimeStamp;
foxbrianr 6:010ceb99f7b0 120 if (data->cycleTime > data->cycleTimeMax ) data->cycleTimeMax = data->cycleTime;
foxbrianr 6:010ceb99f7b0 121 if (data->cycleTime < data->cycleTimeMin ) data->cycleTimeMin = data->cycleTime;
foxbrianr 6:010ceb99f7b0 122 data->cycleTimeAve = (data->cycleTime - data->cycleTimeAve)/2;
foxbrianr 6:010ceb99f7b0 123 data->lastTimeStamp = data->timeStamp;
foxbrianr 6:010ceb99f7b0 124 }
foxbrianr 6:010ceb99f7b0 125 #endif
foxbrianr 6:010ceb99f7b0 126 }
foxbrianr 6:010ceb99f7b0 127
foxbrianr 6:010ceb99f7b0 128 void UpdatePerfDataStop(OsPerfData_t *data)
foxbrianr 6:010ceb99f7b0 129 {
foxbrianr 6:010ceb99f7b0 130 #if 1
foxbrianr 6:010ceb99f7b0 131 if (data != NULL) {
foxbrianr 6:010ceb99f7b0 132 uint64_t now = Kernel::get_ms_count();
foxbrianr 6:010ceb99f7b0 133 data->deltaTime = now - (data->timeStamp);
foxbrianr 6:010ceb99f7b0 134 if (data->deltaTime > data->deltaTimeMax ) data->deltaTimeMax = data->deltaTime;
foxbrianr 6:010ceb99f7b0 135 if (data->deltaTime < data->deltaTimeMin ) data->deltaTimeMin = data->deltaTime;
foxbrianr 6:010ceb99f7b0 136 data->deltaTimeAve = (data->deltaTime + data->deltaTimeAve)/2;
foxbrianr 6:010ceb99f7b0 137 data->timeStamp = now;
foxbrianr 6:010ceb99f7b0 138
foxbrianr 6:010ceb99f7b0 139 }
foxbrianr 6:010ceb99f7b0 140 #endif
foxbrianr 6:010ceb99f7b0 141 }
foxbrianr 6:010ceb99f7b0 142
foxbrianr 6:010ceb99f7b0 143 void ShowPerfData (OsPerfData_t *data)
foxbrianr 6:010ceb99f7b0 144 {
foxbrianr 6:010ceb99f7b0 145 }
foxbrianr 6:010ceb99f7b0 146
foxbrianr 5:65f21c0b6b79 147
foxbrianr 3:ecaf9963341b 148 /***********************************************************************
foxbrianr 3:ecaf9963341b 149 * Thread to read GPIO and handle events
foxbrianr 3:ecaf9963341b 150 ***********************************************************************/
foxbrianr 3:ecaf9963341b 151
foxbrianr 6:010ceb99f7b0 152 void ReadGPIOExtender(void)
foxbrianr 3:ecaf9963341b 153 {
foxbrianr 3:ecaf9963341b 154 uint8_t code = 0;
foxbrianr 5:65f21c0b6b79 155
foxbrianr 6:010ceb99f7b0 156 Timer t;
foxbrianr 6:010ceb99f7b0 157
foxbrianr 5:65f21c0b6b79 158 pc.printf("Starting escmBtnController task\n" );
foxbrianr 5:65f21c0b6b79 159 toggleLed4();
foxbrianr 3:ecaf9963341b 160
foxbrianr 3:ecaf9963341b 161 while (true) {
foxbrianr 6:010ceb99f7b0 162 t.reset();
foxbrianr 6:010ceb99f7b0 163 t.start();
foxbrianr 5:65f21c0b6b79 164 escmBtnController.update();
foxbrianr 5:65f21c0b6b79 165 toggleLed4();
foxbrianr 6:010ceb99f7b0 166 ThisThread::sleep_for(50);
foxbrianr 6:010ceb99f7b0 167
foxbrianr 6:010ceb99f7b0 168 t.stop();
foxbrianr 6:010ceb99f7b0 169 //printf("<1> %d ms\n", t.read_ms());
foxbrianr 3:ecaf9963341b 170 }
foxbrianr 3:ecaf9963341b 171 }
foxbrianr 3:ecaf9963341b 172
foxbrianr 3:ecaf9963341b 173 /***********************************************************************
foxbrianr 3:ecaf9963341b 174 * Thread to read GPIO and handle events
foxbrianr 3:ecaf9963341b 175 ***********************************************************************/
foxbrianr 3:ecaf9963341b 176
foxbrianr 6:010ceb99f7b0 177 void ESCMController_Update(void)
foxbrianr 3:ecaf9963341b 178 {
foxbrianr 5:65f21c0b6b79 179
foxbrianr 5:65f21c0b6b79 180 pc.printf("Starting escmIOController task\n" );
foxbrianr 6:010ceb99f7b0 181
foxbrianr 3:ecaf9963341b 182 while(1) {
foxbrianr 6:010ceb99f7b0 183
foxbrianr 6:010ceb99f7b0 184 UpdatePerfDataStart(&g_perfData.task[0]);
foxbrianr 3:ecaf9963341b 185 escmController.update();
foxbrianr 6:010ceb99f7b0 186
foxbrianr 6:010ceb99f7b0 187 UpdatePerfDataStop(&g_perfData.task[0]);
foxbrianr 6:010ceb99f7b0 188 ThisThread::sleep_for(200);
foxbrianr 3:ecaf9963341b 189 }
foxbrianr 3:ecaf9963341b 190 }
foxbrianr 3:ecaf9963341b 191
foxbrianr 3:ecaf9963341b 192
foxbrianr 3:ecaf9963341b 193 /***********************************************************************
foxbrianr 3:ecaf9963341b 194 * Update LCD Display Thread
foxbrianr 3:ecaf9963341b 195 ***********************************************************************/
foxbrianr 3:ecaf9963341b 196
foxbrianr 5:65f21c0b6b79 197 void UpdateDisplay(void)
foxbrianr 5:65f21c0b6b79 198 {
foxbrianr 5:65f21c0b6b79 199 static int counter = 0;
foxbrianr 5:65f21c0b6b79 200
foxbrianr 5:65f21c0b6b79 201 pc.printf("Starting escmDisplay task\n" );
foxbrianr 5:65f21c0b6b79 202
foxbrianr 5:65f21c0b6b79 203 lcd.init();
foxbrianr 5:65f21c0b6b79 204 lcd.cls();
foxbrianr 5:65f21c0b6b79 205 lcd.locate(0,0);
foxbrianr 5:65f21c0b6b79 206 lcd.printf ("Initializing System..");
foxbrianr 6:010ceb99f7b0 207
foxbrianr 5:65f21c0b6b79 208 toggleLed3();
foxbrianr 6:010ceb99f7b0 209
foxbrianr 6:010ceb99f7b0 210 Menu *activeMenu = Menu::setCurrentMenu (&editAddress);
foxbrianr 6:010ceb99f7b0 211
foxbrianr 5:65f21c0b6b79 212 while (true) {
foxbrianr 5:65f21c0b6b79 213
foxbrianr 6:010ceb99f7b0 214 UpdatePerfDataStart(&g_perfData.task[2]);
foxbrianr 6:010ceb99f7b0 215 #if 0
foxbrianr 6:010ceb99f7b0 216 // note force a refresh
foxbrianr 5:65f21c0b6b79 217 if (counter==0) {
foxbrianr 5:65f21c0b6b79 218 activeMenu->update_needed = 1;
foxbrianr 5:65f21c0b6b79 219 counter = 100;
foxbrianr 5:65f21c0b6b79 220 }
foxbrianr 6:010ceb99f7b0 221 counter--;
foxbrianr 6:010ceb99f7b0 222 #endif
foxbrianr 5:65f21c0b6b79 223 if (activeMenu == NULL){
foxbrianr 5:65f21c0b6b79 224 lcd.printf ("ERROR: Invalid Menu Selected..");
foxbrianr 5:65f21c0b6b79 225 continue;
foxbrianr 5:65f21c0b6b79 226 }
foxbrianr 5:65f21c0b6b79 227 else {
foxbrianr 5:65f21c0b6b79 228
foxbrianr 5:65f21c0b6b79 229 if ( activeMenu != Menu::getCurrentMenu() )
foxbrianr 5:65f21c0b6b79 230 {
foxbrianr 5:65f21c0b6b79 231 activeMenu = Menu::getCurrentMenu() ;
foxbrianr 5:65f21c0b6b79 232 activeMenu->update_needed = 1;
foxbrianr 5:65f21c0b6b79 233 }
foxbrianr 5:65f21c0b6b79 234 else
foxbrianr 5:65f21c0b6b79 235 {
foxbrianr 5:65f21c0b6b79 236
foxbrianr 5:65f21c0b6b79 237 escmBtnController.processCmdQueue(activeMenu);
foxbrianr 5:65f21c0b6b79 238 }
foxbrianr 5:65f21c0b6b79 239
foxbrianr 5:65f21c0b6b79 240 activeMenu->DrawDisplay(&lcd);
foxbrianr 5:65f21c0b6b79 241 }
foxbrianr 5:65f21c0b6b79 242
foxbrianr 5:65f21c0b6b79 243 toggleLed3();
foxbrianr 6:010ceb99f7b0 244
foxbrianr 6:010ceb99f7b0 245 UpdatePerfDataStop(&g_perfData.task[2]);
foxbrianr 6:010ceb99f7b0 246 ThisThread::sleep_for(10);
foxbrianr 5:65f21c0b6b79 247
foxbrianr 5:65f21c0b6b79 248 }
foxbrianr 5:65f21c0b6b79 249 }
foxbrianr 5:65f21c0b6b79 250 /***********************************************************************
foxbrianr 5:65f21c0b6b79 251 * Handle Terminal Prompts
foxbrianr 5:65f21c0b6b79 252 * TODO: should have its own queue.
foxbrianr 5:65f21c0b6b79 253 ***********************************************************************/
foxbrianr 5:65f21c0b6b79 254
foxbrianr 5:65f21c0b6b79 255 void TerminalPrompt(void) // const *name)
foxbrianr 3:ecaf9963341b 256 {
foxbrianr 3:ecaf9963341b 257
foxbrianr 5:65f21c0b6b79 258 pc.printf("Starting escmTerm task\n" );
foxbrianr 3:ecaf9963341b 259
foxbrianr 5:65f21c0b6b79 260 while (1)
foxbrianr 5:65f21c0b6b79 261 {
foxbrianr 5:65f21c0b6b79 262 int c;
foxbrianr 5:65f21c0b6b79 263 pc.printf("\n>>");
foxbrianr 5:65f21c0b6b79 264 pc.scanf("%d", &c);
foxbrianr 3:ecaf9963341b 265
foxbrianr 5:65f21c0b6b79 266 /* echo */
foxbrianr 5:65f21c0b6b79 267 pc.printf("\n%0d",c);
foxbrianr 3:ecaf9963341b 268
foxbrianr 5:65f21c0b6b79 269 if ( c >= 0 && c < 99) {
foxbrianr 5:65f21c0b6b79 270 ESCMControlApp::postEvent((uint16_t)c);
foxbrianr 5:65f21c0b6b79 271 }
foxbrianr 5:65f21c0b6b79 272 else if (c==555)
foxbrianr 5:65f21c0b6b79 273 {
foxbrianr 5:65f21c0b6b79 274 addressMap.reset();
foxbrianr 5:65f21c0b6b79 275 }
foxbrianr 5:65f21c0b6b79 276 else if (c==666)
foxbrianr 5:65f21c0b6b79 277 {
foxbrianr 5:65f21c0b6b79 278 escmEventLog.reset();
foxbrianr 5:65f21c0b6b79 279 }
foxbrianr 5:65f21c0b6b79 280 else if (c==999)
foxbrianr 5:65f21c0b6b79 281 {
foxbrianr 5:65f21c0b6b79 282 pc.printf("\nThread | size | free | used | max | ");
foxbrianr 5:65f21c0b6b79 283 pc.printf("\n------------------------------------ ");
foxbrianr 5:65f21c0b6b79 284 for(int i = 0; i<MAX_THREADS; i++) {
foxbrianr 5:65f21c0b6b79 285 pc.printf("\n%-8d | %4d | %4d | %4d | %4d |",
foxbrianr 5:65f21c0b6b79 286 i,
foxbrianr 5:65f21c0b6b79 287 threads[i]->stack_size(),
foxbrianr 5:65f21c0b6b79 288 threads[i]->free_stack(),
foxbrianr 5:65f21c0b6b79 289 threads[i]->used_stack(),
foxbrianr 5:65f21c0b6b79 290 threads[i]->max_stack()
foxbrianr 5:65f21c0b6b79 291 ) ;
foxbrianr 5:65f21c0b6b79 292 }
foxbrianr 5:65f21c0b6b79 293 }
foxbrianr 5:65f21c0b6b79 294 else
foxbrianr 5:65f21c0b6b79 295 {
foxbrianr 5:65f21c0b6b79 296 }
foxbrianr 3:ecaf9963341b 297 }
foxbrianr 3:ecaf9963341b 298 }
foxbrianr 3:ecaf9963341b 299 /***********************************************************************
foxbrianr 3:ecaf9963341b 300 * Play sounds
foxbrianr 3:ecaf9963341b 301 * TODO: should have its own queue.
foxbrianr 3:ecaf9963341b 302 ***********************************************************************/
foxbrianr 3:ecaf9963341b 303
foxbrianr 5:65f21c0b6b79 304 void PlaySound(void) // const *name)
foxbrianr 3:ecaf9963341b 305 {
foxbrianr 5:65f21c0b6b79 306 led2 = 1;
foxbrianr 5:65f21c0b6b79 307 pc.printf("Starting escmSound task\n" );
foxbrianr 5:65f21c0b6b79 308
foxbrianr 5:65f21c0b6b79 309 while (1) {
foxbrianr 6:010ceb99f7b0 310
foxbrianr 6:010ceb99f7b0 311 UpdatePerfDataStart(&g_perfData.task[3]);
foxbrianr 5:65f21c0b6b79 312 toggleLed2();
foxbrianr 5:65f21c0b6b79 313 escmController.processSoundQueue();
foxbrianr 6:010ceb99f7b0 314
foxbrianr 6:010ceb99f7b0 315 UpdatePerfDataStop(&g_perfData.task[3]);
foxbrianr 5:65f21c0b6b79 316 Thread::wait(200);
foxbrianr 3:ecaf9963341b 317 }
foxbrianr 3:ecaf9963341b 318 }
foxbrianr 3:ecaf9963341b 319
foxbrianr 5:65f21c0b6b79 320
foxbrianr 5:65f21c0b6b79 321 /***********************************************************************
foxbrianr 5:65f21c0b6b79 322 * Dumps thread stats
foxbrianr 5:65f21c0b6b79 323 ***********************************************************************/
foxbrianr 5:65f21c0b6b79 324
foxbrianr 5:65f21c0b6b79 325 void PrintSystemStats (void)
foxbrianr 5:65f21c0b6b79 326 {
foxbrianr 5:65f21c0b6b79 327 uint32_t frameCount = 0;
foxbrianr 5:65f21c0b6b79 328 while(1) {
foxbrianr 5:65f21c0b6b79 329 frameCount++;
foxbrianr 5:65f21c0b6b79 330 if ((0 == frameCount) || (PRINT_AFTER_N_LOOPS == frameCount)) {
foxbrianr 5:65f21c0b6b79 331 // Following the main thread wait, report on the current system status
foxbrianr 6:010ceb99f7b0 332 sys_state->report_state();
foxbrianr 6:010ceb99f7b0 333 #if 1
foxbrianr 6:010ceb99f7b0 334
foxbrianr 6:010ceb99f7b0 335 pc.printf("IDLE=%d", idle);
foxbrianr 6:010ceb99f7b0 336 pc.printf("\nThread | cntr | T | Cycle Time | Delta Time ");
foxbrianr 6:010ceb99f7b0 337 pc.printf("\n-------------------------------------------------------------------- ");
foxbrianr 6:010ceb99f7b0 338 pc.printf("\n");
foxbrianr 6:010ceb99f7b0 339
foxbrianr 6:010ceb99f7b0 340 for(int i = 0; i<MAX_THREADS; i++) {
foxbrianr 6:010ceb99f7b0 341 pc.printf("%-8d | %-5d | %-5d | %-5d | %-5d | %-5d | %-5d | %-5d | %-5d \n\r",
foxbrianr 6:010ceb99f7b0 342 i ,
foxbrianr 6:010ceb99f7b0 343 g_perfData.task[i].counter ,
foxbrianr 6:010ceb99f7b0 344 g_perfData.task[i].timeStamp ,
foxbrianr 6:010ceb99f7b0 345 g_perfData.task[i].cycleTimeAve ,
foxbrianr 6:010ceb99f7b0 346 g_perfData.task[i].cycleTimeMax ,
foxbrianr 6:010ceb99f7b0 347 g_perfData.task[i].cycleTimeMin ,
foxbrianr 6:010ceb99f7b0 348 g_perfData.task[i].deltaTimeAve ,
foxbrianr 6:010ceb99f7b0 349 g_perfData.task[i].deltaTimeMax ,
foxbrianr 6:010ceb99f7b0 350 g_perfData.task[i].deltaTimeMin );
foxbrianr 6:010ceb99f7b0 351 }
foxbrianr 6:010ceb99f7b0 352 #else
foxbrianr 5:65f21c0b6b79 353 pc.printf("\nThread | size | free | used | max | ");
foxbrianr 5:65f21c0b6b79 354 pc.printf("\n------------------------------------ ");
foxbrianr 6:010ceb99f7b0 355 pc.printf("\n");
foxbrianr 6:010ceb99f7b0 356
foxbrianr 5:65f21c0b6b79 357 for(int i = 0; i<MAX_THREADS; i++) {
foxbrianr 5:65f21c0b6b79 358 pc.printf("\n%-8d | %4d | %4d | %4d | %4d |",
foxbrianr 5:65f21c0b6b79 359 i,
foxbrianr 5:65f21c0b6b79 360 threads[i]->stack_size(),
foxbrianr 5:65f21c0b6b79 361 threads[i]->free_stack(),
foxbrianr 5:65f21c0b6b79 362 threads[i]->used_stack(),
foxbrianr 5:65f21c0b6b79 363 threads[i]->max_stack()
foxbrianr 5:65f21c0b6b79 364 ) ;
foxbrianr 6:010ceb99f7b0 365
foxbrianr 5:65f21c0b6b79 366 }
foxbrianr 5:65f21c0b6b79 367 #endif
foxbrianr 6:010ceb99f7b0 368
foxbrianr 6:010ceb99f7b0 369 pc.printf("\n------------------------------------ ");
foxbrianr 6:010ceb99f7b0 370 pc.printf("\n");
foxbrianr 6:010ceb99f7b0 371
foxbrianr 5:65f21c0b6b79 372 escmEventLog.save();
foxbrianr 5:65f21c0b6b79 373 frameCount = 0;
foxbrianr 5:65f21c0b6b79 374 }
foxbrianr 5:65f21c0b6b79 375
foxbrianr 6:010ceb99f7b0 376 Thread::wait(200);
foxbrianr 5:65f21c0b6b79 377 }
foxbrianr 5:65f21c0b6b79 378 }
foxbrianr 5:65f21c0b6b79 379
foxbrianr 5:65f21c0b6b79 380 /***********************************************************************
foxbrianr 5:65f21c0b6b79 381 * process incoming messages from rx485 serial (ISR)
foxbrianr 5:65f21c0b6b79 382 ***********************************************************************/
foxbrianr 5:65f21c0b6b79 383
foxbrianr 5:65f21c0b6b79 384 void rx485Message() {
foxbrianr 6:010ceb99f7b0 385
foxbrianr 6:010ceb99f7b0 386 #if 1
foxbrianr 6:010ceb99f7b0 387 dataRxCnt++;
foxbrianr 6:010ceb99f7b0 388 #else
foxbrianr 5:65f21c0b6b79 389 // Note: you need to actually read from the serial to clear the RX interrupt
foxbrianr 5:65f21c0b6b79 390 int dataRxBuffer[4];
foxbrianr 5:65f21c0b6b79 391 int value = rs485port1.getc();
foxbrianr 5:65f21c0b6b79 392
foxbrianr 5:65f21c0b6b79 393 if (value){
foxbrianr 5:65f21c0b6b79 394 dataRxBuffer[dataRxCnt++]=value;
foxbrianr 5:65f21c0b6b79 395
foxbrianr 5:65f21c0b6b79 396 if(dataRxCnt==4) {
foxbrianr 5:65f21c0b6b79 397 cur_address = 10*(dataRxBuffer[0] -0x30) + (dataRxBuffer[1] -0x30);
foxbrianr 5:65f21c0b6b79 398 memset(dataRxBuffer,0,sizeof(dataRxBuffer));
foxbrianr 5:65f21c0b6b79 399 dataRxCnt=0;
foxbrianr 5:65f21c0b6b79 400 }
foxbrianr 5:65f21c0b6b79 401 else
foxbrianr 5:65f21c0b6b79 402 {
foxbrianr 5:65f21c0b6b79 403 // do nothing
foxbrianr 5:65f21c0b6b79 404 }
foxbrianr 5:65f21c0b6b79 405 }
foxbrianr 6:010ceb99f7b0 406 #endif
foxbrianr 5:65f21c0b6b79 407 }
foxbrianr 6:010ceb99f7b0 408 /***********************************************************************
foxbrianr 6:010ceb99f7b0 409 * Main Loop
foxbrianr 6:010ceb99f7b0 410 ***********************************************************************/
foxbrianr 6:010ceb99f7b0 411 void backgroundTask(void)
foxbrianr 6:010ceb99f7b0 412 {
foxbrianr 6:010ceb99f7b0 413 idle++;
foxbrianr 6:010ceb99f7b0 414 }
foxbrianr 3:ecaf9963341b 415 /***********************************************************************
foxbrianr 3:ecaf9963341b 416 * Main Loop
foxbrianr 3:ecaf9963341b 417 ***********************************************************************/
foxbrianr 0:91f25a0f819c 418
foxbrianr 5:65f21c0b6b79 419 int main()
foxbrianr 6:010ceb99f7b0 420 { pc.printf("\n\r");
foxbrianr 5:65f21c0b6b79 421
foxbrianr 0:91f25a0f819c 422 pc.printf("=====================================\n\r");
foxbrianr 5:65f21c0b6b79 423 pc.printf("= ESCM 2000 =\n\r");
foxbrianr 5:65f21c0b6b79 424 pc.printf("= %s %s =\n\r", __DATE__ , __TIME__);
foxbrianr 5:65f21c0b6b79 425 pc.printf("= v0.01 =\n\r");
foxbrianr 0:91f25a0f819c 426 pc.printf("=====================================\n\r");
foxbrianr 0:91f25a0f819c 427
foxbrianr 6:010ceb99f7b0 428 sys_state = new SystemReport( SLEEP_TIME * PRINT_AFTER_N_LOOPS /* Loop delay time in ms */);
foxbrianr 6:010ceb99f7b0 429
foxbrianr 6:010ceb99f7b0 430
foxbrianr 6:010ceb99f7b0 431 Kernel::attach_idle_hook(&backgroundTask);
foxbrianr 6:010ceb99f7b0 432
foxbrianr 6:010ceb99f7b0 433 led1=1;
foxbrianr 6:010ceb99f7b0 434 led1=!led1;
foxbrianr 6:010ceb99f7b0 435
foxbrianr 6:010ceb99f7b0 436
foxbrianr 6:010ceb99f7b0 437 InitPerfData();
foxbrianr 6:010ceb99f7b0 438
foxbrianr 6:010ceb99f7b0 439 lcd.init();
foxbrianr 6:010ceb99f7b0 440 lcd.cls();
foxbrianr 6:010ceb99f7b0 441 lcd.locate(0,0);
foxbrianr 6:010ceb99f7b0 442 lcd.printf ("Initializing System..");
foxbrianr 6:010ceb99f7b0 443
foxbrianr 6:010ceb99f7b0 444 // test speaker
foxbrianr 6:010ceb99f7b0 445 escmController.say("Welcome ESCM");
foxbrianr 5:65f21c0b6b79 446
foxbrianr 5:65f21c0b6b79 447 // initialize main controller
foxbrianr 3:ecaf9963341b 448 escmController.init();
foxbrianr 0:91f25a0f819c 449
foxbrianr 6:010ceb99f7b0 450 //escmRs485_Input.attach ( &rx485Message );
foxbrianr 6:010ceb99f7b0 451 //addressMap.display(&pc);
foxbrianr 6:010ceb99f7b0 452
foxbrianr 5:65f21c0b6b79 453 toggleLed1();
foxbrianr 5:65f21c0b6b79 454
foxbrianr 5:65f21c0b6b79 455 //Add any selections
foxbrianr 5:65f21c0b6b79 456 rootMenu.add(&showEvents);
foxbrianr 5:65f21c0b6b79 457 rootMenu.add(&editTime);
foxbrianr 5:65f21c0b6b79 458 rootMenu.add(&editAddress);
foxbrianr 5:65f21c0b6b79 459 rootMenu.add(&factoryReset);
foxbrianr 5:65f21c0b6b79 460 Menu::setCurrentMenu (&rootMenu);
foxbrianr 5:65f21c0b6b79 461
foxbrianr 5:65f21c0b6b79 462 toggleLed1();
foxbrianr 3:ecaf9963341b 463
foxbrianr 5:65f21c0b6b79 464 EventQueue *stats_queue = mbed_event_queue();
foxbrianr 3:ecaf9963341b 465
foxbrianr 5:65f21c0b6b79 466 threads[0] = new Thread(osPriorityNormal5, 0x300 );
foxbrianr 5:65f21c0b6b79 467 threads[1] = new Thread(osPriorityNormal4, 0x500 );
foxbrianr 5:65f21c0b6b79 468 threads[2] = new Thread(osPriorityNormal3, 0x1000 );
foxbrianr 5:65f21c0b6b79 469 threads[3] = new Thread(osPriorityNormal2, 0x400 );
foxbrianr 5:65f21c0b6b79 470 threads[4] = new Thread(osPriorityNormal1, 0x200 );
foxbrianr 5:65f21c0b6b79 471 threads[5] = new Thread(osPriorityLow, 0x100 );
foxbrianr 5:65f21c0b6b79 472
foxbrianr 6:010ceb99f7b0 473
foxbrianr 5:65f21c0b6b79 474 threads[0]->start(ESCMController_Update);
foxbrianr 5:65f21c0b6b79 475 threads[1]->start(ReadGPIOExtender);
foxbrianr 5:65f21c0b6b79 476 threads[2]->start(UpdateDisplay);
foxbrianr 5:65f21c0b6b79 477 threads[3]->start(PlaySound);
foxbrianr 5:65f21c0b6b79 478 threads[4]->start(PrintSystemStats);
foxbrianr 5:65f21c0b6b79 479 //threads[5]->start(TerminalPrompt);
foxbrianr 3:ecaf9963341b 480
foxbrianr 5:65f21c0b6b79 481
foxbrianr 0:91f25a0f819c 482 while(1) {
foxbrianr 5:65f21c0b6b79 483 toggleLed1();
foxbrianr 6:010ceb99f7b0 484 ThisThread::sleep_for(500);
foxbrianr 0:91f25a0f819c 485 }
foxbrianr 0:91f25a0f819c 486 }
foxbrianr 0:91f25a0f819c 487