docs: update doc site

This commit is contained in:
Wesley Ellis 2024-11-13 20:22:31 -05:00
parent c38989790a
commit 175b28c031
14 changed files with 457 additions and 447 deletions

View File

@ -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 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>
@ -24,6 +24,7 @@
<h2>Contents</h2>
<ul>
<li><a href="#what-is-the-colmi-r02">What is the Colmi R02?</a></li>
<li><a href="#compatibility">Compatibility</a></li>
<li><a href="#how-to-buy">How to buy</a></li>
<li><a href="#reverse-engineering-status">Reverse engineering status</a></li>
<li><a href="#planned-feature">Planned Feature</a></li>
@ -97,12 +98,16 @@ colmi_r02_client </h1>
<p>Are you hiring? <a href="mailto:tahnok+colmir02@gmail.com">Send me an email</a></p>
<h2 id="compatibility">Compatibility</h2>
<p>The COLMI R02 and R06 are both fully compatible. The R10 is mostly compatible but there is a bug with getting real time heart rate. Steps and heart rate logging do work.</p>
<p>The rule of thumb is that if the listing suggests you use the QRing app, the ring is compatible with this client.</p>
<h2 id="how-to-buy">How to buy</h2>
<p>You can get it on <a href="https://www.aliexpress.com/item/1005006631448993.html">here on AliExpress</a>. If that link is dead try searching for "COLMI R02", I got mine from "Colmi official store". It cost me $CAD 22 shipped.</p>
<p>The Colmi R06 is also compatible, and the R03 is probably compatible as well. Investigation into the R10 is ongoing, but if you have one please let me know if it works!</p>
<h2 id="reverse-engineering-status">Reverse engineering status</h2>
<ul>

View File

@ -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.battery 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>

View File

@ -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.blink_twice 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>

View File

