Browse Source

update

master
zhaohe 1 year ago
parent
commit
8f69691284
  1. 3
      .gitmodules
  2. 5
      .vscode/settings.json
  3. 288
      app/app.uvoptx
  4. 132
      app/app.uvprojx
  5. 242
      app/src/app_ble_service.c
  6. 7
      app/src/app_ble_service.h
  7. 23
      app/src/app_event_distribute.c
  8. 15
      app/src/app_event_distribute.h
  9. 0
      app/src/bak/main.bak.c
  10. 16
      app/src/basic/ads1293/ads1293.c
  11. 190
      app/src/basic/heart_rate_sensor_protocol.h
  12. 6
      app/src/board/board.h
  13. 1
      app/src/board/board_battery_state.h
  14. 2
      app/src/board/board_beep_ctrl.c
  15. 7
      app/src/board/board_button.c
  16. 7
      app/src/board/board_button.h
  17. 6
      app/src/board/board_sdcard_driver.c
  18. 18
      app/src/device_ctrl_service.c
  19. 44
      app/src/device_ctrl_service.h
  20. 14
      app/src/device_state.c
  21. 28
      app/src/device_state.h
  22. 27
      app/src/heart_wave_sample_service.c
  23. 5
      app/src/heart_wave_sample_service.h
  24. 23
      app/src/main.c
  25. 1
      app/src/sample_data_manager_service.c
  26. 2
      libznordic

3
.gitmodules

@ -4,3 +4,6 @@
[submodule "libznordic"]
path = libznordic
url = zwsd@192.168.1.3:p_dynamic_electrocardiograph/libznordic.git
[submodule "ify_hrs_protocol"]
path = ify_hrs_protocol
url = zwsd@192.168.1.3:p_dynamic_electrocardiograph/ify_hrs_protocol.git

5
.vscode/settings.json

@ -98,7 +98,10 @@
"app_ble_service.h": "c",
"nrfx_timer.h": "c",
"app_button.h": "c",
"nrf_drv_gpiote.h": "c"
"nrf_drv_gpiote.h": "c",
"device_ctrl_service.h": "c",
"board_battery_state.h": "c",
"board_sdcard_driver.h": "c"
},
"files.encoding": "gbk"
}

288
app/app.uvoptx

@ -410,8 +410,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\board\three_lead_board.c</PathWithFileName>
<FilenameWithoutPath>three_lead_board.c</FilenameWithoutPath>
<PathWithFileName>.\src\app_ble_service.c</PathWithFileName>
<FilenameWithoutPath>app_ble_service.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
@ -422,8 +422,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\libznordic\src\zble_module.c</PathWithFileName>
<FilenameWithoutPath>zble_module.c</FilenameWithoutPath>
<PathWithFileName>.\src\sample_data_manager_service.c</PathWithFileName>
<FilenameWithoutPath>sample_data_manager_service.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
@ -434,8 +434,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\libznordic\src\zdatachannel_service.c</PathWithFileName>
<FilenameWithoutPath>zdatachannel_service.c</FilenameWithoutPath>
<PathWithFileName>.\src\heart_wave_sample_service.c</PathWithFileName>
<FilenameWithoutPath>heart_wave_sample_service.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
@ -446,8 +446,92 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\app_ble_service.c</PathWithFileName>
<FilenameWithoutPath>app_ble_service.c</FilenameWithoutPath>
<PathWithFileName>.\src\device_ctrl_service.c</PathWithFileName>
<FilenameWithoutPath>device_ctrl_service.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>8</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\app_event_distribute.c</PathWithFileName>
<FilenameWithoutPath>app_event_distribute.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\board\board.c</PathWithFileName>
<FilenameWithoutPath>board.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>10</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\board\board_battery_state.c</PathWithFileName>
<FilenameWithoutPath>board_battery_state.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\board\board_beep_ctrl.c</PathWithFileName>
<FilenameWithoutPath>board_beep_ctrl.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>12</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\board\board_button.c</PathWithFileName>
<FilenameWithoutPath>board_button.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\board\board_light_ctrl.c</PathWithFileName>
<FilenameWithoutPath>board_light_ctrl.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\board\board_sdcard_driver.c</PathWithFileName>
<FilenameWithoutPath>board_sdcard_driver.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
@ -461,7 +545,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>8</FileNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -481,7 +565,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>9</FileNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -493,7 +577,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>10</FileNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -513,7 +597,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>11</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -533,7 +617,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>12</FileNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -545,7 +629,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>13</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -557,7 +641,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>14</FileNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -569,7 +653,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>15</FileNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -581,7 +665,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>16</FileNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -593,7 +677,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -605,7 +689,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>18</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -617,7 +701,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>19</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -637,7 +721,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>20</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -657,7 +741,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>21</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -669,7 +753,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>22</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -681,7 +765,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -693,7 +777,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -705,7 +789,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -717,7 +801,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -729,7 +813,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -741,7 +825,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -753,7 +837,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -765,7 +849,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -777,7 +861,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -789,7 +873,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -801,7 +885,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -813,7 +897,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -825,7 +909,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -837,7 +921,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -849,7 +933,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -861,7 +945,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -873,7 +957,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -885,7 +969,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>40</FileNumber>
<FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -905,7 +989,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>41</FileNumber>
<FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -917,7 +1001,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>42</FileNumber>
<FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -929,7 +1013,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>43</FileNumber>
<FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -941,7 +1025,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>44</FileNumber>
<FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -953,7 +1037,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>45</FileNumber>
<FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -965,7 +1049,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>46</FileNumber>
<FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -977,7 +1061,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>47</FileNumber>
<FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -989,7 +1073,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>48</FileNumber>
<FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1001,7 +1085,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>49</FileNumber>
<FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1013,7 +1097,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>50</FileNumber>
<FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1025,7 +1109,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>51</FileNumber>
<FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1037,7 +1121,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>52</FileNumber>
<FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1049,7 +1133,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>53</FileNumber>
<FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1061,7 +1145,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>54</FileNumber>
<FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1073,7 +1157,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>55</FileNumber>
<FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1085,7 +1169,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>56</FileNumber>
<FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1097,7 +1181,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>57</FileNumber>
<FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1109,7 +1193,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>58</FileNumber>
<FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1121,7 +1205,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>59</FileNumber>
<FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1133,7 +1217,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>60</FileNumber>
<FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1145,7 +1229,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>61</FileNumber>
<FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1157,7 +1241,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>62</FileNumber>
<FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1169,7 +1253,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>63</FileNumber>
<FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1181,7 +1265,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>64</FileNumber>
<FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1193,7 +1277,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>65</FileNumber>
<FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1205,7 +1289,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>66</FileNumber>
<FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1217,7 +1301,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>67</FileNumber>
<FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1237,7 +1321,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>68</FileNumber>
<FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1249,7 +1333,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>69</FileNumber>
<FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1261,7 +1345,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>70</FileNumber>
<FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1273,7 +1357,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>71</FileNumber>
<FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1285,7 +1369,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>72</FileNumber>
<FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1297,7 +1381,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>73</FileNumber>
<FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1317,7 +1401,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>74</FileNumber>
<FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1329,7 +1413,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>75</FileNumber>
<FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1341,7 +1425,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>76</FileNumber>
<FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1361,7 +1445,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>77</FileNumber>
<FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1373,7 +1457,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>78</FileNumber>
<FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1385,7 +1469,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>79</FileNumber>
<FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1399,13 +1483,13 @@
<Group>
<GroupName>libznordic</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>80</FileNumber>
<FileNumber>87</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1415,6 +1499,42 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>88</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\libznordic\src\zble_module.c</PathWithFileName>
<FilenameWithoutPath>zble_module.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>89</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\libznordic\src\zdatachannel_service.c</PathWithFileName>
<FilenameWithoutPath>zdatachannel_service.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>90</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\libznordic\src\znordic_device_info_mgr.c</PathWithFileName>
<FilenameWithoutPath>znordic_device_info_mgr.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -1425,7 +1545,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>81</FileNumber>
<FileNumber>91</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1437,7 +1557,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>82</FileNumber>
<FileNumber>92</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

