main.c 30 KB

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