@ -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.cli 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>
@ -170,165 +170,167 @@
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a> <span class="n">when</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><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">set_time</span><span class="p">(</span><span class="n">when</span><span class="p">)</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">get_heart_rate_log_settings</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get heart rate log settings&quot;&quot;&quot;</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;heart rate log settings:&quot;</span><span class="p">)</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_heart_rate_log_settings</span><span class="p">())</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><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">&quot;--enable/--disable&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">show_default</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Logging status&quot;</span><span class="p">)</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a> <span class="s2">&quot;--interval&quot;</span><span class="p">,</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a> <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">IntRange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">),</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Interval in minutes to measure heart rate&quot;</span><span class="p">,</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="n">default</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="n">show_default</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a><span class="p">)</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">set_heart_rate_log_settings</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">,</span> <span class="n">enable</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">interval</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get heart rate log settings&quot;&quot;&quot;</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Changing heart rate log settings&quot;</span><span class="p">)</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">set_heart_rate_log_settings</span><span class="p">(</span><span class="n">enable</span><span class="p">,</span> <span class="n">interval</span><span class="p">)</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_heart_rate_log_settings</span><span class="p">())</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Done&quot;</span><span class="p">)</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a>
</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">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">get_real_time_heart_rate</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get real time heart rate.</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"> TODO: add number of readings</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="sd"> &quot;&quot;&quot;</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="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Starting reading, please wait.&quot;</span><span class="p">)</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_realtime_heart_rate</span><span class="p">()</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Error, no HR detected. Is the ring being worn?&quot;</span><span class="p">)</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a> <span class="s2">&quot;--when&quot;</span><span class="p">,</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a> <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">DateTime</span><span class="p">(),</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;The date you want steps for&quot;</span><span class="p">,</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a><span class="p">)</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">&quot;--as-csv&quot;</span><span class="p">,</span> <span class="n">is_flag</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Print as CSV&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">get_steps</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">,</span> <span class="n">when</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 class="p">,</span> <span class="n">as_csv</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get step data&quot;&quot;&quot;</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a> <span class="k">if</span> <span class="n">when</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a> <span class="n">when</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><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_steps</span><span class="p">(</span><span class="n">when</span><span class="p">)</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">steps</span><span class="o">.</span><span class="n">NoData</span><span class="p">):</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;No results for day&quot;</span><span class="p">)</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="k">return</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">as_csv</span><span class="p">:</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="n">pretty_print</span><span class="o">.</span><span class="n">print_dataclasses</span><span class="p">(</span><span class="n">result</span><span class="p">))</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="n">writer</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictWriter</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">fieldnames</span><span class="o">=</span><span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">dataclasses</span><span class="o">.</span><span class="n">fields</span><span class="p">(</span><span class="n">steps</span><span class="o">.</span><span class="n">SportDetail</span><span class="p">)])</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="n">writer</span><span class="o">.</span><span class="n">writeheader</span><span class="p">()</span>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="n">dataclasses</span><span class="o">.</span><span class="n">asdict</span><span class="p">(</span><span class="n">r</span><span class="p">))</span>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">getvalue</span><span class="p">())</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">reboot</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Reboot the ring&quot;&quot;&quot;</span>
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a>
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">reboot</span><span class="p">()</span>
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Ring rebooted&quot;</span><span class="p">)</span>
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a>
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a>
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span>
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a> <span class="s2">&quot;--command&quot;</span><span class="p">,</span>
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a> <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">IntRange</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">255</span><span class="p">),</span>
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Raw command&quot;</span><span class="p">,</span>
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a><span class="p">)</span>
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span>
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a> <span class="s2">&quot;--subdata&quot;</span><span class="p">,</span>
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span>
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Hex encoded subdata array, will be parsed into a bytearray&quot;</span><span class="p">,</span>
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a><span class="p">)</span>
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">&quot;--replies&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">IntRange</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;How many reply packets to wait for&quot;</span><span class="p">)</span>
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">raw</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">,</span> <span class="n">command</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">subdata</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">replies</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Send the ring a raw command&quot;&quot;&quot;</span>
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a>
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a> <span class="n">p_subdata</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="o">.</span><span class="n">fromhex</span><span class="p">(</span><span class="n">subdata</span><span class="p">)</span> <span class="k">if</span> <span class="n">subdata</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="nb">bytearray</span><span class="p">()</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Time set successfully&quot;</span><span class="p">)</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Please ignore the unexpected packet. It&#39;s expectedly unexpected&quot;</span><span class="p">)</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">get_heart_rate_log_settings</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get heart rate log settings&quot;&quot;&quot;</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;heart rate log settings:&quot;</span><span class="p">)</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_heart_rate_log_settings</span><span class="p">())</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">&quot;--enable/--disable&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">show_default</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Logging status&quot;</span><span class="p">)</span>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a> <span class="s2">&quot;--interval&quot;</span><span class="p">,</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a> <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">IntRange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">),</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Interval in minutes to measure heart rate&quot;</span><span class="p">,</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a> <span class="n">default</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a> <span class="n">show_default</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a><span class="p">)</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">set_heart_rate_log_settings</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">,</span> <span class="n">enable</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span> <span class="n">interval</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get heart rate log settings&quot;&quot;&quot;</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Changing heart rate log settings&quot;</span><span class="p">)</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">set_heart_rate_log_settings</span><span class="p">(</span><span class="n">enable</span><span class="p">,</span> <span class="n">interval</span><span class="p">)</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_heart_rate_log_settings</span><span class="p">())</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Done&quot;</span><span class="p">)</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a>
</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="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">get_real_time_heart_rate</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get real time heart rate.</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a><span class="sd"> TODO: add number of readings</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a><span class="sd"> &quot;&quot;&quot;</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">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Starting reading, please wait.&quot;</span><span class="p">)</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_realtime_heart_rate</span><span class="p">()</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a> <span class="k">if</span> <span class="n">result</span><span class="p">:</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Error, no HR detected. Is the ring being worn?&quot;</span><span class="p">)</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a> <span class="s2">&quot;--when&quot;</span><span class="p">,</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a> <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">DateTime</span><span class="p">(),</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a> <span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;The date you want steps for&quot;</span><span class="p">,</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a><span class="p">)</span>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">&quot;--as-csv&quot;</span><span class="p">,</span> <span class="n">is_flag</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Print as CSV&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">get_steps</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">,</span> <span class="n">when</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 class="p">,</span> <span class="n">as_csv</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Get step data&quot;&quot;&quot;</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a> <span class="k">if</span> <span class="n">when</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a> <span class="n">when</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><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">get_steps</span><span class="p">(</span><span class="n">when</span><span class="p">)</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">steps</span><span class="o">.</span><span class="n">NoData</span><span class="p">):</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;No results for day&quot;</span><span class="p">)</span>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a> <span class="k">return</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">as_csv</span><span class="p">:</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="n">pretty_print</span><span class="o">.</span><span class="n">print_dataclasses</span><span class="p">(</span><span class="n">result</span><span class="p">))</span>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a> <span class="n">out</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a> <span class="n">writer</span> <span class="o">=</span> <span class="n">csv</span><span class="o">.</span><span class="n">DictWriter</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">fieldnames</span><span class="o">=</span><span class="p">[</span><span class="n">f</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">dataclasses</span><span class="o">.</span><span class="n">fields</span><span class="p">(</span><span class="n">steps</span><span class="o">.</span><span class="n">SportDetail</span><span class="p">)])</span>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a> <span class="n">writer</span><span class="o">.</span><span class="n">writeheader</span><span class="p">()</span>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a> <span class="n">writer</span><span class="o">.</span><span class="n">writerow</span><span class="p">(</span><span class="n">dataclasses</span><span class="o">.</span><span class="n">asdict</span><span class="p">(</span><span class="n">r</span><span class="p">))</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">getvalue</span><span class="p">())</span>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">reboot</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Reboot the ring&quot;&quot;&quot;</span>
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a>
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">reboot</span><span class="p">()</span>
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Ring rebooted&quot;</span><span class="p">)</span>
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a>
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a>
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a><span class="nd">@cli_client</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">pass_obj</span>
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span>
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a> <span class="s2">&quot;--command&quot;</span><span class="p">,</span>
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a> <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">IntRange</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="nb">max</span><span class="o">=</span><span class="mi">255</span><span class="p">),</span>
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Raw command&quot;</span><span class="p">,</span>
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a><span class="p">)</span>
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span>
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a> <span class="s2">&quot;--subdata&quot;</span><span class="p">,</span>
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a> <span class="nb">type</span><span class="o">=</span><span class="nb">str</span><span class="p">,</span>
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Hex encoded subdata array, will be parsed into a bytearray&quot;</span><span class="p">,</span>
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a><span class="p">)</span>
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">&quot;--replies&quot;</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">click</span><span class="o">.</span><span class="n">IntRange</span><span class="p">(</span><span class="nb">min</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;How many reply packets to wait for&quot;</span><span class="p">)</span>
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">raw</span><span class="p">(</span><span class="n">client</span><span class="p">:</span> <span class="n">Client</span><span class="p">,</span> <span class="n">command</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">subdata</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span> <span class="n">replies</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Send the ring a raw command&quot;&quot;&quot;</span>
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a>
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a> <span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">raw</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="n">p_subdata</span><span class="p">,</span> <span class="n">replies</span><span class="p">)</span>
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a>
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a>
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a><span class="n">DEVICE_NAME_PREFIXES</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a> <span class="s2">&quot;R01&quot;</span><span class="p">,</span>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a> <span class="s2">&quot;R02&quot;</span><span class="p">,</span>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a> <span class="s2">&quot;R03&quot;</span><span class="p">,</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a> <span class="s2">&quot;R04&quot;</span><span class="p">,</span>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="s2">&quot;R05&quot;</span><span class="p">,</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a> <span class="s2">&quot;R06&quot;</span><span class="p">,</span>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="s2">&quot;R07&quot;</span><span class="p">,</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="s2">&quot;R10&quot;</span><span class="p">,</span> <span class="c1"># maybe compatible?</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="s2">&quot;VK-5098&quot;</span><span class="p">,</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="s2">&quot;MERLIN&quot;</span><span class="p">,</span>
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a> <span class="s2">&quot;Hello Ring&quot;</span><span class="p">,</span>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="s2">&quot;RING1&quot;</span><span class="p">,</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="s2">&quot;boAtring&quot;</span><span class="p">,</span>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="s2">&quot;TR-R02&quot;</span><span class="p">,</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="s2">&quot;SE&quot;</span><span class="p">,</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a> <span class="s2">&quot;EVOLVEO&quot;</span><span class="p">,</span>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="s2">&quot;GL-SR2&quot;</span><span class="p">,</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="s2">&quot;Blaupunkt&quot;</span><span class="p">,</span>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="s2">&quot;KSIX RING&quot;</span><span class="p">,</span>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a><span class="p">]</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a>
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">group</span><span class="p">()</span>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">util</span><span class="p">():</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic utilities for the R02 that don&#39;t need an address.&quot;&quot;&quot;</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a><span class="nd">@util</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">&quot;--all&quot;</span><span class="p">,</span> <span class="n">is_flag</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Print all devices, no name filtering&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">scan</span><span class="p">(</span><span class="nb">all</span><span class="p">:</span> <span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Scan for possible devices based on known prefixes and print the bluetooth address.&quot;&quot;&quot;</span>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a>
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a> <span class="c1"># TODO maybe bluetooth specific stuff like this should be in another package?</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a> <span class="n">devices</span> <span class="o">=</span> <span class="k">await</span> <span class="n">BleakScanner</span><span class="o">.</span><span class="n">discover</span><span class="p">()</span>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a>
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">devices</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Found device(s)&quot;</span><span class="p">)</span>
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="s1">&#39;Name&#39;</span><span class="si">:</span><span class="s2">&gt;20</span><span class="si">}</span><span class="s2"> | Address&quot;</span><span class="p">)</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;-&quot;</span> <span class="o">*</span> <span class="mi">44</span><span class="p">)</span>
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">devices</span><span class="p">:</span>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">name</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a> <span class="k">if</span> <span class="n">name</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">all</span> <span class="ow">or</span> <span class="nb">any</span><span class="p">(</span><span class="n">name</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">DEVICE_NAME_PREFIXES</span> <span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">p</span><span class="p">))):</span>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">name</span><span class="si">:</span><span class="s2">&gt;20</span><span class="si">}</span><span class="s2"> | </span><span class="si">{</span><span class="n">d</span><span class="o">.</span><span class="n">address</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;No devices found. Try moving the ring closer to computer&quot;</span><span class="p">)</span>
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a> <span class="n">p_subdata</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="o">.</span><span class="n">fromhex</span><span class="p">(</span><span class="n">subdata</span><span class="p">)</span> <span class="k">if</span> <span class="n">subdata</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="nb">bytearray</span><span class="p">()</span>
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a>
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="p">:</span>
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a> <span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">raw</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="n">p_subdata</span><span class="p">,</span> <span class="n">replies</span><span class="p">)</span>
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a><span class="n">DEVICE_NAME_PREFIXES</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a> <span class="s2">&quot;R01&quot;</span><span class="p">,</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a> <span class="s2">&quot;R02&quot;</span><span class="p">,</span>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a> <span class="s2">&quot;R03&quot;</span><span class="p">,</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a> <span class="s2">&quot;R04&quot;</span><span class="p">,</span>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a> <span class="s2">&quot;R05&quot;</span><span class="p">,</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a> <span class="s2">&quot;R06&quot;</span><span class="p">,</span>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a> <span class="s2">&quot;R07&quot;</span><span class="p">,</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a> <span class="s2">&quot;R10&quot;</span><span class="p">,</span> <span class="c1"># maybe compatible?</span>
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a> <span class="s2">&quot;VK-5098&quot;</span><span class="p">,</span>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a> <span class="s2">&quot;MERLIN&quot;</span><span class="p">,</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a> <span class="s2">&quot;Hello Ring&quot;</span><span class="p">,</span>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a> <span class="s2">&quot;RING1&quot;</span><span class="p">,</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a> <span class="s2">&quot;boAtring&quot;</span><span class="p">,</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a> <span class="s2">&quot;TR-R02&quot;</span><span class="p">,</span>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a> <span class="s2">&quot;SE&quot;</span><span class="p">,</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a> <span class="s2">&quot;EVOLVEO&quot;</span><span class="p">,</span>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a> <span class="s2">&quot;GL-SR2&quot;</span><span class="p">,</span>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a> <span class="s2">&quot;Blaupunkt&quot;</span><span class="p">,</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a> <span class="s2">&quot;KSIX RING&quot;</span><span class="p">,</span>
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a><span class="p">]</span>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">group</span><span class="p">()</span>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">util</span><span class="p">():</span>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Generic utilities for the R02 that don&#39;t need an address.&quot;&quot;&quot;</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a>
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a><span class="nd">@util</span><span class="o">.</span><span class="n">command</span><span class="p">()</span>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a><span class="nd">@click</span><span class="o">.</span><span class="n">option</span><span class="p">(</span><span class="s2">&quot;--all&quot;</span><span class="p">,</span> <span class="n">is_flag</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s2">&quot;Print all devices, no name filtering&quot;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a><span class="k">async</span> <span class="k">def</span> <span class="nf">scan</span><span class="p">(</span><span class="nb">all</span><span class="p">:</span> <span class="nb">bool</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a><span class="w"> </span><span class="sd">&quot;&quot;&quot;Scan for possible devices based on known prefixes and print the bluetooth address.&quot;&quot;&quot;</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a> <span class="c1"># TODO maybe bluetooth specific stuff like this should be in another package?</span>
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a> <span class="n">devices</span> <span class="o">=</span> <span class="k">await</span> <span class="n">BleakScanner</span><span class="o">.</span><span class="n">discover</span><span class="p">()</span>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a>
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">devices</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;Found device(s)&quot;</span><span class="p">)</span>
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="s1">&#39;Name&#39;</span><span class="si">:</span><span class="s2">&gt;20</span><span class="si">}</span><span class="s2"> | Address&quot;</span><span class="p">)</span>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;-&quot;</span> <span class="o">*</span> <span class="mi">44</span><span class="p">)</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">devices</span><span class="p">:</span>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">name</span>
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a> <span class="k">if</span> <span class="n">name</span> <span class="ow">and</span> <span class="p">(</span><span class="nb">all</span> <span class="ow">or</span> <span class="nb">any</span><span class="p">(</span><span class="n">name</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">DEVICE_NAME_PREFIXES</span> <span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">p</span><span class="p">))):</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">name</span><span class="si">:</span><span class="s2">&gt;20</span><span class="si">}</span><span class="s2"> | </span><span class="si">{</span><span class="n">d</span><span class="o">.</span><span class="n">address</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a> <span class="k">else</span><span class="p">:</span>
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a> <span class="n">click</span><span class="o">.</span><span class="n">echo</span><span class="p">(</span><span class="s2">&quot;No devices found. Try moving the ring closer to computer&quot;</span><span class="p">)</span>
</span></pre></div>

