← Back to dashboard

File view

plc_logging.lib

1
/*** BeginHeader *//
2
#ifndef ISM_LOGGING_LIB
3
#define ISM_LOGGING_LIB
4
/*** EndHeader */
5
6
/*** Message Format - 8 bytes *****************************************************
7
	  bb      bbb      bbb      bbb       bb        bbb     hh hh	  hh hh hh hh
8
	|-log-| |-code-| |-Prod-| |-Ch-| |-status-| |-Notes-| |-Rate-| |-time stamp-|
9
10
	|-log-|  		<< 2   = Alarm, Test, or system
11
	|-code-| 		<< 3   = Alarm or Test code
12
	|-Prod-|   	   << 3   = Product number
13
14
	|-status-| 		<< 2	 = Test Pass / Fail or Alarm Open / Closed
15
	|-Chl-|  		<< 3   = Channel number
16
	|-Notes-| 		<< 3   = Test Notes  or other
17
18
	|-Rate-| 		2 bite = Test Rate * 1000 or 3GPH test count
19
20
	|-time stamp-| 4 byte = Posted date / time
21
*********************************************************************************/
22
23
/*** BeginHeader
24
	InitializeLogs,
25
	InitEvent,
26
	FormatEvent,
27
	AddLogEvent,
28
   SearchEvent,
29
   UpdataFlashLog
30
*/
31
32
#define RECORD_SIZE	 8
33
#define RAM_LOG_LEN	 20
34
#define MAX_FILE_SIZE (XMEM_RESERVE_SIZE - (XMEM_RESERVE_SIZE / 8))
35
36
// Global Function declerations ********************************************************
37
38
void  InitializeLogs (int InitStr);
39
void 	InitEvent		(EventSt *EventSet);
40
void 	FormatEvent		(EventSt *EventSet, char *string1, char *string2);
41
void 	AddLogEvent		(EventSt *EventSet);
42
int  	SearchEvent		(int logType, int action, EventSt *EventDataSet);
43
int 	UpdataFlashLog (void);
44
45
/*** EndHeader */
46
47
// Local function declerations *******************************************************
48
typedef struct adrSt 
49
{
50
	long	startAdd;
51
	long	wrtAdd;
52
   long	rdAdd;
53
	long	eof;
54
} AdrSt;
55
typedef AdrSt * AdrStPtr;
56
57
typedef struct rLogSt 
58
{
59
	int  		CurIdx;
60
	int	   GPH3DayCnt;
61
	uint8_t *RLog;
62
	uint8_t *NextRLog;
63
} RLogSt;
64
typedef RLogSt * RLogStPtr;
65
66
AdrSt Position			(int filehandle);
67
int	CreateLogFile	(int logType);
68
int 	ReadEvent		(long rdAdr, EventSt *EventSet);
69
void 	AddGPH3P			(EventSt *EventSet);
70
void 	UpdateLog 		(EventSt *EventSet);
71
72
// Local Var
73
root uint8_t 	RLogR[RAM_LOG_LEN][RECORD_SIZE];
74
root uint8_t	RLogW[RAM_LOG_LEN][RECORD_SIZE];
75
	  EventSt	Gph3P[N_PROD];
76
  	  EventSt	Last2[N_PROD];
77
	  RLogSt		RamLogWr;
78
	  RLogSt		RamLogRd;
79
	  AdrSt		RdAdr;
