Baseline for testing
EventLog.cpp@2:486d068deff9, 2019-09-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |