mba32a.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. #include "mba32a.h"
  2. #include "main.h"
  3. #include "interface.h"
  4. #include "usart.h"
  5. extern UART_HandleTypeDef huart1;
  6. extern UART_HandleTypeDef huart2;
  7. extern UART_HandleTypeDef huart3;
  8. extern UART_HandleTypeDef huart4;
  9. extern UART_HandleTypeDef huart5;
  10. extern Menu_table menu;
  11. extern unsigned char NOSETLOCK[];
  12. bool resetMBA32A = false; //模块重启标志位
  13. bool resetFlag = false; //复位标志位
  14. bool BT_CONN =false;
  15. bool REBOOT =false; //已绑定后重启
  16. extern bool bd_flag; //已绑定标志位
  17. extern bool startdtu;
  18. extern bool refresh;
  19. extern bool sealFlag ;
  20. extern bool open_flagw;
  21. extern bool close_flagw;
  22. uint8_t g_MBA32A_8buf[1024]={0};
  23. uint8_t g_MBA32A_8buf_Down[1024] ={0} ;
  24. uint8_t step_BT=0;
  25. uint16_t bt_dataLength=0; //bt接收有效数据长度
  26. uint8_t bt_error_num=0; //bt接收的错误事件
  27. uint32_t bt_serial_num=0; //bt接收的流水号
  28. uint8_t bt_battery=0; //bt剩余电量百分比
  29. uint8_t bt_log_num=0; //bt记录事件数量
  30. uint8_t bt_lock_machinesta=0; //bt锁(电机)状态(0x00开;0x01关;0x02异常)
  31. uint8_t bt_lock_ropesta=0; //bt锁(锁绳)状态(0x00插入;0x01拔出)
  32. uint16_t bt_hwver=0; //bt硬件版本号
  33. uint16_t bt_sfver=0; //bt软件版本号
  34. /**
  35. * @brief 问询设备定义
  36. */
  37. char dev[]="+DEV:\r\n";
  38. //char __dev[]="+DEV:0,1500000000CB";
  39. char __dev[]="+DEV:0,101000000003";
  40. char _BT_CONN[]="AT+CONN=101000000003\r\n";
  41. char _BT_CONN_TO[]="+CONNECT TIMEOUT";
  42. char _DIS_CONN[]="AT+DISCONN=0\r\n";
  43. //char Connected[]="+CONNECTED:0,1500000000CB";
  44. //char DisConnected[]="+DISCONN:0,1500000000CB";
  45. char Connected[]="+CONNECTED:0,101000000003";
  46. char DisConnected[]="+DISCONN:0,101000000003";
  47. //char Connected_phone[]="+CONNECTED:1,56A27D34A53F\r\n";
  48. char s_DEV[]="AT+DEV?\r\n";
  49. char _s_DEV[]="+DEV:\r\n";
  50. char s_sService[]="AT+UUIDS?\r\n";
  51. char _s_sService_default[]="+UUIDS:FFF0";
  52. char s_wService[]="AT+UUIDW?\r\n";
  53. char _s_wService_default[]="+UUIDW:FFF2";
  54. char s_nService[]="AT+UUIDN?\r\n";
  55. char _s_nService_default[]="+UUIDN:FFF1";
  56. //char s_sService_SET[]="AT+UUIDS=0000fff000001000800000805f9b34fb\r\n";
  57. //char s_wService_SET[]="AT+UUIDW=0000ff0500001000800000805f9b34fb\r\n";
  58. //char s_nService_SET[]="AT+UUIDN=0000ff0400001000800000805f9b34fb\r\n";
  59. char s_sService_SET[]="AT+UUIDS=0002\r\n";
  60. char s_wService_SET[]="AT+UUIDW=FFF5\r\n";
  61. char s_nService_SET[]="AT+UUIDN=FF04\r\n";
  62. //char _s_sService_SET[]="+UUIDS:0000000200001000800000805F9B34FB";//设置主服务
  63. //char _s_wService_SET[]="+UUIDW:0000FFF500001000800000805F9B34FB";//设置写服务
  64. //char _s_nService_SET[]="+UUIDN:0000FF0400001000800000805F9B34FB";//设置读服务
  65. char _s_sService_SET[]="+UUIDS:0002";//设置主服务
  66. char _s_wService_SET[]="+UUIDW:FFF5";//设置写服务
  67. char _s_nService_SET[]="+UUIDN:FF04";//设置读服务
  68. char autocfgmac[]="AT+AUTO_MAC=101000000003\r\n";
  69. char broadcast[]="AT+ADV=1\r\n";//广播
  70. char broadcast_interval[]="AT+AINTVL=100\r\n";//广播间隔
  71. char txpower[]="AT+TXPOWER=2\r\n";//发射功率
  72. char at_OK[]="OK\r\n";
  73. bool connected = false;
  74. void MBA32A_Init(void)
  75. {
  76. resetMBA32A=false;//freertos监测蓝牙模块重启标志位
  77. REBOOT=true; //初始化开启标志.
  78. #ifdef debugBTInfo
  79. #if debugBTInfo == 1
  80. printf("MBA32A_Init_1\r\n");
  81. menu.sn=NOSETLOCK;//null显示
  82. #endif
  83. #endif
  84. uint16_t resetFlag16 = read_flash_16(resetDevAddr);
  85. if(resetFlag16==0xFFFF)//开机检测(首次启动)
  86. {
  87. if(sendCmd_BT("AT+RESET=1\r\n",at_OK,1,2))
  88. {
  89. Write_Information(resetDevAddr);
  90. printf("复位设备成功\r\n");
  91. resetFlag16 = read_flash_16(resetDevAddr);
  92. if(sendCmd_BT("AT+AUTO_DEL\r\n",at_OK,1,1))
  93. {
  94. printf("删除重连列表\r\n");
  95. }
  96. if(sendCmd_BT(broadcast_interval,at_OK,1,1))
  97. {
  98. printf("广播间隔设置\r\n");
  99. }
  100. if(sendCmd_BT(txpower,at_OK,1,1))
  101. {
  102. printf("发送频率设置\r\n");
  103. }
  104. if(sendCmd_BT(broadcast,at_OK,1,1))
  105. {
  106. printf("设备开启广播\r\n");
  107. }
  108. if(sendCmd_BT("AT+DISCONN=0\r\n",at_OK,1,1))
  109. {
  110. printf("取消连接所有设备\r\n");
  111. }
  112. if(sendCmd_BT("AT+DISCONN=1\r\n",at_OK,1,1))
  113. {
  114. printf("取消连接所有主机端设备\r\n");
  115. }
  116. }
  117. else
  118. {
  119. printf("复位失败\r\n");
  120. resetFlag=false;
  121. }
  122. }
  123. else if(resetFlag16==0xAAAA)//开机检测(大于1次启动)
  124. {
  125. printf("无需复位设备\r\n");
  126. resetFlag=true;
  127. //REBOOT=true;
  128. }
  129. switch(step_BT)
  130. {
  131. case 0:
  132. {
  133. if(sendCmd_BT(s_DEV,_s_DEV,1,2)) //(at+dev? +DEV:) 未连接设备
  134. {
  135. printf("未连接设备\r\n");
  136. if(sendCmd_BT("AT+AUTO_CFG=1\r\n",at_OK,1,1)) //设置自动重连
  137. {
  138. printf("开启自动重连1\r\n");
  139. }
  140. step_BT++;
  141. }
  142. else if(sendCmd_BT(s_DEV,__dev,1,2)) //(at+dev? +DEV:1010***03)已连接设备
  143. {
  144. bd_flag=true;
  145. printf("连接绑定成功!");
  146. if(sendCmd_BT("AT+AUTO_CFG=1\r\n",at_OK,1,1)) //开启自动重连
  147. {
  148. printf("开启自动重连2\r\n");
  149. startdtu=false; //关闭开始界面
  150. refresh=true; //刷新屏幕
  151. }
  152. else if(resetFlag16==0xAAAA) //连接后判定,非第一次启动!
  153. {
  154. startdtu=false; //关闭开始界面
  155. refresh=true; //刷新屏幕
  156. connected=true; //断掉后方进程
  157. resetFlag=true; //已进行过复位,说明已经绑定
  158. //REBOOT=true;
  159. //BT_CONN=true;
  160. //直接显示连接设备
  161. printf("设备加载成功\r\n");
  162. }
  163. // else if(sendCmd_BT(autocfgmac,at_OK,1,1)) //开启自动重连
  164. // {
  165. // printf("自动重连已设置1\r\n");
  166. // }
  167. break;
  168. }
  169. else
  170. {
  171. if(sendCmd_BT(_BT_CONN,Connected,5,3)) //(at+conn“mac”)自动重新连mac
  172. {
  173. printf("连接成功!");
  174. if(sendCmd_BT(autocfgmac,at_OK,1,1)) //自动重连
  175. {
  176. printf("开启自动重连3\r\n");
  177. // if(read_flash_16(resetDevAddr)==0xAAAA)
  178. // {
  179. startdtu=false; //关闭开始界面
  180. refresh=true; //刷新屏幕
  181. resetFlag=true; //freertos监测位
  182. REBOOT=true; //freertos监测位
  183. printf("设备加载成功\r\n");
  184. // }
  185. }
  186. break;
  187. }
  188. // MBA32AReset();
  189. //已设置其他设置
  190. // USART_SendString(&huart5, "AT+DISCONN=0\r\n");
  191. // USART_SendString(&huart5, "AT+RESET=1\r\n");
  192. // MBA32AReset();
  193. break;
  194. }
  195. }
  196. case 1:
  197. {
  198. if(!connected)//断进程标志位
  199. {
  200. if(sendCmd_BT(s_sService,_s_sService_default,1,1))//蓝牙芯片默认值,需要修改
  201. {
  202. //设置主服务
  203. if(sendCmd_BT(s_sService_SET,at_OK,1,1))
  204. {
  205. printf("查询并设置主服务成功\n");
  206. step_BT++;
  207. }
  208. }
  209. else if(sendCmd_BT(s_sService,_s_sService_SET,1,1))
  210. {
  211. printf("主服务不是默认值,但符合设置项\n");
  212. step_BT++;
  213. }
  214. else
  215. { //ERROR 其他值
  216. MBA32AReset();
  217. break;
  218. }
  219. }
  220. }
  221. case 2:
  222. {
  223. if(!connected)//断进程标志位
  224. {
  225. if(sendCmd_BT(s_wService,_s_wService_default,1,1))
  226. {//蓝牙芯片默认值,需要修改
  227. //设置写服务
  228. if(sendCmd_BT(s_wService_SET,at_OK,1,1))
  229. {
  230. printf("查询并设置写服务成功\n");
  231. step_BT++;
  232. }
  233. }
  234. else if(sendCmd_BT(s_wService,_s_wService_SET,1,1))
  235. {
  236. printf("写服务不是默认值,但符合设置项\n");
  237. step_BT++;
  238. }
  239. else
  240. {
  241. //ERROR 其他值
  242. MBA32AReset();
  243. break;
  244. }
  245. }
  246. }
  247. case 3:
  248. {
  249. if(!connected)//断进程标志位
  250. {
  251. if(sendCmd_BT(s_nService,_s_nService_default,1,1))//蓝牙芯片默认值,需要修改
  252. {
  253. //设置主服务
  254. if(sendCmd_BT(s_nService_SET,at_OK,1,1))
  255. {
  256. printf("查询并设置读服务成功\n");
  257. step_BT++;
  258. }
  259. }
  260. else if(sendCmd_BT(s_nService,_s_nService_SET,1,1))
  261. {
  262. printf("读服务不是默认值,但符合设置项\n");
  263. step_BT++;
  264. }
  265. else
  266. {
  267. //ERROR 其他值
  268. MBA32AReset();
  269. break;
  270. }
  271. }
  272. }
  273. case 4:
  274. {
  275. if(!connected)//断进程标志位
  276. {
  277. if(sendCmd_BT(_BT_CONN,Connected,5,3))
  278. {
  279. printf("连接成功!");
  280. if(sendCmd_BT(autocfgmac,at_OK,1,1))
  281. {
  282. printf("自动重连已设置3\r\n");
  283. // if(read_flash_16(resetDevAddr)==0xAAAA)
  284. // {
  285. startdtu=false; //关闭开始界面
  286. refresh=true; //刷新屏幕
  287. printf("设备加载成功\r\n");
  288. resetFlag=true;
  289. step_BT++;
  290. // }
  291. }
  292. break;
  293. }
  294. else if(sendCmd_BT(_BT_CONN,_BT_CONN_TO,1,1))
  295. {
  296. printf("连接超时!");
  297. startdtu=false; //取消启动欢迎进入工作界面
  298. refresh=true;
  299. MBA32AReset(); //后台复位
  300. break;
  301. //MBA32AReset();
  302. }
  303. else
  304. {
  305. printf("连接失败! %s",g_MBA32A_8buf_Down);
  306. MBA32AReset();
  307. break;
  308. //MBA32AReset();
  309. }
  310. }
  311. }
  312. case 5:
  313. {
  314. if(connected)
  315. {
  316. printf("已连接\r\n");
  317. break;
  318. }
  319. }
  320. }
  321. }
  322. void MBA32AReset(void)
  323. {
  324. printf("Bt reset\r\n");
  325. HAL_GPIO_WritePin(REST_BT_GPIO_Port,REST_BT_Pin,GPIO_PIN_RESET);
  326. HAL_Delay(4000);
  327. step_BT=0;
  328. resetMBA32A=true;//freertos监测模块重启位
  329. }
  330. void clearBuf_BT(void)
  331. {
  332. memset(g_MBA32A_8buf,0,sizeof(g_MBA32A_8buf));
  333. memset(g_MBA32A_8buf,0,sizeof(g_MBA32A_8buf_Down));
  334. }
  335. uint8_t sendCmd_BT(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum)
  336. {
  337. uint8_t i = 0;
  338. uint32_t time;
  339. for(i = 0; i < sendNum; i++)
  340. {
  341. time = timeOut * 10;
  342. USART_SendString(&huart5, pCmd);
  343. #ifdef debugBTInfo
  344. #if debugBTInfo == 1
  345. //printf("Send AT >>%s",pCmd);
  346. printf("%s",g_MBA32A_8buf_Down);
  347. #endif
  348. #endif
  349. while(time--)
  350. {
  351. if(strstr((const char *)g_MBA32A_8buf_Down, pRes) != NULL) // 如果检索到关键词
  352. return 1;
  353. HAL_Delay(100);
  354. }
  355. }
  356. return 0;
  357. }
  358. void workinfo(void)
  359. {
  360. if(g_MBA32A_8buf_Down[0]==0x66 && g_MBA32A_8buf_Down[1]==0x00 )//未加密帧头(命令字0x01)
  361. {
  362. if(g_MBA32A_8buf_Down[2]==0x01)
  363. {
  364. bt_dataLength = g_MBA32A_8buf_Down[3];//接收数据长度
  365. bt_error_num = g_MBA32A_8buf_Down[4]; //错误事件数
  366. // 将4个字节存入 bt_serial_num流水号
  367. bt_serial_num |= g_MBA32A_8buf_Down[5]<<24;
  368. bt_serial_num |= g_MBA32A_8buf_Down[6]<<16;
  369. bt_serial_num |= g_MBA32A_8buf_Down[7]<<8;
  370. bt_serial_num |= g_MBA32A_8buf_Down[8];
  371. bt_battery = g_MBA32A_8buf_Down[9]; //电量百分比
  372. bt_log_num = g_MBA32A_8buf_Down[10];//记录型事件
  373. bt_lock_machinesta = g_MBA32A_8buf_Down[11];//电机状态
  374. bt_lock_ropesta = g_MBA32A_8buf_Down[12]; //锁绳状态
  375. bt_hwver |= g_MBA32A_8buf_Down[13]<<8; //硬件版本号
  376. bt_hwver |= g_MBA32A_8buf_Down[14];
  377. bt_sfver |= g_MBA32A_8buf_Down[15]<<8; //软件版本号
  378. bt_sfver |= g_MBA32A_8buf_Down[16];
  379. }
  380. else if((g_MBA32A_8buf_Down[2]==0x03) && (g_MBA32A_8buf_Down[3]==0x01))//施封(关锁)
  381. {
  382. sealFlag=false;//关锁
  383. close_flagw=false;
  384. }
  385. else if((g_MBA32A_8buf_Down[2]==0x02) && (g_MBA32A_8buf_Down[3]==0x01))//解封(开锁)
  386. {
  387. sealFlag=true;//开锁
  388. open_flagw=false;
  389. }
  390. }
  391. }
  392. void lock_searchInfo(void)
  393. {
  394. uint8_t header[2] = {0x66, 0x00};//Jl_lock帧头
  395. uint8_t serchInfo_CMD[] = {0x01, 0x00};//查询信息命令帧
  396. sendCombinedArray(header,sizeof(header),serchInfo_CMD,sizeof(serchInfo_CMD));
  397. HAL_UART_Transmit(&huart3,g_MBA32A_8buf_Down, 20, 0xFFFF);//485回显
  398. memset(g_MBA32A_8buf_Down,0,sizeof(g_MBA32A_8buf_Down));
  399. }
  400. void close_lock(void)
  401. {
  402. uint8_t header[2] = {0x66, 0x00};//Jl_lock帧头
  403. uint8_t close_CMD[] = {0x03, 0x0B};//关锁命令帧
  404. sendCombinedArray(header,sizeof(header),close_CMD,sizeof(close_CMD));
  405. HAL_UART_Transmit(&huart3,g_MBA32A_8buf_Down, 20, 0xFFFF);//TTL回显
  406. memset(g_MBA32A_8buf_Down,0,sizeof(g_MBA32A_8buf_Down));
  407. }
  408. void open_lock(void)
  409. {
  410. uint8_t header[2] = {0x66, 0x00};//Jl_lock帧头
  411. uint8_t close_CMD[] = {0x02, 0x0C};//开锁命令帧
  412. sendCombinedArray(header,sizeof(header),close_CMD,sizeof(close_CMD));
  413. HAL_UART_Transmit(&huart3,g_MBA32A_8buf_Down, 20, 0xFFFF);//TTL回显
  414. memset(g_MBA32A_8buf_Down,0,sizeof(g_MBA32A_8buf_Down));
  415. }