You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

464 lines
17 KiB

2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
1 year ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
2 years ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. #include <math.h>
  2. #include <stdint.h>
  3. #include "aproject_config/config.h"
  4. #include "ify_hrs_protocol/heart_rate_sensor_protocol.h"
  5. #include "zdatachannel_service.h"
  6. //
  7. #include "app_basic_service/device_version_info_mgr.h"
  8. #include "app_basic_service/zapp.h"
  9. #include "app_service/base_hardware/adc_mgr.h"
  10. #include "app_service/base_hardware/hardware_power_mgr.h"
  11. #include "app_service/battery_mgr_service.h"
  12. #include "app_service/beep_ctrl.h"
  13. #include "app_service/display_ctrl_service/display_mgr.h"
  14. #include "app_service/ecg_service/ecg_service.h"
  15. #include "app_service/light_ctrl.h"
  16. #include "zble_module.h"
  17. //
  18. #include "ble_data_processer_utils.h"
  19. #include "nrf_fstorage.h"
  20. #include "nrf_fstorage_sd.h"
  21. /***********************************************************************************************************************
  22. * GLOBAL *
  23. ***********************************************************************************************************************/
  24. static bool m_poweron_flag;
  25. static uint16_t m_capture_prepare_progress = 0;
  26. /*******************************************************************************
  27. * UTILS *
  28. *******************************************************************************/
  29. /***********************************************************************************************************************
  30. * ¼ *
  31. ***********************************************************************************************************************/
  32. static void process_on_connect(void* arg) {
  33. if (zapp_state_machine_now_state() == kstate_standby) {
  34. zapp_state_machine_change_state(kstate_welcomPage);
  35. }
  36. if (m_poweron_flag) {
  37. light_ctrl_set_green_light_effect(kLightEffect_slowFlash);
  38. }
  39. }
  40. static void process_on_disconnect(void* arg) {
  41. if (m_poweron_flag) {
  42. light_ctrl_set_green_light_effect(kLightEffect_quickFlash);
  43. }
  44. }
  45. void on_zble_event(zble_event_t* event) {
  46. if (event->eventType == kzble_event_connected) {
  47. zapp_exec_in_main_context(NULL, process_on_connect, NULL);
  48. } else if (event->eventType == kzble_event_disconnected) {
  49. zapp_exec_in_main_context(NULL, process_on_disconnect, NULL);
  50. }
  51. }
  52. /***********************************************************************************************************************
  53. * Ϣ *
  54. ***********************************************************************************************************************/
  55. void one_conduction_process_rx_packet(uint8_t* rx, int len) {
  56. ify_hrs_packet_t* rxheader = (ify_hrs_packet_t*)rx;
  57. ify_hrs_packet_t* txheader = bletxbuf_get();
  58. ify_hrs_cmd_t cmd = (ify_hrs_cmd_t)rxheader->cmd;
  59. if (len < sizeof(ify_hrs_packet_t)) {
  60. ZLOGI("rx len error:%d", len);
  61. return;
  62. }
  63. bletxbuf_clear();
  64. txheader->cmd = rxheader->cmd;
  65. txheader->frame_index = rxheader->frame_index;
  66. txheader->frame_type = kifyhrs_pt_cmd_receipt;
  67. ZLOGI("rx cmd:%d index:%d datalen:%d", cmd, rxheader->frame_index, len - sizeof(ify_hrs_packet_t));
  68. NRF_LOG_HEXDUMP_INFO(rx, len);
  69. if (cmd == ify_hrs_cmd_read_device_version) {
  70. device_version_info_receipt_t* receipt = (device_version_info_receipt_t*)txheader->data;
  71. uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(device_version_info_receipt_t);
  72. receipt->blestack_version = device_info_read_blestack_version();
  73. receipt->bootloader_version = device_info_read_bootloader_version();
  74. receipt->firmware_version = device_info_read_firmware_version();
  75. receipt->hardware_version = device_info_read_hardware_version();
  76. zdatachannel_data_send2((uint8_t*)txheader, sendlen);
  77. }
  78. else if (cmd == ify_hrs_cmd_read_sensor_info) {
  79. sensor_info_receipt_t* receipt = (sensor_info_receipt_t*)txheader->data;
  80. uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(sensor_info_receipt_t);
  81. receipt->sensor_num = 1;
  82. receipt->sensor_precision = SAMPLE_PRECISION;
  83. receipt->sensor_sample_rate = SAMPLE_RATE / 10;
  84. receipt->sensor0_pos = kifyhrs_sensor_pos_none;
  85. receipt->sensor1_pos = kifyhrs_sensor_pos_none;
  86. receipt->sensor2_pos = kifyhrs_sensor_pos_none;
  87. zdatachannel_data_send2((uint8_t*)txheader, sendlen);
  88. }
  89. else if (cmd == ify_hrs_cmd_read_sn) {
  90. read_sn_receipt_t* receipt = (read_sn_receipt_t*)txheader->data;
  91. uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(read_sn_receipt_t);
  92. device_info_read_sn((sn_t*)&receipt->sn);
  93. zdatachannel_data_send2((uint8_t*)txheader, sendlen);
  94. }
  95. else if (cmd == ify_hrs_cmd_reset) {
  96. NVIC_SystemReset();
  97. }
  98. else if (cmd == ify_hrs_cmd_read_time) {
  99. read_time_receipt_t* receipt = (read_time_receipt_t*)txheader->data;
  100. uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(read_time_receipt_t);
  101. static ztm_t ztm;
  102. znordic_rtc_gettime(&ztm);
  103. receipt->year = (ztm.tm_year + 1900 - 2000);
  104. receipt->month = ztm.tm_mon + 1;
  105. receipt->day = ztm.tm_mday;
  106. receipt->hour = ztm.tm_hour;
  107. receipt->minute = ztm.tm_min;
  108. receipt->second = ztm.tm_sec;
  109. zdatachannel_data_send2((uint8_t*)txheader, sendlen);
  110. }
  111. else if (cmd == ify_hrs_cmd_sync_time) {
  112. sync_time_cmd_t* cmd = (sync_time_cmd_t*)rxheader->data;
  113. uint16_t sendlen = sizeof(ify_hrs_packet_t);
  114. device_info_write_active_flag(true);
  115. znordic_rtc_settime(cmd->year + 2000, cmd->month, cmd->day, cmd->hour, cmd->minute, cmd->second);
  116. zdatachannel_data_send2((uint8_t*)txheader, sendlen);
  117. }
  118. /***********************************************************************************************************************
  119. * ָ *
  120. ***********************************************************************************************************************/
  121. else if (cmd == ify_hrs_cmd_read_device_state) {
  122. device_state_receipt_t* receipt = (device_state_receipt_t*)txheader->data;
  123. uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(device_state_receipt_t);
  124. receipt->drop_state0 = (0);
  125. receipt->drop_state1 = 0x00;
  126. receipt->device_state0.sampling_state = (zapp_state_machine_now_state() == kstate_capture);
  127. receipt->device_state0.report_state = 0;
  128. receipt->device_state0.low_battery = (0 < APP_LOW_BATTERY_WARNING_LIMIT);
  129. receipt->device_state0.full_storge = false;
  130. receipt->device_state1 = 0;
  131. receipt->powerlevel = battery_mgr_service_get_battery_level();
  132. receipt->storage_item_num = 0;
  133. zdatachannel_data_send2((uint8_t*)txheader, sendlen);
  134. }
  135. else if (cmd == ify_hrs_cmd_start_realtime_preview) {
  136. if (zapp_state_machine_now_state() != kstate_mainPage && zapp_state_machine_now_state() != kstate_welcomPage) {
  137. send_error_receipt(rxheader, kifyhrs_ecode_invalid_state);
  138. return;
  139. }
  140. static app_event_t event;
  141. event.eventType = kappevent_start_capture;
  142. zapp_ebus_push_event(&event);
  143. send_success_receipt(rxheader, 0);
  144. }
  145. else if (cmd == ify_hrs_cmd_stop_realtime_preview) {
  146. if (zapp_state_machine_now_state() != kstate_capture) {
  147. send_error_receipt(rxheader, kifyhrs_ecode_invalid_state);
  148. return;
  149. }
  150. static app_event_t event;
  151. event.eventType = kappevent_stop_capture;
  152. zapp_ebus_push_event(&event);
  153. send_success_receipt(rxheader, 0);
  154. }
  155. /***********************************************************************************************************************
  156. * *
  157. ***********************************************************************************************************************/
  158. else if (cmd == ify_hrs_cmd_set_ecg_in_test_mode) {
  159. int32_t testmode = *(int32_t*)rxheader->data;
  160. ecg_service_set_in_test_mode(testmode);
  161. send_success_receipt(rxheader, 0);
  162. }
  163. else if (cmd == ify_hrs_cmd_set_ecg_report_data_in_raw_mode) {
  164. int32_t testmode = *(int32_t*)rxheader->data;
  165. ecg_service_set_report_data_in_raw_mode(testmode);
  166. send_success_receipt(rxheader, 0);
  167. }
  168. else if (cmd == ify_hrs_cmd_ecg_subic_read_reg) {
  169. uint8_t addr = *(uint8_t*)rxheader->data;
  170. uint8_t val = ecg_service_subic_read_reg(addr);
  171. txheader->data[0] = val;
  172. zdatachannel_data_send2((uint8_t*)txheader, sizeof(ify_hrs_packet_t) + 1);
  173. }
  174. else if (cmd == ify_hrs_cmd_ecg_subic_write_reg) {
  175. uint8_t addr = *(uint8_t*)rxheader->data;
  176. uint8_t val = *(uint8_t*)(rxheader->data + 1);
  177. ecg_service_subic_write_reg(addr, val);
  178. send_success_receipt(rxheader, 0);
  179. }
  180. else {
  181. send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support);
  182. }
  183. }
  184. /***********************************************************************************************************************
  185. * ¼ *
  186. ***********************************************************************************************************************/
  187. // extern int32_t maxval;
  188. // extern int32_t minval;
  189. // extern int32_t nowval100;
  190. void on_zapp_ebus_event(void* p_event_data, uint16_t event_size) {
  191. if (!p_event_data) return;
  192. app_event_t* p_event = (app_event_t*)p_event_data;
  193. if (p_event->eventType == kappevent_tmr_1s_scheduler_event) {
  194. // ZLOGI("tmr event. %d %d %d", nowval100, minval, maxval);
  195. // ZLOGI("tmr event.");
  196. }
  197. app_event_type_t event = p_event->eventType;
  198. if (zapp_state_machine_now_state() == kstate_standby) {
  199. /**
  200. * @brief
  201. * 1. л״̬
  202. */
  203. if (event == kappevent_state_machine_state_enter) {
  204. /**
  205. * @brief ػ
  206. */
  207. ZLOGI("power off");
  208. dsp_mgr_change_page(kpage_poweroff);
  209. battery_mgr_service_change_state_to_standy();
  210. beep_unload();
  211. light_ctrl_unload();
  212. dsp_mgr_unload();
  213. ecg_service_unload();
  214. // battery_mgr_service_change_state_to_standy();
  215. hardware_power_mgr_main_power_supply_set(false);
  216. m_poweron_flag = false;
  217. } else if (event == kappevent_state_machine_state_exit) {
  218. /**
  219. * @brief
  220. */
  221. ZLOGI("power on");
  222. hardware_power_mgr_main_power_supply_set(true);
  223. battery_mgr_service_change_state_to_poweron();
  224. beep_load();
  225. light_ctrl_load();
  226. dsp_mgr_load();
  227. ecg_service_load();
  228. m_poweron_flag = true;
  229. if (zble_module_is_connected()) {
  230. light_ctrl_set_green_light_effect(kLightEffect_slowFlash);
  231. }
  232. } else {
  233. if (p_event->eventType == kappevent_battery_start_charge) {
  234. zapp_state_machine_change_state(kstate_charging);
  235. } else if (!device_info_get_active_flag() && zapp_state_machine_haspassed_ms() >= 60000) {
  236. ZLOGI_BLOCK("rtc not setted, power system off");
  237. ZERROR_CHECK(sd_power_system_off());
  238. }
  239. }
  240. } else if (zapp_state_machine_now_state() == kstate_welcomPage) {
  241. /**
  242. * @brief
  243. * ӳ1.5sлҳ
  244. */
  245. if (event == kappevent_state_machine_state_enter) {
  246. dsp_mgr_change_page(kpage_welcome);
  247. } else if (event == kappevent_state_machine_state_exit) {
  248. } else {
  249. if (p_event->eventType == kappevent_start_capture) {
  250. zapp_state_machine_change_state(kstate_prepare_capture);
  251. } else if (zapp_state_machine_haspassed_ms() >= 2000) {
  252. zapp_state_machine_change_state(kstate_mainPage);
  253. beep_set_effect(POWER_ON_EFFECT);
  254. }
  255. }
  256. } else if (zapp_state_machine_now_state() == kstate_mainPage) {
  257. /**
  258. * @brief
  259. * 1. Ͽ->лػ״̬
  260. * 2. ʼɼָ->лɼ״̬
  261. * 3. ¼->л״̬
  262. *
  263. */
  264. if (event == kappevent_state_machine_state_enter) {
  265. dsp_mgr_change_page(kpage_main);
  266. } else if (event == kappevent_state_machine_state_exit) {
  267. } else {
  268. if (zble_module_has_disconnected_ms() >= 3000) {
  269. zapp_state_machine_change_state(kstate_standby);
  270. } else if (event == kappevent_start_capture) {
  271. zapp_state_machine_change_state(kstate_prepare_capture);
  272. } else if (event == kappevent_battery_start_charge) {
  273. zapp_state_machine_change_state(kstate_charging);
  274. }
  275. }
  276. } else if (zapp_state_machine_now_state() == kstate_prepare_capture) {
  277. /**
  278. * @brief
  279. * 1. ֹͣɼָ->лMainPage
  280. * 2. Ͽ ->лػ״̬
  281. * 3. leadoff״̬
  282. */
  283. if (event == kappevent_state_machine_state_enter) {
  284. m_capture_prepare_progress = 0;
  285. dsp_mgr_change_page(kpage_sample_prepare);
  286. ecg_service_start_capture();
  287. beep_set_effect(START_SAMPLE_EFFECT);
  288. } else if (event == kappevent_state_machine_state_exit) {
  289. } else {
  290. if (zble_module_has_disconnected_ms() >= 5000) {
  291. ecg_service_stop_capture();
  292. zapp_state_machine_change_state(kstate_standby);
  293. } else if (event == kappevent_stop_capture) {
  294. ecg_service_stop_capture();
  295. zapp_state_machine_change_state(kstate_mainPage);
  296. } else {
  297. if (event == kappevent_tmr_1s_scheduler_event) {
  298. if (!ecg_leadoff_detect() && zapp_state_machine_haspassed_ms() > 1500) {
  299. m_capture_prepare_progress++;
  300. if (m_capture_prepare_progress < 4) {
  301. dsp_mgr_page_sample_prepare_set_progress(m_capture_prepare_progress);
  302. } else {
  303. /**
  304. * @brief ʼɼ
  305. */
  306. zapp_state_machine_change_state(kstate_capture);
  307. beep_set_effect(POWER_ON_EFFECT);
  308. }
  309. } else {
  310. m_capture_prepare_progress = 0;
  311. dsp_mgr_page_sample_prepare_set_progress(m_capture_prepare_progress);
  312. }
  313. }
  314. }
  315. }
  316. } else if (zapp_state_machine_now_state() == kstate_capture) {
  317. /**
  318. * @brief
  319. * 1. ֹͣɼָ->лMainPage
  320. * 2. Ͽ ->лػ״̬
  321. */
  322. if (event == kappevent_state_machine_state_enter) {
  323. ecg_service_start_capture();
  324. dsp_mgr_change_page(kpage_sampling);
  325. } else if (event == kappevent_state_machine_state_exit) {
  326. ecg_service_stop_capture();
  327. beep_set_effect(STOP_SAMPLE_EFFECT);
  328. } else {
  329. if (zble_module_has_disconnected_ms() >= 1000) {
  330. zapp_state_machine_change_state(kstate_standby);
  331. } else if (event == kappevent_stop_capture) {
  332. zapp_state_machine_change_state(kstate_mainPage);
  333. } else if (event == kecg_data_report_event) {
  334. report_ecg_data(p_event);
  335. }
  336. }
  337. } else if (zapp_state_machine_now_state() == kstate_charging) {
  338. /**
  339. * @brief
  340. * 1. ¼->л
  341. */
  342. if (event == kappevent_state_machine_state_enter) {
  343. dsp_mgr_change_page(kpage_charging_page);
  344. } else if (event == kappevent_state_machine_state_exit) {
  345. } else {
  346. if (event == kappevent_battery_end_charge) {
  347. if (!zble_module_is_connected()) {
  348. zapp_state_machine_change_state(kstate_standby);
  349. } else {
  350. zapp_state_machine_change_state(kstate_mainPage);
  351. }
  352. }
  353. }
  354. } else if (zapp_state_machine_now_state() == kstate_test) {
  355. // extern int32_t maxval;
  356. // extern int32_t minval;
  357. extern uint8_t m_leadoff_raw_state;
  358. ZLOGI("tmr event. %d %x", ecg_leadoff_detect(), m_leadoff_raw_state);
  359. }
  360. }
  361. /***********************************************************************************************************************
  362. * ״̬л *
  363. ***********************************************************************************************************************/
  364. void on_state_change(state_machine_event_t event, device_state_t state) {
  365. /**
  366. * @brief ״̬˳
  367. */
  368. static app_event_t appevent;
  369. if (event == kstate_event_enter) {
  370. appevent.eventType = kappevent_state_machine_state_enter;
  371. on_zapp_ebus_event(&appevent, sizeof(app_event_t));
  372. } else {
  373. appevent.eventType = kappevent_state_machine_state_exit;
  374. on_zapp_ebus_event(&appevent, sizeof(app_event_t));
  375. }
  376. }
  377. void one_conduction_main() {
  378. device_info_init();
  379. sn_t sn;
  380. device_info_read_sn(&sn);
  381. ZLOGI("one_conduction_main %s active:%d", sn.sn, device_info_get_active_flag());
  382. ZLOG_FLUSH();
  383. zapp_ebus_reg_event_listener(on_zapp_ebus_event);
  384. zapp_state_machine_reg_state_change_listener(on_state_change);
  385. zble_module_reglistener(on_zble_event);
  386. adc_mgr_init();
  387. hardware_power_mgr_init();
  388. battery_mgr_service_init();
  389. battery_mgr_service_load();
  390. light_ctrl_init();
  391. beep_init();
  392. dsp_mgr_init();
  393. ecg_service_init();
  394. // zapp_state_machine_change_state(kstate_prepare_capture);
  395. zble_module_start_adv();
  396. zapp_start_schedule();
  397. }