typedef enum
{
LIGHT_STATUS_CLOSE = 0,
LIGHT_STATUS_OPEN,
}light_status_t;
typedef struct
{
uint8_t duty;
uint8_t change;
uint16_t duty_voltage;
light_status_t status;
}light_t;
typedef struct net_time
{
uint8_t flag;
uint16_t count;
int month;
int day;
int hour;
int minute;
int second;
}net_time_t;
typedef struct net
{
uint8_t pub_light_ch1;
uint8_t pub_switch;
uint8_t task_data[300];
}net_t;
typedef struct sys
{
net_t net;
light_t light;
net_time_t time;
}sys_t;
static sys_t sys;
void net_run(void)
{
if (1 == sys.time.flag && sys.net.task_data[0] >= 1 && sys.net.task_data[0] <= 10)
{
uint16_t task_next = 1;
uint16_t task_num = sys.net.task_data[0];
printf("task_num:%d\r\n", task_num);
uint16_t cur_date = (uint16_t)(sys.time.month << 8 | sys.time.day);
printf("cur_date:%04x\r\n", cur_date);
uint16_t cur_time = (uint16_t)(sys.time.hour << 8 | sys.time.minute);
printf("cur_time:%04x\r\n", cur_time);
//01 01 01 01 0a 09 03 08 00 01 10 00 50 12 00 64
//04 01 01 01 03 1F 03 08 00 50 09 00 51 10 00 51
// 01 01 01 03 1F 02 08 00 50 09 00 51
// 01 01 01 03 1F 04 08 00 50 09 00 51 10 00 51 11 00 52
// 01 01 01 03 1F 05 08 00 50 09 00 51 10 00 51 11 00 52 12 00 50
for (uint16_t i = 0; i < task_num; i++)
{
printf(">>>>>>>>>>>>>>\r\ntask_enable[%d]:%02x\r\n", i, sys.net.task_data[task_next]);
if (task_next >= 300) break;
if (1 == sys.net.task_data[task_next])
{
if (sys.net.task_data[task_next + 1] > 12 || sys.net.task_data[task_next + 1] <= 0) goto go_next;
if (sys.net.task_data[task_next + 2] > 31 || sys.net.task_data[task_next + 2] <= 0) goto go_next;
if (sys.net.task_data[task_next + 3] > 12 || sys.net.task_data[task_next + 3] <= 0) goto go_next;
if (sys.net.task_data[task_next + 4] > 31 || sys.net.task_data[task_next + 4] <= 0) goto go_next;
uint16_t task_start_date = (uint16_t)(sys.net.task_data[task_next + 1] << 8 | sys.net.task_data[task_next + 2]);
printf("task_start_date[%d]:%04x\r\n", i, task_start_date);
uint16_t task_end_date = (uint16_t)(sys.net.task_data[task_next + 3] << 8 | sys.net.task_data[task_next + 4]);
printf("task_end_date[%d]:%04x\r\n", i, task_end_date);
if (cur_date >= task_start_date && cur_date <= task_end_date)
{
if (sys.net.task_data[task_next + 5] > 10) goto go_next;
uint8_t task_duty = 0xFF;
for (uint16_t j = 0; j < sys.net.task_data[task_next + 5]; j++)
{
if (sys.net.task_data[task_next + j * 3 + 6] > 23 || sys.net.task_data[task_next + j * 3 + 7] > 59) goto go_next;
uint16_t task_time = (uint16_t)(sys.net.task_data[task_next + j * 3 + 6] << 8 | sys.net.task_data[task_next + j * 3 + 7]);
printf("task_time[%d][%d]:%04x\r\n", i, j, task_time);
if (cur_time >= task_time)
{
if (sys.net.task_data[task_next + j * 3 + 8] > 100) goto go_next;
task_duty = sys.net.task_data[task_next + j * 3 + 8];
printf("task_duty[%d][%d]:%d\r\n", i, j, task_duty);
}
}
if (task_duty <= 100 && sys.light.duty != task_duty)
{
printf("task_duty[%d]:%d\r\n", i, task_duty);
sys.light.change = 1;
if (sys.light.duty != task_duty)
{
sys.net.pub_light_ch1 = 1;
}
sys.light.duty = task_duty;
sys.light.duty_voltage = sys.light.duty * 100;
if (sys.light.duty >= 1)
{
if (sys.light.status == LIGHT_STATUS_CLOSE)
{
sys.light.status = (light_status_t)LIGHT_STATUS_OPEN;
sys.net.pub_switch = 1;
}
}
else if (sys.light.duty == 0)
{
if (sys.light.status != (light_status_t)LIGHT_STATUS_CLOSE)
{
sys.net.pub_switch = 1;
}
sys.light.status = (light_status_t)LIGHT_STATUS_CLOSE;
}
}
}
}
go_next: task_next += sys.net.task_data[task_next + 5] * 3 + 6;
printf("task_next[%d]:%d\r\n <<<<<<<<<<<<<<<<\r\n", i, task_next);
}
}
}
int main ()
{
uint8_t data_buf[300] = {
0x04,
0x01, 0x01, 0x01, 0x03, 0x1F, 0x03, 0x01, 0x00, 0x50, 0x02, 0x00, 0x51, 0x03, 0x00, 0x52,
0x01, 0x04, 0x01, 0x06, 0x1F, 0x02, 0x04, 0x00, 0x53, 0x05, 0x00, 0x54,
0x01, 0x07, 0x01, 0x0A, 0x1F, 0x04, 0x06, 0x00, 0x55, 0x07, 0x00, 0x56, 0x08, 0x00, 0x57, 0x09, 0x00, 0x58,
0x01, 0x0B, 0x01, 0x0C, 0x1F, 0x05, 0x0A, 0x00, 0x59, 0x0B, 0x00, 0x5A, 0x0C, 0x00, 0x5B, 0x0D, 0x00, 0x5C, 0x0E, 0x00, 0x5D
};
uint8_t data_buf1[300] = {
0x01, 0x01, 0x01, 0x01, 0x0a, 0x09, 0x03, 0x08, 0x00, 0x01, 0x10, 0x00, 0x50, 0x12, 0x00, 0x64
};
memcpy(sys.net.task_data, data_buf1, 300);
sys.time.month = 7;
sys.time.day = 5;
sys.time.hour = 17;
sys.time.minute = 41;
sys.time.flag = 1;
net_run();
return 0;
}