ble_action.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. #include "ble_action.h"
  2. #include "_string.h"
  3. #include "transcode.h"
  4. #include "debug.h"
  5. #include "tools.h"
  6. #include "user_config.h"
  7. #include "user_elect.h"
  8. #include "user_charge.h"
  9. static void ble_action_set_rst(void);
  10. /* Flash data temporary storage */
  11. __attribute__((aligned(8))) uint8_t block_buf[256];
  12. /*********************************************************************
  13. * @fn Jump_OTA
  14. *
  15. * @brief Jump to OTA upgrade
  16. *
  17. * @return none
  18. */
  19. void Jump_OTA(void)
  20. {
  21. uint16_t i;
  22. uint32_t ver_flag;
  23. /* Read the first block */
  24. FLASH_read(OTA_DATAFLASH_ADDR, (uint8_t *)&block_buf[0], 4);
  25. FLASH_Unlock_Fast();
  26. /* Erase the first block */
  27. FLASH_ErasePage_Fast( OTA_DATAFLASH_ADDR );
  28. /* Update Image information */
  29. block_buf[0] = IMAGE_OTA_FLAG;
  30. block_buf[1] = IMAGE_FLAG_1;
  31. block_buf[2] = IMAGE_FLAG_2;
  32. block_buf[3] = IMAGE_FLAG_3;
  33. /* Programming DataFlash */
  34. FLASH_ProgramPage_Fast(OTA_DATAFLASH_ADDR, (uint32_t *)&block_buf[0]);
  35. FLASH_Lock_Fast();
  36. ble_action_set_rst();
  37. }
  38. static upload_ble_data_func upload_ble_data = NULL;
  39. static ble_data_s last_test_data;
  40. static bool ble_connected = false;
  41. static uint32_t token = 0;
  42. static uint32_t unixTime_delay = 0;
  43. static uint32_t unixTime = 0;
  44. static void unixTime_pro(void)
  45. {
  46. if(unixTime_delay > 0)
  47. {
  48. unixTime_delay--;
  49. }
  50. else{
  51. unixTime_delay = 1000 / BLE_ACTION_TICKS;
  52. unixTime++;
  53. }
  54. }
  55. uint32_t * get_unixTime(void)
  56. {
  57. return &(unixTime);
  58. }
  59. void set_unixTime(uint32_t value)
  60. {
  61. unixTime = value;
  62. }
  63. static void ble_owned_data_send(uint8_t *data, int len)
  64. {
  65. if(upload_ble_data != NULL)
  66. {
  67. upload_ble_data(data, len);
  68. }
  69. }
  70. static void ble_Return_Stat_Send(bool stat)
  71. {
  72. uint8_t data[4]={0};
  73. if(stat == true)
  74. {
  75. data[0]='O';
  76. data[1]='K';
  77. data[2]=0;
  78. data[3]=0;
  79. }
  80. else{
  81. data[0]='N';
  82. data[1]='O';
  83. data[2]='K';
  84. data[3]=0;
  85. }
  86. ble_owned_data_send(data,4);
  87. }
  88. static void Set_Ble_Encrypt_Data(uint8_t *data,uint8_t len)
  89. {
  90. int pCipher_len = 0;
  91. PRINT("ble upload\n");
  92. uint8_t *paradata = device_encrypt(MacAddr,(ble_connected == true)?token:0,data,len,&pCipher_len);
  93. ble_owned_data_send(paradata,pCipher_len);
  94. free(paradata);
  95. }
  96. static bool Set_ble_data_s_sendData(ble_data_s *ble_data)
  97. {
  98. uint8_t data[64]={0};
  99. if(ble_data->len >= 55)
  100. {
  101. return false;
  102. }
  103. data[0] = ble_data->ins;
  104. data[1] = ble_data->data_type;
  105. data[2] = ble_data->len + 1;
  106. data[3] = ble_data->cmd;
  107. memcpy(&data[4], ble_data->data, ble_data->len);
  108. memcpy(&data[4 + ble_data->len], get_unixTime(), 4);
  109. memcpy(&data[8 + ble_data->len], &token, 4);
  110. #if AES_ENABLE == 1
  111. Set_Ble_Encrypt_Data(data, ble_data->len + 12);
  112. #else
  113. ble_owned_data_send(data, ble_data->len + 12);
  114. #endif
  115. return true;
  116. }
  117. static void set_token(void)
  118. {
  119. token = Get_Rand();
  120. token = get_gb_token(token);
  121. }
  122. void ble_connect_act(bool stat)
  123. {
  124. if(stat == false)
  125. {
  126. set_token();
  127. ble_connected = false;
  128. // action_work.ble_conn_stat = false;
  129. // net_led_stat_pro(NET_LED_DISCONNECT);
  130. }
  131. else{
  132. // upgrade_succ();
  133. // net_led_stat_pro(NET_LED_CONNECT);
  134. }
  135. }
  136. static bool Get_Token_Act(ble_data_s *test_data)
  137. {
  138. if(test_data->len!=0x05 || test_data->data[0]!=0x00)
  139. {
  140. return false;
  141. }
  142. uint32_t unixtime = 0;
  143. memcpy(&unixtime, &(test_data->data[1]), 4);
  144. set_unixTime(unixtime);
  145. uint8_t data[16]={0};
  146. data[0]=INS_TOKEN;
  147. data[1]=BLE_UPLOAD_SLAVE;
  148. data[2]=0x04;
  149. memcpy(&data[3],&token,4);
  150. memcpy(&data[7],get_unixTime(),4);
  151. memcpy(&data[11],&token,4);
  152. #if AES_ENABLE == 1
  153. Set_Ble_Encrypt_Data(data,15);
  154. #else
  155. ble_owned_data_send(data, 15);
  156. #endif
  157. ble_connected = true;
  158. // action_work.ble_conn_stat = true;
  159. return true;
  160. }
  161. static bool Check_UnixTime_Token(uint8_t *data)
  162. {
  163. uint32_t master_token;
  164. uint32_t unixtime = 0;
  165. memcpy(&unixtime, data, 4);
  166. set_unixTime(unixtime);
  167. memcpy(&master_token, &data[4], 4);
  168. if(master_token!=token)
  169. {
  170. return false;
  171. }
  172. return true;
  173. }
  174. static void ble_devRst_set_stat_send(bool stat)
  175. {
  176. ble_data_s ble_data;
  177. ble_data.data_type = BLE_UPLOAD_SLAVE;
  178. ble_data.ins = INS_PARAM_SET;
  179. ble_data.len = 1;
  180. uint8_t data[1] = {0};
  181. ble_data.cmd = PARAM_SET_RST;
  182. data[0] = (stat == true)?SET_PARAM_SUCCESS:SET_PARAM_FAILURE;
  183. ble_data.data = data;
  184. Set_ble_data_s_sendData(&ble_data);
  185. }
  186. static bool DevRst_Set_Act(uint8_t *data)
  187. {
  188. if(*data == 0xEE)
  189. {
  190. ble_devRst_set_stat_send(true);
  191. return true;
  192. }
  193. ble_devRst_set_stat_send(false);
  194. return false;
  195. }
  196. static bool Set_Param_Set_Act(ble_data_s *test_data)
  197. {
  198. bool stat = false;
  199. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  200. {
  201. return false;
  202. }
  203. switch(test_data->data[0])
  204. {
  205. case PARAM_SET_CAN:break;
  206. case PARAM_SET_RST: stat = DevRst_Set_Act(&(test_data->data[1]));break; //设备重启
  207. default:return false;
  208. }
  209. return stat;
  210. }
  211. static bool Get_Param_Set_Act(ble_data_s *test_data)
  212. {
  213. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  214. {
  215. return false;
  216. }
  217. switch(test_data->data[0])
  218. {
  219. case PARAM_GET_CAN: break; //CAN参数设置
  220. default:return false;
  221. }
  222. return true;
  223. }
  224. static bool Get_Data_Act(ble_data_s *test_data)
  225. {
  226. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  227. {
  228. return false;
  229. }
  230. switch(test_data->data[0])
  231. {
  232. case DATA_GET_NFC:break; //获取电子钥匙NFC号
  233. default:return false;
  234. }
  235. return true;
  236. }
  237. static bool Control_Data_Act(ble_data_s *test_data)
  238. {
  239. bool stat = false;
  240. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  241. {
  242. return false;
  243. }
  244. switch(test_data->data[0])
  245. {
  246. case CONTROL_LOCK:break; //电磁锁控制
  247. default:return false;
  248. }
  249. return stat;
  250. }
  251. static bool Get_Firmware_Act(uint8_t *test_data)
  252. {
  253. if(*test_data != 0x01)
  254. {
  255. return false;
  256. }
  257. ble_data_s ble_data;
  258. ble_data.data_type = BLE_UPLOAD_SLAVE;
  259. ble_data.ins = INS_FIRMWARE;
  260. ble_data.len = 2;
  261. uint8_t data[2] = {SOFTWARE_VERSION, HARDWARE_VERSION};
  262. ble_data.cmd = FIRMWARE_GET;
  263. ble_data.data = data;
  264. Set_ble_data_s_sendData(&ble_data);
  265. return true;
  266. }
  267. static bool Rst_Firmware_Act(uint8_t *test_data)
  268. {
  269. if(*test_data == 0x01)
  270. {
  271. Jump_OTA();
  272. }
  273. else{
  274. return false;
  275. }
  276. ble_data_s ble_data;
  277. ble_data.data_type = BLE_UPLOAD_SLAVE;
  278. ble_data.ins = INS_FIRMWARE;
  279. ble_data.len = 1;
  280. uint8_t data[1] = {0};
  281. ble_data.cmd = FIRMWARE_RST;
  282. data[0] = *test_data;
  283. ble_data.data = data;
  284. Set_ble_data_s_sendData(&ble_data);
  285. return true;
  286. }
  287. static bool Firmware_Data_Act(ble_data_s *test_data)
  288. {
  289. bool stat = false;
  290. if(false == Check_UnixTime_Token(&test_data->data[test_data->len]))
  291. {
  292. return false;
  293. }
  294. switch(test_data->data[0])
  295. {
  296. case FIRMWARE_GET:stat = Get_Firmware_Act(&(test_data->data[1]));break; //获取固件版本号
  297. case FIRMWARE_RST:stat = Rst_Firmware_Act(&(test_data->data[1]));break; //设备重启
  298. default:return false;
  299. }
  300. return stat;
  301. }
  302. bool download_ble_data_callback(uint8_t *data, int len)
  303. {
  304. if(_strstr((char *)data,"rst=1")==0)
  305. {
  306. PRINT("SOFT RST!\n");
  307. ble_action_set_rst();
  308. ble_Return_Stat_Send(true);
  309. return true;
  310. }
  311. else if(_strstr((char *)data,"ENTER OTA")==0)
  312. {
  313. PRINT("ENTER OTA!\n");
  314. Jump_OTA();
  315. ble_Return_Stat_Send(true);
  316. return true;
  317. }
  318. else if(_strstr((char *)data,"configInit")==0)
  319. {
  320. PRINT("CONFIG INIT!\n");
  321. set_user_config_param_init(&user_config_param);
  322. User_Config_Write_Config();
  323. ble_Return_Stat_Send(true);
  324. return true;
  325. }
  326. else if(_strstr((char *)data, "open=") == 0)
  327. {
  328. int value = -1;
  329. if(1 == sscanf((char *)data, "open=%d", &value))
  330. {
  331. if(value == 0)
  332. {
  333. set_elect_work_stat(LEFT_IDX, true);
  334. }
  335. else if(value == 1)
  336. {
  337. set_elect_work_stat(RIGHT_IDX, true);
  338. }
  339. }
  340. ble_Return_Stat_Send(true);
  341. return true;
  342. }
  343. else if(_strstr((char *)data, "close=") == 0)
  344. {
  345. int value = -1;
  346. if(1 == sscanf((char *)data, "close=%d", &value))
  347. {
  348. if(value == 0)
  349. {
  350. set_elect_work_stat(LEFT_IDX, false);
  351. }
  352. else if(value == 1)
  353. {
  354. set_elect_work_stat(RIGHT_IDX, false);
  355. }
  356. }
  357. ble_Return_Stat_Send(true);
  358. return true;
  359. }
  360. else if(_strstr((char *)data, "charge=") == 0)
  361. {
  362. int value = -1;
  363. int chargestat = -1;
  364. if(2 == sscanf((char *)data, "charge=%d,%d", &value, &chargestat))
  365. {
  366. if(value == 0)
  367. {
  368. if(chargestat == 0)
  369. {
  370. set_user_charge_Queue(CHARGE_QUEUE_LEFT_CLOSE);
  371. }
  372. else if(chargestat == 1)
  373. {
  374. set_user_charge_Queue(CHARGE_QUEUE_LEFT_OPEN);
  375. }
  376. }
  377. else if(value == 1)
  378. {
  379. if(chargestat == 0)
  380. {
  381. set_user_charge_Queue(CHARGE_QUEUE_RIGHT_CLOSE);
  382. }
  383. else if(chargestat == 1)
  384. {
  385. set_user_charge_Queue(CHARGE_QUEUE_RIGHT_OPEN);
  386. }
  387. }
  388. }
  389. ble_Return_Stat_Send(true);
  390. return true;
  391. }
  392. #if AES_ENABLE == 1
  393. uint8_t *paradata = device_decrypt(MacAddr, (ble_connected == true)?token:0, data, len);
  394. PRINT("Decrypt:\n");
  395. print_hex(paradata, len);
  396. #else
  397. uint8_t *paradata = data;
  398. #endif
  399. ble_data_s test_data;
  400. test_data.ins = (ble_dev_ins_e)paradata[0];
  401. test_data.data_type = (ble_dev_data_type_e)paradata[1];
  402. if(test_data.data_type == BLE_UPLOAD_SLAVE)
  403. {
  404. #if AES_ENABLE == 1
  405. free(paradata);
  406. #endif
  407. return false;
  408. }
  409. test_data.len = paradata[2];
  410. test_data.data = &paradata[3];
  411. bool stat = false;
  412. switch(test_data.ins)
  413. {
  414. case INS_TOKEN: stat = Get_Token_Act(&test_data);break; //获取token
  415. case INS_PARAM_SET: stat = Set_Param_Set_Act(&test_data);break; //参数设置指令
  416. case INS_PARAM_GET: stat = Get_Param_Set_Act(&test_data);break; //获取设置参数指令
  417. case INS_DATA_GET: stat = Get_Data_Act(&test_data);break; //获取数据指令
  418. case INS_CONTROL: stat = Control_Data_Act(&test_data);break; //控制指令
  419. case INS_FIRMWARE:stat = Firmware_Data_Act(&test_data);break; //固件获取指令
  420. default:{
  421. #if AES_ENABLE == 1
  422. free(paradata);
  423. #endif
  424. }return false;
  425. }
  426. memcpy((uint8_t *)&last_test_data,(uint8_t *)&test_data,sizeof(ble_data_s));
  427. #if AES_ENABLE == 1
  428. free(paradata);
  429. #endif
  430. // if(stat == true)
  431. // {
  432. // net_led_stat_pro(NET_LED_DATA_OK);
  433. // Set_User_Work_Queue(USER_WORK_QUEUE_ONLINE);
  434. // }
  435. // else{
  436. // net_led_stat_pro(NET_LED_DATA_NOK);
  437. // }
  438. return stat;
  439. }
  440. static void ble_action_set_rst(void)
  441. {
  442. // dev_led_stat_pro(DEV_LED_RST);
  443. // bStatus_t stat = tmos_start_reload_task(action_task_id, (1 << BLE_ACTION_QUEUE_RST), MS1_TO_SYSTEM_TIME(1000));
  444. }
  445. static uint8_t rst_timeout = 5;
  446. static void ble_action_rst_pro(void)
  447. {
  448. if(rst_timeout == 0)
  449. {
  450. /* Software reset */
  451. NVIC_SystemReset();
  452. }
  453. else{
  454. rst_timeout--;
  455. // PRINT("Restart countdown %d second\n", rst_timeout);
  456. }
  457. }
  458. bool download_ble_file_callback(uint8_t *data, int len)
  459. {
  460. return download_ble_data_callback(data, len);
  461. }
  462. void set_upload_ble_data_func(upload_ble_data_func func)
  463. {
  464. upload_ble_data = func;
  465. }