Browse Source

update

master
zhaohe 1 year ago
parent
commit
a3c1b98ba8
  1. 4
      .vscode/settings.json
  2. 8
      README.md
  3. 174
      app/app.uvoptx
  4. 16
      app/app.uvprojx
  5. 2
      app/src/basic/ads1293/ads1293.h
  6. 2
      app/src/basic/device_version_info_mgr.c
  7. 113
      app/src/basic/filters.c
  8. 56
      app/src/basic/filters.h
  9. 2
      app/src/board/board.h
  10. 4
      app/src/board/board_beep_ctrl.c
  11. 10
      app/src/device_ctrl_service.c
  12. 99
      app/src/heart_wave_sample_service.c

4
.vscode/settings.json

@ -111,7 +111,9 @@
"compiler_abstraction.h": "c",
"ble_nus_c.h": "c",
"device_version_info_mgr.h": "c",
"heart_wave_sample_service_cfg.h": "c"
"heart_wave_sample_service_cfg.h": "c",
"filter.h": "c",
"filters.h": "c"
},
"files.encoding": "gbk"
}

8
README.md

@ -58,13 +58,17 @@ TODO2:
7. 采集中导联脱落蜂鸣器响 OK
8. 采集中导联脱落事件上报 OK
2. 采集上报测试 (OK1/2)
3. 未采集,蓝牙断开,自动休眠测试
2. 采集上报测试 (OK1/2)OK
3. 未采集,蓝牙断开,自动休眠测试 2)OK
3. 蓝牙连接,5分钟没有收到任何消息,自动休眠
4. 电池电量检测测试
5. 记录读取测试
6. 导联掉落测试 OK
BUG:
实时上报,第三个通道数据即便上报数据为0,也会突然出现一个突变数据。暂时未发现原因
```

174
app/app.uvoptx

@ -563,6 +563,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\src\basic\filters.c</PathWithFileName>
<FilenameWithoutPath>filters.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -573,7 +585,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>16</FileNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -593,7 +605,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -605,7 +617,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -625,7 +637,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>19</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -645,7 +657,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>20</FileNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -657,7 +669,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>21</FileNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -669,7 +681,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>22</FileNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -681,7 +693,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -693,7 +705,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -705,7 +717,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -717,7 +729,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -729,7 +741,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -749,7 +761,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -769,7 +781,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -781,7 +793,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -793,7 +805,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -805,7 +817,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>32</FileNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -817,7 +829,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>33</FileNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -829,7 +841,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>34</FileNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -841,7 +853,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>35</FileNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -853,7 +865,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -865,7 +877,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -877,7 +889,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -889,7 +901,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -901,7 +913,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>40</FileNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -913,7 +925,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>41</FileNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -925,7 +937,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>42</FileNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -937,7 +949,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>43</FileNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -949,7 +961,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>44</FileNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -961,7 +973,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>45</FileNumber>
<FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -973,7 +985,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>46</FileNumber>
<FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -985,7 +997,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>47</FileNumber>
<FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -997,7 +1009,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>48</FileNumber>
<FileNumber>49</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1017,7 +1029,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>49</FileNumber>
<FileNumber>50</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1029,7 +1041,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>50</FileNumber>
<FileNumber>51</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1041,7 +1053,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>51</FileNumber>
<FileNumber>52</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1053,7 +1065,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>52</FileNumber>
<FileNumber>53</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1065,7 +1077,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>53</FileNumber>
<FileNumber>54</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1077,7 +1089,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>54</FileNumber>
<FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1089,7 +1101,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>55</FileNumber>
<FileNumber>56</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1101,7 +1113,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>56</FileNumber>
<FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1113,7 +1125,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>57</FileNumber>
<FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1125,7 +1137,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>58</FileNumber>
<FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1137,7 +1149,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>59</FileNumber>
<FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1149,7 +1161,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>60</FileNumber>
<FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1161,7 +1173,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>61</FileNumber>
<FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1173,7 +1185,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>62</FileNumber>
<FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1185,7 +1197,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>63</FileNumber>
<FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1197,7 +1209,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>64</FileNumber>
<FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1209,7 +1221,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>65</FileNumber>
<FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1221,7 +1233,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>66</FileNumber>
<FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1233,7 +1245,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>67</FileNumber>
<FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1245,7 +1257,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>68</FileNumber>
<FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1257,7 +1269,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>69</FileNumber>
<FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1269,7 +1281,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>70</FileNumber>
<FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1281,7 +1293,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>71</FileNumber>
<FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1293,7 +1305,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>72</FileNumber>
<FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1305,7 +1317,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>73</FileNumber>
<FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1317,7 +1329,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>74</FileNumber>
<FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1329,7 +1341,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>75</FileNumber>
<FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1349,7 +1361,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>76</FileNumber>
<FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1361,7 +1373,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>77</FileNumber>
<FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1373,7 +1385,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>78</FileNumber>
<FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1385,7 +1397,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>79</FileNumber>
<FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1397,7 +1409,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>80</FileNumber>
<FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1409,7 +1421,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>81</FileNumber>
<FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1429,7 +1441,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>82</FileNumber>
<FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1441,7 +1453,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>83</FileNumber>
<FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1453,7 +1465,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>84</FileNumber>
<FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1473,7 +1485,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>85</FileNumber>
<FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1485,7 +1497,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>86</FileNumber>
<FileNumber>87</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1497,7 +1509,7 @@
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>87</FileNumber>
<FileNumber>88</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1517,7 +1529,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>88</FileNumber>
<FileNumber>89</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1529,7 +1541,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>89</FileNumber>
<FileNumber>90</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1541,7 +1553,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>90</FileNumber>
<FileNumber>91</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1561,7 +1573,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>91</FileNumber>
<FileNumber>92</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1573,7 +1585,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>92</FileNumber>
<FileNumber>93</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1593,7 +1605,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>93</FileNumber>
<FileNumber>94</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1605,7 +1617,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>94</FileNumber>
<FileNumber>95</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1617,7 +1629,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>95</FileNumber>
<FileNumber>96</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1629,7 +1641,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>96</FileNumber>
<FileNumber>97</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

16
app/app.uvprojx

@ -134,11 +134,11 @@
<RunIndependent>0</RunIndependent>
<UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
<Capability>1</Capability>
<DriverSelection>4099</DriverSelection>
<DriverSelection>4096</DriverSelection>
</Flash1>
<bUseTDR>1</bUseTDR>
<Flash2>BIN\UL2CM3.DLL</Flash2>
<Flash3></Flash3>
<Flash3>"" ()</Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp>
@ -313,7 +313,7 @@
</ArmAdsMisc>
<Cads>
<interw>1</interw>
<Optim>1</Optim>
<Optim>4</Optim>
<oTime>0</oTime>
<SplitLS>0</SplitLS>
<OneElfS>1</OneElfS>
@ -458,6 +458,11 @@
<FileType>1</FileType>
<FilePath>.\src\basic\device_version_info_mgr.c</FilePath>
</File>
<File>
<FileName>filters.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\basic\filters.c</FilePath>
</File>
</Files>
</Group>
<Group>
@ -4297,6 +4302,11 @@
<FileType>1</FileType>
<FilePath>.\src\basic\device_version_info_mgr.c</FilePath>
</File>
<File>
<FileName>filters.c</FileName>
<FileType>1</FileType>
<FilePath>.\src\basic\filters.c</FilePath>
</File>
</Files>
</Group>
<Group>

2
app/src/basic/ads1293/ads1293.h

@ -121,6 +121,8 @@ void ads1293_spi_stream_readreg(ads1293_t* ads, uint8_t* data, uint8_t len);
void ads1293_read_ecg(ads1293_t* ads, uint32_t ch, uint32_t* data);
void ads1293_read_ecgs(ads1293_t* ads, uint32_t* data /*3*/);
void ads1293_read_ecgs_v2(ads1293_t* ads, int startoff, uint32_t* data, int num);
uint8_t ads1293_read_error_lod(ads1293_t* ads);
void ads1293_start_conversion(ads1293_t* ads);

2
app/src/basic/device_version_info_mgr.c

@ -16,7 +16,7 @@ void device_info_read_sn(sn_t *sn) {
static char sn_str[15];
sprintf(sn_str, CATEGORY "%04d%05d", lot, id);
if (lot == 0 || id == 0 || lot == 0xffffffff || id == 0xffffffff) {
sprintf(sn_str, "iflytop_test", 0, 0);
sprintf(sn_str, "iflytop_test");
}
memcpy(sn->sn, sn_str, sizeof(sn->sn));
}

113
app/src/basic/filters.c

@ -0,0 +1,113 @@
#include "filters.h"
#include <stdint.h>
#include <string.h>
#define PI 3.14159265358979323846
/********************************************************************************************************
* LOW PASS FILTER
********************************************************************************************************/
void LPFilter_Init(LPFilter *filter, float cutoffFreqHz, float sampleTimeS) {
float RC = 0.0;
RC = 1.0 / (2 * PI * cutoffFreqHz);
filter->coef[0] = sampleTimeS / (sampleTimeS + RC);
filter->coef[1] = RC / (sampleTimeS + RC);
filter->v_out[0] = 0.0;
filter->v_out[1] = 0.0;
}
float LPFilter_Update(LPFilter *filter, float v_in) {
filter->v_out[1] = filter->v_out[0];
filter->v_out[0] = (filter->coef[0] * v_in) + (filter->coef[1] * filter->v_out[1]);
return (filter->v_out[0]);
}
/********************************************************************************************************
* HIGH PASS FILTER
********************************************************************************************************/
void HPFilter_Init(HPFilter *filter, float cutoffFreqHz, float sampleTimeS) {
float RC = 0.0;
RC = 1.0 / (2 * PI * cutoffFreqHz);
filter->coef = RC / (sampleTimeS + RC);
filter->v_in[0] = 0.0;
filter->v_in[1] = 0.0;
filter->v_out[0] = 0.0;
filter->v_out[1] = 0.0;
}
float HPFilter_Update(HPFilter *filter, float v_in) {
filter->v_in[1] = filter->v_in[0];
filter->v_in[0] = v_in;
filter->v_out[1] = filter->v_out[0];
filter->v_out[0] = filter->coef * (filter->v_in[0] - filter->v_in[1] + filter->v_out[1]);
return (filter->v_out[0]);
}
/********************************************************************************************************
* BAND PASS FILTER
********************************************************************************************************/
void PBFilter_Init(PBFilter *filter, float HPF_cutoffFreqHz, float LPF_cutoffFreqHz, float sampleTimeS) {
LPFilter_Init(&filter->lpf, LPF_cutoffFreqHz, sampleTimeS);
HPFilter_Init(&filter->hpf, HPF_cutoffFreqHz, sampleTimeS);
filter->out_in = 0.0;
}
float PBFilter_Update(PBFilter *filter, float v_in) {
filter->out_in = HPFilter_Update(&filter->hpf, v_in);
filter->out_in = LPFilter_Update(&filter->lpf, filter->out_in);
return (filter->out_in);
}
/********************************************************************************************************
* NOTCH FILTER
********************************************************************************************************/
void NOTCHFilter_Init(NOTCHFilter *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS) {
// filter frequency to angular (rad/s)
float w0_rps = 2.0 * PI * centerFreqHz;
float ww_rps = 2.0 * PI * notchWidthHz;
// pre warp center frequency
float w0_pw_rps = (2.0 / sampleTimeS) * tanf(0.5 * w0_rps * sampleTimeS);
// computing filter coefficients
filter->alpha = 4.0 + w0_rps * w0_pw_rps * sampleTimeS * sampleTimeS;
filter->beta = 2.0 * ww_rps * sampleTimeS;
// clearing input and output buffers
for (uint8_t n = 0; n < 3; n++) {
filter->vin[n] = 0;
filter->vout[n] = 0;
}
}
float NOTCHFilter_Update(NOTCHFilter *filter, float vin) {
// shifting samples
filter->vin[2] = filter->vin[1];
filter->vin[1] = filter->vin[0];
filter->vout[2] = filter->vout[1];
filter->vout[1] = filter->vout[0];
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);
return (filter->vout[0]);
}

56
app/src/basic/filters.h

@ -0,0 +1,56 @@
#pragma once
#include <stdint.h>
/********************************************************************************************************
* LOW PASS FILTER
********************************************************************************************************/
typedef struct {
float coef[2];
float v_out[2];
} LPFilter;
void LPFilter_Init(LPFilter *filter, float cutoffFreqHz, float sampleTimeS);
float LPFilter_Update(LPFilter *filter, float v_in);
/********************************************************************************************************
* HIGH PASS FILTER
********************************************************************************************************/
typedef struct {
float coef;
float v_out[2];
float v_in[2];
} HPFilter;
void HPFilter_Init(HPFilter *filter, float cutoffFreqHz, float sampleTimeS);
float HPFilter_Update(HPFilter *filter, float v_in);
/********************************************************************************************************
* BAND PASS FILTER
********************************************************************************************************/
typedef struct {
LPFilter lpf;
HPFilter hpf;
float out_in;
} PBFilter;
void PBFilter_Init(PBFilter *filter, float HPF_cutoffFreqHz, float LPF_cutoffFreqHz, float sampleTimeS);
float PBFilter_Update(PBFilter *filter, float v_in);
/********************************************************************************************************
* NOTCH FILTER
********************************************************************************************************/
typedef struct {
float alpha;
float beta;
float vin[3];
float vout[3];
} NOTCHFilter;
void NOTCHFilter_Init(NOTCHFilter *filter, float centerFreqHz, float notchWidthHz, float sampleTimeS);
float NOTCHFilter_Update(NOTCHFilter *filter, float vin);

2
app/src/board/board.h

@ -65,7 +65,7 @@
#define LITTLE_DATA_BLOCK_FRAME_NUM 4 // 每两帧回调一次,对应100HZ
#define SAMPLE_PRECISION 24
#define APP_MAX_EVEN_SIZE MAX(APP_TIMER_SCHED_EVENT_DATA_SIZE, sizeof(app_event_t))
#define APP_MAX_EVEN_SIZE (MAX(APP_TIMER_SCHED_EVENT_DATA_SIZE, sizeof(app_event_t)) + 10)
#define APP_EVENT_QUEUE_SIZE 100
#define APP_AUTO_SLEEP_TIMEOUT_MS (30 * 1000) // 自动休眠时间

4
app/src/board/board_beep_ctrl.c

@ -22,7 +22,7 @@ static nrf_drv_pwm_config_t const m_beep_pwm0_config0 = {
.irq_priority = APP_IRQ_PRIORITY_LOWEST,
.base_clock = NRF_PWM_CLK_125kHz,
.count_mode = NRF_PWM_MODE_UP,
.top_value = 46, // 125kHz / 46 = 2.717k
.top_value = 56, // 125kHz / 46 = 2.717k
.load_mode = NRF_PWM_LOAD_INDIVIDUAL,
.step_mode = NRF_PWM_STEP_AUTO,
};
@ -84,7 +84,7 @@ void BoardBeepCtrl_unload() {
void BoardBeepCtrl_set(uint8_t state) {
if (state) {
m_beep_pwm0_seq_values.channel_0 = m_beep_pwm0_config0.top_value / 2; // top_value
m_beep_pwm0_seq_values.channel_0 = 10; // top_value
nrfx_pwm_simple_playback(&m_beep_pwm0, &m_beep_pwm0_seq, 1, NRF_DRV_PWM_FLAG_LOOP);
} else {
nrfx_pwm_stop(&m_beep_pwm0, true);

10
app/src/device_ctrl_service.c

@ -214,10 +214,12 @@ static void app_event_listener(void* p_event_data, uint16_t event_size) { //
uint8_t dropdata0 = hwss_get_drop_state0();
uint8_t dropdata1 = hwss_get_drop_state1();
if (dropdata0 || dropdata1) {
BoardBeepCtrl_setEffect(kBoardBeepEffect_continuousShortBeep);
} else {
BoardBeepCtrl_setEffect(kBoardBeepEffect_none);
if (DeviceCtrl_cur_state_haspassed_ms() > 3000) {
if ((dropdata0 || dropdata1)) {
BoardBeepCtrl_setEffect(kBoardBeepEffect_continuousShortBeep);
} else {
BoardBeepCtrl_setEffect(kBoardBeepEffect_none);
}
}
bool stopcapture = false;

99
app/src/heart_wave_sample_service.c

@ -6,6 +6,7 @@
#include "app_event.h"
#include "app_event_distribute.h"
#include "basic/ads1293/ads1293.h"
#include "basic/filters.h"
#include "nrf_drv_gpiote.h"
#include "nrfx_timer.h"
@ -25,6 +26,35 @@
#define FRAME_FILTER_INDEX_NUM 10 // 过滤帧数,每次启动采集后,过滤掉的帧数
#define GPIO_IRQ_TRIGGER_MODE 1
#define MEDIAN_FILTER_BUFFER_SIZE 5
typedef struct {
uint32_t val[MEDIAN_FILTER_BUFFER_SIZE];
uint32_t processbuf[MEDIAN_FILTER_BUFFER_SIZE];
int valcnt;
} MedianFilter_t;
void MedianFilter_Init(MedianFilter_t *filter) { filter->valcnt = 0; }
uint32_t MedianFilter_Update(MedianFilter_t *filter, uint32_t vin) { //
memcpy(&filter->val[1], &filter->val[0], MEDIAN_FILTER_BUFFER_SIZE * sizeof(filter->val[0]));
filter->val[0] = vin;
if (filter->valcnt < MEDIAN_FILTER_BUFFER_SIZE) {
filter->valcnt++;
return vin;
}
memcpy(filter->processbuf, filter->val, MEDIAN_FILTER_BUFFER_SIZE * sizeof(filter->val[0]));
for (int i = 0; i < MEDIAN_FILTER_BUFFER_SIZE; i++) {
for (int j = i + 1; j < MEDIAN_FILTER_BUFFER_SIZE; j++) {
if (filter->processbuf[i] > filter->processbuf[j]) {
uint32_t temp = filter->processbuf[i];
filter->processbuf[i] = filter->processbuf[j];
filter->processbuf[j] = temp;
}
}
}
return filter->processbuf[MEDIAN_FILTER_BUFFER_SIZE / 2];
}
/*******************************************************************************
* STRUCT *
*******************************************************************************/
@ -63,6 +93,8 @@ volatile static bool m_drop_state_triggered = false;
static uint32_t m_capture_start_s;
LPFilter lowpassfilter[3];
MedianFilter_t medianFilter[3];
/*******************************************************************************
* CONFIG *
*******************************************************************************/
@ -108,13 +140,13 @@ static inline void pFrameBufferAB_push_one_byte(uint8_t byte) {
* LittleDataBuffer操作 *
*******************************************************************************/
static inline void pLittleBlockCache_push_one_frame(uint32_t data0, uint32_t data1, uint32_t data2) {
static inline void pLittleBlockCache_push_one_frame(uint32_t *data) {
if (m_little_frame_index >= LITTLE_DATA_BLOCK_FRAME_NUM) {
return;
}
m_sensor_little_frame_cache[m_little_frame_index].data0 = data0;
m_sensor_little_frame_cache[m_little_frame_index].data1 = data1;
m_sensor_little_frame_cache[m_little_frame_index].data2 = data2;
m_sensor_little_frame_cache[m_little_frame_index].data0 = data[0];
m_sensor_little_frame_cache[m_little_frame_index].data1 = data[1];
m_sensor_little_frame_cache[m_little_frame_index].data2 = data[2];
m_little_frame_index++;
}
@ -397,25 +429,49 @@ static void ads1293_sample_one_frame() {
m_frame_index++;
//
if (!m_frame_buffer) pFrameBufferAB_switch();
static uint32_t sample[6];
ads1293_read_ecgs(&m_ads1293_0, &sample[0]);
#if CHANNEL_NUM == 2
#if 0
ads1293_read_ecgs(&m_ads1293_1, &sample[3]);
#if CHANNEL_NUM == 2
ads1293_read_ecgs(&m_ads1293_0, &sample[0]);
#endif
#endif
ads1293_read_ecg(&m_ads1293_1, 1, &sample[SENSOR1_ID]);
ads1293_read_ecg(&m_ads1293_1, 2, &sample[SENSOR2_ID]);
ads1293_read_ecg(&m_ads1293_0, 1, &sample[SENSOR0_ID]);
// medianFilter
static uint32_t val[3];
val[0] = MedianFilter_Update(&medianFilter[0], sample[SENSOR0_ID]);
val[1] = MedianFilter_Update(&medianFilter[1], sample[SENSOR1_ID]);
val[2] = MedianFilter_Update(&medianFilter[2], sample[SENSOR2_ID]);
// int32_t val0 = LPFilter_Update(&lowpassfilter[0], sample[SENSOR0_ID]);
// int32_t val1 = LPFilter_Update(&lowpassfilter[1], sample[SENSOR1_ID]);
// int32_t val2 = LPFilter_Update(&lowpassfilter[2], sample[SENSOR2_ID]);
// uint32_t val0 = sample[SENSOR0_ID];
// uint32_t val1 = sample[SENSOR1_ID];
// uint32_t val2 = sample[SENSOR2_ID];
if (val[0] > 0xffffff) val[0] = 0xffffff;
if (val[1] > 0xffffff) val[1] = 0xffffff;
if (val[2] > 0xffffff) val[2] = 0xffffff;
static uint8_t cache[9];
cache[0] = (sample[SENSOR0_ID] >> 0) & 0xff;
cache[1] = (sample[SENSOR0_ID] >> 8) & 0xff;
cache[2] = (sample[SENSOR0_ID] >> 16) & 0xff;
cache[0] = (val[0] >> 0) & 0xff;
cache[1] = (val[0] >> 8) & 0xff;
cache[2] = (val[0] >> 16) & 0xff;
cache[3] = (sample[SENSOR1_ID] >> 0) & 0xff;
cache[4] = (sample[SENSOR1_ID] >> 8) & 0xff;
cache[5] = (sample[SENSOR1_ID] >> 16) & 0xff;
cache[3] = (val[1] >> 0) & 0xff;
cache[4] = (val[1] >> 8) & 0xff;
cache[5] = (val[1] >> 16) & 0xff;
cache[6] = (sample[SENSOR2_ID] >> 0) & 0xff;
cache[7] = (sample[SENSOR2_ID] >> 8) & 0xff;
cache[8] = (sample[SENSOR2_ID] >> 16) & 0xff;
cache[6] = (val[2] >> 0) & 0xff;
cache[7] = (val[2] >> 8) & 0xff;
cache[8] = (val[2] >> 16) & 0xff;
/**
* @brief
@ -432,7 +488,7 @@ static void ads1293_sample_one_frame() {
/**
* @brief
*/
pLittleBlockCache_push_one_frame(sample[SENSOR0_ID], sample[SENSOR1_ID], sample[SENSOR2_ID]);
pLittleBlockCache_push_one_frame(val);
if (pLittleBlockCache_is_full()) {
pEventHelper_trigger_little_block_data_event();
pLittleBlockCache_reset();
@ -493,6 +549,15 @@ void hwss_start_capture(void) {
m_frame_index = 0;
m_frame_filter_index = 0;
m_capture_start_s = znordic_getpower_on_s();
LPFilter_Init(&lowpassfilter[0], 40, 0.0025);
LPFilter_Init(&lowpassfilter[1], 40, 0.0025);
LPFilter_Init(&lowpassfilter[2], 40, 0.0025);
MedianFilter_Init(&medianFilter[0]);
MedianFilter_Init(&medianFilter[1]);
MedianFilter_Init(&medianFilter[2]);
pLittleBlockCache_reset();
// ads1293_start_conversion(&m_ads1293_0);
// ads1293_start_conversion(&m_ads1293_1);

Loading…
Cancel
Save