123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985 |
- /*******************************************************************************
- *
- * sw
- * Soft version: switch_v1.0
- * File Name: main.c
- * Author : zzw (zhangzw_3@163.com)
- * creation date: 2023-01-20
- * module description:
- * Copyright (C) reserve
- *
- *
- ********************************************************************************/
- #include <REGtenxTM52F1386.h>
- #include "TM52F1386_bsp.h"
- #include <intrins.h>
- #include "GLOBAL.h"
- #include "time2.h"
- #include "sTimeout.h"
- #include "uart.h"
- #include "gpio_ctrl.h"
- #include "zigbee.h"
- #include "EEPROM.h"
- #define NETWORK_CONFIGURE_TRIGGER_TIME 500 // 长按统计,10ms为单位,设置5秒
- void relay_ctl(void); // 普通继电器控制
- void WDGT_Init(void); // 看门口初始化
- void WDGT_Feed(void); // 喂狗
- static byte bKey;
- static byte bKeyl;
- static word wKeyTime;
- static byte readkey;
- static byte readkey1;
- /**********************************************************************************************************
- **函数名称 :button1LongPressCheck()
- **函数描述 :长按键扫描处理任务,10ms调用
- **输 入 :None
- **输 出 :None
- **********************************************************************************************************/
- void button1LongPressCheck(void)
- {
- /*if (KEY1_READ() == 0) // 按键1被按下
- {
- if (switchState.KeyPress == 0)
- { // 原来没按下
- switchState.KeyPress = 1; // 更新按键状态为按下
- switchState.buttonPressTime = 0; // 按下计数器清理
- }
- else // 长按统计
- { // 长按5s 触发入网启动
- if (switchState.buttonPressTime >= NETWORK_CONFIGURE_TRIGGER_TIME) // 长按超过5s
- {
- if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
- {
- ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
- ZG_JoinCounter = 0;
- switchState.buttonPressTime = 0;
- ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- // switchState.KeyPress = 0; // 按键释放
- if (ZG_Joining == CONDITION_BEFOR_JOINING_TO_JOINING) // 入网倒计时180秒内再次长按退出配网
- {
- ZG_JoinCounter = 18000; //
- switchState.buttonPressTime = 0;
- }
- }
- }
- }
- else
- {
- switchState.KeyPress = 0; // 按键释放
- }*/
- }
- /**********************************************************************************************************
- **函数名称 :Scankey()
- **函数描述 :键盘扫描,10ms调用
- **输 入 :None
- **输 出 :None
- **********************************************************************************************************/
- void Scankey(void)
- {
- char i = 0;
- ScanKeyn(); // 按键值扫码任务
- bKey = GetKey(&wKeyTime); // 读取键值与长按时间
- if (bKey != NO_KEY_MSG)
- {
- if ((bKey & LONG_KEY_MASK) == LONG_KEY_MASK) // 长按键处理
- {
- bKeyl = bKey & SHORT_KEY_MASK;
- switch (bKeyl)
- {
- case KEY1: // 长按1号键
- if (wKeyTime >= 5000) // 5S
- {
- if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
- {
- ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
- ZG_JoinCounter = 0;
- ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- }
- break;
- case KEY2: // 长按1号键
- if (wKeyTime >= 5000) // 5S
- {
- if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
- {
- ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
- ZG_JoinCounter = 0;
- ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- }
- break;
- case KEY3: // 长按1号键
- if (wKeyTime >= 5000) // 5S
- {
- if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
- {
- ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
- ZG_JoinCounter = 0;
- ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- }
- break;
- case KEY4: // 长按1号键
- if (wKeyTime >= 5000) // 5S
- {
- if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
- {
- ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
- ZG_JoinCounter = 0;
- ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- }
- break;
- case KEY5: // 长按1号键
- if (wKeyTime >= 5000) // 5S
- {
- if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
- {
- ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
- ZG_JoinCounter = 0;
- ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- }
- break;
- case KEY6: // 长按1号键
- if (wKeyTime >= 5000) // 5S
- {
- if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
- {
- ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
- ZG_JoinCounter = 0;
- ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- }
- break;
- default:
- break;
- }
- }
- else // 短按键
- {
- switch (bKey & SHORT_KEY_MASK) // 短按键处理
- {
- case KEY1:
- if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
- {
- // mcu_join_zigbee(); // 设备入网函数
- ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
- ZG_JoinCounter = 0;
- ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- else
- {
- // switchState.KeyIn[0] = 0x01; // 按键被按下
- switchState.step[0] = 0x02; // 按键触发背光灯状态
- if (switchState.mod[0] == 0x01) // 场景开关
- {
- #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
- mcu_dp_enum_update(DPID_SCENE_1, 0); // 上报场景值
- #endif
- }
- else
- {
- if ((gLedState & 0x01) == 0x00) // 原状态灯灭
- {
- gLedState = gLedState | 0x01; // 按键1开启
- gRelayOnOff |= 0x01; // 继电器动作开启
- if (switchState.plus_mod[0] == 0x01) // 点动开启
- {
- switchState.plus_en[0] = 0x01;
- switchState.plus_counter[0] = switchState.plus_auto_time[0];
- // write_mileage[0] = switchState.plus_en;
- // iap_eeprom_write(14, write_mileage, 1); // 写入1字节
- iap_eeprom_read(0, write_mileage, 30); // 读取30字节
- write_mileage[14] = switchState.plus_en[0];
- iap_eeprom_write(0, write_mileage, 30); // 写入1字节
- }
- }
- else if ((gLedState & 0x01) == 0x01) // 原状态灯亮
- {
- gLedState = gLedState & (~0x01); // 按键1清除
- gRelayOnOff &= (~0x01); // 继电器关闭
- }
- }
- }
- break;
- case KEY2:
- if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
- {
- // mcu_join_zigbee(); // 设备入网函数
- ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
- ZG_JoinCounter = 0;
- ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- else
- {
- // switchState.KeyIn[1] = 0x01; // 按键被按下
- switchState.step[1] = 0x02; // 按键触发背光灯状态
- if (switchState.mod[1] == 0x01)
- {
- #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
- mcu_dp_enum_update(DPID_SCENE_2, 0);
- #endif
- }
- else
- {
- if ((gLedState & 0x02) == 0x00) // 原状态灯灭
- {
- gLedState = gLedState | 0x02; // // 按键2开启
- gRelayOnOff |= 0x02; // 继电器动作开启
- if (switchState.plus_mod[1] == 0x01) // 点动开启
- {
- switchState.plus_en[1] = 0x01;
- switchState.plus_counter[1] = switchState.plus_auto_time[1];
- // write_mileage[1] = switchState.plus_en;
- // iap_eeprom_write(15, write_mileage, 1); // 写入1字节
- iap_eeprom_read(0, write_mileage, 30); // 读取30字节
- write_mileage[15] = switchState.plus_en[1];
- iap_eeprom_write(0, write_mileage, 30); // 写入1字节
- }
- }
- else if ((gLedState & 0x02) == 0x02) // 原状态灯亮
- {
- gLedState = gLedState & (~0x02); // 按键2清除
- gRelayOnOff &= (~0x02); // 继电器关闭
- }
- }
- }
- break;
- case KEY3:
- if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
- {
- // mcu_join_zigbee(); // 设备入网函数
- ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
- ZG_JoinCounter = 0;
- ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- else
- {
- // switchState.KeyIn[2] = 0x01; // 按键被按下
- switchState.step[2] = 0x02; // 按键触发背光灯状态
- if (switchState.mod[2] == 0x01)
- {
- #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
- mcu_dp_enum_update(DPID_SCENE_3, 0);
- #endif
- }
- else
- {
- if ((gLedState & 0x04) == 0x00) // 原状态灯灭
- {
- gLedState = gLedState | 0x04; // // 按键3开启
- gRelayOnOff |= 0x04; // 继电器动作开启
- if (switchState.plus_mod[2] == 0x01) // 点动开启
- {
- switchState.plus_en[2] = 0x01;
- switchState.plus_counter[2] = switchState.plus_auto_time[2];
- // write_mileage[2] = switchState.plus_en;
- // iap_eeprom_write(16, write_mileage, 1); // 写入1字节
- iap_eeprom_read(0, write_mileage, 30); // 读取30字节
- write_mileage[16] = switchState.plus_en[2];
- iap_eeprom_write(0, write_mileage, 30); // 写入1字节
- }
- }
- else if ((gLedState & 0x04) == 0x04) // 原状态灯亮
- {
- gLedState = gLedState & (~0x04); // // 按键3清除
- gRelayOnOff &= (~0x04); // 继电器关闭
- }
- }
- }
- break;
- case KEY4:
- if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
- {
- // mcu_join_zigbee(); // 设备入网函数
- ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
- ZG_JoinCounter = 0;
- ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- else
- {
- // switchState.KeyIn[3] = 0x01; // 按键被按下
- switchState.step[3] = 0x02; // 按键触发背光灯状态
- #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
- mcu_dp_enum_update(DPID_SCENE_4, 0);
- #endif
- }
- break;
- case KEY5:
- if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
- {
- // mcu_join_zigbee(); // 设备入网函数
- ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
- ZG_JoinCounter = 0;
- ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- else
- {
- // switchState.KeyIn[4] = 0x01; // 按键被按下
- switchState.step[4] = 0x02; // 按键触发背光灯状态
- #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
- mcu_dp_enum_update(DPID_SCENE_5, 0);
- #endif
- }
- break;
- case KEY6:
- if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
- {
- // mcu_join_zigbee(); // 设备入网函数
- ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
- ZG_JoinCounter = 0;
- ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
- }
- else
- {
- // switchState.KeyIn[5] = 0x01; // 按键被按下
- switchState.step[5] = 0x02; // 按键触发背光灯状态
- #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
- mcu_dp_enum_update(DPID_SCENE_6, 0);
- #endif
- }
- break;
- default:
- break;
- }
- }
- }
- }
- /*******************************************************************************
- Function: sysInit()
- Description: system initialize entry
- Calls:
- Called By: no
- Input: no
- Output: no
- Return: no
- Others: no
- ********************************************************************************/
- void sysInit(void)
- {
- bsp_clock_init(); // 系统快时钟 18.432 div 2 = 9.216Mhz
- gpio_light_init(); // LED初始化
- pwm0_init(); // pwm0
- pwm1_init(); // pwm1
- pwm2_init(); // pwm2
- pwm3_init(); // PWM3
- gpio_key_init(); // 按键IO口初始化
- gpio_control_init(); // 雷达感应,继电器初始化
- tim2_init(); // 1ms定时器,定时器2
- uart0_timer1_init(); // Uart1(9600),采用time1定时器
- zigbee_protocol_init(); // zigbee初始化
- }
- /*******************************************************************************
- Function: taskInit()
- Description: system Parameter Initialization
- Calls:
- Called By: no
- Input: no
- Output: no
- Return: no
- Others: no
- ********************************************************************************/
- void taskInit(void)
- {
- u08 i = 0;
- sys10msFlag = 0; /* 10ms*/
- // sTimeout(&SystemTimer, 0);
- // 全局初始化参数
- switchState.human = 0; // 默认关闭雷达,按键背光常亮
- for (i = 0; i < 3; i++)
- {
- switchState.step[i] = 0x01;
- switchState.relay_status[i] = 0x00;
- switchState.relay_new_status[i] = 0x00;
- switchState.mod[i] = 0x00; // 默认3路开关,//0:开关,1:场景
- switchState.plus_en[i] = 0x00; // 默认无点动触发
- switchState.plus_mod[i] = 0x00; // 默认未设置点动开关,测试点动开启
- }
- // switchState.relay_status[0] = 0x00;//测试继电器断电保存状态,默认关
- // switchState.relay_status[1] = 0x01;//测试继电器断电保存状态,默认开
- // switchState.relay_status[2] = 0x02;//测试继电器断电保存状态,默认与开机前一致
- switchState.step[3] = 0x01;
- switchState.step[4] = 0x01;
- switchState.step[5] = 0x01;
- switchState.led_level = PWMLEVEL1; // 默认最低亮度
- // switchState.gRadarCheckNull = 0; // 默认雷达有人,按键背光亮起
- // 全局初始化参数
- appControlLedEnable = 1; // 默认APP控制继电器动作联动背光亮10秒
- ZG_Joining = CONDITION_JOINGING_TO_NORMAL; // ZIGBEE正常模式状态
- switchState.zigbee_work_state = 0; // 默认ZIGBEE脱网运行
- EA = 1; // 总中断允许
- ledSetParam(0, 0); // 背光不闪
- pwm_set_prd(255); // PWM 周期设定
- /*
- 参数数据(10):0-9:人感1字节-0,开机状态(通电勿扰)全局设置1字节-1,三个继电器开机状态3个字节-2-3-4,背光等级1个字节-5
- 实时数据(6):10:19:当前继电器状态3个字节-10-11-12,雷达状态1字节-13,点动倒计时未结束1个字节-14-15-16,ota状态1字节-19(最后一字节)
- 点动开关参数(9):,电动开关3个字节(使能1,时间2)-20-21-22,-23-24-25,-26-27-28
- */
- iap_eeprom_read(0, read_mileage, 30); // 读取30字节,状态参数
- iap_eeprom_read_backup(0, read_mileage_backup, 30); // 读取30字节,配置参数
- /***************配置参数******************************/
- /*通电反应 通电勿扰开启 通过app操作使开关关闭的情况下,设备重新上电,设备处于关闭状态关闭 断电记忆 恢复到断电前使用的状态
- 开关上电状态设置 枚举范围:off,on,memory
- 通电勿扰开启 = off==0,关闭=memory==2,1:强制开机
- */
- if (read_mileage_backup[1] != 0xff)
- switchState.relay_allstatus = read_mileage_backup[1]; // 开关上电状态设置,全局
- if (read_mileage_backup[2] != 0xff)
- switchState.relay_status[0] = read_mileage_backup[2]; // 开关上电状态设置,1-3键
- if (read_mileage_backup[3] != 0xff)
- switchState.relay_status[1] = read_mileage_backup[3];
- if (read_mileage_backup[4] != 0xff)
- switchState.relay_status[2] = read_mileage_backup[4];
- if (read_mileage_backup[5] != 0xff)
- switchState.led_level = read_mileage_backup[5]; // 指示灯亮度
- if (read_mileage_backup[6] != 0xff)
- switchState.mod[0] = read_mileage_backup[6]; //// 开关、场景设置
- if (read_mileage_backup[7] != 0xff)
- switchState.mod[1] = read_mileage_backup[7]; //// 开关、场景设置
- if (read_mileage_backup[8] != 0xff)
- switchState.mod[2] = read_mileage_backup[8]; //// 开关、场景设置
- if (read_mileage_backup[9] != 0xff) //
- {
- switchState.human = read_mileage_backup[9]; // 人感使能开关
- }
- if (read_mileage_backup[20] != 0xff)
- switchState.plus_mod[0] = read_mileage_backup[20]; // 点动开关被配置
- if (read_mileage_backup[23] != 0xff)
- switchState.plus_mod[1] = read_mileage_backup[23]; // 点动开关被配置
- if (read_mileage_backup[26] != 0xff)
- switchState.plus_mod[2] = read_mileage_backup[26]; // 点动开关被配置
- /***************配置参数******************************/
- /***************关机前实时状态数据******************************/
- if (read_mileage[10] != 0xff)
- switchState.relay_new_status[0] = read_mileage[10]; // 关机前最新继电器状态,1-3键
- if (read_mileage[11] != 0xff)
- switchState.relay_new_status[1] = read_mileage[11];
- if (read_mileage[12] != 0xff)
- switchState.relay_new_status[2] = read_mileage[12];
- // 取消断电前的人感状态读取
- /*if (read_mileage[13] != 0xff)
- switchState.gRadarCheckNull = read_mileage[13]; // 断电前人感状态,1为无人*/
- if (read_mileage[14] != 0xff)
- switchState.plus_en[0] = read_mileage[14]; // 断电前点动开关未结束
- if (read_mileage[15] != 0xff)
- switchState.plus_en[1] = read_mileage[15]; // 断电前点动开关未结束
- if (read_mileage[16] != 0xff)
- switchState.plus_en[2] = read_mileage[16]; // 断电前点动开关未结束
- /***************关机前实时状态数据******************************/
- if (switchState.plus_mod[0] == 0x01) // 1号通道被设置点动开关
- {
- if (read_mileage_backup[21] != 0xff)
- {
- switchState.plus_auto_time[0] = (read_mileage_backup[21] * 256 + read_mileage_backup[22]) * 10; // 高字节在前,秒转100ms为基数
- }
- else
- {
- switchState.plus_auto_time[0] = 50; // 默认5S,可控制门禁
- }
- if (switchState.plus_en[0])
- {
- switchState.plus_counter[0] = switchState.plus_auto_time[0];
- gLedState = gLedState | 0x01; // 按键1开启
- gRelayOnOff |= 0x01; // 继电器动作开启
- }
- }
- else // 非点动,按照上电配置状态控制逻辑
- {
- if (switchState.mod[0] == 0x00) // 设置为开关时有效
- {
- // key1
- if (switchState.relay_status[0] == 0x00) // 断电
- {
- gLedState = gLedState & (~0x01); // 按键1清除
- gRelayOnOff &= (~0x01); // 继电器关闭
- gRelayState |= 0x01;
- }
- else if (switchState.relay_status[0] == 0x01) // 通电
- {
- gLedState = gLedState | 0x01; // 按键1开启
- gRelayOnOff |= 0x01; // 继电器动作开启
- }
- else // 断电记忆
- {
- if (switchState.relay_new_status[0] == 0x01)
- {
- gLedState = gLedState | 0x01; // 按键1开启
- gRelayOnOff |= 0x01; // 继电器动作开启
- }
- else
- {
- gLedState = gLedState & (~0x01); // 按键1清除
- gRelayOnOff &= (~0x01); // 继电器关闭
- gRelayState |= 0x01;
- }
- }
- }
- }
- if (switchState.plus_mod[1] == 0x01) // 2号通道被设置点动开关
- {
- if (read_mileage_backup[24] != 0xff)
- {
- switchState.plus_auto_time[1] = (read_mileage_backup[24] * 256 + read_mileage_backup[25]) * 10; // 高字节在前,秒转100ms为基数
- }
- else
- {
- switchState.plus_auto_time[1] = 50; // 默认5S,可控制门禁
- }
- if (switchState.plus_en[1])
- {
- switchState.plus_counter[1] = switchState.plus_auto_time[1];
- gLedState = gLedState | 0x02; // // 按键2开启
- gRelayOnOff |= 0x02; // 继电器动作开启
- }
- }
- else // 非点动,按照上电配置状态控制逻辑
- {
- if (switchState.mod[1] == 0x00) // 设置为开关时有效
- {
- // key2
- if (switchState.relay_status[1] == 0x00) // 断电
- {
- gLedState = gLedState & (~0x02); // 按键2清除
- gRelayOnOff &= (~0x02); // 继电器关闭
- gRelayState |= 0x02;
- }
- else if (switchState.relay_status[1] == 0x01) // 通电
- {
- gLedState = gLedState | 0x02; // // 按键2开启
- gRelayOnOff |= 0x02; // 继电器动作开启
- }
- else // 断电记忆
- {
- if (switchState.relay_new_status[1] == 0x01)
- {
- gLedState = gLedState | 0x02; // // 按键2开启
- gRelayOnOff |= 0x02; // 继电器动作开启
- }
- else
- {
- gLedState = gLedState & (~0x02); // 按键2清除
- gRelayOnOff &= (~0x02); // 继电器关闭
- gRelayState |= 0x02;
- }
- }
- }
- }
- if (switchState.plus_mod[2] == 0x01) // 3号通道被设置点动开关
- {
- if (read_mileage_backup[27] != 0xff)
- {
- switchState.plus_auto_time[2] = (read_mileage_backup[27] * 256 + read_mileage_backup[28]) * 10; // 高字节在前,秒转100ms为基数
- }
- else
- {
- switchState.plus_auto_time[2] = 50; // 默认5S,可控制门禁
- }
- if (switchState.plus_en[2])
- {
- switchState.plus_counter[2] = switchState.plus_auto_time[2];
- gLedState = gLedState | 0x04; // // 按键3开启
- gRelayOnOff |= 0x04; // 继电器动作开启
- }
- }
- else // 非点动,按照上电配置状态控制逻辑
- {
- if (switchState.mod[2] == 0x00) // 设置为开关时有效
- {
- // key3
- if (switchState.relay_status[2] == 0x00) // 断电
- {
- gLedState = gLedState & (~0x04); // // 按键3清除
- gRelayOnOff &= (~0x04); // 继电器关闭
- gRelayState |= 0x04;
- }
- else if (switchState.relay_status[2] == 0x01) // 通电
- {
- gLedState = gLedState | 0x04; // // 按键3开启
- gRelayOnOff |= 0x04; // 继电器动作开启
- }
- else // 断电记忆
- {
- if (switchState.relay_new_status[2] == 0x01)
- {
- gLedState = gLedState | 0x04; // // 按键3开启
- gRelayOnOff |= 0x04; // 继电器动作开启
- }
- else
- {
- gLedState = gLedState & (~0x04); // // 按键3清除
- gRelayOnOff &= (~0x04); // 继电器关闭
- gRelayState |= 0x04;
- }
- }
- }
- }
- // 取消断电前人感状态读取及应用
- /*if (switchState.gRadarCheckNull == 1) // 断电前无人
- {
- gRadarCheckNull = 1;
- gRadarKeepTimer = 0; // 雷达无人,按键灯熄灭
- }*/
- if (switchState.human) // 开启雷达的情况下有效
- {
- gRadarCheckNull = 1;
- gRadarKeepTimer = 0; // 雷达无人,按键灯熄灭
- }
- #ifdef REALSE // 生产模式,开启看门狗
- WDGT_Init();
- #endif
- }
- /**********************************************************************************************************
- **函数名称 :main()
- **函数描述 :主函数
- **输 入 :None
- **输 出 :None
- **********************************************************************************************************/
- void main(void)
- {
- sysInit(); // 系统初始化
- taskInit(); // 初始化任务
- while (1)
- {
- zigbee_uart_service(); // zigbee接收处理
- ///// 系统时钟控制
- if (sys10msFlag) // 10ms任务
- {
- sys10msFlag = 0;
- Scankey(); // 按键扫描处理任务
- button1LongPressCheck(); // 长按键处理任务
- relay_plus_ctl(); // 磁保持继电器控制任务
- if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 正常模式下按键灯控制任务
- {
- // 脱网指示灯闪烁
- if (switchState.zigbee_work_state == 0x02) // 脱网报警(离线状态) 慢闪60s 3s一闪烁
- {
- if (--switchState.time)
- {
- ledCtrlProc(); // 脱网闪烁处理
- }
- else
- {
- ledSetParam(0, 0);
- switchState.zigbee_work_state = 0; // 离线工作,指示灯恢复正常
- }
- }
- else
- {
- key_led_pwm_ctl(); // 按键灯PWM控制任务
- }
- }
- /*****************zigbee任务--10ms******************/
- if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) // zigbee配网前准备
- {
- if (++ZG_JoinCounter <= 1000) // 配网前确认闪烁10秒
- {
- ledCtrlProc(); // 按键led控制闪烁
- }
- else
- {
- ZG_Joining = CONDITION_JOINGING_TO_NORMAL; // 超过10秒未确认,从配网前恢复正常状态
- ledSetParam(0, 0);
- }
- }
- else if (ZG_Joining == CONDITION_BEFOR_JOINING_TO_JOINING) // 已进入配网状态
- {
- if (++ZG_JoinCounter <= 18000) // 配网快速闪烁180秒
- {
- ledCtrlProc(); ////按键led控制闪烁
- if (ZG_JoinCounter == 0x05) // 进入配网模式,5秒后发送配网指令
- {
- // if (switchState.zigbee_work_state != 0x01) // 已入网不发送指令
- //{
- mcu_join_zigbee(); // 只要触发入网必须发送入网指令,满足从已入网主机1切换到新主机2的切换
- //}
- }
- else if (ZG_JoinCounter % 900 == 0x00) // 过90秒再次发送一次入网-取消,01配网的逻辑是先离线在入网,不可二次发送
- {
- // mcu_join_zigbee();//每90秒再次发送入网指令
- }
- else
- {
- }
- }
- else
- {
- ZG_Joining = CONDITION_JOINGING_TO_NORMAL; ////超过180秒,从配网前恢复正常状态
- ledSetParam(0, 0);
- }
- }
- else
- {
- ZG_Joining = CONDITION_JOINGING_TO_NORMAL; // 正常状态
- }
- /*****************zigbee任务--10ms******************/
- if (++sysTickfor100ms >= 10) // 100ms
- {
- sysTickfor100ms = 0;
- /**********************10ms喂狗任务************************/
- #ifdef REALSE // 生产模式
- WDGT_Feed(); // 定时喂狗
- #endif
- /**********************10ms喂狗任务************************/
- /*****************人感任务--100ms******************/
- if (switchState.human) // 人感使能
- {
- if (RADAR_READ()) // 读取人感状态,高电平有效
- {
- gRadarCheckNull = 0; // 有人检测到
- gRadarKeepTimer = 100; // 12s//传感器自带2S+软件倒计时10S
- }
- else // 下降沿清空有人标志
- {
- gRadarCheckNull = 1;
- }
- if (gRadarKeepTimer)
- {
- gRadarKeepTimer--;
- // 取消人感状态变化存入eeprom
- /*if (gRadarKeepTimer == 1) // 等于1时,触发存eeprom
- {
- switchState.gRadarCheckNull = 1; // 清空有人标志
- // write_mileage[0] = switchState.gRadarCheckNull;
- // iap_eeprom_write(13, write_mileage, 1); // 写入1字节
- iap_eeprom_read(0, write_mileage, 30); // 读取30字节
- write_mileage[13] = switchState.gRadarCheckNull;
- iap_eeprom_write(0, write_mileage, 30); // 写入1字节
- }
- else if (gRadarKeepTimer == 90) // 等于90时,表示刚触发了有人,存eeprom
- {
- switchState.gRadarCheckNull = 0; // 设置有人标志
- // write_mileage[0] = switchState.gRadarCheckNull;
- // iap_eeprom_write(13, write_mileage, 1); // 写入1字节
- iap_eeprom_read(0, write_mileage, 30); // 读取30字节
- write_mileage[13] = switchState.gRadarCheckNull;
- iap_eeprom_write(0, write_mileage, 30); // 写入1字节
- }
- else
- {
- }*/
- }
- }
- else // 无人感,按键指示灯常亮
- {
- gRadarKeepTimer = 100; // 10s ,无人感设备一致默认有人
- }
- /*****************人感任务--100ms******************/
- /*****************点动开关任务-100ms*******************/
- if ((switchState.plus_en[0] == 0x01) && (switchState.plus_mod[0] == 0x01)) // 点动开关触发
- {
- if (switchState.plus_counter[0] == 0x00)
- {
- gLedState = gLedState & (~0x01); // 按键1清除
- gRelayOnOff &= (~0x01); // 继电器关闭
- // write_mileage[0] = 0;
- // iap_eeprom_write(14, write_mileage, 1); // 写入1字节
- iap_eeprom_read(0, write_mileage, 30); // 读取30字节
- write_mileage[14] = 0;
- iap_eeprom_write(0, write_mileage, 30); // 先读,在写入1字节
- switchState.plus_en[0] = 0;
- }
- switchState.plus_counter[0]--;
- }
- if ((switchState.plus_en[1] == 0x01) && (switchState.plus_mod[1] == 0x01)) // 点动开关触发
- {
- if (switchState.plus_counter[1] == 0x00)
- {
- gLedState = gLedState & (~0x02); // 按键2清除
- gRelayOnOff &= (~0x02); // 继电器关闭
- // write_mileage[0] = 0;
- // iap_eeprom_write(15, write_mileage, 1); // 写入1字节
- iap_eeprom_read(0, write_mileage, 30); // 读取30字节
- write_mileage[15] = 0;
- iap_eeprom_write(0, write_mileage, 30); // 先读,在写入1字节
- switchState.plus_en[1] = 0;
- }
- switchState.plus_counter[1]--;
- }
- if ((switchState.plus_en[2] == 0x01) && (switchState.plus_mod[2] == 0x01)) // 点动开关触发
- {
- if (switchState.plus_counter[2] == 0x00)
- {
- gLedState = gLedState & (~0x04); // // 按键3清除
- gRelayOnOff &= (~0x04); // 继电器关闭
- // write_mileage[0] = 0;
- // iap_eeprom_write(16, write_mileage, 1); // 写入1字节
- iap_eeprom_read(0, write_mileage, 30); // 读取30字节
- write_mileage[16] = 0;
- iap_eeprom_write(0, write_mileage, 30); // 先读,在写入1字节
- switchState.plus_en[2] = 0;
- }
- switchState.plus_counter[2]--;
- }
- /**********************点动开关任务************************/
- if (++sysTickfor1000ms >= 10) // 1s任务
- {
- sysTickfor1000ms = 0;
- }
- }
- }
- }
- }
- /**********************************************************************************************************
- **函数名称 :relay_ctl()
- **函数描述 :继电器控制任务,10ms调用,普通继电器,电平控制
- **输 入 :None
- **输 出 :None
- **********************************************************************************************************/
- void relay_ctl(void)
- {
- /*if (gRelayState != gRelayOnOff)
- {
- //继电器1
- if (gRelayOnOff & 0x01) // 继电器1开启
- {
- relay1_control(1);
- gRelayState |= 0x01;
- mcu_dp_bool_update(DPID_SWITCH_1, 1);
- }
- else if ((gRelayOnOff & 0x01) == 0x00) // 继电器1关闭
- {
- relay1_control(0);
- gRelayState &= (~0x01);
- mcu_dp_bool_update(DPID_SWITCH_1, 0);
- }
- //继电器2
- if (gRelayOnOff & 0x02) // 继电器2开启
- {
- relay2_control(1);
- gRelayState |= 0x02;
- mcu_dp_bool_update(DPID_SWITCH_2, 1);
- }
- else if ((gRelayOnOff & 0x02) == 0x00) // 继电器3关闭
- {
- relay2_control(0);
- gRelayState &= (~0x02);
- mcu_dp_bool_update(DPID_SWITCH_2, 0);
- }
- //继电器3
- if (gRelayOnOff & 0x04) // 继电器3开启
- {
- relay3_control(1);
- gRelayState |= 0x04;
- mcu_dp_bool_update(DPID_SWITCH_3, 1);
- }
- else if ((gRelayOnOff & 0x04) == 0x00) // 继电器3关闭
- {
- relay3_control(0);
- gRelayState &= (~0x04);
- mcu_dp_bool_update(DPID_SWITCH_3, 0);
- }
- }
- // add by zzw all_data_update APP状态同步
- if ((gLedState & 0x01) == 0x01)
- {
- switchState.SWITCH[0] = 1;
- }
- else
- {
- switchState.SWITCH[0] = 0;
- }
- if ((gLedState & 0x02) == 0x02)
- {
- switchState.SWITCH[1] = 1;
- }
- else
- {
- switchState.SWITCH[1] = 0;
- }
- if ((gLedState & 0x04) == 0x04) //
- {
- switchState.SWITCH[2] = 1;
- }
- else
- {
- switchState.SWITCH[2] = 0;
- }*/
- }
- /******************************************************************************************
- ** 函数名称: wdg_init
- ** 函数描述: 看门狗初始化函数
- ** 输入参数: 无
- ** 输出参数: 无
- *******************************************************************************************/
- void WDGT_Init(void)
- {
- SET_REG_BITS(OPTION, WDTPSC, 0); // 240MS
- SET_REG_BITS(AUX2, WDTE, 2); // 看门狗在快钟和慢钟模式下使能,空闲/停止/暂停模式下禁止
- SET_REG_BITS(AUX1, CLRWDT, 0);
- CLR_WDT; // 设置以清除看门狗定时器
- }
- /*******************************************************************************
- Function: WDGT_Feed()
- Description: 喂狗
- Calls:
- Called By: no
- Input: no
- Output: no
- Return: no
- Others: no
- ********************************************************************************/
- void WDGT_Feed(void)
- {
- CLRWDT = 1; // 喂狗
- }
|