main.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032
  1. /*******************************************************************************
  2. *
  3. * sw
  4. * Soft version: switch_v1.0
  5. * File Name: main.c
  6. * Author : zzw (zhangzw_3@163.com)
  7. * creation date: 2023-01-20
  8. * module description:
  9. * Copyright (C) reserve
  10. *
  11. *
  12. ********************************************************************************/
  13. #include <REGtenxTM52F1386.h>
  14. #include "TM52F1386_bsp.h"
  15. #include <intrins.h>
  16. #include "GLOBAL.h"
  17. #include "time2.h"
  18. #include "sTimeout.h"
  19. #include "uart.h"
  20. #include "gpio_ctrl.h"
  21. #include "zigbee.h"
  22. #include "EEPROM.h"
  23. #include "HLW8110.h"
  24. #include "uart2.h"
  25. #define NETWORK_CONFIGURE_TRIGGER_TIME 500 // 长按统计,10ms为单位,设置5秒
  26. void relay_ctl(void); // 普通继电器控制
  27. void WDGT_Init(void); // 看门口初始化
  28. void WDGT_Feed(void); // 喂狗
  29. static byte bKey;
  30. static byte bKeyl;
  31. static word wKeyTime;
  32. static byte readkey;
  33. static byte readkey1;
  34. /**********************************************************************************************************
  35. **函数名称 :button1LongPressCheck()
  36. **函数描述 :长按键扫描处理任务,10ms调用
  37. **输 入 :None
  38. **输 出 :None
  39. **********************************************************************************************************/
  40. void button1LongPressCheck(void)
  41. {
  42. /*if (KEY1_READ() == 0) // 按键1被按下
  43. {
  44. if (switchState.KeyPress == 0)
  45. { // 原来没按下
  46. switchState.KeyPress = 1; // 更新按键状态为按下
  47. switchState.buttonPressTime = 0; // 按下计数器清理
  48. }
  49. else // 长按统计
  50. { // 长按5s 触发入网启动
  51. if (switchState.buttonPressTime >= NETWORK_CONFIGURE_TRIGGER_TIME) // 长按超过5s
  52. {
  53. if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
  54. {
  55. ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
  56. ZG_JoinCounter = 0;
  57. switchState.buttonPressTime = 0;
  58. ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
  59. }
  60. // switchState.KeyPress = 0; // 按键释放
  61. if (ZG_Joining == CONDITION_BEFOR_JOINING_TO_JOINING) // 入网倒计时180秒内再次长按退出配网
  62. {
  63. ZG_JoinCounter = 18000; //
  64. switchState.buttonPressTime = 0;
  65. }
  66. }
  67. }
  68. }
  69. else
  70. {
  71. switchState.KeyPress = 0; // 按键释放
  72. }*/
  73. }
  74. /**********************************************************************************************************
  75. **函数名称 :Scankey()
  76. **函数描述 :键盘扫描,10ms调用
  77. **输 入 :None
  78. **输 出 :None
  79. **********************************************************************************************************/
  80. void Scankey(void)
  81. {
  82. char i = 0;
  83. ScanKeyn(); // 按键值扫码任务
  84. bKey = GetKey(&wKeyTime); // 读取键值与长按时间
  85. if (bKey != NO_KEY_MSG)
  86. {
  87. if ((bKey & LONG_KEY_MASK) == LONG_KEY_MASK) // 长按键处理
  88. {
  89. bKeyl = bKey & SHORT_KEY_MASK;
  90. switch (bKeyl)
  91. {
  92. case KEY1: // 长按1号键
  93. if (wKeyTime >= 5000) // 5S
  94. {
  95. if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
  96. {
  97. ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
  98. ZG_JoinCounter = 0;
  99. ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
  100. }
  101. }
  102. break;
  103. case KEY2: // 长按1号键
  104. if (wKeyTime >= 5000) // 5S
  105. {
  106. if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
  107. {
  108. ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
  109. ZG_JoinCounter = 0;
  110. ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
  111. }
  112. }
  113. break;
  114. case KEY3: // 长按1号键
  115. if (wKeyTime >= 5000) // 5S
  116. {
  117. if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
  118. {
  119. ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
  120. ZG_JoinCounter = 0;
  121. ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
  122. }
  123. }
  124. break;
  125. case KEY4: // 长按1号键
  126. if (wKeyTime >= 5000) // 5S
  127. {
  128. if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
  129. {
  130. ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
  131. ZG_JoinCounter = 0;
  132. ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
  133. }
  134. }
  135. break;
  136. case KEY5: // 长按1号键
  137. if (wKeyTime >= 5000) // 5S
  138. {
  139. if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
  140. {
  141. ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
  142. ZG_JoinCounter = 0;
  143. ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
  144. }
  145. }
  146. break;
  147. case KEY6: // 长按1号键
  148. if (wKeyTime >= 5000) // 5S
  149. {
  150. if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 设备入网状态,长按后触发
  151. {
  152. ZG_Joining = CONDITION_NORMAL_TO_BEFOR_JOINING; // 配网前状态,待短按确认
  153. ZG_JoinCounter = 0;
  154. ledSetParam(50, 100); // 1S一次,所有指示灯1Hz闪烁(表现为三位开关三个指示灯都闪烁)
  155. }
  156. }
  157. break;
  158. default:
  159. break;
  160. }
  161. }
  162. else // 短按键
  163. {
  164. switch (bKey & SHORT_KEY_MASK) // 短按键处理
  165. {
  166. case KEY1:
  167. if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
  168. {
  169. // mcu_join_zigbee(); // 设备入网函数
  170. ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
  171. ZG_JoinCounter = 0;
  172. ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
  173. }
  174. else
  175. {
  176. // switchState.KeyIn[0] = 0x01; // 按键被按下
  177. switchState.step[0] = 0x02; // 按键触发背光灯状态
  178. if (switchState.mod[0] == 0x01) // 场景开关
  179. {
  180. #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
  181. mcu_dp_enum_update(DPID_SCENE_1, 0); // 上报场景值
  182. #endif
  183. }
  184. else
  185. {
  186. if ((gLedState & 0x01) == 0x00) // 原状态灯灭
  187. {
  188. gLedState = gLedState | 0x01; // 按键1开启
  189. gRelayOnOff |= 0x01; // 继电器动作开启
  190. if (switchState.plus_mod[0] == 0x01) // 点动开启
  191. {
  192. switchState.plus_en[0] = 0x01;
  193. switchState.plus_counter[0] = switchState.plus_auto_time[0];
  194. // write_mileage[0] = switchState.plus_en;
  195. // iap_eeprom_write(14, write_mileage, 1); // 写入1字节
  196. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  197. write_mileage[14] = switchState.plus_en[0];
  198. iap_eeprom_write(0, write_mileage, 30); // 写入1字节
  199. }
  200. }
  201. else if ((gLedState & 0x01) == 0x01) // 原状态灯亮
  202. {
  203. gLedState = gLedState & (~0x01); // 按键1清除
  204. gRelayOnOff &= (~0x01); // 继电器关闭
  205. }
  206. }
  207. }
  208. break;
  209. case KEY2:
  210. if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
  211. {
  212. // mcu_join_zigbee(); // 设备入网函数
  213. ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
  214. ZG_JoinCounter = 0;
  215. ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
  216. }
  217. else
  218. {
  219. // switchState.KeyIn[1] = 0x01; // 按键被按下
  220. switchState.step[1] = 0x02; // 按键触发背光灯状态
  221. if (switchState.mod[1] == 0x01)
  222. {
  223. #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
  224. mcu_dp_enum_update(DPID_SCENE_2, 0);
  225. #endif
  226. }
  227. else
  228. {
  229. if ((gLedState & 0x02) == 0x00) // 原状态灯灭
  230. {
  231. gLedState = gLedState | 0x02; // // 按键2开启
  232. gRelayOnOff |= 0x02; // 继电器动作开启
  233. if (switchState.plus_mod[1] == 0x01) // 点动开启
  234. {
  235. switchState.plus_en[1] = 0x01;
  236. switchState.plus_counter[1] = switchState.plus_auto_time[1];
  237. // write_mileage[1] = switchState.plus_en;
  238. // iap_eeprom_write(15, write_mileage, 1); // 写入1字节
  239. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  240. write_mileage[15] = switchState.plus_en[1];
  241. iap_eeprom_write(0, write_mileage, 30); // 写入1字节
  242. }
  243. }
  244. else if ((gLedState & 0x02) == 0x02) // 原状态灯亮
  245. {
  246. gLedState = gLedState & (~0x02); // 按键2清除
  247. gRelayOnOff &= (~0x02); // 继电器关闭
  248. }
  249. }
  250. }
  251. break;
  252. case KEY3:
  253. if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
  254. {
  255. // mcu_join_zigbee(); // 设备入网函数
  256. ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
  257. ZG_JoinCounter = 0;
  258. ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
  259. }
  260. else
  261. {
  262. // switchState.KeyIn[2] = 0x01; // 按键被按下
  263. switchState.step[2] = 0x02; // 按键触发背光灯状态
  264. if (switchState.mod[2] == 0x01)
  265. {
  266. #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
  267. mcu_dp_enum_update(DPID_SCENE_3, 0);
  268. #endif
  269. }
  270. else
  271. {
  272. if ((gLedState & 0x04) == 0x00) // 原状态灯灭
  273. {
  274. gLedState = gLedState | 0x04; // // 按键3开启
  275. gRelayOnOff |= 0x04; // 继电器动作开启
  276. if (switchState.plus_mod[2] == 0x01) // 点动开启
  277. {
  278. switchState.plus_en[2] = 0x01;
  279. switchState.plus_counter[2] = switchState.plus_auto_time[2];
  280. // write_mileage[2] = switchState.plus_en;
  281. // iap_eeprom_write(16, write_mileage, 1); // 写入1字节
  282. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  283. write_mileage[16] = switchState.plus_en[2];
  284. iap_eeprom_write(0, write_mileage, 30); // 写入1字节
  285. }
  286. }
  287. else if ((gLedState & 0x04) == 0x04) // 原状态灯亮
  288. {
  289. gLedState = gLedState & (~0x04); // // 按键3清除
  290. gRelayOnOff &= (~0x04); // 继电器关闭
  291. }
  292. }
  293. }
  294. break;
  295. case KEY4:
  296. if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
  297. {
  298. // mcu_join_zigbee(); // 设备入网函数
  299. ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
  300. ZG_JoinCounter = 0;
  301. ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
  302. }
  303. else
  304. {
  305. // switchState.KeyIn[3] = 0x01; // 按键被按下
  306. switchState.step[3] = 0x02; // 按键触发背光灯状态
  307. #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
  308. mcu_dp_enum_update(DPID_SCENE_4, 0);
  309. #endif
  310. }
  311. break;
  312. case KEY5:
  313. if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
  314. {
  315. // mcu_join_zigbee(); // 设备入网函数
  316. ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
  317. ZG_JoinCounter = 0;
  318. ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
  319. }
  320. else
  321. {
  322. // switchState.KeyIn[4] = 0x01; // 按键被按下
  323. switchState.step[4] = 0x02; // 按键触发背光灯状态
  324. #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
  325. mcu_dp_enum_update(DPID_SCENE_5, 0);
  326. #endif
  327. }
  328. break;
  329. case KEY6:
  330. if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) //&& (switchState.KeyPress == 0)) // 长按触发了配网,需在10秒操作
  331. {
  332. // mcu_join_zigbee(); // 设备入网函数
  333. ZG_Joining = CONDITION_BEFOR_JOINING_TO_JOINING; // 配网倒计时
  334. ZG_JoinCounter = 0;
  335. ledSetParam(6, 12); // 高速闪烁,所有指示灯8Hz闪烁(表现为三位开关三个指示灯都闪烁)
  336. }
  337. else
  338. {
  339. // switchState.KeyIn[5] = 0x01; // 按键被按下
  340. switchState.step[5] = 0x02; // 按键触发背光灯状态
  341. #ifdef ZIGBEE_ZTU_T6_SCENCE_SW
  342. mcu_dp_enum_update(DPID_SCENE_6, 0);
  343. #endif
  344. }
  345. break;
  346. default:
  347. break;
  348. }
  349. }
  350. }
  351. }
  352. /*******************************************************************************
  353. Function: sysInit()
  354. Description: system initialize entry
  355. Calls:
  356. Called By: no
  357. Input: no
  358. Output: no
  359. Return: no
  360. Others: no
  361. ********************************************************************************/
  362. void sysInit(void)
  363. {
  364. bsp_clock_init(); // 系统快时钟 18.432 div 2 = 9.216Mhz
  365. gpio_light_init(); // LED初始化
  366. pwm0_init(); // pwm0
  367. pwm1_init(); // pwm1
  368. pwm2_init(); // pwm2
  369. pwm3_init(); // PWM3
  370. gpio_key_init(); // 按键IO口初始化
  371. gpio_control_init(); // 雷达感应,继电器初始化
  372. tim2_init(); // 1ms定时器,定时器2
  373. uart0_timer1_init(); // Uart1(9600),采用time1定时器
  374. zigbee_protocol_init(); // zigbee初始化
  375. uart2_gpio_init();
  376. uart2_init();
  377. }
  378. /*******************************************************************************
  379. Function: taskInit()
  380. Description: system Parameter Initialization
  381. Calls:
  382. Called By: no
  383. Input: no
  384. Output: no
  385. Return: no
  386. Others: no
  387. ********************************************************************************/
  388. void taskInit(void)
  389. {
  390. u08 i = 0;
  391. sys10msFlag = 0; /* 10ms*/
  392. // sTimeout(&SystemTimer, 0);
  393. // 全局初始化参数
  394. switchState.human = 0; // 默认关闭雷达,按键背光常亮
  395. for (i = 0; i < 3; i++)
  396. {
  397. switchState.step[i] = 0x01;
  398. switchState.relay_status[i] = 0x00;
  399. switchState.relay_new_status[i] = 0x00;
  400. switchState.mod[i] = 0x00; // 默认3路开关,//0:开关,1:场景
  401. switchState.plus_en[i] = 0x00; // 默认无点动触发
  402. switchState.plus_mod[i] = 0xff; // 默认未设置点动开关,测试点动开启
  403. switchState.plus_auto_time[i] = 0xffff; // 默认ffff
  404. }
  405. // switchState.relay_status[0] = 0x00;//测试继电器断电保存状态,默认关
  406. // switchState.relay_status[1] = 0x01;//测试继电器断电保存状态,默认开
  407. // switchState.relay_status[2] = 0x02;//测试继电器断电保存状态,默认与开机前一致
  408. switchState.step[3] = 0x01;
  409. switchState.step[4] = 0x01;
  410. switchState.step[5] = 0x01;
  411. switchState.led_level = PWMLEVEL1; // 默认最低亮度
  412. // switchState.gRadarCheckNull = 0; // 默认雷达有人,按键背光亮起
  413. // 全局初始化参数
  414. appControlLedEnable = 1; // 默认APP控制继电器动作联动背光亮10秒
  415. ZG_Joining = CONDITION_JOINGING_TO_NORMAL; // ZIGBEE正常模式状态
  416. switchState.zigbee_work_state = 0; // 默认ZIGBEE脱网运行
  417. EA = 1; // 总中断允许
  418. ledSetParam(0, 0); // 背光不闪
  419. pwm_set_prd(255); // PWM 周期设定
  420. /*
  421. 参数数据(10):0-9:人感1字节-0,开机状态(通电勿扰)全局设置1字节-1,三个继电器开机状态3个字节-2-3-4,背光等级1个字节-5
  422. 实时数据(6):10:19:当前继电器状态3个字节-10-11-12,雷达状态1字节-13,点动倒计时未结束1个字节-14-15-16,ota状态1字节-19(最后一字节)
  423. 点动开关参数(9):,电动开关3个字节(使能1,时间2)-20-21-22,-23-24-25,-26-27-28
  424. */
  425. iap_eeprom_read(0, read_mileage, 30); // 读取30字节,状态参数
  426. iap_eeprom_read_backup(0, read_mileage_backup, 30); // 读取30字节,配置参数
  427. /***************配置参数******************************/
  428. /*通电反应 通电勿扰开启 通过app操作使开关关闭的情况下,设备重新上电,设备处于关闭状态关闭 断电记忆 恢复到断电前使用的状态
  429. 开关上电状态设置 枚举范围:off,on,memory
  430. 通电勿扰开启 = off==0,关闭=memory==2,1:强制开机
  431. */
  432. if (read_mileage_backup[1] != 0xff)
  433. switchState.relay_allstatus = read_mileage_backup[1]; // 开关上电状态设置,全局
  434. if (read_mileage_backup[2] != 0xff)
  435. switchState.relay_status[0] = read_mileage_backup[2]; // 开关上电状态设置,1-3键
  436. if (read_mileage_backup[3] != 0xff)
  437. switchState.relay_status[1] = read_mileage_backup[3];
  438. if (read_mileage_backup[4] != 0xff)
  439. switchState.relay_status[2] = read_mileage_backup[4];
  440. if (read_mileage_backup[5] != 0xff)
  441. switchState.led_level = read_mileage_backup[5]; // 指示灯亮度
  442. if (read_mileage_backup[6] != 0xff)
  443. switchState.mod[0] = read_mileage_backup[6]; //// 开关、场景设置
  444. if (read_mileage_backup[7] != 0xff)
  445. switchState.mod[1] = read_mileage_backup[7]; //// 开关、场景设置
  446. if (read_mileage_backup[8] != 0xff)
  447. switchState.mod[2] = read_mileage_backup[8]; //// 开关、场景设置
  448. if (read_mileage_backup[9] != 0xff) //
  449. {
  450. switchState.human = read_mileage_backup[9]; // 人感使能开关
  451. }
  452. if (read_mileage_backup[20] != 0xff)
  453. switchState.plus_mod[0] = read_mileage_backup[20]; // 点动开关被配置
  454. if (read_mileage_backup[23] != 0xff)
  455. switchState.plus_mod[1] = read_mileage_backup[23]; // 点动开关被配置
  456. if (read_mileage_backup[26] != 0xff)
  457. switchState.plus_mod[2] = read_mileage_backup[26]; // 点动开关被配置
  458. if (read_mileage_backup[21] != 0xff)
  459. {
  460. switchState.plus_auto_time[0] = (read_mileage_backup[21] * 256 + read_mileage_backup[22]) * 10; // 高字节在前,秒转100ms为基数
  461. }
  462. else
  463. {
  464. switchState.plus_auto_time[0] = 50; // 默认5S,可控制门禁
  465. }
  466. if (read_mileage_backup[24] != 0xff)
  467. {
  468. switchState.plus_auto_time[1] = (read_mileage_backup[24] * 256 + read_mileage_backup[25]) * 10; // 高字节在前,秒转100ms为基数
  469. }
  470. else
  471. {
  472. switchState.plus_auto_time[1] = 50; // 默认5S,可控制门禁
  473. }
  474. if (read_mileage_backup[27] != 0xff)
  475. {
  476. switchState.plus_auto_time[2] = (read_mileage_backup[27] * 256 + read_mileage_backup[28]) * 10; // 高字节在前,秒转100ms为基数
  477. }
  478. else
  479. {
  480. switchState.plus_auto_time[2] = 50; // 默认5S,可控制门禁
  481. }
  482. /***************配置参数******************************/
  483. /***************关机前实时状态数据******************************/
  484. if (read_mileage[10] != 0xff)
  485. switchState.relay_new_status[0] = read_mileage[10]; // 关机前最新继电器状态,1-3键
  486. if (read_mileage[11] != 0xff)
  487. switchState.relay_new_status[1] = read_mileage[11];
  488. if (read_mileage[12] != 0xff)
  489. switchState.relay_new_status[2] = read_mileage[12];
  490. // 取消断电前的人感状态读取
  491. /*if (read_mileage[13] != 0xff)
  492. switchState.gRadarCheckNull = read_mileage[13]; // 断电前人感状态,1为无人*/
  493. if (read_mileage[14] != 0xff) // 取消该部分逻辑,根据APP设置的上电状态来启动点动
  494. switchState.plus_en[0] = read_mileage[14]; // 断电前点动开关未结束
  495. if (read_mileage[15] != 0xff)
  496. switchState.plus_en[1] = read_mileage[15]; // 断电前点动开关未结束
  497. if (read_mileage[16] != 0xff)
  498. switchState.plus_en[2] = read_mileage[16]; // 断电前点动开关未结束
  499. /***************关机前实时状态数据******************************/
  500. if (switchState.plus_mod[0] == 0x01) // 1号通道被设置点动开关
  501. {
  502. if (switchState.relay_status[0] == 0x01) // 通电启动,其他设置不启动
  503. {
  504. switchState.plus_en[0] = 0x01;
  505. switchState.plus_counter[0] = switchState.plus_auto_time[0];
  506. gLedState = gLedState | 0x01; // 按键1开启
  507. gRelayOnOff |= 0x01; // 继电器动作开启
  508. }
  509. else
  510. {
  511. switchState.plus_en[0] = 0x00; // 关闭
  512. switchState.plus_counter[0] = 0;
  513. gLedState = gLedState & (~0x01); // 按键1清除
  514. gRelayOnOff &= (~0x01); // 继电器关闭
  515. gRelayState |= 0x01;
  516. }
  517. }
  518. else // 非点动,按照上电配置状态控制逻辑
  519. {
  520. if (switchState.mod[0] == 0x00) // 设置为开关时有效
  521. {
  522. // key1
  523. if (switchState.relay_status[0] == 0x00) // 断电
  524. {
  525. gLedState = gLedState & (~0x01); // 按键1清除
  526. gRelayOnOff &= (~0x01); // 继电器关闭
  527. gRelayState |= 0x01;
  528. }
  529. else if (switchState.relay_status[0] == 0x01) // 通电
  530. {
  531. gLedState = gLedState | 0x01; // 按键1开启
  532. gRelayOnOff |= 0x01; // 继电器动作开启
  533. }
  534. else // 断电记忆
  535. {
  536. if (switchState.relay_new_status[0] == 0x01)
  537. {
  538. gLedState = gLedState | 0x01; // 按键1开启
  539. gRelayOnOff |= 0x01; // 继电器动作开启
  540. }
  541. else
  542. {
  543. gLedState = gLedState & (~0x01); // 按键1清除
  544. gRelayOnOff &= (~0x01); // 继电器关闭
  545. gRelayState |= 0x01;
  546. }
  547. }
  548. }
  549. }
  550. if (switchState.plus_mod[1] == 0x01) // 2号通道被设置点动开关
  551. {
  552. if (switchState.relay_status[1] == 0x01) // 通电
  553. {
  554. switchState.plus_en[1] = 0x01;
  555. switchState.plus_counter[1] = switchState.plus_auto_time[1];
  556. gLedState = gLedState | 0x02; // // 按键2开启
  557. gRelayOnOff |= 0x02; // 继电器动作开启
  558. }
  559. else
  560. {
  561. switchState.plus_en[1] = 0x00;
  562. switchState.plus_counter[1] = 0;
  563. gLedState = gLedState & (~0x02); // 按键2清除
  564. gRelayOnOff &= (~0x02); // 继电器关闭
  565. gRelayState |= 0x02;
  566. }
  567. }
  568. else // 非点动,按照上电配置状态控制逻辑
  569. {
  570. if (switchState.mod[1] == 0x00) // 设置为开关时有效
  571. {
  572. // key2
  573. if (switchState.relay_status[1] == 0x00) // 断电
  574. {
  575. gLedState = gLedState & (~0x02); // 按键2清除
  576. gRelayOnOff &= (~0x02); // 继电器关闭
  577. gRelayState |= 0x02;
  578. }
  579. else if (switchState.relay_status[1] == 0x01) // 通电
  580. {
  581. gLedState = gLedState | 0x02; // // 按键2开启
  582. gRelayOnOff |= 0x02; // 继电器动作开启
  583. }
  584. else // 断电记忆
  585. {
  586. if (switchState.relay_new_status[1] == 0x01)
  587. {
  588. gLedState = gLedState | 0x02; // // 按键2开启
  589. gRelayOnOff |= 0x02; // 继电器动作开启
  590. }
  591. else
  592. {
  593. gLedState = gLedState & (~0x02); // 按键2清除
  594. gRelayOnOff &= (~0x02); // 继电器关闭
  595. gRelayState |= 0x02;
  596. }
  597. }
  598. }
  599. }
  600. if (switchState.plus_mod[2] == 0x01) // 3号通道被设置点动开关
  601. {
  602. if (switchState.relay_status[2] == 0x01) // 通电
  603. {
  604. switchState.plus_en[2] = 0x01;
  605. switchState.plus_counter[2] = switchState.plus_auto_time[2];
  606. gLedState = gLedState | 0x04; // // 按键3开启
  607. gRelayOnOff |= 0x04; // 继电器动作开启
  608. }
  609. else
  610. {
  611. switchState.plus_en[2] = 0x00;
  612. switchState.plus_counter[2] = 0;
  613. gLedState = gLedState & (~0x04); // // 按键3清除
  614. gRelayOnOff &= (~0x04); // 继电器关闭
  615. gRelayState |= 0x04;
  616. }
  617. }
  618. else // 非点动,按照上电配置状态控制逻辑
  619. {
  620. if (switchState.mod[2] == 0x00) // 设置为开关时有效
  621. {
  622. // key3
  623. if (switchState.relay_status[2] == 0x00) // 断电
  624. {
  625. gLedState = gLedState & (~0x04); // // 按键3清除
  626. gRelayOnOff &= (~0x04); // 继电器关闭
  627. gRelayState |= 0x04;
  628. }
  629. else if (switchState.relay_status[2] == 0x01) // 通电
  630. {
  631. gLedState = gLedState | 0x04; // // 按键3开启
  632. gRelayOnOff |= 0x04; // 继电器动作开启
  633. }
  634. else // 断电记忆
  635. {
  636. if (switchState.relay_new_status[2] == 0x01)
  637. {
  638. gLedState = gLedState | 0x04; // // 按键3开启
  639. gRelayOnOff |= 0x04; // 继电器动作开启
  640. }
  641. else
  642. {
  643. gLedState = gLedState & (~0x04); // // 按键3清除
  644. gRelayOnOff &= (~0x04); // 继电器关闭
  645. gRelayState |= 0x04;
  646. }
  647. }
  648. }
  649. }
  650. //增加上电读取存储的电量数据
  651. user_read_INFO_byte(INFO6_ADDR, CheckBuf, 50); // 读取INFO6地址存储的数据
  652. // 取消断电前人感状态读取及应用
  653. /*if (switchState.gRadarCheckNull == 1) // 断电前无人
  654. {
  655. gRadarCheckNull = 1;
  656. gRadarKeepTimer = 0; // 雷达无人,按键灯熄灭
  657. }*/
  658. if (switchState.human) // 开启雷达的情况下有效
  659. {
  660. gRadarCheckNull = 1;
  661. gRadarKeepTimer = 0; // 雷达无人,按键灯熄灭
  662. }
  663. sTimeout(&SystemTimer, 0);
  664. #ifdef REALSE // 生产模式,开启看门狗
  665. WDGT_Init();
  666. #endif
  667. }
  668. /**********************************************************************************************************
  669. **函数名称 :main()
  670. **函数描述 :主函数
  671. **输 入 :None
  672. **输 出 :None
  673. **********************************************************************************************************/
  674. void main(void)
  675. {
  676. sysInit(); // 系统初始化
  677. taskInit(); // 初始化任务
  678. while (1)
  679. {
  680. zigbee_uart_service(); // zigbee接收处理
  681. //增加循环读取电量数据 add by qys hlw
  682. ///// 系统时钟控制
  683. if (sys10msFlag) // 10ms任务
  684. {
  685. sys10msFlag = 0;
  686. Scankey(); // 按键扫描处理任务
  687. button1LongPressCheck(); // 长按键处理任务
  688. relay_plus_ctl(); // 磁保持继电器控制任务
  689. if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 正常模式下按键灯控制任务
  690. {
  691. // 脱网指示灯闪烁
  692. if (switchState.zigbee_work_state == 0x02) // 脱网报警(离线状态) 慢闪60s 3s一闪烁
  693. {
  694. if (--switchState.time)
  695. {
  696. ledCtrlProc(); // 脱网闪烁处理
  697. }
  698. else
  699. {
  700. ledSetParam(0, 0);
  701. switchState.zigbee_work_state = 0; // 离线工作,指示灯恢复正常
  702. }
  703. }
  704. else
  705. {
  706. key_led_pwm_ctl(); // 按键灯PWM控制任务
  707. }
  708. }
  709. /*****************zigbee任务--10ms******************/
  710. if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) // zigbee配网前准备
  711. {
  712. if (++ZG_JoinCounter <= 1000) // 配网前确认闪烁10秒
  713. {
  714. ledCtrlProc(); // 按键led控制闪烁
  715. }
  716. else
  717. {
  718. ZG_Joining = CONDITION_JOINGING_TO_NORMAL; // 超过10秒未确认,从配网前恢复正常状态
  719. ledSetParam(0, 0);
  720. }
  721. }
  722. else if (ZG_Joining == CONDITION_BEFOR_JOINING_TO_JOINING) // 已进入配网状态
  723. {
  724. if (++ZG_JoinCounter <= 18000) // 配网快速闪烁180秒
  725. {
  726. ledCtrlProc(); ////按键led控制闪烁
  727. if (ZG_JoinCounter == 0x05) // 进入配网模式,5秒后发送配网指令
  728. {
  729. // if (switchState.zigbee_work_state != 0x01) // 已入网不发送指令
  730. //{
  731. mcu_join_zigbee(); // 只要触发入网必须发送入网指令,满足从已入网主机1切换到新主机2的切换
  732. //}
  733. }
  734. else if (ZG_JoinCounter % 900 == 0x00) // 过90秒再次发送一次入网-取消,01配网的逻辑是先离线在入网,不可二次发送
  735. {
  736. // mcu_join_zigbee();//每90秒再次发送入网指令
  737. }
  738. else
  739. {
  740. }
  741. }
  742. else
  743. {
  744. ZG_Joining = CONDITION_JOINGING_TO_NORMAL; ////超过180秒,从配网前恢复正常状态
  745. ledSetParam(0, 0);
  746. }
  747. }
  748. else
  749. {
  750. ZG_Joining = CONDITION_JOINGING_TO_NORMAL; // 正常状态
  751. }
  752. /*****************zigbee任务--10ms******************/
  753. if (++sysTickfor100ms >= 10) // 100ms
  754. {
  755. sysTickfor100ms = 0;
  756. /**********************10ms喂狗任务************************/
  757. #ifdef REALSE // 生产模式
  758. WDGT_Feed(); // 定时喂狗
  759. #endif
  760. /**********************10ms喂狗任务************************/
  761. /*****************人感任务--100ms******************/
  762. if (switchState.human) // 人感使能
  763. {
  764. if (RADAR_READ()) // 读取人感状态,高电平有效
  765. {
  766. gRadarCheckNull = 0; // 有人检测到
  767. gRadarKeepTimer = 100; // 12s//传感器自带2S+软件倒计时10S
  768. }
  769. else // 下降沿清空有人标志
  770. {
  771. gRadarCheckNull = 1;
  772. }
  773. if (gRadarKeepTimer)
  774. {
  775. gRadarKeepTimer--;
  776. // 取消人感状态变化存入eeprom
  777. /*if (gRadarKeepTimer == 1) // 等于1时,触发存eeprom
  778. {
  779. switchState.gRadarCheckNull = 1; // 清空有人标志
  780. // write_mileage[0] = switchState.gRadarCheckNull;
  781. // iap_eeprom_write(13, write_mileage, 1); // 写入1字节
  782. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  783. write_mileage[13] = switchState.gRadarCheckNull;
  784. iap_eeprom_write(0, write_mileage, 30); // 写入1字节
  785. }
  786. else if (gRadarKeepTimer == 90) // 等于90时,表示刚触发了有人,存eeprom
  787. {
  788. switchState.gRadarCheckNull = 0; // 设置有人标志
  789. // write_mileage[0] = switchState.gRadarCheckNull;
  790. // iap_eeprom_write(13, write_mileage, 1); // 写入1字节
  791. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  792. write_mileage[13] = switchState.gRadarCheckNull;
  793. iap_eeprom_write(0, write_mileage, 30); // 写入1字节
  794. }
  795. else
  796. {
  797. }*/
  798. }
  799. }
  800. else // 无人感,按键指示灯常亮
  801. {
  802. gRadarKeepTimer = 100; // 10s ,无人感设备一致默认有人
  803. }
  804. /*****************人感任务--100ms******************/
  805. /*****************点动开关任务-100ms*******************/
  806. if ((switchState.plus_en[0] == 0x01) && (switchState.plus_mod[0] == 0x01)) // 点动开关触发
  807. {
  808. if (switchState.plus_counter[0] == 0x00)
  809. {
  810. gLedState = gLedState & (~0x01); // 按键1清除
  811. gRelayOnOff &= (~0x01); // 继电器关闭
  812. // write_mileage[0] = 0;
  813. // iap_eeprom_write(14, write_mileage, 1); // 写入1字节
  814. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  815. write_mileage[14] = 0;
  816. iap_eeprom_write(0, write_mileage, 30); // 先读,在写入1字节
  817. switchState.plus_en[0] = 0;
  818. }
  819. switchState.plus_counter[0]--;
  820. }
  821. if ((switchState.plus_en[1] == 0x01) && (switchState.plus_mod[1] == 0x01)) // 点动开关触发
  822. {
  823. if (switchState.plus_counter[1] == 0x00)
  824. {
  825. gLedState = gLedState & (~0x02); // 按键2清除
  826. gRelayOnOff &= (~0x02); // 继电器关闭
  827. // write_mileage[0] = 0;
  828. // iap_eeprom_write(15, write_mileage, 1); // 写入1字节
  829. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  830. write_mileage[15] = 0;
  831. iap_eeprom_write(0, write_mileage, 30); // 先读,在写入1字节
  832. switchState.plus_en[1] = 0;
  833. }
  834. switchState.plus_counter[1]--;
  835. }
  836. if ((switchState.plus_en[2] == 0x01) && (switchState.plus_mod[2] == 0x01)) // 点动开关触发
  837. {
  838. if (switchState.plus_counter[2] == 0x00)
  839. {
  840. gLedState = gLedState & (~0x04); // // 按键3清除
  841. gRelayOnOff &= (~0x04); // 继电器关闭
  842. // write_mileage[0] = 0;
  843. // iap_eeprom_write(16, write_mileage, 1); // 写入1字节
  844. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  845. write_mileage[16] = 0;
  846. iap_eeprom_write(0, write_mileage, 30); // 先读,在写入1字节
  847. switchState.plus_en[2] = 0;
  848. }
  849. switchState.plus_counter[2]--;
  850. }
  851. /**********************点动开关任务************************/
  852. Read_Power_Data_handle(); //5s定时获取一次电量数据
  853. if (++sysTickfor1000ms >= 50) // 1s任务
  854. {
  855. sysTickfor1000ms = 0;
  856. //Start_Send_UartData(2);
  857. }
  858. }
  859. }
  860. }
  861. }
  862. /**********************************************************************************************************
  863. **函数名称 :relay_ctl()
  864. **函数描述 :继电器控制任务,10ms调用,普通继电器,电平控制
  865. **输 入 :None
  866. **输 出 :None
  867. **********************************************************************************************************/
  868. void relay_ctl(void)
  869. {
  870. /*if (gRelayState != gRelayOnOff)
  871. {
  872. //继电器1
  873. if (gRelayOnOff & 0x01) // 继电器1开启
  874. {
  875. relay1_control(1);
  876. gRelayState |= 0x01;
  877. mcu_dp_bool_update(DPID_SWITCH_1, 1);
  878. }
  879. else if ((gRelayOnOff & 0x01) == 0x00) // 继电器1关闭
  880. {
  881. relay1_control(0);
  882. gRelayState &= (~0x01);
  883. mcu_dp_bool_update(DPID_SWITCH_1, 0);
  884. }
  885. //继电器2
  886. if (gRelayOnOff & 0x02) // 继电器2开启
  887. {
  888. relay2_control(1);
  889. gRelayState |= 0x02;
  890. mcu_dp_bool_update(DPID_SWITCH_2, 1);
  891. }
  892. else if ((gRelayOnOff & 0x02) == 0x00) // 继电器3关闭
  893. {
  894. relay2_control(0);
  895. gRelayState &= (~0x02);
  896. mcu_dp_bool_update(DPID_SWITCH_2, 0);
  897. }
  898. //继电器3
  899. if (gRelayOnOff & 0x04) // 继电器3开启
  900. {
  901. relay3_control(1);
  902. gRelayState |= 0x04;
  903. mcu_dp_bool_update(DPID_SWITCH_3, 1);
  904. }
  905. else if ((gRelayOnOff & 0x04) == 0x00) // 继电器3关闭
  906. {
  907. relay3_control(0);
  908. gRelayState &= (~0x04);
  909. mcu_dp_bool_update(DPID_SWITCH_3, 0);
  910. }
  911. }
  912. // add by zzw all_data_update APP状态同步
  913. if ((gLedState & 0x01) == 0x01)
  914. {
  915. switchState.SWITCH[0] = 1;
  916. }
  917. else
  918. {
  919. switchState.SWITCH[0] = 0;
  920. }
  921. if ((gLedState & 0x02) == 0x02)
  922. {
  923. switchState.SWITCH[1] = 1;
  924. }
  925. else
  926. {
  927. switchState.SWITCH[1] = 0;
  928. }
  929. if ((gLedState & 0x04) == 0x04) //
  930. {
  931. switchState.SWITCH[2] = 1;
  932. }
  933. else
  934. {
  935. switchState.SWITCH[2] = 0;
  936. }*/
  937. }
  938. /******************************************************************************************
  939. ** 函数名称: wdg_init
  940. ** 函数描述: 看门狗初始化函数
  941. ** 输入参数: 无
  942. ** 输出参数: 无
  943. *******************************************************************************************/
  944. void WDGT_Init(void)
  945. {
  946. SET_REG_BITS(OPTION, WDTPSC, 0); // 240MS
  947. SET_REG_BITS(AUX2, WDTE, 2); // 看门狗在快钟和慢钟模式下使能,空闲/停止/暂停模式下禁止
  948. SET_REG_BITS(AUX1, CLRWDT, 0);
  949. CLR_WDT; // 设置以清除看门狗定时器
  950. }
  951. /*******************************************************************************
  952. Function: WDGT_Feed()
  953. Description: 喂狗
  954. Calls:
  955. Called By: no
  956. Input: no
  957. Output: no
  958. Return: no
  959. Others: no
  960. ********************************************************************************/
  961. void WDGT_Feed(void)
  962. {
  963. CLRWDT = 1; // 喂狗
  964. }