zhaohe 1 year ago
parent
commit
240f3177c3
  1. 3
      .vscode/settings.json
  2. 3
      README.md
  3. 176
      app/app.uvoptx
  4. 10
      app/app.uvprojx
  5. 369
      app/src/ads1293_simple_tester.c
  6. 49
      app/src/app_ble_service.c
  7. 1
      app/src/basic/device_version_info_mgr.c
  8. 9
      app/src/basic/filters.c
  9. 2
      app/src/basic/version.h
  10. 17
      app/src/basic/watch_dog.c
  11. 15
      app/src/board/board_beep_ctrl.c
  12. 3
      app/src/board/board_button.c
  13. 23
      app/src/board/board_light_ctrl.c
  14. 20
      app/src/board/board_sdcard_driver.c
  15. 23
      app/src/board/device_exception_manager.c
  16. 17
      app/src/board/device_exception_manager.h
  17. 11
      app/src/device_ctrl_service.c
  18. 71
      app/src/heart_wave_sample_service.c
  19. 2
      app/src/heart_wave_sample_service.h
  20. 20
      app/src/sample_data_manager_service.c
  21. 4
      app/src/sample_data_manager_service.h
  22. 2
      dynamic_electrocardiograph_ble_server
  23. 2
      ify_hrs_protocol
  24. 2
      libznordic
  25. 15576
      release/V21/three_lead_ecg_v21.hex
  26. BIN
      release/V21/three_lead_ecg_v21.zip
  27. 2
      sdk

3
.vscode/settings.json

@ -166,7 +166,8 @@
"stop_token": "cpp",
"streambuf": "cpp",
"thread": "cpp",
"cinttypes": "cpp"
"cinttypes": "cpp",
"device_exception_manager.h": "c"
},
"files.encoding": "gbk"
}

3
README.md

