pos.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. /*
  2. * @Description:
  3. * @Version: 2.0
  4. * @Author: Seven
  5. * @Date: 2022-08-23 17:12:39
  6. * @LastEditors: Seven
  7. * @LastEditTime: 2022-08-23 18:23:10
  8. */
  9. #include "pos.h"
  10. #include "includes.h"
  11. #include "gw_ctrl.h"
  12. pos_info_t pos_info;
  13. pos_change_t pos_change;
  14. //切换开关引脚初始化
  15. void sw_gpio_init(void)
  16. {
  17. //POS和ITSF开关切换
  18. GPIO_COMM_Init(RCC_APB2Periph_GPIOD, GPIOD,
  19. GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6, GPIO_Mode_Out_PP, GPIO_Speed_50MHz);
  20. //ITSF引脚配置
  21. //YTSF_REV2
  22. GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_0, GPIO_Mode_IPU, GPIO_Speed_2MHz);
  23. //YTSF_RST_N
  24. GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_1, GPIO_Mode_Out_PP, GPIO_Speed_2MHz);
  25. YTSF_GPIO_EN();
  26. //YTSF_POSITION_N
  27. GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_2, GPIO_Mode_IPU, GPIO_Speed_2MHz);
  28. //YTSF_EN_N
  29. GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC, GPIO_Pin_3, GPIO_Mode_Out_PP, GPIO_Speed_2MHz);
  30. YTSF_GPIO_DN();
  31. }
  32. //开关切换
  33. void tax_ch_sw(uint8_t state, uint8_t posnode)
  34. {
  35. switch(state)
  36. {
  37. case PLAINTEXT:
  38. if(posnode == 1)
  39. {
  40. SW_ITSY1_OFF();
  41. SW_POS1_OFF();
  42. }
  43. else if(posnode == 2)
  44. {
  45. SW_ITSY2_OFF();
  46. SW_POS2_OFF();
  47. }
  48. else if(posnode == 3)
  49. {
  50. SW_ITSY1_OFF();
  51. SW_POS1_OFF();
  52. SW_ITSY2_OFF();
  53. SW_POS2_OFF();
  54. }
  55. break;
  56. case CIPHERTEXT:
  57. if(posnode == 1)
  58. {
  59. SW_ITSY1_ON();
  60. SW_POS1_OFF();
  61. }
  62. else if(posnode == 2)
  63. {
  64. SW_ITSY2_ON();
  65. SW_POS2_OFF();
  66. }
  67. else if(posnode == 3)
  68. {
  69. SW_ITSY1_ON();
  70. SW_POS1_OFF();
  71. SW_ITSY2_ON();
  72. SW_POS2_OFF();
  73. }
  74. break;
  75. case POS:
  76. if(posnode == 1)
  77. {
  78. SW_ITSY1_OFF();
  79. SW_POS1_ON();
  80. }
  81. else if(posnode == 2)
  82. {
  83. SW_ITSY2_OFF();
  84. SW_POS2_ON();
  85. }
  86. else if(posnode == 3)
  87. {
  88. SW_ITSY1_OFF();
  89. SW_ITSY2_OFF();
  90. SW_POS1_ON();
  91. SW_POS2_ON();
  92. }
  93. break;
  94. }
  95. }
  96. //开关复位
  97. void tax_sw_reset(uint8_t tax)
  98. {
  99. OS_ERR err;
  100. tax_ch_sw(PLAINTEXT,tax);
  101. OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err);
  102. tax_ch_sw(POS,tax);
  103. OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err);
  104. if(device_fixed_info.Encrypt == CIPHERTEXT)//密文
  105. {
  106. tax_ch_sw(CIPHERTEXT,tax);
  107. }
  108. else if(device_fixed_info.Encrypt == PLAINTEXT)//明文
  109. {
  110. tax_ch_sw(PLAINTEXT,tax);
  111. }
  112. printf("pos%d change\n",tax);
  113. }
  114. //lora和加密模块电源引脚初始化
  115. void lora_encrypt_power_init(uint8_t state)
  116. {
  117. OS_ERR err;
  118. if(state == ITSF_PWR)
  119. {
  120. ITSF_PWR_OFF();
  121. }
  122. else if(state == LORA_PWR)
  123. {
  124. LORA_PWR_OFF();
  125. }
  126. else if(state == ITSF_LORA_PWR)
  127. {
  128. ITSF_PWR_OFF();
  129. LORA_PWR_OFF();
  130. }
  131. OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err);
  132. if(state == ITSF_PWR)
  133. {
  134. ITSF_PWR_ON();
  135. }
  136. else if(state == LORA_PWR)
  137. {
  138. LORA_PWR_ON();
  139. }
  140. else if(state == ITSF_LORA_PWR)
  141. {
  142. ITSF_PWR_ON();
  143. LORA_PWR_ON();
  144. }
  145. }
  146. //判断明文密文
  147. void port_init(uint8_t state)
  148. {
  149. // OS_ERR err;
  150. //上电先切换控制开关
  151. tax_ch_sw(PLAINTEXT,3);
  152. device_fixed_info.Encrypt = 0x80;
  153. if (YTSF_GPIO_DETECT == 0) // 插入加密芯片,密文 YTSF_GPIO_DETECT YTSF_GPIO_REV3_DETECT
  154. {
  155. device_fixed_info.Encrypt |= 0x10;
  156. if(state == PORT_LED_ON)
  157. {
  158. Encryption_type_led_run_state(CIPHERTEXT);//明文密文指示灯运行
  159. }
  160. led_run_set(LED_ALL,LED_OFF);
  161. }
  162. else {
  163. device_fixed_info.Encrypt = 0x80;
  164. if(state == PORT_LED_ON)
  165. {
  166. Encryption_type_led_run_state(PLAINTEXT);//明文密文指示灯运行
  167. }
  168. }
  169. }
  170. //pos gpio初始化
  171. void pos_gpio_init(void)
  172. {
  173. //pos口引脚初始化
  174. GPIO_InitTypeDef GPIO_InitStructure;
  175. EXTI_InitTypeDef EXTI_InitStructure;
  176. NVIC_InitTypeDef NVIC_InitStructure;
  177. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//使能PORTA,PORTC时钟
  178. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
  179. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz,这里不用传参,直接写死用最大速度50MHZ
  180. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
  181. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  182. GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIO
  183. //中断配置
  184. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
  185. GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource0);
  186. GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource1);
  187. EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1;
  188. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  189. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //上升沿和下降沿触发
  190. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  191. EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
  192. //设置中断优先级
  193. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能中断通道
  194. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
  195. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级3
  196. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  197. NVIC_Init(&NVIC_InitStructure);
  198. //设置中断优先级
  199. NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能中断通道
  200. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
  201. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级3
  202. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
  203. NVIC_Init(&NVIC_InitStructure);
  204. EXTI_ClearITPendingBit(EXTI_Line0|EXTI_Line1); //清除LINE11上的中断标志
  205. }
  206. void EXTI0_IRQHandler(void){
  207. if(EXTI_GetITStatus(EXTI_Line0) != RESET)//lora中断
  208. {
  209. pos_info.pos1_count++;
  210. // pos_info.pos1_timecount = TickCounter;
  211. if(pos_info.pos1_flag == 0)
  212. {
  213. timeout_setValue(&pos_info.pos1_tt,POS1_TIMEOUT_TIME,1);//打开pos口后定时
  214. }
  215. else
  216. {
  217. timeout_setValue(&pos_info.pos1_off,POS1_TIMEOUT_TIME,1);//打开pos口后定时
  218. }
  219. EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位
  220. }
  221. }
  222. void EXTI1_IRQHandler(void){
  223. if(EXTI_GetITStatus(EXTI_Line1) != RESET)//lora中断
  224. {
  225. pos_info.pos2_count++;
  226. // pos_info.pos2_timecount = TickCounter;
  227. if(pos_info.pos2_flag == 0)
  228. {
  229. timeout_setValue(&pos_info.pos2_tt,POS2_TIMEOUT_TIME,1);
  230. }
  231. else
  232. {
  233. timeout_setValue(&pos_info.pos2_off,POS2_TIMEOUT_TIME,1);//打开pos口后定时
  234. }
  235. EXTI_ClearITPendingBit(EXTI_Line1);//清除中断标志位
  236. }
  237. }
  238. //pos初始化
  239. void pos_init(void)
  240. {
  241. pos_gpio_init();
  242. memset(&pos_info,0,sizeof(pos_info));
  243. }
  244. //pos关闭时开关切换
  245. void pos_off_handle(uint8_t num)
  246. {
  247. tax_ch_sw(PLAINTEXT,num);
  248. }
  249. //pos机切换
  250. void pos_changle(void)
  251. {
  252. if(pos_info.pos1_count > POS_SIGNAL_NUM)
  253. {
  254. if(pos_info.pos1_flag == 0)
  255. {
  256. pos_info.pos1_flag = 1;
  257. timeout_stop(&pos_info.pos1_tt);
  258. timeout_setValue(&pos_info.pos1_off,POS1_TIMEOUT_TIME,1);
  259. tax_ch_sw(POS,1);
  260. printf("pos1 on\n");
  261. pos_change.pos1_num++;
  262. AT24CXX_Write(POS_CHANGE_ADDR,(uint8_t *)&pos_change,8);
  263. printf("pos1 num:%d\n",pos_change.pos1_num);
  264. }
  265. }
  266. if(pos_info.pos2_count > POS_SIGNAL_NUM)
  267. {
  268. if(pos_info.pos2_flag == 0)
  269. {
  270. pos_info.pos2_flag = 1;
  271. timeout_stop(&pos_info.pos2_tt);
  272. timeout_setValue(&pos_info.pos2_off,POS2_TIMEOUT_TIME,1);
  273. tax_ch_sw(POS,2);
  274. printf("pos2 on\n");
  275. pos_change.pos2_num++;
  276. AT24CXX_Write(POS_CHANGE_ADDR,(uint8_t *)&pos_change,8);
  277. printf("pos2 num:%d\n",pos_change.pos2_num);
  278. }
  279. }
  280. if(pos_info.pos1_flag)
  281. {
  282. if(timeout_isOut(&pos_info.pos1_off))
  283. {
  284. pos_info.pos1_count = 0;
  285. pos_info.pos1_flag = 0;
  286. pos_off_handle(1);
  287. printf("this is pos1 off\n");
  288. }
  289. }
  290. if(pos_info.pos2_flag)
  291. {
  292. if(timeout_isOut(&pos_info.pos2_off))
  293. {
  294. pos_info.pos2_count = 0;
  295. pos_info.pos2_flag = 0;
  296. pos_off_handle(2);
  297. printf("this is pos2 off\n");
  298. }
  299. }
  300. //如果产生pos信号后1分钟,还没有达到切换pos条件,则清除pos口计数
  301. if(timeout_isOut(&pos_info.pos1_tt))
  302. {
  303. pos_info.pos1_count = 0;
  304. }
  305. if(timeout_isOut(&pos_info.pos2_tt))
  306. {
  307. pos_info.pos2_count = 0;
  308. }
  309. }