|
|
|
|
@ -3,7 +3,7 @@
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="utf-8">
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
|
<meta name="generator" content="pdoc 14.6.1"/>
|
|
|
|
|
<meta name="generator" content="pdoc 14.7.0"/>
|
|
|
|
|
<title>colmi_r02_client.hr API documentation</title>
|
|
|
|
|
|
|
|
|
|
<style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
|
|
|
|
|
@ -140,7 +140,7 @@
|
|
|
|
|
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a>
|
|
|
|
|
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="sd"> I don't know why it's off by one, it just is.</span>
|
|
|
|
|
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="n">midnight</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="n">dt</span><span class="o">.</span><span class="n">year</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">month</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">day</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a> <span class="n">midnight</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">(</span><span class="n">dt</span><span class="o">.</span><span class="n">year</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">month</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">day</span><span class="p">,</span> <span class="n">tzinfo</span><span class="o">=</span><span class="n">dt</span><span class="o">.</span><span class="n">tzinfo</span><span class="p">)</span><span class="o">.</span><span class="n">timestamp</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a> <span class="n">delta</span> <span class="o">=</span> <span class="n">dt</span><span class="o">.</span><span class="n">timestamp</span><span class="p">()</span> <span class="o">-</span> <span class="n">midnight</span> <span class="c1"># seconds since midnight</span>
|
|
|
|
|
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a>
|
|
|
|
|
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a> <span class="k">return</span> <span class="nb">round</span><span class="p">(</span><span class="n">delta</span> <span class="o">/</span> <span class="mi">60</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
|
|
|
|
@ -178,9 +178,9 @@
|
|
|
|
|
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
|
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a>
|
|
|
|
|
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
|
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">:</span> <span class="n">datetime</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
|
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
|
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
@ -190,94 +190,95 @@
|
|
|
|
|
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a> <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a> <span class="k">if</span> <span class="n">d</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a> <span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="c1"># use local time</span>
|
|
|
|
|
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Comparing </span><span class="si">{</span><span class="n">d</span><span class="si">}</span><span class="s2"> to </span><span class="si">{</span><span class="n">now</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
|
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">year</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">year</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">month</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">month</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">)</span>
|
|
|
|
|
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a>
|
|
|
|
|
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">packet</span><span class="p">:</span> <span class="nb">bytearray</span><span class="p">)</span> <span class="o">-></span> <span class="n">HeartRateLog</span> <span class="o">|</span> <span class="n">NoData</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a><span class="w"> </span><span class="sa">r</span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="sd"> first byte of packet should always be CMD_READ_HEART_RATE (21)</span>
|
|
|
|
|
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a><span class="sd"> second byte is the sub_type</span>
|
|
|
|
|
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a>
|
|
|
|
|
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a><span class="sd"> sub_type 0 contains the lengths of things</span>
|
|
|
|
|
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a><span class="sd"> byte 2 is the number of expected packets after this.</span>
|
|
|
|
|
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a>
|
|
|
|
|
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a><span class="sd"> example: bytearray(b'\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002'),</span>
|
|
|
|
|
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span> <span class="c1"># use utc time</span>
|
|
|
|
|
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">year</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">year</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">month</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">month</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">)</span>
|
|
|
|
|
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a>
|
|
|
|
|
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">packet</span><span class="p">:</span> <span class="nb">bytearray</span><span class="p">)</span> <span class="o">-></span> <span class="n">HeartRateLog</span> <span class="o">|</span> <span class="n">NoData</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a><span class="w"> </span><span class="sa">r</span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a><span class="sd"> first byte of packet should always be CMD_READ_HEART_RATE (21)</span>
|
|
|
|
|
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="sd"> second byte is the sub_type</span>
|
|
|
|
|
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a>
|
|
|
|
|
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a><span class="sd"> sub_type 0 contains the lengths of things</span>
|
|
|
|
|
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a><span class="sd"> byte 2 is the number of expected packets after this.</span>
|
|
|
|
|
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a>
|
|
|
|
|
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a><span class="sd"> example: bytearray(b'\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002')</span>
|
|
|
|
|
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a>
|
|
|
|
|
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a>
|
|
|
|
|
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a>
|
|
|
|
|
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="n">sub_type</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
|
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">255</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"error response from heart rate log request"</span><span class="p">)</span>
|
|
|
|
|
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="k">return</span> <span class="n">NoData</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">()</span> <span class="ow">and</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">23</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># number of expected packets</span>
|
|
|
|
|
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
|
|
|
|
|
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">*</span> <span class="mi">13</span><span class="p">)</span>
|
|
|
|
|
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="k">elif</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="c1"># next 4 bytes are a timestamp</span>
|
|
|
|
|
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="n">ts</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack_from</span><span class="p">(</span><span class="s2">"<l"</span><span class="p">,</span> <span class="n">packet</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">2</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
|
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">ts</span><span class="p">,</span> <span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span>
|
|
|
|
|
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="c1"># TODO timezone?</span>
|
|
|
|
|
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a>
|
|
|
|
|
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="c1"># remaining 16 - type - subtype - 4 - crc = 9</span>
|
|
|
|
|
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">9</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
|
|
|
|
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">9</span>
|
|
|
|
|
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+</span> <span class="mi">13</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">15</span><span class="p">])</span>
|
|
|
|
|
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">13</span>
|
|
|
|
|
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a>
|
|
|
|
|
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a> <span class="nd">@property</span>
|
|
|
|
|
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a> <span class="k">def</span> <span class="nf">heart_rates</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
|
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="w"> </span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a><span class="sd"> Normalize and clean heart rate logs</span>
|
|
|
|
|
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a>
|
|
|
|
|
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a><span class="sd"> I don't really understand why it's implemented this way.</span>
|
|
|
|
|
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="sd"> I think to handle cases where there's a bit more or less data than expected</span>
|
|
|
|
|
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a><span class="sd"> and if there's bad values in time slots that shouldn't exist yet because those</span>
|
|
|
|
|
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a><span class="sd"> slots are in the future.</span>
|
|
|
|
|
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a>
|
|
|
|
|
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a>
|
|
|
|
|
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o">></span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="n">hr</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">288</span><span class="p">]</span>
|
|
|
|
|
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o"><</span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="n">hr</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">288</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">)))</span>
|
|
|
|
|
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">():</span>
|
|
|
|
|
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">_minutes_so_far</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">))</span> <span class="o">//</span> <span class="mi">5</span>
|
|
|
|
|
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:])</span>
|
|
|
|
|
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a>
|
|
|
|
|
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="k">return</span> <span class="n">hr</span>
|
|
|
|
|
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a> <span class="n">sub_type</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
|
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">255</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"error response from heart rate log request"</span><span class="p">)</span>
|
|
|
|
|
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a> <span class="k">return</span> <span class="n">NoData</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">()</span> <span class="ow">and</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">23</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># number of expected packets</span>
|
|
|
|
|
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
|
|
|
|
|
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">*</span> <span class="mi">13</span><span class="p">)</span>
|
|
|
|
|
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a> <span class="k">elif</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a> <span class="c1"># next 4 bytes are a timestamp</span>
|
|
|
|
|
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a> <span class="n">ts</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack_from</span><span class="p">(</span><span class="s2">"<l"</span><span class="p">,</span> <span class="n">packet</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">2</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
|
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">ts</span><span class="p">,</span> <span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span>
|
|
|
|
|
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a> <span class="c1"># TODO timezone?</span>
|
|
|
|
|
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a>
|
|
|
|
|
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="c1"># remaining 16 - type - subtype - 4 - crc = 9</span>
|
|
|
|
|
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">9</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
|
|
|
|
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">9</span>
|
|
|
|
|
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+</span> <span class="mi">13</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">15</span><span class="p">])</span>
|
|
|
|
|
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">13</span>
|
|
|
|
|
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a>
|
|
|
|
|
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="nd">@property</span>
|
|
|
|
|
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="k">def</span> <span class="nf">heart_rates</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
|
|
|
|
|
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a><span class="w"> </span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a><span class="sd"> Normalize and clean heart rate logs</span>
|
|
|
|
|
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a>
|
|
|
|
|
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="sd"> I don't really understand why it's implemented this way.</span>
|
|
|
|
|
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a><span class="sd"> I think to handle cases where there's a bit more or less data than expected</span>
|
|
|
|
|
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a><span class="sd"> and if there's bad values in time slots that shouldn't exist yet because those</span>
|
|
|
|
|
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a><span class="sd"> slots are in the future.</span>
|
|
|
|
|
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a>
|
|
|
|
|
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
|
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a>
|
|
|
|
|
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o">></span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="n">hr</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">288</span><span class="p">]</span>
|
|
|
|
|
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o"><</span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="n">hr</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">288</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">)))</span>
|
|
|
|
|
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a>
|
|
|
|
|
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="c1"># TODO see if we can remove this</span>
|
|
|
|
|
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="c1"># need a good reason why parsing should depend on the day</span>
|
|
|
|
|
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a> <span class="c1"># index might be good enough to indicate how much "valid" data we've gotten</span>
|
|
|
|
|
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">():</span>
|
|
|
|
|
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">_minutes_so_far</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">))</span> <span class="o">//</span> <span class="mi">5</span>
|
|
|
|
|
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:])</span>
|
|
|
|
|
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a>
|
|
|
|
|
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="k">return</span> <span class="n">hr</span>
|
|
|
|
|
</span></pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -480,9 +481,9 @@
|
|
|
|
|
</span><span id="HeartRateLogParser-64"><a href="#HeartRateLogParser-64"><span class="linenos"> 64</span></a> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-65"><a href="#HeartRateLogParser-65"><span class="linenos"> 65</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-66"><a href="#HeartRateLogParser-66"><span class="linenos"> 66</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-67"><a href="#HeartRateLogParser-67"><span class="linenos"> 67</span></a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-68"><a href="#HeartRateLogParser-68"><span class="linenos"> 68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-69"><a href="#HeartRateLogParser-69"><span class="linenos"> 69</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-67"><a href="#HeartRateLogParser-67"><span class="linenos"> 67</span></a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-68"><a href="#HeartRateLogParser-68"><span class="linenos"> 68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-69"><a href="#HeartRateLogParser-69"><span class="linenos"> 69</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">:</span> <span class="n">datetime</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-70"><a href="#HeartRateLogParser-70"><span class="linenos"> 70</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-71"><a href="#HeartRateLogParser-71"><span class="linenos"> 71</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-72"><a href="#HeartRateLogParser-72"><span class="linenos"> 72</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
@ -492,94 +493,95 @@
|
|
|
|
|
</span><span id="HeartRateLogParser-76"><a href="#HeartRateLogParser-76"><span class="linenos"> 76</span></a> <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-77"><a href="#HeartRateLogParser-77"><span class="linenos"> 77</span></a> <span class="k">if</span> <span class="n">d</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-78"><a href="#HeartRateLogParser-78"><span class="linenos"> 78</span></a> <span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-79"><a href="#HeartRateLogParser-79"><span class="linenos"> 79</span></a> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="c1"># use local time</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-80"><a href="#HeartRateLogParser-80"><span class="linenos"> 80</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Comparing </span><span class="si">{</span><span class="n">d</span><span class="si">}</span><span class="s2"> to </span><span class="si">{</span><span class="n">now</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-81"><a href="#HeartRateLogParser-81"><span class="linenos"> 81</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">year</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">year</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">month</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">month</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-82"><a href="#HeartRateLogParser-82"><span class="linenos"> 82</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-83"><a href="#HeartRateLogParser-83"><span class="linenos"> 83</span></a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">packet</span><span class="p">:</span> <span class="nb">bytearray</span><span class="p">)</span> <span class="o">-></span> <span class="n">HeartRateLog</span> <span class="o">|</span> <span class="n">NoData</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-84"><a href="#HeartRateLogParser-84"><span class="linenos"> 84</span></a><span class="w"> </span><span class="sa">r</span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-85"><a href="#HeartRateLogParser-85"><span class="linenos"> 85</span></a><span class="sd"> first byte of packet should always be CMD_READ_HEART_RATE (21)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-86"><a href="#HeartRateLogParser-86"><span class="linenos"> 86</span></a><span class="sd"> second byte is the sub_type</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-87"><a href="#HeartRateLogParser-87"><span class="linenos"> 87</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-88"><a href="#HeartRateLogParser-88"><span class="linenos"> 88</span></a><span class="sd"> sub_type 0 contains the lengths of things</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-89"><a href="#HeartRateLogParser-89"><span class="linenos"> 89</span></a><span class="sd"> byte 2 is the number of expected packets after this.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-90"><a href="#HeartRateLogParser-90"><span class="linenos"> 90</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-91"><a href="#HeartRateLogParser-91"><span class="linenos"> 91</span></a><span class="sd"> example: bytearray(b'\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002'),</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-79"><a href="#HeartRateLogParser-79"><span class="linenos"> 79</span></a> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span> <span class="c1"># use utc time</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-80"><a href="#HeartRateLogParser-80"><span class="linenos"> 80</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">year</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">year</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">month</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">month</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-81"><a href="#HeartRateLogParser-81"><span class="linenos"> 81</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-82"><a href="#HeartRateLogParser-82"><span class="linenos"> 82</span></a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">packet</span><span class="p">:</span> <span class="nb">bytearray</span><span class="p">)</span> <span class="o">-></span> <span class="n">HeartRateLog</span> <span class="o">|</span> <span class="n">NoData</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-83"><a href="#HeartRateLogParser-83"><span class="linenos"> 83</span></a><span class="w"> </span><span class="sa">r</span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-84"><a href="#HeartRateLogParser-84"><span class="linenos"> 84</span></a><span class="sd"> first byte of packet should always be CMD_READ_HEART_RATE (21)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-85"><a href="#HeartRateLogParser-85"><span class="linenos"> 85</span></a><span class="sd"> second byte is the sub_type</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-86"><a href="#HeartRateLogParser-86"><span class="linenos"> 86</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-87"><a href="#HeartRateLogParser-87"><span class="linenos"> 87</span></a><span class="sd"> sub_type 0 contains the lengths of things</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-88"><a href="#HeartRateLogParser-88"><span class="linenos"> 88</span></a><span class="sd"> byte 2 is the number of expected packets after this.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-89"><a href="#HeartRateLogParser-89"><span class="linenos"> 89</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-90"><a href="#HeartRateLogParser-90"><span class="linenos"> 90</span></a><span class="sd"> example: bytearray(b'\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002')</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-91"><a href="#HeartRateLogParser-91"><span class="linenos"> 91</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-92"><a href="#HeartRateLogParser-92"><span class="linenos"> 92</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-93"><a href="#HeartRateLogParser-93"><span class="linenos"> 93</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-94"><a href="#HeartRateLogParser-94"><span class="linenos"> 94</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-95"><a href="#HeartRateLogParser-95"><span class="linenos"> 95</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-96"><a href="#HeartRateLogParser-96"><span class="linenos"> 96</span></a> <span class="n">sub_type</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-97"><a href="#HeartRateLogParser-97"><span class="linenos"> 97</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">255</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-98"><a href="#HeartRateLogParser-98"><span class="linenos"> 98</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"error response from heart rate log request"</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-99"><a href="#HeartRateLogParser-99"><span class="linenos"> 99</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-100"><a href="#HeartRateLogParser-100"><span class="linenos">100</span></a> <span class="k">return</span> <span class="n">NoData</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-101"><a href="#HeartRateLogParser-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">()</span> <span class="ow">and</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">23</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-102"><a href="#HeartRateLogParser-102"><span class="linenos">102</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-103"><a href="#HeartRateLogParser-103"><span class="linenos">103</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-104"><a href="#HeartRateLogParser-104"><span class="linenos">104</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-105"><a href="#HeartRateLogParser-105"><span class="linenos">105</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-106"><a href="#HeartRateLogParser-106"><span class="linenos">106</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-107"><a href="#HeartRateLogParser-107"><span class="linenos">107</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-108"><a href="#HeartRateLogParser-108"><span class="linenos">108</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-109"><a href="#HeartRateLogParser-109"><span class="linenos">109</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-110"><a href="#HeartRateLogParser-110"><span class="linenos">110</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-111"><a href="#HeartRateLogParser-111"><span class="linenos">111</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-112"><a href="#HeartRateLogParser-112"><span class="linenos">112</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-113"><a href="#HeartRateLogParser-113"><span class="linenos">113</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-114"><a href="#HeartRateLogParser-114"><span class="linenos">114</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># number of expected packets</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-115"><a href="#HeartRateLogParser-115"><span class="linenos">115</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-116"><a href="#HeartRateLogParser-116"><span class="linenos">116</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">*</span> <span class="mi">13</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-117"><a href="#HeartRateLogParser-117"><span class="linenos">117</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-118"><a href="#HeartRateLogParser-118"><span class="linenos">118</span></a> <span class="k">elif</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-119"><a href="#HeartRateLogParser-119"><span class="linenos">119</span></a> <span class="c1"># next 4 bytes are a timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-120"><a href="#HeartRateLogParser-120"><span class="linenos">120</span></a> <span class="n">ts</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack_from</span><span class="p">(</span><span class="s2">"<l"</span><span class="p">,</span> <span class="n">packet</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">2</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-121"><a href="#HeartRateLogParser-121"><span class="linenos">121</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">ts</span><span class="p">,</span> <span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-122"><a href="#HeartRateLogParser-122"><span class="linenos">122</span></a> <span class="c1"># TODO timezone?</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-123"><a href="#HeartRateLogParser-123"><span class="linenos">123</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-124"><a href="#HeartRateLogParser-124"><span class="linenos">124</span></a> <span class="c1"># remaining 16 - type - subtype - 4 - crc = 9</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-125"><a href="#HeartRateLogParser-125"><span class="linenos">125</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">9</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-126"><a href="#HeartRateLogParser-126"><span class="linenos">126</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">9</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-127"><a href="#HeartRateLogParser-127"><span class="linenos">127</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-128"><a href="#HeartRateLogParser-128"><span class="linenos">128</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-129"><a href="#HeartRateLogParser-129"><span class="linenos">129</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+</span> <span class="mi">13</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">15</span><span class="p">])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-130"><a href="#HeartRateLogParser-130"><span class="linenos">130</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">13</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-131"><a href="#HeartRateLogParser-131"><span class="linenos">131</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-132"><a href="#HeartRateLogParser-132"><span class="linenos">132</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-133"><a href="#HeartRateLogParser-133"><span class="linenos">133</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-134"><a href="#HeartRateLogParser-134"><span class="linenos">134</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-135"><a href="#HeartRateLogParser-135"><span class="linenos">135</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-136"><a href="#HeartRateLogParser-136"><span class="linenos">136</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-137"><a href="#HeartRateLogParser-137"><span class="linenos">137</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-138"><a href="#HeartRateLogParser-138"><span class="linenos">138</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-139"><a href="#HeartRateLogParser-139"><span class="linenos">139</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-140"><a href="#HeartRateLogParser-140"><span class="linenos">140</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-141"><a href="#HeartRateLogParser-141"><span class="linenos">141</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-142"><a href="#HeartRateLogParser-142"><span class="linenos">142</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-143"><a href="#HeartRateLogParser-143"><span class="linenos">143</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-144"><a href="#HeartRateLogParser-144"><span class="linenos">144</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-145"><a href="#HeartRateLogParser-145"><span class="linenos">145</span></a> <span class="nd">@property</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-146"><a href="#HeartRateLogParser-146"><span class="linenos">146</span></a> <span class="k">def</span> <span class="nf">heart_rates</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-147"><a href="#HeartRateLogParser-147"><span class="linenos">147</span></a><span class="w"> </span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-148"><a href="#HeartRateLogParser-148"><span class="linenos">148</span></a><span class="sd"> Normalize and clean heart rate logs</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-149"><a href="#HeartRateLogParser-149"><span class="linenos">149</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-150"><a href="#HeartRateLogParser-150"><span class="linenos">150</span></a><span class="sd"> I don't really understand why it's implemented this way.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-151"><a href="#HeartRateLogParser-151"><span class="linenos">151</span></a><span class="sd"> I think to handle cases where there's a bit more or less data than expected</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-152"><a href="#HeartRateLogParser-152"><span class="linenos">152</span></a><span class="sd"> and if there's bad values in time slots that shouldn't exist yet because those</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-153"><a href="#HeartRateLogParser-153"><span class="linenos">153</span></a><span class="sd"> slots are in the future.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-154"><a href="#HeartRateLogParser-154"><span class="linenos">154</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-155"><a href="#HeartRateLogParser-155"><span class="linenos">155</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-156"><a href="#HeartRateLogParser-156"><span class="linenos">156</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-157"><a href="#HeartRateLogParser-157"><span class="linenos">157</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-158"><a href="#HeartRateLogParser-158"><span class="linenos">158</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o">></span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-159"><a href="#HeartRateLogParser-159"><span class="linenos">159</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="n">hr</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">288</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-160"><a href="#HeartRateLogParser-160"><span class="linenos">160</span></a> <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o"><</span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-161"><a href="#HeartRateLogParser-161"><span class="linenos">161</span></a> <span class="n">hr</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">288</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">)))</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-162"><a href="#HeartRateLogParser-162"><span class="linenos">162</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">():</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-163"><a href="#HeartRateLogParser-163"><span class="linenos">163</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">_minutes_so_far</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">))</span> <span class="o">//</span> <span class="mi">5</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-164"><a href="#HeartRateLogParser-164"><span class="linenos">164</span></a> <span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-165"><a href="#HeartRateLogParser-165"><span class="linenos">165</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-166"><a href="#HeartRateLogParser-166"><span class="linenos">166</span></a> <span class="k">return</span> <span class="n">hr</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-93"><a href="#HeartRateLogParser-93"><span class="linenos"> 93</span></a> <span class="n">sub_type</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-94"><a href="#HeartRateLogParser-94"><span class="linenos"> 94</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">255</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-95"><a href="#HeartRateLogParser-95"><span class="linenos"> 95</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"error response from heart rate log request"</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-96"><a href="#HeartRateLogParser-96"><span class="linenos"> 96</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-97"><a href="#HeartRateLogParser-97"><span class="linenos"> 97</span></a> <span class="k">return</span> <span class="n">NoData</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-98"><a href="#HeartRateLogParser-98"><span class="linenos"> 98</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">()</span> <span class="ow">and</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">23</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-99"><a href="#HeartRateLogParser-99"><span class="linenos"> 99</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-100"><a href="#HeartRateLogParser-100"><span class="linenos">100</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-101"><a href="#HeartRateLogParser-101"><span class="linenos">101</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-102"><a href="#HeartRateLogParser-102"><span class="linenos">102</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-103"><a href="#HeartRateLogParser-103"><span class="linenos">103</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-104"><a href="#HeartRateLogParser-104"><span class="linenos">104</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-105"><a href="#HeartRateLogParser-105"><span class="linenos">105</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-106"><a href="#HeartRateLogParser-106"><span class="linenos">106</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-107"><a href="#HeartRateLogParser-107"><span class="linenos">107</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-108"><a href="#HeartRateLogParser-108"><span class="linenos">108</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-109"><a href="#HeartRateLogParser-109"><span class="linenos">109</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-110"><a href="#HeartRateLogParser-110"><span class="linenos">110</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-111"><a href="#HeartRateLogParser-111"><span class="linenos">111</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># number of expected packets</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-112"><a href="#HeartRateLogParser-112"><span class="linenos">112</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-113"><a href="#HeartRateLogParser-113"><span class="linenos">113</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">*</span> <span class="mi">13</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-114"><a href="#HeartRateLogParser-114"><span class="linenos">114</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-115"><a href="#HeartRateLogParser-115"><span class="linenos">115</span></a> <span class="k">elif</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-116"><a href="#HeartRateLogParser-116"><span class="linenos">116</span></a> <span class="c1"># next 4 bytes are a timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-117"><a href="#HeartRateLogParser-117"><span class="linenos">117</span></a> <span class="n">ts</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack_from</span><span class="p">(</span><span class="s2">"<l"</span><span class="p">,</span> <span class="n">packet</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">2</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-118"><a href="#HeartRateLogParser-118"><span class="linenos">118</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">ts</span><span class="p">,</span> <span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-119"><a href="#HeartRateLogParser-119"><span class="linenos">119</span></a> <span class="c1"># TODO timezone?</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-120"><a href="#HeartRateLogParser-120"><span class="linenos">120</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-121"><a href="#HeartRateLogParser-121"><span class="linenos">121</span></a> <span class="c1"># remaining 16 - type - subtype - 4 - crc = 9</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-122"><a href="#HeartRateLogParser-122"><span class="linenos">122</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">9</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-123"><a href="#HeartRateLogParser-123"><span class="linenos">123</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">9</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-124"><a href="#HeartRateLogParser-124"><span class="linenos">124</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-125"><a href="#HeartRateLogParser-125"><span class="linenos">125</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-126"><a href="#HeartRateLogParser-126"><span class="linenos">126</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+</span> <span class="mi">13</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">15</span><span class="p">])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-127"><a href="#HeartRateLogParser-127"><span class="linenos">127</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">13</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-128"><a href="#HeartRateLogParser-128"><span class="linenos">128</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-129"><a href="#HeartRateLogParser-129"><span class="linenos">129</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-130"><a href="#HeartRateLogParser-130"><span class="linenos">130</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-131"><a href="#HeartRateLogParser-131"><span class="linenos">131</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-132"><a href="#HeartRateLogParser-132"><span class="linenos">132</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-133"><a href="#HeartRateLogParser-133"><span class="linenos">133</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-134"><a href="#HeartRateLogParser-134"><span class="linenos">134</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-135"><a href="#HeartRateLogParser-135"><span class="linenos">135</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-136"><a href="#HeartRateLogParser-136"><span class="linenos">136</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-137"><a href="#HeartRateLogParser-137"><span class="linenos">137</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-138"><a href="#HeartRateLogParser-138"><span class="linenos">138</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-139"><a href="#HeartRateLogParser-139"><span class="linenos">139</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-140"><a href="#HeartRateLogParser-140"><span class="linenos">140</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-141"><a href="#HeartRateLogParser-141"><span class="linenos">141</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-142"><a href="#HeartRateLogParser-142"><span class="linenos">142</span></a> <span class="nd">@property</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-143"><a href="#HeartRateLogParser-143"><span class="linenos">143</span></a> <span class="k">def</span> <span class="nf">heart_rates</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-144"><a href="#HeartRateLogParser-144"><span class="linenos">144</span></a><span class="w"> </span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-145"><a href="#HeartRateLogParser-145"><span class="linenos">145</span></a><span class="sd"> Normalize and clean heart rate logs</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-146"><a href="#HeartRateLogParser-146"><span class="linenos">146</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-147"><a href="#HeartRateLogParser-147"><span class="linenos">147</span></a><span class="sd"> I don't really understand why it's implemented this way.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-148"><a href="#HeartRateLogParser-148"><span class="linenos">148</span></a><span class="sd"> I think to handle cases where there's a bit more or less data than expected</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-149"><a href="#HeartRateLogParser-149"><span class="linenos">149</span></a><span class="sd"> and if there's bad values in time slots that shouldn't exist yet because those</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-150"><a href="#HeartRateLogParser-150"><span class="linenos">150</span></a><span class="sd"> slots are in the future.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-151"><a href="#HeartRateLogParser-151"><span class="linenos">151</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-152"><a href="#HeartRateLogParser-152"><span class="linenos">152</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-153"><a href="#HeartRateLogParser-153"><span class="linenos">153</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-154"><a href="#HeartRateLogParser-154"><span class="linenos">154</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-155"><a href="#HeartRateLogParser-155"><span class="linenos">155</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o">></span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-156"><a href="#HeartRateLogParser-156"><span class="linenos">156</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="n">hr</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">288</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-157"><a href="#HeartRateLogParser-157"><span class="linenos">157</span></a> <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o"><</span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-158"><a href="#HeartRateLogParser-158"><span class="linenos">158</span></a> <span class="n">hr</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">288</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">)))</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-159"><a href="#HeartRateLogParser-159"><span class="linenos">159</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-160"><a href="#HeartRateLogParser-160"><span class="linenos">160</span></a> <span class="c1"># TODO see if we can remove this</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-161"><a href="#HeartRateLogParser-161"><span class="linenos">161</span></a> <span class="c1"># need a good reason why parsing should depend on the day</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-162"><a href="#HeartRateLogParser-162"><span class="linenos">162</span></a> <span class="c1"># index might be good enough to indicate how much "valid" data we've gotten</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-163"><a href="#HeartRateLogParser-163"><span class="linenos">163</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">():</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-164"><a href="#HeartRateLogParser-164"><span class="linenos">164</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">_minutes_so_far</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">))</span> <span class="o">//</span> <span class="mi">5</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-165"><a href="#HeartRateLogParser-165"><span class="linenos">165</span></a> <span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser-166"><a href="#HeartRateLogParser-166"><span class="linenos">166</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser-167"><a href="#HeartRateLogParser-167"><span class="linenos">167</span></a> <span class="k">return</span> <span class="n">hr</span>
|
|
|
|
|
</span></pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -590,15 +592,15 @@
|
|
|
|
|
<div class="attr function">
|
|
|
|
|
|
|
|
|
|
<span class="def">def</span>
|
|
|
|
|
<span class="name">reset</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">):</span></span>
|
|
|
|
|
<span class="name">reset</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span></span><span class="return-annotation">) -> <span class="kc">None</span>:</span></span>
|
|
|
|
|
|
|
|
|
|
<label class="view-source-button" for="HeartRateLogParser.reset-view-source"><span>View Source</span></label>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<a class="headerlink" href="#HeartRateLogParser.reset"></a>
|
|
|
|
|
<div class="pdoc-code codehilite"><pre><span></span><span id="HeartRateLogParser.reset-67"><a href="#HeartRateLogParser.reset-67"><span class="linenos">67</span></a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.reset-68"><a href="#HeartRateLogParser.reset-68"><span class="linenos">68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.reset-69"><a href="#HeartRateLogParser.reset-69"><span class="linenos">69</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
<div class="pdoc-code codehilite"><pre><span></span><span id="HeartRateLogParser.reset-67"><a href="#HeartRateLogParser.reset-67"><span class="linenos">67</span></a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.reset-68"><a href="#HeartRateLogParser.reset-68"><span class="linenos">68</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.reset-69"><a href="#HeartRateLogParser.reset-69"><span class="linenos">69</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">:</span> <span class="n">datetime</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.reset-70"><a href="#HeartRateLogParser.reset-70"><span class="linenos">70</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.reset-71"><a href="#HeartRateLogParser.reset-71"><span class="linenos">71</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.reset-72"><a href="#HeartRateLogParser.reset-72"><span class="linenos">72</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
@ -624,9 +626,8 @@
|
|
|
|
|
</span><span id="HeartRateLogParser.is_today-76"><a href="#HeartRateLogParser.is_today-76"><span class="linenos">76</span></a> <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.is_today-77"><a href="#HeartRateLogParser.is_today-77"><span class="linenos">77</span></a> <span class="k">if</span> <span class="n">d</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.is_today-78"><a href="#HeartRateLogParser.is_today-78"><span class="linenos">78</span></a> <span class="k">return</span> <span class="kc">False</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.is_today-79"><a href="#HeartRateLogParser.is_today-79"><span class="linenos">79</span></a> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">()</span> <span class="c1"># use local time</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.is_today-80"><a href="#HeartRateLogParser.is_today-80"><span class="linenos">80</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Comparing </span><span class="si">{</span><span class="n">d</span><span class="si">}</span><span class="s2"> to </span><span class="si">{</span><span class="n">now</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.is_today-81"><a href="#HeartRateLogParser.is_today-81"><span class="linenos">81</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">year</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">year</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">month</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">month</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.is_today-79"><a href="#HeartRateLogParser.is_today-79"><span class="linenos">79</span></a> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span> <span class="c1"># use utc time</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.is_today-80"><a href="#HeartRateLogParser.is_today-80"><span class="linenos">80</span></a> <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">year</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">year</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">month</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">month</span> <span class="ow">and</span> <span class="n">d</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="n">now</span><span class="o">.</span><span class="n">day</span><span class="p">)</span>
|
|
|
|
|
</span></pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -644,67 +645,65 @@
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<a class="headerlink" href="#HeartRateLogParser.parse"></a>
|
|
|
|
|
<div class="pdoc-code codehilite"><pre><span></span><span id="HeartRateLogParser.parse-83"><a href="#HeartRateLogParser.parse-83"><span class="linenos"> 83</span></a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">packet</span><span class="p">:</span> <span class="nb">bytearray</span><span class="p">)</span> <span class="o">-></span> <span class="n">HeartRateLog</span> <span class="o">|</span> <span class="n">NoData</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-84"><a href="#HeartRateLogParser.parse-84"><span class="linenos"> 84</span></a><span class="w"> </span><span class="sa">r</span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-85"><a href="#HeartRateLogParser.parse-85"><span class="linenos"> 85</span></a><span class="sd"> first byte of packet should always be CMD_READ_HEART_RATE (21)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-86"><a href="#HeartRateLogParser.parse-86"><span class="linenos"> 86</span></a><span class="sd"> second byte is the sub_type</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-87"><a href="#HeartRateLogParser.parse-87"><span class="linenos"> 87</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-88"><a href="#HeartRateLogParser.parse-88"><span class="linenos"> 88</span></a><span class="sd"> sub_type 0 contains the lengths of things</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-89"><a href="#HeartRateLogParser.parse-89"><span class="linenos"> 89</span></a><span class="sd"> byte 2 is the number of expected packets after this.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-90"><a href="#HeartRateLogParser.parse-90"><span class="linenos"> 90</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-91"><a href="#HeartRateLogParser.parse-91"><span class="linenos"> 91</span></a><span class="sd"> example: bytearray(b'\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002'),</span>
|
|
|
|
|
<div class="pdoc-code codehilite"><pre><span></span><span id="HeartRateLogParser.parse-82"><a href="#HeartRateLogParser.parse-82"><span class="linenos"> 82</span></a> <span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">packet</span><span class="p">:</span> <span class="nb">bytearray</span><span class="p">)</span> <span class="o">-></span> <span class="n">HeartRateLog</span> <span class="o">|</span> <span class="n">NoData</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-83"><a href="#HeartRateLogParser.parse-83"><span class="linenos"> 83</span></a><span class="w"> </span><span class="sa">r</span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-84"><a href="#HeartRateLogParser.parse-84"><span class="linenos"> 84</span></a><span class="sd"> first byte of packet should always be CMD_READ_HEART_RATE (21)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-85"><a href="#HeartRateLogParser.parse-85"><span class="linenos"> 85</span></a><span class="sd"> second byte is the sub_type</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-86"><a href="#HeartRateLogParser.parse-86"><span class="linenos"> 86</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-87"><a href="#HeartRateLogParser.parse-87"><span class="linenos"> 87</span></a><span class="sd"> sub_type 0 contains the lengths of things</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-88"><a href="#HeartRateLogParser.parse-88"><span class="linenos"> 88</span></a><span class="sd"> byte 2 is the number of expected packets after this.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-89"><a href="#HeartRateLogParser.parse-89"><span class="linenos"> 89</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-90"><a href="#HeartRateLogParser.parse-90"><span class="linenos"> 90</span></a><span class="sd"> example: bytearray(b'\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002')</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-91"><a href="#HeartRateLogParser.parse-91"><span class="linenos"> 91</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-92"><a href="#HeartRateLogParser.parse-92"><span class="linenos"> 92</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-93"><a href="#HeartRateLogParser.parse-93"><span class="linenos"> 93</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-94"><a href="#HeartRateLogParser.parse-94"><span class="linenos"> 94</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-95"><a href="#HeartRateLogParser.parse-95"><span class="linenos"> 95</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-96"><a href="#HeartRateLogParser.parse-96"><span class="linenos"> 96</span></a> <span class="n">sub_type</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-97"><a href="#HeartRateLogParser.parse-97"><span class="linenos"> 97</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">255</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-98"><a href="#HeartRateLogParser.parse-98"><span class="linenos"> 98</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"error response from heart rate log request"</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-99"><a href="#HeartRateLogParser.parse-99"><span class="linenos"> 99</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-100"><a href="#HeartRateLogParser.parse-100"><span class="linenos">100</span></a> <span class="k">return</span> <span class="n">NoData</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-101"><a href="#HeartRateLogParser.parse-101"><span class="linenos">101</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">()</span> <span class="ow">and</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">23</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-102"><a href="#HeartRateLogParser.parse-102"><span class="linenos">102</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-103"><a href="#HeartRateLogParser.parse-103"><span class="linenos">103</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-104"><a href="#HeartRateLogParser.parse-104"><span class="linenos">104</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-105"><a href="#HeartRateLogParser.parse-105"><span class="linenos">105</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-106"><a href="#HeartRateLogParser.parse-106"><span class="linenos">106</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-107"><a href="#HeartRateLogParser.parse-107"><span class="linenos">107</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-108"><a href="#HeartRateLogParser.parse-108"><span class="linenos">108</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-109"><a href="#HeartRateLogParser.parse-109"><span class="linenos">109</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-110"><a href="#HeartRateLogParser.parse-110"><span class="linenos">110</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-111"><a href="#HeartRateLogParser.parse-111"><span class="linenos">111</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-112"><a href="#HeartRateLogParser.parse-112"><span class="linenos">112</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-113"><a href="#HeartRateLogParser.parse-113"><span class="linenos">113</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-114"><a href="#HeartRateLogParser.parse-114"><span class="linenos">114</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># number of expected packets</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-115"><a href="#HeartRateLogParser.parse-115"><span class="linenos">115</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-116"><a href="#HeartRateLogParser.parse-116"><span class="linenos">116</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">*</span> <span class="mi">13</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-117"><a href="#HeartRateLogParser.parse-117"><span class="linenos">117</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-118"><a href="#HeartRateLogParser.parse-118"><span class="linenos">118</span></a> <span class="k">elif</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-119"><a href="#HeartRateLogParser.parse-119"><span class="linenos">119</span></a> <span class="c1"># next 4 bytes are a timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-120"><a href="#HeartRateLogParser.parse-120"><span class="linenos">120</span></a> <span class="n">ts</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack_from</span><span class="p">(</span><span class="s2">"<l"</span><span class="p">,</span> <span class="n">packet</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">2</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-121"><a href="#HeartRateLogParser.parse-121"><span class="linenos">121</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">ts</span><span class="p">,</span> <span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-122"><a href="#HeartRateLogParser.parse-122"><span class="linenos">122</span></a> <span class="c1"># TODO timezone?</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-123"><a href="#HeartRateLogParser.parse-123"><span class="linenos">123</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-124"><a href="#HeartRateLogParser.parse-124"><span class="linenos">124</span></a> <span class="c1"># remaining 16 - type - subtype - 4 - crc = 9</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-125"><a href="#HeartRateLogParser.parse-125"><span class="linenos">125</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">9</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-126"><a href="#HeartRateLogParser.parse-126"><span class="linenos">126</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">9</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-127"><a href="#HeartRateLogParser.parse-127"><span class="linenos">127</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-128"><a href="#HeartRateLogParser.parse-128"><span class="linenos">128</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-129"><a href="#HeartRateLogParser.parse-129"><span class="linenos">129</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+</span> <span class="mi">13</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">15</span><span class="p">])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-130"><a href="#HeartRateLogParser.parse-130"><span class="linenos">130</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">13</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-131"><a href="#HeartRateLogParser.parse-131"><span class="linenos">131</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-132"><a href="#HeartRateLogParser.parse-132"><span class="linenos">132</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-133"><a href="#HeartRateLogParser.parse-133"><span class="linenos">133</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-134"><a href="#HeartRateLogParser.parse-134"><span class="linenos">134</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-135"><a href="#HeartRateLogParser.parse-135"><span class="linenos">135</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-136"><a href="#HeartRateLogParser.parse-136"><span class="linenos">136</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-137"><a href="#HeartRateLogParser.parse-137"><span class="linenos">137</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-138"><a href="#HeartRateLogParser.parse-138"><span class="linenos">138</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-139"><a href="#HeartRateLogParser.parse-139"><span class="linenos">139</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-140"><a href="#HeartRateLogParser.parse-140"><span class="linenos">140</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-141"><a href="#HeartRateLogParser.parse-141"><span class="linenos">141</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-142"><a href="#HeartRateLogParser.parse-142"><span class="linenos">142</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-143"><a href="#HeartRateLogParser.parse-143"><span class="linenos">143</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-93"><a href="#HeartRateLogParser.parse-93"><span class="linenos"> 93</span></a> <span class="n">sub_type</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-94"><a href="#HeartRateLogParser.parse-94"><span class="linenos"> 94</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">255</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-95"><a href="#HeartRateLogParser.parse-95"><span class="linenos"> 95</span></a> <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"error response from heart rate log request"</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-96"><a href="#HeartRateLogParser.parse-96"><span class="linenos"> 96</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-97"><a href="#HeartRateLogParser.parse-97"><span class="linenos"> 97</span></a> <span class="k">return</span> <span class="n">NoData</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-98"><a href="#HeartRateLogParser.parse-98"><span class="linenos"> 98</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">()</span> <span class="ow">and</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">23</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-99"><a href="#HeartRateLogParser.parse-99"><span class="linenos"> 99</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-100"><a href="#HeartRateLogParser.parse-100"><span class="linenos">100</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-101"><a href="#HeartRateLogParser.parse-101"><span class="linenos">101</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-102"><a href="#HeartRateLogParser.parse-102"><span class="linenos">102</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-103"><a href="#HeartRateLogParser.parse-103"><span class="linenos">103</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-104"><a href="#HeartRateLogParser.parse-104"><span class="linenos">104</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-105"><a href="#HeartRateLogParser.parse-105"><span class="linenos">105</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-106"><a href="#HeartRateLogParser.parse-106"><span class="linenos">106</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-107"><a href="#HeartRateLogParser.parse-107"><span class="linenos">107</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-108"><a href="#HeartRateLogParser.parse-108"><span class="linenos">108</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-109"><a href="#HeartRateLogParser.parse-109"><span class="linenos">109</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-110"><a href="#HeartRateLogParser.parse-110"><span class="linenos">110</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">end</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-111"><a href="#HeartRateLogParser.parse-111"><span class="linenos">111</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># number of expected packets</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-112"><a href="#HeartRateLogParser.parse-112"><span class="linenos">112</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="n">packet</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-113"><a href="#HeartRateLogParser.parse-113"><span class="linenos">113</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">*</span> <span class="mi">13</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-114"><a href="#HeartRateLogParser.parse-114"><span class="linenos">114</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-115"><a href="#HeartRateLogParser.parse-115"><span class="linenos">115</span></a> <span class="k">elif</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-116"><a href="#HeartRateLogParser.parse-116"><span class="linenos">116</span></a> <span class="c1"># next 4 bytes are a timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-117"><a href="#HeartRateLogParser.parse-117"><span class="linenos">117</span></a> <span class="n">ts</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack_from</span><span class="p">(</span><span class="s2">"<l"</span><span class="p">,</span> <span class="n">packet</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="mi">2</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-118"><a href="#HeartRateLogParser.parse-118"><span class="linenos">118</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">fromtimestamp</span><span class="p">(</span><span class="n">ts</span><span class="p">,</span> <span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-119"><a href="#HeartRateLogParser.parse-119"><span class="linenos">119</span></a> <span class="c1"># TODO timezone?</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-120"><a href="#HeartRateLogParser.parse-120"><span class="linenos">120</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-121"><a href="#HeartRateLogParser.parse-121"><span class="linenos">121</span></a> <span class="c1"># remaining 16 - type - subtype - 4 - crc = 9</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-122"><a href="#HeartRateLogParser.parse-122"><span class="linenos">122</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">9</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">6</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-123"><a href="#HeartRateLogParser.parse-123"><span class="linenos">123</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">9</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-124"><a href="#HeartRateLogParser.parse-124"><span class="linenos">124</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-125"><a href="#HeartRateLogParser.parse-125"><span class="linenos">125</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-126"><a href="#HeartRateLogParser.parse-126"><span class="linenos">126</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+</span> <span class="mi">13</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">packet</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">15</span><span class="p">])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-127"><a href="#HeartRateLogParser.parse-127"><span class="linenos">127</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">index</span> <span class="o">+=</span> <span class="mi">13</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-128"><a href="#HeartRateLogParser.parse-128"><span class="linenos">128</span></a> <span class="k">if</span> <span class="n">sub_type</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-129"><a href="#HeartRateLogParser.parse-129"><span class="linenos">129</span></a> <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-130"><a href="#HeartRateLogParser.parse-130"><span class="linenos">130</span></a> <span class="n">result</span> <span class="o">=</span> <span class="n">HeartRateLog</span><span class="p">(</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-131"><a href="#HeartRateLogParser.parse-131"><span class="linenos">131</span></a> <span class="n">heart_rates</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heart_rates</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-132"><a href="#HeartRateLogParser.parse-132"><span class="linenos">132</span></a> <span class="n">timestamp</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">timestamp</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-133"><a href="#HeartRateLogParser.parse-133"><span class="linenos">133</span></a> <span class="n">size</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">size</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-134"><a href="#HeartRateLogParser.parse-134"><span class="linenos">134</span></a> <span class="nb">range</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">range</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-135"><a href="#HeartRateLogParser.parse-135"><span class="linenos">135</span></a> <span class="n">index</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">,</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-136"><a href="#HeartRateLogParser.parse-136"><span class="linenos">136</span></a> <span class="p">)</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-137"><a href="#HeartRateLogParser.parse-137"><span class="linenos">137</span></a> <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-138"><a href="#HeartRateLogParser.parse-138"><span class="linenos">138</span></a> <span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-139"><a href="#HeartRateLogParser.parse-139"><span class="linenos">139</span></a> <span class="k">else</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.parse-140"><a href="#HeartRateLogParser.parse-140"><span class="linenos">140</span></a> <span class="k">return</span> <span class="kc">None</span>
|
|
|
|
|
</span></pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -714,7 +713,7 @@ second byte is the sub_type</p>
|
|
|
|
|
<p>sub_type 0 contains the lengths of things
|
|
|
|
|
byte 2 is the number of expected packets after this.</p>
|
|
|
|
|
|
|
|
|
|
<p>example: bytearray(b'\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002'),</p>
|
|
|
|
|
<p>example: bytearray(b'\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002')</p>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -722,34 +721,38 @@ byte 2 is the number of expected packets after this.</p>
|
|
|
|
|
<div id="HeartRateLogParser.heart_rates" class="classattr">
|
|
|
|
|
<input id="HeartRateLogParser.heart_rates-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
|
|
|
|
|
<div class="attr variable">
|
|
|
|
|
<span class="name">heart_rates</span>
|
|
|
|
|
<span class="name">heart_rates</span><span class="annotation">: list[int]</span>
|
|
|
|
|
|
|
|
|
|
<label class="view-source-button" for="HeartRateLogParser.heart_rates-view-source"><span>View Source</span></label>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
<a class="headerlink" href="#HeartRateLogParser.heart_rates"></a>
|
|
|
|
|
<div class="pdoc-code codehilite"><pre><span></span><span id="HeartRateLogParser.heart_rates-145"><a href="#HeartRateLogParser.heart_rates-145"><span class="linenos">145</span></a> <span class="nd">@property</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-146"><a href="#HeartRateLogParser.heart_rates-146"><span class="linenos">146</span></a> <span class="k">def</span> <span class="nf">heart_rates</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-147"><a href="#HeartRateLogParser.heart_rates-147"><span class="linenos">147</span></a><span class="w"> </span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-148"><a href="#HeartRateLogParser.heart_rates-148"><span class="linenos">148</span></a><span class="sd"> Normalize and clean heart rate logs</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-149"><a href="#HeartRateLogParser.heart_rates-149"><span class="linenos">149</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-150"><a href="#HeartRateLogParser.heart_rates-150"><span class="linenos">150</span></a><span class="sd"> I don't really understand why it's implemented this way.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-151"><a href="#HeartRateLogParser.heart_rates-151"><span class="linenos">151</span></a><span class="sd"> I think to handle cases where there's a bit more or less data than expected</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-152"><a href="#HeartRateLogParser.heart_rates-152"><span class="linenos">152</span></a><span class="sd"> and if there's bad values in time slots that shouldn't exist yet because those</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-153"><a href="#HeartRateLogParser.heart_rates-153"><span class="linenos">153</span></a><span class="sd"> slots are in the future.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-154"><a href="#HeartRateLogParser.heart_rates-154"><span class="linenos">154</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-155"><a href="#HeartRateLogParser.heart_rates-155"><span class="linenos">155</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-156"><a href="#HeartRateLogParser.heart_rates-156"><span class="linenos">156</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-157"><a href="#HeartRateLogParser.heart_rates-157"><span class="linenos">157</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-158"><a href="#HeartRateLogParser.heart_rates-158"><span class="linenos">158</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o">></span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-159"><a href="#HeartRateLogParser.heart_rates-159"><span class="linenos">159</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="n">hr</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">288</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-160"><a href="#HeartRateLogParser.heart_rates-160"><span class="linenos">160</span></a> <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o"><</span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-161"><a href="#HeartRateLogParser.heart_rates-161"><span class="linenos">161</span></a> <span class="n">hr</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">288</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">)))</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-162"><a href="#HeartRateLogParser.heart_rates-162"><span class="linenos">162</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">():</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-163"><a href="#HeartRateLogParser.heart_rates-163"><span class="linenos">163</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">_minutes_so_far</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">))</span> <span class="o">//</span> <span class="mi">5</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-164"><a href="#HeartRateLogParser.heart_rates-164"><span class="linenos">164</span></a> <span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-165"><a href="#HeartRateLogParser.heart_rates-165"><span class="linenos">165</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-166"><a href="#HeartRateLogParser.heart_rates-166"><span class="linenos">166</span></a> <span class="k">return</span> <span class="n">hr</span>
|
|
|
|
|
<div class="pdoc-code codehilite"><pre><span></span><span id="HeartRateLogParser.heart_rates-142"><a href="#HeartRateLogParser.heart_rates-142"><span class="linenos">142</span></a> <span class="nd">@property</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-143"><a href="#HeartRateLogParser.heart_rates-143"><span class="linenos">143</span></a> <span class="k">def</span> <span class="nf">heart_rates</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-144"><a href="#HeartRateLogParser.heart_rates-144"><span class="linenos">144</span></a><span class="w"> </span><span class="sd">"""</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-145"><a href="#HeartRateLogParser.heart_rates-145"><span class="linenos">145</span></a><span class="sd"> Normalize and clean heart rate logs</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-146"><a href="#HeartRateLogParser.heart_rates-146"><span class="linenos">146</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-147"><a href="#HeartRateLogParser.heart_rates-147"><span class="linenos">147</span></a><span class="sd"> I don't really understand why it's implemented this way.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-148"><a href="#HeartRateLogParser.heart_rates-148"><span class="linenos">148</span></a><span class="sd"> I think to handle cases where there's a bit more or less data than expected</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-149"><a href="#HeartRateLogParser.heart_rates-149"><span class="linenos">149</span></a><span class="sd"> and if there's bad values in time slots that shouldn't exist yet because those</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-150"><a href="#HeartRateLogParser.heart_rates-150"><span class="linenos">150</span></a><span class="sd"> slots are in the future.</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-151"><a href="#HeartRateLogParser.heart_rates-151"><span class="linenos">151</span></a><span class="sd"> """</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-152"><a href="#HeartRateLogParser.heart_rates-152"><span class="linenos">152</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-153"><a href="#HeartRateLogParser.heart_rates-153"><span class="linenos">153</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-154"><a href="#HeartRateLogParser.heart_rates-154"><span class="linenos">154</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-155"><a href="#HeartRateLogParser.heart_rates-155"><span class="linenos">155</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o">></span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-156"><a href="#HeartRateLogParser.heart_rates-156"><span class="linenos">156</span></a> <span class="n">hr</span> <span class="o">=</span> <span class="n">hr</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">288</span><span class="p">]</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-157"><a href="#HeartRateLogParser.heart_rates-157"><span class="linenos">157</span></a> <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_raw_heart_rates</span><span class="p">)</span> <span class="o"><</span> <span class="mi">288</span><span class="p">:</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-158"><a href="#HeartRateLogParser.heart_rates-158"><span class="linenos">158</span></a> <span class="n">hr</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">288</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">)))</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-159"><a href="#HeartRateLogParser.heart_rates-159"><span class="linenos">159</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-160"><a href="#HeartRateLogParser.heart_rates-160"><span class="linenos">160</span></a> <span class="c1"># TODO see if we can remove this</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-161"><a href="#HeartRateLogParser.heart_rates-161"><span class="linenos">161</span></a> <span class="c1"># need a good reason why parsing should depend on the day</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-162"><a href="#HeartRateLogParser.heart_rates-162"><span class="linenos">162</span></a> <span class="c1"># index might be good enough to indicate how much "valid" data we've gotten</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-163"><a href="#HeartRateLogParser.heart_rates-163"><span class="linenos">163</span></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_today</span><span class="p">():</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-164"><a href="#HeartRateLogParser.heart_rates-164"><span class="linenos">164</span></a> <span class="n">m</span> <span class="o">=</span> <span class="n">_minutes_so_far</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">timezone</span><span class="o">.</span><span class="n">utc</span><span class="p">))</span> <span class="o">//</span> <span class="mi">5</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-165"><a href="#HeartRateLogParser.heart_rates-165"><span class="linenos">165</span></a> <span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">hr</span><span class="p">[</span><span class="n">m</span><span class="p">:])</span>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-166"><a href="#HeartRateLogParser.heart_rates-166"><span class="linenos">166</span></a>
|
|
|
|
|
</span><span id="HeartRateLogParser.heart_rates-167"><a href="#HeartRateLogParser.heart_rates-167"><span class="linenos">167</span></a> <span class="k">return</span> <span class="n">hr</span>
|
|
|
|
|
</span></pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|