@ -1,6 +1,9 @@
# three_lead_ecg_v2
```
V21:
1. 修改代码当ADS加载失败时,设备不强制重启,仅是记录状态
2. 修改代码当文件系统失败时,设备不强制重启,仅是记录状态
V20:
1. 添加ADS1293配置回读检测
V19:

176
app/app.uvoptx

@ -576,17 +576,29 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\board\device_exception_manager.c</PathWithFileName>
<FilenameWithoutPath>device_exception_manager.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>Board Definition</GroupName>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -606,7 +618,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -618,7 +630,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -638,7 +650,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>20</FileNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -658,7 +670,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>21</FileNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -670,7 +682,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>22</FileNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -682,7 +694,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -694,7 +706,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -706,7 +718,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -718,7 +730,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -730,7 +742,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -742,7 +754,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -762,7 +774,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -782,7 +794,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -794,7 +806,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -806,7 +818,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -818,7 +830,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -830,7 +842,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -842,7 +854,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -854,7 +866,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -866,7 +878,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -878,7 +890,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -890,7 +902,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -902,7 +914,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>40</FileNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -914,7 +926,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>41</FileNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -926,7 +938,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>42</FileNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -938,7 +950,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>43</FileNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -950,7 +962,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>44</FileNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -962,7 +974,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>45</FileNumber>
<FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -974,7 +986,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>46</FileNumber>
<FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -986,7 +998,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>47</FileNumber>
<FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -998,7 +1010,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>48</FileNumber>
<FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1010,7 +1022,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>49</FileNumber>
<FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1030,7 +1042,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>50</FileNumber>
<FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1042,7 +1054,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>51</FileNumber>
<FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1054,7 +1066,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>52</FileNumber>
<FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1066,7 +1078,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>53</FileNumber>
<FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1078,7 +1090,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>54</FileNumber>
<FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1090,7 +1102,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>55</FileNumber>
<FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1102,7 +1114,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>56</FileNumber>
<FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1114,7 +1126,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>57</FileNumber>
<FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1126,7 +1138,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>58</FileNumber>
<FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1138,7 +1150,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>59</FileNumber>
<FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1150,7 +1162,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>60</FileNumber>
<FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1162,7 +1174,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>61</FileNumber>
<FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1174,7 +1186,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>62</FileNumber>
<FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1186,7 +1198,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>63</FileNumber>
<FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1198,7 +1210,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>64</FileNumber>
<FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1210,7 +1222,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>65</FileNumber>
<FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1222,7 +1234,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>66</FileNumber>
<FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1234,7 +1246,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>67</FileNumber>
<FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1246,7 +1258,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>68</FileNumber>
<FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1258,7 +1270,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>69</FileNumber>
<FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1270,7 +1282,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>70</FileNumber>
<FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1282,7 +1294,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>71</FileNumber>
<FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1294,7 +1306,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>72</FileNumber>
<FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1306,7 +1318,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>73</FileNumber>
<FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1318,7 +1330,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>74</FileNumber>
<FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1330,7 +1342,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>75</FileNumber>
<FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1342,7 +1354,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>76</FileNumber>
<FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1362,7 +1374,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>77</FileNumber>
<FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1374,7 +1386,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>78</FileNumber>
<FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1386,7 +1398,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>79</FileNumber>
<FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1398,7 +1410,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>80</FileNumber>
<FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1410,7 +1422,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>81</FileNumber>
<FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1422,7 +1434,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>82</FileNumber>
<FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1442,7 +1454,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>83</FileNumber>
<FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1454,7 +1466,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>84</FileNumber>
<FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1466,7 +1478,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>85</FileNumber>
<FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1486,7 +1498,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>86</FileNumber>
<FileNumber>87</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1498,7 +1510,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>87</FileNumber>
<FileNumber>88</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1510,7 +1522,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>88</FileNumber>
<FileNumber>89</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1530,7 +1542,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>89</FileNumber>
<FileNumber>90</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1542,7 +1554,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>90</FileNumber>
<FileNumber>91</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1554,7 +1566,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>91</FileNumber>
<FileNumber>92</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1574,7 +1586,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>92</FileNumber>
<FileNumber>93</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1586,7 +1598,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>93</FileNumber>
<FileNumber>94</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1606,7 +1618,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>94</FileNumber>
<FileNumber>95</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1618,7 +1630,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>95</FileNumber>
<FileNumber>96</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1630,7 +1642,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>96</FileNumber>
<FileNumber>97</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1642,7 +1654,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>97</FileNumber>
<FileNumber>98</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

10
app/app.uvprojx

@ -463,6 +463,11 @@
<FileType>1</FileType>
<FilePath>.\src\basic\filters.c</FilePath>
</File>
<File>
<FileName>device_exception_manager.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\device_exception_manager.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -4307,6 +4312,11 @@
<FileType>1</FileType>
<FilePath>.\src\basic\filters.c</FilePath>
</File>
<File>
<FileName>device_exception_manager.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\board\device_exception_manager.c</FilePath>
</File>
</Files>
</Group>
<Group>

369
app/src/ads1293_simple_tester.c

@ -1,369 +0,0 @@
#include "znordic.h"
//
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
#include "app_ble_service.h"
#include "app_event_distribute.h"
#include "basic/ads1293/ads1293.h"
#include "board/board.h"
#include "device_ctrl_service.h"
#include "nrf_drv_gpiote.h"
#include "sample_data_manager_service.h"
#include "zble_module.h"
#include "zdatachannel_service.h"
#include "basic/device_version_info_mgr.h"
//
ZDATACHANNEL_DEF(m_zhrs, 2 /*优先级*/, 1 /*client num*/);
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(ADS1293_SPI_INSTANCE); /**< SPI instance. */
static ads1293_t m_ads1293_0; // U2
static ads1293_t m_ads1293_1;
typedef struct {
uint8_t add;
uint8_t data;
} adscfg_t;
static adscfg_t m_prvads0cfg_cache[65];
static adscfg_t m_prvads1cfg_cache[65];
static void zdatachannel_data_handler(zdatachannel_evt_t* p_evt) {}
void blechannel_service_init() {
ZLOGI("init zdatachannel service");
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));
}
static void ads1293_spi_tx_rx_0(uint8_t* tx, uint8_t* rx, uint8_t len) {
nrf_gpio_pin_clear(ADS1293_SPI_CS0_PIN);
nrf_drv_spi_transfer(&spi, tx, len, rx, len);
nrf_gpio_pin_set(ADS1293_SPI_CS0_PIN);
}
static void ads1293_spi_tx_rx_1(uint8_t* tx, uint8_t* rx, uint8_t len) {
nrf_gpio_pin_clear(ADS1293_SPI_CS1_PIN);
nrf_drv_spi_transfer(&spi, tx, len, rx, len);
nrf_gpio_pin_set(ADS1293_SPI_CS1_PIN);
}
static void ads1293_spi_writereg_and_check(ads1293_t* ads, uint8_t addr, uint8_t data) {
uint8_t readbak = 0;
// readonly add
readbak = data;
if (addr >= 0x18 && addr <= 0x1E) {
return;
}
if (addr >= 0x30 && addr <= 0x3f) {
return;
}
if (addr == 0x40) {
return;
}
if (addr == 0x50) {
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 tryloadcfg_from_fatfs(const char* file, adscfg_t* cfg, uint16_t cfgsize, uint16_t* cfg_ret_size) {
//
*cfg_ret_size = 0;
static FIL fd;
FRESULT ff_result = f_open(&fd, (const TCHAR*)file, FA_READ);
if (ff_result != FR_OK) {
ZLOGE("open %s failed\n", file);
return;
}
char line[128];
int niterm = 0;
f_gets(line, 128, &fd);
while (f_gets(line, 128, &fd)) {
uint32_t addr;
uint32_t value;
sscanf(line, "%x,%x", &addr, &value);
cfg[niterm].add = addr;
cfg[niterm].data = value;
niterm++;
if (niterm >= cfgsize) {
break;
}
}
*cfg_ret_size = niterm;
ZLOGI("load %s cfg size:%d\n", file, niterm);
f_close(&fd);
}
uint32_t get_ready_pin_state_get() { return nrf_gpio_pin_read(ADS1293_READY_PIN); }
static adscfg_t m_prvads0cfg[] = //
{
{0x00, 0x00}, {0x01, 0x19}, {0x02, 0x11}, {0x03, 0x00}, {0x04, 0x00}, {0x05, 0x00}, {0x06, 0x00}, {0x07, 0x0f}, {0x08, 0xff}, {0x09, 0x00}, {0x0a, 0x07}, {0x0b, 0x07}, {0x0c, 0x74}, {0x0d, 0x01}, {0x0e, 0x02}, {0x0f, 0x03}, {0x10, 0x04},
{0x11, 0x00}, {0x12, 0x05}, {0x13, 0x39}, {0x14, 0x36}, {0x15, 0x06}, {0x16, 0x00}, {0x17, 0x05}, {0x18, 0x00}, {0x19, 0x00}, {0x1a, 0x00}, {0x1b, 0x00}, {0x1c, 0x00}, {0x1d, 0x00}, {0x21, 0x01}, {0x22, 0x20}, {0x23, 0x20}, {0x24, 0x02},
{0x25, 0x00}, {0x26, 0x00}, {0x27, 0x08}, {0x28, 0x08}, {0x29, 0x00}, {0x2a, 0x00}, {0x2b, 0x00}, {0x2c, 0x00}, {0x2d, 0x00}, {0x2e, 0x33}, {0x2f, 0x30}, {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x00}, {0x35, 0x00},
{0x36, 0x00}, {0x37, 0x00}, {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0x00}, {0x3b, 0x00}, {0x3c, 0x00}, {0x3d, 0x00}, {0x3e, 0x00}, {0x3f, 0x00}, {0x40, 0xff}, {0x50, 0x00}, {0x60, 0x00}, {0x62, 0x00},
};
static adscfg_t m_prvads1cfg[] = //
{
{0x00, 0x00}, {0x01, 0x0c}, {0x02, 0x14}, {0x03, 0x00}, {0x04, 0x00}, {0x05, 0x00}, {0x06, 0x00}, {0x07, 0x0f}, {0x08, 0xff}, {0x09, 0x00}, {0x0a, 0x00}, {0x0b, 0x07}, {0x0c, 0x78}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00}, {0x10, 0x04},
{0x11, 0x00}, {0x12, 0x07}, {0x13, 0x3b}, {0x14, 0x24}, {0x15, 0x04}, {0x16, 0x00}, {0x17, 0x05}, {0x18, 0x00}, {0x19, 0x00}, {0x1a, 0x00}, {0x1b, 0x00}, {0x1c, 0x00}, {0x1d, 0x00}, {0x21, 0x01}, {0x22, 0x20}, {0x23, 0x20}, {0x24, 0x02},
{0x25, 0x00}, {0x26, 0x00}, {0x27, 0x08}, {0x28, 0x40}, {0x29, 0x00}, {0x2a, 0x00}, {0x2b, 0x00}, {0x2c, 0x00}, {0x2d, 0x00}, {0x2e, 0x33}, {0x2f, 0x30}, {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00}, {0x34, 0x00}, {0x35, 0x00},
{0x36, 0x00}, {0x37, 0x00}, {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0x00}, {0x3b, 0x00}, {0x3c, 0x00}, {0x3d, 0x00}, {0x3e, 0x00}, {0x3f, 0x00}, {0x40, 0xff}, {0x50, 0x00}, {0x60, 0x00}, {0x62, 0x00},
};
static void ads1293_init() {
/*******************************************************************************
* SPI初始化 *
*******************************************************************************/
static nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
spi_config.ss_pin = NRF_DRV_SPI_PIN_NOT_USED; // NRF_DRV_SPI_PIN_NOT_USED
spi_config.miso_pin = ADS1293_SPI_MISO_PIN;
spi_config.mosi_pin = ADS1293_SPI_MOSI_PIN;
spi_config.sck_pin = ADS1293_SPI_SCK_PIN;
spi_config.frequency = NRF_DRV_SPI_FREQ_8M;
spi_config.mode = NRF_DRV_SPI_MODE_3;
// spi_config.mode =
ZERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, NULL, NULL));
znrf_gpio_cfg_output(ADS1293_SPI_CS0_PIN, NRF_GPIO_PIN_NOPULL);
znrf_gpio_cfg_output(ADS1293_SPI_CS1_PIN, NRF_GPIO_PIN_NOPULL);
nrf_gpio_pin_set(ADS1293_SPI_CS0_PIN);
nrf_gpio_pin_set(ADS1293_SPI_CS1_PIN);
m_ads1293_0.spi_tx_rx = ads1293_spi_tx_rx_0;
m_ads1293_0.id = 0;
m_ads1293_1.spi_tx_rx = ads1293_spi_tx_rx_1;
m_ads1293_1.id = 1;
ads1293_spi_init(&m_ads1293_0, ads1293_spi_tx_rx_0);
ads1293_spi_init(&m_ads1293_1, ads1293_spi_tx_rx_1);
uint8_t revid = ads1293_spi_readreg(&m_ads1293_0, TI_ADS1293_REVID_REG);
ZLOGI("ads1293_0 revid: %d\n", revid);
revid = ads1293_spi_readreg(&m_ads1293_1, TI_ADS1293_REVID_REG);
ZLOGI("ads1293_1 revid: %d\n", revid);
ads1293_spi_writereg(&m_ads1293_0, TI_ADS1293_CONFIG_REG, 0);
uint16_t cfgsize = 0;
tryloadcfg_from_fatfs("0.cfg", m_prvads0cfg_cache, ZARRAY_SIZE(m_prvads0cfg_cache), &cfgsize);
if (cfgsize > 0) {
ZLOGI("load 0.cfg from fatfs\n");
if (memcmp(m_prvads0cfg_cache, m_prvads0cfg, sizeof(m_prvads0cfg)) != 0) {
ZLOGI("0.cfg is different from default\n");
} else {
ZLOGI("0.cfg is same as default\n");
}
for (uint16_t i = 0; i < cfgsize; i++) {
ads1293_spi_writereg_and_check(&m_ads1293_0, m_prvads0cfg_cache[i].add, m_prvads0cfg_cache[i].data);
}
} else {
for (uint16_t i = 0; i < ZARRAY_SIZE(m_prvads0cfg); i++) {
ads1293_spi_writereg_and_check(&m_ads1293_0, m_prvads0cfg[i].add, m_prvads0cfg[i].data);
}
}
tryloadcfg_from_fatfs("1.cfg", m_prvads1cfg_cache, ZARRAY_SIZE(m_prvads1cfg_cache), &cfgsize);
if (cfgsize > 0) {
ZLOGI("load 1.cfg from fatfs\n");
if (memcmp(m_prvads1cfg_cache, m_prvads1cfg, sizeof(m_prvads1cfg)) != 0) {
ZLOGI("1.cfg is different from default\n");
} else {
ZLOGI("1.cfg is same as default\n");
}
for (uint16_t i = 0; i < cfgsize; i++) {
ads1293_spi_writereg_and_check(&m_ads1293_1, m_prvads1cfg_cache[i].add, m_prvads1cfg_cache[i].data);
}
} else {
for (uint16_t i = 0; i < ZARRAY_SIZE(m_prvads1cfg); i++) {
ads1293_spi_writereg_and_check(&m_ads1293_1, m_prvads1cfg[i].add, m_prvads1cfg[i].data);
}
}
}
static void onServiceInitCB() {
ZLOGI("init zdatachannel service");
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));
}
void setup();
int main() {
APP_SCHED_INIT(APP_MAX_EVEN_SIZE, APP_EVENT_QUEUE_SIZE);
znordic_init();
NRF_LOG_INFO("compile time :%s", __TIME__);
ZLOGI("CUSTOMER :%d", NRF_UICR->CUSTOMER[0]);
/*******************************************************************************
* *
*******************************************************************************/
static zble_module_cfg_t cfg;
cfg.deviceName = "ADS1293_TESTER";
cfg.on_service_init = onServiceInitCB;
zble_module_init(&cfg);
AppBleService_init();
setup();
}
static ads1293_error_t error0;
static ads1293_error_t error1;
static uint8_t txcache[128];
void send_ads1293_error_state(ads1293_error_t* e0, ads1293_error_t* e1) { //
txcache[0] = 0xA1;
txcache[1] = 0x01;
memcpy(txcache + 2, e0, sizeof(ads1293_error_t));
memcpy(txcache + 2 + sizeof(ads1293_error_t), e1, sizeof(ads1293_error_t));
zdatachannel_data_send2(txcache, 2 + sizeof(ads1293_error_t) * 2);
}
void capture_error_state() {
ads1293_read_error(&m_ads1293_0, &error0);
ads1293_read_error(&m_ads1293_1, &error1);
#if 0
error0.estatus =1;
error0.error_range1 =2;
error0.error_range2 =3;
error0.error_range3 =4;
error0.error_sync =5;
error0.error_misc =6;
error1.estatus =21;
error1.error_range1 =22;
error1.error_range2 =23;
error1.error_range3 =24;
error1.error_sync =25;
error1.error_misc =26;
#endif
send_ads1293_error_state(&error0, &error1);
}
#pragma pack(1)
typedef struct {
uint32_t sample0;
} one_ch_cache_t;
typedef struct {
uint8_t h1;
uint8_t h2;
one_ch_cache_t data[3];
uint8_t e1;
uint8_t e2;
} one_frame_cache_t;
typedef struct {
one_frame_cache_t frame[8];
} one_packet_t;
#pragma unpack()
one_packet_t txpacket;
int cache_data_size = 0;
void trigger_capture() {
static uint32_t sample[6];
static uint8_t readystatus[2] = {0};
ads1293_read_ecgs(&m_ads1293_0, &sample[0]);
ads1293_read_ecgs(&m_ads1293_1, &sample[3]);
// static int i = 0;
// static int j = 0;
// i++;
// if (i % 8 == 0) {
// j++;
// }
// sample[0] = j;
// sample[3] = j;
// sample[4] = j;
// TI_ADS1293_DATA_STATUS_REG
// readystatus[0] = ads1293_read_ready_status(&m_ads1293_0);
// readystatus[1] = ads1293_read_ready_status(&m_ads1293_1);
{
txpacket.frame[cache_data_size].h1 = 0xA2;
txpacket.frame[cache_data_size].h2 = 0x2;
txpacket.frame[cache_data_size].data[0].sample0 = sample[0];
txpacket.frame[cache_data_size].data[1].sample0 = sample[3];
txpacket.frame[cache_data_size].data[2].sample0 = sample[4];
txpacket.frame[cache_data_size].e1 = 0x2;
txpacket.frame[cache_data_size].e2 = 0xA2;
cache_data_size++;
if (cache_data_size == 8) {
zdatachannel_data_send2((uint8_t*)&txpacket, sizeof(one_packet_t));
cache_data_size = 0;
}
}
}
uint32_t m_changecount = 0;
static void ads1293_ready_pin_irq(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { //
m_changecount++;
trigger_capture();
}
void setup() {
//
zble_module_start_adv();
SampleDataMgr_init();
SampleDataMgr_changeToLocalMode();
ads1293_init();
SampleDataMgr_changeToExtMode();
ads1293_start_conversion(&m_ads1293_0);
ads1293_start_conversion(&m_ads1293_1);
nrf_gpio_cfg_input(ADS1293_READY_PIN, NRF_GPIO_PIN_PULLUP);
{
nrf_gpio_cfg_input(ADS1293_READY_PIN, NRF_GPIO_PIN_PULLUP);
ZERROR_CHECK(nrfx_gpiote_init());
nrf_drv_gpiote_in_config_t inConfig = GPIOTE_CONFIG_IN_SENSE_TOGGLE(false); // 沿
inConfig.pull = NRF_GPIO_PIN_PULLUP; //
inConfig.sense = NRF_GPIOTE_POLARITY_HITOLO; // 沿
ZERROR_CHECK(nrfx_gpiote_in_init(ADS1293_READY_PIN, &inConfig, ads1293_ready_pin_irq));
nrfx_gpiote_in_event_enable(ADS1293_READY_PIN, true);
}
while (true) {
app_sched_execute();
NRF_LOG_PROCESS();
static bool state = false;
static uint32_t last_ticket = 0;
bool now = get_ready_pin_state_get();
uint32_t nowticket = znordic_getpower_on_s();
// if (state != now) {
// state = now;
// m_changecount++;
// if (now) {
// // trigger_capture();
// }
// }
if (last_ticket != nowticket) {
last_ticket = nowticket;
ZLOGI("%d changecount:%d\n", znordic_getpower_on_ms(), m_changecount);
capture_error_state();
m_changecount = 0;
}
}
}

49
app/src/app_ble_service.c

@ -7,6 +7,7 @@
#include "basic/device_version_info_mgr.h"
#include "board/board.h"
#include "board/board_battery_state.h"
#include "board/device_exception_manager.h"
#include "device_ctrl_service.h"
#include "heart_wave_sample_service.h"
#include "sample_data_manager_service.h"
@ -239,11 +240,15 @@ static void RecordUpload_tmr_cb(void* p_context) { //
}
int RecordUpload_start(sample_data_filename_t* recordid) {
//
//
//
m_upload_cnt = 0;
SampleDataMgr_changeToLocalMode();
if (DeviceExceptionMgr_has_error()) {
return kifyhrs_ecode_device_exception;
}
if (!SampleDataMgr_changeToLocalMode()) {
return kifyhrs_ecode_device_exception;
}
m_upload_fd = SampleDataMgr_open(recordid, kwrflag_read_only);
if (m_upload_fd <= 0) {
@ -367,6 +372,11 @@ static void prvf_process_ble_rx_data(void* p_event_data, uint16_t len) {
else if (cmd == ify_hrs_cmd_start_capture) {
// hwss_start_capture();
if (DeviceExceptionMgr_has_error()) {
send_error_receipt(rxheader, kifyhrs_ecode_device_exception);
return;
}
if (RecordUpload_is_uploading()) {
ZLOGI("uploading,can not start capture");
send_error_receipt(rxheader, kifyhrs_ecode_device_busy);
@ -418,7 +428,6 @@ static void prvf_process_ble_rx_data(void* p_event_data, uint16_t len) {
}
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使便
@ -545,21 +554,31 @@ static void prvf_process_ble_rx_data(void* p_event_data, uint16_t len) {
send_success_receipt(rxheader, 0);
}
// ify_hrs_cmd_read_device_exception_state = 21,
// ify_hrs_cmd_clear_device_exception_state = 22,
// ify_hrs_cmd_read_ads1293_cfg_type = 23,
else if (cmd == ify_hrs_cmd_read_device_exception_state) {
uint16_t exception_state = (uint16_t)DeviceExceptionMgr_get_state_u16();
txheader->data[0] = exception_state >> 0;
txheader->data[1] = exception_state >> 8;
zdatachannel_data_send2(m_txbuf, sizeof(ify_hrs_packet_t) + 2);
}
else if (cmd == ify_hrs_cmd_read_ads1293_cfg_type) {
uint8_t cfg_type = hwss_read_cfg_type();
txheader->data[0] = cfg_type;
zdatachannel_data_send2(m_txbuf, sizeof(ify_hrs_packet_t) + 1);
}
//
else {
send_error_receipt(rxheader, kifyhrs_ecode_cmd_not_support);
}
}
static const char* dropstate(uint8_t drop0, uint8_t drop1) {
static char state[128];
sprintf(state, "drop0:%d%d%d%d-%d%d%d%d drop1:%d%d%d%d-%d%d%d%d", //
drop0 & 0x80 ? 1 : 0, drop0 & 0x40 ? 1 : 0, drop0 & 0x20 ? 1 : 0, drop0 & 0x10 ? 1 : 0, //
drop0 & 0x08 ? 1 : 0, drop0 & 0x04 ? 1 : 0, drop0 & 0x02 ? 1 : 0, drop0 & 0x01 ? 1 : 0, //
drop1 & 0x80 ? 1 : 0, drop1 & 0x40 ? 1 : 0, drop1 & 0x20 ? 1 : 0, drop1 & 0x10 ? 1 : 0, //
drop1 & 0x08 ? 1 : 0, drop1 & 0x04 ? 1 : 0, drop1 & 0x02 ? 1 : 0, drop1 & 0x01 ? 1 : 0 //
);
return state;
}
void AppBleService_onServiceInitCB() {
ZLOGI("init zdatachannel service");
static zdatachannel_init_t zdatachannle_init;

1
app/src/basic/device_version_info_mgr.c

@ -32,7 +32,6 @@ uint16_t device_info_read_bootloader_version(void) { return BOOTLOADER_VERSION;
uint16_t device_info_read_firmware_version(void) { return FIRMWARE_VERSION; }
uint16_t device_info_read_hardware_version(void) { return HARDWARE_VERSION; }
static void uict_write_test(void) {}
void device_info_change_sn(uint32_t lot, uint32_t id) {
// ZLOGI("sn to %d %d", NRF_UICR->CUSTOMER[0], NRF_UICR->CUSTOMER[1]);

9
app/src/basic/filters.c

@ -2,6 +2,7 @@
#include <stdint.h>
#include <string.h>
#include <math.h>
#define PI 3.14159265358979323846
/********************************************************************************************************
@ -80,12 +81,12 @@ void NOTCHFilter_Init(NOTCHFilter *filter, float centerFreqHz, float notchWidthH
float ww_rps = 2.0 * PI * notchWidthHz;
// pre warp center frequency
float w0_pw_rps = (2.0 / sampleTimeS) * tanf(0.5 * w0_rps * sampleTimeS);
float w0_pw_rps = (2.0f / sampleTimeS) * (float)tanf(0.5f * w0_rps * sampleTimeS);
// computing filter coefficients
filter->alpha = 4.0 + w0_rps * w0_pw_rps * sampleTimeS * sampleTimeS;
filter->beta = 2.0 * ww_rps * sampleTimeS;
filter->alpha = 4.0f + w0_rps * w0_pw_rps * sampleTimeS * sampleTimeS;
filter->beta = 2.0f * ww_rps * sampleTimeS;
// clearing input and output buffers
@ -106,7 +107,7 @@ float NOTCHFilter_Update(NOTCHFilter *filter, float vin) {
filter->vin[0] = vin;
// compute new output
filter->vout[0] = (filter->alpha * filter->vin[0] + 2.0 * (filter->alpha - 8.0) * filter->vin[1] + filter->alpha * filter->vin[2] - (2.0f * (filter->alpha - 8.0) * filter->vout[1] + (filter->alpha - filter->beta) * filter->vout[2])) / (filter->alpha + filter->beta);
filter->vout[0] = (filter->alpha * filter->vin[0] + 2.0f * (filter->alpha - 8.0f) * filter->vin[1] + filter->alpha * filter->vin[2] - (2.0f * (filter->alpha - 8.0f) * filter->vout[1] + (filter->alpha - filter->beta) * filter->vout[2])) / (filter->alpha + filter->beta);
return (filter->vout[0]);
}

2
app/src/basic/version.h

@ -2,7 +2,7 @@
#define CATEGORY "M1002" // Èýµ¼Áª
#define MANUFACTURER_NAME "iflytop"
#define FIRMWARE_VERSION (20)
#define FIRMWARE_VERSION (21)
#define BLESTACK_VERSION 1
#define BOOTLOADER_VERSION 1
#define HARDWARE_VERSION (1)

17
app/src/basic/watch_dog.c

@ -1,17 +0,0 @@
/*********************************************************************
* INCLUDES
*/
#include "nrf_drv_wdt.h"
nrf_drv_wdt_channel_id m_channel_id;
void wd_init() {
// WDT_CONFIG_RELOAD_VALUE ,ms
nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
config.reload_value = WDT_CONFIG_RELOAD_VALUE;
ret_code_t err_code = nrf_drv_wdt_init(&config, NULL);
ZERROR_CHECK(err_code);
err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
ZERROR_CHECK(err_code);
nrf_drv_wdt_enable();
}
void wd_feed() { nrfx_wdt_feed(); }

15
app/src/board/board_beep_ctrl.c

@ -1,6 +1,5 @@
#include "board_beep_ctrl.h"
#define BEEP_TIMER_INTERVAL (150)
#if 1
APP_TIMER_DEF(m_beep_tmr); //
static nrf_drv_pwm_t m_beep_pwm0 = NRF_DRV_PWM_INSTANCE(BEEP_PWM_INSTANCE);
@ -118,16 +117,4 @@ void BoardBeepCtrl_setEffect(BoardBeepEffect_t effect) {
else {
app_timer_start(m_beep_tmr, APP_TIMER_TICKS(BEEP_TIMER_INTERVAL), NULL);
}
}
#else
void BoardBeepCtrl_init(void) {}
void BoardBeepCtrl_load() {}
void BoardBeepCtrl_unload() {}
void BoardBeepCtrl_set(uint8_t state) {}
void BoardBeepCtrl_setEffect(BoardBeepEffect_t effect) {}
#endif
}

3
app/src/board/board_button.c

@ -12,10 +12,11 @@ void button_process_handler(uint8_t pin_no, uint8_t button_action) {
m_cb(kButton_mainButton, (ButtonAction_t)button_action);
}
}
#if 0
static app_button_cfg_t buttons[] = {
{BUTTON_PIN, true, NRF_GPIO_PIN_PULLUP, button_process_handler},
};
#endif
void BoardButton_Init(board_button_cb_t cb) { //
m_cb = cb;
// ZERROR_CHECK(app_button_init(buttons, ARRAY_SIZE(buttons), BUTTON_DETECTION_DELAY));

23
app/src/board/board_light_ctrl.c

@ -4,14 +4,12 @@
#include "znordic.h"
#define BLINK_CNT 1
#define BLINK_PERIOD_MS (100)
#define BLINK_PERIOD_MS (49)
#define QUICK_BLINK_PERIOD_MS (100)
#define SLOW_BLINK_PERIOD_MS (2000)
#define LIGHT_PWM_DRIVER 1
// LED_GREEN_PIN
#if LIGHT_PWM_DRIVER
typedef struct {
nrf_drv_pwm_t driver;
@ -20,7 +18,6 @@ typedef struct {
nrf_drv_pwm_config_t config;
} pwm_light_ctrl_t;
#endif
static pwm_light_ctrl_t light_ctrl = {
.driver = NRF_DRV_PWM_INSTANCE(LIGHT_PWM_INSTANCE),
@ -62,22 +59,12 @@ static bool m_boardlight_greenlightstate = false;
void BoardLight_toggleGreenLightState() { BoardLight_setGreenLightState(!m_boardlight_greenlightstate); }
void BoardLight_setGreenLightState(bool state) {
m_boardlight_greenlightstate = state;
#if LIGHT_PWM_DRIVER
if (state) {
light_ctrl.seq_values.channel_0 = 97; // top_value
nrfx_pwm_simple_playback(&light_ctrl.driver, &light_ctrl.seq, 1, NRF_DRV_PWM_FLAG_LOOP);
} else {
nrfx_pwm_stop(&light_ctrl.driver, true);
}
#else
if (state) {
nrf_gpio_pin_set(LED_GREEN_PIN);
m_led_green_light_state = true;
} else {
nrf_gpio_pin_clear(LED_GREEN_PIN);
m_led_green_light_state = false;
}
#endif
}
static void BoardLight_effect_tmr_handler(void* p_context) { //
@ -114,13 +101,9 @@ static void BoardLight_effect_tmr_handler(void* p_context) { //
void BoardLight_Init() {
ZERROR_CHECK(app_timer_create(&m_green_light_effect_tmr, APP_TIMER_MODE_REPEATED, BoardLight_effect_tmr_handler));
#if LIGHT_PWM_DRIVER
// APP_ERROR_CHECK(nrfx_pwm_init(&light_ctrl.driver, &light_ctrl.config, NULL));
#else
znrf_gpio_cfg_output(LED_GREEN_PIN, NRF_GPIO_PIN_NOPULL);
#endif
}
void BoardLight_load() { APP_ERROR_CHECK(nrfx_pwm_init(&light_ctrl.driver, &light_ctrl.config, NULL)); }
void BoardLight_load() { nrfx_pwm_init(&light_ctrl.driver, &light_ctrl.config, NULL); }
void BoardLight_unload() {
BoardLight_setGreenLightEffect(kLightEffect_close);
nrfx_pwm_uninit(&light_ctrl.driver);

20
app/src/board/board_sdcard_driver.c

@ -1,6 +1,7 @@
#include "board/board_sdcard_driver.h"
#include "board/board.h"
#include "device_exception_manager.h"
#include "znordic.h"
/*******************************************************************************
* ½á¹¹Ìå¨Òå *
@ -118,6 +119,9 @@ void Board_sdcardConnectToInternal() {
return;
}
device_exception_state_t* estate = DeviceExceptionMgr_get_state();
estate->sdcard_error = 0;
/**
* @brief
* 0. Ï¿ªSD¿¨µçÔ´
@ -150,21 +154,25 @@ void Board_sdcardConnectToInternal() {
disk_state = disk_initialize(0);
}
if (disk_state != 0) {
NRF_LOG_INFO("Disk initialization failed. %d", disk_state);
ZASSERT(0);
NRF_LOG_ERROR("Disk initialization failed. %d", disk_state);
estate->sdcard_error = 1;
nrf_gpio_pin_write(SDCARD_USBDRIVER_IC_JUNCTION_CTRL_NOE_PIN, 0);
return;
}
NRF_LOG_INFO("Disk initialization succeeded.");
FRESULT ff_result;
ff_result = f_mount(&m_fs, "", 1);
if (ff_result) {
NRF_LOG_INFO("Mount failed.");
ZASSERT(0);
NRF_LOG_ERROR("Mount failed.");
disk_uninitialize(0);
estate->sdcard_error = 1;
nrf_gpio_pin_write(SDCARD_USBDRIVER_IC_JUNCTION_CTRL_NOE_PIN, 0);
return;
}
uint32_t blocks_per_mb = (1024uL * 1024uL) / m_block_dev_sdc.block_dev.p_ops->geometry(&m_block_dev_sdc.block_dev)->blk_size;
uint32_t capacity = m_block_dev_sdc.block_dev.p_ops->geometry(&m_block_dev_sdc.block_dev)->blk_count / blocks_per_mb;
ZLOGI("Mount success");
NRF_LOG_INFO("Capacity: %d MB", capacity);
NRF_LOG_ERROR("Capacity: %d MB", capacity);
m_connectTo = kConnectToInternal;
}

23
app/src/board/device_exception_manager.c

@ -0,0 +1,23 @@
#include "device_exception_manager.h"
#include <stdio.h>
#include <string.h>
static device_exception_state_t device_exception_state = {0};
device_exception_state_t *DeviceExceptionMgr_get_state() { //
return &device_exception_state;
}
uint16_t DeviceExceptionMgr_get_state_u16(){
return *(uint16_t *)&device_exception_state;
}
void DeviceExceptionMgr_clear_all_errors() { //
memset(&device_exception_state, 0, sizeof(device_exception_state_t));
}
bool DeviceExceptionMgr_has_error() {
uint16_t state = *(uint16_t *)&device_exception_state;
return state != 0;
}

17
app/src/board/device_exception_manager.h

@ -0,0 +1,17 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
typedef struct {
uint16_t sdcard_error : 1;
uint16_t ads1293_spi_inited_fail : 1;
uint16_t ads1293_detect_error : 1;
uint16_t ads1293_setting_error : 1;
uint16_t mark : 13;
} device_exception_state_t;
device_exception_state_t *DeviceExceptionMgr_get_state();
uint16_t DeviceExceptionMgr_get_state_u16();
bool DeviceExceptionMgr_has_error();
void DeviceExceptionMgr_clear_all_errors();

11
app/src/device_ctrl_service.c

@ -171,10 +171,8 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { //
*******************************************************************************/
if (event->eventType == kevent_ble_connect_event) {
BoardLight_setGreenLightEffect(kLightEffect_slowFlash);
return;
} else if (event->eventType == kevent_ble_disconnect_event) {
BoardLight_setGreenLightEffect(kLightEffect_quickFlash);
return;
}
/*******************************************************************************
@ -201,12 +199,15 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { //
prvf_change_to_standby_state();
}
}
//
if (event->eventType == kevent_ble_disconnect_event) {
prvf_change_to_standby_state();
}
if (event->eventType == kevent_start_sample_cmd_event) {
ZLOGI("start sample");
// SD卡连接到单片机
SampleDataMgr_changeToLocalMode();
// hwss_load();
//
m_sample_data_fd = SampleDataMgr_open(cratefilename(), kwrflag_write_only);
ZASSERT(m_sample_data_fd > 0);
@ -307,6 +308,8 @@ void DeviceCtrl_init() {
BoardBeepCtrl_init();
//
BoardLight_Init();
BoardLight_load();
BoardLight_setGreenLightState(true);
//
BoardButton_Init(board_button_cb);
//
@ -333,8 +336,6 @@ void DeviceCtrl_init() {
//
prvf_change_to_ready_state();
// wd_init();
ZERROR_CHECK(app_timer_create(&m_state_machine_driver_tmr, APP_TIMER_MODE_REPEATED, state_machine_driver_tmr_cb));
ZERROR_CHECK(app_timer_start(m_state_machine_driver_tmr, APP_TIMER_TICKS(100), NULL)); // 200HZ采样
}

71
app/src/heart_wave_sample_service.c

@ -7,8 +7,10 @@
#include "app_event_distribute.h"
#include "basic/ads1293/ads1293.h"
#include "basic/filters.h"
#include "board/device_exception_manager.h"
#include "nrf_drv_gpiote.h"
#include "nrfx_timer.h"
#include "sample_data_manager_service.h"
#define CHANNEL_NUM 2
@ -95,7 +97,7 @@ static uint8_t m_ads1293_raw_lod_state1;
volatile static bool m_drop_state_triggered = false;
static uint32_t m_capture_start_s;
static bool m_ads1293_loadfail = false;
static uint8_t m_cfg_type = 0;
LPFilter lowpassfilter[3];
MedianFilter_t medianFilter[3];
@ -239,7 +241,7 @@ static void ads1293_spi_writereg_and_check(ads1293_t *ads, uint8_t addr, uint8_t
ads1293_spi_writereg_and_readbak(ads, addr, data, &readbak);
if (readbak != data) {
ZLOGE("ads_%d write reg 0x%x failed\n", ads->id, addr);
m_ads1293_loadfail = true;
DeviceExceptionMgr_get_state()->ads1293_setting_error = 1;
}
}
@ -302,16 +304,24 @@ static void ads1293_load_cfg(ads1293_t *ads) {
tryloadcfg_from_fatfs(cfgfile, cfg_cache, ZARRAY_SIZE(cfg_cache), &cfgsize);
if (cfgsize != 0) {
ZLOGI("ads_%d load %s from fatfs\n", ads->id, cfgfile);
ZASSERT(cfgsize == defaultCfgSize);
if (cfgsize != defaultCfgSize) {
DeviceExceptionMgr_get_state()->ads1293_setting_error = 1;
return;
}
for (uint16_t i = 0; i < cfgsize; i++) {
ZASSERT(cfg_cache[i].add == defaultCfg[i].add);
if (cfg_cache[i].add != defaultCfg[i].add) {
DeviceExceptionMgr_get_state()->ads1293_setting_error = 1;
return;
}
ads1293_spi_writereg_and_check(ads, cfg_cache[i].add, cfg_cache[i].data);
}
m_cfg_type |= (1 << ads->id);
} else {
ZLOGI("ads_%d load cfg from default\n", ads->id);
for (uint16_t i = 0; i < defaultCfgSize; i++) {
ads1293_spi_writereg_and_check(ads, defaultCfg[i].add, defaultCfg[i].data);
}
m_cfg_type &= ~(1 << ads->id);
}
}
@ -371,7 +381,6 @@ static void update_lod_error() {
}
static void ads1293_init() {
m_ads1293_loadfail = false;
/*******************************************************************************
* SPI初始化 *
*******************************************************************************/
@ -383,7 +392,13 @@ static void ads1293_init() {
spi_config.frequency = NRF_DRV_SPI_FREQ_8M;
spi_config.mode = NRF_DRV_SPI_MODE_3;
// spi_config.mode =
ZERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, NULL, NULL));
uint32_t ecode = nrf_drv_spi_init(&spi, &spi_config, NULL, NULL);
if (ecode != NRF_SUCCESS) {
ZLOGI("%s:%d ZERROR_CHECK(nrf_drv_spi_init) fail:%d", __FILE__, __LINE__, ecode);
DeviceExceptionMgr_get_state()->ads1293_spi_inited_fail = 1;
return;
}
znrf_gpio_cfg_output(ADS1293_SPI_CS0_PIN, NRF_GPIO_PIN_NOPULL);
znrf_gpio_cfg_output(ADS1293_SPI_CS1_PIN, NRF_GPIO_PIN_NOPULL);
@ -404,27 +419,13 @@ static void ads1293_init() {
m_ads1293_driver_is_inited = true;
uint8_t revid = ads1293_spi_readreg(&m_ads1293_0, TI_ADS1293_REVID_REG);
ZLOGI("ads1293_0 revid: %d\n", revid);
if (revid != 1) {
DeviceExceptionMgr_get_state()->ads1293_detect_error = 1;
}
revid = ads1293_spi_readreg(&m_ads1293_1, TI_ADS1293_REVID_REG);
ZLOGI("ads1293_1 revid: %d\n", revid);
// ads1293_spi_writereg(&m_ads1293_0, TI_ADS1293_CONFIG_REG, 0);
SampleDataMgr_changeToLocalMode();
ads1293_load_cfg(&m_ads1293_0);
ads1293_load_cfg(&m_ads1293_1);
SampleDataMgr_changeToExtMode();
// for (uint16_t i = 0; i < ZARRAY_SIZE(m_prvads0cfg); i++) {
// ads1293_spi_writereg_and_check(&m_ads1293_0, m_prvads0cfg[i].add, m_prvads0cfg[i].data);
// }
// for (uint16_t i = 0; i < ZARRAY_SIZE(m_prvads1cfg); i++) {
// ads1293_spi_writereg_and_check(&m_ads1293_1, m_prvads1cfg[i].add, m_prvads1cfg[i].data);
// }
/**
* @brief READY引脚中断初始化
*/
if (revid != 1) {
DeviceExceptionMgr_get_state()->ads1293_detect_error = 1;
}
}
static void ads1293_sample_one_frame() {
if (!m_work_flag) {
@ -530,8 +531,11 @@ void hwss_unload(void) {
uint32_t hwss_started_has_passed_s(void) { return znordic_getpower_on_s() - m_capture_start_s; }
uint8_t hwss_read_cfg_type() { return m_cfg_type; }
void hwss_start_capture(void) {
ZASSERT(!m_ads1293_loadfail);
ZASSERT(!DeviceExceptionMgr_has_error());
nrf_gpio_cfg_input(LINE_DET_PIN, NRF_GPIO_PIN_PULLUP);
m_drop_state_triggered = false;
@ -552,6 +556,18 @@ void hwss_start_capture(void) {
// ads1293_start_conversion(&m_ads1293_0);
// ads1293_start_conversion(&m_ads1293_1);
ads1293_spi_writereg(&m_ads1293_0, TI_ADS1293_CONFIG_REG, 0);
ads1293_spi_writereg(&m_ads1293_1, TI_ADS1293_CONFIG_REG, 0);
/**
* @brief
*/
ZASSERT(SampleDataMgr_isInLocalMode());
{
ads1293_load_cfg(&m_ads1293_0);
ads1293_load_cfg(&m_ads1293_1);
}
{
//
nrf_gpio_pin_clear(ADS1293_SPI_CS0_PIN);
@ -568,6 +584,7 @@ void hwss_start_capture(void) {
nrfx_gpiote_in_event_enable(ADS1293_READY_PIN, true);
}
void hwss_stop_capture(void) {
nrfx_gpiote_in_event_enable(ADS1293_READY_PIN, false);

2
app/src/heart_wave_sample_service.h

@ -29,6 +29,8 @@ void hwss_start_capture(void);
*/
void hwss_stop_capture(void);
uint8_t hwss_read_cfg_type();
bool hwss_is_capturing(void);
uint32_t hwss_started_has_passed_s(void);

20
app/src/sample_data_manager_service.c

@ -2,6 +2,7 @@
#include "board/board.h"
#include "board/board_sdcard_driver.h"
#include "board/device_exception_manager.h"
#include "znordic.h"
/*******************************************************************************
* *
@ -71,22 +72,25 @@ void SampleDataMgr_init() {
void SampleDataMgr_loadDriver() {
// donothing
}
void SampleDataMgr_unloadDriver() {
Board_sdcardUnInit();
}
void SampleDataMgr_unloadDriver() { Board_sdcardUnInit(); }
typedef struct {
uint8_t filename[8];
uint32_t filesize;
} disk_state_t;
bool SampleDataMgr_isInLocalMode() { return Board_sdcardGetConnectTo() == kConnectToInternal; }
/**
* @brief
*/
void SampleDataMgr_changeToLocalMode() {
ZLOGI("change to local mode");
bool SampleDataMgr_changeToLocalMode() {
Board_sdcardConnectToInternal();
if (DeviceExceptionMgr_get_state()->sdcard_error) {
return false;
}
read_file_info();
return true;
}
/**
* @brief typec
@ -111,6 +115,12 @@ static FIL m_default_file_handler;
static bool m_is_open;
int32_t SampleDataMgr_open(sample_data_filename_t* filename, wrflag_t flag) {
if (DeviceExceptionMgr_get_state()->sdcard_error) {
return -1;
}
ZASSERT(SampleDataMgr_isInLocalMode());
if (flag == kwrflag_write_only) {
FRESULT ff_result = f_open(&m_default_file_handler, (const TCHAR*)"0.bin", FA_CREATE_ALWAYS | FA_READ | FA_WRITE);
ZASSERT(ff_result == FR_OK);

4
app/src/sample_data_manager_service.h

@ -54,12 +54,14 @@ void SampleDataMgr_unloadDriver();
/**
* @brief
*/
void SampleDataMgr_changeToLocalMode();
bool SampleDataMgr_changeToLocalMode();
/**
* @brief typec
*/
void SampleDataMgr_changeToExtMode();
bool SampleDataMgr_isInLocalMode();
/*******************************************************************************
* FILE_OPERATION *
*******************************************************************************/

2
dynamic_electrocardiograph_ble_server

@ -1 +1 @@
Subproject commit b6bd39498f17312e42fb19c0920feea43493ea1d
Subproject commit a1cff30cf7bc44f0f12fd0a9623603a6a0060ae5

2
ify_hrs_protocol

@ -1 +1 @@
Subproject commit a6a574153392f38ed65b6d8190b06bb93c82049c
Subproject commit 192db524c562d22760899ba950f8c2bd493b3660

2
libznordic

@ -1 +1 @@
Subproject commit a5cc5239adb61162d87d7109c9e6710d70c58d36
Subproject commit 04a821d35a191bd55a540a0ee3cb04cb35e0d06e

15576
release/V21/three_lead_ecg_v21.hex
File diff suppressed because it is too large
View File

BIN
release/V21/three_lead_ecg_v21.zip

2
sdk

@ -1 +1 @@
Subproject commit cbdf2ba8b6fa07b55b17b82f5eb296b12e6f2040
Subproject commit 85cbd26451dabe41150d375647ccd23b85c42b00
Loading…
Cancel
Save