132
app/app.uvprojx

@ -399,24 +399,59 @@
<FilePath>.\src\main.c</FilePath>
</File>
<File>
<FileName>three_lead_board.c</FileName>
<FileName>app_ble_service.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\three_lead_board.c</FilePath>
<FilePath>.\src\app_ble_service.c</FilePath>
</File>
<File>
<FileName>zble_module.c</FileName>
<FileName>sample_data_manager_service.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\zble_module.c</FilePath>
<FilePath>.\src\sample_data_manager_service.c</FilePath>
</File>
<File>
<FileName>zdatachannel_service.c</FileName>
<FileName>heart_wave_sample_service.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\zdatachannel_service.c</FilePath>
<FilePath>.\src\heart_wave_sample_service.c</FilePath>
</File>
<File>
<FileName>app_ble_service.c</FileName>
<FileName>device_ctrl_service.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\app_ble_service.c</FilePath>
<FilePath>.\src\device_ctrl_service.c</FilePath>
</File>
<File>
<FileName>app_event_distribute.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\app_event_distribute.c</FilePath>
</File>
<File>
<FileName>board.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board.c</FilePath>
</File>
<File>
<FileName>board_battery_state.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_battery_state.c</FilePath>
</File>
<File>
<FileName>board_beep_ctrl.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_beep_ctrl.c</FilePath>
</File>
<File>
<FileName>board_button.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_button.c</FilePath>
</File>
<File>
<FileName>board_light_ctrl.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_light_ctrl.c</FilePath>
</File>
<File>
<FileName>board_sdcard_driver.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_sdcard_driver.c</FilePath>
</File>
</Files>
</Group>
@ -3745,6 +3780,21 @@
<FileType>1</FileType>
<FilePath>..\libznordic\src\znordic.c</FilePath>
</File>
<File>
<FileName>zble_module.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\zble_module.c</FilePath>
</File>
<File>
<FileName>zdatachannel_service.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\zdatachannel_service.c</FilePath>
</File>
<File>
<FileName>znordic_device_info_mgr.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\znordic_device_info_mgr.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -4163,24 +4213,59 @@
<FilePath>.\src\main.c</FilePath>
</File>
<File>
<FileName>three_lead_board.c</FileName>
<FileName>app_ble_service.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\three_lead_board.c</FilePath>
<FilePath>.\src\app_ble_service.c</FilePath>
</File>
<File>
<FileName>zble_module.c</FileName>
<FileName>sample_data_manager_service.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\zble_module.c</FilePath>
<FilePath>.\src\sample_data_manager_service.c</FilePath>
</File>
<File>
<FileName>zdatachannel_service.c</FileName>
<FileName>heart_wave_sample_service.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\zdatachannel_service.c</FilePath>
<FilePath>.\src\heart_wave_sample_service.c</FilePath>
</File>
<File>
<FileName>app_ble_service.c</FileName>
<FileName>device_ctrl_service.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\app_ble_service.c</FilePath>
<FilePath>.\src\device_ctrl_service.c</FilePath>
</File>
<File>
<FileName>app_event_distribute.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\app_event_distribute.c</FilePath>
</File>
<File>
<FileName>board.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board.c</FilePath>
</File>
<File>
<FileName>board_battery_state.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_battery_state.c</FilePath>
</File>
<File>
<FileName>board_beep_ctrl.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_beep_ctrl.c</FilePath>
</File>
<File>
<FileName>board_button.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_button.c</FilePath>
</File>
<File>
<FileName>board_light_ctrl.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_light_ctrl.c</FilePath>
</File>
<File>
<FileName>board_sdcard_driver.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\board_sdcard_driver.c</FilePath>
</File>
</Files>
</Group>
@ -7509,6 +7594,21 @@
<FileType>1</FileType>
<FilePath>..\libznordic\src\znordic.c</FilePath>
</File>
<File>
<FileName>zble_module.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\zble_module.c</FilePath>
</File>
<File>
<FileName>zdatachannel_service.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\zdatachannel_service.c</FilePath>
</File>
<File>
<FileName>znordic_device_info_mgr.c</FileName>
<FileType>1</FileType>
<FilePath>..\libznordic\src\znordic_device_info_mgr.c</FilePath>
</File>
</Files>
</Group>
<Group>

