| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- #include "soft_timer.h"
- #include "main.h"
- #include "stdbool.h"
- #include "soft_can.h"
- #include "usart_data_handle.h"
- #include "main_task.h"
- #include "string.h"
- extern uint32_t user_timer_cnt;
- /**
- * @file timer_function
- * @brief 发送给控制的定时器
- * @param
- * @details
- * @author Zhang Sir
- **/
- bool vol_flag = false, devtype_flag = false, engine_flag = false,
- can_debug_flag = false, dev_version_flag = false,mimo360_radar_flag = false,
- pmu_heart_flag = false;
- Dev_timer send_devinfo_time;
- void timer_function()
- {
- static uint32_t time_1hz = 0;
- static uint32_t time_2hz = 0;
- static uint32_t time_5hz = 0;
- static uint32_t time_10hz = 0;
- static uint32_t time_20hz = 0;
- static uint32_t time_50hz = 0;
- static uint32_t time_100hz = 0;
- static uint32_t time_500hz = 0;
- if ( Check_Timer_Ready(&time_1hz,_1_HZ_) )
- {
- send_devinfo_time.arm = true;
- }
- if ( Check_Timer_Ready(&time_2hz,_2_HZ_) )
- {
-
- send_devinfo_time.nozzle = true;
- send_devinfo_time.seed = true;
- send_devinfo_time.checklow = true;
- dev_version_flag = true;
- }
- if ( Check_Timer_Ready(&time_5hz,_5_HZ_))
- {
- engine_flag = true;
-
- send_devinfo_time.bms = true;
- if(planep.Candebug_flag == true)
- {
- can_debug_flag = true;
- }
- else
- {
- can_debug_flag = false;
- }
- }
- if ( Check_Timer_Ready(&time_10hz,_10_HZ_) )
- {
- }
- if ( Check_Timer_Ready(&time_20hz,_20_HZ_) )
- {
- vol_flag = true;
- mimo360_radar_flag = true;
- send_devinfo_time.weight = true;
- send_devinfo_time.radar = true;
- send_devinfo_time.flow = true;
- send_devinfo_time.L_pump1 = true;
- send_devinfo_time.L_pump2 = true;
- send_devinfo_time.pump = true;
- }
- if ( Check_Timer_Ready(&time_50hz,_50_HZ_) )
- {
- // 数据量包太多,超过了200hz极限,导致丢数据。
- send_devinfo_time.part_radar = true;
- send_devinfo_time.part_Fradar = true;
- send_devinfo_time.part_Bradar = true;
- devtype_flag = true;
-
- }
- if(Check_Timer_Ready(&time_100hz,_100_HZ_))
- {
- }
- if(Check_Timer_Ready(&time_500hz,_200_HZ_))
- {
-
- }
- }
- /**
- * @file Get_Systimer_Us
- * @brief 获取系统当前时间us
- * @param
- * @details
- * @author Zhang Sir
- **/
- uint32_t Get_Systimer_Us(void)
- {
- uint32_t time = 0;
- rt_enter_critical(); // 进入临界 不允许调度器执行
- time = htim4.Instance->CNT + user_timer_cnt * 20000;
- rt_exit_critical(); //退出临界
- return time;
- }
- uint32_t test_time[10] = {0};
- uint32_t test_priod = 0;
- uint32_t check_period_func(uint32_t *time)
- {
- uint32_t time_err = 0;
- time_err = HAL_GetTick() - *time;
- *time = HAL_GetTick();
- return time_err;
- }
- uint8_t isLeapYear(uint16_t year)
- {
- uint8_t res=0;
- if(year%4 == 0) // 能够被4整除
- {
- if(year%100 != 0 || year%400 == 0) //能被4整除不能被100整除或者能够被400整除
- {
- res = 1;
- }
- else
- {
- res =0;
- }
- }
- return res;
- }
- // 将Unix时间戳转换为北京时间
- // unixTime: 需要判断的Unix时间戳
- // *tempBeijing:返回的北京时间
- // return:none
- // note:没对输入参数正确性做判断
- rtc_time_t beijing_time;
- uint8_t utc_send_time = 10;
- uint32_t utc_time = 0;
- void covUnixTimeStp2Beijing( uint32_t unixTime, rtc_time_t *tempBeijing )
- {
- uint32_t totleDayNum = 0, totleSecNum = 0;
- uint16_t remainDayofYear = 0, tempYear = 0;
- uint8_t *pr = NULL;
- static uint8_t month_day[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //平年
- static uint8_t Leap_month_day[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //闰年
- totleDayNum = unixTime / ( 24 * 60 * 60 ); //总天数(注意加括号)
- totleSecNum = unixTime % ( 24 * 60 * 60 ); //当天剩余的秒速
- memset( tempBeijing, 0x00, sizeof( rtc_time_t ) );
- // 1.先计算时间 HH:MM:SS
- tempBeijing->ui8Hour = totleSecNum / 3600;
- tempBeijing->ui8Minute = ( totleSecNum % 3600 ) / 60; //error:变量搞错
- tempBeijing->ui8Second = ( totleSecNum % 3600 ) % 60;
- // 2.对时间进行时区调整(注意:这里可能造成日期 +1)
- tempBeijing->ui8Hour += TIMEZONE;
- if ( tempBeijing->ui8Hour > 23 )
- {
- //printf("modify day..\n");
- tempBeijing->ui8Hour -= 24;
- remainDayofYear++; // 日期+1
- }
- // 3.计算哪一年
- tempBeijing->ui8Year = 1970 + ( totleDayNum / FOURYEARDAY ) * 4; // 4年为一个周期
- remainDayofYear += totleDayNum % FOURYEARDAY;
- //printf("year:%d, day:%d.\n", tempBeijing->ui8Year, remainDayofYear);
- tempYear = isLeapYear( tempBeijing->ui8Year ) ? 366 : 365;
- while ( remainDayofYear >= tempYear ) // 计算4年整数倍外的年。
- {
- tempBeijing->ui8Year++;
- remainDayofYear -= tempYear;
- tempYear = isLeapYear( tempBeijing->ui8Year ) ? 366 : 365;
- }
- // 4.计算哪一月的哪一天
- pr = isLeapYear( tempBeijing->ui8Year ) ? Leap_month_day : month_day;
- remainDayofYear++; // 这里开始计算具体日期。remainDayofYear为 0 时其实是 1 号,所以这里要 +1
- while ( remainDayofYear > *( pr + tempBeijing->ui8Month ) )
- {
- remainDayofYear -= *( pr + tempBeijing->ui8Month );
- tempBeijing->ui8Month++;
- }
- //printf("year:%d, day:%d.\n", tempBeijing->ui8Year, remainDayofYear);
- tempBeijing->ui8Month++; //month
- tempBeijing->ui8DayOfMonth = remainDayofYear; //day
- //printf("year:%d, day:%d.\n", tempBeijing->ui8Year, tempBeijing->ui8DayOfMonth);
- }
|