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 Mar 17 17:24:16 2020 +0000
Revision:
10:f221dd1ef77b
Parent:
8:f15a5358883c
fix up code for barry

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 10:f221dd1ef77b 52 Serial pc(USBTX, USBRX, 115200); // 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 10:f221dd1ef77b 280
foxbrianr 10:f221dd1ef77b 281 escmEventLog.save();
foxbrianr 10:f221dd1ef77b 282
foxbrianr 5:65f21c0b6b79 283 Thread::wait(200);
foxbrianr 3:ecaf9963341b 284 }
foxbrianr 3:ecaf9963341b 285 }
foxbrianr 3:ecaf9963341b 286
foxbrianr 5:65f21c0b6b79 287
foxbrianr 7:0244f1a26545 288 #if DEBUG
foxbrianr 5:65f21c0b6b79 289 /***********************************************************************
foxbrianr 5:65f21c0b6b79 290 * Dumps thread stats
foxbrianr 5:65f21c0b6b79 291 ***********************************************************************/
foxbrianr 5:65f21c0b6b79 292
foxbrianr 5:65f21c0b6b79 293 void PrintSystemStats (void)
foxbrianr 5:65f21c0b6b79 294 {
foxbrianr 5:65f21c0b6b79 295 uint32_t frameCount = 0;
foxbrianr 5:65f21c0b6b79 296 while(1) {
foxbrianr 5:65f21c0b6b79 297 frameCount++;
foxbrianr 5:65f21c0b6b79 298 if ((0 == frameCount) || (PRINT_AFTER_N_LOOPS == frameCount)) {
foxbrianr 5:65f21c0b6b79 299 // Following the main thread wait, report on the current system status
foxbrianr 6:010ceb99f7b0 300 sys_state->report_state();
foxbrianr 6:010ceb99f7b0 301 #if 1
foxbrianr 6:010ceb99f7b0 302
foxbrianr 6:010ceb99f7b0 303 pc.printf("IDLE=%d", idle);
foxbrianr 6:010ceb99f7b0 304 pc.printf("\nThread | cntr | T | Cycle Time | Delta Time ");
foxbrianr 6:010ceb99f7b0 305 pc.printf("\n-------------------------------------------------------------------- ");
foxbrianr 6:010ceb99f7b0 306 pc.printf("\n");
foxbrianr 6:010ceb99f7b0 307
foxbrianr 6:010ceb99f7b0 308 for(int i = 0; i<MAX_THREADS; i++) {
foxbrianr 6:010ceb99f7b0 309 pc.printf("%-8d | %-5d | %-5d | %-5d | %-5d | %-5d | %-5d | %-5d | %-5d \n\r",
foxbrianr 6:010ceb99f7b0 310 i ,
foxbrianr 6:010ceb99f7b0 311 g_perfData.task[i].counter ,
foxbrianr 6:010ceb99f7b0 312 g_perfData.task[i].timeStamp ,
foxbrianr 6:010ceb99f7b0 313 g_perfData.task[i].cycleTimeAve ,
foxbrianr 6:010ceb99f7b0 314 g_perfData.task[i].cycleTimeMax ,
foxbrianr 6:010ceb99f7b0 315 g_perfData.task[i].cycleTimeMin ,
foxbrianr 6:010ceb99f7b0 316 g_perfData.task[i].deltaTimeAve ,
foxbrianr 6:010ceb99f7b0 317 g_perfData.task[i].deltaTimeMax ,
foxbrianr 6:010ceb99f7b0 318 g_perfData.task[i].deltaTimeMin );
foxbrianr 6:010ceb99f7b0 319 }
foxbrianr 6:010ceb99f7b0 320 #else
foxbrianr 5:65f21c0b6b79 321 pc.printf("\nThread | size | free | used | max | ");
foxbrianr 5:65f21c0b6b79 322 pc.printf("\n------------------------------------ ");
foxbrianr 6:010ceb99f7b0 323 pc.printf("\n");
foxbrianr 6:010ceb99f7b0 324
foxbrianr 5:65f21c0b6b79 325 for(int i = 0; i<MAX_THREADS; i++) {
foxbrianr 5:65f21c0b6b79 326 pc.printf("\n%-8d | %4d | %4d | %4d | %4d |",
foxbrianr 5:65f21c0b6b79 327 i,
foxbrianr 5:65f21c0b6b79 328 threads[i]->stack_size(),
foxbrianr 5:65f21c0b6b79 329 threads[i]->free_stack(),
foxbrianr 5:65f21c0b6b79 330 threads[i]->used_stack(),
foxbrianr 5:65f21c0b6b79 331 threads[i]->max_stack()
foxbrianr 5:65f21c0b6b79 332 ) ;
foxbrianr 6:010ceb99f7b0 333
foxbrianr 5:65f21c0b6b79 334 }
foxbrianr 5:65f21c0b6b79 335 #endif
foxbrianr 6:010ceb99f7b0 336
foxbrianr 6:010ceb99f7b0 337 pc.printf("\n------------------------------------ ");
foxbrianr 6:010ceb99f7b0 338 pc.printf("\n");
foxbrianr 6:010ceb99f7b0 339
foxbrianr 5:65f21c0b6b79 340 escmEventLog.save();
foxbrianr 5:65f21c0b6b79 341 frameCount = 0;
foxbrianr 5:65f21c0b6b79 342 }
foxbrianr 5:65f21c0b6b79 343
foxbrianr 6:010ceb99f7b0 344 Thread::wait(200);
foxbrianr 5:65f21c0b6b79 345 }
foxbrianr 5:65f21c0b6b79 346 }
foxbrianr 7:0244f1a26545 347 #endif
foxbrianr 5:65f21c0b6b79 348
foxbrianr 7:0244f1a26545 349
foxbrianr 7:0244f1a26545 350 #if TEST
foxbrianr 7:0244f1a26545 351 /***********************************************************************
foxbrianr 7:0244f1a26545 352 * Handle Terminal Prompts
foxbrianr 7:0244f1a26545 353 * TODO: should have its own queue.
foxbrianr 7:0244f1a26545 354 ***********************************************************************/
foxbrianr 7:0244f1a26545 355
foxbrianr 7:0244f1a26545 356 void TerminalPrompt(void) // const *name)
foxbrianr 7:0244f1a26545 357 {
foxbrianr 7:0244f1a26545 358
foxbrianr 7:0244f1a26545 359 pc.printf("Starting escmTerm task\n" );
foxbrianr 7:0244f1a26545 360
foxbrianr 7:0244f1a26545 361 while (1)
foxbrianr 7:0244f1a26545 362 {
foxbrianr 7:0244f1a26545 363 int c;
foxbrianr 7:0244f1a26545 364 pc.printf("\n>>");
foxbrianr 7:0244f1a26545 365 pc.scanf("%d", &c);
foxbrianr 7:0244f1a26545 366
foxbrianr 7:0244f1a26545 367 /* echo */
foxbrianr 7:0244f1a26545 368 pc.printf("\n%0d",c);
foxbrianr 7:0244f1a26545 369
foxbrianr 7:0244f1a26545 370 if ( c >= 0 && c < 99) {
foxbrianr 7:0244f1a26545 371 ESCMControlApp::postEvent((uint16_t)c,99);
foxbrianr 7:0244f1a26545 372 }
foxbrianr 7:0244f1a26545 373 else if (c==555)
foxbrianr 7:0244f1a26545 374 {
foxbrianr 7:0244f1a26545 375 addressMap.reset();
foxbrianr 7:0244f1a26545 376 }
foxbrianr 7:0244f1a26545 377 else if (c==666)
foxbrianr 7:0244f1a26545 378 {
foxbrianr 7:0244f1a26545 379 escmEventLog.reset();
foxbrianr 7:0244f1a26545 380 }
foxbrianr 7:0244f1a26545 381 else if (c==999)
foxbrianr 7:0244f1a26545 382 {
foxbrianr 7:0244f1a26545 383 pc.printf("\nThread | size | free | used | max | ");
foxbrianr 7:0244f1a26545 384 pc.printf("\n------------------------------------ ");
foxbrianr 7:0244f1a26545 385 for(int i = 0; i<MAX_THREADS; i++) {
foxbrianr 7:0244f1a26545 386 pc.printf("\n%-8d | %4d | %4d | %4d | %4d |",
foxbrianr 7:0244f1a26545 387 i,
foxbrianr 7:0244f1a26545 388 threads[i]->stack_size(),
foxbrianr 7:0244f1a26545 389 threads[i]->free_stack(),
foxbrianr 7:0244f1a26545 390 threads[i]->used_stack(),
foxbrianr 7:0244f1a26545 391 threads[i]->max_stack()
foxbrianr 7:0244f1a26545 392 ) ;
foxbrianr 7:0244f1a26545 393 }
foxbrianr 7:0244f1a26545 394 }
foxbrianr 7:0244f1a26545 395 else
foxbrianr 7:0244f1a26545 396 {
foxbrianr 7:0244f1a26545 397 }
foxbrianr 7:0244f1a26545 398 }
foxbrianr 7:0244f1a26545 399 }
foxbrianr 5:65f21c0b6b79 400 /***********************************************************************
foxbrianr 5:65f21c0b6b79 401 * process incoming messages from rx485 serial (ISR)
foxbrianr 5:65f21c0b6b79 402 ***********************************************************************/
foxbrianr 5:65f21c0b6b79 403
foxbrianr 5:65f21c0b6b79 404 void rx485Message() {
foxbrianr 6:010ceb99f7b0 405
foxbrianr 6:010ceb99f7b0 406 #if 1
foxbrianr 6:010ceb99f7b0 407 dataRxCnt++;
foxbrianr 6:010ceb99f7b0 408 #else
foxbrianr 5:65f21c0b6b79 409 // Note: you need to actually read from the serial to clear the RX interrupt
foxbrianr 5:65f21c0b6b79 410 int dataRxBuffer[4];
foxbrianr 5:65f21c0b6b79 411 int value = rs485port1.getc();
foxbrianr 5:65f21c0b6b79 412
foxbrianr 5:65f21c0b6b79 413 if (value){
foxbrianr 5:65f21c0b6b79 414 dataRxBuffer[dataRxCnt++]=value;
foxbrianr 5:65f21c0b6b79 415
foxbrianr 5:65f21c0b6b79 416 if(dataRxCnt==4) {
foxbrianr 5:65f21c0b6b79 417 cur_address = 10*(dataRxBuffer[0] -0x30) + (dataRxBuffer[1] -0x30);
foxbrianr 5:65f21c0b6b79 418 memset(dataRxBuffer,0,sizeof(dataRxBuffer));
foxbrianr 5:65f21c0b6b79 419 dataRxCnt=0;
foxbrianr 5:65f21c0b6b79 420 }
foxbrianr 5:65f21c0b6b79 421 else
foxbrianr 5:65f21c0b6b79 422 {
foxbrianr 5:65f21c0b6b79 423 // do nothing
foxbrianr 5:65f21c0b6b79 424 }
foxbrianr 5:65f21c0b6b79 425 }
foxbrianr 6:010ceb99f7b0 426 #endif
foxbrianr 5:65f21c0b6b79 427 }
foxbrianr 7:0244f1a26545 428 #endif
foxbrianr 6:010ceb99f7b0 429 /***********************************************************************
foxbrianr 6:010ceb99f7b0 430 * Main Loop
foxbrianr 6:010ceb99f7b0 431 ***********************************************************************/
foxbrianr 6:010ceb99f7b0 432 void backgroundTask(void)
foxbrianr 6:010ceb99f7b0 433 {
foxbrianr 6:010ceb99f7b0 434 idle++;
foxbrianr 6:010ceb99f7b0 435 }
foxbrianr 3:ecaf9963341b 436 /***********************************************************************
foxbrianr 3:ecaf9963341b 437 * Main Loop
foxbrianr 3:ecaf9963341b 438 ***********************************************************************/
foxbrianr 0:91f25a0f819c 439
foxbrianr 5:65f21c0b6b79 440 int main()
foxbrianr 6:010ceb99f7b0 441 { pc.printf("\n\r");
foxbrianr 5:65f21c0b6b79 442
foxbrianr 0:91f25a0f819c 443 pc.printf("=====================================\n\r");
foxbrianr 5:65f21c0b6b79 444 pc.printf("= ESCM 2000 =\n\r");
foxbrianr 5:65f21c0b6b79 445 pc.printf("= %s %s =\n\r", __DATE__ , __TIME__);
foxbrianr 5:65f21c0b6b79 446 pc.printf("= v0.01 =\n\r");
foxbrianr 0:91f25a0f819c 447 pc.printf("=====================================\n\r");
foxbrianr 0:91f25a0f819c 448
foxbrianr 6:010ceb99f7b0 449 sys_state = new SystemReport( SLEEP_TIME * PRINT_AFTER_N_LOOPS /* Loop delay time in ms */);
foxbrianr 6:010ceb99f7b0 450
foxbrianr 6:010ceb99f7b0 451
foxbrianr 6:010ceb99f7b0 452 Kernel::attach_idle_hook(&backgroundTask);
foxbrianr 6:010ceb99f7b0 453
foxbrianr 6:010ceb99f7b0 454 led1=1;
foxbrianr 6:010ceb99f7b0 455 led1=!led1;
foxbrianr 6:010ceb99f7b0 456
foxbrianr 6:010ceb99f7b0 457
foxbrianr 7:0244f1a26545 458 #if DEBUG
foxbrianr 6:010ceb99f7b0 459 InitPerfData();
foxbrianr 7:0244f1a26545 460 #endif
foxbrianr 7:0244f1a26545 461
foxbrianr 8:f15a5358883c 462 // -----------------------------------
foxbrianr 8:f15a5358883c 463 // set LCD configuration
foxbrianr 8:f15a5358883c 464 // -----------------------------------
foxbrianr 6:010ceb99f7b0 465 lcd.init();
foxbrianr 6:010ceb99f7b0 466 lcd.cls();
foxbrianr 6:010ceb99f7b0 467 lcd.locate(0,0);
foxbrianr 6:010ceb99f7b0 468 lcd.printf ("Initializing System..");
foxbrianr 6:010ceb99f7b0 469
foxbrianr 8:f15a5358883c 470 // -----------------------------------
foxbrianr 8:f15a5358883c 471 // set EMIC speaker configuration
foxbrianr 8:f15a5358883c 472 // -----------------------------------
foxbrianr 8:f15a5358883c 473 speaker.volume(18);
foxbrianr 8:f15a5358883c 474 speaker.voice(3);
foxbrianr 8:f15a5358883c 475
foxbrianr 6:010ceb99f7b0 476 escmController.say("Welcome ESCM");
foxbrianr 5:65f21c0b6b79 477
foxbrianr 8:f15a5358883c 478 // -----------------------------------
foxbrianr 5:65f21c0b6b79 479 // initialize main controller
foxbrianr 8:f15a5358883c 480 // -----------------------------------
foxbrianr 3:ecaf9963341b 481 escmController.init();
foxbrianr 0:91f25a0f819c 482
foxbrianr 6:010ceb99f7b0 483 //escmRs485_Input.attach ( &rx485Message );
foxbrianr 6:010ceb99f7b0 484 //addressMap.display(&pc);
foxbrianr 6:010ceb99f7b0 485
foxbrianr 5:65f21c0b6b79 486 toggleLed1();
foxbrianr 5:65f21c0b6b79 487
foxbrianr 8:f15a5358883c 488 // -----------------------------------
foxbrianr 8:f15a5358883c 489 // Setup menus
foxbrianr 8:f15a5358883c 490 // -----------------------------------
foxbrianr 5:65f21c0b6b79 491 rootMenu.add(&showEvents);
foxbrianr 5:65f21c0b6b79 492 rootMenu.add(&editTime);
foxbrianr 5:65f21c0b6b79 493 rootMenu.add(&editAddress);
foxbrianr 5:65f21c0b6b79 494 rootMenu.add(&factoryReset);
foxbrianr 5:65f21c0b6b79 495 Menu::setCurrentMenu (&rootMenu);
foxbrianr 5:65f21c0b6b79 496
foxbrianr 5:65f21c0b6b79 497 toggleLed1();
foxbrianr 3:ecaf9963341b 498
foxbrianr 8:f15a5358883c 499 // -----------------------------------
foxbrianr 8:f15a5358883c 500 // Setup threads
foxbrianr 8:f15a5358883c 501 // -----------------------------------
foxbrianr 5:65f21c0b6b79 502 threads[0] = new Thread(osPriorityNormal5, 0x300 );
foxbrianr 5:65f21c0b6b79 503 threads[1] = new Thread(osPriorityNormal4, 0x500 );
foxbrianr 5:65f21c0b6b79 504 threads[2] = new Thread(osPriorityNormal3, 0x1000 );
foxbrianr 5:65f21c0b6b79 505 threads[3] = new Thread(osPriorityNormal2, 0x400 );
foxbrianr 7:0244f1a26545 506 #if DEBUG
foxbrianr 5:65f21c0b6b79 507 threads[4] = new Thread(osPriorityNormal1, 0x200 );
foxbrianr 7:0244f1a26545 508 #endif
foxbrianr 7:0244f1a26545 509
foxbrianr 7:0244f1a26545 510 #if TEST
foxbrianr 5:65f21c0b6b79 511 threads[5] = new Thread(osPriorityLow, 0x100 );
foxbrianr 7:0244f1a26545 512 #endif
foxbrianr 5:65f21c0b6b79 513
foxbrianr 6:010ceb99f7b0 514
foxbrianr 8:f15a5358883c 515 // -----------------------------------
foxbrianr 8:f15a5358883c 516 // Start threads
foxbrianr 8:f15a5358883c 517 // -----------------------------------
foxbrianr 5:65f21c0b6b79 518 threads[0]->start(ESCMController_Update);
foxbrianr 5:65f21c0b6b79 519 threads[1]->start(ReadGPIOExtender);
foxbrianr 5:65f21c0b6b79 520 threads[2]->start(UpdateDisplay);
foxbrianr 5:65f21c0b6b79 521 threads[3]->start(PlaySound);
foxbrianr 7:0244f1a26545 522 #if DEBUG
foxbrianr 7:0244f1a26545 523 //threads[4]->start(PrintSystemStats);
foxbrianr 7:0244f1a26545 524 #endif
foxbrianr 7:0244f1a26545 525
foxbrianr 7:0244f1a26545 526 #if TEST
foxbrianr 7:0244f1a26545 527 threads[5]->start(TerminalPrompt);
foxbrianr 7:0244f1a26545 528 #endif
foxbrianr 3:ecaf9963341b 529
foxbrianr 8:f15a5358883c 530 // -----------------------------------
foxbrianr 8:f15a5358883c 531 // Loop forever
foxbrianr 8:f15a5358883c 532 // -----------------------------------
foxbrianr 0:91f25a0f819c 533 while(1) {
foxbrianr 5:65f21c0b6b79 534 toggleLed1();
foxbrianr 6:010ceb99f7b0 535 ThisThread::sleep_for(500);
foxbrianr 0:91f25a0f819c 536 }
foxbrianr 0:91f25a0f819c 537 }
foxbrianr 0:91f25a0f819c 538