#include <stdio.h>
#include <math.h>
#include <stdint.h>
#include <time.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
uint8_t gCuc_HEX2BCDMap[] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
};
uint8_t APIByteHEX2BCD(uint8_t ucHEX)
{
if(ucHEX > 99)
{
return 99;
}
return gCuc_HEX2BCDMap[ucHEX];
}
long diff_datetime(char *datetime1, char *datetime2)
{
time_t timep1=0, timep2=0;
long d_tmp=0;
struct tm tm1, tm2;
char ctmp1[4+1]={0};
char ctmp2[4+1]={0};
int year1=0;
int year2=0;
int mon1 =0;
int mon2 =0;
int day1 =0;
int day2 =0;
int hour1=0;
int hour2=0;
int min1 =0;
int min2 =0;
int sec1 =0;
int sec2 =0;
memset(&tm1,0,sizeof(tm1));
memset(&tm2,0,sizeof(tm2));
memset(ctmp1,0,sizeof(ctmp1));
memset(ctmp2,0,sizeof(ctmp2));
memcpy(ctmp1,datetime1,4);
memcpy(ctmp2,datetime2,4);
year1 =atoi(ctmp1);
year2 =atoi(ctmp2);
memset(ctmp1,0,sizeof(ctmp1));
memset(ctmp2,0,sizeof(ctmp2));
memcpy(ctmp1,datetime1+4,2);
memcpy(ctmp2,datetime2+4,2);
mon1 =atoi(ctmp1);
mon2 =atoi(ctmp2);
memset(ctmp1,0,sizeof(ctmp1));
memset(ctmp2,0,sizeof(ctmp2));
memcpy(ctmp1,datetime1+6,2);
memcpy(ctmp2,datetime2+6,2);
day1 =atoi(ctmp1);
day2 =atoi(ctmp2);
memset(ctmp1,0,sizeof(ctmp1));
memset(ctmp2,0,sizeof(ctmp2));
memcpy(ctmp1,datetime1+8,2);
memcpy(ctmp2,datetime2+8,2);
hour1 =atoi(ctmp1);
hour2 =atoi(ctmp2);
memset(ctmp1,0,sizeof(ctmp1));
memset(ctmp2,0,sizeof(ctmp2));
memcpy(ctmp1,datetime1+10,2);
memcpy(ctmp2,datetime2+10,2);
min1 =atoi(ctmp1);
min2 =atoi(ctmp2);
memset(ctmp1,0,sizeof(ctmp1));
memset(ctmp2,0,sizeof(ctmp2));
memcpy(ctmp1,datetime1+12,2);
memcpy(ctmp2,datetime2+12,2);
sec1 =atoi(ctmp1);
sec2 =atoi(ctmp2);
tm1.tm_year=year1-1900;
tm2.tm_year=year2-1900;
tm1.tm_mon=mon1-1;
tm2.tm_mon=mon2-1;
tm1.tm_mday=day1;
tm2.tm_mday=day2;
tm1.tm_hour=hour1;
tm2.tm_hour=hour2;
tm1.tm_min=min1;
tm2.tm_min=min2;
tm1.tm_sec=sec1;
tm2.tm_sec=sec2;
timep1 = mktime(&tm1);
timep2 = mktime(&tm2);
d_tmp = timep2 - timep1;
return d_tmp;
}
uint32_t GetNextSec(uint8_t UpdataInterval,uint8_t UpDataTime,uint8_t readDatetimeState,uint8_t year,uint8_t month,uint8_t day,uint8_t hour,uint8_t minute,uint8_t second){
uint8_t type_Number = 0;
uint16_t time_sec = 0;
uint8_t ServerTime[20] = {0};
uint8_t c_datetime[20] = {0};
long s_sec;
long s_sec1;
if(UpdataInterval<1){
UpdataInterval = 1;
}
if(UpDataTime == 0){
UpDataTime = 24;
}
if(UpdataInterval == 1){
if(readDatetimeState == 1){
sprintf((char *)ServerTime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,minute,second);
sprintf((char *)c_datetime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,0,0);
s_sec = diff_datetime((char *)c_datetime, (char *)ServerTime);
printf("1小时:s_sec = %d\r\n",s_sec);
if(abs(s_sec)>3300){
return (3600-abs(s_sec))+3600;
}
else{
return 3600-abs(s_sec);
}
}
else{
return 3600;
}
}
else if(UpdataInterval == 24){
if(readDatetimeState == 1){
sprintf((char *)ServerTime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,minute,second);
sprintf((char *)c_datetime,"20%02X%02X%02X%02X%02X%02X",year,month,day,APIByteHEX2BCD(UpDataTime),0,0);
s_sec = diff_datetime((char *)c_datetime, (char *)ServerTime);
printf("s_sec = %d\r\n",s_sec);
if(abs(s_sec) < 300){
if(s_sec<0){
return abs(s_sec) + 86400;
}
else{
return 86400-abs(s_sec);
}
}
else{
if(s_sec<0){
return abs(s_sec);
}
else{
return 86400-abs(s_sec);
}
}
}
else{
return 86400;
}
}
else{
if(readDatetimeState == 1){
sprintf((char *)ServerTime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,minute,second);
sprintf((char *)c_datetime,"20%02X%02X%02X%02X%02X%02X",year,month,day,hour,0,0);
s_sec = diff_datetime((char *)c_datetime, (char *)ServerTime);
printf("s_sec = %d\r\n",s_sec);
if(s_sec>3300){
return (3600-(s_sec))+((UpdataInterval)*3600);
}
else{
return (3600-(s_sec))+((UpdataInterval-1)*3600);
}
}
else{
return ((UpdataInterval)*3600);;
}
}
}
int main () {
printf("sec = %d\r\n",GetNextSec(1,1,1,0x25,0x6,0x22,0x13,0x54,0x0));
printf("sec = %d\r\n",GetNextSec(1,1,1,0x25,0x6,0x22,0x13,0x54,0x0));
}