main.c 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  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] = 0xff; // 默认未设置点动开关,测试点动开启
  399. switchState.plus_auto_time[i] = 0xffff; // 默认ffff
  400. }
  401. // switchState.relay_status[0] = 0x00;//测试继电器断电保存状态,默认关
  402. // switchState.relay_status[1] = 0x01;//测试继电器断电保存状态,默认开
  403. // switchState.relay_status[2] = 0x02;//测试继电器断电保存状态,默认与开机前一致
  404. switchState.step[3] = 0x01;
  405. switchState.step[4] = 0x01;
  406. switchState.step[5] = 0x01;
  407. switchState.led_level = PWMLEVEL1; // 默认最低亮度
  408. // switchState.gRadarCheckNull = 0; // 默认雷达有人,按键背光亮起
  409. // 全局初始化参数
  410. appControlLedEnable = 1; // 默认APP控制继电器动作联动背光亮10秒
  411. ZG_Joining = CONDITION_JOINGING_TO_NORMAL; // ZIGBEE正常模式状态
  412. switchState.zigbee_work_state = 0; // 默认ZIGBEE脱网运行
  413. EA = 1; // 总中断允许
  414. ledSetParam(0, 0); // 背光不闪
  415. pwm_set_prd(255); // PWM 周期设定
  416. /*
  417. 参数数据(10):0-9:人感1字节-0,开机状态(通电勿扰)全局设置1字节-1,三个继电器开机状态3个字节-2-3-4,背光等级1个字节-5
  418. 实时数据(6):10:19:当前继电器状态3个字节-10-11-12,雷达状态1字节-13,点动倒计时未结束1个字节-14-15-16,ota状态1字节-19(最后一字节)
  419. 点动开关参数(9):,电动开关3个字节(使能1,时间2)-20-21-22,-23-24-25,-26-27-28
  420. */
  421. iap_eeprom_read(0, read_mileage, 30); // 读取30字节,状态参数
  422. iap_eeprom_read_backup(0, read_mileage_backup, 30); // 读取30字节,配置参数
  423. /***************配置参数******************************/
  424. /*通电反应 通电勿扰开启 通过app操作使开关关闭的情况下,设备重新上电,设备处于关闭状态关闭 断电记忆 恢复到断电前使用的状态
  425. 开关上电状态设置 枚举范围:off,on,memory
  426. 通电勿扰开启 = off==0,关闭=memory==2,1:强制开机
  427. */
  428. if (read_mileage_backup[1] != 0xff)
  429. switchState.relay_allstatus = read_mileage_backup[1]; // 开关上电状态设置,全局
  430. if (read_mileage_backup[2] != 0xff)
  431. switchState.relay_status[0] = read_mileage_backup[2]; // 开关上电状态设置,1-3键
  432. if (read_mileage_backup[3] != 0xff)
  433. switchState.relay_status[1] = read_mileage_backup[3];
  434. if (read_mileage_backup[4] != 0xff)
  435. switchState.relay_status[2] = read_mileage_backup[4];
  436. if (read_mileage_backup[5] != 0xff)
  437. switchState.led_level = read_mileage_backup[5]; // 指示灯亮度
  438. if (read_mileage_backup[6] != 0xff)
  439. switchState.mod[0] = read_mileage_backup[6]; //// 开关、场景设置
  440. if (read_mileage_backup[7] != 0xff)
  441. switchState.mod[1] = read_mileage_backup[7]; //// 开关、场景设置
  442. if (read_mileage_backup[8] != 0xff)
  443. switchState.mod[2] = read_mileage_backup[8]; //// 开关、场景设置
  444. if (read_mileage_backup[9] != 0xff) //
  445. {
  446. switchState.human = read_mileage_backup[9]; // 人感使能开关
  447. }
  448. if (read_mileage_backup[20] != 0xff)
  449. switchState.plus_mod[0] = read_mileage_backup[20]; // 点动开关被配置
  450. if (read_mileage_backup[23] != 0xff)
  451. switchState.plus_mod[1] = read_mileage_backup[23]; // 点动开关被配置
  452. if (read_mileage_backup[26] != 0xff)
  453. switchState.plus_mod[2] = read_mileage_backup[26]; // 点动开关被配置
  454. if (read_mileage_backup[21] != 0xff)
  455. {
  456. switchState.plus_auto_time[0] = (read_mileage_backup[21] * 256 + read_mileage_backup[22]) * 10; // 高字节在前,秒转100ms为基数
  457. }
  458. else
  459. {
  460. switchState.plus_auto_time[0] = 50; // 默认5S,可控制门禁
  461. }
  462. if (read_mileage_backup[24] != 0xff)
  463. {
  464. switchState.plus_auto_time[1] = (read_mileage_backup[24] * 256 + read_mileage_backup[25]) * 10; // 高字节在前,秒转100ms为基数
  465. }
  466. else
  467. {
  468. switchState.plus_auto_time[1] = 50; // 默认5S,可控制门禁
  469. }
  470. if (read_mileage_backup[27] != 0xff)
  471. {
  472. switchState.plus_auto_time[2] = (read_mileage_backup[27] * 256 + read_mileage_backup[28]) * 10; // 高字节在前,秒转100ms为基数
  473. }
  474. else
  475. {
  476. switchState.plus_auto_time[2] = 50; // 默认5S,可控制门禁
  477. }
  478. /***************配置参数******************************/
  479. /***************关机前实时状态数据******************************/
  480. if (read_mileage[10] != 0xff)
  481. switchState.relay_new_status[0] = read_mileage[10]; // 关机前最新继电器状态,1-3键
  482. if (read_mileage[11] != 0xff)
  483. switchState.relay_new_status[1] = read_mileage[11];
  484. if (read_mileage[12] != 0xff)
  485. switchState.relay_new_status[2] = read_mileage[12];
  486. // 取消断电前的人感状态读取
  487. /*if (read_mileage[13] != 0xff)
  488. switchState.gRadarCheckNull = read_mileage[13]; // 断电前人感状态,1为无人*/
  489. if (read_mileage[14] != 0xff) // 取消该部分逻辑,根据APP设置的上电状态来启动点动
  490. switchState.plus_en[0] = read_mileage[14]; // 断电前点动开关未结束
  491. if (read_mileage[15] != 0xff)
  492. switchState.plus_en[1] = read_mileage[15]; // 断电前点动开关未结束
  493. if (read_mileage[16] != 0xff)
  494. switchState.plus_en[2] = read_mileage[16]; // 断电前点动开关未结束
  495. /***************关机前实时状态数据******************************/
  496. if (switchState.plus_mod[0] == 0x01) // 1号通道被设置点动开关
  497. {
  498. if (switchState.relay_status[0] == 0x01) // 通电启动,其他设置不启动
  499. {
  500. switchState.plus_en[0] = 0x01;
  501. switchState.plus_counter[0] = switchState.plus_auto_time[0];
  502. gLedState = gLedState | 0x01; // 按键1开启
  503. gRelayOnOff |= 0x01; // 继电器动作开启
  504. }
  505. else
  506. {
  507. switchState.plus_en[0] = 0x00; // 关闭
  508. switchState.plus_counter[0] = 0;
  509. gLedState = gLedState & (~0x01); // 按键1清除
  510. gRelayOnOff &= (~0x01); // 继电器关闭
  511. gRelayState |= 0x01;
  512. }
  513. }
  514. else // 非点动,按照上电配置状态控制逻辑
  515. {
  516. if (switchState.mod[0] == 0x00) // 设置为开关时有效
  517. {
  518. // key1
  519. if (switchState.relay_status[0] == 0x00) // 断电
  520. {
  521. gLedState = gLedState & (~0x01); // 按键1清除
  522. gRelayOnOff &= (~0x01); // 继电器关闭
  523. gRelayState |= 0x01;
  524. }
  525. else if (switchState.relay_status[0] == 0x01) // 通电
  526. {
  527. gLedState = gLedState | 0x01; // 按键1开启
  528. gRelayOnOff |= 0x01; // 继电器动作开启
  529. }
  530. else // 断电记忆
  531. {
  532. if (switchState.relay_new_status[0] == 0x01)
  533. {
  534. gLedState = gLedState | 0x01; // 按键1开启
  535. gRelayOnOff |= 0x01; // 继电器动作开启
  536. }
  537. else
  538. {
  539. gLedState = gLedState & (~0x01); // 按键1清除
  540. gRelayOnOff &= (~0x01); // 继电器关闭
  541. gRelayState |= 0x01;
  542. }
  543. }
  544. }
  545. }
  546. if (switchState.plus_mod[1] == 0x01) // 2号通道被设置点动开关
  547. {
  548. if (switchState.relay_status[1] == 0x01) // 通电
  549. {
  550. switchState.plus_en[1] = 0x01;
  551. switchState.plus_counter[1] = switchState.plus_auto_time[1];
  552. gLedState = gLedState | 0x02; // // 按键2开启
  553. gRelayOnOff |= 0x02; // 继电器动作开启
  554. }
  555. else
  556. {
  557. switchState.plus_en[1] = 0x00;
  558. switchState.plus_counter[1] = 0;
  559. gLedState = gLedState & (~0x02); // 按键2清除
  560. gRelayOnOff &= (~0x02); // 继电器关闭
  561. gRelayState |= 0x02;
  562. }
  563. }
  564. else // 非点动,按照上电配置状态控制逻辑
  565. {
  566. if (switchState.mod[1] == 0x00) // 设置为开关时有效
  567. {
  568. // key2
  569. if (switchState.relay_status[1] == 0x00) // 断电
  570. {
  571. gLedState = gLedState & (~0x02); // 按键2清除
  572. gRelayOnOff &= (~0x02); // 继电器关闭
  573. gRelayState |= 0x02;
  574. }
  575. else if (switchState.relay_status[1] == 0x01) // 通电
  576. {
  577. gLedState = gLedState | 0x02; // // 按键2开启
  578. gRelayOnOff |= 0x02; // 继电器动作开启
  579. }
  580. else // 断电记忆
  581. {
  582. if (switchState.relay_new_status[1] == 0x01)
  583. {
  584. gLedState = gLedState | 0x02; // // 按键2开启
  585. gRelayOnOff |= 0x02; // 继电器动作开启
  586. }
  587. else
  588. {
  589. gLedState = gLedState & (~0x02); // 按键2清除
  590. gRelayOnOff &= (~0x02); // 继电器关闭
  591. gRelayState |= 0x02;
  592. }
  593. }
  594. }
  595. }
  596. if (switchState.plus_mod[2] == 0x01) // 3号通道被设置点动开关
  597. {
  598. if (switchState.relay_status[2] == 0x01) // 通电
  599. {
  600. switchState.plus_en[2] = 0x01;
  601. switchState.plus_counter[2] = switchState.plus_auto_time[2];
  602. gLedState = gLedState | 0x04; // // 按键3开启
  603. gRelayOnOff |= 0x04; // 继电器动作开启
  604. }
  605. else
  606. {
  607. switchState.plus_en[2] = 0x00;
  608. switchState.plus_counter[2] = 0;
  609. gLedState = gLedState & (~0x04); // // 按键3清除
  610. gRelayOnOff &= (~0x04); // 继电器关闭
  611. gRelayState |= 0x04;
  612. }
  613. }
  614. else // 非点动,按照上电配置状态控制逻辑
  615. {
  616. if (switchState.mod[2] == 0x00) // 设置为开关时有效
  617. {
  618. // key3
  619. if (switchState.relay_status[2] == 0x00) // 断电
  620. {
  621. gLedState = gLedState & (~0x04); // // 按键3清除
  622. gRelayOnOff &= (~0x04); // 继电器关闭
  623. gRelayState |= 0x04;
  624. }
  625. else if (switchState.relay_status[2] == 0x01) // 通电
  626. {
  627. gLedState = gLedState | 0x04; // // 按键3开启
  628. gRelayOnOff |= 0x04; // 继电器动作开启
  629. }
  630. else // 断电记忆
  631. {
  632. if (switchState.relay_new_status[2] == 0x01)
  633. {
  634. gLedState = gLedState | 0x04; // // 按键3开启
  635. gRelayOnOff |= 0x04; // 继电器动作开启
  636. }
  637. else
  638. {
  639. gLedState = gLedState & (~0x04); // // 按键3清除
  640. gRelayOnOff &= (~0x04); // 继电器关闭
  641. gRelayState |= 0x04;
  642. }
  643. }
  644. }
  645. }
  646. // 取消断电前人感状态读取及应用
  647. /*if (switchState.gRadarCheckNull == 1) // 断电前无人
  648. {
  649. gRadarCheckNull = 1;
  650. gRadarKeepTimer = 0; // 雷达无人,按键灯熄灭
  651. }*/
  652. if (switchState.human) // 开启雷达的情况下有效
  653. {
  654. gRadarCheckNull = 1;
  655. gRadarKeepTimer = 0; // 雷达无人,按键灯熄灭
  656. }
  657. #ifdef REALSE // 生产模式,开启看门狗
  658. WDGT_Init();
  659. #endif
  660. }
  661. /**********************************************************************************************************
  662. **函数名称 :main()
  663. **函数描述 :主函数
  664. **输 入 :None
  665. **输 出 :None
  666. **********************************************************************************************************/
  667. void main(void)
  668. {
  669. sysInit(); // 系统初始化
  670. taskInit(); // 初始化任务
  671. while (1)
  672. {
  673. zigbee_uart_service(); // zigbee接收处理
  674. ///// 系统时钟控制
  675. if (sys10msFlag) // 10ms任务
  676. {
  677. sys10msFlag = 0;
  678. Scankey(); // 按键扫描处理任务
  679. button1LongPressCheck(); // 长按键处理任务
  680. relay_plus_ctl(); // 磁保持继电器控制任务
  681. if (ZG_Joining == CONDITION_JOINGING_TO_NORMAL) // 正常模式下按键灯控制任务
  682. {
  683. // 脱网指示灯闪烁
  684. if (switchState.zigbee_work_state == 0x02) // 脱网报警(离线状态) 慢闪60s 3s一闪烁
  685. {
  686. if (--switchState.time)
  687. {
  688. ledCtrlProc(); // 脱网闪烁处理
  689. }
  690. else
  691. {
  692. ledSetParam(0, 0);
  693. switchState.zigbee_work_state = 0; // 离线工作,指示灯恢复正常
  694. }
  695. }
  696. else
  697. {
  698. key_led_pwm_ctl(); // 按键灯PWM控制任务
  699. }
  700. }
  701. /*****************zigbee任务--10ms******************/
  702. if (ZG_Joining == CONDITION_NORMAL_TO_BEFOR_JOINING) // zigbee配网前准备
  703. {
  704. if (++ZG_JoinCounter <= 1000) // 配网前确认闪烁10秒
  705. {
  706. ledCtrlProc(); // 按键led控制闪烁
  707. }
  708. else
  709. {
  710. ZG_Joining = CONDITION_JOINGING_TO_NORMAL; // 超过10秒未确认,从配网前恢复正常状态
  711. ledSetParam(0, 0);
  712. }
  713. }
  714. else if (ZG_Joining == CONDITION_BEFOR_JOINING_TO_JOINING) // 已进入配网状态
  715. {
  716. if (++ZG_JoinCounter <= 18000) // 配网快速闪烁180秒
  717. {
  718. ledCtrlProc(); ////按键led控制闪烁
  719. if (ZG_JoinCounter == 0x05) // 进入配网模式,5秒后发送配网指令
  720. {
  721. // if (switchState.zigbee_work_state != 0x01) // 已入网不发送指令
  722. //{
  723. mcu_join_zigbee(); // 只要触发入网必须发送入网指令,满足从已入网主机1切换到新主机2的切换
  724. //}
  725. }
  726. else if (ZG_JoinCounter % 900 == 0x00) // 过90秒再次发送一次入网-取消,01配网的逻辑是先离线在入网,不可二次发送
  727. {
  728. // mcu_join_zigbee();//每90秒再次发送入网指令
  729. }
  730. else
  731. {
  732. }
  733. }
  734. else
  735. {
  736. ZG_Joining = CONDITION_JOINGING_TO_NORMAL; ////超过180秒,从配网前恢复正常状态
  737. ledSetParam(0, 0);
  738. }
  739. }
  740. else
  741. {
  742. ZG_Joining = CONDITION_JOINGING_TO_NORMAL; // 正常状态
  743. }
  744. /*****************zigbee任务--10ms******************/
  745. if (++sysTickfor100ms >= 10) // 100ms
  746. {
  747. sysTickfor100ms = 0;
  748. /**********************10ms喂狗任务************************/
  749. #ifdef REALSE // 生产模式
  750. WDGT_Feed(); // 定时喂狗
  751. #endif
  752. /**********************10ms喂狗任务************************/
  753. /*****************人感任务--100ms******************/
  754. if (switchState.human) // 人感使能
  755. {
  756. if (RADAR_READ()) // 读取人感状态,高电平有效
  757. {
  758. gRadarCheckNull = 0; // 有人检测到
  759. gRadarKeepTimer = 100; // 12s//传感器自带2S+软件倒计时10S
  760. }
  761. else // 下降沿清空有人标志
  762. {
  763. gRadarCheckNull = 1;
  764. }
  765. if (gRadarKeepTimer)
  766. {
  767. gRadarKeepTimer--;
  768. // 取消人感状态变化存入eeprom
  769. /*if (gRadarKeepTimer == 1) // 等于1时,触发存eeprom
  770. {
  771. switchState.gRadarCheckNull = 1; // 清空有人标志
  772. // write_mileage[0] = switchState.gRadarCheckNull;
  773. // iap_eeprom_write(13, write_mileage, 1); // 写入1字节
  774. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  775. write_mileage[13] = switchState.gRadarCheckNull;
  776. iap_eeprom_write(0, write_mileage, 30); // 写入1字节
  777. }
  778. else if (gRadarKeepTimer == 90) // 等于90时,表示刚触发了有人,存eeprom
  779. {
  780. switchState.gRadarCheckNull = 0; // 设置有人标志
  781. // write_mileage[0] = switchState.gRadarCheckNull;
  782. // iap_eeprom_write(13, write_mileage, 1); // 写入1字节
  783. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  784. write_mileage[13] = switchState.gRadarCheckNull;
  785. iap_eeprom_write(0, write_mileage, 30); // 写入1字节
  786. }
  787. else
  788. {
  789. }*/
  790. }
  791. }
  792. else // 无人感,按键指示灯常亮
  793. {
  794. gRadarKeepTimer = 100; // 10s ,无人感设备一致默认有人
  795. }
  796. /*****************人感任务--100ms******************/
  797. /*****************点动开关任务-100ms*******************/
  798. if ((switchState.plus_en[0] == 0x01) && (switchState.plus_mod[0] == 0x01)) // 点动开关触发
  799. {
  800. if (switchState.plus_counter[0] == 0x00)
  801. {
  802. gLedState = gLedState & (~0x01); // 按键1清除
  803. gRelayOnOff &= (~0x01); // 继电器关闭
  804. // write_mileage[0] = 0;
  805. // iap_eeprom_write(14, write_mileage, 1); // 写入1字节
  806. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  807. write_mileage[14] = 0;
  808. iap_eeprom_write(0, write_mileage, 30); // 先读,在写入1字节
  809. switchState.plus_en[0] = 0;
  810. }
  811. switchState.plus_counter[0]--;
  812. }
  813. if ((switchState.plus_en[1] == 0x01) && (switchState.plus_mod[1] == 0x01)) // 点动开关触发
  814. {
  815. if (switchState.plus_counter[1] == 0x00)
  816. {
  817. gLedState = gLedState & (~0x02); // 按键2清除
  818. gRelayOnOff &= (~0x02); // 继电器关闭
  819. // write_mileage[0] = 0;
  820. // iap_eeprom_write(15, write_mileage, 1); // 写入1字节
  821. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  822. write_mileage[15] = 0;
  823. iap_eeprom_write(0, write_mileage, 30); // 先读,在写入1字节
  824. switchState.plus_en[1] = 0;
  825. }
  826. switchState.plus_counter[1]--;
  827. }
  828. if ((switchState.plus_en[2] == 0x01) && (switchState.plus_mod[2] == 0x01)) // 点动开关触发
  829. {
  830. if (switchState.plus_counter[2] == 0x00)
  831. {
  832. gLedState = gLedState & (~0x04); // // 按键3清除
  833. gRelayOnOff &= (~0x04); // 继电器关闭
  834. // write_mileage[0] = 0;
  835. // iap_eeprom_write(16, write_mileage, 1); // 写入1字节
  836. iap_eeprom_read(0, write_mileage, 30); // 读取30字节
  837. write_mileage[16] = 0;
  838. iap_eeprom_write(0, write_mileage, 30); // 先读,在写入1字节
  839. switchState.plus_en[2] = 0;
  840. }
  841. switchState.plus_counter[2]--;
  842. }
  843. /**********************点动开关任务************************/
  844. if (++sysTickfor1000ms >= 10) // 1s任务
  845. {
  846. sysTickfor1000ms = 0;
  847. }
  848. }
  849. }
  850. }
  851. }
  852. /**********************************************************************************************************
  853. **函数名称 :relay_ctl()
  854. **函数描述 :继电器控制任务,10ms调用,普通继电器,电平控制
  855. **输 入 :None
  856. **输 出 :None
  857. **********************************************************************************************************/
  858. void relay_ctl(void)
  859. {
  860. /*if (gRelayState != gRelayOnOff)
  861. {
  862. //继电器1
  863. if (gRelayOnOff & 0x01) // 继电器1开启
  864. {
  865. relay1_control(1);
  866. gRelayState |= 0x01;
  867. mcu_dp_bool_update(DPID_SWITCH_1, 1);
  868. }
  869. else if ((gRelayOnOff & 0x01) == 0x00) // 继电器1关闭
  870. {
  871. relay1_control(0);
  872. gRelayState &= (~0x01);
  873. mcu_dp_bool_update(DPID_SWITCH_1, 0);
  874. }
  875. //继电器2
  876. if (gRelayOnOff & 0x02) // 继电器2开启
  877. {
  878. relay2_control(1);
  879. gRelayState |= 0x02;
  880. mcu_dp_bool_update(DPID_SWITCH_2, 1);
  881. }
  882. else if ((gRelayOnOff & 0x02) == 0x00) // 继电器3关闭
  883. {
  884. relay2_control(0);
  885. gRelayState &= (~0x02);
  886. mcu_dp_bool_update(DPID_SWITCH_2, 0);
  887. }
  888. //继电器3
  889. if (gRelayOnOff & 0x04) // 继电器3开启
  890. {
  891. relay3_control(1);
  892. gRelayState |= 0x04;
  893. mcu_dp_bool_update(DPID_SWITCH_3, 1);
  894. }
  895. else if ((gRelayOnOff & 0x04) == 0x00) // 继电器3关闭
  896. {
  897. relay3_control(0);
  898. gRelayState &= (~0x04);
  899. mcu_dp_bool_update(DPID_SWITCH_3, 0);
  900. }
  901. }
  902. // add by zzw all_data_update APP状态同步
  903. if ((gLedState & 0x01) == 0x01)
  904. {
  905. switchState.SWITCH[0] = 1;
  906. }
  907. else
  908. {
  909. switchState.SWITCH[0] = 0;
  910. }
  911. if ((gLedState & 0x02) == 0x02)
  912. {
  913. switchState.SWITCH[1] = 1;
  914. }
  915. else
  916. {
  917. switchState.SWITCH[1] = 0;
  918. }
  919. if ((gLedState & 0x04) == 0x04) //
  920. {
  921. switchState.SWITCH[2] = 1;
  922. }
  923. else
  924. {
  925. switchState.SWITCH[2] = 0;
  926. }*/
  927. }
  928. /******************************************************************************************
  929. ** 函数名称: wdg_init
  930. ** 函数描述: 看门狗初始化函数
  931. ** 输入参数: 无
  932. ** 输出参数: 无
  933. *******************************************************************************************/
  934. void WDGT_Init(void)
  935. {
  936. SET_REG_BITS(OPTION, WDTPSC, 0); // 240MS
  937. SET_REG_BITS(AUX2, WDTE, 2); // 看门狗在快钟和慢钟模式下使能,空闲/停止/暂停模式下禁止
  938. SET_REG_BITS(AUX1, CLRWDT, 0);
  939. CLR_WDT; // 设置以清除看门狗定时器
  940. }
  941. /*******************************************************************************
  942. Function: WDGT_Feed()
  943. Description: 喂狗
  944. Calls:
  945. Called By: no
  946. Input: no
  947. Output: no
  948. Return: no
  949. Others: no
  950. ********************************************************************************/
  951. void WDGT_Feed(void)
  952. {
  953. CLRWDT = 1; // 喂狗
  954. }