View File

@ -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.client 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>
@ -526,7 +526,7 @@
</section>
<section id="COMMAND_HANDLERS">
<div class="attr variable">
<span class="name">COMMAND_HANDLERS</span><span class="annotation">: dict[int, collections.abc.Callable[[bytearray], typing.Any]]</span> =
<span class="name">COMMAND_HANDLERS</span><span class="annotation">: dict[int, Callable[[bytearray], typing.Any]]</span> =
<input id="COMMAND_HANDLERS-view-value" class="view-value-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<label class="view-value-button pdoc-button" for="COMMAND_HANDLERS-view-value"></label><span class="default_value">{3: &lt;function parse_battery&gt;, 105: &lt;function parse_heart_rate&gt;, 106: &lt;function empty_parse&gt;, 67: &lt;bound method SportDetailParser.parse of &lt;<a href="steps.html#SportDetailParser">colmi_r02_client.steps.SportDetailParser</a> object&gt;&gt;, 21: &lt;bound method HeartRateLogParser.parse of &lt;<a href="hr.html#HeartRateLogParser">colmi_r02_client.hr.HeartRateLogParser</a> object&gt;&gt;, 1: &lt;function empty_parse&gt;, 22: &lt;function parse_heart_rate_log_settings&gt;}</span>

View File

