📄 systime.c
字号:
/****************************************************************
** *
** FILE : SysTime.C *
** *
** By : Cyb 2007.01.11 *
****************************************************************/
#include "includes.h"
#include "errcode.h"
#include "message.h"
#include "structs.h"
#include "tools.h"
#include "ramimage.h"
#include "gpsrecer.h"
#include "errtask.h"
#include "timetask.h"
#include "systime.h"
/*
********************************************************************************
* DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define PERIOD_MINREVISE 1 /* PERIOD_MINREVISE = 1 minute */
#define PERIOD_MAXREVISE 5 /* PERIOD_MAXREVISE = 5 minute */
#define DIFFERENCETIME 8 /* DIFFERENCETIME = 8 hours */
#define DEFAULT_YEAR 7
#define DEFAULT_MONTH 1
#define DEFAULT_DAY 1
#define DEFAULT_WEEK 2
#define DEFAULT_HOUR 0
#define DEFAULT_MINUTE 0
#define DEFAULT_SECOND 0
#define PERIOD_RESETSYS SECOND, 120
/*
********************************************************************************
* DEFINE MODULE VARIANT
********************************************************************************
*/
static TMR_TSK *SecondTmr;
static INT8U Ct_Revise;
static BOOLEAN Revised, Datevalid;
static SYSTIME_STRUCT Systime;
void ReviseSysTime(void)
{
if (GpsDataValid())
{
if (!GpsDateValid())
{
if (Revised)
{
return;
}
else
{
GetGpsTime(&Systime.time);
}
}
else
{
Datevalid = TRUE;
GetGpsTime(&Systime.time);
GetGpsDate(&Systime.date);
}
Revised = TRUE;
GetLocalTimeFromGMT(&Systime.date, &Systime.time, DIFFERENCETIME);
}
}
static void SecondTmrProc(void)
{
StartTmr(SecondTmr, SECOND, 1);
if (++Systime.time.second >= 60)
{
GetLocalTimeFromGMT(&Systime.date, &Systime.time, 0);
if (--Ct_Revise == 0)
{
ReviseSysTime();
if (Revised)
{
Ct_Revise = PERIOD_MAXREVISE;
}
else
{
Ct_Revise = PERIOD_MINREVISE;
}
}
}
StoreRamImage(RI_SYSTIME_, (INT8U *)&Systime, sizeof(Systime));
}
static void DiagnoseProc(void)
{
if (GetTmrSwitch(SecondTmr) != ON) ErrExit(ERR_SYSTIME_TMR);
}
void InitSysTime(void)
{
BOOLEAN valid;
valid = FALSE;
if (ResumeRamImage(RI_SYSTIME_, (INT8U *)&Systime, sizeof(Systime)))
{
if (DateValid(&Systime.date) && TimeValid(&Systime.time))
{
valid = TRUE;
}
}
if (!valid)
{
Systime.date.year = DEFAULT_YEAR; /* systime = 2002/1/1 0:0:0 */
Systime.date.month = DEFAULT_MONTH;
Systime.date.day = DEFAULT_DAY;
Systime.time.hour = DEFAULT_HOUR;
Systime.time.minute = DEFAULT_MINUTE;
Systime.time.second = DEFAULT_SECOND;
}
Revised = FALSE;
Datevalid = FALSE;
Ct_Revise = PERIOD_MINREVISE;
SecondTmr = CreateTimer(SecondTmrProc, 0);
StartTmr(SecondTmr, SECOND, 1);
InstallDiagProc(DiagnoseProc);
}
BOOLEAN SysTimeValid(void)
{
return Revised;
}
BOOLEAN SysDateValid(void)
{
return Datevalid;
}
INT8U GetSysTime(SYSTIME_STRUCT *ptr)
{
memcpy(ptr, &Systime, sizeof(SYSTIME_STRUCT));
return sizeof(SYSTIME_STRUCT);
}
INT8U GetSysTime_Date(DATE_STRUCT *date)
{
memcpy(date, &Systime.date, sizeof(DATE_STRUCT));
return sizeof(DATE_STRUCT);
}
INT8U GetSysTime_Time(TIME_STRUCT *time)
{
memcpy(time, &Systime.time, sizeof(TIME_STRUCT));
return sizeof(TIME_STRUCT);
}
INT8U SysTimeToGpsTime(TIME_STRUCT *time)
{
GetSysTime_Time(time);
if (time->hour < DIFFERENCETIME) {
time->hour += 24;
}
time->hour -= DIFFERENCETIME;
return sizeof(TIME_STRUCT);
}
void SetSysTime(DATE_STRUCT *date, TIME_STRUCT *time)
{
Revised = TRUE;
memcpy(&Systime.date, date, sizeof(DATE_STRUCT));
memcpy(&Systime.time, time, sizeof(TIME_STRUCT));
GetLocalTimeFromGMT(&Systime.date, &Systime.time, 0);
StoreRamImage(RI_SYSTIME_, (INT8U *)&Systime, sizeof(Systime));
}
void GetAsciiTime(ASCII_TIME *asciitime)
{
HexToDec(asciitime->ac_hour, &Systime.time.hour,1);
HexToDec(asciitime->ac_minute, &Systime.time.minute,1);
HexToDec(asciitime->ac_second, &Systime.time.second,1);
}
void GetAsciiDate(ASCII_DATE *asciidate)
{
HexToDec(asciidate->ac_year, &Systime.date.year,1);
HexToDec(asciidate->ac_month,&Systime.date.month,1);
HexToDec(asciidate->ac_day, &Systime.date.day,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -