在做一个灯控器用时间来调节灯的亮度时,在时间上犯了难,问题所在是一个时间段内如果既包括零点前又包括零点后,那该如何判断?
刚开始想了一个思路:把中午十二点当作一天的开始,时间都转化为距离中午12点的分钟数,以此来判断,其实这样来判断考虑到了中午12点前后用户不会在这个时间段内亮灯,但仅仅是把午夜12点的坎换到了中午12点,属于治标不治本。
//返回现在时间距离中午12点的分钟数
int time_trans_format(void)
{
DirStru *getTime = (DirStru *)malloc(sizeof(DirStru));
GetRTC(getTime);
int minute = ((atoi(getTime->RTC_Time) / 100 + 12) % 24) * 60 + atoi(getTime->RTC_Time) % 100;
free(getTime);
return minute;
}
//时间控灯
void control_time(COMMOND_SOLOR_TIME timeBri)
{
int nowTime=time_trans_format();
if(nowTime>=timeBri.time2&&nowTime<timeBri.time3) //第三个时间段
{
control_bri(timeBri.bri2);
ESP_LOGI(TAG, "%d:third time begin:%d now:%d end:%d",devInfo.policy,timeBri.time2,nowTime,timeBri.time3);
}
else if(nowTime>=timeBri.time1&&nowTime<timeBri.time2) //第二个时间段
{
control_bri(timeBri.bri1);
ESP_LOGI(TAG, "%d:second time begin:%d now:%d end:%d",devInfo.policy,timeBri.time1,nowTime,timeBri.time2);
}
else if(nowTime>=timeBri.time0&&nowTime<timeBri.time1) //第一个时间段
{
control_bri(timeBri.bri0);
ESP_LOGI(TAG, "%d:first time begin:%d now:%d end:%d",devInfo.policy,timeBri.time0,nowTime,timeBri.time1);
}
else
{
control_bri(0);
}
}
但用这种思路终归是存在不合理的,于是又换了一种思路:先判断时间段是否有跨越零点的情况,如果结束时间 < 开始时间,证明有跨越零点的时间段,对这种特殊情况特殊考虑,用一个流程图来说明这种关系:
//判断现在的时间是否在被控时间内
static int jud_inside(int nowTime,int begTime,int endTime,char bri)
{
//开始时间 > 结束时间,跨越了零点
if(begTime>endTime)
{
//在零点前
if(nowTime>=begTime)
{
control_bri(bri);
return 1;
}
//在零点后
if(nowTime<endTime)
{
control_bri(bri);
return 1;
}
return 0;
}
//开始时间 < 结束时间, 没有跨越零点
if(begTime<endTime)
{
if(nowTime>=begTime&&nowTime<endTime)
{
control_bri(bri);
return 1;
}
return 0;
}
return 0;
}
//时间控灯
void control_time(COMMOND_SOLOR_TIME timeBri)
{
int nowTime;
//时间
DirStru *RtcGet = (DirStru *)malloc(sizeof(DirStru));
GetRTC(RtcGet);
nowTime = atoi(RtcGet->RTC_Time);
//先判断第一个时间段,在此区间,直接返回
if(jud_inside(nowTime, timeBri.time0, timeBri.time1, timeBri.bri0)==1)
{
free(RtcGet);
return;
}
//先判断第二个时间段,在此区间,直接返回
if(jud_inside(nowTime, timeBri.time1, timeBri.time2, timeBri.bri1)==1)
{
free(RtcGet);
return;
}
//先判断第三个时间段,在此区间,直接返回
if(jud_inside(nowTime, timeBri.time2, timeBri.time3, timeBri.bri2)==1)
{
free(RtcGet);
return;
}
control_bri(0);
free(RtcGet);
}