@ -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&#39;t know why it&#39;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"> &quot;&quot;&quot;</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">-&gt;</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">&quot;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">&quot;</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">-&gt;</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">&quot;&quot;&quot;</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&#39;\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002&#39;),</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">-&gt;</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">&quot;&quot;&quot;</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&#39;\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002&#39;)</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a><span class="sd"> &quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;error response from heart rate log request&quot;</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">&quot;&lt;l&quot;</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">&quot;&quot;&quot;</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&#39;t really understand why it&#39;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&#39;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&#39;s bad values in time slots that shouldn&#39;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"> &quot;&quot;&quot;</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">&gt;</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">&lt;</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">&quot;error response from heart rate log request&quot;</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">&quot;&lt;l&quot;</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">-&gt;</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">&quot;&quot;&quot;</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&#39;t really understand why it&#39;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&#39;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&#39;s bad values in time slots that shouldn&#39;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"> &quot;&quot;&quot;</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">&gt;</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">&lt;</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 &quot;valid&quot; data we&#39;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">-&gt;</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">&quot;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">&quot;</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">-&gt;</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">&quot;&quot;&quot;</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&#39;\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002&#39;),</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">-&gt;</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">&quot;&quot;&quot;</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&#39;\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002&#39;)</span>
</span><span id="HeartRateLogParser-91"><a href="#HeartRateLogParser-91"><span class="linenos"> 91</span></a><span class="sd"> &quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;error response from heart rate log request&quot;</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">&quot;&lt;l&quot;</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">&quot;&quot;&quot;</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&#39;t really understand why it&#39;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&#39;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&#39;s bad values in time slots that shouldn&#39;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"> &quot;&quot;&quot;</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">&gt;</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">&lt;</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">&quot;error response from heart rate log request&quot;</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">&quot;&lt;l&quot;</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">-&gt;</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">&quot;&quot;&quot;</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&#39;t really understand why it&#39;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&#39;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&#39;s bad values in time slots that shouldn&#39;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"> &quot;&quot;&quot;</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">&gt;</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">&lt;</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 &quot;valid&quot; data we&#39;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">-&gt;</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">&quot;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">&quot;</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">-&gt;</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">&quot;&quot;&quot;</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&#39;\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002&#39;),</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">-&gt;</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">&quot;&quot;&quot;</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&#39;\x15\x00\x18\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x002&#39;)</span>
</span><span id="HeartRateLogParser.parse-91"><a href="#HeartRateLogParser.parse-91"><span class="linenos"> 91</span></a><span class="sd"> &quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;error response from heart rate log request&quot;</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">&quot;&lt;l&quot;</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">&quot;error response from heart rate log request&quot;</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">&quot;&lt;l&quot;</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">&quot;&quot;&quot;</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&#39;t really understand why it&#39;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&#39;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&#39;s bad values in time slots that shouldn&#39;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"> &quot;&quot;&quot;</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">&gt;</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">&lt;</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">-&gt;</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">&quot;&quot;&quot;</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&#39;t really understand why it&#39;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&#39;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&#39;s bad values in time slots that shouldn&#39;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"> &quot;&quot;&quot;</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">&gt;</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">&lt;</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 &quot;valid&quot; data we&#39;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>

View File

@ -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_settings 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>

View File

@ -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.packet 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>

View File

@ -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.pretty_print 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>

View File

@ -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.real_time_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>

View File

@ -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.reboot 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>

View File

@ -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.set_time 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>

View File

@ -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.steps 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>

File diff suppressed because one or more lines are too long