242
app/src/app_ble_service.c

@ -1,14 +1,26 @@
#include "app_ble_service.h"
#include "../../ify_hrs_protocol/heart_rate_sensor_protocol.h"
#include "app_scheduler.h"
#include "board/board.h"
#include "board/board_battery_state.h"
#include "device_ctrl_service.h"
#include "heart_wave_sample_service.h"
#include "sample_data_manager_service.h"
#include "zble_module.h"
#include "zdatachannel_service.h"
#include "znordic.h"
static zdatachannel_init_t zdatachannle_init;
#include "znordic_device_info_mgr.h"
static uint8_t rxbufcache[256];
static bool is_rxbufcache_used = false;
static bool is_rxbufcache_used = false; //
static bool m_realtime_report_state = false; //
static uint8_t m_txbuf[128];
static uint8_t m_reportbuf[128];
static void prvf_process_ble_rx_data(void* p_event_data, uint16_t event_size);
static void process_ble_rx_data(void* p_event_data, uint16_t event_size);
/*******************************************************************************
* *
@ -27,18 +39,236 @@ static void zdatachannel_data_handler(zdatachannel_evt_t* p_evt) {
if (p_evt->params.rx_data.length > sizeof(rxbufcache)) return;
memcpy(rxbufcache, p_evt->params.rx_data.p_data, p_evt->params.rx_data.length);
uint32_t suc = app_sched_event_put(rxbufcache, p_evt->params.rx_data.length, prvf_process_ble_rx_data);
uint32_t suc = app_sched_event_put(rxbufcache, p_evt->params.rx_data.length, process_ble_rx_data);
if (suc == 0) {
is_rxbufcache_used = true;
}
}
/*******************************************************************************
* UTILS *
*******************************************************************************/
int ble_start_realtime_report() {
m_realtime_report_state = true;
return 0;
}
int ble_stop_realtime_report() {
m_realtime_report_state = false;
return 0;
}
static void send_error_receipt(ify_hrs_packet_t* rxpacket, int32_t errorcode) {
ify_hrs_packet_t* txheader = (ify_hrs_packet_t*)m_txbuf;
error_receipt_t* receipt = (error_receipt_t*)txheader->data;
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(error_receipt_t);
txheader->cmd = rxpacket->cmd;
txheader->frame_index = rxpacket->frame_index;
txheader->frame_type = kifyhrs_pt_error_receipt;
txheader->frame_type = kifyhrs_pt_error_receipt;
receipt->errorcode = kifyhrs_ecode_cmd_not_support;
zdatachannel_data_send2(m_txbuf, sendlen);
}
static void send_success_receipt(ify_hrs_packet_t* rxpacket, int32_t emptydatasize) {
ify_hrs_packet_t* txheader = (ify_hrs_packet_t*)m_txbuf;
uint16_t sendlen = sizeof(ify_hrs_packet_t) + emptydatasize;
txheader->cmd = rxpacket->cmd;
txheader->frame_index = rxpacket->frame_index;
txheader->frame_type = kifyhrs_pt_cmd_receipt;
zdatachannel_data_send2(m_txbuf, sendlen);
}
/*******************************************************************************
* *
*******************************************************************************/
static void prvf_process_ble_rx_data(void* p_event_data, uint16_t data_size) {
static void process_ble_rx_data(void* p_event_data, uint16_t event_size) { //
prvf_process_ble_rx_data(p_event_data, event_size);
is_rxbufcache_used = false;
}
static void prvf_process_ble_rx_data(void* p_event_data, uint16_t len) {
ify_hrs_packet_t* rxheader = (ify_hrs_packet_t*)p_event_data;
ify_hrs_packet_t* txheader = (ify_hrs_packet_t*)m_txbuf;
ify_hrs_cmd_t cmd = (ify_hrs_cmd_t)rxheader->cmd;
memset(m_txbuf, 0, sizeof(m_txbuf));
ZLOGI("rx:");
NRF_LOG_HEXDUMP_INFO(p_event_data, data_size);
NRF_LOG_HEXDUMP_INFO(p_event_data, len);
ZLOGI("rx cmd:%d index:%d datalen:%d", cmd, rxheader->frame_index, len - sizeof(ify_hrs_packet_t));
txheader->cmd = rxheader->cmd;
txheader->frame_index = rxheader->frame_index;
txheader->frame_type = kifyhrs_pt_cmd_receipt;
NRF_LOG_HEXDUMP_INFO(rxheader->data, len - sizeof(ify_hrs_packet_t));
if (cmd == ify_hrs_cmd_read_device_version) {
device_version_info_receipt_t* receipt = (device_version_info_receipt_t*)txheader->data;
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(device_version_info_receipt_t);
receipt->blestack_version = device_info_read_blestack_version();
receipt->bootloader_version = device_info_read_bootloader_version();
receipt->firmware_version = device_info_read_firmware_version();
receipt->hardware_version = device_info_read_hardware_version();
zdatachannel_data_send2(m_txbuf, sendlen);
}
else if (cmd == ify_hrs_cmd_read_sensor_info) {
sensor_info_receipt_t* receipt = (sensor_info_receipt_t*)txheader->data;
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(sensor_info_receipt_t);
receipt->sensor_num = 1;
receipt->sensor_precision = SAMPLE_PRECISION;
receipt->sensor_sample_rate = SAMPLE_RATE / 10;
receipt->sensor0_pos = kifyhrs_sensor_pos_II;
receipt->sensor1_pos = kifyhrs_sensor_pos_V1;
receipt->sensor2_pos = kifyhrs_sensor_pos_V5;
zdatachannel_data_send2(m_txbuf, sendlen);
}
else if (cmd == ify_hrs_cmd_read_device_state) {
device_state_receipt_t* receipt = (device_state_receipt_t*)txheader->data;
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(device_state_receipt_t);
receipt->drop_state0 = hwss_get_drop_state0();
receipt->drop_state1 = hwss_get_drop_state1();
receipt->drop_state1 = 0x00;
receipt->device_state0.sampling_state = (DeviceCtrl_now_state() == kdevice_state_sampling);
receipt->device_state0.report_state = m_realtime_report_state;
receipt->device_state0.low_battery = (BoardBattery_get_battery_level() < 20);
receipt->device_state0.full_storge = (sample_data_mgr_storage_is_full());
receipt->device_state1 = 0;
receipt->powerlevel = BoardBattery_get_battery_level();
receipt->storage_item_num = sample_data_mgr_get_file_num();
zdatachannel_data_send2(m_txbuf, sendlen);
}
else if (cmd == ify_hrs_cmd_read_time) {
read_time_receipt_t* receipt = (read_time_receipt_t*)txheader->data;
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(read_time_receipt_t);
static ztm_t ztm;
znordic_rtc_gettime(&ztm);
receipt->year = (ztm.tm_year + 1900 - 2000);
receipt->month = ztm.tm_mon + 1;
receipt->day = ztm.tm_mday;
receipt->hour = ztm.tm_hour;
receipt->minute = ztm.tm_min;
receipt->second = ztm.tm_sec;
zdatachannel_data_send2(m_txbuf, sendlen);
}
else if (cmd == ify_hrs_cmd_sync_time) {
sync_time_cmd_t* cmd = (sync_time_cmd_t*)rxheader->data;
uint16_t sendlen = sizeof(ify_hrs_packet_t);
znordic_rtc_settime(cmd->year + 2000, cmd->month, cmd->day, cmd->hour, cmd->minute, cmd->second);
zdatachannel_data_send2(m_txbuf, sendlen);
}
else if (cmd == ify_hrs_cmd_start_capture) {
hwss_start_capture();
send_success_receipt(rxheader, 0);
}
else if (cmd == ify_hrs_cmd_stop_capture) {
hwss_stop_capture();
send_success_receipt(rxheader, 0);
}
else if (cmd == ify_hrs_cmd_start_realtime_report) {
// unsupport cmd
int ecode = ble_start_realtime_report();
if (ecode == 0) {
send_success_receipt(rxheader, 8); // 8使便
} else {
send_error_receipt(rxheader, ecode);
}
}
else if (cmd == ify_hrs_cmd_stop_realtime_report) {
int ecode = ble_stop_realtime_report();
if (ecode == 0) {
send_success_receipt(rxheader, 0);
} else {
send_error_receipt(rxheader, ecode);
}
}
else if (cmd == ify_hrs_cmd_read_records_info) {
// 10-
read_record_info_cmd_t* cmd = (read_record_info_cmd_t*)rxheader->data;
read_record_info_receipt_t* receipt = (read_record_info_receipt_t*)txheader->data;
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(read_record_info_receipt_t);
uint8_t recordoff = cmd->record_index;
//
if (hwss_is_capturing()) {
send_error_receipt(rxheader, kifyhrs_ecode_device_busy);
return;
}
sample_data_fileinfo_list_t* recordlist = sample_data_mgr_get_fileinfo_list();
if (recordoff >= recordlist->count) {
send_error_receipt(rxheader, kifyhrs_ecode_no_record_find);
return;
}
sample_data_fileinfo_t* fileinfo = recordlist->fileinfo[recordoff];
memcpy(receipt->record_id, fileinfo->filename, 6);
receipt->frameNum = fileinfo->size / 2; // 2byte per frame
receipt->dataSize = fileinfo->size;
receipt->sensorNum = 1;
receipt->captureRate = SAMPLE_RATE / 10;
receipt->capturePrecision = SAMPLE_PRECISION;
receipt->compressAlgorithm = 0;
zdatachannel_data_send2(m_txbuf, sendlen);
}
else if (cmd == ify_hrs_cmd_del_record) {
// 11-
del_record_cmd_t* cmd = (del_record_cmd_t*)rxheader->data;
static sample_data_filename_t filename;
memset(&filename, 0, sizeof(filename));
memcpy(&filename, cmd->record_id, sizeof(cmd->record_id));
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support);
}
else if (cmd == ify_hrs_cmd_start_upload_record) {
// 12-
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support);
}
else if (cmd == ify_hrs_cmd_enter_ota) {
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support);
}
else if (cmd == ify_hrs_cmd_read_sn) {
read_sn_receipt_t* receipt = (read_sn_receipt_t*)txheader->data;
uint16_t sendlen = sizeof(ify_hrs_packet_t) + sizeof(read_sn_receipt_t);
device_info_read_sn((sn_t*)&receipt->sn);
zdatachannel_data_send2(m_txbuf, sendlen);
}
else if (cmd == ify_hrs_cmd_reset) {
NVIC_SystemReset();
}
//
else {
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support);
}
}
void AppBleService_startAdv() { zble_module_start_adv(); }
@ -46,7 +276,7 @@ void AppBleService_stopAdv() { zble_module_stop_adv(); }
void AppBleService_onServiceInitCB() {
ZLOGI("init zdatachannel service");
zdatachannel_init_t zdatachannle_init;
static zdatachannel_init_t zdatachannle_init;
memset(&zdatachannle_init, 0, sizeof(zdatachannle_init));
zdatachannle_init.data_handler = zdatachannel_data_handler;
ZERROR_CHECK(zdatachannel_init(&m_zhrs, &zdatachannle_init));

7
app/src/app_ble_service.h

@ -7,7 +7,12 @@
*/
void AppBleService_onServiceInitCB();
void AppBleService_init();
void AppBleService_uninit();
void AppBleService_startAdv();
void AppBleService_stopAdv();
void AppBleService_try_report_one_sample_data(uint32_t frameIndex, uint16_t data);
void AppBleService_try_report_sensor_drop_event(uint8_t dropstate0, uint8_t dropstate1);
void AppBleService_report_sample_finish_event();

23
app/src/app_event_distribute.c

@ -0,0 +1,23 @@
#include "app_event_distribute.h"
#include "app_event.h"
#include "app_scheduler.h"
static AppEventListener m_listener[10];
static int m_listener_num = 0;
static void app_event_process_cb(void* p_event_data, uint16_t event_size) {
for (int i = 0; i < m_listener_num; i++) {
if (m_listener[i].cbfunc) {
m_listener[i].cbfunc(p_event_data, event_size);
}
}
}
void AppEvent_regListener(AppEventListener* listener) { //
m_listener[m_listener_num] = *listener;
}
void AppEvent_pushEvent(app_event_t* event) { //
app_sched_event_put(event, sizeof(app_event_t) , app_event_process_cb);
}

15
app/src/app_event_distribute.h

@ -0,0 +1,15 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include "app_event.h"
typedef void (*app_event_listener_t)(void* p_event_data, uint16_t event_size);
typedef struct {
app_event_listener_t cbfunc;
} AppEventListener;
void AppEvent_regListener(AppEventListener* listener);
void AppEvent_pushEvent(app_event_t* event);

0
app/src/main.bak.c → app/src/bak/main.bak.c

16
app/src/basic/ads1293/ads1293.c

@ -101,6 +101,11 @@ void ads1293_start_conversion(ads1293_t* ads) {
data = 0x01;
ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
}
void ads1293_stop_conversion(ads1293_t* ads) {
uint8_t data = 0;
data = 0x04;
ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
}
void ads1293_start_power_off(ads1293_t* ads) {
uint8_t data = 0;
data |= 0x01 << 2;
@ -108,14 +113,3 @@ void ads1293_start_power_off(ads1293_t* ads) {
}
uint8_t ads1293_read_error_lod(ads1293_t* ads) { return ads1293_spi_readreg(ads, TI_ADS1293_ERROR_LOD_REG); }
void ads1293_start_conversion(ads1293_t* ads) {
uint8_t data = 0;
data = 0x01;
ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
}
void ads1293_stop_conversion(ads1293_t* ads){
uint8_t data = 0;
data = 0x04;
ads1293_spi_writereg(ads, TI_ADS1293_CONFIG_REG, data);
}

190
app/src/basic/heart_rate_sensor_protocol.h

@ -1,190 +0,0 @@
#pragma once
#include <stdint.h>
#pragma pack(push, 1)
typedef struct {
uint8_t frame_type;
uint8_t frame_index;
uint8_t cmd;
uint8_t data[];
} ify_hrs_packet_t;
typedef enum {
kifyhrs_ecode_success = 0,
kifyhrs_ecode_unkown_error = 1,
kifyhrs_ecode_cmd_not_support = 2,
kifyhrs_ecode_illegal_parameter = 3,
kifyhrs_ecode_device_busy = 4,
kifyhrs_ecode_hardware_error = 5,
kifyhrs_ecode_sensor_drop = 6,
kifyhrs_ecode_no_record_find = 7,
} ify_hrs_error_code_t;
typedef enum {
kifyhrs_pt_cmd = 1,
kifyhrs_pt_cmd_receipt = 2,
kifyhrs_pt_report = 3,
kifyhrs_pt_error_receipt = 4,
} ify_hrs_packet_type_t;
typedef enum {
kifyhrs_sensor_pos_none = 0, //
kifyhrs_sensor_pos_I = 1, // I
kifyhrs_sensor_pos_II = 2, // II
kifyhrs_sensor_pos_III = 3, // III
kifyhrs_sensor_pos_V1 = 4, // V1
kifyhrs_sensor_pos_V5 = 5, // V5
} ify_hrs_sensor_pos_t;
typedef enum {
ify_hrs_cmd_read_device_version = 1,
ify_hrs_cmd_read_sensor_info = 2,
ify_hrs_cmd_read_device_state = 3,
ify_hrs_cmd_read_time = 4,
ify_hrs_cmd_sync_time = 5,
ify_hrs_cmd_start_capture = 6,
ify_hrs_cmd_stop_capture = 7,
ify_hrs_cmd_start_realtime_report = 8,
ify_hrs_cmd_stop_realtime_report = 9,
ify_hrs_cmd_read_records_info = 10,
ify_hrs_cmd_del_record = 11,
ify_hrs_cmd_start_upload_record = 12,
ify_hrs_cmd_enter_ota = 13,
ify_hrs_cmd_read_sn = 14,
ify_hrs_cmd_reset = 15,
ify_hrs_report_heartrate_data = 101,
ify_hrs_report_battery_level = 102,
ify_hrs_report_low_battey_level = 103,
ify_hrs_report_sample_finish_end = 104,
ify_hrs_report_sensor_drop_detect = 105,
ify_hrs_report_record_upload_end = 106,
} ify_hrs_cmd_t;
/*******************************************************************************
* packet_struct *
*******************************************************************************/
typedef struct {
uint16_t placeholder;
uint16_t blestack_version;
uint16_t bootloader_version;
uint16_t firmware_version;
uint16_t hardware_version;
} device_version_info_receipt_t;
typedef struct {
uint8_t sensor_num; //
uint8_t sensor_precision; //
uint8_t sensor_sample_rate; //
uint8_t sensor0_pos; //
uint8_t sensor1_pos; //
uint8_t sensor2_pos; //
} sensor_info_receipt_t;
typedef struct {
struct {
uint8_t sensor0_pos : 1; //
uint8_t sensor1_pos : 1; //
uint8_t sensor2_pos : 1; //
uint8_t sensor3_pos : 1; //
uint8_t sensor4_pos : 1; //
uint8_t sensor5_pos : 1; //
uint8_t sensor6_pos : 1; //
uint8_t sensor7_pos : 1; //
} drop_state0;
uint8_t drop_state1;
struct {
uint8_t sampling_state : 1; //
uint8_t report_state : 1; //
uint8_t low_battery : 1; //
uint8_t full_storge : 1; //
uint8_t holder : 4; //
} device_state0;
uint8_t device_state1; //
uint8_t powerlevel; //
uint8_t storage_item_num; //
} device_state_receipt_t;
typedef struct {
uint8_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
} read_time_receipt_t;
typedef struct {
uint8_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
} sync_time_cmd_t;
typedef struct {
uint8_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
} start_capture_cmd_t;
typedef struct {
uint8_t record_index; //
} read_record_info_cmd_t;
typedef struct {
uint8_t record_id[6];
uint32_t frameNum;
uint32_t dataSize;
uint8_t sensorNum;
uint8_t captureRate; // N*10HZ
uint8_t capturePrecision;
uint8_t compressAlgorithm; //
} read_record_info_receipt_t;
typedef struct {
uint8_t record_id[6];
} del_record_cmd_t;
typedef struct {
uint8_t record_id[6];
} start_upload_record_cmd_t;
typedef struct {
uint8_t sn[14];
} read_sn_receipt_t;
typedef struct {
uint8_t errorcode;
} error_receipt_t;
/*******************************************************************************
* *
*******************************************************************************/
typedef struct {
uint8_t frame_type;
uint8_t frame_index;
uint8_t cmd;
uint32_t sample_data_index;
uint8_t data[]; //
} heartrate_report_packet_t;
typedef struct {
uint8_t frame_type;
uint8_t frame_index;
uint8_t cmd;
uint8_t drop_state0;
uint8_t drop_state1;
} sensor_drop_event_report_packet_t;
#pragma pack(pop)

6
app/src/board/board.h

@ -59,3 +59,9 @@
#define HEART_WAVE_SAMPLE_SERVICE_CACHE_SIZE (3 * 3 * 256)
#define FILE_MAX_COUNT 1
#define SDCARD_MAX_FILE_SIZE (4 * 1024 * 1024)
//
#define SAMPLE_RATE 800
#define SAMPLE_PRECISION 24
#define APP_MAX_EVEN_SIZE MAX(APP_TIMER_SCHED_EVENT_DATA_SIZE,sizeof(app_event_t))
#define APP_EVENT_QUEUE_SIZE 20

1
app/src/board/board_battery_state.h

@ -11,5 +11,4 @@ void BoardBattery_load();
void BoardBattery_unload();
int16_t BoardBattery_get_adc_val();
int16_t BoardBattery_val();
int16_t BoardBattery_get_battery_level(); // 0->100

2
app/src/board/board_beep_ctrl.c

@ -20,7 +20,7 @@ static nrf_drv_pwm_config_t const m_beep_pwm0_config0 = {
.step_mode = NRF_PWM_STEP_AUTO,
};
BoardBeepEffect_t m_beep_effect = kBoardBeepEffect_none;
static m_beep_cnt = 0;
static uint32_t m_beep_cnt = 0;
static void beep_tmr_handler(void *context) {
if (m_beep_effect == kBoardBeepEffect_none) {

7
app/src/board/board_button.c

@ -7,12 +7,17 @@
#define BUTTON_DETECTION_DELAY APP_TIMER_TICKS(50)
static board_button_cb_t m_cb;
//
void button_process_handler(uint8_t pin_no, uint8_t button_action) {}
void button_process_handler(uint8_t pin_no, uint8_t button_action) {
if (m_cb) {
m_cb(kButton_mainButton, (ButtonAction_t)button_action);
}
}
static app_button_cfg_t buttons[] = {
{BUTTON_PIN, false, NRF_GPIO_PIN_PULLUP, button_process_handler},
};
void BoardButton_Init(board_button_cb_t cb) { //
m_cb = cb;
ZASSERT(app_button_init(buttons, ARRAY_SIZE(buttons), BUTTON_DETECTION_DELAY));
}
void BoardButton_load() { ZASSERT(app_button_enable()); }

7
app/src/board/board_button.h

@ -9,7 +9,12 @@ typedef enum {
kButton_mainButton,
} ButtonIndex_t;
typedef void (*board_button_cb_t)(ButtonIndex_t pin_no, uint8_t button_action);
typedef enum {
kButtonAction_push = 1,
kButtonAction_release = 0,
} ButtonAction_t;
typedef void (*board_button_cb_t)(ButtonIndex_t pin_no, ButtonAction_t button_action);
void BoardButton_Init(board_button_cb_t cb); // main中初始化一遍
void BoardButton_load();

6
app/src/board/board_sdcard_driver.c

@ -5,13 +5,9 @@
/*******************************************************************************
* ½á¹¹Ìå¨Òå *
*******************************************************************************/
typedef enum {
kConnectToInternal,
kConnectToExt,
} ConnectTo_t;
FATFS m_fs;
ConnectTo_t m_connectTo = kConnectToNone;
BoardSdcardConnectTo_t m_connectTo = kConnectToNone;
static bool m_sdcard_inited;
NRF_BLOCK_DEV_SDC_DEFINE( //

18
app/src/device_ctrl_service.c

@ -0,0 +1,18 @@
#include "device_ctrl_service.h"
static device_state_t m_device_state = kdevice_state_standby; //
static uint32_t m_change_to_cur_state_tp = 0; //
void DeviceCtrl_change_to_state(device_state_t state) {
ZLOGI("change state from %s to %s", ds2str(m_device_state), ds2str(state));
m_device_state = state;
m_change_to_cur_state_tp = znordic_getpower_on_ms();
}
uint32_t DeviceCtrl_cur_state_haspassed_ms() { return znordic_haspassed_ms(m_change_to_cur_state_tp); }
device_state_t DeviceCtrl_now_state() { return m_device_state; }
void DeviceCtrl_startSample() {}
void DeviceCtrl_stopSample() {}
void DeviceCtrl_schdeule() {}
void DeviceCtrl_init() {}

44
app/src/device_ctrl_service.h

@ -0,0 +1,44 @@
/**
* @file device_ctrl_service.h
* @author zhaohe (h_zhaohe@domain.com)
* @brief É豸¿ØÖÆ·þÎñ
* @version 0.1
* @date 2024-02-01
*
* @copyright Copyright (c) 2024
*
*/
#pragma once
#include "znordic.h"
typedef enum {
// ´ý»ú
kdevice_state_standby = 0,
// Ready
kdevice_state_ready = 1,
// sample
kdevice_state_sampling = 2,
} device_state_t;
static const char* ds2str(device_state_t ds) {
switch (ds) {
case kdevice_state_standby:
return "standby";
case kdevice_state_ready:
return "ready";
case kdevice_state_sampling:
return "sampling";
default:
return "unknown";
}
}
void DeviceCtrl_change_to_state(device_state_t state);
uint32_t DeviceCtrl_cur_state_haspassed_ms();
device_state_t DeviceCtrl_now_state();
void DeviceCtrl_startSample();
void DeviceCtrl_stopSample();
void DeviceCtrl_schdeule();
void DeviceCtrl_init() ;

14
app/src/device_state.c

@ -1,14 +0,0 @@
#include "device_state.h"
#include "znordic.h"
static device_state_t m_device_state = kdevice_state_standby; //
static uint32_t m_change_to_cur_state_tp = 0; //
void ds_change_to_state(device_state_t state) {
ZLOGI("change state from %s to %s", device_state_to_str(m_device_state), device_state_to_str(state));
m_device_state = state;
m_change_to_cur_state_tp = znordic_getpower_on_ms();
}
uint32_t ds_cur_state_haspassed_ms() { return znordic_haspassed_ms(m_change_to_cur_state_tp); }
device_state_t ds_now_state() { return m_device_state; }

28
app/src/device_state.h

@ -1,28 +0,0 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
typedef enum {
// ´ý»ú
kdevice_state_standby = 0,
// Ready
kdevice_state_ready = 1,
// sample
kdevice_state_sampling = 2,
} device_state_t;
static const char* ds2str(device_state_t ds) {
switch (ds) {
case kdevice_state_standby:
return "standby";
case kdevice_state_ready:
return "ready";
case kdevice_state_sampling:
return "sampling";
default:
return "unknown";
}
}
void ds_change_to_state(device_state_t state);
uint32_t ds_cur_state_haspassed_ms();
device_state_t ds_now_state();

27
app/src/heart_wave_sample_service.c

@ -4,6 +4,7 @@
//
#include "app_button.h"
#include "app_event.h"
#include "app_event_distribute.h"
#include "basic/ads1293/ads1293.h"
#include "nrf_drv_gpiote.h"
#include "nrfx_timer.h"
@ -95,7 +96,7 @@ static inline void prvf_trigger_capture_data_block_event(uint8_t* data, int data
event.eventType = kevent_capture_data_block_event;
event.val.block_sensor_data.data = data;
event.val.block_sensor_data.len = datalen;
app_sched_event_put(&event, sizeof(app_event_t), app_event_process_cb);
AppEvent_pushEvent(&event);
}
static inline void prvf_little_block_cache_push_one_frame(uint32_t data0, uint32_t data1, uint32_t data2) {
@ -120,7 +121,7 @@ static inline void prvf_light_block_trigger_event() {
event.eventType = kevent_capture_little_data_block_event;
memcpy(event.val.little_data_block.data, m_sensor_little_frame_cache, LITTLE_DATA_BLOCK_FRAME_NUM);
event.val.little_data_block.frameIndex = m_frame_index - LITTLE_DATA_BLOCK_FRAME_NUM;
app_sched_event_put(&event, sizeof(app_event_t), app_event_process_cb);
AppEvent_pushEvent(&event);
}
static void ads1293_spi_tx_rx_0(uint8_t* tx, uint8_t* rx, uint8_t len) {
if (!m_ads1293_driver_is_inited) {
@ -140,7 +141,20 @@ static void ads1293_spi_tx_rx_1(uint8_t* tx, uint8_t* rx, uint8_t len) {
nrf_drv_spi_transfer(&spi, tx, len, rx, len);
nrf_gpio_pin_set(ADS1293_SPI_CS1_PIN);
}
static ads1293_init() {
static void ads1293_spi_writereg_and_check(ads1293_t* ads, uint8_t addr, uint8_t data) {
uint8_t readbak = 0;
// readonly add
if (addr == 0x19 || addr == 0x1a || addr == 0x1b || addr == 0x1c || addr == 0x40 || addr == 0x30) {
return;
}
ads1293_spi_writereg_and_readbak(ads, addr, data, &readbak);
if (readbak != data) {
ZLOGE("ads_%d write %x failed,w:%x readbak:%x\n", ads->id, addr, data, readbak);
}
}
static void ads1293_init() {
/*******************************************************************************
* SPI³õʼ»¯ *
*******************************************************************************/
@ -249,7 +263,7 @@ static void ads1293_ready_pin_irq(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t a
}
}
static ads1293_uninit() {
static void ads1293_uninit() {
hwss_stop_capture();
m_ads1293_driver_is_inited = false;
nrf_drv_spi_uninit(&spi);
@ -278,3 +292,8 @@ void hwss_stop_capture(void) {
ads1293_stop_conversion(&m_ads1293_0);
ads1293_stop_conversion(&m_ads1293_1);
}
bool hwss_is_capturing(void) { return m_work_flag; }
uint8_t hwss_get_drop_state0() { return 0; }
uint8_t hwss_get_drop_state1() { return 0; }

5
app/src/heart_wave_sample_service.h

@ -29,3 +29,8 @@ void hwss_start_capture(void);
* @brief Í£Ö¹²É¼¯
*/
void hwss_stop_capture(void);
bool hwss_is_capturing(void);
uint8_t hwss_get_drop_state0();
uint8_t hwss_get_drop_state1();

23
app/src/main.c

@ -6,30 +6,23 @@
#include <string.h>
//
#include "app_ble_service.h"
#include "app_event_distribute.h"
#include "basic/ads1293/ads1293.h"
#include "board/board.h"
#include "zble_module.h"
#include "zdatachannel_service.h"
#include "znordic_device_info_mgr.h"
#include "device_ctrl_service.h"
//
APP_TIMER_DEF(state_machine_scheduler_tmr);
static void test_tx_timer_cb(void* p_context) { //
ZLOGI("test_tx_timer_cb");
ThreeLeadECG_led_green_toggle();
}
int main() {
APP_SCHED_INIT(APP_TIMER_SCHED_EVENT_DATA_SIZE, 20);
APP_SCHED_INIT(APP_MAX_EVEN_SIZE, APP_EVENT_QUEUE_SIZE);
znordic_init();
static zble_module_cfg_t cfg = //
{
.deviceName = "ThreeLeadECG",
.on_service_init = AppBleService_onServiceInitCB,
};
static zble_module_cfg_t cfg;
cfg.deviceName = device_info_read_sn_str();
cfg.on_service_init = AppBleService_onServiceInitCB;
zble_module_init(&cfg);
AppBleService_startAdv();
ThreeLeadECG_led_init();
ZERROR_CHECK(app_timer_create(&state_machine_scheduler_tmr, APP_TIMER_MODE_REPEATED, test_tx_timer_cb));
ZERROR_CHECK(app_timer_start(state_machine_scheduler_tmr, APP_TIMER_TICKS(1000), NULL));
NRF_LOG_INFO("compile time :%s", __TIME__);
DeviceCtrl_init();
znordic_loop();
}

1
app/src/sample_data_manager_service.c

@ -45,6 +45,7 @@ static void read_file_info() {
_filename.hour = (fno.ftime >> 11);
_filename.min = (fno.ftime >> 5) & 0x3F;
_filename.sec = (fno.ftime & 0x1F) * 2;
memcpy(m_sample_fileinfo_list.fileinfo[0]->filename, &_filename, sizeof(sample_data_filename_t));
m_sample_fileinfo_list.fileinfo[0]->size = fno.fsize;
m_sample_fileinfo_list.count = 1;
} else {

2
libznordic

@ -1 +1 @@
Subproject commit 2e46516dec82a92dd796312c6787f35e5adf7922
Subproject commit 7eee0f956b26dd0870837349b6ae9d237dabf031
Loading…
Cancel
Save