编辑代码

#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>

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;
}