⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 systime.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 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 + -