Baseline for testing

Dependents:   mbed_escm2000

Committer:
foxbrianr
Date:
Tue Sep 17 13:48:38 2019 +0000
Revision:
2:486d068deff9
Parent:
1:aaddf80105fe
Child:
3:2b760f267603
Beta 2

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 1:aaddf80105fe 97 memset ( events,0,sizeof(ESCM_Event)*MAX_EVENTS);
foxbrianr 1:aaddf80105fe 98 // for testing
foxbrianr 2:486d068deff9 99 for ( int i=0; i<MAX_EVENTS; i++) {
foxbrianr 1:aaddf80105fe 100 add(i*2);
foxbrianr 1:aaddf80105fe 101 }
foxbrianr 1:aaddf80105fe 102 save();
foxbrianr 2:486d068deff9 103
foxbrianr 1:aaddf80105fe 104 }
foxbrianr 2:486d068deff9 105
foxbrianr 1:aaddf80105fe 106 return 1;
foxbrianr 0:929bb73983c5 107 }
foxbrianr 0:929bb73983c5 108
foxbrianr 2:486d068deff9 109 /******************************************************************************/
foxbrianr 0:929bb73983c5 110 int ESCM_EventLog::load()
foxbrianr 2:486d068deff9 111 {
foxbrianr 2:486d068deff9 112 printf("Reading %s ...\n\r",filename );
foxbrianr 0:929bb73983c5 113 FILE *input = fopen(filename, "rb");
foxbrianr 1:aaddf80105fe 114 if(input!= NULL){
foxbrianr 1:aaddf80105fe 115
foxbrianr 1:aaddf80105fe 116 uint16_t code;
foxbrianr 1:aaddf80105fe 117 uint16_t size;
foxbrianr 0:929bb73983c5 118
foxbrianr 1:aaddf80105fe 119 fread(&code, sizeof(uint16_t),1,input);
foxbrianr 1:aaddf80105fe 120 fread(&size, sizeof(uint16_t),1,input);
foxbrianr 0:929bb73983c5 121
foxbrianr 2:486d068deff9 122 if (code != EVENT_LOG_FORMAT && size != MAX_EVENTS ) {
foxbrianr 2:486d068deff9 123 fclose(input);
foxbrianr 1:aaddf80105fe 124 return 0;
foxbrianr 1:aaddf80105fe 125 }
foxbrianr 1:aaddf80105fe 126
foxbrianr 1:aaddf80105fe 127 fread(&head_, sizeof(uint16_t),1,input);
foxbrianr 1:aaddf80105fe 128 fread(&tail_, sizeof(uint16_t),1,input);
foxbrianr 0:929bb73983c5 129
foxbrianr 0:929bb73983c5 130 for (int i=0;i<MAX_EVENTS;i++)
foxbrianr 0:929bb73983c5 131 {
foxbrianr 1:aaddf80105fe 132 fread( &events[i].port, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 133 fread( &events[i].address, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 134 fread( &events[i].hours, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 135 fread( &events[i].mins, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 136 fread( &events[i].secs, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 137 fread( &events[i].day, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 138 fread( &events[i].month, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 139 fread( &events[i].year, sizeof(uint16_t),1 , input);
foxbrianr 1:aaddf80105fe 140
foxbrianr 1:aaddf80105fe 141 //fread( events[i].timeStr, sizeof(char) ,40, input);
foxbrianr 0:929bb73983c5 142 }
foxbrianr 0:929bb73983c5 143 fclose(input);
foxbrianr 0:929bb73983c5 144 }
foxbrianr 0:929bb73983c5 145 else
foxbrianr 0:929bb73983c5 146 {
foxbrianr 0:929bb73983c5 147 printf("Could not Read %s\n\r",filename );
foxbrianr 0:929bb73983c5 148 return 0;
foxbrianr 0:929bb73983c5 149 }
foxbrianr 1:aaddf80105fe 150 return 1;
foxbrianr 0:929bb73983c5 151 }
foxbrianr 0:929bb73983c5 152
foxbrianr 2:486d068deff9 153 /******************************************************************************/
foxbrianr 1:aaddf80105fe 154 int ESCM_EventLog::save()
foxbrianr 0:929bb73983c5 155 {
foxbrianr 2:486d068deff9 156 int result = 1;
foxbrianr 2:486d068deff9 157
foxbrianr 2:486d068deff9 158 if (!dirty)
foxbrianr 2:486d068deff9 159 return 0;
foxbrianr 2:486d068deff9 160
foxbrianr 2:486d068deff9 161 printf("Saving %s ...\n\r",filename );
foxbrianr 0:929bb73983c5 162
foxbrianr 1:aaddf80105fe 163 FILE *output = fopen(filename, "wb");
foxbrianr 1:aaddf80105fe 164 if (output != NULL) {
foxbrianr 1:aaddf80105fe 165
foxbrianr 2:486d068deff9 166 uint16_t code = EVENT_LOG_FORMAT;
foxbrianr 1:aaddf80105fe 167 uint16_t size = MAX_EVENTS;
foxbrianr 1:aaddf80105fe 168
foxbrianr 1:aaddf80105fe 169 fwrite(&code, sizeof(uint16_t),1,output);
foxbrianr 1:aaddf80105fe 170 fwrite(&size, sizeof(uint16_t),1,output);
foxbrianr 1:aaddf80105fe 171 fwrite(&head_, sizeof(uint16_t),1,output);
foxbrianr 1:aaddf80105fe 172 fwrite(&tail_, sizeof(uint16_t),1,output);
foxbrianr 1:aaddf80105fe 173
foxbrianr 1:aaddf80105fe 174 for (int i=0;i<MAX_EVENTS;i++)
foxbrianr 2:486d068deff9 175 {
foxbrianr 1:aaddf80105fe 176 fwrite( &events[i].port, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 177 fwrite( &events[i].address, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 178 fwrite( &events[i].hours, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 179 fwrite( &events[i].mins, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 180 fwrite( &events[i].secs, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 181 fwrite( &events[i].day, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 182 fwrite( &events[i].month, sizeof(uint16_t),1 , output);
foxbrianr 1:aaddf80105fe 183 fwrite( &events[i].year, sizeof(uint16_t),1 , output);
foxbrianr 2:486d068deff9 184 ThisThread::sleep_for(1);
foxbrianr 1:aaddf80105fe 185
foxbrianr 1:aaddf80105fe 186 }
foxbrianr 1:aaddf80105fe 187 fflush(output);
foxbrianr 1:aaddf80105fe 188 fclose(output);
foxbrianr 2:486d068deff9 189 dirty = false;
foxbrianr 2:486d068deff9 190 result = 1;
foxbrianr 1:aaddf80105fe 191 }
foxbrianr 1:aaddf80105fe 192 else
foxbrianr 0:929bb73983c5 193 {
foxbrianr 1:aaddf80105fe 194 printf("Could not save %s\n\r",filename );
foxbrianr 2:486d068deff9 195 result = 0;
foxbrianr 0:929bb73983c5 196 }
foxbrianr 0:929bb73983c5 197
foxbrianr 0:929bb73983c5 198 printf("Done \n\r" );
foxbrianr 2:486d068deff9 199 return result;
foxbrianr 0:929bb73983c5 200 }
foxbrianr 0:929bb73983c5 201
foxbrianr 2:486d068deff9 202 /******************************************************************************/
foxbrianr 0:929bb73983c5 203 void ESCM_EventLog::display(Serial *pc)
foxbrianr 0:929bb73983c5 204 {
foxbrianr 0:929bb73983c5 205 int j = tail_;
foxbrianr 1:aaddf80105fe 206 int i = head_ ;
foxbrianr 0:929bb73983c5 207 int count = 0 ;
foxbrianr 0:929bb73983c5 208
foxbrianr 0:929bb73983c5 209 pc->printf("\n\r");
foxbrianr 0:929bb73983c5 210 pc->printf("-----------------------------\n\r");
foxbrianr 0:929bb73983c5 211 pc->printf("- Event Log \n\r");
foxbrianr 0:929bb73983c5 212 pc->printf("-----------------------------\n\r");
foxbrianr 0:929bb73983c5 213 pc->printf("%d %d %d \n\r", i,j, full_);
foxbrianr 0:929bb73983c5 214
foxbrianr 0:929bb73983c5 215
foxbrianr 0:929bb73983c5 216 while ( count < size() )
foxbrianr 0:929bb73983c5 217 {
foxbrianr 1:aaddf80105fe 218 if (--i < 0 ) {
foxbrianr 0:929bb73983c5 219 i =( max_size_ - 1 );
foxbrianr 0:929bb73983c5 220 }
foxbrianr 1:aaddf80105fe 221
foxbrianr 1:aaddf80105fe 222 pc->printf("%02d <%02d> %02d :: %02d:%02d:%02d %02d/%02d/%04d \n\r",
foxbrianr 1:aaddf80105fe 223 count,
foxbrianr 1:aaddf80105fe 224 events[i].port,
foxbrianr 1:aaddf80105fe 225 events[i].address,
foxbrianr 1:aaddf80105fe 226 events[i].hours,
foxbrianr 1:aaddf80105fe 227 events[i].mins,
foxbrianr 1:aaddf80105fe 228 events[i].secs,
foxbrianr 1:aaddf80105fe 229 events[i].month,
foxbrianr 1:aaddf80105fe 230 events[i].day,
foxbrianr 1:aaddf80105fe 231 events[i].year
foxbrianr 1:aaddf80105fe 232 );
foxbrianr 1:aaddf80105fe 233
foxbrianr 0:929bb73983c5 234 count++;
foxbrianr 0:929bb73983c5 235 }
foxbrianr 0:929bb73983c5 236 pc->printf("-----------------------------\n\r");
foxbrianr 0:929bb73983c5 237 }
foxbrianr 2:486d068deff9 238 /******************************************************************************/
foxbrianr 1:aaddf80105fe 239 void ESCM_EventLog::add(uint16_t address, uint16_t port)
foxbrianr 1:aaddf80105fe 240 {
foxbrianr 1:aaddf80105fe 241 ESCM_Event newEvent;
foxbrianr 1:aaddf80105fe 242 newEvent.address = address;
foxbrianr 1:aaddf80105fe 243 newEvent.port = port;
foxbrianr 1:aaddf80105fe 244 newEvent.setTimeNow();
foxbrianr 1:aaddf80105fe 245 put( newEvent );
foxbrianr 1:aaddf80105fe 246 }
foxbrianr 0:929bb73983c5 247
foxbrianr 2:486d068deff9 248 /******************************************************************************/
foxbrianr 1:aaddf80105fe 249 void ESCM_EventLog::add(uint16_t address)
foxbrianr 1:aaddf80105fe 250 {
foxbrianr 1:aaddf80105fe 251 ESCM_Event newEvent;
foxbrianr 1:aaddf80105fe 252 newEvent.address = address;
foxbrianr 1:aaddf80105fe 253 newEvent.port = 0;
foxbrianr 1:aaddf80105fe 254 newEvent.setTimeNow();
foxbrianr 1:aaddf80105fe 255 put( newEvent );
foxbrianr 1:aaddf80105fe 256 }
foxbrianr 1:aaddf80105fe 257
foxbrianr 2:486d068deff9 258 /******************************************************************************/
foxbrianr 1:aaddf80105fe 259 ESCM_Event * ESCM_EventLog::index (int pos ){
foxbrianr 1:aaddf80105fe 260
foxbrianr 1:aaddf80105fe 261 ESCM_Event * result = NULL;
foxbrianr 1:aaddf80105fe 262 if (!empty())
foxbrianr 1:aaddf80105fe 263 {
foxbrianr 1:aaddf80105fe 264 if (pos < size() || pos >= 0 ) {
foxbrianr 1:aaddf80105fe 265
foxbrianr 1:aaddf80105fe 266 int index = (head_ - 1 - pos );
foxbrianr 1:aaddf80105fe 267
foxbrianr 1:aaddf80105fe 268 if (index < 0 )
foxbrianr 1:aaddf80105fe 269 index += max_size_;
foxbrianr 1:aaddf80105fe 270
foxbrianr 1:aaddf80105fe 271 result = &(events[index]);
foxbrianr 1:aaddf80105fe 272 }
foxbrianr 1:aaddf80105fe 273 }
foxbrianr 1:aaddf80105fe 274 return result;
foxbrianr 1:aaddf80105fe 275 }