main.c 29 KB

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