00001
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include <stdio.h>
00050 #include <string.h>
00051 #include <time.h>
00052
00053
00054 #include "FreeRTOS.h"
00055 #include "task.h"
00056
00057 #include "shell.h"
00058
00059
00060
00062 #define CPTIME_MAX_NB_SCHED_CMDS 10
00063
00064
00065
00067 const signed portCHAR *const CPTIME_ERRMSG_SETVAL_UNAVAILSCHEDSLOT = (signed portCHAR *)ERROR_CRLF"No scheduling slot left"CRLF;
00068
00070 const signed portCHAR *const CPTIME_ERRMSG_SETVAL_INVALIDTIME = (signed portCHAR *)ERROR_CRLF"Invalid schedule date"CRLF;
00071
00073 const signed portCHAR *const CPTIME_ERRMSG_SETCFG_SYNTAXERROR = (signed portCHAR *)ERROR_CRLF"Usage: set_sys_config sys=time field=value"CRLF;
00074
00076 const signed portCHAR *const CPTIME_ERRMSG_SETCFG_UNKNOWNFIELD = (signed portCHAR *)ERROR_CRLF"Unknown configuration field"CRLF;
00077
00079 const signed portCHAR *const CPTIME_ERRMSG_SETCFG_INVALIDDATE = (signed portCHAR *)ERROR_CRLF"Invalid date"CRLF;
00080
00081
00083 time_t xcptime_LocalTime;
00084
00087 static portTickType xcptime_TickOrigin = 0;
00088
00092 typedef struct st_scheduled_cmd {
00093
00094 time_t xScheduledTime;
00095
00096 int CmdId;
00097
00098 void (*pfScheduledCmd)( int, void * );
00099
00100 void *pxParam;
00101 }Scheduled_Cmd;
00102
00104 static Scheduled_Cmd axCmdsSched[CPTIME_MAX_NB_SCHED_CMDS] = {
00105 {0, 0, NULL, NULL},
00106 {0, 0, NULL, NULL},
00107 {0, 0, NULL, NULL},
00108 {0, 0, NULL, NULL},
00109 {0, 0, NULL, NULL},
00110 {0, 0, NULL, NULL},
00111 {0, 0, NULL, NULL},
00112 {0, 0, NULL, NULL},
00113 {0, 0, NULL, NULL},
00114 {0, 0, NULL, NULL} };
00115
00117 static int NbSchedCmd = 0;
00118
00119
00120 static void prv_v_ShiftScheduledCmdsArray( int SrcIdx, int DstIdx);
00121
00126 void v_cptime_UpdateLocalTime( void )
00127 {
00128 xcptime_LocalTime = ( xTaskGetTickCount() - xcptime_TickOrigin )/configTICK_RATE_HZ;
00129 }
00130
00131
00135 void v_cptime_Init( void )
00136 {
00137 struct tm xLogDate;
00138
00139
00140
00141 xLogDate.tm_mon = 3;
00142 xLogDate.tm_mday = 3;
00143 xLogDate.tm_year = 107;
00144 xLogDate.tm_hour = 0;
00145 xLogDate.tm_min = 0;
00146 xLogDate.tm_sec = 0;
00147 xLogDate.tm_isdst = 0;
00148
00149 xcptime_LocalTime = mktime( &xLogDate );
00150 }
00151
00152
00153 #if configCTRLPANEL_TRACE == 1
00154
00157 void v_cptime_trace( void )
00158 {
00159 NAKED_TRACE_COM2( "CPTIME:<%d><%d>", NbSchedCmd, xcptime_LocalTime );
00160 }
00161 #endif
00162
00163
00170 void v_cptime_GetDateInFatStringFormat( char *pcDate )
00171 {
00172 struct tm *pxDate;
00173
00174
00175 pxDate = gmtime( &xcptime_LocalTime );
00176
00177
00178
00179
00180
00181 if( pxDate->tm_year >= 100 )
00182 pxDate->tm_year = 2000 + ( pxDate->tm_year - 100 );
00183 else
00184 pxDate->tm_year = 1900 + pxDate->tm_year;
00185 sprintf( pcDate, "%.4d%.2d%.2d%.2d%.2d0000", pxDate->tm_year,
00186 pxDate->tm_mon +1, pxDate->tm_mday, pxDate->tm_hour, pxDate->tm_min );
00187 }
00188
00204 eExecStatus e_cptime_RecordScheduledCmd( char *pcDate, int CmdId,
00205 void (*pfScheduledCmd)( int, void * ),
00206 void *pvCmdParams,
00207 signed portCHAR **ppcStringReply )
00208 {
00209 time_t xTimeOffsetSec;
00210 int i, j, k;
00211
00212
00213
00214 if( CPTIME_MAX_NB_SCHED_CMDS == NbSchedCmd )
00215 {
00216 *ppcStringReply = (signed portCHAR *)CPTIME_ERRMSG_SETVAL_UNAVAILSCHEDSLOT;
00217 return( SHELL_EXECSTATUS_KO );
00218 }
00219
00220
00221 xTimeOffsetSec = xcptime_LocalTime + atoi( pcDate );
00222 if( xTimeOffsetSec < ( xcptime_LocalTime +3 ) )
00223 {
00224 *ppcStringReply = (signed portCHAR *)CPTIME_ERRMSG_SETVAL_INVALIDTIME;
00225 return( SHELL_EXECSTATUS_KO );
00226 }
00227
00228
00229 for( i=0; (i<CPTIME_MAX_NB_SCHED_CMDS)&&(0 != axCmdsSched[i].xScheduledTime)&&(axCmdsSched[i].xScheduledTime <= xTimeOffsetSec); i++ );
00230
00231 NbSchedCmd++;
00232
00233
00234 if(i<CPTIME_MAX_NB_SCHED_CMDS)
00235 {
00236 if( 0!= axCmdsSched[i].xScheduledTime )
00237 {
00238 for(j=NbSchedCmd-1, k=NbSchedCmd-2; k>=i; j--, k--)
00239 {
00240 if( 0 != axCmdsSched[k].xScheduledTime )
00241 {
00242 axCmdsSched[j].xScheduledTime = axCmdsSched[k].xScheduledTime;
00243 axCmdsSched[j].CmdId = axCmdsSched[k].CmdId;
00244 axCmdsSched[j].pfScheduledCmd = axCmdsSched[k].pfScheduledCmd;
00245 axCmdsSched[j].pxParam = axCmdsSched[k].pxParam;
00246 }
00247 }
00248 }
00249
00250
00251 axCmdsSched[i].xScheduledTime = xTimeOffsetSec;
00252 axCmdsSched[i].CmdId = CmdId;
00253 axCmdsSched[i].pfScheduledCmd = pfScheduledCmd;
00254 axCmdsSched[i].pxParam = pvCmdParams;
00255 }
00256
00257 return( SHELL_EXECSTATUS_OK_NO_FREE );
00258 }
00259
00260
00264 void v_cptime_ExecuteScheduledCmd( void )
00265 {
00266 if( ( 0 != axCmdsSched[0].xScheduledTime )
00267 && ( axCmdsSched[0].xScheduledTime <= xcptime_LocalTime ) )
00268 {
00269
00270 axCmdsSched[0].pfScheduledCmd( axCmdsSched[0].CmdId, axCmdsSched[0].pxParam );
00271
00272 axCmdsSched[0].xScheduledTime = 0;
00273 NbSchedCmd--;
00274
00275
00276 prv_v_ShiftScheduledCmdsArray(1,0);
00277 }
00278 }
00279
00280
00297 eExecStatus e_cptime_cmd_set_config( eModId xModId, signed short FsNavId,
00298 int ac, signed portCHAR *av[],
00299 signed portCHAR **ppcStringReply )
00300 {
00301
00302
00303 struct tm xLogDate;
00304 time_t xRawDate;
00305 int i;
00306 int SrcIdx=0;
00307
00308
00309
00310
00311
00312
00313
00314 if( 2 != ac )
00315 {
00316 if(ppcStringReply != NULL)
00317 *ppcStringReply = (signed portCHAR *)CPTIME_ERRMSG_SETCFG_SYNTAXERROR;
00318 return( SHELL_EXECSTATUS_KO );
00319 }
00320
00321
00322 if( !strcmp("curtime", (char *)av[0]) )
00323 {
00324
00325 sscanf( (char *)av[1], "%02d/%02d/%02d %02d:%02d:%02d",
00326 &(xLogDate.tm_mon), &(xLogDate.tm_mday), &(xLogDate.tm_year),
00327 &(xLogDate.tm_hour), &(xLogDate.tm_min), &(xLogDate.tm_sec) );
00328 (xLogDate.tm_mon)--;
00329
00330
00331 xLogDate.tm_year += 100;
00332 xLogDate.tm_isdst = 0;
00333
00334
00335 xRawDate = mktime( &xLogDate );
00336
00337 if( -1 == xRawDate )
00338 {
00339 if(ppcStringReply != NULL)
00340 *ppcStringReply = (signed portCHAR *)CPTIME_ERRMSG_SETCFG_INVALIDDATE;
00341 return( SHELL_EXECSTATUS_KO );
00342 }
00343 else
00344 {
00345 NAKED_TRACE_COM2( "CPTIME:NbSchedCmd=%d", NbSchedCmd );
00346
00347
00348 for( i=NbSchedCmd-1; i>=0; i-- )
00349 {
00350 if( axCmdsSched[i].xScheduledTime <= xRawDate )
00351 {
00352
00353
00354
00355 SrcIdx = i+1;
00356 for( i=0; i<SrcIdx; i++ )
00357 {
00358 axCmdsSched[i].xScheduledTime = 0;
00359 NbSchedCmd--;
00360 }
00361 NAKED_TRACE_COM2( "CPTIME:NbSchedCmd=%d, SrcIdx=%d", NbSchedCmd, SrcIdx );
00362 break;
00363 }
00364 }
00365
00366
00367 if( ( 0 != NbSchedCmd ) && ( CPTIME_MAX_NB_SCHED_CMDS > SrcIdx ) )
00368 {
00369 NAKED_TRACE_COM2( "CPTIME:Shifting array from SrcIdx=%d to 0 idx", SrcIdx );
00370 prv_v_ShiftScheduledCmdsArray( SrcIdx, 0 );
00371 }
00372
00373
00374 xcptime_LocalTime = xRawDate;
00375 }
00376 }
00377 else
00378 {
00379 if(ppcStringReply != NULL)
00380 *ppcStringReply = (signed portCHAR *)CPTIME_ERRMSG_SETCFG_UNKNOWNFIELD;
00381 return( SHELL_EXECSTATUS_KO );
00382 }
00383 return( SHELL_EXECSTATUS_OK );
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412 }
00413
00414
00431 eExecStatus e_cptime_cmd_get_config( eModId xModId, signed short FsNavId,
00432 int ac, signed portCHAR *av[],
00433 signed portCHAR **ppcStringReply )
00434 {
00435 struct tm *pxDate;
00436
00437
00438
00439
00440
00441
00442
00443 if(ppcStringReply != NULL)
00444 {
00445
00446 *ppcStringReply = (signed portCHAR *)pvPortMalloc(31);
00447 if( NULL == *ppcStringReply )
00448 {
00449 *ppcStringReply = (signed portCHAR *)SHELL_ERRMSG_MEMALLOC;
00450 return( SHELL_EXECSTATUS_KO );
00451 }
00452
00453
00454 pxDate = gmtime( &xcptime_LocalTime );
00455
00456
00457
00458 if( pxDate->tm_year >= 100 ) pxDate->tm_year -= 100;
00459 sprintf( (char *)*ppcStringReply, "curtime=%02d/%02d/%02d %02d:%02d:%02d\r\n",
00460 pxDate->tm_mon +1, pxDate->tm_mday, pxDate->tm_year,
00461 pxDate->tm_hour, pxDate->tm_min, pxDate->tm_sec );
00462
00463
00464 return( SHELL_EXECSTATUS_OK );
00465 }
00466 return( SHELL_EXECSTATUS_KO );
00467 }
00468
00469
00470
00478 static void prv_v_ShiftScheduledCmdsArray( int SrcIdx, int DstIdx)
00479 {
00480
00481
00482 if( SrcIdx == DstIdx )
00483 return;
00484
00485 for( ;
00486 (SrcIdx<CPTIME_MAX_NB_SCHED_CMDS)&&(0 != axCmdsSched[SrcIdx].xScheduledTime);
00487 SrcIdx++,DstIdx++ )
00488 {
00489 axCmdsSched[DstIdx].xScheduledTime = axCmdsSched[SrcIdx].xScheduledTime;
00490 axCmdsSched[DstIdx].CmdId = axCmdsSched[SrcIdx].CmdId;
00491 axCmdsSched[DstIdx].pfScheduledCmd = axCmdsSched[SrcIdx].pfScheduledCmd;
00492 axCmdsSched[DstIdx].pxParam = axCmdsSched[SrcIdx].pxParam;
00493
00494 axCmdsSched[SrcIdx].xScheduledTime = 0;
00495 }
00496 }
00497