Baseline for testing

Dependents:   mbed_escm2000

Committer:
foxbrianr
Date:
Tue Mar 17 17:23:55 2020 +0000
Revision:
3:2b760f267603
Parent:
2:486d068deff9
fix up code for barry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
foxbrianr 2:486d068deff9 1 /**************************************************************************
foxbrianr 2:486d068deff9 2 * @file EventLog.cpp
foxbrianr 2:486d068deff9 3 * @brief Base class for wrapping the interface with the ESCM Event Log
foxbrianr 2:486d068deff9 4 * @version: V1.0
foxbrianr 2:486d068deff9 5 * @date: 9/17/2019
foxbrianr 0:929bb73983c5 6
foxbrianr 2:486d068deff9 7 *
foxbrianr 2:486d068deff9 8 * @note
foxbrianr 2:486d068deff9 9 * Copyright (C) 2019 E3 Design. All rights reserved.
foxbrianr 2:486d068deff9 10 *
foxbrianr 2:486d068deff9 11 * @par
foxbrianr 2:486d068deff9 12 * E3 Designers LLC is supplying this software for use with Cortex-M3 LPC1768
foxbrianr 2:486d068deff9 13 * processor based microcontroller for the ESCM 2000 Monitor and Display.
foxbrianr 2:486d068deff9 14 * *
foxbrianr 2:486d068deff9 15 * @par
foxbrianr 2:486d068deff9 16 * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
foxbrianr 2:486d068deff9 17 * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
foxbrianr 2:486d068deff9 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
foxbrianr 2:486d068deff9 19 * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
foxbrianr 2:486d068deff9 20 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
foxbrianr 2:486d068deff9 21 *
foxbrianr 2:486d068deff9 22 ******************************************************************************/
foxbrianr 0:929bb73983c5 23 #include "mbed.h"
foxbrianr 0:929bb73983c5 24 #include "EventLog.h"
foxbrianr 1:aaddf80105fe 25 #include "stdio.h"
foxbrianr 1:aaddf80105fe 26
foxbrianr 1:aaddf80105fe 27
foxbrianr 1:aaddf80105fe 28
foxbrianr 1:aaddf80105fe 29
foxbrianr 1:aaddf80105fe 30 /*-------------------------------------------------------------------
foxbrianr 1:aaddf80105fe 31 * define local file system
foxbrianr 1:aaddf80105fe 32 *-------------------------------------------------------------------*/
foxbrianr 1:aaddf80105fe 33 LocalFileSystem local("local");
foxbrianr 1:aaddf80105fe 34
foxbrianr 1:aaddf80105fe 35 const char * filename = "/local/events.bin";
foxbrianr 1:aaddf80105fe 36
foxbrianr 1:aaddf80105fe 37
foxbrianr 2:486d068deff9 38 /******************************************************************************/
foxbrianr 1:aaddf80105fe 39 ESCM_Event::ESCM_Event(): address(0),port(0xFF)
foxbrianr 1:aaddf80105fe 40 {
foxbrianr 1:aaddf80105fe 41
foxbrianr 1:aaddf80105fe 42 }
foxbrianr 1:aaddf80105fe 43
foxbrianr 2:486d068deff9 44 /******************************************************************************/
foxbrianr 1:aaddf80105fe 45 ESCM_Event::ESCM_Event(uint16_t address): address(address),port(0xFF)
foxbrianr 1:aaddf80105fe 46 {
foxbrianr 1:aaddf80105fe 47 setTimeNow();
foxbrianr 1:aaddf80105fe 48 }
foxbrianr 1:aaddf80105fe 49
foxbrianr 2:486d068deff9 50 /******************************************************************************/
foxbrianr 1:aaddf80105fe 51 void ESCM_Event::setTimeNow(void)
foxbrianr 1:aaddf80105fe 52 {
foxbrianr 1:aaddf80105fe 53 time_t rawtime;
foxbrianr 1:aaddf80105fe 54 struct tm * timeinfo;
foxbrianr 1:aaddf80105fe 55
foxbrianr 1:aaddf80105fe 56 time ( &rawtime );
foxbrianr 1:aaddf80105fe 57 timeinfo = localtime ( &rawtime ); timeinfo = localtime (&rawtime);
foxbrianr 1:aaddf80105fe 58
foxbrianr 1:aaddf80105fe 59 hours = timeinfo->tm_hour;
foxbrianr 1:aaddf80105fe 60 mins = timeinfo->tm_min;
foxbrianr 1:aaddf80105fe 61 secs = timeinfo->tm_sec;
foxbrianr 1:aaddf80105fe 62 year = timeinfo->tm_year+1900;
foxbrianr 1:aaddf80105fe 63 month = timeinfo->tm_mon + 1;
foxbrianr 1:aaddf80105fe 64 day = timeinfo->tm_mday;
foxbrianr 1:aaddf80105fe 65 }
foxbrianr 1:aaddf80105fe 66
foxbrianr 2:486d068deff9 67 /******************************************************************************/
foxbrianr 1:aaddf80105fe 68 void ESCM_Event::getTime (char * buffer) {
foxbrianr 1:aaddf80105fe 69 sprintf(buffer,"%02d:%02d %02d/%02d/%04d", hours,mins,month,day,year);
foxbrianr 1:aaddf80105fe 70 }
foxbrianr 1:aaddf80105fe 71
foxbrianr 0:929bb73983c5 72
foxbrianr 0:929bb73983c5 73
foxbrianr 2:486d068deff9 74 /******************************************************************************/
foxbrianr 0:929bb73983c5 75 ESCM_EventLog::ESCM_EventLog() {
foxbrianr 0:929bb73983c5 76 full_=false;
foxbrianr 2:486d068deff9 77 dirty=false;
foxbrianr 0:929bb73983c5 78 head_=0;
foxbrianr 0:929bb73983c5 79 tail_=0;
foxbrianr 0:929bb73983c5 80
foxbrianr 0:929bb73983c5 81 }
foxbrianr 0:929bb73983c5 82
foxbrianr 2:486d068deff9 83 /******************************************************************************/
foxbrianr 0:929bb73983c5 84 ESCM_EventLog::~ESCM_EventLog() {
foxbrianr 0:929bb73983c5 85 }
foxbrianr 0:929bb73983c5 86
foxbrianr 2:486d068deff9 87 /******************************************************************************/
foxbrianr 1:aaddf80105fe 88 int ESCM_EventLog::init()
foxbrianr 0:929bb73983c5 89 {
foxbrianr 0:929bb73983c5 90 full_=false;
foxbrianr 2:486d068deff9 91 dirty = true;
foxbrianr 0:929bb73983c5 92 head_=0;
foxbrianr 0:929bb73983c5 93 tail_=0;
foxbrianr 2:486d068deff9 94
foxbrianr 0:929bb73983c5 95 printf("Initializing Event Log\n\r");
foxbrianr 2:486d068deff9 96 if ( !load() ) {
foxbrianr 3:2b760f267603 97 printf("..Load Failed \n\r");
foxbrianr 3:2b760f267603 98 printf("..Setting Default Event Log\n\r");
foxbrianr 1:aaddf80105fe 99 memset ( events,0,sizeof(ESCM_Event)*MAX_EVENTS);
foxbrianr 1:aaddf80105fe 100 // for testing
foxbrianr 2:486d068deff9 101 for ( int i=0; i<MAX_EVENTS; i++) {
foxbrianr 1:aaddf80105fe 102 add(i*2);
foxbrianr 1:aaddf80105fe 103 }
foxbrianr 1:aaddf80105fe 104 save();
foxbrianr 3:2b760f267603 105 } else {
foxbrianr 3:2b760f267603 106 printf("..Loaded Event Log\n\r");
foxbrianr 1:aaddf80105fe 107 }
foxbrianr 2:486d068deff9 108
foxbrianr 3:2b760f267603 109 printf("Complete\n\r");
foxbrianr 1:aaddf80105fe 110 return 1;
foxbrianr 0:929bb73983c5 111 }
foxbrianr 0:929bb73983c5 112
foxbrianr 2:486d068deff9 113 /******************************************************************************/
foxbrianr 0:929bb73983c5 114 int ESCM_EventLog::load()
foxbrianr 2:486d068deff9 115 {
foxbrianr 2:486d068deff9 116 printf("Reading %s ...\n\r",filename );
foxbrianr 0:929bb73983c5 117 FILE *input = fopen(filename, "rb");
foxbrianr 1:aaddf80105fe 118 if(input!= NULL){
foxbrianr 1:aaddf80105fe 119
foxbrianr 1:aaddf80105fe 120 uint16_t code;
foxbrianr 1:aaddf80105fe 121 uint16_t size;
foxbrianr 3:2b760f267603 122 uint16_t hr;
foxbrianr 3:2b760f267603 123
foxbrianr 3:2b760f267603 124
foxbrianr 0:929bb73983c5 125
foxbrianr 1:aaddf80105fe 126 fread(&code, sizeof(uint16_t),1,input);
foxbrianr 1:aaddf80105fe 127 fread(&size, sizeof(uint16_t),1,input);
foxbrianr 0:929bb73983c5 128
foxbrianr 2:486d068deff9 129 if (code != EVENT_LOG_FORMAT && size != MAX_EVENTS ) {
foxbrianr 2:486d068deff9 130 fclose(input);
foxbrianr 1:aaddf80105fe 131 return 0;
foxbrianr 1:aaddf80105fe 132 }
foxbrianr 1:aaddf80105fe 133
foxbrianr 1:aaddf80105fe 134 fread(&head_, sizeof(uint16_t),1,input);
foxbrianr 1:aaddf80105fe 135 fread(&tail_, sizeof(uint16_t),1,input);
foxbrianr 0:929bb73983c5 136
foxbrianr 0:929bb73983c5 137 for (int i=0;i<MAX_EVENTS;i++)
foxbrianr 0:929bb73983c5 138 {
foxbrianr 1:aaddf80105fe 139 fread( &events[i].port, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 140 fread( &events[i].address, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 141 fread( &events[i].hours, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 142 fread( &events[i].mins, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 143 fread( &events[i].secs, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 144 fread( &events[i].day, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 145 fread( &events[i].month, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 146 fread( &events[i].year, sizeof(uint16_t),1 , input);
foxbrianr 3:2b760f267603 147 #if 0
foxbrianr 3:2b760f267603 148 if ( events[i].hours < 12 ) {
foxbrianr 3:2b760f267603 149
foxbrianr 3:2b760f267603 150 hr = (events[i].hours == 0) ? 12 : events[i].hours;
foxbrianr 3:2b760f267603 151
foxbrianr 3:2b760f267603 152 printf("%02d) %02x %02d:%02d:%02dam\r",
foxbrianr 3:2b760f267603 153 i,
foxbrianr 3:2b760f267603 154 events[i].address,
foxbrianr 3:2b760f267603 155 hr,
foxbrianr 3:2b760f267603 156 events[i].mins,
foxbrianr 3:2b760f267603 157 events[i].secs );
foxbrianr 3:2b760f267603 158
foxbrianr 3:2b760f267603 159 } else {
foxbrianr 3:2b760f267603 160
foxbrianr 3:2b760f267603 161 hr = (events[i].hours - 12);
foxbrianr 3:2b760f267603 162
foxbrianr 3:2b760f267603 163 printf("%02d) %02x %02d:%02d:%02dpm\r",
foxbrianr 3:2b760f267603 164 i,
foxbrianr 3:2b760f267603 165 events[i].address,
foxbrianr 3:2b760f267603 166 hr,
foxbrianr 3:2b760f267603 167 events[i].mins,
foxbrianr 3:2b760f267603 168 events[i].secs );
foxbrianr 3:2b760f267603 169 }
foxbrianr 3:2b760f267603 170 #endif
foxbrianr 3:2b760f267603 171
foxbrianr 0:929bb73983c5 172 }
foxbrianr 0:929bb73983c5 173 fclose(input);
foxbrianr 3:2b760f267603 174
foxbrianr 3:2b760f267603 175 printf("Number of Events = %d (%d) \n\r", this->size(),this->capacity());
foxbrianr 0:929bb73983c5 176 }
foxbrianr 0:929bb73983c5 177 else
foxbrianr 0:929bb73983c5 178 {
foxbrianr 0:929bb73983c5 179 printf("Could not Read %s\n\r",filename );
foxbrianr 0:929bb73983c5 180 return 0;
foxbrianr 0:929bb73983c5 181 }
foxbrianr 1:aaddf80105fe 182 return 1;
foxbrianr 0:929bb73983c5 183 }
foxbrianr 0:929bb73983c5 184
foxbrianr 2:486d068deff9 185 /******************************************************************************/
foxbrianr 1:aaddf80105fe 186 int ESCM_EventLog::save()
foxbrianr 0:929bb73983c5 187 {
foxbrianr 2:486d068deff9 188 int result = 1;
foxbrianr 2:486d068deff9 189
foxbrianr 2:486d068deff9 190 if (!dirty)
foxbrianr 2:486d068deff9 191 return 0;
foxbrianr 2:486d068deff9 192
foxbrianr 2:486d068deff9 193 printf("Saving %s ...\n\r",filename );
foxbrianr 0:929bb73983c5 194
foxbrianr 1:aaddf80105fe 195 FILE *output = fopen(filename, "wb");
foxbrianr 1:aaddf80105fe 196 if (output != NULL) {
foxbrianr 1:aaddf80105fe 197
foxbrianr 2:486d068deff9 198 uint16_t code = EVENT_LOG_FORMAT;
foxbrianr 1:aaddf80105fe 199 uint16_t size = MAX_EVENTS;
foxbrianr 1:aaddf80105fe 200
foxbrianr 1:aaddf80105fe 201 fwrite(&code, sizeof(uint16_t),1,output);
foxbrianr 1:aaddf80105fe 202 fwrite(&size, sizeof(uint16_t),1,output);
foxbrianr 1:aaddf80105fe 203 fwrite(&head_, sizeof(uint16_t),1,output);
foxbrianr 1:aaddf80105fe 204 fwrite(&tail_, sizeof(uint16_t),1,output);
foxbrianr 1:aaddf80105fe 205
foxbrianr 1:aaddf80105fe 206 for (int i=0;i<MAX_EVENTS;i++)
foxbrianr 2:486d068deff9 207 {
foxbrianr 1:aaddf80105fe 208 fwrite( &events[i].port, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 209 fwrite( &events[i].address, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 210 fwrite( &events[i].hours, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 211 fwrite( &events[i].mins, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 212 fwrite( &events[i].secs, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 213 fwrite( &events[i].day, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 214 fwrite( &events[i].month, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 215 fwrite( &events[i].year, sizeof(uint16_t),1 , output);
foxbrianr 2:486d068deff9 216 ThisThread::sleep_for(1);
foxbrianr 1:aaddf80105fe 217
foxbrianr 1:aaddf80105fe 218 }
foxbrianr 1:aaddf80105fe 219 fflush(output);
foxbrianr 1:aaddf80105fe 220 fclose(output);
foxbrianr 2:486d068deff9 221 dirty = false;
foxbrianr 2:486d068deff9 222 result = 1;
foxbrianr 1:aaddf80105fe 223 }
foxbrianr 1:aaddf80105fe 224 else
foxbrianr 0:929bb73983c5 225 {
foxbrianr 1:aaddf80105fe 226 printf("Could not save %s\n\r",filename );
foxbrianr 2:486d068deff9 227 result = 0;
foxbrianr 0:929bb73983c5 228 }
foxbrianr 0:929bb73983c5 229
foxbrianr 0:929bb73983c5 230 printf("Done \n\r" );
foxbrianr 2:486d068deff9 231 return result;
foxbrianr 0:929bb73983c5 232 }
foxbrianr 0:929bb73983c5 233
foxbrianr 2:486d068deff9 234 /******************************************************************************/
foxbrianr 0:929bb73983c5 235 void ESCM_EventLog::display(Serial *pc)
foxbrianr 0:929bb73983c5 236 {
foxbrianr 0:929bb73983c5 237 int j = tail_;
foxbrianr 1:aaddf80105fe 238 int i = head_ ;
foxbrianr 0:929bb73983c5 239 int count = 0 ;
foxbrianr 0:929bb73983c5 240
foxbrianr 0:929bb73983c5 241 pc->printf("\n\r");
foxbrianr 0:929bb73983c5 242 pc->printf("-----------------------------\n\r");
foxbrianr 0:929bb73983c5 243 pc->printf("- Event Log \n\r");
foxbrianr 0:929bb73983c5 244 pc->printf("-----------------------------\n\r");
foxbrianr 0:929bb73983c5 245 pc->printf("%d %d %d \n\r", i,j, full_);
foxbrianr 0:929bb73983c5 246
foxbrianr 0:929bb73983c5 247
foxbrianr 0:929bb73983c5 248 while ( count < size() )
foxbrianr 0:929bb73983c5 249 {
foxbrianr 1:aaddf80105fe 250 if (--i < 0 ) {
foxbrianr 0:929bb73983c5 251 i =( max_size_ - 1 );
foxbrianr 0:929bb73983c5 252 }
foxbrianr 1:aaddf80105fe 253
foxbrianr 1:aaddf80105fe 254 pc->printf("%02d <%02d> %02d :: %02d:%02d:%02d %02d/%02d/%04d \n\r",
foxbrianr 1:aaddf80105fe 255 count,
foxbrianr 1:aaddf80105fe 256 events[i].port,
foxbrianr 1:aaddf80105fe 257 events[i].address,
foxbrianr 1:aaddf80105fe 258 events[i].hours,
foxbrianr 1:aaddf80105fe 259 events[i].mins,
foxbrianr 1:aaddf80105fe 260 events[i].secs,
foxbrianr 1:aaddf80105fe 261 events[i].month,
foxbrianr 1:aaddf80105fe 262 events[i].day,
foxbrianr 1:aaddf80105fe 263 events[i].year
foxbrianr 1:aaddf80105fe 264 );
foxbrianr 1:aaddf80105fe 265
foxbrianr 0:929bb73983c5 266 count++;
foxbrianr 0:929bb73983c5 267 }
foxbrianr 0:929bb73983c5 268 pc->printf("-----------------------------\n\r");
foxbrianr 0:929bb73983c5 269 }
foxbrianr 2:486d068deff9 270 /******************************************************************************/
foxbrianr 1:aaddf80105fe 271 void ESCM_EventLog::add(uint16_t address, uint16_t port)
foxbrianr 1:aaddf80105fe 272 {
foxbrianr 1:aaddf80105fe 273 ESCM_Event newEvent;
foxbrianr 1:aaddf80105fe 274 newEvent.address = address;
foxbrianr 1:aaddf80105fe 275 newEvent.port = port;
foxbrianr 1:aaddf80105fe 276 newEvent.setTimeNow();
foxbrianr 1:aaddf80105fe 277 put( newEvent );
foxbrianr 1:aaddf80105fe 278 }
foxbrianr 0:929bb73983c5 279
foxbrianr 2:486d068deff9 280 /******************************************************************************/
foxbrianr 1:aaddf80105fe 281 void ESCM_EventLog::add(uint16_t address)
foxbrianr 1:aaddf80105fe 282 {
foxbrianr 1:aaddf80105fe 283 ESCM_Event newEvent;
foxbrianr 1:aaddf80105fe 284 newEvent.address = address;
foxbrianr 1:aaddf80105fe 285 newEvent.port = 0;
foxbrianr 1:aaddf80105fe 286 newEvent.setTimeNow();
foxbrianr 1:aaddf80105fe 287 put( newEvent );
foxbrianr 1:aaddf80105fe 288 }
foxbrianr 1:aaddf80105fe 289
foxbrianr 2:486d068deff9 290 /******************************************************************************/
foxbrianr 1:aaddf80105fe 291 ESCM_Event * ESCM_EventLog::index (int pos ){
foxbrianr 1:aaddf80105fe 292
foxbrianr 1:aaddf80105fe 293 ESCM_Event * result = NULL;
foxbrianr 1:aaddf80105fe 294 if (!empty())
foxbrianr 1:aaddf80105fe 295 {
foxbrianr 1:aaddf80105fe 296 if (pos < size() || pos >= 0 ) {
foxbrianr 1:aaddf80105fe 297
foxbrianr 1:aaddf80105fe 298 int index = (head_ - 1 - pos );
foxbrianr 1:aaddf80105fe 299
foxbrianr 1:aaddf80105fe 300 if (index < 0 )
foxbrianr 1:aaddf80105fe 301 index += max_size_;
foxbrianr 1:aaddf80105fe 302
foxbrianr 1:aaddf80105fe 303 result = &(events[index]);
foxbrianr 1:aaddf80105fe 304 }
foxbrianr 1:aaddf80105fe 305 }
foxbrianr 1:aaddf80105fe 306 return result;
foxbrianr 1:aaddf80105fe 307 }