| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478 |
- #include "gd32f30x_libopt.h"
- #include "main.h"
- #include "SysTick.h"
- #include "Relay.h"
- #include "Key.h"
- #include "Led.h"
- #include "Timer.h"
- #include "Electricity.h"
- #include "Temprature.h"
- #include "Beep.h"
- #include "Fan.h"
- #include "Exti.h"
- #include "At24xx.h"
- #include "Fwdgt.h"
- #include "Mb.h"
- #include "R_Led.h"
- #include "FreeRTOS.h"
- #include "task.h"
- #include "lcd.h"
- #include "font.h"
- #include "menu.h"
- #include "timers.h"
- #define VERSION "V1.1.0.0"
- #define UNIQU_1 0x1FFFF7E8
- #define UNIQU_2 0x1FFFF7EC
- #define UNIQU_3 0x1FFFF7F0
- sts_data_t sts_data;
- sts_data_t *get_sts(void)
- {
- return &sts_data;
- }
- #define START_TASK_PRIO 1
- #define START_STK_SIZE 128
- TaskHandle_t StartTask_Handler;
- void start_task(void *pvParameters);
- #define TASK1_PRIO 3
- #define TASK1_STK_SIZE 256
- TaskHandle_t Task1Task_Handler;
- void task1(void *pvParameters);
- #define TASK2_PRIO 2
- #define TASK2_STK_SIZE 128
- TaskHandle_t Task2Task_Handler;
- void modbus_task(void *pvParameters);
- #define TASK3_PRIO 3
- #define TASK3_STK_SIZE 256
- TaskHandle_t Task3Task_Handler;
- void lcd_task(void *pvParameters);
- #define TASK4_PRIO 4
- #define TASK4_STK_SIZE 128
- TaskHandle_t Task4Task_Handler;
- void task_1s(void *pvParameters);
- TimerHandle_t timer1_handle = 0;
- int32_t count = 0;
- uint32_t interval = 0;
- uint32_t timer_beep_flag = 0;
- void beep_timer_start(int cou2,uint32_t inval)
- {
- if(timer_beep_flag == 1)
- xTimerStop(timer1_handle,portMAX_DELAY);
- timer_beep_flag = 0;
- count = cou2;
- interval = inval;
- xTimerChangePeriod(timer1_handle,interval,portMAX_DELAY);
- xTimerStart(timer1_handle,portMAX_DELAY);
- timer_beep_flag = 1;
- }
- void beep_timer_stop()
- {
- if(timer_beep_flag == 1)
- xTimerStop(timer1_handle,portMAX_DELAY);
- timer_beep_flag = 0;
- }
- void timer1_callback( TimerHandle_t pxTimer )
- {
- sts_data.beep();
- if(count > 0)
- {
- count--;
- }else if(count == 0)
- {
- sts_data.clear_beep();
- beep_timer_stop();
- timer_beep_flag = 0;
- }else
- {
-
- }
- }
- extern uint8_t recode_normal_flag;
- extern uint8_t recode_channel;
- uint8_t counter = 0;
- void task_100ms(void *pvParameters)
- {
- uint32_t task1_num = 0;
- static uint8_t channel = 0;
- temp_init();
-
- for(uint8_t i = 0; i < 3;i++)
- {
- select_channel(i);
- Init_HLW8110();
- }
- read_config_from_eeprom();
- if(sts_data.switch_status == INPUT_CHANNEL_1 && sts_data.m_data.m_r.r_data.input_status.input_status[INPUT_CHANNEL_1])
- {
- sts_data.choise_input(INPUT_CHANNEL_1);
- }else
- {
- sts_data.choise_input(INPUT_CHANNEL_2);
- }
- if(sts_data.m_data.m_rw.rw_data.md_eep.out_status)
- {
- sts_data.open_output();
- }else
- {
- sts_data.close_output();
- }
- while(1)
- {
- sts_data.read_ele(channel);
- sts_data.check_wanning(channel);
- sts_data.read_temp();
- channel++;
- if(channel == 3)
- {
- if((sts_data.m_data.m_r.r_data.input_status.input_status[INPUT_CHANNEL_1]) &&
- (sts_data.m_data.m_r.r_data.input_status.input_status[INPUT_CHANNEL_2]))
- {
- sts_data.beep_flag = 0;
- sts_data.input_beep = 0;
- if(recode_normal_flag)
- {
- counter++;
- if(counter>= 3)
- {
- counter = 0;
- recode_normal_flag = 0;
- }
- channel = 0;
- vTaskDelay(100);
- continue;
- }
- if(sts_data.m_data.m_rw.rw_data.chiose_ch == INPUT_CHANNEL_1)
- {
- uint16_t wanning_1 = *(uint16_t*)(&sts_data.m_data.m_r.r_data.input_wanning.in_wan[INPUT_CHANNEL_1]);
- uint16_t wanning_2 = *(uint16_t*)(&sts_data.m_data.m_r.r_data.input_wanning.in_wan[INPUT_CHANNEL_2]);
- if(wanning_1 >> 8)
- {
- if(wanning_2 >> 8 )
- {
- if(sts_data.m_data.m_rw.rw_data.md_eep.out_status == OUT_OPEN)
- sts_data.close_output();
- }else
- {
- if(!recode_normal_flag)
- sts_data.choise_input(INPUT_CHANNEL_2);
- }
- }
- }else if(sts_data.m_data.m_rw.rw_data.chiose_ch == INPUT_CHANNEL_2)
- {
- uint16_t wanning_2 = *(uint16_t*)(&sts_data.m_data.m_r.r_data.input_wanning.in_wan[INPUT_CHANNEL_2]);
- uint16_t wanning_1 = *(uint16_t*)(&sts_data.m_data.m_r.r_data.input_wanning.in_wan[INPUT_CHANNEL_1]);
- if(wanning_2 >> 8)
- {
- if(wanning_1 >> 8)
- {
- if(sts_data.m_data.m_rw.rw_data.md_eep.out_status == OUT_OPEN) sts_data.close_output();
- }else
- {
- if(!recode_normal_flag)
- sts_data.choise_input(INPUT_CHANNEL_1);
- }
- }
- }else
- {
- ;
- }
- }else if((sts_data.m_data.m_r.r_data.input_status.input_status[INPUT_CHANNEL_1]) )
- {
- if(!sts_data.input_beep){
- sts_data.input_beep = 1;
- beep_timer_start(20,300);
- }
- uint16_t wanning_1 = *(uint16_t*)(&sts_data.m_data.m_r.r_data.input_wanning.in_wan[INPUT_CHANNEL_1]);
- if(wanning_1 >> 8)
- {
- if(sts_data.m_data.m_rw.rw_data.md_eep.out_status == OUT_OPEN) sts_data.close_output();
- }
- }else if((sts_data.m_data.m_r.r_data.input_status.input_status[INPUT_CHANNEL_2]) ){
- if(!sts_data.input_beep){
- sts_data.input_beep = 1;
- beep_timer_start(20,300);
- }
- uint16_t wanning_2 = *(uint16_t*)(&sts_data.m_data.m_r.r_data.input_wanning.in_wan[INPUT_CHANNEL_2]);
- if(wanning_2 >> 8)
- {
- if(sts_data.m_data.m_rw.rw_data.md_eep.out_status == OUT_OPEN) sts_data.close_output();
- }
- }else
- {
- if(!sts_data.input_beep){
- sts_data.input_beep = 1;
- // sts_data.beep_count =sts_data.lost_count;
- // sts_data.beep_flag = 1;
- beep_timer_start(20,300);
- }
- }
- channel = 0;
- }
- vTaskDelay(100);
- }
- vTaskDelete(Task1Task_Handler);
- }
- void task_10ms(void *pvParameters)
- {
- sts_data.addr = ReadKeyValue();
- sts_data.baund = 9600;
- Fwdgt_Init();
- eMBInit(MB_RTU,sts_data.addr,0,sts_data.baund,MB_PAR_NONE);
-
- while(1)
- {
- Fwdgt_reload();
- if(eMBCheck())
- {
- eMBInit(MB_RTU, sts_data.addr, 0, sts_data.baund, MB_PAR_NONE);
- eMBEnable();
- vTaskDelay(10);
- }
- eMBPoll();
- // if(sts_data.beep_flag == 0)
- // {
- // if(sts_data.i_beep_flag[0].beep_waning || sts_data.i_beep_flag[1].beep_waning || sts_data.o_beep_flag.beep_waning)
- // {
- // sts_data.beep_count = sts_data.wanning_count;
- // }else if(sts_data.chiose_flag)
- // {
- // }
- // else
- // {
- // sts_data.clear_beep();
- // }
- // }
- // if(sts_data.i_beep_flag[0].beep_waning && sts_data.i_beep_flag[1].beep_waning && sts_data.o_beep_flag.beep_waning)
- // {
- // if(sts_data.beep_flag == 1)
- // {
- // sts_data.beep_count = sts_data.lost_count;
- // }else if(sts_data.chiose_flag)
- // {
- // }
- // else
- // {
- // sts_data.clear_beep();
- // }
- // }
- if(sts_data.m_data.m_r.r_data.temprature_flag == TEMP_ONLINE)
- {
- if(sts_data.m_data.m_rw.rw_data.md_eep.temp_th.max_temp != 0 && sts_data.m_data.m_rw.rw_data.md_eep.temp_th.max_temp != 0)
- {
- if(sts_data.m_data.m_rw.rw_data.md_eep.temp_th.max_temp > sts_data.m_data.m_rw.rw_data.md_eep.temp_th.max_temp)
- {
- if((int16_t)(sts_data.m_data.m_r.r_data.temprature) >= sts_data.m_data.m_rw.rw_data.md_eep.temp_th.max_temp)
- {
- if(sts_data.m_data.m_r.r_data.fans_status != FANS_ON)
- {
- sts_data.fans(FANS_ON);
- }
- }else if((int16_t)(sts_data.m_data.m_r.r_data.temprature) <= sts_data.m_data.m_rw.rw_data.md_eep.temp_th.min_temp)
- {
- if(sts_data.m_data.m_r.r_data.fans_status != FANS_OFF)
- {
- sts_data.fans(FANS_OFF);
- }
- }
- }
- }
- }
- show_wanning_led();
- vTaskDelay(10);
- }
- vTaskDelete(Task2Task_Handler);
- }
- void task_1s(void *pvParameters)
- {
- static uint8_t eep_count = 0;
- static uint8_t delay_count = 0;
- while(1)
- {
- if(sts_data.chiose_flag == 1 || sts_data.chiose_flag == 2)
- {
- delay_count++;
- if(delay_count == 3)
- {
- delay_count = 0;
- if(sts_data.chiose_flag == 1)
- sts_data.choise_input(INPUT_CHANNEL_1);
- else
- sts_data.choise_input(INPUT_CHANNEL_2);
- sts_data.chiose_flag = 0;
- }
- }
- eep_count ++;
- if(eep_count >= 10)
- {
- eep_count = 0;
- if(sts_data.kwh.row >= MAX_ROW)
- {
- sts_data.kwh.row = 0;
- }
- iic_consumer_data_t chache = {0};
- if(sts_data.kwh.index >= UINT64_MAX)
- {
- for(int i = 0 ; i < MAX_ROW;i++){
- sts_data.write_eeprom_page(IIC_CONSUMER_START+(IIC_CONSUMER_PAGE*i),&chache,sizeof(iic_consumer_data_t));
- }
- sts_data.kwh.row = 0;
- }
- chache.iic_consumer = sts_data.iic_consumer;
- chache.recode_index1 = sts_data.kwh.index;;
- sts_data.write_eeprom_page(IIC_CONSUMER_START+(IIC_CONSUMER_PAGE*sts_data.kwh.row),&chache,sizeof(iic_consumer_data_t));
- sts_data.kwh.index++;
- sts_data.kwh.row++;
- }
- LEDFlicker2();
- vTaskDelay(1000);
- }
- vTaskDelete(Task2Task_Handler);
- }
- void lcd_task(void *pvParameters)
- {
- menu_init();
- int menu = 0;
- int count =0;
- while(1)
- {
- if(count == 6)
- {
- menu++;
- count = 0;
- lcd_fill(COLOR_BLACK);
- }
- if(menu == MENU_MAX )
- {
- menu = 0;
- }
- menu_handle(menu);
- count++;
- vTaskDelay(500);
- }
- }
- void start_task(void *pvParameters)
- {
- taskENTER_CRITICAL();
- xTaskCreate((TaskFunction_t )task_100ms,
- (const char* )"task1",
- (uint16_t )TASK1_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )configMAX_PRIORITIES-1,
- (TaskHandle_t* )&Task1Task_Handler);
- xTaskCreate((TaskFunction_t )task_10ms,
- (const char* )"task2",
- (uint16_t )TASK2_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )TASK2_PRIO,
- (TaskHandle_t* )&Task2Task_Handler);
- #if 0
- xTaskCreate((TaskFunction_t )lcd_task,
- (const char* )"task3",
- (uint16_t )TASK3_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )TASK3_PRIO,
- (TaskHandle_t* )&Task3Task_Handler);
- #endif
- xTaskCreate((TaskFunction_t )task_1s,
- (const char* )"task4",
- (uint16_t )TASK4_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )TASK4_PRIO,
- (TaskHandle_t* )&Task4Task_Handler);
- vTaskDelete(StartTask_Handler);
- taskEXIT_CRITICAL();
- }
- int main()
- {
- systick_config();
- InitKey();
- InitLED();
- InitTimer();
- InitRelay();
- fans_init();
- beep_init();
- eeprom_init();
- electricity_init();
- sts_exti_init();
-
- strcpy(sts_data.m_data.m_r.r_data.info.date,__DATE__);
- strcat(sts_data.m_data.m_r.r_data.info.date," ");
- strcat(sts_data.m_data.m_r.r_data.info.date,__TIME__);
- strcpy(sts_data.m_data.m_r.r_data.info.ver,VERSION);
- sts_data.m_data.m_r.r_data.dev |= (STS_TYPE << 8);
- sts_data.m_data.m_r.r_data.dev |= (2 << 6);
- sts_data.m_data.m_r.r_data.dev |= 1;
- sts_data.m_data.m_r.r_data.info.channels = 1;
- sts_data.m_data.m_r.r_data.info.uniq_ID_64_95 = *(uint32_t*)(UNIQU_3);
- sts_data.m_data.m_r.r_data.info.uniq_ID_32_63 = *(uint32_t*)(UNIQU_2);
- sts_data.m_data.m_r.r_data.info.uniq_ID_00_31 = *(uint32_t*)(UNIQU_1);
-
- sts_data.read_switch_level();
- sts_data.lost_count = LOST_COUNT;
- sts_data.wanning_count = WANNING_COUNT;
-
- timer1_handle = xTimerCreate( "timer1",
- 1000,
- pdTRUE,
- (void *)1,
- timer1_callback );
-
- //xTimerStart(timer1_handle,portMAX_DELAY);
- xTaskCreate((TaskFunction_t )start_task,
- (const char* )"start_task",
- (uint16_t )START_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )START_TASK_PRIO,
- (TaskHandle_t* )&StartTask_Handler);
- vTaskStartScheduler();
- while(1)
- {
-
- }
- return 0;
- }
|