80
81
// Initualize loggint data structures **********************************************
82
void InitializeLogs(int InitStr) {
83
	int i;
84
	int j;
85
86
	if (InitStr) {
87
		for (i = 0 ; i < RAM_LOG_LEN ; i++) 
88
		{
89
	      for (j = 0 ; j < RECORD_SIZE ; j++) 
90
		  {
91
	         	RLogW[i][j] = 0;
92
 				RLogR[i][j] = 0;
93
	      }
94
	   }
95
	   for (i = 0 ; i < N_PROD ; i++) 
96
	   {
97
	   	InitEvent(&Gph3P[i]);
98
	   	InitEvent(&Last2[i]);
99
	   }
100
	   RamLogWr.CurIdx        = 0;
101
	   RamLogWr.GPH3DayCnt    = 0;
102
	   RamLogWr.RLog          = RLogW[0];
103
	   RamLogWr.NextRLog      = RLogW[RamLogWr.CurIdx];
104
105
	   RamLogRd.CurIdx        = 0;
106
	   RamLogRd.GPH3DayCnt    = 0;
107
	   RamLogRd.RLog          = RLogR[0];
108
	   RamLogRd.NextRLog      = RLogR[RamLogRd.CurIdx];
109
	}
110
	else if (RamLogWr.CurIdx != 0)
111
		i = UpdataFlashLog();
112
113
	i = sizeof(RdAdr);
114
	RdAdr.startAdd = i;
115
	RdAdr.wrtAdd 	= i;
116
	RdAdr.rdAdd		= i;
117
	RdAdr.eof 		= i;
118
}
119
120
// CreateLogFile *****************************************************************
121
int CreateLogFile(int logType) {
122
	root AdrSt 	init;
123
   	  File 	logFile;
124
		  int 	AdrSize;
125
   	  int  	fileHandle;
126
   	  int 	result;
127
128
	result 		= 0;
129
   fileHandle 	= 0;
130
	AdrSize 		= sizeof(init);
131
132
   fdelete(logType);
133
	fileHandle = fcreate (&logFile, logType);
134
	fileHandle = fopen_wr(&logFile, logType);
135
	if (fileHandle == 0) {
136
      init.startAdd 	= AdrSize;
137
      init.wrtAdd 	= AdrSize;
138
      init.rdAdd 		= AdrSize;
139
      init.eof 		= 0;
140
141
      fseek(&logFile, 0 ,SEEK_SET);
142
      result  = fwrite(&logFile, (char*)&init, sizeof(init));
143
      result -= sizeof(init);
144
      fclose(&logFile);
145
	}
146
   else
147
   	printf("Could not create log file for   some reason\n");
148
149
   return result;
150
}
151
152
// Return current position in log file *********************************************
153
AdrSt Position(int fileHandle) 
154
{
155
   	root AdrSt result;
156
   	File  logFile;
157
   	int   readResult;
158
159
   	fopen_rd(&logFile, fileHandle);
160
   	readResult  = fseek(&logFile, 0, SEEK_SET);
161
	readResult += fread(&logFile, (char*)&result, sizeof(result));
162
	readResult -= sizeof(result);
163
	if (readResult)
164
	{
165
	   printf("Could not read pointer structure\n");
166
	}
167
   	fclose(&logFile);
168
	printf("Logfile POS - %u %u %u \n", result.startAdd, result.rdAdd, result.wrtAdd);
169
170
  return result;
171
}
172
173
// AddLogEvent *******************************************************************
174
void AddLogEvent(EventSt *EventSet) 
175
{
176
	if 	  (EventSet->Code == TEST_GPH3 && EventSet->Status == PASS)
177
	{
178
		//AddGPH3P(EventSet);
179
		UpdateLog(EventSet);
180
	}
181
	else if (EventSet->Code == TEST_PNT2 && EventSet->Status == PASS) 
182
	{
183
		memcpy(&Last2[EventSet->Product], EventSet, sizeof(EventSet));
184
	 	UpdateLog(EventSet);
185
	}
186
	else
187
	{
188
  		UpdateLog(EventSet);
189
	}
190
}
191
192
// Add 3GPH Pass Logs ************************************************************
193
void AddGPH3P(EventSt *EventSet) 
194
{
195
	int prod;
196
197
	prod = EventSet->Product;
198
	mktm  (&EventSet->TOD,  EventSet->Time);
199
	if (Gph3P[prod].Time == 0) 
200
	{
201
		memcpy(&Gph3P[prod], EventSet, sizeof(EventSet));
202
		Gph3P[prod].Rate = 1.0;
203
	}
204
	else if (Gph3P[prod].TOD.tm_year == EventSet->TOD.tm_year &&
205
				Gph3P[prod].TOD.tm_mday == EventSet->TOD.tm_mday &&
206
				Gph3P[prod].TOD.tm_mon	== EventSet->TOD.tm_mon) 
207
	{
208
		Gph3P[prod].Rate += 1.0;
209
	}
210
	else 
211
	{
212
		UpdateLog(&Gph3P[prod]);
213
		memcpy(&Gph3P[prod], EventSet, sizeof(EventSet));
214
		Gph3P[prod].Rate = 1.0;
215
	}
216
}
217
218
// Add entry to log file *********************************************************
219
void UpdateLog(EventSt *EventSet) 
220
{
221
	uint8_t		data[2];
222
	int			rate;
223
   	int 			result;
224
   	int i;
225
226
   	result  = 0;
227
   	rate 	  =  (int)(EventSet->Rate * 1000.0);
228
	data[0] = (((char)EventSet->LogType << 6) & 0xC0);
229
	data[0] = (((char)EventSet->Code    << 3) & 0x38) | data[0];
230
	data[0] = (((char)EventSet->Product     ) & 0x07) | data[0];
231
	data[1] = (((char)EventSet->Channel << 6) & 0xC0);
232
	data[1] = (((char)EventSet->Status  << 3) & 0x38) | data[1];
233
	data[1] = (((char)EventSet->Notes       ) & 0x07) | data[1];
234
235
   RamLogWr.NextRLog[0] = data[0];
236
   RamLogWr.NextRLog[1] = data[1];
237
   memcpy(&RamLogWr.NextRLog[2], (char*)&rate,           sizeof(rate)          );
238
   memcpy(&RamLogWr.NextRLog[4], (char*)&EventSet->Time, sizeof(EventSet->Time));
239
 
240
   if (++RamLogWr.CurIdx >= RAM_LOG_LEN)
241
   {
242
      result = UpdataFlashLog();
243
   }
244
   else
245
   {
246
      RamLogWr.NextRLog = RLogW[RamLogWr.CurIdx];
247
   }
248
249
	if (result)
250
	{
251
		printf("Error writing Ram log to Flash Log\n");
252
	}
253
}
254
255
// Read / Parse single event from log *********************************************
256
int ReadEvent(long rdAdr, EventSt *EventSet) 
257
{
258
	root uint8_t	data[8];
259
	File 		logFile;
260
   	FSLXnum 	flash1;
261
   	int 		result;
262
   	int			rate;
263
    int i;
264
265
	result = 0;
266
267
	if (RamLogWr.CurIdx > 0)
268
		result = UpdataFlashLog();
269
270
	flash1  = fs_get_flash_lx();
271
   	result += fopen_rd(&logFile, LOG_FILE);
272
   	result += fseek(&logFile, rdAdr, SEEK_SET);
273
	result  = fread(&logFile, (char*)&data, sizeof(data));
274
	result -= sizeof(data);
275
	fclose(&logFile);
276
277
	if (result == 0) 
278
	{
279
		memcpy(&EventSet->Time, (char*)&data[4], sizeof(EventSet->Time));
280
		memcpy(&rate, 			   (char*)&data[2], sizeof(rate));
281
		mktm  (&EventSet->TOD,  EventSet->Time);
282
		EventSet->Rate 	= (float)rate  / 1000.0;
283
		EventSet->Product = (int)(data[0]     ) & 0x07;
284
	   	EventSet->Code		= (int)(data[0] >> 3) & 0x07;
285
		EventSet->LogType = (int)(data[0] >> 6) & 0x03;
286
		EventSet->Notes   = (int)(data[1]  	  ) & 0x07;
287
		EventSet->Status	= (int)(data[1] >> 3) & 0x07;
288
		EventSet->Channel	= (int)(data[1] >> 6) & 0x03;
289
	}
290
	return result;
291
}
292
293
// Write Log to Fladh *************************************************************
294
int UpdataFlashLog(void) 
295
{
296
   	File 			logFile;
297
   	FSLXnum 		flash1;
298
	root AdrSt	pos;
299
	int 			fileHandle;
300
   	int			Records;
301
	int			result;
302
303
	fileHandle 	= 0;
304
   	result 		= 0;
305
	Records		= RamLogWr.CurIdx * RECORD_SIZE;
306
307
   	flash1 		= fs_get_flash_lx();
308
	fileHandle	= fopen_wr(&logFile, LOG_FILE);
309
310
   	if (fileHandle) 
311
	{
312
   		fileHandle = CreateLogFile(LOG_FILE);
313
      	fopen_wr(&logFile, LOG_FILE);
314
   	}
315
   if (fileHandle) 
316
   {
317
      printf("Error Opening Log File\n");
318
      result = 1;
319
   }
320
   else 
321
   {
322
		pos 				= Position(LOG_FILE);
323
		if (pos.wrtAdd + Records >= MAX_FILE_SIZE) 
324
		{
325
	      pos.eof 		= pos.wrtAdd - RECORD_SIZE;
326
	      pos.wrtAdd  = sizeof(pos);
327
		}
328
329
		result		+= fseek (&logFile, pos.wrtAdd, SEEK_SET);
330
		result 		+= fwrite(&logFile, (char*)RamLogWr.RLog, Records);
331
		result 		-= Records;
332
      	pos.wrtAdd 	+= Records;
333
      	result		+= fseek (&logFile, 0, SEEK_SET);
334
      	result 		+= fwrite(&logFile, (char*)&pos, sizeof(pos));
335
      	result 		-= sizeof(pos);
336
337
      	RamLogWr.CurIdx 	= 0;
338
      	RamLogWr.NextRLog = RLogW[RamLogWr.CurIdx];
339
   }
340
	if (result)
341
	{
342
      printf("Error Writing to Log File\n");
343
	}
344
}
345
346
// Show Alarms *******************************************************************
347
int SearchEvent(int logType, int action, EventSt *EventData) 
348
{
349
   int validEvent;
350
   int result;
351
352
   validEvent = 0;
353
   result 	  = 0;
354
355
   while (validEvent == 0 && result == 0) 
356
   {
357
      if 	  (action == OPEN_FILE) 
358
	  {
359
      		RdAdr 		= Position(LOG_FILE);
360
         	RdAdr.rdAdd = RdAdr.wrtAdd;
361
         	action 		= PREVIOUS_EVENT;
362
      }
363
      else if (action == CLOSE_FILE) 
364
	  {
365
         	result = 1;
366
      }
367
      else if (action == PREVIOUS_EVENT) 
368
	  {
369
         RdAdr.rdAdd -= RECORD_SIZE;
370
371
         if (RdAdr.rdAdd <= RdAdr.startAdd) 
372
		 {
373
            if (RdAdr.eof > RdAdr.wrtAdd)
374
			{
375
           		RdAdr.rdAdd = RdAdr.eof;
376
			}
377
			else
378
			{
379
				result = 1;
380
			}
381
         }
382
         else if (RdAdr.rdAdd == RdAdr.wrtAdd)
383
		 {
384
         	result = 1;
385
		 }
386
         else if (RdAdr.rdAdd == 0)
387
		 {
388
         	result = 1;
389
		 }
390
         if (result == 0)
391
		 {
392
         	result = ReadEvent(RdAdr.rdAdd, EventData);
393
		 }
394
         if (EventData->LogType == logType)
395
		 {
396
         	validEvent = 1;
397
		 }
398
         else
399
		 {
400
         	action = PREVIOUS_EVENT;
401
		 }
402
      }
403
   }
404
405
   return result;
406
}
407
408
// Output Format ******************************************************************
409
void FormatEvent(EventSt *EventSet, char *string1, char *string2) 
410
{
411
   char	tmpStrg [DISPLAY_LENGTH + 1];
412
   char year;
413
414
	// Foramt Data String
415
   if (EventSet->TOD.tm_year > 99)
416
   {
417
      year = EventSet->TOD.tm_year - 100;
418
   }
419
   else
420
   {
421
      year = EventSet->TOD.tm_year;
422
   }
423
   sprintf(string1, "%02d/%02d/%02d %02d:%02d", EventSet->TOD.tm_mon,
424
	                                             EventSet->TOD.tm_mday,
425
	                                             				     year,
426
	                                             EventSet->TOD.tm_hour,
427
	                                             EventSet->TOD.tm_min);
428
429
	switch (EventSet->LogType) 
430
	{
431
	   case TEST_LOG:
432
	      	FormatTestResault(string2, tmpStrg, EventSet);
433
         	if (EventSet->Code != TEST_GPH3)
434
		 	{
435
	      		sprintf(string2, "%s %s", string2, tmpStrg);
436
		 	}
437
	      break;
438
	   case ALRM_LOG:
439
	      FormatAlarm(string2, tmpStrg, EventSet);
440
	      sprintf(string2, "%s %s", string2, tmpStrg);
441
	      break;
442
	   case SYST_LOG:
443
	      sprintf(string2, "SYSTEM BOOT");
444
	      break;
445
	   default:
446
	      sprintf(string2, "");
447
	}
448
}
449
450
// Init Event Structure *********************************************************
451
void InitEvent(EventSt *EventSet) 
452
{
453
	EventSet->TOD.tm_sec    = 0;
454
	EventSet->TOD.tm_min    = 0;
455
	EventSet->TOD.tm_hour   = 0;
456
	EventSet->TOD.tm_mday   = 0;
457
	EventSet->TOD.tm_mon    = 0;
458
	EventSet->TOD.tm_year   = 0;
459
	EventSet->TOD.tm_wday   = 0;
460
	EventSet->Time          = 0;
461
	EventSet->Rate          = 0.0;
462
	EventSet->Product       = 0;
463
	EventSet->Channel       = 0;
464
	EventSet->LogType       = 0;
465
	EventSet->Code          = 0;
466
	EventSet->Status        = 0;
467
	EventSet->Notes         = 0;
468
}
469
470
/*** BeginHeader */
471
#endif
472
/*** EndHeader */