From b4c402d252746b72b28881590efb386180cfa2ff Mon Sep 17 00:00:00 2001 From: Avamander Date: Sun, 18 Apr 2021 19:02:38 +0300 Subject: [PATCH 1/6] Added Python virtual environment to .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 100e2580..2f9ac181 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ .idea/ +# Python virtual environment for DFU images +.venv/ + # CMake cmake-build-* cmake-* From 410cc821f46acfaa34e66a801301c708a5f12625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Mon, 19 Apr 2021 20:30:51 +0200 Subject: [PATCH 2/6] Fix formatting issue on the lap counter in Stopwatch. --- src/displayapp/screens/StopWatch.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/displayapp/screens/StopWatch.cpp b/src/displayapp/screens/StopWatch.cpp index 371b4e6c..30f23358 100644 --- a/src/displayapp/screens/StopWatch.cpp +++ b/src/displayapp/screens/StopWatch.cpp @@ -145,10 +145,10 @@ bool StopWatch::Refresh() { if (lapPressed == true) { if (lapBuffer[1]) { - lv_label_set_text_fmt(lapOneText, "#2%d %2d:%02d.%02d", (lapNr - 1), lapBuffer[1]->mins, lapBuffer[1]->secs, lapBuffer[1]->hundredths); + lv_label_set_text_fmt(lapOneText, "#%d %2d:%02d.%02d", (lapNr - 1), lapBuffer[1]->mins, lapBuffer[1]->secs, lapBuffer[1]->hundredths); } if (lapBuffer[0]) { - lv_label_set_text_fmt(lapTwoText, "#2%d %2d:%02d.%02d", lapNr, lapBuffer[0]->mins, lapBuffer[0]->secs, lapBuffer[0]->hundredths); + lv_label_set_text_fmt(lapTwoText, "#%d %2d:%02d.%02d", lapNr, lapBuffer[0]->mins, lapBuffer[0]->secs, lapBuffer[0]->hundredths); } // Reset the bool to avoid setting the text in each cycle until there is a change lapPressed = false; From fefb429fb4bf1020553900d9e514d3baa9040325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Tue, 20 Apr 2021 21:01:38 +0200 Subject: [PATCH 3/6] Fix formatting issue on the lap counter in Stopwatch (display lap counter on 2 characters). --- src/displayapp/screens/StopWatch.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/displayapp/screens/StopWatch.cpp b/src/displayapp/screens/StopWatch.cpp index 30f23358..bf42c698 100644 --- a/src/displayapp/screens/StopWatch.cpp +++ b/src/displayapp/screens/StopWatch.cpp @@ -145,10 +145,10 @@ bool StopWatch::Refresh() { if (lapPressed == true) { if (lapBuffer[1]) { - lv_label_set_text_fmt(lapOneText, "#%d %2d:%02d.%02d", (lapNr - 1), lapBuffer[1]->mins, lapBuffer[1]->secs, lapBuffer[1]->hundredths); + lv_label_set_text_fmt(lapOneText, "#%2d %2d:%02d.%02d", (lapNr - 1), lapBuffer[1]->mins, lapBuffer[1]->secs, lapBuffer[1]->hundredths); } if (lapBuffer[0]) { - lv_label_set_text_fmt(lapTwoText, "#%d %2d:%02d.%02d", lapNr, lapBuffer[0]->mins, lapBuffer[0]->secs, lapBuffer[0]->hundredths); + lv_label_set_text_fmt(lapTwoText, "#%2d %2d:%02d.%02d", lapNr, lapBuffer[0]->mins, lapBuffer[0]->secs, lapBuffer[0]->hundredths); } // Reset the bool to avoid setting the text in each cycle until there is a change lapPressed = false; From e56ebb8bd621cc8838e86fa032d680a6e7a35ffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Wed, 21 Apr 2021 21:56:43 +0200 Subject: [PATCH 4/6] Update README.md and picture. --- README.md | 29 +++++++++++++++++++++-------- images/1.0.0/collage.png | Bin 0 -> 1500485 bytes 2 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 images/1.0.0/collage.png diff --git a/README.md b/README.md index 55afcc57..a4d40a6a 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,7 @@ The goal of this project is to design an open-source firmware for the Pinetime s ## Overview -![Pinetime screens](images/0.14.0/collage1.png "PinetimeScreens") -![Pinetime screens](images/0.14.0/collage2.png "PinetimeScreens") +![Pinetime screens](images/1.0.0/collage.png "PinetimeScreens") As of now, here is the list of achievements of this project: @@ -37,10 +36,15 @@ As of now, here is the list of achievements of this project: - Heart rate measurements - Step counting - Wake-up on wrist rotation - - Multiple 'apps' : - * Clock (displays the date, time, battery level, ble connection status, heart rate) - * System info (displays various info : BLE MAC, build date/time, uptime, version,...) - * Brightess (allows the user to configure the brightness of the display) + - Quick actions + * Disable vibration on notification + * Brightness settings + * Flashlight + * Settings + - 2 watch faces: + * Digital + * Analog + - Multiple 'apps' : * Music (control the playback of the music on your phone) * Heart rate (controls the heart rate sensor and display current heartbeat) * Navigation (displays navigation instructions coming from the companion app) @@ -48,13 +52,22 @@ As of now, here is the list of achievements of this project: * Paddle (single player pong-like game) * Two (2048 clone game) * Stopwatch (with all the necessary functions such as play, pause, lap, stop) + * Motion sensor and step counter (displays the number of steps and the state of the motion sensor in real-time) + - User settings: + * Display timeout + * Wake-up condition + * Time format (12/24h) + * Default watch face + * Battery status + * Firmware validation + * System information - Supported by 3 companion apps (development is in progress): * [Gadgetbridge](https://codeberg.org/Freeyourgadget/Gadgetbridge/) (on Android) * [Amazfish](https://openrepos.net/content/piggz/amazfish) (on SailfishOS and Linux) * [Siglo](https://github.com/alexr4535/siglo) (on Linux) * **[Experimental]** [WebBLEWatch](https://hubmartin.github.io/WebBLEWatch/) Synchronize time directly from your web browser. [video](https://youtu.be/IakiuhVDdrY) - - **[Experimental]** OTA (Over-the-air) update via BLE - - **[Experimental]** Bootloader based on [MCUBoot](https://juullabs-oss.github.io/mcuboot/) + - OTA (Over-the-air) update via BLE + - [Bootloader](https://github.com/JF002/pinetime-mcuboot-bootloader) based on [MCUBoot](https://juullabs-oss.github.io/mcuboot/) ## Documentation diff --git a/images/1.0.0/collage.png b/images/1.0.0/collage.png new file mode 100644 index 0000000000000000000000000000000000000000..b9ffaa882d667a4dfc02589ff4e7e7d09a958233 GIT binary patch literal 1500485 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
N;&%Co$tXAZrBTU2`&L9;V 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 OAx!)rGbD&bKqI+p&vjhH zaRn2~omg0aM$1&oM^fvpXq+PKqa_+l81$cc>uP1t086CA{(mlmWP!kfz4X@6dPT7w z%|7quE+rI;0z zcfc!`?|5W{07u-%*W1mlVcB8qL#N&~UTq@`3l_eR#?@sQ$%h~s`2`X6YFJd6*0z1j zOyoz(XQbil8Ti*e;38`wA5XA8bE(GvCk8K$TmMM0pipF>0OQqCsN#6^hy=tX>hz^Q zrgFxs^%;zwC7rwu{gNo8JB4!+v}{F~5#ikJ>4rtiU~4&7HZD~v1xCvEnx{L}Z8Xfd zmkcZr3X?rOtLT;Z0q2COdOd>y)$c}QWb>a|N9dCx-76J6@-Iz?qspnU4W( z7{y6KVPuU?!Da4?T=Otrg6tR4j}vPVgdxC{!{zF zU*7ew)O|RNv+VWmg(Mg_4$n;<%XFem91a9Be*mDz6rh|`i+r)IXX(HZmf*mwjQob2 z8q%&hD66$fF>7~>L&sf^O^gn$gjAM5XFgCsUm8W=vVSBa63q{yppbT=AE#lW$1)-r zZ_(jHqlbe47*2I63mFcS<-aTu$HV4Va*`Om%lIOGx7Kib0rGgDz5IL@u%YQkWwPCg#6{}8{g+kw)LZ%?a~{Xj;(Pjg~di*-@kpV}1O z+7ightsdnjL(#iC$z{`mCHYA>3nl&VjV9E%C>)Mk-#=D4%M@I|4v`BiFE@Lh)ZT@M zBjS8U`<~}rWvE-VDZoR&sbP1}CL_Ayy%vUu;!qKzsw;?YclOBm;hzcL7|&@ZVU$v3 z|6_1@v&9^W`1}9vuX*DDzs8qcEiE4pX4NIVuRiP0U7jAi^1Qr}DEsK_EJ-BC{+@bH za=QAaVD6>r&3T*Dt5;d2>}iAmY**=xo#g`xJ0cQmX}}S`1e5<*?@9y&CFJ-xYH)m3 zd|Zqk{8=p6bVUgJ8$@1%e%9uMEi+4$NstJF;IM{pj=d0II}oI6D!H>owYB(M6BBm$ zEc=IAelu|O_V#GlK`;Rlm}2&SR|J^@)Dh=Uz0{ZP?0hWzZ^j#G={PQp?)v|F!onq*RCR{T3zU`#^I`>F43Td)?U=mP=8=|C(9PQ+SBS{Zh4 zj%w_pT$YNoigqPI%5PkSE{ey55R|?yR8?Mkw&dRuCN6O}JkVfM2Pw+rz3?0iXdVy7 zc~Z~`Drei-+q~=tFi><&Ns!!VBL@$=Oeku&&JO0_#KG|^I~5C;(DGRcm*%i07fb$C zF4;(efol{>5!B0xC1YnPhrhop2d_a(c#>P^T0Pqsd)dn|fggUEm(z7U<|y&;m}!gN zEMP&{t^)k_YXb(yj@g>XWn^T0=sB5M92l?)_*Ks++469)baam~`E0y8>O6ma9~R*C z>TuQnp)-Pnab^c>Z`SrtReQVV(Mp&5 z`ry-(wr<@U@~cbqD|7C0;*P+V9Nf2TrHAUN<|;7>tjPWBgN|{{H?R9v2wK z+7Dx*Ix%p^v_sA6MsD|p;9)M6M;)heWH$~g9bV4PCmSQlRK~t1)fhbHWPpl6>f^_w z5})xL?vjqbUpX;j-2J)n!xvs6z-fJB)Bh**ub}GE!KaL%V=_;p=cSl8$L@_k16$8P zAp-4q_$JYubvHXb7pa9WqGJd9L0{cgbF-;`)OGfk&B&-)9hYaCzBeIB#&oL=Kr1p) zl8um>u?b~y2o!<`s6V&jp{%8dU}iNoSb%^m&|h<;%wCfr*E8dZ!na-NB6v(BJWDv4 z^a)iyw;#4E!-O$*L(K73o-C2VW8Di`2SdJSS8lu{2Pc!!a(-*%I?-$Ut+=Y2on9VBR zf9G)-sqSk=KU5HXb9Zm;D$7h{sEcH&&k{DsJ_;Z6&OFt3>?}dc%}d#lrfeo`6Hj@_ zTkStm`q60|Z)~k6T6;Q*^EFK@v1RlDcQZz2wW80I?L)+Sddx!*{x?nq)SyIZiP7U^ zLK8|LUM=Gy4Vk@uY+R*M_7cAM=pSpO>{vo37qxkkezeqnjZ>D6F(umAaRi*m@?dL( zts;~L@SQ`zRf6QPAw4sI5;vSRbEGi&tu?`fvf0d{+7D zr}L>1@ri!Z+;1XXCyy;91N@)C;HJ=ut50G1VYUsj*&qu1gx!Bn^_H~|00M|2dc;Xa z@Mq4@@ciGEKG9*HtbD}nmrF9wl}HGn0tL8aaRb+q5yro7YU$dBCy3s}84nb_GEy#2 zOxJvgh)>5JuGBwSoG;k#=|73{$`)V8g?3(hqgo?yGM`#kw%A6WYGO*ql=*lg_4iV} z;PB{z@u$VsmL=M7mHyTg@?ey<^W>w_JB-eHj7U=sUk5%JJ>S=q+E&p0>3-AuMEFU=v2}(=3x*g#4ep< zNAIZLD(CNkfq}|ezgMCC31WbBTsr6XFiS@kw4k?O$r?K@`kzv z{?y9>G38rFFHB}GHBAtp%kgbfjBec+Bu(*c6?LtD;Rm7?nSA$jm&NHv$xXXXXxdKx zB3{6FruhP+dj-2LNx(<}9Jnlp+4WV4(+ytLBAs8%PkQL~Zx+A5?pgylEz_HX#CVnb zA37MZ6||!h{dB*M8lu9brS*2F%hcmVu!2eT*uyDGHX*?&SS(`+?7V5>mwu}y+X_;8 zw&U+RjdW+b=tfm`WBU1uOT`tURLOj+mB;}=6+R;v{tV&}zDB&ogsSk&_LIR0M9Vga zO7f%)mqgiivG#d){{6e0^O}TemCB~)$9^6p`(Rf!;H@>*=g}Kg(zwm%RMZ(9)H8(~ zU<+y0u*cG;2BN~gw8Wc|KiWj_QtMWY%Oq5$vA+ktG$i$OIbEOvp6jU+0zO2QK8_&i zu`u2g7~C2c>DotS}{;s0!_+C*-^1zvzP&vn|v zl5rHDq~E`@!C1QPGv#hKXXlG+O!H>rywNKusY}T5G6pU9_72i|U7a_S) z0SxB1$9*JY`<<67u5+(rPGUt?THN<21^j=Ld9DUL+!d{>?*5Ko^ga7wSKE4OSAG7+ z=Y`+(H{&kXy$jQcpO=+hJWI>dx<=juK8qxblD9KulII(}eWxeCF&~Vl+InZ-sl*fD z|8RFH)%MU!B_A<%{G&5X>TW0PbYPn55R;b*r#z9>n(1$Li%w0#F6D9;iI)_f%QAoK zjdS1Hlj8!Q*?AL>T*UrSDbX@zWat?NAL-M89u1?>YF{sP9nh-m=+6t00MuTX&XEg{ zE^^2+G%)z+@)z-~P(M#rU(_(D+C)Q}h|6pphrd1;6b#E$w7-5qL9_KTMX=M(1E70Bo-->$zl$oZS#A{5{E&50n^0q6i zU^Ks=?IguHsw~Ek6rbwf;(MF+z<0Z=n4c2HwwiEVD5gznS%G?P857$!r`DCq)8nv5 zS!8HBz$6ej=4C+?1Zm%{|AQeF$}!kE(Eyu0_^6*BXKHszmV5RxiroXyP$Fjjbxs}V zG-f6^4+d01nPb{>h7|trF+O3OIHmvRpYwfS07oDT)1uoiqbcz@0=1RhUUN#_=B{Mo z;qCF`QiA$t$K98U{h#>Jf?|r}WUd+^3nj1P87g)^8;Oy5(L7fDFtzbDeC0uh>O~p$ z(50=p57&eM&{WQ&U_s}w_^3a=s}vs z5f!dbcPUK3-9W_nd^%e!Aw3mAOdgA22bNvLKW88*;AX@QDvS9ROt8Q3>?3a`m{xk} zJE(la+{+2`n)kF;0(6%*rV<}6^#xk|ZZ15U>B7$iRe26Dn`+Inv&(f$?THn$Mq_4l zQpe4~Wm|ej_`-pQ->R{}2k1%Tykv%QtEg1B=TXUlfBULB{P0-_s^!OrQs?nTUe{Sm zgHZe0&rC%qw9~I0@Y{~-5kJrQYfn^ldy{x&b)0Iml$QGHiQpqm0#C`=uk64x9SqFK z&4!DefBlCsZOB;tPe&$crvL9tOb?97+gi2*7tT=}qIjcHHb<7xF8lY-1Q-d%>PIzI zj0lav2DS6t5-77soB>XvG*1@U!73#=-vorkxR!M%vBH z#winNBnuv_9QpnY!Rvm0t4?7nZT(N`?!62a3{k)-P0+k|*10^hD4Yzt(Qo<-80!~Ij zXazO2-hU7=K8g+%?4q`h`%m(Xjjl?K3`$cv=vy&qN`d{Z%I)^~Eqd#py+O>SIyoiz z2o9L~Q!-oyu9DEMZfe*0+U}ETN56x;?qpZ@w_g%~Ul+?%xl&TPNbS2#k?tLxwOY)C ziE%OcyLB*JVi?5L`(0g#^VeAkH`{8y!LsfP$Xm=DLj*W>pO>yCX8&31TducKAFU#n zX%Jbx#pQ}!93}$HJeBxmCRcoQnCk%L&7Y<2} z{NUJun_dh_^jJ}_r7Gm1&X`q-R^8o@KJHCz80yL_Fw!ax89KBxr$I!a) zouBb7hJrlZk~)3;fcJ2GYTV+thpk>+^cj!VwR5q$&Hpn(VqYkf_h`$p^Yl>PF<_6( z)0n)D%3;NY&VF6I|&=;!JZ^if;!hc4FxR0HP*$p z-~NW_}dWt*JlV))|Bi3}E3*qGHT2!d#^MnA>z0+u3FJoPt3eaE{ z5P1IWkQUAXL=E#+A-{^NqrdV6W(GyFXVHP%q{8`J1%+7!#F$!s{9rHEJMoTs3z)>g zH?T>NNP7klMdjkpr)i%Qd`r|#KkZy zjn4=%?CMlG4QvrGr`YMC=?GPX3(4$fW@>w!(0KKj`*Qz@OW%pRc**>brATiF{pe*r zxmCEPiD!uL>E`L5zMAhJo;b5=bZhcLK%hM!(t=`IZKAU>MS^Am@+9(6GiWoz`Bs9mAf_OriG|y%%`xY8PP4A{op4N5+Z;x6GMJte z>Hhz4m7V(f8PCxV&k!j$AKl#k+l|0X$#CqB?xf&U+|C$Y)Y?ar^p zyy!3gOeIIW=(_stU-LRkAAbuIQo>O%8oDQSFyAYJ$p-ps#_8F}}^TpAP=hZ8#MdctwZRe*Q1gC(-4j zzq8uM28Q6YonTpP1P4SxZFy38q)~^p9H~?zi3BZ+OI@!3q`TaBP;;?~*kz$iXF*kwepWdamMpB(XF6+XgW}D~7V^ zF+nQ`R_W)OvYX+4SPsD;0(+bRM`zbKcnCiE?KYnCg_4Ozhh5CvPameRz4a zsyn;vFf(9xmrx#xn>bYrd9}s=Dj1Azk^Y-BFboD!XVD~yr2Meh+c#3st_n9nd?sK>V@niq?T)DfzNHxTZYc_YTuF?~fG8!%W zu8tRzZ@Qfyo>H~!pukVr_Qjv!f|_P6e^ZmfLn7}$pHcffBs77@v5ipr?sMh}ai*+wWucEfC zJZqwzjN$xx4C#<*<7zw+y}78^J1>QA>qGH!sH~!*n!Q{JKbMRBMeokV55iP8PhNYU zY<5nTvBfjoY^1mSKa+ZYkl=AtwkMyMNJmQ2zr%}zrLr?hF(^T_`v4OQ9ltnxZ<{TvhL^#a^AoZ_>1<+d z-Vdj5pVXQ&<|VPMyDo8DGU)K39E)aCwPTqpD)yj2AeFAoVUXTD#yYU=C+w9=rt`QC*C7^6=1wdf!j_0qB)I7ckd!drEV;HsJ`%vhf6iu_6UnD! zEI0FSefSZ)Kg$8lpwMcDa;`i4)!`ZnE#=VrFiNx7=OU^&ayTD|YNdSfD!cA$764__cudlD9ELe_gaL|FXQ}96+xq+8Y26!5O2;RugJsiUIWW}W zS2bO$;XgDsQU!yt?fhXzw2M1yh6bK_doiKZ1$wZTbeKA&_C< z$Ip+~;zrknZ@PQ`N6}e0H1+mTeDvsza?*?r=@6wEA>G~GASs=~=#*{*k?uy|2hu4m zE#2Mq?)?*XcklCj`x^|IXKO#4#hHXu<2>D^54G>N~1|Xyx>|ot@ zUMIiK4$7-3De_`AjohX_z3=wSd^xFpMGO-T8uOkaskF&6Xp?p?6J<@IoF22$5$FBv z!HKO>fg}3>+Y=BIRIxh<_~+(NO~ZBPTLN=7c7f#Ih2P+j;`Vgf9DD^0>{bfjW^&@Q zR!h&(-hxqXq4d}OvO~6<%=G7@K7FGORHb6yn@gbvN_uG=P{Os|k=-&Y9MH*+&Mbw0Qen+%2l_theX1&dt{3 z_6xgVDHPA7e9#pBAi^$Kt(CPqk++*|SrvYDwRj0JuS%+Kwm}BX88kf_$~_OAAAkNo z{Nnc|I)HlD$HoiL0$r&RvX8(g`*NwKn*;J_abF+`GIOcPfY5{>>i~46xk=$jzh^RU zKYzNpJdSE?RzacGK#>FqUAWa2e>y!8t;A?2`Eo`t<`JO`qrmi0W-UAEz2hi` zNff5eZ{uR)h?kXsaHeK(Lxy@6MiYR-gKvPeHDnSQxS&_d6aAKho-ZC+|SM%-6Pr>Z}&~BgDe)e zP9tLjgO>QXNMxV&F{E3&lnpHl1`@*WCRX`T9lWMvnW5iV03m3SW--h7)8dbwOp^YE zYRLcXP<^8N9xVGF@a};#Uh@p)TupM<4a$WQ#SF%ly-N1@Sa37)>(P!!Bi9OMkssPN zrz`(^Z!T7sDpva6?F)m^}@jkT}YBS{d zOTLKf^S`4vn{%U1t8IJ}m%O|B&8J_)lz>;2UaKdM8k!P7e^Hxn%o7xwzZczL3jW#v zvjf*}76>8Qs6(UfY5&i|4>(8~@y>ZThF-N~@;`t62;1MEBsA@yVmc6!6s3GjZ-9-oda_pK)9 z000SM+zI+$K!Q&(D)Gi1kQ)G8qR8bgP8Ny6;$Ma__Qg9fDX7k!e*Ry&av(Z=(15fg zvlLwk2=5);>q_*>&D^m$&lvr@p15VFh#8IwQSgI;IxX>iDU=hvQge&2h`!z`ML z*H%cBBm{m*<3&hgKtE_Tt4!nVf1a$+KUPWqu#ed-iRG}tP77$bQ)y8fr7(KsQ~?m_ z|0!TEjq$>MR&6m$LjgobfLrHl4EgZ%aPI$pY8n8t+auE(0o{ac01t&7U1iM{VP#*48fk|FFPin5DA13wvWz!eRM*tSx%8 z6q$Xdvd(SI1%_4)O~uXhp54ynW%P$#-YdXar0*>PLP*f=jv(15AqAlZ12E5e zWNwXLw#o&Z*V1>n`>&_ie2mX5=dJ%C6mZmHZ80hMMBC%CJ7 zdBr6Vv-$Qo1oRF(TauX;W4sQkY@pDcy2!9);0%Oy92@8$E2@LI<9CKc1XD-Mi_)uHbu9(MEoI1Bp{+N-8?t z04#KzyvMh9J%MjIGXP8ytQJG&qwhTxaU(jO-mLGj2cGPpC*hB$*LN?2R4XL! z>c!|s_a`orD3JuONa#g_QBH(M>s|Gg|00f0Z%2G36A*eG< z3%v14FT84D6+7_}yvioC6%L}DR5kK4DH?$s-=uc_Yug#OU* zU;?9O>g($b=!-@AtH^wK`an7Bs`fV;G*rHiD@yhmyNi+Zi3t4==wm@t(WOD9{LjRu z+fAVfL1jVZ#yPR6uZqP)Dr8>1068vhssDnayff`p)lq*Zn8~itoHQcm9+!083%o|J zc;=P}#ok{X9U;~rgX;T#*1ImC$21@eFM_2%*T8aN&MLY1=a0IK%I*q{U zC?7gr)C86+1@4nDk8f=6YTu-c+{3_ScC+$8P^K-c9@X_*e{d+OHp@{wVKSbA$Qw_S ztcYj6M!_kg7Yjkq%2+9w7>~mSs4W^7Sr&w)(W7_xrt9vv@!eNr#42Vk@6jz#De|`H zo5HkCz~!a!Q)S>)ILm#FEvn4-q9Veb!Dti2)U0=2TU0{w1ouZ0S;T_%3@bQ}{G&~W zmDi)|?#-8k`a9NAty#oY3dG5o*)IIhZ60?bvtijslZOdL8@&d{CAF0_)_zUTS^hmr z^E&}LAV%}hh}Dn}9T>*3k*RhKabA09AGw^&7)%%LK1W3E!)>tq>; z4)ufojbFV;Vj0J(H#pJ1`KJ{E0F`{0ylL8a0YUKqExV&5KhIn&Y+Cvm)C}IZa@}VR-1$)a>y7!Et+AhH8z=VXk(eJgX*vxJLIs z)oDw9!+}|Rd+qXxcw_i>G%Io0>#wu|Cp`GV6MpJHT$F>@_Bp`C2+!++y};vr3C~A_ zB2=hsgu_^E<;lwokqhS~Ssk?6#e>?V$V`vIR-7W3#Zetz<^w0?=TS$R&WxTxp6?y3 z{u(2vSu$Da^P>)79}o$Q11#TL18+(8%zsf2yLH&*c5Ypxu7W{sV9 zrWuQT{7CjbN5t0^OBs`BX4U^uc(zSYq%7PFBr({SshftL3@!P2Dy8SSCea}AV|8J` z!sb{-bH^qYvZ0`65O|VT-!5uUmdfbdv*{%g9)t`KyDpOgh#^!e%g-62_vBE>@dO9^ zX(}I!G71q<4-q_Qb1d*A(EDL(vncOro+IF#1BtlV3jjFla20K)Zzd&qsOPi5TQ;OX zLWnjT7EjAqAk@LgW0!1oNlEG!yb*KXQ{;%uVxVYC4mdQZm5pSCzK8oWC;Rv2%s z#?Uay<*#C^Gs%hk*0#l#Pd&NZbDI#0(SBaVTPl$+$BoJeRD`L{0E9~POS+oR#n#Y) z4Id7|)wbcb{5${6a&fFLVJ|!Y_u*(YDb(8XT@&Qt!1=d};pZ*pqXTwlK1N%yk z{JtUf;H*BdA5da^cNye!X0760yGYE<&DC*{yy5m*5w$P+v~+fL$ewT|LRZABWAu+Q zRhlt`yIA~S+;~*~2FuFK0`srK=HB>!`cft)%GNGpGC=X37?s5xJx*Sw|MvIyZ+q;^ zhGARMSS&GEGWIw$$W#t*ez2@qp}|Y+tZL;w$b(6p=S3YnXn;m#l|O{2OwzkChX!+u zr8EjMubCr(>388{91;iZE4t&Ob0+H!zF}-EmiOAnm z6kwo97O>!9XBjdGW_;CGEn}bITNkw~};^q2d$#QRVnkEBs2F->U1+1*;iO*0lVoool*xuv% zxogv+s)ORcq+*4!RRW|6J;JU+BQ={U%9oD(M$N^M|9b!XMCFT3TiRqW`ueZyNx%L0 z?#Jus>&7u6z)JL9`9+VKDP+xW_qjfLW#TD#0p74Hn<+9OEb;1+qmwb-_h2Taqt+*Z6& zw-d9Cfho2th8>Jk1Xoa|sHilgjxf4yVram-0Mc8r;jj!4YO9qZ0`Mg))u)IM*gc{R1Sq2 z52b}mNB=>Yg9BQl<+~FB-Q}WfCy%pP#vk~EM_+;DiHop#0jHH0;n%0;t}_9WmrLS> zGLNk@^H&UXor`+_p!AsER$PGtpS$t5fMM!0KIvXTau7Th18q|0yWs9*F$k&(n6V=b zN;rFR2;8+eW<>))B-T~z`OK-E-s{=RqF}JJYE{y}VAM*ET@gBsrEh6U*xPPrJf#0? zjGD@7c1C>mnbGDo%6THkkE@XE!A8BxQI}x^9{A0h_G{G^x7!nh%AoAOv8-lItsjHkBrS_UE<~tMCeh4d?#(y!Le{ub;Km5xtM*zFGcjrZoJ1{)JWN_W8#v zs6mcsjOG1XdB)cQFw2xH!dX~*V1XZT`PvmDv+2!nt;I)J{T6=6x|f5tfEz2>WpJuz(#0*7@7Vv zThWk$n)*SaB2YS!D9a=nM92Gys4OUxwZ4vJU^t!jB=%$OXMFp2Ucz^OA9LYyfb(ug zQ&WL|x%CqwzK<8%y}N4|X6%#NnMDQ`Z3wwl?7{EsSl7s(bf0???bitMha5R#OI^ea zX_71op>*F328Tm5<}uWM7CG8UBolkbB(l-y!CZpCDF$k})%!185ucmLV=jceywSxx zR*bp=E>BQIJ_y#&Ddkb(NN>t(SB?Ep-~GZ@eS6EEmrco~?B(UP)I{8%|M4RRM!d1_ zF(2IJwr6E}THQQ`y3w({t@-cL5-Ydw+1~lfOTgiw87EVHY*`uQa(jJqGb40*|LX4U zi>5YWB1O38he~H4&q9byXksT*h>*h4fzvM*wE#W#T}hn}^pTFwA7Am;fh%tN&v-W6 z=}JOG2c%>sWXrvCXwXS{+Gu4Km(z6PRnHgx1Fm1~Gx|?<=3x<2SziH%cHl@eUzd zi#wt(?IZxJsgbHb_^&kp8N3)=u2u=5AY{gMT0~+br&X1S6`jjCGoJEF_CCX2E7`>S z9iMFs4PJDCh};@)(Uh!p2aGO?clC{Ks$~YXm9CWmUiY)N>n@uf4UA-BDhaz*@g#(c zgZnoRlQK;+IoQ~mzD5ZfJgsNwC1<4qE0GYQGX=EpiesUg0TP zLrW-*v;HtS`de|m@marA#$4Wb^0 z;;N)FtG(_Y-qrb;3w;pu@wvVrF7@Um)zsX^5%#(2hU_A6@**#H=2ks@y$PAVUkoA}kcuX&H_Ua#k?907b=OV+2a03|9%zw3GIz@35Kvf=X6XVGA=hHgW< z?weq_wY}59sCQFR5g?VYmSjeTFHW^TLK+&iyj>z=U`86OGk1|VHTnMviM}IMi1Pe! zq9aHUw|^IuuhJDjJJ42Tm|9S`FD(Cf%}CCX@{7&ta@I_cGCr%V?BE-;EvC4RE!s?l z?;Q%sZ|aH53Z~SN`}64^kL~T=xynDLpGVRnLeF<@oU~#boIFSZIGO4yAaOFk^GEB< zeq|FEZMX=LIxE09SyxPiTrF#L*n(Z^YG-Nc)DbEaOm^9~*V?0Oz?9@D3_6?$V9kPq zO~N4~1~WE|qDVs_JEeq=EL_a$?$4XI^_3HTwNJywM79rE`M;!56}eKQ0|*~RoFx*` zV9XKXj2R!cY~~X&5+O@AZBvh{@;4Dp%mbUX33V(w1r3}yriP6kOT3NFOKr9+r=9eS ziS*n^R&x;4PzxUG3Q2Q+vcLTU-Qp35=<3#yk!+BxJSur`@ip!M^%=8Djp#{2dg*m$ z|G?g1)AL<&drz;8(EopDY((#d89!Ovz(-%-v|EmxY)ZjhV9n3xS=M=}Ekp_1-kwHD zMNXMZ>FjuXa&oeJFZQtswsUl3!I^2$8%H%ve3a)_2-POXvNZ6NDiqeYJ1e3( z=n9#RI(I?!Le}776_P}VF6tj@PACDN;p?-qh|Xk!eaC zH`;%D!319xGDUA#bl56d#k|Eq=XaA*-O`P;cng!NJt#SMWQBU?9)1Vwnzu()hv@q> zz1Fcwg&}ckzt7Uo+V*C)DKr5ZXvW?QTnBTznE)i`^oSkmEpzc@`nSbA8@M)r!AOSv zU_Gk0eednFr6et4xzH=>b-{&@-N{8ER@~N6;&5`AQY~B=>V_sJ6cZx41`9Va{aGZ1 z^Y+)SHGNIROLhO_6~RIs77vmIg+`}8s*3X_P;Cs#|aJ7V-+g%(S!^S ziKyPlVACz2>T4WGH$?0RtskH>xA%Uowfi9nUV`-G(DMlAKd?I$F zf2=C14Rh&?Y0!H9)^||xi|Wz9^4Ynu{Hht4zn`UVQ_41Cr`z>7p0mW!>G{~G?H}_E z|J&Kr;{EB;pN(>rzdCltD0IE7E}u|8s*)`UVXFpP^0VN3gdggWzmE zzREUegAmC%E8TG9@$JZ;HOZ+qOHHVc0PN*i~;r}GZ z0f4r>oeXog=|fa=LEPReJ}^`X*k)Fn;~}IdA$^p&W>ycIBb<-Xez-#{WZN~;=Acbj zP>`qJGJ_B1ZPmcR3&DvpT0pPZyK0uq^`-)*#BA+p6O}m@YO#(5j~lU*{GyT z7lsVbaA}96+v-p8P?# z78jM*oe1Lcdm0F6^AhAXR ztN)*b2%F*GCW=&VRifFtsTw!p8iIiTuidHwA# z)xc+}v98znWJ4?ftb}+=(>!UZ+6Nf}<15g;8qp2+w9+1=Bmh96aVIWYx@)b1q)Rq9D5uL!+}ZSL39w5(WKT^y<)BeKl3ra@gl zyISWmSy)&&|2&<^GlUi3(kKC3qS2!rMEvknWD9_t(F|Ikng3e$r zMTe>kbX0$A^2dWA?%#2pO^008(0-L#T!1G)<&nB+}wcQ5vJy*rleI@Vl>N?P24)RT&Ks^6HyXd8P8?6&@<|Ru#XT+O{!Qi z^Jq~&l!zzJ&HG%`vFRf7G;;+NG+na+WKDS7`GbZAHeVkE0+ZiDsdX|-Krc9K?iMyO|?!- zS^&^br%WHscW>%{|MTO@if7nl5(~PlpT76Y)o-qCK~;eT<`Kf9#bQYq-RvC;K}p)&T4tw&() zY$rAcaexX8vPs~6{dzNWl=Vs-eLc6m5_U@%q9M&qE!rEC2+aUmm<r>7r(L7 z(p#h?&7BOji`CTR0){p{5+=R_{5<;Fm%uGN}{687X7^&Jw4N7W1oO37Tb(@eo2;JFOrs9eJ9+WJ_hcd z9vvTZx#^}JPV?3JLNKEkmMzyd8|*mTS4E6@5;(z#!uv+ zYW!j$d-~2XG)U+}m*gKaw?(g+(CK*)d3zXAt@D<}h@W4-=-}p-RY8Fl;bAB+BDL8| zO%=n>;CyoIf4Ax@!OIrW?6iWMFl$F_KA24y=b@gXJkfD0P-U1mW|cg(cXoD$u#P;g zcjg(ix$hrsRX}2HZrE2^-DC>8uK%!N$S4P%-82W@dIf3^SbBPSVJ6T5Yh2@*GP-=+ zpjj$bh8eVrKrqjlazNmD@*2i8F25@yD$cqf0gNU`Ou;LBN%Qjceu9Q)EbtXSQw8OV zY|$f70bQm0>NfzF0#JOf{i@6Q-R(+DP7<3-S|;^l4Jo+z0tA4UzQ-^psF3Mvs~QN+ z&d8YhU>!q)4u}dFC(%WMP9cHvZv%K2UHbdu>PIbM=vhsl$KT4Qf^nslHXP2TwD|x! z5_Kh2_9ir;$e>Ium_sgC*JMdy12-H9n}gJ)X5jApwV-MPgQ`g6O{X%1R~`jn!KFFB zpj1q<8iFv1L&u%;V3hdbsXshedlqdxO-xacqBxg*Tn>FhFcbQ$Zvnn##v({=BVn=!3aUw1}~`sUA%h!SlD~pIHcY;^HIQ9+U(qSqkaelNMyfQPtIn*i$uM|NW}(pp2B5M>UQw zyXJd-zy9H_I`H)2ZA}(9Muh3So#*ECIq#*2&G}{haP4X7^*r!OKk&5+!N8TJoAdDZ zqzt_4VKnx+v?OlT&dU?DhD*eV6G(v{6Re}a@dP3G21H+7P=VB9GibMAQD+iFD5Yqw zR-U>HAVSw5oCr8PMCbiHIzu<`Pk%mh1|ESeC3|9I3~f;d$WEgckqW=3zBq@N-vT6v zr2piqkSZOJokV^_ruiaGw_c-H>E3b%?URAQj{%2wn*!I$E;6WhycFd z`5gh9{bsd)vh5qoBDT8+TsHe-5usgsy>nkS9r)MQ7N7SSsc06&RmZKSH4Sm2Rddt$ z1$K9TD5`(+u5GUOeSMKUrX@xb^0~4RF^*%*ns-{c;40PZCcQyvmpb2nEF7l<0J=9K zb_I-P29Jz3;9A3p@6vMV}lw0ggfsD_s~tE_ct55o;I)z0N{()<~(B&4JdG z!a)FU(EFDgQP&JK7r;cQ95_a7&zte%y-%YlHIlU>tx>bkrh$#V4z_~el$l+=ZHy`! z1P}z004Bm!*zByNn4lJ8oK*WV5Ey^Io;-S^(p3C}y!MqTDzseBI3@;3umd!)haFDc zyRx#PIv{5IbWlTuoJs%9?_stqmX!3e#cS6tlhj7R?H6B@Hu+ zsmaZ8LA45^&i^e%F|9-)*NMzosLBmKuU`dykT=^IvPk&@;f&f+A^h<1BkeZ zjp4HNS(B4~j{P+z9D;DwGj5);BT5s{!0{(yyU!TDwi$Ma9h5lR6Fvv4@l zD}ISR*cze?AW4_aY|x-p_>falNaU`H`Hkt1-6v^ULrb*!e{GyVP~$-YWud3UN7h)> zqii|jy8W+Zm{Mj-bF23ENwjVj)SF?on7J8f85OoWKdyn-VVU1O%Oc?uwEg<1{Lz{9pCZ>vj%+b>o( zR3yWu@N~Aglx6Shw{nKm~LTWLRoX2te02h(GS;gs@7etEo(GgCVA6X;Uf5Mt) z^_s%_dJ8V#QhM!@ugZHxs1{-;z5!Q9R7Xm)d6g5Q?ozUa-{l7$_5=X#2W%6p?M9G+ zzsn~N*dV@i2I++FSmOQ#+9(IgV_^@a4edPk^U`?_#PdN-_OyS_9G+XcP+HKNEfc!y zbUKBz@(}M(z%%}@$5TXQ=~d1E>nYP?*BYVf^g8Vr9oNf;627fujY87fHBhoR zY^yqKldEH>ElXW}oSTP6k>Qok4x7X{nuDpi>#t<( zPyQd2-f{xi+4LollhtP2&RR==?Y9E}gd&ZEZkoWf-&IsYqS6DR1uWJon=)*zPV|O|}a&$VaIwI}QOdhgQ#n~CL zKe4 zP)Mz?Rk$Qz-APFg+=&cnAa9~%rh)46b|E-b{;M+F5AP6h=EMf?!BF+ z^T|<@qyEmgU<3f6YHEu`svo}mxgxszea2kk484Y|`h;{FnOYUQ5MYwBhY^BAx2{lz z?Ivjut%D}!?n40>l&VmY3d?M|oQ;|-Y@BE_K@|N&%2+0`IKi}gPcF3Q__wv40EN%w~y}1Sp>f@WjBIY`T(w@$?eg zj(E6D;=gE2OrD65v|H=?w>)XvXLomZAJ-mwr>8H|jN9(ldxRrvU8Ed}km@_z%`0;p z9H4(zU+B}USABO4bhl*BE{>PrytxY5Zq|%HER7aM5fg56AX`yoZ2i80;CnN&EKLLw zLVmQavym}`qqFUDXZIIGurc*PYSy}5_&s_XZagZESiMihb`W2Y>O1_C40P3n{Ih*9 zFe4pH_|LryfI8m;2k6oG79japVP# z`mxxO)1=TeVkVG;3hOqkcR1MmDrS$Q91GA9PbY?q3i(Ut9S>hGg7Hg`Bk5AR#?;!9 zBExoO%@(W5AShr0(a{ej;H#3GY zRUF(l^B+S0IB!fi1pFnjriJb&h2aqN@K`FjO$Da8FB&d2;9G;iebAOh$%=oTm_&b3s5ADAp`@emgaPxD%YN>tB#GHN3BJAjnYkL8^*sO_SEKs=yO|h zCDO^X_5g6LO9p>+_DDo%PYwCoLIu-{ehdD2-?DGtXFGnD+0|yh({=;Xn81P|IMkT3 zM}I4FB`4YF`v#m-dw8w^12Vt9H z;)Ji?FFJ4;3+_s9+c@9;nU&YpDxXE*O{xuA3mu#+b+t4z3BWKw66%oRi!M0y;PrS2 zgJFiw&(qZ|-_4Rd7%d}qEVe#122UK!iBtqz59Xfy%a{bG z^Nvi*$ZELfd4goqOO!V@ylPKfZB&ivJUgfs#yYP_#wl=<_oxHr$#p78pk@YEis9)| zW-OejF$8aQaFRwY*hV6ONbh0v(WpeH!tywk&Y>6^kPdfba}G014x$*N*3Vy&s#kt> zmg%RZrLiBkcHAxN8@Kq~UpVmFFU<{nad82evl-l+w2P`z?|(e)aJxS!9<`bpSiE;{ zHDD)+-g~y; zu6UwwQqlM~|B5Rgkfh3)Fh;JAZ2x<)d&)`+$8sDQKuRb!xwv706W)+;15E{pG0F^B ziny>N@W5*;D`QbTFDEw}Q>u-nR@R7Kz>ME{>E`A6F`iOXmz@N5wf-W^>c0KA@w}gI z;?ho2)bC1mOxSI_jcuf^GeUD6q4^h8REQD-q7SdDO~jWY&evy8YfJv= z6qTAU1-(RjuimV&-KH*ClQU!I^A%=d=*&cM$_7C6SzFA2QmTC~5yNAgW#%|QlGvZ| zI3}V<(|hW-F2&^>7DLnz5gIZTtK)*j1u>3Im<(SRj44Ula2)35$1eXskNhoQZ^_}iktO@{B%$`by5T;!**C#HvwzXhMK>VIDrl<%YIgJ6V; z1H~6ZK3yvh7eZ2cr`GeHk^@5!iR-J6?YF0xMJ{j3g{cIE3z zh<7vF2V$at?^K+CaFGO~*Zga;LWP90qbT1KqkX*ucdqZ(^VbhoYfo8$_wxbA9MOIK zjC*H`S5G-!r{Y|NeikEKZOdC3LvA&xk==U3+{wE!sRqI9BNqfiNnFV5k_mA`v+sxN z6d*Zc#Q&)NrY5Fc*I_CyRhc;ekj-EUDL}{eiz9QyKIU368m^k2@$DltHuNhnEXpvB ztL{75>>(qX(_{_7MYSk}mDX$n-IG-X^?i5Bwiz=)KA#y40E<+*Mi&f$iX*#qb%XUp zvpB+g3u>FL&u>Pmcf9Za+B?_a2X7n{+gl3qhLDlz%M3&)3<*vZMUwS7;C%0&u z3(ST{(VQRBM4OquXAu+y;BDO@F5^|vbZaNh*nDc z9JL2a!h%)WTo;ql4>gXdqWH615OEkJf%bDl2uWWMNQM<%Fx-=VHxFWQq~q(0$Dz6W zJmbrLZkC`lV)Q`r8~MJ(>UWad%wH`V+9dkJAO*u_Tl+XwL*BPAWP8V4;&7s&BM=xA z+xWb-oafV_;&yX%R8dxT@An})CUN`8kDoj~EdE?GKz$mr1gRRQw*Tvm=vi91S%dI;bm3~)Vwy1v_y%CO^V4GQf#ZBcO zy9lsVtLrffAYa9B9_mku`^J%k@+MsYA0j19*R zgm)lHh~cbhE56VkSds9){rq4zYBx1l@Xyo|c@F_(tv@vH;+ufC;^f=h9u~}+L5G7M z&gCBZl3ZVQzH1=m1VxFXiV>kp0Lsb^1mApu5tzp$v`YAq(FXx*fDu9*q4+dmg-ov6 zs8qn9L@+J@1=-ErMuiT>5QkGAC-{Q{367E3sh%TlU~i=+>Dni zRKqY5E{K8DSDxlDNzx1osGrD4;U-A8fuu@Ws z>E%%Wd(wUHZ_-rFMQWnj|F2;hlQv&Y)#~;a%>jze-bwS;T;3G!CyL~_Ux}$k5EZiu zt*bkX5K8dKbo=ahYJ^n4CV;Z*3_)_&|*-l>QbrbB|@uv(mqg z)U9VfStx16JRE%cg7)dO2*0tq%R zQg+?1du-KD&4o%(r;E-|Nm_}Bcj&Ua72N&H|K;>j$a#qb7r=@yv=3F|EcdWcY-(@U zZ;X`_*pF~>bll&;Wec%25cZTj^e{Y>0WginFEvS_MsHoeNX8_7tJ5#%3&-&sjU)Y| z3$tR6lBibM2qMX$)=#U{Vx=RKYHHCkfqSp!37D&bTba8fXd~?kMF3?EyK_6RuZhC!~ zG#>G(h%_w142pEPMf;Ywn=xTH@$fLA_jL2oL@O!tY0q! zZ&5AYe^l& zPJbK(Ww8yGK$&*}(~_Qcj%y5kT{q6GVvT}^Q9l)4bJB4Jc^DEdy1sueAYcupNpvnQ;h%j)Lz3J_iLmYcKx>SH+Ey_^6!rIZIVFLS{rhX@A=G-C}U z7?K6q^Pu7tpn*A+D!4{_1VD>AWEtStzHSgw5Zmwduexnbbe?)GI7w=#&+ZzZ1yp#W zd%mB(F$*<$*OUaAl?qlqDb993=LdB(nf&gEh7BukLg_>X)R6(Ye&4(E205SXTEIdUN zySbK`8B&Eb`r3{_@%IEYI+8)?6+84&s`)NkvZyJRhuQ((`+o4PQ&Rz%7P6<&m*reUYg^^t>*``t`t2)w`d(==~rPmpd@p~=ql zG|zDmb>Wb~MqP<*$+WE&iEb(}Iimdc+#RPdcd-sU{ZlN@s2pE0HohAjJJkX)tuGs& zC>gIr4-IbgDu-+b$QD&rRe zm>Y}8fRVX=P=V!8Ro-C}rqVP}ljO`!Or}V;lHdnO)@4uYPcLKwalxwd_CAUhPw{|Vr~6jW0Z0JACz!Z~UxDJ+ zFxNxbZUoU~WY|n4Wn^3JnGTs2Vm}BmvqJ49K!6HI2mr2WG=)-Tbg-+{WB|C4f#tt6 zocFuZo3ZzPK1kU7Fq4MRim=)8Ho0R)0J2*5XH_D^_&K8ppBkM`hmL0E&y)%0WbxME zTu-Rn2$r5E+7VP#V)^f1wWNeXCW$jmL#}8sPFb-!y%~NU0wgqt#NdPxg=t=_9d!*> z%SJU52nR6!q*>wL zFEpmh372y|u`QSP_TrG56Hjq*R0voJj}`k;(wQG>0sx%rzLyIbN8t$RRGkt+XJba$>&sVbdfM zJ_sF1@BdvvOFNY1mTKu?$a87JdGQOJxYsF#MUcUTCOewp;b@aM1(1W=D#OG%qj)Xx zm=qERzpJSJX?TwU7*O&eLLiJXD%4wIGws2NKmd2rcQt7BVwqU#E_q>QvOky9#jF|q zf7>QHnj`XQRpgYy??#dUGMk^5nsigQy_Mz=b)l6mzy8>5b5)~beSP!Ctnq>5DZART z!@q*Vm&-LPODhPnYrEgQ>*kV~%AAKVsj^kQt}2o4ew?z>IHkz)!YV>0Y{-_nIb|V| zC!iS}F1Eg{ZG3;1{LxNgVxz|QQB_z043Z{4TFep7hk1j+-(Czr$k>1czI-}HRJj&1 zbHqumU}AQKN^L_eEv9jU&>%^hyULCliK~R&s`DOJjSEK&Mn27K}1EUs)|F;O?qY&9%`zoxspPL5)=gLt<%%B zH%ug=>cfaVHQxGC0HQ;ESA1fiHNk1Q<$Qd}c^9EzyWiN@D3(tn!n1rwK~BEq{YwvV5cI^B&z}hU zl};+0ns08JaM~U4l9i`KNM~iEj+)Gq>f|mKDnMcbli2uA zDu&L*&)RNOg{s{uwJ(8A?gK8(o_oOpP%I_kEgSqDMF&M9D%+>bFd~bbXbCH{z>;Os z93Gb2!YQ>Q3X)L)$5}$-1eU`!t8Miv*OBdZh=w(YP0qYOfhX>42;u5THM{5$=8j&WBf@-N<{pkwMx6gxI7BR2#neZ#p?+ z=wjB+QqhXr%kuSa&PT5caW)=RKxo+90B- zCd5D$3)`K5$grFO-l8Mi=NnJxsSl@z9GT=l%liJUNTl1j?TU-!#|lp7)YDc6Gg3oT zyAdr`Li)sN#3F{S;J*Z4(~?vJh91thc5mi5+;>S5Eli~tzU_rb!8U>th)z`t#c82& zIO1x=vjGhx8D=q#|D)(U!`Xb>Fdng@MiVneiBMD(L9NOFoA-Hr<2Zcb$^BgSdHv4w)XY?IuMXxDob{@`wAoXI4MzcTN~hziN$w%shbaZ|U_rwX=2 zCm-A(3udo>)+0Fvj2XyD?Q`mF(P;DLcUTTi@}SUfiAG1u4++=MeNi0HhTrAa#YaxN zN;1|^jTg8tqY80*M!4+iHj%G|NRfJ*Zx_Fw=Fmi@nJX5e*pSEwR0_x}YW;oJNRBuN z&6Jj|BFI3d`8*ZlLxDE0(NPICLkNt`SAh7Y``!iY2&z~qOZ8@hxGMH3lum1owT4#T zYe=9KofR-O{9}}P9FJlb_~Qd6Tu4-HK8f86%-Mx~r3RO$?A856hVU&F;fr5;Awb>1 zFTDiClpqJEkl`a=(n5!r^JRX zpa;{$UO^;zQtBGw_(o%!(*P1G-sb=C88~3`V(GyD;5gSCcLEi79vwQqi!UQ>5}u+m zAzIu}rWZw7_?4HL2>fYA*D{6?=exSOAU8jV1Q@`Gnx|V2Iyam}tm109QX~6}1!R7x zyxncng&3OT8F#q{4#t7h%34c5B!h7l)BYHoaObBP`s?gs+zi~WDZwDNbfIk>iyWcy zSK`>U4^fB3+J+J$B4y=lOi2(+E2pO(9iD4D3QYb17?8aK*1YlKSsVvbjP~#b@Ilzz z+yuxI)#-Pwe&XZD{jp51#>a!s0n6k3{8FpG*FBKP05qn!S2nC2VjFhnUa7sRUTJAa z8{26iVisTkSvRJ=0GfU$X?LGfc!f599)?Iy=X59M=F+o3AP{qCz$d%{8Lci*fQghV zHOSOSJ3O@u4a$3W&~azwg~0$Q3Qle5=5_+>?9B8t<`HL{03Xv^+tU*T-3qye;km8c ztZqn@v1P7vZGL7E`WiU2$3aAu%y=bX1kq<=-D(ET9_x-nDdb zIUejT1Xjx}Rn>;AcR-x;`HH_kFRju4XR1AWclDgnlEUc0p#E4vA)#H{2Awe+1VJ4` zl0bU+zOfEfMB!W#$=A0bj# z1i@J3lY&f}oEpfV@~;Sv1M(2Gt*~$+)nK61OpnvET{vf)7P>TAbYMm5Wbd@p>A$jIFUBb8d*xbRBLa_IXk?6G)2=cw z7^4Ad-HtDP%)E)?nIt7Z0Y+EFMpw({9q0d6d-;Z&nwl2NJAnA@TE~*e_4TLPmeYO3 zPv_dsJ^z|U4X=|Y4k;=U+0pD&vT#Tt^KcYhdBgpa@DXecX;oVVy)WO_(0)mvqRz6oDy<#|G+FYuCXXZLYe0tkV)qSK9HQzv>~KWkECfEz~A1FEN10u^1Ff~*%) zu(GO#un<~|4xTrg5AsNLm^BoF-dQhTATx~$cVL7?Nq_&{j`$8A<}2F(n`~X2&B&fU z{?vGC!{mk9OJ)AtQO2cw(C(7{+D*o2S$3;fIN6JYTmpn4F|;W%cr~ZR8W%kKhLIrd~O^QDEKr@q)Cfq?7Q5I>d4-{fo+C7a;}oS zw(CFHwd>GFF!FWXP^CozSxDIqzWEQ|enoQ}&BILKO^1b;{hQRKml70e;?pJ}C~R>c zd!=@N*?D1LSIbs=zPhyqd4tM~NBP43F3t}yKvl~f$gx{5P87YK->b|4MyZv`!Vc6Z zP$$)X@k;m#8SM%!{Hw*{&JSH$>WnKVRO}#_>MH(TRoFMtUq^#)yp?dw-SYB`5XAbD zi*#uTH2R3b=c$a)l}f^cT;J>lia*|GU2iGBS)cUsTWC|`6c95yiEH{x%0T?j5AK#a z@8<5Z&;4%_EB8lBY-&fqX-)nYYdmdk^q@5IeQI4?5EfYLVbt-!3eSG=DZArjXFbud zG6(>hzk}f5#}9DOe|S4*2Krw5i!;9Vg6b0C65wB!vTy{)EN+ z;o;$XVXlZkIhm;5RVbREclEsU{NvV_+%~`@<}*MN*)mC~ z?b4WP==Fq_fF-@^cQsq`gMtNZO12!@#pongU!qT}YeW;ozBv3<8cfbI{jsL}9s}>TrLR!VL6~%efu|73t$VVa1g#u`#m7I|~_+L(43B zF_YCWkdD1ltK)jeEa+fyY;VWw;{ylDNO zXAeM2QlGNcwKlZB<2Hk^_kXs~7}*2_R-coTG8aeS4f5QGLEM)MDTkUsL5yL05ljXy zQbiP^uP2z0GHNe!*Z61x%6A(Bh;TH)+F8D2uC?xlpwL40K-m zxcfgt`wfOq0=)!KOv@ zm^|zZfPB(J@X5ZJ!NThY$~pMGD1MsGyBr08D*#niQ;4Sxv!IE< zp%Y!U4PG#1j$>1=kAmVaVtcMzy?NSCj{2GWJ#J1og1=_*G&MHL{04}3S5ZJ&#+4Nk z63oCl+1vY^x2|+LuLH8m-X5t!VWUH?m}f02{Q@e;#$pL@@Bfc$v$A6H`-g(XeXV)_ zZ)?>`@_K%7cH{7{hL>(rqS;-DKE+cPy#lm=8{Kw4^qa7%HqcZ-tP>ERX7qj{QSu;g z5XQQqJ5o{Y4L(q@0YQVp<8(w}5RweM-!)1=l>_tvcuRmN$a)F%BoMj)Z@ozifriLI zS;6tr$*t-yCg#oDHOyZRPY~@uG?Ko&vsO2ESp1Xz9B{Rlx97`zghE3^b{NeJsLdFn zLPxUJMKF%u6K@;J8OlPcsg2mWx8i>yJ-H8nX)D|eq>q~Is@uFBc>uHz#`txTh4 zi`4UM$l=OXEHWf?qUWD#&%}|}T*K-Ey7X?5TBdAvT(s1T(ejafLwdVe$IG(FL4L%~ z?^0;F9Bl`d1Wc;{*O&|82t$GJpC2vwTS+#qW3S9U*u8_8pmHM=;~z$lw1r_ze#=|u zRqfVOrK4jHek|)u(1GCVfbSmDGuAxtOY3xFqa;=u2xTc5cym+9Kn$2S41ernf$j>; z0Qtz)meRr#-Xim^Cl6F2=D8G+V6LTaZKZ=J>!^3KLaPgLTAg9Va|3;n*NifqHpTQa zxek?qoGiy~dXpsm-z&wppc6qGkm#Jdg@{f#Qfp2#Ilx~}mGnXPcZyLxgP z_C`qKdrjB%=OsgLC}T)kwYeL$2Sj{a{pVEl)PVKBM>5Lh;R9g= zAPhQ{9E>m_aX8uI!!x&YfX491dv)rKJj`XFl+z+3)YSCd;Lr8E_?N%)UhCA^+q=nT zVbc2I;&2T>Y?0mv0MBiqyWHyTNlkr8nnr;n9q3KSvZKk7Mf3IUJ`3GoO23)d$ zC9M4U)ycm>SJB&rxel$A_36UIuJ_kx``y+Te0hx~jU(^=X?BOne~(SA~Ca1}<-o%N+)qn$wLV zVzea&3TIP+t3vu?z^=JfcId@{I8 zb=uzHfb1O+sB0_2MT@`Oi-pm*2@@lwKSUWLIX`KF;eE|=jX?50ngb>WueR78wg}&^_TVX%FIT` zf`|F1T^d9*fqY&9&oDD|2_I%#xR_$!>7G;pMDXhSG#Y$bf!TC1cC#l$^7q^QuA*{l zj!P}so9pF{%h$he1;1mPBtpB*+v@6EPIuPV*38UC_O*>B;q_d@fauzBwew~9deB@3 zt*b@ZhZv4nFVN!#0#M2@-{DqPpF1kGXL{nFD)g=zlj8t+BCcL1NxpE>2avYb))%yo zXC6N$e#2ryK=t3tpAUKj$RiO_@OYT?z&fsT2z)rul#7TSR8>XnC4lfKCb<^UE(G&C&Saqu0ID^z>1Mv>9wtZ+Dk17`m|4{&2ZE#U)0f-Vmw$4>{H7wm8c@ zKEW#Y!p^~PBdFWB9z{zg4;ny(?imYDt-7IIbuBCEW*gn!XwF3bB*1L`UbJl1Q)BT? zUd91sFYmMSLSX^56;M`-Yv(ZwLBbR`3p#Yn%(jH)r)-bk*JWC>`a61ANW5=(v74>X zf|&D|!@fN~?mS7Y%9rPKV7JMyxjZz|+(_;Ax3F;Xl$ios+nK$1GQ|LNlrdLysH~Mk z&gM`tlgz(m{Z#r?daFv8!qI3@fwe~J=IlbB>13k=eVZ1weoTPJ`CkLx9~WBJce|eu zNZXhqi%>`R)tIcp)^)r1HHzh7No)<>d-vAyvoI)s=&xf(12JuTp{@I#2|q!UGDw=iLYOFqr;RU7YQThh$8! zs!c<8H$omTNb~^Fx}x*TE|>3xmpx9l!cpAVt;KIm?e5!CfI+xqx~$<0JF1_`V|2G2 z#zfT%fW_aO*N2>&?dh0snm)Q)Mp9w$1M22ob+!Gst8bFIhU>#0g5vWB2%C)jW`6GV z#!3K?FGW0XKWu{oyu8iE*~OvRJ3AH-2!w*J$xVe=Lzn}@@ubkW#AC8J>c~G}K_%Dn ziRHgMcLeWoEI}LOWR9SgZmggpfettYMDg>!&eIR~yY;jE|6&(bTQtqiiKV5$d^9{W z36Y9)WBiW$s^Gje7)|47My_45cB>&Vq@i(8B@b&+WDuVE8D=jv^kvN zZ7$cA98esZV_{KK)6Nf%#tX0D=N=xGM#1m)dhUM!tCz{>%ItOL=JxhzMctJDb0bl< zvKlECLsX*r+!3papG_FWyUXt*iO_V}{oV5N2$K(MSW@jj`mNr_ zmp41ZO@e|#bv@a+SwMKa-pYknqYl~x$vONQ+Av&#oow#(b0m^Vv=4AT5NtsrKaH|B zb57h+4Qv%y1bj4;jHxc;Cv7z{aVEhlVsRcQsuv4yeuI}c;Cb|Xi0*Y(Eds^r z4l+M^g9PhMe~SHPrAni_J0yz~*e+28u1EuxjqHcpZ~W0uj(vFH04EG5jYbK&tiKPK z-TquyqpR_N99j!3Ih6lw0Sn5_>EmgBOGmnu`i9qY0{p5$w;RqWagCvfFFnJ{t{l|Ie0@@cGu%q<{tjq^&kaM@QFflh-eSum2B!0H)vD z+uLV)28fLjipCGSBKvv*<`)*`mlyF7n7s(GMi>ccSa0@id-kokh1JOMFYob31A9P; z_ry$`mkzUQc6V;&3djUQ#KacdGN_>L#~y*eAWDJ=Q7DXyXH#CH`$W8^Zz_~o$F7c& z84AvCNZ)B>hR-4+nDGkr_PG=VX^=$%mO0JeI(EM}urqf{I$;>!?Q!t#ovBVS$ z-IhH7y#&zUa-ZHOwI|X<9wE(ovkub;Q2&&YWm`=0f7e!pv#VC`XR19l*el!O)*B z5b5-RwDbUZgQWJ`>gsbb&1~pe(@*H zIb5n6v^#m`!oHe&X}H@Yhr^Mz?1mcdlz20fnwWb{Dc&+g^?A}Sg$r0cZM8eeP!^wA zSc~6p-uJB-arI1p?(eZtQzIOHeVdZ-7ghuV3u1L@C;PdE(XR=}eZk@{%#OM0{vEOaN5bnBjm?pjdUT+%Lfd^7_(>I%$31zSr>+jL#F52dT z?7JYvIQta+OdP44%`wZgp(Z6ZDOv(w;8?JLO0yYf|7T_CL&kj5&mcIQ!^o7Kn+vRt zXUZFOKVcpA_tHn&udutXVq*b_xS|2Q0VMmR_pe3I*d{0ACaxP@9F0c{vc&?iN>_jK zY`$=P?l%6~-fr+L<$f>sZn~w4$Drjc2_Zt0&c*8^Fy*ed55LM`2o+>xWYn{B>p6+mUKvoCZFG5rc78RO5rIdiMee^e-Xf!x;8%IgT23@u&qApRK|M9vwb?Sy= zKE@^sgn0UL)C#Hskq$78>e-6IXSU-*PQjwZcwo`ed}DN0IK~2Wr1G)~j$(`elUKn% zyEEp*#jLKIau$NmUtX^FETz{uFUMMdZnWeWP&>1-ash}^6_ZoU5Iw#bx!7c6v-q{S zIUE#5`2RQIyq-7UQW9GBSOa>y01w~Ao|UBc{>}`Lj+ff^)z)WPpl<%Z;#5bnFbn<4 zC=}pEag1S){VSO8H)Hpftszr6mD^2@1{frA4Gu% z3Us*lLs+NM5h@@>E!Jd0%8Ck0+yJDF`8OWKlcAmkl>n$}4>6Jt{Pb4>6!hXf97z5DBN#$XyJCN(;&LhLwh zUNhyttZaQ7Q9m4TL3Qf|<>lKaT(w4AR+{aUuwr_5^OGP3TIA94-0ADS+%$l9w9v%> z0?-@n?j}_O{(iCX+7V_M>!&Lfh+5Y)gUxr-0$i&;f~Pf9Wa#e$%y@|t$S#KXU|1Fk zutF>mSW@H7Y$!dUV4cr&+l<4$%$a$hM_idBA}V=FV$!iN;=*_Mby@rs&VpP%s?5gK z>Wv~lyK$YamBo%EP2%?_CoN|Q1>!qnKGMt`emJ|#PMiKj(wE1H%TdyAPhH3p)PBn3 zh);=kSLx3@da|lOV4nYt(H5h4pFHz!j;G|_mZq}u`ExFqh`2b__ZC~TE_jhGy|y{Y z(YfEQ5UyyZ6=xl!dMk0z#WT(eX6kY zdA|;PAP|NBsc8J{hvH`q69&QP!mKBR5q7F2&er|~y^0Fd0HV;)E6JN}Wu7I5hcBJAP=$aj?wRwDpfI~~ z3HpubgD?ZqbXs6GVNgXk1-Ly&3rP?Mldk~>gxhy03>YEiDv*PZPqIvD&H@GuvVJx? z)TQMM7}uv(eK5IdJ^Xg~w3EP6-|tESs^@&PCK+%Dr$afuzZ-nGbf_@%qO(vY7L?b= z^(+|2I6@bam?U7@?-=uhQw~ofl)9_xq)JC_^z|%_UadJZ`q$5&0aYwXB;oj?fnHRa zCIohMTu;@dy7ZNei7NTAw5e1bFr^>QeA-d+pjbFA;r%Mep-*e;Q+<}T>IAjrW` zZj*87(Wb+-(-Mu)oUymJ=kU(m6lNr`I3U+Eb7-{HZuL&p`l1=-XJ&VNaZ#2~a0!Q9 zeZ1kbxXvr5Z>$n;m21mehknFND1~QMn!6ehxj_>cAhj9NI?xq>scFWgfVG-{ z!HE;@_9FAy*atCy~3XY+yUBj~S4!j)wGQvBf+|i6Ti(8!+nfH+N ztE~$@(Nyp6glQaJ0vz%)OjhM?21kB5Y?6-fL6fQghR2+zcl9d+89>j!7Y2-I4SKW% zgXX~hJXw%{yrZq@`jGIzI|Zm26;z!D1gf#KU8lCg+XMg3s&eI4?>~EgmzR499|G-4 zZmC1g!{m;?JhpFc+CKZetJKQ9-m@w%uT8ST_PhrcFaK}-;3nKJkFP3*%OKEdKM1b| z$dk%rcZw8}i|2`BqPnDl1E7IM2a+=Voe|EBR}^Txp2UPf_gA*Tksg+A)5O)uX2! z01@j>yVN3dhXzYe_3Vy;E(k8uEdK0&0{y%kVaVEs2C59|Y<=0j8zlwZ6w%)0=rY!2 zn~*T%hp?W%_962XFjyY?(|+gCGE- z&;0zgA<8fmNUiPWa(T2qeM}KT{L@Q{70X3oKKaHHv){Qk42>DmLKGg)`Ed>=is>XidXqC<_qjb zp?54(xxsTcGXN(+$Be@@wKuo?w?1P)2%O0rCscLx`VRN03VuA|llW|Jw=4PIQqR-m z2i~%je_zL2Nh+Fke{Ga6y52>q?clbW?+2&ht(Wz`K{_93;7ouJ#o@o}5#EpM8f0G$ zfGne>Kv#`-OtLuA*6D8QyeKhd*3t3Pd=B}%hBw7Du8QHOf>juXM~?t`h-=dYgh7e! znnp>~mi63UGu@v#-JBY&!1KV=(Wu#im)RnzeQ?s(QOsq-rq0$#22pYaooZ^?9)Ep1 z7H{%e&$8v(k;sTIEr#)F9~)Q;M4h!tsgqE_Q=>aJ!e2aIiYJrpLSz;jmns9)=s@@+ z%yetDGQxNvmj$SWaeQWQX$E%dEEJKD7PM;BlPCGtV{LR?LR^$Bh?{4pWvn7|oaTl8 z;#zb#v#o4hUAymnH|{eNEL=#iG2^$>-aGH>eWrTNMS)@H?buy0us5cWTlHm;t{ury z9d|!FFE1ae?VdjjZ`?;&Xazzch90)S`aC>#Sw)S~q{j$ZL$Fa|=TTLOg zSRah(tz~f7TgYOOjb9%w47nqNN_$*Zt}t|7Zsw==G~`BZzM|eYIh(I;bh@8jo%5Sv z2GQN09Bys;`yTH5L-J1Js-AZe5QX3&_8tB*If<_9kXP|o+0<-;XkC`mbk#RG*mll0c)MnHzV zaB*?*MmWP#4kFcagTugNN*DpBf(hR-O_}Cah(0`xZ4^-F^odvSEQ`SaFH;?*EfyutS zWqE1wg{WvtedqnrFpvMuVZYJMe>9R;7iN4_Rr)e8ta9o(Ko$WjHXuLqSWGgPN3f}p z16w#<2&g89vw!|=m2xR>{yN;A=ea-P@jpJ9dxC+IU)D)@$Rl`@DvHk+WL{d4dWl;@gLpY>IHckz ztyqstYr7ENM}B2wqrW{Y+oF>L#Zz@M13BHA(S#O%xsWpE#x=8igvB-X84>BnBaLpj z!JavUYPLwX1~kqi8|^6~GX`?L;1Y-IXKCqxWd*6q#g$gPqHl zlT$BJTJy1=^YfnZsSb-N7D{MfQI5x!s0u3GO_sN>8b}x6mq!mdBanNz{7r6|7M>91 zfT&@hrx7a}ZS|9pz zqyp+VZ$CisBQ6JC<%n4*wHniK?J&mu75f$4mXxkdD_%b<(t$slUNC`5;a=z4NQcL027OrjWQ0oFu9P z+TKW|$E+qQ%pv6yE5UcW6$<+kzBzs`UwtT8@_+PMK`E)^CHSQs=*q9@ukfIaFEh)3 zLYgXPE zlBP!t_rqtL_!ZFWEQxn7>l^dmC1cVoXwm;_1OuQSct_gLvGZ`;_n%lL1aviQW#GOD zs}l+s3E1W_D?v=nVk2V0Z29P0rFzc z8qd2XOq+f7i?wO$il5If|1H*Ru8)a01@bv0U94655y_j>6SrH}VF3_!Fvdk!x;DyDCx_P@J^&@O+#48Q-aLA{T%T0?Si%sw zPg0*y^ohGeIqDr*D6-%hycHpj7cjCxZl+jj|6xoDPap{%IS4`@_!?9@r%Ka}&d9Ml z?1oEuhd=lNs7Ilwz#EdxiO)H6QsHg4`{%;L%kS>w_ZFaaU8nN+p3?Z+)YkM7FiEt%O27O?(;>_dqx~gW zM#Jj(aPWvF1ic8SB*Hp}5`26TA3QMjE#Yh^SZAUwh63WOrsK zS?7i1M)hszWz+rnZ=RziXy9Y;v3+jj(Bb_*NiNCr-8G|Y{Y9heb5O zqUzGrN+S*+yGj#sSf9`rZtzD#9R!%~F>XOeYSGG<@laBO@4ryk?z|#3VP+WN18^LF zV|hyaCrt1J9M^pE+ZdrW#xfd3-K_^8raA-mCFF)q85K~7YO&=kXU)FpZ zM+9(hRuvQ+s?Fk|K4`x;*A=BPbywGTN#Yq^@DG$L8x#=~@RK2z08-Qi6@eQ2nNXEB8Shn^NG?C@T^jYj9W2Z$=|c9d^s ztwQV6YRb66#@0baJ3A>*VMY6RIq-Ff40_{d>q6LqAFvl*{Z{uD*&X|DdZB?D_;9+~|`+3aL`)jWd@x zveoT$?xrhA2`veRwp1zQ8CC%^wH%(3qC#qLQDV-NT0v+I9gjSem2Y-K?h~f&@|}`? z_?}0t?%Zj4dC0`Zyayj3z0yU?uYb+5xBuo04T7e>@QFT%b~~3gLVbKMP*8Z2-e2!o`vw)XnM@HlsTai$CYKsclZnM4?9i zZD+jXlZkR`m-#-TN2Wp1h|cP;q<3aE%#GsQ7E_Wkri>d< zPfDE{V-7USG}8PinadApZh-pM?Q^w z;r0gH3r_*WGE>Bw&Q{8HbI{; zqA|f^e99>nwkGxy&}K>OrG&ef=LIHR^6t0qN+@s*sMb1du$!~2J8r3xg{0S@&z6^3 zN7|aa%gTI37=X|bD!H1bCIgaC?el8Clj&F&v;MV19|@*dq0rPYKt^6(UM6E^V0r`u z`WvDPx@K?h~?_H#t=0Bg7fwXSJch2krA zR3F?@9s&Nx3PS4Sitx44U!Xd)~ zBw2(giB-(PWzcF@_H<-mNL{JxXWET)g8#UTA5g*+M37h-<+t+d#&HjGavoXCdRFJb z*4mv~y?Q;wW*>{uMK3hs%SS)*cEVUM2o{;=*{LYuvDz=rdK*#p0UIN0fd~>T(mQmk zo7IF9hEZMQFvKS!`cm#Z#vJM9xoby$w(Jts8?EHXzy23W1TwCCyjDA6>vJHo5tQFR z9j&Wol{m<{Rg8t>CZ|WnCp&*iU!1iX6J#b+C~OdQ@%u+0su&Ay_29* z&2rHI;q9(-^1;mtcwMW?2-!X=o>!S3*(d#&&jeD)zmK4`TKIelG+#dNJfQ~vXv+XK zKQwtf=^`IfRB!fPgDHt@YlbeAu4H{>Xl<3 z`Qq&Mo!F45S0~1|EOx1wnnrcNkPHvQJahQ#_|IBbZtps8H}4q|YJxqtg*^oF+U-YK zVH%UxDESa#h-|>0rsCElXyJCzWDBmZ`JXL57Bu>gZ`35c72usU79hZKNUN`sKwg>< zD;k6G!ihpE0zF@5lw28Lv_6wGdAW%j_j%#bF(dzh}7dB4%Plz0+K5W zdwXl)9Vb)D!1E4JQZwarYFPc&7n+*Dew5zK(Xd%iTs*T$*=|3N;qs#%2|-v`*qr09 zo9esBdwVmnsqk@$6GD^iQkR)WHl&cp4dAqlz3$e-A)0j2Qo~m~<=Mei4G|L#=X2~(~X^c{@li58~uL%oLAQ1&-JgG@d>R{&3k#&^U9}I?duNE2DBWP$Z zxE*3>UOBX1q4j0l|Bl$IZu|R&`)Bw5LQ=ch<87NIL3XRpi~960f0K)CdOAjlyvXFd zvjrQFLkI&H|P$cSkb7i$GoSAb!c5pM6 zJbVp&3Lp`0m118P(eQ8434k*?lphY@!*B%CXcFysw0Z8y;kC%m_y66Kq=ev;Cs*g; zA!N3#mdb8Z?``g8?y2&L>TGWQ9+W||TJEj6Df4*vP`2Q%>Zz(_(^ z*yFg8=l_9hR#yGq{vIc;Z7AItW$<+4sk4n`-TdV?Fem4@09QL_F>%RO07KGuYCi?& zbhz2l``yAp;(G4-!_Cg4dRQVoi-0ef#^$u6vVIn z4id1^!+(KK*}=kK9Cc2nmyryxPc16XIo0IZ*~m#)*(NHX1!JYfY$>kS93bAupGx50 z%{jpNEYHFQh@|^{DJMhHkX%t1GU;w#4ZPWM-6if!yen5Bw<=x&B`Xn(SyV4yYz-+h zW%KlzFTGg&hey6;tOy#p0~|!KaTdRMksZP#20Gv5ra=i-*QA0auTQ{xQ30OJl3LCO=jnoW>d6gxY+g)TVGIkK@EH{j#XhHvzRP8s#$yEKzV>w@mwkv$HJ zG5u?$E|y@q6eq`hz&$6Rx+YssYq-$n!VKU5$1e~|0lH_Y!`<(7EInrg_xU)4 zQVN8#T$nv>w?;@8*Z_l=o*k7@m8hSbL}_uAFHn`ilJ}fI#aj% zH*fzSKvT0jUC=APbGIl!I9*VE{H@p<$B$%}{BO0%8*f(JzzBDzY0 zXp65nU1zxqR=ElS*OVrAttU7KBjpHs;4FNKwpYZUJf%IfcmOE~#w8WY`0b}tO{@LZ zd1vI0M=crS_=;~>-hx0DRwtYtzXDroQ|e;FO|=DCt8XA?K)k*T=ckb9SMoT}<5l7ptVlW^)Qs{9Ni<0lCZd`r{v@J!b+ve>Gutn}0vpZzXxWF`c;9Sgx?9WJuZL%c+wRsD2PBR- z*XLyL?CcEqvjZq@7EOp-eL1zmB3T%4YBDk~0GP(}r|aDBxTqI1U$`Im^3g>zGBQLA zo_%aOG4VZfaRO&J-A)P}EVoBufLjpY>RAq|i-1FS26 zXpmj|6q%1pAOO$Q8kWM+HE`n>@VZP3I7|y~n&L{_WU{oo%jGnDXwU=tita)lO8Tq_ zjbe+V=TklPw(kA0RfZuN>de5$>R=;b#|E(dyaC23Ce>LZSZ&agb zwMFx*0QqDAq^P--Gn+P--dyqSYN7Mkbux|1j7(l2)@XPpt+HWK?RSAM3$n&@^Zv!n zjuThsX)Bb8orId`0b9g%Rbf$3rNL3s5jEvE#OY4mS;OCS(^F6J1u0fuE*Zs#jAF(_ zoFPlaX$aGLqAv#UBC^hqv{rM5Jd%<4XYe=($YD{(t|5^@hBuu*TxAJOmci*tRc37n zHyz@;*4adEURq>;p#S z$-^4#7I4y@&KcdWK3u7pl_vteBhK~T9m{?()|{AFIPUwma?<)}Qh}+Dqw~zp|L}9} zFW;+^ZD1Q${jS~1$H!-PV|dQd@Z*?>)j-BX@VxzO^-YzZF-U_oL2B=#k}tOeur;fn zHu~L_zyW4){cn!b9v5R8rC;3*uh$TMzz(u?A6I;Rz%@yPeEq5_283heEyZ>fmy8ecIN;aDe5DiS z-}H=GI!n}QaijjUXugT%y)omoYd;Oav`p{mnpg z5UwbN;pW^8UwI~>e>uHxH4o0~w&h3F>|i;_{<|{tPff@DAFI|HT`m5J8nQw(w;K zFyz_!vvX2{FF|I5wp+buL5}BMi(pZ!XE5tJdL%!g6>nqF3nR)Dh!h+Lz93Ne)YJm{ zM853N>)#j|kc`O_^8D=2ziDZ^F|K>Bem)KfdZzhFyJ{9`1q3%#tl0QOH1^EEZ-T?!4i*>ugX-Tw&RepFIa^l~7w(+-P5 zEof-Qxkkah1)cABJm+_*pA|Ku3d;9zJXH)-L1&cHTZu&f*RI~Qe{*v)drH4~Jpccb z!S;D(=Mi={Gc(iwBFz6{6CiZ1Z~bqpvt3fFSKwsWm!i^WY})>4cJJp`7;8K4>#GJk z_k&+63-j{dopk`ulBlpS;sd|)*89Z!$<8lL>wtsqw#Vz?6PhpN-Up))1FiScY?z-1#4vo>q4Pe_lLtD= zlm(w?Ml~RK-v|`QGaf_vnzBpj0|H>dpr7w?l7ct%OFG^q{|a#Ja>SAP^M?ZZVo{+; zt%wE(ez-I9#r@#sZG%HupgMwF%boS7=S<6sKYzXL z37NP52<&+0jQnrMvU7p=Po?uyXt)dQIRd2$#^a~VDPS>@=1&_1TrmUH2ot;j8MHCp9M+aFpiADDDja+MKnHnpH?wi zX~Gm3`~wMi{ zd{C_9-Fq>{*#0$zSSEV2vvZ#69nNu=OezWYQ=`%~?MU)SHMPP{wMy{EV5 zSFZH^iBV@-IN6`$s$}Sd3re>0o_PP)Gogm3#BNgUK@-%)$^B3!Bg=*-0chl1iszeZXt!QuXqN~Q3=;?~#%Glt2*VBEYbS)6sc33~f8}2n7vX?v z&MkDkm|z-;0-xe(@S?$Ru_z?2hm&{kZur~oORfRz|xouHJ4z80YQc7 z>JzYf@g&g-o{NpD1}=DJ*1~Y>?`5XV%y{)$X~$d?0X-H#q_!HcD)?sg(iFt9WkxTn z{+fTph1oSpKeGuCIwE?4p+^N!1c<7?j`@8Gm4!|H;@Z1eY~E!iiVPtTt-VlYq5)V` zxe{O&V;{o$zs_Rexe}h7!Kg97R&BiJYme`Dba(xUg`Z{k@UqNpEDQk&Cc5G>@QzJ* zp+qou;Mt`j{y7Z7&iRl4q%^=}-|sE_%gMeGYmSa0rzm}766i24k4%#xK|1eIeI?#u z;ki0E)r%nn!9-u1qj7&HTe&{locnUBhqs>*D~(5dx=i$=B(va*Fb&uJwp1_JRe>6% z*pXPZ4(*0-$HiQ^>A_$%5R}6W&hD{?pS>*pgmd|WB3`A}qq?t;rHIEK-56I6As%73 zY4S&Vm5}P5emHB0HF|i+l{u-422M6~X{ufL)*JEB?#slH#uY0u& zvb;V8#`sc}UmNxVa#f6`E0Y!Tzf_h6_RdSd;2?6}emgWLbP( z-?f#6jZ%W0g=G-OgC(|tDuW#T&q1*Wa^^HL%^3sDh{%63awNcH|I7xRBvE|dbwc%a zWq5%Y?PRr|hMfw=D?q7nkoH7C=y0{X!$zdAx=cPIbmSS04)Fo$kI|s6BH|~C)^8aH z+Mr$+04}~(2hAfs0_6IDk|a>ipI{eAWQ#nvhS-1z+aw>-b?>SEV3 z$z$mvP$V{Gpq`Vs>c;LfQ-aA2v2NCV|g+ZWoL^H}{!TKEFY~(M(3EHKzxjD}=qOY|s!M=Gz2f zB-{Y6l>4%0So-j4o?eyu@1bNnhegA7pM5|$J?=AYC~p)Lf*le&`QC*&b>d2`T#ua_ zdG5~u<+1kmQGk3rGn~r30+>+8#!{B!06`ZPZV>$W&l8jvjJ5Wb&in^!DEfN<&W|Gq z3!Qv;rO+0XsDuk{CS~dp-u~Vt|$NmFadf~91RP- z+b?8XLuefI6GV1)QexB;^}e8Q{FnHIH*+%fw2WIG4kr)ytxVEdMSqVfJc%rr3@oUi zrQI)8q(+*TYPyzV63E3}n~yPsEWpzw(1D>!gtH=Cb0&XJCs#ipUq)K2!Z+;3dWODz&YRu&@sK>X0l zr;`Wy`BMjocIw`|Fn{d*;04B)X*!d-&&1JfLUK{pzqXfXt}`J&|J#~R7zb=GQA!cY z--l7llEfyHQ-Q|Zw4^1|hq&6w9-46?gX11Nsisrrd0OeFV>wyV*6#u;{*W|+T8rzoD}`};GguZsh(w~D7i}X#p&g?#&$GRkf-+k!L*-f} z&@;*qc`c@;4&?DHQv4mC)>?e2J=~6#tfGE?KEXYY`;h1=ia&g744U; zd`pFA<$rs9YSMg$Do+={uacKVa)4@1n_u-JHyRW=*n7zgkOg+-gi=WI*u|oKTeGn_ zLjrz?-h3&m$86)Zl1G)&P7qyNTImS=rV zL$2Gpx^%#8N;CNy`I~mTpR`GL$zsC?@8IlNL8c`5nzDq*-+QzRI?lN3`t6z~Jv^K5 zlowjpiSmIcH4YMKl^={Cg# zQHpE$xM&zvINq1NK_mX;=69pQ_|O^4lG&c3ODrzp0)|S2<2tEnava;)c#d(qa|3wDzA!zUq$ewKzCf zY1_RS+$AF-IR1|Nvp6{U>S)MXrxpBcR=kW@VWtRQ^Gi=nh@kA?`%Sm3VtWgUQiSXp z5f8lNr5;0$Y`PX341zK_b+mCCe5k~}@hLJ7qig7~AwRGv-_auyKn|j21&z899HmEc z{pyz1E~zsI0~GJIwCp=wu%);r-GZl_!L4wwIW{}tcdr=J9o)g+Tn3-8isI>mBNHOk zv2F7H40QXH* ztz1N>woQ~a_%a?!2N2}7elI_RT&YQ(&SDDe;aXCzh2C;Fs@_{qyH`{u-*^m1u{=dhz+ZU{x zH$N}9jEJ0cJ!;ii;lFo+FFcFMXucg2$!HMe|2n*bGIyu3RBRI8MwPbsliHAn+lA1Q z*uIet>LG-ZaHU#p(oPwcBHmpqK_PP7&I1)respq**MIE-6AJD=9Cnkr_LPv66swnP zf5dF%R|{6D0SLo|Ut=mWwxzQ2_ zfw~w3y7ciaAi~slWWmaDHneQ9+v_f+sUH>$wCRw!8~v6Tes z(CJqXE`xExN$-cKu1!gbV?{ZgPoE{pY#9NlV$%tt|2zz#0Qs#aEc)mmd)}q+c#fFT zYfeb%+dg4#yh2941#cY31nn%TU?rtc(7FXg#6{1%h)GC$zNIzWbSuzp~>w1H&sd#Iu!;AjM7+l6*e z{W6`p-9NyT)p74e*MCKqGk$>Xu`v@f05LF2cRxCEsl=7t*X2X0(f)HU;1lNHQI~7r zxu>5$$^S^lW4J#>m<3KT2^lc>?dB?)fUTzwYXa8GaK(442e|x<1G6+ zg70#2$D~t^ae@Oa65ZC-W3IGzZzAKs06qM$Zf@bIVz)qJ^gX^{Hlft0@l6Ge;n0XvZQm=X~Y!P{3`SGQK( z_a@-=*Og+r$6ATAKi-=QtOLqT2UUe9fVll=#oX@S4Kee}e3#wlvE*uF3}dkNAf;OE ze^h8N>~1)t#*OK%$80@;ci*6J=wKzp5!PyYuZ6 z9s~eN|HR!ZBtRY97K2z#VdOxg%Y|d($yus%ZBy2~;@I`exx<5ca&2{}pCh+UFWVOd zg4eO9tlV|qW`qL;XVP3q`#XAwO401K6Ot9am{3bGku$2hU-he zFwC0~v(kvRw@N#e9CC?&YA0x(#ujSI@-u?&al&DJUM*}1sS)VyHP4}s+htAS3=!Vt z@Jjg6AJbPIDGwso{3&fyvO@})iEAk0fyVaSS7T}Or5D}!e!SctPKJEakQSDpw=v?WohOj7 z`+-w)LpwE-OXF>+5{OS8q!`2x_KSxWfBc@2JR?YZcG2e+Uwv}>2~EY)_@a(c$Wbc| zg!&c-$rA%!;hMg??1K$s&%`wnaRd;N{>AvlGmiRwTgYsz15?in#(V=`~~~AS6`4wfQluB zy^l}KE?%a5ewPwMG*Im~Fm|s^)BWfRrT+^y-^~^eTk11Kkj=U; zHl~gDLS82UL~!-_6~;7dJ8@5J@U8G=WL$6o19wI4J^0nm~f^rzw$K@ycLw z<3d~+0uIKTu_<^$s$nGJdm2(sj(Uy?orM9+8vnswB;~GOBtD2K8yPhk!A<>~K*Q|* zD}XJRN74_3!H1v70?#Xw8IDS1rw5mAhOSf2?XFzlK* zGvMajLJ%SPkCOP(!x6BC0*-iNLqov36Un)>lD$Q#U^&jKJ8mIZ@3nSPAmw?or9b6K z71I;3vUPA!rAwX9r6_f^BsGV9Zw}0quTSTEu9h|Lo1w`)YKLT^@Lm_sadNpoq6$0_ zm3Ilavwmd#=J0uT?mecmx}TNW&SpqFpQB`H7WUO&YApv#mqw%oXo1>Sw&~0URS8o5 zw&a3B&V&{Nv}*~y{OPU_87gv9{oi~L9XUiDGabp-#J5lActLGb@|Nyqfr4ARFd?qE z>65Fx(#|M(b4VwxsI`@;pq(h+!`6G1jBP>FW}?$kpQ)r{z)5nWgxYZ}1B-sZqA_5P zIA9^LwziHs0Z<36cQ z^m(rF_Gao|C(x0p?PATocXM&2#+P2tobnGnrp5uZ`V4z}pn?=Q>|C)-u*~UAB2edy zpCBeCQbzW)+KXJD(&js zZSyWzshb@a$*$kgo2Oe|cLaM;Hn(YHocj;`LfDi+f6?*&ree>6&p>yw)g4u!HKJpc>REOTU2;A6k z(9C}LxA@tZnCy{S4mSmU2P`!&EXwI0X^)#$c|spA-$q^yj_7gU%7|X7g+BEIvTo%# zCT3=W--G|j3j4-+c4_)c1_u$|-?t3}ZBx9XSqTY4(HVZRr<*X6%C`*v;;hh0$U9c+ zhCD(2Zz@svrVB9;66plXh)#U8{ohCx$$&Esp(o!Q3*C_Y{VYu7-QL)?_IQz(E>Q)< zMt!@aEl}=w))S(MP%YgnXi1AxpNPh#k{(;hFT(Y+{D}aH37qH~g;%jidxH%l&C9Mp zz1=ruPF6?b8wYYS5`|;u@ zsd$MBD6nE*v%Q*}MMK4Nd`-wWdB)_qN?r8}d4Q@t{UrQh9G+X|-W)M46oJ$%C4eTK z4+UK1?E0Rj78Yv4G=j&dJ4&TEkYvrq#rWtFkonqaH-f<&+<93MeMeMD(vzT-u%F6& zc_FMvUp_-q9M2?GfSs_FRREeL@-w^$_02T$4V0SIoHu*Nv{X3~>Rm-yEI* zuMYgh1J0T$KnH@FjSviSNrP64(9gu}K))kAU|p?}9!(oT6U#@}r!I93NZF6(8h7XF zT~2|X&yYV+O$%tGfX0yMCl-s1i1;^i_^`d2U)#2 z4jrtL_3>k=Dk{eK1U6H~)xq(a$KQDYyPb5EL;rGK6^mqhdjJUe*2!rX*dh;y7QF?M z88(XZ>F7p*F+~Tg&SMD&gn)ZKotpmB@9kH!3V5C~{mvng_m4uKIL!$T!lwZ4q!sXQ zK<>45m)AE-<;}7JK>7?I*SiQrGw{wl^qY4_h`Nm#b>8wlV;(L#7A-A z33j!5{}kz&cb_O%@Tyx}e3{tIlzaTz+Kp)pL^g5}D94^XZl=#q$GwGRp!9JFgu@wL zwNqTjl&Hn_NH?ZF2_!djW$u)^lGL4rs!F90lg<^shf5}g>KADJN!5Jz&E zS?~!2=}pZ9Ask2&mJ9&~>EZ@fQ;G+8kdB%U<*f)7WH1;8C48zd4^m)a;pLIwI3p`KZ6`Z8^oul)<%iWr|A<*TH1^Sf z9y5^u1<1;aE>uKut{T+$k;QB5MT4V)$^$)hWrPCxUxV&6vQRm+@7c!jzkm9XOl+Z$ zafKNlN^V=TbO(Br&&)I1lmttX^twSftV|@j>;`)?Uqn%7Qyo*dvG{Hs>yh4&CVuBV zwQ=Gk^xxs*2l~0$J>l8X0AHi#oCtso2)Co@7!LqETM13wX&q> z?Ng@a!=2{}Fm+BhZLIhHh>yvHzodzz*8w{zz~N@F_QB2#?#y`tQsYyFdva`*^UNp2 zIqJ>Ffb)&wZV0S5SLtNadT6fxatEj=0aftu{`(Zm7nhZ|3=?B%-8r{EwZ(I*m}2$Z zD7{<}PrQm93l=zQwp9wZFoUv+-Z8hZH!k0MHrFD;;dW6Y1ZGDU6YIlYjw@5t~iKqNYA$^~e<^zG@&JHrpI z^|!W_ZYf~0=1&Pz*~6(m9gJiII9Tv+qsP7{=Qx#MekcsaDobax6sXv*>GS=m9RcHc zrrYFS(m==GZiX;^wQMquhjhY-(c(t2z*)?K}6FiD+n}$U})gn-q^LJq9*m=_v^Vmz(8tlzBIT!Q*P4ITQe3&GO8a!$GWZ3*~lH+x75Xx75x4Y~yZ5+I{t|)V@wL zU?RS9Xw4jOpaz0DMfVQB6G&EnJRh*fTAv#RxGGbw zKESYXj&f)mJ6}cAB*j;d63mZaj2>Du@$GO4VnxwU#;uUP$AQm^XU-*S*S>&^WJSJm zq+_Y8H?fEj3(h+GfQAHtVL=IftY~tm+mKi3{e)KmhLC1`yi=&mu z+E(?Ao&>TpU0mO|ijKZ7`|?91cXpTjUSg0i_Ra3m(d%2L=qyJY<+zylR8!wcpnSA< zt+(RKA9Swwroj6Mx|K9=UlS^>;S&tcmE#~m-V2ONDS2^&M{ft#*FS#RI{gsB?%Yr$K9f2mE%f^oTGy3o_41ejCh-tc<|nT zir&l*1eu!+NKe&)N}0J>@D)Jp5&E%ZtKWCj%dPc195yL{n2%4Jp`?T}e^r^UTu49H zepJogC*Q1cHp;!(L|9f8nDSt5iVrIBV6~m9gI!5#rc<6~h za3G>H@&l;U1vUAw=pv&0I8`x@9ayGM*}r#p2LM4A*f&^|RPr_^+eoS z*25O;MH`!v09w|Hvlp;Dg`l*w6EB|6ykHJ1){~Xu<95{@X;{eljBp_k|`Z=DEE}arGUk7V{2U`V# zEZd}!B6E82T3%2AW5Y-~9SdIk1uOC!66;W=`x z>YK;aI|i{O1S}oyQw`0Zjc#ewGbJMsoFPZ>vU$~vwXP|C>$n5sSiyUmkyQ`GKun)l zz3r0=JD8d%;j)1l$z>lqtM>Ht`&4J6QrC++J7ox~r}W*U)do*ajGMp)1_pH14_OQ|(uo&K4N~do z)*7F9=pJ?!m8DdPOG+B@T0L>v3Amh@zrfz^HC_}JG7x}LAcO`#c>__nx-ka0{dTz$ zL`IrSc|>)1h_~f^Z{wP=5o?SRny`)6c=14l08{o{fqvCAcXL#Ltrp7&mB9}iK)oc~ z7VZst7nSPiR>Sl`$6@*}^uA@y{YP#_*81US9;jCI2SgG(Nl@5u@k1k{L?kkXBpg%Y z{>hbJYf@R7m!1d_$nYt<`Sa!*>z;;=+A2w?K3Bw*c6Zn6Dxm8GAS*6wgFwi)qeaOJ-T&0w{9Pg8$JBynE8sOFHY+AklDd$w+m+6%7Eo?sXI03d>?v6X@84vDF0q@w(pN8}5Ouvld@N-{4209AJozAun?1Ll#G%|&H zZS50Clv)}l%&{8}E#3N~BTte@4X*Ih4XYev8mNiH$0wRks#R8Q#S8m!FZ3;-a@6$6 zQ`)k#7pihV{!V`WLQkk}dJ&8WDR8Sq6nUddSiC)80{zBoY=ovHM5P>B1T{forXm;w z`lk{EgNV2ODB4E#FxXW2`uiPdYF_U>EfF`f`(1ip2i`q>9qSnh4K7s+WOcQ?mrXSc z`!FJLw{25lm`cIwV5?qx{jQ7l1nLSqFllO4!5R3X1Rvrm_0bIo! zg@DUyE+e{xm7~5L9!7Ln_W#*EjjFVOgOYgf&TU#)^?ZT^5!&%lafHbuWqN$%NBW+a z8g%U1Z%g`LC9&mtg`fw;hK5a3qq!5_nxL$;+wwe+8{DKoH~^ij(qTq<-}u`*A*~vy zBlAcmO+sFAS=k6u8(`&>hqvpeHLm=298dEDzpw_oe0>oi9ICzc$ow8s2u2oXyt}Xv z2s+l;rX=dN&R@3AkEfP@fWzyV$d7%JAZMoMLk#D6i*JKZn*9}r7mG)tF=DLqWaVAm z+~lv!D_4pJi1PODn;SZ}Sc?5-FLclN(!|#t#sGYifC`;nBy~+lK1Bs} z7e(6$#aC(e8hFZ{&EB*Mo7qgOqRsFNJfy_4XERN=#@hU8l}Oj;zB1yp&)}l0afOtW zp9kiwV)KK8(J7Xn3tm{rkcKD;rKRS{e5vA%=l#yFG=A*-ag0zskm2=Lu7@ZB5Y-ez z4$}B*!-gYpI!$^-yUKx)9X|7~fk_}K>ymdqD;)KrOy|)+R0#)u;OQJFh(oP4;pOH% zGvrK2@I#%VoqZ?$$dnFX6#oe#Dk>V+!Jn51Oyqz3NIFq$2Rusq7KhbCl9y*ofW`cC zy34h{l-j7re8AA<+0kaXyoH_JCXgZxtbuM!fA>|DWO6+=x$g)>gUX*52W;yCtT#a> z3bqd2d_eh^8gYKLzJBZ~js?DzK#gi4NdLLpQa|5T^1)|aZNK;Lf!<0Nu9Q9^ga2*Y zaHt&TaXc>vNw1^-fc#;XWA~y-^rtB{v=K+xC|YJZ(Ap+K`^a!Y`%(_HSWM&VR~OC# zb)V5C>}chymxtVe_tL0nm<(Qe-=0L(>eJD;fdDM7Nh>RU6_QqwiLIjF>TuYi1QU*6 zhYuzLA+Pc|0dUmY)SHHTE*6BPc@J(38P^h-oM!TzQWTDB0rl#&Kj7$Gzq$f)b5C!s zFGv5?a9_0C5(iXNBb3Rt$KOgk2mpe#i^pFehC@w!3pKg9LKPFO6MZgyq6O3(;;d7b zdVvE)XS5!%Lo9VB(=ty-;igT`Zs+ibR)&yO&BF!(0{u`Bcoq5vpIx8`Ld9WeoO9VK z;<~sI+LQjZAX)+%Zd5tltkE6T;x1IpUF>JHut7gIW_tfY$>U!Kh!_A~G_?1t%42mV95;^rzN5uNWa#i3EHWrw*;M%ME%5M7OmKZ}mv%Qgo zlqytdFe{O$1xb_(e;2IDX#+JMXO({YwHr{lbH?`qOEAEq3dDgWtZ5rfxRD1p{vYl5 zr=IQu5U|^M)H0U3Jb!z6E0C;e{Gh4UHtsmwV;*aeV2N5D_a%v?q@cJ2E*)Gg!&LKA z&*QztC179#xMGaUfuIL$`-CE(w_jfX%sxYzQkm-3pbyCaOWI*GjvTE3M`wB4uw@H4 z8}^xhme%2g4v|Q|0b(a(?kyV!{!x!|(>HPTVJ(&b;5)gw*yrur*$H)%) z8DVmgrz&j|eJfREb`D2p4a1fn#TlW(%l2`3wnh^mrTf2afF>XHhYbW3OQn|IPe|y5 zLG18=SBTJ;nYsITfp4?5ow_HV&p9p{T6EZ$wO*y^mj1d}Z9Ye8Lw#A71j^<#mi*_^Nw%qw&Hs!$a{c znXVpf!FvU7=%xJ*jolCZdKJsa`UV<%Z$e2l?!Zf9jFBwHofND=3xo5QEl~m2b(aC# zx577=dHi)eRK>ZOekN0&w2{hx>wKr$hdx$cNAR=&6rQq~7RCXr_zKZymQhq<0Ls12TGDA)0#9#;MD-P5PNnKJq-Uzp9*7?H7CRG&a)kBlbaW;)q(ezE90Rf-r z9~QyThO(Sfc};G7;+|izbqSyzv78gmN;OkbH7$MiHKy>F-Ux*j!$IunR=ab(A?5J# zL0!V)&4C=UYiZv`IAsWsa(+P{_^W$a=M1kO98iIPh>d}MV1(DDKcIbnG^+kYR8;)7 z+whUf+KAM7ywtC10@uaz3C@IC#GLq)N{WWTkmcLrW4C`RCCj>YO(s4Wc3 zBMHI!Sf%pus%hhvn>V$b5}QKOr^Xe0uYi7g2}&EL6r}4ui$j5ajmUxvwWO`|bxL2X z5QhAQXxcP6f1f4~lcrXXbNIu8CnQiiBW0P69oW}tUs=on;==>cwH|eG|9nMLfxak_ z6STKp+}#hr+c=k^A`XGi<_fq!0xm{}{I@6k`Gx?#tvU41>`eO0{Bo1~zK5yvKrr`; zg`oHDN8;{s%CLq1dQ=FIP(>&nXaQ~zeY^njcC+HnmH!Z2>60+Ik$6U)c)=M@t! zQAceTilSi^Vygn*6L*Z?rg;*T{?GTd$pgpx+HkNwtJ}mq5J3+}$JNR!=VR>yZorD# zGrj3g5P)SU!B2mxkY!*FL5KaDwh`^JP=>?R$o@^+)<7M-K+GL!|s5qZs3cb);n4;{;yzyrX8|=kFjqOIB zEtNT2Ai@g6Bb4a5w*kdNuZ^mhtH!Z+q0Ch^2HGXO(fvw};O{03wHc#09g%<0R|%E4XzR_jgz4&o1*?=pJV{UMmJTRYs<^ z_ihf|f?#+D1I$+h^U`MPM_jjfs?RUZfC{8DODg$xD*yBCK+6YLyDN{|$8C@Nl@}}y zqFPo`;Ucal|8^aG4|PSWZ*rur>pU+nJ)GuzFPLu>HO3AGSdY6V;|F_?;!+PxF9r?#csmE;|wrZX}xcC$skgdu$IU`)8>@$i)zgnsxQQ=hgDQE^a!nOcr`3Bc%m&)x7ko)yv66I|faEFzPyV_CjK%anHC| zELa5@a5Oo2D};Bdl|j;h0z4W&OLxmbimZWy2qKm)Pk(nHoTCdix+DJ~sh*p(B9B+a znvW`W;?+p@w=oW5Eh)k{RiQnzFM-lA-zAK|J=-apz>`}gyZr3+|71y>okt4` z6})}iyl{O~KkXsVs6JJWo5eDoGB*X-1vph9;2pE+rT<*tMgkK1)7Q-@mgjS&2E`3k zI8LwkUhW8{6M$iY+ZnVFOpdG@dQ9i0ee8`js5_CoIa}%whtCMB8BM%3CyGt3KP)8J z4yk!})NsRQ0U0N?O-=p1Va;ALtKP7x@)iOGlhlv&^ zI<&J*tb~6g-fwmcI_-ktI3Gq}N@Yj&ef+@g_F)_0so7bhQk}k)I1m6*Jv})QeNxN(+^?!0`_*!)cX8N4P|VlutaGSY zZ+twv#Q$nE^ZC`rCgo0x37_uh;oV(7EKiH?)i}U$a1|FJO6Bxq&cylxA`gFme|mF6 z9pEObZ)&>QC@u#yadKdm><7h&3kU-xo+e?obmUJwws;u<90NR(P!{%W`$HV`RXPhe zEGUnUn8`qj6MdgC%7Tv`HF`@^@D`(gqPNh3~Q_o z0Xhu*1Ufo8HSNNwaEz?O_GxDyKk{bv4t>0y{c)BdJqeMLSN zP-6KbJom7S=f6ub$0hGPTRKg!=dslay8~BakA{=yMW~9kAvyl0Wh9{O9^&GOOJw%915;N=@#C=*!vAWy9*GlsjW6XKv zV!k>gb!%8G&1yLQb?#u3X?AD&%|u)@Z%;62LM$EJjtdVAb;FR8HGk?f z@GC+Kd_)v9ihvdpD)^nrX_X_%S%od{#LAgQ=&)HF>y@pN@@FGK5acS$!twH-X6COw zHD?iXI)r3Q;H-(whwL5w{p8sN`sIQf0q1wdm(JF&C~wz8;m+^hS90slJaK}p%wUtHX8G8}KVO^LDmqy~gT4wt|5+NNL@j|SX)`4CksQ!)aU## zmZXBDdEZ#BnlG6MZ@k$ADB`8exb#fALu+xNJaJm|UU=_0>)%c-ueuAM>Smid6A zv%a;V7C;&45Bzd+v>6{?4U~Kas+u+e>(4I^7IA|o@18cf+1(x;{G@-DZuFAwu(~=P zaD7SoocLPrc3D&y2d4DpHmVce`;;6=m}@}t+LjNTLe*%@-jFBuGbQ&<-ZdZLcD4DMyZ?3B=m}P4 zYx!ltj{ql78c9`-usl;e-Ewoz^ z@aXT&mFpDu_4Qe5!}~5z=a`R(0T4&P?d~mh#d(|&uw=NW=6UV^wM?J^+WVs|XAh6V zf1`BETR4l&S&v;1NGKQ*o?Wo%?c`L>yII0*e80I?=`n@zY=hh8->a*$vq_ki=zxXb z`@wNZc=kB2ljU+C0w1Ce!C=UFxw*kq*$8%M67<8T7$|61K*{b+SWs!W-ZXvI_e3Ly z*SYd-c+zk-XtwxsV;bU3vurn4pb`q4RxV2vfgb&Zj;plD(S5t`y4mTDLH(POwU2Cr zX}1#V$3~!^zVJTxc5)!gMl{sng>d8H3BT0n{_664d$yds6j`bW4&xZkMSvpMe^Q5diU=O=r$7Z3ke$Q2anI z>1!^KJowm8TXD#S+u05Pt;sF*)(-Xqr)8H-?&v!SCPe5&x$$|?&N0xJhB_ir*SsXB zCwYr`G#!;9ant@SEtQq~SLXn2iw*tW7J~vaKI?=K%$ zrLjum>w*VpL`I)RAelO0F9;t&1@H%y<7h#&G16JS?*-5Ia_mnPo~O6(L${V8cle|K z7R|FiV|kFh+-ph%vXJIRI&Y6v=C0W9b*4A*yV(UT(R@03>yBJEOq0n{ z8QQce+T6Z;M9keZBI_pb1?^oC)JAK#4ZQGRB{N=3S=6>zS#8E|{HotHc}}h*IB@dm z17$NXZw%K<@l)F%k*E(O>|HhxU``(Qg%HZo`wDr~{3)7U5cKV3_6%H((o>*7Y3!RQwczgL@UBtB7J2^ZL@c+F@<2EbM`cBxn zi#PF*@rh%CrQcH5;E?}GH8vf4?#nNe&|H;Zl{gCD)m1Cq$0Oyz&~T;H>PMHZ+ZfH; ziEENMF;u!)DQuf=D{!+xOlU|p@#WSg?bPcJ>Kw&j4tT>>XC!Dyik(m;eA9cEz}7ff zCJ=Ugp^5tYcC;|TgdfK8vkCCz zz{A9ws*#hzYAWV7|2kxUa#OQTZOW&!r!OjKCd1=J3y?l6x7()vwatw$ zZ7SW@)5G_bM5IBBvExOYqVNmhuR4f!CgP7D%4x+7vj{fGq>t1#?DsIy=5`fj&!N1D zH2U!k$e6O#_mHnCoejjz|}i{*7XGNa&9!t zO-+eON&-@k$nI3@L@m~RZGG{}v;Fo(3%N_R*Ix(gdo3*L09eVAvCd?yP#3SY7W2=! zD8`~9P5Q#xN>n&LAO^t@5)Gd`iB%wHuzAc>!2iSizK6#TY3q+1ETwEV1`9;w%8_v8 zxC$0%C+s*o9E{Fm4U#>(;K!vi{G*jJ(oeD+AQ0|iH`Fb?G_)IS$>7Y2@BYW1mK>#w zdh7@n{(T_HxSO^JE5!g7sJ2i}20O8E5%Fg%Aia-+^hmN zBZn_r`yC=@4VZp0s>C6|sgoBhT`;4BPHiuDUwqJ(y&ga7!8^f|x$ds+EDNF>HD$Lg zYby$iZBnhoC+s|sCl7OQu& z#-I?@Ypvk&&!5ru_ZfuwyR0xp;o0lQm(^2S0KgY}DmgiYeedZ^Dy;@aC_wk-Ja9)f zoWULZP(?izp&${1DgzRf${XrfS}YrqMX^f&;`$&7Hn8&E%gM>Z<(_fN4`~8@owE>H zMZAi6(I1Ubnlp;PV4e=VkesgpA{r4;C_M+9N zdeOhs*}=f5qAVZtV7p+d;dWxamPB<{EQvn*4w5R;L0zl*-mx2oOjD`wItEVzmyt3d z@DK2}O$=h$3=y>EWSWG^^*ljn!pYYdw1(aGC+$uK z{%VC?9HXsX;{EB9u&+(>L)|yzdK0*5 zZE%|yLmy07dH3&iJ%NF<&|OjzM8~1jIWx}C8cG#L2)1Y}B)Ice-T&a8U*M_nzJZ%=BokWDJN4eRVuwhbF;|SBO5K4DrRBF1Mso9Z8P2zqN)0q9c(SRBN z5LNDzX@z@`l{wq?8z>2hHYx}_>=pKY>C?co-Hp=+;%zf(%!{` z?e4%r7T-Nhj--q>K7G%D zTgYnX@ahOWd5JQAL(<7!$iW4s@*|T;;)?~H=b;AaykbcRKIZb{QLoiBL6ENnC^gK; zq+$Ay`N1aQh2rw&i}iRX-|OQEc}*rJrZl58Yuie|pCOsq4SW3f@$S5jhwy_INeTSG zYmc2P072plsCh%%7d!16DzWG1Ym}P}0EF*sVE#(Y*-AWpdw2IyowJKeJUtM11+2&b zCF%}twWurv2+F)#=}QDKjm77GmzV9Wt$pn5RNgE!lwnV|pYHHxJ@YJda4t+ED|_#1 zW~~_6FfdLpn;jz~@&crUy*(f#jg$iN zo*UzMKdwNyE`l}!EL3jPYK-+BZw`nugrKR=h4Z@rH?i#-TB-Cdkg5v@rue$RBQsD1 zGbhBSrH!t%onVK{^c+fbfqmtpbPKaN225T%5% zhzYmCw0v$>Wx-e*K7GMHXL*ohM|rdN7fbyNtKy=Lok5Ol$WqE?GJCRkxqR%D8NFWx z4(C>{C!sUY@wVA@P>nMckofc@$cpwcqEr-!|5vDQvK9-VJ7GrJMZEn<1u=tj100lmJLBF(0U&{K; zn_LN20kwtg0X6e}S3r>LYJXSKGPP8ZhZWA*b<*vZc17^euJG{(f$PnH#HXmcoprbV zUVCSQ1J@B|ywF}M2_MoYAz)hnl_y0tbythbAl5XgrNeHlPfOhR>7f5XXvCBt)=Q{@ z*gO_5NcgkA;MwLai`d!S1*(2jf$MBqW;ypaDMd1QLY-*a#!&n1n!2W&^(eCQKI0Eo0msfB2sL%f8XRZJM z&+~SvvnAlO8h?ucvLl&N63Z!Fr@i(T+D=Y(%qn4OqGK6=*UF?n@0+8qcEHJ$wTI)Z z@5$B_z!vEEcO)y++gH^e_Zl7w;fyE2(6GBVT^C>AefWln+Ko}U-uC`(1x1sp8gj^N zlq(@UXJ343dF>%f?6=VH{HKFj5U9x9c3wY`nw*75^V=glX@MY3I*}i60s&*c`3F7# z@;o&)7fp6qtV^t{rHE7tBO*kez->zTHeYn6bR_}P{)r^nhV%Wo{J|hv+07PImSslM zIR1fqr;WC@Z3-Z_9R%BzW4oXvG4n`|=AN9a)ogCBxomoemFbXwxvi5v+6ik&Wu7V+Y zBTfCO&6jWfW>#I#CrO&Vj9q`WFkLEt>u#t6LkU?roYC6CTDMg*&P9~Dyq^0#zpKlGuU(wU>uC1-8se&xnO-K+Z$r#-^ zktx#v?lp$|X|Ws5HQa)0X;iG=YHpqlIf?Dng}N{R#xn-)6&d5C^jx{KL#}CKU1&B3y{fFDUc45}$_QUEouW*;n*63f2`MNi`#CJCC6O$C+9u`Zox5i+QuMsWVc7i$sA7`sJ*RQsHDe~(aUPdN$7j9? zs8IEyQErV#ss<0%;@E)|)-)BApCmibbOA^^3x!?txz ze9BO*$9G&ryVGroK%aN(!`LNI*KI$raiT(-tNmuH`4NY}1@Yfm*_)F%=mg!{i=T%! z6CK&U`vO1kC9cRmQMfZ=)>Od)aA^4xvn!@2 zvZe@jgL+8-BPv!bCk#0*mglQ`s&Kb5-9^qhoC^?0V;Y?NA$-ke!S@+2kXHM#h$ zDcEo(+l8jOc#>tLMX(=fltO9m<=;1XgzUyCq^4Rk^R=hlR4NLeC#$79KZ-qV;o+Qn z_+UrTLa|fSt6=+HFP3#tlp=AY_#U>{=jrI(d>|~b7mm#lQ50e`$O`Y0;3P%MBx&IZaILIt2j&e| zN0YRMjd4PP1;+*ULNNBr3%Z<{nwokc!f#pSCTv1$ldF_}&y)O*I^jx<-ZI^_5g@#$f{`k~p;i+928 zjg2Q~?N?`~LCN(4WG0fyd=#5!>^yzqIQ1#=7gn6Y(|8|&o6&7aEl+1N6Pd^O6!X2m z&=f&5Y4gQzK59xn0(KEhT-n@yV(`JO!{-tSZO2QoZ0A3&gW$ZS_{CDJ;KJ44jzqZ& zjb!U^)7`zp4nRc!`9{N^@0Y%!ftTkPYrn(INsmV6#GXNq6W}u*HGg{aXTGTD3mCY{ zo-XyzNq~Z>CZC-uyN84THUd7>%{`WQEn}0^N-rdoVf#J}lDkO##Nz3-xXPq#UQKIb z<>JEO2<|euK&!gKpAi+mY#>%~M_(m~pZML2fz{W%`SAU*MBYBO|z$l9&Hwj32uf1mz{A3Y&IV)1=`W_D)gbaU$sW|B5iUP|iQ zVmpl@kTY`cwYHkT0U}U7cXkHme><&bLtQgKA}%i}4ZaY~60WnI$R%e?6gOzmoPg68 z9f+)D=Y*Wt2Ur1^uT4FB=KCzqm~)K*!m5RMEqh8jvyV3p3JS4iUYMu+OH?A@eDXtV zQXPd7t8o)!W8u7k4Bcd^Q26ajyX_e%h1ZsblOmIa%bb;;K)1?>61s)9xQu$!tAxXK z5%61K9PuQsHwK)nsd9XDSgMJ>tvFM1GnT++9>=Cw@2`M84ic=Lk6RKpM$_y%P#qH)AP@Fsc`?nRLWpJkbNxMws$a($d%~uEG_M4C^jm zt0D*R>{?e-5M_1ayI;MJUwwnHdXibX)p?o{=y~d|Ou~VbUjEBisElU$VvY-sFA$;R zU_@P8Gdv?E7|tcJAYy+0pudcEqeXU_lf{wt_EQSySqu#Uxw-)%M6|Ty&%LS1ChIRc z(izG@d|ZSXA6!3w8!*FHe-?Xk9l1pCi9qOg&{=iI?l?mQkKzMvu$GBG0s$0h45 z3;N#AqS1onbfs^q-PB2bZ#<+z{Qhhm0^ztXghs+;99g^s+_r|97qY)phckau;RO8r zsc+wB;TTf;9Nzv%G>_9_BUMQWAw*(YI2gYIlta|ivUglG>}gz?vInTnu)hnZtQTu3I5M@!Bi37}|n_g-wqbZfYZ`C(XWw$d%3_ z1bu|pu8J*Cwak8)N{;DQANzXcRdvQW-gSBmxc;Ev;I{UV+Yz8gJiT;d>JNn?IA+vN zAx-&G>nd|x=IgZHj9;4T6wh>Y5MaOL(yweD9}0&?{K%8_^H}@WYFgb;SLf&9!KehX z=QBrb`<4CshER7f{uW|&dBA#pVs>7gh# zPt2&$Gjk1MF#+L$ShyH`m0URBEzAzJo=_@YTWao+v!2sp|D~#9Q*S=Ly0alEH

MC;Z+m+Qsnk{SVABK7kO1$eA5uCtudNeB|+`YCre0xlfa0a zPWhsq_3L@`7bliC>X~czsjr9X@eF8Z{U`Jaq`zt?j4%>Eg;Wh%6%huL3EBcOBzo(fmO;FEtA@Z@=9M}7@v#@%8#7bIl3 zPk5FvG|Tu#3eIOmLd<^;CL5SjE3j}_f_l`M=4bEWW;>JQ zQ&{Ha#eHKDgxzVmJ~qIDf2FxMb=bj$^EiHf{v;l-h|1RA1j%jUYfN<(;3!$- z!|p#^#&OL>2mj_M0%$NcX6bpnakgUO>jG!xf>btUG6n=*00~vW%q@O({^6*VX0u$Q22kJ9}+YhYvuVpxMj-ID3D01(yhOa&j86 zt3#{;9i?vCmJF!(M={N6tgmM0=D;MLZu?UFYGo?ZzS+;gfi$_Cq^h|Y>|N2!vfvzCP87s!ou0vwz!hiGSI#C{pIm-5KnE=2bNKY zi-Ska4=ykQWt!*6Y>@+1uNS`COIETfDPIj_Fzl(@)ONZH&B?oJ*-j4GK*Ntk#d9+Lxol=U2h{UH1p z@FFdWh@RM$`irSruV(o?zK#fn@3XTInI*aKccXMrrqhqU<^AG~+EXa0CDo#+9K4_g zMWR~8`l3NHQ*@|JNVQk!0X)BoG6XpP*<>mo5l9=@JS?JdHk1b7M{cRVS>w80@Y9a2t`<7BhPRpiC=`FS%Hfcuffg5aWBu~ zBGFXjq|QUtg7A2Ab}o8_&wEVsGg&x3jpQ)m3oa-Vlv&e|g}epv09v_0{2WA;(!GD? zn{z2=c;eZQtj_jH4xNf#1h;vJ@^^-?mJGdZnEQx&f4L@ci9YpRIKAH4z1f+)TB?tF zkb%0`_1m_VxOysawH+tUqt?B|V-9@7kit1Tzn$zliHox}Lrn%rTg`^1J)hz?APvu zE@AAirjZJK<<=TR&)6@XZ7xW=Z}R?OT6p8551z5OTu}lX4u5|Mjj@8_8(X*^f#o~m!i08qnB*U zOYSG*{feu7;hbVhA%hhqr>6QUF>2Fm?9+VTb*p9smiJkfzmj34-gVH_Q@nu-n~Lon zn!VW?#cudt&@tk!!2^xf)F~jn1zmO3{eFk{n%A;c21VY7Bey0Ao|8!9LIMEbq^zj= zZiip7H>j;M5&Sl>nWrR5tKZ~k`)51&i)tpY?)0yYtLs=&e0D1J^6{yFcF+ee5=BQ| zzPcZ={9~@7%dsL}cU$M<{M-Tq{(u>|+TDAn4=|Y6yC*^P4jiY2#PokMqMySV13@&) zhR<&9=V}!0N9{@Oys95a^9j<>^ce0C3&f$;Pd{lqNqWB{_AJ1OJ|-ng+MghPYQaZ~ zdFpsmaH5q2qgQ}*x3S?E-lG%ux!kUk>-cE@r{#Jo`?Pt_&Y!Q@?YNWfW|2)xidI)ehXm?s9|5}sCdN!-^UEWB-3$?NanOqsP92BztJ7dj ze)BPnv1j(+z(Y_JY#GFnD;@T|s}{z~`@fyd0YnX?edpiKf$my8aP#pt&HvrK>1z4= z>qZWX!M@3enUt!(AJHvwvFrb8(y5J{(9B^_Mk=649id)2k&%uBF8T%syC-A~bKmG` zpJX@QT-+gR^gcbQS{PE_%$ku9f~E+@$}q}zs0h!X~`dG9x8^DA-VPai&3YOpKH zgheXU_uM7J?~JU&$`PoBd*&zwM=w58e(~98L98q&1S=MIe2B4u zvof=7b8Vg&H2a*l1z(m97&N#60!cAol@a;yT>%R2^#?cX&GqVd@=gy63pGhsvK5PJ zpfqR#0c=I0An-om;=7ir)3Gx1bn@`wtK*_8?g8z*>7H1_%QKUf84(b70`^w$cK}?0 z`djfyk9JPe7nfFVUp5df53hst3Q(@??RWp4wK5yG@6|Yq0)h>0qUqFh=y5~c?g#H> z6r((kd5rqqUlH_QT>1YjItY#hO100L7KUe!eu9W{cbMvYNv49hWr;k_pjS?$C(3%| zNb-(EpH!wb5T8sgGQb(Os>gdDuHMg26twTbzNC77LzB(L8`Xa6<0l_yyL8G(_1?8o zp0{*(c#u2>Nd)SE_6)X^U5C1bob@bbvVK8I%nP+bWRt@T=|_5Jt6sU+P5&mnoOd$hKz#tjd!Q%tHrNM(W!IzC3k!-|Jw4wWAGX1SH>n(3zz)4%Cvi555kCc#2q}barGS~D z$r{xIJHM-*@jmV516&D@-TCZ^Zwu>PjxR}6em;Q+3X7#1yt6=OcFpNmRi7MfBzD7> zhr4yz`sKndZ{NNR5=)QcXmhf%#;j0&#h{M9qZRxdP_l(Rn7G+AxF|BX_)K^Hx#fV@ zpR$qWH+KfTiuwqvCIeYImmz77Z9-9zIyeZ>vD{VU?~{=Xh~`I|297`nbvQPE3o_dcdDjWR&V&M(;A>lZY#ottNzZI&k= zn}UZx5{?rl-5`<)(^$I+q3qr|um4@4RZ(Z;HmKtk866I8Ps~F|cy}z+-Y^~G9!xJu zp*gnc5+O-WL$~uO(2?WxcK&lCO#YlM+^Jgs9Q%W*JCOyP`s1c znUwUYN5(#f!6j)3ZWF}uGnwzo=L}96>C7SWUmlP}zKd$_*TrxCB6FXNK2Y1a2*2Ry zW=9`|4wqYYYY=PT;*^sElQck;$|tOP+Pw%{tpYTbj{i{Uz3HK$MRuork-f|NKgR8{ za%fW@zcl?ak5(?9k_{UEAtA7^bL`bFISrTMQeHx##+L_6-__ML{y?Ez%^XWdH;yi^ zk9pbDN?mrYE(TBL589W43FFd0x%txJcD5`M7y_DihkUWSH-p;AW@goB7*W9ep8aPL zB`B&2G5Lhxf~OGRPw3gbh$0;>Hw8#nf3y{ zcuH)$y~!WerF-&(j1uO)aD36^35_-?(0LpqyJC8#k1xl#RT`d_{6U3AT4LH8@eL-1YY4!xv!hk}o%Pl0J*jK!g=5iO9a`2L@||pK*2xNBUEJmPp16RI*4|G1X4LyE-+b zLjk%`_A;0pW+y#tLfMidxyvRVzhzAZ+T-!@F$e>jIX3A7Fmzm{L5m;erm61%2YT}* zX3|XgaZ_Ex!san(`T*aQ7&LHbE$@5yeY4QgSQCs5?q2Z}r)2{EN7iI%h{w*-J-JC$NBT$rd`R4HlrZ`MM5<5zvqRDHxJVy%>7 zTEvyHKIPlhEk&wi$;(kkfQ!j`E(6zRwR3?$Y_bOqt0-hLY*MWMh*M6I7x=aTPidE5 z;3Y@!!#I43ooD@ws+w=-k7@*4>$B3OLg3*Pq@-3#&xf3$H9Gnnsc~_!RiwA-<|X zUG~}gbF?^MgWSv%n?ZSoZr^b$S#Vfr=x^`CxOj*t3sqFma4J6CiX;U}I$}&|{3Ce? z2`J`GrcPf8$0WUCa9*26=k@U)MO=#mrUcA?UTWGtsI2S*@J+Xka># zDehCpK4#wgbZ^~cax+CC*~fA}yKesMy3&928{&CE;d~i@g@CDZ+vJa)PKN)1O%xH> zfWSu)4es&#!Exd?{Ev#WbB4#P2K$EwnK<4c8F_?BV%{Lswday=e`eDY=PAi2;SR-=@MWp}MF^;bL z%CC$24u_0tEW;UN?s(Iz75Y(4O6!wlbKHV(dPfx_8k#4&O&Y>5CY8W+W)%{n%_<9i z32c7Un}jT#RE1|bdy7B*$O?WBBGC?9izzL>3f^NrNl#sII zYJZTYen?z1h-mOwb!r-Ce`^K!=zP?72>>xI9^;u26X9ZJoATXR8RC#&fs^Q1<{BFw zkEeqpZI?Yv`^jf9CxASL!NXcx8t34O zcYZs%bsm+LmOe}`_#DQd`6wHyzqVAw{O?U`bC` z2ZX-D=+XY@o%|hPl|~`AfC(+2awoFwf(p8j4Xhjs=afG$-$wjSYKV~ z{@)XDCDF1^l~zvk_v6XL^hUq1c5V?jrQni&pR)P#qbb|>DC9}cb>dTbq!uEnsRre7 zhmp)-e)KaF)r%Zj-HJy+jK7_J_v4u`3A0H#Z6&EoSse5S3BIhCIv-EDPdD&VL`088 zyLa`Vr>AEiQ-Jbe=mi>~2ceM}9vq}aQs!S@UzccJ{L^j$nUUHmK6`|ixEN5l-s|aU zM44gt{*EL^4dsf@_}tWpW&GEW@jD8WYcFokKYf}rtEa2ub!AbYRVj!8$WHxIO;A$n zaeZN}*P!=+BTGzh15ZsT0?F<^@omoIYOk4FmaWlg^}jkp4*hx`2ZyoUtXebkcBgmB zU>2GK>FNJ^2EF!|>X}qxD?c=J_Jg;+rRBzY&BU%tx^0120Yz-rlmnOF)!Bag5->>3 z|2ueSwsR*;Crgu+@=3|>qH`w}pM$fHNVUw|Tok|F2LqPW-W%;KXON)G$jxnW*jd`y zIkDga6Zm@$?XsfPqU0_x?ef=wc1Xm+W|1QStkBTi+?tOTI4sZ3&bBTy`V6xFAul@ItAv^!YbJbsUCPbCveb`ro9tifB>O$3 zzs7;T~IvH22@h)yIrr?%bH_n;itJolb zgY-5T?($=Wn#)+4VDK{%*N7QvZ`~LCI5;&!an?I&%{L|7SC5`{-wfmr=->L!)3Q4F zu&9w-j7rn;c~JyWKye)bFD|rdrT$J(>#Ej61m#6(NlTPiPx2F@AAC_Ad3>>9;b$(! zxX))ZgGO0sCm6|YL7xSsIESvFwuMAgz7kS!{(Jy|9c=)71}WS8Wb$EYxqxDsr>voM z)09pQ=4bpimA<|H+0sJUT~O8-1RAs1-t9yZ&+Uh>VHVuhD&lhLjG6{hUgt}vUNSNe zK#FPvyKHpuWNvw7-h~pFe2UmJRCrcXDJuZl?&5CNGu4C?yY_pA7k6%QxECMq`T+gJ zHBK2oT9oo~>_j<0;+kt@0C=PSJMhL#d~4djh-tXD^Q|)1x^4y(B>^E@V(-<0|K<*^ zL#>#=Oj(`NBC1?FXZB}NaqQ zSc05NvlwsTR=YlYLyEWRBxJrBf${oB})0I%f0Dk#-u-&_o~5XJA?Oq zB>ke)(Tzn_eNK`@U-keE5_lJC^6Ssjfk{!n*=Z33-$8G+aY??n|#WvD?XmGNUR)(kr&}Aw(#8WE@s@)!Cgo zq%AnM#P#o!xR)%(iliYQskOe09JC*VA~9N8Xz`0Za+o@or8os^C^M;S8+g-R(osZ- zNZ#+#pW4221(AHXZM*k}L4;J6>ULxWSNI7ff>fAPh4$EgvG0%l@EI-avUi?33dx_!JHMmA0rNyn^?t%|rsL)AKX) zr2;dnRv!piqhaa}*VER^Y6*-z;D)*OS+=B30yzWcgHTSNMWA|s4!(CEKG^bSexzm{ z!|Q#Fa}d?&;h($5s36H5uh^Z(DSg4EuqC7^>71)#cxBQq@zBy~OTOZ13)#5_H5#To`G~E73Ou;spmgYZ1r$ABG6u>*EQqKl|6=Bn&VmW4ke4P&;>bZ$TP6 zdwU7rlS0iG$=2h#2!5IqU{-IM5d$BI9S>2zlP#SBHAfDmgu(^7_f1~MdwULoH0aH@ z5Ly=zaDhNys+`yy>;Zns+1c4~wuw!YS@EbPf2JCRB_jjavUnUE35lEm3@IdUVYkcC z2dr`~k$MG-e|F&l_VbDfj7kSUjSMR)8Qlc8$Ku|esm3nC z3f0#)U&G|z>avE(T0*}woA6ooA5w&(o}Wb6{SEk4|NhUyqj!qA6a`f|sv^)_c$}A2 zolsG(HY=sIt(mQAWLlen{9oQDlQ^F%?XHtZpEG|zsmuKp9g@dMh(8z+A%IHCCKv@s zwj1>&t6JMaDMKI0C&?C31anoP?vCAFxE~K=_HkNOIpcyX@290__dW5h)1)9P;&w)- zmgP7{uahUdwmdr4NiiL_qWl}0pN!JU5!oHV4bO4QHq(NHaQ7uJ$`fC{HQVIzWcW&f zV2Okp&>`PZWn$_%%|8lHIdE#4!dLnzS)H_^lzOR+qoq96T7qBLjc!-)fW1lkCShYxN*%*$`Xr>|rbO2| znqXOS18H4eCw?>bEFI;xy>&5i(A)dZi$bQd#naf+)z*C1!`Ah!wJ#7!b&H^o>5#)W zePG~k@D97YY~Vd~207|`v=SHKV0kyk7PR>y=!ubh`uaLQJue3xPx)B2WAEKVS8k6d&<5SKZp zhlS!IHmS{jXJ27P(O-}wESga^l`M}UJ@tbFwG@hzV)*D|v&=~t1(q@` zpn#n{oVZGL{dP6v>6Yy--!xX@N-=%PH@ctP+YkMR= zYFoy^e@5#e+QwEOxhP zB9e0d_XC597}<_C!@QB~j2JVm7e@HP*xZ{-EE2ndJ@LN=izuw8PG_4Tsc{y~kQP|m zs$>gDM&|$hqh|7cBZliuW(I%fWNp2zH5s|Q?HrdJY;tDCSk~|608k6SrB!-ae`;lBFg%2nmWjY2FV((B!;Od`IP!sw<(V*uOTXINw^Dlj zlMY`RJL;NLKbJKx*<9#|h|5iu*hx>z9qV9H^`-w~wl`Ytzn<+8!!>+7|=mRxS{ zchJ+-SFjHv6cZB@*qw#zhW~qkTMpfCV$1Aoz9A}Ysbm~6J7V0T$XW)g8&zqddP-i) znOe(7Mp*;T^TXu`!=5l?dz-e=it0<^`)Y+whF)_1G2M(>`zNjZq;$5+|1!MT?&qz5 zYQj7Y4Z>QK>!f%|EUI>}%{^%ce zaevyn7gdsy}GjDzeE{aqNZ%zu$y5E*E{Zh zAQR~^WUBuE&Sd*yYK zyvbKVKusad2vg-#C1!_a;C%j*Bv_cla`rdn3yOe@sDWr4x4G8#7BwU?D3ST;DnE`S zEqr}Cou%jzX zs`TBPEia((%Ul`Nv1ns%Kgrj%Nt5vJWxZc5Bj5cdUv13ptb8GX)xJhw$G6vZg!7&ufAi~U>)5&R=gHOte(n_8M5AaH)S1HT2PDSl|yQj^dZ_M8nGw37Ubh7r?|AI+^51Evpo2aP4M(4AsM+bsu z$EOn1F`tOIvio-yTCk5>ZmfsgPiAU;cbiUg#1=q7Yi<02D9){{tZdouOn&=8TwENjKnGfA%mzUDnSuZE zfs63<*>YUm^Dym7eGx%HW&)Y$;Y)R|m-w%0B%k~&)uF&6d&QhatrYWWrq)ohQ)imG zmpXWj-B580Pfq3qvx&yQ!v@AMrC;4}9%zYqwEWwcbhUxcFS#~cI&k_c*b7o01w^Mm zY^!-(iVw*%gvIjEJEox7s6ceU>3QzZL|mqMCwqECk=&>ltlgv=uf&9&B~X9`_G7lt z!i!rxP~VcJQJsjVj6etzAO+v7W#D$w_oU~G`ursRL8s+tis@EMObq}O5WV&{``FBm zg}(-@OxYhbe6j)jn6H+1@5K$}NW>A1TE@U>ES*Fj-wlh^_?ncGlF~l?&j5SxMjPAY zzr1jhC~=vAF`&mX8_+*v{~D8F87dssF0Ey>dqiZszLk zXiVPELRS5KJhbI*Y?&2?R+uPpfJF5&Fpi^U?8yuaR`2J7)gSQ`%gt}2F;6VOjRW6s znUnMna5x2AUGlCBd+(V5cFlisB4|JoO7NEQgJO-wTU=5|hrP0=2 zl{9*OUj{1q3Xj)ifU8}bL@@s8r?vHU3o0|Ax`nH?y5@_2<@^F=y%d>0n|(JA>8|Px zKwSNvz@UxqRZpBYI>kJ3V{i~z9GBbw@4WNEQX|j_h*sMhN1(&uh1?-H>WF2Lm?yF% zBJ3(SU%VI}o$9@qzOHN$cJ;D$c0TNDIGr^7!Dlm5`-mc8dvD#s+In++ov6nsdWcry zA;tbk=o|S=Yx`zjAHM7%jQ_sD^~6oP!Ik~Z&F=MR%RZ3T4ztBn3%~HaTnZq2OYe|1 zW~)Z=`W@x7B!&>K_aDGIFGeFO)0`-wk=Ts(r)wnoNd)q6xWsIZdpDs*mqKQyR+hTz zG1F5+9C`TH#DepqAC`}#3#w_7Ry#Y*W;0z)DTiDwokoG14S zhDR)}Y%VwQ$_7Cj7tK|6_;4*`zfO3w+fel>lXy%@{3g)hxM$I{V&I;lrF0YuZ*)}H@8g2^ceEFzJ z0IEO2f+v0Ur{m@rI{gdlkWGbzZ!I#ew_oOOK@SN8Xm)1E9zYcbqwK$*w0GSiz#|Q| zE5$0g`b}Oa%S>>5Z}vPM$ezm{h#A0$3;~P;=D3l)uhMQIOKH>KEHw8X11L9rA`Lom zV%iK>7+V3cP%bV9RK4xj`Crz((rLV28(%(fFuoqUY1;uW10bhh*YqZU@3Q84B|T8o zV-JW{{-+HK>55D;YK_-}s38fgD5>Aoewf~7=ES$=eIIuw)b{VF2jVwp%izT3%*

O4}fQDbJ%Yd@^Ag`-;2v#Y}@X2;6%gRVZR1#5+!M*pfVK= zR0__E|4+CY=QaG7OHRfX*C*FuMWK?|yLT@mk)C{OFIGP3QnX3zAOtFXFV4-Cm-ry~ zi`|m_hOt$UfRD2G^Q2{3tI}UWNTdE5snC8n4@B>>@FCx+DmUAyDK@-U94JzT5o%~q zMkP7RZg$#dnBm>U$5iCAtIw5`WrX_u#XmW2{PyL}T7@j(AwVUOHIcVI#wGouXsm{B zWd18?xKW;_WA|?C;>D2Q!3ms1@A=7S(Qw)=U}XuD5%j2a zwlqHMIXOX}A3h76ac@cB$FO^gT$wc&D{r~5fC!OjXkwfMoA?X;A$m$S}O)bs4X7-1qbOn0>&OX0Ik}(quh3Tr3bw z^U%bcQ#FXj|4|@T*>bep05@VYLSTqR;kZndBx1&0_}$1*449qzwN3}2vW6GERYUQT2Rcm08ub*c=g*X1f8D| znhVb~Z^H9S*cv&+pzpX%U(7dqm?035|F!UDq8zB$n!DUPDh^JyR#b0_q%-IW*!=Mq zl=h1M2FXZs}>2h z7Mi*{*m=nJe3Im&Xr5d;aR*yHgi5rXTzD6qq1c*V)$BR~t{(YoXr~ zs_ccGr5qB5b*DTR*{1qs!nC#Mg)PPXQ_9*sPx{f}InmMi__A(PD8z_2xAvFcRStilfDe}gLwO!Z>c~ft zHI5QJqLeu^`GXM8Uaj}Eo?pDZm^0t+;TdX{zp}eqdZwV+i;*0%z717J z$A1PuVQ$BSl<~_FAqV@CYTuFON$0-uhK8ETN^eW&*{`5e3+x;qCuJBERftXKtUu?vtE5tP6Kx$?ns z?BGu|Tr6RsV*eeJd~SSb{)ZkpjP9rNmk@|3{$S;{->%gtGagGhw|af}MP~$MYdS1U zKeqWrS-7DLT|r)qWT+VD)=|-yEP1;$L~%1V!J-GUV4B9r6^@1=|yDn<>5@eg@KXZ zRqx(K2G0tc(FT~hmlH`sR9i7_navQBu&tVRxIgGmB!f8k^A9YR>ebLeOPTW-`p;No zM|@@2BgZOxB*9)LVR!d#($ljxi4|TbWKT1lpVCY#RJ9YvY&w@hA5B}dI)5&&+--nc zBeY}CQMg%J&VCF*Cw4x_;KIij3RE}+=Yr?2I;(Bq@>;Xev=MVT?oQ$&NGL_jBNwD7 zx*b*aN6NwIh~s$g>@BKVO*B$bisxI`Qc*5Eo#uD95 zy(v;augfO%d!#TSxmHayO15;CUuy@eIuYOFB~2WoB2rv;7&um$3;ED$ z1FO;#LW%6-C$@E;kIzmIC&5Xls~gXL&kLk;AvX8-9q*7@{w)Jw-G`LeKb=n&NYu}! zRuA9E!_GmkSmzITbw||OUy=(_y~D2Kw^MqWEX)~|85TgFG4Td9L$ z?n6nIGDOu*eVstlaxs}Zpk6P8_lX87E^uYT$YJ^LzY^5&%>C_w#~W9MBriaq5Qqv^ zUPl%cu=ZV}}($Z&O)YR$1q^Fy%49tfR5i`@2T#f$d#0cS(2OBW-@beM1zH8oyf$pBF!Y4;lAVno_UUW%jO zmo8l@eOi4yy>evgHuJl6tjgh1$hXwgRG>Q5#qC%hbsUZ^45a35G#ssm$e!M5^Z4`Q z1&GR-+ylgg0UYtkCh4m2xb4CkkhvE{DD7wn%K99F@a|`I9-AQD#b(USM$BH@XKi%I zN=gb;+C6tZX&yE{`!8?lBdN#e3qs+J^r&q8rvpIxMcy>!6SIOrwcfGfpKjG%g;7Du zM!dll{YiJE7E|y-M4$8I*Nqxr$9!i~+(}juK`)5A3aZ2@@^c3DWyd$6pqhttPWX$9 z+F07z$Y2m$}F zGpqw1mYMh%==?2hY2p)Ajx?2eGW<(wD<0ew%#Ljd;?v+s`z4f%<)LvMi-->%m_3IO zQl7MIdrI*>KS_Dc=?<%S_xMI|8d7o*jfG??TmI&wsWz|YL&kkl{`ofKfhgy8#3$__ z9Oc*Xatng*6;bDhH__rdf{XDGT&rT~@u1m4Zt4+*b6-igmu51rJjXq9ZabG!X*?ro_AEa6QHeO3fy|x?kU6h(?2v1DLVqGW3508~#83J9yJs-5+`|U@bhC4hx zv$P#6F0*QE*coPA_i)80G#V31 zxDJ9hTv(Q3#HLt#HL$c;r(;+eCXU1A~)U=mp~2wB`*+Es$=;2 znz@VLS-N0h&di-4jo}IcCSzkhmv}@TuPIm=adCC6wzqu{oRAP-D-P@6&!bj}4V8*5 zFLlq$pi}7)@gh?bynQCqj&bt znExSKSLt&s1$`ir`j${sFg>0)QpZ7W1Px=9t0hn7x$WEOP)*xEwVw{aVB#QD6r7Og z+ZJRN3_d*Mjoxx@qvPgn4VUBn<)K2mF&U8B6a@AW2D74M0|R)xt{&zu&=>zHTLfC( zNViLo@7_JF-gERj%i=h(_7tPJNYaVVA=t@!9sli^o%!(#uBZ3kOg#Ul5%KlUK;ErJ zw^yz1OMa1|yoAk?Ry#R(nq>&Nk2T z1wvsO^-H;grTfiyH(y@1nx$T*d3a#;YIrFuyqE4f9YO9xt%#`m=gJ>G;iqwEirt4V zxEGW3L6w2MLA;_S5D6rWl%?kN?tK7kyL5iojANqKs8544ShjQeMY!2mS#RDf_I6uo zlRbWL_7@~xyYo-G$Veu!{^t`@nWvO($-?9*rL zrD>zyHCsifI9J<7&y&Dl6M#-k7+!oL+}XzCw^>{o|+WLz}ufhU#DXvfxhHSsmHU zc~olmvZ!&ZCwZ(l?SgK6+qaoAkP<)D;I=>}I(Yx>zH03KJjg;4^EGGY$A1jjB@j|E zGGG|;`shdQ)WMpcmg9_St#)!AyR?_|Gb7)%AFbf4eL32xpZ%7VOOz-$>5ud+2Vov& zDHYwFqoe)(bNl;uauxt}!tnJ!mdN{PY^ulZMlm87Kx`jsx09>}gVUcyn>jY~-dB#k z@9^l`waA8#g`C1SZ4JiNesBJ`z(V!=kIT9vOmk{1`=S43J~!?}Bj;wZ>wjflwFuFO zXd$L_AuX(nTaxHYG+CLjz-G=x!FZ;I(X;7kR(vqR)PT>O#4E=~M@a04Fh_*xhXy1b zX46oLWz(KEx^S=b+jYHx+)y+Q!qO z81?Rs5;o0$(3P@#QTui1T}Csk3o+H+*4iLmSjpr!Dh@$$-tB_Qvz$<2r&T$syj>9! z9M1QSNSXD&XF?YS!&}{f`WOi72bE?RdJ$$QJ#yqC(_+%Hc1299{*+|Wh9+<#UQE7 zr4n0ici4-Iid3&}p}HRF2|dmmu*Ha!NtD#zCRSwigJpTBxM63vHu|5#$xnxRaGkq1 zY_Z|kgf0}44hLjU|L#xcvs?sc{p*u%i6l@j#e%ddBW8PhZRx0Y{~1V5^Eu>)pa>7O zhCZVbNBU>xmX?;jt|V|s?|Xqf2(WHS$TqrKt_;5ImGS#G*FQQ+hd4d1YGlhlKknQU zbszRzLpP$?Ae-j*H>j#6^|4@jUoq6VUplMOju};aRr4p5-1NO9`9^RPgIW}!lQd9! zd#)AbxZ>LWC#T09NmN@zM<@Rr;1YucheKiyCvQ*X)lXq4F-uqKb_7{0ckOw8m)txj zS7xF3mmUpKmN=)X5hY1ajdlCdg`0V1ajh%SK*Gv!dms3Vq;mu)5mXs=B(nMD?yrYi(YtSyQp6PYjtk z*m~7dCqdK~CLM6ls=TxP{|469z_?XmXBY(gP;pRc4r@Z(%?Z6|?&d1-UA=JG|Nfr4 z$w@soT2!9O^zY##Zpj=seXLXUtumWruQo3wPMxJ~8UGB@;EwSHh(8S7y5Y0IG*#nP zOd@@b2sFj8Ukb?r>s^v1{wFmX5z(cfivQ@~Ee{p83P-<(n&?uBlI!th#Dj9m(yAK) z0g0UWNH;lSRm+9LT|vtrxNWe~aacz^)4Gj{gh|wCG6-#N>wGFoT zZ}O?5?#6x_2U`;)lDb36Gb1DMbW4k3nicDlz#Q9PKV5n&0}Zw_Df1|NPr6J^pv=GLiz^ z2t?DdIqkfvx`f|{J1fTH4fhcJ(e8KflZKe22 z{oKuiZwyfg71i66Ne7oGnJks84Ql@AMg%PG<5Krhg-*`HuZ@@--rQ_U|Ae`22%JlZvdiPkx#+% zY-SjONmbw5-8(x@JKOq?Ra{>ORiRc3e_V8dCF@IV?NN`R0|zTB>MICY{2=WqLR6)A zWjhL3^1aEEwrvlmFMc3M1o3-jd0C*LYiw+!{&Z4G_Mqc2(C#huoxT(|c=qg_ z@Ph6KX)kXtvy(1Ey{Y%$>s&$PprHEdHj}#g8O*f-k@2Q;n;zaEwEOW&tvhfN z%yKlkfed!%#dp_ZNF?74jx#roGuLk@e(bFPZZ7U_-mOenFoe(lPJHXkX@5GYoFind zVtTN=KtnD>2IPt0@W^bNX}QQT{a_b0DA5mst?hko$8*S4{gCszqbYXKsd|b`R0QB+)8Q-MLs%gvACEg+EkfE1?FF=1g1qw0(9SG ze(2^4+BCT%d6zvt?n$!NZd5}(IZfq3w~KOO{ekNpR`T@$U8jigj%W?0YNWqtt*M~4 zt=OZLZ4?^UH(qJ`35Nbzc~dmg&F(Uw0cdM!E3Bx)KEckbyj-F*T~<^n9w>ng{29!% z3*e{M9pYSk`TI$=7s zNYu6z9}>Aj$ftY89^tRubK)M42&*hUVPlA@_j>Ux@){)M)48>{^b+HPA&&7cnQYNW44{XR0&)sF}J=OzbcXroq@dc-Bb$V<>8JO~Vkv4D4mii&k z^h*1?Z%im%d&(0FE`)uyVZpxium8^aebB0@ri6kovr7{L8OdLP@CGwOO7lWY@gcMb%m}%l;_?+1z+g}vU&&g|?~(+>DNucc*v}z@Ie-BX7eO zd;fbYiLv;AktBU3a9I8JGS-j-&UGE`_Rp6>j<3V!$5f1R-6p^SW~GR zcMSqYtOqy=iQ%fMv;y0)NaL_h-uVN%&sX}scCSW`I_}05<55HK2`6$SD0FVGLTmVs0z@$*H~6| zSs_t1vQwa>D1|!{%=Ph%BxUvDOUw>d1M~fk((IsHMD}&%1xGJCPgiNwJ@0>1I&w~| zIs<<;fq)e3)rT%eK>N&}Lu))`%npQIOIgN;t;Unm6_b@~K+`k)Q%~k_|3Tya#KyH3 zZhL!=)9%&RRqvYb9sF<W!PqaL@U8IKI z64}(QqXV!R1c;nWFnh=M_vetIYO1MmytxG*D2W`(lh9d>D@yh&I`OaWrb(tnH$h!g zdDFkLI`;%GOMgO*kZV1oqF9hrF#qLBn=w`e2;)-lz;Bnkdycd)=j5l7ST#idZ50CF z;*}0L^85GvISiqLv^WS)2bKPX_L3Euv|i*Ze{RxuK{dR-vy7^%$wL847Gks5;^2!h z*Ixu$N1^u$*q9C~9V%5F=s^hZD96=-6Tg2qM%1cm@@zWrmcsU`~>oK4C`CVt&W#Z8c*BiMtH+lmc6@}^nzS^aB!0IMTSCBpJ2?0FnS?{ z2;pByG2>Glu*R%nPGgDH_Q{#>3>Y1+0h$&Wm15RRk_`HFAsI$i#Ash`ZQ`7`e@Pkg zBL@Cz(|E}O*V1zB>G3QaE(|f$?nU(1Zo^w>tHMamdWz92Sw~mt5}7fIj9K=^F4B5? zS8bI{dcFyZ@~q_)q`H3Q>pp?M&M{k9+W%so1bm%9KL%o`bBm(w#2xToR7O%>Dz*4S z(!2kB`2b6&AQ%j6sSS$d=v{rc=gf$`f1W{L_39d>mYn^f8cz?ML9_QAf%NdV zp4Yl`%p$hDSekgM6sNz>u|#bhJjEfR?mq}pz*pM6_N|VL7gPM(A4@8^K}TjipNm2v z)DTEYZMcyET@6w7L;v9$sZG`>Y6SLXIAKYa_UYLp-LL)qU|jwW`&pCjmGs*^V0uj( z0#<=1#{d2C16H*J2?yXml<{jgntkjilByoLy9d-}et!cwR>9G>wx-ELak5(0yFOWe zA6r=1C0UiZRxO%`EM~p9F6-rCy8>sL2VVjBAppDUE#oj+*U)fC>-V?!BGA0Lxm~>U zE=|_Yp3~I`a6}37)5q1}D}^rxW;+VB^ME+W?Zeu$+QS}j2oZk+!`xz;pE?#?R6x+4 zZZD&@J@!?Zij}|}QlkDmUW;BOVq%Vwhug_-Hswrx!BLapGLl*pD*CO#s6fhuq3%p& z$Z2=0V2^1#lVM%+c{5c${->~*>iOJ}&Hk@Dh?_M(8D6X9zC-5o${5XGdo}P(ibgev z7?m#gC~Sg2D>|S~n>~PZc~{q%Cs81#_C)#Wsp?hTz?zaSTaVqbST*Sb@pxSZfsZp<6+J?0EexE8}QkaY<>pcE^y)Jv;;cUl45d6wY$ffa@%EVuu+thFy?c-4 zE!FB^!O-k%hlez4X#`MXf)b~XWo6n|sFBbCppyVft_@jl$CHUYV3WQoB_)Lh@0ip- z0Q%S%-tuG&2K?5gjj5?ADY$aP^P^1wjZi_1eGe>fxV`nMjh;rtq{r;r7Y5L+ zNG`?l5XYx=AqQ_LXiP1|N=t2~R;|-X>K`^0o{jzFdT$98F%Mwp*wN^%&dcCqjDV4B zQD&^Mj1XqGDASnH@3$88(N6Lu-VDcvo@)xXAK4;>RaOS(*aTf*cnCM6OwkuR!{yxb z0ST$^&r#&$(vT+~=^!%s!tQp;p`N0<4NI@gJFSiWFkZb=)>A-Hmmlqn>}s+gaJf*r zg~}bV=To2iK~08o22DSuzGVBh5BByKm%63>*p@UMXcWBo`4jkQu?&w z``AvWbpE_poePZPG2HZTG~yX+@D}QJ>IT$@n;ELFfW@INp zcY`1)9RVma=_J(!*Wz57pF8W&H8xN#z^0bBg`lJ1(NGXDg+gfJFD%#i)SP%rgPeHY zM==&F$JMqr423_2{^`a)IHIk^VjL{NyM1;OLq%F4@_QNaC+Ch6=I1xHaItw35^b}> z2oZXWWFLV%B9e)OqNO|)TI4l44HS89--PT3(rRGBp+;YRK?Vg|e&tfZBY4ns=%21_ z{!#P-3IskA^tqO?Xh)G`dikF{HeT584At-q0v(N<-B?mSlX{}06GF}8M`eYBs}8p| zr2Bocn>}X$+C+x?qF4+xDS!SYxP{8k4c$#__PVfK64m;>W(Z6E-Zy8yZEDh1s6Y3y zx*>xEjuyJF!m$>TtdSpNd}?YN^@d#y;sZ0sr$$ar_k2B%`e%XkKK4h?zUO}WXJewl zeXldQ)Hxeu#rIp6SHC(02S7yp17n|)p@H^GA7mQSa_qHU1A7{`p;WzXVyUqoAVwq* zG+*Z{=7D_cTjZ$@_Oo)dI%_{CG3UU0H2dcRN|)RA3)Ki{Ckut6!@C#N?5|b* zSsmH3>Pd-;1!r&j)R)usbk@mgpW!UbL~2=Er7sp^{htHk2-i??LPCTZ{|CqCVk z(yX$c|MKltz;z+(_4lKFa!m<`thboMa;51_Njn~p-9G_zhl71egVVtUDt0(c zuiJ;J>XE5?cV3^4gHqSMmq!KX#MDGf!YXY59{Wq*NFEQ$5~O{Ov-!fVM{)#?xHle6 zjCh{{ThGYm+-BAqkV#xol=pX-I`~Z{igNgEcLW|qHoQ7X{?_cF;Uq{G*g{B7PLB9e zSLf~F&CsO~y)HBLy7I)uN!rlp$vwaI+c+a*9EsF;#amr$biP%I0?Nij;~N>rewC@>4Ek5dgIR9c?D6{_WyyWBl$ zbV=A{R>muZ113q+D}M6mkSx7^dxohij-cxK%IWommYRruELEbZxf&7T1JB(}l}i=# zcM&exwUI@?Q_7Op3`V5%4sFMI@!))p~+xjK(v7w zmCs0vMQT9bW9VNQ=t49Y6eC`V5Q7ljgK5Nr!MN5xmlHF>YYG~llV$8543T+b&H;MB z-8<{jg#1q3wZ)WHxIYSp`Xqa2Pywc>$te6g^XM}Z`H;9k@(ekm1ux}|?~Wh00WNw; zY3N&fB$%{1KNpQ1c#FUOxAba2tZ_@Kv8<-%bXN9s2?WucSG8bHh>!35OjhBL@%Y>E zSVpGe)4~2spz;2}hWG4Y6-bWL3HI13d+fLWjbqYp-_=l}@gTYJU}>|G9|ZE9&RAoP zCvW-eN%+o6G#nH*GJtJ?^`siOd=9)%SO3H;K29_8UOPtoS=Xx?PSAszh)c3x4B7fK z2dIp38vQR6-Ea z7dO-Od9}P%UTM~!NaPVhV=jb66R5~(uGil|7sjASCgl*K;>FWNR9BI%PCuE)Vo1oC z`aFAarshD;#Pu%>kt7k9`$BaVju}!JB&f>h+*NI{jL^_T^Q9U3r>cgKrRYVym=vEJ zrdBycrY4h65P>NT%7}PAD(4!D$3OilN@o03040WNRyXq29CM zi?3}Ax;N=(A=jh7A%muM`;D$5K~Ta$7(p}(VqZ`;jf@{w|K z;&N5|_X|rK=rZz6H5qdF!wBvFBnzuZL2|*jSky)<-;(V}_p&r_jEK@S+eLRRdK{re z#i?gxHZV7JZ;}o1Ma9;j(`iYE2g?e`3OLtYw%%))@ju+A2Jykm#ZlucX?xcgdEap{ zK&VtxW4(g$Ji+Eo*5>cW?k=VnZrb16zeV62(Z#r0bsrlBl|qa$nWOG{L-Hox5HZc=%8hDK?a%F^JXqY#pEC?Lv3> z^tB;u=;UQB=)@hXv?C=0nUS=NOr8722NH-PIqT1Q@U8#5Ll@8~_5;h?n2qnPQ|82 z9eC71`#%jG{_E}WJKH!rK`7vGSFc{}b^m~NdRSoh50KjrZC<}V`r7(P_H3&WlO_Sc zKsrTfAe9;_)a#O;XB!9WgOuy?V8x4J3Z}h{Dcal)Z;*=lgkfgM+6f?!;0qay5wa^P z;(#s-a6zYkAD{A3CG{rvI*i|ay(@^k=ll0Bh>R2p_);#N)bs9E)(YU+S>-#SbL@|~5=0?rgT!vvzCw zU^~@)ss3;o&Pb5+HXs%uMc;-@u6}~zas;I3hx#%Un=Y91MDRX`#HIt8Q zuIXwd)|?%CDB0PdblYi(>O)^)U#BwfgpQoj4?%WCVG3&9kAJ*%<6qg?-E4bz^*$C0 z+zox4PMmSi9x9iGC5k-IpsWxdI^7|BZ?7;kj@YeQ4vVJAWh2i%8E#01W3f*a% zZ0zGNF5T>Txjg%^*<^Y;2h9^lBGugPzI9ilevQnQVNjK!gX1~4P8u;6A*$zDDx3(S zMK~#jRs%42QvAf&>#@#E-#3KfYH^I*#{EOX5Sc0YLrq?WM9O%JP=dAYa0Mwokna2E zTy|p(EY-G*fX?fTjF~S<$R~bp&nthe<)|P0raZ}6>u3>f8B3kAx*t2dTIBGHa8Lfs zY82oT9H*OU;yW*$eYmSkEd~AoNcS0Yc;4g6LQWWs|4<3zv7wwX-%~z_+_;9MYz0Jn=lP$}b z(H9kv!j+QDpLx`Z^PkhKD^RCjf$*#5I;Y96Ul^c};cN(B6ATYbkV$O1erPL8tQ)fz zM$x}fX29QJxJJF&>7EGXM1&wr`ONr;lCg>jy3}omjI_es9=fe3b`LFs*#=FM6t#A5 zF6LZPsaCrXX4{kGY@4(V;xn$hnf`zM*gZQ7F8!C;2(pollezHpnmx9bbZuls6H%T_ z-U==%EY<`|rGQh!LbSRGiO#%e9Lyg}1tG)bh*@XMNZb&)4}#=3>7ldbq5^fXes76> z$op6xN{F9C3lmfH6E5_bA|$D%+3g2rmZ#>|EG&7C3XGu;%sE9dO-?aIDh&iRM$~e5I2|1g1am~p{saVKs)5rm z^k(%B%{?%8`q)^wR>v1udDEYZd2b~irW#AQ(iCP29Q?mvhUAV@J zPbmvUqp5fEBCNxQGD#%ca1O}uokK&=yRv^gKb*IPAOkrLWME} zwK;^F*IMfletq-G#TaHBv|sBXVf6-GzYZe|peX3uHy@CanUgBYX2qo9EiXc-I>}gs z_0K&q!$GVhDtmboUrkjC2x|?nxd(wb~j`~;olHN zy1?&8p9CKvZL}#Mjowu$Wy*^yr^ROnXPZ_fZ_nD#=KYSMr&iq5s(u}Q`+BzgPN6AX zio0p!?5k*C1~ZE}qv7gQ&s7vEqfu2&Zg8nJP+d}w3;iBR5)dW{5a^MZ=0_nguB%Dn zBQVXkMCu6S=hMMS2`b!Me?=-dR1HTNjrV^pC$cOQ1}E1ihoUh+PY-dU&Ac_P;8%20 zIPMiWU8#BWCRb$ z{dF_2RT4!R$93v{I_CFh)UcFWSrdVT3Yc@Ec^(xwYePf%f?#xWy-^VmQ54ZY+(Hib zR=CIcD#6F@MnJ87qZpdLD?OJE%*iA=)d=3*-;NJN_MA+w5EwY$(<<;wXG%+5>^IkCs1wM{CFu;TEQCLM}shr4@KBxZH065~ zDnQCXNsAhbDMOk0so0`$P8$^FGZx2UJBq7SS~x{|XRH{Ou7wolk2(k8(|@Rf<-EA^$E<=|YTC$JP9^s638OrgN#H;5-unS9dh7IKOj{jCG?c%H9V{2jiB zxSio`-|p`iCrm#+JD2p(C&h|0Q=yZF#x^3`#6%AA&$L*S_7Q)w0Ze}D_t)E1U&$bF zm2a^qH|V)Y+RfirX{adHXB8TsH;^GsdU~4iAXve;ypn(&`WOEGlk>U}j1S$wYy6Jk zjC}au$j0!cxSScCEk$rOBh`&C1pv1+k|T)S3~=WG)9KT`ZZgaSYlNAR&n60|A9RW- zS3~h=T@p)T+~=KwaPzLd!}a@E3>|c|()Bt)*@%yIkozY3UzLR=cK61P*)v=eAyg+0 z-!i_k`P=P8m7CH;z?7<+;SsJ|vK^(E%|}9ICEZpFB;auLH$@Fn-FW2r_Al$fqLH8U3E|`Q2CGV?D+;De}g zqeV0cT-mV@E|m}Ew93Fp39-F$X*$^Aw!>8uB~D@CK(`O5Vq#SWxbkr5%l>lxz58-S zVTzg}w$Y<~I$~`wTXx%{bDBEWoW9!$bm`uBIP2_vH zfPz4$T1KcbIaZUidO@c@BF1DW67)vu;|YuLcvcP49bOA7iCG=mm0LLhF{qZ$oS574 ziVA;Q?MX15AdwsfiuUiE0yN~)as)(9;~XR%!-%<FJ*`b*4SVBe9?#-f}uLYxUlxapl~@S5h}6Ac)w2O1B#mp zVxsruR_{x2QixG3eEh->W2Fr8I8_|aprFyZc8aEFW?JHDId=zx~8A$x01&T0>vo^8pqmA`}Ex+hh z#gSpEC&${r@HjopJ^E&!&2}Ciz=sUA<=K6z3%Pd#vUiat4F8=SVcBdCT%Qe(A5M8!ld%ZaZDeK(`n;}@WzQdYGjG_jK3`$Nm6 z7MFm>nio45OI>6lXK5~y-s}j6wDhZn%znk*J0~WZX_9XV3o*B5F8eaPtOb*bqgse;9ZYy zNhz~pn074Ux(W#hE4X$k1A4RVy|XwLL{@9GD!?e(>Mx5@-4xdc~3 ztq>>tJ(HxxAl#O?1t%kZeJhHkr_e@LR}f-D0n+;7e2b(N^y)<#62O017`RB$`u1bM zVVu}~tpcsDLwWHHX+aQ+VZAtd*P@gEoO96%OFx0H?X%qrr){)VIXS{VfCS-3F>;kl za*@z?yekP+s=`5;5!4XHWf5=jzeR12S#t?Ut7cj zp8J##Oo)y=!hiu08XgUGvX@uucu}%6brbRA3MAwQouUOSlcKNL0^FwJy$`Z*T@w4J)DY)p=LR5u`flf-(Sg3tEF$4mjN<&Ew->1c@j8U zNv$DA)smvke1jUJxgBsPpGosXq2?&ru-y*}55-~e6v9vnR~e(BaVE~pP>Rd|v9}@i z!AtLRX}Ok$)$t>-8rRN?c+Qz~LeeRy6hmyKIP=~H6p+yANOZVzPxW6$|E0o2hWGjq zcum+c#g``#4{{MqI39wK-oE}4_sBFd?^C09bHf*dme}Zow@y7425yfpeB8;D)|`2F zJ6J9yr(1>KFZ@1Fli6%lg(-;cO4wHhC_Lg0u+>7idGK&0Y!s}Y)kXuugVqm?uxWW=iqRzND(x}*5eIYYp6mVB0wFV3k zB)x?DMa3?@VHN}E%0xW|$@qpu5lw_Vm-p}c9LB8wv){VFK8YmgZ2#T>OZh5hR0B(? zfk7IOf-A%<398jFGSn5Z(G+HD!#7 zK&RV=UO6BC#%d5)NHtIFQ3=^5%6ORd+~cXsJeIr)ihNl^5w(VA$@OlyGHD6cQdpyxK83lZD5_ z34?E3u=!|K*bqUvTSG43Q%2%K$_e(isO7D2u6$1;MYW+O=cCG0CJPJmOd6H;BhWeK88VH4p1U1)v zSnw1u6)WQbtd!hBdwYA}=az&eR@3G2WE(@E>U`Q;wgA&)MDZ)R^=dQDn~UG>F!)UP z9{}w@62BB7h7hLHX;Bn)T@Q!DrfHZ_M4jQLmH|=3*(?FTR5PHeS|m==stSVVKiC7n zfQWz^3y;slphL2AU&jT2oO7Qc@&emf>|6i<6cr^BF!E>Yd%#b5wd}C9d94*XRK~-^ zMaj$2Jw$X+96$lUd3vhGCP<{B0_N9L9Wav36B7y-L zXih*#fM7-d(udvv;B-v#_|J0?zrh|rFqnASCjOxa==3jUc5YDj}9_Qxiu6 z!7gdQo`4~Qfx-*2mpQLUG9!UHUV(z<9&lmSW6uO=lKh*fN{B4JJ$gQwJL{Ztgb1ia z6qw6cc)cDB2+1@7lL5vMom~oq2yCi;=mG#@@;@*$1_r}G>}Na$#twrvG$7`j4G7sl zHJ9Zet2nw(NZiqgp--y_7NjxgpjM`Uh)6xtl!y>Tb>Xm_A>^grY{neBnk4`L5`~nS zfCL?mX@rbu3}|XZ0SSA0FZ7ND$UKcUkG-7E(dTc50OmW|XUON~J zJO|4;$07oNW-}0H5io<(zq+DZBnqVo7^BW-qtOV}a?T+}$TBEOMF7#FD4LvzIkjz7 z4Lb#C~6P_h9aF*MB_k%=suIoQBmz$ad2=_pCLMVy>N>t2j z-nM}#FPyN5*WXbEL$~Ht%}FMVl$un8h=>kWf`OA*;HCV;OV6pzY7#iANlFP3N28IM z3R>~1u5KdS!NdLXd7l$w+#RkA;uWZ zFiBpJ<;)zZu$0ugQrH3m7U19qb4n@3vgfq18uOLl=lr1x2lT#}hjgn?i z2!LibZ<@%Qb1q9B4u>Mvqy&g<+xlguRwxDoJ35{c(CYf?bUM|X%0a2hDG75(qNh)9 z&6_$MAD6MnIXiu*uIr`Iu&!ras-TKYbzQr^CE^fBQbV4K=;FqA(V?$cGw5nfh=f?g zvOiNg5P|y4(?E!+Pb82Kdj?MT*6x7KR0JFxCn8T00Kh;Ha6z$9$%YI)<3#Sziqq?W1@mM#K!NssOxb9&$*7h``iSQicxBF;K){JuEMxjO6#UyN#yM zLsmots5xc-SI0>F&HdPLw8EhR)fxai$u5dQB$;@XspGY3*QgQ9%pj9SWb)1Aq)F&l z6lIpY=+#&xmtLh*&8mH29nnz8&m9D0XO{*8Au5Qnr^~)_5fPCWZ!0;65SY;nfeejQ zWwF4CD1o3_2!)tApa-FFcjkyGn3QGNG>w1}SR_&eB5G3Gy@oJ`KmZ^Lh5~KDL9xTz z4GjSb49<%U)Dp${yonJOxu#zuIr~RMm=Ub0>#{8Cwi#7}rkyJgsg`Bgoy{?*nD#Ya zM3j_0RS7YeDn%lq+(-Y2goFm7W_4=Ogqc;qAcYXbI^qElcxABXN<$B{qce1|Ph=c@ z^juL?V_EpJi2=<310w))1)k-ZnHYKl6ZQNJ4$M9I1OSW_{47T5_+Ns^7`nh6)C>WQ z#2|zM0DOfLU`J2^08;CAssfmoIXbkX>s_M`U3F~LVci}?!Jg>WADrEhFOvLdBmj}* zc`z9pIiaT|j%I*;ypBk!X+hfc?inKkUk?7gTcUp_%UCWWm0kCxRQc)Y0PV{y(VoN3vU_mI5^DahcQM%CghZAF#kD20cIwm zIp?xO07$t7bSed8NdYNaPN@+vP&I48Bqv4Wl#(wzZ!~F|1c(5X(u|owvSd@jl#(x) zSFtWJAPPh&B~^7S761&rb2J(PqH+u#%s=!RvQR-lEc&o=`pvVCXCmv~HFh(`$@DXR%AOip~6Hy4>*nxpq2x!qQs~ThUOCUf;?#)EOvgF>;btrfl z3sp_Yv6!x$-EVXM+TFHq+hm4SRXJH7vFqX`0M#5YBo#~U)UatX08~}gG>w84v4SMW z$H!j0ML~wrx8aj_SHjDiK0v1C{Ay zt_rH4nwut>VM>OGhsOs5?2nsc$T=5POsSbSbq7Kt1Y#g;bDO0d4Th3(56XJ5-X$ts z{$M81_0eKqs`k2KS(ePqWF3IeyKltcfSvQ#p{rfNi$8dXiWFmP+qMsx)F1BR(*Xcf zkikU6`B*?;1PIPFMhyx|Jq9b<#aAyGp&A2H2)koAF@T}FA5y2TQ+_mizQqGxQt+w_`!KlY%039O=6w%03!Awj&hcf~*BMbZ{x{0bNDU~x7BdLZunWi}8$3EH-GG}_q=-Kig# z0KIS^A^G&^2o-n5Gnp=q$IKvzQ@w>4>BZ%m~=z!59b9tTNkbb5xswZfhF{LBqD=~60ng_ z=LmWNke>(aMQwbEPiz2?Br~JJi%$gV0%+^IG@xTsyu7;vjQ9mX#a9~ih_Z#i9)lvH zWkVn^MX-QGXaGixDxj7PL9GP<$sJ?Car8xzMXh0GRYGm%(z&(}f|p;-1ewrj*$&ue zB?f(|MdM%QN$cX(ku?Kt!UPb50r~5>hNlm7Au~ zY-Sn)X%>z&pU(}t4tHiwO>2tk_Ytv(Ws@571pppNbdO#a+92+im11O9*nm*vrlAms zSuHyxTvb&{0$>q2wV4r>sYz`SVl7P-*hC}oaI`d=9xJ>ksWGp^asMJD%#qp4k-R9C^j$b;r2S8T5iJH#LoPK702q34soS2t zY)gk|5FwcYkfVVeLDB%gs}NmtCnBm^N_jA>R22*X7wQ3B4?d7nr8`%K{Vqks=#9hL z;h;<*n<60~s&|TbT-_gA9szi(q5=?eA5jBgG|e#v|B?Y9LkG4642$qiL=Z4W7J+~m zxj+*{%nC#ty7C)X$EAVLVCZks__&FX1LJfElWco?IT{vpQbDlRH;bad27xHzN@($v7rgR)AJ zbIt*=u4@y8fB;a0(h;;GV8GJMLI^o$1gol1-Du8P1xBM$E15Y;n?j7K%_1{1J34Cp z^&BE*70YVSws|zH4v!{fQ49uUO34sXlT}-<>3iVl6m2t$9QyzOM0GeE7UlA@?WYvH zAC3T=mxx5*9>8xSnJu)4@Ffu4&p4vs42>6iz@rOf|FsvQH-54>+Ykf*JQBsOeD9q` z9kvY}IkhXP_ho8R^_<6xWU3;_ObdOC?le~hbIk{J5{m&jbEW^DL}bv>7r_WkUaJ20 zG+(o>XAp?Gx-YojaI!mCe^1m>PPRC(Q3dV0p$WN{q)=56 z>q0&x1IQv~FGQNu%v}(42P8P~LjXA?19&+F#Fsdc0D!;%)smsOvZbLL(p(1IE6pi%0-P!Dix(n-pSTY%`hRbUxc8k{6%Fb=`0g%`8(F+yo>= z2uOsK>c-5l1Cl)qLPSg{cfk`t79k=KB@P~`GqV|JRz_^QzdDd$>>)k|Ntw~>hR(r$ zf#H?0aD*e9f?ABhxdbi(CAs@($=Me`U`{!EoZN49WJIT95|OGn2Oa=ID8SkE*a3d- zF&Bxc=XS9; za~7gNL|z<3bjVzO`X?Ps4r*$~7`m3Heub#@XIZ~}x^7LPfaH|{07Qk3at_@?S5?FS zs5z;7F$4rNbfSgz-$0ZW!W`TmqizBYj(;pASSg?7O%24 zkVyet4}>@Zco7?2Rm$6p1Utqd00OB;+W?^8HET?51^^c&P&04jS3)yd+}@lsSQr0k z?;8aT5Q#%oL^X4&jDL{l;RNn^dWWWF1dhM@x)KotQYK_YFcl3*Srw?Ob9(QTnMEc6 za~Rmnx_)_uULcUvG6H#3&gnW1ew!I0r8dVH)dV?cmQGH~Hwmzr6@knoB|#2=ov=;M z3kL$Ez>Fca89TK;1K^?vl#+qDU%2 zB%;wMv~3$X7($z}ff(Yb8YPt?R+^;O0YS#d%sIDN3=xZ>Xqu)h%Z%AjLD6@gsCrLX z$_)YsW>Ki;Q!{giHZ>Y`H_`tR9C6y`1YJyF2`0I7S=MI;Rf zjzhm9(d(6hQF!qT000Qs%mT4El;Si9>Z_n4YT5eecyZ<0higP+=BK8YT@e@8)1#IC zE3se$g1#@rtEB*4??#)Gfe~_u!NYl`j&X;G#0+FPXJpDrk$^CS0<&~oc#E6sIH);p zV+>?$?445%P%og_#W(aj4j!RX5bq0?be3~22L%yT!vP|;*-T{KHvZJInyQ5mB>2sKm^*I0qH|LKK)?_Tn6%R?0GH%|9{zCMRj+*c z>wCpe13*zzK!A=a;0J^*bea{2xziPW=?H&8_JH7>=FoAq(Xo}HC_oedl6sRLV2Ccm zfzDhP1%Rv)LMVEYt92ACFzNbP#Q;F#pvXC!_e6^VlWSQsQZ@x*;^2%WK`?MiyklU| zwS+(v0=GG_Ckd`)V31R)sw(HqL=<>7n-x{%IkQPBV&%IyL^33iPF#YSQ*M}uk;JtK zjKF$@P)+meV#%A?V!P13e)RmPn2U@)9c=So<`Sl6?bRaK!uHer6zIwN4v-z!8^KtNz14m{V|T`S6 zJM*9SeonFAe%Y9rb}DABFB=HZiTj@>q(UQsDQf;Wc{3zJ;F%n4_!xVPH@L1XVQz1jg()NkEOPiy#p&QpjokQgYTkWf(l zsrN^jRan5azzoy_VN-ug5>+DzAsC2(<(#v;h;Bs^JC1^#@RNceazGNvMu>)L9$YT^ zq7W2_$lBZjvg?1i+I)!GSL9tfktkxoqNv(=T?{HSa~WL_O{PpnT|tI{0bj_ka-dE- zqVqVfU=D%jtg0yz8(|2+Wt=^%k44ecH8FP#Y$E7H@`4X~2%&Jk6cC6=DB{>vgppF$ zQD+pmuIsWWz$lrN7|gIv4ZEmnuPy0~WnDgi!MtO}<-3^}cy(gbB9GKactiz>8j*OlCr?Ti4e&500^NzFvW z&rv66cqNzm{yfnvNtrzugczfOBC@A&o*-dh5uXbIOhw8q01)DQUNf@`_^EY~)}K9< z|0}JJTzg&`zKHVxLHly~;=eBklnZ~};cd*;^L+(OrK^U$eAX_`!j2tefMfzDn9+mI zt`)<;h>(D~;J^`33{31oG1!&e`it$4eCtYTUNaF@1jc}f0vQxgh!DN{@5z{7g^z$) zL=PTchQ)ag&}pppdK-bGlL|}$4MnnmNlqS&A|f!Vs!Ar89|Ayhxn{rH0-)YWZDvN~ zp?R-sOn#IzGXm9Z5il$#`3vlK<8s%2S*5Zb!Ih;7rv7`@3|>$W>$ z{NM;dWq~gFgJ4w=k*X-CDTff+W)6g*h+d9IU^EFu6jReYs0t4a>$(OqP?=2uz!12s zs???s%bfFU)*>P?H7POTa5zj&YX}aLdkw89idJ*eG)eM!I3h$9-z#RUfw?G(*tW3jH1Z|FHIVy|!*!dKmOPt@ZxCV~jc1+WWX%AI5e_ zL<+~Ti43-dkRpT#2!WLV5?q0VxIl_Q;)-j;6(2tUf$#;ONCboulvstG2$CRSJ2+)r zrsCM;s@PTjsJQGpr}o}!%{j)~dvC3A(RzR9+!b84kUVsBwD;O`%{j+-`$ua}dp?lf zDk9=Ow!LOq5fN^af^XKV>aY%==w?2YMKLoGBFo>HHxxoBlB`H9gyq~vo~~H<|FQd0 zfK>x+ufEJN1?y6Rk6wr5KknLjjVoyne<2N0lJO|@6N%dJ7GR#OB(5oKC( zMa*%+e3Kv~l6Yr6mlxCgb@rMkaGMtrfHnQ)G=!4W^|<>ws@@mxjO9{4pDSZ=G#n5( z1!g@bUcSDDiKhbIM`~b8DG*js1i}rA+8jB_TaJ2^NU>aG!{%=9+&w)4B4*ack$0iL zo9c>48~wEUpG$vONTj(vNspxBP(;3a`OM@{W)R5SLINbwZaM@-xFMj@j$_jbCCo!& z^bWuyN-62(P9_~i%uHpDNLp*h=qeJ1`~ALOYSN4ArPf-LWiNtS6_7Dn5)w#;*?#x6l_Z*|OhA>OrbaopNV+_HW_>~_4 z6Q#x)>no>-of;%Yw}?oGm-JPR^-8i&)&~q^Q;|H7ScihGv>1^hVcC|s+3Jb|Bvita zyRy~^Jiu%-xR4tFpbI4S3PU!A5N>rF-!BXZ(OPr(u-&fTTi->+AZe|Qb0f|@;BFK` zB@9WP_>xm1yCyA@wmZhqQnCch!MAGVu4(H=k+1|DgaDyZXl6%m*?n<{R9R`U27P72r-pvQOK*x|^Q4Bx-Jg-tj1d}`+y68QVza+uHu+F012UN|u^Y z{qJMM2vK<)_fiVnmQi47t@Yle=x{4rZDSn03nrj$(F0y|PjyWnW4}y;i{rRoE*DZi zzrGj(qm`}N7_YCdT5BZx!ja)xsj;}-E=L;{uEEir(p74}?)N(-Xleg~$z=)&4TBr_ z{CsPVL$&VLtsgDNN7w81rZR1L2n49Jct{&QGpltwj(e^3@$!g|4 z=706stbwVyPI`$foyI&OJdW4Ajwi5BaxA%C06jj?@{MqMplT9X)81BC!oj5-nP0C3AsJoBIFYA>nUM6saF>$!Vh}R5 zlkeWc{O43H1s!45-xuisGG0PhCT(@~&~OSJ>7h0`x#1WH$=m&HFGe6NnGIvEEHL9| z816_U)A7dl7ZEO(i+~5hCvbND8Y?Deap|&)0CFoJmY;z6nTJ9%N8i4?Xb=#hvo?^9e!&actB7WqC;iQ7Ps)(pa5rNMp&+{&i zfYuUYq$^XcZ?Ys`-U@jYr{Np}Q`^4Uwuq4W=7quOlO?5G0R)^LhR~{O&(k>wQ6;Xk1X{$ipC#elXK2G`Vlzo50NZUrc89Z$6UNpX3(sWh5T&dt5Sgev7XD+q}}U zF5d{iQnu_R(vQZyFXb=C7`xWN7|m6oA~u?}IPUk$?M4Z}wrxL--p5eoXtLLfyMO-t zO0pD(*89t6RqfqM*+{;=eopoGjOcG=3s&CEMVH}jwyE|+?A z3&O1b=tn;?vs&ca*Q1Eq>m90z@m#7)>b7l>K@E^n zr)F%7FH*NDr;IXT3tyh5K@ei2t&=Tn$a0v9j62R*C&?^3&@g;d(X>?COFh~{M2Mgx z)$+QEEq9m5gyh|GeR>!y&CYUPjNX$tn-n+&hmA31^{T4O&?&Gx6xzKj=za8IDk&nE zIurdmiSQCQG2l0;^g9Nc2*(=7Nh!y1zh0k$a6bT~BU0TrGfN9kl2VGU zU>*U>R^btWcC>B3W{uNUCM3x*+FrNgIJ9W~$+m5(nz3hDRk!wV$Jbwf{qpjXlbPPT z7DBYBTrRh7zWJtbP6;Ma7|6`E+wDg3)2C1H*!F9C9A+k36Y;4+3n$on7nyN}?r=nE z?N2a%3>#wUgw z66_sg^l=Ewwp~)fkzw6@H^czKhq=3yqLlD>yxwy$i-`H#=!|K?Y(~O8C&l7pDWZP6 z*B2F|*1MDqmi|!@5gf4$;Rj=`s)TS(7*F8=qm;A8pWZiIHa#AQ$WA4{aVaGM)N~^v z(Oaf+W$RlqK4I=s5u3NEB-_aiIo^;Yh%;<_PmPgvNmj!ulHtY3EcIFYYPtk@(0V&> z_rUaIKPzCq3vWy;Eo)rWWHYOXEQ%okx&a&*Zzg1!m6~999y)GWA<{kj3xF?j*G_y?$12LeIS}_)-y9aes1?Zmn3Jdp&oS3+K2e{P|%e5iDxnaJeHd+c%H!V_j zk)F}Y5hFZ6P;0ETQicxi$>m}|SdZhVQbnZ40YGc%mI5YETT>r1n=V<%?k<>KWf4)f ziteNPYVXV}D5t=X$ayuV^)#ttjLYRxL`b;X#FnV=Jc*$cC`6|JONwWeBAl{=0jv4_ zlo7FsI*=DeKGWfbK6y5nn1p9P+TjRhoe>f0fimAqT61YFlWa$1DpFxcEGdCI&V+h^ zRQgm*X07Q&Iu%nE+4^0eJjp^G;b~S!PL~8MM%~%Vo)xFeWT*tvW-#Nr`WY+h(Y_2B z%__$u1h_w5&Y7KAw-~}A;;NTSg&Ap_CIP@QZCG7O@fdc*<+>fmp;|AOOA2V*y|s3^ zUAHo+fu$6YvhP=OtSq!)W_2&Bs%E#_<>lp`LQYYwWp`N1kj$JU?%Of?^}4lVqzJjz zJrCl2yY41RdAM&{8VB8ng-5#Hj!pLVIJA_aDaM4ysH!6T^y$;S@5jAC7#_FFle=fS z>Cq1y;=KDXEyuA0Vp40B%~#~7pT+ezsr+^uJA5yI@#YP}StM~v3?eZSvdYpqFeFZ<<7 z)<%TAkJmbHGEUD(7w8xk^eD=h@=(?i;j%L8R*e-3nh$u-tImh@=-2Btm&#V)n8wL@ zG%1Vq0nCY=*%-d`g=8?px?(iOggyj}ZQH_pmL@H$hQ{M-6cwbII;8+t+nGg%2s_C$uLiSSn5QNM<;wB!ui$L zAFL0v7{lP9EbTb9Qqw@U_r7hH{D|^dz@y&}sw6~JM5Bs1hFKc!e*XMfsJ)MLh6bG? zqxE~lzVEM(N0nM?hG5B7Ydel2^|(K>E?0_2S}bTLIH+oS93tYxW!ufnx(yBySRV+> z6bYgn$C2?x0wRoYM&GRSlM*sL9LVq(rKjOgk4J2^f@Fv?Vpw8a7Oqf3 z-UQh*%!@vM@Gb=^WV(A2mgVd+$IR+w#O1OjR5v*TRaN(svS}7;Xg)oO3GCapUn+c> zNekI}%i1QfjT3##r=M<>z#P__87J!*0J82Rk&SojV+}?B;rWb`9PQyE-AuKLNK37m zu-2MYznzpvk6gz#?b+uRJ%25d%MIXdYLmB7t z?F}4eP9+3H_%h_mV?9yv0Mfo8&w~XTS=KuF6HYh{t0nqPe|WA?X6$;3n#DbQ^tV|O z;R2n^$Z!fg21Q9!skZD|rB3ntJhFQOaf`R11>EIZFhNVeU?4Ng|zFgr$w*yo@DCZhPs60dE{KTM5_Mx-GIn zeE9Go!T^o1X6GUbp3INaKJwWs==!;bWL>7qCf6hE3 zA?6+jfY7%w-`Tw8;uPU@3qIqd0BSn&PaxBMaJ9b(nbc(J-1eNEE`+JVG&5+>0}V_vBq$eZKKjLnmHR8)Jn+tY`HG$OcP>ip@+SLtic z<-F{-+>au19LMGMG{$&(sweR=CFco&YuVDyaKNHBK$J3CFZB}3dwAQnX>lTW`Fs$# zY+IDt9!J1xDU?Y=2cS}Rm0`}J7-PHEmxsB5kn4VVdF??|(cXK|(;y;^sZKT6r$ z-5n8LYaIrH$MFy-20R$uORa7ONbkp9x9fhp9}fnqmWU{|CW+A9i)d>D8$2+T){JS) zp2q1)f~v(WWwdhimS|a)BP23yv%TuJ3cr&^qR^j0VymZgTf zi^mlNofGd*Vk8788s4_qymT(>kW_~UhXe> z_4?g!*Qbc+y^GHL-uwNYt-=Xqy`ASG=e|3Z=iqv428POP5xIte`B~+c`7{b8#m#~i zs`Oz>M7WQh^&|=Rk%j=6CVhR|ikSfv;q=4=lw#q@N>EiN`0k#K{C^LR*mU}Mq*o|N zDeA*4+?v%|8Mr+^sXp4{@ZJHoV`TCA{QUeIKl;&rxv1#yzFqdmy&ec#G(8@*|npnf2>Qa-l^Gm;sxkt-@2oufbYeb4YesxKrd!Z#T8K%ZRsthHyYV-2JrtoRKbXhB*M7E`B;d zsko4$dByZ&KuBTLI;II}WOEjng4&2U+7M9$YAK?r1p@HCtV%1G0A?~yu2owUL{-Vn z-h1EnD#|g2e$fT;WyRlcK6z$swZ3yK z7q=vNP&0#vT$5Xq1+~^3KgGN691-E9fMlj?M$F+F01|oY#}fJ4jKgDqP}Xws z;}~OHwwtOhWd`z>AH!fi^JDVUGoLj>J{pf?-l>5ip130=+Q?#v^Y-Gy`tfMjTFbsg zvShMyR|ywcQ-Jh_NDESNP^iK&Mk?n(-|P1B`Vh^!%`>5P?rKP)bnX)g(BztV0H|7q zzgbrRk|M!jtshNQdrbLORef_oTWx3#?$3f-buOw>3YS19uj+(?JR$;S*&0n!FUibp znkh|hlw%^W1Ciw2ebp z=!qT3;*y?o|74Mq6eQ4H)h|Uxp>Q7o z)FO|^qm&}5h&{+`s8@ zZyk+P^C2?#T|UaBf<(C6=v@G4E$JjxYD`lC!pGfWvNJ@=aWqKz^!eLN3%p$R$Kw$b zjVlgmV_YuVXs!3Q)f55bC?JxW$y#<^-MS^yBWn?|Zt6ZgADiBN{yJib-!%xp5+37FgLS(k(J|}H(7qv`(8;h3@(U4tyMDm$cSykI8hR^ z*z&-Rh@}5MJw2J(Rx&dM)u&asfRA>VS<1h1_@I<~dz{d3-Xp0XNko&JG%f%Bwu*?n z-KPiH;y<|iaU9Rjw-LjPqU$VL`^AktzDlbXi7_& zze7e*2)OT80B!UHYo(}4r4EV&_6EK3RHG%flnyTLK_piVHx|H(i^XCZmW_ej# z3;@^X=i~mG_ijW$SV-y)iPqY6zmTvoRCfz6TP5j(7`E-(qYXeN3_OO7;bY8;TfDBP zkZ+&UQp3~tt<-uv9+0RiDNe7ow)Utp6JECMVx#Yu{q^;=);f+xQj5%k1d%@V*(0X= zz}eNWqf%?F0TW68zNuY1IU(uFMj@#XNxej}_s-)NDXIKguO!&-9rGm5E{ ztVff6H_JhH-?oBvyJ#(DCM;70Nf)h&lNA(V@5$rNgFa(e*SIl&B(jhTB*;PPj3#)O zg!yiNibxwBgp_)|sgq1Ykzt`*-A@XR6rpsFskM)QWb!HA_s69a1}uh8KU-p2H@~q- z3{X*X-}k+0xm+&!c{14>KJouhiEt6sTm(fEGtcEkfY5$Sx?#SzB(pmLHdKq5RZ#`K zxYTOqDl)>eur@RCU>5X990l1DWk8rMlc4;ygQ(kDa~`COaqO2WX-U{SfPLR>=JT$W z&O@qHYG5SWFdLPunD>3Zzf4DoEcVvtfc3EEKPR6Fz|+%{`_Q~ue4-1n7`khtPWp~6 zP~X=}M8e;rV3Y_0V=sn<+NVZvyc3PhXPuq3@03}4^}M`KTnAWLc3%X3 zA#D^y5v~=&fVb`tVQlqcX7KP~h8ELV{h-9?cZ9{TF}!S>;~0-uk#f0QT6;tWqi>gN z;$L51yGR-u5Dl9*?y6&5<-B%vwH<%k`q>T2=Ma%PW}<(IJ41e%t4V@Um4EJ^f|NwrjlS8frw0(Jz+Fp_>rS;=W)`o~Y9?eEL zQA)Zf%-}>{Fap<(()t!c--9m`x#oL_n$3(AY^D zdccGw_4re*NIgxI-_*zMB=@>mIQq!>Z#J>r#`SvjVM0lR-gFkcUauKtB1K@GRj)F$D?H(EF!J7&tqJ# z*QeXa73P5vond%GPydS`>Wr$^ zQ^rBYvQ-jMM-s}t2UIB`A@DGevQ?A9?-9bjkN?W{z|VM}fRQf3u_&(aGP(6zq#c%yZniKKrC3hQsM+ zTx>I=gd;4x);co`NifA|nJX~G^+B}Oo&XVP$AG?NaQSqQnbXhQy7`v1a3C^wJ}=I; zn({LJ`Ihcp7#^aUqFz!8g=LPsNAfI1vnNUy0Ic#_7Y>mXOc9O6z6F377V)(2$Gx46 zxOvYOYW{Qt$<|saV(%O-Ca@8@e5K}Eg781&5s~D`sf9WfiwFlp5y^y$)YLG&oa}w6tn?I#T7ZJuH#Y@b#aD9DqBW0R3d2^&0P)C4Mfh(m5vT1xbIwT2mN>VW3 zA*Gb~GW(wB%~Ba!_EU*G#-o(Y`jMVB9;4PO0jc%=`Z`)XKWVA8xpOU&^liWb0P4Pt z-qOvth?-gY2aCvM+m8d*dYadm+c?_uhp&2jnAzigzds&Nx0|;^Y5|ZFz+uCKwbs_g zb-x|0h5NQ`!6Mr}#@H_VarAB59>+lu?{|dMeQW(e;Z};fMfg&G0g&)x3=rv!;YGII zj}_lFiDjioYsX&GiBR1JYf-JOwV?0&9_COz+DKE$Qi?^$N*?OHkA9po3kmpWNn1ygjBSGx+`Z166Sk3fv=n=FleWjW6>V zy&nh3?Rw#Qr2+;%-5*a#UR6b|>w=ea-(k5Ss=U?2u?TaT(net{?mHke^-kAUdW17D zik8C7yqotdvyL%JDY7y|L}av<A3l7rqm411Z`aSSFRB{mDdkQz5`d4lr_>u_$=%E>$KNlH`@Yv>95JG~UvE1+ z+UOB+DSI+5BC>UiymV{~QFV*(K~l?P58p1=mzPff#_$xkMa0w7)BXNpW(ZFj8yIG` zh_&;i&!-6UIPt0FFjI=a2BzAX3dZQ5n>+F>4W9_2WJ5m8d-$8R3q^$5ECVTu2+T|Z zhKYt^wObLPN`?`@RQ`p#r}Jap^+L%^ENHCRB+r||PkSHIM(Ue+R>srQM5>rb3O@)5 z=HYjp6F!s#f{%v1hm`$(2#RnfD5+nsvv^1Cd(&fqgD}6@vokEfnH!pj^HB<&Pa}iNH-HHXXP=Q-FN>g&c0yc(~wz0d>Q13NXqBuS+*)& zp_m&Wb6HAIDBxE2>|d9bJP8sYG|Z2qt(!YYk#HlzT@db}WlQdaiX6+KP*cL1rDV

w!XwrDr4-tTRhUXTyoFOmVrGBFzDTbWj2?n|WY) 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%0D}cnV&TVb{CU#+JgQY>XwWB&mAb1}{+!QA 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𝔓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 +s9es%vRNd#=OWok;2-h3has>GphNvzrI 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
    TDea{yJU5&}!y>7hUJI)04U6gfwI4n73 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�E9i@49{zOSI+A3*`!Uu`^3EpSFrU~KU|EEb6M(=>dEHb-e=6@H;#*<+MaZEoD5*AxT@&YC>u0;{?v}v; zdRmgE|@ ztgrs0M@+tuvSrUEP5OoJe%m(QhATgK4jnC#I!iTsyhRX)`e|3$I-4ohp z`9DjAJJ#mO!-BShV#HOk?)0=YdRqgrLTthrxf+&g9MD(?zN}#WaVs@7?GoH}s;bDC zBz^Wzr&}%;8?t}S{to-u>nhmC4w^emmXb`O68n?Ur@%R6Qvm}q6@{$T@S6{gkh{aGz;yKp?^l!0^Wb&Dwn%)F%_fOE8C_#xwzz9VI#L&7 zOKT=K^Wo9n7#U32LwAqsVvFh_ah(S{r|PveB3z|{tqXN^_$f4zrA_u6~(x(P$Uf|&V@J0=V5mUq0k2dRvm1QSa&M3R-o}e||iKS?L3#6gxN^24^7U zuv$Sa`GX;0@BY7JT@U&jcA2Sqkyfu9OF|pTGnBgup71dO#u3|wW&#{;HrmYJi z$T$2Bot@ww+5U^`v+QfTf+}E|e*a#fy}6K$9tM+1=78h2mH8&* z%^R?2*wpa7y0NBatC9G3KdZADY>en3<#*HSHUfy0>jQO2JQUh%@FqpB=}$;Kw1ygD zlGIThOTePPt%za{!CKE=2_pEyKyVSj|92lnA92*nshS9mAld294r7^J>fV&g2Y{uJ z>HtB8I)lgetNLmji{?S7{OOE%+P>HM*?F`ADzIQ-=lojnMe#UDy{QU8HWlYgQT^50 z%>>hnv2w#aB*p@3)ojmf^06SnU!wV%&gIFohT|$LKkt=sN8?+EzSX2);?3vDzsGUU2m3BuHNsC+rdIFMipv^YHQMDHKAM?hGgYlhY9m zotnG6RA3dx`bQe3$D}Y{MpOCO8<(HQ=5fIevDc8mhcm75-M~3!QWBUY)ZFa~t-=s# z)8rP#vr0%pF65pe^07b~StUXalWi66*4f2kwAxPWq^r$Hcx7@=p~s+%#+8)df$-Wz zfiU`iU$lZby|fB#oDrbfKQ%QKbhahUte{!8a66XTT>In4-$t4GpLXS^cDwtP&1$#+ z@@|5--me`c_xdlY1B!28@4>4$Q;nT>xGUrk?7Ocl1{I9XEX?WyhN85z*HESyfW!c0 z^L2_uwz?&VAn^20(1#S~5$`LR!?`1i=LY_oF+Fk?KJJ~NDEZMyjdhramVlT-xP4wB zk%5G8UxDy~TGzJ$V=~^(1wHN&^oCFAl?-ONU<4#Q$f6!bWC};P0uEK1yJ-RztJ^~= zLZq@D@mp@vyIeAp(?~L?l|Ge1Rr7b-4p9m<_IuF7y+D16JY;N?nTcRpqlXG*h-UYM zwL(eu{xfcQ2!tP;Z0rt-X_Ec;XqE&bNDYH zbPFm}P5z=P3F)&H(FJP-B)J z)CYpC?WQIvL2FN|4WK>gdmZeQ@$IrN$ZQKV9QrsuupjaOwIG)EARsW+WBMZbD8n*M zi~*H%xO#8wH*rHlL+0q_C3v2DqgpPGjzwJ-vU79!vOzG4CBbSItPdlAx-?&p64wP< zm*uRbmDTpafoovk>0%Q;n5!MMmgw&SsV84eZ~+LIJ`X@G-AW*o`rRftBJ=;EFikDz z^eq_C@T~=O6YzgKIy!pUL_Njb_ieuLOAz6N#K}zr;razroWdNQZ;_9xdCI(+WWBrp znX!}#N63!(B}A4Ie4@JI#HPW=M(XLk1^#kK}StzjtlSM zhOB3CA4x_hCXPQawS-!{u!Kby*yFutCFabT^>rz?lB;HeRYmu*gxG9lbH5k*2*>p` zrm>K(pMM0z#E48!x&{Br><8cMi9b6VdRF3cJyqW?eJwmHWG?R{dh!59p)h*$$Gl~U z14i``4zUr`0e5zQ^qTlE@T$bWG*kIA>9@~3{l728BU$<$ws`O?@=t=Jz<`_}X zno+@^0xVA|Ew0iYog_sISO)7zF3~}fN64tdWV`atrK<^{+ezb)MFZj~a$2*>U=N1w zMSm=1dQwtlO7Xi-jX{_k-sd{GbjsuPKSyD3n+@7Hbc|va)}&0V`iQS&H};ndJg>n} zY{e3IxC-f~6xwMiPl-;qji|It8>P8;Sbyj^TwSduC@S}=m#A;4pWgQ}0p(S2jhzYr zBvon5SR{~uvOxeHQL3zh5CczehdMgoicy=wzmC1dBChh>xRd{q(})OdKz>KUYwf-a zLTxWGO1xr{E9G`N% zbXcQmaxo4hIgA3jMf9~)_(+l(mCc9zQW2{;+uozc!gFjcNJ}i{&?-@UpKyoPW)_rS zty8xW1v7t0-qXFx$A!SYO|gsgDOzk1S>q4$gKc`d7qz}ChAm4=em4i;>@hzd+pzF& zf4=@XDk7h=KfuXp!xh7#t_H3S(UVHCOic&v!~m3r#48x>>H-e(cF4!`iYC{Gs&xMN z9GV$f5{SdU2cM^RJ*^Emx|Nh(< zb^oxfQQM@g#O_$;;lb~Onqhqa;swwFn2FpgEuQxu82sV2DUch!pp`95yU7J{%YHrj zJ5T>>-Rb##_V~%_Yt%zif>AEO#t{g^9LHas{;%#c=)=l#2*>Grd)$%CRyp1C?@HPFh%15 z0Z(2Cw+^Lq9r=Vy_cGPS0~_L_O3zGN9QPY>{^g-IBV=H3@V|s;?^()IGf!5{z=t4^ zU3%2L{r7y}6%42l)(v;q4Kt@F`Y5aFo{rhdNln~2`r6W?$7T_w$&vQ*`tBD8J%l0J z8airIT=)-?*ZNKUH=TwKqn13@$(|(tv+|^mp-5BCBn?(N2Q|y`I=hV0Hp0=cC-y(} zI{i^)w*&uo1a3h{-V^kD>%p^}$fg;xee`y1ELmw@vGVme!q#o48%Kj2b8@{X1*%URz%-@y9Dr7I*BTpVd%_e}JR$Njsvgk7x?#~Tsn3P;jIOLw{b!&pL z+&ss`b{BKJe?21vCO_p*8}G@PMJ3`1Ret4R{dvQa9r%u?7P{2WD`*-v`nXB3qkco06kOt_$1^|PkXU2#@NV-GNX!P&jzd@F0C2tE-E^rSOKG4>-NQOBeL;sg3 z_71xCzPZ5cSDvZI1gzYFw>~giX+OaW=JzF-B+lr2p!-!$NBUe^8y=3GP5`r2hQIX4 z(Ko9s!Lf!YJ}r2SW1hS}>D$Bh#TQ2&Vg_X3)@{dlLhQeV`9U^Mu#@k;F*g4-R=u>rQ|F{yodx z%~GEs;`^#_Mg*|i{Xui*i$Ql@_2*GRt`tTC-Ol1}4&q27>_94}Q5qe|jbB2g!D5iI zFtx5Up8nEOC8!)hwh8Nvpq3|*wHX`K1yc7c?S*Ebtn9l1JNygYtltn!4vV%#p(AjueC&Qhy^FmtBtPg{c z`Q;-cuXlSOPt7J=N>Hqk{Gfne%9mO8335le+z;zRoTf02EEfSowL6^UecutaeCRJ^ z)TDFkIJZ3iNtD&5o0-ev?A7)#+R&kho}(mH$S9KK^3}p|o`XY_dyE`O!aq3Y3z1Sp z7?NMv@~Z_I#E+xNrt^T{WDBmTEoKw`Wv9DqpzvHS`h)y4K^TSH;PUnp78s-qJL7dM zB-nykA)Z^+;V}y}2sHRMEPQ9@jd)Mn^UXW|i<;iuy!sf~9y&O@J4ecvq=@jDMZEC0 zl+OUQ}Q4IKHVI%=lQ3cpNr3!kYGgoQ;AO}i&YA8ZC`1^O^ z*iXPi^J-{1y%2yjo=&~#g5%>Wfp5!~BW2(>9RX@WHP8G4Ev|B=6H7zAzbgoE3#%0f zZ=Y+##;7m0_&WGHonBnjPVZKohqNu?bPWh_EI(~#doQde zbGF&7q`$}1-+@={NB*Hy@V}m<7baIbyXEbJ|iN z_-jr~T0}sH^j#ir?Q}JT>_OcfNq4%PkWUo|rA~Vz7FdYVv)A%uenxV0QO3JVbY1#Hsu61j~eSeMe1!GksRT2UpeU?q|^z93WS>AkOo4&ke z492Pzp%S0h7@awi;{RpcQo^*yl6#@cv zi|cW;pAZRctn1`(3i)&FwUO)H+l9QGl_r)q5HWbP0k*Z3;q0ZUwDGFtJapU~U6g>@_6HQnC z_76d|41yv~A{}pD;!52&lp|U&C2_7ZuC=F94N?lPI{l8Ts}B|%jyeQf z_b1Ip!ihoEu}frUpq7yQap~_VZFTgafs_H4W=l0s*`J<|$?v%|D6#l`av}Bu3b>CP z@A=`?k$C!N$H7W_{+;Sx*i$O7<_s69K7q)dzG^-_7tHOY4OgZR{i-78NbX|I!Y_BX z@csRqDiOMzWFb`#kASSt+lQm0K(L=?CZS5v1quOh<3L0O)aNe(N7mL3_yr+C$VS$--Nezi73zxN)=-A43dfYe(_ z{!O@Y6}rOUwW4x@C93$=U*3@@8Z$+P{nj3WX+zyho_O#SkG$)I1A%xDk#zs#6kIcl zI_%rMyma+483x5yf2%*W%ARr>=Xg=B^Qb>mB!l$4L+CK`GsT>E*5y1?mJ$+@poxN& z-QZ4OQr}~G3J>t0w069Pv1aXjzM}9}OJ} zZ3vqo5D39upkRXR;Re{wVO<3!#j?q{`S}I_UP+0LY(G`Mu2M5xF}a@EHNHTfFCoD8 zP+xVx#lgzxsHVsxUc+YB03RQZZ_|zq!#arXx_ zOE|=BQvHG)SbEpbzUUWRnqT}Ga5)DwwkSOPp+?TgCt%4`m@{u;o&w5dejj&=MFjw#ZidN*n7r146zP!Bnx@{my{T&M~}rCLQqRAL@=emH=R#z%qN)1HEN}t zpl+lM6w4R=wn+~F3IP;x6vKFNSPC-`Izh;?)U*5K6aNad(M?58>Zd%|#>()F*%D{v z3u8R2yfLe)=yek5QNb51tq@$?!w`N#T-=;NXR$5v2N3N`%B;J!QI{i=unz>yUdfa= z-@BAaW3azTSWw;B$Ls9D72{wjnDoq#3+7NjLq|K!0|&3i8kAUHYvsk%mfjUUlEZ0l z6?E$BNa*AWHKjTg37yoz#xgDb#+*Qa%O1-m{}(-Iga_$@H(T=K#lvOq6hBtT!MTWr zAgA;gV!Pp{t>lDAu+miN^MR=OU4$I#{aW=;pVIXlq?Gkj+=Q$vkUdcbj1n{?8G}W* zQp+Q7H6z&Xc_b|GJ#JS>e}v&PMhj9Re*RB1xPcQi=BHnVRWVf3XFm#WrP$iG7Je5bh9*nu$stbFQWB@#BJNqJm(P)NcdCp zI(j`V&qdGXE-WlOgwZR34KA?8j2FVwADaCQNWOnA2l2_68n6E~C}?J7Wg(RdMnT5P zvsnxr%sN8~3KSa-Z}CwTUwP~j?m+4Hrv~5DGs*Z;%v$<_eIBzsKe@Cpl-|!gPqJp)dC+^ACiH{Y6ELZe<`}VzURNL&ObIQhmd3?$ywHFgg5_9w1?E!#Z zma43AMli_)O*lTZD@#w-uYnHp4g9A9tVXC8uQlba&yJ0aUGhuTc+; z4;IAm8j1m79c0VTm@g_ZnKEd9#I6fwY`XcVK<26dAbixlErWaVOAGRfxfYllCW=v!V7;e^1U9dP1;D$Z1W`Xg=AnkvQy6aQY!mwRQ zIdC8le-muNnrBc-K1wfvvbb#biiF<^@GZlXEkT|6ttQ=010l&tcQ<$*SpQ40S2C=l zCwfa+Z0|$(a-2B63X;bY`EoJx<#0nnFpA;2 z1`2t~yH1NcR(Byp?)kyoZ#BM>JTy1Gn^xw-%VEXP4YG<>UAfXKfp4_=q0sQ6yQPZ1 zFQsva%UVCAFIbB89ZUX^8m<_ay$ndGvhd1DKUOK4#^Y&~pA01MW68O%YD!&=FYQ{# zSi{|Cs1h|KPQh;~NswoTO9l(w5hF~0rFU<`-g06u9#TC~h1S1i<(KA+(aM&N5T1^F zZt~?*%@myl_%}AUAfb`HM@Yv)YzrAxB%Dyj2u0bvm218|)2)>DCe;LO0nm6%NlBS{ zt;;OqJGM9@29nE%hi-GW!jag}>FH@;KaY-%jvXEO2);7w$zDJMmsrN{+iAK+U}kgy zAn`;iCa$>ts5wrKcHc@(N%>lM=t?oW-iB6+7IvhR~N*~c%y}9u4IQk;dAR^YxSikwyz3e&`l~$W9``Y>$Tv#?5vxnHcwY!bI zrRl)MYOA4{@^2^j`gY^CYKZ4Emz|vjRB{xDyRK1sV#5MHy<}C7~s65 zlqUC=-6>~;K7Q59gfn?x)}EKfl%=qDXQxy^k+sSX=jHr6TNdGRc8jROFY6g1rgHK= z9FVCwHkB;*@7SL_nBEj5e6?(yP)_hu#+Hs*OF-8Q;KJxg@KSk=K(<@z=~MeUI^P_` zbvvS@^lIu)oD;oROK?5V-4HHfdn&ywB{oBhczoRQ4AP)G=5T*}J&H7UKqrj7mYLtT2*tao#*jt}GB)LJ~aE)31t*>p?`)8}Kp1g$ddrG`JI-KQeI-wD)v3V0k&>6cNWi zjKjx=Qs|g+Do&{JWJCTc=slSwXYq)WDOi=;xG`g_*e=P5`MZ-Q$QE20JCS-=ZhSf( z0u>MxiGU3kb`AT*E9z^p#s5E!&N`az|BvHW_qbwuxVpQW%XCdM-EBIiZCAJHHm0Y> zFk_f*HaXofJ#75m-`_d@aGdL$>-v1&pI1Dek7q*XjU#c~A20x!^p6;XROJv=DawYu zMADA`IFL0FvNMzB62&s`hA;Hxnc?vm0%3znt6xHbz`(wx4tJD&ajF8R-w+tk%FxI5 zb&rLz5HimP(O{NtMC>QihE$A?UGmTUDrq0QJM5K&6QEkt`-qWboV|KFp%#=Z(y#U} z%z=ea_LN#zzpidW>|Wuj!m#sZ*uU0mSa)~%BQmwjeoPeYOzcY?UdDq^ry0}) zxl04Xxd$Q~hy%PS69O@_HAXWWG(7Ez#IS)7J?q4fpRdj}YgH<%DjaO^ zv=LDLvG}SG)wOfS_RJtz9A#&+v4vy8+a75$E144OD~^_t6UREzSMgKXYF*_YcyW93 z@iTBnbqOy}M^+8-zM^W2NtDm0;upV;iRtvvzGG1E#YNBft{k>Tt)|WZM1wzWx>>Lz zw-lOL-3oT$gGcc(m{BnGNK6CUj@Wp`6kA`PoU9tpBkTS$TCE?%0aK?Xu?%<|1q)=G z{YHG{egkB_jM}(io{I#h=_etmu4QH)8S}#Vu1d5{iVskD`lFck=}4 zvTxUmUPgr0Xtu7nRXE0Kl|Tps{RVF78durX2&{}@uf`c2k3>=HeC(9phGh0vx6m_K z%E+9OMgEQr(c0hCcEy_0H>5P!{m>8$LsV_ey*(;>AX*4Wf*@tob3CReFv2f;%jk?~ zn-yVPiD0Uj;khMCfTzLS6w-gDHeQ*qF(fkcR3%XMliM$i8E*+P4W=}X5yfwG{C;Bj zfHP;8Dz=_B^8mJmM=s>w&%m-_BIM)(+*wp0dol71l!TxqTfm5kh(NSFd#W~(HNNg)Q)h{)H9fG_z#+`kF_yi@pEuc9n?Y z-{DMJ{tCB5TQou_)=mrz0!kS)&d+|bKSyaRsGobbU%@^X$=Vl){~Hy~G`(w}`2xbD z1eeuGc@6n$W!-tx+h?Xme94;f)j1enE3;fAN!bNTj^|HDh&1V-hKOO|j+>-diV9q} z&*fa}x_nz&TU!ep8$A{>a3gKI&0q=g@v*TO3&MU#@_#lX&@Y=C8h(C#f5I$%JAZvG z1Od!91|c?TwE?5jDF>mYf2+#riq0d>Z!s`HVx>*+`taP1^q;l6jB1wVj;6@uZU9j>SKlHxRZsjA|9 ze+#7j!u zIOJ!03T1nLKJM!3>b@0z+@bkb8v18%Pl;?ZE4G9d`MPi1$eHtJTIpu@^^b?eBH_-v z^O48>!aE{B&HHt`KM~BQ{$gbdxEp{GBCxCA<^hz%tM@^EG{m;^hgSrieA#`THM2u3 zv9m?0jKj_dt*@-NhV-JaN?#th06KZ^LwI;C3vC(JPqxW=v#=uG3^e*Mu{{`M;KN?^ z;yF?j89AFCt``dmn53TJMW#%^%!g#cV5 z^$nN6%gsPSSs{m6VI9+2C^KZzt>vZB$?37|_Wis`G$TDNf&~6N8GgO}&K%u)fY5(n zkQN&j!yhJY2%Q-Y_>9HX` zn@J(U-#aFZy*&8|C9|ZV#YLS+M3FlRo9vLgiEre9s*(F_RnLc5_ZJ( z{^NEQkI}jm~j_?d+-m;)>baAWtJ`qrYXhATIkW=IA!=4mhzqu?{ zR8iK_CXA#*K~KSz%@deYmDMuO=8T>smIyipg*t9!nbM$bG2JmMH5C?*SPvPhHZD1g zQ0A1{m`DMNnw92I_1;UY6~kf-ebzDr?Vw4A&wGae+H~%hOweMiI8o$)nL^@8Hz->D z_G!wbA5Sa{zvTUwhr=er7{K13Oc>bwo+Lc(-kPHh1N1D1vE>b&P=V3!X`}@mUm9D_ zuH64Nw)ox*T{BBx?7N3-t^i=-W@%*0l~>17khrF=Ft=%^_xAZphacMda=T=A124}P$(fR^;M+fm!XlKr6%;RE-osS&ohLb>1{vhxA^VYH zrA1J5e$LyN2w-w<2fx%Hn=bj&49Lh_*bT#c1i7czNO84Tw@~^z4 zs%TwsA%sT!*d04UMTOKRj5Icb#0W)?@qSOjs-5txF4@g|oIp*X0hXwjPE@7^F_?tO zfQ5wIJRi6|iLVmz>x_dx9P>YzGr+-W6L*1qn6Ue*gov28*}&$R#pGd<2G`5aHu3F2 zH*UlVh!CDVNze;gx}7x({}c%gI9+qj^}2|gkiG$)zhmlW;KYfGoB|F2Z%fZJP#oq8 zv<+JKzD=UZtm_OuKClshHIGUNi{G4&aJ##@GAbhv!W!DzFd+$J7YBy#Y{?a-n5E9J zd>_{S{05N}0iNrBE`JUH@Tl@9ur%Kp)33hj#hIYK*5InI1rN))Ifc{p|72^K8MX^2 z&2Pm!{H{;H``g>-9|1&ce(?*y$x4Hu01}X^z((Vx`M>FRT{0CcoH+?&Vk56Rc+9|E%vU`&Hv9jsR>a>ne46}lh9zkqDJ{F9T_YoNRV!IxRLaUcwy zP&g~V7la7Aglw~$gJ_MZdrkPab*irTvRR7uI6^vF}xlK%LH{lgGB zr8i2v-sb#*k;me>$AW2u0+!f%drDC+<`bZ}WKf#G;}Did94-6pS>ijk0h}^qcqZiS zK8e0SCxqG1Im6d(h|GFt=kvGqNl~tqGO=!m!?ylly%s^WjE&`*U6W(!-g+d)K{irh zz|wEdomH}?k00rZun06A5Hdsu2$HCyg#l<7J2tNpZZEB(3Au^&pAWB^V`tgpEim(m z?3kPrU}HI2UiPafruWYlku2!LW$ur zOuDx<_N9?}76&itqtgS5lBASNJ+?{yVnHH`^;~k^hv8BkEMrAJK1c11XBghiL(gb{ z(V^}V67*H;aFT}@b#D4#Lr4Dg zQ(HYrpKs`Rv@oIAFf^IwG=+S0T$+^Me})@pJ2_=U)wL@pxM6z=){!v3Fc}MmWCMld zEKy}bZYx$R?s5xa#`!D(b;)=0eaL&S9o0~aH_Dk(U;WhD7!(y|#lc%n9whrV{%+L> zJ70hHnu5VV3|6%XlPs6|MIkIWfWU|o<8KLk+2GqP6Em9wZM8KT@H9=gRksivNVokk z9mUj`BMK+>HDl=`ghyE^kWDct6Q++Fo=d21M#)kNlBRs5dkP~?QX;7MFcG`Feb8m( zY$WrOR3Tg!>QU`)*2ixxL&XZOg3r3Vhtg5tXuS`!`8JnB((1pdTbIcmKHqpisBvFSj3srLP~xmH>}61`n#;EuEvr#NGLu3izt67S(((1t(NR~>jhX*?IY8Mw_S4*3hi;9pm;@A1mevS1zR5-k zr?-~OM9v$CIdNLOe~VAE+8t^Rf9UW2vkS4Qof8EYTrR`V=n?oh!O$E?XH8!k8EjvO zB%1rLqrn1!0#ZCbaay&J1Gogh1QTSY16#XdDbOZ>W&VI?XGcf%hjNY)pl1AUO7+wr z-RfhTz@vM}&c*I{KFC&Rg#ysC)gN4aQzPPNB8{2mS6qOhQ`a!R6Oiar$PipbK@mo8 z?S12O^jdqs6Bn*bOmegkpl>>Kub7${Fg|Jqr#@qe1=V#L0|*%=GE#*QE2Ol{x_wG| z@+95J|Kabg#02oF%t2-QWb5mxyN4T5X<^mmW-X0(wCUE|8=Qp2bn^Kc%*v@iNtUno zbJj%Lf?oIXGP%4&^YzY*(>LX0qgfKJ5goXZk)a0^H)86II>m=Z-jr0=ni!O9Rn(MD zZl9HaQzTT0Eh**_7Cx921jmlkRu--<8%SD}(TU1DiUTWZn>aj7l30W4|)}q7usbI$R0CGI7BY z3(Bsb)|+`U+{?fW6k3@x4S1Lui~JMspV$?;dljDzV%?!(v^ZGlR4{VO#2HMZ;bqb5 zuXQ;L`egas-#BWM4bapt0bjmF>+KEV%>vlRgcU#_dcA1ID%I+pw5FC0aYckKa0kw{ z*~xoyht1K07D||m_qc*~;B~bEYPeE=L_SYZv49(ab~Y*K)$H7~1#1vCEw6|qO21u12?UJbG&N{txYh;cD{ig1`D zh-Bnw$0d;{zd$XTD(6O(l{_af${2=OG^VfzXOlV%62f$1j*LWq&5J${TO;SxFqMUm z%0b}i?Y)h3u$A4-5<8zuQGur5#MHK8FdL??Z>u5#V;Z$}-^jLcWG65cL{N2hZxJFp`z7hK6km z93kUdXjSO78S@Z0Ei3F+&=SO;E0MTqX*Mp_+H;5X9Zd@`!fIXhAedl4S+I*KxYz+c zSX>z(Wd`@uVy*b61YTfIC!H|=vlfY85Oi`2#E-$#&J*6xTqTuf?2LBi7r%XbEs)xr zdeQW5@T(19fQLH*K5ARei4FN0g`G~HqH!7cx~keh-4Zg}sjrOLCm{OyrkG1zi3535 z6AQ++u6X!xAWk-pZ&qpuX?{Z{qA{3J>E@heAy$4s{093I!G}C^kqm?uWCL%OE*hHB z^)J7K#l^~r6}4-p8TuSxsQA#COFy;w1Qx%m4Rs z1=~=NYOi9V?+|cE(m3u5PHzh)UY~e@K?+kun%OVfu0MZq#DhArdrjAdHO9q_Vd=W3~Xk2gzez+)n9JL4hx&DU-DQLOl=LQi{kVkOF3o!-a;+-){ zaN7R$tpDNA%K3G)*F`(Cf@^o^Pn&R7?(tSYNT9bEdEy4*0GVuhWDQoxE36wBB5vvYR7v8H+a^KZ#7Rq+BG!3vqsaBFEQ z^@7lc0}m0dI4h8Qb+Xa{9zijbN9$hF_ZPW`l#Zn>&5f5Bk4@5-1`pHbiKUl+wi*`C zQ|KJu!|GC)l@^ojr*hhDY(%l(+!#1pkQyzw{y@mVn4^cbN<=!ENL0(Jsgc z0gDjXtacVYYtSgEr83Mf;!7F22`w3Ae!&0K(&F=f;KKKx^e_02|L^mz1+ZXFyI*LKx_(R zdBAtd)rIqbQPScGMnNYlx7Y5E;ed(1A#F~sfgOx|^#L_xb?7ko0`H8nM9 zBm=!)y_!DocKg-2;35QA!C-3$?hVbvMD$46rtF>DEss$A!eNQ9obi%TOsy0&>&nFY zY@@G4RYCRyG1*`{5w;Cr)nB}I!YKt5lrlbWPx3U*xo~lFk^jcTq}6so5}ELV&z3NR zX^E&^*Mv~9;Sxd<)Qu!!D+O|s?fT&5ah*2~P|3o%#U@%T>?kKatRf%1P}lTHi^4C9 zGO{R&kQXFP7YoQerat;G7WEXxpv?cLHz9 z$N1vQtoW(^z3d)cOWcwIQQdE}C8%wf?28#YEMWvBkP8kDSzUED4K&Mb*#iOVu@)$~ zZE3!%8N#g3SoPJL`8Wi2xcrrx&oE!puFlPK8(I0)Ab~y@vJ_to5i^|MK3Vd zp=A$7N%B?^kYj$XAWk+WnB@CA*6uMi#+>pHxlxn(Jg5Es_^bZA>kRYJBs*)@H>{_o;!z*)vv6sQYU@C`Sk4OZDjM* z=fLed2LVuHndLB)PFaLl?w`%i19ts#@88~Dx%wZ6zPsM+Bs==mdNC?2NzY}h(b8p3 z`gktxR5B)CtlaXy^NQ7mP6t7(1bXEOEz8CI3HYxhn%h?6e&lEnY8~^!=m~o9 zUK$_}C3W(HS_Cj0!U)opYbE$-x>VQ>WT}>%4?ZiRa{>8bFbkDEqcV> zYvS+Y83TQz%keNfH-<3}V=z}w_Qi}x^v9^Wr0+5s@>rC;im@V+-i&Vt6I1|_!h?W3 zg}~#MAK)&_B=O9ViJo{@e(EijfPNDwIp-2|fBdQbWyiJ6?#Gz49*bnf)?cSV$$&9A zvD)QlA7a@mOa%}~7$!+iGf6{kkHJfQYkx_1`5exJvu5~qtmBjP?|9tg-FB~S(0Zqe zw7))lkLdHvV;BOnRK?PiJI&3rpC#1zZ^mrC%(#8u)E4F6%)aq`QfJ;}m-YvcR3JRS z;VvyLovrpHQ4_bQNHQ?k9~@Y>x8%^Q?Cdi$7A8oWN604SuVD88pZ%SDPy%00_pGna zkrsAb_0)0{UIqePeV4>UVdw*R%)WZ{im$sf3c=3qOt~w3eS;6AcB{b`W9E1Lh4-_} z(&EpOfVk}8zWYr2@2&LXFUdB)$2E_nY}WL5=x;h0zdilP7Ay-#RgA1uU#eCqb@Jg4 z%hBZ}{vf~v(;?=Su^F}DLke5>AT#BHhP{#)zx)d}uGLTFvSL5EtzesJD>Pkbl!!1e zZnC}8&9tQ|FCU@L-Fv#%#XVe;**(~Z3jupMm}j2Y?s;%ThEf>?H>3d?@OIoDT#<6{ zG4Lx3YC5|(U27B>!QhH5dd2QDgbz&p9tf7SAtmZBQx=Fa+*fbC-&m5tP+Kzwp+(Q- zst_**N|35}kd#v$+}x1*ezp0q^QdUcNOr1Ns8)6L8tZIWG|l~oa>EmXc_NwCq)~qD z;qX62ldwc3IVhsy5b?T~XetfMKz~d45#~WRPi}7~6sCb=MS$>J%$mh-F4^N%7kw9B zv|6h{I~!A6^Z`*V6`}W!T>lDZAS-!TRyWK->;iOQV%l*ChB8Ld@t`2|?8w@jWgYb* zxBy(|_?-?T0a94}N9~Q*Lu^ZBg2EdF3AF4oOug`@5WNd&zK_0l5ZY5lbs~uVy1pWT ztQNHfyiwn4*deTISRfyZ!vk-bZC;Nzrk#z8-Wq$?8<|ZyDIVz>b?_?$9gi;T>6P`i z?VG}{ww22D#BENG9Z!sluuHU>z9D5jcfB2`>Ly^qElN%m2*V|CO0$8xd@_b+*W|&4 zkS174RB(p%0u>*mBR#FGi{5f zNOg&GM3kN0uwb(c4&P0phE0AH9!UQ}3p*7Igxf)XqbhbnlG*=~&l!@T#`CV?z?#^z zi_-}qVGS@D6K5=TwrErn+5xgiT@PC2BxX?_GF7J!WmX>8n8>khlftswG)Qzj@mMlh zqOm1|Q5074=vwizmA#P-KlIJ0qc()i1E%%dqd!Ey7<=**$+zdIft%d}PmApL=%d|k zi*-z+G|K6=OG?O~dX+sj9K8k6Sg?BVw3La3mW8GiZ|kdZg5E^cRUS4MhVQdbzXn|?YFZL?rs(Ma}1EZX8OhR z5asNzYWL-KQr81GCs|dyJ3kjBH1?7_XZ{WZK;L?XKn?P^^#?2v+yp4TP3?ix69>Rv z00;582|kbsy^k-UE$hXtdV0qB-aW_38lrOT15>17U^Bun@?(Wq;5(hcA(4`Lia(6< zqf#uq_?5TpexK{L_&P!gp*eH;asn-7lLZFuQz2&BcLWdxz^&rHM zlAZ!WN8rk&o7wIVUfhCi4ME>6cM=0241oyZ6uat|nb8e}@l8J$wMO4meh1_IC4dR@ z{oqK)gG^4#vv#DvVR$&?0sJcoEYAS`L;=`*QitDSX^WtUcPFaG^20sUY}C-^MI zv+gMA&f(*Vn>Z=ws4sI`jp(m`*`XKhaikNcS8s1lrCbD3dn_8dK6NxSB=-$@@cdQ) zMHZmuCBVGgUT^SO_VsT_LIj`#l|R1)SRB(u+Gw(C)%o=-xAAH>H&Ei_9{ciuU;_jsERr`p9THv z?($ncdfMd9EJzqnswjPyj$V~1r*B=~3PBj$Fb*ZFohz1apz@u&T!WcAisCmT>v$#| zCwmsI$L#g^@|4!D z^)yCa=(5={VWKs(-0!tBz~F?IHfYP^iO=Dv)g5hWBm*k_tTyV2y19i0(UX(sDhZmC zB6^7h^_`*AX7*$-hyv4K6%Ho<(r}mmfUBZ1+%lpVE4Kh~9vn>$mGoNK78TNG{D(F! zw79=yTN5qw+SfP^!|AiAp*bpD1PkA4Brm$GxJ167&eV{#)n>E4f{fFGHf^mT0W`;H zT{lwEvX-v$qU?vVhkl}cg)gHdN@`UHM!@Y_$mMjQIjfdiZsKej9p|B|brLq7>j z$h;GTB+(yTmA9!e(pz10Hi zsxVxdF;}IqZawdgQ>)aT2_5jv*=>)hVMKwHvsb6O!r^D*w4w&7EfHG8(dfwG$g=v$ zijg5y-#>p$d76sChZLkpR1?lp2j~Yc5>v0fQn)2SN|-keK^cIF3k@{xYEzS%H^Mo_Xpp20 z)r#R7WJbuW78N<6!lV&g-mdHI+}Mwfs+MChOWf!$D9Dz9?8~;q^fFUM+L??H69&sE zh^%^c*jrlE?~pL250qKedoL#AEYNMh7qJZevMd#KzQ!_Iu5ed*k zjk-xZi|qp?3Uk_2Z|^dIOT{)WOZc7il-}DK2`$wE5cB2zzxAS+ca^&+D<9Q86u0hn4mBN=U3w zZBVP-oLXw<^qW#AzE8J*wxwjzGEyf+r-RTLneOfV(j(GbY zI%VSC#Rvnl34r$IZ~71Ux4R1%A~?HJS23Ewx7FshVKZqDcRTIO;z9pSs%MUU0Ymy= z;LhO7d4^g2yWQJ|)rW({#T5+vxL!eVuu=c_-~a@*+@Q*o=A5}bIXYhQ8)=L$DU+sJ z?ew{buAV5&qq>Uy>s9!;>=%6R*YI2T*X>U4U+}kpJ>$iN7q&<(7sx?Mvk@9bRSJs= zTi@8Zm341xZ2b$k4SXG7vJE_!b#*WNWk`doSWzb-D!T722E?+qMrQ4=Z1e2jb_8*EdPuUz0Ru*4 z+9ohx3#?u2qNu73>j6=#$B~igZ_YEp+`13#;4sN(b?WmZqxxnMISK zM%GB+IfPsa&&K3=C_~{Q zw-NKXHbZZjjgkz^*w|Pl)yCa@cWn*AsQbIL7oUtac?}+buKGEgykszk=B}8A?Lwjm znFFy=rBORtlURdQE3Pc@L)HhO0L2=*jXT*XqE6(D$}dm!(RCC*EMO7M-X zTsLMam5nm}s2zr6oncZ>eYc2Tw=1MS+C4mlU*qt-_zNUFIt-NzZ7A7Ij)ZxR%*GcY zYs@~nUNNWB^4`OVHGA?!;DOZv>zGE7)6dG%fnGiFOr)Rud~roL1qu|Ny`x}bo800| zAEtloEtU`HJwGYz&S)`h5PeuMp;W`(l?$duQywG*ZB!1RrSk8>=i}Ek9WC)tVaN(h z%z0;znI1Mxk-8>KIimJa?^z0$t7}8qr*A=pWQQ`%>8k@%3^d>8Ggna}7{9H_mU-kH z&_M{fnHmEMgmcGA2HSLmBs=B?xs*bSjDGdNVZV_}D5acO>E@8B*>+GLjzFIzEtjovd@B~GM8e!N+s_P1-X)4Frl)93H`U+i$0|h# z4 zGJ*-$wEqSziRa%I@hVTzSc>yy<-`6R8nO!dl?G-4FUaT6en?Nx^?p)({3j~c_ysOw zes(cyfBrbQTCcnxIv7@Y-16ojTkZ}G1(G)}uSl3`fuHZQaX)*ojf7YL>z3P>AOOfw z^*9E+8RgPj$zL~=p%?BC_@RHlKfX$3xWK{bdQh(aL5cfzPf|DQMb}{*#F}v|IZKKK9^$8x9Dw6B{ zubv?}A^S55>V?*#-#kM?vQ>#2lGrAqkIQP>kgjiF)%`Gi*Scp9ouXwG>=YV?$ey4> z<0RZ$jB|5ySA!s6D&(i~jIP+?|Y$pv7mqUM{Z zGg6XJ(d&%`vKOC`Aq}y3oi`+;rcU=nxG(XNHC?v?!`!YBMKA69-#JZnVxlL#aAio7 zwe;vMOA&+=VT$-H!coKDyT5#mguPj5R&K2cN0ud3gVP2w*$5=)dTU}xq z&K@G0<|`VGoJyszhQU6zB9%?#bheJ`F6QNldWn%cJ-!b?g1}e^v0rN`g%M zm96=Y*4mP>!_FQ^_>pv1)lvXehQ%zaxz86H?FJVT&F)Fo9Q2R#|OP(5?1fNJb5MEde%gW*yPJB2n!0jGi$ zunHjy5L3eIgNr9QcwU)O2q0TQwq!;kS1UkJ$<^N^FyQ^huSUVM-G_>*=YD;{ z-h*T}pRQozy8g51%`c%wn??T3GsD-1jT~6{_LPT-nC@0_Zft(LfB271`9mtqi$<59T zv{ntTFtx-g_>u5F-q2Pa46Fumby?vBV&I}4dl(QG(cvNMIa=x~+Y6MDdvV)pGbAV? zEFsvtefLFHM@1-U4C6n)B96>t_%ixDk_bQBIgde)N6D zcYf+mq29|bLX^juyRSkVKVE8doYvITfD{HByZ4gWYQO||nl}staLh3aeYl-+@V-6Yj$Yt`wiqYqS7(qYbj$=? zZcVMc^=o;`H!?74(flrK165CYf#T(lihY?gO;m`F!c{$E;SipG^1%xTN&WSQXig-P z{AY7WhNq{!hJh7dT)sLYDDr)Y6{7SBc%Nt|*5_htB57;6sm z^}1q5#%^)mq#jCzSYXB)ORJe7xq{~+u!B)O*Cr0&LRbh;I2trNQR4i4yPSa-P{->0 zS4FQ(@y*h_1J4n!kd3nY;qDOK(=7mWw9;*U^(hRsiq;a(>bbZhi-BVuoKL|U3BpUq z+3vxclmIOo67q1l1xI=;?^iJYBa*0G6#D8Q?mWM~d*(2Ix#Pyd(sI9_)I4}I;Zt+w z_1@kVU{rcNF6}%Jk0&KI+^3|77|XLql^o=xLApfjxJ#lngDu! zJNze!1iT~5<*M%hsiqeS9=wPZ&5cG~Lx>0{(0Gv#w|G`-_8Yxh1IZmBi^N$0P?B3tzx z7kQc8BEmHSd4NoHAc)m;KhGM!cktocSVC_ZY!)8gN>lxag6WP;hcf4WfcX{)$q3zw zR+ip@Y>;%W%1hZ9}PCt2yQ*;v}EODOfHvOxc04a!1yZmL*2pt zkTQ}3=A^EJhA>*Lx~4&`#9VM5%ilK+TFGce6rSgQFDA^}JY?a4U1>mprU}PYs8TfI zp2MfiQ>j;gm#`S;6h2;?UpR-8hmjc1xD;gyR67(Go-7|v#L^=bdAEm={#LT@I=a$C zpA1WGFyqvHFh5?z7O#pWm3%j9D$G%dj{<>C;6^C!?VB*b$t3&V1XKL1`zQuMmVXxU zRfHcW0wQ{?1Nc0~yUSPS@w`g#6x%2fWfx*JV>&CXVOec{K_5olUxhrH0=4Au#fixm zb{>f>GhH{U_tT;VcfFoN_QW#hKF6I=BIeufEl6Z>{HU~y$e5(Pbp=@18;2-pTQyn4 z3i>wkyEy3$k|qqgygqj3Ln#`+OyC?Noh(ff6KGVlhxnFu+($pfxm1OrXSA#B5if_1 zjy^TRwY@LYB0f3AmtZq*WLNVja<9_Qn!Pl8`Z+`|Q^qkP+yZ;8OMrqCLhG!X2r_eq zY#8=pOAwoexkE@X(-Z{IuK|`TF_198BzTR1M{fP*8=d^m_7aw}RdL^fc3?_TT6w0n zn}v=JuAyFEN4YJ#_@P)TJf7mrZ|@Q@N-bHYNoZkuO9W>uYRHKb{!i8!pyaVGRK<3j zSk#3iq$-RR=ItLeQ=EEN29h@_vl+(Qfmu$po@C}=t}00eg|o^+gTxQTSpu0TaN8hN zPjqQ;03L-(>oAz})9D4}KSc!?bo~xq2MGA9 z8Mm&CiY(#8#Kd`Znm^WlLSpf8&&43`Dp<8BaE!D9)d^H)rx^tlJEL@cT&oq}eTI~T zMg=6x0*>+84DpFPF}diq+{}@dt1iCh5=k$Ho9Lie{78Y<1MoTyCoDEubX3JU9R&zv zer;+h<)FLLgMy#P7<%F@=Gc^Ru!P31Y~>Am>n6o3m;hbh6yCvf?VpXe6X4P#^Nwx~exV*>(iuJH`S_ zhxfity`K)T+iRa&U?$1opiDpqpCDjo!8aI0MI`d}eNB#qpny~eD2IL$&psK~{xA={ z0)nty^8%2;E!(kDkeh2_XqZDx1TzNReO~Ubg@yK@)9a1i^Z#1zfjhg7m4_YhgEx_O zO`^Z@T|b#{Ogah0PWPuE0jzq4S@&ta$;+2)Bh&YdEBg$}e}Q3Cbk{8OSdiZ1aQ+ws zF^eJrF;+C`u=4om=@&oi5GjH5MKD77z30G3#jMOX#JBtJe7X~(?RQP?JL>MH6}Lk1 zPhT4RH7J#d6+Exnot@r6)lzl~ZV!J2eP%s z7xn9r<}Xt?6;$u{&#X$WmvT@D({ytqMr{Kf9DYre{@8=s8ivsQRCK^`Wr;9m6VCgW z?N1d!Z2SJ2t8qSvX{wp$mf!O4+k$MUQqlV8`!t+c zm^Q=qOLoMN0oLa#aDqWvv>;W?vU7dC-njhCKRo=T@rt6~W#g2Z*D%SDUK)jASxJtL zu0{_T`=mZ6gfPI4?U^vE#>##Sgnu-S#q>gg%o{^#s2&0n5Tsbd)>q%)@Vt5>UgKrF zMP;2n4rWWB8%)GXw0Sv1ODYcfv463_Mx$RPE3ve^$WeExm2tv z?bkD%H#X|Xie!?Qge8z5{pX^I*3Pc_#0kwAyX~?%wOY=unMw4y4r&<;Sdp|TUR)!5 zwo3HK9jV!K-xeFKCFTsHNB}=1cU$)CfGVpRu>xNsx%kv zvlTO8MV1kX?bW|sX9_U zS~um=y2Ni{0>p|!Tp-5D!~3U$ph0FPMkEk#_Uzn_flM}*#>F({ub+(bJN#&Dj0Q$+ zjTSLM2~^W^d>wD^zc~hk=AA}QL-OpK_`TjfzdzQn7Z^9qCeqG%KLCe3L6&7UOiHf8 zK*pq^#guJ9pOIZt>F5e^=>M$pNp9bYZq}B&jJiZH?@H_?K~GTYyrOpBvq2pGiersT z@wC3RU@Bq7NNs1khs#S5K3+p_rCNQ76YAMtgKM>T@csSwL*eVOEHKdVT3YsaDW@Ad zvs?ZpoDxc#6(xP{NSxc4g?Rc3nkq}ErDILZUioD8zL912Jr4jD#3aD8deT}(BWz+= zdf{?d@nL8ly&{4qkk^ok`@+$(_^?BI*9cJ@U%d)|M~36X-u5@5~=BLEiHMC_%GC z0xxauX9@!k*M3)yzEb32VrvS1TtoDCU7rcZ_pmg68`A3P0uD~j#G`*eLg*qH2&z!u zRzIQn9~*;GA&nq2jUr(l*qFx0HM*sNH#g7Py(f>Vu=DSi!zbp86JLV0_NX)>EVkEF*&6f!=@=_%%5X1#+s|vLi^}FzhDZ zl^Cpm(EXfIkic#?{laV~9cSdl(OeF(xMatHB#GQ_Ja`{12Nhu>vXemdv2?>%dN{#6 zo`|bM_fr()g4dNyRaXv!ejDQflkx)wiN*74;(R*38w9eVwVC3SU_Jv;}aK9~dZ zWz$61bdf#qZKzxS?Cz~h5yc&~6LR>F%3|-!g3iYD5wj%fVSug=*isttN!}`a~^~q)}kk?2<+AzlE9#j2Huiw4`Q5VHACO81hZ7|yT2@r z7FSgA4mgidAtT7*jMFUQ>0|(5ng8Tx&?$*e8r4@F1zF)ENl5e3v2sDb=T@w#^K~f$ z*F`T`>9Wy;J?T@0;&JNg01dcVC!KuQJX1M0JSu`7(=pXzd!sbGWH6Nl-J(w=at4Kf zf`M7%_4m|&Y8@yxOleU5=N~^*pX*J`8M6-$*&*SU(7bnIi(8z)<)PG^7Vsf)O;>Aq zfno@t>R&h-rlW1J=FSX1vO!zEXyFvS&iiTCq>K)ivkwsHJ7Qby)|}B*cwdJ6Lq$UA?~u*=1jS4NhwFY;;i6hPZnPm}($cV#XgE|OC)c~|uniiZ^^TbmytHabu8 zX1%DXA&--`6I(SBJhH=Q@&Y;^Hi1TI5n5O7Fc5!2%9R{U?ZgGP-h4Rnb>(|qRt7i@Mze)rrT&mWyv z?+$G8@^=IG&gRrwyYmk>sn4oti5DdcSurlJ!1KR8WLp(pW`d?4oKwYJOJ*IBLWf&^ zLfEQ^l}h_nui>INDE!6Gq}I{-g0DSFsv_@Oa~U?`rb!=`2X0qAbOQ~Dw?{{p+1-PW zj@>(h#PTE_&pv5<|F)1YW*KV1>R2|W-AbgMco9s<_pHRXkbt}j8v?Te+OBk=c+4g_zv=_U^fQoT}Ih_nKw.&?(RC*aJWZ+}V0BtgR*N-~q)m)LrXGROm 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

    Le3uEUmkur& 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

    @{LU#Ap$o~x}d}bpm;w%)4vf2xA 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 Mm9>%82+Pp_0oSp8=>Px# literal 0 HcmV?d00001 From 40d45d923b033363ff1304b47eac238dd4495a57 Mon Sep 17 00:00:00 2001 From: Avamander Date: Sun, 18 Apr 2021 20:28:14 +0300 Subject: [PATCH 5/6] Reformatted all the files according to clang-format style --- .clang-format | 14 +- README.md | 2 +- src/BootloaderVersion.cpp | 2 +- src/BootloaderVersion.h | 12 +- src/FreeRTOSConfig.h | 188 +- src/components/battery/BatteryController.cpp | 78 +- src/components/battery/BatteryController.h | 89 +- .../ble/AlertNotificationClient.cpp | 91 +- src/components/ble/AlertNotificationClient.h | 100 +- .../ble/AlertNotificationService.cpp | 75 +- src/components/ble/AlertNotificationService.h | 84 +- .../ble/BatteryInformationService.cpp | 52 +- .../ble/BatteryInformationService.h | 34 +- src/components/ble/BleClient.h | 6 +- src/components/ble/BleController.cpp | 2 - src/components/ble/BleController.h | 74 +- src/components/ble/CurrentTimeClient.cpp | 48 +- src/components/ble/CurrentTimeClient.h | 83 +- src/components/ble/CurrentTimeService.cpp | 59 +- src/components/ble/CurrentTimeService.h | 51 +- .../ble/DeviceInformationService.cpp | 110 +- src/components/ble/DeviceInformationService.h | 79 +- src/components/ble/DfuService.cpp | 224 +- src/components/ble/DfuService.h | 259 +- src/components/ble/HeartRateService.cpp | 51 +- src/components/ble/HeartRateService.h | 37 +- src/components/ble/ImmediateAlertService.cpp | 67 +- src/components/ble/ImmediateAlertService.h | 41 +- src/components/ble/MusicService.cpp | 163 +- src/components/ble/MusicService.h | 134 +- src/components/ble/NavigationService.cpp | 80 +- src/components/ble/NavigationService.h | 42 +- src/components/ble/NimbleController.cpp | 107 +- src/components/ble/NimbleController.h | 101 +- src/components/ble/NotificationManager.cpp | 58 +- src/components/ble/NotificationManager.h | 64 +- src/components/ble/ServiceDiscovery.cpp | 7 +- src/components/ble/ServiceDiscovery.h | 17 +- .../brightness/BrightnessController.cpp | 82 +- .../brightness/BrightnessController.h | 6 +- .../datetime/DateTimeController.cpp | 165 +- src/components/datetime/DateTimeController.h | 123 +- .../firmwarevalidator/FirmwareValidator.cpp | 4 +- .../firmwarevalidator/FirmwareValidator.h | 15 +- src/components/gfx/Gfx.cpp | 55 +- src/components/gfx/Gfx.h | 73 +- src/components/heartrate/Biquad.cpp | 3 +- src/components/heartrate/Biquad.h | 6 +- .../heartrate/HeartRateController.cpp | 15 +- .../heartrate/HeartRateController.h | 16 +- src/components/heartrate/Ppg.cpp | 40 +- src/components/heartrate/Ppg.h | 5 +- src/components/heartrate/Ptagc.cpp | 7 +- src/components/heartrate/Ptagc.h | 5 +- src/components/motion/MotionController.h | 24 +- src/components/motor/MotorController.cpp | 26 +- src/components/motor/MotorController.h | 14 +- src/components/rle/RleDecoder.cpp | 11 +- src/components/rle/RleDecoder.h | 4 +- src/components/settings/Settings.cpp | 125 +- src/components/settings/Settings.h | 165 +- src/displayapp/Apps.h | 27 +- src/displayapp/DisplayApp.cpp | 143 +- src/displayapp/DisplayApp.h | 111 +- src/displayapp/DisplayAppRecovery.cpp | 36 +- src/displayapp/DisplayAppRecovery.h | 22 +- src/displayapp/DummyLittleVgl.h | 31 +- src/displayapp/LittleVgl.cpp | 69 +- src/displayapp/LittleVgl.h | 71 +- src/displayapp/Messages.h | 12 +- src/displayapp/TouchEvents.h | 2 +- src/displayapp/fonts/README.md | 44 + src/displayapp/fonts/Readme.md | 41 - src/displayapp/lv_pinetime_theme.c | 743 +- src/displayapp/lv_pinetime_theme.h | 26 +- src/displayapp/screens/ApplicationList.cpp | 78 +- src/displayapp/screens/ApplicationList.h | 32 +- src/displayapp/screens/BatteryIcon.cpp | 19 +- src/displayapp/screens/BatteryIcon.h | 6 +- src/displayapp/screens/BatteryInfo.cpp | 93 +- src/displayapp/screens/BatteryInfo.h | 41 +- src/displayapp/screens/BleIcon.cpp | 6 +- src/displayapp/screens/BleIcon.h | 2 +- src/displayapp/screens/Brightness.cpp | 61 +- src/displayapp/screens/Brightness.h | 32 +- src/displayapp/screens/Clock.cpp | 89 +- src/displayapp/screens/Clock.h | 57 +- src/displayapp/screens/DropDownDemo.cpp | 34 +- src/displayapp/screens/DropDownDemo.h | 20 +- src/displayapp/screens/FirmwareUpdate.cpp | 13 +- src/displayapp/screens/FirmwareUpdate.h | 35 +- src/displayapp/screens/FirmwareValidation.cpp | 36 +- src/displayapp/screens/FirmwareValidation.h | 34 +- src/displayapp/screens/FlashLight.cpp | 39 +- src/displayapp/screens/FlashLight.h | 30 +- src/displayapp/screens/HeartRate.cpp | 33 +- src/displayapp/screens/HeartRate.h | 13 +- src/displayapp/screens/InfiniPaint.cpp | 11 +- src/displayapp/screens/InfiniPaint.h | 5 +- src/displayapp/screens/Label.cpp | 14 +- src/displayapp/screens/Label.h | 27 +- src/displayapp/screens/List.cpp | 48 +- src/displayapp/screens/List.h | 46 +- src/displayapp/screens/Meter.cpp | 20 +- src/displayapp/screens/Meter.h | 20 +- src/displayapp/screens/Motion.cpp | 10 +- src/displayapp/screens/Motion.h | 17 +- src/displayapp/screens/Music.cpp | 80 +- src/displayapp/screens/Music.h | 61 +- src/displayapp/screens/Navigation.cpp | 20 +- src/displayapp/screens/Navigation.h | 198 +- src/displayapp/screens/NotificationIcon.cpp | 6 +- src/displayapp/screens/NotificationIcon.h | 2 +- src/displayapp/screens/Notifications.cpp | 114 +- src/displayapp/screens/Notifications.h | 65 +- src/displayapp/screens/Paddle.cpp | 233 +- src/displayapp/screens/Paddle.h | 50 +- src/displayapp/screens/Screen.h | 98 +- src/displayapp/screens/ScreenList.h | 162 +- src/displayapp/screens/StopWatch.cpp | 24 +- src/displayapp/screens/StopWatch.h | 6 +- src/displayapp/screens/Symbols.h | 17 +- src/displayapp/screens/SystemInfo.cpp | 218 +- src/displayapp/screens/SystemInfo.h | 48 +- src/displayapp/screens/Tile.cpp | 64 +- src/displayapp/screens/Tile.h | 58 +- src/displayapp/screens/Twos.cpp | 137 +- src/displayapp/screens/Twos.h | 42 +- src/displayapp/screens/WatchFaceAnalog.cpp | 107 +- src/displayapp/screens/WatchFaceAnalog.h | 103 +- src/displayapp/screens/WatchFaceDigital.cpp | 111 +- src/displayapp/screens/WatchFaceDigital.h | 97 +- .../screens/settings/QuickSettings.cpp | 86 +- .../screens/settings/QuickSettings.h | 55 +- .../screens/settings/SettingDisplay.cpp | 62 +- .../screens/settings/SettingDisplay.h | 22 +- .../screens/settings/SettingTimeFormat.cpp | 48 +- .../screens/settings/SettingTimeFormat.h | 22 +- .../screens/settings/SettingWakeUp.cpp | 64 +- .../screens/settings/SettingWakeUp.h | 22 +- .../screens/settings/SettingWatchFace.cpp | 38 +- .../screens/settings/SettingWatchFace.h | 22 +- src/displayapp/screens/settings/Settings.cpp | 57 +- src/displayapp/screens/settings/Settings.h | 29 +- src/drivers/Bma421.cpp | 35 +- src/drivers/Bma421.h | 8 +- src/drivers/BufferProvider.h | 4 +- src/drivers/Cst816s.cpp | 19 +- src/drivers/Cst816s.h | 97 +- src/drivers/DebugPins.cpp | 12 +- src/drivers/DebugPins.h | 1 - src/drivers/Hrs3300.cpp | 20 +- src/drivers/Hrs3300.h | 5 +- src/drivers/InternalFlash.cpp | 6 +- src/drivers/InternalFlash.h | 5 +- src/drivers/Spi.cpp | 11 +- src/drivers/Spi.h | 30 +- src/drivers/SpiMaster.cpp | 207 +- src/drivers/SpiMaster.h | 82 +- src/drivers/SpiNorFlash.cpp | 55 +- src/drivers/SpiNorFlash.h | 89 +- src/drivers/St7789.cpp | 20 +- src/drivers/St7789.h | 109 +- src/drivers/TwiMaster.cpp | 106 +- src/drivers/TwiMaster.h | 57 +- src/drivers/Watchdog.cpp | 61 +- src/drivers/Watchdog.h | 36 +- src/heartratetask/HeartRateTask.cpp | 29 +- src/heartratetask/HeartRateTask.h | 11 +- src/logging/DummyLogger.h | 13 +- src/logging/Logger.h | 6 +- src/logging/NrfLogger.cpp | 12 +- src/logging/NrfLogger.h | 15 +- src/main.cpp | 102 +- src/recoveryLoader.cpp | 50 +- src/sdk_config.h | 10263 ++++++++-------- src/systemtask/SystemMonitor.h | 50 +- src/systemtask/SystemTask.cpp | 196 +- src/systemtask/SystemTask.h | 164 +- 179 files changed, 10119 insertions(+), 10688 deletions(-) create mode 100644 src/displayapp/fonts/README.md delete mode 100644 src/displayapp/fonts/Readme.md diff --git a/.clang-format b/.clang-format index e7355499..5ddb7206 100644 --- a/.clang-format +++ b/.clang-format @@ -1,6 +1,6 @@ --- Language: Cpp -AccessModifierOffset: -2 +AccessModifierOffset: 2 AlignAfterOpenBracket: Align AlignConsecutiveMacros: true AlignConsecutiveAssignments: false @@ -21,8 +21,8 @@ AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: MultiLine -BinPackArguments: true -BinPackParameters: true +BinPackArguments: false +BinPackParameters: false BraceWrapping: AfterCaseLabel: false AfterClass: false @@ -52,14 +52,14 @@ BreakStringLiterals: true ColumnLimit: 140 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false -ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 2 ContinuationIndentWidth: 2 Cpp11BracedListStyle: true DeriveLineEnding: false DerivePointerAlignment: false DisableFormat: false -ExperimentalAutoDetectBinPacking: false +ExperimentalAutoDetectBinPacking: true FixNamespaceComments: false ForEachMacros: - foreach @@ -90,10 +90,6 @@ MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: All -ObjCBinPackProtocolList: Auto -ObjCBlockIndentWidth: 2 -ObjCSpaceAfterProperty: false -ObjCSpaceBeforeProtocolList: true PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300 diff --git a/README.md b/README.md index a4d40a6a..34f6e841 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ As of now, here is the list of achievements of this project: - [Flash, upgrade (OTA), time synchronization,...](doc/gettingStarted/gettingStarted.md) ### Develop - - [Generate the fonts and symbols](src/displayapp/fonts/Readme.md) + - [Generate the fonts and symbols](src/displayapp/fonts/README.md) - [Creating a stopwatch in Pinetime(article)](https://pankajraghav.com/2021/04/03/PINETIME-STOPCLOCK.html) ### Build, flash and debug diff --git a/src/BootloaderVersion.cpp b/src/BootloaderVersion.cpp index 8555593f..5eba7a1d 100644 --- a/src/BootloaderVersion.cpp +++ b/src/BootloaderVersion.cpp @@ -17,7 +17,7 @@ uint32_t BootloaderVersion::Patch() { return 0; } -const char *BootloaderVersion::VersionString() { +const char* BootloaderVersion::VersionString() { return "0.0.0"; } diff --git a/src/BootloaderVersion.h b/src/BootloaderVersion.h index c7fcbd98..f2fd9112 100644 --- a/src/BootloaderVersion.h +++ b/src/BootloaderVersion.h @@ -2,11 +2,11 @@ namespace Pinetime { class BootloaderVersion { - public: - static uint32_t Major(); - static uint32_t Minor(); - static uint32_t Patch(); - static const char* VersionString(); - static bool IsValid(); + public: + static uint32_t Major(); + static uint32_t Minor(); + static uint32_t Patch(); + static const char* VersionString(); + static bool IsValid(); }; } \ No newline at end of file diff --git a/src/FreeRTOSConfig.h b/src/FreeRTOSConfig.h index b4de26fa..15185766 100644 --- a/src/FreeRTOSConfig.h +++ b/src/FreeRTOSConfig.h @@ -26,20 +26,19 @@ * 1 tab == 4 spaces! */ - #ifndef FREERTOS_CONFIG_H #define FREERTOS_CONFIG_H #ifdef SOFTDEVICE_PRESENT -#include "nrf_soc.h" + #include "nrf_soc.h" #endif #include "app_util_platform.h" /*----------------------------------------------------------- * Possible configurations for system timer */ -#define FREERTOS_USE_RTC 0 /**< Use real time clock for the system */ -#define FREERTOS_USE_SYSTICK 1 /**< Use SysTick timer for system */ +#define FREERTOS_USE_RTC 0 /**< Use real time clock for the system */ +#define FREERTOS_USE_SYSTICK 1 /**< Use SysTick timer for system */ /*----------------------------------------------------------- * Application specific definitions. @@ -55,153 +54,150 @@ #define configTICK_SOURCE FREERTOS_USE_RTC -#define configUSE_PREEMPTION 1 +#define configUSE_PREEMPTION 1 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 -#define configUSE_TICKLESS_IDLE 1 -#define configUSE_TICKLESS_IDLE_SIMPLE_DEBUG 0 /* See into vPortSuppressTicksAndSleep source code for explanation */ -#define configCPU_CLOCK_HZ ( SystemCoreClock ) -#define configTICK_RATE_HZ 1024 -#define configMAX_PRIORITIES ( 3 ) -#define configMINIMAL_STACK_SIZE ( 120 ) -#define configTOTAL_HEAP_SIZE ( 1024*16 ) -#define configMAX_TASK_NAME_LEN ( 4 ) -#define configUSE_16_BIT_TICKS 0 -#define configIDLE_SHOULD_YIELD 1 -#define configUSE_MUTEXES 1 -#define configUSE_RECURSIVE_MUTEXES 1 -#define configUSE_COUNTING_SEMAPHORES 1 -#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ -#define configQUEUE_REGISTRY_SIZE 2 -#define configUSE_QUEUE_SETS 0 -#define configUSE_TIME_SLICING 0 -#define configUSE_NEWLIB_REENTRANT 0 -#define configENABLE_BACKWARD_COMPATIBILITY 1 +#define configUSE_TICKLESS_IDLE 1 +#define configUSE_TICKLESS_IDLE_SIMPLE_DEBUG 0 /* See into vPortSuppressTicksAndSleep source code for explanation */ +#define configCPU_CLOCK_HZ (SystemCoreClock) +#define configTICK_RATE_HZ 1024 +#define configMAX_PRIORITIES (3) +#define configMINIMAL_STACK_SIZE (120) +#define configTOTAL_HEAP_SIZE (1024 * 16) +#define configMAX_TASK_NAME_LEN (4) +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ +#define configQUEUE_REGISTRY_SIZE 2 +#define configUSE_QUEUE_SETS 0 +#define configUSE_TIME_SLICING 0 +#define configUSE_NEWLIB_REENTRANT 0 +#define configENABLE_BACKWARD_COMPATIBILITY 1 /* Hook function related definitions. */ -#define configUSE_IDLE_HOOK 1 -#define configUSE_TICK_HOOK 0 -#define configCHECK_FOR_STACK_OVERFLOW 0 -#define configUSE_MALLOC_FAILED_HOOK 0 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 0 +#define configUSE_MALLOC_FAILED_HOOK 0 /* Run time and task stats gathering related definitions. */ -#define configGENERATE_RUN_TIME_STATS 0 -#define configUSE_TRACE_FACILITY 1 -#define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_TRACE_FACILITY 1 +#define configUSE_STATS_FORMATTING_FUNCTIONS 0 /* Co-routine definitions. */ -#define configUSE_CO_ROUTINES 0 -#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES (2) /* Software timer definitions. */ -#define configUSE_TIMERS 1 -#define configTIMER_TASK_PRIORITY ( 0 ) -#define configTIMER_QUEUE_LENGTH 32 -#define configTIMER_TASK_STACK_DEPTH ( 300 ) +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY (0) +#define configTIMER_QUEUE_LENGTH 32 +#define configTIMER_TASK_STACK_DEPTH (300) /* Tickless Idle configuration. */ -#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 +#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 /* Tickless idle/low power functionality. */ - /* Define to trap errors during development. */ #if defined(DEBUG_NRF) || defined(DEBUG_NRF_USER) -#define configASSERT( x ) ASSERT(x) + #define configASSERT(x) ASSERT(x) #endif /* FreeRTOS MPU specific definitions. */ -#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 1 +#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 1 /* Optional functions - most linkers will remove unused functions anyway. */ -#define INCLUDE_vTaskPrioritySet 1 -#define INCLUDE_uxTaskPriorityGet 1 -#define INCLUDE_vTaskDelete 1 -#define INCLUDE_vTaskSuspend 1 -#define INCLUDE_xResumeFromISR 1 -#define INCLUDE_vTaskDelayUntil 1 -#define INCLUDE_vTaskDelay 1 -#define INCLUDE_xTaskGetSchedulerState 1 -#define INCLUDE_xTaskGetCurrentTaskHandle 1 -#define INCLUDE_uxTaskGetStackHighWaterMark 1 -#define INCLUDE_xTaskGetIdleTaskHandle 1 -#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1 -#define INCLUDE_pcTaskGetTaskName 1 -#define INCLUDE_eTaskGetState 1 -#define INCLUDE_xEventGroupSetBitFromISR 1 -#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_xResumeFromISR 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1 +#define INCLUDE_pcTaskGetTaskName 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xEventGroupSetBitFromISR 1 +#define INCLUDE_xTimerPendFunctionCall 1 /* The lowest interrupt priority that can be used in a call to a "set priority" function. */ -#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf +#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf /* The highest interrupt priority that can be used by any interrupt service routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER PRIORITY THAN THIS! (higher priorities are lower numeric values. */ -#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY _PRIO_APP_HIGH - +#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY _PRIO_APP_HIGH /* Interrupt priorities used by the kernel port layer itself. These are generic to all Cortex-M ports, and do not rely on any particular library functions. */ -#define configKERNEL_INTERRUPT_PRIORITY configLIBRARY_LOWEST_INTERRUPT_PRIORITY +#define configKERNEL_INTERRUPT_PRIORITY configLIBRARY_LOWEST_INTERRUPT_PRIORITY /* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ -#define configMAX_SYSCALL_INTERRUPT_PRIORITY configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY +#define configMAX_SYSCALL_INTERRUPT_PRIORITY configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY /* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS standard names - or at least those used in the unmodified vector table. */ -#define vPortSVCHandler SVC_Handler -#define xPortPendSVHandler PendSV_Handler - +#define vPortSVCHandler SVC_Handler +#define xPortPendSVHandler PendSV_Handler /*----------------------------------------------------------- * Settings that are generated automatically * basing on the settings above */ #if (configTICK_SOURCE == FREERTOS_USE_SYSTICK) - // do not define configSYSTICK_CLOCK_HZ for SysTick to be configured automatically - // to CPU clock source - #define xPortSysTickHandler SysTick_Handler + // do not define configSYSTICK_CLOCK_HZ for SysTick to be configured automatically + // to CPU clock source + #define xPortSysTickHandler SysTick_Handler #elif (configTICK_SOURCE == FREERTOS_USE_RTC) - #define configSYSTICK_CLOCK_HZ ( 32768UL ) - #define xPortSysTickHandler RTC1_IRQHandler + #define configSYSTICK_CLOCK_HZ (32768UL) + #define xPortSysTickHandler RTC1_IRQHandler #else - #error Unsupported configTICK_SOURCE value + #error Unsupported configTICK_SOURCE value #endif /* Code below should be only used by the compiler, and not the assembler. */ #if !(defined(__ASSEMBLY__) || defined(__ASSEMBLER__)) - #include "nrf.h" - #include "nrf_assert.h" + #include "nrf.h" + #include "nrf_assert.h" - /* This part of definitions may be problematic in assembly - it uses definitions from files that are not assembly compatible. */ - /* Cortex-M specific definitions. */ - #ifdef __NVIC_PRIO_BITS - /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ - #define configPRIO_BITS __NVIC_PRIO_BITS - #else - #error "This port requires __NVIC_PRIO_BITS to be defined" - #endif + /* This part of definitions may be problematic in assembly - it uses definitions from files that are not assembly compatible. */ + /* Cortex-M specific definitions. */ + #ifdef __NVIC_PRIO_BITS + /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ + #define configPRIO_BITS __NVIC_PRIO_BITS + #else + #error "This port requires __NVIC_PRIO_BITS to be defined" + #endif - /* Access to current system core clock is required only if we are ticking the system by systimer */ - #if (configTICK_SOURCE == FREERTOS_USE_SYSTICK) - #include - extern uint32_t SystemCoreClock; - #endif + /* Access to current system core clock is required only if we are ticking the system by systimer */ + #if (configTICK_SOURCE == FREERTOS_USE_SYSTICK) + #include +extern uint32_t SystemCoreClock; + #endif #endif /* !assembler */ /** Implementation note: Use this with caution and set this to 1 ONLY for debugging * ---------------------------------------------------------- - * Set the value of configUSE_DISABLE_TICK_AUTO_CORRECTION_DEBUG to below for enabling or disabling RTOS tick auto correction: - * 0. This is default. If the RTC tick interrupt is masked for more than 1 tick by higher priority interrupts, then most likely - * one or more RTC ticks are lost. The tick interrupt inside RTOS will detect this and make a correction needed. This is needed - * for the RTOS internal timers to be more accurate. - * 1. The auto correction for RTOS tick is disabled even though few RTC tick interrupts were lost. This feature is desirable when debugging - * the RTOS application and stepping though the code. After stepping when the application is continued in debug mode, the auto-corrections of - * RTOS tick might cause asserts. Setting configUSE_DISABLE_TICK_AUTO_CORRECTION_DEBUG to 1 will make RTC and RTOS go out of sync but could be - * convenient for debugging. - */ -#define configUSE_DISABLE_TICK_AUTO_CORRECTION_DEBUG 0 + * Set the value of configUSE_DISABLE_TICK_AUTO_CORRECTION_DEBUG to below for enabling or disabling RTOS tick auto correction: + * 0. This is default. If the RTC tick interrupt is masked for more than 1 tick by higher priority interrupts, then most likely + * one or more RTC ticks are lost. The tick interrupt inside RTOS will detect this and make a correction needed. This is needed + * for the RTOS internal timers to be more accurate. + * 1. The auto correction for RTOS tick is disabled even though few RTC tick interrupts were lost. This feature is desirable when debugging + * the RTOS application and stepping though the code. After stepping when the application is continued in debug mode, the + * auto-corrections of RTOS tick might cause asserts. Setting configUSE_DISABLE_TICK_AUTO_CORRECTION_DEBUG to 1 will make RTC and RTOS go + * out of sync but could be convenient for debugging. + */ +#define configUSE_DISABLE_TICK_AUTO_CORRECTION_DEBUG 0 #endif /* FREERTOS_CONFIG_H */ diff --git a/src/components/battery/BatteryController.cpp b/src/components/battery/BatteryController.cpp index 99afa55c..b39efefb 100644 --- a/src/components/battery/BatteryController.cpp +++ b/src/components/battery/BatteryController.cpp @@ -7,33 +7,33 @@ using namespace Pinetime::Controllers; -Battery *Battery::instance = nullptr; +Battery* Battery::instance = nullptr; Battery::Battery() { instance = this; } void Battery::Init() { - nrf_gpio_cfg_input(chargingPin, (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pullup); - nrf_gpio_cfg_input(powerPresentPin, (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pullup); + nrf_gpio_cfg_input(chargingPin, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pullup); + nrf_gpio_cfg_input(powerPresentPin, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pullup); } void Battery::Update() { isCharging = !nrf_gpio_pin_read(chargingPin); isPowerPresent = !nrf_gpio_pin_read(powerPresentPin); - - if ( isReading ) return; + + if (isReading) + return; // Non blocking read samples = 0; isReading = true; - SaadcInit(); + SaadcInit(); - nrfx_saadc_sample(); - + nrfx_saadc_sample(); } -void Battery::adcCallbackStatic(nrfx_saadc_evt_t const *event) { +void Battery::adcCallbackStatic(nrfx_saadc_evt_t const* event) { instance->SaadcEventHandler(event); } @@ -41,48 +41,44 @@ void Battery::SaadcInit() { nrfx_saadc_config_t adcConfig = NRFX_SAADC_DEFAULT_CONFIG; APP_ERROR_CHECK(nrfx_saadc_init(&adcConfig, adcCallbackStatic)); - nrf_saadc_channel_config_t adcChannelConfig = { - .resistor_p = NRF_SAADC_RESISTOR_DISABLED, - .resistor_n = NRF_SAADC_RESISTOR_DISABLED, - .gain = NRF_SAADC_GAIN1_5, - .reference = NRF_SAADC_REFERENCE_INTERNAL, - .acq_time = NRF_SAADC_ACQTIME_3US, - .mode = NRF_SAADC_MODE_SINGLE_ENDED, - .burst = NRF_SAADC_BURST_ENABLED, - .pin_p = batteryVoltageAdcInput, - .pin_n = NRF_SAADC_INPUT_DISABLED - }; + nrf_saadc_channel_config_t adcChannelConfig = {.resistor_p = NRF_SAADC_RESISTOR_DISABLED, + .resistor_n = NRF_SAADC_RESISTOR_DISABLED, + .gain = NRF_SAADC_GAIN1_5, + .reference = NRF_SAADC_REFERENCE_INTERNAL, + .acq_time = NRF_SAADC_ACQTIME_3US, + .mode = NRF_SAADC_MODE_SINGLE_ENDED, + .burst = NRF_SAADC_BURST_ENABLED, + .pin_p = batteryVoltageAdcInput, + .pin_n = NRF_SAADC_INPUT_DISABLED}; APP_ERROR_CHECK(nrfx_saadc_channel_init(0, &adcChannelConfig)); APP_ERROR_CHECK(nrfx_saadc_buffer_convert(&saadc_value, 1)); - } -void Battery::SaadcEventHandler(nrfx_saadc_evt_t const * p_event) { +void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) { - const float battery_max = 4.18; // maximum voltage of battery ( max charging voltage is 4.21 ) - const float battery_min = 3.20; // minimum voltage of battery before shutdown ( depends on the battery ) + const float battery_max = 4.18; // maximum voltage of battery ( max charging voltage is 4.21 ) + const float battery_min = 3.20; // minimum voltage of battery before shutdown ( depends on the battery ) - if (p_event->type == NRFX_SAADC_EVT_DONE) { - - APP_ERROR_CHECK(nrfx_saadc_buffer_convert(&saadc_value, 1)); + if (p_event->type == NRFX_SAADC_EVT_DONE) { - voltage = (static_cast(p_event->data.done.p_buffer[0]) * 2.04f) / (1024 / 3.0f); - voltage = roundf(voltage * 100) / 100; + APP_ERROR_CHECK(nrfx_saadc_buffer_convert(&saadc_value, 1)); - percentRemaining = static_cast(((voltage - battery_min) / (battery_max - battery_min)) * 100); + voltage = (static_cast(p_event->data.done.p_buffer[0]) * 2.04f) / (1024 / 3.0f); + voltage = roundf(voltage * 100) / 100; - percentRemaining = std::max(percentRemaining, 0); - percentRemaining = std::min(percentRemaining, 100); + percentRemaining = static_cast(((voltage - battery_min) / (battery_max - battery_min)) * 100); - percentRemainingBuffer.insert(percentRemaining); + percentRemaining = std::max(percentRemaining, 0); + percentRemaining = std::min(percentRemaining, 100); - samples++; - if ( samples > percentRemainingSamples ) { - nrfx_saadc_uninit(); - isReading = false; - } else { - nrfx_saadc_sample(); - } + percentRemainingBuffer.insert(percentRemaining); + + samples++; + if (samples > percentRemainingSamples) { + nrfx_saadc_uninit(); + isReading = false; + } else { + nrfx_saadc_sample(); } } - +} diff --git a/src/components/battery/BatteryController.h b/src/components/battery/BatteryController.h index 47d7a6d1..e5c734d2 100644 --- a/src/components/battery/BatteryController.h +++ b/src/components/battery/BatteryController.h @@ -7,18 +7,18 @@ namespace Pinetime { namespace Controllers { - /** A simple circular buffer that can be used to average - out the sensor values. The total capacity of the CircBuffer + /** A simple circular buffer that can be used to average + out the sensor values. The total capacity of the CircBuffer is given as the template parameter N. - */ - template - class CircBuffer { - public: - CircBuffer() : arr{}, sz{}, cap{N}, head{} {} + */ + template class CircBuffer { + public: + CircBuffer() : arr {}, sz {}, cap {N}, head {} { + } /** - insert member function overwrites the next data to the current + insert member function overwrites the next data to the current HEAD and moves the HEAD to the newly inserted value. - */ + */ void insert(const int num) { head %= cap; arr[head++] = num; @@ -32,51 +32,58 @@ namespace Pinetime { return (sum / sz); } - private: + private: std::array arr; /**< internal array used to store the values*/ - uint8_t sz; /**< The current size of the array.*/ - uint8_t cap; /**< Total capacity of the CircBuffer.*/ - uint8_t head; /**< The current head of the CircBuffer*/ + uint8_t sz; /**< The current size of the array.*/ + uint8_t cap; /**< Total capacity of the CircBuffer.*/ + uint8_t head; /**< The current head of the CircBuffer*/ }; class Battery { - public: + public: + Battery(); - Battery(); + void Init(); + void Update(); - void Init(); - void Update(); - - int PercentRemaining() const { return percentRemainingBuffer.GetAverage(); } + int PercentRemaining() const { + return percentRemainingBuffer.GetAverage(); + } - float Voltage() const { return voltage; } + float Voltage() const { + return voltage; + } - bool IsCharging() const { return isCharging; } - bool IsPowerPresent() const { return isPowerPresent; } + bool IsCharging() const { + return isCharging; + } + bool IsPowerPresent() const { + return isPowerPresent; + } - private: - static Battery *instance; - nrf_saadc_value_t saadc_value; - - static constexpr uint8_t percentRemainingSamples = 5; - CircBuffer percentRemainingBuffer {}; + private: + static Battery* instance; + nrf_saadc_value_t saadc_value; - static constexpr uint32_t chargingPin = 12; - static constexpr uint32_t powerPresentPin = 19; - static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7; - float voltage = 0.0f; - int percentRemaining = -1; + static constexpr uint8_t percentRemainingSamples = 5; + CircBuffer percentRemainingBuffer {}; - bool isCharging = false; - bool isPowerPresent = false; - - void SaadcInit(); + static constexpr uint32_t chargingPin = 12; + static constexpr uint32_t powerPresentPin = 19; + static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7; + float voltage = 0.0f; + int percentRemaining = -1; - void SaadcEventHandler(nrfx_saadc_evt_t const * p_event); - static void adcCallbackStatic(nrfx_saadc_evt_t const *event); + bool isCharging = false; + bool isPowerPresent = false; - bool isReading = false; - uint8_t samples = 0; + void SaadcInit(); + + void SaadcEventHandler(nrfx_saadc_evt_t const* p_event); + static void adcCallbackStatic(nrfx_saadc_evt_t const* event); + + bool isReading = false; + uint8_t samples = 0; }; } } \ No newline at end of file diff --git a/src/components/ble/AlertNotificationClient.cpp b/src/components/ble/AlertNotificationClient.cpp index 9efede39..6043a129 100644 --- a/src/components/ble/AlertNotificationClient.cpp +++ b/src/components/ble/AlertNotificationClient.cpp @@ -12,50 +12,42 @@ constexpr ble_uuid16_t AlertNotificationClient::unreadAlertStatusUuid; constexpr ble_uuid16_t AlertNotificationClient::controlPointUuid; namespace { - int - OnDiscoveryEventCallback(uint16_t conn_handle, const struct ble_gatt_error *error, const struct ble_gatt_svc *service, - void *arg) { - auto client = static_cast(arg); + int OnDiscoveryEventCallback(uint16_t conn_handle, const struct ble_gatt_error* error, const struct ble_gatt_svc* service, void* arg) { + auto client = static_cast(arg); return client->OnDiscoveryEvent(conn_handle, error, service); } - int OnAlertNotificationCharacteristicDiscoveredCallback(uint16_t conn_handle, const struct ble_gatt_error *error, - const struct ble_gatt_chr *chr, void *arg) { - auto client = static_cast(arg); + int OnAlertNotificationCharacteristicDiscoveredCallback(uint16_t conn_handle, + const struct ble_gatt_error* error, + const struct ble_gatt_chr* chr, + void* arg) { + auto client = static_cast(arg); return client->OnCharacteristicsDiscoveryEvent(conn_handle, error, chr); } - int OnAlertNotificationDescriptorDiscoveryEventCallback(uint16_t conn_handle, - const struct ble_gatt_error *error, - uint16_t chr_val_handle, - const struct ble_gatt_dsc *dsc, - void *arg) { - auto client = static_cast(arg); + int OnAlertNotificationDescriptorDiscoveryEventCallback( + uint16_t conn_handle, const struct ble_gatt_error* error, uint16_t chr_val_handle, const struct ble_gatt_dsc* dsc, void* arg) { + auto client = static_cast(arg); return client->OnDescriptorDiscoveryEventCallback(conn_handle, error, chr_val_handle, dsc); } - int NewAlertSubcribeCallback(uint16_t conn_handle, - const struct ble_gatt_error *error, - struct ble_gatt_attr *attr, - void *arg) { - auto client = static_cast(arg); + int NewAlertSubcribeCallback(uint16_t conn_handle, const struct ble_gatt_error* error, struct ble_gatt_attr* attr, void* arg) { + auto client = static_cast(arg); return client->OnNewAlertSubcribe(conn_handle, error, attr); } } -AlertNotificationClient::AlertNotificationClient(Pinetime::System::SystemTask &systemTask, - Pinetime::Controllers::NotificationManager ¬ificationManager) : - systemTask{systemTask}, notificationManager{notificationManager} { +AlertNotificationClient::AlertNotificationClient(Pinetime::System::SystemTask& systemTask, + Pinetime::Controllers::NotificationManager& notificationManager) + : systemTask {systemTask}, notificationManager {notificationManager} { } -bool AlertNotificationClient::OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error *error, - const ble_gatt_svc *service) { +bool AlertNotificationClient::OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_svc* service) { if (service == nullptr && error->status == BLE_HS_EDONE) { if (isDiscovered) { NRF_LOG_INFO("ANS Discovery found, starting characteristics discovery"); - ble_gattc_disc_all_chrs(connectionHandle, ansStartHandle, ansEndHandle, - OnAlertNotificationCharacteristicDiscoveredCallback, this); + ble_gattc_disc_all_chrs(connectionHandle, ansStartHandle, ansEndHandle, OnAlertNotificationCharacteristicDiscoveredCallback, this); } else { NRF_LOG_INFO("ANS not found"); onServiceDiscovered(connectionHandle); @@ -63,7 +55,7 @@ bool AlertNotificationClient::OnDiscoveryEvent(uint16_t connectionHandle, const return true; } - if (service != nullptr && ble_uuid_cmp(((ble_uuid_t *) &ansServiceUuid), &service->uuid.u) == 0) { + if (service != nullptr && ble_uuid_cmp(((ble_uuid_t*) &ansServiceUuid), &service->uuid.u) == 0) { NRF_LOG_INFO("ANS discovered : 0x%x - 0x%x", service->start_handle, service->end_handle); ansStartHandle = service->start_handle; ansEndHandle = service->end_handle; @@ -72,8 +64,9 @@ bool AlertNotificationClient::OnDiscoveryEvent(uint16_t connectionHandle, const return false; } -int AlertNotificationClient::OnCharacteristicsDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error *error, - const ble_gatt_chr *characteristic) { +int AlertNotificationClient::OnCharacteristicsDiscoveryEvent(uint16_t connectionHandle, + const ble_gatt_error* error, + const ble_gatt_chr* characteristic) { if (error->status != 0 && error->status != BLE_HS_EDONE) { NRF_LOG_INFO("ANS Characteristic discovery ERROR"); onServiceDiscovered(connectionHandle); @@ -83,41 +76,34 @@ int AlertNotificationClient::OnCharacteristicsDiscoveryEvent(uint16_t connection if (characteristic == nullptr && error->status == BLE_HS_EDONE) { NRF_LOG_INFO("ANS Characteristic discovery complete"); if (isCharacteristicDiscovered) { - ble_gattc_disc_all_dscs(connectionHandle, - newAlertHandle, ansEndHandle, - OnAlertNotificationDescriptorDiscoveryEventCallback, this); + ble_gattc_disc_all_dscs(connectionHandle, newAlertHandle, ansEndHandle, OnAlertNotificationDescriptorDiscoveryEventCallback, this); } else onServiceDiscovered(connectionHandle); } else { - if (characteristic != nullptr && - ble_uuid_cmp(((ble_uuid_t *) &supportedNewAlertCategoryUuid), &characteristic->uuid.u) == 0) { + if (characteristic != nullptr && ble_uuid_cmp(((ble_uuid_t*) &supportedNewAlertCategoryUuid), &characteristic->uuid.u) == 0) { NRF_LOG_INFO("ANS Characteristic discovered : supportedNewAlertCategoryUuid"); supportedNewAlertCategoryHandle = characteristic->val_handle; - } else if (characteristic != nullptr && - ble_uuid_cmp(((ble_uuid_t *) &supportedUnreadAlertCategoryUuid), &characteristic->uuid.u) == 0) { + } else if (characteristic != nullptr && ble_uuid_cmp(((ble_uuid_t*) &supportedUnreadAlertCategoryUuid), &characteristic->uuid.u) == 0) { NRF_LOG_INFO("ANS Characteristic discovered : supportedUnreadAlertCategoryUuid"); supportedUnreadAlertCategoryHandle = characteristic->val_handle; - } else if (characteristic != nullptr && - ble_uuid_cmp(((ble_uuid_t *) &newAlertUuid), &characteristic->uuid.u) == 0) { + } else if (characteristic != nullptr && ble_uuid_cmp(((ble_uuid_t*) &newAlertUuid), &characteristic->uuid.u) == 0) { NRF_LOG_INFO("ANS Characteristic discovered : newAlertUuid"); newAlertHandle = characteristic->val_handle; newAlertDefHandle = characteristic->def_handle; isCharacteristicDiscovered = true; - } else if (characteristic != nullptr && - ble_uuid_cmp(((ble_uuid_t *) &unreadAlertStatusUuid), &characteristic->uuid.u) == 0) { + } else if (characteristic != nullptr && ble_uuid_cmp(((ble_uuid_t*) &unreadAlertStatusUuid), &characteristic->uuid.u) == 0) { NRF_LOG_INFO("ANS Characteristic discovered : unreadAlertStatusUuid"); unreadAlertStatusHandle = characteristic->val_handle; - } else if (characteristic != nullptr && - ble_uuid_cmp(((ble_uuid_t *) &controlPointUuid), &characteristic->uuid.u) == 0) { + } else if (characteristic != nullptr && ble_uuid_cmp(((ble_uuid_t*) &controlPointUuid), &characteristic->uuid.u) == 0) { NRF_LOG_INFO("ANS Characteristic discovered : controlPointUuid"); controlPointHandle = characteristic->val_handle; - } else NRF_LOG_INFO("ANS Characteristic discovered : 0x%x", characteristic->val_handle); + } else + NRF_LOG_INFO("ANS Characteristic discovered : 0x%x", characteristic->val_handle); } return 0; } -int AlertNotificationClient::OnNewAlertSubcribe(uint16_t connectionHandle, const ble_gatt_error *error, - ble_gatt_attr *attribute) { +int AlertNotificationClient::OnNewAlertSubcribe(uint16_t connectionHandle, const ble_gatt_error* error, ble_gatt_attr* attribute) { if (error->status == 0) { NRF_LOG_INFO("ANS New alert subscribe OK"); } else { @@ -128,12 +114,12 @@ int AlertNotificationClient::OnNewAlertSubcribe(uint16_t connectionHandle, const return 0; } -int AlertNotificationClient::OnDescriptorDiscoveryEventCallback(uint16_t connectionHandle, const ble_gatt_error *error, +int AlertNotificationClient::OnDescriptorDiscoveryEventCallback(uint16_t connectionHandle, + const ble_gatt_error* error, uint16_t characteristicValueHandle, - const ble_gatt_dsc *descriptor) { + const ble_gatt_dsc* descriptor) { if (error->status == 0) { - if (characteristicValueHandle == newAlertHandle && - ble_uuid_cmp(((ble_uuid_t *) &newAlertUuid), &descriptor->uuid.u)) { + if (characteristicValueHandle == newAlertHandle && ble_uuid_cmp(((ble_uuid_t*) &newAlertUuid), &descriptor->uuid.u)) { if (newAlertDescriptorHandle == 0) { NRF_LOG_INFO("ANS Descriptor discovered : %d", descriptor->handle); newAlertDescriptorHandle = descriptor->handle; @@ -151,16 +137,17 @@ int AlertNotificationClient::OnDescriptorDiscoveryEventCallback(uint16_t connect return 0; } -void AlertNotificationClient::OnNotification(ble_gap_event *event) { +void AlertNotificationClient::OnNotification(ble_gap_event* event) { if (event->notify_rx.attr_handle == newAlertHandle) { constexpr size_t stringTerminatorSize = 1; // end of string '\0' constexpr size_t headerSize = 3; - const auto maxMessageSize{NotificationManager::MaximumMessageSize()}; - const auto maxBufferSize{maxMessageSize + headerSize}; + const auto maxMessageSize {NotificationManager::MaximumMessageSize()}; + const auto maxBufferSize {maxMessageSize + headerSize}; // Ignore notifications with empty message const auto packetLen = OS_MBUF_PKTLEN(event->notify_rx.om); - if(packetLen <= headerSize) return; + if (packetLen <= headerSize) + return; size_t bufferSize = std::min(packetLen + stringTerminatorSize, maxBufferSize); auto messageSize = std::min(maxMessageSize, (bufferSize - headerSize)); diff --git a/src/components/ble/AlertNotificationClient.h b/src/components/ble/AlertNotificationClient.h index d49205e3..469bd4af 100644 --- a/src/components/ble/AlertNotificationClient.h +++ b/src/components/ble/AlertNotificationClient.h @@ -19,68 +19,52 @@ namespace Pinetime { class NotificationManager; class AlertNotificationClient : public BleClient { - public: - explicit AlertNotificationClient(Pinetime::System::SystemTask &systemTask, - Pinetime::Controllers::NotificationManager ¬ificationManager); + public: + explicit AlertNotificationClient(Pinetime::System::SystemTask& systemTask, + Pinetime::Controllers::NotificationManager& notificationManager); - bool OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error *error, const ble_gatt_svc *service); - int OnCharacteristicsDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error *error, - const ble_gatt_chr *characteristic); - int OnNewAlertSubcribe(uint16_t connectionHandle, const ble_gatt_error *error, ble_gatt_attr *attribute); - int OnDescriptorDiscoveryEventCallback(uint16_t connectionHandle, const ble_gatt_error *error, - uint16_t characteristicValueHandle, const ble_gatt_dsc *descriptor); - void OnNotification(ble_gap_event *event); - void Reset(); - void Discover(uint16_t connectionHandle, std::function lambda) override; + bool OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_svc* service); + int OnCharacteristicsDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic); + int OnNewAlertSubcribe(uint16_t connectionHandle, const ble_gatt_error* error, ble_gatt_attr* attribute); + int OnDescriptorDiscoveryEventCallback(uint16_t connectionHandle, + const ble_gatt_error* error, + uint16_t characteristicValueHandle, + const ble_gatt_dsc* descriptor); + void OnNotification(ble_gap_event* event); + void Reset(); + void Discover(uint16_t connectionHandle, std::function lambda) override; - private: - static constexpr uint16_t ansServiceId{0x1811}; - static constexpr uint16_t supportedNewAlertCategoryId = 0x2a47; - static constexpr uint16_t supportedUnreadAlertCategoryId = 0x2a48; - static constexpr uint16_t newAlertId = 0x2a46; - static constexpr uint16_t unreadAlertStatusId = 0x2a45; - static constexpr uint16_t controlPointId = 0x2a44; + private: + static constexpr uint16_t ansServiceId {0x1811}; + static constexpr uint16_t supportedNewAlertCategoryId = 0x2a47; + static constexpr uint16_t supportedUnreadAlertCategoryId = 0x2a48; + static constexpr uint16_t newAlertId = 0x2a46; + static constexpr uint16_t unreadAlertStatusId = 0x2a45; + static constexpr uint16_t controlPointId = 0x2a44; - static constexpr ble_uuid16_t ansServiceUuid{ - .u {.type = BLE_UUID_TYPE_16}, - .value = ansServiceId - }; - static constexpr ble_uuid16_t supportedNewAlertCategoryUuid{ - .u {.type = BLE_UUID_TYPE_16}, - .value = supportedNewAlertCategoryId - }; - static constexpr ble_uuid16_t supportedUnreadAlertCategoryUuid{ - .u {.type = BLE_UUID_TYPE_16}, - .value = supportedUnreadAlertCategoryId - }; - static constexpr ble_uuid16_t newAlertUuid{ - .u {.type = BLE_UUID_TYPE_16}, - .value = newAlertId - }; - static constexpr ble_uuid16_t unreadAlertStatusUuid{ - .u {.type = BLE_UUID_TYPE_16}, - .value = unreadAlertStatusId - }; - static constexpr ble_uuid16_t controlPointUuid{ - .u {.type = BLE_UUID_TYPE_16}, - .value = controlPointId - }; + static constexpr ble_uuid16_t ansServiceUuid {.u {.type = BLE_UUID_TYPE_16}, .value = ansServiceId}; + static constexpr ble_uuid16_t supportedNewAlertCategoryUuid {.u {.type = BLE_UUID_TYPE_16}, .value = supportedNewAlertCategoryId}; + static constexpr ble_uuid16_t supportedUnreadAlertCategoryUuid {.u {.type = BLE_UUID_TYPE_16}, + .value = supportedUnreadAlertCategoryId}; + static constexpr ble_uuid16_t newAlertUuid {.u {.type = BLE_UUID_TYPE_16}, .value = newAlertId}; + static constexpr ble_uuid16_t unreadAlertStatusUuid {.u {.type = BLE_UUID_TYPE_16}, .value = unreadAlertStatusId}; + static constexpr ble_uuid16_t controlPointUuid {.u {.type = BLE_UUID_TYPE_16}, .value = controlPointId}; - uint16_t ansStartHandle = 0; - uint16_t ansEndHandle = 0; - uint16_t supportedNewAlertCategoryHandle = 0; - uint16_t supportedUnreadAlertCategoryHandle = 0; - uint16_t newAlertHandle = 0; - uint16_t newAlertDescriptorHandle = 0; - uint16_t newAlertDefHandle = 0; - uint16_t unreadAlertStatusHandle = 0; - uint16_t controlPointHandle = 0; - bool isDiscovered = false; - Pinetime::System::SystemTask &systemTask; - Pinetime::Controllers::NotificationManager ¬ificationManager; - std::function onServiceDiscovered; - bool isCharacteristicDiscovered = false; - bool isDescriptorFound = false; + uint16_t ansStartHandle = 0; + uint16_t ansEndHandle = 0; + uint16_t supportedNewAlertCategoryHandle = 0; + uint16_t supportedUnreadAlertCategoryHandle = 0; + uint16_t newAlertHandle = 0; + uint16_t newAlertDescriptorHandle = 0; + uint16_t newAlertDefHandle = 0; + uint16_t unreadAlertStatusHandle = 0; + uint16_t controlPointHandle = 0; + bool isDiscovered = false; + Pinetime::System::SystemTask& systemTask; + Pinetime::Controllers::NotificationManager& notificationManager; + std::function onServiceDiscovered; + bool isCharacteristicDiscovered = false; + bool isDescriptorFound = false; }; } } diff --git a/src/components/ble/AlertNotificationService.cpp b/src/components/ble/AlertNotificationService.cpp index d91e2090..e9f5941e 100644 --- a/src/components/ble/AlertNotificationService.cpp +++ b/src/components/ble/AlertNotificationService.cpp @@ -11,8 +11,7 @@ constexpr ble_uuid16_t AlertNotificationService::ansUuid; constexpr ble_uuid16_t AlertNotificationService::ansCharUuid; constexpr ble_uuid128_t AlertNotificationService::notificationEventUuid; - -int AlertNotificationCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { +int AlertNotificationCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { auto anService = static_cast(arg); return anService->OnAlert(conn_handle, attr_handle, ctxt); } @@ -26,62 +25,52 @@ void AlertNotificationService::Init() { ASSERT(res == 0); } -AlertNotificationService::AlertNotificationService ( System::SystemTask& systemTask, NotificationManager& notificationManager ) - : characteristicDefinition{ - { - .uuid = (ble_uuid_t *) &ansCharUuid, - .access_cb = AlertNotificationCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE - }, - { - .uuid = (ble_uuid_t *) ¬ificationEventUuid, - .access_cb = AlertNotificationCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_NOTIFY, - .val_handle = &eventHandle - }, - { - 0 - } - }, - serviceDefinition{ - { - /* Device Information Service */ - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = (ble_uuid_t *) &ansUuid, - .characteristics = characteristicDefinition - }, - { - 0 - }, - }, systemTask{systemTask}, notificationManager{notificationManager} { +AlertNotificationService::AlertNotificationService(System::SystemTask& systemTask, NotificationManager& notificationManager) + : characteristicDefinition {{.uuid = (ble_uuid_t*) &ansCharUuid, + .access_cb = AlertNotificationCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE}, + {.uuid = (ble_uuid_t*) ¬ificationEventUuid, + .access_cb = AlertNotificationCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_NOTIFY, + .val_handle = &eventHandle}, + {0}}, + serviceDefinition { + {/* Device Information Service */ + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = (ble_uuid_t*) &ansUuid, + .characteristics = characteristicDefinition}, + {0}, + }, + systemTask {systemTask}, + notificationManager {notificationManager} { } -int AlertNotificationService::OnAlert(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt) { +int AlertNotificationService::OnAlert(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) { if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { constexpr size_t stringTerminatorSize = 1; // end of string '\0' constexpr size_t headerSize = 3; const auto maxMessageSize {NotificationManager::MaximumMessageSize()}; - const auto maxBufferSize{maxMessageSize + headerSize}; + const auto maxBufferSize {maxMessageSize + headerSize}; // Ignore notifications with empty message const auto packetLen = OS_MBUF_PKTLEN(ctxt->om); - if(packetLen <= headerSize) return 0; + if (packetLen <= headerSize) + return 0; size_t bufferSize = std::min(packetLen + stringTerminatorSize, maxBufferSize); - auto messageSize = std::min(maxMessageSize, (bufferSize-headerSize)); + auto messageSize = std::min(maxMessageSize, (bufferSize - headerSize)); Categories category; NotificationManager::Notification notif; - os_mbuf_copydata(ctxt->om, headerSize, messageSize-1, notif.message.data()); + os_mbuf_copydata(ctxt->om, headerSize, messageSize - 1, notif.message.data()); os_mbuf_copydata(ctxt->om, 0, 1, &category); - notif.message[messageSize-1] = '\0'; + notif.message[messageSize - 1] = '\0'; notif.size = messageSize; // TODO convert all ANS categories to NotificationController categories - switch(category) { + switch (category) { case Categories::Call: notif.category = Pinetime::Controllers::NotificationManager::Categories::IncomingCall; break; @@ -99,7 +88,7 @@ int AlertNotificationService::OnAlert(uint16_t conn_handle, uint16_t attr_handle void AlertNotificationService::AcceptIncomingCall() { auto response = IncomingCallResponses::Answer; - auto *om = ble_hs_mbuf_from_flat(&response, 1); + auto* om = ble_hs_mbuf_from_flat(&response, 1); uint16_t connectionHandle = systemTask.nimble().connHandle(); @@ -112,7 +101,7 @@ void AlertNotificationService::AcceptIncomingCall() { void AlertNotificationService::RejectIncomingCall() { auto response = IncomingCallResponses::Reject; - auto *om = ble_hs_mbuf_from_flat(&response, 1); + auto* om = ble_hs_mbuf_from_flat(&response, 1); uint16_t connectionHandle = systemTask.nimble().connHandle(); @@ -125,7 +114,7 @@ void AlertNotificationService::RejectIncomingCall() { void AlertNotificationService::MuteIncomingCall() { auto response = IncomingCallResponses::Mute; - auto *om = ble_hs_mbuf_from_flat(&response, 1); + auto* om = ble_hs_mbuf_from_flat(&response, 1); uint16_t connectionHandle = systemTask.nimble().connHandle(); diff --git a/src/components/ble/AlertNotificationService.h b/src/components/ble/AlertNotificationService.h index caad7a2b..66bb9be4 100644 --- a/src/components/ble/AlertNotificationService.h +++ b/src/components/ble/AlertNotificationService.h @@ -7,8 +7,9 @@ #undef max #undef min -//00020001-78fc-48fe-8e23-433b3a1942d0 -#define NOTIFICATION_EVENT_SERVICE_UUID_BASE {0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x01, 0x00, 0x02, 0x00} +// 00020001-78fc-48fe-8e23-433b3a1942d0 +#define NOTIFICATION_EVENT_SERVICE_UUID_BASE \ + { 0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x01, 0x00, 0x02, 0x00 } namespace Pinetime { @@ -19,64 +20,49 @@ namespace Pinetime { class NotificationManager; class AlertNotificationService { - public: - AlertNotificationService(Pinetime::System::SystemTask &systemTask, - Pinetime::Controllers::NotificationManager ¬ificationManager); - void Init(); + public: + AlertNotificationService(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::NotificationManager& notificationManager); + void Init(); - int OnAlert(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt); + int OnAlert(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt); - void AcceptIncomingCall(); - void RejectIncomingCall(); - void MuteIncomingCall(); + void AcceptIncomingCall(); + void RejectIncomingCall(); + void MuteIncomingCall(); - enum class IncomingCallResponses : uint8_t { - Reject = 0x00, - Answer = 0x01, - Mute = 0x02 - }; + enum class IncomingCallResponses : uint8_t { Reject = 0x00, Answer = 0x01, Mute = 0x02 }; - private: - enum class Categories : uint8_t { - SimpleAlert = 0x00, - Email = 0x01, - News = 0x02, - Call = 0x03, - MissedCall = 0x04, - MmsSms = 0x05, - VoiceMail = 0x06, - Schedule = 0x07, - HighPrioritizedAlert = 0x08, - InstantMessage = 0x09, - All = 0xff - }; + private: + enum class Categories : uint8_t { + SimpleAlert = 0x00, + Email = 0x01, + News = 0x02, + Call = 0x03, + MissedCall = 0x04, + MmsSms = 0x05, + VoiceMail = 0x06, + Schedule = 0x07, + HighPrioritizedAlert = 0x08, + InstantMessage = 0x09, + All = 0xff + }; - static constexpr uint16_t ansId {0x1811}; - static constexpr uint16_t ansCharId {0x2a46}; + static constexpr uint16_t ansId {0x1811}; + static constexpr uint16_t ansCharId {0x2a46}; - static constexpr ble_uuid16_t ansUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = ansId - }; + static constexpr ble_uuid16_t ansUuid {.u {.type = BLE_UUID_TYPE_16}, .value = ansId}; - static constexpr ble_uuid16_t ansCharUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = ansCharId - }; + static constexpr ble_uuid16_t ansCharUuid {.u {.type = BLE_UUID_TYPE_16}, .value = ansCharId}; - static constexpr ble_uuid128_t notificationEventUuid { - .u { .type = BLE_UUID_TYPE_128 }, - .value = NOTIFICATION_EVENT_SERVICE_UUID_BASE - }; + static constexpr ble_uuid128_t notificationEventUuid {.u {.type = BLE_UUID_TYPE_128}, .value = NOTIFICATION_EVENT_SERVICE_UUID_BASE}; - struct ble_gatt_chr_def characteristicDefinition[3]; - struct ble_gatt_svc_def serviceDefinition[2]; + struct ble_gatt_chr_def characteristicDefinition[3]; + struct ble_gatt_svc_def serviceDefinition[2]; - Pinetime::System::SystemTask &systemTask; - NotificationManager ¬ificationManager; + Pinetime::System::SystemTask& systemTask; + NotificationManager& notificationManager; - uint16_t eventHandle; + uint16_t eventHandle; }; } } diff --git a/src/components/ble/BatteryInformationService.cpp b/src/components/ble/BatteryInformationService.cpp index bc66ff72..10a78d67 100644 --- a/src/components/ble/BatteryInformationService.cpp +++ b/src/components/ble/BatteryInformationService.cpp @@ -7,39 +7,26 @@ using namespace Pinetime::Controllers; constexpr ble_uuid16_t BatteryInformationService::batteryInformationServiceUuid; constexpr ble_uuid16_t BatteryInformationService::batteryLevelUuid; - - -int BatteryInformationServiceCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { +int BatteryInformationServiceCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { auto* batteryInformationService = static_cast(arg); return batteryInformationService->OnBatteryServiceRequested(conn_handle, attr_handle, ctxt); } -BatteryInformationService::BatteryInformationService(Controllers::Battery& batteryController) : - batteryController{batteryController}, - characteristicDefinition{ - { - .uuid = (ble_uuid_t *) &batteryLevelUuid, - .access_cb = BatteryInformationServiceCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_READ, - .val_handle = &batteryLevelHandle - }, - { - 0 - } - }, - serviceDefinition{ - { - /* Device Information Service */ - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = (ble_uuid_t *) &batteryInformationServiceUuid, - .characteristics = characteristicDefinition - }, - { - 0 - }, - }{ - +BatteryInformationService::BatteryInformationService(Controllers::Battery& batteryController) + : batteryController {batteryController}, + characteristicDefinition {{.uuid = (ble_uuid_t*) &batteryLevelUuid, + .access_cb = BatteryInformationServiceCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_READ, + .val_handle = &batteryLevelHandle}, + {0}}, + serviceDefinition { + {/* Device Information Service */ + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = (ble_uuid_t*) &batteryInformationServiceUuid, + .characteristics = characteristicDefinition}, + {0}, + } { } void BatteryInformationService::Init() { @@ -51,9 +38,10 @@ void BatteryInformationService::Init() { ASSERT(res == 0); } -int BatteryInformationService::OnBatteryServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, - ble_gatt_access_ctxt *context) { - if(attributeHandle == batteryLevelHandle) { +int BatteryInformationService::OnBatteryServiceRequested(uint16_t connectionHandle, + uint16_t attributeHandle, + ble_gatt_access_ctxt* context) { + if (attributeHandle == batteryLevelHandle) { NRF_LOG_INFO("BATTERY : handle = %d", batteryLevelHandle); static uint8_t batteryValue = batteryController.PercentRemaining(); int res = os_mbuf_append(context->om, &batteryValue, 1); diff --git a/src/components/ble/BatteryInformationService.h b/src/components/ble/BatteryInformationService.h index b00000a4..59ed9c64 100644 --- a/src/components/ble/BatteryInformationService.h +++ b/src/components/ble/BatteryInformationService.h @@ -12,33 +12,25 @@ namespace Pinetime { namespace Controllers { class Battery; class BatteryInformationService { - public: - BatteryInformationService(Controllers::Battery& batteryController); - void Init(); + public: + BatteryInformationService(Controllers::Battery& batteryController); + void Init(); - int - OnBatteryServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt *context); + int OnBatteryServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context); - private: - Controllers::Battery& batteryController; - static constexpr uint16_t batteryInformationServiceId {0x180F}; - static constexpr uint16_t batteryLevelId {0x2A19}; + private: + Controllers::Battery& batteryController; + static constexpr uint16_t batteryInformationServiceId {0x180F}; + static constexpr uint16_t batteryLevelId {0x2A19}; - static constexpr ble_uuid16_t batteryInformationServiceUuid { - .u {.type = BLE_UUID_TYPE_16}, - .value = batteryInformationServiceId - }; + static constexpr ble_uuid16_t batteryInformationServiceUuid {.u {.type = BLE_UUID_TYPE_16}, .value = batteryInformationServiceId}; - static constexpr ble_uuid16_t batteryLevelUuid { - .u {.type = BLE_UUID_TYPE_16}, - .value = batteryLevelId - }; + static constexpr ble_uuid16_t batteryLevelUuid {.u {.type = BLE_UUID_TYPE_16}, .value = batteryLevelId}; - struct ble_gatt_chr_def characteristicDefinition[3]; - struct ble_gatt_svc_def serviceDefinition[2]; - - uint16_t batteryLevelHandle; + struct ble_gatt_chr_def characteristicDefinition[3]; + struct ble_gatt_svc_def serviceDefinition[2]; + uint16_t batteryLevelHandle; }; } } diff --git a/src/components/ble/BleClient.h b/src/components/ble/BleClient.h index 559f6c8d..d8a58e1c 100644 --- a/src/components/ble/BleClient.h +++ b/src/components/ble/BleClient.h @@ -3,10 +3,10 @@ #include namespace Pinetime { - namespace Controllers{ + namespace Controllers { class BleClient { - public: - virtual void Discover(uint16_t connectionHandle, std::function lambda) = 0; + public: + virtual void Discover(uint16_t connectionHandle, std::function lambda) = 0; }; } } \ No newline at end of file diff --git a/src/components/ble/BleController.cpp b/src/components/ble/BleController.cpp index 650ec79f..7c14aeb7 100644 --- a/src/components/ble/BleController.cpp +++ b/src/components/ble/BleController.cpp @@ -25,5 +25,3 @@ void Ble::FirmwareUpdateTotalBytes(uint32_t totalBytes) { void Ble::FirmwareUpdateCurrentBytes(uint32_t currentBytes) { firmwareUpdateCurrentBytes = currentBytes; } - - diff --git a/src/components/ble/BleController.h b/src/components/ble/BleController.h index 0570c8d0..6f5c2367 100644 --- a/src/components/ble/BleController.h +++ b/src/components/ble/BleController.h @@ -6,39 +6,57 @@ namespace Pinetime { namespace Controllers { class Ble { - public: - using BleAddress = std::array; - enum class FirmwareUpdateStates {Idle, Running, Validated, Error}; - enum class AddressTypes { Public, Random }; + public: + using BleAddress = std::array; + enum class FirmwareUpdateStates { Idle, Running, Validated, Error }; + enum class AddressTypes { Public, Random }; - Ble() = default; - bool IsConnected() const {return isConnected;} - void Connect(); - void Disconnect(); + Ble() = default; + bool IsConnected() const { + return isConnected; + } + void Connect(); + void Disconnect(); - void StartFirmwareUpdate(); - void StopFirmwareUpdate(); - void FirmwareUpdateTotalBytes(uint32_t totalBytes); - void FirmwareUpdateCurrentBytes(uint32_t currentBytes); - void State(FirmwareUpdateStates state) { firmwareUpdateState = state; } + void StartFirmwareUpdate(); + void StopFirmwareUpdate(); + void FirmwareUpdateTotalBytes(uint32_t totalBytes); + void FirmwareUpdateCurrentBytes(uint32_t currentBytes); + void State(FirmwareUpdateStates state) { + firmwareUpdateState = state; + } - bool IsFirmwareUpdating() const { return isFirmwareUpdating; } - uint32_t FirmwareUpdateTotalBytes() const { return firmwareUpdateTotalBytes; } - uint32_t FirmwareUpdateCurrentBytes() const { return firmwareUpdateCurrentBytes; } - FirmwareUpdateStates State() const { return firmwareUpdateState; } + bool IsFirmwareUpdating() const { + return isFirmwareUpdating; + } + uint32_t FirmwareUpdateTotalBytes() const { + return firmwareUpdateTotalBytes; + } + uint32_t FirmwareUpdateCurrentBytes() const { + return firmwareUpdateCurrentBytes; + } + FirmwareUpdateStates State() const { + return firmwareUpdateState; + } - void Address(BleAddress&& addr) { address = addr; } - const BleAddress& Address() const { return address; } - void AddressType(AddressTypes t) { addressType = t;} - private: - bool isConnected = false; - bool isFirmwareUpdating = false; - uint32_t firmwareUpdateTotalBytes = 0; - uint32_t firmwareUpdateCurrentBytes = 0; - FirmwareUpdateStates firmwareUpdateState = FirmwareUpdateStates::Idle; - BleAddress address; - AddressTypes addressType; + void Address(BleAddress&& addr) { + address = addr; + } + const BleAddress& Address() const { + return address; + } + void AddressType(AddressTypes t) { + addressType = t; + } + private: + bool isConnected = false; + bool isFirmwareUpdating = false; + uint32_t firmwareUpdateTotalBytes = 0; + uint32_t firmwareUpdateCurrentBytes = 0; + FirmwareUpdateStates firmwareUpdateState = FirmwareUpdateStates::Idle; + BleAddress address; + AddressTypes addressType; }; } } \ No newline at end of file diff --git a/src/components/ble/CurrentTimeClient.cpp b/src/components/ble/CurrentTimeClient.cpp index 758f636c..c6e68312 100644 --- a/src/components/ble/CurrentTimeClient.cpp +++ b/src/components/ble/CurrentTimeClient.cpp @@ -9,39 +9,37 @@ constexpr ble_uuid16_t CurrentTimeClient::ctsServiceUuid; constexpr ble_uuid16_t CurrentTimeClient::currentTimeCharacteristicUuid; namespace { - int OnDiscoveryEventCallback(uint16_t conn_handle, const struct ble_gatt_error *error, const struct ble_gatt_svc *service, void *arg) { - auto client = static_cast(arg); + int OnDiscoveryEventCallback(uint16_t conn_handle, const struct ble_gatt_error* error, const struct ble_gatt_svc* service, void* arg) { + auto client = static_cast(arg); return client->OnDiscoveryEvent(conn_handle, error, service); } - int OnCurrentTimeCharacteristicDiscoveredCallback(uint16_t conn_handle, const struct ble_gatt_error *error, - const struct ble_gatt_chr *chr, void *arg) { - auto client = static_cast(arg); + int OnCurrentTimeCharacteristicDiscoveredCallback(uint16_t conn_handle, + const struct ble_gatt_error* error, + const struct ble_gatt_chr* chr, + void* arg) { + auto client = static_cast(arg); return client->OnCharacteristicDiscoveryEvent(conn_handle, error, chr); } - int CurrentTimeReadCallback(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg) { - auto client = static_cast(arg); + int CurrentTimeReadCallback(uint16_t conn_handle, const struct ble_gatt_error* error, struct ble_gatt_attr* attr, void* arg) { + auto client = static_cast(arg); return client->OnCurrentTimeReadResult(conn_handle, error, attr); } } -CurrentTimeClient::CurrentTimeClient(DateTime &dateTimeController) : dateTimeController{dateTimeController} { - +CurrentTimeClient::CurrentTimeClient(DateTime& dateTimeController) : dateTimeController {dateTimeController} { } void CurrentTimeClient::Init() { - } -bool CurrentTimeClient::OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error *error, - const ble_gatt_svc *service) { +bool CurrentTimeClient::OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_svc* service) { if (service == nullptr && error->status == BLE_HS_EDONE) { if (isDiscovered) { NRF_LOG_INFO("CTS found, starting characteristics discovery"); - ble_gattc_disc_all_chrs(connectionHandle, ctsStartHandle, ctsEndHandle, - OnCurrentTimeCharacteristicDiscoveredCallback, this); + ble_gattc_disc_all_chrs(connectionHandle, ctsStartHandle, ctsEndHandle, OnCurrentTimeCharacteristicDiscoveredCallback, this); } else { NRF_LOG_INFO("CTS not found"); onServiceDiscovered(connectionHandle); @@ -49,7 +47,7 @@ bool CurrentTimeClient::OnDiscoveryEvent(uint16_t connectionHandle, const ble_ga return true; } - if (service != nullptr && ble_uuid_cmp(((ble_uuid_t *) &ctsServiceUuid), &service->uuid.u) == 0) { + if (service != nullptr && ble_uuid_cmp(((ble_uuid_t*) &ctsServiceUuid), &service->uuid.u) == 0) { NRF_LOG_INFO("CTS discovered : 0x%x - 0x%x", service->start_handle, service->end_handle); isDiscovered = true; ctsStartHandle = service->start_handle; @@ -59,8 +57,9 @@ bool CurrentTimeClient::OnDiscoveryEvent(uint16_t connectionHandle, const ble_ga return false; } -int CurrentTimeClient::OnCharacteristicDiscoveryEvent(uint16_t conn_handle, const ble_gatt_error *error, - const ble_gatt_chr *characteristic) { +int CurrentTimeClient::OnCharacteristicDiscoveryEvent(uint16_t conn_handle, + const ble_gatt_error* error, + const ble_gatt_chr* characteristic) { if (characteristic == nullptr && error->status == BLE_HS_EDONE) { if (isCharacteristicDiscovered) { NRF_LOG_INFO("CTS Characteristic discovery complete, fetching time"); @@ -73,8 +72,7 @@ int CurrentTimeClient::OnCharacteristicDiscoveryEvent(uint16_t conn_handle, cons return 0; } - if (characteristic != nullptr && - ble_uuid_cmp(((ble_uuid_t *) ¤tTimeCharacteristicUuid), &characteristic->uuid.u) == 0) { + if (characteristic != nullptr && ble_uuid_cmp(((ble_uuid_t*) ¤tTimeCharacteristicUuid), &characteristic->uuid.u) == 0) { NRF_LOG_INFO("CTS Characteristic discovered : 0x%x", characteristic->val_handle); isCharacteristicDiscovered = true; currentTimeHandle = characteristic->val_handle; @@ -82,17 +80,15 @@ int CurrentTimeClient::OnCharacteristicDiscoveryEvent(uint16_t conn_handle, cons return 0; } -int CurrentTimeClient::OnCurrentTimeReadResult(uint16_t conn_handle, const ble_gatt_error *error, - const ble_gatt_attr *attribute) { +int CurrentTimeClient::OnCurrentTimeReadResult(uint16_t conn_handle, const ble_gatt_error* error, const ble_gatt_attr* attribute) { if (error->status == 0) { // TODO check that attribute->handle equals the handle discovered in OnCharacteristicDiscoveryEvent CtsData result; os_mbuf_copydata(attribute->om, 0, sizeof(CtsData), &result); - NRF_LOG_INFO("Received data: %d-%d-%d %d:%d:%d", result.year, - result.month, result.dayofmonth, - result.hour, result.minute, result.second); - dateTimeController.SetTime(result.year, result.month, result.dayofmonth, - 0, result.hour, result.minute, result.second, nrf_rtc_counter_get(portNRF_RTC_REG)); + NRF_LOG_INFO( + "Received data: %d-%d-%d %d:%d:%d", result.year, result.month, result.dayofmonth, result.hour, result.minute, result.second); + dateTimeController.SetTime( + result.year, result.month, result.dayofmonth, 0, result.hour, result.minute, result.second, nrf_rtc_counter_get(portNRF_RTC_REG)); } else { NRF_LOG_INFO("Error retrieving current time: %d", error->status); } diff --git a/src/components/ble/CurrentTimeClient.h b/src/components/ble/CurrentTimeClient.h index 1b2e018c..c48a016d 100644 --- a/src/components/ble/CurrentTimeClient.h +++ b/src/components/ble/CurrentTimeClient.h @@ -8,54 +8,51 @@ #include "BleClient.h" namespace Pinetime { - namespace Controllers { - class DateTime; + namespace Controllers { + class DateTime; - class CurrentTimeClient : public BleClient { + class CurrentTimeClient : public BleClient { public: - explicit CurrentTimeClient(DateTime& dateTimeController); - void Init(); - void Reset(); - bool OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error *error, const ble_gatt_svc *service); - int OnCharacteristicDiscoveryEvent(uint16_t conn_handle, const ble_gatt_error *error, - const ble_gatt_chr *characteristic); - int OnCurrentTimeReadResult(uint16_t conn_handle, const ble_gatt_error *error, const ble_gatt_attr *attribute); - static constexpr const ble_uuid16_t* Uuid() { return &CurrentTimeClient::ctsServiceUuid; } - static constexpr const ble_uuid16_t* CurrentTimeCharacteristicUuid() { return &CurrentTimeClient::currentTimeCharacteristicUuid; } - void Discover(uint16_t connectionHandle, std::function lambda) override; + explicit CurrentTimeClient(DateTime& dateTimeController); + void Init(); + void Reset(); + bool OnDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_svc* service); + int OnCharacteristicDiscoveryEvent(uint16_t conn_handle, const ble_gatt_error* error, const ble_gatt_chr* characteristic); + int OnCurrentTimeReadResult(uint16_t conn_handle, const ble_gatt_error* error, const ble_gatt_attr* attribute); + static constexpr const ble_uuid16_t* Uuid() { + return &CurrentTimeClient::ctsServiceUuid; + } + static constexpr const ble_uuid16_t* CurrentTimeCharacteristicUuid() { + return &CurrentTimeClient::currentTimeCharacteristicUuid; + } + void Discover(uint16_t connectionHandle, std::function lambda) override; - private: - typedef struct __attribute__((packed)) { - uint16_t year; - uint8_t month; - uint8_t dayofmonth; - uint8_t hour; - uint8_t minute; - uint8_t second; - uint8_t millis; - uint8_t reason; - } CtsData; + private: + typedef struct __attribute__((packed)) { + uint16_t year; + uint8_t month; + uint8_t dayofmonth; + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t millis; + uint8_t reason; + } CtsData; - static constexpr uint16_t ctsServiceId {0x1805}; - static constexpr uint16_t currentTimeCharacteristicId {0x2a2b}; + static constexpr uint16_t ctsServiceId {0x1805}; + static constexpr uint16_t currentTimeCharacteristicId {0x2a2b}; - static constexpr ble_uuid16_t ctsServiceUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = ctsServiceId - }; - static constexpr ble_uuid16_t currentTimeCharacteristicUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = currentTimeCharacteristicId - }; + static constexpr ble_uuid16_t ctsServiceUuid {.u {.type = BLE_UUID_TYPE_16}, .value = ctsServiceId}; + static constexpr ble_uuid16_t currentTimeCharacteristicUuid {.u {.type = BLE_UUID_TYPE_16}, .value = currentTimeCharacteristicId}; - DateTime& dateTimeController; - bool isDiscovered = false; - uint16_t ctsStartHandle; - uint16_t ctsEndHandle; + DateTime& dateTimeController; + bool isDiscovered = false; + uint16_t ctsStartHandle; + uint16_t ctsEndHandle; - bool isCharacteristicDiscovered = false; - uint16_t currentTimeHandle; - std::function onServiceDiscovered; - }; - } + bool isCharacteristicDiscovered = false; + uint16_t currentTimeHandle; + std::function onServiceDiscovered; + }; + } } \ No newline at end of file diff --git a/src/components/ble/CurrentTimeService.cpp b/src/components/ble/CurrentTimeService.cpp index 9f14edc7..b49be39c 100644 --- a/src/components/ble/CurrentTimeService.cpp +++ b/src/components/ble/CurrentTimeService.cpp @@ -7,8 +7,7 @@ using namespace Pinetime::Controllers; constexpr ble_uuid16_t CurrentTimeService::ctsUuid; constexpr ble_uuid16_t CurrentTimeService::ctChrUuid; - -int CTSCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { +int CTSCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { auto cts = static_cast(arg); return cts->OnTimeAccessed(conn_handle, attr_handle, ctxt); } @@ -22,22 +21,19 @@ void CurrentTimeService::Init() { ASSERT(res == 0); } +int CurrentTimeService::OnTimeAccessed(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) { -int CurrentTimeService::OnTimeAccessed(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt) { - - NRF_LOG_INFO("Setting time..."); + NRF_LOG_INFO("Setting time..."); if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { CtsData result; os_mbuf_copydata(ctxt->om, 0, sizeof(CtsData), &result); - NRF_LOG_INFO("Received data: %d-%d-%d %d:%d:%d", result.year, - result.month, result.dayofmonth, - result.hour, result.minute, result.second); + NRF_LOG_INFO( + "Received data: %d-%d-%d %d:%d:%d", result.year, result.month, result.dayofmonth, result.hour, result.minute, result.second); - m_dateTimeController.SetTime(result.year, result.month, result.dayofmonth, - 0, result.hour, result.minute, result.second, nrf_rtc_counter_get(portNRF_RTC_REG)); + m_dateTimeController.SetTime( + result.year, result.month, result.dayofmonth, 0, result.hour, result.minute, result.second, nrf_rtc_counter_get(portNRF_RTC_REG)); } else if (ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) { CtsData currentDateTime; @@ -49,39 +45,26 @@ int CurrentTimeService::OnTimeAccessed(uint16_t conn_handle, uint16_t attr_handl currentDateTime.second = m_dateTimeController.Seconds(); currentDateTime.millis = 0; - int res = os_mbuf_append(ctxt->om, ¤tDateTime, sizeof(CtsData)); return (res == 0) ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; - } return 0; } -CurrentTimeService::CurrentTimeService(DateTime &dateTimeController) : - characteristicDefinition{ - { - .uuid = (ble_uuid_t *) &ctChrUuid, - .access_cb = CTSCallback, - - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }, - { - 0 - } - }, - serviceDefinition{ - { - /* Device Information Service */ - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = (ble_uuid_t *) &ctsUuid, - .characteristics = characteristicDefinition - }, - { - 0 - }, - }, m_dateTimeController{dateTimeController} { +CurrentTimeService::CurrentTimeService(DateTime& dateTimeController) + : characteristicDefinition {{.uuid = (ble_uuid_t*) &ctChrUuid, + .access_cb = CTSCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}, + {0}}, + serviceDefinition { + {/* Device Information Service */ + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = (ble_uuid_t*) &ctsUuid, + .characteristics = characteristicDefinition}, + {0}, + }, + m_dateTimeController {dateTimeController} { } - diff --git a/src/components/ble/CurrentTimeService.h b/src/components/ble/CurrentTimeService.h index 23956283..0a9a18a8 100644 --- a/src/components/ble/CurrentTimeService.h +++ b/src/components/ble/CurrentTimeService.h @@ -12,42 +12,35 @@ namespace Pinetime { namespace Controllers { class CurrentTimeService { - public: - CurrentTimeService(DateTime &dateTimeController); - void Init(); + public: + CurrentTimeService(DateTime& dateTimeController); + void Init(); - int OnTimeAccessed(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt); + int OnTimeAccessed(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt); - private: - static constexpr uint16_t ctsId {0x1805}; - static constexpr uint16_t ctsCharId {0x2a2b}; + private: + static constexpr uint16_t ctsId {0x1805}; + static constexpr uint16_t ctsCharId {0x2a2b}; - static constexpr ble_uuid16_t ctsUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = ctsId - }; + static constexpr ble_uuid16_t ctsUuid {.u {.type = BLE_UUID_TYPE_16}, .value = ctsId}; - static constexpr ble_uuid16_t ctChrUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = ctsCharId - }; + static constexpr ble_uuid16_t ctChrUuid {.u {.type = BLE_UUID_TYPE_16}, .value = ctsCharId}; - struct ble_gatt_chr_def characteristicDefinition[2]; - struct ble_gatt_svc_def serviceDefinition[2]; + struct ble_gatt_chr_def characteristicDefinition[2]; + struct ble_gatt_svc_def serviceDefinition[2]; - typedef struct __attribute__((packed)) { - uint16_t year; - uint8_t month; - uint8_t dayofmonth; - uint8_t hour; - uint8_t minute; - uint8_t second; - uint8_t millis; - uint8_t reason; - } CtsData; + typedef struct __attribute__((packed)) { + uint16_t year; + uint8_t month; + uint8_t dayofmonth; + uint8_t hour; + uint8_t minute; + uint8_t second; + uint8_t millis; + uint8_t reason; + } CtsData; - DateTime &m_dateTimeController; + DateTime& m_dateTimeController; }; } } diff --git a/src/components/ble/DeviceInformationService.cpp b/src/components/ble/DeviceInformationService.cpp index 406db1cf..cf482079 100644 --- a/src/components/ble/DeviceInformationService.cpp +++ b/src/components/ble/DeviceInformationService.cpp @@ -10,8 +10,7 @@ constexpr ble_uuid16_t DeviceInformationService::deviceInfoUuid; constexpr ble_uuid16_t DeviceInformationService::hwRevisionUuid; constexpr ble_uuid16_t DeviceInformationService::swRevisionUuid; - -int DeviceInformationCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { +int DeviceInformationCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { auto deviceInformationService = static_cast(arg); return deviceInformationService->OnDeviceInfoRequested(conn_handle, attr_handle, ctxt); } @@ -25,10 +24,8 @@ void DeviceInformationService::Init() { ASSERT(res == 0); } - -int DeviceInformationService::OnDeviceInfoRequested(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt) { - const char *str; +int DeviceInformationService::OnDeviceInfoRequested(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) { + const char* str; switch (ble_uuid_u16(ctxt->chr->uuid)) { case manufacturerNameId: @@ -57,60 +54,49 @@ int DeviceInformationService::OnDeviceInfoRequested(uint16_t conn_handle, uint16 return (res == 0) ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; } -DeviceInformationService::DeviceInformationService() : - characteristicDefinition{ - { - .uuid = (ble_uuid_t *) &manufacturerNameUuid, - .access_cb = DeviceInformationCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_READ, - }, - { - .uuid = (ble_uuid_t *) &modelNumberUuid, - .access_cb = DeviceInformationCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_READ, - }, - { - .uuid = (ble_uuid_t *) &serialNumberUuid, - .access_cb = DeviceInformationCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_READ, - }, - { - .uuid = (ble_uuid_t *) &fwRevisionUuid, - .access_cb = DeviceInformationCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_READ, - }, - { - .uuid = (ble_uuid_t *) &hwRevisionUuid, - .access_cb = DeviceInformationCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_READ, - }, - { - .uuid = (ble_uuid_t *) &swRevisionUuid, - .access_cb = DeviceInformationCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_READ, - }, - { - 0 - } - }, - serviceDefinition{ - { - /* Device Information Service */ - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = (ble_uuid_t *) &deviceInfoUuid, - .characteristics = characteristicDefinition - }, - { - 0 - }, - } - { - +DeviceInformationService::DeviceInformationService() + : characteristicDefinition {{ + .uuid = (ble_uuid_t*) &manufacturerNameUuid, + .access_cb = DeviceInformationCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_READ, + }, + { + .uuid = (ble_uuid_t*) &modelNumberUuid, + .access_cb = DeviceInformationCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_READ, + }, + { + .uuid = (ble_uuid_t*) &serialNumberUuid, + .access_cb = DeviceInformationCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_READ, + }, + { + .uuid = (ble_uuid_t*) &fwRevisionUuid, + .access_cb = DeviceInformationCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_READ, + }, + { + .uuid = (ble_uuid_t*) &hwRevisionUuid, + .access_cb = DeviceInformationCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_READ, + }, + { + .uuid = (ble_uuid_t*) &swRevisionUuid, + .access_cb = DeviceInformationCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_READ, + }, + {0}}, + serviceDefinition { + {/* Device Information Service */ + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = (ble_uuid_t*) &deviceInfoUuid, + .characteristics = characteristicDefinition}, + {0}, + } { } - diff --git a/src/components/ble/DeviceInformationService.h b/src/components/ble/DeviceInformationService.h index 94ca7bbf..3ff48b6d 100644 --- a/src/components/ble/DeviceInformationService.h +++ b/src/components/ble/DeviceInformationService.h @@ -9,69 +9,44 @@ namespace Pinetime { namespace Controllers { class DeviceInformationService { - public: - DeviceInformationService(); - void Init(); + public: + DeviceInformationService(); + void Init(); - int OnDeviceInfoRequested(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt); + int OnDeviceInfoRequested(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt); - private: - static constexpr uint16_t deviceInfoId {0x180a}; - static constexpr uint16_t manufacturerNameId {0x2a29}; - static constexpr uint16_t modelNumberId {0x2a24}; - static constexpr uint16_t serialNumberId {0x2a25}; - static constexpr uint16_t fwRevisionId {0x2a26}; - static constexpr uint16_t hwRevisionId {0x2a27}; - static constexpr uint16_t swRevisionId {0x2a28}; + private: + static constexpr uint16_t deviceInfoId {0x180a}; + static constexpr uint16_t manufacturerNameId {0x2a29}; + static constexpr uint16_t modelNumberId {0x2a24}; + static constexpr uint16_t serialNumberId {0x2a25}; + static constexpr uint16_t fwRevisionId {0x2a26}; + static constexpr uint16_t hwRevisionId {0x2a27}; + static constexpr uint16_t swRevisionId {0x2a28}; - static constexpr const char* manufacturerName = "PINE64"; - static constexpr const char* modelNumber = "PineTime"; - static constexpr const char* hwRevision = "1.0.0"; - static constexpr const char* serialNumber = "0"; - static constexpr const char* fwRevision = Version::VersionString(); - static constexpr const char* swRevision = "InfiniTime"; + static constexpr const char* manufacturerName = "PINE64"; + static constexpr const char* modelNumber = "PineTime"; + static constexpr const char* hwRevision = "1.0.0"; + static constexpr const char* serialNumber = "0"; + static constexpr const char* fwRevision = Version::VersionString(); + static constexpr const char* swRevision = "InfiniTime"; + static constexpr ble_uuid16_t deviceInfoUuid {.u {.type = BLE_UUID_TYPE_16}, .value = deviceInfoId}; - static constexpr ble_uuid16_t deviceInfoUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = deviceInfoId - }; + static constexpr ble_uuid16_t manufacturerNameUuid {.u {.type = BLE_UUID_TYPE_16}, .value = manufacturerNameId}; - static constexpr ble_uuid16_t manufacturerNameUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = manufacturerNameId - }; + static constexpr ble_uuid16_t modelNumberUuid {.u {.type = BLE_UUID_TYPE_16}, .value = modelNumberId}; - static constexpr ble_uuid16_t modelNumberUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = modelNumberId - }; + static constexpr ble_uuid16_t serialNumberUuid {.u {.type = BLE_UUID_TYPE_16}, .value = serialNumberId}; - static constexpr ble_uuid16_t serialNumberUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = serialNumberId - }; + static constexpr ble_uuid16_t fwRevisionUuid {.u {.type = BLE_UUID_TYPE_16}, .value = fwRevisionId}; - static constexpr ble_uuid16_t fwRevisionUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = fwRevisionId - }; - - static constexpr ble_uuid16_t hwRevisionUuid { - .u {.type = BLE_UUID_TYPE_16}, - .value = hwRevisionId - }; - - static constexpr ble_uuid16_t swRevisionUuid { - .u {.type = BLE_UUID_TYPE_16}, - .value = swRevisionId - }; - - struct ble_gatt_chr_def characteristicDefinition[7]; - struct ble_gatt_svc_def serviceDefinition[2]; + static constexpr ble_uuid16_t hwRevisionUuid {.u {.type = BLE_UUID_TYPE_16}, .value = hwRevisionId}; + static constexpr ble_uuid16_t swRevisionUuid {.u {.type = BLE_UUID_TYPE_16}, .value = swRevisionId}; + struct ble_gatt_chr_def characteristicDefinition[7]; + struct ble_gatt_svc_def serviceDefinition[2]; }; } } \ No newline at end of file diff --git a/src/components/ble/DfuService.cpp b/src/components/ble/DfuService.cpp index 90795b49..2031668e 100644 --- a/src/components/ble/DfuService.cpp +++ b/src/components/ble/DfuService.cpp @@ -11,67 +11,60 @@ constexpr ble_uuid128_t DfuService::controlPointCharacteristicUuid; constexpr ble_uuid128_t DfuService::revisionCharacteristicUuid; constexpr ble_uuid128_t DfuService::packetCharacteristicUuid; -int DfuServiceCallback(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt, void *arg) { - auto dfuService = static_cast(arg); +int DfuServiceCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { + auto dfuService = static_cast(arg); return dfuService->OnServiceData(conn_handle, attr_handle, ctxt); } void NotificationTimerCallback(TimerHandle_t xTimer) { - auto notificationManager = static_cast(pvTimerGetTimerID(xTimer)); + auto notificationManager = static_cast(pvTimerGetTimerID(xTimer)); notificationManager->OnNotificationTimer(); } void TimeoutTimerCallback(TimerHandle_t xTimer) { - auto dfuService = static_cast(pvTimerGetTimerID(xTimer)); + auto dfuService = static_cast(pvTimerGetTimerID(xTimer)); dfuService->OnTimeout(); } -DfuService::DfuService(Pinetime::System::SystemTask &systemTask, Pinetime::Controllers::Ble &bleController, - Pinetime::Drivers::SpiNorFlash &spiNorFlash) : - systemTask{systemTask}, - bleController{bleController}, - dfuImage{spiNorFlash}, - characteristicDefinition{ - { - .uuid = (ble_uuid_t *) &packetCharacteristicUuid, - .access_cb = DfuServiceCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE_NO_RSP, - .val_handle = nullptr, - }, - { - .uuid = (ble_uuid_t *) &controlPointCharacteristicUuid, - .access_cb = DfuServiceCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_NOTIFY, - .val_handle = nullptr, - }, - { - .uuid = (ble_uuid_t *) &revisionCharacteristicUuid, - .access_cb = DfuServiceCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_READ, - .val_handle = &revision, +DfuService::DfuService(Pinetime::System::SystemTask& systemTask, + Pinetime::Controllers::Ble& bleController, + Pinetime::Drivers::SpiNorFlash& spiNorFlash) + : systemTask {systemTask}, + bleController {bleController}, + dfuImage {spiNorFlash}, + characteristicDefinition {{ + .uuid = (ble_uuid_t*) &packetCharacteristicUuid, + .access_cb = DfuServiceCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE_NO_RSP, + .val_handle = nullptr, + }, + { + .uuid = (ble_uuid_t*) &controlPointCharacteristicUuid, + .access_cb = DfuServiceCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_NOTIFY, + .val_handle = nullptr, + }, + { + .uuid = (ble_uuid_t*) &revisionCharacteristicUuid, + .access_cb = DfuServiceCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_READ, + .val_handle = &revision, - }, - { - 0 - } + }, + {0} - }, - serviceDefinition{ - { - /* Device Information Service */ - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = (ble_uuid_t *) &serviceUuid, - .characteristics = characteristicDefinition - }, - { - 0 - }, - } { - timeoutTimer = xTimerCreate ("notificationTimer", 10000, pdFALSE, this, TimeoutTimerCallback); + }, + serviceDefinition { + {/* Device Information Service */ + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = (ble_uuid_t*) &serviceUuid, + .characteristics = characteristicDefinition}, + {0}, + } { + timeoutTimer = xTimerCreate("notificationTimer", 10000, pdFALSE, this, TimeoutTimerCallback); } void DfuService::Init() { @@ -83,55 +76,54 @@ void DfuService::Init() { ASSERT(res == 0); } -int DfuService::OnServiceData(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt *context) { - if(bleController.IsFirmwareUpdating()){ +int DfuService::OnServiceData(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context) { + if (bleController.IsFirmwareUpdating()) { xTimerStart(timeoutTimer, 0); } - - ble_gatts_find_chr((ble_uuid_t *) &serviceUuid, (ble_uuid_t *) &packetCharacteristicUuid, nullptr, - &packetCharacteristicHandle); - ble_gatts_find_chr((ble_uuid_t *) &serviceUuid, (ble_uuid_t *) &controlPointCharacteristicUuid, nullptr, - &controlPointCharacteristicHandle); - ble_gatts_find_chr((ble_uuid_t *) &serviceUuid, (ble_uuid_t *) &revisionCharacteristicUuid, nullptr, - &revisionCharacteristicHandle); + ble_gatts_find_chr((ble_uuid_t*) &serviceUuid, (ble_uuid_t*) &packetCharacteristicUuid, nullptr, &packetCharacteristicHandle); + ble_gatts_find_chr((ble_uuid_t*) &serviceUuid, (ble_uuid_t*) &controlPointCharacteristicUuid, nullptr, &controlPointCharacteristicHandle); + ble_gatts_find_chr((ble_uuid_t*) &serviceUuid, (ble_uuid_t*) &revisionCharacteristicUuid, nullptr, &revisionCharacteristicHandle); if (attributeHandle == packetCharacteristicHandle) { if (context->op == BLE_GATT_ACCESS_OP_WRITE_CHR) return WritePacketHandler(connectionHandle, context->om); - else return 0; + else + return 0; } else if (attributeHandle == controlPointCharacteristicHandle) { if (context->op == BLE_GATT_ACCESS_OP_WRITE_CHR) return ControlPointHandler(connectionHandle, context->om); - else return 0; + else + return 0; } else if (attributeHandle == revisionCharacteristicHandle) { if (context->op == BLE_GATT_ACCESS_OP_READ_CHR) return SendDfuRevision(context->om); - else return 0; + else + return 0; } else { NRF_LOG_INFO("[DFU] Unknown Characteristic : %d", attributeHandle); return 0; } } -int DfuService::SendDfuRevision(os_mbuf *om) const { +int DfuService::SendDfuRevision(os_mbuf* om) const { int res = os_mbuf_append(om, &revision, sizeof(revision)); return (res == 0) ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES; } -int DfuService::WritePacketHandler(uint16_t connectionHandle, os_mbuf *om) { +int DfuService::WritePacketHandler(uint16_t connectionHandle, os_mbuf* om) { switch (state) { case States::Start: { softdeviceSize = om->om_data[0] + (om->om_data[1] << 8) + (om->om_data[2] << 16) + (om->om_data[3] << 24); bootloaderSize = om->om_data[4] + (om->om_data[5] << 8) + (om->om_data[6] << 16) + (om->om_data[7] << 24); applicationSize = om->om_data[8] + (om->om_data[9] << 8) + (om->om_data[10] << 16) + (om->om_data[11] << 24); bleController.FirmwareUpdateTotalBytes(applicationSize); - NRF_LOG_INFO("[DFU] -> Start data received : SD size : %d, BT size : %d, app size : %d", softdeviceSize, - bootloaderSize, applicationSize); + NRF_LOG_INFO( + "[DFU] -> Start data received : SD size : %d, BT size : %d, app size : %d", softdeviceSize, bootloaderSize, applicationSize); dfuImage.Erase(); - uint8_t data[]{16, 1, 1}; + uint8_t data[] {16, 1, 1}; notificationManager.Send(connectionHandle, controlPointCharacteristicHandle, data, 3); state = States::Init; } @@ -139,19 +131,22 @@ int DfuService::WritePacketHandler(uint16_t connectionHandle, os_mbuf *om) { case States::Init: { uint16_t deviceType = om->om_data[0] + (om->om_data[1] << 8); uint16_t deviceRevision = om->om_data[2] + (om->om_data[3] << 8); - uint32_t applicationVersion = - om->om_data[4] + (om->om_data[5] << 8) + (om->om_data[6] << 16) + (om->om_data[7] << 24); + uint32_t applicationVersion = om->om_data[4] + (om->om_data[5] << 8) + (om->om_data[6] << 16) + (om->om_data[7] << 24); uint16_t softdeviceArrayLength = om->om_data[8] + (om->om_data[9] << 8); uint16_t sd[softdeviceArrayLength]; for (int i = 0; i < softdeviceArrayLength; i++) { sd[i] = om->om_data[10 + (i * 2)] + (om->om_data[10 + (i * 2) + 1] << 8); } - expectedCrc = - om->om_data[10 + (softdeviceArrayLength * 2)] + (om->om_data[10 + (softdeviceArrayLength * 2) + 1] << 8); + expectedCrc = om->om_data[10 + (softdeviceArrayLength * 2)] + (om->om_data[10 + (softdeviceArrayLength * 2) + 1] << 8); NRF_LOG_INFO( - "[DFU] -> Init data received : deviceType = %d, deviceRevision = %d, applicationVersion = %d, nb SD = %d, First SD = %d, CRC = %u", - deviceType, deviceRevision, applicationVersion, softdeviceArrayLength, sd[0], expectedCrc); + "[DFU] -> Init data received : deviceType = %d, deviceRevision = %d, applicationVersion = %d, nb SD = %d, First SD = %d, CRC = %u", + deviceType, + deviceRevision, + applicationVersion, + softdeviceArrayLength, + sd[0], + expectedCrc); return 0; } @@ -163,16 +158,18 @@ int DfuService::WritePacketHandler(uint16_t connectionHandle, os_mbuf *om) { bleController.FirmwareUpdateCurrentBytes(bytesReceived); if ((nbPacketReceived % nbPacketsToNotify) == 0 && bytesReceived != applicationSize) { - uint8_t data[5]{static_cast(Opcodes::PacketReceiptNotification), - (uint8_t) (bytesReceived & 0x000000FFu), (uint8_t) (bytesReceived >> 8u), - (uint8_t) (bytesReceived >> 16u), (uint8_t) (bytesReceived >> 24u)}; + uint8_t data[5] {static_cast(Opcodes::PacketReceiptNotification), + (uint8_t) (bytesReceived & 0x000000FFu), + (uint8_t) (bytesReceived >> 8u), + (uint8_t) (bytesReceived >> 16u), + (uint8_t) (bytesReceived >> 24u)}; NRF_LOG_INFO("[DFU] -> Send packet notification: %d bytes received", bytesReceived); notificationManager.Send(connectionHandle, controlPointCharacteristicHandle, data, 5); } if (dfuImage.IsComplete()) { - uint8_t data[3]{static_cast(Opcodes::Response), - static_cast(Opcodes::ReceiveFirmwareImage), - static_cast(ErrorCodes::NoError)}; + uint8_t data[3] {static_cast(Opcodes::Response), + static_cast(Opcodes::ReceiveFirmwareImage), + static_cast(ErrorCodes::NoError)}; NRF_LOG_INFO("[DFU] -> Send packet notification : all bytes received!"); notificationManager.Send(connectionHandle, controlPointCharacteristicHandle, data, 3); state = States::Validate; @@ -186,7 +183,7 @@ int DfuService::WritePacketHandler(uint16_t connectionHandle, os_mbuf *om) { return 0; } -int DfuService::ControlPointHandler(uint16_t connectionHandle, os_mbuf *om) { +int DfuService::ControlPointHandler(uint16_t connectionHandle, os_mbuf* om) { auto opcode = static_cast(om->om_data[0]); NRF_LOG_INFO("[DFU] -> ControlPointHandler"); @@ -214,8 +211,7 @@ int DfuService::ControlPointHandler(uint16_t connectionHandle, os_mbuf *om) { NRF_LOG_INFO("[DFU] -> Start DFU, mode %d not supported!", imageType); return 0; } - } - break; + } break; case Opcodes::InitDFUParameters: { if (state != States::Init) { NRF_LOG_INFO("[DFU] -> Init DFU requested, but we are not in Init state"); @@ -225,11 +221,9 @@ int DfuService::ControlPointHandler(uint16_t connectionHandle, os_mbuf *om) { NRF_LOG_INFO("[DFU] -> Init DFU parameters %s", isInitComplete ? " complete" : " not complete"); if (isInitComplete) { - uint8_t data[3] { - static_cast(Opcodes::Response), - static_cast(Opcodes::InitDFUParameters), - (isInitComplete ? uint8_t{1} : uint8_t{0}) - }; + uint8_t data[3] {static_cast(Opcodes::Response), + static_cast(Opcodes::InitDFUParameters), + (isInitComplete ? uint8_t {1} : uint8_t {0})}; notificationManager.AsyncSend(connectionHandle, controlPointCharacteristicHandle, data, 3); return 0; } @@ -257,26 +251,22 @@ int DfuService::ControlPointHandler(uint16_t connectionHandle, os_mbuf *om) { NRF_LOG_INFO("[DFU] -> Validate firmware image requested -- %d", connectionHandle); - if(dfuImage.Validate()){ + if (dfuImage.Validate()) { state = States::Validated; bleController.State(Pinetime::Controllers::Ble::FirmwareUpdateStates::Validated); NRF_LOG_INFO("Image OK"); - uint8_t data[3] { - static_cast(Opcodes::Response), - static_cast(Opcodes::ValidateFirmware), - static_cast(ErrorCodes::NoError) - }; + uint8_t data[3] {static_cast(Opcodes::Response), + static_cast(Opcodes::ValidateFirmware), + static_cast(ErrorCodes::NoError)}; notificationManager.AsyncSend(connectionHandle, controlPointCharacteristicHandle, data, 3); } else { bleController.State(Pinetime::Controllers::Ble::FirmwareUpdateStates::Error); NRF_LOG_INFO("Image Error : bad CRC"); - uint8_t data[3] { - static_cast(Opcodes::Response), - static_cast(Opcodes::ValidateFirmware), - static_cast(ErrorCodes::CrcError) - }; + uint8_t data[3] {static_cast(Opcodes::Response), + static_cast(Opcodes::ValidateFirmware), + static_cast(ErrorCodes::CrcError)}; notificationManager.AsyncSend(connectionHandle, controlPointCharacteristicHandle, data, 3); } @@ -318,11 +308,11 @@ void DfuService::Reset() { } DfuService::NotificationManager::NotificationManager() { - timer = xTimerCreate ("notificationTimer", 1000, pdFALSE, this, NotificationTimerCallback); + timer = xTimerCreate("notificationTimer", 1000, pdFALSE, this, NotificationTimerCallback); } -bool DfuService::NotificationManager::AsyncSend(uint16_t connection, uint16_t charactHandle, uint8_t *data, size_t s) { - if(size != 0 || s > 10) +bool DfuService::NotificationManager::AsyncSend(uint16_t connection, uint16_t charactHandle, uint8_t* data, size_t s) { + if (size != 0 || s > 10) return false; connectionHandle = connection; @@ -334,14 +324,14 @@ bool DfuService::NotificationManager::AsyncSend(uint16_t connection, uint16_t ch } void DfuService::NotificationManager::OnNotificationTimer() { - if(size > 0) { + if (size > 0) { Send(connectionHandle, characteristicHandle, buffer, size); size = 0; } } -void DfuService::NotificationManager::Send(uint16_t connection, uint16_t charactHandle, const uint8_t *data, const size_t s) { - auto *om = ble_hs_mbuf_from_flat(data, s); +void DfuService::NotificationManager::Send(uint16_t connection, uint16_t charactHandle, const uint8_t* data, const size_t s) { + auto* om = ble_hs_mbuf_from_flat(data, s); auto ret = ble_gattc_notify_custom(connection, charactHandle, om); ASSERT(ret == 0); } @@ -354,27 +344,29 @@ void DfuService::NotificationManager::Reset() { } void DfuService::DfuImage::Init(size_t chunkSize, size_t totalSize, uint16_t expectedCrc) { - if(chunkSize != 20) return; + if (chunkSize != 20) + return; this->chunkSize = chunkSize; this->totalSize = totalSize; this->expectedCrc = expectedCrc; this->ready = true; } -void DfuService::DfuImage::Append(uint8_t *data, size_t size) { - if(!ready) return; +void DfuService::DfuImage::Append(uint8_t* data, size_t size) { + if (!ready) + return; ASSERT(size <= 20); std::memcpy(tempBuffer + bufferWriteIndex, data, size); bufferWriteIndex += size; - if(bufferWriteIndex == bufferSize) { + if (bufferWriteIndex == bufferSize) { spiNorFlash.Write(writeOffset + totalWriteIndex, tempBuffer, bufferWriteIndex); totalWriteIndex += bufferWriteIndex; bufferWriteIndex = 0; } - if(bufferWriteIndex > 0 && totalWriteIndex + bufferWriteIndex == totalSize) { + if (bufferWriteIndex > 0 && totalWriteIndex + bufferWriteIndex == totalSize) { spiNorFlash.Write(writeOffset + totalWriteIndex, tempBuffer, bufferWriteIndex); totalWriteIndex += bufferWriteIndex; if (totalSize < maxSize) @@ -383,15 +375,16 @@ void DfuService::DfuImage::Append(uint8_t *data, size_t size) { } void DfuService::DfuImage::WriteMagicNumber() { - uint32_t magic[4] = { // TODO When this variable is a static constexpr, the values written to the memory are not correct. Why? - 0xf395c277, - 0x7fefd260, - 0x0f505235, - 0x8079b62c, + uint32_t magic[4] = { + // TODO When this variable is a static constexpr, the values written to the memory are not correct. Why? + 0xf395c277, + 0x7fefd260, + 0x0f505235, + 0x8079b62c, }; uint32_t offset = writeOffset + (maxSize - (4 * sizeof(uint32_t))); - spiNorFlash.Write(offset, reinterpret_cast(magic), 4 * sizeof(uint32_t)); + spiNorFlash.Write(offset, reinterpret_cast(magic), 4 * sizeof(uint32_t)); } void DfuService::DfuImage::Erase() { @@ -421,7 +414,7 @@ bool DfuService::DfuImage::Validate() { return (crc == expectedCrc); } -uint16_t DfuService::DfuImage::ComputeCrc(uint8_t const *p_data, uint32_t size, uint16_t const *p_crc) { +uint16_t DfuService::DfuImage::ComputeCrc(uint8_t const* p_data, uint32_t size, uint16_t const* p_crc) { uint16_t crc = (p_crc == NULL) ? 0xFFFF : *p_crc; for (uint32_t i = 0; i < size; i++) { @@ -436,6 +429,7 @@ uint16_t DfuService::DfuImage::ComputeCrc(uint8_t const *p_data, uint32_t size, } bool DfuService::DfuImage::IsComplete() { - if(!ready) return false; + if (!ready) + return false; return totalWriteIndex == totalSize; } diff --git a/src/components/ble/DfuService.h b/src/components/ble/DfuService.h index 096bd99a..b932d80f 100644 --- a/src/components/ble/DfuService.h +++ b/src/components/ble/DfuService.h @@ -20,146 +20,139 @@ namespace Pinetime { class Ble; class DfuService { - public: - DfuService(Pinetime::System::SystemTask &systemTask, Pinetime::Controllers::Ble &bleController, - Pinetime::Drivers::SpiNorFlash &spiNorFlash); - void Init(); - int OnServiceData(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt *context); - void OnTimeout(); + public: + DfuService(Pinetime::System::SystemTask& systemTask, + Pinetime::Controllers::Ble& bleController, + Pinetime::Drivers::SpiNorFlash& spiNorFlash); + void Init(); + int OnServiceData(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context); + void OnTimeout(); + void Reset(); + + class NotificationManager { + public: + NotificationManager(); + bool AsyncSend(uint16_t connection, uint16_t charactHandle, uint8_t* data, size_t size); + void Send(uint16_t connection, uint16_t characteristicHandle, const uint8_t* data, const size_t s); + + private: + TimerHandle_t timer; + uint16_t connectionHandle = 0; + uint16_t characteristicHandle = 0; + size_t size = 0; + uint8_t buffer[10]; + + public: + void OnNotificationTimer(); void Reset(); - - class NotificationManager { + }; + class DfuImage { public: - NotificationManager(); - bool AsyncSend(uint16_t connection, uint16_t charactHandle, uint8_t *data, size_t size); - void Send(uint16_t connection, uint16_t characteristicHandle, const uint8_t *data, const size_t s); - private: - TimerHandle_t timer; - uint16_t connectionHandle = 0; - uint16_t characteristicHandle = 0; - size_t size = 0; - uint8_t buffer[10]; - public: - void OnNotificationTimer(); - void Reset(); - }; - class DfuImage { - public: - DfuImage(Pinetime::Drivers::SpiNorFlash& spiNorFlash) : spiNorFlash{spiNorFlash} {} - void Init(size_t chunkSize, size_t totalSize, uint16_t expectedCrc); - void Erase(); - void Append(uint8_t* data, size_t size); - bool Validate(); - bool IsComplete(); + DfuImage(Pinetime::Drivers::SpiNorFlash& spiNorFlash) : spiNorFlash {spiNorFlash} { + } + void Init(size_t chunkSize, size_t totalSize, uint16_t expectedCrc); + void Erase(); + void Append(uint8_t* data, size_t size); + bool Validate(); + bool IsComplete(); private: - Pinetime::Drivers::SpiNorFlash& spiNorFlash; - static constexpr size_t bufferSize = 200; - bool ready = false; - size_t chunkSize = 0; - size_t totalSize = 0; - size_t maxSize = 475136; - size_t bufferWriteIndex = 0; - size_t totalWriteIndex = 0; - static constexpr size_t writeOffset = 0x40000; - uint8_t tempBuffer[bufferSize]; - uint16_t expectedCrc = 0; - - void WriteMagicNumber(); - uint16_t ComputeCrc(uint8_t const *p_data, uint32_t size, uint16_t const *p_crc); - - }; - - private: - Pinetime::System::SystemTask &systemTask; - Pinetime::Controllers::Ble &bleController; - DfuImage dfuImage; - NotificationManager notificationManager; - - static constexpr uint16_t dfuServiceId{0x1530}; - static constexpr uint16_t packetCharacteristicId{0x1532}; - static constexpr uint16_t controlPointCharacteristicId{0x1531}; - static constexpr uint16_t revisionCharacteristicId{0x1534}; - - uint16_t revision{0x0008}; - - static constexpr ble_uuid128_t serviceUuid{ - .u {.type = BLE_UUID_TYPE_128}, - .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, - 0xDE, 0xEF, 0x12, 0x12, 0x30, 0x15, 0x00, 0x00} - }; - - static constexpr ble_uuid128_t packetCharacteristicUuid{ - .u {.type = BLE_UUID_TYPE_128}, - .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, - 0xDE, 0xEF, 0x12, 0x12, 0x32, 0x15, 0x00, 0x00} - }; - - static constexpr ble_uuid128_t controlPointCharacteristicUuid{ - .u {.type = BLE_UUID_TYPE_128}, - .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, - 0xDE, 0xEF, 0x12, 0x12, 0x31, 0x15, 0x00, 0x00} - }; - - static constexpr ble_uuid128_t revisionCharacteristicUuid{ - .u {.type = BLE_UUID_TYPE_128}, - .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, - 0xDE, 0xEF, 0x12, 0x12, 0x34, 0x15, 0x00, 0x00} - }; - - struct ble_gatt_chr_def characteristicDefinition[4]; - struct ble_gatt_svc_def serviceDefinition[2]; - uint16_t packetCharacteristicHandle; - uint16_t controlPointCharacteristicHandle; - uint16_t revisionCharacteristicHandle; - - enum class States : uint8_t { - Idle, Init, Start, Data, Validate, Validated - }; - States state = States::Idle; - - enum class ImageTypes : uint8_t { - NoImage = 0x00, - SoftDevice = 0x01, - Bootloader = 0x02, - SoftDeviceAndBootloader = 0x03, - Application = 0x04 - }; - - enum class Opcodes : uint8_t { - StartDFU = 0x01, - InitDFUParameters = 0x02, - ReceiveFirmwareImage = 0x03, - ValidateFirmware = 0x04, - ActivateImageAndReset = 0x05, - PacketReceiptNotificationRequest = 0x08, - Response = 0x10, - PacketReceiptNotification = 0x11 - }; - - enum class ErrorCodes { - NoError = 0x01, - InvalidState = 0x02, - NotSupported = 0x03, - DataSizeExceedsLimits = 0x04, - CrcError = 0x05, - OperationFailed = 0x06 - }; - - uint8_t nbPacketsToNotify = 0; - uint32_t nbPacketReceived = 0; - uint32_t bytesReceived = 0; - - uint32_t softdeviceSize = 0; - uint32_t bootloaderSize = 0; - uint32_t applicationSize = 0; + Pinetime::Drivers::SpiNorFlash& spiNorFlash; + static constexpr size_t bufferSize = 200; + bool ready = false; + size_t chunkSize = 0; + size_t totalSize = 0; + size_t maxSize = 475136; + size_t bufferWriteIndex = 0; + size_t totalWriteIndex = 0; + static constexpr size_t writeOffset = 0x40000; + uint8_t tempBuffer[bufferSize]; uint16_t expectedCrc = 0; - int SendDfuRevision(os_mbuf *om) const; - int WritePacketHandler(uint16_t connectionHandle, os_mbuf *om); - int ControlPointHandler(uint16_t connectionHandle, os_mbuf *om); + void WriteMagicNumber(); + uint16_t ComputeCrc(uint8_t const* p_data, uint32_t size, uint16_t const* p_crc); + }; - TimerHandle_t timeoutTimer; + private: + Pinetime::System::SystemTask& systemTask; + Pinetime::Controllers::Ble& bleController; + DfuImage dfuImage; + NotificationManager notificationManager; + + static constexpr uint16_t dfuServiceId {0x1530}; + static constexpr uint16_t packetCharacteristicId {0x1532}; + static constexpr uint16_t controlPointCharacteristicId {0x1531}; + static constexpr uint16_t revisionCharacteristicId {0x1534}; + + uint16_t revision {0x0008}; + + static constexpr ble_uuid128_t serviceUuid { + .u {.type = BLE_UUID_TYPE_128}, + .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, 0xDE, 0xEF, 0x12, 0x12, 0x30, 0x15, 0x00, 0x00}}; + + static constexpr ble_uuid128_t packetCharacteristicUuid { + .u {.type = BLE_UUID_TYPE_128}, + .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, 0xDE, 0xEF, 0x12, 0x12, 0x32, 0x15, 0x00, 0x00}}; + + static constexpr ble_uuid128_t controlPointCharacteristicUuid { + .u {.type = BLE_UUID_TYPE_128}, + .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, 0xDE, 0xEF, 0x12, 0x12, 0x31, 0x15, 0x00, 0x00}}; + + static constexpr ble_uuid128_t revisionCharacteristicUuid { + .u {.type = BLE_UUID_TYPE_128}, + .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, 0xDE, 0xEF, 0x12, 0x12, 0x34, 0x15, 0x00, 0x00}}; + + struct ble_gatt_chr_def characteristicDefinition[4]; + struct ble_gatt_svc_def serviceDefinition[2]; + uint16_t packetCharacteristicHandle; + uint16_t controlPointCharacteristicHandle; + uint16_t revisionCharacteristicHandle; + + enum class States : uint8_t { Idle, Init, Start, Data, Validate, Validated }; + States state = States::Idle; + + enum class ImageTypes : uint8_t { + NoImage = 0x00, + SoftDevice = 0x01, + Bootloader = 0x02, + SoftDeviceAndBootloader = 0x03, + Application = 0x04 + }; + + enum class Opcodes : uint8_t { + StartDFU = 0x01, + InitDFUParameters = 0x02, + ReceiveFirmwareImage = 0x03, + ValidateFirmware = 0x04, + ActivateImageAndReset = 0x05, + PacketReceiptNotificationRequest = 0x08, + Response = 0x10, + PacketReceiptNotification = 0x11 + }; + + enum class ErrorCodes { + NoError = 0x01, + InvalidState = 0x02, + NotSupported = 0x03, + DataSizeExceedsLimits = 0x04, + CrcError = 0x05, + OperationFailed = 0x06 + }; + + uint8_t nbPacketsToNotify = 0; + uint32_t nbPacketReceived = 0; + uint32_t bytesReceived = 0; + + uint32_t softdeviceSize = 0; + uint32_t bootloaderSize = 0; + uint32_t applicationSize = 0; + uint16_t expectedCrc = 0; + + int SendDfuRevision(os_mbuf* om) const; + int WritePacketHandler(uint16_t connectionHandle, os_mbuf* om); + int ControlPointHandler(uint16_t connectionHandle, os_mbuf* om); + + TimerHandle_t timeoutTimer; }; } } \ No newline at end of file diff --git a/src/components/ble/HeartRateService.cpp b/src/components/ble/HeartRateService.cpp index ee115ed0..c556566b 100644 --- a/src/components/ble/HeartRateService.cpp +++ b/src/components/ble/HeartRateService.cpp @@ -8,39 +8,29 @@ constexpr ble_uuid16_t HeartRateService::heartRateServiceUuid; constexpr ble_uuid16_t HeartRateService::heartRateMeasurementUuid; namespace { - int HeartRateServiceServiceCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { + int HeartRateServiceServiceCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { auto* heartRateService = static_cast(arg); return heartRateService->OnHeartRateRequested(conn_handle, attr_handle, ctxt); } } // TODO Refactoring - remove dependency to SystemTask -HeartRateService::HeartRateService(Pinetime::System::SystemTask &system, Controllers::HeartRateController& heartRateController) : - system{system}, - heartRateController{heartRateController}, - characteristicDefinition{ - { - .uuid = (ble_uuid_t *) &heartRateMeasurementUuid, - .access_cb = HeartRateServiceServiceCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY, - .val_handle = &heartRateMeasurementHandle - }, - { - 0 - } - }, - serviceDefinition{ - { - /* Device Information Service */ - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = (ble_uuid_t *) &heartRateServiceUuid, - .characteristics = characteristicDefinition - }, - { - 0 - }, - }{ +HeartRateService::HeartRateService(Pinetime::System::SystemTask& system, Controllers::HeartRateController& heartRateController) + : system {system}, + heartRateController {heartRateController}, + characteristicDefinition {{.uuid = (ble_uuid_t*) &heartRateMeasurementUuid, + .access_cb = HeartRateServiceServiceCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY, + .val_handle = &heartRateMeasurementHandle}, + {0}}, + serviceDefinition { + {/* Device Information Service */ + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = (ble_uuid_t*) &heartRateServiceUuid, + .characteristics = characteristicDefinition}, + {0}, + } { // TODO refactor to prevent this loop dependency (service depends on controller and controller depends on service) heartRateController.SetService(this); } @@ -54,9 +44,8 @@ void HeartRateService::Init() { ASSERT(res == 0); } -int HeartRateService::OnHeartRateRequested(uint16_t connectionHandle, uint16_t attributeHandle, - ble_gatt_access_ctxt *context) { - if(attributeHandle == heartRateMeasurementHandle) { +int HeartRateService::OnHeartRateRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context) { + if (attributeHandle == heartRateMeasurementHandle) { NRF_LOG_INFO("HEARTRATE : handle = %d", heartRateMeasurementHandle); uint8_t buffer[2] = {0, heartRateController.HeartRate()}; // [0] = flags, [1] = hr value @@ -68,7 +57,7 @@ int HeartRateService::OnHeartRateRequested(uint16_t connectionHandle, uint16_t a void HeartRateService::OnNewHeartRateValue(uint8_t heartRateValue) { uint8_t buffer[2] = {0, heartRateController.HeartRate()}; // [0] = flags, [1] = hr value - auto *om = ble_hs_mbuf_from_flat(buffer, 2); + auto* om = ble_hs_mbuf_from_flat(buffer, 2); uint16_t connectionHandle = system.nimble().connHandle(); diff --git a/src/components/ble/HeartRateService.h b/src/components/ble/HeartRateService.h index 835e2941..7422445a 100644 --- a/src/components/ble/HeartRateService.h +++ b/src/components/ble/HeartRateService.h @@ -12,33 +12,26 @@ namespace Pinetime { namespace Controllers { class HeartRateController; class HeartRateService { - public: - HeartRateService(Pinetime::System::SystemTask &system, Controllers::HeartRateController& heartRateController); - void Init(); - int OnHeartRateRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt *context); - void OnNewHeartRateValue(uint8_t hearRateValue); + public: + HeartRateService(Pinetime::System::SystemTask& system, Controllers::HeartRateController& heartRateController); + void Init(); + int OnHeartRateRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context); + void OnNewHeartRateValue(uint8_t hearRateValue); - private: - Pinetime::System::SystemTask &system; - Controllers::HeartRateController& heartRateController; - static constexpr uint16_t heartRateServiceId {0x180D}; - static constexpr uint16_t heartRateMeasurementId {0x2A37}; + private: + Pinetime::System::SystemTask& system; + Controllers::HeartRateController& heartRateController; + static constexpr uint16_t heartRateServiceId {0x180D}; + static constexpr uint16_t heartRateMeasurementId {0x2A37}; - static constexpr ble_uuid16_t heartRateServiceUuid { - .u {.type = BLE_UUID_TYPE_16}, - .value = heartRateServiceId - }; + static constexpr ble_uuid16_t heartRateServiceUuid {.u {.type = BLE_UUID_TYPE_16}, .value = heartRateServiceId}; - static constexpr ble_uuid16_t heartRateMeasurementUuid { - .u {.type = BLE_UUID_TYPE_16}, - .value = heartRateMeasurementId - }; + static constexpr ble_uuid16_t heartRateMeasurementUuid {.u {.type = BLE_UUID_TYPE_16}, .value = heartRateMeasurementId}; - struct ble_gatt_chr_def characteristicDefinition[3]; - struct ble_gatt_svc_def serviceDefinition[2]; - - uint16_t heartRateMeasurementHandle; + struct ble_gatt_chr_def characteristicDefinition[3]; + struct ble_gatt_svc_def serviceDefinition[2]; + uint16_t heartRateMeasurementHandle; }; } } diff --git a/src/components/ble/ImmediateAlertService.cpp b/src/components/ble/ImmediateAlertService.cpp index 0f6bf6cf..fd6430af 100644 --- a/src/components/ble/ImmediateAlertService.cpp +++ b/src/components/ble/ImmediateAlertService.cpp @@ -9,49 +9,42 @@ constexpr ble_uuid16_t ImmediateAlertService::immediateAlertServiceUuid; constexpr ble_uuid16_t ImmediateAlertService::alertLevelUuid; namespace { - int AlertLevelCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { - auto *immediateAlertService = static_cast(arg); + int AlertLevelCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { + auto* immediateAlertService = static_cast(arg); return immediateAlertService->OnAlertLevelChanged(conn_handle, attr_handle, ctxt); } const char* ToString(ImmediateAlertService::Levels level) { switch (level) { - case ImmediateAlertService::Levels::NoAlert: return "Alert : None"; - case ImmediateAlertService::Levels::HighAlert: return "Alert : High"; - case ImmediateAlertService::Levels::MildAlert: return "Alert : Mild"; - default: return ""; + case ImmediateAlertService::Levels::NoAlert: + return "Alert : None"; + case ImmediateAlertService::Levels::HighAlert: + return "Alert : High"; + case ImmediateAlertService::Levels::MildAlert: + return "Alert : Mild"; + default: + return ""; } } } -ImmediateAlertService::ImmediateAlertService(Pinetime::System::SystemTask &systemTask, - Pinetime::Controllers::NotificationManager ¬ificationManager) : - systemTask{systemTask}, - notificationManager{notificationManager}, - characteristicDefinition{ - { - .uuid = (ble_uuid_t *) &alertLevelUuid, - .access_cb = AlertLevelCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE_NO_RSP, - .val_handle = &alertLevelHandle - }, - { - 0 - } - }, - serviceDefinition{ - { - /* Device Information Service */ - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = (ble_uuid_t *) &immediateAlertServiceUuid, - .characteristics = characteristicDefinition - }, - { - 0 - }, - }{ - +ImmediateAlertService::ImmediateAlertService(Pinetime::System::SystemTask& systemTask, + Pinetime::Controllers::NotificationManager& notificationManager) + : systemTask {systemTask}, + notificationManager {notificationManager}, + characteristicDefinition {{.uuid = (ble_uuid_t*) &alertLevelUuid, + .access_cb = AlertLevelCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE_NO_RSP, + .val_handle = &alertLevelHandle}, + {0}}, + serviceDefinition { + {/* Device Information Service */ + .type = BLE_GATT_SVC_TYPE_PRIMARY, + .uuid = (ble_uuid_t*) &immediateAlertServiceUuid, + .characteristics = characteristicDefinition}, + {0}, + } { } void ImmediateAlertService::Init() { @@ -63,9 +56,9 @@ void ImmediateAlertService::Init() { ASSERT(res == 0); } -int ImmediateAlertService::OnAlertLevelChanged(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt *context) { - if(attributeHandle == alertLevelHandle) { - if(context->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { +int ImmediateAlertService::OnAlertLevelChanged(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context) { + if (attributeHandle == alertLevelHandle) { + if (context->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { auto alertLevel = static_cast(context->om->om_data[0]); auto* alertString = ToString(alertLevel); diff --git a/src/components/ble/ImmediateAlertService.h b/src/components/ble/ImmediateAlertService.h index 2bc9cba5..6bd11bd7 100644 --- a/src/components/ble/ImmediateAlertService.h +++ b/src/components/ble/ImmediateAlertService.h @@ -12,39 +12,28 @@ namespace Pinetime { namespace Controllers { class NotificationManager; class ImmediateAlertService { - public: - enum class Levels : uint8_t { - NoAlert = 0, - MildAlert = 1, - HighAlert = 2 - }; + public: + enum class Levels : uint8_t { NoAlert = 0, MildAlert = 1, HighAlert = 2 }; - ImmediateAlertService(Pinetime::System::SystemTask &systemTask, - Pinetime::Controllers::NotificationManager ¬ificationManager); - void Init(); - int OnAlertLevelChanged(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt *context); + ImmediateAlertService(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::NotificationManager& notificationManager); + void Init(); + int OnAlertLevelChanged(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context); - private: - Pinetime::System::SystemTask& systemTask; - NotificationManager& notificationManager; + private: + Pinetime::System::SystemTask& systemTask; + NotificationManager& notificationManager; - static constexpr uint16_t immediateAlertServiceId {0x1802}; - static constexpr uint16_t alertLevelId {0x2A06}; + static constexpr uint16_t immediateAlertServiceId {0x1802}; + static constexpr uint16_t alertLevelId {0x2A06}; - static constexpr ble_uuid16_t immediateAlertServiceUuid { - .u {.type = BLE_UUID_TYPE_16}, - .value = immediateAlertServiceId - }; + static constexpr ble_uuid16_t immediateAlertServiceUuid {.u {.type = BLE_UUID_TYPE_16}, .value = immediateAlertServiceId}; - static constexpr ble_uuid16_t alertLevelUuid { - .u {.type = BLE_UUID_TYPE_16}, - .value = alertLevelId - }; + static constexpr ble_uuid16_t alertLevelUuid {.u {.type = BLE_UUID_TYPE_16}, .value = alertLevelId}; - struct ble_gatt_chr_def characteristicDefinition[3]; - struct ble_gatt_svc_def serviceDefinition[2]; + struct ble_gatt_chr_def characteristicDefinition[3]; + struct ble_gatt_svc_def serviceDefinition[2]; - uint16_t alertLevelHandle; + uint16_t alertLevelHandle; }; } } diff --git a/src/components/ble/MusicService.cpp b/src/components/ble/MusicService.cpp index 1230ad57..36bf2709 100644 --- a/src/components/ble/MusicService.cpp +++ b/src/components/ble/MusicService.cpp @@ -18,12 +18,12 @@ #include "MusicService.h" #include "systemtask/SystemTask.h" -int MSCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { - auto musicService = static_cast(arg); +int MSCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { + auto musicService = static_cast(arg); return musicService->OnCommand(conn_handle, attr_handle, ctxt); } -Pinetime::Controllers::MusicService::MusicService(Pinetime::System::SystemTask &system) : m_system(system) { +Pinetime::Controllers::MusicService::MusicService(Pinetime::System::SystemTask& system) : m_system(system) { msUuid.value[14] = msId[0]; msUuid.value[15] = msId[1]; @@ -86,82 +86,51 @@ Pinetime::Controllers::MusicService::MusicService(Pinetime::System::SystemTask & msShuffleCharUuid.value[13] = msShuffleCharId[1]; msShuffleCharUuid.value[14] = msId[0]; msShuffleCharUuid.value[15] = msId[1]; - - characteristicDefinition[0] = {.uuid = (ble_uuid_t *) (&msEventCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_NOTIFY, - .val_handle = &eventHandle - }; - characteristicDefinition[1] = {.uuid = (ble_uuid_t *) (&msStatusCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[2] = {.uuid = (ble_uuid_t *) (&msTrackCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[3] = {.uuid = (ble_uuid_t *) (&msArtistCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[4] = {.uuid = (ble_uuid_t *) (&msAlbumCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[5] = {.uuid = (ble_uuid_t *) (&msPositionCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[6] = {.uuid = (ble_uuid_t *) (&msTotalLengthCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[7] = {.uuid = (ble_uuid_t *) (&msTotalLengthCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[8] = {.uuid = (ble_uuid_t *) (&msTrackNumberCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[9] = {.uuid = (ble_uuid_t *) (&msTrackTotalCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[10] = {.uuid = (ble_uuid_t *) (&msPlaybackSpeedCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[11] = {.uuid = (ble_uuid_t *) (&msRepeatCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[12] = {.uuid = (ble_uuid_t *) (&msShuffleCharUuid), - .access_cb = MSCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; + + characteristicDefinition[0] = {.uuid = (ble_uuid_t*) (&msEventCharUuid), + .access_cb = MSCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_NOTIFY, + .val_handle = &eventHandle}; + characteristicDefinition[1] = { + .uuid = (ble_uuid_t*) (&msStatusCharUuid), .access_cb = MSCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[2] = { + .uuid = (ble_uuid_t*) (&msTrackCharUuid), .access_cb = MSCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[3] = { + .uuid = (ble_uuid_t*) (&msArtistCharUuid), .access_cb = MSCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[4] = { + .uuid = (ble_uuid_t*) (&msAlbumCharUuid), .access_cb = MSCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[5] = { + .uuid = (ble_uuid_t*) (&msPositionCharUuid), .access_cb = MSCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[6] = {.uuid = (ble_uuid_t*) (&msTotalLengthCharUuid), + .access_cb = MSCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[7] = {.uuid = (ble_uuid_t*) (&msTotalLengthCharUuid), + .access_cb = MSCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[8] = {.uuid = (ble_uuid_t*) (&msTrackNumberCharUuid), + .access_cb = MSCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[9] = {.uuid = (ble_uuid_t*) (&msTrackTotalCharUuid), + .access_cb = MSCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[10] = {.uuid = (ble_uuid_t*) (&msPlaybackSpeedCharUuid), + .access_cb = MSCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[11] = { + .uuid = (ble_uuid_t*) (&msRepeatCharUuid), .access_cb = MSCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[12] = { + .uuid = (ble_uuid_t*) (&msShuffleCharUuid), .access_cb = MSCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; characteristicDefinition[13] = {0}; - - serviceDefinition[0] = { - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = (ble_uuid_t *) &msUuid, - .characteristics = characteristicDefinition - }; + + serviceDefinition[0] = {.type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = (ble_uuid_t*) &msUuid, .characteristics = characteristicDefinition}; serviceDefinition[1] = {0}; - + artistName = "Waiting for"; albumName = ""; trackName = "track information.."; @@ -177,41 +146,40 @@ void Pinetime::Controllers::MusicService::Init() { int res = 0; res = ble_gatts_count_cfg(serviceDefinition); ASSERT(res == 0); - + res = ble_gatts_add_svcs(serviceDefinition); ASSERT(res == 0); } -int Pinetime::Controllers::MusicService::OnCommand(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt) { - +int Pinetime::Controllers::MusicService::OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) { + if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { size_t notifSize = OS_MBUF_PKTLEN(ctxt->om); uint8_t data[notifSize + 1]; data[notifSize] = '\0'; os_mbuf_copydata(ctxt->om, 0, notifSize, data); - char *s = (char *) &data[0]; - if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msArtistCharUuid) == 0) { + char* s = (char*) &data[0]; + if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msArtistCharUuid) == 0) { artistName = s; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msTrackCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msTrackCharUuid) == 0) { trackName = s; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msAlbumCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msAlbumCharUuid) == 0) { albumName = s; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msStatusCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msStatusCharUuid) == 0) { playing = s[0]; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msRepeatCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msRepeatCharUuid) == 0) { repeat = s[0]; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msShuffleCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msShuffleCharUuid) == 0) { shuffle = s[0]; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msPositionCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msPositionCharUuid) == 0) { trackProgress = (s[0] << 24) | (s[1] << 16) | (s[2] << 8) | s[3]; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msTotalLengthCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msTotalLengthCharUuid) == 0) { trackLength = (s[0] << 24) | (s[1] << 16) | (s[2] << 8) | s[3]; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msTrackNumberCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msTrackNumberCharUuid) == 0) { trackNumber = (s[0] << 24) | (s[1] << 16) | (s[2] << 8) | s[3]; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msTrackTotalCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msTrackTotalCharUuid) == 0) { tracksTotal = (s[0] << 24) | (s[1] << 16) | (s[2] << 8) | s[3]; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &msPlaybackSpeedCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &msPlaybackSpeedCharUuid) == 0) { playbackSpeed = static_cast(((s[0] << 24) | (s[1] << 16) | (s[2] << 8) | s[3])) / 100.0f; } } @@ -239,14 +207,14 @@ float Pinetime::Controllers::MusicService::getPlaybackSpeed() { } void Pinetime::Controllers::MusicService::event(char event) { - auto *om = ble_hs_mbuf_from_flat(&event, 1); - + auto* om = ble_hs_mbuf_from_flat(&event, 1); + uint16_t connectionHandle = m_system.nimble().connHandle(); - + if (connectionHandle == 0 || connectionHandle == BLE_HS_CONN_HANDLE_NONE) { return; } - + ble_gattc_notify_custom(connectionHandle, eventHandle, om); } @@ -257,4 +225,3 @@ int Pinetime::Controllers::MusicService::getProgress() { int Pinetime::Controllers::MusicService::getTrackLength() { return trackLength; } - diff --git a/src/components/ble/MusicService.h b/src/components/ble/MusicService.h index 172ab61c..5416219d 100644 --- a/src/components/ble/MusicService.h +++ b/src/components/ble/MusicService.h @@ -26,40 +26,40 @@ #undef max #undef min -//00000000-78fc-48fe-8e23-433b3a1942d0 -#define MUSIC_SERVICE_UUID_BASE {0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x00, 0x00, 0x00, 0x00} +// 00000000-78fc-48fe-8e23-433b3a1942d0 +#define MUSIC_SERVICE_UUID_BASE \ + { 0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x00, 0x00, 0x00, 0x00 } namespace Pinetime { namespace System { class SystemTask; } namespace Controllers { - + class MusicService { - public: - explicit MusicService(Pinetime::System::SystemTask &system); - + public: + explicit MusicService(Pinetime::System::SystemTask& system); + void Init(); - - int OnCommand(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt); - + + int OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt); + void event(char event); - + std::string getArtist(); - + std::string getTrack(); - + std::string getAlbum(); - + int getProgress(); - + int getTrackLength(); - + float getPlaybackSpeed(); - + bool isPlaying(); - + static const char EVENT_MUSIC_OPEN = 0xe0; static const char EVENT_MUSIC_PLAY = 0x00; static const char EVENT_MUSIC_PAUSE = 0x01; @@ -67,12 +67,10 @@ namespace Pinetime { static const char EVENT_MUSIC_PREV = 0x04; static const char EVENT_MUSIC_VOLUP = 0x05; static const char EVENT_MUSIC_VOLDOWN = 0x06; - - enum MusicStatus { - NotPlaying = 0x00, - Playing = 0x01 - }; - private: + + enum MusicStatus { NotPlaying = 0x00, Playing = 0x01 }; + + private: static constexpr uint8_t msId[2] = {0x00, 0x00}; static constexpr uint8_t msEventCharId[2] = {0x01, 0x00}; static constexpr uint8_t msStatusCharId[2] = {0x02, 0x00}; @@ -86,84 +84,44 @@ namespace Pinetime { static constexpr uint8_t msPlaybackSpeedCharId[2] = {0x0a, 0x00}; static constexpr uint8_t msRepeatCharId[2] = {0x0b, 0x00}; static constexpr uint8_t msShuffleCharId[2] = {0x0c, 0x00}; - - ble_uuid128_t msUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - - ble_uuid128_t msEventCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msStatusCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msArtistCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msTrackCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msAlbumCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msPositionCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msTotalLengthCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msTrackNumberCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msTrackTotalCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msPlaybackSpeedCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msRepeatCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - ble_uuid128_t msShuffleCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = MUSIC_SERVICE_UUID_BASE - }; - + + ble_uuid128_t msUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + + ble_uuid128_t msEventCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msStatusCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msArtistCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msTrackCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msAlbumCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msPositionCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msTotalLengthCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msTrackNumberCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msTrackTotalCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msPlaybackSpeedCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msRepeatCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + ble_uuid128_t msShuffleCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = MUSIC_SERVICE_UUID_BASE}; + struct ble_gatt_chr_def characteristicDefinition[14]; struct ble_gatt_svc_def serviceDefinition[2]; - + uint16_t eventHandle; - + std::string artistName; std::string albumName; std::string trackName; - + bool playing; - + int trackProgress; int trackLength; int trackNumber; int tracksTotal; - + float playbackSpeed; - + bool repeat; bool shuffle; - - Pinetime::System::SystemTask &m_system; + + Pinetime::System::SystemTask& m_system; }; } } - diff --git a/src/components/ble/NavigationService.cpp b/src/components/ble/NavigationService.cpp index 545c44da..e1c20bf1 100644 --- a/src/components/ble/NavigationService.cpp +++ b/src/components/ble/NavigationService.cpp @@ -20,12 +20,12 @@ #include "systemtask/SystemTask.h" -int NAVCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { - auto navService = static_cast(arg); +int NAVCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { + auto navService = static_cast(arg); return navService->OnCommand(conn_handle, attr_handle, ctxt); } -Pinetime::Controllers::NavigationService::NavigationService(Pinetime::System::SystemTask &system) : m_system(system) { +Pinetime::Controllers::NavigationService::NavigationService(Pinetime::System::SystemTask& system) : m_system(system) { navUuid.value[14] = navId[0]; navUuid.value[15] = navId[1]; @@ -49,35 +49,25 @@ Pinetime::Controllers::NavigationService::NavigationService(Pinetime::System::Sy navProgressCharUuid.value[14] = navId[0]; navProgressCharUuid.value[15] = navId[1]; - characteristicDefinition[0] = {.uuid = (ble_uuid_t *) (&navFlagCharUuid), - .access_cb = NAVCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; + characteristicDefinition[0] = { + .uuid = (ble_uuid_t*) (&navFlagCharUuid), .access_cb = NAVCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; - characteristicDefinition[1] = {.uuid = (ble_uuid_t *) (&navNarrativeCharUuid), - .access_cb = NAVCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[2] = {.uuid = (ble_uuid_t *) (&navManDistCharUuid), - .access_cb = NAVCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; - characteristicDefinition[3] = {.uuid = (ble_uuid_t *) (&navProgressCharUuid), - .access_cb = NAVCallback, - .arg = this, - .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ - }; + characteristicDefinition[1] = {.uuid = (ble_uuid_t*) (&navNarrativeCharUuid), + .access_cb = NAVCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[2] = {.uuid = (ble_uuid_t*) (&navManDistCharUuid), + .access_cb = NAVCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; + characteristicDefinition[3] = {.uuid = (ble_uuid_t*) (&navProgressCharUuid), + .access_cb = NAVCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ}; characteristicDefinition[4] = {0}; - serviceDefinition[0] = { - .type = BLE_GATT_SVC_TYPE_PRIMARY, - .uuid = (ble_uuid_t *) &navUuid, - .characteristics = characteristicDefinition - }; + serviceDefinition[0] = {.type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = (ble_uuid_t*) &navUuid, .characteristics = characteristicDefinition}; serviceDefinition[1] = {0}; m_progress = 0; @@ -92,45 +82,39 @@ void Pinetime::Controllers::NavigationService::Init() { ASSERT(res == 0); } -int Pinetime::Controllers::NavigationService::OnCommand(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt) { +int Pinetime::Controllers::NavigationService::OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) { if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { size_t notifSize = OS_MBUF_PKTLEN(ctxt->om); uint8_t data[notifSize + 1]; data[notifSize] = '\0'; os_mbuf_copydata(ctxt->om, 0, notifSize, data); - char *s = (char *) &data[0]; - if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navFlagCharUuid) == 0) { + char* s = (char*) &data[0]; + if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &navFlagCharUuid) == 0) { m_flag = s; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navNarrativeCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &navNarrativeCharUuid) == 0) { m_narrative = s; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navManDistCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &navManDistCharUuid) == 0) { m_manDist = s; - } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t *) &navProgressCharUuid) == 0) { + } else if (ble_uuid_cmp(ctxt->chr->uuid, (ble_uuid_t*) &navProgressCharUuid) == 0) { m_progress = data[0]; } } return 0; } -std::string Pinetime::Controllers::NavigationService::getFlag() -{ - return m_flag; +std::string Pinetime::Controllers::NavigationService::getFlag() { + return m_flag; } -std::string Pinetime::Controllers::NavigationService::getNarrative() -{ - return m_narrative; +std::string Pinetime::Controllers::NavigationService::getNarrative() { + return m_narrative; } -std::string Pinetime::Controllers::NavigationService::getManDist() -{ - return m_manDist; +std::string Pinetime::Controllers::NavigationService::getManDist() { + return m_manDist; } -int Pinetime::Controllers::NavigationService::getProgress() -{ - return m_progress; +int Pinetime::Controllers::NavigationService::getProgress() { + return m_progress; } - diff --git a/src/components/ble/NavigationService.h b/src/components/ble/NavigationService.h index 29b17582..dc4f0a0d 100644 --- a/src/components/ble/NavigationService.h +++ b/src/components/ble/NavigationService.h @@ -26,8 +26,9 @@ #undef max #undef min -//c7e60000-78fc-48fe-8e23-433b3a1942d0 -#define NAVIGATION_SERVICE_UUID_BASE {0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x00, 0x00, 0x00, 0x00} +// c7e60000-78fc-48fe-8e23-433b3a1942d0 +#define NAVIGATION_SERVICE_UUID_BASE \ + { 0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x00, 0x00, 0x00, 0x00 } namespace Pinetime { namespace System { @@ -36,13 +37,12 @@ namespace Pinetime { namespace Controllers { class NavigationService { - public: - explicit NavigationService(Pinetime::System::SystemTask &system); + public: + explicit NavigationService(Pinetime::System::SystemTask& system); void Init(); - int OnCommand(uint16_t conn_handle, uint16_t attr_handle, - struct ble_gatt_access_ctxt *ctxt); + int OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt); std::string getFlag(); @@ -52,34 +52,19 @@ namespace Pinetime { int getProgress(); - private: + private: static constexpr uint8_t navId[2] = {0x01, 0x00}; static constexpr uint8_t navFlagCharId[2] = {0x01, 0x00}; static constexpr uint8_t navNarrativeCharId[2] = {0x02, 0x00}; static constexpr uint8_t navManDistCharId[2] = {0x03, 0x00}; static constexpr uint8_t navProgressCharId[2] = {0x04, 0x00}; - ble_uuid128_t navUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = NAVIGATION_SERVICE_UUID_BASE - }; + ble_uuid128_t navUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = NAVIGATION_SERVICE_UUID_BASE}; - ble_uuid128_t navFlagCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = NAVIGATION_SERVICE_UUID_BASE - }; - ble_uuid128_t navNarrativeCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = NAVIGATION_SERVICE_UUID_BASE - }; - ble_uuid128_t navManDistCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = NAVIGATION_SERVICE_UUID_BASE - }; - ble_uuid128_t navProgressCharUuid{ - .u = {.type = BLE_UUID_TYPE_128}, - .value = NAVIGATION_SERVICE_UUID_BASE - }; + ble_uuid128_t navFlagCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = NAVIGATION_SERVICE_UUID_BASE}; + ble_uuid128_t navNarrativeCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = NAVIGATION_SERVICE_UUID_BASE}; + ble_uuid128_t navManDistCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = NAVIGATION_SERVICE_UUID_BASE}; + ble_uuid128_t navProgressCharUuid {.u = {.type = BLE_UUID_TYPE_128}, .value = NAVIGATION_SERVICE_UUID_BASE}; struct ble_gatt_chr_def characteristicDefinition[5]; struct ble_gatt_svc_def serviceDefinition[2]; @@ -89,8 +74,7 @@ namespace Pinetime { std::string m_manDist; int m_progress; - Pinetime::System::SystemTask &m_system; + Pinetime::System::SystemTask& m_system; }; } } - diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index eb83c709..67a6d691 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -19,36 +19,37 @@ using namespace Pinetime::Controllers; NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::Ble& bleController, - DateTime& dateTimeController, - Pinetime::Controllers::NotificationManager& notificationManager, - Controllers::Battery& batteryController, - Pinetime::Drivers::SpiNorFlash& spiNorFlash, - Controllers::HeartRateController& heartRateController) : - systemTask{systemTask}, - bleController{bleController}, - dateTimeController{dateTimeController}, - notificationManager{notificationManager}, - spiNorFlash{spiNorFlash}, - dfuService{systemTask, bleController, spiNorFlash}, - currentTimeClient{dateTimeController}, - anService{systemTask, notificationManager}, - alertNotificationClient{systemTask, notificationManager}, - currentTimeService{dateTimeController}, - musicService{systemTask}, - navService{systemTask}, - batteryInformationService{batteryController}, - immediateAlertService{systemTask, notificationManager}, - heartRateService{systemTask, heartRateController}, - serviceDiscovery({¤tTimeClient, &alertNotificationClient}) { + DateTime& dateTimeController, + Pinetime::Controllers::NotificationManager& notificationManager, + Controllers::Battery& batteryController, + Pinetime::Drivers::SpiNorFlash& spiNorFlash, + Controllers::HeartRateController& heartRateController) + : systemTask {systemTask}, + bleController {bleController}, + dateTimeController {dateTimeController}, + notificationManager {notificationManager}, + spiNorFlash {spiNorFlash}, + dfuService {systemTask, bleController, spiNorFlash}, + currentTimeClient {dateTimeController}, + anService {systemTask, notificationManager}, + alertNotificationClient {systemTask, notificationManager}, + currentTimeService {dateTimeController}, + musicService {systemTask}, + navService {systemTask}, + batteryInformationService {batteryController}, + immediateAlertService {systemTask, notificationManager}, + heartRateService {systemTask, heartRateController}, + serviceDiscovery({¤tTimeClient, &alertNotificationClient}) { } -int GAPEventCallback(struct ble_gap_event *event, void *arg) { +int GAPEventCallback(struct ble_gap_event* event, void* arg) { auto nimbleController = static_cast(arg); return nimbleController->OnGAPEvent(event); } void NimbleController::Init() { - while (!ble_hs_synced()) {} + while (!ble_hs_synced()) { + } ble_svc_gap_init(); ble_svc_gatt_init(); @@ -81,7 +82,8 @@ void NimbleController::Init() { } void NimbleController::StartAdvertising() { - if(bleController.IsConnected() || ble_gap_conn_active() || ble_gap_adv_active()) return; + if (bleController.IsConnected() || ble_gap_conn_active() || ble_gap_adv_active()) + return; ble_svc_gap_device_name_set(deviceName); @@ -101,29 +103,27 @@ void NimbleController::StartAdvertising() { adv_params.conn_mode = BLE_GAP_CONN_MODE_UND; adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN; - fields.flags = BLE_HS_ADV_F_DISC_GEN | - BLE_HS_ADV_F_BREDR_UNSUP; -// fields.uuids128 = BLE_UUID128(BLE_UUID128_DECLARE( -// 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, -// 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff)); + fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP; + // fields.uuids128 = BLE_UUID128(BLE_UUID128_DECLARE( + // 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + // 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff)); fields.uuids128 = &dfuServiceUuid; fields.num_uuids128 = 1; fields.uuids128_is_complete = 1; fields.tx_pwr_lvl = BLE_HS_ADV_TX_PWR_LVL_AUTO; - rsp_fields.name = (uint8_t *)deviceName; + rsp_fields.name = (uint8_t*) deviceName; rsp_fields.name_len = strlen(deviceName); rsp_fields.name_is_complete = 1; ble_gap_adv_set_fields(&fields); -// ASSERT(res == 0); // TODO this one sometimes fails with error 22 (notsync) + // ASSERT(res == 0); // TODO this one sometimes fails with error 22 (notsync) ble_gap_adv_rsp_set_fields(&rsp_fields); -// ASSERT(res == 0); + // ASSERT(res == 0); - ble_gap_adv_start(addrType, NULL, 180000, - &adv_params, GAPEventCallback, this); -// ASSERT(res == 0);// TODO I've disabled these ASSERT as they sometime asserts and reset the mcu. + ble_gap_adv_start(addrType, NULL, 180000, &adv_params, GAPEventCallback, this); + // ASSERT(res == 0);// TODO I've disabled these ASSERT as they sometime asserts and reset the mcu. // For now, the advertising is restarted as soon as it ends. There may be a race condition // that prevent the advertising from restarting reliably. // I remove the assert to prevent this uncesseray crash, but in the long term, the management of @@ -131,7 +131,7 @@ void NimbleController::StartAdvertising() { // the application has been woken up, for example. } -int NimbleController::OnGAPEvent(ble_gap_event *event) { +int NimbleController::OnGAPEvent(ble_gap_event* event) { switch (event->type) { case BLE_GAP_EVENT_ADV_COMPLETE: NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_ADV_COMPLETE"); @@ -141,8 +141,7 @@ int NimbleController::OnGAPEvent(ble_gap_event *event) { NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_CONNECT"); /* A new connection was established or a connection attempt failed. */ - NRF_LOG_INFO("connection %s; status=%d ", event->connect.status == 0 ? "established" : "failed", - event->connect.status); + NRF_LOG_INFO("connection %s; status=%d ", event->connect.status == 0 ? "established" : "failed", event->connect.status); if (event->connect.status != 0) { /* Connection failed; resume advertising. */ @@ -154,8 +153,7 @@ int NimbleController::OnGAPEvent(ble_gap_event *event) { connectionHandle = event->connect.conn_handle; // Service discovery is deffered via systemtask } - } - break; + } break; case BLE_GAP_EVENT_DISCONNECT: NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_DISCONNECT"); NRF_LOG_INFO("disconnect; reason=%d", event->disconnect.reason); @@ -178,19 +176,16 @@ int NimbleController::OnGAPEvent(ble_gap_event *event) { return 0; case BLE_GAP_EVENT_SUBSCRIBE: NRF_LOG_INFO("subscribe event; conn_handle=%d attr_handle=%d " - "reason=%d prevn=%d curn=%d previ=%d curi=???\n", - event->subscribe.conn_handle, - event->subscribe.attr_handle, - event->subscribe.reason, - event->subscribe.prev_notify, - event->subscribe.cur_notify, - event->subscribe.prev_indicate); + "reason=%d prevn=%d curn=%d previ=%d curi=???\n", + event->subscribe.conn_handle, + event->subscribe.attr_handle, + event->subscribe.reason, + event->subscribe.prev_notify, + event->subscribe.cur_notify, + event->subscribe.prev_indicate); return 0; case BLE_GAP_EVENT_MTU: - NRF_LOG_INFO("mtu update event; conn_handle=%d cid=%d mtu=%d\n", - event->mtu.conn_handle, - event->mtu.channel_id, - event->mtu.value); + NRF_LOG_INFO("mtu update event; conn_handle=%d cid=%d mtu=%d\n", event->mtu.conn_handle, event->mtu.channel_id, event->mtu.value); return 0; case BLE_GAP_EVENT_REPEAT_PAIRING: { @@ -216,9 +211,7 @@ int NimbleController::OnGAPEvent(ble_gap_event *event) { NRF_LOG_INFO("received %s; conn_handle=%d attr_handle=%d " "attr_len=%d", - event->notify_rx.indication ? - "indication" : - "notification", + event->notify_rx.indication ? "indication" : "notification", event->notify_rx.conn_handle, event->notify_rx.attr_handle, notifSize); @@ -229,7 +222,7 @@ int NimbleController::OnGAPEvent(ble_gap_event *event) { /* Attribute data is contained in event->notify_rx.attr_data. */ default: -// NRF_LOG_INFO("Advertising event : %d", event->type); + // NRF_LOG_INFO("Advertising event : %d", event->type); break; } return 0; @@ -239,8 +232,6 @@ void NimbleController::StartDiscovery() { serviceDiscovery.StartDiscovery(connectionHandle); } - uint16_t NimbleController::connHandle() { - return connectionHandle; + return connectionHandle; } - diff --git a/src/components/ble/NimbleController.h b/src/components/ble/NimbleController.h index 7bb135da..6d4aa38a 100644 --- a/src/components/ble/NimbleController.h +++ b/src/components/ble/NimbleController.h @@ -36,62 +36,69 @@ namespace Pinetime { class NimbleController { - public: - NimbleController(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::Ble& bleController, - DateTime& dateTimeController, Pinetime::Controllers::NotificationManager& notificationManager, - Controllers::Battery& batteryController, Pinetime::Drivers::SpiNorFlash& spiNorFlash, - Controllers::HeartRateController& heartRateController); - void Init(); - void StartAdvertising(); - int OnGAPEvent(ble_gap_event *event); + public: + NimbleController(Pinetime::System::SystemTask& systemTask, + Pinetime::Controllers::Ble& bleController, + DateTime& dateTimeController, + Pinetime::Controllers::NotificationManager& notificationManager, + Controllers::Battery& batteryController, + Pinetime::Drivers::SpiNorFlash& spiNorFlash, + Controllers::HeartRateController& heartRateController); + void Init(); + void StartAdvertising(); + int OnGAPEvent(ble_gap_event* event); - int OnDiscoveryEvent(uint16_t i, const ble_gatt_error *pError, const ble_gatt_svc *pSvc); - int OnCTSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error *error, - const ble_gatt_chr *characteristic); - int OnANSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error *error, - const ble_gatt_chr *characteristic); - int OnCurrentTimeReadResult(uint16_t connectionHandle, const ble_gatt_error *error, ble_gatt_attr *attribute); - int OnANSDescriptorDiscoveryEventCallback(uint16_t connectionHandle, const ble_gatt_error *error, - uint16_t characteristicValueHandle, const ble_gatt_dsc *descriptor); + int OnDiscoveryEvent(uint16_t i, const ble_gatt_error* pError, const ble_gatt_svc* pSvc); + int OnCTSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic); + int OnANSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic); + int OnCurrentTimeReadResult(uint16_t connectionHandle, const ble_gatt_error* error, ble_gatt_attr* attribute); + int OnANSDescriptorDiscoveryEventCallback(uint16_t connectionHandle, + const ble_gatt_error* error, + uint16_t characteristicValueHandle, + const ble_gatt_dsc* descriptor); - void StartDiscovery(); + void StartDiscovery(); - Pinetime::Controllers::MusicService& music() {return musicService;}; - Pinetime::Controllers::NavigationService& navigation() {return navService;}; - Pinetime::Controllers::AlertNotificationService& alertService() {return anService;}; + Pinetime::Controllers::MusicService& music() { + return musicService; + }; + Pinetime::Controllers::NavigationService& navigation() { + return navService; + }; + Pinetime::Controllers::AlertNotificationService& alertService() { + return anService; + }; - uint16_t connHandle(); + uint16_t connHandle(); - private: - static constexpr const char* deviceName = "InfiniTime"; - Pinetime::System::SystemTask& systemTask; - Pinetime::Controllers::Ble& bleController; - DateTime& dateTimeController; - Pinetime::Controllers::NotificationManager& notificationManager; - Pinetime::Drivers::SpiNorFlash& spiNorFlash; - Pinetime::Controllers::DfuService dfuService; + private: + static constexpr const char* deviceName = "InfiniTime"; + Pinetime::System::SystemTask& systemTask; + Pinetime::Controllers::Ble& bleController; + DateTime& dateTimeController; + Pinetime::Controllers::NotificationManager& notificationManager; + Pinetime::Drivers::SpiNorFlash& spiNorFlash; + Pinetime::Controllers::DfuService dfuService; - DeviceInformationService deviceInformationService; - CurrentTimeClient currentTimeClient; - AlertNotificationService anService; - AlertNotificationClient alertNotificationClient; - CurrentTimeService currentTimeService; - MusicService musicService; - NavigationService navService; - BatteryInformationService batteryInformationService; - ImmediateAlertService immediateAlertService; - HeartRateService heartRateService; + DeviceInformationService deviceInformationService; + CurrentTimeClient currentTimeClient; + AlertNotificationService anService; + AlertNotificationClient alertNotificationClient; + CurrentTimeService currentTimeService; + MusicService musicService; + NavigationService navService; + BatteryInformationService batteryInformationService; + ImmediateAlertService immediateAlertService; + HeartRateService heartRateService; - uint8_t addrType; // 1 = Random, 0 = PUBLIC - uint16_t connectionHandle = 0; + uint8_t addrType; // 1 = Random, 0 = PUBLIC + uint16_t connectionHandle = 0; - ble_uuid128_t dfuServiceUuid { - .u { .type = BLE_UUID_TYPE_128}, - .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, - 0xDE, 0xEF, 0x12, 0x12, 0x30, 0x15, 0x00, 0x00} - }; + ble_uuid128_t dfuServiceUuid { + .u {.type = BLE_UUID_TYPE_128}, + .value = {0x23, 0xD1, 0xBC, 0xEA, 0x5F, 0x78, 0x23, 0x15, 0xDE, 0xEF, 0x12, 0x12, 0x30, 0x15, 0x00, 0x00}}; - ServiceDiscovery serviceDiscovery; + ServiceDiscovery serviceDiscovery; }; } } diff --git a/src/components/ble/NotificationManager.cpp b/src/components/ble/NotificationManager.cpp index 88e83b92..b1b0e6b2 100644 --- a/src/components/ble/NotificationManager.cpp +++ b/src/components/ble/NotificationManager.cpp @@ -6,15 +6,15 @@ using namespace Pinetime::Controllers; constexpr uint8_t NotificationManager::MessageSize; - -void NotificationManager::Push(NotificationManager::Notification &¬if) { +void NotificationManager::Push(NotificationManager::Notification&& notif) { notif.id = GetNextId(); notif.valid = true; notifications[writeIndex] = std::move(notif); writeIndex = (writeIndex + 1 < TotalNbNotifications) ? writeIndex + 1 : 0; - if(!empty) + if (!empty) readIndex = (readIndex + 1 < TotalNbNotifications) ? readIndex + 1 : 0; - else empty = false; + else + empty = false; newNotification = true; } @@ -30,40 +30,48 @@ NotificationManager::Notification::Id NotificationManager::GetNextId() { } NotificationManager::Notification NotificationManager::GetNext(NotificationManager::Notification::Id id) { - auto currentIterator = std::find_if(notifications.begin(), notifications.end(), [id](const Notification& n){return n.valid && n.id == id;}); - if(currentIterator == notifications.end() || currentIterator->id != id) return Notification{}; + auto currentIterator = std::find_if(notifications.begin(), notifications.end(), [id](const Notification& n) { + return n.valid && n.id == id; + }); + if (currentIterator == notifications.end() || currentIterator->id != id) + return Notification {}; auto& lastNotification = notifications[readIndex]; NotificationManager::Notification result; - if(currentIterator == (notifications.end()-1)) + if (currentIterator == (notifications.end() - 1)) result = *(notifications.begin()); else - result = *(currentIterator+1); + result = *(currentIterator + 1); - if(result.id <= id) return {}; + if (result.id <= id) + return {}; - result.index = (lastNotification.id - result.id)+1; + result.index = (lastNotification.id - result.id) + 1; return result; } NotificationManager::Notification NotificationManager::GetPrevious(NotificationManager::Notification::Id id) { - auto currentIterator = std::find_if(notifications.begin(), notifications.end(), [id](const Notification& n){return n.valid && n.id == id;}); - if(currentIterator == notifications.end() || currentIterator->id != id) return Notification{}; + auto currentIterator = std::find_if(notifications.begin(), notifications.end(), [id](const Notification& n) { + return n.valid && n.id == id; + }); + if (currentIterator == notifications.end() || currentIterator->id != id) + return Notification {}; auto& lastNotification = notifications[readIndex]; NotificationManager::Notification result; - if(currentIterator == notifications.begin()) - result = *(notifications.end()-1); + if (currentIterator == notifications.begin()) + result = *(notifications.end() - 1); else - result = *(currentIterator-1); + result = *(currentIterator - 1); - if(result.id >= id) return {}; + if (result.id >= id) + return {}; - result.index = (lastNotification.id - result.id)+1; + result.index = (lastNotification.id - result.id) + 1; return result; } @@ -76,7 +84,7 @@ bool NotificationManager::IsVibrationEnabled() { } void NotificationManager::ToggleVibrations() { - vibrationEnabled = !vibrationEnabled; + vibrationEnabled = !vibrationEnabled; } bool NotificationManager::ClearNewNotificationFlag() { @@ -84,21 +92,23 @@ bool NotificationManager::ClearNewNotificationFlag() { } size_t NotificationManager::NbNotifications() const { - return std::count_if(notifications.begin(), notifications.end(), [](const Notification& n){ return n.valid;}); + return std::count_if(notifications.begin(), notifications.end(), [](const Notification& n) { + return n.valid; + }); } const char* NotificationManager::Notification::Message() const { - const char* itField = std::find(message.begin(), message.begin()+size-1, '\0'); - if(itField != message.begin()+size-1) { - const char* ptr = (itField)+1; + const char* itField = std::find(message.begin(), message.begin() + size - 1, '\0'); + if (itField != message.begin() + size - 1) { + const char* ptr = (itField) + 1; return ptr; } return const_cast(message.data()); } const char* NotificationManager::Notification::Title() const { - const char * itField = std::find(message.begin(), message.begin()+size-1, '\0'); - if(itField != message.begin()+size-1) { + const char* itField = std::find(message.begin(), message.begin() + size - 1, '\0'); + if (itField != message.begin() + size - 1) { return message.data(); } return {}; diff --git a/src/components/ble/NotificationManager.h b/src/components/ble/NotificationManager.h index 486bba15..8e8fb374 100644 --- a/src/components/ble/NotificationManager.h +++ b/src/components/ble/NotificationManager.h @@ -8,23 +8,35 @@ namespace Pinetime { namespace Controllers { class NotificationManager { - public: - enum class Categories {Unknown, SimpleAlert, Email, News, IncomingCall, MissedCall, Sms, VoiceMail, Schedule, HighProriotyAlert, InstantMessage }; - static constexpr uint8_t MessageSize{100}; + public: + enum class Categories { + Unknown, + SimpleAlert, + Email, + News, + IncomingCall, + MissedCall, + Sms, + VoiceMail, + Schedule, + HighProriotyAlert, + InstantMessage + }; + static constexpr uint8_t MessageSize {100}; - struct Notification { - using Id = uint8_t; - Id id; - bool valid = false; - uint8_t index; - uint8_t size; - std::array message; - Categories category = Categories::Unknown; + struct Notification { + using Id = uint8_t; + Id id; + bool valid = false; + uint8_t index; + uint8_t size; + std::array message; + Categories category = Categories::Unknown; - const char* Message() const; - const char* Title() const; - }; - Notification::Id nextId {0}; + const char* Message() const; + const char* Title() const; + }; + Notification::Id nextId {0}; void Push(Notification&& notif); Notification GetLastNotification(); @@ -35,18 +47,20 @@ namespace Pinetime { bool IsVibrationEnabled(); void ToggleVibrations(); - static constexpr size_t MaximumMessageSize() { return MessageSize; }; + static constexpr size_t MaximumMessageSize() { + return MessageSize; + }; size_t NbNotifications() const; - private: - Notification::Id GetNextId(); - static constexpr uint8_t TotalNbNotifications = 5; - std::array notifications; - uint8_t readIndex = 0; - uint8_t writeIndex = 0; - bool empty = true; - std::atomic newNotification{false}; - bool vibrationEnabled = true; + private: + Notification::Id GetNextId(); + static constexpr uint8_t TotalNbNotifications = 5; + std::array notifications; + uint8_t readIndex = 0; + uint8_t writeIndex = 0; + bool empty = true; + std::atomic newNotification {false}; + bool vibrationEnabled = true; }; } } \ No newline at end of file diff --git a/src/components/ble/ServiceDiscovery.cpp b/src/components/ble/ServiceDiscovery.cpp index 4d37b8bd..b36b241c 100644 --- a/src/components/ble/ServiceDiscovery.cpp +++ b/src/components/ble/ServiceDiscovery.cpp @@ -4,8 +4,7 @@ using namespace Pinetime::Controllers; -ServiceDiscovery::ServiceDiscovery(std::array&& clients) : clients{clients} { - +ServiceDiscovery::ServiceDiscovery(std::array&& clients) : clients {clients} { } void ServiceDiscovery::StartDiscovery(uint16_t connectionHandle) { @@ -16,7 +15,7 @@ void ServiceDiscovery::StartDiscovery(uint16_t connectionHandle) { void ServiceDiscovery::OnServiceDiscovered(uint16_t connectionHandle) { clientIterator++; - if(clientIterator != clients.end()) { + if (clientIterator != clients.end()) { DiscoverNextService(connectionHandle); } else { NRF_LOG_INFO("End of service discovery"); @@ -26,7 +25,7 @@ void ServiceDiscovery::OnServiceDiscovered(uint16_t connectionHandle) { void ServiceDiscovery::DiscoverNextService(uint16_t connectionHandle) { NRF_LOG_INFO("[Discovery] Discover next service"); - auto discoverNextService = [this](uint16_t connectionHandle){ + auto discoverNextService = [this](uint16_t connectionHandle) { this->OnServiceDiscovered(connectionHandle); }; (*clientIterator)->Discover(connectionHandle, discoverNextService); diff --git a/src/components/ble/ServiceDiscovery.h b/src/components/ble/ServiceDiscovery.h index 0b26bd1d..56bb3e44 100644 --- a/src/components/ble/ServiceDiscovery.h +++ b/src/components/ble/ServiceDiscovery.h @@ -8,17 +8,16 @@ namespace Pinetime { class BleClient; class ServiceDiscovery { - public: - ServiceDiscovery(std::array&& bleClients); + public: + ServiceDiscovery(std::array&& bleClients); - void StartDiscovery(uint16_t connectionHandle); + void StartDiscovery(uint16_t connectionHandle); - - private: - BleClient** clientIterator; - std::array clients; - void OnServiceDiscovered(uint16_t connectionHandle); - void DiscoverNextService(uint16_t connectionHandle); + private: + BleClient** clientIterator; + std::array clients; + void OnServiceDiscovered(uint16_t connectionHandle); + void DiscoverNextService(uint16_t connectionHandle); }; } } diff --git a/src/components/brightness/BrightnessController.cpp b/src/components/brightness/BrightnessController.cpp index 0d8f366a..8ad987d1 100644 --- a/src/components/brightness/BrightnessController.cpp +++ b/src/components/brightness/BrightnessController.cpp @@ -4,7 +4,6 @@ using namespace Pinetime::Controllers; - void BrightnessController::Init() { nrf_gpio_cfg_output(pinLcdBacklight1); nrf_gpio_cfg_output(pinLcdBacklight2); @@ -14,7 +13,7 @@ void BrightnessController::Init() { void BrightnessController::Set(BrightnessController::Levels level) { this->level = level; - switch(level) { + switch (level) { default: case Levels::High: nrf_gpio_pin_clear(pinLcdBacklight1); @@ -40,20 +39,34 @@ void BrightnessController::Set(BrightnessController::Levels level) { } void BrightnessController::Lower() { - switch(level) { - case Levels::High: Set(Levels::Medium); break; - case Levels::Medium: Set(Levels::Low); break; - case Levels::Low: Set(Levels::Off); break; - default: break; + switch (level) { + case Levels::High: + Set(Levels::Medium); + break; + case Levels::Medium: + Set(Levels::Low); + break; + case Levels::Low: + Set(Levels::Off); + break; + default: + break; } } void BrightnessController::Higher() { - switch(level) { - case Levels::Off: Set(Levels::Low); break; - case Levels::Low: Set(Levels::Medium); break; - case Levels::Medium: Set(Levels::High); break; - default: break; + switch (level) { + case Levels::Off: + Set(Levels::Low); + break; + case Levels::Low: + Set(Levels::Medium); + break; + case Levels::Medium: + Set(Levels::High); + break; + default: + break; } } @@ -70,29 +83,44 @@ void BrightnessController::Restore() { } void BrightnessController::Step() { - switch(level) { - case Levels::Low: Set(Levels::Medium); break; - case Levels::Medium: Set(Levels::High); break; - case Levels::High: Set(Levels::Low); break; - default: break; + switch (level) { + case Levels::Low: + Set(Levels::Medium); + break; + case Levels::Medium: + Set(Levels::High); + break; + case Levels::High: + Set(Levels::Low); + break; + default: + break; } } const char* BrightnessController::GetIcon() { - switch(level) { - case Levels::Medium: return Applications::Screens::Symbols::brightnessMedium; - case Levels::High: return Applications::Screens::Symbols::brightnessHigh; - default: break; + switch (level) { + case Levels::Medium: + return Applications::Screens::Symbols::brightnessMedium; + case Levels::High: + return Applications::Screens::Symbols::brightnessHigh; + default: + break; } return Applications::Screens::Symbols::brightnessLow; } const char* BrightnessController::ToString() { - switch(level) { - case Levels::Off: return "Off"; - case Levels::Low: return "Low"; - case Levels::Medium: return "Medium"; - case Levels::High: return "High"; - default : return "???"; + switch (level) { + case Levels::Off: + return "Off"; + case Levels::Low: + return "Low"; + case Levels::Medium: + return "Medium"; + case Levels::High: + return "High"; + default: + return "???"; } } \ No newline at end of file diff --git a/src/components/brightness/BrightnessController.h b/src/components/brightness/BrightnessController.h index efff7e81..e8c36e3b 100644 --- a/src/components/brightness/BrightnessController.h +++ b/src/components/brightness/BrightnessController.h @@ -5,8 +5,8 @@ namespace Pinetime { namespace Controllers { class BrightnessController { - public: - enum class Levels {Off, Low, Medium, High}; + public: + enum class Levels { Off, Low, Medium, High }; void Init(); void Set(Levels level); @@ -21,7 +21,7 @@ namespace Pinetime { const char* GetIcon(); const char* ToString(); - private: + private: static constexpr uint8_t pinLcdBacklight1 = 14; static constexpr uint8_t pinLcdBacklight2 = 22; static constexpr uint8_t pinLcdBacklight3 = 23; diff --git a/src/components/datetime/DateTimeController.cpp b/src/components/datetime/DateTimeController.cpp index 9c1f2684..4f9302eb 100644 --- a/src/components/datetime/DateTimeController.cpp +++ b/src/components/datetime/DateTimeController.cpp @@ -5,22 +5,21 @@ using namespace Pinetime::Controllers; -DateTime::DateTime(System::SystemTask& systemTask) : systemTask{systemTask} { - +DateTime::DateTime(System::SystemTask& systemTask) : systemTask {systemTask} { } - -void DateTime::SetTime(uint16_t year, uint8_t month, uint8_t day, uint8_t dayOfWeek, uint8_t hour, uint8_t minute, - uint8_t second, uint32_t systickCounter) { - std::tm tm = { /* .tm_sec = */ second, - /* .tm_min = */ minute, - /* .tm_hour = */ hour, - /* .tm_mday = */ day, - /* .tm_mon = */ month - 1, - /* .tm_year = */ year - 1900, +void DateTime::SetTime( + uint16_t year, uint8_t month, uint8_t day, uint8_t dayOfWeek, uint8_t hour, uint8_t minute, uint8_t second, uint32_t systickCounter) { + std::tm tm = { + /* .tm_sec = */ second, + /* .tm_min = */ minute, + /* .tm_hour = */ hour, + /* .tm_mday = */ day, + /* .tm_mon = */ month - 1, + /* .tm_year = */ year - 1900, }; tm.tm_isdst = -1; // Use DST value from local time zone - currentDateTime = std::chrono::system_clock::from_time_t(std::mktime(&tm)); + currentDateTime = std::chrono::system_clock::from_time_t(std::mktime(&tm)); NRF_LOG_INFO("%d %d %d ", day, month, year); NRF_LOG_INFO("%d %d %d ", hour, minute, second); @@ -34,7 +33,7 @@ void DateTime::SetTime(uint16_t year, uint8_t month, uint8_t day, uint8_t dayOfW void DateTime::UpdateTime(uint32_t systickCounter) { // Handle systick counter overflow uint32_t systickDelta = 0; - if(systickCounter < previousSystickCounter) { + if (systickCounter < previousSystickCounter) { systickDelta = 0xffffff - previousSystickCounter; systickDelta += systickCounter + 1; } else { @@ -42,11 +41,11 @@ void DateTime::UpdateTime(uint32_t systickCounter) { } /* - * 1000 ms = 1024 ticks - */ + * 1000 ms = 1024 ticks + */ auto correctedDelta = systickDelta / 1024; - auto rest = (systickDelta - (correctedDelta*1024)); - if(systickCounter >= rest) { + auto rest = (systickDelta - (correctedDelta * 1024)); + if (systickCounter >= rest) { previousSystickCounter = systickCounter - rest; } else { previousSystickCounter = 0xffffff - (rest - systickCounter); @@ -56,12 +55,12 @@ void DateTime::UpdateTime(uint32_t systickCounter) { uptime += std::chrono::seconds(correctedDelta); auto dp = date::floor(currentDateTime); - auto time = date::make_time(currentDateTime-dp); + auto time = date::make_time(currentDateTime - dp); auto yearMonthDay = date::year_month_day(dp); - year = (int)yearMonthDay.year(); - month = static_cast((unsigned)yearMonthDay.month()); - day = (unsigned)yearMonthDay.day(); + year = (int) yearMonthDay.year(); + month = static_cast((unsigned) yearMonthDay.month()); + day = (unsigned) yearMonthDay.day(); dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); hour = time.hours().count(); @@ -69,7 +68,7 @@ void DateTime::UpdateTime(uint32_t systickCounter) { second = time.seconds().count(); // Notify new day to SystemTask - if(hour == 0 and not isMidnightAlreadyNotified) { + if (hour == 0 and not isMidnightAlreadyNotified) { isMidnightAlreadyNotified = true; systemTask.PushMessage(System::SystemTask::Messages::OnNewDay); } else if (hour != 0) { @@ -77,123 +76,45 @@ void DateTime::UpdateTime(uint32_t systickCounter) { } } -const char *DateTime::MonthShortToString() { - return DateTime::MonthsString[(uint8_t)month]; +const char* DateTime::MonthShortToString() { + return DateTime::MonthsString[(uint8_t) month]; } -const char *DateTime::MonthShortToStringLow() { - return DateTime::MonthsStringLow[(uint8_t)month]; +const char* DateTime::MonthShortToStringLow() { + return DateTime::MonthsStringLow[(uint8_t) month]; } -const char *DateTime::MonthsToStringLow() { - return DateTime::MonthsLow[(uint8_t)month]; +const char* DateTime::MonthsToStringLow() { + return DateTime::MonthsLow[(uint8_t) month]; } -const char *DateTime::DayOfWeekToString() { - return DateTime::DaysString[(uint8_t)dayOfWeek]; +const char* DateTime::DayOfWeekToString() { + return DateTime::DaysString[(uint8_t) dayOfWeek]; } -const char *DateTime::DayOfWeekShortToString() { - return DateTime::DaysStringShort[(uint8_t)dayOfWeek]; +const char* DateTime::DayOfWeekShortToString() { + return DateTime::DaysStringShort[(uint8_t) dayOfWeek]; } -const char *DateTime::DayOfWeekToStringLow() { - return DateTime::DaysStringLow[(uint8_t)dayOfWeek]; +const char* DateTime::DayOfWeekToStringLow() { + return DateTime::DaysStringLow[(uint8_t) dayOfWeek]; } -const char *DateTime::DayOfWeekShortToStringLow() { - return DateTime::DaysStringShortLow[(uint8_t)dayOfWeek]; +const char* DateTime::DayOfWeekShortToStringLow() { + return DateTime::DaysStringShortLow[(uint8_t) dayOfWeek]; } +char const* DateTime::DaysStringLow[] = {"--", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; -char const *DateTime::DaysStringLow[] = { - "--", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday", - "Sunday" -}; +char const* DateTime::DaysStringShortLow[] = {"--", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; -char const *DateTime::DaysStringShortLow[] = { - "--", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" -}; +char const* DateTime::DaysStringShort[] = {"--", "MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"}; -char const *DateTime::DaysStringShort[] = { - "--", - "MON", - "TUE", - "WED", - "THU", - "FRI", - "SAT", - "SUN" -}; +char const* DateTime::DaysString[] = {"--", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"}; -char const *DateTime::DaysString[] = { - "--", - "MONDAY", - "TUESDAY", - "WEDNESDAY", - "THURSDAY", - "FRIDAY", - "SATURDAY", - "SUNDAY" -}; +char const* DateTime::MonthsString[] = {"--", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"}; -char const *DateTime::MonthsString[] = { - "--", - "JAN", - "FEB", - "MAR", - "APR", - "MAY", - "JUN", - "JUL", - "AUG", - "SEP", - "OCT", - "NOV", - "DEC" -}; +char const* DateTime::MonthsStringLow[] = {"--", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; -char const *DateTime::MonthsStringLow[] = { - "--", - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" -}; - -char const *DateTime::MonthsLow[] = { - "--", - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -}; \ No newline at end of file +char const* DateTime::MonthsLow[] = { + "--", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; \ No newline at end of file diff --git a/src/components/datetime/DateTimeController.h b/src/components/datetime/DateTimeController.h index fb0969d1..823442b2 100644 --- a/src/components/datetime/DateTimeController.h +++ b/src/components/datetime/DateTimeController.h @@ -9,56 +9,95 @@ namespace Pinetime { } namespace Controllers { class DateTime { - public: - enum class Days : uint8_t {Unknown, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}; - enum class Months : uint8_t {Unknown, January, February, March, April, May, June, July, August, September, October, November, December}; + public: + enum class Days : uint8_t { Unknown, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; + enum class Months : uint8_t { + Unknown, + January, + February, + March, + April, + May, + June, + July, + August, + September, + October, + November, + December + }; - DateTime(System::SystemTask& systemTask); + DateTime(System::SystemTask& systemTask); - void SetTime(uint16_t year, uint8_t month, uint8_t day, uint8_t dayOfWeek, uint8_t hour, uint8_t minute, uint8_t second, uint32_t systickCounter); - void UpdateTime(uint32_t systickCounter); - uint16_t Year() const { return year; } - Months Month() const { return month; } - uint8_t Day() const { return day; } - Days DayOfWeek() const { return dayOfWeek; } - uint8_t Hours() const { return hour; } - uint8_t Minutes() const { return minute; } - uint8_t Seconds() const { return second; } + void SetTime(uint16_t year, + uint8_t month, + uint8_t day, + uint8_t dayOfWeek, + uint8_t hour, + uint8_t minute, + uint8_t second, + uint32_t systickCounter); + void UpdateTime(uint32_t systickCounter); + uint16_t Year() const { + return year; + } + Months Month() const { + return month; + } + uint8_t Day() const { + return day; + } + Days DayOfWeek() const { + return dayOfWeek; + } + uint8_t Hours() const { + return hour; + } + uint8_t Minutes() const { + return minute; + } + uint8_t Seconds() const { + return second; + } - const char *MonthShortToString(); - const char *MonthShortToStringLow(); - const char *MonthsToStringLow(); - const char *DayOfWeekToString(); - const char *DayOfWeekShortToString(); - const char *DayOfWeekToStringLow(); - const char *DayOfWeekShortToStringLow(); + const char* MonthShortToString(); + const char* MonthShortToStringLow(); + const char* MonthsToStringLow(); + const char* DayOfWeekToString(); + const char* DayOfWeekShortToString(); + const char* DayOfWeekToStringLow(); + const char* DayOfWeekShortToStringLow(); - std::chrono::time_point CurrentDateTime() const { return currentDateTime; } - std::chrono::seconds Uptime() const { return uptime; } - private: - System::SystemTask& systemTask; - uint16_t year = 0; - Months month = Months::Unknown; - uint8_t day = 0; - Days dayOfWeek = Days::Unknown; - uint8_t hour = 0; - uint8_t minute = 0; - uint8_t second = 0; + std::chrono::time_point CurrentDateTime() const { + return currentDateTime; + } + std::chrono::seconds Uptime() const { + return uptime; + } - uint32_t previousSystickCounter = 0; - std::chrono::time_point currentDateTime; - std::chrono::seconds uptime {0}; + private: + System::SystemTask& systemTask; + uint16_t year = 0; + Months month = Months::Unknown; + uint8_t day = 0; + Days dayOfWeek = Days::Unknown; + uint8_t hour = 0; + uint8_t minute = 0; + uint8_t second = 0; - bool isMidnightAlreadyNotified = false; + uint32_t previousSystickCounter = 0; + std::chrono::time_point currentDateTime; + std::chrono::seconds uptime {0}; - static char const *DaysString[]; - static char const *DaysStringShort[]; - static char const *DaysStringLow[]; - static char const *DaysStringShortLow[]; - static char const *MonthsString[]; - static char const *MonthsStringLow[]; - static char const *MonthsLow[]; + bool isMidnightAlreadyNotified = false; + static char const* DaysString[]; + static char const* DaysStringShort[]; + static char const* DaysStringLow[]; + static char const* DaysStringShortLow[]; + static char const* MonthsString[]; + static char const* MonthsStringLow[]; + static char const* MonthsLow[]; }; } } \ No newline at end of file diff --git a/src/components/firmwarevalidator/FirmwareValidator.cpp b/src/components/firmwarevalidator/FirmwareValidator.cpp index 48f98550..68e66d37 100644 --- a/src/components/firmwarevalidator/FirmwareValidator.cpp +++ b/src/components/firmwarevalidator/FirmwareValidator.cpp @@ -6,12 +6,12 @@ using namespace Pinetime::Controllers; bool FirmwareValidator::IsValidated() const { - auto* imageOkPtr = reinterpret_cast(validBitAdress); + auto* imageOkPtr = reinterpret_cast(validBitAdress); return (*imageOkPtr) == validBitValue; } void FirmwareValidator::Validate() { - if(!IsValidated()) + if (!IsValidated()) Pinetime::Drivers::InternalFlash::WriteWord(validBitAdress, validBitValue); } diff --git a/src/components/firmwarevalidator/FirmwareValidator.h b/src/components/firmwarevalidator/FirmwareValidator.h index aa576d88..00b5a0bb 100644 --- a/src/components/firmwarevalidator/FirmwareValidator.h +++ b/src/components/firmwarevalidator/FirmwareValidator.h @@ -5,14 +5,15 @@ namespace Pinetime { namespace Controllers { class FirmwareValidator { - public: - void Validate(); - bool IsValidated() const; + public: + void Validate(); + bool IsValidated() const; - void Reset(); - private: - static constexpr uint32_t validBitAdress {0x7BFE8}; - static constexpr uint32_t validBitValue {1}; + void Reset(); + + private: + static constexpr uint32_t validBitAdress {0x7BFE8}; + static constexpr uint32_t validBitValue {1}; }; } } diff --git a/src/components/gfx/Gfx.cpp b/src/components/gfx/Gfx.cpp index 59fa8164..cf271032 100644 --- a/src/components/gfx/Gfx.cpp +++ b/src/components/gfx/Gfx.cpp @@ -2,11 +2,10 @@ #include "drivers/St7789.h" using namespace Pinetime::Components; -Gfx::Gfx(Pinetime::Drivers::St7789 &lcd) : lcd{lcd} { +Gfx::Gfx(Pinetime::Drivers::St7789& lcd) : lcd {lcd} { } void Gfx::Init() { - } void Gfx::ClearScreen() { @@ -17,10 +16,9 @@ void Gfx::ClearScreen() { state.busy = true; state.action = Action::FillRectangle; state.taskToNotify = xTaskGetCurrentTaskHandle(); - - lcd.DrawBuffer(0, 0, width, height, reinterpret_cast(buffer), width * 2); - WaitTransferFinished(); + lcd.DrawBuffer(0, 0, width, height, reinterpret_cast(buffer), width * 2); + WaitTransferFinished(); } void Gfx::FillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t color) { @@ -33,7 +31,7 @@ void Gfx::FillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint16_t col state.color = color; state.taskToNotify = xTaskGetCurrentTaskHandle(); - lcd.DrawBuffer(x, y, w, h, reinterpret_cast(buffer), width * 2); + lcd.DrawBuffer(x, y, w, h, reinterpret_cast(buffer), width * 2); WaitTransferFinished(); } @@ -46,12 +44,12 @@ void Gfx::FillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t* b) state.color = 0x00; state.taskToNotify = xTaskGetCurrentTaskHandle(); - lcd.DrawBuffer(x, y, w, h, reinterpret_cast(b), width * 2); + lcd.DrawBuffer(x, y, w, h, reinterpret_cast(b), width * 2); WaitTransferFinished(); } -void Gfx::DrawString(uint8_t x, uint8_t y, uint16_t color, const char *text, const FONT_INFO *p_font, bool wrap) { +void Gfx::DrawString(uint8_t x, uint8_t y, uint16_t color, const char* text, const FONT_INFO* p_font, bool wrap) { if (y > (height - p_font->height)) { // Not enough space to write even single char. return; @@ -86,7 +84,7 @@ void Gfx::DrawString(uint8_t x, uint8_t y, uint16_t color, const char *text, con } } -void Gfx::DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint16_t color) { +void Gfx::DrawChar(const FONT_INFO* font, uint8_t c, uint8_t* x, uint8_t y, uint16_t color) { uint8_t char_idx = c - font->startChar; uint16_t bytes_in_line = CEIL_DIV(font->charInfo[char_idx].widthBits, 8); uint16_t bg = 0x0000; @@ -100,10 +98,9 @@ void Gfx::DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint for (uint16_t j = 0; j < bytes_in_line; j++) { for (uint8_t k = 0; k < 8; k++) { if ((1 << (7 - k)) & font->data[font->charInfo[char_idx].offset + j]) { - buffer[(j*8)+k] = color; - } - else { - buffer[(j*8)+k] = bg; + buffer[(j * 8) + k] = color; + } else { + buffer[(j * 8) + k] = bg; } } } @@ -112,12 +109,12 @@ void Gfx::DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint state.currentIteration = 0; state.busy = true; state.action = Action::DrawChar; - state.font = const_cast(font); + state.font = const_cast(font); state.character = c; state.color = color; state.taskToNotify = xTaskGetCurrentTaskHandle(); - lcd.DrawBuffer(*x, y, bytes_in_line*8, font->height, reinterpret_cast(&buffer), bytes_in_line*8*2); + lcd.DrawBuffer(*x, y, bytes_in_line * 8, font->height, reinterpret_cast(&buffer), bytes_in_line * 8 * 2); WaitTransferFinished(); *x += font->charInfo[char_idx].widthBits + font->spacePixels; @@ -136,13 +133,14 @@ void Gfx::Wakeup() { } void Gfx::SetBackgroundColor(uint16_t color) { - for(int i = 0; i < width; i++) { + for (int i = 0; i < width; i++) { buffer[i] = color; } } -bool Gfx::GetNextBuffer(uint8_t **data, size_t &size) { - if(!state.busy) return false; +bool Gfx::GetNextBuffer(uint8_t** data, size_t& size) { + if (!state.busy) + return false; state.remainingIterations--; if (state.remainingIterations == 0) { state.busy = false; @@ -150,27 +148,26 @@ bool Gfx::GetNextBuffer(uint8_t **data, size_t &size) { return false; } - if(state.action == Action::FillRectangle) { - *data = reinterpret_cast(buffer); + if (state.action == Action::FillRectangle) { + *data = reinterpret_cast(buffer); size = width * 2; - } else if(state.action == Action::DrawChar) { + } else if (state.action == Action::DrawChar) { uint16_t bg = 0x0000; uint8_t char_idx = state.character - state.font->startChar; uint16_t bytes_in_line = CEIL_DIV(state.font->charInfo[char_idx].widthBits, 8); for (uint16_t j = 0; j < bytes_in_line; j++) { for (uint8_t k = 0; k < 8; k++) { - if ((1 << (7 - k)) & state.font->data[state.font->charInfo[char_idx].offset + ((state.currentIteration+1) * bytes_in_line) + j]) { - buffer[(j*8)+k] = state.color; - } - else { - buffer[(j*8)+k] = bg; + if ((1 << (7 - k)) & state.font->data[state.font->charInfo[char_idx].offset + ((state.currentIteration + 1) * bytes_in_line) + j]) { + buffer[(j * 8) + k] = state.color; + } else { + buffer[(j * 8) + k] = bg; } } } - *data = reinterpret_cast(buffer); - size = bytes_in_line*8*2; + *data = reinterpret_cast(buffer); + size = bytes_in_line * 8 * 2; } state.currentIteration++; @@ -179,7 +176,7 @@ bool Gfx::GetNextBuffer(uint8_t **data, size_t &size) { } void Gfx::NotifyEndOfTransfer(TaskHandle_t task) { - if(task != nullptr) { + if (task != nullptr) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; vTaskNotifyGiveFromISR(task, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); diff --git a/src/components/gfx/Gfx.h b/src/components/gfx/Gfx.h index 4c0fc8ee..b45fb45c 100644 --- a/src/components/gfx/Gfx.h +++ b/src/components/gfx/Gfx.h @@ -12,49 +12,48 @@ namespace Pinetime { } namespace Components { class Gfx : public Pinetime::Drivers::BufferProvider { - public: - explicit Gfx(Drivers::St7789& lcd); - void Init(); - void ClearScreen(); - void DrawString(uint8_t x, uint8_t y, uint16_t color, const char* text, const FONT_INFO *p_font, bool wrap); - void DrawChar(const FONT_INFO *font, uint8_t c, uint8_t *x, uint8_t y, uint16_t color); - void FillRectangle(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color); - void FillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t* b); - void SetScrollArea(uint16_t topFixedLines, uint16_t scrollLines, uint16_t bottomFixedLines); - void SetScrollStartLine(uint16_t line); + public: + explicit Gfx(Drivers::St7789& lcd); + void Init(); + void ClearScreen(); + void DrawString(uint8_t x, uint8_t y, uint16_t color, const char* text, const FONT_INFO* p_font, bool wrap); + void DrawChar(const FONT_INFO* font, uint8_t c, uint8_t* x, uint8_t y, uint16_t color); + void FillRectangle(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color); + void FillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, uint8_t* b); + void SetScrollArea(uint16_t topFixedLines, uint16_t scrollLines, uint16_t bottomFixedLines); + void SetScrollStartLine(uint16_t line); + void Sleep(); + void Wakeup(); + bool GetNextBuffer(uint8_t** buffer, size_t& size) override; + void pixel_draw(uint8_t x, uint8_t y, uint16_t color); - void Sleep(); - void Wakeup(); - bool GetNextBuffer(uint8_t **buffer, size_t &size) override; - void pixel_draw(uint8_t x, uint8_t y, uint16_t color); + private: + static constexpr uint8_t width = 240; + static constexpr uint8_t height = 240; + enum class Action { None, FillRectangle, DrawChar }; + struct State { + State() : busy {false}, action {Action::None}, remainingIterations {0}, currentIteration {0} { + } + volatile bool busy; + volatile Action action; + volatile uint16_t remainingIterations; + volatile uint16_t currentIteration; + volatile FONT_INFO* font; + volatile uint16_t color; + volatile uint8_t character; + volatile TaskHandle_t taskToNotify = nullptr; + }; - private: - static constexpr uint8_t width = 240; - static constexpr uint8_t height = 240; + volatile State state; - enum class Action { None, FillRectangle, DrawChar}; - struct State { - State() : busy{false}, action{Action::None}, remainingIterations{0}, currentIteration{0} {} - volatile bool busy; - volatile Action action; - volatile uint16_t remainingIterations; - volatile uint16_t currentIteration; - volatile FONT_INFO *font; - volatile uint16_t color; - volatile uint8_t character; - volatile TaskHandle_t taskToNotify = nullptr; - }; + uint16_t buffer[width]; // 1 line buffer + Drivers::St7789& lcd; - volatile State state; - - uint16_t buffer[width]; // 1 line buffer - Drivers::St7789& lcd; - - void SetBackgroundColor(uint16_t color); - void WaitTransferFinished() const; - void NotifyEndOfTransfer(TaskHandle_t task); + void SetBackgroundColor(uint16_t color); + void WaitTransferFinished() const; + void NotifyEndOfTransfer(TaskHandle_t task); }; } } diff --git a/src/components/heartrate/Biquad.cpp b/src/components/heartrate/Biquad.cpp index 6a4b8181..0341eda6 100644 --- a/src/components/heartrate/Biquad.cpp +++ b/src/components/heartrate/Biquad.cpp @@ -9,8 +9,7 @@ using namespace Pinetime::Controllers; /** Original implementation from wasp-os : https://github.com/daniel-thompson/wasp-os/blob/master/wasp/ppg.py */ -Biquad::Biquad(float b0, float b1, float b2, float a1, float a2) : b0{b0}, b1{b1}, b2{b2}, a1{a1}, a2{a2} { - +Biquad::Biquad(float b0, float b1, float b2, float a1, float a2) : b0 {b0}, b1 {b1}, b2 {b2}, a1 {a1}, a2 {a2} { } float Biquad::Step(float x) { diff --git a/src/components/heartrate/Biquad.h b/src/components/heartrate/Biquad.h index dc9b97f6..0d62b1fe 100644 --- a/src/components/heartrate/Biquad.h +++ b/src/components/heartrate/Biquad.h @@ -4,11 +4,11 @@ namespace Pinetime { namespace Controllers { /// Direct Form II Biquad Filter class Biquad { - public: - Biquad(float b0, float b1, float b2, float a1, float a2); + public: + Biquad(float b0, float b1, float b2, float a1, float a2); float Step(float x); - private: + private: float b0; float b1; float b2; diff --git a/src/components/heartrate/HeartRateController.cpp b/src/components/heartrate/HeartRateController.cpp index d0b0d513..e84d665a 100644 --- a/src/components/heartrate/HeartRateController.cpp +++ b/src/components/heartrate/HeartRateController.cpp @@ -4,38 +4,35 @@ using namespace Pinetime::Controllers; -HeartRateController::HeartRateController(Pinetime::System::SystemTask &systemTask) : systemTask{systemTask} { - +HeartRateController::HeartRateController(Pinetime::System::SystemTask& systemTask) : systemTask {systemTask} { } - void HeartRateController::Update(HeartRateController::States newState, uint8_t heartRate) { this->state = newState; - if(this->heartRate != heartRate) { + if (this->heartRate != heartRate) { this->heartRate = heartRate; service->OnNewHeartRateValue(heartRate); } } void HeartRateController::Start() { - if(task != nullptr) { + if (task != nullptr) { state = States::NotEnoughData; task->PushMessage(Pinetime::Applications::HeartRateTask::Messages::StartMeasurement); } } void HeartRateController::Stop() { - if(task != nullptr) { + if (task != nullptr) { state = States::Stopped; task->PushMessage(Pinetime::Applications::HeartRateTask::Messages::StopMeasurement); } } -void HeartRateController::SetHeartRateTask(Pinetime::Applications::HeartRateTask *task) { +void HeartRateController::SetHeartRateTask(Pinetime::Applications::HeartRateTask* task) { this->task = task; } -void HeartRateController::SetService(Pinetime::Controllers::HeartRateService *service) { +void HeartRateController::SetService(Pinetime::Controllers::HeartRateService* service) { this->service = service; } - diff --git a/src/components/heartrate/HeartRateController.h b/src/components/heartrate/HeartRateController.h index 001111b5..5558d355 100644 --- a/src/components/heartrate/HeartRateController.h +++ b/src/components/heartrate/HeartRateController.h @@ -12,8 +12,8 @@ namespace Pinetime { } namespace Controllers { class HeartRateController { - public: - enum class States { Stopped, NotEnoughData, NoTouch, Running}; + public: + enum class States { Stopped, NotEnoughData, NoTouch, Running }; explicit HeartRateController(System::SystemTask& systemTask); @@ -22,12 +22,16 @@ namespace Pinetime { void Update(States newState, uint8_t heartRate); void SetHeartRateTask(Applications::HeartRateTask* task); - States State() const { return state; } - uint8_t HeartRate() const { return heartRate; } + States State() const { + return state; + } + uint8_t HeartRate() const { + return heartRate; + } - void SetService(Pinetime::Controllers::HeartRateService *service); + void SetService(Pinetime::Controllers::HeartRateService* service); - private: + private: System::SystemTask& systemTask; Applications::HeartRateTask* task = nullptr; States state = States::Stopped; diff --git a/src/components/heartrate/Ppg.cpp b/src/components/heartrate/Ppg.cpp index e84cbdf3..578e2895 100644 --- a/src/components/heartrate/Ppg.cpp +++ b/src/components/heartrate/Ppg.cpp @@ -13,7 +13,7 @@ using namespace Pinetime::Controllers; namespace { int Compare(int* d1, int* d2, size_t count) { int e = 0; - for(size_t i = 0; i < count; i++) { + for (size_t i = 0; i < count; i++) { auto d = d1[i] - d2[i]; e += d * d; } @@ -21,15 +21,15 @@ namespace { } int CompareShift(int* d, int shift, size_t count) { - return Compare(d +shift, d, count - shift); + return Compare(d + shift, d, count - shift); } int Trough(int* d, size_t size, float mn, float mx) { - auto z2 = CompareShift(d, mn-2, size); - auto z1 = CompareShift(d, mn-1, size); - for(int i = mn; i < mx + 1; i++) { + auto z2 = CompareShift(d, mn - 2, size); + auto z1 = CompareShift(d, mn - 1, size); + for (int i = mn; i < mx + 1; i++) { auto z = CompareShift(d, i, size); - if(z2 > z1 && z1 < z) + if (z2 > z1 && z1 < z) return i; z2 = z1; z1 = z; @@ -38,11 +38,11 @@ namespace { } } -Ppg::Ppg(float spl) : offset{spl}, - hpf{0.87033078, -1.74066156, 0.87033078,-1.72377617, 0.75754694}, - agc{20, 0.971, 2}, - lpf{0.11595249, 0.23190498, 0.11595249,-0.72168143, 0.18549138} { - +Ppg::Ppg(float spl) + : offset {spl}, + hpf {0.87033078, -1.74066156, 0.87033078, -1.72377617, 0.75754694}, + agc {20, 0.971, 2}, + lpf {0.11595249, 0.23190498, 0.11595249, -0.72168143, 0.18549138} { } int Ppg::Preprocess(float spl) { @@ -53,13 +53,13 @@ int Ppg::Preprocess(float spl) { auto spl_int = static_cast(spl); - if(dataIndex < 200) + if (dataIndex < 200) data[dataIndex++] = spl_int; return spl_int; } float Ppg::HeartRate() { - if(dataIndex < 200) + if (dataIndex < 200) return 0; NRF_LOG_INFO("PREPROCESS, offset = %d", offset); @@ -71,26 +71,26 @@ float Ppg::HeartRate() { int cccount = 0; float Ppg::ProcessHeartRate() { - if(cccount > 2) + if (cccount > 2) asm("nop"); - cccount ++; + cccount++; auto t0 = Trough(data.data(), dataIndex, 7, 48); - if(t0 < 0) + if (t0 < 0) return 0; float t1 = t0 * 2; - t1 = Trough(data.data(), dataIndex, t1-5, t1+5); - if(t1 < 0) + t1 = Trough(data.data(), dataIndex, t1 - 5, t1 + 5); + if (t1 < 0) return 0; float t2 = static_cast(t1 * 3) / 2; t2 = Trough(data.data(), dataIndex, t2 - 5, t2 + 5); - if(t2 < 0) + if (t2 < 0) return 0; float t3 = static_cast(t2 * 4) / 3; t3 = Trough(data.data(), dataIndex, t3 - 4, t3 + 4); - if(t3 < 0) + if (t3 < 0) return static_cast(60 * 24 * 3) / static_cast(t2); return static_cast(60 * 24 * 4) / static_cast(t3); diff --git a/src/components/heartrate/Ppg.h b/src/components/heartrate/Ppg.h index 747ae019..51db7582 100644 --- a/src/components/heartrate/Ppg.h +++ b/src/components/heartrate/Ppg.h @@ -7,7 +7,7 @@ namespace Pinetime { namespace Controllers { class Ppg { - public: + public: explicit Ppg(float spl); int Preprocess(float spl); @@ -16,7 +16,7 @@ namespace Pinetime { void SetOffset(uint16_t i); void Reset(); - private: + private: std::array data; size_t dataIndex = 0; float offset; @@ -24,7 +24,6 @@ namespace Pinetime { Ptagc agc; Biquad lpf; - float ProcessHeartRate(); }; } diff --git a/src/components/heartrate/Ptagc.cpp b/src/components/heartrate/Ptagc.cpp index dd7c4411..e358371e 100644 --- a/src/components/heartrate/Ptagc.cpp +++ b/src/components/heartrate/Ptagc.cpp @@ -10,17 +10,16 @@ using namespace Pinetime::Controllers; /** Original implementation from wasp-os : https://github.com/daniel-thompson/wasp-os/blob/master/wasp/ppg.py */ -Ptagc::Ptagc(float start, float decay, float threshold) : peak{start}, decay{decay}, boost{1.0f/decay}, threshold{threshold} { - +Ptagc::Ptagc(float start, float decay, float threshold) : peak {start}, decay {decay}, boost {1.0f / decay}, threshold {threshold} { } float Ptagc::Step(float spl) { - if(std::abs(spl) > peak) + if (std::abs(spl) > peak) peak *= boost; else peak *= decay; - if((spl > (peak * threshold)) || (spl < (peak * -threshold))) + if ((spl > (peak * threshold)) || (spl < (peak * -threshold))) return 0.0f; spl = 100.0f * spl / (2.0f * peak); diff --git a/src/components/heartrate/Ptagc.h b/src/components/heartrate/Ptagc.h index c20de4c0..aaa6f1e6 100644 --- a/src/components/heartrate/Ptagc.h +++ b/src/components/heartrate/Ptagc.h @@ -3,16 +3,15 @@ namespace Pinetime { namespace Controllers { class Ptagc { - public: + public: Ptagc(float start, float decay, float threshold); float Step(float spl); - private: + private: float peak; float decay; float boost; float threshold; - }; } } diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h index 5881997f..1a551196 100644 --- a/src/components/motion/MotionController.h +++ b/src/components/motion/MotionController.h @@ -5,19 +5,29 @@ namespace Pinetime { namespace Controllers { class MotionController { - public: + public: void Update(int16_t x, int16_t y, int16_t z, uint32_t nbSteps); - uint16_t X() const { return x; } - uint16_t Y() const { return y; } - uint16_t Z() const { return z; } - uint32_t NbSteps() const { return nbSteps; } + uint16_t X() const { + return x; + } + uint16_t Y() const { + return y; + } + uint16_t Z() const { + return z; + } + uint32_t NbSteps() const { + return nbSteps; + } bool ShouldWakeUp(bool isSleeping); void IsSensorOk(bool isOk); - bool IsSensorOk() const { return isSensorOk; } + bool IsSensorOk() const { + return isSensorOk; + } - private: + private: uint32_t nbSteps; int16_t x; int16_t y; diff --git a/src/components/motor/MotorController.cpp b/src/components/motor/MotorController.cpp index 345234b3..a834ab6b 100644 --- a/src/components/motor/MotorController.cpp +++ b/src/components/motor/MotorController.cpp @@ -7,24 +7,26 @@ APP_TIMER_DEF(vibTimer); using namespace Pinetime::Controllers; -MotorController::MotorController( Controllers::Settings &settingsController ) : settingsController{settingsController} {} +MotorController::MotorController(Controllers::Settings& settingsController) : settingsController {settingsController} { +} void MotorController::Init() { - nrf_gpio_cfg_output(pinMotor); - nrf_gpio_pin_set(pinMotor); - app_timer_init(); - app_timer_create(&vibTimer, APP_TIMER_MODE_SINGLE_SHOT, vibrate); + nrf_gpio_cfg_output(pinMotor); + nrf_gpio_pin_set(pinMotor); + app_timer_init(); + app_timer_create(&vibTimer, APP_TIMER_MODE_SINGLE_SHOT, vibrate); } void MotorController::SetDuration(uint8_t motorDuration) { - if ( settingsController.GetVibrationStatus() == Controllers::Settings::Vibration::OFF ) return; - - nrf_gpio_pin_clear(pinMotor); - /* Start timer for motorDuration miliseconds and timer triggers vibrate() when it finishes*/ - app_timer_start(vibTimer, APP_TIMER_TICKS(motorDuration), NULL); + if (settingsController.GetVibrationStatus() == Controllers::Settings::Vibration::OFF) + return; + + nrf_gpio_pin_clear(pinMotor); + /* Start timer for motorDuration miliseconds and timer triggers vibrate() when it finishes*/ + app_timer_start(vibTimer, APP_TIMER_TICKS(motorDuration), NULL); } -void MotorController::vibrate(void * p_context) { - nrf_gpio_pin_set(pinMotor); +void MotorController::vibrate(void* p_context) { + nrf_gpio_pin_set(pinMotor); } \ No newline at end of file diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h index 2f2e0343..4662a8da 100644 --- a/src/components/motor/MotorController.h +++ b/src/components/motor/MotorController.h @@ -9,14 +9,14 @@ namespace Pinetime { static constexpr uint8_t pinMotor = 16; class MotorController { - public: - MotorController( Controllers::Settings &settingsController ); - void Init(); - void SetDuration(uint8_t motorDuration); + public: + MotorController(Controllers::Settings& settingsController); + void Init(); + void SetDuration(uint8_t motorDuration); - private: - Controllers::Settings& settingsController; - static void vibrate(void * p_context); + private: + Controllers::Settings& settingsController; + static void vibrate(void* p_context); }; } } diff --git a/src/components/rle/RleDecoder.cpp b/src/components/rle/RleDecoder.cpp index 19a90fda..df2bcb6b 100644 --- a/src/components/rle/RleDecoder.cpp +++ b/src/components/rle/RleDecoder.cpp @@ -2,18 +2,16 @@ using namespace Pinetime::Tools; -RleDecoder::RleDecoder(const uint8_t *buffer, size_t size) : buffer{buffer}, size{size} { - +RleDecoder::RleDecoder(const uint8_t* buffer, size_t size) : buffer {buffer}, size {size} { } -RleDecoder::RleDecoder(const uint8_t *buffer, size_t size, uint16_t foregroundColor, uint16_t backgroundColor) : RleDecoder{buffer, size} { +RleDecoder::RleDecoder(const uint8_t* buffer, size_t size, uint16_t foregroundColor, uint16_t backgroundColor) : RleDecoder {buffer, size} { this->foregroundColor = foregroundColor; this->backgroundColor = backgroundColor; } - -void RleDecoder::DecodeNext(uint8_t *output, size_t maxBytes) { - for (;encodedBufferIndex> 8; @@ -36,4 +34,3 @@ void RleDecoder::DecodeNext(uint8_t *output, size_t maxBytes) { color = backgroundColor; } } - diff --git a/src/components/rle/RleDecoder.h b/src/components/rle/RleDecoder.h index 0f607fb8..c21f45c2 100644 --- a/src/components/rle/RleDecoder.h +++ b/src/components/rle/RleDecoder.h @@ -11,13 +11,13 @@ namespace Pinetime { * Code from https://github.com/daniel-thompson/wasp-bootloader by Daniel Thompson released under the MIT license. */ class RleDecoder { - public: + public: RleDecoder(const uint8_t* buffer, size_t size); RleDecoder(const uint8_t* buffer, size_t size, uint16_t foregroundColor, uint16_t backgroundColor); void DecodeNext(uint8_t* output, size_t maxBytes); - private: + private: const uint8_t* buffer; size_t size; diff --git a/src/components/settings/Settings.cpp b/src/components/settings/Settings.cpp index 454df577..071940b8 100644 --- a/src/components/settings/Settings.cpp +++ b/src/components/settings/Settings.cpp @@ -5,110 +5,107 @@ using namespace Pinetime::Controllers; struct SettingsHeader { - uint8_t isActive; // 0xF1 = Block is active, 0xF0 = Block is inactive - uint16_t version; // Current version, to verify if the saved data is for the current Version + uint8_t isActive; // 0xF1 = Block is active, 0xF0 = Block is inactive + uint16_t version; // Current version, to verify if the saved data is for the current Version }; #define HEADER_SIZE sizeof(SettingsHeader) - -Settings::Settings( Pinetime::Drivers::SpiNorFlash &spiNorFlash ) : spiNorFlash{spiNorFlash} {} +Settings::Settings(Pinetime::Drivers::SpiNorFlash& spiNorFlash) : spiNorFlash {spiNorFlash} { +} void Settings::Init() { - // Load default settings from Flash - LoadSettingsFromFlash(); - + // Load default settings from Flash + LoadSettingsFromFlash(); } void Settings::SaveSettings() { - // verify if is necessary to save - if ( settingsChanged ) { - SaveSettingsToFlash(); - } - settingsChanged = false; + // verify if is necessary to save + if (settingsChanged) { + SaveSettingsToFlash(); + } + settingsChanged = false; } - bool Settings::FindHeader() { - SettingsHeader settingsHeader; - uint8_t bufferHead[sizeof(settingsHeader)]; + SettingsHeader settingsHeader; + uint8_t bufferHead[sizeof(settingsHeader)]; - for (uint8_t block = 0; block < 10; block++) { - - spiNorFlash.Read( settingsBaseAddr + (block * 0x1000), bufferHead, sizeof(settingsHeader) ); - std::memcpy(&settingsHeader, bufferHead, sizeof(settingsHeader)); - if ( settingsHeader.isActive == 0xF1 && settingsHeader.version == settingsVersion ) { - settingsFlashBlock = block; - return true; - } + for (uint8_t block = 0; block < 10; block++) { + + spiNorFlash.Read(settingsBaseAddr + (block * 0x1000), bufferHead, sizeof(settingsHeader)); + std::memcpy(&settingsHeader, bufferHead, sizeof(settingsHeader)); + if (settingsHeader.isActive == 0xF1 && settingsHeader.version == settingsVersion) { + settingsFlashBlock = block; + return true; } - return false; + } + return false; } void Settings::ReadSettingsData() { - uint8_t bufferSettings[sizeof(settings)]; - spiNorFlash.Read( settingsBaseAddr + (settingsFlashBlock * 0x1000) + HEADER_SIZE, bufferSettings, sizeof(settings) ); - std::memcpy(&settings, bufferSettings, sizeof(settings)); + uint8_t bufferSettings[sizeof(settings)]; + spiNorFlash.Read(settingsBaseAddr + (settingsFlashBlock * 0x1000) + HEADER_SIZE, bufferSettings, sizeof(settings)); + std::memcpy(&settings, bufferSettings, sizeof(settings)); } void Settings::EraseBlock() { - spiNorFlash.SectorErase(settingsBaseAddr + (settingsFlashBlock * 0x1000)); + spiNorFlash.SectorErase(settingsBaseAddr + (settingsFlashBlock * 0x1000)); } -void Settings::SetHeader( bool state ) { - SettingsHeader settingsHeader; - uint8_t bufferHead[sizeof(settingsHeader)]; - settingsHeader.isActive = state ? 0xF1 : 0xF0; - settingsHeader.version = settingsVersion; - - std::memcpy(bufferHead, &settingsHeader, sizeof(settingsHeader)); - spiNorFlash.Write(settingsBaseAddr + (settingsFlashBlock * 0x1000), bufferHead, sizeof(settingsHeader)); +void Settings::SetHeader(bool state) { + SettingsHeader settingsHeader; + uint8_t bufferHead[sizeof(settingsHeader)]; + settingsHeader.isActive = state ? 0xF1 : 0xF0; + settingsHeader.version = settingsVersion; + std::memcpy(bufferHead, &settingsHeader, sizeof(settingsHeader)); + spiNorFlash.Write(settingsBaseAddr + (settingsFlashBlock * 0x1000), bufferHead, sizeof(settingsHeader)); } void Settings::SaveSettingsData() { - uint8_t bufferSettings[sizeof(settings)]; - std::memcpy(bufferSettings, &settings, sizeof(settings)); - spiNorFlash.Write(settingsBaseAddr + (settingsFlashBlock * 0x1000) + HEADER_SIZE, bufferSettings, sizeof(settings)); + uint8_t bufferSettings[sizeof(settings)]; + std::memcpy(bufferSettings, &settings, sizeof(settings)); + spiNorFlash.Write(settingsBaseAddr + (settingsFlashBlock * 0x1000) + HEADER_SIZE, bufferSettings, sizeof(settings)); } void Settings::LoadSettingsFromFlash() { - if ( settingsFlashBlock == 99 ) { - // Find current Block, if can't find use default settings and set block to 0 ans save ! - if ( FindHeader() ) { - ReadSettingsData(); - } else { - SaveSettingsToFlash(); - } + if (settingsFlashBlock == 99) { + // Find current Block, if can't find use default settings and set block to 0 ans save ! + if (FindHeader()) { + ReadSettingsData(); } else { - // Read Settings from flash... - // never used :) - ReadSettingsData(); + SaveSettingsToFlash(); } - + } else { + // Read Settings from flash... + // never used :) + ReadSettingsData(); + } } void Settings::SaveSettingsToFlash() { - - // calculate where to save... - // mark current to inactive - // erase the new location and save - // set settingsFlashBlock - // if first time hever, only saves to block 0 and set settingsFlashBlock + // calculate where to save... + // mark current to inactive + // erase the new location and save + // set settingsFlashBlock - if ( settingsFlashBlock != 99 ) { - SetHeader( false ); - } + // if first time hever, only saves to block 0 and set settingsFlashBlock - settingsFlashBlock++; - if ( settingsFlashBlock > 9 ) settingsFlashBlock = 0; + if (settingsFlashBlock != 99) { + SetHeader(false); + } - EraseBlock(); - SetHeader( true ); - SaveSettingsData(); + settingsFlashBlock++; + if (settingsFlashBlock > 9) + settingsFlashBlock = 0; + + EraseBlock(); + SetHeader(true); + SaveSettingsData(); } diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 9cbbee62..05d6e7ef 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -8,98 +8,121 @@ namespace Pinetime { namespace Controllers { class Settings { - public: - enum class ClockType {H24, H12}; - enum class Vibration {ON, OFF}; - enum class WakeUpMode {None, SingleTap, DoubleTap, RaiseWrist}; + public: + enum class ClockType { H24, H12 }; + enum class Vibration { ON, OFF }; + enum class WakeUpMode { None, SingleTap, DoubleTap, RaiseWrist }; - Settings( Pinetime::Drivers::SpiNorFlash &spiNorFlash ); + Settings(Pinetime::Drivers::SpiNorFlash& spiNorFlash); - void Init(); - void SaveSettings(); + void Init(); + void SaveSettings(); - void SetClockFace( uint8_t face ) { - if ( face != settings.clockFace ) settingsChanged = true; - settings.clockFace = face; - }; - uint8_t GetClockFace() const { return settings.clockFace; }; + void SetClockFace(uint8_t face) { + if (face != settings.clockFace) + settingsChanged = true; + settings.clockFace = face; + }; + uint8_t GetClockFace() const { + return settings.clockFace; + }; - void SetAppMenu( uint8_t menu ) { appMenu = menu; }; - uint8_t GetAppMenu() { return appMenu; }; + void SetAppMenu(uint8_t menu) { + appMenu = menu; + }; + uint8_t GetAppMenu() { + return appMenu; + }; - void SetSettingsMenu( uint8_t menu ) { settingsMenu = menu; }; - uint8_t GetSettingsMenu() const { return settingsMenu; }; + void SetSettingsMenu(uint8_t menu) { + settingsMenu = menu; + }; + uint8_t GetSettingsMenu() const { + return settingsMenu; + }; - void SetClockType( ClockType clocktype ) { - if ( clocktype != settings.clockType ) settingsChanged = true; - settings.clockType = clocktype; - }; - ClockType GetClockType() const { return settings.clockType; }; + void SetClockType(ClockType clocktype) { + if (clocktype != settings.clockType) + settingsChanged = true; + settings.clockType = clocktype; + }; + ClockType GetClockType() const { + return settings.clockType; + }; - void SetVibrationStatus( Vibration status ) { - if ( status != settings.vibrationStatus ) settingsChanged = true; - settings.vibrationStatus = status; - }; - Vibration GetVibrationStatus() const { return settings.vibrationStatus; }; + void SetVibrationStatus(Vibration status) { + if (status != settings.vibrationStatus) + settingsChanged = true; + settings.vibrationStatus = status; + }; + Vibration GetVibrationStatus() const { + return settings.vibrationStatus; + }; - void SetScreenTimeOut( uint32_t timeout ) { - if ( timeout != settings.screenTimeOut ) settingsChanged = true; - settings.screenTimeOut = timeout; - }; - uint32_t GetScreenTimeOut() const { return settings.screenTimeOut; }; + void SetScreenTimeOut(uint32_t timeout) { + if (timeout != settings.screenTimeOut) + settingsChanged = true; + settings.screenTimeOut = timeout; + }; + uint32_t GetScreenTimeOut() const { + return settings.screenTimeOut; + }; - void setWakeUpMode( WakeUpMode wakeUp ) { - if ( wakeUp != settings.wakeUpMode ) settingsChanged = true; - settings.wakeUpMode = wakeUp; - }; - WakeUpMode getWakeUpMode() const { return settings.wakeUpMode; }; + void setWakeUpMode(WakeUpMode wakeUp) { + if (wakeUp != settings.wakeUpMode) + settingsChanged = true; + settings.wakeUpMode = wakeUp; + }; + WakeUpMode getWakeUpMode() const { + return settings.wakeUpMode; + }; - void SetBrightness( Controllers::BrightnessController::Levels level ) { - if ( level != settings.brightLevel ) settingsChanged = true; - settings.brightLevel = level; - }; - Controllers::BrightnessController::Levels GetBrightness() const { return settings.brightLevel; }; + void SetBrightness(Controllers::BrightnessController::Levels level) { + if (level != settings.brightLevel) + settingsChanged = true; + settings.brightLevel = level; + }; + Controllers::BrightnessController::Levels GetBrightness() const { + return settings.brightLevel; + }; - private: + private: + Pinetime::Drivers::SpiNorFlash& spiNorFlash; + struct SettingsData { - Pinetime::Drivers::SpiNorFlash& spiNorFlash; - struct SettingsData { + ClockType clockType = ClockType::H24; + Vibration vibrationStatus = Vibration::ON; - ClockType clockType = ClockType::H24; - Vibration vibrationStatus = Vibration::ON; + uint8_t clockFace = 0; - uint8_t clockFace = 0; + uint32_t stepsGoal = 1000; + uint32_t screenTimeOut = 15000; - uint32_t stepsGoal = 1000; - uint32_t screenTimeOut = 15000; + WakeUpMode wakeUpMode = WakeUpMode::None; - WakeUpMode wakeUpMode = WakeUpMode::None; + Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; + }; - Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; + SettingsData settings; + bool settingsChanged = false; - }; + uint8_t appMenu = 0; + uint8_t settingsMenu = 0; - SettingsData settings; - bool settingsChanged = false; + // There are 10 blocks of reserved flash to save settings + // to minimize wear, the recording is done in a rotating way by the 10 blocks + uint8_t settingsFlashBlock = 99; // default to indicate it needs to find the active block - uint8_t appMenu = 0; - uint8_t settingsMenu = 0; - - // There are 10 blocks of reserved flash to save settings - // to minimize wear, the recording is done in a rotating way by the 10 blocks - uint8_t settingsFlashBlock = 99; // default to indicate it needs to find the active block - - static constexpr uint32_t settingsBaseAddr = 0x3F6000; // Flash Settings Location - static constexpr uint16_t settingsVersion = 0x0100; // Flash Settings Version - - bool FindHeader(); - void ReadSettingsData(); - void EraseBlock(); - void SetHeader( bool state ); - void SaveSettingsData(); - void LoadSettingsFromFlash(); - void SaveSettingsToFlash(); + static constexpr uint32_t settingsBaseAddr = 0x3F6000; // Flash Settings Location + static constexpr uint16_t settingsVersion = 0x0100; // Flash Settings Version + bool FindHeader(); + void ReadSettingsData(); + void EraseBlock(); + void SetHeader(bool state); + void SaveSettingsData(); + void LoadSettingsFromFlash(); + void SaveSettingsToFlash(); }; } } \ No newline at end of file diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h index 358ea1f7..936a3ae8 100644 --- a/src/displayapp/Apps.h +++ b/src/displayapp/Apps.h @@ -3,9 +3,30 @@ namespace Pinetime { namespace Applications { enum class Apps { - None, Launcher, Clock, SysInfo, FirmwareUpdate, FirmwareValidation, NotificationsPreview, Notifications, FlashLight, BatteryInfo, - Music, Paint, Paddle, Twos, HeartRate, Navigation, StopWatch, Motion, - QuickSettings, Settings, SettingWatchFace, SettingTimeFormat, SettingDisplay, SettingWakeUp + None, + Launcher, + Clock, + SysInfo, + FirmwareUpdate, + FirmwareValidation, + NotificationsPreview, + Notifications, + FlashLight, + BatteryInfo, + Music, + Paint, + Paddle, + Twos, + HeartRate, + Navigation, + StopWatch, + Motion, + QuickSettings, + Settings, + SettingWatchFace, + SettingTimeFormat, + SettingDisplay, + SettingWakeUp }; } } diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 36f93a91..68f2d971 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -40,29 +40,33 @@ using namespace Pinetime::Applications; using namespace Pinetime::Applications::Display; -DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Drivers::Cst816S &touchPanel, - Controllers::Battery &batteryController, Controllers::Ble &bleController, - Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog, - System::SystemTask &systemTask, +DisplayApp::DisplayApp(Drivers::St7789& lcd, + Components::LittleVgl& lvgl, + Drivers::Cst816S& touchPanel, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::DateTime& dateTimeController, + Drivers::WatchdogView& watchdog, + System::SystemTask& systemTask, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, - Controllers::Settings &settingsController, - Pinetime::Controllers::MotionController& motionController) : - lcd{lcd}, - lvgl{lvgl}, - touchPanel{touchPanel}, - batteryController{batteryController}, - bleController{bleController}, - dateTimeController{dateTimeController}, - watchdog{watchdog}, - systemTask{systemTask}, - notificationManager{notificationManager}, - heartRateController{heartRateController}, - settingsController{settingsController}, - motionController{motionController} { + Controllers::Settings& settingsController, + Pinetime::Controllers::MotionController& motionController) + : lcd {lcd}, + lvgl {lvgl}, + touchPanel {touchPanel}, + batteryController {batteryController}, + bleController {bleController}, + dateTimeController {dateTimeController}, + watchdog {watchdog}, + systemTask {systemTask}, + notificationManager {notificationManager}, + heartRateController {heartRateController}, + settingsController {settingsController}, + motionController {motionController} { msgQueue = xQueueCreate(queueSize, itemSize); // Start clock when smartwatch boots - LoadApp( Apps::Clock, DisplayApp::FullRefreshDirections::None ); + LoadApp(Apps::Clock, DisplayApp::FullRefreshDirections::None); } void DisplayApp::Start() { @@ -70,8 +74,8 @@ void DisplayApp::Start() { APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); } -void DisplayApp::Process(void *instance) { - auto *app = static_cast(instance); +void DisplayApp::Process(void* instance) { + auto* app = static_cast(instance); NRF_LOG_INFO("displayapp task started!"); app->InitHw(); @@ -112,7 +116,7 @@ void DisplayApp::Refresh() { switch (msg) { case Messages::GoToSleep: brightnessController.Backup(); - while(brightnessController.Level() != Controllers::BrightnessController::Levels::Off) { + while (brightnessController.Level() != Controllers::BrightnessController::Levels::Off) { brightnessController.Lower(); vTaskDelay(100); } @@ -127,30 +131,32 @@ void DisplayApp::Refresh() { break; case Messages::UpdateTimeOut: systemTask.PushMessage(System::SystemTask::Messages::UpdateTimeOut); - break; + break; case Messages::UpdateBleConnection: -// clockScreen.SetBleConnectionState(bleController.IsConnected() ? Screens::Clock::BleConnectionStates::Connected : Screens::Clock::BleConnectionStates::NotConnected); + // clockScreen.SetBleConnectionState(bleController.IsConnected() ? Screens::Clock::BleConnectionStates::Connected : + // Screens::Clock::BleConnectionStates::NotConnected); break; case Messages::UpdateBatteryLevel: batteryController.Update(); break; case Messages::NewNotification: - LoadApp( Apps::NotificationsPreview, DisplayApp::FullRefreshDirections::Down ); + LoadApp(Apps::NotificationsPreview, DisplayApp::FullRefreshDirections::Down); break; case Messages::TouchEvent: { - if (state != States::Running) break; + if (state != States::Running) + break; auto gesture = OnTouchEvent(); - if(!currentScreen->OnTouchEvent(gesture)) { - if ( currentApp == Apps::Clock ) { + if (!currentScreen->OnTouchEvent(gesture)) { + if (currentApp == Apps::Clock) { switch (gesture) { case TouchEvents::SwipeUp: - LoadApp( Apps::Launcher, DisplayApp::FullRefreshDirections::Up ); + LoadApp(Apps::Launcher, DisplayApp::FullRefreshDirections::Up); break; case TouchEvents::SwipeDown: - LoadApp( Apps::Notifications, DisplayApp::FullRefreshDirections::Down ); + LoadApp(Apps::Notifications, DisplayApp::FullRefreshDirections::Down); break; case TouchEvents::SwipeRight: - LoadApp( Apps::QuickSettings, DisplayApp::FullRefreshDirections::RightAnim ); + LoadApp(Apps::QuickSettings, DisplayApp::FullRefreshDirections::RightAnim); break; case TouchEvents::DoubleTap: systemTask.PushMessage(System::SystemTask::Messages::GoToSleep); @@ -158,36 +164,35 @@ void DisplayApp::Refresh() { default: break; } - } else if ( returnTouchEvent == gesture ) { - LoadApp( returnToApp, returnDirection ); + } else if (returnTouchEvent == gesture) { + LoadApp(returnToApp, returnDirection); } } - } - break; + } break; case Messages::ButtonPushed: - if( currentApp == Apps::Clock ) { + if (currentApp == Apps::Clock) { systemTask.PushMessage(System::SystemTask::Messages::GoToSleep); } else { - if ( !currentScreen->OnButtonPushed() ) { - LoadApp( returnToApp, returnDirection ); + if (!currentScreen->OnButtonPushed()) { + LoadApp(returnToApp, returnDirection); } } break; case Messages::BleFirmwareUpdateStarted: - LoadApp( Apps::FirmwareUpdate, DisplayApp::FullRefreshDirections::Down ); + LoadApp(Apps::FirmwareUpdate, DisplayApp::FullRefreshDirections::Down); + break; + case Messages::UpdateDateTime: + // Added to remove warning + // What should happen here? break; - case Messages::UpdateDateTime: - // Added to remove warning - // What should happen here? - break; } } - if(state != States::Idle && touchMode == TouchModes::Polling) { + if (state != States::Idle && touchMode == TouchModes::Polling) { auto info = touchPanel.GetTouchInfo(); - if(info.action == 2) {// 2 = contact - if(!currentScreen->OnTouchEvent(info.x, info.y)) { + if (info.action == 2) { // 2 = contact + if (!currentScreen->OnTouchEvent(info.x, info.y)) { lvgl.SetNewTapEvent(info.x, info.y); } } @@ -195,14 +200,14 @@ void DisplayApp::Refresh() { } void DisplayApp::RunningState() { - if(!currentScreen->Refresh()) { - LoadApp( returnToApp, returnDirection ); + if (!currentScreen->Refresh()) { + LoadApp(returnToApp, returnDirection); } lv_task_handler(); } void DisplayApp::StartApp(Apps app, DisplayApp::FullRefreshDirections direction) { - LoadApp( app, direction ); + LoadApp(app, direction); } void DisplayApp::returnApp(Apps app, DisplayApp::FullRefreshDirections direction, TouchEvents touchEvent) { @@ -213,19 +218,26 @@ void DisplayApp::returnApp(Apps app, DisplayApp::FullRefreshDirections direction void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) { currentScreen.reset(nullptr); - SetFullRefresh( direction ); + SetFullRefresh(direction); // default return to launcher returnApp(Apps::Launcher, FullRefreshDirections::Down, TouchEvents::SwipeDown); - switch(app) { + switch (app) { case Apps::Launcher: currentScreen = std::make_unique(this, settingsController, batteryController, dateTimeController); returnApp(Apps::Clock, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; case Apps::None: case Apps::Clock: - currentScreen = std::make_unique(this, dateTimeController, batteryController, bleController, notificationManager, settingsController, heartRateController, motionController); + currentScreen = std::make_unique(this, + dateTimeController, + batteryController, + bleController, + notificationManager, + settingsController, + heartRateController, + motionController); break; case Apps::FirmwareValidation: @@ -237,17 +249,20 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) break; case Apps::Notifications: - currentScreen = std::make_unique(this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Normal); + currentScreen = std::make_unique( + this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Normal); returnApp(Apps::Clock, FullRefreshDirections::Up, TouchEvents::SwipeUp); break; case Apps::NotificationsPreview: - currentScreen = std::make_unique(this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Preview); + currentScreen = std::make_unique( + this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Preview); returnApp(Apps::Clock, FullRefreshDirections::Up, TouchEvents::SwipeUp); break; // Settings case Apps::QuickSettings: - currentScreen = std::make_unique(this, batteryController, dateTimeController, brightnessController, settingsController); + currentScreen = + std::make_unique(this, batteryController, dateTimeController, brightnessController, settingsController); returnApp(Apps::Clock, FullRefreshDirections::LeftAnim, TouchEvents::SwipeLeft); break; case Apps::Settings: @@ -275,10 +290,11 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) returnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; case Apps::SysInfo: - currentScreen = std::make_unique(this, dateTimeController, batteryController, brightnessController, bleController, watchdog); + currentScreen = + std::make_unique(this, dateTimeController, batteryController, brightnessController, bleController, watchdog); returnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; - // + // case Apps::FlashLight: currentScreen = std::make_unique(this, systemTask, brightnessController); @@ -313,7 +329,6 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) } void DisplayApp::IdleState() { - } void DisplayApp::PushMessage(Messages msg) { @@ -328,10 +343,10 @@ void DisplayApp::PushMessage(Messages msg) { TouchEvents DisplayApp::OnTouchEvent() { auto info = touchPanel.GetTouchInfo(); - if(info.isTouch) { - switch(info.gesture) { + if (info.isTouch) { + switch (info.gesture) { case Pinetime::Drivers::Cst816S::Gestures::SingleTap: - if(touchMode == TouchModes::Gestures) + if (touchMode == TouchModes::Gestures) lvgl.SetNewTapEvent(info.x, info.y); return TouchEvents::Tap; case Pinetime::Drivers::Cst816S::Gestures::LongPress: @@ -355,7 +370,7 @@ TouchEvents DisplayApp::OnTouchEvent() { } void DisplayApp::SetFullRefresh(DisplayApp::FullRefreshDirections direction) { - switch(direction){ + switch (direction) { case DisplayApp::FullRefreshDirections::Down: lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Down); break; @@ -374,11 +389,11 @@ void DisplayApp::SetFullRefresh(DisplayApp::FullRefreshDirections direction) { case DisplayApp::FullRefreshDirections::RightAnim: lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::RightAnim); break; - default: break; + default: + break; } } void DisplayApp::SetTouchMode(DisplayApp::TouchModes mode) { touchMode = mode; } - diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index 85aee0fe..03afb4ca 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -35,74 +35,73 @@ namespace Pinetime { }; namespace Applications { class DisplayApp { - public: - enum class States {Idle, Running}; - enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim }; - enum class TouchModes { Gestures, Polling }; + public: + enum class States { Idle, Running }; + enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim }; + enum class TouchModes { Gestures, Polling }; - DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Drivers::Cst816S &, - Controllers::Battery &batteryController, Controllers::Ble &bleController, - Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog, - System::SystemTask &systemTask, - Pinetime::Controllers::NotificationManager& notificationManager, - Pinetime::Controllers::HeartRateController& heartRateController, - Controllers::Settings &settingsController, - Pinetime::Controllers::MotionController& motionController - ); - void Start(); - void PushMessage(Display::Messages msg); + DisplayApp(Drivers::St7789& lcd, + Components::LittleVgl& lvgl, + Drivers::Cst816S&, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::DateTime& dateTimeController, + Drivers::WatchdogView& watchdog, + System::SystemTask& systemTask, + Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::HeartRateController& heartRateController, + Controllers::Settings& settingsController, + Pinetime::Controllers::MotionController& motionController); + void Start(); + void PushMessage(Display::Messages msg); - void StartApp(Apps app, DisplayApp::FullRefreshDirections direction); + void StartApp(Apps app, DisplayApp::FullRefreshDirections direction); - void SetFullRefresh(FullRefreshDirections direction); - void SetTouchMode(TouchModes mode); + void SetFullRefresh(FullRefreshDirections direction); + void SetTouchMode(TouchModes mode); - private: + private: + Pinetime::Drivers::St7789& lcd; + Pinetime::Components::LittleVgl& lvgl; + Pinetime::Drivers::Cst816S& touchPanel; + Pinetime::Controllers::Battery& batteryController; + Pinetime::Controllers::Ble& bleController; + Pinetime::Controllers::DateTime& dateTimeController; + Pinetime::Drivers::WatchdogView& watchdog; + Pinetime::System::SystemTask& systemTask; + Pinetime::Controllers::NotificationManager& notificationManager; + Pinetime::Controllers::HeartRateController& heartRateController; + Pinetime::Controllers::Settings& settingsController; + Pinetime::Controllers::MotionController& motionController; - Pinetime::Drivers::St7789& lcd; - Pinetime::Components::LittleVgl& lvgl; - Pinetime::Drivers::Cst816S& touchPanel; - Pinetime::Controllers::Battery &batteryController; - Pinetime::Controllers::Ble &bleController; - Pinetime::Controllers::DateTime& dateTimeController; - Pinetime::Drivers::WatchdogView& watchdog; - Pinetime::System::SystemTask& systemTask; - Pinetime::Controllers::NotificationManager& notificationManager; - Pinetime::Controllers::HeartRateController& heartRateController; - Pinetime::Controllers::Settings& settingsController; - Pinetime::Controllers::MotionController& motionController; + Pinetime::Controllers::FirmwareValidator validator; + Controllers::BrightnessController brightnessController; - Pinetime::Controllers::FirmwareValidator validator; - Controllers::BrightnessController brightnessController; + TaskHandle_t taskHandle; - TaskHandle_t taskHandle; + States state = States::Running; + QueueHandle_t msgQueue; - States state = States::Running; - QueueHandle_t msgQueue; + static constexpr uint8_t queueSize = 10; + static constexpr uint8_t itemSize = 1; - static constexpr uint8_t queueSize = 10; - static constexpr uint8_t itemSize = 1; + std::unique_ptr currentScreen; - std::unique_ptr currentScreen; + Apps currentApp = Apps::None; + Apps returnToApp = Apps::None; + FullRefreshDirections returnDirection = FullRefreshDirections::None; + TouchEvents returnTouchEvent = TouchEvents::None; - Apps currentApp = Apps::None; - Apps returnToApp = Apps::None; - FullRefreshDirections returnDirection = FullRefreshDirections::None; - TouchEvents returnTouchEvent = TouchEvents::None; - - TouchModes touchMode = TouchModes::Gestures; - - TouchEvents OnTouchEvent(); - void RunningState(); - void IdleState(); - static void Process(void* instance); - void InitHw(); - void Refresh(); - void returnApp(Apps app, DisplayApp::FullRefreshDirections direction, TouchEvents touchEvent); - void LoadApp(Apps app, DisplayApp::FullRefreshDirections direction); + TouchModes touchMode = TouchModes::Gestures; + TouchEvents OnTouchEvent(); + void RunningState(); + void IdleState(); + static void Process(void* instance); + void InitHw(); + void Refresh(); + void returnApp(Apps app, DisplayApp::FullRefreshDirections direction, TouchEvents touchEvent); + void LoadApp(Apps app, DisplayApp::FullRefreshDirections direction); }; } } - - diff --git a/src/displayapp/DisplayAppRecovery.cpp b/src/displayapp/DisplayAppRecovery.cpp index d5723835..5c7dd03d 100644 --- a/src/displayapp/DisplayAppRecovery.cpp +++ b/src/displayapp/DisplayAppRecovery.cpp @@ -7,17 +7,20 @@ using namespace Pinetime::Applications; -DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Drivers::Cst816S &touchPanel, - Controllers::Battery &batteryController, Controllers::Ble &bleController, - Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog, - System::SystemTask &systemTask, +DisplayApp::DisplayApp(Drivers::St7789& lcd, + Components::LittleVgl& lvgl, + Drivers::Cst816S& touchPanel, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::DateTime& dateTimeController, + Drivers::WatchdogView& watchdog, + System::SystemTask& systemTask, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, Pinetime::Controllers::Settings& settingsController, - Pinetime::Controllers::MotionController& motionController): - lcd{lcd}, bleController{bleController} { + Pinetime::Controllers::MotionController& motionController) + : lcd {lcd}, bleController {bleController} { msgQueue = xQueueCreate(queueSize, itemSize); - } void DisplayApp::Start() { @@ -25,8 +28,8 @@ void DisplayApp::Start() { APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); } -void DisplayApp::Process(void *instance) { - auto *app = static_cast(instance); +void DisplayApp::Process(void* instance) { + auto* app = static_cast(instance); NRF_LOG_INFO("displayapp task started!"); // Send a dummy notification to unlock the lvgl display driver for the first iteration @@ -61,8 +64,9 @@ void DisplayApp::Refresh() { } if (bleController.IsFirmwareUpdating()) { - uint8_t percent = (static_cast(bleController.FirmwareUpdateCurrentBytes()) / - static_cast(bleController.FirmwareUpdateTotalBytes())) * 100.0f; + uint8_t percent = + (static_cast(bleController.FirmwareUpdateCurrentBytes()) / static_cast(bleController.FirmwareUpdateTotalBytes())) * + 100.0f; switch (bleController.State()) { case Controllers::Ble::FirmwareUpdateStates::Running: DisplayOtaProgress(percent, colorWhite); @@ -81,20 +85,20 @@ void DisplayApp::Refresh() { void DisplayApp::DisplayLogo(uint16_t color) { Pinetime::Tools::RleDecoder rleDecoder(infinitime_nb, sizeof(infinitime_nb), color, colorBlack); - for(int i = 0; i < displayWidth; i++) { + for (int i = 0; i < displayWidth; i++) { rleDecoder.DecodeNext(displayBuffer, displayWidth * bytesPerPixel); ulTaskNotifyTake(pdTRUE, 500); - lcd.DrawBuffer(0, i, displayWidth, 1, reinterpret_cast(displayBuffer), displayWidth * bytesPerPixel); + lcd.DrawBuffer(0, i, displayWidth, 1, reinterpret_cast(displayBuffer), displayWidth * bytesPerPixel); } } void DisplayApp::DisplayOtaProgress(uint8_t percent, uint16_t color) { const uint8_t barHeight = 20; - std::fill(displayBuffer, displayBuffer+(displayWidth * bytesPerPixel), color); - for(int i = 0; i < barHeight; i++) { + std::fill(displayBuffer, displayBuffer + (displayWidth * bytesPerPixel), color); + for (int i = 0; i < barHeight; i++) { ulTaskNotifyTake(pdTRUE, 500); uint16_t barWidth = std::min(static_cast(percent) * 2.4f, static_cast(displayWidth)); - lcd.DrawBuffer(0, displayWidth - barHeight + i, barWidth, 1, reinterpret_cast(displayBuffer), barWidth * bytesPerPixel); + lcd.DrawBuffer(0, displayWidth - barHeight + i, barWidth, 1, reinterpret_cast(displayBuffer), barWidth * bytesPerPixel); } } diff --git a/src/displayapp/DisplayAppRecovery.h b/src/displayapp/DisplayAppRecovery.h index c35fa729..b51d6b67 100644 --- a/src/displayapp/DisplayAppRecovery.h +++ b/src/displayapp/DisplayAppRecovery.h @@ -29,11 +29,15 @@ namespace Pinetime { }; namespace Applications { class DisplayApp { - public: - DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Drivers::Cst816S &, - Controllers::Battery &batteryController, Controllers::Ble &bleController, - Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog, - System::SystemTask &systemTask, + public: + DisplayApp(Drivers::St7789& lcd, + Components::LittleVgl& lvgl, + Drivers::Cst816S&, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::DateTime& dateTimeController, + Drivers::WatchdogView& watchdog, + System::SystemTask& systemTask, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::HeartRateController& heartRateController, Pinetime::Controllers::Settings& settingsController, @@ -41,7 +45,7 @@ namespace Pinetime { void Start(); void PushMessage(Pinetime::Applications::Display::Messages msg); - private: + private: TaskHandle_t taskHandle; static void Process(void* instance); void DisplayLogo(uint16_t color); @@ -49,7 +53,7 @@ namespace Pinetime { void InitHw(); void Refresh(); Pinetime::Drivers::St7789& lcd; - Controllers::Ble &bleController; + Controllers::Ble& bleController; static constexpr uint8_t queueSize = 10; static constexpr uint8_t itemSize = 1; @@ -66,10 +70,6 @@ namespace Pinetime { static constexpr uint16_t colorRedSwapped = 0x00ff; static constexpr uint16_t colorBlack = 0x0000; uint8_t displayBuffer[displayWidth * bytesPerPixel]; - - }; } } - - diff --git a/src/displayapp/DummyLittleVgl.h b/src/displayapp/DummyLittleVgl.h index 1c60911c..dda1f3b8 100644 --- a/src/displayapp/DummyLittleVgl.h +++ b/src/displayapp/DummyLittleVgl.h @@ -9,22 +9,25 @@ namespace Pinetime { namespace Components { class LittleVgl { - public: - enum class FullRefreshDirections { None, Up, Down }; - LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel) {} - - LittleVgl(const LittleVgl&) = delete; - LittleVgl& operator=(const LittleVgl&) = delete; - LittleVgl(LittleVgl&&) = delete; - LittleVgl& operator=(LittleVgl&&) = delete; - - void FlushDisplay(const lv_area_t * area, lv_color_t * color_p) {} - bool GetTouchPadInfo(lv_indev_data_t *ptr) {return false;} - void SetFullRefresh(FullRefreshDirections direction) {} - void SetNewTapEvent(uint16_t x, uint16_t y) {} + public: + enum class FullRefreshDirections { None, Up, Down }; + LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel) { + } + LittleVgl(const LittleVgl&) = delete; + LittleVgl& operator=(const LittleVgl&) = delete; + LittleVgl(LittleVgl&&) = delete; + LittleVgl& operator=(LittleVgl&&) = delete; + void FlushDisplay(const lv_area_t* area, lv_color_t* color_p) { + } + bool GetTouchPadInfo(lv_indev_data_t* ptr) { + return false; + } + void SetFullRefresh(FullRefreshDirections direction) { + } + void SetNewTapEvent(uint16_t x, uint16_t y) { + } }; } } - diff --git a/src/displayapp/LittleVgl.cpp b/src/displayapp/LittleVgl.cpp index 500fd752..36df51b4 100644 --- a/src/displayapp/LittleVgl.cpp +++ b/src/displayapp/LittleVgl.cpp @@ -11,17 +11,18 @@ using namespace Pinetime::Components; lv_style_t* LabelBigStyle = nullptr; -static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { +static void disp_flush(lv_disp_drv_t* disp_drv, const lv_area_t* area, lv_color_t* color_p) { auto* lvgl = static_cast(disp_drv->user_data); lvgl->FlushDisplay(area, color_p); } -bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) { +bool touchpad_read(lv_indev_drv_t* indev_drv, lv_indev_data_t* data) { auto* lvgl = static_cast(indev_drv->user_data); return lvgl->GetTouchPadInfo(data); } -LittleVgl::LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel) : lcd{lcd}, touchPanel{touchPanel}, previousClick{0,0} { +LittleVgl::LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel) + : lcd {lcd}, touchPanel {touchPanel}, previousClick {0, 0} { lv_init(); InitTheme(); InitDisplay(); @@ -29,8 +30,8 @@ LittleVgl::LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& } void LittleVgl::InitDisplay() { - lv_disp_buf_init(&disp_buf_2, buf2_1, buf2_2, LV_HOR_RES_MAX * 4); /*Initialize the display buffer*/ - lv_disp_drv_init(&disp_drv); /*Basic initialization*/ + lv_disp_buf_init(&disp_buf_2, buf2_1, buf2_2, LV_HOR_RES_MAX * 4); /*Initialize the display buffer*/ + lv_disp_drv_init(&disp_drv); /*Basic initialization*/ /*Set up the functions to access to your display*/ @@ -59,7 +60,7 @@ void LittleVgl::InitTouchpad() { } void LittleVgl::SetFullRefresh(FullRefreshDirections direction) { - if(scrollDirection == FullRefreshDirections::None) { + if (scrollDirection == FullRefreshDirections::None) { scrollDirection = direction; if (scrollDirection == FullRefreshDirections::Down) { lv_disp_set_direction(lv_disp_get_default(), 1); @@ -75,16 +76,16 @@ void LittleVgl::SetFullRefresh(FullRefreshDirections direction) { } } -void LittleVgl::FlushDisplay(const lv_area_t *area, lv_color_t *color_p) { +void LittleVgl::FlushDisplay(const lv_area_t* area, lv_color_t* color_p) { uint16_t y1, y2, width, height = 0; ulTaskNotifyTake(pdTRUE, 200); // NOtification is still needed (even if there is a mutex on SPI) because of the DataCommand pin // which cannot be set/clear during a transfert. - - if( (scrollDirection == LittleVgl::FullRefreshDirections::Down) && (area->y2 == visibleNbLines - 1)) { + + if ((scrollDirection == LittleVgl::FullRefreshDirections::Down) && (area->y2 == visibleNbLines - 1)) { writeOffset = ((writeOffset + totalNbLines) - visibleNbLines) % totalNbLines; - } else if( (scrollDirection == FullRefreshDirections::Up) && (area->y1 == 0) ) { + } else if ((scrollDirection == FullRefreshDirections::Up) && (area->y1 == 0)) { writeOffset = (writeOffset + visibleNbLines) % totalNbLines; } @@ -94,11 +95,11 @@ void LittleVgl::FlushDisplay(const lv_area_t *area, lv_color_t *color_p) { width = (area->x2 - area->x1) + 1; height = (area->y2 - area->y1) + 1; - if(scrollDirection == LittleVgl::FullRefreshDirections::Down) { + if (scrollDirection == LittleVgl::FullRefreshDirections::Down) { - if(area->y2 < visibleNbLines - 1) { + if (area->y2 < visibleNbLines - 1) { uint16_t toScroll = 0; - if(area->y1 == 0) { + if (area->y1 == 0) { toScroll = height * 2; scrollDirection = FullRefreshDirections::None; lv_disp_set_direction(lv_disp_get_default(), 0); @@ -106,19 +107,19 @@ void LittleVgl::FlushDisplay(const lv_area_t *area, lv_color_t *color_p) { toScroll = height; } - if(scrollOffset >= toScroll) + if (scrollOffset >= toScroll) scrollOffset -= toScroll; else { toScroll -= scrollOffset; - scrollOffset = (totalNbLines) - toScroll; + scrollOffset = (totalNbLines) -toScroll; } lcd.VerticalScrollStartAddress(scrollOffset); } - } else if(scrollDirection == FullRefreshDirections::Up) { + } else if (scrollDirection == FullRefreshDirections::Up) { - if(area->y1 > 0) { - if(area->y2 == visibleNbLines - 1) { + if (area->y1 > 0) { + if (area->y2 == visibleNbLines - 1) { scrollOffset += (height * 2); scrollDirection = FullRefreshDirections::None; lv_disp_set_direction(lv_disp_get_default(), 0); @@ -128,13 +129,13 @@ void LittleVgl::FlushDisplay(const lv_area_t *area, lv_color_t *color_p) { scrollOffset = scrollOffset % totalNbLines; lcd.VerticalScrollStartAddress(scrollOffset); } - } else if(scrollDirection == FullRefreshDirections::Left or scrollDirection == FullRefreshDirections::LeftAnim) { - if(area->x2 == visibleNbLines - 1) { + } else if (scrollDirection == FullRefreshDirections::Left or scrollDirection == FullRefreshDirections::LeftAnim) { + if (area->x2 == visibleNbLines - 1) { scrollDirection = FullRefreshDirections::None; lv_disp_set_direction(lv_disp_get_default(), 0); } - } else if(scrollDirection == FullRefreshDirections::Right or scrollDirection == FullRefreshDirections::RightAnim) { - if(area->x1 == 0) { + } else if (scrollDirection == FullRefreshDirections::Right or scrollDirection == FullRefreshDirections::RightAnim) { + if (area->x1 == 0) { scrollDirection = FullRefreshDirections::None; lv_disp_set_direction(lv_disp_get_default(), 0); } @@ -143,17 +144,17 @@ void LittleVgl::FlushDisplay(const lv_area_t *area, lv_color_t *color_p) { if (y2 < y1) { height = totalNbLines - y1; - if ( height > 0 ) { - lcd.DrawBuffer(area->x1, y1, width, height, reinterpret_cast(color_p), width * height * 2); + if (height > 0) { + lcd.DrawBuffer(area->x1, y1, width, height, reinterpret_cast(color_p), width * height * 2); ulTaskNotifyTake(pdTRUE, 100); } - + uint16_t pixOffset = width * height; height = y2 + 1; - lcd.DrawBuffer(area->x1, 0, width, height, reinterpret_cast(color_p + pixOffset), width * height * 2); + lcd.DrawBuffer(area->x1, 0, width, height, reinterpret_cast(color_p + pixOffset), width * height * 2); } else { - lcd.DrawBuffer(area->x1, y1, width, height, reinterpret_cast(color_p), width * height * 2); + lcd.DrawBuffer(area->x1, y1, width, height, reinterpret_cast(color_p), width * height * 2); } // IMPORTANT!!! @@ -167,8 +168,8 @@ void LittleVgl::SetNewTapEvent(uint16_t x, uint16_t y) { tapped = true; } -bool LittleVgl::GetTouchPadInfo(lv_indev_data_t *ptr) { - if(tapped) { +bool LittleVgl::GetTouchPadInfo(lv_indev_data_t* ptr) { + if (tapped) { ptr->point.x = tap_x; ptr->point.y = tap_y; ptr->state = LV_INDEV_STATE_PR; @@ -202,14 +203,8 @@ bool LittleVgl::GetTouchPadInfo(lv_indev_data_t *ptr) { void LittleVgl::InitTheme() { - lv_theme_t * th = lv_pinetime_theme_init( - LV_COLOR_WHITE, LV_COLOR_SILVER, - 0, - &jetbrains_mono_bold_20, - &jetbrains_mono_bold_20, - &jetbrains_mono_bold_20, - &jetbrains_mono_bold_20); + lv_theme_t* th = lv_pinetime_theme_init( + LV_COLOR_WHITE, LV_COLOR_SILVER, 0, &jetbrains_mono_bold_20, &jetbrains_mono_bold_20, &jetbrains_mono_bold_20, &jetbrains_mono_bold_20); lv_theme_set_act(th); - } diff --git a/src/displayapp/LittleVgl.h b/src/displayapp/LittleVgl.h index 28a02e0b..b10b14fa 100644 --- a/src/displayapp/LittleVgl.h +++ b/src/displayapp/LittleVgl.h @@ -10,50 +10,49 @@ namespace Pinetime { namespace Components { class LittleVgl { - public: - enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim }; - LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel); + public: + enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim }; + LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel); - LittleVgl(const LittleVgl&) = delete; - LittleVgl& operator=(const LittleVgl&) = delete; - LittleVgl(LittleVgl&&) = delete; - LittleVgl& operator=(LittleVgl&&) = delete; + LittleVgl(const LittleVgl&) = delete; + LittleVgl& operator=(const LittleVgl&) = delete; + LittleVgl(LittleVgl&&) = delete; + LittleVgl& operator=(LittleVgl&&) = delete; - void FlushDisplay(const lv_area_t * area, lv_color_t * color_p); - bool GetTouchPadInfo(lv_indev_data_t *ptr); - void SetFullRefresh(FullRefreshDirections direction); - void SetNewTapEvent(uint16_t x, uint16_t y); + void FlushDisplay(const lv_area_t* area, lv_color_t* color_p); + bool GetTouchPadInfo(lv_indev_data_t* ptr); + void SetFullRefresh(FullRefreshDirections direction); + void SetNewTapEvent(uint16_t x, uint16_t y); - private: - void InitDisplay(); - void InitTouchpad(); - void InitTheme(); + private: + void InitDisplay(); + void InitTouchpad(); + void InitTheme(); + Pinetime::Drivers::St7789& lcd; + Pinetime::Drivers::Cst816S& touchPanel; - Pinetime::Drivers::St7789& lcd; - Pinetime::Drivers::Cst816S& touchPanel; + lv_disp_buf_t disp_buf_2; + lv_color_t buf2_1[LV_HOR_RES_MAX * 4]; + lv_color_t buf2_2[LV_HOR_RES_MAX * 4]; + lv_disp_drv_t disp_drv; + lv_point_t previousClick; - lv_disp_buf_t disp_buf_2; - lv_color_t buf2_1[LV_HOR_RES_MAX * 4]; - lv_color_t buf2_2[LV_HOR_RES_MAX * 4]; + bool firstTouch = true; + static constexpr uint8_t nbWriteLines = 4; + static constexpr uint16_t totalNbLines = 320; + static constexpr uint16_t visibleNbLines = 240; + static constexpr uint8_t MaxScrollOffset() { + return LV_VER_RES_MAX - nbWriteLines; + } + FullRefreshDirections scrollDirection = FullRefreshDirections::None; + uint16_t writeOffset = 0; + uint16_t scrollOffset = 0; - lv_disp_drv_t disp_drv; - lv_point_t previousClick; - - bool firstTouch = true; - static constexpr uint8_t nbWriteLines = 4; - static constexpr uint16_t totalNbLines = 320; - static constexpr uint16_t visibleNbLines = 240; - static constexpr uint8_t MaxScrollOffset() { return LV_VER_RES_MAX - nbWriteLines; } - FullRefreshDirections scrollDirection = FullRefreshDirections::None; - uint16_t writeOffset = 0; - uint16_t scrollOffset = 0; - - uint16_t tap_x = 0; - uint16_t tap_y = 0; - bool tapped = false; + uint16_t tap_x = 0; + uint16_t tap_y = 0; + bool tapped = false; }; } } - diff --git a/src/displayapp/Messages.h b/src/displayapp/Messages.h index b0690e3a..81871c54 100644 --- a/src/displayapp/Messages.h +++ b/src/displayapp/Messages.h @@ -3,8 +3,16 @@ namespace Pinetime { namespace Applications { namespace Display { enum class Messages : uint8_t { - GoToSleep, GoToRunning, UpdateDateTime, UpdateBleConnection, UpdateBatteryLevel, TouchEvent, ButtonPushed, - NewNotification, BleFirmwareUpdateStarted, UpdateTimeOut + GoToSleep, + GoToRunning, + UpdateDateTime, + UpdateBleConnection, + UpdateBatteryLevel, + TouchEvent, + ButtonPushed, + NewNotification, + BleFirmwareUpdateStarted, + UpdateTimeOut }; } } diff --git a/src/displayapp/TouchEvents.h b/src/displayapp/TouchEvents.h index cf2f88dd..6a37713a 100644 --- a/src/displayapp/TouchEvents.h +++ b/src/displayapp/TouchEvents.h @@ -3,6 +3,6 @@ namespace Pinetime { namespace Applications { - enum class TouchEvents { None, Tap, SwipeLeft, SwipeRight, SwipeUp, SwipeDown, LongTap, DoubleTap}; + enum class TouchEvents { None, Tap, SwipeLeft, SwipeRight, SwipeUp, SwipeDown, LongTap, DoubleTap }; } } \ No newline at end of file diff --git a/src/displayapp/fonts/README.md b/src/displayapp/fonts/README.md new file mode 100644 index 00000000..494654cd --- /dev/null +++ b/src/displayapp/fonts/README.md @@ -0,0 +1,44 @@ +# Fonts + +* [Jetbrains Mono](https://www.jetbrains.com/fr-fr/lp/mono/) +* [Awesome font from LVGL](https://lvgl.io/assets/others/FontAwesome5-Solid+Brands+Regular.woff) + +## Generate the fonts: + +* Open the [LVGL font converter](https://lvgl.io/tools/fontconverter) +* Name : jetbrains_mono_bold_20 +* Size : 20 +* Bpp : 1 bit-per-pixel +* Do not enable font compression and horizontal subpixel hinting +* Load the file `JetBrainsMono-Bold.tff` and specify the following range : `0x20-0x7f, 0x410-0x44f` +* Add a 2nd font, load the file `FontAwesome5-Solid+Brands+Regular.woff` and specify the following + range : `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf029, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024` +* Click on Convert, and download the file `jetbrains_mono_bold_20.c` and copy it in `src/DisplayApp/Fonts` + +Add new symbols: + +* Browse the [cheatsheet](https://fontawesome.com/cheatsheet/free/solid) and find your new symbols +* For each symbol, add its hex code (0xf641 for the 'Ad' icon, for example) to the *Range* list (Remember to keep this + readme updated with newest range list) +* Convert this hex value into a UTF-8 code + using [this site](http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=f185&mode=hex) +* Define the new symbols in `src/DisplayApp/Screens/Symbols.h`: + +``` +static constex char* newSymbol = "\xEF\x86\x85"; +``` + +#### Navigation font + +To create the navigtion.ttf I use the web app [icomoon](https://icomoon.io/app) +this app can import the svg files from the folder *src/displayapp/icons/navigation/unique* and creat a ttf file the +project for the site is *lv_font_navi_80.json* you can import it to add or remove icons + +You can also use the online LVGL tool to create the .c + +ttf file : navigation.ttf name : lv_font_navi_80 size : 80px Bpp : 2 bit-per-pixel range : 0xe900-0xe929 + +$lv_font_conv --font navigation.ttf -r '0xe900-0xe929' --size 80 --format lvgl --bpp 2 --no-prefilter -o +lv_font_navi_80.c + +#### I use the method above to create the other ttf \ No newline at end of file diff --git a/src/displayapp/fonts/Readme.md b/src/displayapp/fonts/Readme.md deleted file mode 100644 index 3bfe4239..00000000 --- a/src/displayapp/fonts/Readme.md +++ /dev/null @@ -1,41 +0,0 @@ -#Fonts -* [Jetbrains Mono](https://www.jetbrains.com/fr-fr/lp/mono/) -* [Awesome font from LVGL](https://lvgl.io/assets/others/FontAwesome5-Solid+Brands+Regular.woff) - -## Generate the fonts: - - * Open the [LVGL font converter](https://lvgl.io/tools/fontconverter) - * Name : jetbrains_mono_bold_20 - * Size : 20 - * Bpp : 1 bit-per-pixel - * Do not enable font compression and horizontal subpixel hinting - * Load the file `JetBrainsMono-Bold.tff` and specify the following range : `0x20-0x7f, 0x410-0x44f` - * Add a 2nd font, load the file `FontAwesome5-Solid+Brands+Regular.woff` and specify the following range : `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf029, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024` - * Click on Convert, and download the file `jetbrains_mono_bold_20.c` and copy it in `src/DisplayApp/Fonts` - -Add new symbols: - * Browse the [cheatsheet](https://fontawesome.com/cheatsheet/free/solid) and find your new symbols - * For each symbol, add its hex code (0xf641 for the 'Ad' icon, for example) to the *Range* list (Remember to keep this readme updated with newest range list) - * Convert this hex value into a UTF-8 code using [this site](http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=f185&mode=hex) - * Define the new symbols in `src/DisplayApp/Screens/Symbols.h`: -``` -static constex char* newSymbol = "\xEF\x86\x85"; -``` - -#### Navigation font - -To create the navigtion.ttf I use the web app [icomoon](https://icomoon.io/app) -this app can import the svg files from the folder *src/displayapp/icons/navigation/unique* and creat a ttf file -the project for the site is *lv_font_navi_80.json* you can import it to add or remove icons - -You can also use the online LVGL tool to create the .c - -ttf file : navigation.ttf -name : lv_font_navi_80 -size : 80px -Bpp : 2 bit-per-pixel -range : 0xe900-0xe929 - -$lv_font_conv --font navigation.ttf -r '0xe900-0xe929' --size 80 --format lvgl --bpp 2 --no-prefilter -o lv_font_navi_80.c - -#### I use the method above to create the other ttf \ No newline at end of file diff --git a/src/displayapp/lv_pinetime_theme.c b/src/displayapp/lv_pinetime_theme.c index c153e42d..b003a411 100644 --- a/src/displayapp/lv_pinetime_theme.c +++ b/src/displayapp/lv_pinetime_theme.c @@ -19,7 +19,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static void theme_apply(lv_obj_t * obj, lv_theme_style_t name); +static void theme_apply(lv_obj_t* obj, lv_theme_style_t name); /********************** * STATIC VARIABLES @@ -67,244 +67,240 @@ static bool inited; * STATIC FUNCTIONS **********************/ -static void style_init_reset(lv_style_t * style) -{ - if(inited) lv_style_reset(style); - else lv_style_init(style); +static void style_init_reset(lv_style_t* style) { + if (inited) + lv_style_reset(style); + else + lv_style_init(style); } +static void basic_init(void) { -static void basic_init(void) -{ + style_init_reset(&style_pad); + lv_style_set_pad_top(&style_pad, LV_STATE_DEFAULT, LV_VER_RES / 30); + lv_style_set_pad_bottom(&style_pad, LV_STATE_DEFAULT, LV_VER_RES / 30); + lv_style_set_pad_left(&style_pad, LV_STATE_DEFAULT, LV_VER_RES / 40); + lv_style_set_pad_right(&style_pad, LV_STATE_DEFAULT, LV_VER_RES / 40); - style_init_reset(&style_pad); - lv_style_set_pad_top(&style_pad, LV_STATE_DEFAULT, LV_VER_RES / 30); - lv_style_set_pad_bottom(&style_pad, LV_STATE_DEFAULT, LV_VER_RES / 30); - lv_style_set_pad_left(&style_pad, LV_STATE_DEFAULT, LV_VER_RES / 40); - lv_style_set_pad_right(&style_pad, LV_STATE_DEFAULT, LV_VER_RES / 40); + style_init_reset(&style_circle); + lv_style_set_radius(&style_circle, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); - style_init_reset(&style_circle); - lv_style_set_radius(&style_circle, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + style_init_reset(&style_bg); + lv_style_set_bg_opa(&style_bg, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&style_bg, LV_STATE_DEFAULT, LV_COLOR_BLACK); + lv_style_set_text_font(&style_bg, LV_STATE_DEFAULT, theme.font_normal); - style_init_reset(&style_bg); - lv_style_set_bg_opa(&style_bg, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_bg_color(&style_bg, LV_STATE_DEFAULT, LV_COLOR_BLACK); - lv_style_set_text_font(&style_bg, LV_STATE_DEFAULT, theme.font_normal); + style_init_reset(&style_box); + lv_style_set_bg_opa(&style_box, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_radius(&style_box, LV_STATE_DEFAULT, 10); + lv_style_set_value_color(&style_box, LV_STATE_DEFAULT, LV_PINETIME_BLUE); + lv_style_set_value_font(&style_box, LV_STATE_DEFAULT, theme.font_normal); - style_init_reset(&style_box); - lv_style_set_bg_opa(&style_box, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_radius(&style_box, LV_STATE_DEFAULT, 10); - lv_style_set_value_color(&style_box, LV_STATE_DEFAULT, LV_PINETIME_BLUE); - lv_style_set_value_font(&style_box, LV_STATE_DEFAULT, theme.font_normal); + style_init_reset(&style_box_border); + lv_style_set_bg_opa(&style_box_border, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_style_set_border_width(&style_box_border, LV_STATE_DEFAULT, 2); + lv_style_set_border_color(&style_box_border, LV_STATE_DEFAULT, LV_PINETIME_GRAY); + lv_style_set_text_color(&style_box, LV_STATE_DEFAULT, LV_PINETIME_BLUE); - style_init_reset(&style_box_border); - lv_style_set_bg_opa(&style_box_border, LV_STATE_DEFAULT, LV_OPA_TRANSP); - lv_style_set_border_width(&style_box_border, LV_STATE_DEFAULT, 2); - lv_style_set_border_color(&style_box_border, LV_STATE_DEFAULT, LV_PINETIME_GRAY); - lv_style_set_text_color(&style_box, LV_STATE_DEFAULT, LV_PINETIME_BLUE); + style_init_reset(&style_title); + lv_style_set_text_color(&style_title, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + lv_style_set_text_font(&style_title, LV_STATE_DEFAULT, theme.font_subtitle); + style_init_reset(&style_label_white); + lv_style_set_text_color(&style_label_white, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - style_init_reset(&style_title); - lv_style_set_text_color(&style_title, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - lv_style_set_text_font(&style_title, LV_STATE_DEFAULT, theme.font_subtitle); + style_init_reset(&style_btn); + lv_style_set_radius(&style_btn, LV_STATE_DEFAULT, 10); + lv_style_set_bg_opa(&style_btn, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&style_btn, LV_STATE_DEFAULT, lv_color_hex(0x2F3540)); + lv_style_set_bg_color(&style_btn, LV_STATE_CHECKED, LV_COLOR_GREEN); + lv_style_set_bg_color(&style_btn, LV_STATE_DISABLED, lv_color_hex(0x2F3540)); + lv_style_set_bg_color(&style_btn, LV_STATE_DISABLED | LV_STATE_CHECKED, lv_color_hex3(0x888)); + lv_style_set_border_color(&style_btn, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_border_width(&style_btn, LV_STATE_DEFAULT, 0); + lv_style_set_border_opa(&style_btn, LV_STATE_CHECKED, LV_OPA_TRANSP); - style_init_reset(&style_label_white); - lv_style_set_text_color(&style_label_white, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + lv_style_set_text_color(&style_btn, LV_STATE_DEFAULT, lv_color_hex(0xffffff)); + lv_style_set_text_color(&style_btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); + lv_style_set_text_color(&style_btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); + lv_style_set_text_color(&style_btn, LV_STATE_DISABLED, lv_color_hex(0x888888)); - style_init_reset(&style_btn); - lv_style_set_radius(&style_btn, LV_STATE_DEFAULT, 10); - lv_style_set_bg_opa(&style_btn, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_bg_color(&style_btn, LV_STATE_DEFAULT, lv_color_hex(0x2F3540)); - lv_style_set_bg_color(&style_btn, LV_STATE_CHECKED, LV_COLOR_GREEN); - lv_style_set_bg_color(&style_btn, LV_STATE_DISABLED, lv_color_hex(0x2F3540)); - lv_style_set_bg_color(&style_btn, LV_STATE_DISABLED | LV_STATE_CHECKED, lv_color_hex3(0x888)); - lv_style_set_border_color(&style_btn, LV_STATE_DEFAULT, theme.color_primary); - lv_style_set_border_width(&style_btn, LV_STATE_DEFAULT, 0); - lv_style_set_border_opa(&style_btn, LV_STATE_CHECKED, LV_OPA_TRANSP); + lv_style_set_value_color(&style_btn, LV_STATE_DEFAULT, lv_color_hex(0xffffff)); + lv_style_set_value_color(&style_btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); + lv_style_set_value_color(&style_btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); + lv_style_set_value_color(&style_btn, LV_STATE_DISABLED, lv_color_hex(0x888888)); - lv_style_set_text_color(&style_btn, LV_STATE_DEFAULT, lv_color_hex(0xffffff)); - lv_style_set_text_color(&style_btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); - lv_style_set_text_color(&style_btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); - lv_style_set_text_color(&style_btn, LV_STATE_DISABLED, lv_color_hex(0x888888)); + lv_style_set_pad_left(&style_btn, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_right(&style_btn, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_top(&style_btn, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_bottom(&style_btn, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_inner(&style_btn, LV_STATE_DEFAULT, LV_DPX(15)); + lv_style_set_outline_width(&style_btn, LV_STATE_DEFAULT, LV_DPX(2)); + lv_style_set_outline_opa(&style_btn, LV_STATE_DEFAULT, LV_OPA_0); + lv_style_set_outline_color(&style_btn, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_transition_time(&style_btn, LV_STATE_DEFAULT, 0); + lv_style_set_transition_delay(&style_btn, LV_STATE_DEFAULT, 0); - lv_style_set_value_color(&style_btn, LV_STATE_DEFAULT, lv_color_hex(0xffffff)); - lv_style_set_value_color(&style_btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); - lv_style_set_value_color(&style_btn, LV_STATE_CHECKED, lv_color_hex(0xffffff)); - lv_style_set_value_color(&style_btn, LV_STATE_DISABLED, lv_color_hex(0x888888)); + style_init_reset(&style_btn_border); + lv_style_set_radius(&style_btn_border, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_border_color(&style_btn_border, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + lv_style_set_border_width(&style_btn_border, LV_STATE_DEFAULT, 2); + lv_style_set_bg_opa(&style_btn_border, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_style_set_bg_color(&style_btn_border, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + lv_style_set_text_color(&style_btn_border, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + lv_style_set_value_color(&style_btn_border, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + lv_style_set_transition_prop_3(&style_btn_border, LV_STATE_DEFAULT, LV_STYLE_BG_OPA); - lv_style_set_pad_left(&style_btn, LV_STATE_DEFAULT, LV_DPX(20)); - lv_style_set_pad_right(&style_btn, LV_STATE_DEFAULT, LV_DPX(20)); - lv_style_set_pad_top(&style_btn, LV_STATE_DEFAULT, LV_DPX(20)); - lv_style_set_pad_bottom(&style_btn, LV_STATE_DEFAULT, LV_DPX(20)); - lv_style_set_pad_inner(&style_btn, LV_STATE_DEFAULT, LV_DPX(15)); - lv_style_set_outline_width(&style_btn, LV_STATE_DEFAULT, LV_DPX(2)); - lv_style_set_outline_opa(&style_btn, LV_STATE_DEFAULT, LV_OPA_0); - lv_style_set_outline_color(&style_btn, LV_STATE_DEFAULT, theme.color_primary); - lv_style_set_transition_time(&style_btn, LV_STATE_DEFAULT, 0); - lv_style_set_transition_delay(&style_btn, LV_STATE_DEFAULT, 0); + style_init_reset(&style_icon); + lv_style_set_text_color(&style_icon, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - style_init_reset(&style_btn_border); - lv_style_set_radius(&style_btn_border, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); - lv_style_set_border_color(&style_btn_border, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - lv_style_set_border_width(&style_btn_border, LV_STATE_DEFAULT, 2); - lv_style_set_bg_opa(&style_btn_border, LV_STATE_DEFAULT, LV_OPA_TRANSP); - lv_style_set_bg_color(&style_btn_border, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - lv_style_set_text_color(&style_btn_border, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - lv_style_set_value_color(&style_btn_border, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - lv_style_set_transition_prop_3(&style_btn_border, LV_STATE_DEFAULT, LV_STYLE_BG_OPA); + style_init_reset(&style_back); + lv_style_set_value_color(&style_back, LV_STATE_DEFAULT, LV_PINETIME_GRAY); + lv_style_set_value_str(&style_back, LV_STATE_DEFAULT, LV_SYMBOL_LEFT); + lv_style_set_value_font(&style_back, LV_STATE_DEFAULT, theme.font_subtitle); - style_init_reset(&style_icon); - lv_style_set_text_color(&style_icon, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + style_init_reset(&style_bar_indic); + lv_style_set_bg_opa(&style_bar_indic, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_radius(&style_bar_indic, LV_STATE_DEFAULT, 10); - style_init_reset(&style_back); - lv_style_set_value_color(&style_back, LV_STATE_DEFAULT, LV_PINETIME_GRAY); - lv_style_set_value_str(&style_back, LV_STATE_DEFAULT, LV_SYMBOL_LEFT); - lv_style_set_value_font(&style_back, LV_STATE_DEFAULT, theme.font_subtitle); + style_init_reset(&style_scrollbar); + lv_style_set_bg_opa(&style_scrollbar, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_radius(&style_scrollbar, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_bg_color(&style_scrollbar, LV_STATE_DEFAULT, LV_PINETIME_LIGHT_GRAY); + lv_style_set_size(&style_scrollbar, LV_STATE_DEFAULT, LV_HOR_RES / 80); + lv_style_set_pad_right(&style_scrollbar, LV_STATE_DEFAULT, LV_HOR_RES / 60); - style_init_reset(&style_bar_indic); - lv_style_set_bg_opa(&style_bar_indic, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_radius(&style_bar_indic, LV_STATE_DEFAULT, 10); + style_init_reset(&style_list_btn); + lv_style_set_bg_opa(&style_list_btn, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&style_list_btn, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + lv_style_set_bg_color(&style_list_btn, LV_STATE_CHECKED, LV_PINETIME_GRAY); + lv_style_set_bg_color(&style_list_btn, LV_STATE_CHECKED | LV_STATE_PRESSED, lv_color_darken(LV_PINETIME_GRAY, LV_OPA_20)); + lv_style_set_text_color(&style_list_btn, LV_STATE_DEFAULT, LV_PINETIME_BLUE); + lv_style_set_text_color(&style_list_btn, LV_STATE_CHECKED, LV_PINETIME_WHITE); + lv_style_set_text_color(&style_list_btn, LV_STATE_CHECKED | LV_STATE_PRESSED, LV_PINETIME_WHITE); + lv_style_set_image_recolor(&style_list_btn, LV_STATE_DEFAULT, LV_PINETIME_BLUE); + lv_style_set_image_recolor(&style_list_btn, LV_STATE_CHECKED, LV_PINETIME_WHITE); + lv_style_set_image_recolor(&style_list_btn, LV_STATE_CHECKED | LV_STATE_PRESSED, LV_PINETIME_WHITE); + lv_style_set_pad_left(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 25); + lv_style_set_pad_right(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 25); + lv_style_set_pad_top(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 100); + lv_style_set_pad_bottom(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 100); + lv_style_set_pad_inner(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 50); - style_init_reset(&style_scrollbar); - lv_style_set_bg_opa(&style_scrollbar, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_radius(&style_scrollbar, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); - lv_style_set_bg_color(&style_scrollbar, LV_STATE_DEFAULT, LV_PINETIME_LIGHT_GRAY); - lv_style_set_size(&style_scrollbar, LV_STATE_DEFAULT, LV_HOR_RES / 80); - lv_style_set_pad_right(&style_scrollbar, LV_STATE_DEFAULT, LV_HOR_RES / 60); + style_init_reset(&style_ddlist_list); + lv_style_set_text_line_space(&style_ddlist_list, LV_STATE_DEFAULT, LV_VER_RES / 25); + lv_style_set_shadow_width(&style_ddlist_list, LV_STATE_DEFAULT, LV_VER_RES / 20); + lv_style_set_shadow_color(&style_ddlist_list, LV_STATE_DEFAULT, LV_PINETIME_GRAY); - style_init_reset(&style_list_btn); - lv_style_set_bg_opa(&style_list_btn, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_bg_color(&style_list_btn, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - lv_style_set_bg_color(&style_list_btn, LV_STATE_CHECKED, LV_PINETIME_GRAY); - lv_style_set_bg_color(&style_list_btn, LV_STATE_CHECKED | LV_STATE_PRESSED, lv_color_darken(LV_PINETIME_GRAY, LV_OPA_20)); - lv_style_set_text_color(&style_list_btn, LV_STATE_DEFAULT, LV_PINETIME_BLUE); - lv_style_set_text_color(&style_list_btn, LV_STATE_CHECKED, LV_PINETIME_WHITE); - lv_style_set_text_color(&style_list_btn, LV_STATE_CHECKED | LV_STATE_PRESSED, LV_PINETIME_WHITE); - lv_style_set_image_recolor(&style_list_btn, LV_STATE_DEFAULT, LV_PINETIME_BLUE); - lv_style_set_image_recolor(&style_list_btn, LV_STATE_CHECKED, LV_PINETIME_WHITE); - lv_style_set_image_recolor(&style_list_btn, LV_STATE_CHECKED | LV_STATE_PRESSED, LV_PINETIME_WHITE); - lv_style_set_pad_left(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 25); - lv_style_set_pad_right(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 25); - lv_style_set_pad_top(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 100); - lv_style_set_pad_bottom(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 100); - lv_style_set_pad_inner(&style_list_btn, LV_STATE_DEFAULT, LV_HOR_RES / 50); + style_init_reset(&style_ddlist_selected); + lv_style_set_bg_opa(&style_ddlist_selected, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&style_ddlist_selected, LV_STATE_DEFAULT, LV_PINETIME_BLUE); - style_init_reset(&style_ddlist_list); - lv_style_set_text_line_space(&style_ddlist_list, LV_STATE_DEFAULT, LV_VER_RES / 25); - lv_style_set_shadow_width(&style_ddlist_list, LV_STATE_DEFAULT, LV_VER_RES / 20); - lv_style_set_shadow_color(&style_ddlist_list, LV_STATE_DEFAULT, LV_PINETIME_GRAY); + style_init_reset(&style_sw_bg); + lv_style_set_bg_opa(&style_sw_bg, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&style_sw_bg, LV_STATE_DEFAULT, LV_PINETIME_LIGHT_GRAY); + lv_style_set_radius(&style_sw_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_value_color(&style_sw_bg, LV_STATE_DEFAULT, LV_PINETIME_BLUE); - style_init_reset(&style_ddlist_selected); - lv_style_set_bg_opa(&style_ddlist_selected, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_bg_color(&style_ddlist_selected, LV_STATE_DEFAULT, LV_PINETIME_BLUE); + style_init_reset(&style_sw_indic); + lv_style_set_bg_opa(&style_sw_indic, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&style_sw_indic, LV_STATE_DEFAULT, LV_PINETIME_GREEN); - style_init_reset(&style_sw_bg); - lv_style_set_bg_opa(&style_sw_bg, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_bg_color(&style_sw_bg, LV_STATE_DEFAULT, LV_PINETIME_LIGHT_GRAY); - lv_style_set_radius(&style_sw_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); - lv_style_set_value_color(&style_sw_bg, LV_STATE_DEFAULT, LV_PINETIME_BLUE); + style_init_reset(&style_sw_knob); + lv_style_set_bg_opa(&style_sw_knob, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&style_sw_knob, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + lv_style_set_radius(&style_sw_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_pad_top(&style_sw_knob, LV_STATE_DEFAULT, -4); + lv_style_set_pad_bottom(&style_sw_knob, LV_STATE_DEFAULT, -4); + lv_style_set_pad_left(&style_sw_knob, LV_STATE_DEFAULT, -4); + lv_style_set_pad_right(&style_sw_knob, LV_STATE_DEFAULT, -4); - style_init_reset(&style_sw_indic); - lv_style_set_bg_opa(&style_sw_indic, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_bg_color(&style_sw_indic, LV_STATE_DEFAULT, LV_PINETIME_GREEN); + style_init_reset(&style_slider_knob); + lv_style_set_bg_opa(&style_slider_knob, LV_STATE_DEFAULT, LV_OPA_COVER); + lv_style_set_bg_color(&style_slider_knob, LV_STATE_DEFAULT, LV_COLOR_RED); + lv_style_set_border_color(&style_slider_knob, LV_STATE_DEFAULT, LV_COLOR_WHITE); + lv_style_set_border_width(&style_slider_knob, LV_STATE_DEFAULT, 6); + lv_style_set_radius(&style_slider_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_pad_top(&style_slider_knob, LV_STATE_DEFAULT, 10); + lv_style_set_pad_bottom(&style_slider_knob, LV_STATE_DEFAULT, 10); + lv_style_set_pad_left(&style_slider_knob, LV_STATE_DEFAULT, 10); + lv_style_set_pad_right(&style_slider_knob, LV_STATE_DEFAULT, 10); + lv_style_set_pad_top(&style_slider_knob, LV_STATE_PRESSED, 14); + lv_style_set_pad_bottom(&style_slider_knob, LV_STATE_PRESSED, 14); + lv_style_set_pad_left(&style_slider_knob, LV_STATE_PRESSED, 14); + lv_style_set_pad_right(&style_slider_knob, LV_STATE_PRESSED, 14); - style_init_reset(&style_sw_knob); - lv_style_set_bg_opa(&style_sw_knob, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_bg_color(&style_sw_knob, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - lv_style_set_radius(&style_sw_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); - lv_style_set_pad_top(&style_sw_knob, LV_STATE_DEFAULT, - 4); - lv_style_set_pad_bottom(&style_sw_knob, LV_STATE_DEFAULT, - 4); - lv_style_set_pad_left(&style_sw_knob, LV_STATE_DEFAULT, - 4); - lv_style_set_pad_right(&style_sw_knob, LV_STATE_DEFAULT, - 4); + style_init_reset(&style_arc_indic); + lv_style_set_line_color(&style_arc_indic, LV_STATE_DEFAULT, LV_PINETIME_BLUE); + lv_style_set_line_width(&style_arc_indic, LV_STATE_DEFAULT, LV_DPX(25)); + lv_style_set_line_rounded(&style_arc_indic, LV_STATE_DEFAULT, true); - style_init_reset(&style_slider_knob); - lv_style_set_bg_opa(&style_slider_knob, LV_STATE_DEFAULT, LV_OPA_COVER); - lv_style_set_bg_color(&style_slider_knob, LV_STATE_DEFAULT, LV_COLOR_RED); - lv_style_set_border_color(&style_slider_knob, LV_STATE_DEFAULT, LV_COLOR_WHITE); - lv_style_set_border_width(&style_slider_knob, LV_STATE_DEFAULT, 6); - lv_style_set_radius(&style_slider_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); - lv_style_set_pad_top(&style_slider_knob, LV_STATE_DEFAULT, 10); - lv_style_set_pad_bottom(&style_slider_knob, LV_STATE_DEFAULT, 10); - lv_style_set_pad_left(&style_slider_knob, LV_STATE_DEFAULT, 10); - lv_style_set_pad_right(&style_slider_knob, LV_STATE_DEFAULT, 10); - lv_style_set_pad_top(&style_slider_knob, LV_STATE_PRESSED, 14); - lv_style_set_pad_bottom(&style_slider_knob, LV_STATE_PRESSED, 14); - lv_style_set_pad_left(&style_slider_knob, LV_STATE_PRESSED, 14); - lv_style_set_pad_right(&style_slider_knob, LV_STATE_PRESSED, 14); + style_init_reset(&style_arc_bg); + lv_style_set_line_color(&style_arc_bg, LV_STATE_DEFAULT, LV_PINETIME_GRAY); + lv_style_set_line_width(&style_arc_bg, LV_STATE_DEFAULT, LV_DPX(25)); + lv_style_set_line_rounded(&style_arc_bg, LV_STATE_DEFAULT, true); - style_init_reset(&style_arc_indic); - lv_style_set_line_color(&style_arc_indic, LV_STATE_DEFAULT, LV_PINETIME_BLUE); - lv_style_set_line_width(&style_arc_indic, LV_STATE_DEFAULT, LV_DPX(25)); - lv_style_set_line_rounded(&style_arc_indic, LV_STATE_DEFAULT, true); + style_init_reset(&style_table_cell); + lv_style_set_border_color(&style_table_cell, LV_STATE_DEFAULT, LV_PINETIME_GRAY); + lv_style_set_border_width(&style_table_cell, LV_STATE_DEFAULT, 1); + lv_style_set_border_side(&style_table_cell, LV_STATE_DEFAULT, LV_BORDER_SIDE_FULL); + lv_style_set_pad_left(&style_table_cell, LV_STATE_DEFAULT, 5); + lv_style_set_pad_right(&style_table_cell, LV_STATE_DEFAULT, 5); + lv_style_set_pad_top(&style_table_cell, LV_STATE_DEFAULT, 2); + lv_style_set_pad_bottom(&style_table_cell, LV_STATE_DEFAULT, 2); - style_init_reset(&style_arc_bg); - lv_style_set_line_color(&style_arc_bg, LV_STATE_DEFAULT, LV_PINETIME_GRAY); - lv_style_set_line_width(&style_arc_bg, LV_STATE_DEFAULT, LV_DPX(25)); - lv_style_set_line_rounded(&style_arc_bg, LV_STATE_DEFAULT, true); + style_init_reset(&style_pad_small); + lv_style_int_t pad_small_value = 10; + lv_style_set_pad_left(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); + lv_style_set_pad_right(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); + lv_style_set_pad_top(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); + lv_style_set_pad_bottom(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); + lv_style_set_pad_inner(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); - style_init_reset(&style_table_cell); - lv_style_set_border_color(&style_table_cell, LV_STATE_DEFAULT, LV_PINETIME_GRAY); - lv_style_set_border_width(&style_table_cell, LV_STATE_DEFAULT, 1); - lv_style_set_border_side(&style_table_cell, LV_STATE_DEFAULT, LV_BORDER_SIDE_FULL); - lv_style_set_pad_left(&style_table_cell, LV_STATE_DEFAULT, 5); - lv_style_set_pad_right(&style_table_cell, LV_STATE_DEFAULT, 5); - lv_style_set_pad_top(&style_table_cell, LV_STATE_DEFAULT, 2); - lv_style_set_pad_bottom(&style_table_cell, LV_STATE_DEFAULT, 2); + style_init_reset(&style_bg_grad); + lv_style_set_bg_color(&style_bg_grad, LV_STATE_DEFAULT, lv_color_hsv_to_rgb(10, 10, 40)); + lv_style_set_bg_grad_color(&style_bg_grad, LV_STATE_DEFAULT, lv_color_hsv_to_rgb(10, 10, 20)); + lv_style_set_bg_grad_dir(&style_bg_grad, LV_STATE_DEFAULT, LV_GRAD_DIR_VER); - style_init_reset(&style_pad_small); - lv_style_int_t pad_small_value = 10; - lv_style_set_pad_left(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); - lv_style_set_pad_right(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); - lv_style_set_pad_top(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); - lv_style_set_pad_bottom(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); - lv_style_set_pad_inner(&style_pad_small, LV_STATE_DEFAULT, pad_small_value); + style_init_reset(&style_lmeter); + lv_style_set_radius(&style_lmeter, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_pad_left(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_right(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_top(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_pad_inner(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(30)); + lv_style_set_scale_width(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(25)); - style_init_reset(&style_bg_grad); - lv_style_set_bg_color(&style_bg_grad, LV_STATE_DEFAULT, lv_color_hsv_to_rgb(10, 10, 40)); - lv_style_set_bg_grad_color(&style_bg_grad, LV_STATE_DEFAULT, lv_color_hsv_to_rgb(10, 10, 20)); - lv_style_set_bg_grad_dir(&style_bg_grad, LV_STATE_DEFAULT, LV_GRAD_DIR_VER); + lv_style_set_line_color(&style_lmeter, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_scale_grad_color(&style_lmeter, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_scale_end_color(&style_lmeter, LV_STATE_DEFAULT, lv_color_hex3(0x888)); + lv_style_set_line_width(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_scale_end_line_width(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(7)); - style_init_reset(&style_lmeter); - lv_style_set_radius(&style_lmeter, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); - lv_style_set_pad_left(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(20)); - lv_style_set_pad_right(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(20)); - lv_style_set_pad_top(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(20)); - lv_style_set_pad_inner(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(30)); - lv_style_set_scale_width(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(25)); + style_init_reset(&style_chart_serie); + lv_style_set_line_color(&style_chart_serie, LV_STATE_DEFAULT, LV_PINETIME_WHITE); + lv_style_set_line_width(&style_chart_serie, LV_STATE_DEFAULT, 4); + lv_style_set_size(&style_chart_serie, LV_STATE_DEFAULT, 4); + lv_style_set_bg_opa(&style_chart_serie, LV_STATE_DEFAULT, 0); - lv_style_set_line_color(&style_lmeter, LV_STATE_DEFAULT, theme.color_primary); - lv_style_set_scale_grad_color(&style_lmeter, LV_STATE_DEFAULT, theme.color_primary); - lv_style_set_scale_end_color(&style_lmeter, LV_STATE_DEFAULT, lv_color_hex3(0x888)); - lv_style_set_line_width(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(10)); - lv_style_set_scale_end_line_width(&style_lmeter, LV_STATE_DEFAULT, LV_DPX(7)); - - style_init_reset(&style_chart_serie); - lv_style_set_line_color(&style_chart_serie, LV_STATE_DEFAULT, LV_PINETIME_WHITE); - lv_style_set_line_width(&style_chart_serie, LV_STATE_DEFAULT, 4); - lv_style_set_size(&style_chart_serie, LV_STATE_DEFAULT, 4); - lv_style_set_bg_opa(&style_chart_serie, LV_STATE_DEFAULT, 0); - - lv_style_reset(&style_cb_bg); - lv_style_set_radius(&style_cb_bg, LV_STATE_DEFAULT, LV_DPX(4)); - lv_style_set_pad_inner(&style_cb_bg, LV_STATE_DEFAULT, LV_DPX(10)); - lv_style_set_outline_color(&style_cb_bg, LV_STATE_DEFAULT, theme.color_primary); - lv_style_set_outline_width(&style_cb_bg, LV_STATE_DEFAULT, LV_DPX(2)); - lv_style_set_outline_pad(&style_cb_bg, LV_STATE_DEFAULT, LV_DPX(20)); - lv_style_set_transition_time(&style_cb_bg, LV_STATE_DEFAULT, 0); - lv_style_set_transition_prop_6(&style_cb_bg, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA); - - lv_style_reset(&style_cb_bullet); - lv_style_set_outline_opa(&style_cb_bullet, LV_STATE_FOCUSED, LV_OPA_TRANSP); - lv_style_set_radius(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(4)); - lv_style_set_pattern_recolor(&style_cb_bullet, LV_STATE_CHECKED, LV_COLOR_WHITE); - lv_style_set_pad_left(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(8)); - lv_style_set_pad_right(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(8)); - lv_style_set_pad_top(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(8)); - lv_style_set_pad_bottom(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(8)); + lv_style_reset(&style_cb_bg); + lv_style_set_radius(&style_cb_bg, LV_STATE_DEFAULT, LV_DPX(4)); + lv_style_set_pad_inner(&style_cb_bg, LV_STATE_DEFAULT, LV_DPX(10)); + lv_style_set_outline_color(&style_cb_bg, LV_STATE_DEFAULT, theme.color_primary); + lv_style_set_outline_width(&style_cb_bg, LV_STATE_DEFAULT, LV_DPX(2)); + lv_style_set_outline_pad(&style_cb_bg, LV_STATE_DEFAULT, LV_DPX(20)); + lv_style_set_transition_time(&style_cb_bg, LV_STATE_DEFAULT, 0); + lv_style_set_transition_prop_6(&style_cb_bg, LV_STATE_DEFAULT, LV_STYLE_OUTLINE_OPA); + lv_style_reset(&style_cb_bullet); + lv_style_set_outline_opa(&style_cb_bullet, LV_STATE_FOCUSED, LV_OPA_TRANSP); + lv_style_set_radius(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(4)); + lv_style_set_pattern_recolor(&style_cb_bullet, LV_STATE_CHECKED, LV_COLOR_WHITE); + lv_style_set_pad_left(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(8)); + lv_style_set_pad_right(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(8)); + lv_style_set_pad_top(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(8)); + lv_style_set_pad_bottom(&style_cb_bullet, LV_STATE_DEFAULT, LV_DPX(8)); } - /********************** * GLOBAL FUNCTIONS **********************/ @@ -320,221 +316,216 @@ static void basic_init(void) * @param font_title pointer to a extra large font * @return a pointer to reference this theme later */ -lv_theme_t * lv_pinetime_theme_init(lv_color_t color_primary, lv_color_t color_secondary, uint32_t flags, - const lv_font_t * font_small, const lv_font_t * font_normal, const lv_font_t * font_subtitle, - const lv_font_t * font_title) -{ - theme.color_primary = color_primary; - theme.color_secondary = color_secondary; - theme.font_small = font_small; - theme.font_normal = font_normal; - theme.font_subtitle = font_subtitle; - theme.font_title = font_title; - theme.flags = flags; +lv_theme_t* lv_pinetime_theme_init(lv_color_t color_primary, + lv_color_t color_secondary, + uint32_t flags, + const lv_font_t* font_small, + const lv_font_t* font_normal, + const lv_font_t* font_subtitle, + const lv_font_t* font_title) { + theme.color_primary = color_primary; + theme.color_secondary = color_secondary; + theme.font_small = font_small; + theme.font_normal = font_normal; + theme.font_subtitle = font_subtitle; + theme.font_title = font_title; + theme.flags = flags; - basic_init(); + basic_init(); - theme.apply_xcb = theme_apply; + theme.apply_xcb = theme_apply; - inited = true; + inited = true; - return &theme; + return &theme; } +static void theme_apply(lv_obj_t* obj, lv_theme_style_t name) { + lv_style_list_t* list; -static void theme_apply(lv_obj_t * obj, lv_theme_style_t name) -{ - lv_style_list_t * list; + /*To avoid warnings*/ + uint32_t name_int = (uint32_t) name; + switch (name_int) { + case LV_THEME_NONE: + break; - /*To avoid warnings*/ - uint32_t name_int = (uint32_t) name; - switch(name_int) { - case LV_THEME_NONE: - break; + case LV_THEME_SCR: + lv_obj_clean_style_list(obj, LV_OBJ_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_OBJ_PART_MAIN); + _lv_style_list_add_style(list, &style_bg); + _lv_style_list_add_style(list, &style_label_white); + break; - case LV_THEME_SCR: - lv_obj_clean_style_list(obj, LV_OBJ_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_OBJ_PART_MAIN); - _lv_style_list_add_style(list, &style_bg); - _lv_style_list_add_style(list, &style_label_white); - break; + case LV_THEME_OBJ: + lv_obj_clean_style_list(obj, LV_OBJ_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_OBJ_PART_MAIN); + _lv_style_list_add_style(list, &style_box); + break; - case LV_THEME_OBJ: - lv_obj_clean_style_list(obj, LV_OBJ_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_OBJ_PART_MAIN); - _lv_style_list_add_style(list, &style_box); - break; + case LV_THEME_CONT: + lv_obj_clean_style_list(obj, LV_OBJ_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_CONT_PART_MAIN); + _lv_style_list_add_style(list, &style_box); + break; - case LV_THEME_CONT: - lv_obj_clean_style_list(obj, LV_OBJ_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_CONT_PART_MAIN); - _lv_style_list_add_style(list, &style_box); - break; + case LV_THEME_BTN: + lv_obj_clean_style_list(obj, LV_BTN_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_BTN_PART_MAIN); + _lv_style_list_add_style(list, &style_btn); + //_lv_style_list_add_style(list, &style_bg_grad); + break; - case LV_THEME_BTN: - lv_obj_clean_style_list(obj, LV_BTN_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_BTN_PART_MAIN); - _lv_style_list_add_style(list, &style_btn); - //_lv_style_list_add_style(list, &style_bg_grad); - break; + case LV_THEME_BTNMATRIX: + list = lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BG); + _lv_style_list_add_style(list, &style_bg); + _lv_style_list_add_style(list, &style_pad_small); - case LV_THEME_BTNMATRIX: - list = lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BG); - _lv_style_list_add_style(list, &style_bg); - _lv_style_list_add_style(list, &style_pad_small); + list = lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BTN); + _lv_style_list_add_style(list, &style_btn); + //_lv_style_list_add_style(list, &style_bg_grad); + //_lv_style_list_add_style(list, &style_bg_click); + break; - list = lv_obj_get_style_list(obj, LV_BTNMATRIX_PART_BTN); - _lv_style_list_add_style(list, &style_btn); - //_lv_style_list_add_style(list, &style_bg_grad); - //_lv_style_list_add_style(list, &style_bg_click); - break; + case LV_THEME_BAR: + lv_obj_clean_style_list(obj, LV_BAR_PART_BG); + list = lv_obj_get_style_list(obj, LV_BAR_PART_BG); - case LV_THEME_BAR: - lv_obj_clean_style_list(obj, LV_BAR_PART_BG); - list = lv_obj_get_style_list(obj, LV_BAR_PART_BG); + lv_obj_clean_style_list(obj, LV_BAR_PART_INDIC); + list = lv_obj_get_style_list(obj, LV_BAR_PART_INDIC); + _lv_style_list_add_style(list, &style_bar_indic); + break; - lv_obj_clean_style_list(obj, LV_BAR_PART_INDIC); - list = lv_obj_get_style_list(obj, LV_BAR_PART_INDIC); - _lv_style_list_add_style(list, &style_bar_indic); - break; + case LV_THEME_IMAGE: + lv_obj_clean_style_list(obj, LV_IMG_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_IMG_PART_MAIN); + _lv_style_list_add_style(list, &style_icon); + break; - case LV_THEME_IMAGE: - lv_obj_clean_style_list(obj, LV_IMG_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_IMG_PART_MAIN); - _lv_style_list_add_style(list, &style_icon); - break; + case LV_THEME_LABEL: + lv_obj_clean_style_list(obj, LV_LABEL_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_LABEL_PART_MAIN); + _lv_style_list_add_style(list, &style_label_white); + break; - case LV_THEME_LABEL: - lv_obj_clean_style_list(obj, LV_LABEL_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_LABEL_PART_MAIN); - _lv_style_list_add_style(list, &style_label_white); - break; + case LV_THEME_SLIDER: + lv_obj_clean_style_list(obj, LV_SLIDER_PART_BG); + list = lv_obj_get_style_list(obj, LV_SLIDER_PART_BG); + _lv_style_list_add_style(list, &style_sw_bg); - case LV_THEME_SLIDER: - lv_obj_clean_style_list(obj, LV_SLIDER_PART_BG); - list = lv_obj_get_style_list(obj, LV_SLIDER_PART_BG); - _lv_style_list_add_style(list, &style_sw_bg); + lv_obj_clean_style_list(obj, LV_SLIDER_PART_INDIC); + list = lv_obj_get_style_list(obj, LV_SLIDER_PART_INDIC); - lv_obj_clean_style_list(obj, LV_SLIDER_PART_INDIC); - list = lv_obj_get_style_list(obj, LV_SLIDER_PART_INDIC); + lv_obj_clean_style_list(obj, LV_SLIDER_PART_KNOB); + list = lv_obj_get_style_list(obj, LV_SLIDER_PART_KNOB); + _lv_style_list_add_style(list, &style_slider_knob); + break; - lv_obj_clean_style_list(obj, LV_SLIDER_PART_KNOB); - list = lv_obj_get_style_list(obj, LV_SLIDER_PART_KNOB); - _lv_style_list_add_style(list, &style_slider_knob); - break; + case LV_THEME_LIST: + lv_obj_clean_style_list(obj, LV_LIST_PART_BG); + list = lv_obj_get_style_list(obj, LV_LIST_PART_BG); + _lv_style_list_add_style(list, &style_box); - case LV_THEME_LIST: - lv_obj_clean_style_list(obj, LV_LIST_PART_BG); - list = lv_obj_get_style_list(obj, LV_LIST_PART_BG); - _lv_style_list_add_style(list, &style_box); + lv_obj_clean_style_list(obj, LV_LIST_PART_SCROLLABLE); + list = lv_obj_get_style_list(obj, LV_LIST_PART_SCROLLABLE); - lv_obj_clean_style_list(obj, LV_LIST_PART_SCROLLABLE); - list = lv_obj_get_style_list(obj, LV_LIST_PART_SCROLLABLE); + lv_obj_clean_style_list(obj, LV_LIST_PART_SCROLLBAR); + list = lv_obj_get_style_list(obj, LV_LIST_PART_SCROLLBAR); + _lv_style_list_add_style(list, &style_scrollbar); + break; - lv_obj_clean_style_list(obj, LV_LIST_PART_SCROLLBAR); - list = lv_obj_get_style_list(obj, LV_LIST_PART_SCROLLBAR); - _lv_style_list_add_style(list, &style_scrollbar); - break; + case LV_THEME_LIST_BTN: + lv_obj_clean_style_list(obj, LV_BTN_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_BTN_PART_MAIN); + _lv_style_list_add_style(list, &style_list_btn); + break; - case LV_THEME_LIST_BTN: - lv_obj_clean_style_list(obj, LV_BTN_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_BTN_PART_MAIN); - _lv_style_list_add_style(list, &style_list_btn); - break; + case LV_THEME_ARC: + lv_obj_clean_style_list(obj, LV_ARC_PART_BG); + list = lv_obj_get_style_list(obj, LV_ARC_PART_BG); + _lv_style_list_add_style(list, &style_arc_bg); + lv_obj_clean_style_list(obj, LV_ARC_PART_INDIC); + list = lv_obj_get_style_list(obj, LV_ARC_PART_INDIC); + _lv_style_list_add_style(list, &style_arc_indic); + break; - case LV_THEME_ARC: - lv_obj_clean_style_list(obj, LV_ARC_PART_BG); - list = lv_obj_get_style_list(obj, LV_ARC_PART_BG); - _lv_style_list_add_style(list, &style_arc_bg); + case LV_THEME_SWITCH: + lv_obj_clean_style_list(obj, LV_SWITCH_PART_BG); + list = lv_obj_get_style_list(obj, LV_SWITCH_PART_BG); + _lv_style_list_add_style(list, &style_sw_bg); - lv_obj_clean_style_list(obj, LV_ARC_PART_INDIC); - list = lv_obj_get_style_list(obj, LV_ARC_PART_INDIC); - _lv_style_list_add_style(list, &style_arc_indic); - break; + lv_obj_clean_style_list(obj, LV_SWITCH_PART_INDIC); + list = lv_obj_get_style_list(obj, LV_SWITCH_PART_INDIC); + _lv_style_list_add_style(list, &style_sw_indic); + lv_obj_clean_style_list(obj, LV_SWITCH_PART_KNOB); + list = lv_obj_get_style_list(obj, LV_SWITCH_PART_KNOB); + _lv_style_list_add_style(list, &style_sw_knob); + break; - case LV_THEME_SWITCH: - lv_obj_clean_style_list(obj, LV_SWITCH_PART_BG); - list = lv_obj_get_style_list(obj, LV_SWITCH_PART_BG); - _lv_style_list_add_style(list, &style_sw_bg); + case LV_THEME_DROPDOWN: + lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_MAIN); + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_MAIN); + _lv_style_list_add_style(list, &style_btn); + _lv_style_list_add_style(list, &style_pad); - lv_obj_clean_style_list(obj, LV_SWITCH_PART_INDIC); - list = lv_obj_get_style_list(obj, LV_SWITCH_PART_INDIC); - _lv_style_list_add_style(list, &style_sw_indic); + lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_LIST); + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_LIST); + _lv_style_list_add_style(list, &style_box); + _lv_style_list_add_style(list, &style_ddlist_list); + _lv_style_list_add_style(list, &style_pad); - lv_obj_clean_style_list(obj, LV_SWITCH_PART_KNOB); - list = lv_obj_get_style_list(obj, LV_SWITCH_PART_KNOB); - _lv_style_list_add_style(list, &style_sw_knob); - break; + lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_SELECTED); + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_SELECTED); + _lv_style_list_add_style(list, &style_ddlist_selected); - case LV_THEME_DROPDOWN: - lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_MAIN); - list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_MAIN); - _lv_style_list_add_style(list, &style_btn); - _lv_style_list_add_style(list, &style_pad); + lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_SCROLLBAR); + list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_SCROLLBAR); + _lv_style_list_add_style(list, &style_scrollbar); + break; - lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_LIST); - list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_LIST); - _lv_style_list_add_style(list, &style_box); - _lv_style_list_add_style(list, &style_ddlist_list); - _lv_style_list_add_style(list, &style_pad); + case LV_THEME_TABLE: + list = lv_obj_get_style_list(obj, LV_TABLE_PART_BG); + _lv_style_list_add_style(list, &style_bg); - lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_SELECTED); - list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_SELECTED); - _lv_style_list_add_style(list, &style_ddlist_selected); + int idx = 1; /* start value should be 1, not zero, since cell styles + start at 1 due to presence of LV_TABLE_PART_BG=0 + in the enum (lv_table.h) */ + /* declaring idx outside loop to work with older compilers */ + for (; idx <= LV_TABLE_CELL_STYLE_CNT; idx++) { + list = lv_obj_get_style_list(obj, idx); + _lv_style_list_add_style(list, &style_table_cell); + _lv_style_list_add_style(list, &style_label_white); + } + break; - lv_obj_clean_style_list(obj, LV_DROPDOWN_PART_SCROLLBAR); - list = lv_obj_get_style_list(obj, LV_DROPDOWN_PART_SCROLLBAR); - _lv_style_list_add_style(list, &style_scrollbar); - break; + case LV_THEME_LINEMETER: + list = lv_obj_get_style_list(obj, LV_LINEMETER_PART_MAIN); + _lv_style_list_add_style(list, &style_bg); + _lv_style_list_add_style(list, &style_lmeter); + break; - case LV_THEME_TABLE: - list = lv_obj_get_style_list(obj, LV_TABLE_PART_BG); - _lv_style_list_add_style(list, &style_bg); + case LV_THEME_CHART: + lv_obj_clean_style_list(obj, LV_CHART_PART_SERIES); + list = lv_obj_get_style_list(obj, LV_CHART_PART_SERIES); + _lv_style_list_add_style(list, &style_btn); + _lv_style_list_add_style(list, &style_chart_serie); + break; - int idx = 1; /* start value should be 1, not zero, since cell styles - start at 1 due to presence of LV_TABLE_PART_BG=0 - in the enum (lv_table.h) */ - /* declaring idx outside loop to work with older compilers */ - for(; idx <= LV_TABLE_CELL_STYLE_CNT; idx ++) { - list = lv_obj_get_style_list(obj, idx); - _lv_style_list_add_style(list, &style_table_cell); - _lv_style_list_add_style(list, &style_label_white); - } - break; + case LV_THEME_CHECKBOX: + list = lv_obj_get_style_list(obj, LV_CHECKBOX_PART_BG); + _lv_style_list_add_style(list, &style_cb_bg); - case LV_THEME_LINEMETER: - list = lv_obj_get_style_list(obj, LV_LINEMETER_PART_MAIN); - _lv_style_list_add_style(list, &style_bg); - _lv_style_list_add_style(list, &style_lmeter); - break; - - case LV_THEME_CHART: - lv_obj_clean_style_list(obj, LV_CHART_PART_SERIES); - list = lv_obj_get_style_list(obj, LV_CHART_PART_SERIES); - _lv_style_list_add_style(list, &style_btn); - _lv_style_list_add_style(list, &style_chart_serie); - break; - - case LV_THEME_CHECKBOX: - list = lv_obj_get_style_list(obj, LV_CHECKBOX_PART_BG); - _lv_style_list_add_style(list, &style_cb_bg); - - list = lv_obj_get_style_list(obj, LV_CHECKBOX_PART_BULLET); - _lv_style_list_add_style(list, &style_btn); - _lv_style_list_add_style(list, &style_cb_bullet); - break; - - - default: - break; - } - - - lv_obj_refresh_style(obj, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); + list = lv_obj_get_style_list(obj, LV_CHECKBOX_PART_BULLET); + _lv_style_list_add_style(list, &style_btn); + _lv_style_list_add_style(list, &style_cb_bullet); + break; + default: + break; + } + lv_obj_refresh_style(obj, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } /********************** diff --git a/src/displayapp/lv_pinetime_theme.h b/src/displayapp/lv_pinetime_theme.h index 6697015e..f914516d 100644 --- a/src/displayapp/lv_pinetime_theme.h +++ b/src/displayapp/lv_pinetime_theme.h @@ -19,24 +19,22 @@ extern "C" { * DEFINES *********************/ /*Colors*/ -#define LV_PINETIME_WHITE lv_color_hex(0xffffff) -#define LV_PINETIME_LIGHT lv_color_hex(0xf3f8fe) -#define LV_PINETIME_GRAY lv_color_hex(0x8a8a8a) -#define LV_PINETIME_LIGHT_GRAY lv_color_hex(0xc4c4c4) -#define LV_PINETIME_BLUE lv_color_hex(0x2f3243) //006fb6 -#define LV_PINETIME_GREEN lv_color_hex(0x4cb242) -#define LV_PINETIME_RED lv_color_hex(0xd51732) +#define LV_PINETIME_WHITE lv_color_hex(0xffffff) +#define LV_PINETIME_LIGHT lv_color_hex(0xf3f8fe) +#define LV_PINETIME_GRAY lv_color_hex(0x8a8a8a) +#define LV_PINETIME_LIGHT_GRAY lv_color_hex(0xc4c4c4) +#define LV_PINETIME_BLUE lv_color_hex(0x2f3243) // 006fb6 +#define LV_PINETIME_GREEN lv_color_hex(0x4cb242) +#define LV_PINETIME_RED lv_color_hex(0xd51732) /********************** * TYPEDEFS **********************/ - /********************** * GLOBAL PROTOTYPES **********************/ - /** * Initialize the default * @param color_primary the primary color of the theme @@ -48,9 +46,13 @@ extern "C" { * @param font_title pointer to a extra large font * @return a pointer to reference this theme later */ -lv_theme_t * lv_pinetime_theme_init(lv_color_t color_primary, lv_color_t color_secondary, uint32_t flags, - const lv_font_t * font_small, const lv_font_t * font_normal, const lv_font_t * font_subtitle, - const lv_font_t * font_title); +lv_theme_t* lv_pinetime_theme_init(lv_color_t color_primary, + lv_color_t color_secondary, + uint32_t flags, + const lv_font_t* font_small, + const lv_font_t* font_normal, + const lv_font_t* font_subtitle, + const lv_font_t* font_title); /********************** * MACROS **********************/ diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp index 056d128c..7e38b3f4 100644 --- a/src/displayapp/screens/ApplicationList.cpp +++ b/src/displayapp/screens/ApplicationList.cpp @@ -8,31 +8,34 @@ using namespace Pinetime::Applications::Screens; -ApplicationList::ApplicationList(Pinetime::Applications::DisplayApp *app, - Pinetime::Controllers::Settings &settingsController, - Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController) : - Screen(app), - settingsController{settingsController}, - batteryController{batteryController}, - dateTimeController{dateTimeController}, - screens{app, - settingsController.GetAppMenu(), - { - [this]() -> std::unique_ptr { return CreateScreen1(); }, - [this]() -> std::unique_ptr { return CreateScreen2(); }, - //[this]() -> std::unique_ptr { return CreateScreen3(); } - }, - Screens::ScreenListModes::UpDown - } {} - +ApplicationList::ApplicationList(Pinetime::Applications::DisplayApp* app, + Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::Battery& batteryController, + Controllers::DateTime& dateTimeController) + : Screen(app), + settingsController {settingsController}, + batteryController {batteryController}, + dateTimeController {dateTimeController}, + screens {app, + settingsController.GetAppMenu(), + { + [this]() -> std::unique_ptr { + return CreateScreen1(); + }, + [this]() -> std::unique_ptr { + return CreateScreen2(); + }, + //[this]() -> std::unique_ptr { return CreateScreen3(); } + }, + Screens::ScreenListModes::UpDown} { +} ApplicationList::~ApplicationList() { lv_obj_clean(lv_scr_act()); } bool ApplicationList::Refresh() { - if(running) + if (running) running = screens.Refresh(); return running; } @@ -42,31 +45,27 @@ bool ApplicationList::OnTouchEvent(Pinetime::Applications::TouchEvents event) { } std::unique_ptr ApplicationList::CreateScreen1() { - std::array applications { - { - {Symbols::stopWatch, Apps::StopWatch}, - {Symbols::music, Apps::Music}, - {Symbols::map, Apps::Navigation}, - {Symbols::shoe, Apps::Motion}, - {Symbols::heartBeat, Apps::HeartRate}, - {"", Apps::None}, - } - }; + std::array applications {{ + {Symbols::stopWatch, Apps::StopWatch}, + {Symbols::music, Apps::Music}, + {Symbols::map, Apps::Navigation}, + {Symbols::shoe, Apps::Motion}, + {Symbols::heartBeat, Apps::HeartRate}, + {"", Apps::None}, + }}; return std::make_unique(0, 2, app, settingsController, batteryController, dateTimeController, applications); } std::unique_ptr ApplicationList::CreateScreen2() { - std::array applications { - { - {Symbols::paintbrush, Apps::Paint}, - {Symbols::paddle, Apps::Paddle}, - {"2", Apps::Twos}, - {"", Apps::None}, - {"", Apps::None}, - {"", Apps::None}, - } - }; + std::array applications {{ + {Symbols::paintbrush, Apps::Paint}, + {Symbols::paddle, Apps::Paddle}, + {"2", Apps::Twos}, + {"", Apps::None}, + {"", Apps::None}, + {"", Apps::None}, + }}; return std::make_unique(1, 2, app, settingsController, batteryController, dateTimeController, applications); } @@ -84,4 +83,3 @@ std::unique_ptr ApplicationList::CreateScreen2() { return std::make_unique(2, 3, app, settingsController, batteryController, dateTimeController, applications); }*/ - diff --git a/src/displayapp/screens/ApplicationList.h b/src/displayapp/screens/ApplicationList.h index e334ccde..5d519355 100644 --- a/src/displayapp/screens/ApplicationList.h +++ b/src/displayapp/screens/ApplicationList.h @@ -12,24 +12,24 @@ namespace Pinetime { namespace Applications { namespace Screens { class ApplicationList : public Screen { - public: - explicit ApplicationList(DisplayApp* app, - Pinetime::Controllers::Settings &settingsController, - Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController); - ~ApplicationList() override; - bool Refresh() override; - bool OnTouchEvent(TouchEvents event) override; - private: + public: + explicit ApplicationList(DisplayApp* app, + Pinetime::Controllers::Settings& settingsController, + Pinetime::Controllers::Battery& batteryController, + Controllers::DateTime& dateTimeController); + ~ApplicationList() override; + bool Refresh() override; + bool OnTouchEvent(TouchEvents event) override; - Controllers::Settings& settingsController; - Pinetime::Controllers::Battery& batteryController; - Controllers::DateTime& dateTimeController; + private: + Controllers::Settings& settingsController; + Pinetime::Controllers::Battery& batteryController; + Controllers::DateTime& dateTimeController; - ScreenList<2> screens; - std::unique_ptr CreateScreen1(); - std::unique_ptr CreateScreen2(); - //std::unique_ptr CreateScreen3(); + ScreenList<2> screens; + std::unique_ptr CreateScreen1(); + std::unique_ptr CreateScreen2(); + // std::unique_ptr CreateScreen3(); }; } } diff --git a/src/displayapp/screens/BatteryIcon.cpp b/src/displayapp/screens/BatteryIcon.cpp index 455b0c6d..6b54a305 100644 --- a/src/displayapp/screens/BatteryIcon.cpp +++ b/src/displayapp/screens/BatteryIcon.cpp @@ -4,10 +4,14 @@ using namespace Pinetime::Applications::Screens; const char* BatteryIcon::GetBatteryIcon(int batteryPercent) { - if(batteryPercent > 90) return Symbols::batteryFull; - if(batteryPercent > 75) return Symbols::batteryThreeQuarter; - if(batteryPercent > 50) return Symbols::batteryHalf; - if(batteryPercent > 25) return Symbols::batteryOneQuarter; + if (batteryPercent > 90) + return Symbols::batteryFull; + if (batteryPercent > 75) + return Symbols::batteryThreeQuarter; + if (batteryPercent > 50) + return Symbols::batteryHalf; + if (batteryPercent > 25) + return Symbols::batteryOneQuarter; return Symbols::batteryEmpty; } @@ -15,8 +19,9 @@ const char* BatteryIcon::GetUnknownIcon() { return Symbols::batteryEmpty; } -const char *BatteryIcon::GetPlugIcon(bool isCharging) { - if(isCharging) +const char* BatteryIcon::GetPlugIcon(bool isCharging) { + if (isCharging) return Symbols::plug; - else return ""; + else + return ""; } diff --git a/src/displayapp/screens/BatteryIcon.h b/src/displayapp/screens/BatteryIcon.h index 006e5621..2a40a9c1 100644 --- a/src/displayapp/screens/BatteryIcon.h +++ b/src/displayapp/screens/BatteryIcon.h @@ -4,10 +4,10 @@ namespace Pinetime { namespace Applications { namespace Screens { class BatteryIcon { - public: + public: static const char* GetUnknownIcon(); - static const char* GetBatteryIcon(int batteryPercent); - static const char* GetPlugIcon(bool isCharging); + static const char* GetBatteryIcon(int batteryPercent); + static const char* GetPlugIcon(bool isCharging); }; } } diff --git a/src/displayapp/screens/BatteryInfo.cpp b/src/displayapp/screens/BatteryInfo.cpp index e616d67f..1ab8b0ad 100644 --- a/src/displayapp/screens/BatteryInfo.cpp +++ b/src/displayapp/screens/BatteryInfo.cpp @@ -4,22 +4,18 @@ using namespace Pinetime::Applications::Screens; -static void lv_update_task(struct _lv_task_t *task) { - auto user_data = static_cast(task->user_data); +static void lv_update_task(struct _lv_task_t* task) { + auto user_data = static_cast(task->user_data); user_data->UpdateScreen(); } -static void lv_anim_task(struct _lv_task_t *task) { - auto user_data = static_cast(task->user_data); +static void lv_anim_task(struct _lv_task_t* task) { + auto user_data = static_cast(task->user_data); user_data->UpdateAnim(); } -BatteryInfo::BatteryInfo( - Pinetime::Applications::DisplayApp *app, - Pinetime::Controllers::Battery& batteryController) : - Screen(app), - batteryController{batteryController} -{ +BatteryInfo::BatteryInfo(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Battery& batteryController) + : Screen(app), batteryController {batteryController} { batteryPercent = batteryController.PercentRemaining(); batteryVoltage = batteryController.Voltage(); @@ -32,37 +28,38 @@ BatteryInfo::BatteryInfo( lv_obj_set_style_local_radius(charging_bar, LV_BAR_PART_BG, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_BG, LV_STATE_DEFAULT, lv_color_hex(0x222222)); lv_obj_set_style_local_bg_opa(charging_bar, LV_BAR_PART_BG, LV_STATE_DEFAULT, LV_OPA_100); - lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC , LV_STATE_DEFAULT, lv_color_hex(0xFF0000)); + lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, lv_color_hex(0xFF0000)); lv_bar_set_value(charging_bar, batteryPercent, LV_ANIM_OFF); - status = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(status,"Reading Battery status"); + status = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(status, "Reading Battery status"); lv_label_set_align(status, LV_LABEL_ALIGN_CENTER); lv_obj_align(status, charging_bar, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); - + percent = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(percent, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); - if ( batteryPercent >= 0) { - lv_label_set_text_fmt(percent,"%02i%%", batteryPercent); + if (batteryPercent >= 0) { + lv_label_set_text_fmt(percent, "%02i%%", batteryPercent); } else { - lv_label_set_text(percent,"--%"); + lv_label_set_text(percent, "--%"); } lv_label_set_align(percent, LV_LABEL_ALIGN_LEFT); lv_obj_align(percent, nullptr, LV_ALIGN_CENTER, 0, -60); // hack to not use the flot functions from printf uint8_t batteryVoltageBytes[2]; - batteryVoltageBytes[1] = static_cast(batteryVoltage); //truncate whole numbers - batteryVoltageBytes[0] = static_cast((batteryVoltage - batteryVoltageBytes[1]) * 100); //remove whole part of flt and shift 2 places over + batteryVoltageBytes[1] = static_cast(batteryVoltage); // truncate whole numbers + batteryVoltageBytes[0] = + static_cast((batteryVoltage - batteryVoltageBytes[1]) * 100); // remove whole part of flt and shift 2 places over // - voltage = lv_label_create(lv_scr_act(), nullptr); + voltage = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(voltage, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xC6A600)); - lv_label_set_text_fmt(voltage,"%1i.%02i volts", batteryVoltageBytes[1], batteryVoltageBytes[0]); + lv_label_set_text_fmt(voltage, "%1i.%02i volts", batteryVoltageBytes[1], batteryVoltageBytes[0]); lv_label_set_align(voltage, LV_LABEL_ALIGN_CENTER); lv_obj_align(voltage, nullptr, LV_ALIGN_CENTER, 0, 95); - lv_obj_t * backgroundLabel = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* backgroundLabel = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); @@ -73,7 +70,6 @@ BatteryInfo::BatteryInfo( UpdateScreen(); } - BatteryInfo::~BatteryInfo() { lv_task_del(taskUpdate); lv_task_del(taskAnim); @@ -83,9 +79,9 @@ BatteryInfo::~BatteryInfo() { void BatteryInfo::UpdateAnim() { batteryPercent = batteryController.PercentRemaining(); - if ( batteryPercent >= 0 ) { - if ( batteryController.IsCharging() and batteryPercent < 100 ) { - animation +=1; + if (batteryPercent >= 0) { + if (batteryController.IsCharging() and batteryPercent < 100) { + animation += 1; if (animation >= 100) { animation = 0; } @@ -110,40 +106,39 @@ void BatteryInfo::UpdateScreen() { batteryPercent = batteryController.PercentRemaining(); batteryVoltage = batteryController.Voltage(); - if ( batteryPercent >= 0 ) { - if ( batteryController.IsCharging() and batteryPercent < 100 ) { - lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC , LV_STATE_DEFAULT, LV_COLOR_RED); - lv_label_set_text_static(status,"Battery charging"); - } else if ( batteryPercent == 100 ) { - lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC , LV_STATE_DEFAULT, LV_COLOR_BLUE); - lv_label_set_text_static(status,"Battery is fully charged"); - } else if ( batteryPercent < 10 ) { - lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC , LV_STATE_DEFAULT, LV_COLOR_YELLOW); - lv_label_set_text_static(status,"Battery is low"); + if (batteryPercent >= 0) { + if (batteryController.IsCharging() and batteryPercent < 100) { + lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_RED); + lv_label_set_text_static(status, "Battery charging"); + } else if (batteryPercent == 100) { + lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_BLUE); + lv_label_set_text_static(status, "Battery is fully charged"); + } else if (batteryPercent < 10) { + lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_YELLOW); + lv_label_set_text_static(status, "Battery is low"); } else { - lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC , LV_STATE_DEFAULT, LV_COLOR_GREEN); - lv_label_set_text_static(status,"Battery discharging"); + lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_GREEN); + lv_label_set_text_static(status, "Battery discharging"); } - - lv_label_set_text_fmt(percent,"%02i%%", batteryPercent); - + + lv_label_set_text_fmt(percent, "%02i%%", batteryPercent); + } else { - lv_label_set_text_static(status,"Reading Battery status"); - lv_label_set_text(percent,"--%"); + lv_label_set_text_static(status, "Reading Battery status"); + lv_label_set_text(percent, "--%"); } lv_obj_align(status, charging_bar, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); // hack to not use the flot functions from printf uint8_t batteryVoltageBytes[2]; - batteryVoltageBytes[1] = static_cast(batteryVoltage); //truncate whole numbers - batteryVoltageBytes[0] = static_cast((batteryVoltage - batteryVoltageBytes[1]) * 100); //remove whole part of flt and shift 2 places over + batteryVoltageBytes[1] = static_cast(batteryVoltage); // truncate whole numbers + batteryVoltageBytes[0] = + static_cast((batteryVoltage - batteryVoltageBytes[1]) * 100); // remove whole part of flt and shift 2 places over // - lv_label_set_text_fmt(voltage,"%1i.%02i volts", batteryVoltageBytes[1], batteryVoltageBytes[0]); - + lv_label_set_text_fmt(voltage, "%1i.%02i volts", batteryVoltageBytes[1], batteryVoltageBytes[0]); } bool BatteryInfo::Refresh() { - + return running; } - diff --git a/src/displayapp/screens/BatteryInfo.h b/src/displayapp/screens/BatteryInfo.h index 206f1ab0..e95267bd 100644 --- a/src/displayapp/screens/BatteryInfo.h +++ b/src/displayapp/screens/BatteryInfo.h @@ -6,7 +6,6 @@ #include "Screen.h" #include - namespace Pinetime { namespace Controllers { class Battery; @@ -15,34 +14,30 @@ namespace Pinetime { namespace Applications { namespace Screens { - class BatteryInfo : public Screen{ - public: - BatteryInfo(DisplayApp* app, - Pinetime::Controllers::Battery& batteryController); - ~BatteryInfo() override; + class BatteryInfo : public Screen { + public: + BatteryInfo(DisplayApp* app, Pinetime::Controllers::Battery& batteryController); + ~BatteryInfo() override; - bool Refresh() override; - + bool Refresh() override; - void UpdateScreen(); - void UpdateAnim(); + void UpdateScreen(); + void UpdateAnim(); - private: + private: + Pinetime::Controllers::Battery& batteryController; - Pinetime::Controllers::Battery& batteryController; + lv_obj_t* voltage; + lv_obj_t* percent; + lv_obj_t* charging_bar; + lv_obj_t* status; - lv_obj_t* voltage; - lv_obj_t* percent; - lv_obj_t* charging_bar; - lv_obj_t* status; - - lv_task_t* taskUpdate; - lv_task_t* taskAnim; - - int8_t animation = 0; - int8_t batteryPercent = -1; - float batteryVoltage = 0.0f; + lv_task_t* taskUpdate; + lv_task_t* taskAnim; + int8_t animation = 0; + int8_t batteryPercent = -1; + float batteryVoltage = 0.0f; }; } } diff --git a/src/displayapp/screens/BleIcon.cpp b/src/displayapp/screens/BleIcon.cpp index 1bbbd053..da3d15e7 100644 --- a/src/displayapp/screens/BleIcon.cpp +++ b/src/displayapp/screens/BleIcon.cpp @@ -3,6 +3,8 @@ using namespace Pinetime::Applications::Screens; const char* BleIcon::GetIcon(bool isConnected) { - if(isConnected) return Symbols::bluetooth; - else return ""; + if (isConnected) + return Symbols::bluetooth; + else + return ""; } \ No newline at end of file diff --git a/src/displayapp/screens/BleIcon.h b/src/displayapp/screens/BleIcon.h index c1398d2a..5fe139aa 100644 --- a/src/displayapp/screens/BleIcon.h +++ b/src/displayapp/screens/BleIcon.h @@ -4,7 +4,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class BleIcon { - public: + public: static const char* GetIcon(bool isConnected); }; } diff --git a/src/displayapp/screens/Brightness.cpp b/src/displayapp/screens/Brightness.cpp index 38469cf5..47c10561 100644 --- a/src/displayapp/screens/Brightness.cpp +++ b/src/displayapp/screens/Brightness.cpp @@ -3,14 +3,15 @@ using namespace Pinetime::Applications::Screens; -void slider_event_cb(lv_obj_t * slider, lv_event_t event) { - if(event == LV_EVENT_VALUE_CHANGED) { +void slider_event_cb(lv_obj_t* slider, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { auto* brightnessSlider = static_cast(slider->user_data); brightnessSlider->OnValueChanged(); } } -Brightness::Brightness(Pinetime::Applications::DisplayApp *app, Controllers::BrightnessController& brightness) : Screen(app), brightness{brightness} { +Brightness::Brightness(Pinetime::Applications::DisplayApp* app, Controllers::BrightnessController& brightness) + : Screen(app), brightness {brightness} { slider = lv_slider_create(lv_scr_act(), nullptr); lv_obj_set_user_data(slider, this); lv_obj_set_width(slider, LV_DPI * 2); @@ -33,13 +34,18 @@ bool Brightness::Refresh() { return running; } -const char *Brightness::LevelToString(Pinetime::Controllers::BrightnessController::Levels level) { - switch(level) { - case Pinetime::Controllers::BrightnessController::Levels::Off: return "Off"; - case Pinetime::Controllers::BrightnessController::Levels::Low: return "Low"; - case Pinetime::Controllers::BrightnessController::Levels::Medium: return "Medium"; - case Pinetime::Controllers::BrightnessController::Levels::High: return "High"; - default : return "???"; +const char* Brightness::LevelToString(Pinetime::Controllers::BrightnessController::Levels level) { + switch (level) { + case Pinetime::Controllers::BrightnessController::Levels::Off: + return "Off"; + case Pinetime::Controllers::BrightnessController::Levels::Low: + return "Low"; + case Pinetime::Controllers::BrightnessController::Levels::Medium: + return "Medium"; + case Pinetime::Controllers::BrightnessController::Levels::High: + return "High"; + default: + return "???"; } } @@ -48,29 +54,40 @@ void Brightness::OnValueChanged() { } void Brightness::SetValue(uint8_t value) { - switch(value) { - case 0: brightness.Set(Controllers::BrightnessController::Levels::Low); break; - case 1: brightness.Set(Controllers::BrightnessController::Levels::Medium); break; - case 2: brightness.Set(Controllers::BrightnessController::Levels::High); break; + switch (value) { + case 0: + brightness.Set(Controllers::BrightnessController::Levels::Low); + break; + case 1: + brightness.Set(Controllers::BrightnessController::Levels::Medium); + break; + case 2: + brightness.Set(Controllers::BrightnessController::Levels::High); + break; } lv_label_set_text(slider_label, LevelToString(brightness.Level())); } uint8_t Brightness::LevelToInt(Pinetime::Controllers::BrightnessController::Levels level) { - switch(level) { - case Pinetime::Controllers::BrightnessController::Levels::Off: return 0; - case Pinetime::Controllers::BrightnessController::Levels::Low: return 0; - case Pinetime::Controllers::BrightnessController::Levels::Medium: return 1; - case Pinetime::Controllers::BrightnessController::Levels::High: return 2; - default : return 0; + switch (level) { + case Pinetime::Controllers::BrightnessController::Levels::Off: + return 0; + case Pinetime::Controllers::BrightnessController::Levels::Low: + return 0; + case Pinetime::Controllers::BrightnessController::Levels::Medium: + return 1; + case Pinetime::Controllers::BrightnessController::Levels::High: + return 2; + default: + return 0; } } bool Brightness::OnTouchEvent(Pinetime::Applications::TouchEvents event) { - switch(event) { + switch (event) { case TouchEvents::SwipeLeft: brightness.Lower(); - if ( brightness.Level() == Pinetime::Controllers::BrightnessController::Levels::Off) { + if (brightness.Level() == Pinetime::Controllers::BrightnessController::Levels::Off) { brightness.Set(Controllers::BrightnessController::Levels::Low); } SetValue(); diff --git a/src/displayapp/screens/Brightness.h b/src/displayapp/screens/Brightness.h index 60b33cfd..e2a5e7a1 100644 --- a/src/displayapp/screens/Brightness.h +++ b/src/displayapp/screens/Brightness.h @@ -9,25 +9,25 @@ namespace Pinetime { namespace Applications { namespace Screens { class Brightness : public Screen { - public: - Brightness(DisplayApp* app, Controllers::BrightnessController& brightness); - ~Brightness() override; - bool Refresh() override; - - bool OnTouchEvent(TouchEvents event) override; + public: + Brightness(DisplayApp* app, Controllers::BrightnessController& brightness); + ~Brightness() override; + bool Refresh() override; - void OnValueChanged(); - private: - - Controllers::BrightnessController& brightness; + bool OnTouchEvent(TouchEvents event) override; - lv_obj_t * slider_label; - lv_obj_t * slider; + void OnValueChanged(); - const char* LevelToString(Controllers::BrightnessController::Levels level); - uint8_t LevelToInt(Controllers::BrightnessController::Levels level); - void SetValue(uint8_t value); - void SetValue(); + private: + Controllers::BrightnessController& brightness; + + lv_obj_t* slider_label; + lv_obj_t* slider; + + const char* LevelToString(Controllers::BrightnessController::Levels level); + uint8_t LevelToInt(Controllers::BrightnessController::Levels level); + void SetValue(uint8_t value); + void SetValue(); }; } } diff --git a/src/displayapp/screens/Clock.cpp b/src/displayapp/screens/Clock.cpp index c218aa5c..14299840 100644 --- a/src/displayapp/screens/Clock.cpp +++ b/src/displayapp/screens/Clock.cpp @@ -15,45 +15,48 @@ #include "WatchFaceDigital.h" #include "WatchFaceAnalog.h" - using namespace Pinetime::Applications::Screens; Clock::Clock(DisplayApp* app, - Controllers::DateTime& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, - Controllers::Settings &settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController) : Screen(app), - dateTimeController{dateTimeController}, batteryController{batteryController}, - bleController{bleController}, notificatioManager{notificatioManager}, - settingsController{settingsController}, - heartRateController{heartRateController}, - motionController{motionController}, - screens{app, - settingsController.GetClockFace(), - { - [this]() -> std::unique_ptr { return WatchFaceDigitalScreen(); }, - [this]() -> std::unique_ptr { return WatchFaceAnalogScreen(); }, - // Examples for more watch faces - //[this]() -> std::unique_ptr { return WatchFaceMinimalScreen(); }, - //[this]() -> std::unique_ptr { return WatchFaceCustomScreen(); } - }, - Screens::ScreenListModes::LongPress - } { + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController) + : Screen(app), + dateTimeController {dateTimeController}, + batteryController {batteryController}, + bleController {bleController}, + notificatioManager {notificatioManager}, + settingsController {settingsController}, + heartRateController {heartRateController}, + motionController {motionController}, + screens {app, + settingsController.GetClockFace(), + { + [this]() -> std::unique_ptr { + return WatchFaceDigitalScreen(); + }, + [this]() -> std::unique_ptr { + return WatchFaceAnalogScreen(); + }, + // Examples for more watch faces + //[this]() -> std::unique_ptr { return WatchFaceMinimalScreen(); }, + //[this]() -> std::unique_ptr { return WatchFaceCustomScreen(); } + }, + Screens::ScreenListModes::LongPress} { - settingsController.SetAppMenu(0); - - } + settingsController.SetAppMenu(0); +} Clock::~Clock() { lv_obj_clean(lv_scr_act()); } - -bool Clock::Refresh() { - screens.Refresh(); +bool Clock::Refresh() { + screens.Refresh(); return running; } @@ -61,21 +64,31 @@ bool Clock::OnTouchEvent(Pinetime::Applications::TouchEvents event) { return screens.OnTouchEvent(event); } -std::unique_ptr Clock::WatchFaceDigitalScreen() { - return std::make_unique(app, dateTimeController, batteryController, bleController, notificatioManager, settingsController, heartRateController, motionController); +std::unique_ptr Clock::WatchFaceDigitalScreen() { + return std::make_unique(app, + dateTimeController, + batteryController, + bleController, + notificatioManager, + settingsController, + heartRateController, + motionController); } -std::unique_ptr Clock::WatchFaceAnalogScreen() { - return std::make_unique(app, dateTimeController, batteryController, bleController, notificatioManager, settingsController); +std::unique_ptr Clock::WatchFaceAnalogScreen() { + return std::make_unique( + app, dateTimeController, batteryController, bleController, notificatioManager, settingsController); } /* // Examples for more watch faces -std::unique_ptr Clock::WatchFaceMinimalScreen() { - return std::make_unique(app, dateTimeController, batteryController, bleController, notificatioManager, settingsController); +std::unique_ptr Clock::WatchFaceMinimalScreen() { + return std::make_unique(app, dateTimeController, batteryController, bleController, notificatioManager, +settingsController); } -std::unique_ptr Clock::WatchFaceCustomScreen() { - return std::make_unique(app, dateTimeController, batteryController, bleController, notificatioManager, settingsController); +std::unique_ptr Clock::WatchFaceCustomScreen() { + return std::make_unique(app, dateTimeController, batteryController, bleController, notificatioManager, +settingsController); } */ \ No newline at end of file diff --git a/src/displayapp/screens/Clock.h b/src/displayapp/screens/Clock.h index 1a4e0ebd..ef008c8d 100644 --- a/src/displayapp/screens/Clock.h +++ b/src/displayapp/screens/Clock.h @@ -23,42 +23,37 @@ namespace Pinetime { namespace Applications { namespace Screens { class Clock : public Screen { - public: - Clock(DisplayApp* app, - Controllers::DateTime& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, - Controllers::Settings &settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController); - ~Clock() override; + public: + Clock(DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController); + ~Clock() override; - bool Refresh() override; - - bool OnTouchEvent(TouchEvents event) override; + bool Refresh() override; - private: + bool OnTouchEvent(TouchEvents event) override; - Controllers::DateTime& dateTimeController; - Controllers::Battery& batteryController; - Controllers::Ble& bleController; - Controllers::NotificationManager& notificatioManager; - Controllers::Settings& settingsController; - Controllers::HeartRateController& heartRateController; - Controllers::MotionController& motionController; + private: + Controllers::DateTime& dateTimeController; + Controllers::Battery& batteryController; + Controllers::Ble& bleController; + Controllers::NotificationManager& notificatioManager; + Controllers::Settings& settingsController; + Controllers::HeartRateController& heartRateController; + Controllers::MotionController& motionController; + ScreenList<2> screens; + std::unique_ptr WatchFaceDigitalScreen(); + std::unique_ptr WatchFaceAnalogScreen(); - ScreenList<2> screens; - std::unique_ptr WatchFaceDigitalScreen(); - std::unique_ptr WatchFaceAnalogScreen(); - - // Examples for more watch faces - //std::unique_ptr WatchFaceMinimalScreen(); - //std::unique_ptr WatchFaceCustomScreen(); - - - + // Examples for more watch faces + // std::unique_ptr WatchFaceMinimalScreen(); + // std::unique_ptr WatchFaceCustomScreen(); }; } } diff --git a/src/displayapp/screens/DropDownDemo.cpp b/src/displayapp/screens/DropDownDemo.cpp index c3ec5d7d..9043c20d 100644 --- a/src/displayapp/screens/DropDownDemo.cpp +++ b/src/displayapp/screens/DropDownDemo.cpp @@ -5,20 +5,21 @@ using namespace Pinetime::Applications::Screens; -DropDownDemo::DropDownDemo(Pinetime::Applications::DisplayApp *app) : Screen(app) { +DropDownDemo::DropDownDemo(Pinetime::Applications::DisplayApp* app) : Screen(app) { // Create the dropdown object, with many item, and fix its height ddlist = lv_ddlist_create(lv_scr_act(), nullptr); - lv_ddlist_set_options(ddlist, "Apple\n" - "Banana\n" - "Orange\n" - "Melon\n" - "Grape\n" - "Raspberry\n" - "A\n" - "B\n" - "C\n" - "D\n" - "E"); + lv_ddlist_set_options(ddlist, + "Apple\n" + "Banana\n" + "Orange\n" + "Melon\n" + "Grape\n" + "Raspberry\n" + "A\n" + "B\n" + "C\n" + "D\n" + "E"); lv_ddlist_set_fix_width(ddlist, 150); lv_ddlist_set_draw_arrow(ddlist, true); lv_ddlist_set_fix_height(ddlist, 150); @@ -32,12 +33,12 @@ DropDownDemo::~DropDownDemo() { } bool DropDownDemo::Refresh() { - auto* list = static_cast(ddlist->ext_attr); + auto* list = static_cast(ddlist->ext_attr); // Switch touchmode to Polling if the dropdown is opened. This will allow to scroll inside the // dropdown while it is opened. // Disable the polling mode when the dropdown is closed to be able to handle the gestures. - if(list->opened) + if (list->opened) app->SetTouchMode(DisplayApp::TouchModes::Polling); else app->SetTouchMode(DisplayApp::TouchModes::Gestures); @@ -47,11 +48,10 @@ bool DropDownDemo::Refresh() { bool DropDownDemo::OnTouchEvent(Pinetime::Applications::TouchEvents event) { // If the dropdown is opened, notify Display app that it doesn't need to handle the event // (this will prevent displayApp from going back to the menu or clock scree). - auto* list = static_cast(ddlist->ext_attr); - if(list->opened) { + auto* list = static_cast(ddlist->ext_attr); + if (list->opened) { return true; } else { return false; } } - diff --git a/src/displayapp/screens/DropDownDemo.h b/src/displayapp/screens/DropDownDemo.h index 821ae528..94be89e4 100644 --- a/src/displayapp/screens/DropDownDemo.h +++ b/src/displayapp/screens/DropDownDemo.h @@ -9,18 +9,18 @@ namespace Pinetime { namespace Screens { class DropDownDemo : public Screen { - public: - DropDownDemo(DisplayApp* app); - ~DropDownDemo() override; + public: + DropDownDemo(DisplayApp* app); + ~DropDownDemo() override; - bool Refresh() override; - - bool OnTouchEvent(TouchEvents event) override; + bool Refresh() override; - private: - lv_obj_t * ddlist; - - bool isDropDownOpened = false; + bool OnTouchEvent(TouchEvents event) override; + + private: + lv_obj_t* ddlist; + + bool isDropDownOpened = false; }; } } diff --git a/src/displayapp/screens/FirmwareUpdate.cpp b/src/displayapp/screens/FirmwareUpdate.cpp index 26cc9a9c..1ca9d7ce 100644 --- a/src/displayapp/screens/FirmwareUpdate.cpp +++ b/src/displayapp/screens/FirmwareUpdate.cpp @@ -5,9 +5,8 @@ using namespace Pinetime::Applications::Screens; - -FirmwareUpdate::FirmwareUpdate(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Ble& bleController) : - Screen(app), bleController{bleController} { +FirmwareUpdate::FirmwareUpdate(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Ble& bleController) + : Screen(app), bleController {bleController} { lv_obj_t * backgroundLabel = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); @@ -38,21 +37,21 @@ FirmwareUpdate::~FirmwareUpdate() { } bool FirmwareUpdate::Refresh() { - switch(bleController.State()) { + switch (bleController.State()) { default: case Pinetime::Controllers::Ble::FirmwareUpdateStates::Idle: case Pinetime::Controllers::Ble::FirmwareUpdateStates::Running: - if(state != States::Running) + if (state != States::Running) state = States::Running; return DisplayProgression(); case Pinetime::Controllers::Ble::FirmwareUpdateStates::Validated: - if(state != States::Validated) { + if (state != States::Validated) { UpdateValidated(); state = States::Validated; } return running; case Pinetime::Controllers::Ble::FirmwareUpdateStates::Error: - if(state != States::Error) { + if (state != States::Error) { UpdateError(); state = States::Error; } diff --git a/src/displayapp/screens/FirmwareUpdate.h b/src/displayapp/screens/FirmwareUpdate.h index 27be3631..7e642477 100644 --- a/src/displayapp/screens/FirmwareUpdate.h +++ b/src/displayapp/screens/FirmwareUpdate.h @@ -10,29 +10,28 @@ namespace Pinetime { namespace Applications { namespace Screens { - class FirmwareUpdate : public Screen{ - public: - FirmwareUpdate(DisplayApp* app, Pinetime::Controllers::Ble& bleController); - ~FirmwareUpdate() override; + class FirmwareUpdate : public Screen { + public: + FirmwareUpdate(DisplayApp* app, Pinetime::Controllers::Ble& bleController); + ~FirmwareUpdate() override; - bool Refresh() override; - + bool Refresh() override; - private: - enum class States { Idle, Running, Validated, Error }; - Pinetime::Controllers::Ble& bleController; - lv_obj_t* bar1; - lv_obj_t* percentLabel; - lv_obj_t* titleLabel; - mutable char percentStr[10]; - - States state; + private: + enum class States { Idle, Running, Validated, Error }; + Pinetime::Controllers::Ble& bleController; + lv_obj_t* bar1; + lv_obj_t* percentLabel; + lv_obj_t* titleLabel; + mutable char percentStr[10]; - bool DisplayProgression() const; + States state; - void UpdateValidated(); + bool DisplayProgression() const; - void UpdateError(); + void UpdateValidated(); + + void UpdateError(); }; } } diff --git a/src/displayapp/screens/FirmwareValidation.cpp b/src/displayapp/screens/FirmwareValidation.cpp index f78b1a67..873a22f5 100644 --- a/src/displayapp/screens/FirmwareValidation.cpp +++ b/src/displayapp/screens/FirmwareValidation.cpp @@ -7,23 +7,20 @@ using namespace Pinetime::Applications::Screens; namespace { - static void ButtonEventHandler(lv_obj_t * obj, lv_event_t event) - { - FirmwareValidation* screen = static_cast(obj->user_data); + static void ButtonEventHandler(lv_obj_t* obj, lv_event_t event) { + FirmwareValidation* screen = static_cast(obj->user_data); screen->OnButtonEvent(obj, event); } } -FirmwareValidation::FirmwareValidation(Pinetime::Applications::DisplayApp *app, - Pinetime::Controllers::FirmwareValidator &validator) - : Screen{app}, validator{validator} { +FirmwareValidation::FirmwareValidation(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::FirmwareValidator& validator) + : Screen {app}, validator {validator} { labelVersionInfo = lv_label_create(lv_scr_act(), nullptr); lv_obj_align(labelVersionInfo, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0); lv_label_set_text(labelVersionInfo, "Version : "); lv_label_set_align(labelVersionInfo, LV_LABEL_ALIGN_LEFT); - labelVersionValue = lv_label_create(lv_scr_act(), nullptr); lv_obj_align(labelVersionValue, labelVersionInfo, LV_ALIGN_OUT_RIGHT_MID, 0, 0); lv_label_set_recolor(labelVersionValue, true); @@ -36,11 +33,10 @@ FirmwareValidation::FirmwareValidation(Pinetime::Applications::DisplayApp *app, lv_label_set_long_mode(labelIsValidated, LV_LABEL_LONG_BREAK); lv_obj_set_width(labelIsValidated, 240); - if(validator.IsValidated()) + if (validator.IsValidated()) lv_label_set_text(labelIsValidated, "You have already\n#00ff00 validated# this firmware#"); else { - lv_label_set_text(labelIsValidated, - "Please #00ff00 Validate# this version or\n#ff0000 Reset# to rollback to the previous version."); + lv_label_set_text(labelIsValidated, "Please #00ff00 Validate# this version or\n#ff0000 Reset# to rollback to the previous version."); buttonValidate = lv_btn_create(lv_scr_act(), nullptr); lv_obj_align(buttonValidate, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); @@ -49,19 +45,18 @@ FirmwareValidation::FirmwareValidation(Pinetime::Applications::DisplayApp *app, lv_obj_set_style_local_bg_color(buttonValidate, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x009900)); labelButtonValidate = lv_label_create(buttonValidate, nullptr); - lv_label_set_text_static(labelButtonValidate, "Validate"); + lv_label_set_text_static(labelButtonValidate, "Validate"); buttonReset = lv_btn_create(lv_scr_act(), nullptr); buttonReset->user_data = this; lv_obj_align(buttonReset, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); lv_obj_set_style_local_bg_color(buttonReset, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x990000)); lv_obj_set_event_cb(buttonReset, ButtonEventHandler); - - labelButtonReset = lv_label_create(buttonReset, nullptr); - lv_label_set_text_static(labelButtonReset, "Reset"); - } -} + labelButtonReset = lv_label_create(buttonReset, nullptr); + lv_label_set_text_static(labelButtonReset, "Reset"); + } +} FirmwareValidation::~FirmwareValidation() { lv_obj_clean(lv_scr_act()); @@ -71,12 +66,11 @@ bool FirmwareValidation::Refresh() { return running; } -void FirmwareValidation::OnButtonEvent(lv_obj_t *object, lv_event_t event) { - if(object == buttonValidate && event == LV_EVENT_PRESSED) { +void FirmwareValidation::OnButtonEvent(lv_obj_t* object, lv_event_t event) { + if (object == buttonValidate && event == LV_EVENT_PRESSED) { validator.Validate(); - running = false; - } else if(object == buttonReset && event == LV_EVENT_PRESSED) { + running = false; + } else if (object == buttonReset && event == LV_EVENT_PRESSED) { validator.Reset(); } - } diff --git a/src/displayapp/screens/FirmwareValidation.h b/src/displayapp/screens/FirmwareValidation.h index b83f8238..f35a86b5 100644 --- a/src/displayapp/screens/FirmwareValidation.h +++ b/src/displayapp/screens/FirmwareValidation.h @@ -11,28 +11,26 @@ namespace Pinetime { namespace Applications { namespace Screens { - class FirmwareValidation : public Screen{ - public: - FirmwareValidation(DisplayApp* app, Pinetime::Controllers::FirmwareValidator& validator); - ~FirmwareValidation() override; + class FirmwareValidation : public Screen { + public: + FirmwareValidation(DisplayApp* app, Pinetime::Controllers::FirmwareValidator& validator); + ~FirmwareValidation() override; - bool Refresh() override; - + bool Refresh() override; - void OnButtonEvent(lv_obj_t *object, lv_event_t event); + void OnButtonEvent(lv_obj_t* object, lv_event_t event); - private: - Pinetime::Controllers::FirmwareValidator& validator; + private: + Pinetime::Controllers::FirmwareValidator& validator; - lv_obj_t* labelVersionInfo; - lv_obj_t* labelVersionValue; - char version[9]; - lv_obj_t* labelIsValidated; - lv_obj_t* buttonValidate; - lv_obj_t* labelButtonValidate; - lv_obj_t* buttonReset; - lv_obj_t* labelButtonReset; - + lv_obj_t* labelVersionInfo; + lv_obj_t* labelVersionValue; + char version[9]; + lv_obj_t* labelIsValidated; + lv_obj_t* buttonValidate; + lv_obj_t* labelButtonValidate; + lv_obj_t* buttonReset; + lv_obj_t* labelButtonReset; }; } } diff --git a/src/displayapp/screens/FlashLight.cpp b/src/displayapp/screens/FlashLight.cpp index 0ef1b333..4568db40 100644 --- a/src/displayapp/screens/FlashLight.cpp +++ b/src/displayapp/screens/FlashLight.cpp @@ -5,46 +5,43 @@ using namespace Pinetime::Applications::Screens; namespace { - static void event_handler(lv_obj_t * obj, lv_event_t event) { - FlashLight* screen = static_cast(obj->user_data); + static void event_handler(lv_obj_t* obj, lv_event_t event) { + FlashLight* screen = static_cast(obj->user_data); screen->OnClickEvent(obj, event); } } -FlashLight::FlashLight( - Pinetime::Applications::DisplayApp *app, - System::SystemTask &systemTask, - Controllers::BrightnessController& brightness) : - Screen(app), - systemTask{systemTask}, - brightness{brightness} - +FlashLight::FlashLight(Pinetime::Applications::DisplayApp* app, + System::SystemTask& systemTask, + Controllers::BrightnessController& brightness) + : Screen(app), + systemTask {systemTask}, + brightness {brightness} + { brightness.Backup(); brightness.Set(Controllers::BrightnessController::Levels::High); // Set the background lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xFFFFFF)); - - flashLight = lv_label_create(lv_scr_act(), NULL); + + flashLight = lv_label_create(lv_scr_act(), NULL); lv_obj_set_style_local_text_color(flashLight, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000)); lv_obj_set_style_local_text_font(flashLight, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); lv_label_set_text_static(flashLight, Symbols::highlight); lv_obj_align(flashLight, NULL, LV_ALIGN_CENTER, 0, 0); - backgroundAction = lv_label_create(lv_scr_act(), nullptr); + backgroundAction = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(backgroundAction, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundAction, 240, 240); lv_obj_set_pos(backgroundAction, 0, 0); lv_label_set_text(backgroundAction, ""); lv_obj_set_click(backgroundAction, true); - backgroundAction->user_data = this; + backgroundAction->user_data = this; lv_obj_set_event_cb(backgroundAction, event_handler); - + systemTask.PushMessage(Pinetime::System::SystemTask::Messages::DisableSleeping); - } - FlashLight::~FlashLight() { lv_obj_clean(lv_scr_act()); lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000)); @@ -52,19 +49,18 @@ FlashLight::~FlashLight() { systemTask.PushMessage(Pinetime::System::SystemTask::Messages::EnableSleeping); } -void FlashLight::OnClickEvent(lv_obj_t *obj, lv_event_t event) { - if(obj == backgroundAction) { +void FlashLight::OnClickEvent(lv_obj_t* obj, lv_event_t event) { + if (obj == backgroundAction) { if (event == LV_EVENT_CLICKED) { isOn = !isOn; - if ( isOn ) { + if (isOn) { lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xFFFFFF)); lv_obj_set_style_local_text_color(flashLight, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000)); } else { lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000)); lv_obj_set_style_local_text_color(flashLight, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xFFFFFF)); } - } } } @@ -76,4 +72,3 @@ bool FlashLight::Refresh() { bool FlashLight::OnTouchEvent(Pinetime::Applications::TouchEvents event) { return true; } - diff --git a/src/displayapp/screens/FlashLight.h b/src/displayapp/screens/FlashLight.h index c62472ab..5bd188de 100644 --- a/src/displayapp/screens/FlashLight.h +++ b/src/displayapp/screens/FlashLight.h @@ -6,30 +6,28 @@ #include "systemtask/SystemTask.h" #include "components/brightness/BrightnessController.h" - namespace Pinetime { - + namespace Applications { namespace Screens { - class FlashLight : public Screen{ - public: - FlashLight(DisplayApp* app, System::SystemTask &systemTask, Controllers::BrightnessController& brightness); - ~FlashLight() override; + class FlashLight : public Screen { + public: + FlashLight(DisplayApp* app, System::SystemTask& systemTask, Controllers::BrightnessController& brightness); + ~FlashLight() override; - bool Refresh() override; - - bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; - void OnClickEvent(lv_obj_t *obj, lv_event_t event); + bool Refresh() override; - private: - Pinetime::System::SystemTask& systemTask; - Controllers::BrightnessController& brightness; + bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; + void OnClickEvent(lv_obj_t* obj, lv_event_t event); - lv_obj_t* flashLight; - lv_obj_t* backgroundAction; - bool isOn = true; + private: + Pinetime::System::SystemTask& systemTask; + Controllers::BrightnessController& brightness; + lv_obj_t* flashLight; + lv_obj_t* backgroundAction; + bool isOn = true; }; } } diff --git a/src/displayapp/screens/HeartRate.cpp b/src/displayapp/screens/HeartRate.cpp index e735c18d..90f6bc26 100644 --- a/src/displayapp/screens/HeartRate.cpp +++ b/src/displayapp/screens/HeartRate.cpp @@ -7,7 +7,7 @@ using namespace Pinetime::Applications::Screens; namespace { - const char *ToString(Pinetime::Controllers::HeartRateController::States s) { + const char* ToString(Pinetime::Controllers::HeartRateController::States s) { switch (s) { case Pinetime::Controllers::HeartRateController::States::NotEnoughData: return "Not enough data,\nplease wait..."; @@ -21,35 +21,37 @@ namespace { return ""; } - static void btnStartStopEventHandler(lv_obj_t *obj, lv_event_t event) { - HeartRate *screen = static_cast(obj->user_data); + static void btnStartStopEventHandler(lv_obj_t* obj, lv_event_t event) { + HeartRate* screen = static_cast(obj->user_data); screen->OnStartStopEvent(event); } } -HeartRate::HeartRate(Pinetime::Applications::DisplayApp *app, Controllers::HeartRateController& heartRateController, System::SystemTask &systemTask) : - Screen(app), heartRateController{heartRateController}, systemTask{systemTask} { +HeartRate::HeartRate(Pinetime::Applications::DisplayApp* app, + Controllers::HeartRateController& heartRateController, + System::SystemTask& systemTask) + : Screen(app), heartRateController {heartRateController}, systemTask {systemTask} { bool isHrRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; label_hr = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); - if(isHrRunning) + if (isHrRunning) lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); else lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_label_set_text(label_hr, "000"); - lv_obj_align(label_hr, nullptr, LV_ALIGN_CENTER, 0, -40); + lv_obj_align(label_hr, nullptr, LV_ALIGN_CENTER, 0, -40); label_bpm = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text(label_bpm, "Heart rate BPM"); + lv_label_set_text(label_bpm, "Heart rate BPM"); lv_obj_align(label_bpm, label_hr, LV_ALIGN_OUT_TOP_MID, 0, -20); label_status = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(label_status, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x222222)); lv_label_set_text(label_status, ToString(Pinetime::Controllers::HeartRateController::States::NotEnoughData)); - + lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); btn_startStop = lv_btn_create(lv_scr_act(), nullptr); @@ -60,7 +62,7 @@ HeartRate::HeartRate(Pinetime::Applications::DisplayApp *app, Controllers::Heart label_startStop = lv_label_create(btn_startStop, nullptr); UpdateStartStopButton(isHrRunning); - if(isHrRunning) + if (isHrRunning) systemTask.PushMessage(Pinetime::System::SystemTask::Messages::DisableSleeping); } @@ -72,10 +74,10 @@ HeartRate::~HeartRate() { bool HeartRate::Refresh() { auto state = heartRateController.State(); - switch(state) { + switch (state) { case Controllers::HeartRateController::States::NoTouch: case Controllers::HeartRateController::States::NotEnoughData: - //case Controllers::HeartRateController::States::Stopped: + // case Controllers::HeartRateController::States::Stopped: lv_label_set_text(label_hr, "000"); break; default: @@ -90,13 +92,12 @@ bool HeartRate::Refresh() { void HeartRate::OnStartStopEvent(lv_event_t event) { if (event == LV_EVENT_CLICKED) { - if(heartRateController.State() == Controllers::HeartRateController::States::Stopped) { + if (heartRateController.State() == Controllers::HeartRateController::States::Stopped) { heartRateController.Start(); UpdateStartStopButton(heartRateController.State() != Controllers::HeartRateController::States::Stopped); systemTask.PushMessage(Pinetime::System::SystemTask::Messages::DisableSleeping); lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); - } - else { + } else { heartRateController.Stop(); UpdateStartStopButton(heartRateController.State() != Controllers::HeartRateController::States::Stopped); systemTask.PushMessage(Pinetime::System::SystemTask::Messages::EnableSleeping); @@ -106,7 +107,7 @@ void HeartRate::OnStartStopEvent(lv_event_t event) { } void HeartRate::UpdateStartStopButton(bool isRunning) { - if(isRunning) + if (isRunning) lv_label_set_text(label_startStop, "Stop"); else lv_label_set_text(label_startStop, "Start"); diff --git a/src/displayapp/screens/HeartRate.h b/src/displayapp/screens/HeartRate.h index c8f36999..25be427f 100644 --- a/src/displayapp/screens/HeartRate.h +++ b/src/displayapp/screens/HeartRate.h @@ -15,16 +15,16 @@ namespace Pinetime { namespace Applications { namespace Screens { - class HeartRate : public Screen{ - public: - HeartRate(DisplayApp* app, Controllers::HeartRateController& HeartRateController, System::SystemTask &systemTask); + class HeartRate : public Screen { + public: + HeartRate(DisplayApp* app, Controllers::HeartRateController& HeartRateController, System::SystemTask& systemTask); ~HeartRate() override; bool Refresh() override; - + void OnStartStopEvent(lv_event_t event); - private: + private: Controllers::HeartRateController& heartRateController; Pinetime::System::SystemTask& systemTask; void UpdateStartStopButton(bool isRunning); @@ -33,9 +33,6 @@ namespace Pinetime { lv_obj_t* label_status; lv_obj_t* btn_startStop; lv_obj_t* label_startStop; - - - }; } } diff --git a/src/displayapp/screens/InfiniPaint.cpp b/src/displayapp/screens/InfiniPaint.cpp index b6a7e3e4..32240084 100644 --- a/src/displayapp/screens/InfiniPaint.cpp +++ b/src/displayapp/screens/InfiniPaint.cpp @@ -4,7 +4,7 @@ using namespace Pinetime::Applications::Screens; -InfiniPaint::InfiniPaint(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl{lvgl} { +InfiniPaint::InfiniPaint(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl {lvgl} { app->SetTouchMode(DisplayApp::TouchModes::Polling); std::fill(b, b + bufferSize, selectColor); } @@ -20,8 +20,8 @@ bool InfiniPaint::Refresh() { } bool InfiniPaint::OnTouchEvent(Pinetime::Applications::TouchEvents event) { - switch(event) { - case Pinetime::Applications::TouchEvents::LongTap: + switch (event) { + case Pinetime::Applications::TouchEvents::LongTap: switch (color) { case 0: selectColor = LV_COLOR_MAGENTA; @@ -47,13 +47,13 @@ bool InfiniPaint::OnTouchEvent(Pinetime::Applications::TouchEvents event) { case 7: selectColor = LV_COLOR_BLACK; break; - + default: color = 0; break; } - std::fill(b, b + bufferSize, selectColor); + std::fill(b, b + bufferSize, selectColor); color++; return true; default: @@ -72,4 +72,3 @@ bool InfiniPaint::OnTouchEvent(uint16_t x, uint16_t y) { lvgl.FlushDisplay(&area, b); return true; } - diff --git a/src/displayapp/screens/InfiniPaint.h b/src/displayapp/screens/InfiniPaint.h index da9c39ba..220212b1 100644 --- a/src/displayapp/screens/InfiniPaint.h +++ b/src/displayapp/screens/InfiniPaint.h @@ -12,7 +12,7 @@ namespace Pinetime { namespace Screens { class InfiniPaint : public Screen { - public: + public: InfiniPaint(DisplayApp* app, Pinetime::Components::LittleVgl& lvgl); ~InfiniPaint() override; @@ -23,7 +23,7 @@ namespace Pinetime { bool OnTouchEvent(uint16_t x, uint16_t y) override; - private: + private: Pinetime::Components::LittleVgl& lvgl; static constexpr uint16_t width = 10; static constexpr uint16_t height = 10; @@ -31,7 +31,6 @@ namespace Pinetime { lv_color_t b[bufferSize]; lv_color_t selectColor = LV_COLOR_WHITE; uint8_t color = 2; - }; } } diff --git a/src/displayapp/screens/Label.cpp b/src/displayapp/screens/Label.cpp index cc268775..0132dbd2 100644 --- a/src/displayapp/screens/Label.cpp +++ b/src/displayapp/screens/Label.cpp @@ -2,24 +2,21 @@ using namespace Pinetime::Applications::Screens; -Label::Label(uint8_t screenID, uint8_t numScreens, - Pinetime::Applications::DisplayApp *app, lv_obj_t* labelText) : - Screen(app), - labelText{labelText} { - - if ( numScreens > 1 ) { +Label::Label(uint8_t screenID, uint8_t numScreens, Pinetime::Applications::DisplayApp* app, lv_obj_t* labelText) + : Screen(app), labelText {labelText} { + + if (numScreens > 1) { pageIndicatorBasePoints[0].x = 240 - 1; pageIndicatorBasePoints[0].y = 6; pageIndicatorBasePoints[1].x = 240 - 1; pageIndicatorBasePoints[1].y = 240 - 6; - + pageIndicatorBase = lv_line_create(lv_scr_act(), NULL); lv_obj_set_style_local_line_width(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3); lv_obj_set_style_local_line_color(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); lv_obj_set_style_local_line_rounded(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, true); lv_line_set_points(pageIndicatorBase, pageIndicatorBasePoints, 2); - uint16_t indicatorSize = 228 / numScreens; uint16_t indicatorPos = indicatorSize * screenID; @@ -34,7 +31,6 @@ Label::Label(uint8_t screenID, uint8_t numScreens, lv_obj_set_style_local_line_rounded(pageIndicator, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, true); lv_line_set_points(pageIndicator, pageIndicatorPoints, 2); } - } Label::~Label() { diff --git a/src/displayapp/screens/Label.h b/src/displayapp/screens/Label.h index a1bcba95..b648fdb6 100644 --- a/src/displayapp/screens/Label.h +++ b/src/displayapp/screens/Label.h @@ -8,23 +8,20 @@ namespace Pinetime { namespace Screens { class Label : public Screen { - public: - Label( uint8_t screenID, uint8_t numScreens, - DisplayApp* app, lv_obj_t* labelText ); - ~Label() override; - - bool Refresh() override; - + public: + Label(uint8_t screenID, uint8_t numScreens, DisplayApp* app, lv_obj_t* labelText); + ~Label() override; - private: + bool Refresh() override; - bool running = true; - - lv_obj_t * labelText = nullptr; - lv_point_t pageIndicatorBasePoints[2]; - lv_point_t pageIndicatorPoints[2]; - lv_obj_t* pageIndicatorBase; - lv_obj_t* pageIndicator; + private: + bool running = true; + + lv_obj_t* labelText = nullptr; + lv_point_t pageIndicatorBasePoints[2]; + lv_point_t pageIndicatorPoints[2]; + lv_obj_t* pageIndicatorBase; + lv_obj_t* pageIndicator; }; } } diff --git a/src/displayapp/screens/List.cpp b/src/displayapp/screens/List.cpp index 82da4d4c..b4f4d2cf 100644 --- a/src/displayapp/screens/List.cpp +++ b/src/displayapp/screens/List.cpp @@ -5,39 +5,37 @@ using namespace Pinetime::Applications::Screens; namespace { - static void ButtonEventHandler(lv_obj_t * obj, lv_event_t event) { - List* screen = static_cast(obj->user_data); + static void ButtonEventHandler(lv_obj_t* obj, lv_event_t event) { + List* screen = static_cast(obj->user_data); screen->OnButtonEvent(obj, event); } } -List::List(uint8_t screenID, uint8_t numScreens, - DisplayApp* app, - Controllers::Settings &settingsController, - std::array& applications) : - Screen(app), - settingsController{settingsController} -{ +List::List(uint8_t screenID, + uint8_t numScreens, + DisplayApp* app, + Controllers::Settings& settingsController, + std::array& applications) + : Screen(app), settingsController {settingsController} { // Set the background to Black lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(0, 0, 0)); settingsController.SetSettingsMenu(screenID); - if ( numScreens > 1 ) { + if (numScreens > 1) { pageIndicatorBasePoints[0].x = 240 - 1; pageIndicatorBasePoints[0].y = 6; pageIndicatorBasePoints[1].x = 240 - 1; pageIndicatorBasePoints[1].y = 240 - 6; - + pageIndicatorBase = lv_line_create(lv_scr_act(), NULL); lv_obj_set_style_local_line_width(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3); lv_obj_set_style_local_line_color(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); lv_obj_set_style_local_line_rounded(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, true); lv_line_set_points(pageIndicatorBase, pageIndicatorBasePoints, 2); - uint16_t indicatorSize = 228 / numScreens; uint16_t indicatorPos = indicatorSize * screenID; @@ -53,10 +51,9 @@ List::List(uint8_t screenID, uint8_t numScreens, lv_line_set_points(pageIndicator, pageIndicatorPoints, 2); } - lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); - //lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); + // lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10); lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5); @@ -67,12 +64,12 @@ List::List(uint8_t screenID, uint8_t numScreens, lv_obj_set_height(container1, LV_VER_RES); lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); - lv_obj_t * labelBt; - lv_obj_t * labelBtIco; + lv_obj_t* labelBt; + lv_obj_t* labelBtIco; - for(int i = 0; i < MAXLISTITEMS; i++) { + for (int i = 0; i < MAXLISTITEMS; i++) { apps[i] = applications[i].application; - if ( applications[i].application != Apps::None) { + if (applications[i].application != Apps::None) { itemApps[i] = lv_btn_create(container1, nullptr); lv_obj_set_style_local_bg_opa(itemApps[i], LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_20); @@ -91,19 +88,17 @@ List::List(uint8_t screenID, uint8_t numScreens, labelBt = lv_label_create(itemApps[i], nullptr); lv_label_set_text_fmt(labelBt, " %s", applications[i].name); - } } - lv_obj_t * backgroundLabel = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* backgroundLabel = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, LV_HOR_RES, LV_VER_RES); lv_obj_set_pos(backgroundLabel, 0, 0); lv_label_set_text_static(backgroundLabel, ""); - } -List::~List() { +List::~List() { lv_obj_clean(lv_scr_act()); } @@ -112,10 +107,10 @@ bool List::Refresh() { return running; } -void List::OnButtonEvent(lv_obj_t * object, lv_event_t event) { - if ( event == LV_EVENT_RELEASED ) { - for(int i = 0; i < MAXLISTITEMS; i++) { - if ( apps[i] != Apps::None && object == itemApps[i] ) { +void List::OnButtonEvent(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_RELEASED) { + for (int i = 0; i < MAXLISTITEMS; i++) { + if (apps[i] != Apps::None && object == itemApps[i]) { app->StartApp(apps[i], DisplayApp::FullRefreshDirections::Up); running = false; return; @@ -123,4 +118,3 @@ void List::OnButtonEvent(lv_obj_t * object, lv_event_t event) { } } } - diff --git a/src/displayapp/screens/List.h b/src/displayapp/screens/List.h index 739a91c3..4c2973aa 100644 --- a/src/displayapp/screens/List.h +++ b/src/displayapp/screens/List.h @@ -13,36 +13,34 @@ namespace Pinetime { namespace Applications { namespace Screens { class List : public Screen { - public: - struct Applications { - const char* icon; - const char* name; - Pinetime::Applications::Apps application; - }; + public: + struct Applications { + const char* icon; + const char* name; + Pinetime::Applications::Apps application; + }; - explicit List(uint8_t screenID, uint8_t numScreens, - DisplayApp* app, - Controllers::Settings& settingsController, - std::array& applications); - ~List() override; + explicit List(uint8_t screenID, + uint8_t numScreens, + DisplayApp* app, + Controllers::Settings& settingsController, + std::array& applications); + ~List() override; - bool Refresh() override; - + bool Refresh() override; - void OnButtonEvent(lv_obj_t *object, lv_event_t event); + void OnButtonEvent(lv_obj_t* object, lv_event_t event); - private: + private: + Controllers::Settings& settingsController; + Pinetime::Applications::Apps apps[MAXLISTITEMS]; - Controllers::Settings& settingsController; - Pinetime::Applications::Apps apps[MAXLISTITEMS]; + lv_obj_t* itemApps[MAXLISTITEMS]; - lv_obj_t * itemApps[MAXLISTITEMS]; - - lv_point_t pageIndicatorBasePoints[2]; - lv_point_t pageIndicatorPoints[2]; - lv_obj_t* pageIndicatorBase; - lv_obj_t* pageIndicator; - + lv_point_t pageIndicatorBasePoints[2]; + lv_point_t pageIndicatorPoints[2]; + lv_obj_t* pageIndicatorBase; + lv_obj_t* pageIndicator; }; } } diff --git a/src/displayapp/screens/Meter.cpp b/src/displayapp/screens/Meter.cpp index 2c042cac..e0dbdfad 100644 --- a/src/displayapp/screens/Meter.cpp +++ b/src/displayapp/screens/Meter.cpp @@ -4,35 +4,33 @@ using namespace Pinetime::Applications::Screens; - -Meter::Meter(Pinetime::Applications::DisplayApp *app) : Screen(app) { +Meter::Meter(Pinetime::Applications::DisplayApp* app) : Screen(app) { /*Create a line meter */ lmeter = lv_linemeter_create(lv_scr_act(), nullptr); - lv_linemeter_set_range(lmeter, 0, 60); /*Set the range*/ - lv_linemeter_set_value(lmeter, value); /*Set the current value*/ + lv_linemeter_set_range(lmeter, 0, 60); /*Set the range*/ + lv_linemeter_set_value(lmeter, value); /*Set the current value*/ lv_linemeter_set_angle_offset(lmeter, 180); - lv_linemeter_set_scale(lmeter, 360, 60); /*Set the angle and number of lines*/ + lv_linemeter_set_scale(lmeter, 360, 60); /*Set the angle and number of lines*/ - lv_obj_set_style_local_scale_end_color(lmeter, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(255,0,0)); - lv_obj_set_style_local_scale_grad_color(lmeter, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(160,0,0)); + lv_obj_set_style_local_scale_end_color(lmeter, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(255, 0, 0)); + lv_obj_set_style_local_scale_grad_color(lmeter, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, lv_color_make(160, 0, 0)); lv_obj_set_style_local_line_width(lmeter, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, 2); lv_obj_set_style_local_line_color(lmeter, LV_LINEMETER_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_SILVER); lv_obj_set_size(lmeter, 200, 200); lv_obj_align(lmeter, nullptr, LV_ALIGN_CENTER, 0, 0); - } Meter::~Meter() { - lv_obj_clean(lv_scr_act()); } bool Meter::Refresh() { - lv_linemeter_set_value(lmeter, value++); /*Set the current value*/ - if(value>=60) value = 0; + lv_linemeter_set_value(lmeter, value++); /*Set the current value*/ + if (value >= 60) + value = 0; return running; } diff --git a/src/displayapp/screens/Meter.h b/src/displayapp/screens/Meter.h index 6a1fc3bf..970e4233 100644 --- a/src/displayapp/screens/Meter.h +++ b/src/displayapp/screens/Meter.h @@ -9,20 +9,18 @@ namespace Pinetime { namespace Applications { namespace Screens { - class Meter : public Screen{ - public: - Meter(DisplayApp* app); - ~Meter() override; + class Meter : public Screen { + public: + Meter(DisplayApp* app); + ~Meter() override; - bool Refresh() override; + bool Refresh() override; - private: - lv_style_t style_lmeter; - lv_obj_t * lmeter; - - uint32_t value=0; - + private: + lv_style_t style_lmeter; + lv_obj_t* lmeter; + uint32_t value = 0; }; } } diff --git a/src/displayapp/screens/Motion.cpp b/src/displayapp/screens/Motion.cpp index ed4b8198..e7196267 100644 --- a/src/displayapp/screens/Motion.cpp +++ b/src/displayapp/screens/Motion.cpp @@ -6,14 +6,14 @@ using namespace Pinetime::Applications::Screens; extern lv_font_t jetbrains_mono_extrabold_compressed; extern lv_font_t jetbrains_mono_bold_20; - -Motion::Motion(Pinetime::Applications::DisplayApp *app, Controllers::MotionController& motionController) : Screen(app), motionController{motionController} { +Motion::Motion(Pinetime::Applications::DisplayApp* app, Controllers::MotionController& motionController) + : Screen(app), motionController {motionController} { chart = lv_chart_create(lv_scr_act(), NULL); lv_obj_set_size(chart, 240, 240); lv_obj_align(chart, NULL, LV_ALIGN_IN_TOP_MID, 0, 0); - lv_chart_set_type(chart, LV_CHART_TYPE_LINE); /*Show lines and points too*/ - //lv_chart_set_series_opa(chart, LV_OPA_70); /*Opacity of the data series*/ - //lv_chart_set_series_width(chart, 4); /*Line width and point radious*/ + lv_chart_set_type(chart, LV_CHART_TYPE_LINE); /*Show lines and points too*/ + // lv_chart_set_series_opa(chart, LV_OPA_70); /*Opacity of the data series*/ + // lv_chart_set_series_width(chart, 4); /*Line width and point radious*/ lv_chart_set_range(chart, -1100, 1100); lv_chart_set_update_mode(chart, LV_CHART_UPDATE_MODE_SHIFT); diff --git a/src/displayapp/screens/Motion.h b/src/displayapp/screens/Motion.h index ad1341a8..a06a5d1c 100644 --- a/src/displayapp/screens/Motion.h +++ b/src/displayapp/screens/Motion.h @@ -12,27 +12,26 @@ namespace Pinetime { namespace Applications { namespace Screens { - class Motion : public Screen{ - public: + class Motion : public Screen { + public: Motion(DisplayApp* app, Controllers::MotionController& motionController); ~Motion() override; bool Refresh() override; bool OnButtonPushed() override; - private: + private: Controllers::MotionController& motionController; - lv_obj_t * chart; - lv_chart_series_t * ser1; - lv_chart_series_t * ser2; - lv_chart_series_t * ser3; + lv_obj_t* chart; + lv_chart_series_t* ser1; + lv_chart_series_t* ser2; + lv_chart_series_t* ser3; lv_obj_t* labelStep; lv_obj_t* labelStepValue; static constexpr uint8_t nbStepsBufferSize = 9; - char nbStepsBuffer[nbStepsBufferSize+1]; + char nbStepsBuffer[nbStepsBufferSize + 1]; bool running = true; - }; } } diff --git a/src/displayapp/screens/Music.cpp b/src/displayapp/screens/Music.cpp index d8c950fa..9f10f508 100644 --- a/src/displayapp/screens/Music.cpp +++ b/src/displayapp/screens/Music.cpp @@ -26,8 +26,8 @@ using namespace Pinetime::Applications::Screens; -static void event_handler(lv_obj_t *obj, lv_event_t event) { - Music *screen = static_cast(obj->user_data); +static void event_handler(lv_obj_t* obj, lv_event_t event) { + Music* screen = static_cast(obj->user_data); screen->OnObjectEvent(obj, event); } @@ -38,7 +38,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { * @param img pointer to an image object * @param data the image array */ -inline void lv_img_set_src_arr(lv_obj_t *img, const lv_img_dsc_t *src_img) { +inline void lv_img_set_src_arr(lv_obj_t* img, const lv_img_dsc_t* src_img) { lv_img_set_src(img, src_img); } @@ -47,9 +47,9 @@ inline void lv_img_set_src_arr(lv_obj_t *img, const lv_img_dsc_t *src_img) { * * TODO: Investigate Apple Media Service and AVRCPv1.6 support for seamless integration */ -Music::Music(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::MusicService &music) : Screen(app), musicService(music) { - lv_obj_t *label; - +Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::MusicService& music) : Screen(app), musicService(music) { + lv_obj_t* label; + btnVolDown = lv_btn_create(lv_scr_act(), nullptr); btnVolDown->user_data = this; lv_obj_set_event_cb(btnVolDown, event_handler); @@ -61,7 +61,7 @@ Music::Music(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Mus label = lv_label_create(btnVolDown, nullptr); lv_label_set_text(label, Symbols::volumDown); lv_obj_set_hidden(btnVolDown, !displayVolumeButtons); - + btnVolUp = lv_btn_create(lv_scr_act(), nullptr); btnVolUp->user_data = this; lv_obj_set_event_cb(btnVolUp, event_handler); @@ -73,7 +73,7 @@ Music::Music(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Mus label = lv_label_create(btnVolUp, nullptr); lv_label_set_text(label, Symbols::volumUp); lv_obj_set_hidden(btnVolUp, !displayVolumeButtons); - + btnPrev = lv_btn_create(lv_scr_act(), nullptr); btnPrev->user_data = this; lv_obj_set_event_cb(btnPrev, event_handler); @@ -84,7 +84,7 @@ Music::Music(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Mus lv_obj_set_style_local_bg_opa(btnPrev, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_20); label = lv_label_create(btnPrev, nullptr); lv_label_set_text(label, Symbols::stepBackward); - + btnNext = lv_btn_create(lv_scr_act(), nullptr); btnNext->user_data = this; lv_obj_set_event_cb(btnNext, event_handler); @@ -95,7 +95,7 @@ Music::Music(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Mus lv_obj_set_style_local_bg_opa(btnNext, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_20); label = lv_label_create(btnNext, nullptr); lv_label_set_text(label, Symbols::stepForward); - + btnPlayPause = lv_btn_create(lv_scr_act(), nullptr); btnPlayPause->user_data = this; lv_obj_set_event_cb(btnPlayPause, event_handler); @@ -106,7 +106,7 @@ Music::Music(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Mus lv_obj_set_style_local_bg_opa(btnPlayPause, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_20); txtPlayPause = lv_label_create(btnPlayPause, nullptr); lv_label_set_text(txtPlayPause, Symbols::play); - + txtTrackDuration = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(txtTrackDuration, LV_LABEL_LONG_SROLL); lv_obj_align(txtTrackDuration, nullptr, LV_ALIGN_IN_TOP_LEFT, 12, 20); @@ -122,30 +122,29 @@ Music::Music(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Mus lv_label_set_anim_speed(txtArtist, 1); lv_obj_align(txtArtist, nullptr, LV_ALIGN_IN_LEFT_MID, 12, MIDDLE_OFFSET + 1 * FONT_HEIGHT); lv_label_set_align(txtArtist, LV_ALIGN_IN_LEFT_MID); - lv_obj_set_width(txtArtist, LV_HOR_RES-12); + lv_obj_set_width(txtArtist, LV_HOR_RES - 12); lv_label_set_text(txtArtist, "Artist Name"); - txtTrack = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(txtTrack, LV_LABEL_LONG_SROLL_CIRC); lv_label_set_anim_speed(txtTrack, 1); lv_obj_align(txtTrack, nullptr, LV_ALIGN_IN_LEFT_MID, 12, MIDDLE_OFFSET + 2 * FONT_HEIGHT + LINE_PAD); lv_label_set_align(txtTrack, LV_ALIGN_IN_LEFT_MID); - lv_obj_set_width(txtTrack, LV_HOR_RES-12); + lv_obj_set_width(txtTrack, LV_HOR_RES - 12); lv_label_set_text(txtTrack, "This is a very long getTrack name"); /** Init animation */ imgDisc = lv_img_create(lv_scr_act(), nullptr); lv_img_set_src_arr(imgDisc, &disc); lv_obj_align(imgDisc, nullptr, LV_ALIGN_IN_TOP_RIGHT, -15, 15); - + imgDiscAnim = lv_img_create(lv_scr_act(), nullptr); lv_img_set_src_arr(imgDiscAnim, &disc_f_1); lv_obj_align(imgDiscAnim, nullptr, LV_ALIGN_IN_TOP_RIGHT, -15 - 32, 15); - + frameB = false; - + musicService.event(Controllers::MusicService::EVENT_MUSIC_OPEN); } @@ -159,22 +158,22 @@ bool Music::Refresh() { currentLength = 0; lv_label_set_text(txtArtist, artist.data()); } - + if (track != musicService.getTrack()) { track = musicService.getTrack(); currentLength = 0; lv_label_set_text(txtTrack, track.data()); } - + if (album != musicService.getAlbum()) { album = musicService.getAlbum(); currentLength = 0; } - + if (playing != musicService.isPlaying()) { playing = musicService.isPlaying(); } - + // Because we increment this ourselves, // we can't compare with the old data directly // have to update it when there's actually new data @@ -184,26 +183,26 @@ bool Music::Refresh() { lastLength = currentLength; UpdateLength(); } - + if (totalLength != musicService.getTrackLength()) { totalLength = musicService.getTrackLength(); UpdateLength(); } - + if (playing == Pinetime::Controllers::MusicService::MusicStatus::Playing) { lv_label_set_text(txtPlayPause, Symbols::pause); if (xTaskGetTickCount() - 1024 >= lastIncrement) { - + if (frameB) { lv_img_set_src(imgDiscAnim, &disc_f_1); } else { lv_img_set_src(imgDiscAnim, &disc_f_2); } frameB = !frameB; - + if (currentLength < totalLength) { - currentLength += static_cast((static_cast(xTaskGetTickCount() - lastIncrement) / 1024.0f) * - musicService.getPlaybackSpeed()); + currentLength += + static_cast((static_cast(xTaskGetTickCount() - lastIncrement) / 1024.0f) * musicService.getPlaybackSpeed()); } else { // Let's assume the getTrack finished, paused when the timer ends // and there's no new getTrack being sent to us @@ -211,13 +210,13 @@ bool Music::Refresh() { playing = false; } lastIncrement = xTaskGetTickCount(); - + UpdateLength(); } } else { lv_label_set_text(txtPlayPause, Symbols::play); } - + return running; } @@ -226,26 +225,26 @@ void Music::UpdateLength() { lv_label_set_text(txtTrackDuration, "Inf/Inf"); } else if (totalLength > (99 * 60)) { char timer[12]; - sprintf(timer, "%02d:%02d/%02d:%02d", + sprintf(timer, + "%02d:%02d/%02d:%02d", (currentLength / (60 * 60)) % 100, ((currentLength % (60 * 60)) / 60) % 100, (totalLength / (60 * 60)) % 100, - ((totalLength % (60 * 60)) / 60) % 100 - ); + ((totalLength % (60 * 60)) / 60) % 100); lv_label_set_text(txtTrackDuration, timer); } else { char timer[12]; - sprintf(timer, "%02d:%02d/%02d:%02d", + sprintf(timer, + "%02d:%02d/%02d:%02d", (currentLength / 60) % 100, (currentLength % 60) % 100, (totalLength / 60) % 100, - (totalLength % 60) % 100 - ); + (totalLength % 60) % 100); lv_label_set_text(txtTrackDuration, timer); } } -void Music::OnObjectEvent(lv_obj_t *obj, lv_event_t event) { +void Music::OnObjectEvent(lv_obj_t* obj, lv_event_t event) { if (event == LV_EVENT_CLICKED) { if (obj == btnVolDown) { musicService.event(Controllers::MusicService::EVENT_MUSIC_VOLDOWN); @@ -256,12 +255,12 @@ void Music::OnObjectEvent(lv_obj_t *obj, lv_event_t event) { } else if (obj == btnPlayPause) { if (playing == Pinetime::Controllers::MusicService::MusicStatus::Playing) { musicService.event(Controllers::MusicService::EVENT_MUSIC_PAUSE); - + // Let's assume it stops playing instantly playing = Controllers::MusicService::NotPlaying; } else { musicService.event(Controllers::MusicService::EVENT_MUSIC_PLAY); - + // Let's assume it starts playing instantly // TODO: In the future should check for BT connection for better UX playing = Controllers::MusicService::Playing; @@ -272,14 +271,13 @@ void Music::OnObjectEvent(lv_obj_t *obj, lv_event_t event) { } } - bool Music::OnTouchEvent(Pinetime::Applications::TouchEvents event) { switch (event) { case TouchEvents::SwipeUp: { displayVolumeButtons = true; lv_obj_set_hidden(btnVolDown, !displayVolumeButtons); lv_obj_set_hidden(btnVolUp, !displayVolumeButtons); - + lv_obj_set_hidden(btnNext, displayVolumeButtons); lv_obj_set_hidden(btnPrev, displayVolumeButtons); return true; @@ -288,7 +286,7 @@ bool Music::OnTouchEvent(Pinetime::Applications::TouchEvents event) { displayVolumeButtons = false; lv_obj_set_hidden(btnNext, displayVolumeButtons); lv_obj_set_hidden(btnPrev, displayVolumeButtons); - + lv_obj_set_hidden(btnVolDown, !displayVolumeButtons); lv_obj_set_hidden(btnVolUp, !displayVolumeButtons); return true; diff --git a/src/displayapp/screens/Music.h b/src/displayapp/screens/Music.h index 55859811..c7da233e 100644 --- a/src/displayapp/screens/Music.h +++ b/src/displayapp/screens/Music.h @@ -30,45 +30,43 @@ namespace Pinetime { namespace Applications { namespace Screens { class Music : public Screen { - public: - Music(DisplayApp *app, Pinetime::Controllers::MusicService &music); - + public: + Music(DisplayApp* app, Pinetime::Controllers::MusicService& music); + ~Music() override; - + bool Refresh() override; - - - - void OnObjectEvent(lv_obj_t *obj, lv_event_t event); - - private: + + void OnObjectEvent(lv_obj_t* obj, lv_event_t event); + + private: bool OnTouchEvent(TouchEvents event); - + void UpdateLength(); - - lv_obj_t *btnPrev; - lv_obj_t *btnPlayPause; - lv_obj_t *btnNext; - lv_obj_t *btnVolDown; - lv_obj_t *btnVolUp; - lv_obj_t *txtArtist; - lv_obj_t *txtTrack; - lv_obj_t *txtPlayPause; - - lv_obj_t *imgDisc; - lv_obj_t *imgDiscAnim; - lv_obj_t *txtTrackDuration; - + + lv_obj_t* btnPrev; + lv_obj_t* btnPlayPause; + lv_obj_t* btnNext; + lv_obj_t* btnVolDown; + lv_obj_t* btnVolUp; + lv_obj_t* txtArtist; + lv_obj_t* txtTrack; + lv_obj_t* txtPlayPause; + + lv_obj_t* imgDisc; + lv_obj_t* imgDiscAnim; + lv_obj_t* txtTrackDuration; + /** For the spinning disc animation */ bool frameB; - + bool displayVolumeButtons = false; - Pinetime::Controllers::MusicService &musicService; - + Pinetime::Controllers::MusicService& musicService; + std::string artist; std::string album; std::string track; - + /** Total length in seconds */ int totalLength; /** Current length in seconds */ @@ -77,11 +75,10 @@ namespace Pinetime { int lastLength; /** Last time an animation update or timer was incremented */ TickType_t lastIncrement = 0; - + bool playing; - + /** Watchapp */ - }; } } diff --git a/src/displayapp/screens/Navigation.cpp b/src/displayapp/screens/Navigation.cpp index cfe60e23..fe9b5a83 100644 --- a/src/displayapp/screens/Navigation.cpp +++ b/src/displayapp/screens/Navigation.cpp @@ -28,15 +28,15 @@ LV_FONT_DECLARE(lv_font_navi_80) * Navigation watchapp * */ -Navigation::Navigation(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::NavigationService &nav) : Screen(app), navService(nav) { +Navigation::Navigation(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::NavigationService& nav) + : Screen(app), navService(nav) { - imgFlag = lv_label_create(lv_scr_act(), nullptr); + imgFlag = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(imgFlag, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_navi_80); lv_obj_set_style_local_text_color(imgFlag, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_CYAN); lv_label_set_text(imgFlag, iconForName("flag")); lv_obj_align(imgFlag, nullptr, LV_ALIGN_CENTER, 0, -60); - txtNarrative = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(txtNarrative, LV_LABEL_LONG_BREAK); lv_obj_set_width(txtNarrative, LV_HOR_RES); @@ -50,14 +50,14 @@ Navigation::Navigation(Pinetime::Applications::DisplayApp *app, Pinetime::Contro lv_obj_set_width(txtManDist, LV_HOR_RES); lv_label_set_text(txtManDist, "--M"); lv_label_set_align(txtManDist, LV_LABEL_ALIGN_CENTER); - lv_obj_align(txtManDist, nullptr, LV_ALIGN_CENTER, 0, 60); + lv_obj_align(txtManDist, nullptr, LV_ALIGN_CENTER, 0, 60); - //Route Progress + // Route Progress barProgress = lv_bar_create(lv_scr_act(), nullptr); lv_obj_set_size(barProgress, 200, 20); lv_obj_align(barProgress, nullptr, LV_ALIGN_IN_BOTTOM_MID, 0, -10); lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_BG, LV_STATE_DEFAULT, lv_color_hex(0x222222)); - lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_INDIC , LV_STATE_DEFAULT, LV_COLOR_ORANGE); + lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_ORANGE); lv_bar_set_anim_time(barProgress, 500); lv_bar_set_range(barProgress, 0, 100); lv_bar_set_value(barProgress, 0, LV_ANIM_OFF); @@ -72,7 +72,7 @@ bool Navigation::Refresh() { if (m_flag != navService.getFlag()) { m_flag = navService.getFlag(); lv_label_set_text(imgFlag, iconForName(m_flag)); - //lv_img_set_src_arr(imgFlag, iconForName(m_flag)); + // lv_img_set_src_arr(imgFlag, iconForName(m_flag)); } if (m_narrative != navService.getNarrative()) { @@ -88,10 +88,10 @@ bool Navigation::Refresh() { if (m_progress != navService.getProgress()) { m_progress = navService.getProgress(); lv_bar_set_value(barProgress, m_progress, LV_ANIM_OFF); - if ( m_progress > 90 ) { - lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_INDIC , LV_STATE_DEFAULT, LV_COLOR_RED); + if (m_progress > 90) { + lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_RED); } else { - lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_INDIC , LV_STATE_DEFAULT, LV_COLOR_ORANGE); + lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_ORANGE); } } diff --git a/src/displayapp/screens/Navigation.h b/src/displayapp/screens/Navigation.h index 53108f98..65a87047 100644 --- a/src/displayapp/screens/Navigation.h +++ b/src/displayapp/screens/Navigation.h @@ -23,7 +23,6 @@ #include "Screen.h" #include - namespace Pinetime { namespace Controllers { class NavigationService; @@ -32,20 +31,19 @@ namespace Pinetime { namespace Applications { namespace Screens { class Navigation : public Screen { - public: - Navigation(DisplayApp *app, Pinetime::Controllers::NavigationService &nav); + public: + Navigation(DisplayApp* app, Pinetime::Controllers::NavigationService& nav); ~Navigation() override; bool Refresh() override; - - private: - lv_obj_t *imgFlag; - lv_obj_t *txtNarrative; - lv_obj_t *txtManDist; - lv_obj_t *barProgress; + private: + lv_obj_t* imgFlag; + lv_obj_t* txtNarrative; + lv_obj_t* txtManDist; + lv_obj_t* barProgress; - Pinetime::Controllers::NavigationService &navService; + Pinetime::Controllers::NavigationService& navService; std::string m_flag; std::string m_narrative; @@ -53,97 +51,97 @@ namespace Pinetime { int m_progress; /** Watchapp */ - + const char* iconForName(std::string icon); - - std::array, 89 > m_iconMap = { { - {"arrive-left" ,"\xEE\xA4\x81" }, - {"arrive-right" ,"\xEE\xA4\x82" }, - {"arrive-straight" ,"\xEE\xA4\x80" }, - {"arrive" ,"\xEE\xA4\x80" }, - {"close" ,"\xEE\xA4\x83" }, - {"continue-left" ,"\xEE\xA4\x85" }, - {"continue-right" ,"\xEE\xA4\x86" }, - {"continue-slight-left" ,"\xEE\xA4\x87" }, - {"continue-slight-right" ,"\xEE\xA4\x88" }, - {"continue-straight" ,"\xEE\xA4\x84" }, - {"continue-uturn" ,"\xEE\xA4\x89" }, - {"continue" ,"\xEE\xA4\x84" }, - {"depart-left" ,"\xEE\xA4\x8B" }, - {"depart-right" ,"\xEE\xA4\x8C" }, - {"depart-straight" ,"\xEE\xA4\x8A" }, - {"end-of-road-left" ,"\xEE\xA4\x8D" }, - {"end-of-road-right" ,"\xEE\xA4\x8E" }, - {"ferry" ,"\xEE\xA4\x8F" }, - {"flag" ,"\xEE\xA4\x90" }, - {"fork-left" ,"\xEE\xA4\x92" }, - {"fork-right" ,"\xEE\xA4\x93" }, - {"fork-slight-left" ,"\xEE\xA4\x94" }, - {"fork-slight-right" ,"\xEE\xA4\x95" }, - {"fork-straight" ,"\xEE\xA4\x96" }, - {"invalid" ,"\xEE\xA4\x84" }, - {"invalid-left" ,"\xEE\xA4\x85" }, - {"invalid-right" ,"\xEE\xA4\x86" }, - {"invalid-slight-left" ,"\xEE\xA4\x87" }, - {"invalid-slight-right" ,"\xEE\xA4\x88" }, - {"invalid-straight" ,"\xEE\xA4\x84" }, - {"invalid-uturn" ,"\xEE\xA4\x89" }, - {"merge-left" ,"\xEE\xA4\x97" }, - {"merge-right" ,"\xEE\xA4\x98" }, - {"merge-slight-left" ,"\xEE\xA4\x99" }, - {"merge-slight-right" ,"\xEE\xA4\x9A" }, - {"merge-straight" ,"\xEE\xA4\x84" }, - {"new-name-left" ,"\xEE\xA4\x85" }, - {"new-name-right" ,"\xEE\xA4\x86" }, - {"new-name-sharp-left" ,"\xEE\xA4\x9B" }, - {"new-name-sharp-right" ,"\xEE\xA4\x9C" }, - {"new-name-slight-left" ,"\xEE\xA4\x87" }, - {"new-name-slight-right" ,"\xEE\xA4\x88" }, - {"new-name-straight" ,"\xEE\xA4\x84" }, - {"notification-left" ,"\xEE\xA4\x85" }, - {"notification-right" ,"\xEE\xA4\x86" }, - {"notification-sharp-left" ,"\xEE\xA4\x9B" }, - {"notification-sharp-right" ,"\xEE\xA4\xA5" }, - {"notification-slight-left" ,"\xEE\xA4\x87" }, - {"notification-slight-right" ,"\xEE\xA4\x88" }, - {"notification-straight" ,"\xEE\xA4\x84" }, - {"off-ramp-left" ,"\xEE\xA4\x9D" }, - {"off-ramp-right" ,"\xEE\xA4\x9E" }, - {"off-ramp-slight-left" ,"\xEE\xA4\x9F" }, - {"off-ramp-slight-right" ,"\xEE\xA4\xA0" }, - {"on-ramp-left" ,"\xEE\xA4\x85" }, - {"on-ramp-right" ,"\xEE\xA4\x86" }, - {"on-ramp-sharp-left" ,"\xEE\xA4\x9B" }, - {"on-ramp-sharp-right" ,"\xEE\xA4\xA5" }, - {"on-ramp-slight-left" ,"\xEE\xA4\x87" }, - {"on-ramp-slight-right" ,"\xEE\xA4\x88" }, - {"on-ramp-straight" ,"\xEE\xA4\x84" }, - {"rotary" ,"\xEE\xA4\xA1" }, - {"rotary-left" ,"\xEE\xA4\xA2" }, - {"rotary-right" ,"\xEE\xA4\xA3" }, - {"rotary-sharp-left" ,"\xEE\xA4\xA4" }, - {"rotary-sharp-right" ,"\xEE\xA4\xA5" }, - {"rotary-slight-left" ,"\xEE\xA4\xA6" }, - {"rotary-slight-right" ,"\xEE\xA4\xA7" }, - {"rotary-straight" ,"\xEE\xA4\xA8" }, - {"roundabout" ,"\xEE\xA4\xA1" }, - {"roundabout-left" ,"\xEE\xA4\xA2" }, - {"roundabout-right" ,"\xEE\xA4\xA3" }, - {"roundabout-sharp-left" ,"\xEE\xA4\xA4" }, - {"roundabout-sharp-right" ,"\xEE\xA4\xA5" }, - {"roundabout-slight-left" ,"\xEE\xA4\xA6" }, - {"roundabout-slight-right" ,"\xEE\xA4\xA7" }, - {"roundabout-straight" ,"\xEE\xA4\xA8" }, - {"turn-left" ,"\xEE\xA4\x85" }, - {"turn-right" ,"\xEE\xA4\x86" }, - {"turn-sharp-left" ,"\xEE\xA4\x9B" }, - {"turn-sharp-right" ,"\xEE\xA4\xA5" }, - {"turn-slight-left" ,"\xEE\xA4\x87" }, - {"turn-slight-right" ,"\xEE\xA4\x88" }, - {"turn-straight" ,"\xEE\xA4\x84" }, - {"updown" ,"\xEE\xA4\xA9" }, - {"uturn" ,"\xEE\xA4\x89" }, - } }; + + std::array, 89> m_iconMap = {{ + {"arrive-left", "\xEE\xA4\x81"}, + {"arrive-right", "\xEE\xA4\x82"}, + {"arrive-straight", "\xEE\xA4\x80"}, + {"arrive", "\xEE\xA4\x80"}, + {"close", "\xEE\xA4\x83"}, + {"continue-left", "\xEE\xA4\x85"}, + {"continue-right", "\xEE\xA4\x86"}, + {"continue-slight-left", "\xEE\xA4\x87"}, + {"continue-slight-right", "\xEE\xA4\x88"}, + {"continue-straight", "\xEE\xA4\x84"}, + {"continue-uturn", "\xEE\xA4\x89"}, + {"continue", "\xEE\xA4\x84"}, + {"depart-left", "\xEE\xA4\x8B"}, + {"depart-right", "\xEE\xA4\x8C"}, + {"depart-straight", "\xEE\xA4\x8A"}, + {"end-of-road-left", "\xEE\xA4\x8D"}, + {"end-of-road-right", "\xEE\xA4\x8E"}, + {"ferry", "\xEE\xA4\x8F"}, + {"flag", "\xEE\xA4\x90"}, + {"fork-left", "\xEE\xA4\x92"}, + {"fork-right", "\xEE\xA4\x93"}, + {"fork-slight-left", "\xEE\xA4\x94"}, + {"fork-slight-right", "\xEE\xA4\x95"}, + {"fork-straight", "\xEE\xA4\x96"}, + {"invalid", "\xEE\xA4\x84"}, + {"invalid-left", "\xEE\xA4\x85"}, + {"invalid-right", "\xEE\xA4\x86"}, + {"invalid-slight-left", "\xEE\xA4\x87"}, + {"invalid-slight-right", "\xEE\xA4\x88"}, + {"invalid-straight", "\xEE\xA4\x84"}, + {"invalid-uturn", "\xEE\xA4\x89"}, + {"merge-left", "\xEE\xA4\x97"}, + {"merge-right", "\xEE\xA4\x98"}, + {"merge-slight-left", "\xEE\xA4\x99"}, + {"merge-slight-right", "\xEE\xA4\x9A"}, + {"merge-straight", "\xEE\xA4\x84"}, + {"new-name-left", "\xEE\xA4\x85"}, + {"new-name-right", "\xEE\xA4\x86"}, + {"new-name-sharp-left", "\xEE\xA4\x9B"}, + {"new-name-sharp-right", "\xEE\xA4\x9C"}, + {"new-name-slight-left", "\xEE\xA4\x87"}, + {"new-name-slight-right", "\xEE\xA4\x88"}, + {"new-name-straight", "\xEE\xA4\x84"}, + {"notification-left", "\xEE\xA4\x85"}, + {"notification-right", "\xEE\xA4\x86"}, + {"notification-sharp-left", "\xEE\xA4\x9B"}, + {"notification-sharp-right", "\xEE\xA4\xA5"}, + {"notification-slight-left", "\xEE\xA4\x87"}, + {"notification-slight-right", "\xEE\xA4\x88"}, + {"notification-straight", "\xEE\xA4\x84"}, + {"off-ramp-left", "\xEE\xA4\x9D"}, + {"off-ramp-right", "\xEE\xA4\x9E"}, + {"off-ramp-slight-left", "\xEE\xA4\x9F"}, + {"off-ramp-slight-right", "\xEE\xA4\xA0"}, + {"on-ramp-left", "\xEE\xA4\x85"}, + {"on-ramp-right", "\xEE\xA4\x86"}, + {"on-ramp-sharp-left", "\xEE\xA4\x9B"}, + {"on-ramp-sharp-right", "\xEE\xA4\xA5"}, + {"on-ramp-slight-left", "\xEE\xA4\x87"}, + {"on-ramp-slight-right", "\xEE\xA4\x88"}, + {"on-ramp-straight", "\xEE\xA4\x84"}, + {"rotary", "\xEE\xA4\xA1"}, + {"rotary-left", "\xEE\xA4\xA2"}, + {"rotary-right", "\xEE\xA4\xA3"}, + {"rotary-sharp-left", "\xEE\xA4\xA4"}, + {"rotary-sharp-right", "\xEE\xA4\xA5"}, + {"rotary-slight-left", "\xEE\xA4\xA6"}, + {"rotary-slight-right", "\xEE\xA4\xA7"}, + {"rotary-straight", "\xEE\xA4\xA8"}, + {"roundabout", "\xEE\xA4\xA1"}, + {"roundabout-left", "\xEE\xA4\xA2"}, + {"roundabout-right", "\xEE\xA4\xA3"}, + {"roundabout-sharp-left", "\xEE\xA4\xA4"}, + {"roundabout-sharp-right", "\xEE\xA4\xA5"}, + {"roundabout-slight-left", "\xEE\xA4\xA6"}, + {"roundabout-slight-right", "\xEE\xA4\xA7"}, + {"roundabout-straight", "\xEE\xA4\xA8"}, + {"turn-left", "\xEE\xA4\x85"}, + {"turn-right", "\xEE\xA4\x86"}, + {"turn-sharp-left", "\xEE\xA4\x9B"}, + {"turn-sharp-right", "\xEE\xA4\xA5"}, + {"turn-slight-left", "\xEE\xA4\x87"}, + {"turn-slight-right", "\xEE\xA4\x88"}, + {"turn-straight", "\xEE\xA4\x84"}, + {"updown", "\xEE\xA4\xA9"}, + {"uturn", "\xEE\xA4\x89"}, + }}; }; } } diff --git a/src/displayapp/screens/NotificationIcon.cpp b/src/displayapp/screens/NotificationIcon.cpp index 64898c2c..d8792f9d 100644 --- a/src/displayapp/screens/NotificationIcon.cpp +++ b/src/displayapp/screens/NotificationIcon.cpp @@ -3,6 +3,8 @@ using namespace Pinetime::Applications::Screens; const char* NotificationIcon::GetIcon(bool newNotificationAvailable) { - if(newNotificationAvailable) return Symbols::info; - else return ""; + if (newNotificationAvailable) + return Symbols::info; + else + return ""; } \ No newline at end of file diff --git a/src/displayapp/screens/NotificationIcon.h b/src/displayapp/screens/NotificationIcon.h index dc34c3f0..40546397 100644 --- a/src/displayapp/screens/NotificationIcon.h +++ b/src/displayapp/screens/NotificationIcon.h @@ -4,7 +4,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class NotificationIcon { - public: + public: static const char* GetIcon(bool newNotificationAvailable); }; } diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 33cebe86..f0fd2f66 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -8,34 +8,34 @@ using namespace Pinetime::Applications::Screens; extern lv_font_t jetbrains_mono_extrabold_compressed; extern lv_font_t jetbrains_mono_bold_20; -Notifications::Notifications(DisplayApp *app, - Pinetime::Controllers::NotificationManager ¬ificationManager, +Notifications::Notifications(DisplayApp* app, + Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::AlertNotificationService& alertNotificationService, - Modes mode) : - Screen(app), notificationManager{notificationManager}, alertNotificationService{alertNotificationService}, mode{mode} { + Modes mode) + : Screen(app), notificationManager {notificationManager}, alertNotificationService {alertNotificationService}, mode {mode} { notificationManager.ClearNewNotificationFlag(); auto notification = notificationManager.GetLastNotification(); - if(notification.valid) { + if (notification.valid) { currentId = notification.id; currentItem = std::make_unique(notification.Title(), - notification.Message(), - notification.index, - notification.category, - notificationManager.NbNotifications(), - mode, - alertNotificationService); + notification.Message(), + notification.index, + notification.category, + notificationManager.NbNotifications(), + mode, + alertNotificationService); validDisplay = true; } else { currentItem = std::make_unique("Notification", - "No notification to display", - 0, - notification.category, - notificationManager.NbNotifications(), - Modes::Preview, - alertNotificationService); + "No notification to display", + 0, + notification.category, + notificationManager.NbNotifications(), + Modes::Preview, + alertNotificationService); } - if(mode == Modes::Preview) { + if (mode == Modes::Preview) { timeoutLine = lv_line_create(lv_scr_act(), nullptr); @@ -45,7 +45,7 @@ Notifications::Notifications(DisplayApp *app, lv_line_set_points(timeoutLine, timeoutLinePoints, 2); timeoutTickCountStart = xTaskGetTickCount(); - timeoutTickCountEnd = timeoutTickCountStart + (5*1024); + timeoutTickCountEnd = timeoutTickCountStart + (5 * 1024); } } @@ -68,34 +68,36 @@ bool Notifications::Refresh() { } bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) { - if(mode != Modes::Normal) return true; + if (mode != Modes::Normal) + return true; switch (event) { case Pinetime::Applications::TouchEvents::SwipeDown: { Controllers::NotificationManager::Notification previousNotification; - if(validDisplay) + if (validDisplay) previousNotification = notificationManager.GetPrevious(currentId); else previousNotification = notificationManager.GetLastNotification(); - if (!previousNotification.valid) return true; + if (!previousNotification.valid) + return true; validDisplay = true; currentId = previousNotification.id; currentItem.reset(nullptr); app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down); currentItem = std::make_unique(previousNotification.Title(), - previousNotification.Message(), - previousNotification.index, - previousNotification.category, - notificationManager.NbNotifications(), - mode, - alertNotificationService); + previousNotification.Message(), + previousNotification.index, + previousNotification.category, + notificationManager.NbNotifications(), + mode, + alertNotificationService); } return true; case Pinetime::Applications::TouchEvents::SwipeUp: { Controllers::NotificationManager::Notification nextNotification; - if(validDisplay) + if (validDisplay) nextNotification = notificationManager.GetNext(currentId); else nextNotification = notificationManager.GetLastNotification(); @@ -110,16 +112,16 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) { currentItem.reset(nullptr); app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up); currentItem = std::make_unique(nextNotification.Title(), - nextNotification.Message(), - nextNotification.index, - nextNotification.category, - notificationManager.NbNotifications(), - mode, - alertNotificationService); + nextNotification.Message(), + nextNotification.index, + nextNotification.category, + notificationManager.NbNotifications(), + mode, + alertNotificationService); } return true; case Pinetime::Applications::TouchEvents::LongTap: { - //notificationManager.ToggleVibrations(); + // notificationManager.ToggleVibrations(); return true; } default: @@ -138,20 +140,20 @@ namespace { item->OnMuteIncomingCall(event); } - static void RejectIncomingCallEventHandler(lv_obj_t *obj, lv_event_t event) { - auto* item = static_cast(obj->user_data); + static void RejectIncomingCallEventHandler(lv_obj_t* obj, lv_event_t event) { + auto* item = static_cast(obj->user_data); item->OnRejectIncomingCall(event); } } - Notifications::NotificationItem::NotificationItem(const char *title, - const char *msg, - uint8_t notifNr, - Controllers::NotificationManager::Categories category, - uint8_t notifNb, - Modes mode, - Pinetime::Controllers::AlertNotificationService& alertNotificationService) - : notifNr{notifNr}, notifNb{notifNb}, mode{mode}, alertNotificationService{alertNotificationService} { +Notifications::NotificationItem::NotificationItem(const char* title, + const char* msg, + uint8_t notifNr, + Controllers::NotificationManager::Categories category, + uint8_t notifNb, + Modes mode, + Pinetime::Controllers::AlertNotificationService& alertNotificationService) + : notifNr {notifNr}, notifNb {notifNb}, mode {mode}, alertNotificationService {alertNotificationService} { lv_obj_t* container1 = lv_cont_create(lv_scr_act(), NULL); @@ -172,20 +174,20 @@ namespace { lv_obj_t* alert_type = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(alert_type, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x888888)); - if(title == nullptr) title = "Notification"; + if (title == nullptr) + title = "Notification"; lv_label_set_text(alert_type, title); lv_obj_align(alert_type, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 16); ///////// - switch(category) { + switch (category) { default: { lv_obj_t* alert_subject = lv_label_create(container1, nullptr); lv_obj_set_style_local_text_color(alert_subject, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); lv_label_set_long_mode(alert_subject, LV_LABEL_LONG_BREAK); lv_obj_set_width(alert_subject, LV_HOR_RES - 20); lv_label_set_text(alert_subject, msg); - } - break; + } break; case Controllers::NotificationManager::Categories::IncomingCall: { lv_obj_t* alert_subject = lv_label_create(container1, nullptr); lv_obj_set_style_local_text_color(alert_subject, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); @@ -234,8 +236,7 @@ namespace { label_mute = lv_label_create(bt_mute, nullptr); lv_label_set_text(label_mute, Symbols::volumMute); lv_obj_set_style_local_bg_color(bt_mute, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); - } - break; + } break; } lv_obj_t* backgroundLabel = lv_label_create(lv_scr_act(), nullptr); @@ -246,19 +247,22 @@ namespace { } void Notifications::NotificationItem::OnAcceptIncomingCall(lv_event_t event) { - if (event != LV_EVENT_CLICKED) return; + if (event != LV_EVENT_CLICKED) + return; alertNotificationService.AcceptIncomingCall(); } void Notifications::NotificationItem::OnMuteIncomingCall(lv_event_t event) { - if (event != LV_EVENT_CLICKED) return; + if (event != LV_EVENT_CLICKED) + return; alertNotificationService.MuteIncomingCall(); } void Notifications::NotificationItem::OnRejectIncomingCall(lv_event_t event) { - if (event != LV_EVENT_CLICKED) return; + if (event != LV_EVENT_CLICKED) + return; alertNotificationService.RejectIncomingCall(); } diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 0d54ddbe..d5ea5dcb 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -14,24 +14,35 @@ namespace Pinetime { namespace Screens { class Notifications : public Screen { - public: - enum class Modes {Normal, Preview}; - explicit Notifications(DisplayApp* app, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::AlertNotificationService& alertNotificationService, Modes mode); - ~Notifications() override; + public: + enum class Modes { Normal, Preview }; + explicit Notifications(DisplayApp* app, + Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::AlertNotificationService& alertNotificationService, + Modes mode); + ~Notifications() override; - bool Refresh() override; - bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; + bool Refresh() override; + bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; class NotificationItem { - public: - NotificationItem(const char* title, const char* msg, uint8_t notifNr, Controllers::NotificationManager::Categories, uint8_t notifNb, Modes mode, Pinetime::Controllers::AlertNotificationService& alertNotificationService); + public: + NotificationItem(const char* title, + const char* msg, + uint8_t notifNr, + Controllers::NotificationManager::Categories, + uint8_t notifNb, + Modes mode, + Pinetime::Controllers::AlertNotificationService& alertNotificationService); ~NotificationItem(); - bool Refresh() {return false;} + bool Refresh() { + return false; + } void OnAcceptIncomingCall(lv_event_t event); void OnMuteIncomingCall(lv_event_t event); void OnRejectIncomingCall(lv_event_t event); - private: + private: uint8_t notifNr = 0; uint8_t notifNb = 0; char pageText[4]; @@ -49,28 +60,24 @@ namespace Pinetime { lv_obj_t* bottomPlaceholder; Modes mode; Pinetime::Controllers::AlertNotificationService& alertNotificationService; - - }; - private: - + private: + struct NotificationData { + const char* title; + const char* text; + }; + Pinetime::Controllers::NotificationManager& notificationManager; + Pinetime::Controllers::AlertNotificationService& alertNotificationService; + Modes mode = Modes::Normal; + std::unique_ptr currentItem; + Controllers::NotificationManager::Notification::Id currentId; + bool validDisplay = false; - struct NotificationData { - const char* title; - const char* text; - }; - Pinetime::Controllers::NotificationManager& notificationManager; - Pinetime::Controllers::AlertNotificationService& alertNotificationService; - Modes mode = Modes::Normal; - std::unique_ptr currentItem; - Controllers::NotificationManager::Notification::Id currentId; - bool validDisplay = false; - - lv_point_t timeoutLinePoints[2] { {0, 1}, {239, 1} }; - lv_obj_t* timeoutLine; - uint32_t timeoutTickCountStart; - uint32_t timeoutTickCountEnd; + lv_point_t timeoutLinePoints[2] {{0, 1}, {239, 1}}; + lv_obj_t* timeoutLine; + uint32_t timeoutTickCountStart; + uint32_t timeoutTickCountEnd; }; } } diff --git a/src/displayapp/screens/Paddle.cpp b/src/displayapp/screens/Paddle.cpp index e86cf01b..161f175b 100644 --- a/src/displayapp/screens/Paddle.cpp +++ b/src/displayapp/screens/Paddle.cpp @@ -4,124 +4,96 @@ using namespace Pinetime::Applications::Screens; -namespace{ -const uint8_t paddle_map[] = { - 0xfc, 0xfe, 0xfc, 0xff, /*Color of index 0*/ - 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ +namespace { + const uint8_t paddle_map[] = { + 0xfc, 0xfe, 0xfc, 0xff, /*Color of index 0*/ + 0xff, 0xff, 0xff, 0xff, /*Color of index 1*/ - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, -}; + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; -const uint8_t ball_map[] = { - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, - 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, - 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, - 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, - 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, -}; + const uint8_t ball_map[] = { + 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, + 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, + 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, 0x6f, 0xed, + }; } -Paddle::Paddle(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl{lvgl} { +Paddle::Paddle(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl {lvgl} { app->SetTouchMode(DisplayApp::TouchModes::Polling); - + points = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text(points, "0000"); lv_obj_set_style_local_text_color(points, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x444444)); lv_obj_align(points, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 0); - + paddle.header.always_zero = 0; paddle.header.w = 4; paddle.header.h = 60; paddle.data_size = 68; paddle.header.cf = LV_IMG_CF_INDEXED_1BIT; - paddle.data = paddle_map; + paddle.data = paddle_map; paddle_image = lv_img_create(lv_scr_act(), nullptr); lv_img_set_src(paddle_image, &paddle); - + ball.header.always_zero = 0; ball.header.w = 24; ball.header.h = 24; ball.data_size = 24 * 24 * LV_COLOR_SIZE / 8; ball.header.cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED; - ball.data = ball_map; + ball.data = ball_map; ball_image = lv_img_create(lv_scr_act(), nullptr); lv_img_set_src(ball_image, &ball); } @@ -133,51 +105,54 @@ Paddle::~Paddle() { } bool Paddle::Refresh() { - if((counter++ % 5) == 0){ - counter = 0; - + if ((counter++ % 5) == 0) { + counter = 0; + ballX += dx; - ballY += dy; - + ballY += dy; + lv_obj_set_pos(ball_image, ballX, ballY); - - //checks if it has touched the sides (floor and ceiling) - if(ballY <= 0 || ballY >= 215){ + + // checks if it has touched the sides (floor and ceiling) + if (ballY <= 0 || ballY >= 215) { dy *= -1; } - - //checks if it has touched the side (left side) - if(ballX >= 215){ - dx *= -1; + + // checks if it has touched the side (left side) + if (ballX >= 215) { + dx *= -1; } - - //checks if it is in the position of the paddle - if(ballY <= (paddleBottomY + 16) && ballY >= (paddleTopY - 8)){ - if(ballX >= 0 && ballX < 4){ - lv_obj_set_pos(ball_image, 5, ballY); - dx *= -1; - score++; - } - } - - //checks if it has gone behind the paddle - else if(ballX <= -40){ + + // checks if it is in the position of the paddle + if (ballY <= (paddleBottomY + 16) && ballY >= (paddleTopY - 8)) { + if (ballX >= 0 && ballX < 4) { + lv_obj_set_pos(ball_image, 5, ballY); + dx *= -1; + score++; + } + } + + // checks if it has gone behind the paddle + else if (ballX <= -40) { ballX = 107; - ballY = 107; - score = 0; + ballY = 107; + score = 0; } lv_label_set_text_fmt(points, "%04d", score); - } + } return running; } -bool Paddle::OnTouchEvent(Pinetime::Applications::TouchEvents event) { - return true; +bool Paddle::OnTouchEvent(Pinetime::Applications::TouchEvents event) { + return true; } bool Paddle::OnTouchEvent(uint16_t x, uint16_t y) { - lv_obj_set_pos(paddle_image, 0, y - 30); // sets the center paddle pos. (30px offset) with the the y_coordinate of the finger and defaults the x_coordinate to 0 - paddleTopY = y - 30; // refreshes the upper extreme of the paddle - paddleBottomY = y + 30; // refreshes the lower extreme of the paddle + lv_obj_set_pos( + paddle_image, + 0, + y - 30); // sets the center paddle pos. (30px offset) with the the y_coordinate of the finger and defaults the x_coordinate to 0 + paddleTopY = y - 30; // refreshes the upper extreme of the paddle + paddleBottomY = y + 30; // refreshes the lower extreme of the paddle return true; } diff --git a/src/displayapp/screens/Paddle.h b/src/displayapp/screens/Paddle.h index 453d99ae..438b4992 100644 --- a/src/displayapp/screens/Paddle.h +++ b/src/displayapp/screens/Paddle.h @@ -11,39 +11,37 @@ namespace Pinetime { namespace Applications { namespace Screens { - class Paddle : public Screen{ - public: - Paddle(DisplayApp* app, Pinetime::Components::LittleVgl& lvgl); - ~Paddle() override; + class Paddle : public Screen { + public: + Paddle(DisplayApp* app, Pinetime::Components::LittleVgl& lvgl); + ~Paddle() override; - bool Refresh() override; - - bool OnTouchEvent(TouchEvents event) override; - bool OnTouchEvent(uint16_t x, uint16_t y) override; - - private: - Pinetime::Components::LittleVgl& lvgl; - - int paddleBottomY = 90; // bottom extreme of the paddle - int paddleTopY = 150; //top extreme of the paddle + bool Refresh() override; - int ballX = 107; // Initial x_coordinate for the ball (12px offset from the center to counteract the ball's 24px size) - int ballY = 107; // Initial y_coordinate for the ball + bool OnTouchEvent(TouchEvents event) override; + bool OnTouchEvent(uint16_t x, uint16_t y) override; - int dx = 2; // Velocity of the ball in the x_coordinate - int dy = 3; // Velocity of the ball in the y_coordinate + private: + Pinetime::Components::LittleVgl& lvgl; - int counter = 0; // init Frame refresh limit counter - int score = 0; + int paddleBottomY = 90; // bottom extreme of the paddle + int paddleTopY = 150; // top extreme of the paddle - lv_img_dsc_t paddle; - lv_img_dsc_t ball; + int ballX = 107; // Initial x_coordinate for the ball (12px offset from the center to counteract the ball's 24px size) + int ballY = 107; // Initial y_coordinate for the ball - lv_obj_t* points; - lv_obj_t* paddle_image; // pointer to paddle image - lv_obj_t* ball_image; // pointer to ball image + int dx = 2; // Velocity of the ball in the x_coordinate + int dy = 3; // Velocity of the ball in the y_coordinate - + int counter = 0; // init Frame refresh limit counter + int score = 0; + + lv_img_dsc_t paddle; + lv_img_dsc_t ball; + + lv_obj_t* points; + lv_obj_t* paddle_image; // pointer to paddle image + lv_obj_t* ball_image; // pointer to ball image }; } } diff --git a/src/displayapp/screens/Screen.h b/src/displayapp/screens/Screen.h index cf4f6994..fb453aa8 100644 --- a/src/displayapp/screens/Screen.h +++ b/src/displayapp/screens/Screen.h @@ -8,56 +8,68 @@ namespace Pinetime { class DisplayApp; namespace Screens { - template - class DirtyValue { - public: - DirtyValue() = default; // Use NSDMI - explicit DirtyValue(T const& v):value{v}{} // Use MIL and const-lvalue-ref - bool IsUpdated() const { return isUpdated; } - T const& Get() { this->isUpdated = false; return value; } // never expose a non-const lvalue-ref - DirtyValue& operator=(const T& other) { - if (this->value != other) { - this->value = other; - this->isUpdated = true; - } - return *this; + template class DirtyValue { + public: + DirtyValue() = default; // Use NSDMI + explicit DirtyValue(T const& v) : value {v} { + } // Use MIL and const-lvalue-ref + bool IsUpdated() const { + return isUpdated; + } + T const& Get() { + this->isUpdated = false; + return value; + } // never expose a non-const lvalue-ref + DirtyValue& operator=(const T& other) { + if (this->value != other) { + this->value = other; + this->isUpdated = true; } - private: - T value{}; // NSDMI - default initialise type - bool isUpdated{true}; // NSDMI - use brace initilisation + return *this; + } + + private: + T value {}; // NSDMI - default initialise type + bool isUpdated {true}; // NSDMI - use brace initilisation }; - + class Screen { - public: - explicit Screen(DisplayApp* app) : app{app} {} - virtual ~Screen() = default; + public: + explicit Screen(DisplayApp* app) : app {app} { + } + virtual ~Screen() = default; - /** - * Most of the time, apps only react to events (touch events, for example). - * In this case you don't need to do anything in this method. - * - * For example, InfiniPaint does nothing in Refresh(). - * But, if you want to update your display periodically, draw an animation... - * you cannot do it in a touch event handler because these handlers are not - * called if the user does not touch the screen. - * - * That's why Refresh() is there: update the display periodically. - * - * @return false if the app can be closed, true if it must continue to run - **/ - virtual bool Refresh() = 0; + /** + * Most of the time, apps only react to events (touch events, for example). + * In this case you don't need to do anything in this method. + * + * For example, InfiniPaint does nothing in Refresh(). + * But, if you want to update your display periodically, draw an animation... + * you cannot do it in a touch event handler because these handlers are not + * called if the user does not touch the screen. + * + * That's why Refresh() is there: update the display periodically. + * + * @return false if the app can be closed, true if it must continue to run + **/ + virtual bool Refresh() = 0; - /** @return false if the button hasn't been handled by the app, true if it has been handled */ - virtual bool OnButtonPushed() { return false; } + /** @return false if the button hasn't been handled by the app, true if it has been handled */ + virtual bool OnButtonPushed() { + return false; + } - /** @return false if the event hasn't been handled by the app, true if it has been handled */ - virtual bool OnTouchEvent(TouchEvents event) { return false; } - virtual bool OnTouchEvent(uint16_t x, uint16_t y) { return false; } - - protected: - DisplayApp* app; - bool running = true; + /** @return false if the event hasn't been handled by the app, true if it has been handled */ + virtual bool OnTouchEvent(TouchEvents event) { + return false; + } + virtual bool OnTouchEvent(uint16_t x, uint16_t y) { + return false; + } + protected: + DisplayApp* app; + bool running = true; }; } } diff --git a/src/displayapp/screens/ScreenList.h b/src/displayapp/screens/ScreenList.h index 23bcd98b..a9a176b3 100644 --- a/src/displayapp/screens/ScreenList.h +++ b/src/displayapp/screens/ScreenList.h @@ -10,100 +10,98 @@ namespace Pinetime { namespace Applications { namespace Screens { - enum class ScreenListModes {UpDown, RightLeft, LongPress}; - template - class ScreenList : public Screen { - public: + enum class ScreenListModes { UpDown, RightLeft, LongPress }; + template class ScreenList : public Screen { + public: + ScreenList(DisplayApp* app, + uint8_t initScreen, + std::array()>, N>&& screens, + ScreenListModes mode) + : Screen(app), initScreen {initScreen}, screens {std::move(screens)}, mode {mode}, current {this->screens[initScreen]()} { + screenIndex = initScreen; + } - ScreenList(DisplayApp* app, uint8_t initScreen, std::array()>, N>&& screens, ScreenListModes mode) - : Screen(app), initScreen{initScreen}, screens{std::move(screens)}, mode{mode}, current{this->screens[initScreen]()} { - screenIndex = initScreen; - } + ~ScreenList() override { + lv_obj_clean(lv_scr_act()); + } - ~ScreenList() override { - lv_obj_clean(lv_scr_act()); - } + bool Refresh() override { + running = current->Refresh(); + return running; + } - bool Refresh() override { - running = current->Refresh(); - return running; - } + bool OnTouchEvent(TouchEvents event) override { - bool OnTouchEvent(TouchEvents event) override { - - if ( mode == ScreenListModes::UpDown) { - switch (event) { - case TouchEvents::SwipeDown: - if (screenIndex > 0) { - current.reset(nullptr); - app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down); - screenIndex--; - current = screens[screenIndex](); - return true; - } else { - return false; - } - - case TouchEvents::SwipeUp: - if (screenIndex < screens.size() - 1) { - current.reset(nullptr); - app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up); - screenIndex++; - current = screens[screenIndex](); - } + if (mode == ScreenListModes::UpDown) { + switch (event) { + case TouchEvents::SwipeDown: + if (screenIndex > 0) { + current.reset(nullptr); + app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down); + screenIndex--; + current = screens[screenIndex](); return true; - default: + } else { return false; - } - } else if ( mode == ScreenListModes::RightLeft) { - switch (event) { - case TouchEvents::SwipeRight: - if (screenIndex > 0) { - current.reset(nullptr); - app->SetFullRefresh(DisplayApp::FullRefreshDirections::None); - screenIndex--; - current = screens[screenIndex](); - return true; - } else { - return false; - } - - case TouchEvents::SwipeLeft: - if (screenIndex < screens.size() - 1) { - current.reset(nullptr); - app->SetFullRefresh(DisplayApp::FullRefreshDirections::None); - screenIndex++; - current = screens[screenIndex](); - } - return true; - default: - return false; - } - } else if ( event == TouchEvents::LongTap ) { - if (screenIndex < screens.size() - 1) { - screenIndex++; - } else { - screenIndex = 0; - } - current.reset(nullptr); - app->SetFullRefresh(DisplayApp::FullRefreshDirections::None); - current = screens[screenIndex](); - return true; + } + + case TouchEvents::SwipeUp: + if (screenIndex < screens.size() - 1) { + current.reset(nullptr); + app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up); + screenIndex++; + current = screens[screenIndex](); + } + return true; + default: + return false; } + } else if (mode == ScreenListModes::RightLeft) { + switch (event) { + case TouchEvents::SwipeRight: + if (screenIndex > 0) { + current.reset(nullptr); + app->SetFullRefresh(DisplayApp::FullRefreshDirections::None); + screenIndex--; + current = screens[screenIndex](); + return true; + } else { + return false; + } - return false; + case TouchEvents::SwipeLeft: + if (screenIndex < screens.size() - 1) { + current.reset(nullptr); + app->SetFullRefresh(DisplayApp::FullRefreshDirections::None); + screenIndex++; + current = screens[screenIndex](); + } + return true; + default: + return false; + } + } else if (event == TouchEvents::LongTap) { + if (screenIndex < screens.size() - 1) { + screenIndex++; + } else { + screenIndex = 0; + } + current.reset(nullptr); + app->SetFullRefresh(DisplayApp::FullRefreshDirections::None); + current = screens[screenIndex](); + return true; } - private: - - uint8_t initScreen = 0; - std::array()>, N> screens; - ScreenListModes mode = ScreenListModes::UpDown; + return false; + } - uint8_t screenIndex = 0; - std::unique_ptr current; + private: + uint8_t initScreen = 0; + std::array()>, N> screens; + ScreenListModes mode = ScreenListModes::UpDown; - + uint8_t screenIndex = 0; + std::unique_ptr current; }; } } diff --git a/src/displayapp/screens/StopWatch.cpp b/src/displayapp/screens/StopWatch.cpp index bf42c698..e06981af 100644 --- a/src/displayapp/screens/StopWatch.cpp +++ b/src/displayapp/screens/StopWatch.cpp @@ -46,8 +46,16 @@ static void stop_lap_event_handler(lv_obj_t* obj, lv_event_t event) { } StopWatch::StopWatch(DisplayApp* app) - : Screen(app), running {true}, currentState {States::Init}, currentEvent {Events::Stop}, startTime {}, oldTimeElapsed {}, - currentTimeSeparated {}, lapBuffer {}, lapNr {}, lapPressed {false} { + : Screen(app), + running {true}, + currentState {States::Init}, + currentEvent {Events::Stop}, + startTime {}, + oldTimeElapsed {}, + currentTimeSeparated {}, + lapBuffer {}, + lapNr {}, + lapPressed {false} { time = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); @@ -56,7 +64,7 @@ StopWatch::StopWatch(DisplayApp* app) lv_obj_align(time, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -45); msecTime = lv_label_create(lv_scr_act(), nullptr); - //lv_obj_set_style_local_text_font(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); + // lv_obj_set_style_local_text_font(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_label_set_text(msecTime, "00"); lv_obj_align(msecTime, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 108, 3); @@ -70,13 +78,13 @@ StopWatch::StopWatch(DisplayApp* app) lv_label_set_text(txtPlayPause, Symbols::play); lapOneText = lv_label_create(lv_scr_act(), nullptr); - //lv_obj_set_style_local_text_font(lapOneText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); + // lv_obj_set_style_local_text_font(lapOneText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); lv_obj_set_style_local_text_color(lapOneText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_obj_align(lapOneText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 30); lv_label_set_text(lapOneText, ""); lapTwoText = lv_label_create(lv_scr_act(), nullptr); - //lv_obj_set_style_local_text_font(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); + // lv_obj_set_style_local_text_font(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); lv_obj_set_style_local_text_color(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_obj_align(lapTwoText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 55); lv_label_set_text(lapTwoText, ""); @@ -145,10 +153,12 @@ bool StopWatch::Refresh() { if (lapPressed == true) { if (lapBuffer[1]) { - lv_label_set_text_fmt(lapOneText, "#%2d %2d:%02d.%02d", (lapNr - 1), lapBuffer[1]->mins, lapBuffer[1]->secs, lapBuffer[1]->hundredths); + lv_label_set_text_fmt( + lapOneText, "#%2d %2d:%02d.%02d", (lapNr - 1), lapBuffer[1]->mins, lapBuffer[1]->secs, lapBuffer[1]->hundredths); } if (lapBuffer[0]) { - lv_label_set_text_fmt(lapTwoText, "#%2d %2d:%02d.%02d", lapNr, lapBuffer[0]->mins, lapBuffer[0]->secs, lapBuffer[0]->hundredths); + lv_label_set_text_fmt( + lapTwoText, "#%2d %2d:%02d.%02d", lapNr, lapBuffer[0]->mins, lapBuffer[0]->secs, lapBuffer[0]->hundredths); } // Reset the bool to avoid setting the text in each cycle until there is a change lapPressed = false; diff --git a/src/displayapp/screens/StopWatch.h b/src/displayapp/screens/StopWatch.h index ff604361..18b02069 100644 --- a/src/displayapp/screens/StopWatch.h +++ b/src/displayapp/screens/StopWatch.h @@ -54,7 +54,7 @@ namespace Pinetime::Applications::Screens { return nullptr; } - private: + private: std::array buffer; uint8_t currentSize; uint8_t capacity; @@ -62,7 +62,7 @@ namespace Pinetime::Applications::Screens { }; class StopWatch : public Screen { - public: + public: StopWatch(DisplayApp* app); ~StopWatch() override; bool Refresh() override; @@ -70,7 +70,7 @@ namespace Pinetime::Applications::Screens { void playPauseBtnEventHandler(lv_event_t event); void stopLapBtnEventHandler(lv_event_t event); - private: + private: bool running; States currentState; Events currentEvent; diff --git a/src/displayapp/screens/Symbols.h b/src/displayapp/screens/Symbols.h index 0750f2c1..e60825c1 100644 --- a/src/displayapp/screens/Symbols.h +++ b/src/displayapp/screens/Symbols.h @@ -26,7 +26,7 @@ namespace Pinetime { static constexpr const char* paintbrush = "\xEF\x87\xBC"; static constexpr const char* paddle = "\xEF\x91\x9D"; static constexpr const char* map = "\xEF\x96\xa0"; - static constexpr const char* qrcode = "\xEF\x80\xa9"; + static constexpr const char* qrcode = "\xEF\x80\xa9"; static constexpr const char* phone = "\xEF\x82\x95"; static constexpr const char* phoneSlash = "\xEF\x8F\x9D"; static constexpr const char* volumMute = "\xEF\x9A\xA9"; @@ -41,19 +41,18 @@ namespace Pinetime { static constexpr const char* lapsFlag = "\xEF\x80\xA4"; // lv_font_sys_48.c - static constexpr const char* settings = "\xEE\xA4\x82";//e902 + static constexpr const char* settings = "\xEE\xA4\x82"; // e902 - static constexpr const char* brightnessHigh = "\xEE\xA4\x84";//e904 - static constexpr const char* brightnessLow = "\xEE\xA4\x85";//e905 - static constexpr const char* brightnessMedium = "\xEE\xA4\x86";//e906 + static constexpr const char* brightnessHigh = "\xEE\xA4\x84"; // e904 + static constexpr const char* brightnessLow = "\xEE\xA4\x85"; // e905 + static constexpr const char* brightnessMedium = "\xEE\xA4\x86"; // e906 - static constexpr const char* notificationsOff = "\xEE\xA4\x8B";//e90b - static constexpr const char* notificationsOn = "\xEE\xA4\x8C";//e90c + static constexpr const char* notificationsOff = "\xEE\xA4\x8B"; // e90b + static constexpr const char* notificationsOn = "\xEE\xA4\x8C"; // e90c - static constexpr const char* highlight = "\xEE\xA4\x87";//e907 + static constexpr const char* highlight = "\xEE\xA4\x87"; // e907 } } } } - diff --git a/src/displayapp/screens/SystemInfo.cpp b/src/displayapp/screens/SystemInfo.cpp index 48dba547..f6e8d61a 100644 --- a/src/displayapp/screens/SystemInfo.cpp +++ b/src/displayapp/screens/SystemInfo.cpp @@ -11,27 +11,37 @@ using namespace Pinetime::Applications::Screens; -SystemInfo::SystemInfo(Pinetime::Applications::DisplayApp *app, - Pinetime::Controllers::DateTime &dateTimeController, +SystemInfo::SystemInfo(Pinetime::Applications::DisplayApp* app, + Pinetime::Controllers::DateTime& dateTimeController, Pinetime::Controllers::Battery& batteryController, Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Controllers::Ble& bleController, - Pinetime::Drivers::WatchdogView& watchdog) : - Screen(app), - dateTimeController{dateTimeController}, batteryController{batteryController}, - brightnessController{brightnessController}, bleController{bleController}, watchdog{watchdog}, - screens{app, - 0, - { - [this]() -> std::unique_ptr { return CreateScreen1(); }, - [this]() -> std::unique_ptr { return CreateScreen2(); }, - [this]() -> std::unique_ptr { return CreateScreen3(); }, - [this]() -> std::unique_ptr { return CreateScreen4(); }, - [this]() -> std::unique_ptr { return CreateScreen5(); } - }, - Screens::ScreenListModes::UpDown - } {} - + Pinetime::Drivers::WatchdogView& watchdog) + : Screen(app), + dateTimeController {dateTimeController}, + batteryController {batteryController}, + brightnessController {brightnessController}, + bleController {bleController}, + watchdog {watchdog}, + screens {app, + 0, + {[this]() -> std::unique_ptr { + return CreateScreen1(); + }, + [this]() -> std::unique_ptr { + return CreateScreen2(); + }, + [this]() -> std::unique_ptr { + return CreateScreen3(); + }, + [this]() -> std::unique_ptr { + return CreateScreen4(); + }, + [this]() -> std::unique_ptr { + return CreateScreen5(); + }}, + Screens::ScreenListModes::UpDown} { +} SystemInfo::~SystemInfo() { lv_obj_clean(lv_scr_act()); @@ -54,16 +64,19 @@ bool SystemInfo::OnTouchEvent(Pinetime::Applications::TouchEvents event) { } std::unique_ptr SystemInfo::CreateScreen1() { - lv_obj_t * label = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr); lv_label_set_recolor(label, true); - lv_label_set_text_fmt(label, - "#FFFF00 InfiniTime#\n\n" - "#444444 Version# %ld.%ld.%ld\n\n" - "#444444 Build date#\n" - "\t%s\n" - "\t%s\n", - Version::Major(), Version::Minor(), Version::Patch(), - __DATE__, __TIME__); + lv_label_set_text_fmt(label, + "#FFFF00 InfiniTime#\n\n" + "#444444 Version# %ld.%ld.%ld\n\n" + "#444444 Build date#\n" + "\t%s\n" + "\t%s\n", + Version::Major(), + Version::Minor(), + Version::Patch(), + __DATE__, + __TIME__); lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); return std::unique_ptr(new Screens::Label(0, 5, app, label)); @@ -75,22 +88,32 @@ std::unique_ptr SystemInfo::CreateScreen2() { auto resetReason = [this]() { switch (watchdog.ResetReason()) { - case Drivers::Watchdog::ResetReasons::Watchdog: return "wtdg"; - case Drivers::Watchdog::ResetReasons::HardReset: return "hardr"; - case Drivers::Watchdog::ResetReasons::NFC: return "nfc"; - case Drivers::Watchdog::ResetReasons::SoftReset: return "softr"; - case Drivers::Watchdog::ResetReasons::CpuLockup: return "cpulock"; - case Drivers::Watchdog::ResetReasons::SystemOff: return "off"; - case Drivers::Watchdog::ResetReasons::LpComp: return "lpcomp"; - case Drivers::Watchdog::ResetReasons::DebugInterface: return "dbg"; - case Drivers::Watchdog::ResetReasons::ResetPin: return "rst"; - default: return "?"; + case Drivers::Watchdog::ResetReasons::Watchdog: + return "wtdg"; + case Drivers::Watchdog::ResetReasons::HardReset: + return "hardr"; + case Drivers::Watchdog::ResetReasons::NFC: + return "nfc"; + case Drivers::Watchdog::ResetReasons::SoftReset: + return "softr"; + case Drivers::Watchdog::ResetReasons::CpuLockup: + return "cpulock"; + case Drivers::Watchdog::ResetReasons::SystemOff: + return "off"; + case Drivers::Watchdog::ResetReasons::LpComp: + return "lpcomp"; + case Drivers::Watchdog::ResetReasons::DebugInterface: + return "dbg"; + case Drivers::Watchdog::ResetReasons::ResetPin: + return "rst"; + default: + return "?"; } }(); // uptime - static constexpr uint32_t secondsInADay = 60*60*24; - static constexpr uint32_t secondsInAnHour = 60*60; + static constexpr uint32_t secondsInADay = 60 * 60 * 24; + static constexpr uint32_t secondsInAnHour = 60 * 60; static constexpr uint32_t secondsInAMinute = 60; uint32_t uptimeSeconds = dateTimeController.Uptime().count(); uint32_t uptimeDays = (uptimeSeconds / secondsInADay); @@ -101,67 +124,83 @@ std::unique_ptr SystemInfo::CreateScreen2() { uptimeSeconds = uptimeSeconds % secondsInAMinute; // TODO handle more than 100 days of uptime - if (batteryPercent == -1) batteryPercent = 0; + if (batteryPercent == -1) + batteryPercent = 0; // hack to not use the flot functions from printf uint8_t batteryVoltageBytes[2]; - batteryVoltageBytes[1] = static_cast(batteryVoltage); //truncate whole numbers - batteryVoltageBytes[0] = static_cast((batteryVoltage - batteryVoltageBytes[1]) * 100); //remove whole part of flt and shift 2 places over + batteryVoltageBytes[1] = static_cast(batteryVoltage); // truncate whole numbers + batteryVoltageBytes[0] = + static_cast((batteryVoltage - batteryVoltageBytes[1]) * 100); // remove whole part of flt and shift 2 places over // - lv_obj_t * label = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr); lv_label_set_recolor(label, true); - lv_label_set_text_fmt(label, - "#444444 Date# %02d/%02d/%04d\n" - "#444444 Time# %02d:%02d:%02d\n" - "#444444 Uptime#\n %02lud %02lu:%02lu:%02lu\n" - "#444444 Battery# %d%%/%1i.%02iv\n" - "#444444 Backlight# %s\n" - "#444444 Last reset# %s\n", - dateTimeController.Day(), static_cast(dateTimeController.Month()), dateTimeController.Year(), - dateTimeController.Hours(), dateTimeController.Minutes(), dateTimeController.Seconds(), - uptimeDays, uptimeHours, uptimeMinutes, uptimeSeconds, - batteryPercent, batteryVoltageBytes[1], batteryVoltageBytes[0], brightnessController.ToString(), resetReason - ); + lv_label_set_text_fmt(label, + "#444444 Date# %02d/%02d/%04d\n" + "#444444 Time# %02d:%02d:%02d\n" + "#444444 Uptime#\n %02lud %02lu:%02lu:%02lu\n" + "#444444 Battery# %d%%/%1i.%02iv\n" + "#444444 Backlight# %s\n" + "#444444 Last reset# %s\n", + dateTimeController.Day(), + static_cast(dateTimeController.Month()), + dateTimeController.Year(), + dateTimeController.Hours(), + dateTimeController.Minutes(), + dateTimeController.Seconds(), + uptimeDays, + uptimeHours, + uptimeMinutes, + uptimeSeconds, + batteryPercent, + batteryVoltageBytes[1], + batteryVoltageBytes[0], + brightnessController.ToString(), + resetReason); lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); return std::unique_ptr(new Screens::Label(1, 4, app, label)); - } std::unique_ptr SystemInfo::CreateScreen3() { lv_mem_monitor_t mon; - lv_mem_monitor(&mon); - - lv_obj_t * label = lv_label_create(lv_scr_act(), nullptr); + lv_mem_monitor(&mon); + + lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr); lv_label_set_recolor(label, true); auto& bleAddr = bleController.Address(); - lv_label_set_text_fmt(label, - "#444444 BLE MAC#\n" - " %02x:%02x:%02x:%02x:%02x:%02x" - "\n" - "#444444 Memory#\n" - " #444444 used# %d (%d%%)\n" - " #444444 frag# %d%%\n" - " #444444 free# %d" - "\n" - "#444444 Steps# %li", - bleAddr[5], bleAddr[4], bleAddr[3], bleAddr[2], bleAddr[1], bleAddr[0], - (int)mon.total_size - mon.free_size, - mon.used_pct, - mon.frag_pct, - (int)mon.free_biggest_size, - 0 - ); + lv_label_set_text_fmt(label, + "#444444 BLE MAC#\n" + " %02x:%02x:%02x:%02x:%02x:%02x" + "\n" + "#444444 Memory#\n" + " #444444 used# %d (%d%%)\n" + " #444444 frag# %d%%\n" + " #444444 free# %d" + "\n" + "#444444 Steps# %li", + bleAddr[5], + bleAddr[4], + bleAddr[3], + bleAddr[2], + bleAddr[1], + bleAddr[0], + (int) mon.total_size - mon.free_size, + mon.used_pct, + mon.frag_pct, + (int) mon.free_biggest_size, + 0); lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); return std::unique_ptr(new Screens::Label(2, 5, app, label)); } - -bool sortById(const TaskStatus_t &lhs, const TaskStatus_t &rhs) { return lhs.xTaskNumber < rhs.xTaskNumber; } +bool sortById(const TaskStatus_t& lhs, const TaskStatus_t& rhs) { + return lhs.xTaskNumber < rhs.xTaskNumber; +} std::unique_ptr SystemInfo::CreateScreen4() { TaskStatus_t tasksStatus[7]; - lv_obj_t * infoTask = lv_table_create(lv_scr_act(), NULL); + lv_obj_t* infoTask = lv_table_create(lv_scr_act(), NULL); lv_table_set_col_cnt(infoTask, 3); lv_table_set_row_cnt(infoTask, 8); lv_obj_set_pos(infoTask, 10, 10); @@ -176,31 +215,30 @@ std::unique_ptr SystemInfo::CreateScreen4() { auto nb = uxTaskGetSystemState(tasksStatus, 7, nullptr); std::sort(tasksStatus, tasksStatus + nb, sortById); for (uint8_t i = 0; i < nb; i++) { - + lv_table_set_cell_value(infoTask, i + 1, 0, std::to_string(tasksStatus[i].xTaskNumber).c_str()); - lv_table_set_cell_value(infoTask, i + 1, 1, tasksStatus[i].pcTaskName); + lv_table_set_cell_value(infoTask, i + 1, 1, tasksStatus[i].pcTaskName); if (tasksStatus[i].usStackHighWaterMark < 20) { std::string str1 = std::to_string(tasksStatus[i].usStackHighWaterMark) + " low"; lv_table_set_cell_value(infoTask, i + 1, 2, str1.c_str()); } else { lv_table_set_cell_value(infoTask, i + 1, 2, std::to_string(tasksStatus[i].usStackHighWaterMark).c_str()); } - } return std::unique_ptr(new Screens::Label(3, 5, app, infoTask)); } std::unique_ptr SystemInfo::CreateScreen5() { - lv_obj_t * label = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr); lv_label_set_recolor(label, true); lv_label_set_text_static(label, - "Software Licensed\n" - "under the terms of\n" - "the GNU General\n" - "Public License v3\n" - "#444444 Source code#\n" - "#FFFF00 https://github.com/#\n" - "#FFFF00 JF002/InfiniTime#"); + "Software Licensed\n" + "under the terms of\n" + "the GNU General\n" + "Public License v3\n" + "#444444 Source code#\n" + "#FFFF00 https://github.com/#\n" + "#FFFF00 JF002/InfiniTime#"); lv_label_set_align(label, LV_LABEL_ALIGN_CENTER); lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); return std::unique_ptr(new Screens::Label(4, 5, app, label)); diff --git a/src/displayapp/screens/SystemInfo.h b/src/displayapp/screens/SystemInfo.h index f5f50a42..463b8b9c 100644 --- a/src/displayapp/screens/SystemInfo.h +++ b/src/displayapp/screens/SystemInfo.h @@ -21,33 +21,33 @@ namespace Pinetime { namespace Screens { class SystemInfo : public Screen { - public: - explicit SystemInfo(DisplayApp* app, - Pinetime::Controllers::DateTime& dateTimeController, - Pinetime::Controllers::Battery& batteryController, - Pinetime::Controllers::BrightnessController& brightnessController, - Pinetime::Controllers::Ble& bleController, - Pinetime::Drivers::WatchdogView& watchdog); - ~SystemInfo() override; - bool Refresh() override; - bool OnButtonPushed() override; - bool OnTouchEvent(TouchEvents event) override; - private: - bool running = true; + public: + explicit SystemInfo(DisplayApp* app, + Pinetime::Controllers::DateTime& dateTimeController, + Pinetime::Controllers::Battery& batteryController, + Pinetime::Controllers::BrightnessController& brightnessController, + Pinetime::Controllers::Ble& bleController, + Pinetime::Drivers::WatchdogView& watchdog); + ~SystemInfo() override; + bool Refresh() override; + bool OnButtonPushed() override; + bool OnTouchEvent(TouchEvents event) override; - Pinetime::Controllers::DateTime& dateTimeController; - Pinetime::Controllers::Battery& batteryController; - Pinetime::Controllers::BrightnessController& brightnessController; - Pinetime::Controllers::Ble& bleController; - Pinetime::Drivers::WatchdogView& watchdog; + private: + bool running = true; - ScreenList<5> screens; - std::unique_ptr CreateScreen1(); - std::unique_ptr CreateScreen2(); - std::unique_ptr CreateScreen3(); - std::unique_ptr CreateScreen4(); - std::unique_ptr CreateScreen5(); + Pinetime::Controllers::DateTime& dateTimeController; + Pinetime::Controllers::Battery& batteryController; + Pinetime::Controllers::BrightnessController& brightnessController; + Pinetime::Controllers::Ble& bleController; + Pinetime::Drivers::WatchdogView& watchdog; + ScreenList<5> screens; + std::unique_ptr CreateScreen1(); + std::unique_ptr CreateScreen2(); + std::unique_ptr CreateScreen3(); + std::unique_ptr CreateScreen4(); + std::unique_ptr CreateScreen5(); }; } } diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp index b1dfaf76..ec36af38 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -4,37 +4,35 @@ using namespace Pinetime::Applications::Screens; - namespace { - static void lv_update_task(struct _lv_task_t *task) { - auto user_data = static_cast(task->user_data); + static void lv_update_task(struct _lv_task_t* task) { + auto user_data = static_cast(task->user_data); user_data->UpdateScreen(); } - static void event_handler(lv_obj_t * obj, lv_event_t event) { - Tile* screen = static_cast(obj->user_data); + static void event_handler(lv_obj_t* obj, lv_event_t event) { + Tile* screen = static_cast(obj->user_data); uint32_t* eventDataPtr = (uint32_t*) lv_event_get_data(); uint32_t eventData = *eventDataPtr; screen->OnObjectEvent(obj, event, eventData); } } -Tile::Tile(uint8_t screenID, uint8_t numScreens, - DisplayApp* app, - Controllers::Settings& settingsController, - Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController, - std::array& applications) : - Screen(app), - batteryController{batteryController}, - dateTimeController{dateTimeController} { - +Tile::Tile(uint8_t screenID, + uint8_t numScreens, + DisplayApp* app, + Controllers::Settings& settingsController, + Pinetime::Controllers::Battery& batteryController, + Controllers::DateTime& dateTimeController, + std::array& applications) + : Screen(app), batteryController {batteryController}, dateTimeController {dateTimeController} { + settingsController.SetAppMenu(screenID); // Time - label_time = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes()); - lv_label_set_align( label_time, LV_LABEL_ALIGN_CENTER ); + label_time = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes()); + lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER); lv_obj_align(label_time, nullptr, LV_ALIGN_IN_TOP_LEFT, 15, 6); // Battery @@ -42,19 +40,18 @@ Tile::Tile(uint8_t screenID, uint8_t numScreens, lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); lv_obj_align(batteryIcon, nullptr, LV_ALIGN_IN_TOP_RIGHT, -15, 6); - if ( numScreens > 1 ) { + if (numScreens > 1) { pageIndicatorBasePoints[0].x = 240 - 1; pageIndicatorBasePoints[0].y = 6; pageIndicatorBasePoints[1].x = 240 - 1; pageIndicatorBasePoints[1].y = 240 - 6; - + pageIndicatorBase = lv_line_create(lv_scr_act(), nullptr); lv_obj_set_style_local_line_width(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3); lv_obj_set_style_local_line_color(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); lv_obj_set_style_local_line_rounded(pageIndicatorBase, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, true); lv_line_set_points(pageIndicatorBase, pageIndicatorBasePoints, 2); - uint16_t indicatorSize = 228 / numScreens; uint16_t indicatorPos = indicatorSize * screenID; @@ -69,11 +66,12 @@ Tile::Tile(uint8_t screenID, uint8_t numScreens, lv_obj_set_style_local_line_rounded(pageIndicator, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, true); lv_line_set_points(pageIndicator, pageIndicatorPoints, 2); } - + uint8_t btIndex = 0; - for(uint8_t i = 0; i < 6; i++) { - if(i == 3) btnmMap[btIndex++] = "\n"; - if ( applications[i].application == Apps::None ) { + for (uint8_t i = 0; i < 6; i++) { + if (i == 3) + btnmMap[btIndex++] = "\n"; + if (applications[i].application == Apps::None) { btnmMap[btIndex] = " "; } else { btnmMap[btIndex] = applications[i].icon; @@ -94,16 +92,16 @@ Tile::Tile(uint8_t screenID, uint8_t numScreens, lv_obj_set_style_local_bg_opa(btnm1, LV_BTNMATRIX_PART_BTN, LV_STATE_DISABLED, LV_OPA_20); lv_obj_set_style_local_bg_color(btnm1, LV_BTNMATRIX_PART_BTN, LV_STATE_DISABLED, lv_color_hex(0x111111)); - for(uint8_t i = 0; i < 6; i++) { - if ( applications[i].application == Apps::None ) { - lv_btnmatrix_set_btn_ctrl(btnm1, i, LV_BTNMATRIX_CTRL_DISABLED ); + for (uint8_t i = 0; i < 6; i++) { + if (applications[i].application == Apps::None) { + lv_btnmatrix_set_btn_ctrl(btnm1, i, LV_BTNMATRIX_CTRL_DISABLED); } } btnm1->user_data = this; lv_obj_set_event_cb(btnm1, event_handler); - lv_obj_t * backgroundLabel = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* backgroundLabel = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); @@ -118,7 +116,7 @@ Tile::~Tile() { } void Tile::UpdateScreen() { - lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes()); + lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes()); lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); } @@ -126,11 +124,9 @@ bool Tile::Refresh() { return running; } -void Tile::OnObjectEvent(lv_obj_t *obj, lv_event_t event, uint32_t buttonId) { - if(event == LV_EVENT_VALUE_CHANGED) { +void Tile::OnObjectEvent(lv_obj_t* obj, lv_event_t event, uint32_t buttonId) { + if (event == LV_EVENT_VALUE_CHANGED) { app->StartApp(apps[buttonId], DisplayApp::FullRefreshDirections::Up); running = false; } } - - diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h index 54ffcdae..a372a852 100644 --- a/src/displayapp/screens/Tile.h +++ b/src/displayapp/screens/Tile.h @@ -14,42 +14,42 @@ namespace Pinetime { namespace Applications { namespace Screens { class Tile : public Screen { - public: - struct Applications { - const char* icon; - Pinetime::Applications::Apps application; - }; + public: + struct Applications { + const char* icon; + Pinetime::Applications::Apps application; + }; - explicit Tile(uint8_t screenID, uint8_t numScreens, - DisplayApp* app, - Controllers::Settings& settingsController, - Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController, - std::array& applications); + explicit Tile(uint8_t screenID, + uint8_t numScreens, + DisplayApp* app, + Controllers::Settings& settingsController, + Pinetime::Controllers::Battery& batteryController, + Controllers::DateTime& dateTimeController, + std::array& applications); - ~Tile() override; + ~Tile() override; - bool Refresh() override; - void UpdateScreen(); - void OnObjectEvent(lv_obj_t* obj, lv_event_t event, uint32_t buttonId); + bool Refresh() override; + void UpdateScreen(); + void OnObjectEvent(lv_obj_t* obj, lv_event_t event, uint32_t buttonId); - private: + private: + Pinetime::Controllers::Battery& batteryController; + Controllers::DateTime& dateTimeController; - Pinetime::Controllers::Battery& batteryController; - Controllers::DateTime& dateTimeController; + lv_task_t* taskUpdate; - lv_task_t* taskUpdate; + lv_obj_t* label_time; + lv_obj_t* batteryIcon; + lv_point_t pageIndicatorBasePoints[2]; + lv_point_t pageIndicatorPoints[2]; + lv_obj_t* pageIndicatorBase; + lv_obj_t* pageIndicator; + lv_obj_t* btnm1; - lv_obj_t* label_time; - lv_obj_t* batteryIcon; - lv_point_t pageIndicatorBasePoints[2]; - lv_point_t pageIndicatorPoints[2]; - lv_obj_t* pageIndicatorBase; - lv_obj_t* pageIndicator; - lv_obj_t* btnm1; - - const char* btnmMap[8]; - Pinetime::Applications::Apps apps[6]; + const char* btnmMap[8]; + Pinetime::Applications::Apps apps[6]; }; } } diff --git a/src/displayapp/screens/Twos.cpp b/src/displayapp/screens/Twos.cpp index bbee5e11..eb268077 100644 --- a/src/displayapp/screens/Twos.cpp +++ b/src/displayapp/screens/Twos.cpp @@ -8,7 +8,7 @@ using namespace Pinetime::Applications::Screens; -Twos::Twos(Pinetime::Applications::DisplayApp *app) : Screen(app) { +Twos::Twos(Pinetime::Applications::DisplayApp* app) : Screen(app) { // create styles to apply to different valued tiles lv_style_init(&style_cell1); @@ -50,8 +50,8 @@ Twos::Twos(Pinetime::Applications::DisplayApp *app) : Screen(app) { lv_style_set_pad_top(&style_cell5, LV_STATE_DEFAULT, 25); // format grid display - - gridDisplay = lv_table_create(lv_scr_act(), nullptr); + + gridDisplay = lv_table_create(lv_scr_act(), nullptr); lv_obj_add_style(gridDisplay, LV_TABLE_PART_CELL1, &style_cell1); lv_obj_add_style(gridDisplay, LV_TABLE_PART_CELL2, &style_cell2); lv_obj_add_style(gridDisplay, LV_TABLE_PART_CELL3, &style_cell3); @@ -59,17 +59,17 @@ Twos::Twos(Pinetime::Applications::DisplayApp *app) : Screen(app) { lv_obj_add_style(gridDisplay, LV_TABLE_PART_CELL4 + 1, &style_cell5); lv_table_set_col_cnt(gridDisplay, 4); lv_table_set_row_cnt(gridDisplay, 4); - lv_table_set_col_width(gridDisplay, 0, LV_HOR_RES/4); - lv_table_set_col_width(gridDisplay, 1, LV_HOR_RES/4); - lv_table_set_col_width(gridDisplay, 2, LV_HOR_RES/4); - lv_table_set_col_width(gridDisplay, 3, LV_HOR_RES/4); + lv_table_set_col_width(gridDisplay, 0, LV_HOR_RES / 4); + lv_table_set_col_width(gridDisplay, 1, LV_HOR_RES / 4); + lv_table_set_col_width(gridDisplay, 2, LV_HOR_RES / 4); + lv_table_set_col_width(gridDisplay, 3, LV_HOR_RES / 4); lv_obj_align(gridDisplay, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_obj_clean_style_list(gridDisplay, LV_TABLE_PART_BG); // initialize grid - for(int row = 0; row < 4; row++) { - for(int col = 0; col < 4; col++) { + for (int row = 0; row < 4; row++) { + for (int col = 0; col < 4; col++) { grid[row][col].value = 0; lv_table_set_cell_type(gridDisplay, row, col, 1); lv_table_set_cell_align(gridDisplay, row, col, LV_LABEL_ALIGN_CENTER); @@ -86,7 +86,7 @@ Twos::Twos(Pinetime::Applications::DisplayApp *app) : Screen(app) { lv_label_set_recolor(scoreText, true); lv_label_set_text_fmt(scoreText, "Score #FFFF00 %i#", score); - lv_obj_t * backgroundLabel = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* backgroundLabel = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); @@ -107,10 +107,10 @@ bool Twos::Refresh() { } bool Twos::placeNewTile() { - std::vector< std::pair > availableCells; - for(int row = 0; row < 4; row++) { - for(int col = 0; col < 4; col++) { - if(!grid[row][col].value) { + std::vector> availableCells; + for (int row = 0; row < 4; row++) { + for (int col = 0; col < 4; col++) { + if (!grid[row][col].value) { availableCells.push_back(std::make_pair(row, col)); } } @@ -119,22 +119,24 @@ bool Twos::placeNewTile() { if (availableCells.size() == 0) { return false; // game lost } - + auto it = availableCells.cbegin(); int random = rand() % availableCells.size(); std::advance(it, random); - std::pair newCell = *it; + std::pair newCell = *it; - if ((rand() % 100) < 90) grid[newCell.first][newCell.second].value = 2; - else grid[newCell.first][newCell.second].value = 4; + if ((rand() % 100) < 90) + grid[newCell.first][newCell.second].value = 2; + else + grid[newCell.first][newCell.second].value = 4; updateGridDisplay(grid); return true; } -bool Twos::tryMerge(Tile grid[][4], int &newRow, int &newCol, int oldRow, int oldCol) { - if((grid[newRow][newCol].value == grid[oldRow][oldCol].value)) { - if((newCol != oldCol) || (newRow != oldRow)) { - if(!grid[newRow][newCol].merged) { +bool Twos::tryMerge(Tile grid[][4], int& newRow, int& newCol, int oldRow, int oldCol) { + if ((grid[newRow][newCol].value == grid[oldRow][oldCol].value)) { + if ((newCol != oldCol) || (newRow != oldRow)) { + if (!grid[newRow][newCol].merged) { unsigned int newVal = grid[oldRow][oldCol].value *= 2; grid[newRow][newCol].value = newVal; score += newVal; @@ -149,7 +151,7 @@ bool Twos::tryMerge(Tile grid[][4], int &newRow, int &newCol, int oldRow, int ol } bool Twos::tryMove(Tile grid[][4], int newRow, int newCol, int oldRow, int oldCol) { - if(((newCol >= 0) && (newCol != oldCol)) || ((newRow >= 0) && (newRow != oldRow))) { + if (((newCol >= 0) && (newCol != oldCol)) || ((newRow >= 0) && (newRow != oldRow))) { grid[newRow][newCol].value = grid[oldRow][oldCol].value; grid[oldRow][oldCol].value = 0; return true; @@ -159,27 +161,28 @@ bool Twos::tryMove(Tile grid[][4], int newRow, int newCol, int oldRow, int oldCo bool Twos::OnTouchEvent(Pinetime::Applications::TouchEvents event) { bool validMove = false; - for(int row = 0; row < 4; row++) { - for(int col = 0; col < 4; col++) { + for (int row = 0; row < 4; row++) { + for (int col = 0; col < 4; col++) { grid[row][col].merged = false; // reinitialize merge state } } - switch(event) { + switch (event) { case TouchEvents::SwipeLeft: - for(int col = 1; col < 4; col++) { // ignore tiles already on far left - for(int row = 0; row < 4; row++) { - if(grid[row][col].value) { + for (int col = 1; col < 4; col++) { // ignore tiles already on far left + for (int row = 0; row < 4; row++) { + if (grid[row][col].value) { int newCol = -1; - for(int potentialNewCol = col - 1; potentialNewCol >= 0; potentialNewCol--) { - if(!grid[row][potentialNewCol].value) { + for (int potentialNewCol = col - 1; potentialNewCol >= 0; potentialNewCol--) { + if (!grid[row][potentialNewCol].value) { newCol = potentialNewCol; - } - else { // blocked by another tile - if(tryMerge(grid, row, potentialNewCol, row, col)) validMove = true; + } else { // blocked by another tile + if (tryMerge(grid, row, potentialNewCol, row, col)) + validMove = true; break; } } - if(tryMove(grid, row, newCol, row, col)) validMove = true; + if (tryMove(grid, row, newCol, row, col)) + validMove = true; } } } @@ -188,20 +191,21 @@ bool Twos::OnTouchEvent(Pinetime::Applications::TouchEvents event) { } return true; case TouchEvents::SwipeRight: - for(int col = 2; col >= 0; col--) { // ignore tiles already on far right - for(int row = 0; row < 4; row++) { - if(grid[row][col].value) { + for (int col = 2; col >= 0; col--) { // ignore tiles already on far right + for (int row = 0; row < 4; row++) { + if (grid[row][col].value) { int newCol = -1; - for(int potentialNewCol = col + 1; potentialNewCol < 4; potentialNewCol++) { - if(!grid[row][potentialNewCol].value) { + for (int potentialNewCol = col + 1; potentialNewCol < 4; potentialNewCol++) { + if (!grid[row][potentialNewCol].value) { newCol = potentialNewCol; - } - else { // blocked by another tile - if(tryMerge(grid, row, potentialNewCol, row, col)) validMove = true; + } else { // blocked by another tile + if (tryMerge(grid, row, potentialNewCol, row, col)) + validMove = true; break; } } - if(tryMove(grid, row, newCol, row, col)) validMove = true; + if (tryMove(grid, row, newCol, row, col)) + validMove = true; } } } @@ -210,20 +214,21 @@ bool Twos::OnTouchEvent(Pinetime::Applications::TouchEvents event) { } return true; case TouchEvents::SwipeUp: - for(int row = 1; row < 4; row++) { // ignore tiles already on top - for(int col = 0; col < 4; col++) { - if(grid[row][col].value) { + for (int row = 1; row < 4; row++) { // ignore tiles already on top + for (int col = 0; col < 4; col++) { + if (grid[row][col].value) { int newRow = -1; - for(int potentialNewRow = row - 1; potentialNewRow >= 0; potentialNewRow--) { - if(!grid[potentialNewRow][col].value) { + for (int potentialNewRow = row - 1; potentialNewRow >= 0; potentialNewRow--) { + if (!grid[potentialNewRow][col].value) { newRow = potentialNewRow; - } - else { // blocked by another tile - if(tryMerge(grid, potentialNewRow, col, row, col)) validMove = true; + } else { // blocked by another tile + if (tryMerge(grid, potentialNewRow, col, row, col)) + validMove = true; break; } } - if(tryMove(grid, newRow, col, row, col)) validMove = true; + if (tryMove(grid, newRow, col, row, col)) + validMove = true; } } } @@ -232,20 +237,21 @@ bool Twos::OnTouchEvent(Pinetime::Applications::TouchEvents event) { } return true; case TouchEvents::SwipeDown: - for(int row = 2; row >=0; row--) { // ignore tiles already on bottom - for(int col = 0; col < 4; col++) { - if(grid[row][col].value) { + for (int row = 2; row >= 0; row--) { // ignore tiles already on bottom + for (int col = 0; col < 4; col++) { + if (grid[row][col].value) { int newRow = -1; - for(int potentialNewRow = row + 1; potentialNewRow < 4; potentialNewRow++) { - if(!grid[potentialNewRow][col].value) { + for (int potentialNewRow = row + 1; potentialNewRow < 4; potentialNewRow++) { + if (!grid[potentialNewRow][col].value) { newRow = potentialNewRow; - } - else { // blocked by another tile - if(tryMerge(grid, potentialNewRow, col, row, col)) validMove = true; + } else { // blocked by another tile + if (tryMerge(grid, potentialNewRow, col, row, col)) + validMove = true; break; } } - if(tryMove(grid, newRow, col, row, col)) validMove = true; + if (tryMove(grid, newRow, col, row, col)) + validMove = true; } } } @@ -260,12 +266,11 @@ bool Twos::OnTouchEvent(Pinetime::Applications::TouchEvents event) { } void Twos::updateGridDisplay(Tile grid[][4]) { - for(int row = 0; row < 4; row++) { - for(int col = 0; col < 4; col++) { + for (int row = 0; row < 4; row++) { + for (int col = 0; col < 4; col++) { if (grid[row][col].value) { lv_table_set_cell_value(gridDisplay, row, col, (std::to_string(grid[row][col].value)).c_str()); - } - else { + } else { lv_table_set_cell_value(gridDisplay, row, col, ""); } switch (grid[row][col].value) { diff --git a/src/displayapp/screens/Twos.h b/src/displayapp/screens/Twos.h index 7223c7a8..ade5abb0 100644 --- a/src/displayapp/screens/Twos.h +++ b/src/displayapp/screens/Twos.h @@ -11,30 +11,28 @@ namespace Pinetime { }; namespace Screens { class Twos : public Screen { - public: - Twos(DisplayApp* app); - ~Twos() override; - bool Refresh() override; - - bool OnTouchEvent(TouchEvents event) override; + public: + Twos(DisplayApp* app); + ~Twos() override; + bool Refresh() override; - private: + bool OnTouchEvent(TouchEvents event) override; - lv_style_t style_cell1; - lv_style_t style_cell2; - lv_style_t style_cell3; - lv_style_t style_cell4; - lv_style_t style_cell5; - - - lv_obj_t *scoreText; - lv_obj_t *gridDisplay; - Tile grid[4][4]; - unsigned int score = 0; - void updateGridDisplay(Tile grid[][4]); - bool tryMerge(Tile grid[][4], int &newRow, int &newCol, int oldRow, int oldCol); - bool tryMove(Tile grid[][4], int newRow, int newCol, int oldRow, int oldCol); - bool placeNewTile(); + private: + lv_style_t style_cell1; + lv_style_t style_cell2; + lv_style_t style_cell3; + lv_style_t style_cell4; + lv_style_t style_cell5; + + lv_obj_t* scoreText; + lv_obj_t* gridDisplay; + Tile grid[4][4]; + unsigned int score = 0; + void updateGridDisplay(Tile grid[][4]); + bool tryMerge(Tile grid[][4], int& newRow, int& newCol, int oldRow, int oldCol); + bool tryMove(Tile grid[][4], int newRow, int newCol, int oldRow, int oldCol); + bool placeNewTile(); }; } } diff --git a/src/displayapp/screens/WatchFaceAnalog.cpp b/src/displayapp/screens/WatchFaceAnalog.cpp index 66af584a..02f1fc2a 100644 --- a/src/displayapp/screens/WatchFaceAnalog.cpp +++ b/src/displayapp/screens/WatchFaceAnalog.cpp @@ -14,44 +14,45 @@ using namespace Pinetime::Applications::Screens; #define HOUR_LENGTH 70 #define MINUTE_LENGTH 90 #define SECOND_LENGTH 110 -#define PI 3.14159265358979323846 +#define PI 3.14159265358979323846 // ## -static int16_t coordinate_x_relocate(int16_t x) -{ - return ((x) + LV_HOR_RES / 2); +static int16_t coordinate_x_relocate(int16_t x) { + return ((x) + LV_HOR_RES / 2); } // ## -static int16_t coordinate_y_relocate(int16_t y) -{ - return (((y) - LV_HOR_RES / 2) < 0) ? (0 - ((y) - LV_HOR_RES / 2)) : ((y) - LV_HOR_RES / 2); +static int16_t coordinate_y_relocate(int16_t y) { + return (((y) -LV_HOR_RES / 2) < 0) ? (0 - ((y) -LV_HOR_RES / 2)) : ((y) -LV_HOR_RES / 2); } -WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp *app, - Controllers::DateTime& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, - Controllers::Settings &settingsController) : Screen(app), currentDateTime{{}}, - dateTimeController{dateTimeController}, batteryController{batteryController}, - bleController{bleController}, notificatioManager{notificatioManager}, - settingsController{settingsController} { +WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController) + : Screen(app), + currentDateTime {{}}, + dateTimeController {dateTimeController}, + batteryController {batteryController}, + bleController {bleController}, + notificatioManager {notificatioManager}, + settingsController {settingsController} { settingsController.SetClockFace(1); sHour = 99; sMinute = 99; - sSecond = 99; - - lv_obj_t * bg_clock_img = lv_img_create(lv_scr_act(), NULL); + sSecond = 99; + + lv_obj_t* bg_clock_img = lv_img_create(lv_scr_act(), NULL); lv_img_set_src(bg_clock_img, &bg_clock); lv_obj_align(bg_clock_img, NULL, LV_ALIGN_CENTER, 0, 0); - batteryIcon = lv_label_create(lv_scr_act(), nullptr); + batteryIcon = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text(batteryIcon, Symbols::batteryHalf); lv_obj_align(batteryIcon, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, -8, -4); - notificationIcon = lv_label_create(lv_scr_act(), NULL); lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FF00)); lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); @@ -61,17 +62,16 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp *app, label_date_day = lv_label_create(lv_scr_act(), NULL); lv_obj_set_style_local_text_color(label_date_day, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xf0a500)); - lv_label_set_text_fmt(label_date_day, "%s\n%02i", dateTimeController.DayOfWeekShortToString(), dateTimeController.Day()); - lv_label_set_align( label_date_day, LV_LABEL_ALIGN_CENTER ); - lv_obj_align(label_date_day, NULL, LV_ALIGN_CENTER, 50, 0); - + lv_label_set_text_fmt(label_date_day, "%s\n%02i", dateTimeController.DayOfWeekShortToString(), dateTimeController.Day()); + lv_label_set_align(label_date_day, LV_LABEL_ALIGN_CENTER); + lv_obj_align(label_date_day, NULL, LV_ALIGN_CENTER, 50, 0); + minute_body = lv_line_create(lv_scr_act(), NULL); minute_body_trace = lv_line_create(lv_scr_act(), NULL); - hour_body = lv_line_create(lv_scr_act(), NULL); - hour_body_trace = lv_line_create(lv_scr_act(), NULL); + hour_body = lv_line_create(lv_scr_act(), NULL); + hour_body_trace = lv_line_create(lv_scr_act(), NULL); second_body = lv_line_create(lv_scr_act(), NULL); - lv_style_init(&second_line_style); lv_style_set_line_width(&second_line_style, LV_STATE_DEFAULT, 3); lv_style_set_line_color(&second_line_style, LV_STATE_DEFAULT, LV_COLOR_RED); @@ -90,7 +90,6 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp *app, lv_style_set_line_rounded(&minute_line_style_trace, LV_STATE_DEFAULT, false); lv_obj_add_style(minute_body_trace, LV_LINE_PART_MAIN, &minute_line_style_trace); - lv_style_init(&hour_line_style); lv_style_set_line_width(&hour_line_style, LV_STATE_DEFAULT, 7); lv_style_set_line_color(&hour_line_style, LV_STATE_DEFAULT, LV_COLOR_WHITE); @@ -104,7 +103,6 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp *app, lv_obj_add_style(hour_body_trace, LV_LINE_PART_MAIN, &hour_line_style_trace); UpdateClock(); - } WatchFaceAnalog::~WatchFaceAnalog() { @@ -114,17 +112,17 @@ WatchFaceAnalog::~WatchFaceAnalog() { lv_style_reset(&minute_line_style); lv_style_reset(&minute_line_style_trace); lv_style_reset(&second_line_style); - + lv_obj_clean(lv_scr_act()); } void WatchFaceAnalog::UpdateClock() { - + hour = dateTimeController.Hours(); minute = dateTimeController.Minutes(); - second = dateTimeController.Seconds(); + second = dateTimeController.Seconds(); - if(sMinute != minute) { + if (sMinute != minute) { minute_point[0].x = coordinate_x_relocate(30 * sin(minute * 6 * PI / 180)); minute_point[0].y = coordinate_y_relocate(30 * cos(minute * 6 * PI / 180)); minute_point[1].x = coordinate_x_relocate(MINUTE_LENGTH * sin(minute * 6 * PI / 180)); @@ -134,40 +132,38 @@ void WatchFaceAnalog::UpdateClock() { minute_point_trace[0].y = coordinate_y_relocate(5 * cos(minute * 6 * PI / 180)); minute_point_trace[1].x = coordinate_x_relocate(31 * sin(minute * 6 * PI / 180)); minute_point_trace[1].y = coordinate_y_relocate(31 * cos(minute * 6 * PI / 180)); - + lv_line_set_points(minute_body, minute_point, 2); lv_line_set_points(minute_body_trace, minute_point_trace, 2); } - if(sHour != hour || sMinute != minute) { + if (sHour != hour || sMinute != minute) { sHour = hour; sMinute = minute; - hour_point[0].x = coordinate_x_relocate(30 * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); - hour_point[0].y = coordinate_y_relocate(30 * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); - hour_point[1].x = coordinate_x_relocate(HOUR_LENGTH * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); - hour_point[1].y = coordinate_y_relocate(HOUR_LENGTH * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); + hour_point[0].x = coordinate_x_relocate(30 * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); + hour_point[0].y = coordinate_y_relocate(30 * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); + hour_point[1].x = coordinate_x_relocate(HOUR_LENGTH * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); + hour_point[1].y = coordinate_y_relocate(HOUR_LENGTH * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); - hour_point_trace[0].x = coordinate_x_relocate(5 * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); - hour_point_trace[0].y = coordinate_y_relocate(5 * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); - hour_point_trace[1].x = coordinate_x_relocate(31 * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); - hour_point_trace[1].y = coordinate_y_relocate(31 * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); + hour_point_trace[0].x = coordinate_x_relocate(5 * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); + hour_point_trace[0].y = coordinate_y_relocate(5 * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); + hour_point_trace[1].x = coordinate_x_relocate(31 * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); + hour_point_trace[1].y = coordinate_y_relocate(31 * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180)); - lv_line_set_points(hour_body, hour_point, 2); - lv_line_set_points(hour_body_trace, hour_point_trace, 2); + lv_line_set_points(hour_body, hour_point, 2); + lv_line_set_points(hour_body_trace, hour_point_trace, 2); } - if(sSecond != second) { + if (sSecond != second) { sSecond = second; second_point[0].x = coordinate_x_relocate(20 * sin((180 + second * 6) * PI / 180)); second_point[0].y = coordinate_y_relocate(20 * cos((180 + second * 6) * PI / 180)); second_point[1].x = coordinate_x_relocate(SECOND_LENGTH * sin(second * 6 * PI / 180)); second_point[1].y = coordinate_y_relocate(SECOND_LENGTH * cos(second * 6 * PI / 180)); lv_line_set_points(second_body, second_point, 2); - } } - bool WatchFaceAnalog::Refresh() { batteryPercentRemaining = batteryController.PercentRemaining(); @@ -176,11 +172,10 @@ bool WatchFaceAnalog::Refresh() { lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); } - notificationState = notificatioManager.AreNewNotificationsAvailable(); - if(notificationState.IsUpdated()) { - if(notificationState.Get() == true) + if (notificationState.IsUpdated()) { + if (notificationState.Get() == true) lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(true)); else lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); @@ -188,17 +183,17 @@ bool WatchFaceAnalog::Refresh() { currentDateTime = dateTimeController.CurrentDateTime(); - if(currentDateTime.IsUpdated()) { - + if (currentDateTime.IsUpdated()) { + month = dateTimeController.Month(); day = dateTimeController.Day(); dayOfWeek = dateTimeController.DayOfWeek(); UpdateClock(); - + if ((month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { - lv_label_set_text_fmt(label_date_day, "%s\n%02i", dateTimeController.DayOfWeekShortToString(), day); + lv_label_set_text_fmt(label_date_day, "%s\n%02i", dateTimeController.DayOfWeekShortToString(), day); currentMonth = month; currentDayOfWeek = dayOfWeek; diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index 56b086ab..8957aca8 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -22,68 +22,67 @@ namespace Pinetime { namespace Screens { class WatchFaceAnalog : public Screen { - public: - WatchFaceAnalog(DisplayApp* app, - Controllers::DateTime& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, - Controllers::Settings &settingsController); - - ~WatchFaceAnalog() override; + public: + WatchFaceAnalog(DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController); - bool Refresh() override; + ~WatchFaceAnalog() override; - private: - uint8_t sHour, sMinute, sSecond; - uint8_t hour; - uint8_t minute; - uint8_t second; + bool Refresh() override; - Pinetime::Controllers::DateTime::Months month; - uint8_t day; - Pinetime::Controllers::DateTime::Days dayOfWeek; + private: + uint8_t sHour, sMinute, sSecond; + uint8_t hour; + uint8_t minute; + uint8_t second; - Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; - Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; - uint8_t currentDay = 0; + Pinetime::Controllers::DateTime::Months month; + uint8_t day; + Pinetime::Controllers::DateTime::Days dayOfWeek; - DirtyValue batteryPercentRemaining {0}; - DirtyValue> currentDateTime; - DirtyValue notificationState {false}; + Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; + Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + uint8_t currentDay = 0; - lv_obj_t *hour_body; - lv_obj_t *hour_body_trace; - lv_obj_t *minute_body; - lv_obj_t *minute_body_trace; - lv_obj_t *second_body; + DirtyValue batteryPercentRemaining {0}; + DirtyValue> currentDateTime; + DirtyValue notificationState {false}; - // ## - lv_point_t hour_point[2]; - lv_point_t hour_point_trace[2]; - lv_point_t minute_point[2]; - lv_point_t minute_point_trace[2]; - lv_point_t second_point[2]; + lv_obj_t* hour_body; + lv_obj_t* hour_body_trace; + lv_obj_t* minute_body; + lv_obj_t* minute_body_trace; + lv_obj_t* second_body; - // ## - lv_style_t hour_line_style; - lv_style_t hour_line_style_trace; - lv_style_t minute_line_style; - lv_style_t minute_line_style_trace; - lv_style_t second_line_style; - - lv_obj_t* label_date_day; - lv_obj_t* batteryIcon; - lv_obj_t* notificationIcon; - + // ## + lv_point_t hour_point[2]; + lv_point_t hour_point_trace[2]; + lv_point_t minute_point[2]; + lv_point_t minute_point_trace[2]; + lv_point_t second_point[2]; - Controllers::DateTime& dateTimeController; - Controllers::Battery& batteryController; - Controllers::Ble& bleController; - Controllers::NotificationManager& notificatioManager; - Controllers::Settings& settingsController; + // ## + lv_style_t hour_line_style; + lv_style_t hour_line_style_trace; + lv_style_t minute_line_style; + lv_style_t minute_line_style_trace; + lv_style_t second_line_style; - void UpdateClock(); + lv_obj_t* label_date_day; + lv_obj_t* batteryIcon; + lv_obj_t* notificationIcon; + + Controllers::DateTime& dateTimeController; + Controllers::Battery& batteryController; + Controllers::Ble& bleController; + Controllers::NotificationManager& notificatioManager; + Controllers::Settings& settingsController; + + void UpdateClock(); }; } } diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp index 15f73e8b..bf078d03 100644 --- a/src/displayapp/screens/WatchFaceDigital.cpp +++ b/src/displayapp/screens/WatchFaceDigital.cpp @@ -17,20 +17,23 @@ using namespace Pinetime::Applications::Screens; - WatchFaceDigital::WatchFaceDigital(DisplayApp* app, - Controllers::DateTime& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, - Controllers::Settings &settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController) : Screen(app), currentDateTime{{}}, - dateTimeController{dateTimeController}, batteryController{batteryController}, - bleController{bleController}, notificatioManager{notificatioManager}, - settingsController{settingsController}, - heartRateController{heartRateController}, - motionController{motionController} { + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController) + : Screen(app), + currentDateTime {{}}, + dateTimeController {dateTimeController}, + batteryController {batteryController}, + bleController {bleController}, + notificatioManager {notificatioManager}, + settingsController {settingsController}, + heartRateController {heartRateController}, + motionController {motionController} { settingsController.SetClockFace(0); displayedChar[0] = 0; @@ -62,15 +65,15 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); lv_obj_set_style_local_text_color(label_date, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x999999)); - label_time = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed); + label_time = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_font(label_time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed); lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0); label_time_ampm = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text_static(label_time_ampm, ""); - lv_obj_align(label_time_ampm, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -30, -55); - + lv_obj_align(label_time_ampm, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -30, -55); + backgroundLabel = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_click(backgroundLabel, true); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); @@ -78,7 +81,6 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app, lv_obj_set_pos(backgroundLabel, 0, 0); lv_label_set_text(backgroundLabel, ""); - heartbeatIcon = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text(heartbeatIcon, Symbols::heartBeat); lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B)); @@ -120,7 +122,7 @@ bool WatchFaceDigital::Refresh() { bleState = bleController.IsConnected(); if (bleState.IsUpdated()) { - if(bleState.Get() == true) { + if (bleState.Get() == true) { lv_label_set_text(bleIcon, BleIcon::GetIcon(true)); } else { lv_label_set_text(bleIcon, BleIcon::GetIcon(false)); @@ -131,8 +133,8 @@ bool WatchFaceDigital::Refresh() { lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0); notificationState = notificatioManager.AreNewNotificationsAvailable(); - if(notificationState.IsUpdated()) { - if(notificationState.Get() == true) + if (notificationState.IsUpdated()) { + if (notificationState.Get() == true) lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(true)); else lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); @@ -140,16 +142,16 @@ bool WatchFaceDigital::Refresh() { currentDateTime = dateTimeController.CurrentDateTime(); - if(currentDateTime.IsUpdated()) { + if (currentDateTime.IsUpdated()) { auto newDateTime = currentDateTime.Get(); auto dp = date::floor(newDateTime); - auto time = date::make_time(newDateTime-dp); + auto time = date::make_time(newDateTime - dp); auto yearMonthDay = date::year_month_day(dp); - auto year = (int)yearMonthDay.year(); - auto month = static_cast((unsigned)yearMonthDay.month()); - auto day = (unsigned)yearMonthDay.day(); + auto year = (int) yearMonthDay.year(); + auto month = static_cast((unsigned) yearMonthDay.month()); + auto day = (unsigned) yearMonthDay.day(); auto dayOfWeek = static_cast(date::weekday(yearMonthDay).iso_encoding()); int hour = time.hours().count(); @@ -160,29 +162,26 @@ bool WatchFaceDigital::Refresh() { char hoursChar[3]; char ampmChar[3]; - if ( settingsController.GetClockType() == Controllers::Settings::ClockType::H24 ) { + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { sprintf(hoursChar, "%02d", hour); } else { if (hour == 0 && hour != 12) { - hour = 12; - sprintf(ampmChar, "AM"); - } - else if (hour == 12 && hour != 0) { - hour = 12; - sprintf(ampmChar, "PM"); - } - else if (hour < 12 && hour != 0) { - sprintf(ampmChar, "AM"); - } - else if (hour > 12 && hour != 0) - { - hour = hour - 12; - sprintf(ampmChar, "PM"); + hour = 12; + sprintf(ampmChar, "AM"); + } else if (hour == 12 && hour != 0) { + hour = 12; + sprintf(ampmChar, "PM"); + } else if (hour < 12 && hour != 0) { + sprintf(ampmChar, "AM"); + } else if (hour > 12 && hour != 0) { + hour = hour - 12; + sprintf(ampmChar, "PM"); } sprintf(hoursChar, "%02d", hour); } - if(hoursChar[0] != displayedChar[0] || hoursChar[1] != displayedChar[1] || minutesChar[0] != displayedChar[2] || minutesChar[1] != displayedChar[3]) { + if (hoursChar[0] != displayedChar[0] || hoursChar[1] != displayedChar[1] || minutesChar[0] != displayedChar[2] || + minutesChar[1] != displayedChar[3]) { displayedChar[0] = hoursChar[0]; displayedChar[1] = hoursChar[1]; displayedChar[2] = minutesChar[0]; @@ -190,25 +189,26 @@ bool WatchFaceDigital::Refresh() { char timeStr[6]; - if ( settingsController.GetClockType() == Controllers::Settings::ClockType::H12 ) { + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { lv_label_set_text(label_time_ampm, ampmChar); - if ( hoursChar[0] == '0' ) { hoursChar[0] = ' '; } + if (hoursChar[0] == '0') { + hoursChar[0] = ' '; + } } - sprintf(timeStr, "%c%c:%c%c", hoursChar[0],hoursChar[1],minutesChar[0], minutesChar[1]); + sprintf(timeStr, "%c%c:%c%c", hoursChar[0], hoursChar[1], minutesChar[0], minutesChar[1]); lv_label_set_text(label_time, timeStr); - - if ( settingsController.GetClockType() == Controllers::Settings::ClockType::H12 ) { + + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0); } else { lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0); } - } if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { char dateStr[22]; - if ( settingsController.GetClockType() == Controllers::Settings::ClockType::H24 ) { + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { sprintf(dateStr, "%s %d %s %d", dateTimeController.DayOfWeekShortToString(), day, dateTimeController.MonthShortToString(), year); } else { sprintf(dateStr, "%s %s %d %d", dateTimeController.DayOfWeekShortToString(), dateTimeController.MonthShortToString(), day, year); @@ -216,7 +216,6 @@ bool WatchFaceDigital::Refresh() { lv_label_set_text(label_date, dateStr); lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60); - currentYear = year; currentMonth = month; currentDayOfWeek = dayOfWeek; @@ -226,12 +225,12 @@ bool WatchFaceDigital::Refresh() { heartbeat = heartRateController.HeartRate(); heartbeatRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped; - if(heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) { - if(heartbeatRunning.Get()) - lv_label_set_text_fmt(heartbeatValue, "%d", heartbeat.Get()); + if (heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) { + if (heartbeatRunning.Get()) + lv_label_set_text_fmt(heartbeatValue, "%d", heartbeat.Get()); else lv_label_set_text_static(heartbeatValue, "---"); - + lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 5, -2); lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0); lv_obj_align(heartbeatBpm, heartbeatValue, LV_ALIGN_OUT_RIGHT_MID, 5, 0); @@ -239,7 +238,7 @@ bool WatchFaceDigital::Refresh() { stepCount = motionController.NbSteps(); motionSensorOk = motionController.IsSensorOk(); - if(stepCount.IsUpdated() || motionSensorOk.IsUpdated()) { + if (stepCount.IsUpdated() || motionSensorOk.IsUpdated()) { lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get()); lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, -5, -2); lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0); @@ -247,5 +246,3 @@ bool WatchFaceDigital::Refresh() { return running; } - - diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index 67d32ff6..fb6d9cbb 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -22,64 +22,59 @@ namespace Pinetime { namespace Screens { class WatchFaceDigital : public Screen { - public: - WatchFaceDigital(DisplayApp* app, - Controllers::DateTime& dateTimeController, - Controllers::Battery& batteryController, - Controllers::Ble& bleController, - Controllers::NotificationManager& notificatioManager, - Controllers::Settings &settingsController, - Controllers::HeartRateController& heartRateController, - Controllers::MotionController& motionController); - ~WatchFaceDigital() override; + public: + WatchFaceDigital(DisplayApp* app, + Controllers::DateTime& dateTimeController, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Controllers::NotificationManager& notificatioManager, + Controllers::Settings& settingsController, + Controllers::HeartRateController& heartRateController, + Controllers::MotionController& motionController); + ~WatchFaceDigital() override; - bool Refresh() override; - + bool Refresh() override; - void OnObjectEvent(lv_obj_t *pObj, lv_event_t i); - private: + void OnObjectEvent(lv_obj_t* pObj, lv_event_t i); + private: + char displayedChar[5]; - char displayedChar[5]; + uint16_t currentYear = 1970; + Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; + Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; + uint8_t currentDay = 0; - uint16_t currentYear = 1970; - Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; - Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; - uint8_t currentDay = 0; + DirtyValue batteryPercentRemaining {}; + DirtyValue bleState {}; + DirtyValue> currentDateTime {}; + DirtyValue motionSensorOk {}; + DirtyValue stepCount {}; + DirtyValue heartbeat {}; + DirtyValue heartbeatRunning {}; + DirtyValue notificationState {}; - DirtyValue batteryPercentRemaining {}; - DirtyValue bleState {}; - DirtyValue> currentDateTime{}; - DirtyValue motionSensorOk {}; - DirtyValue stepCount {}; - DirtyValue heartbeat {}; - DirtyValue heartbeatRunning {}; - DirtyValue notificationState {}; - - lv_obj_t* label_time; - lv_obj_t* label_time_ampm; - lv_obj_t* label_date; - lv_obj_t* backgroundLabel; - lv_obj_t* batteryIcon; - lv_obj_t* bleIcon; - lv_obj_t* batteryPlug; - lv_obj_t* heartbeatIcon; - lv_obj_t* heartbeatValue; - lv_obj_t* heartbeatBpm; - lv_obj_t* stepIcon; - lv_obj_t* stepValue; - lv_obj_t* notificationIcon; - - Controllers::DateTime& dateTimeController; - Controllers::Battery& batteryController; - Controllers::Ble& bleController; - Controllers::NotificationManager& notificatioManager; - Controllers::Settings& settingsController; - Controllers::HeartRateController& heartRateController; - Controllers::MotionController& motionController; - - + lv_obj_t* label_time; + lv_obj_t* label_time_ampm; + lv_obj_t* label_date; + lv_obj_t* backgroundLabel; + lv_obj_t* batteryIcon; + lv_obj_t* bleIcon; + lv_obj_t* batteryPlug; + lv_obj_t* heartbeatIcon; + lv_obj_t* heartbeatValue; + lv_obj_t* heartbeatBpm; + lv_obj_t* stepIcon; + lv_obj_t* stepValue; + lv_obj_t* notificationIcon; + Controllers::DateTime& dateTimeController; + Controllers::Battery& batteryController; + Controllers::Ble& bleController; + Controllers::NotificationManager& notificatioManager; + Controllers::Settings& settingsController; + Controllers::HeartRateController& heartRateController; + Controllers::MotionController& motionController; }; } } diff --git a/src/displayapp/screens/settings/QuickSettings.cpp b/src/displayapp/screens/settings/QuickSettings.cpp index 9fd051b8..d19e4222 100644 --- a/src/displayapp/screens/settings/QuickSettings.cpp +++ b/src/displayapp/screens/settings/QuickSettings.cpp @@ -3,66 +3,61 @@ #include "displayapp/screens/Symbols.h" #include "displayapp/screens/BatteryIcon.h" - using namespace Pinetime::Applications::Screens; namespace { - static void ButtonEventHandler(lv_obj_t * obj, lv_event_t event) { - QuickSettings* screen = static_cast(obj->user_data); + static void ButtonEventHandler(lv_obj_t* obj, lv_event_t event) { + QuickSettings* screen = static_cast(obj->user_data); screen->OnButtonEvent(obj, event); } - static void lv_update_task(struct _lv_task_t *task) { - auto user_data = static_cast(task->user_data); + static void lv_update_task(struct _lv_task_t* task) { + auto user_data = static_cast(task->user_data); user_data->UpdateScreen(); } } -QuickSettings::QuickSettings( - Pinetime::Applications::DisplayApp *app, - Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController, - Controllers::BrightnessController& brightness, - Pinetime::Controllers::Settings &settingsController) : - Screen(app), - batteryController{batteryController}, - dateTimeController{dateTimeController}, - brightness{brightness}, - settingsController{settingsController} -{ +QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app, + Pinetime::Controllers::Battery& batteryController, + Controllers::DateTime& dateTimeController, + Controllers::BrightnessController& brightness, + Pinetime::Controllers::Settings& settingsController) + : Screen(app), + batteryController {batteryController}, + dateTimeController {dateTimeController}, + brightness {brightness}, + settingsController {settingsController} { // Time - label_time = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes()); - lv_label_set_align( label_time, LV_LABEL_ALIGN_CENTER ); + label_time = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes()); + lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER); lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 15, 4); batteryIcon = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); lv_obj_align(batteryIcon, nullptr, LV_ALIGN_IN_TOP_RIGHT, -15, 4); - - lv_obj_t * lbl_btn; + lv_obj_t* lbl_btn; btn1 = lv_btn_create(lv_scr_act(), nullptr); btn1->user_data = this; lv_obj_set_event_cb(btn1, ButtonEventHandler); - lv_obj_align(btn1, nullptr, LV_ALIGN_CENTER, -50, -30); + lv_obj_align(btn1, nullptr, LV_ALIGN_CENTER, -50, -30); lv_obj_set_style_local_radius(btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 20); - lv_obj_set_style_local_bg_color(btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); + lv_obj_set_style_local_bg_color(btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); lv_obj_set_style_local_bg_grad_dir(btn1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_GRAD_DIR_NONE); - lv_btn_set_fit2(btn1, LV_FIT_TIGHT, LV_FIT_TIGHT); + lv_btn_set_fit2(btn1, LV_FIT_TIGHT, LV_FIT_TIGHT); btn1_lvl = lv_label_create(btn1, nullptr); lv_obj_set_style_local_text_font(btn1_lvl, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); lv_label_set_text_static(btn1_lvl, brightness.GetIcon()); - btn2 = lv_btn_create(lv_scr_act(), nullptr); btn2->user_data = this; lv_obj_set_event_cb(btn2, ButtonEventHandler); - lv_obj_align(btn2, nullptr, LV_ALIGN_CENTER, 50, -30); + lv_obj_align(btn2, nullptr, LV_ALIGN_CENTER, 50, -30); lv_obj_set_style_local_radius(btn2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 20); lv_obj_set_style_local_bg_color(btn2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); lv_obj_set_style_local_bg_grad_dir(btn2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_GRAD_DIR_NONE); @@ -71,7 +66,6 @@ QuickSettings::QuickSettings( lbl_btn = lv_label_create(btn2, nullptr); lv_obj_set_style_local_text_font(lbl_btn, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); lv_label_set_text_static(lbl_btn, Symbols::highlight); - btn3 = lv_btn_create(lv_scr_act(), nullptr); btn3->user_data = this; @@ -86,9 +80,9 @@ QuickSettings::QuickSettings( lv_btn_set_fit2(btn3, LV_FIT_TIGHT, LV_FIT_TIGHT); btn3_lvl = lv_label_create(btn3, nullptr); - lv_obj_set_style_local_text_font(btn3_lvl, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); + lv_obj_set_style_local_text_font(btn3_lvl, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); - if ( settingsController.GetVibrationStatus() == Controllers::Settings::Vibration::ON ) { + if (settingsController.GetVibrationStatus() == Controllers::Settings::Vibration::ON) { lv_obj_add_state(btn3, LV_STATE_CHECKED); lv_label_set_text_static(btn3_lvl, Symbols::notificationsOn); } else { @@ -98,7 +92,7 @@ QuickSettings::QuickSettings( btn4 = lv_btn_create(lv_scr_act(), nullptr); btn4->user_data = this; lv_obj_set_event_cb(btn4, ButtonEventHandler); - lv_obj_align(btn4, nullptr, LV_ALIGN_CENTER, 50, 60); + lv_obj_align(btn4, nullptr, LV_ALIGN_CENTER, 50, 60); lv_obj_set_style_local_radius(btn4, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 20); lv_obj_set_style_local_bg_color(btn4, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); lv_obj_set_style_local_bg_grad_dir(btn4, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_GRAD_DIR_NONE); @@ -108,17 +102,15 @@ QuickSettings::QuickSettings( lv_obj_set_style_local_text_font(lbl_btn, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_sys_48); lv_label_set_text_static(lbl_btn, Symbols::settings); - lv_obj_t * backgroundLabel = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* backgroundLabel = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); lv_label_set_text_static(backgroundLabel, ""); taskUpdate = lv_task_create(lv_update_task, 500000, LV_TASK_PRIO_MID, this); - } - QuickSettings::~QuickSettings() { lv_task_del(taskUpdate); lv_obj_clean(lv_scr_act()); @@ -126,39 +118,37 @@ QuickSettings::~QuickSettings() { } void QuickSettings::UpdateScreen() { - lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes()); + lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes()); lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); } -void QuickSettings::OnButtonEvent(lv_obj_t *object, lv_event_t event) { - if(object == btn2 && event == LV_EVENT_PRESSED) { - +void QuickSettings::OnButtonEvent(lv_obj_t* object, lv_event_t event) { + if (object == btn2 && event == LV_EVENT_PRESSED) { + running = false; app->StartApp(Apps::FlashLight, DisplayApp::FullRefreshDirections::None); - } else if(object == btn1 && event == LV_EVENT_PRESSED) { - + } else if (object == btn1 && event == LV_EVENT_PRESSED) { + brightness.Step(); lv_label_set_text_static(btn1_lvl, brightness.GetIcon()); - settingsController.SetBrightness( brightness.Level() ); + settingsController.SetBrightness(brightness.Level()); - } else if(object == btn3 && event == LV_EVENT_VALUE_CHANGED) { - - if(lv_obj_get_state(btn3, LV_BTN_PART_MAIN) & LV_STATE_CHECKED) { - settingsController.SetVibrationStatus( Controllers::Settings::Vibration::ON ); + } else if (object == btn3 && event == LV_EVENT_VALUE_CHANGED) { + + if (lv_obj_get_state(btn3, LV_BTN_PART_MAIN) & LV_STATE_CHECKED) { + settingsController.SetVibrationStatus(Controllers::Settings::Vibration::ON); lv_label_set_text_static(btn3_lvl, Symbols::notificationsOn); } else { settingsController.SetVibrationStatus(Controllers::Settings::Vibration::OFF); lv_label_set_text_static(btn3_lvl, Symbols::notificationsOff); } - } else if(object == btn4 && event == LV_EVENT_PRESSED) { + } else if (object == btn4 && event == LV_EVENT_PRESSED) { running = false; settingsController.SetSettingsMenu(0); app->StartApp(Apps::Settings, DisplayApp::FullRefreshDirections::Up); - } - } bool QuickSettings::OnTouchEvent(Pinetime::Applications::TouchEvents event) { diff --git a/src/displayapp/screens/settings/QuickSettings.h b/src/displayapp/screens/settings/QuickSettings.h index 329be55b..693fd757 100644 --- a/src/displayapp/screens/settings/QuickSettings.h +++ b/src/displayapp/screens/settings/QuickSettings.h @@ -10,47 +10,44 @@ #include "components/settings/Settings.h" #include "components/battery/BatteryController.h" - namespace Pinetime { namespace Applications { namespace Screens { - class QuickSettings : public Screen{ - public: - QuickSettings(DisplayApp* app, - Pinetime::Controllers::Battery& batteryController, - Controllers::DateTime& dateTimeController, - Controllers::BrightnessController& brightness, - Pinetime::Controllers::Settings &settingsController); + class QuickSettings : public Screen { + public: + QuickSettings(DisplayApp* app, + Pinetime::Controllers::Battery& batteryController, + Controllers::DateTime& dateTimeController, + Controllers::BrightnessController& brightness, + Pinetime::Controllers::Settings& settingsController); - ~QuickSettings() override; + ~QuickSettings() override; - bool Refresh() override; - - bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; - void OnButtonEvent(lv_obj_t *object, lv_event_t event); + bool Refresh() override; - void UpdateScreen(); + bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; + void OnButtonEvent(lv_obj_t* object, lv_event_t event); - private: + void UpdateScreen(); - Pinetime::Controllers::Battery& batteryController; - Controllers::DateTime& dateTimeController; - Controllers::BrightnessController& brightness; - Controllers::Settings& settingsController; + private: + Pinetime::Controllers::Battery& batteryController; + Controllers::DateTime& dateTimeController; + Controllers::BrightnessController& brightness; + Controllers::Settings& settingsController; - lv_task_t* taskUpdate; - lv_obj_t * batteryIcon; - lv_obj_t * label_time; - - lv_obj_t * btn1; - lv_obj_t * btn1_lvl; - lv_obj_t * btn2; - lv_obj_t * btn3; - lv_obj_t * btn3_lvl; - lv_obj_t * btn4; + lv_task_t* taskUpdate; + lv_obj_t* batteryIcon; + lv_obj_t* label_time; + lv_obj_t* btn1; + lv_obj_t* btn1_lvl; + lv_obj_t* btn2; + lv_obj_t* btn3; + lv_obj_t* btn3_lvl; + lv_obj_t* btn4; }; } } diff --git a/src/displayapp/screens/settings/SettingDisplay.cpp b/src/displayapp/screens/settings/SettingDisplay.cpp index 6c1bc9b5..4954185d 100644 --- a/src/displayapp/screens/settings/SettingDisplay.cpp +++ b/src/displayapp/screens/settings/SettingDisplay.cpp @@ -8,19 +8,16 @@ using namespace Pinetime::Applications::Screens; namespace { - static void event_handler(lv_obj_t * obj, lv_event_t event) { - SettingDisplay* screen = static_cast(obj->user_data); + static void event_handler(lv_obj_t* obj, lv_event_t event) { + SettingDisplay* screen = static_cast(obj->user_data); screen->UpdateSelected(obj, event); } } -SettingDisplay::SettingDisplay( - Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Settings &settingsController) : - Screen(app), - settingsController{settingsController} -{ +SettingDisplay::SettingDisplay(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) + : Screen(app), settingsController {settingsController} { - lv_obj_t * container1 = lv_cont_create(lv_scr_act(), nullptr); + lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10); @@ -32,31 +29,31 @@ SettingDisplay::SettingDisplay( lv_obj_set_height(container1, LV_VER_RES - 50); lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); - lv_obj_t * title = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(title,"Display timeout"); + lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(title, "Display timeout"); lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 10, 15); - lv_obj_t * icon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); lv_label_set_text_static(icon, Symbols::sun); lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0); - + optionsTotal = 0; cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " 5 seconds"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetScreenTimeOut() == 5000 ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetScreenTimeOut() == 5000) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " 15 seconds"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetScreenTimeOut() == 15000 ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetScreenTimeOut() == 15000) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; @@ -64,7 +61,7 @@ SettingDisplay::SettingDisplay( lv_checkbox_set_text_static(cbOption[optionsTotal], " 20 seconds"); cbOption[optionsTotal]->user_data = this; lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetScreenTimeOut() == 20000 ) { + if (settingsController.GetScreenTimeOut() == 20000) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; @@ -72,7 +69,7 @@ SettingDisplay::SettingDisplay( lv_checkbox_set_text_static(cbOption[optionsTotal], " 30 seconds"); cbOption[optionsTotal]->user_data = this; lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetScreenTimeOut() == 30000 ) { + if (settingsController.GetScreenTimeOut() == 30000) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; @@ -87,18 +84,25 @@ bool SettingDisplay::Refresh() { return running; } - -void SettingDisplay::UpdateSelected(lv_obj_t *object, lv_event_t event) { - if(event == LV_EVENT_VALUE_CHANGED) { - for(int i = 0; i < optionsTotal; i++) { - if ( object == cbOption[i] ) { +void SettingDisplay::UpdateSelected(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + for (int i = 0; i < optionsTotal; i++) { + if (object == cbOption[i]) { lv_checkbox_set_checked(cbOption[i], true); - - if ( i == 0 ) { settingsController.SetScreenTimeOut(5000); }; - if ( i == 1 ) { settingsController.SetScreenTimeOut(15000); }; - if ( i == 2 ) { settingsController.SetScreenTimeOut(20000); }; - if ( i == 3 ) { settingsController.SetScreenTimeOut(30000); }; - + + if (i == 0) { + settingsController.SetScreenTimeOut(5000); + }; + if (i == 1) { + settingsController.SetScreenTimeOut(15000); + }; + if (i == 2) { + settingsController.SetScreenTimeOut(20000); + }; + if (i == 3) { + settingsController.SetScreenTimeOut(30000); + }; + app->PushMessage(Applications::Display::Messages::UpdateTimeOut); } else { diff --git a/src/displayapp/screens/settings/SettingDisplay.h b/src/displayapp/screens/settings/SettingDisplay.h index 9565d3c7..ecd84465 100644 --- a/src/displayapp/screens/settings/SettingDisplay.h +++ b/src/displayapp/screens/settings/SettingDisplay.h @@ -10,20 +10,18 @@ namespace Pinetime { namespace Applications { namespace Screens { - class SettingDisplay : public Screen{ - public: - SettingDisplay(DisplayApp* app, Pinetime::Controllers::Settings &settingsController); - ~SettingDisplay() override; + class SettingDisplay : public Screen { + public: + SettingDisplay(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~SettingDisplay() override; - bool Refresh() override; - void UpdateSelected(lv_obj_t *object, lv_event_t event); - - private: + bool Refresh() override; + void UpdateSelected(lv_obj_t* object, lv_event_t event); - Controllers::Settings& settingsController; - uint8_t optionsTotal; - lv_obj_t * cbOption[4]; - + private: + Controllers::Settings& settingsController; + uint8_t optionsTotal; + lv_obj_t* cbOption[4]; }; } } diff --git a/src/displayapp/screens/settings/SettingTimeFormat.cpp b/src/displayapp/screens/settings/SettingTimeFormat.cpp index ff217bda..031a2a72 100644 --- a/src/displayapp/screens/settings/SettingTimeFormat.cpp +++ b/src/displayapp/screens/settings/SettingTimeFormat.cpp @@ -7,19 +7,16 @@ using namespace Pinetime::Applications::Screens; namespace { - static void event_handler(lv_obj_t * obj, lv_event_t event) { - SettingTimeFormat* screen = static_cast(obj->user_data); + static void event_handler(lv_obj_t* obj, lv_event_t event) { + SettingTimeFormat* screen = static_cast(obj->user_data); screen->UpdateSelected(obj, event); } } -SettingTimeFormat::SettingTimeFormat( - Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Settings &settingsController) : - Screen(app), - settingsController{settingsController} -{ +SettingTimeFormat::SettingTimeFormat(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) + : Screen(app), settingsController {settingsController} { - lv_obj_t * container1 = lv_cont_create(lv_scr_act(), nullptr); + lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10); @@ -31,12 +28,12 @@ SettingTimeFormat::SettingTimeFormat( lv_obj_set_height(container1, LV_VER_RES - 50); lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); - lv_obj_t * title = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(title,"Time format"); + lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(title, "Time format"); lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 15, 15); - lv_obj_t * icon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); lv_label_set_text_static(icon, Symbols::clock); lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); @@ -46,8 +43,8 @@ SettingTimeFormat::SettingTimeFormat( cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " 12-hour"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12 ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } @@ -55,8 +52,8 @@ SettingTimeFormat::SettingTimeFormat( cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " 24-hour"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24 ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; @@ -71,16 +68,19 @@ bool SettingTimeFormat::Refresh() { return running; } - -void SettingTimeFormat::UpdateSelected(lv_obj_t *object, lv_event_t event) { - if(event == LV_EVENT_VALUE_CHANGED) { - for(int i = 0; i < optionsTotal; i++) { - if ( object == cbOption[i] ) { +void SettingTimeFormat::UpdateSelected(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + for (int i = 0; i < optionsTotal; i++) { + if (object == cbOption[i]) { lv_checkbox_set_checked(cbOption[i], true); - - if ( i == 0 ) { settingsController.SetClockType(Controllers::Settings::ClockType::H12); }; - if ( i == 1 ) { settingsController.SetClockType(Controllers::Settings::ClockType::H24); }; - + + if (i == 0) { + settingsController.SetClockType(Controllers::Settings::ClockType::H12); + }; + if (i == 1) { + settingsController.SetClockType(Controllers::Settings::ClockType::H24); + }; + } else { lv_checkbox_set_checked(cbOption[i], false); } diff --git a/src/displayapp/screens/settings/SettingTimeFormat.h b/src/displayapp/screens/settings/SettingTimeFormat.h index a6380493..df08a944 100644 --- a/src/displayapp/screens/settings/SettingTimeFormat.h +++ b/src/displayapp/screens/settings/SettingTimeFormat.h @@ -10,20 +10,18 @@ namespace Pinetime { namespace Applications { namespace Screens { - class SettingTimeFormat : public Screen{ - public: - SettingTimeFormat(DisplayApp* app, Pinetime::Controllers::Settings &settingsController); - ~SettingTimeFormat() override; + class SettingTimeFormat : public Screen { + public: + SettingTimeFormat(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~SettingTimeFormat() override; - bool Refresh() override; - void UpdateSelected(lv_obj_t *object, lv_event_t event); - - private: + bool Refresh() override; + void UpdateSelected(lv_obj_t* object, lv_event_t event); - Controllers::Settings& settingsController; - uint8_t optionsTotal; - lv_obj_t * cbOption[2]; - + private: + Controllers::Settings& settingsController; + uint8_t optionsTotal; + lv_obj_t* cbOption[2]; }; } } diff --git a/src/displayapp/screens/settings/SettingWakeUp.cpp b/src/displayapp/screens/settings/SettingWakeUp.cpp index 927a9e3a..89f0c098 100644 --- a/src/displayapp/screens/settings/SettingWakeUp.cpp +++ b/src/displayapp/screens/settings/SettingWakeUp.cpp @@ -8,19 +8,16 @@ using namespace Pinetime::Applications::Screens; namespace { - static void event_handler(lv_obj_t * obj, lv_event_t event) { - SettingWakeUp* screen = static_cast(obj->user_data); + static void event_handler(lv_obj_t* obj, lv_event_t event) { + SettingWakeUp* screen = static_cast(obj->user_data); screen->UpdateSelected(obj, event); } } -SettingWakeUp::SettingWakeUp( - Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Settings &settingsController) : - Screen(app), - settingsController{settingsController} -{ +SettingWakeUp::SettingWakeUp(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) + : Screen(app), settingsController {settingsController} { - lv_obj_t * container1 = lv_cont_create(lv_scr_act(), nullptr); + lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10); @@ -32,12 +29,12 @@ SettingWakeUp::SettingWakeUp( lv_obj_set_height(container1, LV_VER_RES - 50); lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); - lv_obj_t * title = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(title,"Wake Up"); + lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(title, "Wake Up"); lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 15, 15); - lv_obj_t * icon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); lv_label_set_text_static(icon, Symbols::clock); lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); @@ -47,32 +44,32 @@ SettingWakeUp::SettingWakeUp( cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " None"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::None ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::None) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " Single Tap"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::SingleTap ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::SingleTap) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " Double Tap"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::DoubleTap ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::DoubleTap) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " Raise Wrist"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; @@ -87,18 +84,25 @@ bool SettingWakeUp::Refresh() { return running; } - -void SettingWakeUp::UpdateSelected(lv_obj_t *object, lv_event_t event) { - if(event == LV_EVENT_VALUE_CHANGED) { - for(int i = 0; i < optionsTotal; i++) { - if ( object == cbOption[i] ) { +void SettingWakeUp::UpdateSelected(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + for (int i = 0; i < optionsTotal; i++) { + if (object == cbOption[i]) { lv_checkbox_set_checked(cbOption[i], true); - - if ( i == 0 ) { settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::None); }; - if ( i == 1 ) { settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::SingleTap); }; - if ( i == 2 ) { settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap); }; - if ( i == 3 ) { settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist); }; - + + if (i == 0) { + settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::None); + }; + if (i == 1) { + settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::SingleTap); + }; + if (i == 2) { + settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap); + }; + if (i == 3) { + settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist); + }; + } else { lv_checkbox_set_checked(cbOption[i], false); } diff --git a/src/displayapp/screens/settings/SettingWakeUp.h b/src/displayapp/screens/settings/SettingWakeUp.h index 86b52837..4f476b0c 100644 --- a/src/displayapp/screens/settings/SettingWakeUp.h +++ b/src/displayapp/screens/settings/SettingWakeUp.h @@ -10,20 +10,18 @@ namespace Pinetime { namespace Applications { namespace Screens { - class SettingWakeUp : public Screen{ - public: - SettingWakeUp(DisplayApp* app, Pinetime::Controllers::Settings &settingsController); - ~SettingWakeUp() override; + class SettingWakeUp : public Screen { + public: + SettingWakeUp(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~SettingWakeUp() override; - bool Refresh() override; - void UpdateSelected(lv_obj_t *object, lv_event_t event); - - private: + bool Refresh() override; + void UpdateSelected(lv_obj_t* object, lv_event_t event); - Controllers::Settings& settingsController; - uint8_t optionsTotal; - lv_obj_t * cbOption[4]; - + private: + Controllers::Settings& settingsController; + uint8_t optionsTotal; + lv_obj_t* cbOption[4]; }; } } diff --git a/src/displayapp/screens/settings/SettingWatchFace.cpp b/src/displayapp/screens/settings/SettingWatchFace.cpp index f763acd4..457cebf6 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.cpp +++ b/src/displayapp/screens/settings/SettingWatchFace.cpp @@ -7,21 +7,18 @@ using namespace Pinetime::Applications::Screens; namespace { - static void event_handler(lv_obj_t * obj, lv_event_t event) { - SettingWatchFace* screen = static_cast(obj->user_data); + static void event_handler(lv_obj_t* obj, lv_event_t event) { + SettingWatchFace* screen = static_cast(obj->user_data); screen->UpdateSelected(obj, event); } } -SettingWatchFace::SettingWatchFace( - Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::Settings &settingsController) : - Screen(app), - settingsController{settingsController} -{ +SettingWatchFace::SettingWatchFace(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) + : Screen(app), settingsController {settingsController} { - lv_obj_t * container1 = lv_cont_create(lv_scr_act(), nullptr); + lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); - //lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); + // lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10); lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5); @@ -32,12 +29,12 @@ SettingWatchFace::SettingWatchFace( lv_obj_set_height(container1, LV_VER_RES - 50); lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); - lv_obj_t * title = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(title,"Watch face"); + lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(title, "Watch face"); lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 10, 15); - lv_obj_t * icon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr); lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); lv_label_set_text_static(icon, Symbols::clock); lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); @@ -47,8 +44,8 @@ SettingWatchFace::SettingWatchFace( cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " Digital face"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetClockFace() == 0 ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetClockFace() == 0) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } @@ -56,8 +53,8 @@ SettingWatchFace::SettingWatchFace( cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); lv_checkbox_set_text_static(cbOption[optionsTotal], " Analog face"); cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetClockFace() == 1 ) { + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetClockFace() == 1) { lv_checkbox_set_checked(cbOption[optionsTotal], true); } @@ -73,11 +70,10 @@ bool SettingWatchFace::Refresh() { return running; } - -void SettingWatchFace::UpdateSelected(lv_obj_t *object, lv_event_t event) { - if(event == LV_EVENT_VALUE_CHANGED) { - for(uint8_t i = 0; i < optionsTotal; i++) { - if ( object == cbOption[i] ) { +void SettingWatchFace::UpdateSelected(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + for (uint8_t i = 0; i < optionsTotal; i++) { + if (object == cbOption[i]) { lv_checkbox_set_checked(cbOption[i], true); settingsController.SetClockFace(i); } else { diff --git a/src/displayapp/screens/settings/SettingWatchFace.h b/src/displayapp/screens/settings/SettingWatchFace.h index 8c30ed28..0963b4ca 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.h +++ b/src/displayapp/screens/settings/SettingWatchFace.h @@ -10,20 +10,18 @@ namespace Pinetime { namespace Applications { namespace Screens { - class SettingWatchFace : public Screen{ - public: - SettingWatchFace(DisplayApp* app, Pinetime::Controllers::Settings &settingsController); - ~SettingWatchFace() override; + class SettingWatchFace : public Screen { + public: + SettingWatchFace(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~SettingWatchFace() override; - bool Refresh() override; - void UpdateSelected(lv_obj_t *object, lv_event_t event); - - private: + bool Refresh() override; + void UpdateSelected(lv_obj_t* object, lv_event_t event); - Controllers::Settings& settingsController; - uint8_t optionsTotal; - lv_obj_t * cbOption[2]; - + private: + Controllers::Settings& settingsController; + uint8_t optionsTotal; + lv_obj_t* cbOption[2]; }; } } diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index b2825915..e24be3d7 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -8,27 +8,27 @@ using namespace Pinetime::Applications::Screens; -Settings::Settings( - Pinetime::Applications::DisplayApp *app, - Pinetime::Controllers::Settings &settingsController) : - Screen(app), - settingsController{settingsController}, - screens{app, - settingsController.GetSettingsMenu(), - { - [this]() -> std::unique_ptr { return CreateScreen1(); }, - [this]() -> std::unique_ptr { return CreateScreen2(); } - }, - Screens::ScreenListModes::UpDown - } {} +Settings::Settings(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) + : Screen(app), + settingsController {settingsController}, + screens {app, + settingsController.GetSettingsMenu(), + {[this]() -> std::unique_ptr { + return CreateScreen1(); + }, + [this]() -> std::unique_ptr { + return CreateScreen2(); + }}, + Screens::ScreenListModes::UpDown} { +} Settings::~Settings() { lv_obj_clean(lv_scr_act()); } bool Settings::Refresh() { - - if(running) + + if (running) running = screens.Refresh(); return running; } @@ -39,29 +39,26 @@ bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) { std::unique_ptr Settings::CreateScreen1() { - std::array applications { - { - {Symbols::sun, "Display", Apps::SettingDisplay}, - {Symbols::clock, "Wake Up", Apps::SettingWakeUp}, - {Symbols::clock, "Time format", Apps::SettingTimeFormat}, - {Symbols::clock, "Watch face", Apps::SettingWatchFace}, - } + std::array applications {{ + {Symbols::sun, "Display", Apps::SettingDisplay}, + {Symbols::clock, "Wake Up", Apps::SettingWakeUp}, + {Symbols::clock, "Time format", Apps::SettingTimeFormat}, + {Symbols::clock, "Watch face", Apps::SettingWatchFace}, + } }; return std::unique_ptr(new Screens::List(0, 2, app, settingsController, applications)); } - std::unique_ptr Settings::CreateScreen2() { - std::array applications { - { - {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}, - {Symbols::check, "Firmware", Apps::FirmwareValidation}, - {Symbols::list, "About", Apps::SysInfo}, - {"", "", Apps::None}, - } + std::array applications {{ + {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}, + {Symbols::check, "Firmware", Apps::FirmwareValidation}, + {Symbols::list, "About", Apps::SysInfo}, + {"", "", Apps::None}, + } }; diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h index 9955e1d4..1cec2b09 100644 --- a/src/displayapp/screens/settings/Settings.h +++ b/src/displayapp/screens/settings/Settings.h @@ -6,31 +6,26 @@ namespace Pinetime { - namespace Applications { namespace Screens { - class Settings : public Screen{ - public: - Settings(DisplayApp* app, - Pinetime::Controllers::Settings &settingsController); - ~Settings() override; + class Settings : public Screen { + public: + Settings(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~Settings() override; - bool Refresh() override; - - void OnButtonEvent(lv_obj_t *object, lv_event_t event); - bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; + bool Refresh() override; - private: + void OnButtonEvent(lv_obj_t* object, lv_event_t event); + bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; - Controllers::Settings& settingsController; - - ScreenList<2> screens; - - std::unique_ptr CreateScreen1(); - std::unique_ptr CreateScreen2(); + private: + Controllers::Settings& settingsController; + ScreenList<2> screens; + std::unique_ptr CreateScreen1(); + std::unique_ptr CreateScreen2(); }; } } diff --git a/src/drivers/Bma421.cpp b/src/drivers/Bma421.cpp index d7a59cf0..925b66c7 100644 --- a/src/drivers/Bma421.cpp +++ b/src/drivers/Bma421.cpp @@ -24,7 +24,7 @@ namespace { } } -Bma421::Bma421(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster{twiMaster}, deviceAddress{twiAddress} { +Bma421::Bma421(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaster}, deviceAddress {twiAddress} { bma.intf = BMA4_I2C_INTF; bma.bus_read = user_i2c_read; bma.bus_write = user_i2c_write; @@ -35,25 +35,32 @@ Bma421::Bma421(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster{twiMaster}, } void Bma421::Init() { - if(not isResetOk) return; // Call SoftReset (and reset TWI device) first! + if (not isResetOk) + return; // Call SoftReset (and reset TWI device) first! auto ret = bma423_init(&bma); - if(ret != BMA4_OK) return; + if (ret != BMA4_OK) + return; ret = bma423_write_config_file(&bma); - if(ret != BMA4_OK) return; + if (ret != BMA4_OK) + return; ret = bma4_set_interrupt_mode(BMA4_LATCH_MODE, &bma); - if(ret != BMA4_OK) return; + if (ret != BMA4_OK) + return; ret = bma423_feature_enable(BMA423_STEP_CNTR, 1, &bma); - if(ret != BMA4_OK) return; + if (ret != BMA4_OK) + return; ret = bma423_step_detector_enable(0, &bma); - if(ret != BMA4_OK) return; + if (ret != BMA4_OK) + return; ret = bma4_set_accel_enable(1, &bma); - if(ret != BMA4_OK) return; + if (ret != BMA4_OK) + return; struct bma4_accel_config accel_conf; accel_conf.odr = BMA4_OUTPUT_DATA_RATE_100HZ; @@ -61,7 +68,8 @@ void Bma421::Init() { accel_conf.bandwidth = BMA4_ACCEL_NORMAL_AVG4; accel_conf.perf_mode = BMA4_CIC_AVG_MODE; ret = bma4_set_accel_config(&accel_conf, &bma); - if(ret != BMA4_OK) return; + if (ret != BMA4_OK) + return; isOk = true; } @@ -71,16 +79,17 @@ void Bma421::Reset() { twiMaster.Write(deviceAddress, 0x7E, &data, 1); } -void Bma421::Read(uint8_t registerAddress, uint8_t *buffer, size_t size) { +void Bma421::Read(uint8_t registerAddress, uint8_t* buffer, size_t size) { twiMaster.Read(deviceAddress, registerAddress, buffer, size); } -void Bma421::Write(uint8_t registerAddress, const uint8_t *data, size_t size) { +void Bma421::Write(uint8_t registerAddress, const uint8_t* data, size_t size) { twiMaster.Write(deviceAddress, registerAddress, data, size); } Bma421::Values Bma421::Process() { - if(not isOk) return {}; + if (not isOk) + return {}; struct bma4_accel data; bma4_read_accel_xyz(&data, &bma); @@ -109,7 +118,7 @@ void Bma421::ResetStepCounter() { void Bma421::SoftReset() { auto ret = bma4_soft_reset(&bma); - if(ret == BMA4_OK) { + if (ret == BMA4_OK) { isResetOk = true; nrf_delay_ms(1); } diff --git a/src/drivers/Bma421.h b/src/drivers/Bma421.h index da021cbf..3287ed9e 100644 --- a/src/drivers/Bma421.h +++ b/src/drivers/Bma421.h @@ -5,7 +5,7 @@ namespace Pinetime { namespace Drivers { class TwiMaster; class Bma421 { - public: + public: struct Values { uint32_t steps; int16_t x; @@ -25,12 +25,12 @@ namespace Pinetime { Values Process(); void ResetStepCounter(); - void Read(uint8_t registerAddress, uint8_t *buffer, size_t size); - void Write(uint8_t registerAddress, const uint8_t *data, size_t size); + void Read(uint8_t registerAddress, uint8_t* buffer, size_t size); + void Write(uint8_t registerAddress, const uint8_t* data, size_t size); bool IsOk() const; - private: + private: void Reset(); TwiMaster& twiMaster; diff --git a/src/drivers/BufferProvider.h b/src/drivers/BufferProvider.h index 1be4317a..fac03bdc 100644 --- a/src/drivers/BufferProvider.h +++ b/src/drivers/BufferProvider.h @@ -5,8 +5,8 @@ namespace Pinetime { namespace Drivers { class BufferProvider { - public: - virtual bool GetNextBuffer(uint8_t** buffer, size_t& size) = 0; + public: + virtual bool GetNextBuffer(uint8_t** buffer, size_t& size) = 0; }; } } \ No newline at end of file diff --git a/src/drivers/Cst816s.cpp b/src/drivers/Cst816s.cpp index e3a37b1b..fd9792b3 100644 --- a/src/drivers/Cst816s.cpp +++ b/src/drivers/Cst816s.cpp @@ -7,14 +7,14 @@ using namespace Pinetime::Drivers; /* References : - * This implementation is based on this article : https://medium.com/@ly.lee/building-a-rust-driver-for-pinetimes-touch-controller-cbc1a5d5d3e9 - * Touch panel datasheet (weird chinese translation) : https://wiki.pine64.org/images/5/51/CST816S%E6%95%B0%E6%8D%AE%E6%89%8B%E5%86%8CV1.1.en.pdf + * This implementation is based on this article : + * https://medium.com/@ly.lee/building-a-rust-driver-for-pinetimes-touch-controller-cbc1a5d5d3e9 Touch panel datasheet (weird chinese + * translation) : https://wiki.pine64.org/images/5/51/CST816S%E6%95%B0%E6%8D%AE%E6%89%8B%E5%86%8CV1.1.en.pdf * * TODO : we need a complete datasheet and protocol reference! * */ -Cst816S::Cst816S(TwiMaster &twiMaster, uint8_t twiAddress) : twiMaster{twiMaster}, twiAddress{twiAddress} { - +Cst816S::Cst816S(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaster}, twiAddress {twiAddress} { } void Cst816S::Init() { @@ -32,7 +32,7 @@ void Cst816S::Init() { vTaskDelay(5); twiMaster.Read(twiAddress, 0xa7, &dummy, 1); vTaskDelay(5); - + /* [2] EnConLR - Continuous operation can slide around [1] EnConUD - Slide up and down to enable continuous operation @@ -40,23 +40,22 @@ void Cst816S::Init() { */ static constexpr uint8_t motionMask = 0b00000101; twiMaster.Write(twiAddress, 0xEC, &motionMask, 1); - } - Cst816S::TouchInfos Cst816S::GetTouchInfo() { Cst816S::TouchInfos info; auto ret = twiMaster.Read(twiAddress, 0, touchData, sizeof(touchData)); - if(ret != TwiMaster::ErrorCodes::NoError) return {}; + if (ret != TwiMaster::ErrorCodes::NoError) + return {}; auto nbTouchPoints = touchData[2] & 0x0f; uint8_t i = 0; uint8_t pointId = (touchData[touchIdIndex + (touchStep * i)]) >> 4; - if(nbTouchPoints == 0 && pointId == lastTouchId) return info; - + if (nbTouchPoints == 0 && pointId == lastTouchId) + return info; info.isTouch = true; diff --git a/src/drivers/Cst816s.h b/src/drivers/Cst816s.h index 63007860..7664a83e 100644 --- a/src/drivers/Cst816s.h +++ b/src/drivers/Cst816s.h @@ -5,57 +5,58 @@ namespace Pinetime { namespace Drivers { class Cst816S { - public : - enum class Gestures : uint8_t { - None = 0x00, - SlideDown = 0x01, - SlideUp = 0x02, - SlideLeft = 0x03, - SlideRight = 0x04, - SingleTap = 0x05, - DoubleTap = 0x0B, - LongPress = 0x0C - }; - struct TouchInfos { - uint16_t x = 0; - uint16_t y = 0; - uint8_t action = 0; - uint8_t finger = 0; - uint8_t pressure = 0; - uint8_t area = 0; - Gestures gesture = Gestures::None; - bool isTouch = false; - }; + public: + enum class Gestures : uint8_t { + None = 0x00, + SlideDown = 0x01, + SlideUp = 0x02, + SlideLeft = 0x03, + SlideRight = 0x04, + SingleTap = 0x05, + DoubleTap = 0x0B, + LongPress = 0x0C + }; + struct TouchInfos { + uint16_t x = 0; + uint16_t y = 0; + uint8_t action = 0; + uint8_t finger = 0; + uint8_t pressure = 0; + uint8_t area = 0; + Gestures gesture = Gestures::None; + bool isTouch = false; + }; - Cst816S(TwiMaster& twiMaster, uint8_t twiAddress); - Cst816S(const Cst816S&) = delete; - Cst816S& operator=(const Cst816S&) = delete; - Cst816S(Cst816S&&) = delete; - Cst816S& operator=(Cst816S&&) = delete; + Cst816S(TwiMaster& twiMaster, uint8_t twiAddress); + Cst816S(const Cst816S&) = delete; + Cst816S& operator=(const Cst816S&) = delete; + Cst816S(Cst816S&&) = delete; + Cst816S& operator=(Cst816S&&) = delete; - void Init(); - TouchInfos GetTouchInfo(); - void Sleep(); - void Wakeup(); - private: - static constexpr uint8_t pinIrq = 28; - static constexpr uint8_t pinReset = 10; - static constexpr uint8_t lastTouchId = 0x0f; - static constexpr uint8_t touchPointNumIndex = 2; - static constexpr uint8_t touchMiscIndex = 8; - static constexpr uint8_t touchXYIndex = 7; - static constexpr uint8_t touchEventIndex = 3; - static constexpr uint8_t touchXHighIndex = 3; - static constexpr uint8_t touchXLowIndex = 4; - static constexpr uint8_t touchYHighIndex = 5; - static constexpr uint8_t touchYLowIndex = 6; - static constexpr uint8_t touchIdIndex = 5; - static constexpr uint8_t touchStep = 6; - static constexpr uint8_t gestureIndex = 1; + void Init(); + TouchInfos GetTouchInfo(); + void Sleep(); + void Wakeup(); - uint8_t touchData[10]; - TwiMaster& twiMaster; - uint8_t twiAddress; + private: + static constexpr uint8_t pinIrq = 28; + static constexpr uint8_t pinReset = 10; + static constexpr uint8_t lastTouchId = 0x0f; + static constexpr uint8_t touchPointNumIndex = 2; + static constexpr uint8_t touchMiscIndex = 8; + static constexpr uint8_t touchXYIndex = 7; + static constexpr uint8_t touchEventIndex = 3; + static constexpr uint8_t touchXHighIndex = 3; + static constexpr uint8_t touchXLowIndex = 4; + static constexpr uint8_t touchYHighIndex = 5; + static constexpr uint8_t touchYLowIndex = 6; + static constexpr uint8_t touchIdIndex = 5; + static constexpr uint8_t touchStep = 6; + static constexpr uint8_t gestureIndex = 1; + + uint8_t touchData[10]; + TwiMaster& twiMaster; + uint8_t twiAddress; }; } diff --git a/src/drivers/DebugPins.cpp b/src/drivers/DebugPins.cpp index 8457ba5f..56fd1458 100644 --- a/src/drivers/DebugPins.cpp +++ b/src/drivers/DebugPins.cpp @@ -19,31 +19,27 @@ void debugpins_init() { nrf_gpio_pin_clear(DebugPin4); } void debugpins_set(debugpins_pins pin) { - nrf_gpio_pin_set((uint32_t)(pin)); + nrf_gpio_pin_set((uint32_t) (pin)); } void debugpins_clear(debugpins_pins pin) { - nrf_gpio_pin_clear((uint32_t)(pin)); + nrf_gpio_pin_clear((uint32_t) (pin)); } void debugpins_pulse(debugpins_pins pin) { - nrf_gpio_pin_set((uint32_t)(pin)); - nrf_gpio_pin_clear((uint32_t)(pin)); + nrf_gpio_pin_set((uint32_t) (pin)); + nrf_gpio_pin_clear((uint32_t) (pin)); } #else void debugpins_init() { - } void debugpins_set(debugpins_pins pin) { - } void debugpins_clear(debugpins_pins pin) { - } void debugpins_pulse(debugpins_pins pin) { - } #endif \ No newline at end of file diff --git a/src/drivers/DebugPins.h b/src/drivers/DebugPins.h index cb20bac5..b30cd222 100644 --- a/src/drivers/DebugPins.h +++ b/src/drivers/DebugPins.h @@ -22,4 +22,3 @@ void debugpins_pulse(debugpins_pins pin); #ifdef __cplusplus } #endif - diff --git a/src/drivers/Hrs3300.cpp b/src/drivers/Hrs3300.cpp index dc9f9cd8..edb9e81d 100644 --- a/src/drivers/Hrs3300.cpp +++ b/src/drivers/Hrs3300.cpp @@ -16,8 +16,7 @@ using namespace Pinetime::Drivers; /** Driver for the HRS3300 heart rate sensor. * Original implementation from wasp-os : https://github.com/daniel-thompson/wasp-os/blob/master/wasp/drivers/hrs3300.py */ -Hrs3300::Hrs3300(TwiMaster &twiMaster, uint8_t twiAddress) : twiMaster{twiMaster}, twiAddress{twiAddress} { - +Hrs3300::Hrs3300(TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaster}, twiAddress {twiAddress} { } void Hrs3300::Init() { @@ -73,7 +72,7 @@ void Hrs3300::SetGain(uint8_t gain) { constexpr uint8_t maxGain = 64U; gain = std::min(gain, maxGain); uint8_t hgain = 0; - while((1 << hgain) < gain){ + while ((1 << hgain) < gain) { ++hgain; } @@ -93,25 +92,14 @@ void Hrs3300::SetDrive(uint8_t drive) { void Hrs3300::WriteRegister(uint8_t reg, uint8_t data) { auto ret = twiMaster.Write(twiAddress, reg, &data, 1); - if(ret != TwiMaster::ErrorCodes::NoError) + if (ret != TwiMaster::ErrorCodes::NoError) NRF_LOG_INFO("WRITE ERROR"); } uint8_t Hrs3300::ReadRegister(uint8_t reg) { uint8_t value; auto ret = twiMaster.Read(twiAddress, reg, &value, 1); - if(ret != TwiMaster::ErrorCodes::NoError) + if (ret != TwiMaster::ErrorCodes::NoError) NRF_LOG_INFO("READ ERROR"); return value; } - - - - - - - - - - - diff --git a/src/drivers/Hrs3300.h b/src/drivers/Hrs3300.h index c34d55c6..cf87f378 100644 --- a/src/drivers/Hrs3300.h +++ b/src/drivers/Hrs3300.h @@ -5,7 +5,7 @@ namespace Pinetime { namespace Drivers { class Hrs3300 { - public: + public: enum class Registers : uint8_t { Id = 0x00, Enable = 0x01, @@ -35,13 +35,12 @@ namespace Pinetime { void SetGain(uint8_t gain); void SetDrive(uint8_t drive); - private: + private: TwiMaster& twiMaster; uint8_t twiAddress; void WriteRegister(uint8_t reg, uint8_t data); uint8_t ReadRegister(uint8_t reg); - }; } } diff --git a/src/drivers/InternalFlash.cpp b/src/drivers/InternalFlash.cpp index 33c14473..0840c6e5 100644 --- a/src/drivers/InternalFlash.cpp +++ b/src/drivers/InternalFlash.cpp @@ -25,7 +25,7 @@ void InternalFlash::WriteWord(uint32_t address, uint32_t value) { __DSB(); // Write word - *(uint32_t*)address = value; + *(uint32_t*) address = value; Wait(); // Disable write @@ -35,5 +35,7 @@ void InternalFlash::WriteWord(uint32_t address, uint32_t value) { } void InternalFlash::Wait() { - while (NRF_NVMC->READY == NVMC_READY_READY_Busy) {;} + while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { + ; + } } diff --git a/src/drivers/InternalFlash.h b/src/drivers/InternalFlash.h index fd25bf46..cbf9a20b 100644 --- a/src/drivers/InternalFlash.h +++ b/src/drivers/InternalFlash.h @@ -5,10 +5,11 @@ namespace Pinetime { namespace Drivers { class InternalFlash { - public: + public: static void ErasePage(uint32_t address); static void WriteWord(uint32_t address, uint32_t value); - private: + + private: static inline void Wait(); }; } diff --git a/src/drivers/Spi.cpp b/src/drivers/Spi.cpp index 0e7de4d5..a55d2888 100644 --- a/src/drivers/Spi.cpp +++ b/src/drivers/Spi.cpp @@ -4,17 +4,16 @@ using namespace Pinetime::Drivers; -Spi::Spi(SpiMaster& spiMaster, uint8_t pinCsn) : - spiMaster{spiMaster}, pinCsn{pinCsn} { +Spi::Spi(SpiMaster& spiMaster, uint8_t pinCsn) : spiMaster {spiMaster}, pinCsn {pinCsn} { nrf_gpio_cfg_output(pinCsn); nrf_gpio_pin_set(pinCsn); } -bool Spi::Write(const uint8_t *data, size_t size) { +bool Spi::Write(const uint8_t* data, size_t size) { return spiMaster.Write(pinCsn, data, size); } -bool Spi::Read(uint8_t* cmd, size_t cmdSize, uint8_t *data, size_t dataSize) { +bool Spi::Read(uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize) { return spiMaster.Read(pinCsn, cmd, cmdSize, data, dataSize); } @@ -23,7 +22,7 @@ void Spi::Sleep() { NRF_LOG_INFO("[SPI] Sleep") } -bool Spi::WriteCmdAndBuffer(const uint8_t *cmd, size_t cmdSize, const uint8_t *data, size_t dataSize) { +bool Spi::WriteCmdAndBuffer(const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize) { return spiMaster.WriteCmdAndBuffer(pinCsn, cmd, cmdSize, data, dataSize); } @@ -37,5 +36,3 @@ void Spi::Wakeup() { nrf_gpio_pin_set(pinCsn); NRF_LOG_INFO("[SPI] Wakeup") } - - diff --git a/src/drivers/Spi.h b/src/drivers/Spi.h index e3cab459..27000755 100644 --- a/src/drivers/Spi.h +++ b/src/drivers/Spi.h @@ -6,23 +6,23 @@ namespace Pinetime { namespace Drivers { class Spi { - public: - Spi(SpiMaster& spiMaster, uint8_t pinCsn); - Spi(const Spi&) = delete; - Spi& operator=(const Spi&) = delete; - Spi(Spi&&) = delete; - Spi& operator=(Spi&&) = delete; + public: + Spi(SpiMaster& spiMaster, uint8_t pinCsn); + Spi(const Spi&) = delete; + Spi& operator=(const Spi&) = delete; + Spi(Spi&&) = delete; + Spi& operator=(Spi&&) = delete; - bool Init(); - bool Write(const uint8_t* data, size_t size); - bool Read(uint8_t* cmd, size_t cmdSize, uint8_t *data, size_t dataSize); - bool WriteCmdAndBuffer(const uint8_t* cmd, size_t cmdSize, const uint8_t *data, size_t dataSize); - void Sleep(); - void Wakeup(); + bool Init(); + bool Write(const uint8_t* data, size_t size); + bool Read(uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize); + bool WriteCmdAndBuffer(const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize); + void Sleep(); + void Wakeup(); - private: - SpiMaster& spiMaster; - uint8_t pinCsn; + private: + SpiMaster& spiMaster; + uint8_t pinCsn; }; } } diff --git a/src/drivers/SpiMaster.cpp b/src/drivers/SpiMaster.cpp index 5f7c0642..34fcc08a 100644 --- a/src/drivers/SpiMaster.cpp +++ b/src/drivers/SpiMaster.cpp @@ -6,8 +6,7 @@ using namespace Pinetime::Drivers; -SpiMaster::SpiMaster(const SpiMaster::SpiModule spi, const SpiMaster::Parameters ¶ms) : - spi{spi}, params{params} { +SpiMaster::SpiMaster(const SpiMaster::SpiModule spi, const SpiMaster::Parameters& params) : spi {spi}, params {params} { mutex = xSemaphoreCreateBinary(); ASSERT(mutex != NULL); } @@ -19,39 +18,58 @@ bool SpiMaster::Init() { nrf_gpio_pin_clear(params.pinMOSI); nrf_gpio_cfg_output(params.pinMOSI); nrf_gpio_cfg_input(params.pinMISO, NRF_GPIO_PIN_NOPULL); -// nrf_gpio_cfg_output(params.pinCSN); -// pinCsn = params.pinCSN; + // nrf_gpio_cfg_output(params.pinCSN); + // pinCsn = params.pinCSN; - switch(spi) { - case SpiModule::SPI0: spiBaseAddress = NRF_SPIM0; break; - case SpiModule::SPI1: spiBaseAddress = NRF_SPIM1; break; - default: return false; + switch (spi) { + case SpiModule::SPI0: + spiBaseAddress = NRF_SPIM0; + break; + case SpiModule::SPI1: + spiBaseAddress = NRF_SPIM1; + break; + default: + return false; } /* Configure pins, frequency and mode */ - spiBaseAddress->PSELSCK = params.pinSCK; + spiBaseAddress->PSELSCK = params.pinSCK; spiBaseAddress->PSELMOSI = params.pinMOSI; spiBaseAddress->PSELMISO = params.pinMISO; uint32_t frequency; - switch(params.Frequency) { - case Frequencies::Freq8Mhz: frequency = 0x80000000; break; - default: return false; + switch (params.Frequency) { + case Frequencies::Freq8Mhz: + frequency = 0x80000000; + break; + default: + return false; } spiBaseAddress->FREQUENCY = frequency; uint32_t regConfig = 0; - switch(params.bitOrder) { - case BitOrder::Msb_Lsb: break; - case BitOrder::Lsb_Msb: regConfig = 1; - default: return false; + switch (params.bitOrder) { + case BitOrder::Msb_Lsb: + break; + case BitOrder::Lsb_Msb: + regConfig = 1; + default: + return false; } - switch(params.mode) { - case Modes::Mode0: break; - case Modes::Mode1: regConfig |= (0x01 << 1); break; - case Modes::Mode2: regConfig |= (0x02 << 1); break; - case Modes::Mode3: regConfig |= (0x03 << 1); break; - default: return false; + switch (params.mode) { + case Modes::Mode0: + break; + case Modes::Mode1: + regConfig |= (0x01 << 1); + break; + case Modes::Mode2: + regConfig |= (0x02 << 1); + break; + case Modes::Mode3: + regConfig |= (0x03 << 1); + break; + default: + return false; } spiBaseAddress->CONFIG = regConfig; @@ -59,24 +77,22 @@ bool SpiMaster::Init() { spiBaseAddress->EVENTS_ENDTX = 0; spiBaseAddress->EVENTS_END = 0; - spiBaseAddress->INTENSET = ((unsigned)1 << (unsigned)6); - spiBaseAddress->INTENSET = ((unsigned)1 << (unsigned)1); - spiBaseAddress->INTENSET = ((unsigned)1 << (unsigned)19); + spiBaseAddress->INTENSET = ((unsigned) 1 << (unsigned) 6); + spiBaseAddress->INTENSET = ((unsigned) 1 << (unsigned) 1); + spiBaseAddress->INTENSET = ((unsigned) 1 << (unsigned) 19); spiBaseAddress->ENABLE = (SPIM_ENABLE_ENABLE_Enabled << SPIM_ENABLE_ENABLE_Pos); - NRFX_IRQ_PRIORITY_SET(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn,2); + NRFX_IRQ_PRIORITY_SET(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn, 2); NRFX_IRQ_ENABLE(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn); xSemaphoreGive(mutex); return true; } - -void SpiMaster::SetupWorkaroundForFtpan58(NRF_SPIM_Type *spim, uint32_t ppi_channel, uint32_t gpiote_channel) { +void SpiMaster::SetupWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel) { // Create an event when SCK toggles. - NRF_GPIOTE->CONFIG[gpiote_channel] = (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos) | - (spim->PSEL.SCK << GPIOTE_CONFIG_PSEL_Pos) | + NRF_GPIOTE->CONFIG[gpiote_channel] = (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos) | (spim->PSEL.SCK << GPIOTE_CONFIG_PSEL_Pos) | (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos); // Stop the spim instance when SCK toggles. @@ -86,29 +102,29 @@ void SpiMaster::SetupWorkaroundForFtpan58(NRF_SPIM_Type *spim, uint32_t ppi_chan spiBaseAddress->EVENTS_END = 0; // Disable IRQ - spim->INTENCLR = (1<<6); - spim->INTENCLR = (1<<1); - spim->INTENCLR = (1<<19); + spim->INTENCLR = (1 << 6); + spim->INTENCLR = (1 << 1); + spim->INTENCLR = (1 << 19); } -void SpiMaster::DisableWorkaroundForFtpan58(NRF_SPIM_Type *spim, uint32_t ppi_channel, uint32_t gpiote_channel) { +void SpiMaster::DisableWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel) { NRF_GPIOTE->CONFIG[gpiote_channel] = 0; NRF_PPI->CH[ppi_channel].EEP = 0; NRF_PPI->CH[ppi_channel].TEP = 0; NRF_PPI->CHENSET = ppi_channel; spiBaseAddress->EVENTS_END = 0; - spim->INTENSET = (1<<6); - spim->INTENSET = (1<<1); - spim->INTENSET = (1<<19); + spim->INTENSET = (1 << 6); + spim->INTENSET = (1 << 1); + spim->INTENSET = (1 << 19); } void SpiMaster::OnEndEvent() { - if(currentBufferAddr == 0) { + if (currentBufferAddr == 0) { return; } auto s = currentBufferSize; - if(s > 0) { + if (s > 0) { auto currentSize = std::min((size_t) 255, s); PrepareTx(currentBufferAddr, currentSize); currentBufferAddr += currentSize; @@ -116,17 +132,17 @@ void SpiMaster::OnEndEvent() { spiBaseAddress->TASKS_START = 1; } else { - if(taskToNotify != nullptr) { - BaseType_t xHigherPriorityTaskWoken = pdFALSE; - vTaskNotifyGiveFromISR(taskToNotify, &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); - } - - nrf_gpio_pin_set(this->pinCsn); - currentBufferAddr = 0; + if (taskToNotify != nullptr) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; - xSemaphoreGiveFromISR(mutex, &xHigherPriorityTaskWoken); + vTaskNotifyGiveFromISR(taskToNotify, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + + nrf_gpio_pin_set(this->pinCsn); + currentBufferAddr = 0; + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + xSemaphoreGiveFromISR(mutex, &xHigherPriorityTaskWoken); + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } } @@ -143,7 +159,10 @@ void SpiMaster::PrepareTx(const volatile uint32_t bufferAddress, const volatile spiBaseAddress->EVENTS_END = 0; } -void SpiMaster::PrepareRx(const volatile uint32_t cmdAddress, const volatile size_t cmdSize, const volatile uint32_t bufferAddress, const volatile size_t size) { +void SpiMaster::PrepareRx(const volatile uint32_t cmdAddress, + const volatile size_t cmdSize, + const volatile uint32_t bufferAddress, + const volatile size_t size) { spiBaseAddress->TXD.PTR = 0; spiBaseAddress->TXD.MAXCNT = 0; spiBaseAddress->TXD.LIST = 0; @@ -153,35 +172,35 @@ void SpiMaster::PrepareRx(const volatile uint32_t cmdAddress, const volatile siz spiBaseAddress->EVENTS_END = 0; } - -bool SpiMaster::Write(uint8_t pinCsn, const uint8_t *data, size_t size) { - if(data == nullptr) return false; +bool SpiMaster::Write(uint8_t pinCsn, const uint8_t* data, size_t size) { + if (data == nullptr) + return false; auto ok = xSemaphoreTake(mutex, portMAX_DELAY); ASSERT(ok == true); taskToNotify = xTaskGetCurrentTaskHandle(); - this->pinCsn = pinCsn; - if(size == 1) { - SetupWorkaroundForFtpan58(spiBaseAddress, 0,0); + if (size == 1) { + SetupWorkaroundForFtpan58(spiBaseAddress, 0, 0); } else { DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0); } nrf_gpio_pin_clear(this->pinCsn); - currentBufferAddr = (uint32_t)data; + currentBufferAddr = (uint32_t) data; currentBufferSize = size; - auto currentSize = std::min((size_t)255, (size_t)currentBufferSize); + auto currentSize = std::min((size_t) 255, (size_t) currentBufferSize); PrepareTx(currentBufferAddr, currentSize); currentBufferSize -= currentSize; currentBufferAddr += currentSize; spiBaseAddress->TASKS_START = 1; - if(size == 1) { - while (spiBaseAddress->EVENTS_END == 0); + if (size == 1) { + while (spiBaseAddress->EVENTS_END == 0) + ; nrf_gpio_pin_set(this->pinCsn); currentBufferAddr = 0; xSemaphoreGive(mutex); @@ -190,41 +209,41 @@ bool SpiMaster::Write(uint8_t pinCsn, const uint8_t *data, size_t size) { return true; } -bool SpiMaster::Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t *data, size_t dataSize) { - xSemaphoreTake(mutex, portMAX_DELAY); +bool SpiMaster::Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize) { + xSemaphoreTake(mutex, portMAX_DELAY); - taskToNotify = nullptr; + taskToNotify = nullptr; - this->pinCsn = pinCsn; - DisableWorkaroundForFtpan58(spiBaseAddress, 0,0); - spiBaseAddress->INTENCLR = (1<<6); - spiBaseAddress->INTENCLR = (1<<1); - spiBaseAddress->INTENCLR = (1<<19); + this->pinCsn = pinCsn; + DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0); + spiBaseAddress->INTENCLR = (1 << 6); + spiBaseAddress->INTENCLR = (1 << 1); + spiBaseAddress->INTENCLR = (1 << 19); - nrf_gpio_pin_clear(this->pinCsn); + nrf_gpio_pin_clear(this->pinCsn); + currentBufferAddr = 0; + currentBufferSize = 0; - currentBufferAddr = 0; - currentBufferSize = 0; + PrepareTx((uint32_t) cmd, cmdSize); + spiBaseAddress->TASKS_START = 1; + while (spiBaseAddress->EVENTS_END == 0) + ; - PrepareTx((uint32_t)cmd, cmdSize); - spiBaseAddress->TASKS_START = 1; - while (spiBaseAddress->EVENTS_END == 0); + PrepareRx((uint32_t) cmd, cmdSize, (uint32_t) data, dataSize); + spiBaseAddress->TASKS_START = 1; - PrepareRx((uint32_t)cmd, cmdSize, (uint32_t)data, dataSize); - spiBaseAddress->TASKS_START = 1; + while (spiBaseAddress->EVENTS_END == 0) + ; + nrf_gpio_pin_set(this->pinCsn); - while (spiBaseAddress->EVENTS_END == 0); - nrf_gpio_pin_set(this->pinCsn); + xSemaphoreGive(mutex); - xSemaphoreGive(mutex); - - return true; + return true; } - void SpiMaster::Sleep() { - while(spiBaseAddress->ENABLE != 0) { + while (spiBaseAddress->ENABLE != 0) { spiBaseAddress->ENABLE = (SPIM_ENABLE_ENABLE_Disabled << SPIM_ENABLE_ENABLE_Pos); } nrf_gpio_cfg_default(params.pinSCK); @@ -239,37 +258,35 @@ void SpiMaster::Wakeup() { NRF_LOG_INFO("[SPIMASTER] Wakeup"); } -bool SpiMaster::WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t *cmd, size_t cmdSize, const uint8_t *data, size_t dataSize) { +bool SpiMaster::WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize) { xSemaphoreTake(mutex, portMAX_DELAY); taskToNotify = nullptr; this->pinCsn = pinCsn; - DisableWorkaroundForFtpan58(spiBaseAddress, 0,0); - spiBaseAddress->INTENCLR = (1<<6); - spiBaseAddress->INTENCLR = (1<<1); - spiBaseAddress->INTENCLR = (1<<19); + DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0); + spiBaseAddress->INTENCLR = (1 << 6); + spiBaseAddress->INTENCLR = (1 << 1); + spiBaseAddress->INTENCLR = (1 << 19); nrf_gpio_pin_clear(this->pinCsn); - currentBufferAddr = 0; currentBufferSize = 0; - PrepareTx((uint32_t)cmd, cmdSize); + PrepareTx((uint32_t) cmd, cmdSize); spiBaseAddress->TASKS_START = 1; - while (spiBaseAddress->EVENTS_END == 0); + while (spiBaseAddress->EVENTS_END == 0) + ; - PrepareTx((uint32_t)data, dataSize); + PrepareTx((uint32_t) data, dataSize); spiBaseAddress->TASKS_START = 1; - while (spiBaseAddress->EVENTS_END == 0); + while (spiBaseAddress->EVENTS_END == 0) + ; nrf_gpio_pin_set(this->pinCsn); xSemaphoreGive(mutex); return true; } - - - diff --git a/src/drivers/SpiMaster.h b/src/drivers/SpiMaster.h index cb79d90c..aa037504 100644 --- a/src/drivers/SpiMaster.h +++ b/src/drivers/SpiMaster.h @@ -9,54 +9,58 @@ namespace Pinetime { namespace Drivers { class SpiMaster { - public:; - enum class SpiModule : uint8_t {SPI0, SPI1}; - enum class BitOrder : uint8_t {Msb_Lsb, Lsb_Msb}; - enum class Modes : uint8_t {Mode0, Mode1, Mode2, Mode3}; - enum class Frequencies : uint8_t {Freq8Mhz}; - struct Parameters { - BitOrder bitOrder; - Modes mode; - Frequencies Frequency; - uint8_t pinSCK; - uint8_t pinMOSI; - uint8_t pinMISO; - }; + public: + ; + enum class SpiModule : uint8_t { SPI0, SPI1 }; + enum class BitOrder : uint8_t { Msb_Lsb, Lsb_Msb }; + enum class Modes : uint8_t { Mode0, Mode1, Mode2, Mode3 }; + enum class Frequencies : uint8_t { Freq8Mhz }; + struct Parameters { + BitOrder bitOrder; + Modes mode; + Frequencies Frequency; + uint8_t pinSCK; + uint8_t pinMOSI; + uint8_t pinMISO; + }; - SpiMaster(const SpiModule spi, const Parameters& params); - SpiMaster(const SpiMaster&) = delete; - SpiMaster& operator=(const SpiMaster&) = delete; - SpiMaster(SpiMaster&&) = delete; - SpiMaster& operator=(SpiMaster&&) = delete; + SpiMaster(const SpiModule spi, const Parameters& params); + SpiMaster(const SpiMaster&) = delete; + SpiMaster& operator=(const SpiMaster&) = delete; + SpiMaster(SpiMaster&&) = delete; + SpiMaster& operator=(SpiMaster&&) = delete; - bool Init(); - bool Write(uint8_t pinCsn, const uint8_t* data, size_t size); - bool Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t *data, size_t dataSize); + bool Init(); + bool Write(uint8_t pinCsn, const uint8_t* data, size_t size); + bool Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize); - bool WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t* cmd, size_t cmdSize, const uint8_t *data, size_t dataSize); + bool WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize); - void OnStartedEvent(); - void OnEndEvent(); + void OnStartedEvent(); + void OnEndEvent(); - void Sleep(); - void Wakeup(); + void Sleep(); + void Wakeup(); - private: - void SetupWorkaroundForFtpan58(NRF_SPIM_Type *spim, uint32_t ppi_channel, uint32_t gpiote_channel); - void DisableWorkaroundForFtpan58(NRF_SPIM_Type *spim, uint32_t ppi_channel, uint32_t gpiote_channel); - void PrepareTx(const volatile uint32_t bufferAddress, const volatile size_t size); - void PrepareRx(const volatile uint32_t cmdAddress, const volatile size_t cmdSize, const volatile uint32_t bufferAddress, const volatile size_t size); + private: + void SetupWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel); + void DisableWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel); + void PrepareTx(const volatile uint32_t bufferAddress, const volatile size_t size); + void PrepareRx(const volatile uint32_t cmdAddress, + const volatile size_t cmdSize, + const volatile uint32_t bufferAddress, + const volatile size_t size); - NRF_SPIM_Type * spiBaseAddress; - uint8_t pinCsn; + NRF_SPIM_Type* spiBaseAddress; + uint8_t pinCsn; - SpiMaster::SpiModule spi; - SpiMaster::Parameters params; + SpiMaster::SpiModule spi; + SpiMaster::Parameters params; - volatile uint32_t currentBufferAddr = 0; - volatile size_t currentBufferSize = 0; - volatile TaskHandle_t taskToNotify; - SemaphoreHandle_t mutex; + volatile uint32_t currentBufferAddr = 0; + volatile size_t currentBufferSize = 0; + volatile TaskHandle_t taskToNotify; + SemaphoreHandle_t mutex; }; } } diff --git a/src/drivers/SpiNorFlash.cpp b/src/drivers/SpiNorFlash.cpp index 3ea5afe7..068d1d02 100644 --- a/src/drivers/SpiNorFlash.cpp +++ b/src/drivers/SpiNorFlash.cpp @@ -6,17 +6,16 @@ using namespace Pinetime::Drivers; -SpiNorFlash::SpiNorFlash(Spi& spi) : spi{spi} { - +SpiNorFlash::SpiNorFlash(Spi& spi) : spi {spi} { } void SpiNorFlash::Init() { device_id = ReadIdentificaion(); - NRF_LOG_INFO("[SpiNorFlash] Manufacturer : %d, Memory type : %d, memory density : %d", device_id.manufacturer, device_id.type, device_id.density); + NRF_LOG_INFO( + "[SpiNorFlash] Manufacturer : %d, Memory type : %d, memory density : %d", device_id.manufacturer, device_id.type, device_id.density); } void SpiNorFlash::Uninit() { - } void SpiNorFlash::Sleep() { @@ -30,12 +29,11 @@ void SpiNorFlash::Wakeup() { static constexpr uint8_t cmdSize = 4; uint8_t cmd[cmdSize] = {static_cast(Commands::ReleaseFromDeepPowerDown), 0x01, 0x02, 0x03}; uint8_t id = 0; - spi.Read(reinterpret_cast(&cmd), cmdSize, &id, 1); - auto devId = device_id = ReadIdentificaion(); - if(devId.type != device_id.type) { + spi.Read(reinterpret_cast(&cmd), cmdSize, &id, 1); + auto devId = device_id = ReadIdentificaion(); + if (devId.type != device_id.type) { NRF_LOG_INFO("[SpiNorFlash] ID on Wakeup: Failed"); - } - else { + } else { NRF_LOG_INFO("[SpiNorFlash] ID on Wakeup: %d", id); } NRF_LOG_INFO("[SpiNorFlash] Wakeup") @@ -44,7 +42,7 @@ void SpiNorFlash::Wakeup() { SpiNorFlash::Identification SpiNorFlash::ReadIdentificaion() { auto cmd = static_cast(Commands::ReadIdentification); Identification identification; - spi.Read(&cmd, 1, reinterpret_cast(&identification), sizeof(Identification)); + spi.Read(&cmd, 1, reinterpret_cast(&identification), sizeof(Identification)); return identification; } @@ -70,11 +68,10 @@ uint8_t SpiNorFlash::ReadConfigurationRegister() { return status; } -void SpiNorFlash::Read(uint32_t address, uint8_t *buffer, size_t size) { +void SpiNorFlash::Read(uint32_t address, uint8_t* buffer, size_t size) { static constexpr uint8_t cmdSize = 4; - uint8_t cmd[cmdSize] = { static_cast(Commands::Read), (uint8_t)(address >> 16U), (uint8_t)(address >> 8U), - (uint8_t)address }; - spi.Read(reinterpret_cast(&cmd), cmdSize, buffer, size); + uint8_t cmd[cmdSize] = {static_cast(Commands::Read), (uint8_t) (address >> 16U), (uint8_t) (address >> 8U), (uint8_t) address}; + spi.Read(reinterpret_cast(&cmd), cmdSize, buffer, size); } void SpiNorFlash::WriteEnable() { @@ -84,15 +81,19 @@ void SpiNorFlash::WriteEnable() { void SpiNorFlash::SectorErase(uint32_t sectorAddress) { static constexpr uint8_t cmdSize = 4; - uint8_t cmd[cmdSize] = { static_cast(Commands::SectorErase), (uint8_t)(sectorAddress >> 16U), (uint8_t)(sectorAddress >> 8U), - (uint8_t)sectorAddress }; + uint8_t cmd[cmdSize] = {static_cast(Commands::SectorErase), + (uint8_t) (sectorAddress >> 16U), + (uint8_t) (sectorAddress >> 8U), + (uint8_t) sectorAddress}; WriteEnable(); - while(!WriteEnabled()) vTaskDelay(1); + while (!WriteEnabled()) + vTaskDelay(1); - spi.Read(reinterpret_cast(&cmd), cmdSize, nullptr, 0); + spi.Read(reinterpret_cast(&cmd), cmdSize, nullptr, 0); - while(WriteInProgress()) vTaskDelay(1); + while (WriteInProgress()) + vTaskDelay(1); } uint8_t SpiNorFlash::ReadSecurityRegister() { @@ -110,29 +111,29 @@ bool SpiNorFlash::EraseFailed() { return (ReadSecurityRegister() & 0x40u) == 0x40u; } -void SpiNorFlash::Write(uint32_t address, const uint8_t *buffer, size_t size) { +void SpiNorFlash::Write(uint32_t address, const uint8_t* buffer, size_t size) { static constexpr uint8_t cmdSize = 4; size_t len = size; uint32_t addr = address; const uint8_t* b = buffer; - while(len > 0) { + while (len > 0) { uint32_t pageLimit = (addr & ~(pageSize - 1u)) + pageSize; - uint32_t toWrite = pageLimit - addr > len ? len : pageLimit - addr; + uint32_t toWrite = pageLimit - addr > len ? len : pageLimit - addr; - uint8_t cmd[cmdSize] = { static_cast(Commands::PageProgram), (uint8_t)(addr >> 16U), (uint8_t)(addr >> 8U), - (uint8_t)addr }; + uint8_t cmd[cmdSize] = {static_cast(Commands::PageProgram), (uint8_t) (addr >> 16U), (uint8_t) (addr >> 8U), (uint8_t) addr}; WriteEnable(); - while(!WriteEnabled()) vTaskDelay(1); + while (!WriteEnabled()) + vTaskDelay(1); spi.WriteCmdAndBuffer(cmd, cmdSize, b, toWrite); - while(WriteInProgress()) vTaskDelay(1); + while (WriteInProgress()) + vTaskDelay(1); addr += toWrite; b += toWrite; len -= toWrite; } - } diff --git a/src/drivers/SpiNorFlash.h b/src/drivers/SpiNorFlash.h index 7702d434..77a470b7 100644 --- a/src/drivers/SpiNorFlash.h +++ b/src/drivers/SpiNorFlash.h @@ -6,58 +6,55 @@ namespace Pinetime { namespace Drivers { class Spi; class SpiNorFlash { - public: - explicit SpiNorFlash(Spi& spi); - SpiNorFlash(const SpiNorFlash&) = delete; - SpiNorFlash& operator=(const SpiNorFlash&) = delete; - SpiNorFlash(SpiNorFlash&&) = delete; - SpiNorFlash& operator=(SpiNorFlash&&) = delete; + public: + explicit SpiNorFlash(Spi& spi); + SpiNorFlash(const SpiNorFlash&) = delete; + SpiNorFlash& operator=(const SpiNorFlash&) = delete; + SpiNorFlash(SpiNorFlash&&) = delete; + SpiNorFlash& operator=(SpiNorFlash&&) = delete; - typedef struct __attribute__((packed)) { - uint8_t manufacturer = 0; - uint8_t type = 0; - uint8_t density = 0; - } Identification; + typedef struct __attribute__((packed)) { + uint8_t manufacturer = 0; + uint8_t type = 0; + uint8_t density = 0; + } Identification; - Identification ReadIdentificaion(); - uint8_t ReadStatusRegister(); - bool WriteInProgress(); - bool WriteEnabled(); - uint8_t ReadConfigurationRegister(); - void Read(uint32_t address, uint8_t* buffer, size_t size); - void Write(uint32_t address, const uint8_t *buffer, size_t size); - void WriteEnable(); - void SectorErase(uint32_t sectorAddress); - uint8_t ReadSecurityRegister(); - bool ProgramFailed(); - bool EraseFailed(); + Identification ReadIdentificaion(); + uint8_t ReadStatusRegister(); + bool WriteInProgress(); + bool WriteEnabled(); + uint8_t ReadConfigurationRegister(); + void Read(uint32_t address, uint8_t* buffer, size_t size); + void Write(uint32_t address, const uint8_t* buffer, size_t size); + void WriteEnable(); + void SectorErase(uint32_t sectorAddress); + uint8_t ReadSecurityRegister(); + bool ProgramFailed(); + bool EraseFailed(); + void Init(); + void Uninit(); - void Init(); - void Uninit(); + void Sleep(); + void Wakeup(); + private: + enum class Commands : uint8_t { + PageProgram = 0x02, + Read = 0x03, + ReadStatusRegister = 0x05, + WriteEnable = 0x06, + ReadConfigurationRegister = 0x15, + SectorErase = 0x20, + ReadSecurityRegister = 0x2B, + ReadIdentification = 0x9F, + ReleaseFromDeepPowerDown = 0xAB, + DeepPowerDown = 0xB9 + }; + static constexpr uint16_t pageSize = 256; - void Sleep(); - void Wakeup(); - private: - enum class Commands : uint8_t { - PageProgram = 0x02, - Read = 0x03, - ReadStatusRegister = 0x05, - WriteEnable = 0x06, - ReadConfigurationRegister = 0x15, - SectorErase = 0x20, - ReadSecurityRegister = 0x2B, - ReadIdentification = 0x9F, - ReleaseFromDeepPowerDown = 0xAB, - DeepPowerDown = 0xB9 - }; - static constexpr uint16_t pageSize = 256; - - Spi& spi; - Identification device_id; + Spi& spi; + Identification device_id; }; } } - - diff --git a/src/drivers/St7789.cpp b/src/drivers/St7789.cpp index 87cbb639..39218e77 100644 --- a/src/drivers/St7789.cpp +++ b/src/drivers/St7789.cpp @@ -6,11 +6,9 @@ using namespace Pinetime::Drivers; -St7789::St7789(Spi &spi, uint8_t pinDataCommand) : spi{spi}, pinDataCommand{pinDataCommand} { - +St7789::St7789(Spi& spi, uint8_t pinDataCommand) : spi {spi}, pinDataCommand {pinDataCommand} { } - void St7789::Init() { spi.Init(); nrf_gpio_cfg_output(pinDataCommand); @@ -38,9 +36,8 @@ void St7789::WriteData(uint8_t data) { WriteSpi(&data, 1); } - void St7789::WriteSpi(const uint8_t* data, size_t size) { - spi.Write(data, size); + spi.Write(data, size); } void St7789::SoftwareReset() { @@ -105,7 +102,7 @@ void St7789::SetAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { WriteData(x1 & 0xff); WriteCommand(static_cast(Commands::RowAddressSet)); - WriteData(y0>>8); + WriteData(y0 >> 8); WriteData(y0 & 0xff); WriteData(y1 >> 8); WriteData(y1 & 0xff); @@ -139,21 +136,20 @@ void St7789::VerticalScrollStartAddress(uint16_t line) { WriteData(line & 0x00ffu); } - void St7789::Uninit() { - } void St7789::DrawPixel(uint16_t x, uint16_t y, uint32_t color) { - if((x < 0) ||(x >= Width) || (y < 0) || (y >= Height)) return; + if ((x < 0) || (x >= Width) || (y < 0) || (y >= Height)) + return; - SetAddrWindow(x, y, x+1, y+1); + SetAddrWindow(x, y, x + 1, y + 1); nrf_gpio_pin_set(pinDataCommand); - WriteSpi(reinterpret_cast(&color), 2); + WriteSpi(reinterpret_cast(&color), 2); } -void St7789::DrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *data, size_t size) { +void St7789::DrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t* data, size_t size) { SetAddrWindow(x, y, x + width - 1, y + height - 1); nrf_gpio_pin_set(pinDataCommand); WriteSpi(data, size); diff --git a/src/drivers/St7789.h b/src/drivers/St7789.h index 2c6f9b6b..cea9cf19 100644 --- a/src/drivers/St7789.h +++ b/src/drivers/St7789.h @@ -6,69 +6,68 @@ namespace Pinetime { namespace Drivers { class Spi; class St7789 { - public: - explicit St7789(Spi& spi, uint8_t pinDataCommand); - St7789(const St7789&) = delete; - St7789& operator=(const St7789&) = delete; - St7789(St7789&&) = delete; - St7789& operator=(St7789&&) = delete; + public: + explicit St7789(Spi& spi, uint8_t pinDataCommand); + St7789(const St7789&) = delete; + St7789& operator=(const St7789&) = delete; + St7789(St7789&&) = delete; + St7789& operator=(St7789&&) = delete; - void Init(); - void Uninit(); - void DrawPixel(uint16_t x, uint16_t y, uint32_t color); + void Init(); + void Uninit(); + void DrawPixel(uint16_t x, uint16_t y, uint32_t color); - void VerticalScrollDefinition(uint16_t topFixedLines, uint16_t scrollLines, uint16_t bottomFixedLines); - void VerticalScrollStartAddress(uint16_t line); + void VerticalScrollDefinition(uint16_t topFixedLines, uint16_t scrollLines, uint16_t bottomFixedLines); + void VerticalScrollStartAddress(uint16_t line); - void DrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *data, size_t size); + void DrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t* data, size_t size); - void DisplayOn(); - void DisplayOff(); + void DisplayOn(); + void DisplayOff(); - void Sleep(); - void Wakeup(); - private: - Spi& spi; - uint8_t pinDataCommand; - uint8_t verticalScrollingStartAddress = 0; + void Sleep(); + void Wakeup(); - void HardwareReset(); - void SoftwareReset(); - void SleepOut(); - void SleepIn(); - void ColMod(); - void MemoryDataAccessControl(); - void DisplayInversionOn(); - void NormalModeOn(); - void WriteToRam(); - void SetAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); - void WriteCommand(uint8_t cmd); - void WriteSpi(const uint8_t* data, size_t size); + private: + Spi& spi; + uint8_t pinDataCommand; + uint8_t verticalScrollingStartAddress = 0; - enum class Commands : uint8_t { - SoftwareReset = 0x01, - SleepIn = 0x10, - SleepOut = 0x11, - NormalModeOn = 0x13, - DisplayInversionOn = 0x21, - DisplayOff = 0x28, - DisplayOn = 0x29, - ColumnAddressSet = 0x2a, - RowAddressSet = 0x2b, - WriteToRam = 0x2c, - MemoryDataAccessControl = 0x36, - VerticalScrollDefinition = 0x33, - VerticalScrollStartAddress = 0x37, - ColMod = 0x3a, - }; - void WriteData(uint8_t data); - void ColumnAddressSet(); + void HardwareReset(); + void SoftwareReset(); + void SleepOut(); + void SleepIn(); + void ColMod(); + void MemoryDataAccessControl(); + void DisplayInversionOn(); + void NormalModeOn(); + void WriteToRam(); + void SetAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); + void WriteCommand(uint8_t cmd); + void WriteSpi(const uint8_t* data, size_t size); - static constexpr uint16_t Width = 240; - static constexpr uint16_t Height = 320; - void RowAddressSet(); + enum class Commands : uint8_t { + SoftwareReset = 0x01, + SleepIn = 0x10, + SleepOut = 0x11, + NormalModeOn = 0x13, + DisplayInversionOn = 0x21, + DisplayOff = 0x28, + DisplayOn = 0x29, + ColumnAddressSet = 0x2a, + RowAddressSet = 0x2b, + WriteToRam = 0x2c, + MemoryDataAccessControl = 0x36, + VerticalScrollDefinition = 0x33, + VerticalScrollStartAddress = 0x37, + ColMod = 0x3a, + }; + void WriteData(uint8_t data); + void ColumnAddressSet(); + + static constexpr uint16_t Width = 240; + static constexpr uint16_t Height = 320; + void RowAddressSet(); }; } } - - diff --git a/src/drivers/TwiMaster.cpp b/src/drivers/TwiMaster.cpp index 271b714f..7b6582dd 100644 --- a/src/drivers/TwiMaster.cpp +++ b/src/drivers/TwiMaster.cpp @@ -8,33 +8,39 @@ using namespace Pinetime::Drivers; // TODO use shortcut to automatically send STOP when receive LastTX, for example // TODO use DMA/IRQ -TwiMaster::TwiMaster(const Modules module, const Parameters& params) : module{module}, params{params} { +TwiMaster::TwiMaster(const Modules module, const Parameters& params) : module {module}, params {params} { mutex = xSemaphoreCreateBinary(); } void TwiMaster::Init() { - NRF_GPIO->PIN_CNF[params.pinScl] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) - | ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) - | ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) - | ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) - | ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); + NRF_GPIO->PIN_CNF[params.pinScl] = + ((uint32_t) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | + ((uint32_t) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t) GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) | + ((uint32_t) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); - NRF_GPIO->PIN_CNF[params.pinSda] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) - | ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) - | ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) - | ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) - | ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); + NRF_GPIO->PIN_CNF[params.pinSda] = + ((uint32_t) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | + ((uint32_t) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t) GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) | + ((uint32_t) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); - switch(module) { - case Modules::TWIM1: twiBaseAddress = NRF_TWIM1; break; + switch (module) { + case Modules::TWIM1: + twiBaseAddress = NRF_TWIM1; + break; default: return; } - switch(static_cast(params.frequency)) { - case Frequencies::Khz100 : twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K100; break; - case Frequencies::Khz250 : twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K250; break; - case Frequencies::Khz400 : twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K400; break; + switch (static_cast(params.frequency)) { + case Frequencies::Khz100: + twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K100; + break; + case Frequencies::Khz250: + twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K250; + break; + case Frequencies::Khz400: + twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K400; + break; } twiBaseAddress->PSEL.SCL = params.pinScl; @@ -49,7 +55,6 @@ void TwiMaster::Init() { twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos); - /* // IRQ NVIC_ClearPendingIRQ(_IRQn); NVIC_SetPriority(_IRQn, 2); @@ -57,10 +62,9 @@ void TwiMaster::Init() { */ xSemaphoreGive(mutex); - } -TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t *data, size_t size) { +TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* data, size_t size) { xSemaphoreTake(mutex, portMAX_DELAY); auto ret = Write(deviceAddress, ®isterAddress, 1, false); ret = Read(deviceAddress, data, size, true); @@ -68,7 +72,7 @@ TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t registerAdd return ret; } -TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t *data, size_t size) { +TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t* data, size_t size) { ASSERT(size <= maxDataSize); xSemaphoreTake(mutex, portMAX_DELAY); internalBuffer[0] = registerAddress; @@ -78,22 +82,23 @@ TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, uint8_t registerAd return ret; } -TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t *buffer, size_t size, bool stop) { +TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop) { twiBaseAddress->ADDRESS = deviceAddress; twiBaseAddress->TASKS_RESUME = 0x1UL; - twiBaseAddress->RXD.PTR = (uint32_t)buffer; + twiBaseAddress->RXD.PTR = (uint32_t) buffer; twiBaseAddress->RXD.MAXCNT = size; twiBaseAddress->TASKS_STARTRX = 1; - while(!twiBaseAddress->EVENTS_RXSTARTED && !twiBaseAddress->EVENTS_ERROR); + while (!twiBaseAddress->EVENTS_RXSTARTED && !twiBaseAddress->EVENTS_ERROR) + ; twiBaseAddress->EVENTS_RXSTARTED = 0x0UL; txStartedCycleCount = DWT->CYCCNT; uint32_t currentCycleCount; - while(!twiBaseAddress->EVENTS_LASTRX && !twiBaseAddress->EVENTS_ERROR) { + while (!twiBaseAddress->EVENTS_LASTRX && !twiBaseAddress->EVENTS_ERROR) { currentCycleCount = DWT->CYCCNT; - if ((currentCycleCount-txStartedCycleCount) > HwFreezedDelay) { + if ((currentCycleCount - txStartedCycleCount) > HwFreezedDelay) { FixHwFreezed(); return ErrorCodes::TransactionFailed; } @@ -102,12 +107,13 @@ TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t *buffer, si if (stop || twiBaseAddress->EVENTS_ERROR) { twiBaseAddress->TASKS_STOP = 0x1UL; - while(!twiBaseAddress->EVENTS_STOPPED); + while (!twiBaseAddress->EVENTS_STOPPED) + ; twiBaseAddress->EVENTS_STOPPED = 0x0UL; - } - else { + } else { twiBaseAddress->TASKS_SUSPEND = 0x1UL; - while(!twiBaseAddress->EVENTS_SUSPENDED); + while (!twiBaseAddress->EVENTS_SUSPENDED) + ; twiBaseAddress->EVENTS_SUSPENDED = 0x0UL; } @@ -117,22 +123,23 @@ TwiMaster::ErrorCodes TwiMaster::Read(uint8_t deviceAddress, uint8_t *buffer, si return ErrorCodes::NoError; } -TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, const uint8_t *data, size_t size, bool stop) { +TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop) { twiBaseAddress->ADDRESS = deviceAddress; twiBaseAddress->TASKS_RESUME = 0x1UL; - twiBaseAddress->TXD.PTR = (uint32_t)data; + twiBaseAddress->TXD.PTR = (uint32_t) data; twiBaseAddress->TXD.MAXCNT = size; twiBaseAddress->TASKS_STARTTX = 1; - while(!twiBaseAddress->EVENTS_TXSTARTED && !twiBaseAddress->EVENTS_ERROR); + while (!twiBaseAddress->EVENTS_TXSTARTED && !twiBaseAddress->EVENTS_ERROR) + ; twiBaseAddress->EVENTS_TXSTARTED = 0x0UL; txStartedCycleCount = DWT->CYCCNT; uint32_t currentCycleCount; - while(!twiBaseAddress->EVENTS_LASTTX && !twiBaseAddress->EVENTS_ERROR) { + while (!twiBaseAddress->EVENTS_LASTTX && !twiBaseAddress->EVENTS_ERROR) { currentCycleCount = DWT->CYCCNT; - if ((currentCycleCount-txStartedCycleCount) > HwFreezedDelay) { + if ((currentCycleCount - txStartedCycleCount) > HwFreezedDelay) { FixHwFreezed(); return ErrorCodes::TransactionFailed; } @@ -141,12 +148,13 @@ TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, const uint8_t *dat if (stop || twiBaseAddress->EVENTS_ERROR) { twiBaseAddress->TASKS_STOP = 0x1UL; - while(!twiBaseAddress->EVENTS_STOPPED); + while (!twiBaseAddress->EVENTS_STOPPED) + ; twiBaseAddress->EVENTS_STOPPED = 0x0UL; - } - else { + } else { twiBaseAddress->TASKS_SUSPEND = 0x1UL; - while(!twiBaseAddress->EVENTS_SUSPENDED); + while (!twiBaseAddress->EVENTS_SUSPENDED) + ; twiBaseAddress->EVENTS_SUSPENDED = 0x0UL; } @@ -160,7 +168,7 @@ TwiMaster::ErrorCodes TwiMaster::Write(uint8_t deviceAddress, const uint8_t *dat } void TwiMaster::Sleep() { - while(twiBaseAddress->ENABLE != 0) { + while (twiBaseAddress->ENABLE != 0) { twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Disabled << TWIM_ENABLE_ENABLE_Pos); } nrf_gpio_cfg_default(6); @@ -184,17 +192,15 @@ void TwiMaster::FixHwFreezed() { uint32_t twi_state = NRF_TWI1->ENABLE; twiBaseAddress->ENABLE = TWIM_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos; - NRF_GPIO->PIN_CNF[params.pinScl] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) - | ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) - | ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) - | ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) - | ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); + NRF_GPIO->PIN_CNF[params.pinScl] = + ((uint32_t) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | + ((uint32_t) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t) GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | + ((uint32_t) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); - NRF_GPIO->PIN_CNF[params.pinSda] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) - | ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) - | ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) - | ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) - | ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); + NRF_GPIO->PIN_CNF[params.pinSda] = + ((uint32_t) GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) | ((uint32_t) GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | + ((uint32_t) GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) | ((uint32_t) GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) | + ((uint32_t) GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos); // Re-enable I²C twiBaseAddress->ENABLE = twi_state; diff --git a/src/drivers/TwiMaster.h b/src/drivers/TwiMaster.h index f3c87b0a..fc3bd2a7 100644 --- a/src/drivers/TwiMaster.h +++ b/src/drivers/TwiMaster.h @@ -7,39 +7,38 @@ namespace Pinetime { namespace Drivers { class TwiMaster { - public: - enum class Modules { TWIM1 }; - enum class Frequencies {Khz100, Khz250, Khz400}; - enum class ErrorCodes {NoError, TransactionFailed}; - struct Parameters { - uint32_t frequency; - uint8_t pinSda; - uint8_t pinScl; - }; + public: + enum class Modules { TWIM1 }; + enum class Frequencies { Khz100, Khz250, Khz400 }; + enum class ErrorCodes { NoError, TransactionFailed }; + struct Parameters { + uint32_t frequency; + uint8_t pinSda; + uint8_t pinScl; + }; - TwiMaster(const Modules module, const Parameters& params); + TwiMaster(const Modules module, const Parameters& params); - void Init(); - ErrorCodes Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* buffer, size_t size); - ErrorCodes Write(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t* data, size_t size); + void Init(); + ErrorCodes Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* buffer, size_t size); + ErrorCodes Write(uint8_t deviceAddress, uint8_t registerAddress, const uint8_t* data, size_t size); - void Sleep(); - void Wakeup(); + void Sleep(); + void Wakeup(); - private: - - ErrorCodes Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop); - ErrorCodes Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop); - void FixHwFreezed(); - NRF_TWIM_Type* twiBaseAddress; - SemaphoreHandle_t mutex; - const Modules module; - const Parameters params; - static constexpr uint8_t maxDataSize{16}; - static constexpr uint8_t registerSize{1}; - uint8_t internalBuffer[maxDataSize + registerSize]; - uint32_t txStartedCycleCount = 0; - static constexpr uint32_t HwFreezedDelay{161000}; + private: + ErrorCodes Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop); + ErrorCodes Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop); + void FixHwFreezed(); + NRF_TWIM_Type* twiBaseAddress; + SemaphoreHandle_t mutex; + const Modules module; + const Parameters params; + static constexpr uint8_t maxDataSize {16}; + static constexpr uint8_t registerSize {1}; + uint8_t internalBuffer[maxDataSize + registerSize]; + uint32_t txStartedCycleCount = 0; + static constexpr uint32_t HwFreezedDelay {161000}; }; } } \ No newline at end of file diff --git a/src/drivers/Watchdog.cpp b/src/drivers/Watchdog.cpp index d09fbcd1..a6ad263a 100644 --- a/src/drivers/Watchdog.cpp +++ b/src/drivers/Watchdog.cpp @@ -2,7 +2,6 @@ #include using namespace Pinetime::Drivers; - void Watchdog::Setup(uint8_t timeoutSeconds) { NRF_WDT->CONFIG &= ~(WDT_CONFIG_SLEEP_Msk << WDT_CONFIG_SLEEP_Pos); NRF_WDT->CONFIG |= (WDT_CONFIG_HALT_Run << WDT_CONFIG_SLEEP_Pos); @@ -12,7 +11,7 @@ void Watchdog::Setup(uint8_t timeoutSeconds) { /* timeout (s) = (CRV + 1) / 32768 */ // JF : 7500 = 7.5s - uint32_t crv = (((timeoutSeconds*1000u) << 15u) / 1000) - 1; + uint32_t crv = (((timeoutSeconds * 1000u) << 15u) / 1000) - 1; NRF_WDT->CRV = crv; /* Enable reload requests */ @@ -33,28 +32,46 @@ Watchdog::ResetReasons Watchdog::ActualResetReason() const { uint32_t reason = NRF_POWER->RESETREAS; NRF_POWER->RESETREAS = 0xffffffff; - if(reason & 0x01u) return ResetReasons::ResetPin; - if((reason >> 1u) & 0x01u) return ResetReasons::Watchdog; - if((reason >> 2u) & 0x01u) return ResetReasons::SoftReset; - if((reason >> 3u) & 0x01u) return ResetReasons::CpuLockup; - if((reason >> 16u) & 0x01u) return ResetReasons::SystemOff; - if((reason >> 17u) & 0x01u) return ResetReasons::LpComp; - if((reason) & 0x01u) return ResetReasons::DebugInterface; - if((reason >> 19u) & 0x01u) return ResetReasons::NFC; + if (reason & 0x01u) + return ResetReasons::ResetPin; + if ((reason >> 1u) & 0x01u) + return ResetReasons::Watchdog; + if ((reason >> 2u) & 0x01u) + return ResetReasons::SoftReset; + if ((reason >> 3u) & 0x01u) + return ResetReasons::CpuLockup; + if ((reason >> 16u) & 0x01u) + return ResetReasons::SystemOff; + if ((reason >> 17u) & 0x01u) + return ResetReasons::LpComp; + if ((reason) &0x01u) + return ResetReasons::DebugInterface; + if ((reason >> 19u) & 0x01u) + return ResetReasons::NFC; return ResetReasons::HardReset; } -const char *Watchdog::ResetReasonToString(Watchdog::ResetReasons reason) { - switch(reason) { - case ResetReasons::ResetPin: return "Reset pin"; - case ResetReasons::Watchdog: return "Watchdog"; - case ResetReasons::DebugInterface: return "Debug interface"; - case ResetReasons::LpComp: return "LPCOMP"; - case ResetReasons::SystemOff: return "System OFF"; - case ResetReasons::CpuLockup: return "CPU Lock-up"; - case ResetReasons::SoftReset: return "Soft reset"; - case ResetReasons::NFC: return "NFC"; - case ResetReasons::HardReset: return "Hard reset"; - default: return "Unknown"; +const char* Watchdog::ResetReasonToString(Watchdog::ResetReasons reason) { + switch (reason) { + case ResetReasons::ResetPin: + return "Reset pin"; + case ResetReasons::Watchdog: + return "Watchdog"; + case ResetReasons::DebugInterface: + return "Debug interface"; + case ResetReasons::LpComp: + return "LPCOMP"; + case ResetReasons::SystemOff: + return "System OFF"; + case ResetReasons::CpuLockup: + return "CPU Lock-up"; + case ResetReasons::SoftReset: + return "Soft reset"; + case ResetReasons::NFC: + return "NFC"; + case ResetReasons::HardReset: + return "Hard reset"; + default: + return "Unknown"; } } diff --git a/src/drivers/Watchdog.h b/src/drivers/Watchdog.h index 0c816a4e..f1741892 100644 --- a/src/drivers/Watchdog.h +++ b/src/drivers/Watchdog.h @@ -4,25 +4,31 @@ namespace Pinetime { namespace Drivers { class Watchdog { - public: - enum class ResetReasons { ResetPin, Watchdog, SoftReset, CpuLockup, SystemOff, LpComp, DebugInterface, NFC, HardReset }; - void Setup(uint8_t timeoutSeconds); - void Start(); - void Kick(); - ResetReasons ResetReason() const { return resetReason; } - static const char* ResetReasonToString(ResetReasons reason); - private: - ResetReasons resetReason; - ResetReasons ActualResetReason() const; + public: + enum class ResetReasons { ResetPin, Watchdog, SoftReset, CpuLockup, SystemOff, LpComp, DebugInterface, NFC, HardReset }; + void Setup(uint8_t timeoutSeconds); + void Start(); + void Kick(); + ResetReasons ResetReason() const { + return resetReason; + } + static const char* ResetReasonToString(ResetReasons reason); + + private: + ResetReasons resetReason; + ResetReasons ActualResetReason() const; }; class WatchdogView { - public: - WatchdogView(const Watchdog& watchdog) : watchdog{watchdog} { } - Watchdog::ResetReasons ResetReason() const { return watchdog.ResetReason();} + public: + WatchdogView(const Watchdog& watchdog) : watchdog {watchdog} { + } + Watchdog::ResetReasons ResetReason() const { + return watchdog.ResetReason(); + } - private: - const Watchdog& watchdog; + private: + const Watchdog& watchdog; }; } } diff --git a/src/heartratetask/HeartRateTask.cpp b/src/heartratetask/HeartRateTask.cpp index 5a6d2a5e..36c8cc18 100644 --- a/src/heartratetask/HeartRateTask.cpp +++ b/src/heartratetask/HeartRateTask.cpp @@ -5,10 +5,8 @@ using namespace Pinetime::Applications; -HeartRateTask::HeartRateTask(Drivers::Hrs3300 &heartRateSensor, Controllers::HeartRateController& controller) : - heartRateSensor{heartRateSensor}, - controller{controller}, - ppg{static_cast(heartRateSensor.ReadHrs())} { +HeartRateTask::HeartRateTask(Drivers::Hrs3300& heartRateSensor, Controllers::HeartRateController& controller) + : heartRateSensor {heartRateSensor}, controller {controller}, ppg {static_cast(heartRateSensor.ReadHrs())} { messageQueue = xQueueCreate(10, 1); controller.SetHeartRateTask(this); } @@ -18,8 +16,8 @@ void HeartRateTask::Start() { APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); } -void HeartRateTask::Process(void *instance) { - auto *app = static_cast(instance); +void HeartRateTask::Process(void* instance) { + auto* app = static_cast(instance); app->Work(); } @@ -29,8 +27,10 @@ void HeartRateTask::Work() { Messages msg; uint32_t delay; if (state == States::Running) { - if (measurementStarted) delay = 40; - else delay = 100; + if (measurementStarted) + delay = 40; + else + delay = 100; } else delay = portMAX_DELAY; @@ -42,19 +42,21 @@ void HeartRateTask::Work() { break; case Messages::WakeUp: state = States::Running; - if(measurementStarted) { + if (measurementStarted) { lastBpm = 0; StartMeasurement(); } break; case Messages::StartMeasurement: - if(measurementStarted) break; + if (measurementStarted) + break; lastBpm = 0; StartMeasurement(); measurementStarted = true; break; case Messages::StopMeasurement: - if(!measurementStarted) break; + if (!measurementStarted) + break; StopMeasurement(); measurementStarted = false; break; @@ -66,8 +68,9 @@ void HeartRateTask::Work() { ppg.Preprocess(hrs); auto bpm = ppg.HeartRate(); - if (lastBpm == 0 && bpm == 0) controller.Update(Controllers::HeartRateController::States::NotEnoughData, 0); - if(bpm != 0) { + if (lastBpm == 0 && bpm == 0) + controller.Update(Controllers::HeartRateController::States::NotEnoughData, 0); + if (bpm != 0) { lastBpm = bpm; controller.Update(Controllers::HeartRateController::States::Running, lastBpm); } diff --git a/src/heartratetask/HeartRateTask.h b/src/heartratetask/HeartRateTask.h index f142af1a..0796dc74 100644 --- a/src/heartratetask/HeartRateTask.h +++ b/src/heartratetask/HeartRateTask.h @@ -4,19 +4,18 @@ #include #include - namespace Pinetime { namespace Drivers { class Hrs3300; } - namespace Controllers{ + namespace Controllers { class HeartRateController; } namespace Applications { class HeartRateTask { public: - enum class Messages : uint8_t {GoToSleep, WakeUp, StartMeasurement, StopMeasurement }; - enum class States {Idle, Running}; + enum class Messages : uint8_t { GoToSleep, WakeUp, StartMeasurement, StopMeasurement }; + enum class States { Idle, Running }; explicit HeartRateTask(Drivers::Hrs3300& heartRateSensor, Controllers::HeartRateController& controller); void Start(); @@ -31,13 +30,11 @@ namespace Pinetime { TaskHandle_t taskHandle; QueueHandle_t messageQueue; States state = States::Running; - Drivers::Hrs3300 &heartRateSensor; + Drivers::Hrs3300& heartRateSensor; Controllers::HeartRateController& controller; Controllers::Ppg ppg; bool measurementStarted = false; - }; } } - diff --git a/src/logging/DummyLogger.h b/src/logging/DummyLogger.h index 0aa72882..8732dff5 100644 --- a/src/logging/DummyLogger.h +++ b/src/logging/DummyLogger.h @@ -2,12 +2,13 @@ #include "Logger.h" namespace Pinetime { - namespace Logging{ - class DummyLogger : public Logger { + namespace Logging { + class DummyLogger : public Logger { public: - void Init() override {} - void Resume() override {} - }; + void Init() override { + } + void Resume() override { + } + }; } } - diff --git a/src/logging/Logger.h b/src/logging/Logger.h index 95d21dc4..093a9420 100644 --- a/src/logging/Logger.h +++ b/src/logging/Logger.h @@ -3,9 +3,9 @@ namespace Pinetime { namespace Logging { class Logger { - public: - virtual void Init() = 0; - virtual void Resume() = 0; + public: + virtual void Init() = 0; + virtual void Resume() = 0; }; } } \ No newline at end of file diff --git a/src/logging/NrfLogger.cpp b/src/logging/NrfLogger.cpp index 9f7624be..70a00e61 100644 --- a/src/logging/NrfLogger.cpp +++ b/src/logging/NrfLogger.cpp @@ -18,19 +18,17 @@ void NrfLogger::Init() { void NrfLogger::Process(void*) { NRF_LOG_INFO("Logger task started!"); - // Suppress endless loop diagnostic - #pragma clang diagnostic push - #pragma ide diagnostic ignored "EndlessLoop" +// Suppress endless loop diagnostic +#pragma clang diagnostic push +#pragma ide diagnostic ignored "EndlessLoop" while (1) { NRF_LOG_FLUSH(); vTaskDelay(100); // Not good for power consumption, it will wake up every 100ms... } - // Clear diagnostic suppression - #pragma clang diagnostic pop +// Clear diagnostic suppression +#pragma clang diagnostic pop } void NrfLogger::Resume() { vTaskResume(m_logger_thread); } - - diff --git a/src/logging/NrfLogger.h b/src/logging/NrfLogger.h index fb68b919..060c4e76 100644 --- a/src/logging/NrfLogger.h +++ b/src/logging/NrfLogger.h @@ -5,16 +5,15 @@ #include namespace Pinetime { - namespace Logging{ + namespace Logging { class NrfLogger : public Logger { - public: - void Init() override; - void Resume() override; + public: + void Init() override; + void Resume() override; - private: - static void Process(void*); - TaskHandle_t m_logger_thread; + private: + static void Process(void*); + TaskHandle_t m_logger_thread; }; } } - diff --git a/src/main.cpp b/src/main.cpp index 9470bdb9..04cef6b5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,10 +43,10 @@ #include "systemtask/SystemTask.h" #if NRF_LOG_ENABLED -#include "logging/NrfLogger.h" + #include "logging/NrfLogger.h" Pinetime::Logging::NrfLogger logger; #else -#include "logging/DummyLogger.h" + #include "logging/DummyLogger.h" Pinetime::Logging::DummyLogger logger; #endif @@ -64,15 +64,13 @@ static constexpr uint8_t touchPanelTwiAddress = 0x15; static constexpr uint8_t motionSensorTwiAddress = 0x18; static constexpr uint8_t heartRateSensorTwiAddress = 0x44; -Pinetime::Drivers::SpiMaster spi{Pinetime::Drivers::SpiMaster::SpiModule::SPI0, { - Pinetime::Drivers::SpiMaster::BitOrder::Msb_Lsb, - Pinetime::Drivers::SpiMaster::Modes::Mode3, - Pinetime::Drivers::SpiMaster::Frequencies::Freq8Mhz, - pinSpiSck, - pinSpiMosi, - pinSpiMiso - } -}; +Pinetime::Drivers::SpiMaster spi {Pinetime::Drivers::SpiMaster::SpiModule::SPI0, + {Pinetime::Drivers::SpiMaster::BitOrder::Msb_Lsb, + Pinetime::Drivers::SpiMaster::Modes::Mode3, + Pinetime::Drivers::SpiMaster::Frequencies::Freq8Mhz, + pinSpiSck, + pinSpiMosi, + pinSpiMiso}}; Pinetime::Drivers::Spi lcdSpi {spi, pinLcdCsn}; Pinetime::Drivers::St7789 lcd {lcdSpi, pinLcdDataCommand}; @@ -83,27 +81,25 @@ Pinetime::Drivers::SpiNorFlash spiNorFlash {flashSpi}; // The TWI device should work @ up to 400Khz but there is a HW bug which prevent it from // respecting correct timings. According to erratas heet, this magic value makes it run // at ~390Khz with correct timings. -static constexpr uint32_t MaxTwiFrequencyWithoutHardwareBug{0x06200000}; -Pinetime::Drivers::TwiMaster twiMaster{Pinetime::Drivers::TwiMaster::Modules::TWIM1, - Pinetime::Drivers::TwiMaster::Parameters { - MaxTwiFrequencyWithoutHardwareBug, pinTwiSda, pinTwiScl}}; +static constexpr uint32_t MaxTwiFrequencyWithoutHardwareBug {0x06200000}; +Pinetime::Drivers::TwiMaster twiMaster {Pinetime::Drivers::TwiMaster::Modules::TWIM1, + Pinetime::Drivers::TwiMaster::Parameters {MaxTwiFrequencyWithoutHardwareBug, pinTwiSda, pinTwiScl}}; Pinetime::Drivers::Cst816S touchPanel {twiMaster, touchPanelTwiAddress}; #ifdef PINETIME_IS_RECOVERY static constexpr bool isFactory = true; -#include "displayapp/DummyLittleVgl.h" -#include "displayapp/DisplayAppRecovery.h" + #include "displayapp/DummyLittleVgl.h" + #include "displayapp/DisplayAppRecovery.h" Pinetime::Components::LittleVgl lvgl {lcd, touchPanel}; #else static constexpr bool isFactory = false; -#include "displayapp/LittleVgl.h" -#include "displayapp/DisplayApp.h" + #include "displayapp/LittleVgl.h" + #include "displayapp/DisplayApp.h" Pinetime::Components::LittleVgl lvgl {lcd, touchPanel}; #endif -Pinetime::Drivers::Bma421 motionSensor{twiMaster, motionSensorTwiAddress}; +Pinetime::Drivers::Bma421 motionSensor {twiMaster, motionSensorTwiAddress}; Pinetime::Drivers::Hrs3300 heartRateSensor {twiMaster, heartRateSensorTwiAddress}; - TimerHandle_t debounceTimer; Pinetime::Controllers::Battery batteryController; Pinetime::Controllers::Ble bleController; @@ -112,14 +108,14 @@ void ble_manager_set_ble_disconnection_callback(void (*disconnection)()); static constexpr uint8_t pinTouchIrq = 28; std::unique_ptr systemTask; -Pinetime::Controllers::Settings settingsController{spiNorFlash}; +Pinetime::Controllers::Settings settingsController {spiNorFlash}; -Pinetime::Controllers::MotorController motorController{settingsController}; +Pinetime::Controllers::MotorController motorController {settingsController}; void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { - if(pin == pinTouchIrq) { + if (pin == pinTouchIrq) { systemTask->OnTouchEvent(); - return ; + return; } BaseType_t xHigherPriorityTaskWoken = pdFALSE; @@ -128,10 +124,10 @@ void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action } extern "C" { - void vApplicationIdleHook(void) { - if(!isFactory) - lv_tick_inc(1); - } +void vApplicationIdleHook(void) { + if (!isFactory) + lv_tick_inc(1); +} } void DebounceTimerCallback(TimerHandle_t xTimer) { @@ -140,25 +136,24 @@ void DebounceTimerCallback(TimerHandle_t xTimer) { } void SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler(void) { - if(((NRF_SPIM0->INTENSET & (1<<6)) != 0) && NRF_SPIM0->EVENTS_END == 1) { + if (((NRF_SPIM0->INTENSET & (1 << 6)) != 0) && NRF_SPIM0->EVENTS_END == 1) { NRF_SPIM0->EVENTS_END = 0; spi.OnEndEvent(); } - if(((NRF_SPIM0->INTENSET & (1<<19)) != 0) && NRF_SPIM0->EVENTS_STARTED == 1) { + if (((NRF_SPIM0->INTENSET & (1 << 19)) != 0) && NRF_SPIM0->EVENTS_STARTED == 1) { NRF_SPIM0->EVENTS_STARTED = 0; spi.OnStartedEvent(); } - if(((NRF_SPIM0->INTENSET & (1<<1)) != 0) && NRF_SPIM0->EVENTS_STOPPED == 1) { + if (((NRF_SPIM0->INTENSET & (1 << 1)) != 0) && NRF_SPIM0->EVENTS_STOPPED == 1) { NRF_SPIM0->EVENTS_STOPPED = 0; } } -static void (*radio_isr_addr)(void) ; -static void (*rng_isr_addr)(void) ; -static void (*rtc0_isr_addr)(void) ; - +static void (*radio_isr_addr)(void); +static void (*rng_isr_addr)(void); +static void (*rtc0_isr_addr)(void); /* Some interrupt handlers required for NimBLE radio driver */ extern "C" { @@ -192,8 +187,7 @@ void npl_freertos_hw_set_isr(int irqn, void (*addr)(void)) { } } -uint32_t -npl_freertos_hw_enter_critical(void) { +uint32_t npl_freertos_hw_enter_critical(void) { uint32_t ctx = __get_PRIMASK(); __disable_irq(); return (ctx & 0x01); @@ -205,16 +199,14 @@ void npl_freertos_hw_exit_critical(uint32_t ctx) { } } - static struct ble_npl_eventq g_eventq_dflt; -struct ble_npl_eventq * -nimble_port_get_dflt_eventq(void) { +struct ble_npl_eventq* nimble_port_get_dflt_eventq(void) { return &g_eventq_dflt; } void nimble_port_run(void) { - struct ble_npl_event *ev; + struct ble_npl_event* ev; while (1) { ev = ble_npl_eventq_get(&g_eventq_dflt, BLE_NPL_TIME_FOREVER); @@ -222,7 +214,7 @@ void nimble_port_run(void) { } } -void BleHost(void *) { +void BleHost(void*) { nimble_port_run(); } @@ -244,8 +236,8 @@ void nimble_port_init(void) { nimble_port_freertos_init(BleHost); } -void nimble_port_ll_task_func(void *args) { - extern void ble_ll_task(void *); +void nimble_port_ll_task_func(void* args) { + extern void ble_ll_task(void*); ble_ll_task(args); } } @@ -255,10 +247,20 @@ int main(void) { nrf_drv_clock_init(); - debounceTimer = xTimerCreate ("debounceTimer", 200, pdFALSE, (void *) 0, DebounceTimerCallback); + debounceTimer = xTimerCreate("debounceTimer", 200, pdFALSE, (void*) 0, DebounceTimerCallback); - systemTask = std::make_unique(spi, lcd, spiNorFlash, twiMaster, touchPanel, lvgl, batteryController, bleController, - motorController, heartRateSensor, motionSensor, settingsController); + systemTask = std::make_unique(spi, + lcd, + spiNorFlash, + twiMaster, + touchPanel, + lvgl, + batteryController, + bleController, + motorController, + heartRateSensor, + motionSensor, + settingsController); systemTask->Start(); nimble_port_init(); @@ -268,7 +270,3 @@ int main(void) { APP_ERROR_HANDLER(NRF_ERROR_FORBIDDEN); } } - - - - diff --git a/src/recoveryLoader.cpp b/src/recoveryLoader.cpp index 9ed062e2..9818179d 100644 --- a/src/recoveryLoader.cpp +++ b/src/recoveryLoader.cpp @@ -19,12 +19,11 @@ #include "displayapp/icons/infinitime/infinitime-nb.c" #include "components/rle/RleDecoder.h" - #if NRF_LOG_ENABLED -#include "logging/NrfLogger.h" + #include "logging/NrfLogger.h" Pinetime::Logging::NrfLogger logger; #else -#include "logging/DummyLogger.h" + #include "logging/DummyLogger.h" Pinetime::Logging::DummyLogger logger; #endif @@ -42,22 +41,20 @@ static constexpr uint8_t bytesPerPixel = 2; static constexpr uint16_t colorWhite = 0xFFFF; static constexpr uint16_t colorGreen = 0xE007; -Pinetime::Drivers::SpiMaster spi{Pinetime::Drivers::SpiMaster::SpiModule::SPI0, { - Pinetime::Drivers::SpiMaster::BitOrder::Msb_Lsb, - Pinetime::Drivers::SpiMaster::Modes::Mode3, - Pinetime::Drivers::SpiMaster::Frequencies::Freq8Mhz, - pinSpiSck, - pinSpiMosi, - pinSpiMiso -} -}; -Pinetime::Drivers::Spi flashSpi{spi, pinSpiFlashCsn}; -Pinetime::Drivers::SpiNorFlash spiNorFlash{flashSpi}; +Pinetime::Drivers::SpiMaster spi {Pinetime::Drivers::SpiMaster::SpiModule::SPI0, + {Pinetime::Drivers::SpiMaster::BitOrder::Msb_Lsb, + Pinetime::Drivers::SpiMaster::Modes::Mode3, + Pinetime::Drivers::SpiMaster::Frequencies::Freq8Mhz, + pinSpiSck, + pinSpiMosi, + pinSpiMiso}}; +Pinetime::Drivers::Spi flashSpi {spi, pinSpiFlashCsn}; +Pinetime::Drivers::SpiNorFlash spiNorFlash {flashSpi}; Pinetime::Drivers::Spi lcdSpi {spi, pinLcdCsn}; Pinetime::Drivers::St7789 lcd {lcdSpi, pinLcdDataCommand}; -Pinetime::Components::Gfx gfx{lcd}; +Pinetime::Components::Gfx gfx {lcd}; Pinetime::Controllers::BrightnessController brightnessController; void DisplayProgressBar(uint8_t percent, uint16_t color); @@ -66,21 +63,20 @@ void DisplayLogo(); extern "C" { void vApplicationIdleHook(void) { - } void SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler(void) { - if(((NRF_SPIM0->INTENSET & (1<<6)) != 0) && NRF_SPIM0->EVENTS_END == 1) { + if (((NRF_SPIM0->INTENSET & (1 << 6)) != 0) && NRF_SPIM0->EVENTS_END == 1) { NRF_SPIM0->EVENTS_END = 0; spi.OnEndEvent(); } - if(((NRF_SPIM0->INTENSET & (1<<19)) != 0) && NRF_SPIM0->EVENTS_STARTED == 1) { + if (((NRF_SPIM0->INTENSET & (1 << 19)) != 0) && NRF_SPIM0->EVENTS_STARTED == 1) { NRF_SPIM0->EVENTS_STARTED = 0; spi.OnStartedEvent(); } - if(((NRF_SPIM0->INTENSET & (1<<1)) != 0) && NRF_SPIM0->EVENTS_STOPPED == 1) { + if (((NRF_SPIM0->INTENSET & (1 << 1)) != 0) && NRF_SPIM0->EVENTS_STOPPED == 1) { NRF_SPIM0->EVENTS_STOPPED = 0; } } @@ -115,7 +111,7 @@ void Process(void* instance) { NRF_LOG_INFO("Writing factory image..."); static constexpr uint32_t memoryChunkSize = 200; uint8_t writeBuffer[memoryChunkSize]; - for(size_t offset = 0; offset < sizeof(recoveryImage); offset+=memoryChunkSize) { + for (size_t offset = 0; offset < sizeof(recoveryImage); offset += memoryChunkSize) { std::memcpy(writeBuffer, &recoveryImage[offset], memoryChunkSize); spiNorFlash.Write(offset, writeBuffer, memoryChunkSize); DisplayProgressBar((static_cast(offset) / static_cast(sizeof(recoveryImage))) * 100.0f, colorWhite); @@ -124,27 +120,27 @@ void Process(void* instance) { NRF_LOG_INFO("Writing factory image done!"); DisplayProgressBar(100.0f, colorGreen); - while(1) { - asm("nop" ); + while (1) { + asm("nop"); } } void DisplayLogo() { Pinetime::Tools::RleDecoder rleDecoder(infinitime_nb, sizeof(infinitime_nb)); - for(int i = 0; i < displayWidth; i++) { + for (int i = 0; i < displayWidth; i++) { rleDecoder.DecodeNext(displayBuffer, displayWidth * bytesPerPixel); ulTaskNotifyTake(pdTRUE, 500); - lcd.DrawBuffer(0, i, displayWidth, 1, reinterpret_cast(displayBuffer), displayWidth * bytesPerPixel); + lcd.DrawBuffer(0, i, displayWidth, 1, reinterpret_cast(displayBuffer), displayWidth * bytesPerPixel); } } void DisplayProgressBar(uint8_t percent, uint16_t color) { static constexpr uint8_t barHeight = 20; - std::fill(displayBuffer, displayBuffer+(displayWidth * bytesPerPixel), color); - for(int i = 0; i < barHeight; i++) { + std::fill(displayBuffer, displayBuffer + (displayWidth * bytesPerPixel), color); + for (int i = 0; i < barHeight; i++) { ulTaskNotifyTake(pdTRUE, 500); uint16_t barWidth = std::min(static_cast(percent) * 2.4f, static_cast(displayWidth)); - lcd.DrawBuffer(0, displayWidth - barHeight + i, barWidth, 1, reinterpret_cast(displayBuffer), barWidth * bytesPerPixel); + lcd.DrawBuffer(0, displayWidth - barHeight + i, barWidth, 1, reinterpret_cast(displayBuffer), barWidth * bytesPerPixel); } } diff --git a/src/sdk_config.h b/src/sdk_config.h index bc97ef14..38d47a7f 100644 --- a/src/sdk_config.h +++ b/src/sdk_config.h @@ -38,115 +38,110 @@ * */ - - #ifndef SDK_CONFIG_H #define SDK_CONFIG_H // <<< Use Configuration Wizard in Context Menu >>>\n #ifdef USE_APP_CONFIG -#include "app_config.h" + #include "app_config.h" #endif -// nRF_ANT +// nRF_ANT //========================================================== // ANTFS_ENABLED - ant_fs - ANT File Share module. //========================================================== #ifndef ANTFS_ENABLED -#define ANTFS_ENABLED 0 + #define ANTFS_ENABLED 0 #endif -// ANTFS_CONFIG_NETWORK_NUMBER - ANT-FS network number. +// ANTFS_CONFIG_NETWORK_NUMBER - ANT-FS network number. #ifndef ANTFS_CONFIG_NETWORK_NUMBER -#define ANTFS_CONFIG_NETWORK_NUMBER 0 + #define ANTFS_CONFIG_NETWORK_NUMBER 0 #endif -// ANTFS_CONFIG_CHANNEL_NUMBER - ANT-FS channel number. +// ANTFS_CONFIG_CHANNEL_NUMBER - ANT-FS channel number. #ifndef ANTFS_CONFIG_CHANNEL_NUMBER -#define ANTFS_CONFIG_CHANNEL_NUMBER 0 + #define ANTFS_CONFIG_CHANNEL_NUMBER 0 #endif -// ANTFS_CONFIG_PAIRING_TIMEOUT - Pairing timeout - how long the UI will wait for a response to a pairing request before switching to the link layer, in seconds. +// ANTFS_CONFIG_PAIRING_TIMEOUT - Pairing timeout - how long the UI will wait for a response to a pairing request before switching to +// the link layer, in seconds. #ifndef ANTFS_CONFIG_PAIRING_TIMEOUT -#define ANTFS_CONFIG_PAIRING_TIMEOUT 120 + #define ANTFS_CONFIG_PAIRING_TIMEOUT 120 #endif -// ANTFS_CONFIG_LINK_COMMAND_TIMEOUT - Command timeout - how long the client will wait without receiving any commands before switching to the link layer, in seconds. +// ANTFS_CONFIG_LINK_COMMAND_TIMEOUT - Command timeout - how long the client will wait without receiving any commands before switching +// to the link layer, in seconds. #ifndef ANTFS_CONFIG_LINK_COMMAND_TIMEOUT -#define ANTFS_CONFIG_LINK_COMMAND_TIMEOUT 10 + #define ANTFS_CONFIG_LINK_COMMAND_TIMEOUT 10 #endif -// ANTFS_CONFIG_TRANS_TYPE - ANT-FS Transmission Type. +// ANTFS_CONFIG_TRANS_TYPE - ANT-FS Transmission Type. #ifndef ANTFS_CONFIG_TRANS_TYPE -#define ANTFS_CONFIG_TRANS_TYPE 10 + #define ANTFS_CONFIG_TRANS_TYPE 10 #endif -// ANTFS_CONFIG_DEVICE_TYPE - ANT device type for channel configuration. +// ANTFS_CONFIG_DEVICE_TYPE - ANT device type for channel configuration. #ifndef ANTFS_CONFIG_DEVICE_TYPE -#define ANTFS_CONFIG_DEVICE_TYPE 1 + #define ANTFS_CONFIG_DEVICE_TYPE 1 #endif // ANTFS_CONFIG_BEACON_STATUS_PERIOD - ANT-FS Beacon Message Period. -// <0=> 0.5 Hz -// <1=> 1 Hz -// <2=> 2 Hz -// <3=> 4 Hz -// <4=> 8 Hz +// <0=> 0.5 Hz +// <1=> 1 Hz +// <2=> 2 Hz +// <3=> 4 Hz +// <4=> 8 Hz #ifndef ANTFS_CONFIG_BEACON_STATUS_PERIOD -#define ANTFS_CONFIG_BEACON_STATUS_PERIOD 3 + #define ANTFS_CONFIG_BEACON_STATUS_PERIOD 3 #endif // ANTFS_CONFIG_TRANSMIT_POWER - ANT Transmit Power. -// <0=> Lowest ANT Tx power level setting. (-20dBm) -// <1=> ANT Tx power > Lvl 0. (-12dBm) -// <2=> ANT Tx power > Lvl 1. (-4dBm) -// <3=> ANT Tx power > Lvl 2. Default tx power level. (0dBm) -// <4=> ANT Tx power > Lvl 3. (+4dBm) -// <128=> Custom tx power selection +// <0=> Lowest ANT Tx power level setting. (-20dBm) +// <1=> ANT Tx power > Lvl 0. (-12dBm) +// <2=> ANT Tx power > Lvl 1. (-4dBm) +// <3=> ANT Tx power > Lvl 2. Default tx power level. (0dBm) +// <4=> ANT Tx power > Lvl 3. (+4dBm) +// <128=> Custom tx power selection #ifndef ANTFS_CONFIG_TRANSMIT_POWER -#define ANTFS_CONFIG_TRANSMIT_POWER 3 + #define ANTFS_CONFIG_TRANSMIT_POWER 3 #endif -// ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER - ANT Custom Transmit Power. +// ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER - ANT Custom Transmit Power. #ifndef ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER -#define ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER 0 + #define ANTFS_CONFIG_CUSTOM_TRANSMIT_POWER 0 #endif // ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED - Use pairing and key exchange authentication. - #ifndef ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED -#define ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED 0 + #define ANTFS_CONFIG_AUTH_TYPE_PAIRING_ENABLED 0 #endif // ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED - Use passkey authentication. - #ifndef ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED -#define ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED 0 + #define ANTFS_CONFIG_AUTH_TYPE_PASSKEY_ENABLED 0 #endif // ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED - Allow host to bypass authentication. - #ifndef ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED -#define ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED 0 + #define ANTFS_CONFIG_AUTH_TYPE_PASSTHROUGH_ENABLED 0 #endif // ANTFS_CONFIG_UPLOAD_ENABLED - Support upload operation. - #ifndef ANTFS_CONFIG_UPLOAD_ENABLED -#define ANTFS_CONFIG_UPLOAD_ENABLED 0 + #define ANTFS_CONFIG_UPLOAD_ENABLED 0 #endif // ANTFS_CONFIG_DEBUG_LED_ENABLED - Enables LED debug in the module. - #ifndef ANTFS_CONFIG_DEBUG_LED_ENABLED -#define ANTFS_CONFIG_DEBUG_LED_ENABLED 0 + #define ANTFS_CONFIG_DEBUG_LED_ENABLED 0 #endif // @@ -154,39 +149,39 @@ // ANT_BPWR_ENABLED - ant_bpwr - Bicycle Power Profile //========================================================== #ifndef ANT_BPWR_ENABLED -#define ANT_BPWR_ENABLED 0 + #define ANT_BPWR_ENABLED 0 #endif // ANT_BPWR_LOG_ENABLED - Enables general logging in the module. //========================================================== #ifndef ANT_BPWR_LOG_ENABLED -#define ANT_BPWR_LOG_ENABLED 0 + #define ANT_BPWR_LOG_ENABLED 0 #endif // ANT_BPWR_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BPWR_LOG_LEVEL -#define ANT_BPWR_LOG_LEVEL 3 + #define ANT_BPWR_LOG_LEVEL 3 #endif // ANT_BPWR_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BPWR_INFO_COLOR -#define ANT_BPWR_INFO_COLOR 0 + #define ANT_BPWR_INFO_COLOR 0 #endif // @@ -194,34 +189,34 @@ // ANT_BPWR_COMMON_LOG_ENABLED - Enables logging of BPWR tracing common data. //========================================================== #ifndef ANT_BPWR_COMMON_LOG_ENABLED -#define ANT_BPWR_COMMON_LOG_ENABLED 0 + #define ANT_BPWR_COMMON_LOG_ENABLED 0 #endif // ANT_BPWR_COMMON_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BPWR_COMMON_LOG_LEVEL -#define ANT_BPWR_COMMON_LOG_LEVEL 3 + #define ANT_BPWR_COMMON_LOG_LEVEL 3 #endif // ANT_BPWR_COMMON_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BPWR_COMMON_INFO_COLOR -#define ANT_BPWR_COMMON_INFO_COLOR 0 + #define ANT_BPWR_COMMON_INFO_COLOR 0 #endif // @@ -229,34 +224,34 @@ // ANT_BPWR_PAGE_TORQUE_LOG_ENABLED - Enables logging of BPWR torque page in the module. //========================================================== #ifndef ANT_BPWR_PAGE_TORQUE_LOG_ENABLED -#define ANT_BPWR_PAGE_TORQUE_LOG_ENABLED 0 + #define ANT_BPWR_PAGE_TORQUE_LOG_ENABLED 0 #endif // ANT_BPWR_PAGE_TORQUE_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BPWR_PAGE_TORQUE_LOG_LEVEL -#define ANT_BPWR_PAGE_TORQUE_LOG_LEVEL 3 + #define ANT_BPWR_PAGE_TORQUE_LOG_LEVEL 3 #endif // ANT_BPWR_PAGE_TORQUE_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BPWR_PAGE_TORQUE_INFO_COLOR -#define ANT_BPWR_PAGE_TORQUE_INFO_COLOR 0 + #define ANT_BPWR_PAGE_TORQUE_INFO_COLOR 0 #endif // @@ -264,34 +259,34 @@ // ANT_BPWR_PAGE_1_LOG_ENABLED - Enables logging of BPWR page 1 in the module. //========================================================== #ifndef ANT_BPWR_PAGE_1_LOG_ENABLED -#define ANT_BPWR_PAGE_1_LOG_ENABLED 0 + #define ANT_BPWR_PAGE_1_LOG_ENABLED 0 #endif // ANT_BPWR_PAGE_1_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BPWR_PAGE_1_LOG_LEVEL -#define ANT_BPWR_PAGE_1_LOG_LEVEL 3 + #define ANT_BPWR_PAGE_1_LOG_LEVEL 3 #endif // ANT_BPWR_PAGE_1_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BPWR_PAGE_1_INFO_COLOR -#define ANT_BPWR_PAGE_1_INFO_COLOR 0 + #define ANT_BPWR_PAGE_1_INFO_COLOR 0 #endif // @@ -299,34 +294,34 @@ // ANT_BPWR_PAGE_16_LOG_ENABLED - Enables logging of BPWR page 16 in the module. //========================================================== #ifndef ANT_BPWR_PAGE_16_LOG_ENABLED -#define ANT_BPWR_PAGE_16_LOG_ENABLED 0 + #define ANT_BPWR_PAGE_16_LOG_ENABLED 0 #endif // ANT_BPWR_PAGE_16_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BPWR_PAGE_16_LOG_LEVEL -#define ANT_BPWR_PAGE_16_LOG_LEVEL 3 + #define ANT_BPWR_PAGE_16_LOG_LEVEL 3 #endif // ANT_BPWR_PAGE_16_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BPWR_PAGE_16_INFO_COLOR -#define ANT_BPWR_PAGE_16_INFO_COLOR 0 + #define ANT_BPWR_PAGE_16_INFO_COLOR 0 #endif // @@ -334,34 +329,34 @@ // ANT_BPWR_PAGE_17_LOG_ENABLED - Enables logging of BPWR page 17 in the module. //========================================================== #ifndef ANT_BPWR_PAGE_17_LOG_ENABLED -#define ANT_BPWR_PAGE_17_LOG_ENABLED 0 + #define ANT_BPWR_PAGE_17_LOG_ENABLED 0 #endif // ANT_BPWR_PAGE_17_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BPWR_PAGE_17_LOG_LEVEL -#define ANT_BPWR_PAGE_17_LOG_LEVEL 3 + #define ANT_BPWR_PAGE_17_LOG_LEVEL 3 #endif // ANT_BPWR_PAGE_17_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BPWR_PAGE_17_INFO_COLOR -#define ANT_BPWR_PAGE_17_INFO_COLOR 0 + #define ANT_BPWR_PAGE_17_INFO_COLOR 0 #endif // @@ -369,34 +364,34 @@ // ANT_BPWR_PAGE_18_LOG_ENABLED - Enables logging of BPWR page 18 in the module. //========================================================== #ifndef ANT_BPWR_PAGE_18_LOG_ENABLED -#define ANT_BPWR_PAGE_18_LOG_ENABLED 0 + #define ANT_BPWR_PAGE_18_LOG_ENABLED 0 #endif // ANT_BPWR_PAGE_18_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BPWR_PAGE_18_LOG_LEVEL -#define ANT_BPWR_PAGE_18_LOG_LEVEL 3 + #define ANT_BPWR_PAGE_18_LOG_LEVEL 3 #endif // ANT_BPWR_PAGE_18_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BPWR_PAGE_18_INFO_COLOR -#define ANT_BPWR_PAGE_18_INFO_COLOR 0 + #define ANT_BPWR_PAGE_18_INFO_COLOR 0 #endif // @@ -406,39 +401,39 @@ // ANT_BSC_ENABLED - ant_bsc - Bicycle Speed and Cadence Profile //========================================================== #ifndef ANT_BSC_ENABLED -#define ANT_BSC_ENABLED 0 + #define ANT_BSC_ENABLED 0 #endif // ANT_BSC_LOG_ENABLED - Enables general logging in the module. //========================================================== #ifndef ANT_BSC_LOG_ENABLED -#define ANT_BSC_LOG_ENABLED 0 + #define ANT_BSC_LOG_ENABLED 0 #endif // ANT_BSC_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BSC_LOG_LEVEL -#define ANT_BSC_LOG_LEVEL 3 + #define ANT_BSC_LOG_LEVEL 3 #endif // ANT_BSC_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BSC_INFO_COLOR -#define ANT_BSC_INFO_COLOR 0 + #define ANT_BSC_INFO_COLOR 0 #endif // @@ -446,34 +441,34 @@ // ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED - Enables logging of BSC Combined page 0 in the module. //========================================================== #ifndef ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED -#define ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED 0 + #define ANT_BSC_COMBINED_PAGE_0_LOG_ENABLED 0 #endif // ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL -#define ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL 3 + #define ANT_BSC_COMBINED_PAGE_0_LOG_LEVEL 3 #endif // ANT_BSC_COMBINED_PAGE_0_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BSC_COMBINED_PAGE_0_INFO_COLOR -#define ANT_BSC_COMBINED_PAGE_0_INFO_COLOR 0 + #define ANT_BSC_COMBINED_PAGE_0_INFO_COLOR 0 #endif // @@ -481,34 +476,34 @@ // ANT_BSC_PAGE_0_LOG_ENABLED - Enables logging of BSC page 0 in the module. //========================================================== #ifndef ANT_BSC_PAGE_0_LOG_ENABLED -#define ANT_BSC_PAGE_0_LOG_ENABLED 0 + #define ANT_BSC_PAGE_0_LOG_ENABLED 0 #endif // ANT_BSC_PAGE_0_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BSC_PAGE_0_LOG_LEVEL -#define ANT_BSC_PAGE_0_LOG_LEVEL 3 + #define ANT_BSC_PAGE_0_LOG_LEVEL 3 #endif // ANT_BSC_PAGE_0_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BSC_PAGE_0_INFO_COLOR -#define ANT_BSC_PAGE_0_INFO_COLOR 0 + #define ANT_BSC_PAGE_0_INFO_COLOR 0 #endif // @@ -516,34 +511,34 @@ // ANT_BSC_PAGE_1_LOG_ENABLED - Enables logging of BSC page 1 in the module. //========================================================== #ifndef ANT_BSC_PAGE_1_LOG_ENABLED -#define ANT_BSC_PAGE_1_LOG_ENABLED 0 + #define ANT_BSC_PAGE_1_LOG_ENABLED 0 #endif // ANT_BSC_PAGE_1_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BSC_PAGE_1_LOG_LEVEL -#define ANT_BSC_PAGE_1_LOG_LEVEL 3 + #define ANT_BSC_PAGE_1_LOG_LEVEL 3 #endif // ANT_BSC_PAGE_1_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BSC_PAGE_1_INFO_COLOR -#define ANT_BSC_PAGE_1_INFO_COLOR 0 + #define ANT_BSC_PAGE_1_INFO_COLOR 0 #endif // @@ -551,34 +546,34 @@ // ANT_BSC_PAGE_2_LOG_ENABLED - Enables logging of BSC page 2 in the module. //========================================================== #ifndef ANT_BSC_PAGE_2_LOG_ENABLED -#define ANT_BSC_PAGE_2_LOG_ENABLED 0 + #define ANT_BSC_PAGE_2_LOG_ENABLED 0 #endif // ANT_BSC_PAGE_2_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BSC_PAGE_2_LOG_LEVEL -#define ANT_BSC_PAGE_2_LOG_LEVEL 3 + #define ANT_BSC_PAGE_2_LOG_LEVEL 3 #endif // ANT_BSC_PAGE_2_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BSC_PAGE_2_INFO_COLOR -#define ANT_BSC_PAGE_2_INFO_COLOR 0 + #define ANT_BSC_PAGE_2_INFO_COLOR 0 #endif // @@ -586,34 +581,34 @@ // ANT_BSC_PAGE_3_LOG_ENABLED - Enables logging of BSC page 3 in the module. //========================================================== #ifndef ANT_BSC_PAGE_3_LOG_ENABLED -#define ANT_BSC_PAGE_3_LOG_ENABLED 0 + #define ANT_BSC_PAGE_3_LOG_ENABLED 0 #endif // ANT_BSC_PAGE_3_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BSC_PAGE_3_LOG_LEVEL -#define ANT_BSC_PAGE_3_LOG_LEVEL 3 + #define ANT_BSC_PAGE_3_LOG_LEVEL 3 #endif // ANT_BSC_PAGE_3_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BSC_PAGE_3_INFO_COLOR -#define ANT_BSC_PAGE_3_INFO_COLOR 0 + #define ANT_BSC_PAGE_3_INFO_COLOR 0 #endif // @@ -621,34 +616,34 @@ // ANT_BSC_PAGE_4_LOG_ENABLED - Enables logging of BSC page 4 in the module. //========================================================== #ifndef ANT_BSC_PAGE_4_LOG_ENABLED -#define ANT_BSC_PAGE_4_LOG_ENABLED 0 + #define ANT_BSC_PAGE_4_LOG_ENABLED 0 #endif // ANT_BSC_PAGE_4_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BSC_PAGE_4_LOG_LEVEL -#define ANT_BSC_PAGE_4_LOG_LEVEL 3 + #define ANT_BSC_PAGE_4_LOG_LEVEL 3 #endif // ANT_BSC_PAGE_4_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BSC_PAGE_4_INFO_COLOR -#define ANT_BSC_PAGE_4_INFO_COLOR 0 + #define ANT_BSC_PAGE_4_INFO_COLOR 0 #endif // @@ -656,34 +651,34 @@ // ANT_BSC_PAGE_5_LOG_ENABLED - Enables logging of BSC page 5 in the module. //========================================================== #ifndef ANT_BSC_PAGE_5_LOG_ENABLED -#define ANT_BSC_PAGE_5_LOG_ENABLED 0 + #define ANT_BSC_PAGE_5_LOG_ENABLED 0 #endif // ANT_BSC_PAGE_5_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_BSC_PAGE_5_LOG_LEVEL -#define ANT_BSC_PAGE_5_LOG_LEVEL 3 + #define ANT_BSC_PAGE_5_LOG_LEVEL 3 #endif // ANT_BSC_PAGE_5_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_BSC_PAGE_5_INFO_COLOR -#define ANT_BSC_PAGE_5_INFO_COLOR 0 + #define ANT_BSC_PAGE_5_INFO_COLOR 0 #endif // @@ -692,47 +687,46 @@ // ANT_CHANNEL_CONFIG_ENABLED - ant_channel_config - ANT common channel configuration - #ifndef ANT_CHANNEL_CONFIG_ENABLED -#define ANT_CHANNEL_CONFIG_ENABLED 0 + #define ANT_CHANNEL_CONFIG_ENABLED 0 #endif // ANT_COMMON_PAGE_70_ENABLED - ant_common_page_70 - ANT+ common page 70 //========================================================== #ifndef ANT_COMMON_PAGE_70_ENABLED -#define ANT_COMMON_PAGE_70_ENABLED 0 + #define ANT_COMMON_PAGE_70_ENABLED 0 #endif // ANT_COMMON_PAGE_70_LOG_ENABLED - Enables logging of common page 70 in the module. //========================================================== #ifndef ANT_COMMON_PAGE_70_LOG_ENABLED -#define ANT_COMMON_PAGE_70_LOG_ENABLED 0 + #define ANT_COMMON_PAGE_70_LOG_ENABLED 0 #endif // ANT_COMMON_PAGE_70_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_COMMON_PAGE_70_LOG_LEVEL -#define ANT_COMMON_PAGE_70_LOG_LEVEL 3 + #define ANT_COMMON_PAGE_70_LOG_LEVEL 3 #endif // ANT_COMMON_PAGE_70_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_COMMON_PAGE_70_INFO_COLOR -#define ANT_COMMON_PAGE_70_INFO_COLOR 0 + #define ANT_COMMON_PAGE_70_INFO_COLOR 0 #endif // @@ -742,39 +736,39 @@ // ANT_COMMON_PAGE_80_ENABLED - ant_common_page_80 - ANT+ common page 80 //========================================================== #ifndef ANT_COMMON_PAGE_80_ENABLED -#define ANT_COMMON_PAGE_80_ENABLED 0 + #define ANT_COMMON_PAGE_80_ENABLED 0 #endif // ANT_COMMON_PAGE_80_LOG_ENABLED - Enables logging of common page 80 in the module. //========================================================== #ifndef ANT_COMMON_PAGE_80_LOG_ENABLED -#define ANT_COMMON_PAGE_80_LOG_ENABLED 0 + #define ANT_COMMON_PAGE_80_LOG_ENABLED 0 #endif // ANT_COMMON_PAGE_80_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_COMMON_PAGE_80_LOG_LEVEL -#define ANT_COMMON_PAGE_80_LOG_LEVEL 3 + #define ANT_COMMON_PAGE_80_LOG_LEVEL 3 #endif // ANT_COMMON_PAGE_80_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_COMMON_PAGE_80_INFO_COLOR -#define ANT_COMMON_PAGE_80_INFO_COLOR 0 + #define ANT_COMMON_PAGE_80_INFO_COLOR 0 #endif // @@ -784,39 +778,39 @@ // ANT_COMMON_PAGE_81_ENABLED - ant_common_page_81 - ANT+ common page 81 //========================================================== #ifndef ANT_COMMON_PAGE_81_ENABLED -#define ANT_COMMON_PAGE_81_ENABLED 0 + #define ANT_COMMON_PAGE_81_ENABLED 0 #endif // ANT_COMMON_PAGE_81_LOG_ENABLED - Enables logging of common page 81 in the module. //========================================================== #ifndef ANT_COMMON_PAGE_81_LOG_ENABLED -#define ANT_COMMON_PAGE_81_LOG_ENABLED 0 + #define ANT_COMMON_PAGE_81_LOG_ENABLED 0 #endif // ANT_COMMON_PAGE_81_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_COMMON_PAGE_81_LOG_LEVEL -#define ANT_COMMON_PAGE_81_LOG_LEVEL 3 + #define ANT_COMMON_PAGE_81_LOG_LEVEL 3 #endif // ANT_COMMON_PAGE_81_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_COMMON_PAGE_81_INFO_COLOR -#define ANT_COMMON_PAGE_81_INFO_COLOR 0 + #define ANT_COMMON_PAGE_81_INFO_COLOR 0 #endif // @@ -825,54 +819,52 @@ // ANT_ENCRYPT_CONFIG_ENABLED - ant_encrypt_config - Cryptographic ANT stack configuration - #ifndef ANT_ENCRYPT_CONFIG_ENABLED -#define ANT_ENCRYPT_CONFIG_ENABLED 0 + #define ANT_ENCRYPT_CONFIG_ENABLED 0 #endif // ANT_ENCRYPT_NEGOTIATION_SLAVE_ENABLED - ant_encrypt_negotiation_slave - Encryption negotiation for encrypted ANT slave channels - #ifndef ANT_ENCRYPT_NEGOTIATION_SLAVE_ENABLED -#define ANT_ENCRYPT_NEGOTIATION_SLAVE_ENABLED 0 + #define ANT_ENCRYPT_NEGOTIATION_SLAVE_ENABLED 0 #endif // ANT_HRM_ENABLED - ant_hrm - Heart Rate Monitor Profile //========================================================== #ifndef ANT_HRM_ENABLED -#define ANT_HRM_ENABLED 0 + #define ANT_HRM_ENABLED 0 #endif // ANT_HRM_LOG_ENABLED - Enables general logging in the module. //========================================================== #ifndef ANT_HRM_LOG_ENABLED -#define ANT_HRM_LOG_ENABLED 0 + #define ANT_HRM_LOG_ENABLED 0 #endif // ANT_HRM_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_HRM_LOG_LEVEL -#define ANT_HRM_LOG_LEVEL 3 + #define ANT_HRM_LOG_LEVEL 3 #endif // ANT_HRM_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_HRM_INFO_COLOR -#define ANT_HRM_INFO_COLOR 0 + #define ANT_HRM_INFO_COLOR 0 #endif // @@ -880,34 +872,34 @@ // ANT_HRM_PAGE_0_LOG_ENABLED - Enables logging of HRM page 0 in the module. //========================================================== #ifndef ANT_HRM_PAGE_0_LOG_ENABLED -#define ANT_HRM_PAGE_0_LOG_ENABLED 0 + #define ANT_HRM_PAGE_0_LOG_ENABLED 0 #endif // ANT_HRM_PAGE_0_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_HRM_PAGE_0_LOG_LEVEL -#define ANT_HRM_PAGE_0_LOG_LEVEL 3 + #define ANT_HRM_PAGE_0_LOG_LEVEL 3 #endif // ANT_HRM_PAGE_0_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_HRM_PAGE_0_INFO_COLOR -#define ANT_HRM_PAGE_0_INFO_COLOR 0 + #define ANT_HRM_PAGE_0_INFO_COLOR 0 #endif // @@ -915,34 +907,34 @@ // ANT_HRM_PAGE_1_LOG_ENABLED - Enables logging of HRM page 1 in the module. //========================================================== #ifndef ANT_HRM_PAGE_1_LOG_ENABLED -#define ANT_HRM_PAGE_1_LOG_ENABLED 0 + #define ANT_HRM_PAGE_1_LOG_ENABLED 0 #endif // ANT_HRM_PAGE_1_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_HRM_PAGE_1_LOG_LEVEL -#define ANT_HRM_PAGE_1_LOG_LEVEL 3 + #define ANT_HRM_PAGE_1_LOG_LEVEL 3 #endif // ANT_HRM_PAGE_1_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_HRM_PAGE_1_INFO_COLOR -#define ANT_HRM_PAGE_1_INFO_COLOR 0 + #define ANT_HRM_PAGE_1_INFO_COLOR 0 #endif // @@ -950,34 +942,34 @@ // ANT_HRM_PAGE_2_LOG_ENABLED - Enables logging of HRM page 2 in the module. //========================================================== #ifndef ANT_HRM_PAGE_2_LOG_ENABLED -#define ANT_HRM_PAGE_2_LOG_ENABLED 0 + #define ANT_HRM_PAGE_2_LOG_ENABLED 0 #endif // ANT_HRM_PAGE_2_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_HRM_PAGE_2_LOG_LEVEL -#define ANT_HRM_PAGE_2_LOG_LEVEL 3 + #define ANT_HRM_PAGE_2_LOG_LEVEL 3 #endif // ANT_HRM_PAGE_2_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_HRM_PAGE_2_INFO_COLOR -#define ANT_HRM_PAGE_2_INFO_COLOR 0 + #define ANT_HRM_PAGE_2_INFO_COLOR 0 #endif // @@ -985,34 +977,34 @@ // ANT_HRM_PAGE_3_LOG_ENABLED - Enables logging of HRM page 3 in the module. //========================================================== #ifndef ANT_HRM_PAGE_3_LOG_ENABLED -#define ANT_HRM_PAGE_3_LOG_ENABLED 0 + #define ANT_HRM_PAGE_3_LOG_ENABLED 0 #endif // ANT_HRM_PAGE_3_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_HRM_PAGE_3_LOG_LEVEL -#define ANT_HRM_PAGE_3_LOG_LEVEL 3 + #define ANT_HRM_PAGE_3_LOG_LEVEL 3 #endif // ANT_HRM_PAGE_3_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_HRM_PAGE_3_INFO_COLOR -#define ANT_HRM_PAGE_3_INFO_COLOR 0 + #define ANT_HRM_PAGE_3_INFO_COLOR 0 #endif // @@ -1020,34 +1012,34 @@ // ANT_HRM_PAGE_4_LOG_ENABLED - Enables logging of HRM page 4 in the module. //========================================================== #ifndef ANT_HRM_PAGE_4_LOG_ENABLED -#define ANT_HRM_PAGE_4_LOG_ENABLED 0 + #define ANT_HRM_PAGE_4_LOG_ENABLED 0 #endif // ANT_HRM_PAGE_4_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_HRM_PAGE_4_LOG_LEVEL -#define ANT_HRM_PAGE_4_LOG_LEVEL 3 + #define ANT_HRM_PAGE_4_LOG_LEVEL 3 #endif // ANT_HRM_PAGE_4_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_HRM_PAGE_4_INFO_COLOR -#define ANT_HRM_PAGE_4_INFO_COLOR 0 + #define ANT_HRM_PAGE_4_INFO_COLOR 0 #endif // @@ -1056,57 +1048,54 @@ // ANT_KEY_MANAGER_ENABLED - ant_key_manager - Software Component - #ifndef ANT_KEY_MANAGER_ENABLED -#define ANT_KEY_MANAGER_ENABLED 0 + #define ANT_KEY_MANAGER_ENABLED 0 #endif // ANT_REQUEST_CONTROLLER_ENABLED - ant_request_controller - ANT+ request controller - #ifndef ANT_REQUEST_CONTROLLER_ENABLED -#define ANT_REQUEST_CONTROLLER_ENABLED 0 + #define ANT_REQUEST_CONTROLLER_ENABLED 0 #endif // ANT_SDM_ENABLED - ant_sdm - Stride Based Speed and Distance Monitor Profile //========================================================== #ifndef ANT_SDM_ENABLED -#define ANT_SDM_ENABLED 0 + #define ANT_SDM_ENABLED 0 #endif // ANT_SDM_LOG_ENABLED - Enables general logging in the module. //========================================================== // BSP_BTN_BLE_ENABLED - bsp_btn_ble - Button Control for BLE - #ifndef BSP_BTN_BLE_ENABLED -#define BSP_BTN_BLE_ENABLED 1 + #define BSP_BTN_BLE_ENABLED 1 #endif // ANT_SDM_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef ANT_SDM_LOG_LEVEL -#define ANT_SDM_LOG_LEVEL 3 + #define ANT_SDM_LOG_LEVEL 3 #endif // ANT_SDM_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef ANT_SDM_INFO_COLOR -#define ANT_SDM_INFO_COLOR 0 + #define ANT_SDM_INFO_COLOR 0 #endif // @@ -1116,20 +1105,18 @@ // ANT_SEARCH_CONFIG_ENABLED - ant_search_config - ANT common search configuration //========================================================== #ifndef ANT_SEARCH_CONFIG_ENABLED -#define ANT_SEARCH_CONFIG_ENABLED 0 + #define ANT_SEARCH_CONFIG_ENABLED 0 #endif -// ANT_DEFAULT_LOW_PRIORITY_TIMEOUT - Default low priority search time-out. <0-255> - +// ANT_DEFAULT_LOW_PRIORITY_TIMEOUT - Default low priority search time-out. <0-255> #ifndef ANT_DEFAULT_LOW_PRIORITY_TIMEOUT -#define ANT_DEFAULT_LOW_PRIORITY_TIMEOUT 2 + #define ANT_DEFAULT_LOW_PRIORITY_TIMEOUT 2 #endif -// ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT - Default high priority search time-out. <0-255> - +// ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT - Default high priority search time-out. <0-255> #ifndef ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT -#define ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT 10 + #define ANT_DEFAULT_HIGH_PRIORITY_TIMEOUT 10 #endif // @@ -1137,78 +1124,75 @@ // ANT_STATE_INDICATOR_ENABLED - ant_state_indicator - ANT state indicator using BSP //========================================================== #ifndef ANT_STATE_INDICATOR_ENABLED -#define ANT_STATE_INDICATOR_ENABLED 0 + #define ANT_STATE_INDICATOR_ENABLED 0 #endif -// ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY - Shutdown observer priority. +// ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY - Shutdown observer priority. #ifndef ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY -#define ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY 1 + #define ANT_STATE_INDICATOR_CONFIG_SHUTDOWN_HANDLER_PRIORITY 1 #endif // -// +// //========================================================== -// nRF_BLE +// nRF_BLE //========================================================== // BLE_ADVERTISING_ENABLED - ble_advertising - Advertising module - #ifndef BLE_ADVERTISING_ENABLED -#define BLE_ADVERTISING_ENABLED 1 + #define BLE_ADVERTISING_ENABLED 1 #endif // BLE_DTM_ENABLED - ble_dtm - Module for testing RF/PHY using DTM commands - #ifndef BLE_DTM_ENABLED -#define BLE_DTM_ENABLED 0 + #define BLE_DTM_ENABLED 0 #endif // BLE_RACP_ENABLED - ble_racp - Record Access Control Point library - #ifndef BLE_RACP_ENABLED -#define BLE_RACP_ENABLED 0 + #define BLE_RACP_ENABLED 0 #endif // NRF_BLE_CONN_PARAMS_ENABLED - ble_conn_params - Initiating and executing a connection parameters negotiation procedure //========================================================== #ifndef NRF_BLE_CONN_PARAMS_ENABLED -#define NRF_BLE_CONN_PARAMS_ENABLED 1 + #define NRF_BLE_CONN_PARAMS_ENABLED 1 #endif // NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION - The largest acceptable deviation in slave latency. // The largest deviation (+ or -) from the requested slave latency that will not be renegotiated. #ifndef NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION -#define NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION 499 + #define NRF_BLE_CONN_PARAMS_MAX_SLAVE_LATENCY_DEVIATION 499 #endif // NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION - The largest acceptable deviation (in 10 ms units) in supervision timeout. // The largest deviation (+ or -, in 10 ms units) from the requested supervision timeout that will not be renegotiated. #ifndef NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION -#define NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION 65535 + #define NRF_BLE_CONN_PARAMS_MAX_SUPERVISION_TIMEOUT_DEVIATION 65535 #endif // // NRF_BLE_GATT_ENABLED - nrf_ble_gatt - GATT module - #ifndef NRF_BLE_GATT_ENABLED -#define NRF_BLE_GATT_ENABLED 1 + #define NRF_BLE_GATT_ENABLED 1 #endif // NRF_BLE_QWR_ENABLED - nrf_ble_qwr - Queued writes support module (prepare/execute write) //========================================================== #ifndef NRF_BLE_QWR_ENABLED -#define NRF_BLE_QWR_ENABLED 1 + #define NRF_BLE_QWR_ENABLED 1 #endif -// NRF_BLE_QWR_MAX_ATTR - Maximum number of attribute handles that can be registered. This number must be adjusted according to the number of attributes for which Queued Writes will be enabled. If it is zero, the module will reject all Queued Write requests. +// NRF_BLE_QWR_MAX_ATTR - Maximum number of attribute handles that can be registered. This number must be adjusted according to the +// number of attributes for which Queued Writes will be enabled. If it is zero, the module will reject all Queued Write requests. #ifndef NRF_BLE_QWR_MAX_ATTR -#define NRF_BLE_QWR_MAX_ATTR 0 + #define NRF_BLE_QWR_MAX_ATTR 0 #endif // @@ -1216,182 +1200,176 @@ // PEER_MANAGER_ENABLED - peer_manager - Peer Manager //========================================================== #ifndef PEER_MANAGER_ENABLED -#define PEER_MANAGER_ENABLED 1 + #define PEER_MANAGER_ENABLED 1 #endif -// PM_MAX_REGISTRANTS - Number of event handlers that can be registered. +// PM_MAX_REGISTRANTS - Number of event handlers that can be registered. #ifndef PM_MAX_REGISTRANTS -#define PM_MAX_REGISTRANTS 3 + #define PM_MAX_REGISTRANTS 3 #endif -// PM_FLASH_BUFFERS - Number of internal buffers for flash operations. +// PM_FLASH_BUFFERS - Number of internal buffers for flash operations. // Decrease this value to lower RAM usage. #ifndef PM_FLASH_BUFFERS -#define PM_FLASH_BUFFERS 4 + #define PM_FLASH_BUFFERS 4 #endif // PM_CENTRAL_ENABLED - Enable/disable central-specific Peer Manager functionality. - // Enable/disable central-specific Peer Manager functionality. #ifndef PM_CENTRAL_ENABLED -#define PM_CENTRAL_ENABLED 0 + #define PM_CENTRAL_ENABLED 0 #endif // PM_SERVICE_CHANGED_ENABLED - Enable/disable the service changed management for GATT server in Peer Manager. - // If not using a GATT server, or using a server wihout a service changed characteristic, // disable this to save code space. #ifndef PM_SERVICE_CHANGED_ENABLED -#define PM_SERVICE_CHANGED_ENABLED 1 + #define PM_SERVICE_CHANGED_ENABLED 1 #endif // PM_PEER_RANKS_ENABLED - Enable/disable the peer rank management in Peer Manager. - // Set this to false to save code space if not using the peer rank API. #ifndef PM_PEER_RANKS_ENABLED -#define PM_PEER_RANKS_ENABLED 1 + #define PM_PEER_RANKS_ENABLED 1 #endif // PM_LESC_ENABLED - Enable/disable LESC support in Peer Manager. - -// If set to true, you need to call nrf_ble_lesc_request_handler() in the main loop to respond to LESC-related BLE events. If LESC support is not required, set this to false to save code space. +// If set to true, you need to call nrf_ble_lesc_request_handler() in the main loop to respond to LESC-related BLE events. If LESC +// support is not required, set this to false to save code space. #ifndef PM_LESC_ENABLED -#define PM_LESC_ENABLED 0 + #define PM_LESC_ENABLED 0 #endif // PM_RA_PROTECTION_ENABLED - Enable/disable protection against repeated pairing attempts in Peer Manager. //========================================================== #ifndef PM_RA_PROTECTION_ENABLED -#define PM_RA_PROTECTION_ENABLED 0 + #define PM_RA_PROTECTION_ENABLED 0 #endif -// PM_RA_PROTECTION_TRACKED_PEERS_NUM - Maximum number of peers whose authorization status can be tracked. +// PM_RA_PROTECTION_TRACKED_PEERS_NUM - Maximum number of peers whose authorization status can be tracked. #ifndef PM_RA_PROTECTION_TRACKED_PEERS_NUM -#define PM_RA_PROTECTION_TRACKED_PEERS_NUM 8 + #define PM_RA_PROTECTION_TRACKED_PEERS_NUM 8 #endif -// PM_RA_PROTECTION_MIN_WAIT_INTERVAL - Minimum waiting interval (in ms) before a new pairing attempt can be initiated. +// PM_RA_PROTECTION_MIN_WAIT_INTERVAL - Minimum waiting interval (in ms) before a new pairing attempt can be initiated. #ifndef PM_RA_PROTECTION_MIN_WAIT_INTERVAL -#define PM_RA_PROTECTION_MIN_WAIT_INTERVAL 4000 + #define PM_RA_PROTECTION_MIN_WAIT_INTERVAL 4000 #endif -// PM_RA_PROTECTION_MAX_WAIT_INTERVAL - Maximum waiting interval (in ms) before a new pairing attempt can be initiated. +// PM_RA_PROTECTION_MAX_WAIT_INTERVAL - Maximum waiting interval (in ms) before a new pairing attempt can be initiated. #ifndef PM_RA_PROTECTION_MAX_WAIT_INTERVAL -#define PM_RA_PROTECTION_MAX_WAIT_INTERVAL 64000 + #define PM_RA_PROTECTION_MAX_WAIT_INTERVAL 64000 #endif -// PM_RA_PROTECTION_REWARD_PERIOD - Reward period (in ms). +// PM_RA_PROTECTION_REWARD_PERIOD - Reward period (in ms). // The waiting interval is gradually decreased when no new failed pairing attempts are made during reward period. #ifndef PM_RA_PROTECTION_REWARD_PERIOD -#define PM_RA_PROTECTION_REWARD_PERIOD 10000 + #define PM_RA_PROTECTION_REWARD_PERIOD 10000 #endif // -// PM_HANDLER_SEC_DELAY_MS - Delay before starting security. +// PM_HANDLER_SEC_DELAY_MS - Delay before starting security. // This might be necessary for interoperability reasons, especially as peripheral. #ifndef PM_HANDLER_SEC_DELAY_MS -#define PM_HANDLER_SEC_DELAY_MS 0 + #define PM_HANDLER_SEC_DELAY_MS 0 #endif // -// +// //========================================================== -// nRF_BLE_Services +// nRF_BLE_Services //========================================================== // BLE_ANCS_C_ENABLED - ble_ancs_c - Apple Notification Service Client - #ifndef BLE_ANCS_C_ENABLED -#define BLE_ANCS_C_ENABLED 0 + #define BLE_ANCS_C_ENABLED 0 #endif // BLE_ANS_C_ENABLED - ble_ans_c - Alert Notification Service Client - #ifndef BLE_ANS_C_ENABLED -#define BLE_ANS_C_ENABLED 1 + #define BLE_ANS_C_ENABLED 1 #endif #ifndef BLE_ANS_C_LOG_ENABLED -#define BLE_ANS_C_LOG_ENABLED 1 + #define BLE_ANS_C_LOG_ENABLED 1 #endif #ifndef BLE_ANS_C_LOG_LEVEL -#define BLE_ANS_C_LOG_LEVEL 3 + #define BLE_ANS_C_LOG_LEVEL 3 #endif // BLE_BAS_C_ENABLED - ble_bas_c - Battery Service Client - #ifndef BLE_BAS_C_ENABLED -#define BLE_BAS_C_ENABLED 0 + #define BLE_BAS_C_ENABLED 0 #endif // BLE_BAS_ENABLED - ble_bas - Battery Service //========================================================== #ifndef BLE_BAS_ENABLED -#define BLE_BAS_ENABLED 1 + #define BLE_BAS_ENABLED 1 #endif // BLE_BAS_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef BLE_BAS_CONFIG_LOG_ENABLED -#define BLE_BAS_CONFIG_LOG_ENABLED 0 + #define BLE_BAS_CONFIG_LOG_ENABLED 0 #endif // BLE_BAS_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef BLE_BAS_CONFIG_LOG_LEVEL -#define BLE_BAS_CONFIG_LOG_LEVEL 3 + #define BLE_BAS_CONFIG_LOG_LEVEL 3 #endif // BLE_BAS_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef BLE_BAS_CONFIG_INFO_COLOR -#define BLE_BAS_CONFIG_INFO_COLOR 0 + #define BLE_BAS_CONFIG_INFO_COLOR 0 #endif // BLE_BAS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef BLE_BAS_CONFIG_DEBUG_COLOR -#define BLE_BAS_CONFIG_DEBUG_COLOR 0 + #define BLE_BAS_CONFIG_DEBUG_COLOR 0 #endif // @@ -1400,123 +1378,114 @@ // BLE_CSCS_ENABLED - ble_cscs - Cycling Speed and Cadence Service - #ifndef BLE_CSCS_ENABLED -#define BLE_CSCS_ENABLED 0 + #define BLE_CSCS_ENABLED 0 #endif // BLE_CTS_C_ENABLED - ble_cts_c - Current Time Service Client - #ifndef BLE_CTS_C_ENABLED -#define BLE_CTS_C_ENABLED 1 + #define BLE_CTS_C_ENABLED 1 #endif #ifndef BLE_DB_DISCOVERY_ENABLED -#define BLE_DB_DISCOVERY_ENABLED 1 + #define BLE_DB_DISCOVERY_ENABLED 1 #endif // BLE_DIS_ENABLED - ble_dis - Device Information Service - #ifndef BLE_DIS_ENABLED -#define BLE_DIS_ENABLED 1 + #define BLE_DIS_ENABLED 1 #endif // BLE_GLS_ENABLED - ble_gls - Glucose Service - #ifndef BLE_GLS_ENABLED -#define BLE_GLS_ENABLED 0 + #define BLE_GLS_ENABLED 0 #endif // BLE_HIDS_ENABLED - ble_hids - Human Interface Device Service - #ifndef BLE_HIDS_ENABLED -#define BLE_HIDS_ENABLED 0 + #define BLE_HIDS_ENABLED 0 #endif // BLE_HRS_C_ENABLED - ble_hrs_c - Heart Rate Service Client - #ifndef BLE_HRS_C_ENABLED -#define BLE_HRS_C_ENABLED 0 + #define BLE_HRS_C_ENABLED 0 #endif // BLE_HRS_ENABLED - ble_hrs - Heart Rate Service - #ifndef BLE_HRS_ENABLED -#define BLE_HRS_ENABLED 1 + #define BLE_HRS_ENABLED 1 #endif // BLE_HTS_ENABLED - ble_hts - Health Thermometer Service - #ifndef BLE_HTS_ENABLED -#define BLE_HTS_ENABLED 0 + #define BLE_HTS_ENABLED 0 #endif // BLE_IAS_C_ENABLED - ble_ias_c - Immediate Alert Service Client - #ifndef BLE_IAS_C_ENABLED -#define BLE_IAS_C_ENABLED 0 + #define BLE_IAS_C_ENABLED 0 #endif // BLE_IAS_ENABLED - ble_ias - Immediate Alert Service //========================================================== #ifndef BLE_IAS_ENABLED -#define BLE_IAS_ENABLED 0 + #define BLE_IAS_ENABLED 0 #endif // BLE_IAS_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef BLE_IAS_CONFIG_LOG_ENABLED -#define BLE_IAS_CONFIG_LOG_ENABLED 0 + #define BLE_IAS_CONFIG_LOG_ENABLED 0 #endif // BLE_IAS_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef BLE_IAS_CONFIG_LOG_LEVEL -#define BLE_IAS_CONFIG_LOG_LEVEL 3 + #define BLE_IAS_CONFIG_LOG_LEVEL 3 #endif // BLE_IAS_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef BLE_IAS_CONFIG_INFO_COLOR -#define BLE_IAS_CONFIG_INFO_COLOR 0 + #define BLE_IAS_CONFIG_INFO_COLOR 0 #endif // BLE_IAS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef BLE_IAS_CONFIG_DEBUG_COLOR -#define BLE_IAS_CONFIG_DEBUG_COLOR 0 + #define BLE_IAS_CONFIG_DEBUG_COLOR 0 #endif // @@ -1525,84 +1494,80 @@ // BLE_LBS_C_ENABLED - ble_lbs_c - Nordic LED Button Service Client - #ifndef BLE_LBS_C_ENABLED -#define BLE_LBS_C_ENABLED 0 + #define BLE_LBS_C_ENABLED 0 #endif // BLE_LBS_ENABLED - ble_lbs - LED Button Service - #ifndef BLE_LBS_ENABLED -#define BLE_LBS_ENABLED 0 + #define BLE_LBS_ENABLED 0 #endif // BLE_LLS_ENABLED - ble_lls - Link Loss Service - #ifndef BLE_LLS_ENABLED -#define BLE_LLS_ENABLED 0 + #define BLE_LLS_ENABLED 0 #endif // BLE_NUS_C_ENABLED - ble_nus_c - Nordic UART Central Service - #ifndef BLE_NUS_C_ENABLED -#define BLE_NUS_C_ENABLED 0 + #define BLE_NUS_C_ENABLED 0 #endif // BLE_NUS_ENABLED - ble_nus - Nordic UART Service //========================================================== #ifndef BLE_NUS_ENABLED -#define BLE_NUS_ENABLED 0 + #define BLE_NUS_ENABLED 0 #endif // BLE_NUS_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef BLE_NUS_CONFIG_LOG_ENABLED -#define BLE_NUS_CONFIG_LOG_ENABLED 0 + #define BLE_NUS_CONFIG_LOG_ENABLED 0 #endif // BLE_NUS_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef BLE_NUS_CONFIG_LOG_LEVEL -#define BLE_NUS_CONFIG_LOG_LEVEL 3 + #define BLE_NUS_CONFIG_LOG_LEVEL 3 #endif // BLE_NUS_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef BLE_NUS_CONFIG_INFO_COLOR -#define BLE_NUS_CONFIG_INFO_COLOR 0 + #define BLE_NUS_CONFIG_INFO_COLOR 0 #endif // BLE_NUS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef BLE_NUS_CONFIG_DEBUG_COLOR -#define BLE_NUS_CONFIG_DEBUG_COLOR 0 + #define BLE_NUS_CONFIG_DEBUG_COLOR 0 #endif // @@ -1611,41 +1576,37 @@ // BLE_RSCS_C_ENABLED - ble_rscs_c - Running Speed and Cadence Client - #ifndef BLE_RSCS_C_ENABLED -#define BLE_RSCS_C_ENABLED 0 + #define BLE_RSCS_C_ENABLED 0 #endif // BLE_RSCS_ENABLED - ble_rscs - Running Speed and Cadence Service - #ifndef BLE_RSCS_ENABLED -#define BLE_RSCS_ENABLED 0 + #define BLE_RSCS_ENABLED 0 #endif // BLE_TPS_ENABLED - ble_tps - TX Power Service - #ifndef BLE_TPS_ENABLED -#define BLE_TPS_ENABLED 0 + #define BLE_TPS_ENABLED 0 #endif -// +// //========================================================== -// nRF_Core +// nRF_Core //========================================================== // NRF_MPU_LIB_ENABLED - nrf_mpu_lib - Module for MPU //========================================================== #ifndef NRF_MPU_LIB_ENABLED -#define NRF_MPU_LIB_ENABLED 0 + #define NRF_MPU_LIB_ENABLED 0 #endif // NRF_MPU_LIB_CLI_CMDS - Enable CLI commands specific to the module. - #ifndef NRF_MPU_LIB_CLI_CMDS -#define NRF_MPU_LIB_CLI_CMDS 0 + #define NRF_MPU_LIB_CLI_CMDS 0 #endif // @@ -1653,48 +1614,44 @@ // NRF_STACK_GUARD_ENABLED - nrf_stack_guard - Stack guard //========================================================== #ifndef NRF_STACK_GUARD_ENABLED -#define NRF_STACK_GUARD_ENABLED 0 + #define NRF_STACK_GUARD_ENABLED 0 #endif // NRF_STACK_GUARD_CONFIG_SIZE - Size of the stack guard. -// <5=> 32 bytes -// <6=> 64 bytes -// <7=> 128 bytes -// <8=> 256 bytes -// <9=> 512 bytes -// <10=> 1024 bytes -// <11=> 2048 bytes -// <12=> 4096 bytes +// <5=> 32 bytes +// <6=> 64 bytes +// <7=> 128 bytes +// <8=> 256 bytes +// <9=> 512 bytes +// <10=> 1024 bytes +// <11=> 2048 bytes +// <12=> 4096 bytes #ifndef NRF_STACK_GUARD_CONFIG_SIZE -#define NRF_STACK_GUARD_CONFIG_SIZE 7 + #define NRF_STACK_GUARD_CONFIG_SIZE 7 #endif // -// +// //========================================================== -// nRF_Crypto +// nRF_Crypto //========================================================== // NRF_CRYPTO_ENABLED - nrf_crypto - Cryptography library. //========================================================== #ifndef NRF_CRYPTO_ENABLED -#define NRF_CRYPTO_ENABLED 1 + #define NRF_CRYPTO_ENABLED 1 #endif // NRF_CRYPTO_ALLOCATOR - Memory allocator - -// Choose memory allocator used by nrf_crypto. Default is alloca if possible or nrf_malloc otherwise. If 'User macros' are selected, the user has to create 'nrf_crypto_allocator.h' file that contains NRF_CRYPTO_ALLOC, NRF_CRYPTO_FREE, and NRF_CRYPTO_ALLOC_ON_STACK. -// <0=> Default -// <1=> User macros -// <2=> On stack (alloca) -// <3=> C dynamic memory (malloc) -// <4=> SDK Memory Manager (nrf_malloc) +// Choose memory allocator used by nrf_crypto. Default is alloca if possible or nrf_malloc otherwise. If 'User macros' are selected, the +// user has to create 'nrf_crypto_allocator.h' file that contains NRF_CRYPTO_ALLOC, NRF_CRYPTO_FREE, and NRF_CRYPTO_ALLOC_ON_STACK. <0=> +// Default <1=> User macros <2=> On stack (alloca) <3=> C dynamic memory (malloc) <4=> SDK Memory Manager (nrf_malloc) #ifndef NRF_CRYPTO_ALLOCATOR -#define NRF_CRYPTO_ALLOCATOR 0 + #define NRF_CRYPTO_ALLOCATOR 0 #endif // NRF_CRYPTO_BACKEND_CC310_BL_ENABLED - Enable the ARM Cryptocell CC310 reduced backend. @@ -1702,54 +1659,50 @@ // The CC310 hardware-accelerated cryptography backend with reduced functionality and footprint (only available on nRF52840). //========================================================== #ifndef NRF_CRYPTO_BACKEND_CC310_BL_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_BL_ENABLED 0 + #define NRF_CRYPTO_BACKEND_CC310_BL_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED - Enable the secp224r1 elliptic curve support using CC310_BL. - #ifndef NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED 0 + #define NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP224R1_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED - Enable the secp256r1 elliptic curve support using CC310_BL. - #ifndef NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_BL_ECC_SECP256R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED - CC310_BL SHA-256 hash functionality. - // CC310_BL backend implementation for hardware-accelerated SHA-256. #ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_BL_HASH_SHA256_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED - nrf_cc310_bl buffers to RAM before running hash operation - -// Enabling this makes hashing of addresses in FLASH range possible. Size of buffer allocated for hashing is set by NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE +// Enabling this makes hashing of addresses in FLASH range possible. Size of buffer allocated for hashing is set by +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE #ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED 0 + #define NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_ENABLED 0 #endif -// NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE - nrf_cc310_bl hash outputs digests in little endian +// NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE - nrf_cc310_bl hash outputs digests in little endian // Makes the nrf_cc310_bl hash functions output digests in little endian format. Only for use in nRF SDK DFU! #ifndef NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE -#define NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE 4096 + #define NRF_CRYPTO_BACKEND_CC310_BL_HASH_AUTOMATIC_RAM_BUFFER_SIZE 4096 #endif // NRF_CRYPTO_BACKEND_CC310_BL_INTERRUPTS_ENABLED - Enable Interrupts while support using CC310 bl. - // Select a library version compatible with the configuration. When interrupts are disable, a version named _noint must be used #ifndef NRF_CRYPTO_BACKEND_CC310_BL_INTERRUPTS_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_BL_INTERRUPTS_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_BL_INTERRUPTS_ENABLED 1 #endif // @@ -1759,205 +1712,178 @@ // The CC310 hardware-accelerated cryptography backend (only available on nRF52840). //========================================================== #ifndef NRF_CRYPTO_BACKEND_CC310_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ENABLED 0 + #define NRF_CRYPTO_BACKEND_CC310_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED - Enable the AES CBC mode using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_AES_CBC_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED - Enable the AES CTR mode using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_AES_CTR_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED - Enable the AES ECB mode using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_AES_ECB_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED - Enable the AES CBC_MAC mode using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_AES_CBC_MAC_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED - Enable the AES CMAC mode using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_AES_CMAC_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED - Enable the AES CCM mode using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_AES_CCM_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED - Enable the AES CCM* mode using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_AES_CCM_STAR_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED - Enable the CHACHA-POLY mode using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_CHACHA_POLY_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED - Enable the secp160r1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED - Enable the secp160r2 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160R2_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED - Enable the secp192r1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP192R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED - Enable the secp224r1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP224R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED - Enable the secp256r1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP256R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED - Enable the secp384r1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP384R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED - Enable the secp521r1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP521R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED - Enable the secp160k1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP160K1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED - Enable the secp192k1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP192K1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED - Enable the secp224k1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP224K1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED - Enable the secp256k1 elliptic curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_SECP256K1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_CURVE25519_ENABLED - Enable the Curve25519 curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_CURVE25519_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_CURVE25519_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_CURVE25519_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_ECC_ED25519_ENABLED - Enable the Ed25519 curve support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_ECC_ED25519_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_ECC_ED25519_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_ECC_ED25519_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED - CC310 SHA-256 hash functionality. - // CC310 backend implementation for hardware-accelerated SHA-256. #ifndef NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_HASH_SHA256_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED - CC310 SHA-512 hash functionality - // CC310 backend implementation for SHA-512 (in software). #ifndef NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_HASH_SHA512_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED - CC310 HMAC using SHA-256 - // CC310 backend implementation for HMAC using hardware-accelerated SHA-256. #ifndef NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_HMAC_SHA256_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED - CC310 HMAC using SHA-512 - // CC310 backend implementation for HMAC using SHA-512 (in software). #ifndef NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_HMAC_SHA512_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED - Enable RNG support using CC310. - #ifndef NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_RNG_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_CC310_INTERRUPTS_ENABLED - Enable Interrupts while support using CC310. - // Select a library version compatible with the configuration. When interrupts are disable, a version named _noint must be used #ifndef NRF_CRYPTO_BACKEND_CC310_INTERRUPTS_ENABLED -#define NRF_CRYPTO_BACKEND_CC310_INTERRUPTS_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CC310_INTERRUPTS_ENABLED 1 #endif // @@ -1965,13 +1891,12 @@ // NRF_CRYPTO_BACKEND_CIFRA_ENABLED - Enable the Cifra backend. //========================================================== #ifndef NRF_CRYPTO_BACKEND_CIFRA_ENABLED -#define NRF_CRYPTO_BACKEND_CIFRA_ENABLED 0 + #define NRF_CRYPTO_BACKEND_CIFRA_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED - Enable the AES EAX mode using Cifra. - #ifndef NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED -#define NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED 1 + #define NRF_CRYPTO_BACKEND_CIFRA_AES_EAX_ENABLED 1 #endif // @@ -1979,206 +1904,182 @@ // NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED - Enable the mbed TLS backend. //========================================================== #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED 0 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED - Enable the AES CBC mode mbed TLS. - #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED - Enable the AES CTR mode using mbed TLS. - #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CTR_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED - Enable the AES CFB mode using mbed TLS. - #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CFB_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED - Enable the AES ECB mode using mbed TLS. - #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_AES_ECB_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED - Enable the AES CBC MAC mode using mbed TLS. - #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CBC_MAC_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED - Enable the AES CMAC mode using mbed TLS. - #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CMAC_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED - Enable the AES CCM mode using mbed TLS. - #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_AES_CCM_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED - Enable the AES GCM mode using mbed TLS. - #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_AES_GCM_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED - Enable secp192r1 (NIST 192-bit) curve - // Enable this setting if you need secp192r1 (NIST 192-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED - Enable secp224r1 (NIST 224-bit) curve - // Enable this setting if you need secp224r1 (NIST 224-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED - Enable secp256r1 (NIST 256-bit) curve - // Enable this setting if you need secp256r1 (NIST 256-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED - Enable secp384r1 (NIST 384-bit) curve - // Enable this setting if you need secp384r1 (NIST 384-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP384R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED - Enable secp521r1 (NIST 521-bit) curve - // Enable this setting if you need secp521r1 (NIST 521-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP521R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED - Enable secp192k1 (Koblitz 192-bit) curve - // Enable this setting if you need secp192k1 (Koblitz 192-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP192K1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED - Enable secp224k1 (Koblitz 224-bit) curve - // Enable this setting if you need secp224k1 (Koblitz 224-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP224K1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED - Enable secp256k1 (Koblitz 256-bit) curve - // Enable this setting if you need secp256k1 (Koblitz 256-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_SECP256K1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED - Enable bp256r1 (Brainpool 256-bit) curve - // Enable this setting if you need bp256r1 (Brainpool 256-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP256R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED - Enable bp384r1 (Brainpool 384-bit) curve - // Enable this setting if you need bp384r1 (Brainpool 384-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP384R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED - Enable bp512r1 (Brainpool 512-bit) curve - // Enable this setting if you need bp512r1 (Brainpool 512-bit) support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_BP512R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED - Enable Curve25519 curve - // Enable this setting if you need Curve25519 support using MBEDTLS #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_ECC_CURVE25519_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED - Enable mbed TLS SHA-256 hash functionality. - // mbed TLS backend implementation for SHA-256. #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA256_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED - Enable mbed TLS SHA-512 hash functionality. - // mbed TLS backend implementation for SHA-512. #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_HASH_SHA512_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED - Enable mbed TLS HMAC using SHA-256. - // mbed TLS backend implementation for HMAC using SHA-256. #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA256_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED - Enable mbed TLS HMAC using SHA-512. - // mbed TLS backend implementation for HMAC using SHA-512. #ifndef NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED -#define NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MBEDTLS_HMAC_SHA512_ENABLED 1 #endif // @@ -2186,42 +2087,38 @@ // NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED - Enable the micro-ecc backend. //========================================================== #ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED -#define NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED 0 + #define NRF_CRYPTO_BACKEND_MICRO_ECC_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED - Enable secp192r1 (NIST 192-bit) curve - // Enable this setting if you need secp192r1 (NIST 192-bit) support using micro-ecc #ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED -#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP192R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED - Enable secp224r1 (NIST 224-bit) curve - // Enable this setting if you need secp224r1 (NIST 224-bit) support using micro-ecc #ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED -#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP224R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED - Enable secp256r1 (NIST 256-bit) curve - // Enable this setting if you need secp256r1 (NIST 256-bit) support using micro-ecc #ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED -#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED - Enable secp256k1 (Koblitz 256-bit) curve - // Enable this setting if you need secp256k1 (Koblitz 256-bit) support using micro-ecc #ifndef NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED -#define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_MICRO_ECC_ECC_SECP256K1_ENABLED 1 #endif // @@ -2231,15 +2128,14 @@ // The nRF HW backend provide access to RNG peripheral in nRF5x devices. //========================================================== #ifndef NRF_CRYPTO_BACKEND_NRF_HW_RNG_ENABLED -#define NRF_CRYPTO_BACKEND_NRF_HW_RNG_ENABLED 0 + #define NRF_CRYPTO_BACKEND_NRF_HW_RNG_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED - Enable mbed TLS CTR-DRBG algorithm. - // Enable mbed TLS CTR-DRBG standardized by NIST (NIST SP 800-90A Rev. 1). The nRF HW RNG is used as an entropy source for seeding. #ifndef NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED -#define NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED 1 + #define NRF_CRYPTO_BACKEND_NRF_HW_RNG_MBEDTLS_CTR_DRBG_ENABLED 1 #endif // @@ -2249,15 +2145,14 @@ // The nRF SW cryptography backend (only used in bootloader context). //========================================================== #ifndef NRF_CRYPTO_BACKEND_NRF_SW_ENABLED -#define NRF_CRYPTO_BACKEND_NRF_SW_ENABLED 0 + #define NRF_CRYPTO_BACKEND_NRF_SW_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED - nRF SW hash backend support for SHA-256 - // The nRF SW backend provide access to nRF SDK legacy hash implementation of SHA-256. #ifndef NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED -#define NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED 1 + #define NRF_CRYPTO_BACKEND_NRF_SW_HASH_SHA256_ENABLED 1 #endif // @@ -2267,76 +2162,68 @@ // The Oberon backend //========================================================== #ifndef NRF_CRYPTO_BACKEND_OBERON_ENABLED -#define NRF_CRYPTO_BACKEND_OBERON_ENABLED 0 + #define NRF_CRYPTO_BACKEND_OBERON_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED - Enable the CHACHA-POLY mode using Oberon. - #ifndef NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED -#define NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED 1 + #define NRF_CRYPTO_BACKEND_OBERON_CHACHA_POLY_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED - Enable secp256r1 curve - // Enable this setting if you need secp256r1 curve support using Oberon library #ifndef NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED -#define NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_OBERON_ECC_SECP256R1_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED - Enable Curve25519 ECDH - // Enable this setting if you need Curve25519 ECDH support using Oberon library #ifndef NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED -#define NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED 1 + #define NRF_CRYPTO_BACKEND_OBERON_ECC_CURVE25519_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED - Enable Ed25519 signature scheme - // Enable this setting if you need Ed25519 support using Oberon library #ifndef NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED -#define NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED 1 + #define NRF_CRYPTO_BACKEND_OBERON_ECC_ED25519_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED - Oberon SHA-256 hash functionality - // Oberon backend implementation for SHA-256. #ifndef NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED -#define NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED 1 + #define NRF_CRYPTO_BACKEND_OBERON_HASH_SHA256_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED - Oberon SHA-512 hash functionality - // Oberon backend implementation for SHA-512. #ifndef NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED -#define NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED 1 + #define NRF_CRYPTO_BACKEND_OBERON_HASH_SHA512_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED - Oberon HMAC using SHA-256 - // Oberon backend implementation for HMAC using SHA-256. #ifndef NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED -#define NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED 1 + #define NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA256_ENABLED 1 #endif // NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED - Oberon HMAC using SHA-512 - // Oberon backend implementation for HMAC using SHA-512. #ifndef NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED -#define NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED 1 + #define NRF_CRYPTO_BACKEND_OBERON_HMAC_SHA512_ENABLED 1 #endif // @@ -2346,43 +2233,40 @@ // Enables the nrf_crypto backend for Optiga Trust X devices. //========================================================== #ifndef NRF_CRYPTO_BACKEND_OPTIGA_ENABLED -#define NRF_CRYPTO_BACKEND_OPTIGA_ENABLED 0 + #define NRF_CRYPTO_BACKEND_OPTIGA_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_OPTIGA_RNG_ENABLED - Optiga backend support for RNG - // The Optiga backend provide external chip RNG. #ifndef NRF_CRYPTO_BACKEND_OPTIGA_RNG_ENABLED -#define NRF_CRYPTO_BACKEND_OPTIGA_RNG_ENABLED 0 + #define NRF_CRYPTO_BACKEND_OPTIGA_RNG_ENABLED 0 #endif // NRF_CRYPTO_BACKEND_OPTIGA_ECC_SECP256R1_ENABLED - Optiga backend support for ECC secp256r1 - // The Optiga backend provide external chip ECC using secp256r1. #ifndef NRF_CRYPTO_BACKEND_OPTIGA_ECC_SECP256R1_ENABLED -#define NRF_CRYPTO_BACKEND_OPTIGA_ECC_SECP256R1_ENABLED 1 + #define NRF_CRYPTO_BACKEND_OPTIGA_ECC_SECP256R1_ENABLED 1 #endif // // NRF_CRYPTO_CURVE25519_BIG_ENDIAN_ENABLED - Big-endian byte order in raw Curve25519 data - // Enable big-endian byte order in Curve25519 API, if set to 1. Use little-endian, if set to 0. #ifndef NRF_CRYPTO_CURVE25519_BIG_ENDIAN_ENABLED -#define NRF_CRYPTO_CURVE25519_BIG_ENDIAN_ENABLED 0 + #define NRF_CRYPTO_CURVE25519_BIG_ENDIAN_ENABLED 0 #endif // -// +// //========================================================== -// nRF_DFU +// nRF_DFU //========================================================== // ble_dfu - Device Firmware Update @@ -2390,159 +2274,153 @@ //========================================================== // BLE_DFU_ENABLED - Enable DFU Service. - #ifndef BLE_DFU_ENABLED -#define BLE_DFU_ENABLED 0 + #define BLE_DFU_ENABLED 0 #endif // NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS - Buttonless DFU supports bonds. - #ifndef NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS -#define NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS 0 + #define NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS 0 #endif -// +// //========================================================== -// +// //========================================================== -// nRF_Drivers +// nRF_Drivers //========================================================== // COMP_ENABLED - nrf_drv_comp - COMP peripheral driver - legacy layer //========================================================== #ifndef COMP_ENABLED -#define COMP_ENABLED 0 + #define COMP_ENABLED 0 #endif // COMP_CONFIG_REF - Reference voltage -// <0=> Internal 1.2V -// <1=> Internal 1.8V -// <2=> Internal 2.4V -// <4=> VDD -// <7=> ARef +// <0=> Internal 1.2V +// <1=> Internal 1.8V +// <2=> Internal 2.4V +// <4=> VDD +// <7=> ARef #ifndef COMP_CONFIG_REF -#define COMP_CONFIG_REF 1 + #define COMP_CONFIG_REF 1 #endif // COMP_CONFIG_MAIN_MODE - Main mode -// <0=> Single ended -// <1=> Differential +// <0=> Single ended +// <1=> Differential #ifndef COMP_CONFIG_MAIN_MODE -#define COMP_CONFIG_MAIN_MODE 0 + #define COMP_CONFIG_MAIN_MODE 0 #endif // COMP_CONFIG_SPEED_MODE - Speed mode -// <0=> Low power -// <1=> Normal -// <2=> High speed +// <0=> Low power +// <1=> Normal +// <2=> High speed #ifndef COMP_CONFIG_SPEED_MODE -#define COMP_CONFIG_SPEED_MODE 2 + #define COMP_CONFIG_SPEED_MODE 2 #endif // COMP_CONFIG_HYST - Hystheresis -// <0=> No -// <1=> 50mV +// <0=> No +// <1=> 50mV #ifndef COMP_CONFIG_HYST -#define COMP_CONFIG_HYST 0 + #define COMP_CONFIG_HYST 0 #endif // COMP_CONFIG_ISOURCE - Current Source -// <0=> Off -// <1=> 2.5 uA -// <2=> 5 uA -// <3=> 10 uA +// <0=> Off +// <1=> 2.5 uA +// <2=> 5 uA +// <3=> 10 uA #ifndef COMP_CONFIG_ISOURCE -#define COMP_CONFIG_ISOURCE 0 + #define COMP_CONFIG_ISOURCE 0 #endif // COMP_CONFIG_INPUT - Analog input -// <0=> 0 -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef COMP_CONFIG_INPUT -#define COMP_CONFIG_INPUT 0 + #define COMP_CONFIG_INPUT 0 #endif // COMP_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef COMP_CONFIG_IRQ_PRIORITY -#define COMP_CONFIG_IRQ_PRIORITY 6 + #define COMP_CONFIG_IRQ_PRIORITY 6 #endif // // EGU_ENABLED - nrf_drv_swi - SWI(EGU) peripheral driver - legacy layer - #ifndef EGU_ENABLED -#define EGU_ENABLED 0 + #define EGU_ENABLED 0 #endif // GPIOTE_ENABLED - nrf_drv_gpiote - GPIOTE peripheral driver - legacy layer //========================================================== #ifndef GPIOTE_ENABLED -#define GPIOTE_ENABLED 1 + #define GPIOTE_ENABLED 1 #endif #ifndef GPIOTE_LOG_ENABLED -#define GPIOTE_LOG_ENABLED 0 + #define GPIOTE_LOG_ENABLED 0 #endif - #ifndef NRFX_GPIOTE_LOG_ENABLED -#define NRFX_GPIOTE_LOG_ENABLED 0 + #define NRFX_GPIOTE_LOG_ENABLED 0 #endif -// GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins +// GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins #ifndef GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS -#define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4 + #define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4 #endif // GPIOTE_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef GPIOTE_CONFIG_IRQ_PRIORITY -#define GPIOTE_CONFIG_IRQ_PRIORITY 6 + #define GPIOTE_CONFIG_IRQ_PRIORITY 6 #endif // @@ -2550,194 +2428,189 @@ // I2S_ENABLED - nrf_drv_i2s - I2S peripheral driver - legacy layer //========================================================== #ifndef I2S_ENABLED -#define I2S_ENABLED 0 + #define I2S_ENABLED 0 #endif -// I2S_CONFIG_SCK_PIN - SCK pin <0-31> - +// I2S_CONFIG_SCK_PIN - SCK pin <0-31> #ifndef I2S_CONFIG_SCK_PIN -#define I2S_CONFIG_SCK_PIN 31 + #define I2S_CONFIG_SCK_PIN 31 #endif -// I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> - +// I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> #ifndef I2S_CONFIG_LRCK_PIN -#define I2S_CONFIG_LRCK_PIN 30 + #define I2S_CONFIG_LRCK_PIN 30 #endif -// I2S_CONFIG_MCK_PIN - MCK pin +// I2S_CONFIG_MCK_PIN - MCK pin #ifndef I2S_CONFIG_MCK_PIN -#define I2S_CONFIG_MCK_PIN 255 + #define I2S_CONFIG_MCK_PIN 255 #endif -// I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> - +// I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> #ifndef I2S_CONFIG_SDOUT_PIN -#define I2S_CONFIG_SDOUT_PIN 29 + #define I2S_CONFIG_SDOUT_PIN 29 #endif -// I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> - +// I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> #ifndef I2S_CONFIG_SDIN_PIN -#define I2S_CONFIG_SDIN_PIN 28 + #define I2S_CONFIG_SDIN_PIN 28 #endif // I2S_CONFIG_MASTER - Mode -// <0=> Master -// <1=> Slave +// <0=> Master +// <1=> Slave #ifndef I2S_CONFIG_MASTER -#define I2S_CONFIG_MASTER 0 + #define I2S_CONFIG_MASTER 0 #endif // I2S_CONFIG_FORMAT - Format -// <0=> I2S -// <1=> Aligned +// <0=> I2S +// <1=> Aligned #ifndef I2S_CONFIG_FORMAT -#define I2S_CONFIG_FORMAT 0 + #define I2S_CONFIG_FORMAT 0 #endif // I2S_CONFIG_ALIGN - Alignment -// <0=> Left -// <1=> Right +// <0=> Left +// <1=> Right #ifndef I2S_CONFIG_ALIGN -#define I2S_CONFIG_ALIGN 0 + #define I2S_CONFIG_ALIGN 0 #endif // I2S_CONFIG_SWIDTH - Sample width (bits) -// <0=> 8 -// <1=> 16 -// <2=> 24 +// <0=> 8 +// <1=> 16 +// <2=> 24 #ifndef I2S_CONFIG_SWIDTH -#define I2S_CONFIG_SWIDTH 1 + #define I2S_CONFIG_SWIDTH 1 #endif // I2S_CONFIG_CHANNELS - Channels -// <0=> Stereo -// <1=> Left -// <2=> Right +// <0=> Stereo +// <1=> Left +// <2=> Right #ifndef I2S_CONFIG_CHANNELS -#define I2S_CONFIG_CHANNELS 1 + #define I2S_CONFIG_CHANNELS 1 #endif // I2S_CONFIG_MCK_SETUP - MCK behavior -// <0=> Disabled -// <2147483648=> 32MHz/2 -// <1342177280=> 32MHz/3 -// <1073741824=> 32MHz/4 -// <805306368=> 32MHz/5 -// <671088640=> 32MHz/6 -// <536870912=> 32MHz/8 -// <402653184=> 32MHz/10 -// <369098752=> 32MHz/11 -// <285212672=> 32MHz/15 -// <268435456=> 32MHz/16 -// <201326592=> 32MHz/21 -// <184549376=> 32MHz/23 -// <142606336=> 32MHz/30 -// <138412032=> 32MHz/31 -// <134217728=> 32MHz/32 -// <100663296=> 32MHz/42 -// <68157440=> 32MHz/63 -// <34340864=> 32MHz/125 +// <0=> Disabled +// <2147483648=> 32MHz/2 +// <1342177280=> 32MHz/3 +// <1073741824=> 32MHz/4 +// <805306368=> 32MHz/5 +// <671088640=> 32MHz/6 +// <536870912=> 32MHz/8 +// <402653184=> 32MHz/10 +// <369098752=> 32MHz/11 +// <285212672=> 32MHz/15 +// <268435456=> 32MHz/16 +// <201326592=> 32MHz/21 +// <184549376=> 32MHz/23 +// <142606336=> 32MHz/30 +// <138412032=> 32MHz/31 +// <134217728=> 32MHz/32 +// <100663296=> 32MHz/42 +// <68157440=> 32MHz/63 +// <34340864=> 32MHz/125 #ifndef I2S_CONFIG_MCK_SETUP -#define I2S_CONFIG_MCK_SETUP 536870912 + #define I2S_CONFIG_MCK_SETUP 536870912 #endif // I2S_CONFIG_RATIO - MCK/LRCK ratio -// <0=> 32x -// <1=> 48x -// <2=> 64x -// <3=> 96x -// <4=> 128x -// <5=> 192x -// <6=> 256x -// <7=> 384x -// <8=> 512x +// <0=> 32x +// <1=> 48x +// <2=> 64x +// <3=> 96x +// <4=> 128x +// <5=> 192x +// <6=> 256x +// <7=> 384x +// <8=> 512x #ifndef I2S_CONFIG_RATIO -#define I2S_CONFIG_RATIO 2000 + #define I2S_CONFIG_RATIO 2000 #endif // I2S_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef I2S_CONFIG_IRQ_PRIORITY -#define I2S_CONFIG_IRQ_PRIORITY 6 + #define I2S_CONFIG_IRQ_PRIORITY 6 #endif // I2S_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef I2S_CONFIG_LOG_ENABLED -#define I2S_CONFIG_LOG_ENABLED 0 + #define I2S_CONFIG_LOG_ENABLED 0 #endif // I2S_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef I2S_CONFIG_LOG_LEVEL -#define I2S_CONFIG_LOG_LEVEL 3 + #define I2S_CONFIG_LOG_LEVEL 3 #endif // I2S_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef I2S_CONFIG_INFO_COLOR -#define I2S_CONFIG_INFO_COLOR 0 + #define I2S_CONFIG_INFO_COLOR 0 #endif // I2S_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef I2S_CONFIG_DEBUG_COLOR -#define I2S_CONFIG_DEBUG_COLOR 0 + #define I2S_CONFIG_DEBUG_COLOR 0 #endif // @@ -2747,79 +2620,77 @@ // LPCOMP_ENABLED - nrf_drv_lpcomp - LPCOMP peripheral driver - legacy layer //========================================================== #ifndef LPCOMP_ENABLED -#define LPCOMP_ENABLED 0 + #define LPCOMP_ENABLED 0 #endif // LPCOMP_CONFIG_REFERENCE - Reference voltage -// <0=> Supply 1/8 -// <1=> Supply 2/8 -// <2=> Supply 3/8 -// <3=> Supply 4/8 -// <4=> Supply 5/8 -// <5=> Supply 6/8 -// <6=> Supply 7/8 -// <8=> Supply 1/16 (nRF52) -// <9=> Supply 3/16 (nRF52) -// <10=> Supply 5/16 (nRF52) -// <11=> Supply 7/16 (nRF52) -// <12=> Supply 9/16 (nRF52) -// <13=> Supply 11/16 (nRF52) -// <14=> Supply 13/16 (nRF52) -// <15=> Supply 15/16 (nRF52) -// <7=> External Ref 0 -// <65543=> External Ref 1 +// <0=> Supply 1/8 +// <1=> Supply 2/8 +// <2=> Supply 3/8 +// <3=> Supply 4/8 +// <4=> Supply 5/8 +// <5=> Supply 6/8 +// <6=> Supply 7/8 +// <8=> Supply 1/16 (nRF52) +// <9=> Supply 3/16 (nRF52) +// <10=> Supply 5/16 (nRF52) +// <11=> Supply 7/16 (nRF52) +// <12=> Supply 9/16 (nRF52) +// <13=> Supply 11/16 (nRF52) +// <14=> Supply 13/16 (nRF52) +// <15=> Supply 15/16 (nRF52) +// <7=> External Ref 0 +// <65543=> External Ref 1 #ifndef LPCOMP_CONFIG_REFERENCE -#define LPCOMP_CONFIG_REFERENCE 3 + #define LPCOMP_CONFIG_REFERENCE 3 #endif // LPCOMP_CONFIG_DETECTION - Detection -// <0=> Crossing -// <1=> Up -// <2=> Down +// <0=> Crossing +// <1=> Up +// <2=> Down #ifndef LPCOMP_CONFIG_DETECTION -#define LPCOMP_CONFIG_DETECTION 2 + #define LPCOMP_CONFIG_DETECTION 2 #endif // LPCOMP_CONFIG_INPUT - Analog input -// <0=> 0 -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef LPCOMP_CONFIG_INPUT -#define LPCOMP_CONFIG_INPUT 0 + #define LPCOMP_CONFIG_INPUT 0 #endif // LPCOMP_CONFIG_HYST - Hysteresis - #ifndef LPCOMP_CONFIG_HYST -#define LPCOMP_CONFIG_HYST 0 + #define LPCOMP_CONFIG_HYST 0 #endif // LPCOMP_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef LPCOMP_CONFIG_IRQ_PRIORITY -#define LPCOMP_CONFIG_IRQ_PRIORITY 6 + #define LPCOMP_CONFIG_IRQ_PRIORITY 6 #endif // @@ -2827,82 +2698,82 @@ // NRFX_CLOCK_ENABLED - nrfx_clock - CLOCK peripheral driver //========================================================== #ifndef NRFX_CLOCK_ENABLED -#define NRFX_CLOCK_ENABLED 1 + #define NRFX_CLOCK_ENABLED 1 #endif // NRFX_CLOCK_CONFIG_LF_SRC - LF Clock Source -// <0=> RC -// <1=> XTAL -// <2=> Synth -// <131073=> External Low Swing -// <196609=> External Full Swing +// <0=> RC +// <1=> XTAL +// <2=> Synth +// <131073=> External Low Swing +// <196609=> External Full Swing #ifndef NRFX_CLOCK_CONFIG_LF_SRC -#define NRFX_CLOCK_CONFIG_LF_SRC 1 + #define NRFX_CLOCK_CONFIG_LF_SRC 1 #endif // NRFX_CLOCK_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_CLOCK_CONFIG_IRQ_PRIORITY -#define NRFX_CLOCK_CONFIG_IRQ_PRIORITY 6 + #define NRFX_CLOCK_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_CLOCK_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_CLOCK_CONFIG_LOG_ENABLED -#define NRFX_CLOCK_CONFIG_LOG_ENABLED 0 + #define NRFX_CLOCK_CONFIG_LOG_ENABLED 0 #endif // NRFX_CLOCK_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_CLOCK_CONFIG_LOG_LEVEL -#define NRFX_CLOCK_CONFIG_LOG_LEVEL 3 + #define NRFX_CLOCK_CONFIG_LOG_LEVEL 3 #endif // NRFX_CLOCK_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_CLOCK_CONFIG_INFO_COLOR -#define NRFX_CLOCK_CONFIG_INFO_COLOR 0 + #define NRFX_CLOCK_CONFIG_INFO_COLOR 0 #endif // NRFX_CLOCK_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_CLOCK_CONFIG_DEBUG_COLOR -#define NRFX_CLOCK_CONFIG_DEBUG_COLOR 0 + #define NRFX_CLOCK_CONFIG_DEBUG_COLOR 0 #endif // @@ -2912,136 +2783,136 @@ // NRFX_COMP_ENABLED - nrfx_comp - COMP peripheral driver //========================================================== #ifndef NRFX_COMP_ENABLED -#define NRFX_COMP_ENABLED 0 + #define NRFX_COMP_ENABLED 0 #endif // NRFX_COMP_CONFIG_REF - Reference voltage -// <0=> Internal 1.2V -// <1=> Internal 1.8V -// <2=> Internal 2.4V -// <4=> VDD -// <7=> ARef +// <0=> Internal 1.2V +// <1=> Internal 1.8V +// <2=> Internal 2.4V +// <4=> VDD +// <7=> ARef #ifndef NRFX_COMP_CONFIG_REF -#define NRFX_COMP_CONFIG_REF 1 + #define NRFX_COMP_CONFIG_REF 1 #endif // NRFX_COMP_CONFIG_MAIN_MODE - Main mode -// <0=> Single ended -// <1=> Differential +// <0=> Single ended +// <1=> Differential #ifndef NRFX_COMP_CONFIG_MAIN_MODE -#define NRFX_COMP_CONFIG_MAIN_MODE 0 + #define NRFX_COMP_CONFIG_MAIN_MODE 0 #endif // NRFX_COMP_CONFIG_SPEED_MODE - Speed mode -// <0=> Low power -// <1=> Normal -// <2=> High speed +// <0=> Low power +// <1=> Normal +// <2=> High speed #ifndef NRFX_COMP_CONFIG_SPEED_MODE -#define NRFX_COMP_CONFIG_SPEED_MODE 2 + #define NRFX_COMP_CONFIG_SPEED_MODE 2 #endif // NRFX_COMP_CONFIG_HYST - Hystheresis -// <0=> No -// <1=> 50mV +// <0=> No +// <1=> 50mV #ifndef NRFX_COMP_CONFIG_HYST -#define NRFX_COMP_CONFIG_HYST 0 + #define NRFX_COMP_CONFIG_HYST 0 #endif // NRFX_COMP_CONFIG_ISOURCE - Current Source -// <0=> Off -// <1=> 2.5 uA -// <2=> 5 uA -// <3=> 10 uA +// <0=> Off +// <1=> 2.5 uA +// <2=> 5 uA +// <3=> 10 uA #ifndef NRFX_COMP_CONFIG_ISOURCE -#define NRFX_COMP_CONFIG_ISOURCE 0 + #define NRFX_COMP_CONFIG_ISOURCE 0 #endif // NRFX_COMP_CONFIG_INPUT - Analog input -// <0=> 0 -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_COMP_CONFIG_INPUT -#define NRFX_COMP_CONFIG_INPUT 0 + #define NRFX_COMP_CONFIG_INPUT 0 #endif // NRFX_COMP_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_COMP_CONFIG_IRQ_PRIORITY -#define NRFX_COMP_CONFIG_IRQ_PRIORITY 6 + #define NRFX_COMP_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_COMP_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_COMP_CONFIG_LOG_ENABLED -#define NRFX_COMP_CONFIG_LOG_ENABLED 0 + #define NRFX_COMP_CONFIG_LOG_ENABLED 0 #endif // NRFX_COMP_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_COMP_CONFIG_LOG_LEVEL -#define NRFX_COMP_CONFIG_LOG_LEVEL 3 + #define NRFX_COMP_CONFIG_LOG_LEVEL 3 #endif // NRFX_COMP_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_COMP_CONFIG_INFO_COLOR -#define NRFX_COMP_CONFIG_INFO_COLOR 0 + #define NRFX_COMP_CONFIG_INFO_COLOR 0 #endif // NRFX_COMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_COMP_CONFIG_DEBUG_COLOR -#define NRFX_COMP_CONFIG_DEBUG_COLOR 0 + #define NRFX_COMP_CONFIG_DEBUG_COLOR 0 #endif // @@ -3051,75 +2922,75 @@ // NRFX_GPIOTE_ENABLED - nrfx_gpiote - GPIOTE peripheral driver //========================================================== #ifndef NRFX_GPIOTE_ENABLED -#define NRFX_GPIOTE_ENABLED 1 + #define NRFX_GPIOTE_ENABLED 1 #endif -// NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins +// NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins #ifndef NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS -#define NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4 + #define NRFX_GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4 #endif // NRFX_GPIOTE_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_GPIOTE_CONFIG_IRQ_PRIORITY -#define NRFX_GPIOTE_CONFIG_IRQ_PRIORITY 6 + #define NRFX_GPIOTE_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_GPIOTE_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_GPIOTE_CONFIG_LOG_ENABLED -#define NRFX_GPIOTE_CONFIG_LOG_ENABLED 0 + #define NRFX_GPIOTE_CONFIG_LOG_ENABLED 0 #endif // NRFX_GPIOTE_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_GPIOTE_CONFIG_LOG_LEVEL -#define NRFX_GPIOTE_CONFIG_LOG_LEVEL 3 + #define NRFX_GPIOTE_CONFIG_LOG_LEVEL 3 #endif // NRFX_GPIOTE_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_GPIOTE_CONFIG_INFO_COLOR -#define NRFX_GPIOTE_CONFIG_INFO_COLOR 0 + #define NRFX_GPIOTE_CONFIG_INFO_COLOR 0 #endif // NRFX_GPIOTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_GPIOTE_CONFIG_DEBUG_COLOR -#define NRFX_GPIOTE_CONFIG_DEBUG_COLOR 0 + #define NRFX_GPIOTE_CONFIG_DEBUG_COLOR 0 #endif // @@ -3129,192 +3000,188 @@ // NRFX_I2S_ENABLED - nrfx_i2s - I2S peripheral driver //========================================================== #ifndef NRFX_I2S_ENABLED -#define NRFX_I2S_ENABLED 0 + #define NRFX_I2S_ENABLED 0 #endif -// NRFX_I2S_CONFIG_SCK_PIN - SCK pin <0-31> - +// NRFX_I2S_CONFIG_SCK_PIN - SCK pin <0-31> #ifndef NRFX_I2S_CONFIG_SCK_PIN -#define NRFX_I2S_CONFIG_SCK_PIN 31 + #define NRFX_I2S_CONFIG_SCK_PIN 31 #endif -// NRFX_I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> - +// NRFX_I2S_CONFIG_LRCK_PIN - LRCK pin <1-31> #ifndef NRFX_I2S_CONFIG_LRCK_PIN -#define NRFX_I2S_CONFIG_LRCK_PIN 30 + #define NRFX_I2S_CONFIG_LRCK_PIN 30 #endif -// NRFX_I2S_CONFIG_MCK_PIN - MCK pin +// NRFX_I2S_CONFIG_MCK_PIN - MCK pin #ifndef NRFX_I2S_CONFIG_MCK_PIN -#define NRFX_I2S_CONFIG_MCK_PIN 255 + #define NRFX_I2S_CONFIG_MCK_PIN 255 #endif -// NRFX_I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> - +// NRFX_I2S_CONFIG_SDOUT_PIN - SDOUT pin <0-31> #ifndef NRFX_I2S_CONFIG_SDOUT_PIN -#define NRFX_I2S_CONFIG_SDOUT_PIN 29 + #define NRFX_I2S_CONFIG_SDOUT_PIN 29 #endif -// NRFX_I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> - +// NRFX_I2S_CONFIG_SDIN_PIN - SDIN pin <0-31> #ifndef NRFX_I2S_CONFIG_SDIN_PIN -#define NRFX_I2S_CONFIG_SDIN_PIN 28 + #define NRFX_I2S_CONFIG_SDIN_PIN 28 #endif // NRFX_I2S_CONFIG_MASTER - Mode -// <0=> Master -// <1=> Slave +// <0=> Master +// <1=> Slave #ifndef NRFX_I2S_CONFIG_MASTER -#define NRFX_I2S_CONFIG_MASTER 0 + #define NRFX_I2S_CONFIG_MASTER 0 #endif // NRFX_I2S_CONFIG_FORMAT - Format -// <0=> I2S -// <1=> Aligned +// <0=> I2S +// <1=> Aligned #ifndef NRFX_I2S_CONFIG_FORMAT -#define NRFX_I2S_CONFIG_FORMAT 0 + #define NRFX_I2S_CONFIG_FORMAT 0 #endif // NRFX_I2S_CONFIG_ALIGN - Alignment -// <0=> Left -// <1=> Right +// <0=> Left +// <1=> Right #ifndef NRFX_I2S_CONFIG_ALIGN -#define NRFX_I2S_CONFIG_ALIGN 0 + #define NRFX_I2S_CONFIG_ALIGN 0 #endif // NRFX_I2S_CONFIG_SWIDTH - Sample width (bits) -// <0=> 8 -// <1=> 16 -// <2=> 24 +// <0=> 8 +// <1=> 16 +// <2=> 24 #ifndef NRFX_I2S_CONFIG_SWIDTH -#define NRFX_I2S_CONFIG_SWIDTH 1 + #define NRFX_I2S_CONFIG_SWIDTH 1 #endif // NRFX_I2S_CONFIG_CHANNELS - Channels -// <0=> Stereo -// <1=> Left -// <2=> Right +// <0=> Stereo +// <1=> Left +// <2=> Right #ifndef NRFX_I2S_CONFIG_CHANNELS -#define NRFX_I2S_CONFIG_CHANNELS 1 + #define NRFX_I2S_CONFIG_CHANNELS 1 #endif // NRFX_I2S_CONFIG_MCK_SETUP - MCK behavior -// <0=> Disabled -// <2147483648=> 32MHz/2 -// <1342177280=> 32MHz/3 -// <1073741824=> 32MHz/4 -// <805306368=> 32MHz/5 -// <671088640=> 32MHz/6 -// <536870912=> 32MHz/8 -// <402653184=> 32MHz/10 -// <369098752=> 32MHz/11 -// <285212672=> 32MHz/15 -// <268435456=> 32MHz/16 -// <201326592=> 32MHz/21 -// <184549376=> 32MHz/23 -// <142606336=> 32MHz/30 -// <138412032=> 32MHz/31 -// <134217728=> 32MHz/32 -// <100663296=> 32MHz/42 -// <68157440=> 32MHz/63 -// <34340864=> 32MHz/125 +// <0=> Disabled +// <2147483648=> 32MHz/2 +// <1342177280=> 32MHz/3 +// <1073741824=> 32MHz/4 +// <805306368=> 32MHz/5 +// <671088640=> 32MHz/6 +// <536870912=> 32MHz/8 +// <402653184=> 32MHz/10 +// <369098752=> 32MHz/11 +// <285212672=> 32MHz/15 +// <268435456=> 32MHz/16 +// <201326592=> 32MHz/21 +// <184549376=> 32MHz/23 +// <142606336=> 32MHz/30 +// <138412032=> 32MHz/31 +// <134217728=> 32MHz/32 +// <100663296=> 32MHz/42 +// <68157440=> 32MHz/63 +// <34340864=> 32MHz/125 #ifndef NRFX_I2S_CONFIG_MCK_SETUP -#define NRFX_I2S_CONFIG_MCK_SETUP 536870912 + #define NRFX_I2S_CONFIG_MCK_SETUP 536870912 #endif // NRFX_I2S_CONFIG_RATIO - MCK/LRCK ratio -// <0=> 32x -// <1=> 48x -// <2=> 64x -// <3=> 96x -// <4=> 128x -// <5=> 192x -// <6=> 256x -// <7=> 384x -// <8=> 512x +// <0=> 32x +// <1=> 48x +// <2=> 64x +// <3=> 96x +// <4=> 128x +// <5=> 192x +// <6=> 256x +// <7=> 384x +// <8=> 512x #ifndef NRFX_I2S_CONFIG_RATIO -#define NRFX_I2S_CONFIG_RATIO 2000 + #define NRFX_I2S_CONFIG_RATIO 2000 #endif // NRFX_I2S_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_I2S_CONFIG_IRQ_PRIORITY -#define NRFX_I2S_CONFIG_IRQ_PRIORITY 6 + #define NRFX_I2S_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_I2S_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_I2S_CONFIG_LOG_ENABLED -#define NRFX_I2S_CONFIG_LOG_ENABLED 0 + #define NRFX_I2S_CONFIG_LOG_ENABLED 0 #endif // NRFX_I2S_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_I2S_CONFIG_LOG_LEVEL -#define NRFX_I2S_CONFIG_LOG_LEVEL 3 + #define NRFX_I2S_CONFIG_LOG_LEVEL 3 #endif // NRFX_I2S_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_I2S_CONFIG_INFO_COLOR -#define NRFX_I2S_CONFIG_INFO_COLOR 0 + #define NRFX_I2S_CONFIG_INFO_COLOR 0 #endif // NRFX_I2S_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_I2S_CONFIG_DEBUG_COLOR -#define NRFX_I2S_CONFIG_DEBUG_COLOR 0 + #define NRFX_I2S_CONFIG_DEBUG_COLOR 0 #endif // @@ -3324,126 +3191,125 @@ // NRFX_LPCOMP_ENABLED - nrfx_lpcomp - LPCOMP peripheral driver //========================================================== #ifndef NRFX_LPCOMP_ENABLED -#define NRFX_LPCOMP_ENABLED 0 + #define NRFX_LPCOMP_ENABLED 0 #endif // NRFX_LPCOMP_CONFIG_REFERENCE - Reference voltage -// <0=> Supply 1/8 -// <1=> Supply 2/8 -// <2=> Supply 3/8 -// <3=> Supply 4/8 -// <4=> Supply 5/8 -// <5=> Supply 6/8 -// <6=> Supply 7/8 -// <8=> Supply 1/16 (nRF52) -// <9=> Supply 3/16 (nRF52) -// <10=> Supply 5/16 (nRF52) -// <11=> Supply 7/16 (nRF52) -// <12=> Supply 9/16 (nRF52) -// <13=> Supply 11/16 (nRF52) -// <14=> Supply 13/16 (nRF52) -// <15=> Supply 15/16 (nRF52) -// <7=> External Ref 0 -// <65543=> External Ref 1 +// <0=> Supply 1/8 +// <1=> Supply 2/8 +// <2=> Supply 3/8 +// <3=> Supply 4/8 +// <4=> Supply 5/8 +// <5=> Supply 6/8 +// <6=> Supply 7/8 +// <8=> Supply 1/16 (nRF52) +// <9=> Supply 3/16 (nRF52) +// <10=> Supply 5/16 (nRF52) +// <11=> Supply 7/16 (nRF52) +// <12=> Supply 9/16 (nRF52) +// <13=> Supply 11/16 (nRF52) +// <14=> Supply 13/16 (nRF52) +// <15=> Supply 15/16 (nRF52) +// <7=> External Ref 0 +// <65543=> External Ref 1 #ifndef NRFX_LPCOMP_CONFIG_REFERENCE -#define NRFX_LPCOMP_CONFIG_REFERENCE 3 + #define NRFX_LPCOMP_CONFIG_REFERENCE 3 #endif // NRFX_LPCOMP_CONFIG_DETECTION - Detection -// <0=> Crossing -// <1=> Up -// <2=> Down +// <0=> Crossing +// <1=> Up +// <2=> Down #ifndef NRFX_LPCOMP_CONFIG_DETECTION -#define NRFX_LPCOMP_CONFIG_DETECTION 2 + #define NRFX_LPCOMP_CONFIG_DETECTION 2 #endif // NRFX_LPCOMP_CONFIG_INPUT - Analog input -// <0=> 0 -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_LPCOMP_CONFIG_INPUT -#define NRFX_LPCOMP_CONFIG_INPUT 0 + #define NRFX_LPCOMP_CONFIG_INPUT 0 #endif // NRFX_LPCOMP_CONFIG_HYST - Hysteresis - #ifndef NRFX_LPCOMP_CONFIG_HYST -#define NRFX_LPCOMP_CONFIG_HYST 0 + #define NRFX_LPCOMP_CONFIG_HYST 0 #endif // NRFX_LPCOMP_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_LPCOMP_CONFIG_IRQ_PRIORITY -#define NRFX_LPCOMP_CONFIG_IRQ_PRIORITY 6 + #define NRFX_LPCOMP_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_LPCOMP_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_LPCOMP_CONFIG_LOG_ENABLED -#define NRFX_LPCOMP_CONFIG_LOG_ENABLED 0 + #define NRFX_LPCOMP_CONFIG_LOG_ENABLED 0 #endif // NRFX_LPCOMP_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_LPCOMP_CONFIG_LOG_LEVEL -#define NRFX_LPCOMP_CONFIG_LOG_LEVEL 3 + #define NRFX_LPCOMP_CONFIG_LOG_LEVEL 3 #endif // NRFX_LPCOMP_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_LPCOMP_CONFIG_INFO_COLOR -#define NRFX_LPCOMP_CONFIG_INFO_COLOR 0 + #define NRFX_LPCOMP_CONFIG_INFO_COLOR 0 #endif // NRFX_LPCOMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_LPCOMP_CONFIG_DEBUG_COLOR -#define NRFX_LPCOMP_CONFIG_DEBUG_COLOR 0 + #define NRFX_LPCOMP_CONFIG_DEBUG_COLOR 0 #endif // @@ -3453,98 +3319,98 @@ // NRFX_PDM_ENABLED - nrfx_pdm - PDM peripheral driver //========================================================== #ifndef NRFX_PDM_ENABLED -#define NRFX_PDM_ENABLED 0 + #define NRFX_PDM_ENABLED 0 #endif // NRFX_PDM_CONFIG_MODE - Mode -// <0=> Stereo -// <1=> Mono +// <0=> Stereo +// <1=> Mono #ifndef NRFX_PDM_CONFIG_MODE -#define NRFX_PDM_CONFIG_MODE 1 + #define NRFX_PDM_CONFIG_MODE 1 #endif // NRFX_PDM_CONFIG_EDGE - Edge -// <0=> Left falling -// <1=> Left rising +// <0=> Left falling +// <1=> Left rising #ifndef NRFX_PDM_CONFIG_EDGE -#define NRFX_PDM_CONFIG_EDGE 0 + #define NRFX_PDM_CONFIG_EDGE 0 #endif // NRFX_PDM_CONFIG_CLOCK_FREQ - Clock frequency -// <134217728=> 1000k -// <138412032=> 1032k (default) -// <142606336=> 1067k +// <134217728=> 1000k +// <138412032=> 1032k (default) +// <142606336=> 1067k #ifndef NRFX_PDM_CONFIG_CLOCK_FREQ -#define NRFX_PDM_CONFIG_CLOCK_FREQ 138412032 + #define NRFX_PDM_CONFIG_CLOCK_FREQ 138412032 #endif // NRFX_PDM_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_PDM_CONFIG_IRQ_PRIORITY -#define NRFX_PDM_CONFIG_IRQ_PRIORITY 6 + #define NRFX_PDM_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_PDM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_PDM_CONFIG_LOG_ENABLED -#define NRFX_PDM_CONFIG_LOG_ENABLED 0 + #define NRFX_PDM_CONFIG_LOG_ENABLED 0 #endif // NRFX_PDM_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_PDM_CONFIG_LOG_LEVEL -#define NRFX_PDM_CONFIG_LOG_LEVEL 3 + #define NRFX_PDM_CONFIG_LOG_LEVEL 3 #endif // NRFX_PDM_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_PDM_CONFIG_INFO_COLOR -#define NRFX_PDM_CONFIG_INFO_COLOR 0 + #define NRFX_PDM_CONFIG_INFO_COLOR 0 #endif // NRFX_PDM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_PDM_CONFIG_DEBUG_COLOR -#define NRFX_PDM_CONFIG_DEBUG_COLOR 0 + #define NRFX_PDM_CONFIG_DEBUG_COLOR 0 #endif // @@ -3554,39 +3420,37 @@ // NRFX_POWER_ENABLED - nrfx_power - POWER peripheral driver //========================================================== #ifndef NRFX_POWER_ENABLED -#define NRFX_POWER_ENABLED 0 + #define NRFX_POWER_ENABLED 0 #endif // NRFX_POWER_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_POWER_CONFIG_IRQ_PRIORITY -#define NRFX_POWER_CONFIG_IRQ_PRIORITY 6 + #define NRFX_POWER_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_POWER_CONFIG_DEFAULT_DCDCEN - The default configuration of main DCDC regulator - // This settings means only that components for DCDC regulator are installed and it can be enabled. #ifndef NRFX_POWER_CONFIG_DEFAULT_DCDCEN -#define NRFX_POWER_CONFIG_DEFAULT_DCDCEN 0 + #define NRFX_POWER_CONFIG_DEFAULT_DCDCEN 0 #endif // NRFX_POWER_CONFIG_DEFAULT_DCDCENHV - The default configuration of High Voltage DCDC regulator - // This settings means only that components for DCDC regulator are installed and it can be enabled. #ifndef NRFX_POWER_CONFIG_DEFAULT_DCDCENHV -#define NRFX_POWER_CONFIG_DEFAULT_DCDCENHV 0 + #define NRFX_POWER_CONFIG_DEFAULT_DCDCENHV 0 #endif // @@ -3594,55 +3458,55 @@ // NRFX_PPI_ENABLED - nrfx_ppi - PPI peripheral allocator //========================================================== #ifndef NRFX_PPI_ENABLED -#define NRFX_PPI_ENABLED 0 + #define NRFX_PPI_ENABLED 0 #endif // NRFX_PPI_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_PPI_CONFIG_LOG_ENABLED -#define NRFX_PPI_CONFIG_LOG_ENABLED 0 + #define NRFX_PPI_CONFIG_LOG_ENABLED 0 #endif // NRFX_PPI_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_PPI_CONFIG_LOG_LEVEL -#define NRFX_PPI_CONFIG_LOG_LEVEL 3 + #define NRFX_PPI_CONFIG_LOG_LEVEL 3 #endif // NRFX_PPI_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_PPI_CONFIG_INFO_COLOR -#define NRFX_PPI_CONFIG_INFO_COLOR 0 + #define NRFX_PPI_CONFIG_INFO_COLOR 0 #endif // NRFX_PPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_PPI_CONFIG_DEBUG_COLOR -#define NRFX_PPI_CONFIG_DEBUG_COLOR 0 + #define NRFX_PPI_CONFIG_DEBUG_COLOR 0 #endif // @@ -3652,47 +3516,42 @@ // NRFX_PRS_ENABLED - nrfx_prs - Peripheral Resource Sharing module //========================================================== #ifndef NRFX_PRS_ENABLED -#define NRFX_PRS_ENABLED 0 + #define NRFX_PRS_ENABLED 0 #endif // NRFX_PRS_BOX_0_ENABLED - Enables box 0 in the module. - #ifndef NRFX_PRS_BOX_0_ENABLED -#define NRFX_PRS_BOX_0_ENABLED 0 + #define NRFX_PRS_BOX_0_ENABLED 0 #endif // NRFX_PRS_BOX_1_ENABLED - Enables box 1 in the module. - #ifndef NRFX_PRS_BOX_1_ENABLED -#define NRFX_PRS_BOX_1_ENABLED 0 + #define NRFX_PRS_BOX_1_ENABLED 0 #endif // NRFX_PRS_BOX_2_ENABLED - Enables box 2 in the module. - #ifndef NRFX_PRS_BOX_2_ENABLED -#define NRFX_PRS_BOX_2_ENABLED 0 + #define NRFX_PRS_BOX_2_ENABLED 0 #endif // NRFX_PRS_BOX_3_ENABLED - Enables box 3 in the module. - #ifndef NRFX_PRS_BOX_3_ENABLED -#define NRFX_PRS_BOX_3_ENABLED 0 + #define NRFX_PRS_BOX_3_ENABLED 0 #endif // NRFX_PRS_BOX_4_ENABLED - Enables box 4 in the module. - #ifndef NRFX_PRS_BOX_4_ENABLED -#define NRFX_PRS_BOX_4_ENABLED 1 + #define NRFX_PRS_BOX_4_ENABLED 1 #endif // NRFX_PRS_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_PRS_CONFIG_LOG_ENABLED -#define NRFX_PRS_CONFIG_LOG_ENABLED 0 + #define NRFX_PRS_CONFIG_LOG_ENABLED 0 #endif // NRFX_PRS_CONFIG_LOG_LEVEL - Default Severity level @@ -3703,7 +3562,7 @@ // <4=> Debug #ifndef NRFX_PRS_CONFIG_LOG_LEVEL -#define NRFX_PRS_CONFIG_LOG_LEVEL 3 + #define NRFX_PRS_CONFIG_LOG_LEVEL 3 #endif // NRFX_PRS_CONFIG_INFO_COLOR - ANSI escape code prefix. @@ -3719,7 +3578,7 @@ // <8=> White #ifndef NRFX_PRS_CONFIG_INFO_COLOR -#define NRFX_PRS_CONFIG_INFO_COLOR 0 + #define NRFX_PRS_CONFIG_INFO_COLOR 0 #endif // NRFX_PRS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. @@ -3735,7 +3594,7 @@ // <8=> White #ifndef NRFX_PRS_CONFIG_DEBUG_COLOR -#define NRFX_PRS_CONFIG_DEBUG_COLOR 0 + #define NRFX_PRS_CONFIG_DEBUG_COLOR 0 #endif // @@ -3745,168 +3604,161 @@ // NRFX_PWM_ENABLED - nrfx_pwm - PWM peripheral driver //========================================================== #ifndef NRFX_PWM_ENABLED -#define NRFX_PWM_ENABLED 0 + #define NRFX_PWM_ENABLED 0 #endif // NRFX_PWM0_ENABLED - Enable PWM0 instance - #ifndef NRFX_PWM0_ENABLED -#define NRFX_PWM0_ENABLED 0 + #define NRFX_PWM0_ENABLED 0 #endif // NRFX_PWM1_ENABLED - Enable PWM1 instance - #ifndef NRFX_PWM1_ENABLED -#define NRFX_PWM1_ENABLED 0 + #define NRFX_PWM1_ENABLED 0 #endif // NRFX_PWM2_ENABLED - Enable PWM2 instance - #ifndef NRFX_PWM2_ENABLED -#define NRFX_PWM2_ENABLED 0 + #define NRFX_PWM2_ENABLED 0 #endif -// NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> - +// NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> #ifndef NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN -#define NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN 31 + #define NRFX_PWM_DEFAULT_CONFIG_OUT0_PIN 31 #endif -// NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> - +// NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> #ifndef NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN -#define NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN 31 + #define NRFX_PWM_DEFAULT_CONFIG_OUT1_PIN 31 #endif -// NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> - +// NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> #ifndef NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN -#define NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN 31 + #define NRFX_PWM_DEFAULT_CONFIG_OUT2_PIN 31 #endif -// NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> - +// NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> #ifndef NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN -#define NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN 31 + #define NRFX_PWM_DEFAULT_CONFIG_OUT3_PIN 31 #endif // NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK - Base clock -// <0=> 16 MHz -// <1=> 8 MHz -// <2=> 4 MHz -// <3=> 2 MHz -// <4=> 1 MHz -// <5=> 500 kHz -// <6=> 250 kHz -// <7=> 125 kHz +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz #ifndef NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK -#define NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK 4 + #define NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK 4 #endif // NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE - Count mode -// <0=> Up -// <1=> Up and Down +// <0=> Up +// <1=> Up and Down #ifndef NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE -#define NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE 0 + #define NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE 0 #endif -// NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE - Top value +// NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE - Top value #ifndef NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE -#define NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE 1000 + #define NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE 1000 #endif // NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE - Load mode -// <0=> Common -// <1=> Grouped -// <2=> Individual -// <3=> Waveform +// <0=> Common +// <1=> Grouped +// <2=> Individual +// <3=> Waveform #ifndef NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE -#define NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE 0 + #define NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE 0 #endif // NRFX_PWM_DEFAULT_CONFIG_STEP_MODE - Step mode -// <0=> Auto -// <1=> Triggered +// <0=> Auto +// <1=> Triggered #ifndef NRFX_PWM_DEFAULT_CONFIG_STEP_MODE -#define NRFX_PWM_DEFAULT_CONFIG_STEP_MODE 0 + #define NRFX_PWM_DEFAULT_CONFIG_STEP_MODE 0 #endif // NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_PWM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_PWM_CONFIG_LOG_ENABLED -#define NRFX_PWM_CONFIG_LOG_ENABLED 0 + #define NRFX_PWM_CONFIG_LOG_ENABLED 0 #endif // NRFX_PWM_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_PWM_CONFIG_LOG_LEVEL -#define NRFX_PWM_CONFIG_LOG_LEVEL 3 + #define NRFX_PWM_CONFIG_LOG_LEVEL 3 #endif // NRFX_PWM_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_PWM_CONFIG_INFO_COLOR -#define NRFX_PWM_CONFIG_INFO_COLOR 0 + #define NRFX_PWM_CONFIG_INFO_COLOR 0 #endif // NRFX_PWM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_PWM_CONFIG_DEBUG_COLOR -#define NRFX_PWM_CONFIG_DEBUG_COLOR 0 + #define NRFX_PWM_CONFIG_DEBUG_COLOR 0 #endif // @@ -3922,19 +3774,19 @@ // done for the next sequence to be played. //========================================================== #ifndef NRFX_PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED -#define NRFX_PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 + #define NRFX_PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 #endif // NRFX_PWM_NRF52_ANOMALY_109_EGU_INSTANCE - EGU instance used by the nRF52 Anomaly 109 workaround for PWM. -// <0=> EGU0 -// <1=> EGU1 -// <2=> EGU2 -// <3=> EGU3 -// <4=> EGU4 -// <5=> EGU5 +// <0=> EGU0 +// <1=> EGU1 +// <2=> EGU2 +// <3=> EGU3 +// <4=> EGU4 +// <5=> EGU5 #ifndef NRFX_PWM_NRF52_ANOMALY_109_EGU_INSTANCE -#define NRFX_PWM_NRF52_ANOMALY_109_EGU_INSTANCE 5 + #define NRFX_PWM_NRF52_ANOMALY_109_EGU_INSTANCE 5 #endif // @@ -3944,149 +3796,144 @@ // NRFX_QDEC_ENABLED - nrfx_qdec - QDEC peripheral driver //========================================================== #ifndef NRFX_QDEC_ENABLED -#define NRFX_QDEC_ENABLED 0 + #define NRFX_QDEC_ENABLED 0 #endif // NRFX_QDEC_CONFIG_REPORTPER - Report period -// <0=> 10 Samples -// <1=> 40 Samples -// <2=> 80 Samples -// <3=> 120 Samples -// <4=> 160 Samples -// <5=> 200 Samples -// <6=> 240 Samples -// <7=> 280 Samples +// <0=> 10 Samples +// <1=> 40 Samples +// <2=> 80 Samples +// <3=> 120 Samples +// <4=> 160 Samples +// <5=> 200 Samples +// <6=> 240 Samples +// <7=> 280 Samples #ifndef NRFX_QDEC_CONFIG_REPORTPER -#define NRFX_QDEC_CONFIG_REPORTPER 0 + #define NRFX_QDEC_CONFIG_REPORTPER 0 #endif // NRFX_QDEC_CONFIG_SAMPLEPER - Sample period -// <0=> 128 us -// <1=> 256 us -// <2=> 512 us -// <3=> 1024 us -// <4=> 2048 us -// <5=> 4096 us -// <6=> 8192 us -// <7=> 16384 us +// <0=> 128 us +// <1=> 256 us +// <2=> 512 us +// <3=> 1024 us +// <4=> 2048 us +// <5=> 4096 us +// <6=> 8192 us +// <7=> 16384 us #ifndef NRFX_QDEC_CONFIG_SAMPLEPER -#define NRFX_QDEC_CONFIG_SAMPLEPER 7 + #define NRFX_QDEC_CONFIG_SAMPLEPER 7 #endif -// NRFX_QDEC_CONFIG_PIO_A - A pin <0-31> - +// NRFX_QDEC_CONFIG_PIO_A - A pin <0-31> #ifndef NRFX_QDEC_CONFIG_PIO_A -#define NRFX_QDEC_CONFIG_PIO_A 31 + #define NRFX_QDEC_CONFIG_PIO_A 31 #endif -// NRFX_QDEC_CONFIG_PIO_B - B pin <0-31> - +// NRFX_QDEC_CONFIG_PIO_B - B pin <0-31> #ifndef NRFX_QDEC_CONFIG_PIO_B -#define NRFX_QDEC_CONFIG_PIO_B 31 + #define NRFX_QDEC_CONFIG_PIO_B 31 #endif -// NRFX_QDEC_CONFIG_PIO_LED - LED pin <0-31> - +// NRFX_QDEC_CONFIG_PIO_LED - LED pin <0-31> #ifndef NRFX_QDEC_CONFIG_PIO_LED -#define NRFX_QDEC_CONFIG_PIO_LED 31 + #define NRFX_QDEC_CONFIG_PIO_LED 31 #endif -// NRFX_QDEC_CONFIG_LEDPRE - LED pre +// NRFX_QDEC_CONFIG_LEDPRE - LED pre #ifndef NRFX_QDEC_CONFIG_LEDPRE -#define NRFX_QDEC_CONFIG_LEDPRE 511 + #define NRFX_QDEC_CONFIG_LEDPRE 511 #endif // NRFX_QDEC_CONFIG_LEDPOL - LED polarity -// <0=> Active low -// <1=> Active high +// <0=> Active low +// <1=> Active high #ifndef NRFX_QDEC_CONFIG_LEDPOL -#define NRFX_QDEC_CONFIG_LEDPOL 1 + #define NRFX_QDEC_CONFIG_LEDPOL 1 #endif // NRFX_QDEC_CONFIG_DBFEN - Debouncing enable - #ifndef NRFX_QDEC_CONFIG_DBFEN -#define NRFX_QDEC_CONFIG_DBFEN 0 + #define NRFX_QDEC_CONFIG_DBFEN 0 #endif // NRFX_QDEC_CONFIG_SAMPLE_INTEN - Sample ready interrupt enable - #ifndef NRFX_QDEC_CONFIG_SAMPLE_INTEN -#define NRFX_QDEC_CONFIG_SAMPLE_INTEN 0 + #define NRFX_QDEC_CONFIG_SAMPLE_INTEN 0 #endif // NRFX_QDEC_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_QDEC_CONFIG_IRQ_PRIORITY -#define NRFX_QDEC_CONFIG_IRQ_PRIORITY 6 + #define NRFX_QDEC_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_QDEC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_QDEC_CONFIG_LOG_ENABLED -#define NRFX_QDEC_CONFIG_LOG_ENABLED 0 + #define NRFX_QDEC_CONFIG_LOG_ENABLED 0 #endif // NRFX_QDEC_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_QDEC_CONFIG_LOG_LEVEL -#define NRFX_QDEC_CONFIG_LOG_LEVEL 3 + #define NRFX_QDEC_CONFIG_LOG_LEVEL 3 #endif // NRFX_QDEC_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_QDEC_CONFIG_INFO_COLOR -#define NRFX_QDEC_CONFIG_INFO_COLOR 0 + #define NRFX_QDEC_CONFIG_INFO_COLOR 0 #endif // NRFX_QDEC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_QDEC_CONFIG_DEBUG_COLOR -#define NRFX_QDEC_CONFIG_DEBUG_COLOR 0 + #define NRFX_QDEC_CONFIG_DEBUG_COLOR 0 #endif // @@ -4096,77 +3943,76 @@ // NRFX_RNG_ENABLED - nrfx_rng - RNG peripheral driver //========================================================== #ifndef NRFX_RNG_ENABLED -#define NRFX_RNG_ENABLED 0 + #define NRFX_RNG_ENABLED 0 #endif // NRFX_RNG_CONFIG_ERROR_CORRECTION - Error correction - #ifndef NRFX_RNG_CONFIG_ERROR_CORRECTION -#define NRFX_RNG_CONFIG_ERROR_CORRECTION 1 + #define NRFX_RNG_CONFIG_ERROR_CORRECTION 1 #endif // NRFX_RNG_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_RNG_CONFIG_IRQ_PRIORITY -#define NRFX_RNG_CONFIG_IRQ_PRIORITY 6 + #define NRFX_RNG_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_RNG_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_RNG_CONFIG_LOG_ENABLED -#define NRFX_RNG_CONFIG_LOG_ENABLED 0 + #define NRFX_RNG_CONFIG_LOG_ENABLED 0 #endif // NRFX_RNG_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_RNG_CONFIG_LOG_LEVEL -#define NRFX_RNG_CONFIG_LOG_LEVEL 3 + #define NRFX_RNG_CONFIG_LOG_LEVEL 3 #endif // NRFX_RNG_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_RNG_CONFIG_INFO_COLOR -#define NRFX_RNG_CONFIG_INFO_COLOR 0 + #define NRFX_RNG_CONFIG_INFO_COLOR 0 #endif // NRFX_RNG_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_RNG_CONFIG_DEBUG_COLOR -#define NRFX_RNG_CONFIG_DEBUG_COLOR 0 + #define NRFX_RNG_CONFIG_DEBUG_COLOR 0 #endif // @@ -4176,110 +4022,105 @@ // NRFX_RTC_ENABLED - nrfx_rtc - RTC peripheral driver //========================================================== #ifndef NRFX_RTC_ENABLED -#define NRFX_RTC_ENABLED 0 + #define NRFX_RTC_ENABLED 0 #endif // NRFX_RTC0_ENABLED - Enable RTC0 instance - #ifndef NRFX_RTC0_ENABLED -#define NRFX_RTC0_ENABLED 0 + #define NRFX_RTC0_ENABLED 0 #endif // NRFX_RTC1_ENABLED - Enable RTC1 instance - #ifndef NRFX_RTC1_ENABLED -#define NRFX_RTC1_ENABLED 0 + #define NRFX_RTC1_ENABLED 0 #endif // NRFX_RTC2_ENABLED - Enable RTC2 instance - #ifndef NRFX_RTC2_ENABLED -#define NRFX_RTC2_ENABLED 0 + #define NRFX_RTC2_ENABLED 0 #endif -// NRFX_RTC_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt +// NRFX_RTC_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt #ifndef NRFX_RTC_MAXIMUM_LATENCY_US -#define NRFX_RTC_MAXIMUM_LATENCY_US 2000 + #define NRFX_RTC_MAXIMUM_LATENCY_US 2000 #endif -// NRFX_RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> - +// NRFX_RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> #ifndef NRFX_RTC_DEFAULT_CONFIG_FREQUENCY -#define NRFX_RTC_DEFAULT_CONFIG_FREQUENCY 32768 + #define NRFX_RTC_DEFAULT_CONFIG_FREQUENCY 32768 #endif // NRFX_RTC_DEFAULT_CONFIG_RELIABLE - Ensures safe compare event triggering - #ifndef NRFX_RTC_DEFAULT_CONFIG_RELIABLE -#define NRFX_RTC_DEFAULT_CONFIG_RELIABLE 0 + #define NRFX_RTC_DEFAULT_CONFIG_RELIABLE 0 #endif // NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_RTC_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_RTC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_RTC_CONFIG_LOG_ENABLED -#define NRFX_RTC_CONFIG_LOG_ENABLED 0 + #define NRFX_RTC_CONFIG_LOG_ENABLED 0 #endif // NRFX_RTC_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_RTC_CONFIG_LOG_LEVEL -#define NRFX_RTC_CONFIG_LOG_LEVEL 3 + #define NRFX_RTC_CONFIG_LOG_LEVEL 3 #endif // NRFX_RTC_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_RTC_CONFIG_INFO_COLOR -#define NRFX_RTC_CONFIG_INFO_COLOR 0 + #define NRFX_RTC_CONFIG_INFO_COLOR 0 #endif // NRFX_RTC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_RTC_CONFIG_DEBUG_COLOR -#define NRFX_RTC_CONFIG_DEBUG_COLOR 0 + #define NRFX_RTC_CONFIG_DEBUG_COLOR 0 #endif // @@ -4289,104 +4130,103 @@ // NRFX_SAADC_ENABLED - nrfx_saadc - SAADC peripheral driver //========================================================== #ifndef NRFX_SAADC_ENABLED -#define NRFX_SAADC_ENABLED 1 + #define NRFX_SAADC_ENABLED 1 #endif // NRFX_SAADC_CONFIG_RESOLUTION - Resolution -// <0=> 8 bit -// <1=> 10 bit -// <2=> 12 bit -// <3=> 14 bit +// <0=> 8 bit +// <1=> 10 bit +// <2=> 12 bit +// <3=> 14 bit #ifndef NRFX_SAADC_CONFIG_RESOLUTION -#define NRFX_SAADC_CONFIG_RESOLUTION 1 + #define NRFX_SAADC_CONFIG_RESOLUTION 1 #endif // NRFX_SAADC_CONFIG_OVERSAMPLE - Sample period -// <0=> Disabled -// <1=> 2x -// <2=> 4x -// <3=> 8x -// <4=> 16x -// <5=> 32x -// <6=> 64x -// <7=> 128x -// <8=> 256x +// <0=> Disabled +// <1=> 2x +// <2=> 4x +// <3=> 8x +// <4=> 16x +// <5=> 32x +// <6=> 64x +// <7=> 128x +// <8=> 256x #ifndef NRFX_SAADC_CONFIG_OVERSAMPLE -#define NRFX_SAADC_CONFIG_OVERSAMPLE 0 + #define NRFX_SAADC_CONFIG_OVERSAMPLE 0 #endif // NRFX_SAADC_CONFIG_LP_MODE - Enabling low power mode - #ifndef NRFX_SAADC_CONFIG_LP_MODE -#define NRFX_SAADC_CONFIG_LP_MODE 0 + #define NRFX_SAADC_CONFIG_LP_MODE 0 #endif // NRFX_SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_SAADC_CONFIG_IRQ_PRIORITY -#define NRFX_SAADC_CONFIG_IRQ_PRIORITY 6 + #define NRFX_SAADC_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_SAADC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_SAADC_CONFIG_LOG_ENABLED -#define NRFX_SAADC_CONFIG_LOG_ENABLED 0 + #define NRFX_SAADC_CONFIG_LOG_ENABLED 0 #endif // NRFX_SAADC_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_SAADC_CONFIG_LOG_LEVEL -#define NRFX_SAADC_CONFIG_LOG_LEVEL 3 + #define NRFX_SAADC_CONFIG_LOG_LEVEL 3 #endif // NRFX_SAADC_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SAADC_CONFIG_INFO_COLOR -#define NRFX_SAADC_CONFIG_INFO_COLOR 0 + #define NRFX_SAADC_CONFIG_INFO_COLOR 0 #endif // NRFX_SAADC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SAADC_CONFIG_DEBUG_COLOR -#define NRFX_SAADC_CONFIG_DEBUG_COLOR 0 + #define NRFX_SAADC_CONFIG_DEBUG_COLOR 0 #endif // @@ -4396,117 +4236,113 @@ // NRFX_SPIM_ENABLED - nrfx_spim - SPIM peripheral driver //========================================================== #ifndef NRFX_SPIM_ENABLED -#define NRFX_SPIM_ENABLED 0 + #define NRFX_SPIM_ENABLED 0 #endif // NRFX_SPIM0_ENABLED - Enable SPIM0 instance - #ifndef NRFX_SPIM0_ENABLED -#define NRFX_SPIM0_ENABLED 0 + #define NRFX_SPIM0_ENABLED 0 #endif // NRFX_SPIM1_ENABLED - Enable SPIM1 instance - #ifndef NRFX_SPIM1_ENABLED -#define NRFX_SPIM1_ENABLED 0 + #define NRFX_SPIM1_ENABLED 0 #endif // NRFX_SPIM2_ENABLED - Enable SPIM2 instance - #ifndef NRFX_SPIM2_ENABLED -#define NRFX_SPIM2_ENABLED 0 + #define NRFX_SPIM2_ENABLED 0 #endif // NRFX_SPIM_MISO_PULL_CFG - MISO pin pull configuration. -// <0=> NRF_GPIO_PIN_NOPULL -// <1=> NRF_GPIO_PIN_PULLDOWN -// <3=> NRF_GPIO_PIN_PULLUP +// <0=> NRF_GPIO_PIN_NOPULL +// <1=> NRF_GPIO_PIN_PULLDOWN +// <3=> NRF_GPIO_PIN_PULLUP #ifndef NRFX_SPIM_MISO_PULL_CFG -#define NRFX_SPIM_MISO_PULL_CFG 1 + #define NRFX_SPIM_MISO_PULL_CFG 1 #endif // NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_SPIM_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_SPIM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_SPIM_CONFIG_LOG_ENABLED -#define NRFX_SPIM_CONFIG_LOG_ENABLED 0 + #define NRFX_SPIM_CONFIG_LOG_ENABLED 0 #endif // NRFX_SPIM_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_SPIM_CONFIG_LOG_LEVEL -#define NRFX_SPIM_CONFIG_LOG_LEVEL 3 + #define NRFX_SPIM_CONFIG_LOG_LEVEL 3 #endif // NRFX_SPIM_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SPIM_CONFIG_INFO_COLOR -#define NRFX_SPIM_CONFIG_INFO_COLOR 0 + #define NRFX_SPIM_CONFIG_INFO_COLOR 0 #endif // NRFX_SPIM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SPIM_CONFIG_DEBUG_COLOR -#define NRFX_SPIM_CONFIG_DEBUG_COLOR 0 + #define NRFX_SPIM_CONFIG_DEBUG_COLOR 0 #endif // // NRFX_SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED - Enables nRF52 anomaly 109 workaround for SPIM. - // The workaround uses interrupts to wake up the CPU by catching -// a start event of zero-length transmission to start the clock. This +// a start event of zero-length transmission to start the clock. This // ensures that the DMA transfer will be executed without issues and -// that the proper transfer will be started. See more in the Errata -// document or Anomaly 109 Addendum located at +// that the proper transfer will be started. See more in the Errata +// document or Anomaly 109 Addendum located at // https://infocenter.nordicsemi.com/ #ifndef NRFX_SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED -#define NRFX_SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 + #define NRFX_SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 #endif // @@ -4514,112 +4350,106 @@ // NRFX_SPIS_ENABLED - nrfx_spis - SPIS peripheral driver //========================================================== #ifndef NRFX_SPIS_ENABLED -#define NRFX_SPIS_ENABLED 0 + #define NRFX_SPIS_ENABLED 0 #endif // NRFX_SPIS0_ENABLED - Enable SPIS0 instance - #ifndef NRFX_SPIS0_ENABLED -#define NRFX_SPIS0_ENABLED 0 + #define NRFX_SPIS0_ENABLED 0 #endif // NRFX_SPIS1_ENABLED - Enable SPIS1 instance - #ifndef NRFX_SPIS1_ENABLED -#define NRFX_SPIS1_ENABLED 0 + #define NRFX_SPIS1_ENABLED 0 #endif // NRFX_SPIS2_ENABLED - Enable SPIS2 instance - #ifndef NRFX_SPIS2_ENABLED -#define NRFX_SPIS2_ENABLED 0 + #define NRFX_SPIS2_ENABLED 0 #endif // NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_SPIS_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif -// NRFX_SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> - +// NRFX_SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> #ifndef NRFX_SPIS_DEFAULT_DEF -#define NRFX_SPIS_DEFAULT_DEF 255 + #define NRFX_SPIS_DEFAULT_DEF 255 #endif -// NRFX_SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> - +// NRFX_SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> #ifndef NRFX_SPIS_DEFAULT_ORC -#define NRFX_SPIS_DEFAULT_ORC 255 + #define NRFX_SPIS_DEFAULT_ORC 255 #endif // NRFX_SPIS_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_SPIS_CONFIG_LOG_ENABLED -#define NRFX_SPIS_CONFIG_LOG_ENABLED 0 + #define NRFX_SPIS_CONFIG_LOG_ENABLED 0 #endif // NRFX_SPIS_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_SPIS_CONFIG_LOG_LEVEL -#define NRFX_SPIS_CONFIG_LOG_LEVEL 3 + #define NRFX_SPIS_CONFIG_LOG_LEVEL 3 #endif // NRFX_SPIS_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black +// <0=> Default +// <1=> Black // <2=> Red < -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SPIS_CONFIG_INFO_COLOR -#define NRFX_SPIS_CONFIG_INFO_COLOR 0 + #define NRFX_SPIS_CONFIG_INFO_COLOR 0 #endif // NRFX_SPIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SPIS_CONFIG_DEBUG_COLOR -#define NRFX_SPIS_CONFIG_DEBUG_COLOR 0 + #define NRFX_SPIS_CONFIG_DEBUG_COLOR 0 #endif // // NRFX_SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED - Enables nRF52 Anomaly 109 workaround for SPIS. - // The workaround uses a GPIOTE channel to generate interrupts // on falling edges detected on the CSN line. This will make // the CPU active for the moment when SPIS starts DMA transfers, @@ -4628,7 +4458,7 @@ // enabled as well. #ifndef NRFX_SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED -#define NRFX_SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 + #define NRFX_SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 #endif // @@ -4636,101 +4466,98 @@ // NRFX_SPI_ENABLED - nrfx_spi - SPI peripheral driver //========================================================== #ifndef NRFX_SPI_ENABLED -#define NRFX_SPI_ENABLED 0 + #define NRFX_SPI_ENABLED 0 #endif // NRFX_SPI0_ENABLED - Enable SPI0 instance - #ifndef NRFX_SPI0_ENABLED -#define NRFX_SPI0_ENABLED 0 + #define NRFX_SPI0_ENABLED 0 #endif // NRFX_SPI1_ENABLED - Enable SPI1 instance - #ifndef NRFX_SPI1_ENABLED -#define NRFX_SPI1_ENABLED 0 + #define NRFX_SPI1_ENABLED 0 #endif // NRFX_SPI2_ENABLED - Enable SPI2 instance - #ifndef NRFX_SPI2_ENABLED -#define NRFX_SPI2_ENABLED 0 + #define NRFX_SPI2_ENABLED 0 #endif // NRFX_SPI_MISO_PULL_CFG - MISO pin pull configuration. -// <0=> NRF_GPIO_PIN_NOPULL -// <1=> NRF_GPIO_PIN_PULLDOWN -// <3=> NRF_GPIO_PIN_PULLUP +// <0=> NRF_GPIO_PIN_NOPULL +// <1=> NRF_GPIO_PIN_PULLDOWN +// <3=> NRF_GPIO_PIN_PULLUP #ifndef NRFX_SPI_MISO_PULL_CFG -#define NRFX_SPI_MISO_PULL_CFG 1 + #define NRFX_SPI_MISO_PULL_CFG 1 #endif // NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_SPI_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_SPI_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_SPI_CONFIG_LOG_ENABLED -#define NRFX_SPI_CONFIG_LOG_ENABLED 0 + #define NRFX_SPI_CONFIG_LOG_ENABLED 0 #endif // NRFX_SPI_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_SPI_CONFIG_LOG_LEVEL -#define NRFX_SPI_CONFIG_LOG_LEVEL 3 + #define NRFX_SPI_CONFIG_LOG_LEVEL 3 #endif // NRFX_SPI_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SPI_CONFIG_INFO_COLOR -#define NRFX_SPI_CONFIG_INFO_COLOR 0 + #define NRFX_SPI_CONFIG_INFO_COLOR 0 #endif // NRFX_SPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SPI_CONFIG_DEBUG_COLOR -#define NRFX_SPI_CONFIG_DEBUG_COLOR 0 + #define NRFX_SPI_CONFIG_DEBUG_COLOR 0 #endif // @@ -4740,104 +4567,97 @@ // NRFX_SWI_ENABLED - nrfx_swi - SWI/EGU peripheral allocator //========================================================== #ifndef NRFX_SWI_ENABLED -#define NRFX_SWI_ENABLED 0 + #define NRFX_SWI_ENABLED 0 #endif // NRFX_EGU_ENABLED - Enable EGU support - #ifndef NRFX_EGU_ENABLED -#define NRFX_EGU_ENABLED 0 + #define NRFX_EGU_ENABLED 0 #endif // NRFX_SWI0_DISABLED - Exclude SWI0 from being utilized by the driver - #ifndef NRFX_SWI0_DISABLED -#define NRFX_SWI0_DISABLED 0 + #define NRFX_SWI0_DISABLED 0 #endif // NRFX_SWI1_DISABLED - Exclude SWI1 from being utilized by the driver - #ifndef NRFX_SWI1_DISABLED -#define NRFX_SWI1_DISABLED 0 + #define NRFX_SWI1_DISABLED 0 #endif // NRFX_SWI2_DISABLED - Exclude SWI2 from being utilized by the driver - #ifndef NRFX_SWI2_DISABLED -#define NRFX_SWI2_DISABLED 0 + #define NRFX_SWI2_DISABLED 0 #endif // NRFX_SWI3_DISABLED - Exclude SWI3 from being utilized by the driver - #ifndef NRFX_SWI3_DISABLED -#define NRFX_SWI3_DISABLED 0 + #define NRFX_SWI3_DISABLED 0 #endif // NRFX_SWI4_DISABLED - Exclude SWI4 from being utilized by the driver - #ifndef NRFX_SWI4_DISABLED -#define NRFX_SWI4_DISABLED 0 + #define NRFX_SWI4_DISABLED 0 #endif // NRFX_SWI5_DISABLED - Exclude SWI5 from being utilized by the driver - #ifndef NRFX_SWI5_DISABLED -#define NRFX_SWI5_DISABLED 0 + #define NRFX_SWI5_DISABLED 0 #endif // NRFX_SWI_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_SWI_CONFIG_LOG_ENABLED -#define NRFX_SWI_CONFIG_LOG_ENABLED 0 + #define NRFX_SWI_CONFIG_LOG_ENABLED 0 #endif // NRFX_SWI_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_SWI_CONFIG_LOG_LEVEL -#define NRFX_SWI_CONFIG_LOG_LEVEL 3 + #define NRFX_SWI_CONFIG_LOG_LEVEL 3 #endif // NRFX_SWI_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SWI_CONFIG_INFO_COLOR -#define NRFX_SWI_CONFIG_INFO_COLOR 0 + #define NRFX_SWI_CONFIG_INFO_COLOR 0 #endif // NRFX_SWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_SWI_CONFIG_DEBUG_COLOR -#define NRFX_SWI_CONFIG_DEBUG_COLOR 0 + #define NRFX_SWI_CONFIG_DEBUG_COLOR 0 #endif // @@ -4847,142 +4667,137 @@ // NRFX_TIMER_ENABLED - nrfx_timer - TIMER periperal driver //========================================================== #ifndef NRFX_TIMER_ENABLED -#define NRFX_TIMER_ENABLED 1 + #define NRFX_TIMER_ENABLED 1 #endif // NRFX_TIMER0_ENABLED - Enable TIMER0 instance - #ifndef NRFX_TIMER0_ENABLED -#define NRFX_TIMER0_ENABLED 1 + #define NRFX_TIMER0_ENABLED 1 #endif // NRFX_TIMER1_ENABLED - Enable TIMER1 instance - #ifndef NRFX_TIMER1_ENABLED -#define NRFX_TIMER1_ENABLED 0 + #define NRFX_TIMER1_ENABLED 0 #endif // NRFX_TIMER2_ENABLED - Enable TIMER2 instance - #ifndef NRFX_TIMER2_ENABLED -#define NRFX_TIMER2_ENABLED 0 + #define NRFX_TIMER2_ENABLED 0 #endif // NRFX_TIMER3_ENABLED - Enable TIMER3 instance - #ifndef NRFX_TIMER3_ENABLED -#define NRFX_TIMER3_ENABLED 0 + #define NRFX_TIMER3_ENABLED 0 #endif // NRFX_TIMER4_ENABLED - Enable TIMER4 instance - #ifndef NRFX_TIMER4_ENABLED -#define NRFX_TIMER4_ENABLED 0 + #define NRFX_TIMER4_ENABLED 0 #endif // NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY - Timer frequency if in Timer mode -// <0=> 16 MHz -// <1=> 8 MHz -// <2=> 4 MHz -// <3=> 2 MHz -// <4=> 1 MHz -// <5=> 500 kHz -// <6=> 250 kHz -// <7=> 125 kHz -// <8=> 62.5 kHz -// <9=> 31.25 kHz +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz +// <8=> 62.5 kHz +// <9=> 31.25 kHz #ifndef NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY -#define NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY 0 + #define NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY 0 #endif // NRFX_TIMER_DEFAULT_CONFIG_MODE - Timer mode or operation -// <0=> Timer -// <1=> Counter +// <0=> Timer +// <1=> Counter #ifndef NRFX_TIMER_DEFAULT_CONFIG_MODE -#define NRFX_TIMER_DEFAULT_CONFIG_MODE 0 + #define NRFX_TIMER_DEFAULT_CONFIG_MODE 0 #endif // NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH - Timer counter bit width -// <0=> 16 bit -// <1=> 8 bit -// <2=> 24 bit -// <3=> 32 bit +// <0=> 16 bit +// <1=> 8 bit +// <2=> 24 bit +// <3=> 32 bit #ifndef NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH -#define NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH 0 + #define NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH 0 #endif // NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_TIMER_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_TIMER_CONFIG_LOG_ENABLED -#define NRFX_TIMER_CONFIG_LOG_ENABLED 0 + #define NRFX_TIMER_CONFIG_LOG_ENABLED 0 #endif // NRFX_TIMER_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_TIMER_CONFIG_LOG_LEVEL -#define NRFX_TIMER_CONFIG_LOG_LEVEL 3 + #define NRFX_TIMER_CONFIG_LOG_LEVEL 3 #endif // NRFX_TIMER_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_TIMER_CONFIG_INFO_COLOR -#define NRFX_TIMER_CONFIG_INFO_COLOR 0 + #define NRFX_TIMER_CONFIG_INFO_COLOR 0 #endif // NRFX_TIMER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_TIMER_CONFIG_DEBUG_COLOR -#define NRFX_TIMER_CONFIG_DEBUG_COLOR 0 + #define NRFX_TIMER_CONFIG_DEBUG_COLOR 0 #endif // @@ -4992,116 +4807,112 @@ // NRFX_TWIM_ENABLED - nrfx_twim - TWIM peripheral driver //========================================================== #ifndef NRFX_TWIM_ENABLED -#define NRFX_TWIM_ENABLED 1 + #define NRFX_TWIM_ENABLED 1 #endif // NRFX_TWIM0_ENABLED - Enable TWIM0 instance - #ifndef NRFX_TWIM0_ENABLED -#define NRFX_TWIM0_ENABLED 0 + #define NRFX_TWIM0_ENABLED 0 #endif // NRFX_TWIM1_ENABLED - Enable TWIM1 instance - #ifndef NRFX_TWIM1_ENABLED -#define NRFX_TWIM1_ENABLED 1 + #define NRFX_TWIM1_ENABLED 1 #endif // NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY - Frequency -// <26738688=> 100k -// <67108864=> 250k -// <104857600=> 400k +// <26738688=> 100k +// <67108864=> 250k +// <104857600=> 400k #ifndef NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY -#define NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY 26738688 + #define NRFX_TWIM_DEFAULT_CONFIG_FREQUENCY 26738688 #endif // NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT - Enables bus holding after uninit - #ifndef NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT -#define NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 + #define NRFX_TWIM_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 #endif // NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_TWIM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_TWIM_CONFIG_LOG_ENABLED -#define NRFX_TWIM_CONFIG_LOG_ENABLED 0 + #define NRFX_TWIM_CONFIG_LOG_ENABLED 0 #endif // NRFX_TWIM_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_TWIM_CONFIG_LOG_LEVEL -#define NRFX_TWIM_CONFIG_LOG_LEVEL 3 + #define NRFX_TWIM_CONFIG_LOG_LEVEL 3 #endif // NRFX_TWIM_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_TWIM_CONFIG_INFO_COLOR -#define NRFX_TWIM_CONFIG_INFO_COLOR 0 + #define NRFX_TWIM_CONFIG_INFO_COLOR 0 #endif // NRFX_TWIM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_TWIM_CONFIG_DEBUG_COLOR -#define NRFX_TWIM_CONFIG_DEBUG_COLOR 0 + #define NRFX_TWIM_CONFIG_DEBUG_COLOR 0 #endif // // NRFX_TWIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED - Enables nRF52 anomaly 109 workaround for TWIM. - // The workaround uses interrupts to wake up the CPU by catching -// the start event of zero-frequency transmission, clear the +// the start event of zero-frequency transmission, clear the // peripheral, set desired frequency, start the peripheral, and // the proper transmission. See more in the Errata document or // Anomaly 109 Addendum located at https://infocenter.nordicsemi.com/ #ifndef NRFX_TWIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED -#define NRFX_TWIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 + #define NRFX_TWIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 #endif // @@ -5109,132 +4920,131 @@ // NRFX_TWIS_ENABLED - nrfx_twis - TWIS peripheral driver //========================================================== #ifndef NRFX_TWIS_ENABLED -#define NRFX_TWIS_ENABLED 0 + #define NRFX_TWIS_ENABLED 0 #endif // NRFX_TWIS0_ENABLED - Enable TWIS0 instance - #ifndef NRFX_TWIS0_ENABLED -#define NRFX_TWIS0_ENABLED 0 + #define NRFX_TWIS0_ENABLED 0 #endif // NRFX_TWIS1_ENABLED - Enable TWIS1 instance - #ifndef NRFX_TWIS1_ENABLED -#define NRFX_TWIS1_ENABLED 0 + #define NRFX_TWIS1_ENABLED 0 #endif // NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY - Assume that any instance would be initialized only once - -// Optimization flag. Registers used by TWIS are shared by other peripherals. Normally, during initialization driver tries to clear all registers to known state before doing the initialization itself. This gives initialization safe procedure, no matter when it would be called. If you activate TWIS only once and do never uninitialize it - set this flag to 1 what gives more optimal code. +// Optimization flag. Registers used by TWIS are shared by other peripherals. Normally, during initialization driver tries to clear all +// registers to known state before doing the initialization itself. This gives initialization safe procedure, no matter when it would be +// called. If you activate TWIS only once and do never uninitialize it - set this flag to 1 what gives more optimal code. #ifndef NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY -#define NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY 0 + #define NRFX_TWIS_ASSUME_INIT_AFTER_RESET_ONLY 0 #endif // NRFX_TWIS_NO_SYNC_MODE - Remove support for synchronous mode - -// Synchronous mode would be used in specific situations. And it uses some additional code and data memory to safely process state machine by polling it in status functions. If this functionality is not required it may be disabled to free some resources. +// Synchronous mode would be used in specific situations. And it uses some additional code and data memory to safely process state +// machine by polling it in status functions. If this functionality is not required it may be disabled to free some resources. #ifndef NRFX_TWIS_NO_SYNC_MODE -#define NRFX_TWIS_NO_SYNC_MODE 0 + #define NRFX_TWIS_NO_SYNC_MODE 0 #endif -// NRFX_TWIS_DEFAULT_CONFIG_ADDR0 - Address0 +// NRFX_TWIS_DEFAULT_CONFIG_ADDR0 - Address0 #ifndef NRFX_TWIS_DEFAULT_CONFIG_ADDR0 -#define NRFX_TWIS_DEFAULT_CONFIG_ADDR0 0 + #define NRFX_TWIS_DEFAULT_CONFIG_ADDR0 0 #endif -// NRFX_TWIS_DEFAULT_CONFIG_ADDR1 - Address1 +// NRFX_TWIS_DEFAULT_CONFIG_ADDR1 - Address1 #ifndef NRFX_TWIS_DEFAULT_CONFIG_ADDR1 -#define NRFX_TWIS_DEFAULT_CONFIG_ADDR1 0 + #define NRFX_TWIS_DEFAULT_CONFIG_ADDR1 0 #endif // NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL - SCL pin pull configuration -// <0=> Disabled -// <1=> Pull down -// <3=> Pull up +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up #ifndef NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL -#define NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL 0 + #define NRFX_TWIS_DEFAULT_CONFIG_SCL_PULL 0 #endif // NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL - SDA pin pull configuration -// <0=> Disabled -// <1=> Pull down -// <3=> Pull up +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up #ifndef NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL -#define NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL 0 + #define NRFX_TWIS_DEFAULT_CONFIG_SDA_PULL 0 #endif // NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_TWIS_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_TWIS_CONFIG_LOG_ENABLED -#define NRFX_TWIS_CONFIG_LOG_ENABLED 0 + #define NRFX_TWIS_CONFIG_LOG_ENABLED 0 #endif // NRFX_TWIS_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_TWIS_CONFIG_LOG_LEVEL -#define NRFX_TWIS_CONFIG_LOG_LEVEL 3 + #define NRFX_TWIS_CONFIG_LOG_LEVEL 3 #endif // NRFX_TWIS_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_TWIS_CONFIG_INFO_COLOR -#define NRFX_TWIS_CONFIG_INFO_COLOR 0 + #define NRFX_TWIS_CONFIG_INFO_COLOR 0 #endif // NRFX_TWIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_TWIS_CONFIG_DEBUG_COLOR -#define NRFX_TWIS_CONFIG_DEBUG_COLOR 0 + #define NRFX_TWIS_CONFIG_DEBUG_COLOR 0 #endif // @@ -5244,101 +5054,98 @@ // NRFX_TWI_ENABLED - nrfx_twi - TWI peripheral driver //========================================================== #ifndef NRFX_TWI_ENABLED -#define NRFX_TWI_ENABLED 0 + #define NRFX_TWI_ENABLED 0 #endif // NRFX_TWI0_ENABLED - Enable TWI0 instance - #ifndef NRFX_TWI0_ENABLED -#define NRFX_TWI0_ENABLED 0 + #define NRFX_TWI0_ENABLED 0 #endif // NRFX_TWI1_ENABLED - Enable TWI1 instance - #ifndef NRFX_TWI1_ENABLED -#define NRFX_TWI1_ENABLED 0 + #define NRFX_TWI1_ENABLED 0 #endif // NRFX_TWI_DEFAULT_CONFIG_FREQUENCY - Frequency -// <26738688=> 100k -// <67108864=> 250k -// <104857600=> 400k +// <26738688=> 100k +// <67108864=> 250k +// <104857600=> 400k #ifndef NRFX_TWI_DEFAULT_CONFIG_FREQUENCY -#define NRFX_TWI_DEFAULT_CONFIG_FREQUENCY 26738688 + #define NRFX_TWI_DEFAULT_CONFIG_FREQUENCY 26738688 #endif // NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT - Enables bus holding after uninit - #ifndef NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT -#define NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 + #define NRFX_TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT 0 #endif // NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_TWI_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_TWI_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_TWI_CONFIG_LOG_ENABLED -#define NRFX_TWI_CONFIG_LOG_ENABLED 0 + #define NRFX_TWI_CONFIG_LOG_ENABLED 0 #endif // NRFX_TWI_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_TWI_CONFIG_LOG_LEVEL -#define NRFX_TWI_CONFIG_LOG_LEVEL 3 + #define NRFX_TWI_CONFIG_LOG_LEVEL 3 #endif // NRFX_TWI_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_TWI_CONFIG_INFO_COLOR -#define NRFX_TWI_CONFIG_INFO_COLOR 0 + #define NRFX_TWI_CONFIG_INFO_COLOR 0 #endif // NRFX_TWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_TWI_CONFIG_DEBUG_COLOR -#define NRFX_TWI_CONFIG_DEBUG_COLOR 0 + #define NRFX_TWI_CONFIG_DEBUG_COLOR 0 #endif // @@ -5348,118 +5155,118 @@ // NRFX_UARTE_ENABLED - nrfx_uarte - UARTE peripheral driver //========================================================== #ifndef NRFX_UARTE_ENABLED -#define NRFX_UARTE_ENABLED 0 + #define NRFX_UARTE_ENABLED 0 #endif -// NRFX_UARTE0_ENABLED - Enable UARTE0 instance +// NRFX_UARTE0_ENABLED - Enable UARTE0 instance #ifndef NRFX_UARTE0_ENABLED -#define NRFX_UARTE0_ENABLED 0 + #define NRFX_UARTE0_ENABLED 0 #endif // NRFX_UARTE_DEFAULT_CONFIG_HWFC - Hardware Flow Control -// <0=> Disabled -// <1=> Enabled +// <0=> Disabled +// <1=> Enabled #ifndef NRFX_UARTE_DEFAULT_CONFIG_HWFC -#define NRFX_UARTE_DEFAULT_CONFIG_HWFC 0 + #define NRFX_UARTE_DEFAULT_CONFIG_HWFC 0 #endif // NRFX_UARTE_DEFAULT_CONFIG_PARITY - Parity -// <0=> Excluded -// <14=> Included +// <0=> Excluded +// <14=> Included #ifndef NRFX_UARTE_DEFAULT_CONFIG_PARITY -#define NRFX_UARTE_DEFAULT_CONFIG_PARITY 0 + #define NRFX_UARTE_DEFAULT_CONFIG_PARITY 0 #endif // NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE - Default Baudrate -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3862528=> 14400 baud -// <5152768=> 19200 baud -// <7716864=> 28800 baud -// <8388608=> 31250 baud -// <10289152=> 38400 baud -// <15007744=> 56000 baud -// <15400960=> 57600 baud -// <20615168=> 76800 baud -// <30801920=> 115200 baud -// <61865984=> 230400 baud -// <67108864=> 250000 baud -// <121634816=> 460800 baud -// <251658240=> 921600 baud -// <268435456=> 1000000 baud +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <8388608=> 31250 baud +// <10289152=> 38400 baud +// <15007744=> 56000 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud #ifndef NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE -#define NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE 30801920 + #define NRFX_UARTE_DEFAULT_CONFIG_BAUDRATE 30801920 #endif // NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_UARTE_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_UARTE_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_UARTE_CONFIG_LOG_ENABLED -#define NRFX_UARTE_CONFIG_LOG_ENABLED 0 + #define NRFX_UARTE_CONFIG_LOG_ENABLED 0 #endif // NRFX_UARTE_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_UARTE_CONFIG_LOG_LEVEL -#define NRFX_UARTE_CONFIG_LOG_LEVEL 3 + #define NRFX_UARTE_CONFIG_LOG_LEVEL 3 #endif // NRFX_UARTE_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_UARTE_CONFIG_INFO_COLOR -#define NRFX_UARTE_CONFIG_INFO_COLOR 0 + #define NRFX_UARTE_CONFIG_INFO_COLOR 0 #endif // NRFX_UARTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_UARTE_CONFIG_DEBUG_COLOR -#define NRFX_UARTE_CONFIG_DEBUG_COLOR 0 + #define NRFX_UARTE_CONFIG_DEBUG_COLOR 0 #endif // @@ -5469,118 +5276,118 @@ // NRFX_UART_ENABLED - nrfx_uart - UART peripheral driver //========================================================== #ifndef NRFX_UART_ENABLED -#define NRFX_UART_ENABLED 0 + #define NRFX_UART_ENABLED 0 #endif -// NRFX_UART0_ENABLED - Enable UART0 instance +// NRFX_UART0_ENABLED - Enable UART0 instance #ifndef NRFX_UART0_ENABLED -#define NRFX_UART0_ENABLED 0 + #define NRFX_UART0_ENABLED 0 #endif // NRFX_UART_DEFAULT_CONFIG_HWFC - Hardware Flow Control -// <0=> Disabled -// <1=> Enabled +// <0=> Disabled +// <1=> Enabled #ifndef NRFX_UART_DEFAULT_CONFIG_HWFC -#define NRFX_UART_DEFAULT_CONFIG_HWFC 0 + #define NRFX_UART_DEFAULT_CONFIG_HWFC 0 #endif // NRFX_UART_DEFAULT_CONFIG_PARITY - Parity -// <0=> Excluded -// <14=> Included +// <0=> Excluded +// <14=> Included #ifndef NRFX_UART_DEFAULT_CONFIG_PARITY -#define NRFX_UART_DEFAULT_CONFIG_PARITY 0 + #define NRFX_UART_DEFAULT_CONFIG_PARITY 0 #endif // NRFX_UART_DEFAULT_CONFIG_BAUDRATE - Default Baudrate -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3866624=> 14400 baud -// <5152768=> 19200 baud -// <7729152=> 28800 baud -// <8388608=> 31250 baud -// <10309632=> 38400 baud -// <15007744=> 56000 baud -// <15462400=> 57600 baud -// <20615168=> 76800 baud -// <30924800=> 115200 baud -// <61845504=> 230400 baud -// <67108864=> 250000 baud -// <123695104=> 460800 baud -// <247386112=> 921600 baud -// <268435456=> 1000000 baud +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3866624=> 14400 baud +// <5152768=> 19200 baud +// <7729152=> 28800 baud +// <8388608=> 31250 baud +// <10309632=> 38400 baud +// <15007744=> 56000 baud +// <15462400=> 57600 baud +// <20615168=> 76800 baud +// <30924800=> 115200 baud +// <61845504=> 230400 baud +// <67108864=> 250000 baud +// <123695104=> 460800 baud +// <247386112=> 921600 baud +// <268435456=> 1000000 baud #ifndef NRFX_UART_DEFAULT_CONFIG_BAUDRATE -#define NRFX_UART_DEFAULT_CONFIG_BAUDRATE 30924800 + #define NRFX_UART_DEFAULT_CONFIG_BAUDRATE 30924800 #endif // NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY -#define NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_UART_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_UART_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_UART_CONFIG_LOG_ENABLED -#define NRFX_UART_CONFIG_LOG_ENABLED 0 + #define NRFX_UART_CONFIG_LOG_ENABLED 0 #endif // NRFX_UART_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_UART_CONFIG_LOG_LEVEL -#define NRFX_UART_CONFIG_LOG_LEVEL 3 + #define NRFX_UART_CONFIG_LOG_LEVEL 3 #endif // NRFX_UART_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_UART_CONFIG_INFO_COLOR -#define NRFX_UART_CONFIG_INFO_COLOR 0 + #define NRFX_UART_CONFIG_INFO_COLOR 0 #endif // NRFX_UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_UART_CONFIG_DEBUG_COLOR -#define NRFX_UART_CONFIG_DEBUG_COLOR 0 + #define NRFX_UART_CONFIG_DEBUG_COLOR 0 #endif // @@ -5590,97 +5397,96 @@ // NRFX_WDT_ENABLED - nrfx_wdt - WDT peripheral driver //========================================================== #ifndef NRFX_WDT_ENABLED -#define NRFX_WDT_ENABLED 0 + #define NRFX_WDT_ENABLED 0 #endif // NRFX_WDT_CONFIG_BEHAVIOUR - WDT behavior in CPU SLEEP or HALT mode -// <1=> Run in SLEEP, Pause in HALT -// <8=> Pause in SLEEP, Run in HALT -// <9=> Run in SLEEP and HALT -// <0=> Pause in SLEEP and HALT +// <1=> Run in SLEEP, Pause in HALT +// <8=> Pause in SLEEP, Run in HALT +// <9=> Run in SLEEP and HALT +// <0=> Pause in SLEEP and HALT #ifndef NRFX_WDT_CONFIG_BEHAVIOUR -#define NRFX_WDT_CONFIG_BEHAVIOUR 1 + #define NRFX_WDT_CONFIG_BEHAVIOUR 1 #endif -// NRFX_WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> - +// NRFX_WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> #ifndef NRFX_WDT_CONFIG_RELOAD_VALUE -#define NRFX_WDT_CONFIG_RELOAD_VALUE 2000 + #define NRFX_WDT_CONFIG_RELOAD_VALUE 2000 #endif // NRFX_WDT_CONFIG_NO_IRQ - Remove WDT IRQ handling from WDT driver -// <0=> Include WDT IRQ handling -// <1=> Remove WDT IRQ handling +// <0=> Include WDT IRQ handling +// <1=> Remove WDT IRQ handling #ifndef NRFX_WDT_CONFIG_NO_IRQ -#define NRFX_WDT_CONFIG_NO_IRQ 0 + #define NRFX_WDT_CONFIG_NO_IRQ 0 #endif // NRFX_WDT_CONFIG_IRQ_PRIORITY - Interrupt priority -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef NRFX_WDT_CONFIG_IRQ_PRIORITY -#define NRFX_WDT_CONFIG_IRQ_PRIORITY 6 + #define NRFX_WDT_CONFIG_IRQ_PRIORITY 6 #endif // NRFX_WDT_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRFX_WDT_CONFIG_LOG_ENABLED -#define NRFX_WDT_CONFIG_LOG_ENABLED 0 + #define NRFX_WDT_CONFIG_LOG_ENABLED 0 #endif // NRFX_WDT_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_WDT_CONFIG_LOG_LEVEL -#define NRFX_WDT_CONFIG_LOG_LEVEL 3 + #define NRFX_WDT_CONFIG_LOG_LEVEL 3 #endif // NRFX_WDT_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_WDT_CONFIG_INFO_COLOR -#define NRFX_WDT_CONFIG_INFO_COLOR 0 + #define NRFX_WDT_CONFIG_INFO_COLOR 0 #endif // NRFX_WDT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_WDT_CONFIG_DEBUG_COLOR -#define NRFX_WDT_CONFIG_DEBUG_COLOR 0 + #define NRFX_WDT_CONFIG_DEBUG_COLOR 0 #endif // @@ -5690,42 +5496,40 @@ // NRF_CLOCK_ENABLED - nrf_drv_clock - CLOCK peripheral driver - legacy layer //========================================================== #ifndef NRF_CLOCK_ENABLED -#define NRF_CLOCK_ENABLED 1 + #define NRF_CLOCK_ENABLED 1 #endif // CLOCK_CONFIG_LF_SRC - LF Clock Source -// <0=> RC -// <1=> XTAL -// <2=> Synth -// <131073=> External Low Swing -// <196609=> External Full Swing +// <0=> RC +// <1=> XTAL +// <2=> Synth +// <131073=> External Low Swing +// <196609=> External Full Swing #ifndef CLOCK_CONFIG_LF_SRC -#define CLOCK_CONFIG_LF_SRC 1 + #define CLOCK_CONFIG_LF_SRC 1 #endif // CLOCK_CONFIG_LF_CAL_ENABLED - Calibration enable for LF Clock Source - #ifndef CLOCK_CONFIG_LF_CAL_ENABLED -#define CLOCK_CONFIG_LF_CAL_ENABLED 0 + #define CLOCK_CONFIG_LF_CAL_ENABLED 0 #endif // CLOCK_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef CLOCK_CONFIG_IRQ_PRIORITY -#define CLOCK_CONFIG_IRQ_PRIORITY 6 + #define CLOCK_CONFIG_IRQ_PRIORITY 6 #endif // @@ -5733,51 +5537,50 @@ // PDM_ENABLED - nrf_drv_pdm - PDM peripheral driver - legacy layer //========================================================== #ifndef PDM_ENABLED -#define PDM_ENABLED 0 + #define PDM_ENABLED 0 #endif // PDM_CONFIG_MODE - Mode -// <0=> Stereo -// <1=> Mono +// <0=> Stereo +// <1=> Mono #ifndef PDM_CONFIG_MODE -#define PDM_CONFIG_MODE 1 + #define PDM_CONFIG_MODE 1 #endif // PDM_CONFIG_EDGE - Edge -// <0=> Left falling -// <1=> Left rising +// <0=> Left falling +// <1=> Left rising #ifndef PDM_CONFIG_EDGE -#define PDM_CONFIG_EDGE 0 + #define PDM_CONFIG_EDGE 0 #endif // PDM_CONFIG_CLOCK_FREQ - Clock frequency -// <134217728=> 1000k -// <138412032=> 1032k (default) -// <142606336=> 1067k +// <134217728=> 1000k +// <138412032=> 1032k (default) +// <142606336=> 1067k #ifndef PDM_CONFIG_CLOCK_FREQ -#define PDM_CONFIG_CLOCK_FREQ 138412032 + #define PDM_CONFIG_CLOCK_FREQ 138412032 #endif // PDM_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef PDM_CONFIG_IRQ_PRIORITY -#define PDM_CONFIG_IRQ_PRIORITY 6 + #define PDM_CONFIG_IRQ_PRIORITY 6 #endif // @@ -5785,170 +5588,158 @@ // POWER_ENABLED - nrf_drv_power - POWER peripheral driver - legacy layer //========================================================== #ifndef POWER_ENABLED -#define POWER_ENABLED 0 + #define POWER_ENABLED 0 #endif // POWER_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef POWER_CONFIG_IRQ_PRIORITY -#define POWER_CONFIG_IRQ_PRIORITY 6 + #define POWER_CONFIG_IRQ_PRIORITY 6 #endif // POWER_CONFIG_DEFAULT_DCDCEN - The default configuration of main DCDC regulator - // This settings means only that components for DCDC regulator are installed and it can be enabled. #ifndef POWER_CONFIG_DEFAULT_DCDCEN -#define POWER_CONFIG_DEFAULT_DCDCEN 0 + #define POWER_CONFIG_DEFAULT_DCDCEN 0 #endif // POWER_CONFIG_DEFAULT_DCDCENHV - The default configuration of High Voltage DCDC regulator - // This settings means only that components for DCDC regulator are installed and it can be enabled. #ifndef POWER_CONFIG_DEFAULT_DCDCENHV -#define POWER_CONFIG_DEFAULT_DCDCENHV 0 + #define POWER_CONFIG_DEFAULT_DCDCENHV 0 #endif // // PPI_ENABLED - nrf_drv_ppi - PPI peripheral driver - legacy layer - #ifndef PPI_ENABLED -#define PPI_ENABLED 0 + #define PPI_ENABLED 0 #endif // PWM_ENABLED - nrf_drv_pwm - PWM peripheral driver - legacy layer //========================================================== #ifndef PWM_ENABLED -#define PWM_ENABLED 0 + #define PWM_ENABLED 0 #endif -// PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> - +// PWM_DEFAULT_CONFIG_OUT0_PIN - Out0 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT0_PIN -#define PWM_DEFAULT_CONFIG_OUT0_PIN 31 + #define PWM_DEFAULT_CONFIG_OUT0_PIN 31 #endif -// PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> - +// PWM_DEFAULT_CONFIG_OUT1_PIN - Out1 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT1_PIN -#define PWM_DEFAULT_CONFIG_OUT1_PIN 31 + #define PWM_DEFAULT_CONFIG_OUT1_PIN 31 #endif -// PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> - +// PWM_DEFAULT_CONFIG_OUT2_PIN - Out2 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT2_PIN -#define PWM_DEFAULT_CONFIG_OUT2_PIN 31 + #define PWM_DEFAULT_CONFIG_OUT2_PIN 31 #endif -// PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> - +// PWM_DEFAULT_CONFIG_OUT3_PIN - Out3 pin <0-31> #ifndef PWM_DEFAULT_CONFIG_OUT3_PIN -#define PWM_DEFAULT_CONFIG_OUT3_PIN 31 + #define PWM_DEFAULT_CONFIG_OUT3_PIN 31 #endif // PWM_DEFAULT_CONFIG_BASE_CLOCK - Base clock -// <0=> 16 MHz -// <1=> 8 MHz -// <2=> 4 MHz -// <3=> 2 MHz -// <4=> 1 MHz -// <5=> 500 kHz -// <6=> 250 kHz -// <7=> 125 kHz +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz #ifndef PWM_DEFAULT_CONFIG_BASE_CLOCK -#define PWM_DEFAULT_CONFIG_BASE_CLOCK 4 + #define PWM_DEFAULT_CONFIG_BASE_CLOCK 4 #endif // PWM_DEFAULT_CONFIG_COUNT_MODE - Count mode -// <0=> Up -// <1=> Up and Down +// <0=> Up +// <1=> Up and Down #ifndef PWM_DEFAULT_CONFIG_COUNT_MODE -#define PWM_DEFAULT_CONFIG_COUNT_MODE 0 + #define PWM_DEFAULT_CONFIG_COUNT_MODE 0 #endif -// PWM_DEFAULT_CONFIG_TOP_VALUE - Top value +// PWM_DEFAULT_CONFIG_TOP_VALUE - Top value #ifndef PWM_DEFAULT_CONFIG_TOP_VALUE -#define PWM_DEFAULT_CONFIG_TOP_VALUE 1000 + #define PWM_DEFAULT_CONFIG_TOP_VALUE 1000 #endif // PWM_DEFAULT_CONFIG_LOAD_MODE - Load mode -// <0=> Common -// <1=> Grouped -// <2=> Individual -// <3=> Waveform +// <0=> Common +// <1=> Grouped +// <2=> Individual +// <3=> Waveform #ifndef PWM_DEFAULT_CONFIG_LOAD_MODE -#define PWM_DEFAULT_CONFIG_LOAD_MODE 0 + #define PWM_DEFAULT_CONFIG_LOAD_MODE 0 #endif // PWM_DEFAULT_CONFIG_STEP_MODE - Step mode -// <0=> Auto -// <1=> Triggered +// <0=> Auto +// <1=> Triggered #ifndef PWM_DEFAULT_CONFIG_STEP_MODE -#define PWM_DEFAULT_CONFIG_STEP_MODE 0 + #define PWM_DEFAULT_CONFIG_STEP_MODE 0 #endif // PWM_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef PWM_DEFAULT_CONFIG_IRQ_PRIORITY -#define PWM_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define PWM_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // PWM0_ENABLED - Enable PWM0 instance - #ifndef PWM0_ENABLED -#define PWM0_ENABLED 0 + #define PWM0_ENABLED 0 #endif // PWM1_ENABLED - Enable PWM1 instance - #ifndef PWM1_ENABLED -#define PWM1_ENABLED 0 + #define PWM1_ENABLED 0 #endif // PWM2_ENABLED - Enable PWM2 instance - #ifndef PWM2_ENABLED -#define PWM2_ENABLED 0 + #define PWM2_ENABLED 0 #endif // PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED - Enables nRF52 Anomaly 109 workaround for PWM. @@ -5962,19 +5753,19 @@ // done for the next sequence to be played. //========================================================== #ifndef PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED -#define PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 + #define PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 #endif // PWM_NRF52_ANOMALY_109_EGU_INSTANCE - EGU instance used by the nRF52 Anomaly 109 workaround for PWM. -// <0=> EGU0 -// <1=> EGU1 -// <2=> EGU2 -// <3=> EGU3 -// <4=> EGU4 -// <5=> EGU5 +// <0=> EGU0 +// <1=> EGU1 +// <2=> EGU2 +// <3=> EGU3 +// <4=> EGU4 +// <5=> EGU5 #ifndef PWM_NRF52_ANOMALY_109_EGU_INSTANCE -#define PWM_NRF52_ANOMALY_109_EGU_INSTANCE 5 + #define PWM_NRF52_ANOMALY_109_EGU_INSTANCE 5 #endif // @@ -5984,102 +5775,96 @@ // QDEC_ENABLED - nrf_drv_qdec - QDEC peripheral driver - legacy layer //========================================================== #ifndef QDEC_ENABLED -#define QDEC_ENABLED 0 + #define QDEC_ENABLED 0 #endif // QDEC_CONFIG_REPORTPER - Report period -// <0=> 10 Samples -// <1=> 40 Samples -// <2=> 80 Samples -// <3=> 120 Samples -// <4=> 160 Samples -// <5=> 200 Samples -// <6=> 240 Samples -// <7=> 280 Samples +// <0=> 10 Samples +// <1=> 40 Samples +// <2=> 80 Samples +// <3=> 120 Samples +// <4=> 160 Samples +// <5=> 200 Samples +// <6=> 240 Samples +// <7=> 280 Samples #ifndef QDEC_CONFIG_REPORTPER -#define QDEC_CONFIG_REPORTPER 0 + #define QDEC_CONFIG_REPORTPER 0 #endif // QDEC_CONFIG_SAMPLEPER - Sample period -// <0=> 128 us -// <1=> 256 us -// <2=> 512 us -// <3=> 1024 us -// <4=> 2048 us -// <5=> 4096 us -// <6=> 8192 us -// <7=> 16384 us +// <0=> 128 us +// <1=> 256 us +// <2=> 512 us +// <3=> 1024 us +// <4=> 2048 us +// <5=> 4096 us +// <6=> 8192 us +// <7=> 16384 us #ifndef QDEC_CONFIG_SAMPLEPER -#define QDEC_CONFIG_SAMPLEPER 7 + #define QDEC_CONFIG_SAMPLEPER 7 #endif -// QDEC_CONFIG_PIO_A - A pin <0-31> - +// QDEC_CONFIG_PIO_A - A pin <0-31> #ifndef QDEC_CONFIG_PIO_A -#define QDEC_CONFIG_PIO_A 31 + #define QDEC_CONFIG_PIO_A 31 #endif -// QDEC_CONFIG_PIO_B - B pin <0-31> - +// QDEC_CONFIG_PIO_B - B pin <0-31> #ifndef QDEC_CONFIG_PIO_B -#define QDEC_CONFIG_PIO_B 31 + #define QDEC_CONFIG_PIO_B 31 #endif -// QDEC_CONFIG_PIO_LED - LED pin <0-31> - +// QDEC_CONFIG_PIO_LED - LED pin <0-31> #ifndef QDEC_CONFIG_PIO_LED -#define QDEC_CONFIG_PIO_LED 31 + #define QDEC_CONFIG_PIO_LED 31 #endif -// QDEC_CONFIG_LEDPRE - LED pre +// QDEC_CONFIG_LEDPRE - LED pre #ifndef QDEC_CONFIG_LEDPRE -#define QDEC_CONFIG_LEDPRE 511 + #define QDEC_CONFIG_LEDPRE 511 #endif // QDEC_CONFIG_LEDPOL - LED polarity -// <0=> Active low -// <1=> Active high +// <0=> Active low +// <1=> Active high #ifndef QDEC_CONFIG_LEDPOL -#define QDEC_CONFIG_LEDPOL 1 + #define QDEC_CONFIG_LEDPOL 1 #endif // QDEC_CONFIG_DBFEN - Debouncing enable - #ifndef QDEC_CONFIG_DBFEN -#define QDEC_CONFIG_DBFEN 0 + #define QDEC_CONFIG_DBFEN 0 #endif // QDEC_CONFIG_SAMPLE_INTEN - Sample ready interrupt enable - #ifndef QDEC_CONFIG_SAMPLE_INTEN -#define QDEC_CONFIG_SAMPLE_INTEN 0 + #define QDEC_CONFIG_SAMPLE_INTEN 0 #endif // QDEC_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef QDEC_CONFIG_IRQ_PRIORITY -#define QDEC_CONFIG_IRQ_PRIORITY 6 + #define QDEC_CONFIG_IRQ_PRIORITY 6 #endif // @@ -6087,129 +5872,127 @@ // QSPI_ENABLED - nrf_drv_qspi - QSPI peripheral driver - legacy layer //========================================================== #ifndef QSPI_ENABLED -#define QSPI_ENABLED 0 + #define QSPI_ENABLED 0 #endif -// QSPI_CONFIG_SCK_DELAY - tSHSL, tWHSL and tSHWL in number of 16 MHz periods (62.5 ns). <0-255> - +// QSPI_CONFIG_SCK_DELAY - tSHSL, tWHSL and tSHWL in number of 16 MHz periods (62.5 ns). <0-255> #ifndef QSPI_CONFIG_SCK_DELAY -#define QSPI_CONFIG_SCK_DELAY 1 + #define QSPI_CONFIG_SCK_DELAY 1 #endif -// QSPI_CONFIG_XIP_OFFSET - Address offset in the external memory for Execute in Place operation. +// QSPI_CONFIG_XIP_OFFSET - Address offset in the external memory for Execute in Place operation. #ifndef QSPI_CONFIG_XIP_OFFSET -#define QSPI_CONFIG_XIP_OFFSET 0 + #define QSPI_CONFIG_XIP_OFFSET 0 #endif // QSPI_CONFIG_READOC - Number of data lines and opcode used for reading. -// <0=> FastRead -// <1=> Read2O -// <2=> Read2IO -// <3=> Read4O -// <4=> Read4IO +// <0=> FastRead +// <1=> Read2O +// <2=> Read2IO +// <3=> Read4O +// <4=> Read4IO #ifndef QSPI_CONFIG_READOC -#define QSPI_CONFIG_READOC 0 + #define QSPI_CONFIG_READOC 0 #endif // QSPI_CONFIG_WRITEOC - Number of data lines and opcode used for writing. -// <0=> PP -// <1=> PP2O -// <2=> PP4O -// <3=> PP4IO +// <0=> PP +// <1=> PP2O +// <2=> PP4O +// <3=> PP4IO #ifndef QSPI_CONFIG_WRITEOC -#define QSPI_CONFIG_WRITEOC 0 + #define QSPI_CONFIG_WRITEOC 0 #endif // QSPI_CONFIG_ADDRMODE - Addressing mode. -// <0=> 24bit -// <1=> 32bit +// <0=> 24bit +// <1=> 32bit #ifndef QSPI_CONFIG_ADDRMODE -#define QSPI_CONFIG_ADDRMODE 0 + #define QSPI_CONFIG_ADDRMODE 0 #endif // QSPI_CONFIG_MODE - SPI mode. -// <0=> Mode 0 -// <1=> Mode 1 +// <0=> Mode 0 +// <1=> Mode 1 #ifndef QSPI_CONFIG_MODE -#define QSPI_CONFIG_MODE 0 + #define QSPI_CONFIG_MODE 0 #endif // QSPI_CONFIG_FREQUENCY - Frequency divider. -// <0=> 32MHz/1 -// <1=> 32MHz/2 -// <2=> 32MHz/3 -// <3=> 32MHz/4 -// <4=> 32MHz/5 -// <5=> 32MHz/6 -// <6=> 32MHz/7 -// <7=> 32MHz/8 -// <8=> 32MHz/9 -// <9=> 32MHz/10 -// <10=> 32MHz/11 -// <11=> 32MHz/12 -// <12=> 32MHz/13 -// <13=> 32MHz/14 -// <14=> 32MHz/15 -// <15=> 32MHz/16 +// <0=> 32MHz/1 +// <1=> 32MHz/2 +// <2=> 32MHz/3 +// <3=> 32MHz/4 +// <4=> 32MHz/5 +// <5=> 32MHz/6 +// <6=> 32MHz/7 +// <7=> 32MHz/8 +// <8=> 32MHz/9 +// <9=> 32MHz/10 +// <10=> 32MHz/11 +// <11=> 32MHz/12 +// <12=> 32MHz/13 +// <13=> 32MHz/14 +// <14=> 32MHz/15 +// <15=> 32MHz/16 #ifndef QSPI_CONFIG_FREQUENCY -#define QSPI_CONFIG_FREQUENCY 15 + #define QSPI_CONFIG_FREQUENCY 15 #endif // QSPI_PIN_SCK - SCK pin value. #ifndef QSPI_PIN_SCK -#define QSPI_PIN_SCK NRF_QSPI_PIN_NOT_CONNECTED + #define QSPI_PIN_SCK NRF_QSPI_PIN_NOT_CONNECTED #endif // QSPI_PIN_CSN - CSN pin value. #ifndef QSPI_PIN_CSN -#define QSPI_PIN_CSN NRF_QSPI_PIN_NOT_CONNECTED + #define QSPI_PIN_CSN NRF_QSPI_PIN_NOT_CONNECTED #endif // QSPI_PIN_IO0 - IO0 pin value. #ifndef QSPI_PIN_IO0 -#define QSPI_PIN_IO0 NRF_QSPI_PIN_NOT_CONNECTED + #define QSPI_PIN_IO0 NRF_QSPI_PIN_NOT_CONNECTED #endif // QSPI_PIN_IO1 - IO1 pin value. #ifndef QSPI_PIN_IO1 -#define QSPI_PIN_IO1 NRF_QSPI_PIN_NOT_CONNECTED + #define QSPI_PIN_IO1 NRF_QSPI_PIN_NOT_CONNECTED #endif // QSPI_PIN_IO2 - IO2 pin value. #ifndef QSPI_PIN_IO2 -#define QSPI_PIN_IO2 NRF_QSPI_PIN_NOT_CONNECTED + #define QSPI_PIN_IO2 NRF_QSPI_PIN_NOT_CONNECTED #endif // QSPI_PIN_IO3 - IO3 pin value. #ifndef QSPI_PIN_IO3 -#define QSPI_PIN_IO3 NRF_QSPI_PIN_NOT_CONNECTED + #define QSPI_PIN_IO3 NRF_QSPI_PIN_NOT_CONNECTED #endif // QSPI_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef QSPI_CONFIG_IRQ_PRIORITY -#define QSPI_CONFIG_IRQ_PRIORITY 6 + #define QSPI_CONFIG_IRQ_PRIORITY 6 #endif // @@ -6217,35 +6000,33 @@ // RNG_ENABLED - nrf_drv_rng - RNG peripheral driver - legacy layer //========================================================== #ifndef RNG_ENABLED -#define RNG_ENABLED 0 + #define RNG_ENABLED 0 #endif // RNG_CONFIG_ERROR_CORRECTION - Error correction - #ifndef RNG_CONFIG_ERROR_CORRECTION -#define RNG_CONFIG_ERROR_CORRECTION 1 + #define RNG_CONFIG_ERROR_CORRECTION 1 #endif -// RNG_CONFIG_POOL_SIZE - Pool size +// RNG_CONFIG_POOL_SIZE - Pool size #ifndef RNG_CONFIG_POOL_SIZE -#define RNG_CONFIG_POOL_SIZE 64 + #define RNG_CONFIG_POOL_SIZE 64 #endif // RNG_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef RNG_CONFIG_IRQ_PRIORITY -#define RNG_CONFIG_IRQ_PRIORITY 6 + #define RNG_CONFIG_IRQ_PRIORITY 6 #endif // @@ -6253,63 +6034,57 @@ // RTC_ENABLED - nrf_drv_rtc - RTC peripheral driver - legacy layer //========================================================== #ifndef RTC_ENABLED -#define RTC_ENABLED 0 + #define RTC_ENABLED 0 #endif -// RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> - +// RTC_DEFAULT_CONFIG_FREQUENCY - Frequency <16-32768> #ifndef RTC_DEFAULT_CONFIG_FREQUENCY -#define RTC_DEFAULT_CONFIG_FREQUENCY 32768 + #define RTC_DEFAULT_CONFIG_FREQUENCY 32768 #endif // RTC_DEFAULT_CONFIG_RELIABLE - Ensures safe compare event triggering - #ifndef RTC_DEFAULT_CONFIG_RELIABLE -#define RTC_DEFAULT_CONFIG_RELIABLE 0 + #define RTC_DEFAULT_CONFIG_RELIABLE 0 #endif // RTC_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef RTC_DEFAULT_CONFIG_IRQ_PRIORITY -#define RTC_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define RTC_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // RTC0_ENABLED - Enable RTC0 instance - #ifndef RTC0_ENABLED -#define RTC0_ENABLED 0 + #define RTC0_ENABLED 0 #endif // RTC1_ENABLED - Enable RTC1 instance - #ifndef RTC1_ENABLED -#define RTC1_ENABLED 0 + #define RTC1_ENABLED 0 #endif // RTC2_ENABLED - Enable RTC2 instance - #ifndef RTC2_ENABLED -#define RTC2_ENABLED 0 + #define RTC2_ENABLED 0 #endif -// NRF_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt +// NRF_MAXIMUM_LATENCY_US - Maximum possible time[us] in highest priority interrupt #ifndef NRF_MAXIMUM_LATENCY_US -#define NRF_MAXIMUM_LATENCY_US 2000 + #define NRF_MAXIMUM_LATENCY_US 2000 #endif // @@ -6317,57 +6092,55 @@ // SAADC_ENABLED - nrf_drv_saadc - SAADC peripheral driver - legacy layer //========================================================== #ifndef SAADC_ENABLED -#define SAADC_ENABLED 1 + #define SAADC_ENABLED 1 #endif // SAADC_CONFIG_RESOLUTION - Resolution -// <0=> 8 bit -// <1=> 10 bit -// <2=> 12 bit -// <3=> 14 bit +// <0=> 8 bit +// <1=> 10 bit +// <2=> 12 bit +// <3=> 14 bit #ifndef SAADC_CONFIG_RESOLUTION -#define SAADC_CONFIG_RESOLUTION 1 + #define SAADC_CONFIG_RESOLUTION 1 #endif // SAADC_CONFIG_OVERSAMPLE - Sample period -// <0=> Disabled -// <1=> 2x -// <2=> 4x -// <3=> 8x -// <4=> 16x -// <5=> 32x -// <6=> 64x -// <7=> 128x -// <8=> 256x +// <0=> Disabled +// <1=> 2x +// <2=> 4x +// <3=> 8x +// <4=> 16x +// <5=> 32x +// <6=> 64x +// <7=> 128x +// <8=> 256x #ifndef SAADC_CONFIG_OVERSAMPLE -#define SAADC_CONFIG_OVERSAMPLE 0 + #define SAADC_CONFIG_OVERSAMPLE 0 #endif // SAADC_CONFIG_LP_MODE - Enabling low power mode - #ifndef SAADC_CONFIG_LP_MODE -#define SAADC_CONFIG_LP_MODE 0 + #define SAADC_CONFIG_LP_MODE 0 #endif // SAADC_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef SAADC_CONFIG_IRQ_PRIORITY -#define SAADC_CONFIG_IRQ_PRIORITY 6 + #define SAADC_CONFIG_IRQ_PRIORITY 6 #endif // @@ -6375,83 +6148,76 @@ // SPIS_ENABLED - nrf_drv_spis - SPIS peripheral driver - legacy layer //========================================================== #ifndef SPIS_ENABLED -#define SPIS_ENABLED 0 + #define SPIS_ENABLED 0 #endif // SPIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef SPIS_DEFAULT_CONFIG_IRQ_PRIORITY -#define SPIS_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define SPIS_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // SPIS_DEFAULT_MODE - Mode -// <0=> MODE_0 -// <1=> MODE_1 -// <2=> MODE_2 -// <3=> MODE_3 +// <0=> MODE_0 +// <1=> MODE_1 +// <2=> MODE_2 +// <3=> MODE_3 #ifndef SPIS_DEFAULT_MODE -#define SPIS_DEFAULT_MODE 0 + #define SPIS_DEFAULT_MODE 0 #endif // SPIS_DEFAULT_BIT_ORDER - SPIS default bit order -// <0=> MSB first -// <1=> LSB first +// <0=> MSB first +// <1=> LSB first #ifndef SPIS_DEFAULT_BIT_ORDER -#define SPIS_DEFAULT_BIT_ORDER 0 + #define SPIS_DEFAULT_BIT_ORDER 0 #endif -// SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> - +// SPIS_DEFAULT_DEF - SPIS default DEF character <0-255> #ifndef SPIS_DEFAULT_DEF -#define SPIS_DEFAULT_DEF 255 + #define SPIS_DEFAULT_DEF 255 #endif -// SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> - +// SPIS_DEFAULT_ORC - SPIS default ORC character <0-255> #ifndef SPIS_DEFAULT_ORC -#define SPIS_DEFAULT_ORC 255 + #define SPIS_DEFAULT_ORC 255 #endif // SPIS0_ENABLED - Enable SPIS0 instance - #ifndef SPIS0_ENABLED -#define SPIS0_ENABLED 0 + #define SPIS0_ENABLED 0 #endif // SPIS1_ENABLED - Enable SPIS1 instance - #ifndef SPIS1_ENABLED -#define SPIS1_ENABLED 0 + #define SPIS1_ENABLED 0 #endif // SPIS2_ENABLED - Enable SPIS2 instance - #ifndef SPIS2_ENABLED -#define SPIS2_ENABLED 0 + #define SPIS2_ENABLED 0 #endif // SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED - Enables nRF52 Anomaly 109 workaround for SPIS. - // The workaround uses a GPIOTE channel to generate interrupts // on falling edges detected on the CSN line. This will make // the CPU active for the moment when SPIS starts DMA transfers, @@ -6460,7 +6226,7 @@ // enabled as well. #ifndef SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED -#define SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 + #define SPIS_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 #endif // @@ -6468,45 +6234,43 @@ // SPI_ENABLED - nrf_drv_spi - SPI/SPIM peripheral driver - legacy layer //========================================================== #ifndef SPI_ENABLED -#define SPI_ENABLED 0 + #define SPI_ENABLED 0 #endif // SPI_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef SPI_DEFAULT_CONFIG_IRQ_PRIORITY -#define SPI_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define SPI_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // NRF_SPI_DRV_MISO_PULLUP_CFG - MISO PIN pull-up configuration. -// <0=> NRF_GPIO_PIN_NOPULL -// <1=> NRF_GPIO_PIN_PULLDOWN -// <3=> NRF_GPIO_PIN_PULLUP +// <0=> NRF_GPIO_PIN_NOPULL +// <1=> NRF_GPIO_PIN_PULLDOWN +// <3=> NRF_GPIO_PIN_PULLUP #ifndef NRF_SPI_DRV_MISO_PULLUP_CFG -#define NRF_SPI_DRV_MISO_PULLUP_CFG 1 + #define NRF_SPI_DRV_MISO_PULLUP_CFG 1 #endif // SPI0_ENABLED - Enable SPI0 instance //========================================================== #ifndef SPI0_ENABLED -#define SPI0_ENABLED 0 + #define SPI0_ENABLED 0 #endif // SPI0_USE_EASY_DMA - Use EasyDMA - #ifndef SPI0_USE_EASY_DMA -#define SPI0_USE_EASY_DMA 1 + #define SPI0_USE_EASY_DMA 1 #endif // @@ -6514,13 +6278,12 @@ // SPI1_ENABLED - Enable SPI1 instance //========================================================== #ifndef SPI1_ENABLED -#define SPI1_ENABLED 0 + #define SPI1_ENABLED 0 #endif // SPI1_USE_EASY_DMA - Use EasyDMA - #ifndef SPI1_USE_EASY_DMA -#define SPI1_USE_EASY_DMA 1 + #define SPI1_USE_EASY_DMA 1 #endif // @@ -6528,29 +6291,27 @@ // SPI2_ENABLED - Enable SPI2 instance //========================================================== #ifndef SPI2_ENABLED -#define SPI2_ENABLED 0 + #define SPI2_ENABLED 0 #endif // SPI2_USE_EASY_DMA - Use EasyDMA - #ifndef SPI2_USE_EASY_DMA -#define SPI2_USE_EASY_DMA 1 + #define SPI2_USE_EASY_DMA 1 #endif // // SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED - Enables nRF52 anomaly 109 workaround for SPIM. - // The workaround uses interrupts to wake up the CPU by catching -// a start event of zero-length transmission to start the clock. This +// a start event of zero-length transmission to start the clock. This // ensures that the DMA transfer will be executed without issues and -// that the proper transfer will be started. See more in the Errata -// document or Anomaly 109 Addendum located at +// that the proper transfer will be started. See more in the Errata +// document or Anomaly 109 Addendum located at // https://infocenter.nordicsemi.com/ #ifndef SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED -#define SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 + #define SPIM_NRF52_ANOMALY_109_WORKAROUND_ENABLED 0 #endif // @@ -6558,95 +6319,89 @@ // TIMER_ENABLED - nrf_drv_timer - TIMER periperal driver - legacy layer //========================================================== #ifndef TIMER_ENABLED -#define TIMER_ENABLED 0 + #define TIMER_ENABLED 0 #endif // TIMER_DEFAULT_CONFIG_FREQUENCY - Timer frequency if in Timer mode -// <0=> 16 MHz -// <1=> 8 MHz -// <2=> 4 MHz -// <3=> 2 MHz -// <4=> 1 MHz -// <5=> 500 kHz -// <6=> 250 kHz -// <7=> 125 kHz -// <8=> 62.5 kHz -// <9=> 31.25 kHz +// <0=> 16 MHz +// <1=> 8 MHz +// <2=> 4 MHz +// <3=> 2 MHz +// <4=> 1 MHz +// <5=> 500 kHz +// <6=> 250 kHz +// <7=> 125 kHz +// <8=> 62.5 kHz +// <9=> 31.25 kHz #ifndef TIMER_DEFAULT_CONFIG_FREQUENCY -#define TIMER_DEFAULT_CONFIG_FREQUENCY 0 + #define TIMER_DEFAULT_CONFIG_FREQUENCY 0 #endif // TIMER_DEFAULT_CONFIG_MODE - Timer mode or operation -// <0=> Timer -// <1=> Counter +// <0=> Timer +// <1=> Counter #ifndef TIMER_DEFAULT_CONFIG_MODE -#define TIMER_DEFAULT_CONFIG_MODE 0 + #define TIMER_DEFAULT_CONFIG_MODE 0 #endif // TIMER_DEFAULT_CONFIG_BIT_WIDTH - Timer counter bit width -// <0=> 16 bit -// <1=> 8 bit -// <2=> 24 bit -// <3=> 32 bit +// <0=> 16 bit +// <1=> 8 bit +// <2=> 24 bit +// <3=> 32 bit #ifndef TIMER_DEFAULT_CONFIG_BIT_WIDTH -#define TIMER_DEFAULT_CONFIG_BIT_WIDTH 0 + #define TIMER_DEFAULT_CONFIG_BIT_WIDTH 0 #endif // TIMER_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef TIMER_DEFAULT_CONFIG_IRQ_PRIORITY -#define TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define TIMER_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // TIMER0_ENABLED - Enable TIMER0 instance - #ifndef TIMER0_ENABLED -#define TIMER0_ENABLED 0 + #define TIMER0_ENABLED 0 #endif // TIMER1_ENABLED - Enable TIMER1 instance - #ifndef TIMER1_ENABLED -#define TIMER1_ENABLED 0 + #define TIMER1_ENABLED 0 #endif // TIMER2_ENABLED - Enable TIMER2 instance - #ifndef TIMER2_ENABLED -#define TIMER2_ENABLED 0 + #define TIMER2_ENABLED 0 #endif // TIMER3_ENABLED - Enable TIMER3 instance - #ifndef TIMER3_ENABLED -#define TIMER3_ENABLED 0 + #define TIMER3_ENABLED 0 #endif // TIMER4_ENABLED - Enable TIMER4 instance - #ifndef TIMER4_ENABLED -#define TIMER4_ENABLED 0 + #define TIMER4_ENABLED 0 #endif // @@ -6654,177 +6409,170 @@ // TWIS_ENABLED - nrf_drv_twis - TWIS peripheral driver - legacy layer //========================================================== #ifndef TWIS_ENABLED -#define TWIS_ENABLED 0 + #define TWIS_ENABLED 0 #endif // TWIS0_ENABLED - Enable TWIS0 instance - #ifndef TWIS0_ENABLED -#define TWIS0_ENABLED 0 + #define TWIS0_ENABLED 0 #endif // TWIS1_ENABLED - Enable TWIS1 instance - #ifndef TWIS1_ENABLED -#define TWIS1_ENABLED 0 + #define TWIS1_ENABLED 0 #endif // TWIS_ASSUME_INIT_AFTER_RESET_ONLY - Assume that any instance would be initialized only once - -// Optimization flag. Registers used by TWIS are shared by other peripherals. Normally, during initialization driver tries to clear all registers to known state before doing the initialization itself. This gives initialization safe procedure, no matter when it would be called. If you activate TWIS only once and do never uninitialize it - set this flag to 1 what gives more optimal code. +// Optimization flag. Registers used by TWIS are shared by other peripherals. Normally, during initialization driver tries to clear all +// registers to known state before doing the initialization itself. This gives initialization safe procedure, no matter when it would be +// called. If you activate TWIS only once and do never uninitialize it - set this flag to 1 what gives more optimal code. #ifndef TWIS_ASSUME_INIT_AFTER_RESET_ONLY -#define TWIS_ASSUME_INIT_AFTER_RESET_ONLY 0 + #define TWIS_ASSUME_INIT_AFTER_RESET_ONLY 0 #endif // TWIS_NO_SYNC_MODE - Remove support for synchronous mode - -// Synchronous mode would be used in specific situations. And it uses some additional code and data memory to safely process state machine by polling it in status functions. If this functionality is not required it may be disabled to free some resources. +// Synchronous mode would be used in specific situations. And it uses some additional code and data memory to safely process state +// machine by polling it in status functions. If this functionality is not required it may be disabled to free some resources. #ifndef TWIS_NO_SYNC_MODE -#define TWIS_NO_SYNC_MODE 0 + #define TWIS_NO_SYNC_MODE 0 #endif -// TWIS_DEFAULT_CONFIG_ADDR0 - Address0 +// TWIS_DEFAULT_CONFIG_ADDR0 - Address0 #ifndef TWIS_DEFAULT_CONFIG_ADDR0 -#define TWIS_DEFAULT_CONFIG_ADDR0 0 + #define TWIS_DEFAULT_CONFIG_ADDR0 0 #endif -// TWIS_DEFAULT_CONFIG_ADDR1 - Address1 +// TWIS_DEFAULT_CONFIG_ADDR1 - Address1 #ifndef TWIS_DEFAULT_CONFIG_ADDR1 -#define TWIS_DEFAULT_CONFIG_ADDR1 0 + #define TWIS_DEFAULT_CONFIG_ADDR1 0 #endif // TWIS_DEFAULT_CONFIG_SCL_PULL - SCL pin pull configuration -// <0=> Disabled -// <1=> Pull down -// <3=> Pull up +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up #ifndef TWIS_DEFAULT_CONFIG_SCL_PULL -#define TWIS_DEFAULT_CONFIG_SCL_PULL 0 + #define TWIS_DEFAULT_CONFIG_SCL_PULL 0 #endif // TWIS_DEFAULT_CONFIG_SDA_PULL - SDA pin pull configuration -// <0=> Disabled -// <1=> Pull down -// <3=> Pull up +// <0=> Disabled +// <1=> Pull down +// <3=> Pull up #ifndef TWIS_DEFAULT_CONFIG_SDA_PULL -#define TWIS_DEFAULT_CONFIG_SDA_PULL 0 + #define TWIS_DEFAULT_CONFIG_SDA_PULL 0 #endif // TWIS_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef TWIS_DEFAULT_CONFIG_IRQ_PRIORITY -#define TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define TWIS_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // - // UART_ENABLED - nrf_drv_uart - UART/UARTE peripheral driver - legacy layer //========================================================== #ifndef UART_ENABLED -#define UART_ENABLED 0 + #define UART_ENABLED 0 #endif // UART_DEFAULT_CONFIG_HWFC - Hardware Flow Control -// <0=> Disabled -// <1=> Enabled +// <0=> Disabled +// <1=> Enabled #ifndef UART_DEFAULT_CONFIG_HWFC -#define UART_DEFAULT_CONFIG_HWFC 0 + #define UART_DEFAULT_CONFIG_HWFC 0 #endif // UART_DEFAULT_CONFIG_PARITY - Parity -// <0=> Excluded -// <14=> Included +// <0=> Excluded +// <14=> Included #ifndef UART_DEFAULT_CONFIG_PARITY -#define UART_DEFAULT_CONFIG_PARITY 0 + #define UART_DEFAULT_CONFIG_PARITY 0 #endif // UART_DEFAULT_CONFIG_BAUDRATE - Default Baudrate -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3862528=> 14400 baud -// <5152768=> 19200 baud -// <7716864=> 28800 baud -// <10289152=> 38400 baud -// <15400960=> 57600 baud -// <20615168=> 76800 baud -// <30801920=> 115200 baud -// <61865984=> 230400 baud -// <67108864=> 250000 baud -// <121634816=> 460800 baud -// <251658240=> 921600 baud -// <268435456=> 1000000 baud +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <10289152=> 38400 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud #ifndef UART_DEFAULT_CONFIG_BAUDRATE -#define UART_DEFAULT_CONFIG_BAUDRATE 30801920 + #define UART_DEFAULT_CONFIG_BAUDRATE 30801920 #endif // UART_DEFAULT_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef UART_DEFAULT_CONFIG_IRQ_PRIORITY -#define UART_DEFAULT_CONFIG_IRQ_PRIORITY 6 + #define UART_DEFAULT_CONFIG_IRQ_PRIORITY 6 #endif // UART_EASY_DMA_SUPPORT - Driver supporting EasyDMA - #ifndef UART_EASY_DMA_SUPPORT -#define UART_EASY_DMA_SUPPORT 1 + #define UART_EASY_DMA_SUPPORT 1 #endif // UART_LEGACY_SUPPORT - Driver supporting Legacy mode - #ifndef UART_LEGACY_SUPPORT -#define UART_LEGACY_SUPPORT 1 + #define UART_LEGACY_SUPPORT 1 #endif // UART0_ENABLED - Enable UART0 instance //========================================================== #ifndef UART0_ENABLED -#define UART0_ENABLED 0 + #define UART0_ENABLED 0 #endif // UART0_CONFIG_USE_EASY_DMA - Default setting for using EasyDMA - #ifndef UART0_CONFIG_USE_EASY_DMA -#define UART0_CONFIG_USE_EASY_DMA 1 + #define UART0_CONFIG_USE_EASY_DMA 1 #endif // @@ -6834,37 +6582,35 @@ // USBD_ENABLED - nrf_drv_usbd - Software Component //========================================================== #ifndef USBD_ENABLED -#define USBD_ENABLED 0 + #define USBD_ENABLED 0 #endif // USBD_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef USBD_CONFIG_IRQ_PRIORITY -#define USBD_CONFIG_IRQ_PRIORITY 6 + #define USBD_CONFIG_IRQ_PRIORITY 6 #endif // USBD_CONFIG_DMASCHEDULER_MODE - USBD SMA scheduler working scheme -// <0=> Prioritized access -// <1=> Round Robin +// <0=> Prioritized access +// <1=> Round Robin #ifndef USBD_CONFIG_DMASCHEDULER_MODE -#define USBD_CONFIG_DMASCHEDULER_MODE 0 + #define USBD_CONFIG_DMASCHEDULER_MODE 0 #endif // USBD_CONFIG_DMASCHEDULER_ISO_BOOST - Give priority to isochronous transfers - // This option gives priority to isochronous transfers. // Enabling it assures that isochronous transfers are always processed, // even if multiple other transfers are pending. @@ -6872,17 +6618,16 @@ // function is called, so the option is independent of the algorithm chosen. #ifndef USBD_CONFIG_DMASCHEDULER_ISO_BOOST -#define USBD_CONFIG_DMASCHEDULER_ISO_BOOST 1 + #define USBD_CONFIG_DMASCHEDULER_ISO_BOOST 1 #endif // USBD_CONFIG_ISO_IN_ZLP - Respond to an IN token on ISO IN endpoint with ZLP when no data is ready - // If set, ISO IN endpoint will respond to an IN token with ZLP when no data is ready to be sent. // Else, there will be no response. #ifndef USBD_CONFIG_ISO_IN_ZLP -#define USBD_CONFIG_ISO_IN_ZLP 0 + #define USBD_CONFIG_ISO_IN_ZLP 0 #endif // @@ -6890,41 +6635,39 @@ // WDT_ENABLED - nrf_drv_wdt - WDT peripheral driver - legacy layer //========================================================== #ifndef WDT_ENABLED -#define WDT_ENABLED 0 + #define WDT_ENABLED 0 #endif // WDT_CONFIG_BEHAVIOUR - WDT behavior in CPU SLEEP or HALT mode -// <1=> Run in SLEEP, Pause in HALT -// <8=> Pause in SLEEP, Run in HALT -// <9=> Run in SLEEP and HALT -// <0=> Pause in SLEEP and HALT +// <1=> Run in SLEEP, Pause in HALT +// <8=> Pause in SLEEP, Run in HALT +// <9=> Run in SLEEP and HALT +// <0=> Pause in SLEEP and HALT #ifndef WDT_CONFIG_BEHAVIOUR -#define WDT_CONFIG_BEHAVIOUR 1 + #define WDT_CONFIG_BEHAVIOUR 1 #endif -// WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> - +// WDT_CONFIG_RELOAD_VALUE - Reload value <15-4294967295> #ifndef WDT_CONFIG_RELOAD_VALUE -#define WDT_CONFIG_RELOAD_VALUE 2000 + #define WDT_CONFIG_RELOAD_VALUE 2000 #endif // WDT_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef WDT_CONFIG_IRQ_PRIORITY -#define WDT_CONFIG_IRQ_PRIORITY 6 + #define WDT_CONFIG_IRQ_PRIORITY 6 #endif // @@ -6932,65 +6675,60 @@ // nrfx_qspi - QSPI peripheral driver //========================================================== -// +// //========================================================== // nrfx_usbd - USBD peripheral driver //========================================================== -// +// //========================================================== -// +// //========================================================== -// nRF_Drivers_External +// nRF_Drivers_External //========================================================== // NRF_TWI_SENSOR_ENABLED - nrf_twi_sensor - nRF TWI Sensor module - #ifndef NRF_TWI_SENSOR_ENABLED -#define NRF_TWI_SENSOR_ENABLED 0 + #define NRF_TWI_SENSOR_ENABLED 0 #endif -// +// //========================================================== -// nRF_Libraries +// nRF_Libraries //========================================================== // APP_GPIOTE_ENABLED - app_gpiote - GPIOTE events dispatcher - #ifndef APP_GPIOTE_ENABLED -#define APP_GPIOTE_ENABLED 1 + #define APP_GPIOTE_ENABLED 1 #endif // APP_PWM_ENABLED - app_pwm - PWM functionality - #ifndef APP_PWM_ENABLED -#define APP_PWM_ENABLED 0 + #define APP_PWM_ENABLED 0 #endif // APP_SCHEDULER_ENABLED - app_scheduler - Events scheduler //========================================================== #ifndef APP_SCHEDULER_ENABLED -#define APP_SCHEDULER_ENABLED 0 + #define APP_SCHEDULER_ENABLED 0 #endif // APP_SCHEDULER_WITH_PAUSE - Enabling pause feature - #ifndef APP_SCHEDULER_WITH_PAUSE -#define APP_SCHEDULER_WITH_PAUSE 0 + #define APP_SCHEDULER_WITH_PAUSE 0 #endif // APP_SCHEDULER_WITH_PROFILER - Enabling scheduler profiling - #ifndef APP_SCHEDULER_WITH_PROFILER -#define APP_SCHEDULER_WITH_PROFILER 0 + #define APP_SCHEDULER_WITH_PROFILER 0 #endif // @@ -6998,44 +6736,44 @@ // APP_SDCARD_ENABLED - app_sdcard - SD/MMC card support using SPI //========================================================== #ifndef APP_SDCARD_ENABLED -#define APP_SDCARD_ENABLED 0 + #define APP_SDCARD_ENABLED 0 #endif // APP_SDCARD_SPI_INSTANCE - SPI instance used -// <0=> 0 -// <1=> 1 -// <2=> 2 +// <0=> 0 +// <1=> 1 +// <2=> 2 #ifndef APP_SDCARD_SPI_INSTANCE -#define APP_SDCARD_SPI_INSTANCE 0 + #define APP_SDCARD_SPI_INSTANCE 0 #endif // APP_SDCARD_FREQ_INIT - SPI frequency -// <33554432=> 125 kHz -// <67108864=> 250 kHz -// <134217728=> 500 kHz -// <268435456=> 1 MHz -// <536870912=> 2 MHz -// <1073741824=> 4 MHz -// <2147483648=> 8 MHz +// <33554432=> 125 kHz +// <67108864=> 250 kHz +// <134217728=> 500 kHz +// <268435456=> 1 MHz +// <536870912=> 2 MHz +// <1073741824=> 4 MHz +// <2147483648=> 8 MHz #ifndef APP_SDCARD_FREQ_INIT -#define APP_SDCARD_FREQ_INIT 67108864 + #define APP_SDCARD_FREQ_INIT 67108864 #endif // APP_SDCARD_FREQ_DATA - SPI frequency -// <33554432=> 125 kHz -// <67108864=> 250 kHz -// <134217728=> 500 kHz -// <268435456=> 1 MHz -// <536870912=> 2 MHz -// <1073741824=> 4 MHz -// <2147483648=> 8 MHz +// <33554432=> 125 kHz +// <67108864=> 250 kHz +// <134217728=> 500 kHz +// <268435456=> 1 MHz +// <536870912=> 2 MHz +// <1073741824=> 4 MHz +// <2147483648=> 8 MHz #ifndef APP_SDCARD_FREQ_DATA -#define APP_SDCARD_FREQ_DATA 1073741824 + #define APP_SDCARD_FREQ_DATA 1073741824 #endif // @@ -7043,66 +6781,63 @@ // APP_TIMER_ENABLED - app_timer - Application timer functionality //========================================================== #ifndef APP_TIMER_ENABLED -#define APP_TIMER_ENABLED 1 + #define APP_TIMER_ENABLED 1 #endif // APP_TIMER_CONFIG_RTC_FREQUENCY - Configure RTC prescaler. -// <0=> 32768 Hz -// <1=> 16384 Hz -// <3=> 8192 Hz -// <7=> 4096 Hz -// <15=> 2048 Hz -// <31=> 1024 Hz +// <0=> 32768 Hz +// <1=> 16384 Hz +// <3=> 8192 Hz +// <7=> 4096 Hz +// <15=> 2048 Hz +// <31=> 1024 Hz #ifndef APP_TIMER_CONFIG_RTC_FREQUENCY -#define APP_TIMER_CONFIG_RTC_FREQUENCY 0 + #define APP_TIMER_CONFIG_RTC_FREQUENCY 0 #endif // APP_TIMER_CONFIG_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice -// <0=> 0 (highest) -// <1=> 1 -// <2=> 2 -// <3=> 3 -// <4=> 4 -// <5=> 5 -// <6=> 6 -// <7=> 7 +// <0=> 0 (highest) +// <1=> 1 +// <2=> 2 +// <3=> 3 +// <4=> 4 +// <5=> 5 +// <6=> 6 +// <7=> 7 #ifndef APP_TIMER_CONFIG_IRQ_PRIORITY -#define APP_TIMER_CONFIG_IRQ_PRIORITY 6 + #define APP_TIMER_CONFIG_IRQ_PRIORITY 6 #endif -// APP_TIMER_CONFIG_OP_QUEUE_SIZE - Capacity of timer requests queue. +// APP_TIMER_CONFIG_OP_QUEUE_SIZE - Capacity of timer requests queue. // Size of the queue depends on how many timers are used // in the system, how often timers are started and overall // system latency. If queue size is too small app_timer calls // will fail. #ifndef APP_TIMER_CONFIG_OP_QUEUE_SIZE -#define APP_TIMER_CONFIG_OP_QUEUE_SIZE 10 + #define APP_TIMER_CONFIG_OP_QUEUE_SIZE 10 #endif // APP_TIMER_CONFIG_USE_SCHEDULER - Enable scheduling app_timer events to app_scheduler - #ifndef APP_TIMER_CONFIG_USE_SCHEDULER -#define APP_TIMER_CONFIG_USE_SCHEDULER 0 + #define APP_TIMER_CONFIG_USE_SCHEDULER 0 #endif // APP_TIMER_KEEPS_RTC_ACTIVE - Enable RTC always on - // If option is enabled RTC is kept running even if there is no active timers. // This option can be used when app_timer is used for timestamping. #ifndef APP_TIMER_KEEPS_RTC_ACTIVE -#define APP_TIMER_KEEPS_RTC_ACTIVE 0 + #define APP_TIMER_KEEPS_RTC_ACTIVE 0 #endif -// APP_TIMER_SAFE_WINDOW_MS - Maximum possible latency (in milliseconds) of handling app_timer event. +// APP_TIMER_SAFE_WINDOW_MS - Maximum possible latency (in milliseconds) of handling app_timer event. // Maximum possible timeout that can be set is reduced by safe window. // Example: RTC frequency 16384 Hz, maximum possible timeout 1024 seconds - APP_TIMER_SAFE_WINDOW_MS. // Since RTC is not stopped when processor is halted in debugging session, this value @@ -7110,7 +6845,7 @@ // without corrupting app_timer behavior. #ifndef APP_TIMER_SAFE_WINDOW_MS -#define APP_TIMER_SAFE_WINDOW_MS 300000 + #define APP_TIMER_SAFE_WINDOW_MS 300000 #endif // App Timer Legacy configuration - Legacy configuration. @@ -7118,162 +6853,148 @@ //========================================================== // APP_TIMER_WITH_PROFILER - Enable app_timer profiling - #ifndef APP_TIMER_WITH_PROFILER -#define APP_TIMER_WITH_PROFILER 0 + #define APP_TIMER_WITH_PROFILER 0 #endif // APP_TIMER_CONFIG_SWI_NUMBER - Configure SWI instance used. - #ifndef APP_TIMER_CONFIG_SWI_NUMBER -#define APP_TIMER_CONFIG_SWI_NUMBER 0 + #define APP_TIMER_CONFIG_SWI_NUMBER 0 #endif -// +// //========================================================== // // APP_USBD_AUDIO_ENABLED - app_usbd_audio - USB AUDIO class - #ifndef APP_USBD_AUDIO_ENABLED -#define APP_USBD_AUDIO_ENABLED 0 + #define APP_USBD_AUDIO_ENABLED 0 #endif // APP_USBD_ENABLED - app_usbd - USB Device library //========================================================== #ifndef APP_USBD_ENABLED -#define APP_USBD_ENABLED 0 + #define APP_USBD_ENABLED 0 #endif -// APP_USBD_VID - Vendor ID. <0x0000-0xFFFF> - +// APP_USBD_VID - Vendor ID. <0x0000-0xFFFF> // Note: This value is not editable in Configuration Wizard. // Vendor ID ordered from USB IF: http://www.usb.org/developers/vendor/ #ifndef APP_USBD_VID -#define APP_USBD_VID 0 + #define APP_USBD_VID 0 #endif -// APP_USBD_PID - Product ID. <0x0000-0xFFFF> - +// APP_USBD_PID - Product ID. <0x0000-0xFFFF> // Note: This value is not editable in Configuration Wizard. // Selected Product ID #ifndef APP_USBD_PID -#define APP_USBD_PID 0 + #define APP_USBD_PID 0 #endif -// APP_USBD_DEVICE_VER_MAJOR - Device version, major part. <0-99> - +// APP_USBD_DEVICE_VER_MAJOR - Device version, major part. <0-99> // Device version, will be converted automatically to BCD notation. Use just decimal values. #ifndef APP_USBD_DEVICE_VER_MAJOR -#define APP_USBD_DEVICE_VER_MAJOR 1 + #define APP_USBD_DEVICE_VER_MAJOR 1 #endif -// APP_USBD_DEVICE_VER_MINOR - Device version, minor part. <0-99> - +// APP_USBD_DEVICE_VER_MINOR - Device version, minor part. <0-99> // Device version, will be converted automatically to BCD notation. Use just decimal values. #ifndef APP_USBD_DEVICE_VER_MINOR -#define APP_USBD_DEVICE_VER_MINOR 0 + #define APP_USBD_DEVICE_VER_MINOR 0 #endif // APP_USBD_CONFIG_SELF_POWERED - Self-powered device, as opposed to bus-powered. - #ifndef APP_USBD_CONFIG_SELF_POWERED -#define APP_USBD_CONFIG_SELF_POWERED 1 + #define APP_USBD_CONFIG_SELF_POWERED 1 #endif -// APP_USBD_CONFIG_MAX_POWER - MaxPower field in configuration descriptor in milliamps. <0-500> - +// APP_USBD_CONFIG_MAX_POWER - MaxPower field in configuration descriptor in milliamps. <0-500> #ifndef APP_USBD_CONFIG_MAX_POWER -#define APP_USBD_CONFIG_MAX_POWER 100 + #define APP_USBD_CONFIG_MAX_POWER 100 #endif // APP_USBD_CONFIG_POWER_EVENTS_PROCESS - Process power events. - // Enable processing power events in USB event handler. #ifndef APP_USBD_CONFIG_POWER_EVENTS_PROCESS -#define APP_USBD_CONFIG_POWER_EVENTS_PROCESS 1 + #define APP_USBD_CONFIG_POWER_EVENTS_PROCESS 1 #endif // APP_USBD_CONFIG_EVENT_QUEUE_ENABLE - Enable event queue. // This is the default configuration when all the events are placed into internal queue. // Disable it when an external queue is used like app_scheduler or if you wish to process all events inside interrupts. -// Processing all events from the interrupt level adds requirement not to call any functions that modifies the USBD library state from the context higher than USB interrupt context. -// Functions that modify USBD state are functions for sleep, wakeup, start, stop, enable, and disable. +// Processing all events from the interrupt level adds requirement not to call any functions that modifies the USBD library state from +// the context higher than USB interrupt context. Functions that modify USBD state are functions for sleep, wakeup, start, stop, enable, +// and disable. //========================================================== #ifndef APP_USBD_CONFIG_EVENT_QUEUE_ENABLE -#define APP_USBD_CONFIG_EVENT_QUEUE_ENABLE 1 + #define APP_USBD_CONFIG_EVENT_QUEUE_ENABLE 1 #endif -// APP_USBD_CONFIG_EVENT_QUEUE_SIZE - The size of the event queue. <16-64> - +// APP_USBD_CONFIG_EVENT_QUEUE_SIZE - The size of the event queue. <16-64> // The size of the queue for the events that would be processed in the main loop. #ifndef APP_USBD_CONFIG_EVENT_QUEUE_SIZE -#define APP_USBD_CONFIG_EVENT_QUEUE_SIZE 32 + #define APP_USBD_CONFIG_EVENT_QUEUE_SIZE 32 #endif // APP_USBD_CONFIG_SOF_HANDLING_MODE - Change SOF events handling mode. - // Normal queue - SOF events are pushed normally into the event queue. // Compress queue - SOF events are counted and binded with other events or executed when the queue is empty. // This prevents the queue from filling up with SOF events. // Interrupt - SOF events are processed in interrupt. -// <0=> Normal queue -// <1=> Compress queue -// <2=> Interrupt +// <0=> Normal queue +// <1=> Compress queue +// <2=> Interrupt #ifndef APP_USBD_CONFIG_SOF_HANDLING_MODE -#define APP_USBD_CONFIG_SOF_HANDLING_MODE 1 + #define APP_USBD_CONFIG_SOF_HANDLING_MODE 1 #endif // // APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE - Provide a function that generates timestamps for logs based on the current SOF. - -// The function app_usbd_sof_timestamp_get is implemented if the logger is enabled. -// Use it when initializing the logger. -// SOF processing is always enabled when this configuration parameter is active. -// Note: This option is configured outside of APP_USBD_CONFIG_LOG_ENABLED. -// This means that it works even if the logging in this very module is disabled. +// The function app_usbd_sof_timestamp_get is implemented if the logger is enabled. +// Use it when initializing the logger. +// SOF processing is always enabled when this configuration parameter is active. +// Note: This option is configured outside of APP_USBD_CONFIG_LOG_ENABLED. +// This means that it works even if the logging in this very module is disabled. #ifndef APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE -#define APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE 0 + #define APP_USBD_CONFIG_SOF_TIMESTAMP_PROVIDE 0 #endif -// APP_USBD_CONFIG_DESC_STRING_SIZE - Maximum size of the NULL-terminated string of the string descriptor. <31-254> - +// APP_USBD_CONFIG_DESC_STRING_SIZE - Maximum size of the NULL-terminated string of the string descriptor. <31-254> // 31 characters can be stored in the internal USB buffer used for transfers. // Any value higher than 31 creates an additional buffer just for descriptor strings. #ifndef APP_USBD_CONFIG_DESC_STRING_SIZE -#define APP_USBD_CONFIG_DESC_STRING_SIZE 31 + #define APP_USBD_CONFIG_DESC_STRING_SIZE 31 #endif // APP_USBD_CONFIG_DESC_STRING_UTF_ENABLED - Enable UTF8 conversion. - // Enable UTF8-encoded characters. In normal processing, only ASCII characters are available. #ifndef APP_USBD_CONFIG_DESC_STRING_UTF_ENABLED -#define APP_USBD_CONFIG_DESC_STRING_UTF_ENABLED 0 + #define APP_USBD_CONFIG_DESC_STRING_UTF_ENABLED 0 #endif // APP_USBD_STRINGS_LANGIDS - Supported languages identifiers. @@ -7281,7 +7002,7 @@ // Note: This value is not editable in Configuration Wizard. // Comma-separated list of supported languages. #ifndef APP_USBD_STRINGS_LANGIDS -#define APP_USBD_STRINGS_LANGIDS APP_USBD_LANG_AND_SUBLANG(APP_USBD_LANG_ENGLISH, APP_USBD_SUBLANG_ENGLISH_US) + #define APP_USBD_STRINGS_LANGIDS APP_USBD_LANG_AND_SUBLANG(APP_USBD_LANG_ENGLISH, APP_USBD_SUBLANG_ENGLISH_US) #endif // APP_USBD_STRING_ID_MANUFACTURER - Define manufacturer string ID. @@ -7289,13 +7010,13 @@ // Setting ID to 0 disables the string. //========================================================== #ifndef APP_USBD_STRING_ID_MANUFACTURER -#define APP_USBD_STRING_ID_MANUFACTURER 1 + #define APP_USBD_STRING_ID_MANUFACTURER 1 #endif -// APP_USBD_STRINGS_MANUFACTURER_EXTERN - Define whether @ref APP_USBD_STRINGS_MANUFACTURER is created by macro or declared as a global variable. - +// APP_USBD_STRINGS_MANUFACTURER_EXTERN - Define whether @ref APP_USBD_STRINGS_MANUFACTURER is created by macro or declared as a global +// variable. #ifndef APP_USBD_STRINGS_MANUFACTURER_EXTERN -#define APP_USBD_STRINGS_MANUFACTURER_EXTERN 0 + #define APP_USBD_STRINGS_MANUFACTURER_EXTERN 0 #endif // APP_USBD_STRINGS_MANUFACTURER - String descriptor for the manufacturer name. @@ -7309,7 +7030,7 @@ // Setting string to NULL disables that string. // The order of manufacturer names must be the same like in @ref APP_USBD_STRINGS_LANGIDS. #ifndef APP_USBD_STRINGS_MANUFACTURER -#define APP_USBD_STRINGS_MANUFACTURER APP_USBD_STRING_DESC("Nordic Semiconductor") + #define APP_USBD_STRINGS_MANUFACTURER APP_USBD_STRING_DESC("Nordic Semiconductor") #endif // @@ -7319,13 +7040,12 @@ // Setting ID to 0 disables the string. //========================================================== #ifndef APP_USBD_STRING_ID_PRODUCT -#define APP_USBD_STRING_ID_PRODUCT 2 + #define APP_USBD_STRING_ID_PRODUCT 2 #endif // APP_USBD_STRINGS_PRODUCT_EXTERN - Define whether @ref APP_USBD_STRINGS_PRODUCT is created by macro or declared as a global variable. - #ifndef APP_USBD_STRINGS_PRODUCT_EXTERN -#define APP_USBD_STRINGS_PRODUCT_EXTERN 0 + #define APP_USBD_STRINGS_PRODUCT_EXTERN 0 #endif // APP_USBD_STRINGS_PRODUCT - String descriptor for the product name. @@ -7333,7 +7053,7 @@ // Note: This value is not editable in Configuration Wizard. // List of product names that is defined the same way like in @ref APP_USBD_STRINGS_MANUFACTURER. #ifndef APP_USBD_STRINGS_PRODUCT -#define APP_USBD_STRINGS_PRODUCT APP_USBD_STRING_DESC("nRF52 USB Product") + #define APP_USBD_STRINGS_PRODUCT APP_USBD_STRING_DESC("nRF52 USB Product") #endif // @@ -7343,13 +7063,12 @@ // Setting ID to 0 disables the string. //========================================================== #ifndef APP_USBD_STRING_ID_SERIAL -#define APP_USBD_STRING_ID_SERIAL 3 + #define APP_USBD_STRING_ID_SERIAL 3 #endif // APP_USBD_STRING_SERIAL_EXTERN - Define whether @ref APP_USBD_STRING_SERIAL is created by macro or declared as a global variable. - #ifndef APP_USBD_STRING_SERIAL_EXTERN -#define APP_USBD_STRING_SERIAL_EXTERN 0 + #define APP_USBD_STRING_SERIAL_EXTERN 0 #endif // APP_USBD_STRING_SERIAL - String descriptor for the serial number. @@ -7357,7 +7076,7 @@ // Note: This value is not editable in Configuration Wizard. // Serial number that is defined the same way like in @ref APP_USBD_STRINGS_MANUFACTURER. #ifndef APP_USBD_STRING_SERIAL -#define APP_USBD_STRING_SERIAL APP_USBD_STRING_DESC("000000000000") + #define APP_USBD_STRING_SERIAL APP_USBD_STRING_DESC("000000000000") #endif // @@ -7367,13 +7086,13 @@ // Setting ID to 0 disables the string. //========================================================== #ifndef APP_USBD_STRING_ID_CONFIGURATION -#define APP_USBD_STRING_ID_CONFIGURATION 4 + #define APP_USBD_STRING_ID_CONFIGURATION 4 #endif -// APP_USBD_STRING_CONFIGURATION_EXTERN - Define whether @ref APP_USBD_STRINGS_CONFIGURATION is created by macro or declared as global variable. - +// APP_USBD_STRING_CONFIGURATION_EXTERN - Define whether @ref APP_USBD_STRINGS_CONFIGURATION is created by macro or declared as global +// variable. #ifndef APP_USBD_STRING_CONFIGURATION_EXTERN -#define APP_USBD_STRING_CONFIGURATION_EXTERN 0 + #define APP_USBD_STRING_CONFIGURATION_EXTERN 0 #endif // APP_USBD_STRINGS_CONFIGURATION - String descriptor for the device configuration. @@ -7381,7 +7100,7 @@ // Note: This value is not editable in Configuration Wizard. // Configuration string that is defined the same way like in @ref APP_USBD_STRINGS_MANUFACTURER. #ifndef APP_USBD_STRINGS_CONFIGURATION -#define APP_USBD_STRINGS_CONFIGURATION APP_USBD_STRING_DESC("Default configuration") + #define APP_USBD_STRINGS_CONFIGURATION APP_USBD_STRING_DESC("Default configuration") #endif // @@ -7402,7 +7121,7 @@ // Then use X(USBD_STRING_WINUSB, =0xEE, (APP_USBD_STRING_DESC(...))) // - @c ... : List of string descriptors for each defined language. #ifndef APP_USBD_STRINGS_USER -#define APP_USBD_STRINGS_USER X(APP_USER_1, , APP_USBD_STRING_DESC("User 1")) + #define APP_USBD_STRINGS_USER X(APP_USER_1, , APP_USBD_STRING_DESC("User 1")) #endif // @@ -7410,118 +7129,108 @@ // APP_USBD_HID_ENABLED - app_usbd_hid - USB HID class //========================================================== #ifndef APP_USBD_HID_ENABLED -#define APP_USBD_HID_ENABLED 0 + #define APP_USBD_HID_ENABLED 0 #endif -// APP_USBD_HID_DEFAULT_IDLE_RATE - Default idle rate for HID class. <0-255> - +// APP_USBD_HID_DEFAULT_IDLE_RATE - Default idle rate for HID class. <0-255> // 0 means indefinite duration, any other value is multiplied by 4 milliseconds. Refer to Chapter 7.2.4 of HID 1.11 Specification. #ifndef APP_USBD_HID_DEFAULT_IDLE_RATE -#define APP_USBD_HID_DEFAULT_IDLE_RATE 0 + #define APP_USBD_HID_DEFAULT_IDLE_RATE 0 #endif -// APP_USBD_HID_REPORT_IDLE_TABLE_SIZE - Size of idle rate table. <1-255> - +// APP_USBD_HID_REPORT_IDLE_TABLE_SIZE - Size of idle rate table. <1-255> // Must be higher than the highest report ID used. #ifndef APP_USBD_HID_REPORT_IDLE_TABLE_SIZE -#define APP_USBD_HID_REPORT_IDLE_TABLE_SIZE 4 + #define APP_USBD_HID_REPORT_IDLE_TABLE_SIZE 4 #endif // // APP_USBD_HID_GENERIC_ENABLED - app_usbd_hid_generic - USB HID generic - #ifndef APP_USBD_HID_GENERIC_ENABLED -#define APP_USBD_HID_GENERIC_ENABLED 0 + #define APP_USBD_HID_GENERIC_ENABLED 0 #endif // APP_USBD_HID_KBD_ENABLED - app_usbd_hid_kbd - USB HID keyboard - #ifndef APP_USBD_HID_KBD_ENABLED -#define APP_USBD_HID_KBD_ENABLED 0 + #define APP_USBD_HID_KBD_ENABLED 0 #endif // APP_USBD_HID_MOUSE_ENABLED - app_usbd_hid_mouse - USB HID mouse - #ifndef APP_USBD_HID_MOUSE_ENABLED -#define APP_USBD_HID_MOUSE_ENABLED 0 + #define APP_USBD_HID_MOUSE_ENABLED 0 #endif // APP_USBD_MSC_ENABLED - app_usbd_msc - USB MSC class - #ifndef APP_USBD_MSC_ENABLED -#define APP_USBD_MSC_ENABLED 0 + #define APP_USBD_MSC_ENABLED 0 #endif // CRC16_ENABLED - crc16 - CRC16 calculation routines - #ifndef CRC16_ENABLED -#define CRC16_ENABLED 1 + #define CRC16_ENABLED 1 #endif // CRC32_ENABLED - crc32 - CRC32 calculation routines - #ifndef CRC32_ENABLED -#define CRC32_ENABLED 0 + #define CRC32_ENABLED 0 #endif // ECC_ENABLED - ecc - Elliptic Curve Cryptography Library - #ifndef ECC_ENABLED -#define ECC_ENABLED 0 + #define ECC_ENABLED 0 #endif // FDS_ENABLED - fds - Flash data storage module //========================================================== #ifndef FDS_ENABLED -#define FDS_ENABLED 1 + #define FDS_ENABLED 1 #endif // Pages - Virtual page settings // Configure the number of virtual pages to use and their size. //========================================================== -// FDS_VIRTUAL_PAGES - Number of virtual flash pages to use. +// FDS_VIRTUAL_PAGES - Number of virtual flash pages to use. // One of the virtual pages is reserved by the system for garbage collection. // Therefore, the minimum is two virtual pages: one page to store data and one page to be used by the system for garbage collection. // The total amount of flash memory that is used by FDS amounts to @ref FDS_VIRTUAL_PAGES * @ref FDS_VIRTUAL_PAGE_SIZE * 4 bytes. #ifndef FDS_VIRTUAL_PAGES -#define FDS_VIRTUAL_PAGES 3 + #define FDS_VIRTUAL_PAGES 3 #endif // FDS_VIRTUAL_PAGE_SIZE - The size of a virtual flash page. - // Expressed in number of 4-byte words. // By default, a virtual page is the same size as a physical page. // The size of a virtual page must be a multiple of the size of a physical page. -// <1024=> 1024 -// <2048=> 2048 +// <1024=> 1024 +// <2048=> 2048 #ifndef FDS_VIRTUAL_PAGE_SIZE -#define FDS_VIRTUAL_PAGE_SIZE 1024 + #define FDS_VIRTUAL_PAGE_SIZE 1024 #endif -// FDS_VIRTUAL_PAGES_RESERVED - The number of virtual flash pages that are used by other modules. +// FDS_VIRTUAL_PAGES_RESERVED - The number of virtual flash pages that are used by other modules. // FDS module stores its data in the last pages of the flash memory. // By setting this value, you can move flash end address used by the FDS. // As a result the reserved space can be used by other modules. #ifndef FDS_VIRTUAL_PAGES_RESERVED -#define FDS_VIRTUAL_PAGES_RESERVED 0 + #define FDS_VIRTUAL_PAGES_RESERVED 0 #endif -// +// //========================================================== // Backend - Backend configuration @@ -7530,30 +7239,29 @@ //========================================================== // FDS_BACKEND - FDS flash backend. - // NRF_FSTORAGE_SD uses the nrf_fstorage_sd backend implementation using the SoftDevice API. Use this if you have a SoftDevice present. // NRF_FSTORAGE_NVMC uses the nrf_fstorage_nvmc implementation. Use this setting if you don't use the SoftDevice. -// <1=> NRF_FSTORAGE_NVMC -// <2=> NRF_FSTORAGE_SD +// <1=> NRF_FSTORAGE_NVMC +// <2=> NRF_FSTORAGE_SD #ifndef FDS_BACKEND -#define FDS_BACKEND 2 + #define FDS_BACKEND 2 #endif -// +// //========================================================== // Queue - Queue settings //========================================================== -// FDS_OP_QUEUE_SIZE - Size of the internal queue. +// FDS_OP_QUEUE_SIZE - Size of the internal queue. // Increase this value if you frequently get synchronous FDS_ERR_NO_SPACE_IN_QUEUES errors. #ifndef FDS_OP_QUEUE_SIZE -#define FDS_OP_QUEUE_SIZE 4 + #define FDS_OP_QUEUE_SIZE 4 #endif -// +// //========================================================== // CRC - CRC functionality @@ -7566,63 +7274,61 @@ // Additionally, they will not be garbage collected until they are deleted. //========================================================== #ifndef FDS_CRC_CHECK_ON_READ -#define FDS_CRC_CHECK_ON_READ 0 + #define FDS_CRC_CHECK_ON_READ 0 #endif // FDS_CRC_CHECK_ON_WRITE - Perform a CRC check on newly written records. - // Perform a CRC check on newly written records. // This setting can be used to make sure that the record data was not altered while being written to flash. -// <1=> Enabled -// <0=> Disabled +// <1=> Enabled +// <0=> Disabled #ifndef FDS_CRC_CHECK_ON_WRITE -#define FDS_CRC_CHECK_ON_WRITE 0 + #define FDS_CRC_CHECK_ON_WRITE 0 #endif // -// +// //========================================================== // Users - Number of users //========================================================== -// FDS_MAX_USERS - Maximum number of callbacks that can be registered. +// FDS_MAX_USERS - Maximum number of callbacks that can be registered. #ifndef FDS_MAX_USERS -#define FDS_MAX_USERS 4 + #define FDS_MAX_USERS 4 #endif -// +// //========================================================== // // HARDFAULT_HANDLER_ENABLED - hardfault_default - HardFault default handler for debugging and release - #ifndef HARDFAULT_HANDLER_ENABLED -#define HARDFAULT_HANDLER_ENABLED 1 + #define HARDFAULT_HANDLER_ENABLED 1 #endif // HCI_MEM_POOL_ENABLED - hci_mem_pool - memory pool implementation used by HCI //========================================================== #ifndef HCI_MEM_POOL_ENABLED -#define HCI_MEM_POOL_ENABLED 0 + #define HCI_MEM_POOL_ENABLED 0 #endif -// HCI_TX_BUF_SIZE - TX buffer size in bytes. +// HCI_TX_BUF_SIZE - TX buffer size in bytes. #ifndef HCI_TX_BUF_SIZE -#define HCI_TX_BUF_SIZE 600 + #define HCI_TX_BUF_SIZE 600 #endif -// HCI_RX_BUF_SIZE - RX buffer size in bytes. +// HCI_RX_BUF_SIZE - RX buffer size in bytes. #ifndef HCI_RX_BUF_SIZE -#define HCI_RX_BUF_SIZE 600 + #define HCI_RX_BUF_SIZE 600 #endif -// HCI_RX_BUF_QUEUE_SIZE - RX buffer queue size. +// HCI_RX_BUF_QUEUE_SIZE - RX buffer queue size. #ifndef HCI_RX_BUF_QUEUE_SIZE -#define HCI_RX_BUF_QUEUE_SIZE 4 + #define HCI_RX_BUF_QUEUE_SIZE 4 #endif // @@ -7630,58 +7336,58 @@ // HCI_SLIP_ENABLED - hci_slip - SLIP protocol implementation used by HCI //========================================================== #ifndef HCI_SLIP_ENABLED -#define HCI_SLIP_ENABLED 0 + #define HCI_SLIP_ENABLED 0 #endif // HCI_UART_BAUDRATE - Default Baudrate -// <323584=> 1200 baud -// <643072=> 2400 baud -// <1290240=> 4800 baud -// <2576384=> 9600 baud -// <3862528=> 14400 baud -// <5152768=> 19200 baud -// <7716864=> 28800 baud -// <10289152=> 38400 baud -// <15400960=> 57600 baud -// <20615168=> 76800 baud -// <30801920=> 115200 baud -// <61865984=> 230400 baud -// <67108864=> 250000 baud -// <121634816=> 460800 baud -// <251658240=> 921600 baud -// <268435456=> 1000000 baud +// <323584=> 1200 baud +// <643072=> 2400 baud +// <1290240=> 4800 baud +// <2576384=> 9600 baud +// <3862528=> 14400 baud +// <5152768=> 19200 baud +// <7716864=> 28800 baud +// <10289152=> 38400 baud +// <15400960=> 57600 baud +// <20615168=> 76800 baud +// <30801920=> 115200 baud +// <61865984=> 230400 baud +// <67108864=> 250000 baud +// <121634816=> 460800 baud +// <251658240=> 921600 baud +// <268435456=> 1000000 baud #ifndef HCI_UART_BAUDRATE -#define HCI_UART_BAUDRATE 30801920 + #define HCI_UART_BAUDRATE 30801920 #endif // HCI_UART_FLOW_CONTROL - Hardware Flow Control -// <0=> Disabled -// <1=> Enabled +// <0=> Disabled +// <1=> Enabled #ifndef HCI_UART_FLOW_CONTROL -#define HCI_UART_FLOW_CONTROL 0 + #define HCI_UART_FLOW_CONTROL 0 #endif -// HCI_UART_RX_PIN - UART RX pin +// HCI_UART_RX_PIN - UART RX pin #ifndef HCI_UART_RX_PIN -#define HCI_UART_RX_PIN 31 + #define HCI_UART_RX_PIN 31 #endif -// HCI_UART_TX_PIN - UART TX pin +// HCI_UART_TX_PIN - UART TX pin #ifndef HCI_UART_TX_PIN -#define HCI_UART_TX_PIN 31 + #define HCI_UART_TX_PIN 31 #endif -// HCI_UART_RTS_PIN - UART RTS pin +// HCI_UART_RTS_PIN - UART RTS pin #ifndef HCI_UART_RTS_PIN -#define HCI_UART_RTS_PIN 31 + #define HCI_UART_RTS_PIN 31 #endif -// HCI_UART_CTS_PIN - UART CTS pin +// HCI_UART_CTS_PIN - UART CTS pin #ifndef HCI_UART_CTS_PIN -#define HCI_UART_CTS_PIN 31 + #define HCI_UART_CTS_PIN 31 #endif // @@ -7689,188 +7395,178 @@ // HCI_TRANSPORT_ENABLED - hci_transport - HCI transport //========================================================== #ifndef HCI_TRANSPORT_ENABLED -#define HCI_TRANSPORT_ENABLED 0 + #define HCI_TRANSPORT_ENABLED 0 #endif -// HCI_MAX_PACKET_SIZE_IN_BITS - Maximum size of a single application packet in bits. +// HCI_MAX_PACKET_SIZE_IN_BITS - Maximum size of a single application packet in bits. #ifndef HCI_MAX_PACKET_SIZE_IN_BITS -#define HCI_MAX_PACKET_SIZE_IN_BITS 8000 + #define HCI_MAX_PACKET_SIZE_IN_BITS 8000 #endif // // LED_SOFTBLINK_ENABLED - led_softblink - led_softblink module - #ifndef LED_SOFTBLINK_ENABLED -#define LED_SOFTBLINK_ENABLED 0 + #define LED_SOFTBLINK_ENABLED 0 #endif // LOW_POWER_PWM_ENABLED - low_power_pwm - low_power_pwm module - #ifndef LOW_POWER_PWM_ENABLED -#define LOW_POWER_PWM_ENABLED 0 + #define LOW_POWER_PWM_ENABLED 0 #endif // MEM_MANAGER_ENABLED - mem_manager - Dynamic memory allocator //========================================================== #ifndef MEM_MANAGER_ENABLED -#define MEM_MANAGER_ENABLED 0 + #define MEM_MANAGER_ENABLED 0 #endif -// MEMORY_MANAGER_SMALL_BLOCK_COUNT - Size of each memory blocks identified as 'small' block. <0-255> - +// MEMORY_MANAGER_SMALL_BLOCK_COUNT - Size of each memory blocks identified as 'small' block. <0-255> #ifndef MEMORY_MANAGER_SMALL_BLOCK_COUNT -#define MEMORY_MANAGER_SMALL_BLOCK_COUNT 1 + #define MEMORY_MANAGER_SMALL_BLOCK_COUNT 1 #endif -// MEMORY_MANAGER_SMALL_BLOCK_SIZE - Size of each memory blocks identified as 'small' block. +// MEMORY_MANAGER_SMALL_BLOCK_SIZE - Size of each memory blocks identified as 'small' block. // Size of each memory blocks identified as 'small' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_SMALL_BLOCK_SIZE -#define MEMORY_MANAGER_SMALL_BLOCK_SIZE 32 + #define MEMORY_MANAGER_SMALL_BLOCK_SIZE 32 #endif -// MEMORY_MANAGER_MEDIUM_BLOCK_COUNT - Size of each memory blocks identified as 'medium' block. <0-255> - +// MEMORY_MANAGER_MEDIUM_BLOCK_COUNT - Size of each memory blocks identified as 'medium' block. <0-255> #ifndef MEMORY_MANAGER_MEDIUM_BLOCK_COUNT -#define MEMORY_MANAGER_MEDIUM_BLOCK_COUNT 0 + #define MEMORY_MANAGER_MEDIUM_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_MEDIUM_BLOCK_SIZE - Size of each memory blocks identified as 'medium' block. +// MEMORY_MANAGER_MEDIUM_BLOCK_SIZE - Size of each memory blocks identified as 'medium' block. // Size of each memory blocks identified as 'medium' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_MEDIUM_BLOCK_SIZE -#define MEMORY_MANAGER_MEDIUM_BLOCK_SIZE 256 + #define MEMORY_MANAGER_MEDIUM_BLOCK_SIZE 256 #endif -// MEMORY_MANAGER_LARGE_BLOCK_COUNT - Size of each memory blocks identified as 'large' block. <0-255> - +// MEMORY_MANAGER_LARGE_BLOCK_COUNT - Size of each memory blocks identified as 'large' block. <0-255> #ifndef MEMORY_MANAGER_LARGE_BLOCK_COUNT -#define MEMORY_MANAGER_LARGE_BLOCK_COUNT 0 + #define MEMORY_MANAGER_LARGE_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_LARGE_BLOCK_SIZE - Size of each memory blocks identified as 'large' block. +// MEMORY_MANAGER_LARGE_BLOCK_SIZE - Size of each memory blocks identified as 'large' block. // Size of each memory blocks identified as 'large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_LARGE_BLOCK_SIZE -#define MEMORY_MANAGER_LARGE_BLOCK_SIZE 256 + #define MEMORY_MANAGER_LARGE_BLOCK_SIZE 256 #endif -// MEMORY_MANAGER_XLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra large' block. <0-255> - +// MEMORY_MANAGER_XLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra large' block. <0-255> #ifndef MEMORY_MANAGER_XLARGE_BLOCK_COUNT -#define MEMORY_MANAGER_XLARGE_BLOCK_COUNT 0 + #define MEMORY_MANAGER_XLARGE_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra large' block. +// MEMORY_MANAGER_XLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra large' block. // Size of each memory blocks identified as 'extra large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XLARGE_BLOCK_SIZE -#define MEMORY_MANAGER_XLARGE_BLOCK_SIZE 1320 + #define MEMORY_MANAGER_XLARGE_BLOCK_SIZE 1320 #endif -// MEMORY_MANAGER_XXLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra large' block. <0-255> - +// MEMORY_MANAGER_XXLARGE_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra large' block. <0-255> #ifndef MEMORY_MANAGER_XXLARGE_BLOCK_COUNT -#define MEMORY_MANAGER_XXLARGE_BLOCK_COUNT 0 + #define MEMORY_MANAGER_XXLARGE_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XXLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra large' block. +// MEMORY_MANAGER_XXLARGE_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra large' block. // Size of each memory blocks identified as 'extra extra large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XXLARGE_BLOCK_SIZE -#define MEMORY_MANAGER_XXLARGE_BLOCK_SIZE 3444 + #define MEMORY_MANAGER_XXLARGE_BLOCK_SIZE 3444 #endif -// MEMORY_MANAGER_XSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra small' block. <0-255> - +// MEMORY_MANAGER_XSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra small' block. <0-255> #ifndef MEMORY_MANAGER_XSMALL_BLOCK_COUNT -#define MEMORY_MANAGER_XSMALL_BLOCK_COUNT 0 + #define MEMORY_MANAGER_XSMALL_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra small' block. +// MEMORY_MANAGER_XSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra small' block. // Size of each memory blocks identified as 'extra large' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XSMALL_BLOCK_SIZE -#define MEMORY_MANAGER_XSMALL_BLOCK_SIZE 64 + #define MEMORY_MANAGER_XSMALL_BLOCK_SIZE 64 #endif -// MEMORY_MANAGER_XXSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra small' block. <0-255> - +// MEMORY_MANAGER_XXSMALL_BLOCK_COUNT - Size of each memory blocks identified as 'extra extra small' block. <0-255> #ifndef MEMORY_MANAGER_XXSMALL_BLOCK_COUNT -#define MEMORY_MANAGER_XXSMALL_BLOCK_COUNT 0 + #define MEMORY_MANAGER_XXSMALL_BLOCK_COUNT 0 #endif -// MEMORY_MANAGER_XXSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra small' block. +// MEMORY_MANAGER_XXSMALL_BLOCK_SIZE - Size of each memory blocks identified as 'extra extra small' block. // Size of each memory blocks identified as 'extra extra small' block. Memory block are recommended to be word-sized. #ifndef MEMORY_MANAGER_XXSMALL_BLOCK_SIZE -#define MEMORY_MANAGER_XXSMALL_BLOCK_SIZE 32 + #define MEMORY_MANAGER_XXSMALL_BLOCK_SIZE 32 #endif // MEM_MANAGER_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef MEM_MANAGER_CONFIG_LOG_ENABLED -#define MEM_MANAGER_CONFIG_LOG_ENABLED 0 + #define MEM_MANAGER_CONFIG_LOG_ENABLED 0 #endif // MEM_MANAGER_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef MEM_MANAGER_CONFIG_LOG_LEVEL -#define MEM_MANAGER_CONFIG_LOG_LEVEL 3 + #define MEM_MANAGER_CONFIG_LOG_LEVEL 3 #endif // MEM_MANAGER_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef MEM_MANAGER_CONFIG_INFO_COLOR -#define MEM_MANAGER_CONFIG_INFO_COLOR 0 + #define MEM_MANAGER_CONFIG_INFO_COLOR 0 #endif // MEM_MANAGER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef MEM_MANAGER_CONFIG_DEBUG_COLOR -#define MEM_MANAGER_CONFIG_DEBUG_COLOR 0 + #define MEM_MANAGER_CONFIG_DEBUG_COLOR 0 #endif // // MEM_MANAGER_DISABLE_API_PARAM_CHECK - Disable API parameter checks in the module. - #ifndef MEM_MANAGER_DISABLE_API_PARAM_CHECK -#define MEM_MANAGER_DISABLE_API_PARAM_CHECK 0 + #define MEM_MANAGER_DISABLE_API_PARAM_CHECK 0 #endif // @@ -7878,53 +7574,47 @@ // NRF_BALLOC_ENABLED - nrf_balloc - Block allocator module //========================================================== #ifndef NRF_BALLOC_ENABLED -#define NRF_BALLOC_ENABLED 1 + #define NRF_BALLOC_ENABLED 1 #endif // NRF_BALLOC_CONFIG_DEBUG_ENABLED - Enables debug mode in the module. //========================================================== #ifndef NRF_BALLOC_CONFIG_DEBUG_ENABLED -#define NRF_BALLOC_CONFIG_DEBUG_ENABLED 0 + #define NRF_BALLOC_CONFIG_DEBUG_ENABLED 0 #endif -// NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS - Number of words used as head guard. <0-255> - +// NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS - Number of words used as head guard. <0-255> #ifndef NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS -#define NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS 1 + #define NRF_BALLOC_CONFIG_HEAD_GUARD_WORDS 1 #endif -// NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS - Number of words used as tail guard. <0-255> - +// NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS - Number of words used as tail guard. <0-255> #ifndef NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS -#define NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS 1 + #define NRF_BALLOC_CONFIG_TAIL_GUARD_WORDS 1 #endif // NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED - Enables basic checks in this module. - #ifndef NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED -#define NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED 0 + #define NRF_BALLOC_CONFIG_BASIC_CHECKS_ENABLED 0 #endif // NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED - Enables double memory free check in this module. - #ifndef NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED -#define NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED 0 + #define NRF_BALLOC_CONFIG_DOUBLE_FREE_CHECK_ENABLED 0 #endif // NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED - Enables free memory corruption check in this module. - #ifndef NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED -#define NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED 0 + #define NRF_BALLOC_CONFIG_DATA_TRASHING_CHECK_ENABLED 0 #endif // NRF_BALLOC_CLI_CMDS - Enable CLI commands specific to the module - #ifndef NRF_BALLOC_CLI_CMDS -#define NRF_BALLOC_CLI_CMDS 0 + #define NRF_BALLOC_CLI_CMDS 0 #endif // @@ -7934,38 +7624,38 @@ // NRF_CSENSE_ENABLED - nrf_csense - Capacitive sensor module //========================================================== #ifndef NRF_CSENSE_ENABLED -#define NRF_CSENSE_ENABLED 0 + #define NRF_CSENSE_ENABLED 0 #endif -// NRF_CSENSE_PAD_HYSTERESIS - Minimum value of change required to determine that a pad was touched. +// NRF_CSENSE_PAD_HYSTERESIS - Minimum value of change required to determine that a pad was touched. #ifndef NRF_CSENSE_PAD_HYSTERESIS -#define NRF_CSENSE_PAD_HYSTERESIS 15 + #define NRF_CSENSE_PAD_HYSTERESIS 15 #endif -// NRF_CSENSE_PAD_DEVIATION - Minimum value measured on a pad required to take it into account while calculating the step. +// NRF_CSENSE_PAD_DEVIATION - Minimum value measured on a pad required to take it into account while calculating the step. #ifndef NRF_CSENSE_PAD_DEVIATION -#define NRF_CSENSE_PAD_DEVIATION 70 + #define NRF_CSENSE_PAD_DEVIATION 70 #endif -// NRF_CSENSE_MIN_PAD_VALUE - Minimum normalized value on a pad required to take its value into account. +// NRF_CSENSE_MIN_PAD_VALUE - Minimum normalized value on a pad required to take its value into account. #ifndef NRF_CSENSE_MIN_PAD_VALUE -#define NRF_CSENSE_MIN_PAD_VALUE 20 + #define NRF_CSENSE_MIN_PAD_VALUE 20 #endif -// NRF_CSENSE_MAX_PADS_NUMBER - Maximum number of pads used for one instance. +// NRF_CSENSE_MAX_PADS_NUMBER - Maximum number of pads used for one instance. #ifndef NRF_CSENSE_MAX_PADS_NUMBER -#define NRF_CSENSE_MAX_PADS_NUMBER 20 + #define NRF_CSENSE_MAX_PADS_NUMBER 20 #endif -// NRF_CSENSE_MAX_VALUE - Maximum normalized value obtained from measurement. +// NRF_CSENSE_MAX_VALUE - Maximum normalized value obtained from measurement. #ifndef NRF_CSENSE_MAX_VALUE -#define NRF_CSENSE_MAX_VALUE 1000 + #define NRF_CSENSE_MAX_VALUE 1000 #endif -// NRF_CSENSE_OUTPUT_PIN - Output pin used by the low-level module. +// NRF_CSENSE_OUTPUT_PIN - Output pin used by the low-level module. // This is used when capacitive sensor does not use COMP. #ifndef NRF_CSENSE_OUTPUT_PIN -#define NRF_CSENSE_OUTPUT_PIN 26 + #define NRF_CSENSE_OUTPUT_PIN 26 #endif // @@ -7973,32 +7663,32 @@ // NRF_DRV_CSENSE_ENABLED - nrf_drv_csense - Capacitive sensor low-level module //========================================================== #ifndef NRF_DRV_CSENSE_ENABLED -#define NRF_DRV_CSENSE_ENABLED 0 + #define NRF_DRV_CSENSE_ENABLED 0 #endif // USE_COMP - Use the comparator to implement the capacitive sensor driver. // Due to Anomaly 84, COMP I_SOURCE is not functional. It has too high a varation. //========================================================== #ifndef USE_COMP -#define USE_COMP 0 + #define USE_COMP 0 #endif -// TIMER0_FOR_CSENSE - First TIMER instance used by the driver (not used on nRF51). +// TIMER0_FOR_CSENSE - First TIMER instance used by the driver (not used on nRF51). #ifndef TIMER0_FOR_CSENSE -#define TIMER0_FOR_CSENSE 1 + #define TIMER0_FOR_CSENSE 1 #endif -// TIMER1_FOR_CSENSE - Second TIMER instance used by the driver (not used on nRF51). +// TIMER1_FOR_CSENSE - Second TIMER instance used by the driver (not used on nRF51). #ifndef TIMER1_FOR_CSENSE -#define TIMER1_FOR_CSENSE 2 + #define TIMER1_FOR_CSENSE 2 #endif -// MEASUREMENT_PERIOD - Single measurement period. +// MEASUREMENT_PERIOD - Single measurement period. // Time of a single measurement can be calculated as // T = (1/2)*MEASUREMENT_PERIOD*(1/f_OSC) where f_OSC = I_SOURCE / (2C*(VUP-VDOWN) ). // I_SOURCE, VUP, and VDOWN are values used to initialize COMP and C is the capacitance of the used pad. #ifndef MEASUREMENT_PERIOD -#define MEASUREMENT_PERIOD 20 + #define MEASUREMENT_PERIOD 20 #endif // @@ -8008,7 +7698,7 @@ // NRF_FSTORAGE_ENABLED - nrf_fstorage - Flash abstraction library //========================================================== #ifndef NRF_FSTORAGE_ENABLED -#define NRF_FSTORAGE_ENABLED 1 + #define NRF_FSTORAGE_ENABLED 1 #endif // nrf_fstorage - Common settings @@ -8016,173 +7706,166 @@ //========================================================== // NRF_FSTORAGE_PARAM_CHECK_DISABLED - Disable user input validation - // If selected, use ASSERT to validate user input. // This effectively removes user input validation in production code. // Recommended setting: OFF, only enable this setting if size is a major concern. #ifndef NRF_FSTORAGE_PARAM_CHECK_DISABLED -#define NRF_FSTORAGE_PARAM_CHECK_DISABLED 0 + #define NRF_FSTORAGE_PARAM_CHECK_DISABLED 0 #endif -// +// //========================================================== // nrf_fstorage_sd - Implementation using the SoftDevice // Configuration options for the fstorage implementation using the SoftDevice //========================================================== -// NRF_FSTORAGE_SD_QUEUE_SIZE - Size of the internal queue of operations +// NRF_FSTORAGE_SD_QUEUE_SIZE - Size of the internal queue of operations // Increase this value if API calls frequently return the error @ref NRF_ERROR_NO_MEM. #ifndef NRF_FSTORAGE_SD_QUEUE_SIZE -#define NRF_FSTORAGE_SD_QUEUE_SIZE 4 + #define NRF_FSTORAGE_SD_QUEUE_SIZE 4 #endif -// NRF_FSTORAGE_SD_MAX_RETRIES - Maximum number of attempts at executing an operation when the SoftDevice is busy +// NRF_FSTORAGE_SD_MAX_RETRIES - Maximum number of attempts at executing an operation when the SoftDevice is busy // Increase this value if events frequently return the @ref NRF_ERROR_TIMEOUT error. // The SoftDevice might fail to schedule flash access due to high BLE activity. #ifndef NRF_FSTORAGE_SD_MAX_RETRIES -#define NRF_FSTORAGE_SD_MAX_RETRIES 8 + #define NRF_FSTORAGE_SD_MAX_RETRIES 8 #endif -// NRF_FSTORAGE_SD_MAX_WRITE_SIZE - Maximum number of bytes to be written to flash in a single operation +// NRF_FSTORAGE_SD_MAX_WRITE_SIZE - Maximum number of bytes to be written to flash in a single operation // This value must be a multiple of four. // Lowering this value can increase the chances of the SoftDevice being able to execute flash operations in between radio activity. // This value is bound by the maximum number of bytes that can be written to flash in a single call to @ref sd_flash_write. // That is 1024 bytes for nRF51 ICs and 4096 bytes for nRF52 ICs. #ifndef NRF_FSTORAGE_SD_MAX_WRITE_SIZE -#define NRF_FSTORAGE_SD_MAX_WRITE_SIZE 4096 + #define NRF_FSTORAGE_SD_MAX_WRITE_SIZE 4096 #endif -// +// //========================================================== // // NRF_GFX_ENABLED - nrf_gfx - GFX module - #ifndef NRF_GFX_ENABLED -#define NRF_GFX_ENABLED 1 + #define NRF_GFX_ENABLED 1 #endif #ifndef ST7735_ENABLED -#define ST7735_ENABLED 0 + #define ST7735_ENABLED 0 #endif // NRF_MEMOBJ_ENABLED - nrf_memobj - Linked memory allocator module - #ifndef NRF_MEMOBJ_ENABLED -#define NRF_MEMOBJ_ENABLED 1 + #define NRF_MEMOBJ_ENABLED 1 #endif // NRF_PWR_MGMT_ENABLED - nrf_pwr_mgmt - Power management module //========================================================== #ifndef NRF_PWR_MGMT_ENABLED -#define NRF_PWR_MGMT_ENABLED 0 + #define NRF_PWR_MGMT_ENABLED 0 #endif // NRF_PWR_MGMT_CONFIG_DEBUG_PIN_ENABLED - Enables pin debug in the module. // Selected pin will be set when CPU is in sleep mode. //========================================================== #ifndef NRF_PWR_MGMT_CONFIG_DEBUG_PIN_ENABLED -#define NRF_PWR_MGMT_CONFIG_DEBUG_PIN_ENABLED 0 + #define NRF_PWR_MGMT_CONFIG_DEBUG_PIN_ENABLED 0 #endif // NRF_PWR_MGMT_SLEEP_DEBUG_PIN - Pin number -// <0=> 0 (P0.0) -// <1=> 1 (P0.1) -// <2=> 2 (P0.2) -// <3=> 3 (P0.3) -// <4=> 4 (P0.4) -// <5=> 5 (P0.5) -// <6=> 6 (P0.6) -// <7=> 7 (P0.7) -// <8=> 8 (P0.8) -// <9=> 9 (P0.9) -// <10=> 10 (P0.10) -// <11=> 11 (P0.11) -// <12=> 12 (P0.12) -// <13=> 13 (P0.13) -// <14=> 14 (P0.14) -// <15=> 15 (P0.15) -// <16=> 16 (P0.16) -// <17=> 17 (P0.17) -// <18=> 18 (P0.18) -// <19=> 19 (P0.19) -// <20=> 20 (P0.20) -// <21=> 21 (P0.21) -// <22=> 22 (P0.22) -// <23=> 23 (P0.23) -// <24=> 24 (P0.24) -// <25=> 25 (P0.25) -// <26=> 26 (P0.26) -// <27=> 27 (P0.27) -// <28=> 28 (P0.28) -// <29=> 29 (P0.29) -// <30=> 30 (P0.30) -// <31=> 31 (P0.31) -// <4294967295=> Not connected +// <0=> 0 (P0.0) +// <1=> 1 (P0.1) +// <2=> 2 (P0.2) +// <3=> 3 (P0.3) +// <4=> 4 (P0.4) +// <5=> 5 (P0.5) +// <6=> 6 (P0.6) +// <7=> 7 (P0.7) +// <8=> 8 (P0.8) +// <9=> 9 (P0.9) +// <10=> 10 (P0.10) +// <11=> 11 (P0.11) +// <12=> 12 (P0.12) +// <13=> 13 (P0.13) +// <14=> 14 (P0.14) +// <15=> 15 (P0.15) +// <16=> 16 (P0.16) +// <17=> 17 (P0.17) +// <18=> 18 (P0.18) +// <19=> 19 (P0.19) +// <20=> 20 (P0.20) +// <21=> 21 (P0.21) +// <22=> 22 (P0.22) +// <23=> 23 (P0.23) +// <24=> 24 (P0.24) +// <25=> 25 (P0.25) +// <26=> 26 (P0.26) +// <27=> 27 (P0.27) +// <28=> 28 (P0.28) +// <29=> 29 (P0.29) +// <30=> 30 (P0.30) +// <31=> 31 (P0.31) +// <4294967295=> Not connected #ifndef NRF_PWR_MGMT_SLEEP_DEBUG_PIN -#define NRF_PWR_MGMT_SLEEP_DEBUG_PIN 31 + #define NRF_PWR_MGMT_SLEEP_DEBUG_PIN 31 #endif // // NRF_PWR_MGMT_CONFIG_CPU_USAGE_MONITOR_ENABLED - Enables CPU usage monitor. - // Module will trace percentage of CPU usage in one second intervals. #ifndef NRF_PWR_MGMT_CONFIG_CPU_USAGE_MONITOR_ENABLED -#define NRF_PWR_MGMT_CONFIG_CPU_USAGE_MONITOR_ENABLED 0 + #define NRF_PWR_MGMT_CONFIG_CPU_USAGE_MONITOR_ENABLED 0 #endif // NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED - Enable standby timeout. //========================================================== #ifndef NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED -#define NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED 0 + #define NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED 0 #endif -// NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S - Standby timeout (in seconds). +// NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S - Standby timeout (in seconds). // Shutdown procedure will begin no earlier than after this number of seconds. #ifndef NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S -#define NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S 3 + #define NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S 3 #endif // // NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED - Enables FPU event cleaning. - #ifndef NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED -#define NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED 0 + #define NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED 0 #endif // NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY - Blocked shutdown procedure will be retried every second. - #ifndef NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY -#define NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY 0 + #define NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY 0 #endif // NRF_PWR_MGMT_CONFIG_USE_SCHEDULER - Module will use @ref app_scheduler. - #ifndef NRF_PWR_MGMT_CONFIG_USE_SCHEDULER -#define NRF_PWR_MGMT_CONFIG_USE_SCHEDULER 0 + #define NRF_PWR_MGMT_CONFIG_USE_SCHEDULER 0 #endif -// NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT - The number of priorities for module handlers. +// NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT - The number of priorities for module handlers. // The number of stages of the shutdown process. #ifndef NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT -#define NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT 3 + #define NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT 3 #endif // @@ -8190,99 +7873,90 @@ // NRF_QUEUE_ENABLED - nrf_queue - Queue module //========================================================== #ifndef NRF_QUEUE_ENABLED -#define NRF_QUEUE_ENABLED 0 + #define NRF_QUEUE_ENABLED 0 #endif // NRF_QUEUE_CLI_CMDS - Enable CLI commands specific to the module - #ifndef NRF_QUEUE_CLI_CMDS -#define NRF_QUEUE_CLI_CMDS 0 + #define NRF_QUEUE_CLI_CMDS 0 #endif // // NRF_SECTION_ITER_ENABLED - nrf_section_iter - Section iterator - #ifndef NRF_SECTION_ITER_ENABLED -#define NRF_SECTION_ITER_ENABLED 1 + #define NRF_SECTION_ITER_ENABLED 1 #endif // NRF_SORTLIST_ENABLED - nrf_sortlist - Sorted list - #ifndef NRF_SORTLIST_ENABLED -#define NRF_SORTLIST_ENABLED 0 + #define NRF_SORTLIST_ENABLED 0 #endif // NRF_SPI_MNGR_ENABLED - nrf_spi_mngr - SPI transaction manager - #ifndef NRF_SPI_MNGR_ENABLED -#define NRF_SPI_MNGR_ENABLED 0 + #define NRF_SPI_MNGR_ENABLED 0 #endif // NRF_STRERROR_ENABLED - nrf_strerror - Library for converting error code to string. - #ifndef NRF_STRERROR_ENABLED -#define NRF_STRERROR_ENABLED 1 + #define NRF_STRERROR_ENABLED 1 #endif // NRF_TWI_MNGR_ENABLED - nrf_twi_mngr - TWI transaction manager - #ifndef NRF_TWI_MNGR_ENABLED -#define NRF_TWI_MNGR_ENABLED 0 + #define NRF_TWI_MNGR_ENABLED 0 #endif // SLIP_ENABLED - slip - SLIP encoding and decoding - #ifndef SLIP_ENABLED -#define SLIP_ENABLED 0 + #define SLIP_ENABLED 0 #endif // TASK_MANAGER_ENABLED - task_manager - Task manager. //========================================================== #ifndef TASK_MANAGER_ENABLED -#define TASK_MANAGER_ENABLED 0 + #define TASK_MANAGER_ENABLED 0 #endif // TASK_MANAGER_CLI_CMDS - Enable CLI commands specific to the module - #ifndef TASK_MANAGER_CLI_CMDS -#define TASK_MANAGER_CLI_CMDS 0 + #define TASK_MANAGER_CLI_CMDS 0 #endif -// TASK_MANAGER_CONFIG_MAX_TASKS - Maximum number of tasks which can be created +// TASK_MANAGER_CONFIG_MAX_TASKS - Maximum number of tasks which can be created #ifndef TASK_MANAGER_CONFIG_MAX_TASKS -#define TASK_MANAGER_CONFIG_MAX_TASKS 2 + #define TASK_MANAGER_CONFIG_MAX_TASKS 2 #endif -// TASK_MANAGER_CONFIG_STACK_SIZE - Stack size for every task (power of 2) +// TASK_MANAGER_CONFIG_STACK_SIZE - Stack size for every task (power of 2) #ifndef TASK_MANAGER_CONFIG_STACK_SIZE -#define TASK_MANAGER_CONFIG_STACK_SIZE 1024 + #define TASK_MANAGER_CONFIG_STACK_SIZE 1024 #endif // TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED - Enable stack profiling. - #ifndef TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED -#define TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED 1 + #define TASK_MANAGER_CONFIG_STACK_PROFILER_ENABLED 1 #endif // TASK_MANAGER_CONFIG_STACK_GUARD - Configures stack guard. -// <0=> Disabled -// <4=> 32 bytes -// <5=> 64 bytes -// <6=> 128 bytes -// <7=> 256 bytes -// <8=> 512 bytes +// <0=> Disabled +// <4=> 32 bytes +// <5=> 64 bytes +// <6=> 128 bytes +// <7=> 256 bytes +// <8=> 512 bytes #ifndef TASK_MANAGER_CONFIG_STACK_GUARD -#define TASK_MANAGER_CONFIG_STACK_GUARD 7 + #define TASK_MANAGER_CONFIG_STACK_GUARD 7 #endif // @@ -8292,19 +7966,17 @@ //========================================================== // BUTTON_ENABLED - Enables Button module - #ifndef BUTTON_ENABLED -#define BUTTON_ENABLED 1 + #define BUTTON_ENABLED 1 #endif // BUTTON_HIGH_ACCURACY_ENABLED - Enables GPIOTE high accuracy for buttons - #ifndef BUTTON_HIGH_ACCURACY_ENABLED -#define BUTTON_HIGH_ACCURACY_ENABLED 0 + #define BUTTON_HIGH_ACCURACY_ENABLED 0 #endif -// +// //========================================================== // app_usbd_cdc_acm - USB CDC ACM class @@ -8312,22 +7984,21 @@ //========================================================== // APP_USBD_CDC_ACM_ENABLED - Enabling USBD CDC ACM Class library - #ifndef APP_USBD_CDC_ACM_ENABLED -#define APP_USBD_CDC_ACM_ENABLED 0 + #define APP_USBD_CDC_ACM_ENABLED 0 #endif // APP_USBD_CDC_ACM_ZLP_ON_EPSIZE_WRITE - Send ZLP on write with same size as endpoint - // If enabled, CDC ACM class will automatically send a zero length packet after transfer which has the same size as endpoint. -// This may limit throughput if a lot of binary data is sent, but in terminal mode operation it makes sure that the data is always displayed right after it is sent. +// This may limit throughput if a lot of binary data is sent, but in terminal mode operation it makes sure that the data is always +// displayed right after it is sent. #ifndef APP_USBD_CDC_ACM_ZLP_ON_EPSIZE_WRITE -#define APP_USBD_CDC_ACM_ZLP_ON_EPSIZE_WRITE 1 + #define APP_USBD_CDC_ACM_ZLP_ON_EPSIZE_WRITE 1 #endif -// +// //========================================================== // nrf_cli - Command line interface @@ -8335,100 +8006,91 @@ //========================================================== // NRF_CLI_ENABLED - Enable/disable the CLI module. - #ifndef NRF_CLI_ENABLED -#define NRF_CLI_ENABLED 0 + #define NRF_CLI_ENABLED 0 #endif -// NRF_CLI_ARGC_MAX - Maximum number of parameters passed to the command handler. +// NRF_CLI_ARGC_MAX - Maximum number of parameters passed to the command handler. #ifndef NRF_CLI_ARGC_MAX -#define NRF_CLI_ARGC_MAX 12 + #define NRF_CLI_ARGC_MAX 12 #endif // NRF_CLI_BUILD_IN_CMDS_ENABLED - CLI built-in commands. - #ifndef NRF_CLI_BUILD_IN_CMDS_ENABLED -#define NRF_CLI_BUILD_IN_CMDS_ENABLED 1 + #define NRF_CLI_BUILD_IN_CMDS_ENABLED 1 #endif -// NRF_CLI_CMD_BUFF_SIZE - Maximum buffer size for a single command. +// NRF_CLI_CMD_BUFF_SIZE - Maximum buffer size for a single command. #ifndef NRF_CLI_CMD_BUFF_SIZE -#define NRF_CLI_CMD_BUFF_SIZE 128 + #define NRF_CLI_CMD_BUFF_SIZE 128 #endif // NRF_CLI_ECHO_STATUS - CLI echo status. If set, echo is ON. - #ifndef NRF_CLI_ECHO_STATUS -#define NRF_CLI_ECHO_STATUS 1 + #define NRF_CLI_ECHO_STATUS 1 #endif // NRF_CLI_WILDCARD_ENABLED - Enable wildcard functionality for CLI commands. - #ifndef NRF_CLI_WILDCARD_ENABLED -#define NRF_CLI_WILDCARD_ENABLED 0 + #define NRF_CLI_WILDCARD_ENABLED 0 #endif // NRF_CLI_METAKEYS_ENABLED - Enable additional control keys for CLI commands like ctrl+a, ctrl+e, ctrl+w, ctrl+u - #ifndef NRF_CLI_METAKEYS_ENABLED -#define NRF_CLI_METAKEYS_ENABLED 0 + #define NRF_CLI_METAKEYS_ENABLED 0 #endif -// NRF_CLI_PRINTF_BUFF_SIZE - Maximum print buffer size. +// NRF_CLI_PRINTF_BUFF_SIZE - Maximum print buffer size. #ifndef NRF_CLI_PRINTF_BUFF_SIZE -#define NRF_CLI_PRINTF_BUFF_SIZE 23 + #define NRF_CLI_PRINTF_BUFF_SIZE 23 #endif // NRF_CLI_HISTORY_ENABLED - Enable CLI history mode. //========================================================== #ifndef NRF_CLI_HISTORY_ENABLED -#define NRF_CLI_HISTORY_ENABLED 1 + #define NRF_CLI_HISTORY_ENABLED 1 #endif -// NRF_CLI_HISTORY_ELEMENT_SIZE - Size of one memory object reserved for CLI history. +// NRF_CLI_HISTORY_ELEMENT_SIZE - Size of one memory object reserved for CLI history. #ifndef NRF_CLI_HISTORY_ELEMENT_SIZE -#define NRF_CLI_HISTORY_ELEMENT_SIZE 32 + #define NRF_CLI_HISTORY_ELEMENT_SIZE 32 #endif -// NRF_CLI_HISTORY_ELEMENT_COUNT - Number of history memory objects. +// NRF_CLI_HISTORY_ELEMENT_COUNT - Number of history memory objects. #ifndef NRF_CLI_HISTORY_ELEMENT_COUNT -#define NRF_CLI_HISTORY_ELEMENT_COUNT 8 + #define NRF_CLI_HISTORY_ELEMENT_COUNT 8 #endif // // NRF_CLI_VT100_COLORS_ENABLED - CLI VT100 colors. - #ifndef NRF_CLI_VT100_COLORS_ENABLED -#define NRF_CLI_VT100_COLORS_ENABLED 1 + #define NRF_CLI_VT100_COLORS_ENABLED 1 #endif // NRF_CLI_STATISTICS_ENABLED - Enable CLI statistics. - #ifndef NRF_CLI_STATISTICS_ENABLED -#define NRF_CLI_STATISTICS_ENABLED 1 + #define NRF_CLI_STATISTICS_ENABLED 1 #endif // NRF_CLI_LOG_BACKEND - Enable logger backend interface. - #ifndef NRF_CLI_LOG_BACKEND -#define NRF_CLI_LOG_BACKEND 1 + #define NRF_CLI_LOG_BACKEND 1 #endif // NRF_CLI_USES_TASK_MANAGER_ENABLED - Enable CLI to use task_manager - #ifndef NRF_CLI_USES_TASK_MANAGER_ENABLED -#define NRF_CLI_USES_TASK_MANAGER_ENABLED 0 + #define NRF_CLI_USES_TASK_MANAGER_ENABLED 0 #endif -// +// //========================================================== // nrf_fprintf - fprintf function. @@ -8436,208 +8098,201 @@ //========================================================== // NRF_FPRINTF_ENABLED - Enable/disable fprintf module. - #ifndef NRF_FPRINTF_ENABLED -#define NRF_FPRINTF_ENABLED 1 + #define NRF_FPRINTF_ENABLED 1 #endif // NRF_FPRINTF_FLAG_AUTOMATIC_CR_ON_LF_ENABLED - For each printed LF, function will add CR. - #ifndef NRF_FPRINTF_FLAG_AUTOMATIC_CR_ON_LF_ENABLED -#define NRF_FPRINTF_FLAG_AUTOMATIC_CR_ON_LF_ENABLED 1 + #define NRF_FPRINTF_FLAG_AUTOMATIC_CR_ON_LF_ENABLED 1 #endif -// +// //========================================================== -// +// //========================================================== -// nRF_Log +// nRF_Log //========================================================== // NRF_LOG_ENABLED - nrf_log - Logger //========================================================== #ifndef NRF_LOG_ENABLED -#define NRF_LOG_ENABLED 0 + #define NRF_LOG_ENABLED 0 #endif #ifndef NRF_LOG_BACKEND_RTT_ENABLED -#define NRF_LOG_BACKEND_RTT_ENABLED 0 + #define NRF_LOG_BACKEND_RTT_ENABLED 0 #endif #ifndef NRF_LOG_BACKEND_SERIAL_USES_RTT -#define NRF_LOG_BACKEND_SERIAL_USES_RTT 0 + #define NRF_LOG_BACKEND_SERIAL_USES_RTT 0 #endif // Log message pool - Configuration of log message pool //========================================================== -// NRF_LOG_MSGPOOL_ELEMENT_SIZE - Size of a single element in the pool of memory objects. +// NRF_LOG_MSGPOOL_ELEMENT_SIZE - Size of a single element in the pool of memory objects. // If a small value is set, then performance of logs processing // is degraded because data is fragmented. Bigger value impacts // RAM memory utilization. The size is set to fit a message with // a timestamp and up to 2 arguments in a single memory object. #ifndef NRF_LOG_MSGPOOL_ELEMENT_SIZE -#define NRF_LOG_MSGPOOL_ELEMENT_SIZE 20 + #define NRF_LOG_MSGPOOL_ELEMENT_SIZE 20 #endif -// NRF_LOG_MSGPOOL_ELEMENT_COUNT - Number of elements in the pool of memory objects +// NRF_LOG_MSGPOOL_ELEMENT_COUNT - Number of elements in the pool of memory objects // If a small value is set, then it may lead to a deadlock // in certain cases if backend has high latency and holds // multiple messages for long time. Bigger value impacts // RAM memory usage. #ifndef NRF_LOG_MSGPOOL_ELEMENT_COUNT -#define NRF_LOG_MSGPOOL_ELEMENT_COUNT 8 + #define NRF_LOG_MSGPOOL_ELEMENT_COUNT 8 #endif -// +// //========================================================== // NRF_LOG_ALLOW_OVERFLOW - Configures behavior when circular buffer is full. - -// If set then oldest logs are overwritten. Otherwise a +// If set then oldest logs are overwritten. Otherwise a // marker is injected informing about overflow. #ifndef NRF_LOG_ALLOW_OVERFLOW -#define NRF_LOG_ALLOW_OVERFLOW 1 + #define NRF_LOG_ALLOW_OVERFLOW 1 #endif // NRF_LOG_BUFSIZE - Size of the buffer for storing logs (in bytes). - // Must be power of 2 and multiple of 4. // If NRF_LOG_DEFERRED = 0 then buffer size can be reduced to minimum. -// <128=> 128 -// <256=> 256 -// <512=> 512 -// <1024=> 1024 -// <2048=> 2048 -// <4096=> 4096 -// <8192=> 8192 -// <16384=> 16384 +// <128=> 128 +// <256=> 256 +// <512=> 512 +// <1024=> 1024 +// <2048=> 2048 +// <4096=> 4096 +// <8192=> 8192 +// <16384=> 16384 #ifndef NRF_LOG_BUFSIZE -#define NRF_LOG_BUFSIZE 1024 + #define NRF_LOG_BUFSIZE 1024 #endif // NRF_LOG_CLI_CMDS - Enable CLI commands for the module. - #ifndef NRF_LOG_CLI_CMDS -#define NRF_LOG_CLI_CMDS 0 + #define NRF_LOG_CLI_CMDS 0 #endif // NRF_LOG_DEFAULT_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_LOG_DEFAULT_LEVEL -#define NRF_LOG_DEFAULT_LEVEL 3 + #define NRF_LOG_DEFAULT_LEVEL 3 #endif // NRF_LOG_DEFERRED - Enable deffered logger. - // Log data is buffered and can be processed in idle. #ifndef NRF_LOG_DEFERRED -#define NRF_LOG_DEFERRED 1 + #define NRF_LOG_DEFERRED 1 #endif // NRF_LOG_FILTERS_ENABLED - Enable dynamic filtering of logs. - #ifndef NRF_LOG_FILTERS_ENABLED -#define NRF_LOG_FILTERS_ENABLED 0 + #define NRF_LOG_FILTERS_ENABLED 0 #endif // NRF_LOG_STR_PUSH_BUFFER_SIZE - Size of the buffer dedicated for strings stored using @ref NRF_LOG_PUSH. -// <16=> 16 -// <32=> 32 -// <64=> 64 -// <128=> 128 -// <256=> 256 -// <512=> 512 -// <1024=> 1024 +// <16=> 16 +// <32=> 32 +// <64=> 64 +// <128=> 128 +// <256=> 256 +// <512=> 512 +// <1024=> 1024 #ifndef NRF_LOG_STR_PUSH_BUFFER_SIZE -#define NRF_LOG_STR_PUSH_BUFFER_SIZE 128 + #define NRF_LOG_STR_PUSH_BUFFER_SIZE 128 #endif // NRF_LOG_STR_PUSH_BUFFER_SIZE - Size of the buffer dedicated for strings stored using @ref NRF_LOG_PUSH. -// <16=> 16 -// <32=> 32 -// <64=> 64 -// <128=> 128 -// <256=> 256 -// <512=> 512 -// <1024=> 1024 +// <16=> 16 +// <32=> 32 +// <64=> 64 +// <128=> 128 +// <256=> 256 +// <512=> 512 +// <1024=> 1024 #ifndef NRF_LOG_STR_PUSH_BUFFER_SIZE -#define NRF_LOG_STR_PUSH_BUFFER_SIZE 128 + #define NRF_LOG_STR_PUSH_BUFFER_SIZE 128 #endif // NRF_LOG_USES_COLORS - If enabled then ANSI escape code for colors is prefixed to every string //========================================================== #ifndef NRF_LOG_USES_COLORS -#define NRF_LOG_USES_COLORS 0 + #define NRF_LOG_USES_COLORS 0 #endif // NRF_LOG_COLOR_DEFAULT - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LOG_COLOR_DEFAULT -#define NRF_LOG_COLOR_DEFAULT 0 + #define NRF_LOG_COLOR_DEFAULT 0 #endif // NRF_LOG_ERROR_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LOG_ERROR_COLOR -#define NRF_LOG_ERROR_COLOR 2 + #define NRF_LOG_ERROR_COLOR 2 #endif // NRF_LOG_WARNING_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LOG_WARNING_COLOR -#define NRF_LOG_WARNING_COLOR 4 + #define NRF_LOG_WARNING_COLOR 4 #endif // @@ -8647,68 +8302,68 @@ // Function for getting the timestamp is provided by the user //========================================================== #ifndef NRF_LOG_USES_TIMESTAMP -#define NRF_LOG_USES_TIMESTAMP 0 + #define NRF_LOG_USES_TIMESTAMP 0 #endif -// NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY - Default frequency of the timestamp (in Hz) or 0 to use app_timer frequency. +// NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY - Default frequency of the timestamp (in Hz) or 0 to use app_timer frequency. #ifndef NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY -#define NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY 0 + #define NRF_LOG_TIMESTAMP_DEFAULT_FREQUENCY 0 #endif // -// nrf_log module configuration +// nrf_log module configuration //========================================================== -// nrf_log in nRF_Core +// nrf_log in nRF_Core //========================================================== // NRF_MPU_LIB_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_MPU_LIB_CONFIG_LOG_ENABLED -#define NRF_MPU_LIB_CONFIG_LOG_ENABLED 0 + #define NRF_MPU_LIB_CONFIG_LOG_ENABLED 0 #endif // NRF_MPU_LIB_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_MPU_LIB_CONFIG_LOG_LEVEL -#define NRF_MPU_LIB_CONFIG_LOG_LEVEL 3 + #define NRF_MPU_LIB_CONFIG_LOG_LEVEL 3 #endif // NRF_MPU_LIB_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MPU_LIB_CONFIG_INFO_COLOR -#define NRF_MPU_LIB_CONFIG_INFO_COLOR 0 + #define NRF_MPU_LIB_CONFIG_INFO_COLOR 0 #endif // NRF_MPU_LIB_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MPU_LIB_CONFIG_DEBUG_COLOR -#define NRF_MPU_LIB_CONFIG_DEBUG_COLOR 0 + #define NRF_MPU_LIB_CONFIG_DEBUG_COLOR 0 #endif // @@ -8716,50 +8371,50 @@ // NRF_STACK_GUARD_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_STACK_GUARD_CONFIG_LOG_ENABLED -#define NRF_STACK_GUARD_CONFIG_LOG_ENABLED 0 + #define NRF_STACK_GUARD_CONFIG_LOG_ENABLED 0 #endif // NRF_STACK_GUARD_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_STACK_GUARD_CONFIG_LOG_LEVEL -#define NRF_STACK_GUARD_CONFIG_LOG_LEVEL 3 + #define NRF_STACK_GUARD_CONFIG_LOG_LEVEL 3 #endif // NRF_STACK_GUARD_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_STACK_GUARD_CONFIG_INFO_COLOR -#define NRF_STACK_GUARD_CONFIG_INFO_COLOR 0 + #define NRF_STACK_GUARD_CONFIG_INFO_COLOR 0 #endif // NRF_STACK_GUARD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_STACK_GUARD_CONFIG_DEBUG_COLOR -#define NRF_STACK_GUARD_CONFIG_DEBUG_COLOR 0 + #define NRF_STACK_GUARD_CONFIG_DEBUG_COLOR 0 #endif // @@ -8767,107 +8422,107 @@ // TASK_MANAGER_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef TASK_MANAGER_CONFIG_LOG_ENABLED -#define TASK_MANAGER_CONFIG_LOG_ENABLED 0 + #define TASK_MANAGER_CONFIG_LOG_ENABLED 0 #endif // TASK_MANAGER_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TASK_MANAGER_CONFIG_LOG_LEVEL -#define TASK_MANAGER_CONFIG_LOG_LEVEL 3 + #define TASK_MANAGER_CONFIG_LOG_LEVEL 3 #endif // TASK_MANAGER_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TASK_MANAGER_CONFIG_INFO_COLOR -#define TASK_MANAGER_CONFIG_INFO_COLOR 0 + #define TASK_MANAGER_CONFIG_INFO_COLOR 0 #endif // TASK_MANAGER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TASK_MANAGER_CONFIG_DEBUG_COLOR -#define TASK_MANAGER_CONFIG_DEBUG_COLOR 0 + #define TASK_MANAGER_CONFIG_DEBUG_COLOR 0 #endif // -// +// //========================================================== -// nrf_log in nRF_Drivers +// nrf_log in nRF_Drivers //========================================================== // CLOCK_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef CLOCK_CONFIG_LOG_ENABLED -#define CLOCK_CONFIG_LOG_ENABLED 0 + #define CLOCK_CONFIG_LOG_ENABLED 0 #endif // CLOCK_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef CLOCK_CONFIG_LOG_LEVEL -#define CLOCK_CONFIG_LOG_LEVEL 3 + #define CLOCK_CONFIG_LOG_LEVEL 3 #endif // CLOCK_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef CLOCK_CONFIG_INFO_COLOR -#define CLOCK_CONFIG_INFO_COLOR 0 + #define CLOCK_CONFIG_INFO_COLOR 0 #endif // CLOCK_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef CLOCK_CONFIG_DEBUG_COLOR -#define CLOCK_CONFIG_DEBUG_COLOR 0 + #define CLOCK_CONFIG_DEBUG_COLOR 0 #endif // @@ -8875,50 +8530,50 @@ // COMP_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef COMP_CONFIG_LOG_ENABLED -#define COMP_CONFIG_LOG_ENABLED 0 + #define COMP_CONFIG_LOG_ENABLED 0 #endif // COMP_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef COMP_CONFIG_LOG_LEVEL -#define COMP_CONFIG_LOG_LEVEL 3 + #define COMP_CONFIG_LOG_LEVEL 3 #endif // COMP_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef COMP_CONFIG_INFO_COLOR -#define COMP_CONFIG_INFO_COLOR 0 + #define COMP_CONFIG_INFO_COLOR 0 #endif // COMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef COMP_CONFIG_DEBUG_COLOR -#define COMP_CONFIG_DEBUG_COLOR 0 + #define COMP_CONFIG_DEBUG_COLOR 0 #endif // @@ -8926,50 +8581,50 @@ // GPIOTE_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef GPIOTE_CONFIG_LOG_ENABLED -#define GPIOTE_CONFIG_LOG_ENABLED 0 + #define GPIOTE_CONFIG_LOG_ENABLED 0 #endif // GPIOTE_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef GPIOTE_CONFIG_LOG_LEVEL -#define GPIOTE_CONFIG_LOG_LEVEL 3 + #define GPIOTE_CONFIG_LOG_LEVEL 3 #endif // GPIOTE_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef GPIOTE_CONFIG_INFO_COLOR -#define GPIOTE_CONFIG_INFO_COLOR 0 + #define GPIOTE_CONFIG_INFO_COLOR 0 #endif // GPIOTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef GPIOTE_CONFIG_DEBUG_COLOR -#define GPIOTE_CONFIG_DEBUG_COLOR 0 + #define GPIOTE_CONFIG_DEBUG_COLOR 0 #endif // @@ -8977,50 +8632,50 @@ // LPCOMP_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef LPCOMP_CONFIG_LOG_ENABLED -#define LPCOMP_CONFIG_LOG_ENABLED 0 + #define LPCOMP_CONFIG_LOG_ENABLED 0 #endif // LPCOMP_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef LPCOMP_CONFIG_LOG_LEVEL -#define LPCOMP_CONFIG_LOG_LEVEL 3 + #define LPCOMP_CONFIG_LOG_LEVEL 3 #endif // LPCOMP_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef LPCOMP_CONFIG_INFO_COLOR -#define LPCOMP_CONFIG_INFO_COLOR 0 + #define LPCOMP_CONFIG_INFO_COLOR 0 #endif // LPCOMP_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef LPCOMP_CONFIG_DEBUG_COLOR -#define LPCOMP_CONFIG_DEBUG_COLOR 0 + #define LPCOMP_CONFIG_DEBUG_COLOR 0 #endif // @@ -9028,50 +8683,50 @@ // MAX3421E_HOST_CONFIG_LOG_ENABLED - Enable logging in the module //========================================================== #ifndef MAX3421E_HOST_CONFIG_LOG_ENABLED -#define MAX3421E_HOST_CONFIG_LOG_ENABLED 0 + #define MAX3421E_HOST_CONFIG_LOG_ENABLED 0 #endif // MAX3421E_HOST_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef MAX3421E_HOST_CONFIG_LOG_LEVEL -#define MAX3421E_HOST_CONFIG_LOG_LEVEL 3 + #define MAX3421E_HOST_CONFIG_LOG_LEVEL 3 #endif // MAX3421E_HOST_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef MAX3421E_HOST_CONFIG_INFO_COLOR -#define MAX3421E_HOST_CONFIG_INFO_COLOR 0 + #define MAX3421E_HOST_CONFIG_INFO_COLOR 0 #endif // MAX3421E_HOST_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef MAX3421E_HOST_CONFIG_DEBUG_COLOR -#define MAX3421E_HOST_CONFIG_DEBUG_COLOR 0 + #define MAX3421E_HOST_CONFIG_DEBUG_COLOR 0 #endif // @@ -9079,50 +8734,50 @@ // NRFX_USBD_CONFIG_LOG_ENABLED - Enable logging in the module //========================================================== #ifndef NRFX_USBD_CONFIG_LOG_ENABLED -#define NRFX_USBD_CONFIG_LOG_ENABLED 0 + #define NRFX_USBD_CONFIG_LOG_ENABLED 0 #endif // NRFX_USBD_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRFX_USBD_CONFIG_LOG_LEVEL -#define NRFX_USBD_CONFIG_LOG_LEVEL 3 + #define NRFX_USBD_CONFIG_LOG_LEVEL 3 #endif // NRFX_USBD_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_USBD_CONFIG_INFO_COLOR -#define NRFX_USBD_CONFIG_INFO_COLOR 0 + #define NRFX_USBD_CONFIG_INFO_COLOR 0 #endif // NRFX_USBD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRFX_USBD_CONFIG_DEBUG_COLOR -#define NRFX_USBD_CONFIG_DEBUG_COLOR 0 + #define NRFX_USBD_CONFIG_DEBUG_COLOR 0 #endif // @@ -9130,50 +8785,50 @@ // PDM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef PDM_CONFIG_LOG_ENABLED -#define PDM_CONFIG_LOG_ENABLED 0 + #define PDM_CONFIG_LOG_ENABLED 0 #endif // PDM_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PDM_CONFIG_LOG_LEVEL -#define PDM_CONFIG_LOG_LEVEL 3 + #define PDM_CONFIG_LOG_LEVEL 3 #endif // PDM_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PDM_CONFIG_INFO_COLOR -#define PDM_CONFIG_INFO_COLOR 0 + #define PDM_CONFIG_INFO_COLOR 0 #endif // PDM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PDM_CONFIG_DEBUG_COLOR -#define PDM_CONFIG_DEBUG_COLOR 0 + #define PDM_CONFIG_DEBUG_COLOR 0 #endif // @@ -9181,50 +8836,50 @@ // PPI_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef PPI_CONFIG_LOG_ENABLED -#define PPI_CONFIG_LOG_ENABLED 0 + #define PPI_CONFIG_LOG_ENABLED 0 #endif // PPI_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PPI_CONFIG_LOG_LEVEL -#define PPI_CONFIG_LOG_LEVEL 3 + #define PPI_CONFIG_LOG_LEVEL 3 #endif // PPI_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PPI_CONFIG_INFO_COLOR -#define PPI_CONFIG_INFO_COLOR 0 + #define PPI_CONFIG_INFO_COLOR 0 #endif // PPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PPI_CONFIG_DEBUG_COLOR -#define PPI_CONFIG_DEBUG_COLOR 0 + #define PPI_CONFIG_DEBUG_COLOR 0 #endif // @@ -9232,50 +8887,50 @@ // PWM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef PWM_CONFIG_LOG_ENABLED -#define PWM_CONFIG_LOG_ENABLED 0 + #define PWM_CONFIG_LOG_ENABLED 0 #endif // PWM_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PWM_CONFIG_LOG_LEVEL -#define PWM_CONFIG_LOG_LEVEL 3 + #define PWM_CONFIG_LOG_LEVEL 3 #endif // PWM_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PWM_CONFIG_INFO_COLOR -#define PWM_CONFIG_INFO_COLOR 0 + #define PWM_CONFIG_INFO_COLOR 0 #endif // PWM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PWM_CONFIG_DEBUG_COLOR -#define PWM_CONFIG_DEBUG_COLOR 0 + #define PWM_CONFIG_DEBUG_COLOR 0 #endif // @@ -9283,50 +8938,50 @@ // QDEC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef QDEC_CONFIG_LOG_ENABLED -#define QDEC_CONFIG_LOG_ENABLED 0 + #define QDEC_CONFIG_LOG_ENABLED 0 #endif // QDEC_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef QDEC_CONFIG_LOG_LEVEL -#define QDEC_CONFIG_LOG_LEVEL 3 + #define QDEC_CONFIG_LOG_LEVEL 3 #endif // QDEC_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef QDEC_CONFIG_INFO_COLOR -#define QDEC_CONFIG_INFO_COLOR 0 + #define QDEC_CONFIG_INFO_COLOR 0 #endif // QDEC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef QDEC_CONFIG_DEBUG_COLOR -#define QDEC_CONFIG_DEBUG_COLOR 0 + #define QDEC_CONFIG_DEBUG_COLOR 0 #endif // @@ -9334,57 +8989,56 @@ // RNG_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef RNG_CONFIG_LOG_ENABLED -#define RNG_CONFIG_LOG_ENABLED 0 + #define RNG_CONFIG_LOG_ENABLED 0 #endif // RNG_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef RNG_CONFIG_LOG_LEVEL -#define RNG_CONFIG_LOG_LEVEL 3 + #define RNG_CONFIG_LOG_LEVEL 3 #endif // RNG_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RNG_CONFIG_INFO_COLOR -#define RNG_CONFIG_INFO_COLOR 0 + #define RNG_CONFIG_INFO_COLOR 0 #endif // RNG_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RNG_CONFIG_DEBUG_COLOR -#define RNG_CONFIG_DEBUG_COLOR 0 + #define RNG_CONFIG_DEBUG_COLOR 0 #endif // RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED - Enables logging of random numbers. - #ifndef RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED -#define RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED 0 + #define RNG_CONFIG_RANDOM_NUMBER_LOG_ENABLED 0 #endif // @@ -9392,50 +9046,50 @@ // RTC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef RTC_CONFIG_LOG_ENABLED -#define RTC_CONFIG_LOG_ENABLED 0 + #define RTC_CONFIG_LOG_ENABLED 0 #endif // RTC_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef RTC_CONFIG_LOG_LEVEL -#define RTC_CONFIG_LOG_LEVEL 3 + #define RTC_CONFIG_LOG_LEVEL 3 #endif // RTC_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RTC_CONFIG_INFO_COLOR -#define RTC_CONFIG_INFO_COLOR 0 + #define RTC_CONFIG_INFO_COLOR 0 #endif // RTC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef RTC_CONFIG_DEBUG_COLOR -#define RTC_CONFIG_DEBUG_COLOR 0 + #define RTC_CONFIG_DEBUG_COLOR 0 #endif // @@ -9443,50 +9097,50 @@ // SAADC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef SAADC_CONFIG_LOG_ENABLED -#define SAADC_CONFIG_LOG_ENABLED 0 + #define SAADC_CONFIG_LOG_ENABLED 0 #endif // SAADC_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SAADC_CONFIG_LOG_LEVEL -#define SAADC_CONFIG_LOG_LEVEL 3 + #define SAADC_CONFIG_LOG_LEVEL 3 #endif // SAADC_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SAADC_CONFIG_INFO_COLOR -#define SAADC_CONFIG_INFO_COLOR 0 + #define SAADC_CONFIG_INFO_COLOR 0 #endif // SAADC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SAADC_CONFIG_DEBUG_COLOR -#define SAADC_CONFIG_DEBUG_COLOR 0 + #define SAADC_CONFIG_DEBUG_COLOR 0 #endif // @@ -9494,50 +9148,50 @@ // SPIS_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef SPIS_CONFIG_LOG_ENABLED -#define SPIS_CONFIG_LOG_ENABLED 0 + #define SPIS_CONFIG_LOG_ENABLED 0 #endif // SPIS_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SPIS_CONFIG_LOG_LEVEL -#define SPIS_CONFIG_LOG_LEVEL 3 + #define SPIS_CONFIG_LOG_LEVEL 3 #endif // SPIS_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPIS_CONFIG_INFO_COLOR -#define SPIS_CONFIG_INFO_COLOR 0 + #define SPIS_CONFIG_INFO_COLOR 0 #endif // SPIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPIS_CONFIG_DEBUG_COLOR -#define SPIS_CONFIG_DEBUG_COLOR 0 + #define SPIS_CONFIG_DEBUG_COLOR 0 #endif // @@ -9545,50 +9199,50 @@ // SPI_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef SPI_CONFIG_LOG_ENABLED -#define SPI_CONFIG_LOG_ENABLED 0 + #define SPI_CONFIG_LOG_ENABLED 0 #endif // SPI_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SPI_CONFIG_LOG_LEVEL -#define SPI_CONFIG_LOG_LEVEL 3 + #define SPI_CONFIG_LOG_LEVEL 3 #endif // SPI_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPI_CONFIG_INFO_COLOR -#define SPI_CONFIG_INFO_COLOR 0 + #define SPI_CONFIG_INFO_COLOR 0 #endif // SPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SPI_CONFIG_DEBUG_COLOR -#define SPI_CONFIG_DEBUG_COLOR 0 + #define SPI_CONFIG_DEBUG_COLOR 0 #endif // @@ -9596,50 +9250,50 @@ // TIMER_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef TIMER_CONFIG_LOG_ENABLED -#define TIMER_CONFIG_LOG_ENABLED 0 + #define TIMER_CONFIG_LOG_ENABLED 0 #endif // TIMER_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TIMER_CONFIG_LOG_LEVEL -#define TIMER_CONFIG_LOG_LEVEL 3 + #define TIMER_CONFIG_LOG_LEVEL 3 #endif // TIMER_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TIMER_CONFIG_INFO_COLOR -#define TIMER_CONFIG_INFO_COLOR 0 + #define TIMER_CONFIG_INFO_COLOR 0 #endif // TIMER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TIMER_CONFIG_DEBUG_COLOR -#define TIMER_CONFIG_DEBUG_COLOR 0 + #define TIMER_CONFIG_DEBUG_COLOR 0 #endif // @@ -9647,50 +9301,50 @@ // TWIS_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef TWIS_CONFIG_LOG_ENABLED -#define TWIS_CONFIG_LOG_ENABLED 0 + #define TWIS_CONFIG_LOG_ENABLED 0 #endif // TWIS_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TWIS_CONFIG_LOG_LEVEL -#define TWIS_CONFIG_LOG_LEVEL 3 + #define TWIS_CONFIG_LOG_LEVEL 3 #endif // TWIS_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWIS_CONFIG_INFO_COLOR -#define TWIS_CONFIG_INFO_COLOR 0 + #define TWIS_CONFIG_INFO_COLOR 0 #endif // TWIS_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWIS_CONFIG_DEBUG_COLOR -#define TWIS_CONFIG_DEBUG_COLOR 0 + #define TWIS_CONFIG_DEBUG_COLOR 0 #endif // @@ -9698,50 +9352,50 @@ // TWI_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef TWI_CONFIG_LOG_ENABLED -#define TWI_CONFIG_LOG_ENABLED 0 + #define TWI_CONFIG_LOG_ENABLED 0 #endif // TWI_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef TWI_CONFIG_LOG_LEVEL -#define TWI_CONFIG_LOG_LEVEL 3 + #define TWI_CONFIG_LOG_LEVEL 3 #endif // TWI_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWI_CONFIG_INFO_COLOR -#define TWI_CONFIG_INFO_COLOR 0 + #define TWI_CONFIG_INFO_COLOR 0 #endif // TWI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef TWI_CONFIG_DEBUG_COLOR -#define TWI_CONFIG_DEBUG_COLOR 0 + #define TWI_CONFIG_DEBUG_COLOR 0 #endif // @@ -9749,50 +9403,50 @@ // UART_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef UART_CONFIG_LOG_ENABLED -#define UART_CONFIG_LOG_ENABLED 0 + #define UART_CONFIG_LOG_ENABLED 0 #endif // UART_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef UART_CONFIG_LOG_LEVEL -#define UART_CONFIG_LOG_LEVEL 3 + #define UART_CONFIG_LOG_LEVEL 3 #endif // UART_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef UART_CONFIG_INFO_COLOR -#define UART_CONFIG_INFO_COLOR 0 + #define UART_CONFIG_INFO_COLOR 0 #endif // UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef UART_CONFIG_DEBUG_COLOR -#define UART_CONFIG_DEBUG_COLOR 0 + #define UART_CONFIG_DEBUG_COLOR 0 #endif // @@ -9800,50 +9454,50 @@ // USBD_CONFIG_LOG_ENABLED - Enable logging in the module //========================================================== #ifndef USBD_CONFIG_LOG_ENABLED -#define USBD_CONFIG_LOG_ENABLED 0 + #define USBD_CONFIG_LOG_ENABLED 0 #endif // USBD_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef USBD_CONFIG_LOG_LEVEL -#define USBD_CONFIG_LOG_LEVEL 3 + #define USBD_CONFIG_LOG_LEVEL 3 #endif // USBD_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef USBD_CONFIG_INFO_COLOR -#define USBD_CONFIG_INFO_COLOR 0 + #define USBD_CONFIG_INFO_COLOR 0 #endif // USBD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef USBD_CONFIG_DEBUG_COLOR -#define USBD_CONFIG_DEBUG_COLOR 0 + #define USBD_CONFIG_DEBUG_COLOR 0 #endif // @@ -9851,123 +9505,122 @@ // WDT_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef WDT_CONFIG_LOG_ENABLED -#define WDT_CONFIG_LOG_ENABLED 0 + #define WDT_CONFIG_LOG_ENABLED 0 #endif // WDT_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef WDT_CONFIG_LOG_LEVEL -#define WDT_CONFIG_LOG_LEVEL 3 + #define WDT_CONFIG_LOG_LEVEL 3 #endif // WDT_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef WDT_CONFIG_INFO_COLOR -#define WDT_CONFIG_INFO_COLOR 0 + #define WDT_CONFIG_INFO_COLOR 0 #endif // WDT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef WDT_CONFIG_DEBUG_COLOR -#define WDT_CONFIG_DEBUG_COLOR 0 + #define WDT_CONFIG_DEBUG_COLOR 0 #endif // -// +// //========================================================== -// nrf_log in nRF_Libraries +// nrf_log in nRF_Libraries //========================================================== // APP_TIMER_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef APP_TIMER_CONFIG_LOG_ENABLED -#define APP_TIMER_CONFIG_LOG_ENABLED 0 + #define APP_TIMER_CONFIG_LOG_ENABLED 0 #endif // APP_TIMER_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_TIMER_CONFIG_LOG_LEVEL -#define APP_TIMER_CONFIG_LOG_LEVEL 3 + #define APP_TIMER_CONFIG_LOG_LEVEL 3 #endif // APP_TIMER_CONFIG_INITIAL_LOG_LEVEL - Initial severity level if dynamic filtering is enabled. - // If module generates a lot of logs, initial log level can // be decreased to prevent flooding. Severity level can be // increased on instance basis. -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_TIMER_CONFIG_INITIAL_LOG_LEVEL -#define APP_TIMER_CONFIG_INITIAL_LOG_LEVEL 3 + #define APP_TIMER_CONFIG_INITIAL_LOG_LEVEL 3 #endif // APP_TIMER_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_TIMER_CONFIG_INFO_COLOR -#define APP_TIMER_CONFIG_INFO_COLOR 0 + #define APP_TIMER_CONFIG_INFO_COLOR 0 #endif // APP_TIMER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_TIMER_CONFIG_DEBUG_COLOR -#define APP_TIMER_CONFIG_DEBUG_COLOR 0 + #define APP_TIMER_CONFIG_DEBUG_COLOR 0 #endif // @@ -9975,50 +9628,50 @@ // APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED -#define APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED 0 + #define APP_USBD_CDC_ACM_CONFIG_LOG_ENABLED 0 #endif // APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL -#define APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL 3 + #define APP_USBD_CDC_ACM_CONFIG_LOG_LEVEL 3 #endif // APP_USBD_CDC_ACM_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_CDC_ACM_CONFIG_INFO_COLOR -#define APP_USBD_CDC_ACM_CONFIG_INFO_COLOR 0 + #define APP_USBD_CDC_ACM_CONFIG_INFO_COLOR 0 #endif // APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR -#define APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR 0 + #define APP_USBD_CDC_ACM_CONFIG_DEBUG_COLOR 0 #endif // @@ -10026,50 +9679,50 @@ // APP_USBD_CONFIG_LOG_ENABLED - Enable logging in the module. //========================================================== #ifndef APP_USBD_CONFIG_LOG_ENABLED -#define APP_USBD_CONFIG_LOG_ENABLED 0 + #define APP_USBD_CONFIG_LOG_ENABLED 0 #endif // APP_USBD_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_USBD_CONFIG_LOG_LEVEL -#define APP_USBD_CONFIG_LOG_LEVEL 3 + #define APP_USBD_CONFIG_LOG_LEVEL 3 #endif // APP_USBD_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_CONFIG_INFO_COLOR -#define APP_USBD_CONFIG_INFO_COLOR 0 + #define APP_USBD_CONFIG_INFO_COLOR 0 #endif // APP_USBD_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_CONFIG_DEBUG_COLOR -#define APP_USBD_CONFIG_DEBUG_COLOR 0 + #define APP_USBD_CONFIG_DEBUG_COLOR 0 #endif // @@ -10077,50 +9730,50 @@ // APP_USBD_DUMMY_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef APP_USBD_DUMMY_CONFIG_LOG_ENABLED -#define APP_USBD_DUMMY_CONFIG_LOG_ENABLED 0 + #define APP_USBD_DUMMY_CONFIG_LOG_ENABLED 0 #endif // APP_USBD_DUMMY_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_USBD_DUMMY_CONFIG_LOG_LEVEL -#define APP_USBD_DUMMY_CONFIG_LOG_LEVEL 3 + #define APP_USBD_DUMMY_CONFIG_LOG_LEVEL 3 #endif // APP_USBD_DUMMY_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_DUMMY_CONFIG_INFO_COLOR -#define APP_USBD_DUMMY_CONFIG_INFO_COLOR 0 + #define APP_USBD_DUMMY_CONFIG_INFO_COLOR 0 #endif // APP_USBD_DUMMY_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_DUMMY_CONFIG_DEBUG_COLOR -#define APP_USBD_DUMMY_CONFIG_DEBUG_COLOR 0 + #define APP_USBD_DUMMY_CONFIG_DEBUG_COLOR 0 #endif // @@ -10128,50 +9781,50 @@ // APP_USBD_MSC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef APP_USBD_MSC_CONFIG_LOG_ENABLED -#define APP_USBD_MSC_CONFIG_LOG_ENABLED 0 + #define APP_USBD_MSC_CONFIG_LOG_ENABLED 0 #endif // APP_USBD_MSC_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_USBD_MSC_CONFIG_LOG_LEVEL -#define APP_USBD_MSC_CONFIG_LOG_LEVEL 3 + #define APP_USBD_MSC_CONFIG_LOG_LEVEL 3 #endif // APP_USBD_MSC_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_MSC_CONFIG_INFO_COLOR -#define APP_USBD_MSC_CONFIG_INFO_COLOR 0 + #define APP_USBD_MSC_CONFIG_INFO_COLOR 0 #endif // APP_USBD_MSC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_MSC_CONFIG_DEBUG_COLOR -#define APP_USBD_MSC_CONFIG_DEBUG_COLOR 0 + #define APP_USBD_MSC_CONFIG_DEBUG_COLOR 0 #endif // @@ -10179,50 +9832,50 @@ // APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED -#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED 0 + #define APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_ENABLED 0 #endif // APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL -#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL 3 + #define APP_USBD_NRF_DFU_TRIGGER_CONFIG_LOG_LEVEL 3 #endif // APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR -#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR 0 + #define APP_USBD_NRF_DFU_TRIGGER_CONFIG_INFO_COLOR 0 #endif // APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR -#define APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR 0 + #define APP_USBD_NRF_DFU_TRIGGER_CONFIG_DEBUG_COLOR 0 #endif // @@ -10230,62 +9883,62 @@ // NRF_ATFIFO_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_ATFIFO_CONFIG_LOG_ENABLED -#define NRF_ATFIFO_CONFIG_LOG_ENABLED 0 + #define NRF_ATFIFO_CONFIG_LOG_ENABLED 0 #endif // NRF_ATFIFO_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_ATFIFO_CONFIG_LOG_LEVEL -#define NRF_ATFIFO_CONFIG_LOG_LEVEL 3 + #define NRF_ATFIFO_CONFIG_LOG_LEVEL 3 #endif // NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL - Initial severity level if dynamic filtering is enabled -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL -#define NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL 3 + #define NRF_ATFIFO_CONFIG_LOG_INIT_FILTER_LEVEL 3 #endif // NRF_ATFIFO_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_ATFIFO_CONFIG_INFO_COLOR -#define NRF_ATFIFO_CONFIG_INFO_COLOR 0 + #define NRF_ATFIFO_CONFIG_INFO_COLOR 0 #endif // NRF_ATFIFO_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_ATFIFO_CONFIG_DEBUG_COLOR -#define NRF_ATFIFO_CONFIG_DEBUG_COLOR 0 + #define NRF_ATFIFO_CONFIG_DEBUG_COLOR 0 #endif // @@ -10293,66 +9946,65 @@ // NRF_BALLOC_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_BALLOC_CONFIG_LOG_ENABLED -#define NRF_BALLOC_CONFIG_LOG_ENABLED 0 + #define NRF_BALLOC_CONFIG_LOG_ENABLED 0 #endif // NRF_BALLOC_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BALLOC_CONFIG_LOG_LEVEL -#define NRF_BALLOC_CONFIG_LOG_LEVEL 3 + #define NRF_BALLOC_CONFIG_LOG_LEVEL 3 #endif // NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL - Initial severity level if dynamic filtering is enabled. - // If module generates a lot of logs, initial log level can // be decreased to prevent flooding. Severity level can be // increased on instance basis. -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL -#define NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL 3 + #define NRF_BALLOC_CONFIG_INITIAL_LOG_LEVEL 3 #endif // NRF_BALLOC_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BALLOC_CONFIG_INFO_COLOR -#define NRF_BALLOC_CONFIG_INFO_COLOR 0 + #define NRF_BALLOC_CONFIG_INFO_COLOR 0 #endif // NRF_BALLOC_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BALLOC_CONFIG_DEBUG_COLOR -#define NRF_BALLOC_CONFIG_DEBUG_COLOR 0 + #define NRF_BALLOC_CONFIG_DEBUG_COLOR 0 #endif // @@ -10360,62 +10012,62 @@ // NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_ENABLED -#define NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_ENABLED 0 + #define NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_ENABLED 0 #endif // NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_LEVEL -#define NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_LEVEL 3 + #define NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_LEVEL 3 #endif // NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_INIT_FILTER_LEVEL - Initial severity level if dynamic filtering is enabled -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_INIT_FILTER_LEVEL -#define NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_INIT_FILTER_LEVEL 3 + #define NRF_BLOCK_DEV_EMPTY_CONFIG_LOG_INIT_FILTER_LEVEL 3 #endif // NRF_BLOCK_DEV_EMPTY_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BLOCK_DEV_EMPTY_CONFIG_INFO_COLOR -#define NRF_BLOCK_DEV_EMPTY_CONFIG_INFO_COLOR 0 + #define NRF_BLOCK_DEV_EMPTY_CONFIG_INFO_COLOR 0 #endif // NRF_BLOCK_DEV_EMPTY_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BLOCK_DEV_EMPTY_CONFIG_DEBUG_COLOR -#define NRF_BLOCK_DEV_EMPTY_CONFIG_DEBUG_COLOR 0 + #define NRF_BLOCK_DEV_EMPTY_CONFIG_DEBUG_COLOR 0 #endif // @@ -10423,62 +10075,62 @@ // NRF_BLOCK_DEV_QSPI_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_BLOCK_DEV_QSPI_CONFIG_LOG_ENABLED -#define NRF_BLOCK_DEV_QSPI_CONFIG_LOG_ENABLED 0 + #define NRF_BLOCK_DEV_QSPI_CONFIG_LOG_ENABLED 0 #endif // NRF_BLOCK_DEV_QSPI_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BLOCK_DEV_QSPI_CONFIG_LOG_LEVEL -#define NRF_BLOCK_DEV_QSPI_CONFIG_LOG_LEVEL 3 + #define NRF_BLOCK_DEV_QSPI_CONFIG_LOG_LEVEL 3 #endif // NRF_BLOCK_DEV_QSPI_CONFIG_LOG_INIT_FILTER_LEVEL - Initial severity level if dynamic filtering is enabled -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BLOCK_DEV_QSPI_CONFIG_LOG_INIT_FILTER_LEVEL -#define NRF_BLOCK_DEV_QSPI_CONFIG_LOG_INIT_FILTER_LEVEL 3 + #define NRF_BLOCK_DEV_QSPI_CONFIG_LOG_INIT_FILTER_LEVEL 3 #endif // NRF_BLOCK_DEV_QSPI_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BLOCK_DEV_QSPI_CONFIG_INFO_COLOR -#define NRF_BLOCK_DEV_QSPI_CONFIG_INFO_COLOR 0 + #define NRF_BLOCK_DEV_QSPI_CONFIG_INFO_COLOR 0 #endif // NRF_BLOCK_DEV_QSPI_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BLOCK_DEV_QSPI_CONFIG_DEBUG_COLOR -#define NRF_BLOCK_DEV_QSPI_CONFIG_DEBUG_COLOR 0 + #define NRF_BLOCK_DEV_QSPI_CONFIG_DEBUG_COLOR 0 #endif // @@ -10486,62 +10138,62 @@ // NRF_BLOCK_DEV_RAM_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_BLOCK_DEV_RAM_CONFIG_LOG_ENABLED -#define NRF_BLOCK_DEV_RAM_CONFIG_LOG_ENABLED 0 + #define NRF_BLOCK_DEV_RAM_CONFIG_LOG_ENABLED 0 #endif // NRF_BLOCK_DEV_RAM_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BLOCK_DEV_RAM_CONFIG_LOG_LEVEL -#define NRF_BLOCK_DEV_RAM_CONFIG_LOG_LEVEL 3 + #define NRF_BLOCK_DEV_RAM_CONFIG_LOG_LEVEL 3 #endif // NRF_BLOCK_DEV_RAM_CONFIG_LOG_INIT_FILTER_LEVEL - Initial severity level if dynamic filtering is enabled -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_BLOCK_DEV_RAM_CONFIG_LOG_INIT_FILTER_LEVEL -#define NRF_BLOCK_DEV_RAM_CONFIG_LOG_INIT_FILTER_LEVEL 3 + #define NRF_BLOCK_DEV_RAM_CONFIG_LOG_INIT_FILTER_LEVEL 3 #endif // NRF_BLOCK_DEV_RAM_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BLOCK_DEV_RAM_CONFIG_INFO_COLOR -#define NRF_BLOCK_DEV_RAM_CONFIG_INFO_COLOR 0 + #define NRF_BLOCK_DEV_RAM_CONFIG_INFO_COLOR 0 #endif // NRF_BLOCK_DEV_RAM_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_BLOCK_DEV_RAM_CONFIG_DEBUG_COLOR -#define NRF_BLOCK_DEV_RAM_CONFIG_DEBUG_COLOR 0 + #define NRF_BLOCK_DEV_RAM_CONFIG_DEBUG_COLOR 0 #endif // @@ -10549,50 +10201,50 @@ // NRF_CLI_BLE_UART_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_CLI_BLE_UART_CONFIG_LOG_ENABLED -#define NRF_CLI_BLE_UART_CONFIG_LOG_ENABLED 0 + #define NRF_CLI_BLE_UART_CONFIG_LOG_ENABLED 0 #endif // NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL -#define NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL 3 + #define NRF_CLI_BLE_UART_CONFIG_LOG_LEVEL 3 #endif // NRF_CLI_BLE_UART_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_BLE_UART_CONFIG_INFO_COLOR -#define NRF_CLI_BLE_UART_CONFIG_INFO_COLOR 0 + #define NRF_CLI_BLE_UART_CONFIG_INFO_COLOR 0 #endif // NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR -#define NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR 0 + #define NRF_CLI_BLE_UART_CONFIG_DEBUG_COLOR 0 #endif // @@ -10600,50 +10252,50 @@ // NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED -#define NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED 0 + #define NRF_CLI_LIBUARTE_CONFIG_LOG_ENABLED 0 #endif // NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL -#define NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL 3 + #define NRF_CLI_LIBUARTE_CONFIG_LOG_LEVEL 3 #endif // NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR -#define NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR 0 + #define NRF_CLI_LIBUARTE_CONFIG_INFO_COLOR 0 #endif // NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR -#define NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR 0 + #define NRF_CLI_LIBUARTE_CONFIG_DEBUG_COLOR 0 #endif // @@ -10651,50 +10303,50 @@ // NRF_CLI_UART_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_CLI_UART_CONFIG_LOG_ENABLED -#define NRF_CLI_UART_CONFIG_LOG_ENABLED 0 + #define NRF_CLI_UART_CONFIG_LOG_ENABLED 0 #endif // NRF_CLI_UART_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_CLI_UART_CONFIG_LOG_LEVEL -#define NRF_CLI_UART_CONFIG_LOG_LEVEL 3 + #define NRF_CLI_UART_CONFIG_LOG_LEVEL 3 #endif // NRF_CLI_UART_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_UART_CONFIG_INFO_COLOR -#define NRF_CLI_UART_CONFIG_INFO_COLOR 0 + #define NRF_CLI_UART_CONFIG_INFO_COLOR 0 #endif // NRF_CLI_UART_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_CLI_UART_CONFIG_DEBUG_COLOR -#define NRF_CLI_UART_CONFIG_DEBUG_COLOR 0 + #define NRF_CLI_UART_CONFIG_DEBUG_COLOR 0 #endif // @@ -10702,50 +10354,50 @@ // NRF_LIBUARTE_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_LIBUARTE_CONFIG_LOG_ENABLED -#define NRF_LIBUARTE_CONFIG_LOG_ENABLED 0 + #define NRF_LIBUARTE_CONFIG_LOG_ENABLED 0 #endif // NRF_LIBUARTE_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_LIBUARTE_CONFIG_LOG_LEVEL -#define NRF_LIBUARTE_CONFIG_LOG_LEVEL 3 + #define NRF_LIBUARTE_CONFIG_LOG_LEVEL 3 #endif // NRF_LIBUARTE_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LIBUARTE_CONFIG_INFO_COLOR -#define NRF_LIBUARTE_CONFIG_INFO_COLOR 0 + #define NRF_LIBUARTE_CONFIG_INFO_COLOR 0 #endif // NRF_LIBUARTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_LIBUARTE_CONFIG_DEBUG_COLOR -#define NRF_LIBUARTE_CONFIG_DEBUG_COLOR 0 + #define NRF_LIBUARTE_CONFIG_DEBUG_COLOR 0 #endif // @@ -10753,50 +10405,50 @@ // NRF_MEMOBJ_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_MEMOBJ_CONFIG_LOG_ENABLED -#define NRF_MEMOBJ_CONFIG_LOG_ENABLED 0 + #define NRF_MEMOBJ_CONFIG_LOG_ENABLED 0 #endif // NRF_MEMOBJ_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_MEMOBJ_CONFIG_LOG_LEVEL -#define NRF_MEMOBJ_CONFIG_LOG_LEVEL 3 + #define NRF_MEMOBJ_CONFIG_LOG_LEVEL 3 #endif // NRF_MEMOBJ_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MEMOBJ_CONFIG_INFO_COLOR -#define NRF_MEMOBJ_CONFIG_INFO_COLOR 0 + #define NRF_MEMOBJ_CONFIG_INFO_COLOR 0 #endif // NRF_MEMOBJ_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_MEMOBJ_CONFIG_DEBUG_COLOR -#define NRF_MEMOBJ_CONFIG_DEBUG_COLOR 0 + #define NRF_MEMOBJ_CONFIG_DEBUG_COLOR 0 #endif // @@ -10804,50 +10456,50 @@ // NRF_PWR_MGMT_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_PWR_MGMT_CONFIG_LOG_ENABLED -#define NRF_PWR_MGMT_CONFIG_LOG_ENABLED 0 + #define NRF_PWR_MGMT_CONFIG_LOG_ENABLED 0 #endif // NRF_PWR_MGMT_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_PWR_MGMT_CONFIG_LOG_LEVEL -#define NRF_PWR_MGMT_CONFIG_LOG_LEVEL 3 + #define NRF_PWR_MGMT_CONFIG_LOG_LEVEL 3 #endif // NRF_PWR_MGMT_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_PWR_MGMT_CONFIG_INFO_COLOR -#define NRF_PWR_MGMT_CONFIG_INFO_COLOR 0 + #define NRF_PWR_MGMT_CONFIG_INFO_COLOR 0 #endif // NRF_PWR_MGMT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_PWR_MGMT_CONFIG_DEBUG_COLOR -#define NRF_PWR_MGMT_CONFIG_DEBUG_COLOR 0 + #define NRF_PWR_MGMT_CONFIG_DEBUG_COLOR 0 #endif // @@ -10855,62 +10507,62 @@ // NRF_QUEUE_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_QUEUE_CONFIG_LOG_ENABLED -#define NRF_QUEUE_CONFIG_LOG_ENABLED 0 + #define NRF_QUEUE_CONFIG_LOG_ENABLED 0 #endif // NRF_QUEUE_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_QUEUE_CONFIG_LOG_LEVEL -#define NRF_QUEUE_CONFIG_LOG_LEVEL 3 + #define NRF_QUEUE_CONFIG_LOG_LEVEL 3 #endif // NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL - Initial severity level if dynamic filtering is enabled -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL -#define NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL 3 + #define NRF_QUEUE_CONFIG_LOG_INIT_FILTER_LEVEL 3 #endif // NRF_QUEUE_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_QUEUE_CONFIG_INFO_COLOR -#define NRF_QUEUE_CONFIG_INFO_COLOR 0 + #define NRF_QUEUE_CONFIG_INFO_COLOR 0 #endif // NRF_QUEUE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_QUEUE_CONFIG_DEBUG_COLOR -#define NRF_QUEUE_CONFIG_DEBUG_COLOR 0 + #define NRF_QUEUE_CONFIG_DEBUG_COLOR 0 #endif // @@ -10918,50 +10570,50 @@ // NRF_SDH_ANT_LOG_ENABLED - Enable logging in SoftDevice handler (ANT) module. //========================================================== #ifndef NRF_SDH_ANT_LOG_ENABLED -#define NRF_SDH_ANT_LOG_ENABLED 0 + #define NRF_SDH_ANT_LOG_ENABLED 0 #endif // NRF_SDH_ANT_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_ANT_LOG_LEVEL -#define NRF_SDH_ANT_LOG_LEVEL 3 + #define NRF_SDH_ANT_LOG_LEVEL 3 #endif // NRF_SDH_ANT_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_ANT_INFO_COLOR -#define NRF_SDH_ANT_INFO_COLOR 0 + #define NRF_SDH_ANT_INFO_COLOR 0 #endif // NRF_SDH_ANT_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_ANT_DEBUG_COLOR -#define NRF_SDH_ANT_DEBUG_COLOR 0 + #define NRF_SDH_ANT_DEBUG_COLOR 0 #endif // @@ -10969,50 +10621,50 @@ // NRF_SDH_BLE_LOG_ENABLED - Enable logging in SoftDevice handler (BLE) module. //========================================================== #ifndef NRF_SDH_BLE_LOG_ENABLED -#define NRF_SDH_BLE_LOG_ENABLED 0 + #define NRF_SDH_BLE_LOG_ENABLED 0 #endif // NRF_SDH_BLE_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_BLE_LOG_LEVEL -#define NRF_SDH_BLE_LOG_LEVEL 3 + #define NRF_SDH_BLE_LOG_LEVEL 3 #endif // NRF_SDH_BLE_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_BLE_INFO_COLOR -#define NRF_SDH_BLE_INFO_COLOR 0 + #define NRF_SDH_BLE_INFO_COLOR 0 #endif // NRF_SDH_BLE_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_BLE_DEBUG_COLOR -#define NRF_SDH_BLE_DEBUG_COLOR 0 + #define NRF_SDH_BLE_DEBUG_COLOR 0 #endif // @@ -11020,58 +10672,58 @@ // NRF_SDH_LOG_ENABLED - Enable logging in SoftDevice handler module. //========================================================== #ifndef NRF_SDH_LOG_ENABLED -#define NRF_SDH_LOG_ENABLED 0 + #define NRF_SDH_LOG_ENABLED 0 #endif #ifndef NRF_SDH_FREERTOS_LOG_ENABLED -#define NRF_SDH_FREERTOS_LOG_ENABLED 0 + #define NRF_SDH_FREERTOS_LOG_ENABLED 0 #endif #ifndef NRF_SDH_FREERTOS_LOG_LEVEL -#define NRF_SDH_FREERTOS_LOG_LEVEL 4 + #define NRF_SDH_FREERTOS_LOG_LEVEL 4 #endif // NRF_SDH_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_LOG_LEVEL -#define NRF_SDH_LOG_LEVEL 3 + #define NRF_SDH_LOG_LEVEL 3 #endif // NRF_SDH_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_INFO_COLOR -#define NRF_SDH_INFO_COLOR 0 + #define NRF_SDH_INFO_COLOR 0 #endif // NRF_SDH_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_DEBUG_COLOR -#define NRF_SDH_DEBUG_COLOR 0 + #define NRF_SDH_DEBUG_COLOR 0 #endif // @@ -11079,50 +10731,50 @@ // NRF_SDH_SOC_LOG_ENABLED - Enable logging in SoftDevice handler (SoC) module. //========================================================== #ifndef NRF_SDH_SOC_LOG_ENABLED -#define NRF_SDH_SOC_LOG_ENABLED 0 + #define NRF_SDH_SOC_LOG_ENABLED 0 #endif // NRF_SDH_SOC_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SDH_SOC_LOG_LEVEL -#define NRF_SDH_SOC_LOG_LEVEL 3 + #define NRF_SDH_SOC_LOG_LEVEL 3 #endif // NRF_SDH_SOC_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_SOC_INFO_COLOR -#define NRF_SDH_SOC_INFO_COLOR 0 + #define NRF_SDH_SOC_INFO_COLOR 0 #endif // NRF_SDH_SOC_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SDH_SOC_DEBUG_COLOR -#define NRF_SDH_SOC_DEBUG_COLOR 0 + #define NRF_SDH_SOC_DEBUG_COLOR 0 #endif // @@ -11130,50 +10782,50 @@ // NRF_SORTLIST_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_SORTLIST_CONFIG_LOG_ENABLED -#define NRF_SORTLIST_CONFIG_LOG_ENABLED 0 + #define NRF_SORTLIST_CONFIG_LOG_ENABLED 0 #endif // NRF_SORTLIST_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_SORTLIST_CONFIG_LOG_LEVEL -#define NRF_SORTLIST_CONFIG_LOG_LEVEL 3 + #define NRF_SORTLIST_CONFIG_LOG_LEVEL 3 #endif // NRF_SORTLIST_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SORTLIST_CONFIG_INFO_COLOR -#define NRF_SORTLIST_CONFIG_INFO_COLOR 0 + #define NRF_SORTLIST_CONFIG_INFO_COLOR 0 #endif // NRF_SORTLIST_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_SORTLIST_CONFIG_DEBUG_COLOR -#define NRF_SORTLIST_CONFIG_DEBUG_COLOR 0 + #define NRF_SORTLIST_CONFIG_DEBUG_COLOR 0 #endif // @@ -11181,50 +10833,50 @@ // NRF_TWI_SENSOR_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NRF_TWI_SENSOR_CONFIG_LOG_ENABLED -#define NRF_TWI_SENSOR_CONFIG_LOG_ENABLED 0 + #define NRF_TWI_SENSOR_CONFIG_LOG_ENABLED 0 #endif // NRF_TWI_SENSOR_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NRF_TWI_SENSOR_CONFIG_LOG_LEVEL -#define NRF_TWI_SENSOR_CONFIG_LOG_LEVEL 3 + #define NRF_TWI_SENSOR_CONFIG_LOG_LEVEL 3 #endif // NRF_TWI_SENSOR_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_TWI_SENSOR_CONFIG_INFO_COLOR -#define NRF_TWI_SENSOR_CONFIG_INFO_COLOR 0 + #define NRF_TWI_SENSOR_CONFIG_INFO_COLOR 0 #endif // NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR -#define NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR 0 + #define NRF_TWI_SENSOR_CONFIG_DEBUG_COLOR 0 #endif // @@ -11232,221 +10884,217 @@ // PM_LOG_ENABLED - Enable logging in Peer Manager and its submodules. //========================================================== #ifndef PM_LOG_ENABLED -#define PM_LOG_ENABLED 0 + #define PM_LOG_ENABLED 0 #endif // PM_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef PM_LOG_LEVEL -#define PM_LOG_LEVEL 3 + #define PM_LOG_LEVEL 3 #endif // PM_LOG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PM_LOG_INFO_COLOR -#define PM_LOG_INFO_COLOR 0 + #define PM_LOG_INFO_COLOR 0 #endif // PM_LOG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef PM_LOG_DEBUG_COLOR -#define PM_LOG_DEBUG_COLOR 0 + #define PM_LOG_DEBUG_COLOR 0 #endif // -// +// //========================================================== -// nrf_log in nRF_Serialization +// nrf_log in nRF_Serialization //========================================================== // SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED -#define SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED 0 + #define SER_HAL_TRANSPORT_CONFIG_LOG_ENABLED 0 #endif // SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL -#define SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL 3 + #define SER_HAL_TRANSPORT_CONFIG_LOG_LEVEL 3 #endif // SER_HAL_TRANSPORT_CONFIG_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SER_HAL_TRANSPORT_CONFIG_INFO_COLOR -#define SER_HAL_TRANSPORT_CONFIG_INFO_COLOR 0 + #define SER_HAL_TRANSPORT_CONFIG_INFO_COLOR 0 #endif // SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR -#define SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR 0 + #define SER_HAL_TRANSPORT_CONFIG_DEBUG_COLOR 0 #endif // -// +// //========================================================== -// +// //========================================================== // // NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED - nrf_log_str_formatter - Log string formatter - #ifndef NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED -#define NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED 1 + #define NRF_LOG_STR_FORMATTER_TIMESTAMP_FORMAT_ENABLED 1 #endif -// +// //========================================================== -// nRF_NFC +// nRF_NFC //========================================================== // NFC_AC_REC_ENABLED - nfc_ac_rec - NFC NDEF Alternative Carrier record encoder - #ifndef NFC_AC_REC_ENABLED -#define NFC_AC_REC_ENABLED 0 + #define NFC_AC_REC_ENABLED 0 #endif // NFC_AC_REC_PARSER_ENABLED - nfc_ac_rec_parser - Alternative Carrier record parser - #ifndef NFC_AC_REC_PARSER_ENABLED -#define NFC_AC_REC_PARSER_ENABLED 0 + #define NFC_AC_REC_PARSER_ENABLED 0 #endif // NFC_BLE_OOB_ADVDATA_ENABLED - nfc_ble_oob_advdata - AD data for OOB pairing encoder //========================================================== #ifndef NFC_BLE_OOB_ADVDATA_ENABLED -#define NFC_BLE_OOB_ADVDATA_ENABLED 0 + #define NFC_BLE_OOB_ADVDATA_ENABLED 0 #endif // ADVANCED_ADVDATA_SUPPORT - Non-mandatory AD types for BLE OOB pairing are encoded inside the NDEF message (e.g. service UUIDs) -// <1=> Enabled -// <0=> Disabled +// <1=> Enabled +// <0=> Disabled #ifndef ADVANCED_ADVDATA_SUPPORT -#define ADVANCED_ADVDATA_SUPPORT 0 + #define ADVANCED_ADVDATA_SUPPORT 0 #endif // // NFC_BLE_OOB_ADVDATA_PARSER_ENABLED - nfc_ble_oob_advdata_parser - BLE OOB pairing AD data parser - #ifndef NFC_BLE_OOB_ADVDATA_PARSER_ENABLED -#define NFC_BLE_OOB_ADVDATA_PARSER_ENABLED 0 + #define NFC_BLE_OOB_ADVDATA_PARSER_ENABLED 0 #endif // NFC_BLE_PAIR_LIB_ENABLED - nfc_ble_pair_lib - Library parameters //========================================================== #ifndef NFC_BLE_PAIR_LIB_ENABLED -#define NFC_BLE_PAIR_LIB_ENABLED 0 + #define NFC_BLE_PAIR_LIB_ENABLED 0 #endif // NFC_BLE_PAIR_LIB_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NFC_BLE_PAIR_LIB_LOG_ENABLED -#define NFC_BLE_PAIR_LIB_LOG_ENABLED 0 + #define NFC_BLE_PAIR_LIB_LOG_ENABLED 0 #endif // NFC_BLE_PAIR_LIB_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_BLE_PAIR_LIB_LOG_LEVEL -#define NFC_BLE_PAIR_LIB_LOG_LEVEL 3 + #define NFC_BLE_PAIR_LIB_LOG_LEVEL 3 #endif // NFC_BLE_PAIR_LIB_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_BLE_PAIR_LIB_INFO_COLOR -#define NFC_BLE_PAIR_LIB_INFO_COLOR 0 + #define NFC_BLE_PAIR_LIB_INFO_COLOR 0 #endif // NFC_BLE_PAIR_LIB_DEBUG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_BLE_PAIR_LIB_DEBUG_COLOR -#define NFC_BLE_PAIR_LIB_DEBUG_COLOR 0 + #define NFC_BLE_PAIR_LIB_DEBUG_COLOR 0 #endif // @@ -11459,145 +11107,133 @@ // If bonding is enabled at least one of the BLE_NFC_SEC_PARAM_KDIST options must be enabled. //========================================================== #ifndef BLE_NFC_SEC_PARAM_BOND -#define BLE_NFC_SEC_PARAM_BOND 1 + #define BLE_NFC_SEC_PARAM_BOND 1 #endif // BLE_NFC_SEC_PARAM_KDIST_OWN_ENC - Enables Long Term Key and Master Identification distribution by device. - #ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ENC -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ENC 1 + #define BLE_NFC_SEC_PARAM_KDIST_OWN_ENC 1 #endif // BLE_NFC_SEC_PARAM_KDIST_OWN_ID - Enables Identity Resolving Key and Identity Address Information distribution by device. - #ifndef BLE_NFC_SEC_PARAM_KDIST_OWN_ID -#define BLE_NFC_SEC_PARAM_KDIST_OWN_ID 1 + #define BLE_NFC_SEC_PARAM_KDIST_OWN_ID 1 #endif // BLE_NFC_SEC_PARAM_KDIST_PEER_ENC - Enables Long Term Key and Master Identification distribution by peer. - #ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ENC -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ENC 1 + #define BLE_NFC_SEC_PARAM_KDIST_PEER_ENC 1 #endif // BLE_NFC_SEC_PARAM_KDIST_PEER_ID - Enables Identity Resolving Key and Identity Address Information distribution by peer. - #ifndef BLE_NFC_SEC_PARAM_KDIST_PEER_ID -#define BLE_NFC_SEC_PARAM_KDIST_PEER_ID 1 + #define BLE_NFC_SEC_PARAM_KDIST_PEER_ID 1 #endif // // BLE_NFC_SEC_PARAM_MIN_KEY_SIZE - Minimal size of a security key. -// <7=> 7 -// <8=> 8 -// <9=> 9 -// <10=> 10 -// <11=> 11 -// <12=> 12 -// <13=> 13 -// <14=> 14 -// <15=> 15 -// <16=> 16 +// <7=> 7 +// <8=> 8 +// <9=> 9 +// <10=> 10 +// <11=> 11 +// <12=> 12 +// <13=> 13 +// <14=> 14 +// <15=> 15 +// <16=> 16 #ifndef BLE_NFC_SEC_PARAM_MIN_KEY_SIZE -#define BLE_NFC_SEC_PARAM_MIN_KEY_SIZE 7 + #define BLE_NFC_SEC_PARAM_MIN_KEY_SIZE 7 #endif // BLE_NFC_SEC_PARAM_MAX_KEY_SIZE - Maximal size of a security key. -// <7=> 7 -// <8=> 8 -// <9=> 9 -// <10=> 10 -// <11=> 11 -// <12=> 12 -// <13=> 13 -// <14=> 14 -// <15=> 15 -// <16=> 16 +// <7=> 7 +// <8=> 8 +// <9=> 9 +// <10=> 10 +// <11=> 11 +// <12=> 12 +// <13=> 13 +// <14=> 14 +// <15=> 15 +// <16=> 16 #ifndef BLE_NFC_SEC_PARAM_MAX_KEY_SIZE -#define BLE_NFC_SEC_PARAM_MAX_KEY_SIZE 16 + #define BLE_NFC_SEC_PARAM_MAX_KEY_SIZE 16 #endif -// +// //========================================================== // // NFC_BLE_PAIR_MSG_ENABLED - nfc_ble_pair_msg - NDEF message for OOB pairing encoder - #ifndef NFC_BLE_PAIR_MSG_ENABLED -#define NFC_BLE_PAIR_MSG_ENABLED 0 + #define NFC_BLE_PAIR_MSG_ENABLED 0 #endif // NFC_CH_COMMON_ENABLED - nfc_ble_pair_common - OOB pairing common data - #ifndef NFC_CH_COMMON_ENABLED -#define NFC_CH_COMMON_ENABLED 0 + #define NFC_CH_COMMON_ENABLED 0 #endif // NFC_EP_OOB_REC_ENABLED - nfc_ep_oob_rec - EP record for BLE pairing encoder - #ifndef NFC_EP_OOB_REC_ENABLED -#define NFC_EP_OOB_REC_ENABLED 0 + #define NFC_EP_OOB_REC_ENABLED 0 #endif // NFC_HS_REC_ENABLED - nfc_hs_rec - Handover Select NDEF record encoder - #ifndef NFC_HS_REC_ENABLED -#define NFC_HS_REC_ENABLED 0 + #define NFC_HS_REC_ENABLED 0 #endif // NFC_LE_OOB_REC_ENABLED - nfc_le_oob_rec - LE record for BLE pairing encoder - #ifndef NFC_LE_OOB_REC_ENABLED -#define NFC_LE_OOB_REC_ENABLED 0 + #define NFC_LE_OOB_REC_ENABLED 0 #endif // NFC_LE_OOB_REC_PARSER_ENABLED - nfc_le_oob_rec_parser - LE record parser - #ifndef NFC_LE_OOB_REC_PARSER_ENABLED -#define NFC_LE_OOB_REC_PARSER_ENABLED 0 + #define NFC_LE_OOB_REC_PARSER_ENABLED 0 #endif // NFC_NDEF_LAUNCHAPP_MSG_ENABLED - nfc_launchapp_msg - Encoding data for NDEF Application Launching message for NFC Tag - #ifndef NFC_NDEF_LAUNCHAPP_MSG_ENABLED -#define NFC_NDEF_LAUNCHAPP_MSG_ENABLED 0 + #define NFC_NDEF_LAUNCHAPP_MSG_ENABLED 0 #endif // NFC_NDEF_LAUNCHAPP_REC_ENABLED - nfc_launchapp_rec - Encoding data for NDEF Application Launching record for NFC Tag - #ifndef NFC_NDEF_LAUNCHAPP_REC_ENABLED -#define NFC_NDEF_LAUNCHAPP_REC_ENABLED 0 + #define NFC_NDEF_LAUNCHAPP_REC_ENABLED 0 #endif // NFC_NDEF_MSG_ENABLED - nfc_ndef_msg - NFC NDEF Message generator module //========================================================== #ifndef NFC_NDEF_MSG_ENABLED -#define NFC_NDEF_MSG_ENABLED 0 + #define NFC_NDEF_MSG_ENABLED 0 #endif // NFC_NDEF_MSG_TAG_TYPE - NFC Tag Type -// <2=> Type 2 Tag -// <4=> Type 4 Tag +// <2=> Type 2 Tag +// <4=> Type 4 Tag #ifndef NFC_NDEF_MSG_TAG_TYPE -#define NFC_NDEF_MSG_TAG_TYPE 2 + #define NFC_NDEF_MSG_TAG_TYPE 2 #endif // @@ -11605,39 +11241,39 @@ // NFC_NDEF_MSG_PARSER_ENABLED - nfc_ndef_msg_parser - NFC NDEF message parser module //========================================================== #ifndef NFC_NDEF_MSG_PARSER_ENABLED -#define NFC_NDEF_MSG_PARSER_ENABLED 0 + #define NFC_NDEF_MSG_PARSER_ENABLED 0 #endif // NFC_NDEF_MSG_PARSER_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NFC_NDEF_MSG_PARSER_LOG_ENABLED -#define NFC_NDEF_MSG_PARSER_LOG_ENABLED 0 + #define NFC_NDEF_MSG_PARSER_LOG_ENABLED 0 #endif // NFC_NDEF_MSG_PARSER_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_NDEF_MSG_PARSER_LOG_LEVEL -#define NFC_NDEF_MSG_PARSER_LOG_LEVEL 3 + #define NFC_NDEF_MSG_PARSER_LOG_LEVEL 3 #endif // NFC_NDEF_MSG_PARSER_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_NDEF_MSG_PARSER_INFO_COLOR -#define NFC_NDEF_MSG_PARSER_INFO_COLOR 0 + #define NFC_NDEF_MSG_PARSER_INFO_COLOR 0 #endif // @@ -11646,47 +11282,46 @@ // NFC_NDEF_RECORD_ENABLED - nfc_ndef_record - NFC NDEF Record generator module - #ifndef NFC_NDEF_RECORD_ENABLED -#define NFC_NDEF_RECORD_ENABLED 0 + #define NFC_NDEF_RECORD_ENABLED 0 #endif // NFC_NDEF_RECORD_PARSER_ENABLED - nfc_ndef_record_parser - NFC NDEF Record parser module //========================================================== #ifndef NFC_NDEF_RECORD_PARSER_ENABLED -#define NFC_NDEF_RECORD_PARSER_ENABLED 0 + #define NFC_NDEF_RECORD_PARSER_ENABLED 0 #endif // NFC_NDEF_RECORD_PARSER_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NFC_NDEF_RECORD_PARSER_LOG_ENABLED -#define NFC_NDEF_RECORD_PARSER_LOG_ENABLED 0 + #define NFC_NDEF_RECORD_PARSER_LOG_ENABLED 0 #endif // NFC_NDEF_RECORD_PARSER_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_NDEF_RECORD_PARSER_LOG_LEVEL -#define NFC_NDEF_RECORD_PARSER_LOG_LEVEL 3 + #define NFC_NDEF_RECORD_PARSER_LOG_LEVEL 3 #endif // NFC_NDEF_RECORD_PARSER_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_NDEF_RECORD_PARSER_INFO_COLOR -#define NFC_NDEF_RECORD_PARSER_INFO_COLOR 0 + #define NFC_NDEF_RECORD_PARSER_INFO_COLOR 0 #endif // @@ -11695,61 +11330,58 @@ // NFC_NDEF_TEXT_RECORD_ENABLED - nfc_text_rec - Encoding data for a text record for NFC Tag - #ifndef NFC_NDEF_TEXT_RECORD_ENABLED -#define NFC_NDEF_TEXT_RECORD_ENABLED 0 + #define NFC_NDEF_TEXT_RECORD_ENABLED 0 #endif // NFC_NDEF_URI_MSG_ENABLED - nfc_uri_msg - Encoding data for NDEF message with URI record for NFC Tag - #ifndef NFC_NDEF_URI_MSG_ENABLED -#define NFC_NDEF_URI_MSG_ENABLED 0 + #define NFC_NDEF_URI_MSG_ENABLED 0 #endif // NFC_NDEF_URI_REC_ENABLED - nfc_uri_rec - Encoding data for a URI record for NFC Tag - #ifndef NFC_NDEF_URI_REC_ENABLED -#define NFC_NDEF_URI_REC_ENABLED 0 + #define NFC_NDEF_URI_REC_ENABLED 0 #endif // NFC_T2T_PARSER_ENABLED - nfc_type_2_tag_parser - Parser for decoding Type 2 Tag data //========================================================== #ifndef NFC_T2T_PARSER_ENABLED -#define NFC_T2T_PARSER_ENABLED 0 + #define NFC_T2T_PARSER_ENABLED 0 #endif // NFC_T2T_PARSER_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NFC_T2T_PARSER_LOG_ENABLED -#define NFC_T2T_PARSER_LOG_ENABLED 0 + #define NFC_T2T_PARSER_LOG_ENABLED 0 #endif // NFC_T2T_PARSER_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_T2T_PARSER_LOG_LEVEL -#define NFC_T2T_PARSER_LOG_LEVEL 3 + #define NFC_T2T_PARSER_LOG_LEVEL 3 #endif // NFC_T2T_PARSER_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_T2T_PARSER_INFO_COLOR -#define NFC_T2T_PARSER_INFO_COLOR 0 + #define NFC_T2T_PARSER_INFO_COLOR 0 #endif // @@ -11759,39 +11391,39 @@ // NFC_T4T_APDU_ENABLED - nfc_t4t_apdu - APDU encoder/decoder for Type 4 Tag //========================================================== #ifndef NFC_T4T_APDU_ENABLED -#define NFC_T4T_APDU_ENABLED 0 + #define NFC_T4T_APDU_ENABLED 0 #endif // NFC_T4T_APDU_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NFC_T4T_APDU_LOG_ENABLED -#define NFC_T4T_APDU_LOG_ENABLED 0 + #define NFC_T4T_APDU_LOG_ENABLED 0 #endif // NFC_T4T_APDU_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_T4T_APDU_LOG_LEVEL -#define NFC_T4T_APDU_LOG_LEVEL 3 + #define NFC_T4T_APDU_LOG_LEVEL 3 #endif // NFC_T4T_APDU_LOG_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_T4T_APDU_LOG_COLOR -#define NFC_T4T_APDU_LOG_COLOR 0 + #define NFC_T4T_APDU_LOG_COLOR 0 #endif // @@ -11801,39 +11433,39 @@ // NFC_T4T_CC_FILE_PARSER_ENABLED - nfc_t4t_cc_file - Capability Container file for Type 4 Tag //========================================================== #ifndef NFC_T4T_CC_FILE_PARSER_ENABLED -#define NFC_T4T_CC_FILE_PARSER_ENABLED 0 + #define NFC_T4T_CC_FILE_PARSER_ENABLED 0 #endif // NFC_T4T_CC_FILE_PARSER_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NFC_T4T_CC_FILE_PARSER_LOG_ENABLED -#define NFC_T4T_CC_FILE_PARSER_LOG_ENABLED 0 + #define NFC_T4T_CC_FILE_PARSER_LOG_ENABLED 0 #endif // NFC_T4T_CC_FILE_PARSER_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_T4T_CC_FILE_PARSER_LOG_LEVEL -#define NFC_T4T_CC_FILE_PARSER_LOG_LEVEL 3 + #define NFC_T4T_CC_FILE_PARSER_LOG_LEVEL 3 #endif // NFC_T4T_CC_FILE_PARSER_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_T4T_CC_FILE_PARSER_INFO_COLOR -#define NFC_T4T_CC_FILE_PARSER_INFO_COLOR 0 + #define NFC_T4T_CC_FILE_PARSER_INFO_COLOR 0 #endif // @@ -11843,51 +11475,51 @@ // NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED - nfc_t4t_hl_detection_procedures - NDEF Detection Procedure for Type 4 Tag //========================================================== #ifndef NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED -#define NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED 0 + #define NFC_T4T_HL_DETECTION_PROCEDURES_ENABLED 0 #endif // NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED -#define NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED 0 + #define NFC_T4T_HL_DETECTION_PROCEDURES_LOG_ENABLED 0 #endif // NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL -#define NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL 3 + #define NFC_T4T_HL_DETECTION_PROCEDURES_LOG_LEVEL 3 #endif // NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR -#define NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR 0 + #define NFC_T4T_HL_DETECTION_PROCEDURES_INFO_COLOR 0 #endif // -// APDU_BUFF_SIZE - Size (in bytes) of the buffer for APDU storage +// APDU_BUFF_SIZE - Size (in bytes) of the buffer for APDU storage #ifndef APDU_BUFF_SIZE -#define APDU_BUFF_SIZE 250 + #define APDU_BUFF_SIZE 250 #endif -// CC_STORAGE_BUFF_SIZE - Size (in bytes) of the buffer for CC file storage +// CC_STORAGE_BUFF_SIZE - Size (in bytes) of the buffer for CC file storage #ifndef CC_STORAGE_BUFF_SIZE -#define CC_STORAGE_BUFF_SIZE 64 + #define CC_STORAGE_BUFF_SIZE 64 #endif // @@ -11895,707 +11527,704 @@ // NFC_T4T_TLV_BLOCK_PARSER_ENABLED - nfc_t4t_tlv_block - TLV block for Type 4 Tag //========================================================== #ifndef NFC_T4T_TLV_BLOCK_PARSER_ENABLED -#define NFC_T4T_TLV_BLOCK_PARSER_ENABLED 0 + #define NFC_T4T_TLV_BLOCK_PARSER_ENABLED 0 #endif // NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED -#define NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED 0 + #define NFC_T4T_TLV_BLOCK_PARSER_LOG_ENABLED 0 #endif // NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL - Default Severity level -// <0=> Off -// <1=> Error -// <2=> Warning -// <3=> Info -// <4=> Debug +// <0=> Off +// <1=> Error +// <2=> Warning +// <3=> Info +// <4=> Debug #ifndef NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL -#define NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL 3 + #define NFC_T4T_TLV_BLOCK_PARSER_LOG_LEVEL 3 #endif // NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR - ANSI escape code prefix. -// <0=> Default -// <1=> Black -// <2=> Red -// <3=> Green -// <4=> Yellow -// <5=> Blue -// <6=> Magenta -// <7=> Cyan -// <8=> White +// <0=> Default +// <1=> Black +// <2=> Red +// <3=> Green +// <4=> Yellow +// <5=> Blue +// <6=> Magenta +// <7=> Cyan +// <8=> White #ifndef NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR -#define NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR 0 + #define NFC_T4T_TLV_BLOCK_PARSER_INFO_COLOR 0 #endif // // -// +// //========================================================== -// nRF_SoftDevice +// nRF_SoftDevice //========================================================== // NRF_SDH_ANT_ENABLED - nrf_sdh_ant - SoftDevice ANT event handler //========================================================== #ifndef NRF_SDH_ANT_ENABLED -#define NRF_SDH_ANT_ENABLED 0 + #define NRF_SDH_ANT_ENABLED 0 #endif -// ANT Channels +// ANT Channels //========================================================== -// NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED - Allocated ANT channels. +// NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED - Allocated ANT channels. #ifndef NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED -#define NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED 0 + #define NRF_SDH_ANT_TOTAL_CHANNELS_ALLOCATED 0 #endif -// NRF_SDH_ANT_ENCRYPTED_CHANNELS - Encrypted ANT channels. +// NRF_SDH_ANT_ENCRYPTED_CHANNELS - Encrypted ANT channels. #ifndef NRF_SDH_ANT_ENCRYPTED_CHANNELS -#define NRF_SDH_ANT_ENCRYPTED_CHANNELS 0 + #define NRF_SDH_ANT_ENCRYPTED_CHANNELS 0 #endif -// +// //========================================================== -// ANT Queues +// ANT Queues //========================================================== -// NRF_SDH_ANT_EVENT_QUEUE_SIZE - Event queue size. +// NRF_SDH_ANT_EVENT_QUEUE_SIZE - Event queue size. #ifndef NRF_SDH_ANT_EVENT_QUEUE_SIZE -#define NRF_SDH_ANT_EVENT_QUEUE_SIZE 32 + #define NRF_SDH_ANT_EVENT_QUEUE_SIZE 32 #endif -// NRF_SDH_ANT_BURST_QUEUE_SIZE - ANT burst queue size. +// NRF_SDH_ANT_BURST_QUEUE_SIZE - ANT burst queue size. #ifndef NRF_SDH_ANT_BURST_QUEUE_SIZE -#define NRF_SDH_ANT_BURST_QUEUE_SIZE 128 + #define NRF_SDH_ANT_BURST_QUEUE_SIZE 128 #endif -// +// //========================================================== // ANT Observers - Observers and priority levels //========================================================== -// NRF_SDH_ANT_OBSERVER_PRIO_LEVELS - Total number of priority levels for ANT observers. +// NRF_SDH_ANT_OBSERVER_PRIO_LEVELS - Total number of priority levels for ANT observers. // This setting configures the number of priority levels available for the ANT event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. #ifndef NRF_SDH_ANT_OBSERVER_PRIO_LEVELS -#define NRF_SDH_ANT_OBSERVER_PRIO_LEVELS 2 + #define NRF_SDH_ANT_OBSERVER_PRIO_LEVELS 2 #endif // ANT Observers priorities - Invididual priorities //========================================================== -// ANT_BPWR_ANT_OBSERVER_PRIO +// ANT_BPWR_ANT_OBSERVER_PRIO // Priority with which ANT events are dispatched to the Bicycle Power Profile. #ifndef ANT_BPWR_ANT_OBSERVER_PRIO -#define ANT_BPWR_ANT_OBSERVER_PRIO 1 + #define ANT_BPWR_ANT_OBSERVER_PRIO 1 #endif -// ANT_BSC_ANT_OBSERVER_PRIO +// ANT_BSC_ANT_OBSERVER_PRIO // Priority with which ANT events are dispatched to the Bicycle Speed and Cadence Profile. #ifndef ANT_BSC_ANT_OBSERVER_PRIO -#define ANT_BSC_ANT_OBSERVER_PRIO 1 + #define ANT_BSC_ANT_OBSERVER_PRIO 1 #endif -// ANT_ENCRYPT_ANT_OBSERVER_PRIO +// ANT_ENCRYPT_ANT_OBSERVER_PRIO // Priority with which ANT events are dispatched to the Cryptographic ANT stack configuration module. #ifndef ANT_ENCRYPT_ANT_OBSERVER_PRIO -#define ANT_ENCRYPT_ANT_OBSERVER_PRIO 1 + #define ANT_ENCRYPT_ANT_OBSERVER_PRIO 1 #endif -// ANT_HRM_ANT_OBSERVER_PRIO +// ANT_HRM_ANT_OBSERVER_PRIO // Priority with which ANT events are dispatched to the Heart Rate Monitor. #ifndef ANT_HRM_ANT_OBSERVER_PRIO -#define ANT_HRM_ANT_OBSERVER_PRIO 1 + #define ANT_HRM_ANT_OBSERVER_PRIO 1 #endif -// ANT_SDM_ANT_OBSERVER_PRIO +// ANT_SDM_ANT_OBSERVER_PRIO // Priority with which ANT events are dispatched to the Stride Based Speed and Distance Monitor Profile. #ifndef ANT_SDM_ANT_OBSERVER_PRIO -#define ANT_SDM_ANT_OBSERVER_PRIO 1 + #define ANT_SDM_ANT_OBSERVER_PRIO 1 #endif -// ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO +// ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO // Priority with which ANT events are dispatched to the ANT state indicator module. #ifndef ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO -#define ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO 1 + #define ANT_STATE_INDICATOR_ANT_OBSERVER_PRIO 1 #endif -// BSP_BTN_ANT_OBSERVER_PRIO +// BSP_BTN_ANT_OBSERVER_PRIO // Priority with which ANT events are dispatched to the Button Control module. #ifndef BSP_BTN_ANT_OBSERVER_PRIO -#define BSP_BTN_ANT_OBSERVER_PRIO 1 + #define BSP_BTN_ANT_OBSERVER_PRIO 1 #endif -// NRF_DFU_ANT_EVT_HANDLER_PRIO - DFU ANT event handling priority. -// Priority used to register the ANT event handler for DFU purposes. Change this if there is other ANT event handlers that should be higher priority. +// NRF_DFU_ANT_EVT_HANDLER_PRIO - DFU ANT event handling priority. +// Priority used to register the ANT event handler for DFU purposes. Change this if there is other ANT event handlers that should be +// higher priority. #ifndef NRF_DFU_ANT_EVT_HANDLER_PRIO -#define NRF_DFU_ANT_EVT_HANDLER_PRIO 1 + #define NRF_DFU_ANT_EVT_HANDLER_PRIO 1 #endif -// +// //========================================================== -// +// //========================================================== - // // NRF_SDH_BLE_ENABLED - nrf_sdh_ble - SoftDevice BLE event handler //========================================================== #ifndef NRF_SDH_BLE_ENABLED -#define NRF_SDH_BLE_ENABLED 1 + #define NRF_SDH_BLE_ENABLED 1 #endif // BLE Stack configuration - Stack configuration parameters // The SoftDevice handler will configure the stack with these parameters when calling @ref nrf_sdh_ble_default_cfg_set. -// Other libraries might depend on these values; keep them up-to-date even if you are not explicitely calling @ref nrf_sdh_ble_default_cfg_set. +// Other libraries might depend on these values; keep them up-to-date even if you are not explicitely calling @ref +// nrf_sdh_ble_default_cfg_set. //========================================================== -// NRF_SDH_BLE_GAP_DATA_LENGTH <27-251> - +// NRF_SDH_BLE_GAP_DATA_LENGTH <27-251> // Requested BLE GAP data length to be negotiated. #ifndef NRF_SDH_BLE_GAP_DATA_LENGTH -#define NRF_SDH_BLE_GAP_DATA_LENGTH 27 + #define NRF_SDH_BLE_GAP_DATA_LENGTH 27 #endif -// NRF_SDH_BLE_PERIPHERAL_LINK_COUNT - Maximum number of peripheral links. +// NRF_SDH_BLE_PERIPHERAL_LINK_COUNT - Maximum number of peripheral links. #ifndef NRF_SDH_BLE_PERIPHERAL_LINK_COUNT -#define NRF_SDH_BLE_PERIPHERAL_LINK_COUNT 1 + #define NRF_SDH_BLE_PERIPHERAL_LINK_COUNT 1 #endif -// NRF_SDH_BLE_CENTRAL_LINK_COUNT - Maximum number of central links. +// NRF_SDH_BLE_CENTRAL_LINK_COUNT - Maximum number of central links. #ifndef NRF_SDH_BLE_CENTRAL_LINK_COUNT -#define NRF_SDH_BLE_CENTRAL_LINK_COUNT 0 + #define NRF_SDH_BLE_CENTRAL_LINK_COUNT 0 #endif -// NRF_SDH_BLE_TOTAL_LINK_COUNT - Total link count. +// NRF_SDH_BLE_TOTAL_LINK_COUNT - Total link count. // Maximum number of total concurrent connections using the default configuration. #ifndef NRF_SDH_BLE_TOTAL_LINK_COUNT -#define NRF_SDH_BLE_TOTAL_LINK_COUNT 1 + #define NRF_SDH_BLE_TOTAL_LINK_COUNT 1 #endif -// NRF_SDH_BLE_GAP_EVENT_LENGTH - GAP event length. +// NRF_SDH_BLE_GAP_EVENT_LENGTH - GAP event length. // The time set aside for this connection on every connection interval in 1.25 ms units. #ifndef NRF_SDH_BLE_GAP_EVENT_LENGTH -#define NRF_SDH_BLE_GAP_EVENT_LENGTH 6 + #define NRF_SDH_BLE_GAP_EVENT_LENGTH 6 #endif -// NRF_SDH_BLE_GATT_MAX_MTU_SIZE - Static maximum MTU size. +// NRF_SDH_BLE_GATT_MAX_MTU_SIZE - Static maximum MTU size. #ifndef NRF_SDH_BLE_GATT_MAX_MTU_SIZE -#define NRF_SDH_BLE_GATT_MAX_MTU_SIZE 23 + #define NRF_SDH_BLE_GATT_MAX_MTU_SIZE 23 #endif -// NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4. +// NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE - Attribute Table size in bytes. The size must be a multiple of 4. #ifndef NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE -#define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1408 + #define NRF_SDH_BLE_GATTS_ATTR_TAB_SIZE 1408 #endif -// NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs. +// NRF_SDH_BLE_VS_UUID_COUNT - The number of vendor-specific UUIDs. #ifndef NRF_SDH_BLE_VS_UUID_COUNT -#define NRF_SDH_BLE_VS_UUID_COUNT 0 + #define NRF_SDH_BLE_VS_UUID_COUNT 0 #endif // NRF_SDH_BLE_SERVICE_CHANGED - Include the Service Changed characteristic in the Attribute Table. - #ifndef NRF_SDH_BLE_SERVICE_CHANGED -#define NRF_SDH_BLE_SERVICE_CHANGED 1 + #define NRF_SDH_BLE_SERVICE_CHANGED 1 #endif -// +// //========================================================== // BLE Observers - Observers and priority levels //========================================================== -// NRF_SDH_BLE_OBSERVER_PRIO_LEVELS - Total number of priority levels for BLE observers. +// NRF_SDH_BLE_OBSERVER_PRIO_LEVELS - Total number of priority levels for BLE observers. // This setting configures the number of priority levels available for BLE event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. #ifndef NRF_SDH_BLE_OBSERVER_PRIO_LEVELS -#define NRF_SDH_BLE_OBSERVER_PRIO_LEVELS 4 + #define NRF_SDH_BLE_OBSERVER_PRIO_LEVELS 4 #endif // BLE Observers priorities - Invididual priorities //========================================================== -// BLE_ADV_BLE_OBSERVER_PRIO +// BLE_ADV_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Advertising module. #ifndef BLE_ADV_BLE_OBSERVER_PRIO -#define BLE_ADV_BLE_OBSERVER_PRIO 1 + #define BLE_ADV_BLE_OBSERVER_PRIO 1 #endif -// BLE_ANCS_C_BLE_OBSERVER_PRIO +// BLE_ANCS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Apple Notification Service Client. #ifndef BLE_ANCS_C_BLE_OBSERVER_PRIO -#define BLE_ANCS_C_BLE_OBSERVER_PRIO 2 + #define BLE_ANCS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_ANS_C_BLE_OBSERVER_PRIO +// BLE_ANS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Alert Notification Service Client. #ifndef BLE_ANS_C_BLE_OBSERVER_PRIO -#define BLE_ANS_C_BLE_OBSERVER_PRIO 2 + #define BLE_ANS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_BAS_BLE_OBSERVER_PRIO +// BLE_BAS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Battery Service. #ifndef BLE_BAS_BLE_OBSERVER_PRIO -#define BLE_BAS_BLE_OBSERVER_PRIO 2 + #define BLE_BAS_BLE_OBSERVER_PRIO 2 #endif -// BLE_BAS_C_BLE_OBSERVER_PRIO +// BLE_BAS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Battery Service Client. #ifndef BLE_BAS_C_BLE_OBSERVER_PRIO -#define BLE_BAS_C_BLE_OBSERVER_PRIO 2 + #define BLE_BAS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_BPS_BLE_OBSERVER_PRIO +// BLE_BPS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Blood Pressure Service. #ifndef BLE_BPS_BLE_OBSERVER_PRIO -#define BLE_BPS_BLE_OBSERVER_PRIO 2 + #define BLE_BPS_BLE_OBSERVER_PRIO 2 #endif -// BLE_CONN_PARAMS_BLE_OBSERVER_PRIO +// BLE_CONN_PARAMS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Connection parameters module. #ifndef BLE_CONN_PARAMS_BLE_OBSERVER_PRIO -#define BLE_CONN_PARAMS_BLE_OBSERVER_PRIO 1 + #define BLE_CONN_PARAMS_BLE_OBSERVER_PRIO 1 #endif -// BLE_CONN_STATE_BLE_OBSERVER_PRIO +// BLE_CONN_STATE_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Connection State module. #ifndef BLE_CONN_STATE_BLE_OBSERVER_PRIO -#define BLE_CONN_STATE_BLE_OBSERVER_PRIO 0 + #define BLE_CONN_STATE_BLE_OBSERVER_PRIO 0 #endif -// BLE_CSCS_BLE_OBSERVER_PRIO +// BLE_CSCS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Cycling Speed and Cadence Service. #ifndef BLE_CSCS_BLE_OBSERVER_PRIO -#define BLE_CSCS_BLE_OBSERVER_PRIO 2 + #define BLE_CSCS_BLE_OBSERVER_PRIO 2 #endif -// BLE_CTS_C_BLE_OBSERVER_PRIO +// BLE_CTS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Current Time Service Client. #ifndef BLE_CTS_C_BLE_OBSERVER_PRIO -#define BLE_CTS_C_BLE_OBSERVER_PRIO 2 + #define BLE_CTS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_DB_DISC_BLE_OBSERVER_PRIO +// BLE_DB_DISC_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Database Discovery module. #ifndef BLE_DB_DISC_BLE_OBSERVER_PRIO -#define BLE_DB_DISC_BLE_OBSERVER_PRIO 1 + #define BLE_DB_DISC_BLE_OBSERVER_PRIO 1 #endif -// BLE_DFU_BLE_OBSERVER_PRIO +// BLE_DFU_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the DFU Service. #ifndef BLE_DFU_BLE_OBSERVER_PRIO -#define BLE_DFU_BLE_OBSERVER_PRIO 2 + #define BLE_DFU_BLE_OBSERVER_PRIO 2 #endif -// BLE_DIS_C_BLE_OBSERVER_PRIO +// BLE_DIS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Device Information Client. #ifndef BLE_DIS_C_BLE_OBSERVER_PRIO -#define BLE_DIS_C_BLE_OBSERVER_PRIO 2 + #define BLE_DIS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_GLS_BLE_OBSERVER_PRIO +// BLE_GLS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Glucose Service. #ifndef BLE_GLS_BLE_OBSERVER_PRIO -#define BLE_GLS_BLE_OBSERVER_PRIO 2 + #define BLE_GLS_BLE_OBSERVER_PRIO 2 #endif -// BLE_HIDS_BLE_OBSERVER_PRIO +// BLE_HIDS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Human Interface Device Service. #ifndef BLE_HIDS_BLE_OBSERVER_PRIO -#define BLE_HIDS_BLE_OBSERVER_PRIO 2 + #define BLE_HIDS_BLE_OBSERVER_PRIO 2 #endif -// BLE_HRS_BLE_OBSERVER_PRIO +// BLE_HRS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Heart Rate Service. #ifndef BLE_HRS_BLE_OBSERVER_PRIO -#define BLE_HRS_BLE_OBSERVER_PRIO 2 + #define BLE_HRS_BLE_OBSERVER_PRIO 2 #endif -// BLE_HRS_C_BLE_OBSERVER_PRIO +// BLE_HRS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Heart Rate Service Client. #ifndef BLE_HRS_C_BLE_OBSERVER_PRIO -#define BLE_HRS_C_BLE_OBSERVER_PRIO 2 + #define BLE_HRS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_HTS_BLE_OBSERVER_PRIO +// BLE_HTS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Health Thermometer Service. #ifndef BLE_HTS_BLE_OBSERVER_PRIO -#define BLE_HTS_BLE_OBSERVER_PRIO 2 + #define BLE_HTS_BLE_OBSERVER_PRIO 2 #endif -// BLE_IAS_BLE_OBSERVER_PRIO +// BLE_IAS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Immediate Alert Service. #ifndef BLE_IAS_BLE_OBSERVER_PRIO -#define BLE_IAS_BLE_OBSERVER_PRIO 2 + #define BLE_IAS_BLE_OBSERVER_PRIO 2 #endif -// BLE_IAS_C_BLE_OBSERVER_PRIO +// BLE_IAS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Immediate Alert Service Client. #ifndef BLE_IAS_C_BLE_OBSERVER_PRIO -#define BLE_IAS_C_BLE_OBSERVER_PRIO 2 + #define BLE_IAS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_LBS_BLE_OBSERVER_PRIO +// BLE_LBS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the LED Button Service. #ifndef BLE_LBS_BLE_OBSERVER_PRIO -#define BLE_LBS_BLE_OBSERVER_PRIO 2 + #define BLE_LBS_BLE_OBSERVER_PRIO 2 #endif -// BLE_LBS_C_BLE_OBSERVER_PRIO +// BLE_LBS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the LED Button Service Client. #ifndef BLE_LBS_C_BLE_OBSERVER_PRIO -#define BLE_LBS_C_BLE_OBSERVER_PRIO 2 + #define BLE_LBS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_LLS_BLE_OBSERVER_PRIO +// BLE_LLS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Link Loss Service. #ifndef BLE_LLS_BLE_OBSERVER_PRIO -#define BLE_LLS_BLE_OBSERVER_PRIO 2 + #define BLE_LLS_BLE_OBSERVER_PRIO 2 #endif -// BLE_LNS_BLE_OBSERVER_PRIO +// BLE_LNS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Location Navigation Service. #ifndef BLE_LNS_BLE_OBSERVER_PRIO -#define BLE_LNS_BLE_OBSERVER_PRIO 2 + #define BLE_LNS_BLE_OBSERVER_PRIO 2 #endif -// BLE_NUS_BLE_OBSERVER_PRIO +// BLE_NUS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the UART Service. #ifndef BLE_NUS_BLE_OBSERVER_PRIO -#define BLE_NUS_BLE_OBSERVER_PRIO 2 + #define BLE_NUS_BLE_OBSERVER_PRIO 2 #endif -// BLE_NUS_C_BLE_OBSERVER_PRIO +// BLE_NUS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the UART Central Service. #ifndef BLE_NUS_C_BLE_OBSERVER_PRIO -#define BLE_NUS_C_BLE_OBSERVER_PRIO 2 + #define BLE_NUS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_OTS_BLE_OBSERVER_PRIO +// BLE_OTS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Object transfer service. #ifndef BLE_OTS_BLE_OBSERVER_PRIO -#define BLE_OTS_BLE_OBSERVER_PRIO 2 + #define BLE_OTS_BLE_OBSERVER_PRIO 2 #endif -// BLE_OTS_C_BLE_OBSERVER_PRIO +// BLE_OTS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Object transfer service client. #ifndef BLE_OTS_C_BLE_OBSERVER_PRIO -#define BLE_OTS_C_BLE_OBSERVER_PRIO 2 + #define BLE_OTS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_RSCS_BLE_OBSERVER_PRIO +// BLE_RSCS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Running Speed and Cadence Service. #ifndef BLE_RSCS_BLE_OBSERVER_PRIO -#define BLE_RSCS_BLE_OBSERVER_PRIO 2 + #define BLE_RSCS_BLE_OBSERVER_PRIO 2 #endif -// BLE_RSCS_C_BLE_OBSERVER_PRIO +// BLE_RSCS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Running Speed and Cadence Client. #ifndef BLE_RSCS_C_BLE_OBSERVER_PRIO -#define BLE_RSCS_C_BLE_OBSERVER_PRIO 2 + #define BLE_RSCS_C_BLE_OBSERVER_PRIO 2 #endif -// BLE_TPS_BLE_OBSERVER_PRIO +// BLE_TPS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the TX Power Service. #ifndef BLE_TPS_BLE_OBSERVER_PRIO -#define BLE_TPS_BLE_OBSERVER_PRIO 2 + #define BLE_TPS_BLE_OBSERVER_PRIO 2 #endif -// BSP_BTN_BLE_OBSERVER_PRIO +// BSP_BTN_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Button Control module. #ifndef BSP_BTN_BLE_OBSERVER_PRIO -#define BSP_BTN_BLE_OBSERVER_PRIO 1 + #define BSP_BTN_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif // NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif -// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif -// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif -// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO +// NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the NFC pairing library. #ifndef NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO -#define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 + #define NFC_BLE_PAIR_LIB_BLE_OBSERVER_PRIO 1 #endif -// NRF_BLE_BMS_BLE_OBSERVER_PRIO +// NRF_BLE_BMS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Bond Management Service. #ifndef NRF_BLE_BMS_BLE_OBSERVER_PRIO -#define NRF_BLE_BMS_BLE_OBSERVER_PRIO 2 + #define NRF_BLE_BMS_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_CGMS_BLE_OBSERVER_PRIO +// NRF_BLE_CGMS_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Contiuon Glucose Monitoring Service. #ifndef NRF_BLE_CGMS_BLE_OBSERVER_PRIO -#define NRF_BLE_CGMS_BLE_OBSERVER_PRIO 2 + #define NRF_BLE_CGMS_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_ES_BLE_OBSERVER_PRIO +// NRF_BLE_ES_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Eddystone module. #ifndef NRF_BLE_ES_BLE_OBSERVER_PRIO -#define NRF_BLE_ES_BLE_OBSERVER_PRIO 2 + #define NRF_BLE_ES_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO +// NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the GATT Service Client. #ifndef NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO -#define NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO 2 + #define NRF_BLE_GATTS_C_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_GATT_BLE_OBSERVER_PRIO +// NRF_BLE_GATT_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the GATT module. #ifndef NRF_BLE_GATT_BLE_OBSERVER_PRIO -#define NRF_BLE_GATT_BLE_OBSERVER_PRIO 1 + #define NRF_BLE_GATT_BLE_OBSERVER_PRIO 1 #endif -// NRF_BLE_QWR_BLE_OBSERVER_PRIO +// NRF_BLE_QWR_BLE_OBSERVER_PRIO // Priority with which BLE events are dispatched to the Queued writes module. #ifndef NRF_BLE_QWR_BLE_OBSERVER_PRIO -#define NRF_BLE_QWR_BLE_OBSERVER_PRIO 2 + #define NRF_BLE_QWR_BLE_OBSERVER_PRIO 2 #endif -// NRF_BLE_SCAN_OBSERVER_PRIO +// NRF_BLE_SCAN_OBSERVER_PRIO // Priority for dispatching the BLE events to the Scanning Module. #ifndef NRF_BLE_SCAN_OBSERVER_PRIO -#define NRF_BLE_SCAN_OBSERVER_PRIO 1 + #define NRF_BLE_SCAN_OBSERVER_PRIO 1 #endif -// PM_BLE_OBSERVER_PRIO - Priority with which BLE events are dispatched to the Peer Manager module. +// PM_BLE_OBSERVER_PRIO - Priority with which BLE events are dispatched to the Peer Manager module. #ifndef PM_BLE_OBSERVER_PRIO -#define PM_BLE_OBSERVER_PRIO 1 + #define PM_BLE_OBSERVER_PRIO 1 #endif -// +// //========================================================== -// +// //========================================================== - // // NRF_SDH_ENABLED - nrf_sdh - SoftDevice handler //========================================================== #ifndef NRF_SDH_ENABLED -#define NRF_SDH_ENABLED 1 + #define NRF_SDH_ENABLED 1 #endif -// Dispatch model +// Dispatch model // This setting configures how Stack events are dispatched to the application. //========================================================== // NRF_SDH_DISPATCH_MODEL - // NRF_SDH_DISPATCH_MODEL_INTERRUPT: SoftDevice events are passed to the application from the interrupt context. // NRF_SDH_DISPATCH_MODEL_APPSH: SoftDevice events are scheduled using @ref app_scheduler. // NRF_SDH_DISPATCH_MODEL_POLLING: SoftDevice events are to be fetched manually. -// <0=> NRF_SDH_DISPATCH_MODEL_INTERRUPT -// <1=> NRF_SDH_DISPATCH_MODEL_APPSH -// <2=> NRF_SDH_DISPATCH_MODEL_POLLING +// <0=> NRF_SDH_DISPATCH_MODEL_INTERRUPT +// <1=> NRF_SDH_DISPATCH_MODEL_APPSH +// <2=> NRF_SDH_DISPATCH_MODEL_POLLING #ifndef NRF_SDH_DISPATCH_MODEL -#define NRF_SDH_DISPATCH_MODEL 2 + #define NRF_SDH_DISPATCH_MODEL 2 #endif -// +// //========================================================== // Clock - SoftDevice clock configuration @@ -12603,17 +12232,17 @@ //========================================================== // NRF_SDH_CLOCK_LF_SRC - SoftDevice clock source. -// <0=> NRF_CLOCK_LF_SRC_RC -// <1=> NRF_CLOCK_LF_SRC_XTAL -// <2=> NRF_CLOCK_LF_SRC_SYNTH +// <0=> NRF_CLOCK_LF_SRC_RC +// <1=> NRF_CLOCK_LF_SRC_XTAL +// <2=> NRF_CLOCK_LF_SRC_SYNTH #ifndef NRF_SDH_CLOCK_LF_SRC -#define NRF_SDH_CLOCK_LF_SRC 1 + #define NRF_SDH_CLOCK_LF_SRC 1 #endif -// NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval. +// NRF_SDH_CLOCK_LF_RC_CTIV - SoftDevice calibration timer interval. #ifndef NRF_SDH_CLOCK_LF_RC_CTIV -#define NRF_SDH_CLOCK_LF_RC_CTIV 0 + #define NRF_SDH_CLOCK_LF_RC_CTIV 0 #endif // NRF_SDH_CLOCK_LF_RC_TEMP_CTIV - SoftDevice calibration timer interval under constant temperature. @@ -12621,7 +12250,7 @@ // if the temperature has not changed. #ifndef NRF_SDH_CLOCK_LF_RC_TEMP_CTIV -#define NRF_SDH_CLOCK_LF_RC_TEMP_CTIV 0 + #define NRF_SDH_CLOCK_LF_RC_TEMP_CTIV 0 #endif // NRF_SDH_CLOCK_LF_ACCURACY - External clock accuracy used in the LL to compute timing. @@ -12640,163 +12269,160 @@ // <11=> NRF_CLOCK_LF_ACCURACY_1_PPM #ifndef NRF_SDH_CLOCK_LF_ACCURACY -#define NRF_SDH_CLOCK_LF_ACCURACY 7 + #define NRF_SDH_CLOCK_LF_ACCURACY 7 #endif -// +// //========================================================== // SDH Observers - Observers and priority levels //========================================================== -// NRF_SDH_REQ_OBSERVER_PRIO_LEVELS - Total number of priority levels for request observers. +// NRF_SDH_REQ_OBSERVER_PRIO_LEVELS - Total number of priority levels for request observers. // This setting configures the number of priority levels available for the SoftDevice request event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. #ifndef NRF_SDH_REQ_OBSERVER_PRIO_LEVELS -#define NRF_SDH_REQ_OBSERVER_PRIO_LEVELS 2 + #define NRF_SDH_REQ_OBSERVER_PRIO_LEVELS 2 #endif -// NRF_SDH_STATE_OBSERVER_PRIO_LEVELS - Total number of priority levels for state observers. +// NRF_SDH_STATE_OBSERVER_PRIO_LEVELS - Total number of priority levels for state observers. // This setting configures the number of priority levels available for the SoftDevice state event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. #ifndef NRF_SDH_STATE_OBSERVER_PRIO_LEVELS -#define NRF_SDH_STATE_OBSERVER_PRIO_LEVELS 2 + #define NRF_SDH_STATE_OBSERVER_PRIO_LEVELS 2 #endif -// NRF_SDH_STACK_OBSERVER_PRIO_LEVELS - Total number of priority levels for stack event observers. +// NRF_SDH_STACK_OBSERVER_PRIO_LEVELS - Total number of priority levels for stack event observers. // This setting configures the number of priority levels available for the SoftDevice stack event handlers (ANT, BLE, SoC). // The priority level of a handler determines the order in which it receives events, with respect to other handlers. #ifndef NRF_SDH_STACK_OBSERVER_PRIO_LEVELS -#define NRF_SDH_STACK_OBSERVER_PRIO_LEVELS 2 + #define NRF_SDH_STACK_OBSERVER_PRIO_LEVELS 2 #endif - // State Observers priorities - Invididual priorities //========================================================== -// CLOCK_CONFIG_STATE_OBSERVER_PRIO +// CLOCK_CONFIG_STATE_OBSERVER_PRIO // Priority with which state events are dispatched to the Clock driver. #ifndef CLOCK_CONFIG_STATE_OBSERVER_PRIO -#define CLOCK_CONFIG_STATE_OBSERVER_PRIO 0 + #define CLOCK_CONFIG_STATE_OBSERVER_PRIO 0 #endif -// POWER_CONFIG_STATE_OBSERVER_PRIO +// POWER_CONFIG_STATE_OBSERVER_PRIO // Priority with which state events are dispatched to the Power driver. #ifndef POWER_CONFIG_STATE_OBSERVER_PRIO -#define POWER_CONFIG_STATE_OBSERVER_PRIO 0 + #define POWER_CONFIG_STATE_OBSERVER_PRIO 0 #endif -// RNG_CONFIG_STATE_OBSERVER_PRIO +// RNG_CONFIG_STATE_OBSERVER_PRIO // Priority with which state events are dispatched to this module. #ifndef RNG_CONFIG_STATE_OBSERVER_PRIO -#define RNG_CONFIG_STATE_OBSERVER_PRIO 0 + #define RNG_CONFIG_STATE_OBSERVER_PRIO 0 #endif -// +// //========================================================== // Stack Event Observers priorities - Invididual priorities //========================================================== -// NRF_SDH_ANT_STACK_OBSERVER_PRIO +// NRF_SDH_ANT_STACK_OBSERVER_PRIO // This setting configures the priority with which ANT events are processed with respect to other events coming from the stack. // Modify this setting if you need to have ANT events dispatched before or after other stack events, such as BLE or SoC. // Zero is the highest priority. #ifndef NRF_SDH_ANT_STACK_OBSERVER_PRIO -#define NRF_SDH_ANT_STACK_OBSERVER_PRIO 0 + #define NRF_SDH_ANT_STACK_OBSERVER_PRIO 0 #endif -// NRF_SDH_BLE_STACK_OBSERVER_PRIO +// NRF_SDH_BLE_STACK_OBSERVER_PRIO // This setting configures the priority with which BLE events are processed with respect to other events coming from the stack. // Modify this setting if you need to have BLE events dispatched before or after other stack events, such as ANT or SoC. // Zero is the highest priority. #ifndef NRF_SDH_BLE_STACK_OBSERVER_PRIO -#define NRF_SDH_BLE_STACK_OBSERVER_PRIO 0 + #define NRF_SDH_BLE_STACK_OBSERVER_PRIO 0 #endif -// NRF_SDH_SOC_STACK_OBSERVER_PRIO +// NRF_SDH_SOC_STACK_OBSERVER_PRIO // This setting configures the priority with which SoC events are processed with respect to other events coming from the stack. // Modify this setting if you need to have SoC events dispatched before or after other stack events, such as ANT or BLE. // Zero is the highest priority. #ifndef NRF_SDH_SOC_STACK_OBSERVER_PRIO -#define NRF_SDH_SOC_STACK_OBSERVER_PRIO 0 + #define NRF_SDH_SOC_STACK_OBSERVER_PRIO 0 #endif -// +// //========================================================== -// +// //========================================================== - // // NRF_SDH_SOC_ENABLED - nrf_sdh_soc - SoftDevice SoC event handler //========================================================== #ifndef NRF_SDH_SOC_ENABLED -#define NRF_SDH_SOC_ENABLED 1 + #define NRF_SDH_SOC_ENABLED 1 #endif // SoC Observers - Observers and priority levels //========================================================== -// NRF_SDH_SOC_OBSERVER_PRIO_LEVELS - Total number of priority levels for SoC observers. +// NRF_SDH_SOC_OBSERVER_PRIO_LEVELS - Total number of priority levels for SoC observers. // This setting configures the number of priority levels available for the SoC event handlers. // The priority level of a handler determines the order in which it receives events, with respect to other handlers. #ifndef NRF_SDH_SOC_OBSERVER_PRIO_LEVELS -#define NRF_SDH_SOC_OBSERVER_PRIO_LEVELS 2 + #define NRF_SDH_SOC_OBSERVER_PRIO_LEVELS 2 #endif // SoC Observers priorities - Invididual priorities //========================================================== -// BLE_ADV_SOC_OBSERVER_PRIO +// BLE_ADV_SOC_OBSERVER_PRIO // Priority with which SoC events are dispatched to the Advertising module. #ifndef BLE_ADV_SOC_OBSERVER_PRIO -#define BLE_ADV_SOC_OBSERVER_PRIO 1 + #define BLE_ADV_SOC_OBSERVER_PRIO 1 #endif -// BLE_DFU_SOC_OBSERVER_PRIO +// BLE_DFU_SOC_OBSERVER_PRIO // Priority with which BLE events are dispatched to the DFU Service. #ifndef BLE_DFU_SOC_OBSERVER_PRIO -#define BLE_DFU_SOC_OBSERVER_PRIO 1 + #define BLE_DFU_SOC_OBSERVER_PRIO 1 #endif -// CLOCK_CONFIG_SOC_OBSERVER_PRIO +// CLOCK_CONFIG_SOC_OBSERVER_PRIO // Priority with which SoC events are dispatched to the Clock driver. #ifndef CLOCK_CONFIG_SOC_OBSERVER_PRIO -#define CLOCK_CONFIG_SOC_OBSERVER_PRIO 0 + #define CLOCK_CONFIG_SOC_OBSERVER_PRIO 0 #endif -// POWER_CONFIG_SOC_OBSERVER_PRIO +// POWER_CONFIG_SOC_OBSERVER_PRIO // Priority with which SoC events are dispatched to the Power driver. #ifndef POWER_CONFIG_SOC_OBSERVER_PRIO -#define POWER_CONFIG_SOC_OBSERVER_PRIO 0 + #define POWER_CONFIG_SOC_OBSERVER_PRIO 0 #endif -// +// //========================================================== -// +// //========================================================== - // -// +// //========================================================== //========================================================== @@ -12812,27 +12438,26 @@ // or this value is actually used. It depends on which one is bigger. #ifndef SEGGER_RTT_CONFIG_BUFFER_SIZE_UP -#define SEGGER_RTT_CONFIG_BUFFER_SIZE_UP 512 + #define SEGGER_RTT_CONFIG_BUFFER_SIZE_UP 512 #endif // SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS - Maximum number of upstream buffers. #ifndef SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS -#define SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS 4 + #define SEGGER_RTT_CONFIG_MAX_NUM_UP_BUFFERS 4 #endif // SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN - Size of downstream buffer. #ifndef SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN -#define SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN 16 + #define SEGGER_RTT_CONFIG_BUFFER_SIZE_DOWN 16 #endif // SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS - Maximum number of downstream buffers. #ifndef SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS -#define SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS 2 + #define SEGGER_RTT_CONFIG_MAX_NUM_DOWN_BUFFERS 2 #endif // SEGGER_RTT_CONFIG_DEFAULT_MODE - RTT behavior if the buffer is full. - // The following modes are supported: // - SKIP - Do not block, output nothing. // - TRIM - Do not block, output as much as fits. @@ -12842,62 +12467,54 @@ // <2=> BLOCK_IF_FIFO_FULL #ifndef SEGGER_RTT_CONFIG_DEFAULT_MODE -#define SEGGER_RTT_CONFIG_DEFAULT_MODE 0 + #define SEGGER_RTT_CONFIG_DEFAULT_MODE 0 #endif // //========================================================== #ifndef NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE -#define NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE 512 + #define NRF_LOG_BACKEND_RTT_TEMP_BUFFER_SIZE 512 #endif #ifndef NRF_LOG_BACKEND_RTT_TX_RETRY_CNT -#define NRF_LOG_BACKEND_RTT_TX_RETRY_CNT 1 + #define NRF_LOG_BACKEND_RTT_TX_RETRY_CNT 1 #endif #ifndef NRF_LOG_BACKEND_RTT_TX_RETRY_DELAY_MS -#define NRF_LOG_BACKEND_RTT_TX_RETRY_DELAY_MS 10 + #define NRF_LOG_BACKEND_RTT_TX_RETRY_DELAY_MS 10 #endif - - - // ST7735_SCK_PIN - Pin number <0-47> - #ifndef ST7735_SCK_PIN -#define ST7735_SCK_PIN 2 + #define ST7735_SCK_PIN 2 #endif // ST7735_MISO_PIN - Pin number <0-47> - #ifndef ST7735_MISO_PIN -#define ST7735_MISO_PIN 4 + #define ST7735_MISO_PIN 4 #endif // ST7735_MOSI_PIN - Pin number <0-47> - #ifndef ST7735_MOSI_PIN -#define ST7735_MOSI_PIN 3 + #define ST7735_MOSI_PIN 3 #endif // ST7735_SS_PIN - Pin number <0-47> - #ifndef ST7735_SS_PIN -#define ST7735_SS_PIN 25 + #define ST7735_SS_PIN 25 #endif #ifndef ST7789_ROW_OFFSET -#define ST7789_ROW_OFFSET 0 + #define ST7789_ROW_OFFSET 0 #endif // ST7735_IRQ_PRIORITY - Interrupt priority - // Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice // <0=> 0 (highest) // <1=> 1 @@ -12909,13 +12526,12 @@ // <7=> 7 #ifndef ST7735_IRQ_PRIORITY -#define ST7735_IRQ_PRIORITY 3 + #define ST7735_IRQ_PRIORITY 3 #endif // //========================================================== - // ST7735_SPI_INSTANCE // <0=> 0 @@ -12923,15 +12539,15 @@ // <2=> 2 #ifndef ST7735_SPI_INSTANCE -#define ST7735_SPI_INSTANCE 0 + #define ST7735_SPI_INSTANCE 0 #endif #ifndef ST7735_SPI_MODE -#define ST7735_SPI_MODE 3 + #define ST7735_SPI_MODE 3 #endif #ifndef ST7735_SPI_FREQUENCY -#define ST7735_SPI_FREQUENCY 8000000 + #define ST7735_SPI_FREQUENCY 8000000 #endif // ST7735_TAB_COLOR - Color of the tab attached to the screen. @@ -12942,29 +12558,26 @@ // <3=> INITR_144GREENTAB #ifndef ST7735_TAB_COLOR -#define ST7735_TAB_COLOR 2 + #define ST7735_TAB_COLOR 2 #endif // ST7735_DC_PIN - Pin number <0-47> - #ifndef ST7735_DC_PIN -#define ST7735_DC_PIN 18 + #define ST7735_DC_PIN 18 #endif // ST7735_HEIGHT - ST7735 height <0-162> - #ifndef ST7735_HEIGHT -#define ST7735_HEIGHT 160 + #define ST7735_HEIGHT 160 #endif // ST7735_WIDTH - ST7735 width <0-132> - #ifndef ST7735_WIDTH -#define ST7735_WIDTH 128 + #define ST7735_WIDTH 128 #endif // <<< end of configuration section >>> -#endif //SDK_CONFIG_H \ No newline at end of file +#endif // SDK_CONFIG_H \ No newline at end of file diff --git a/src/systemtask/SystemMonitor.h b/src/systemtask/SystemMonitor.h index 029a1364..d24e9bf7 100644 --- a/src/systemtask/SystemMonitor.h +++ b/src/systemtask/SystemMonitor.h @@ -3,44 +3,42 @@ #include #include - namespace Pinetime { namespace System { struct DummyMonitor {}; struct FreeRtosMonitor {}; - template - class SystemMonitor { - public: - SystemMonitor() = delete; + template class SystemMonitor { + public: + SystemMonitor() = delete; }; - template<> - class SystemMonitor { - public: - void Process() const {} + template <> class SystemMonitor { + public: + void Process() const { + } }; - template<> - class SystemMonitor { - public: - void Process() const { - if(xTaskGetTickCount() - lastTick > 10000) { - NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize()); - auto nb = uxTaskGetSystemState(tasksStatus, 10, nullptr); - for (uint32_t i = 0; i < nb; i++) { - NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark); - if (tasksStatus[i].usStackHighWaterMark < 20) - NRF_LOG_INFO("WARNING!!! Task %s task is nearly full, only %dB available", tasksStatus[i].pcTaskName, - tasksStatus[i].usStackHighWaterMark * 4); - } - lastTick = xTaskGetTickCount(); + template <> class SystemMonitor { + public: + void Process() const { + if (xTaskGetTickCount() - lastTick > 10000) { + NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize()); + auto nb = uxTaskGetSystemState(tasksStatus, 10, nullptr); + for (uint32_t i = 0; i < nb; i++) { + NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark); + if (tasksStatus[i].usStackHighWaterMark < 20) + NRF_LOG_INFO("WARNING!!! Task %s task is nearly full, only %dB available", + tasksStatus[i].pcTaskName, + tasksStatus[i].usStackHighWaterMark * 4); } + lastTick = xTaskGetTickCount(); } + } - private: - mutable TickType_t lastTick = 0; - mutable TaskStatus_t tasksStatus[10]; + private: + mutable TickType_t lastTick = 0; + mutable TaskStatus_t tasksStatus[10]; }; } } \ No newline at end of file diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 3e315eec..5b03fbbb 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -30,28 +30,39 @@ using namespace Pinetime::System; void IdleTimerCallback(TimerHandle_t xTimer) { NRF_LOG_INFO("IdleTimerCallback"); - auto sysTask = static_cast(pvTimerGetTimerID(xTimer)); + auto sysTask = static_cast(pvTimerGetTimerID(xTimer)); sysTask->OnIdle(); } - -SystemTask::SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, +SystemTask::SystemTask(Drivers::SpiMaster& spi, + Drivers::St7789& lcd, Pinetime::Drivers::SpiNorFlash& spiNorFlash, - Drivers::TwiMaster& twiMaster, Drivers::Cst816S &touchPanel, - Components::LittleVgl &lvgl, - Controllers::Battery &batteryController, Controllers::Ble &bleController, + Drivers::TwiMaster& twiMaster, + Drivers::Cst816S& touchPanel, + Components::LittleVgl& lvgl, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, Pinetime::Controllers::MotorController& motorController, Pinetime::Drivers::Hrs3300& heartRateSensor, Pinetime::Drivers::Bma421& motionSensor, - Controllers::Settings &settingsController) : - spi{spi}, lcd{lcd}, spiNorFlash{spiNorFlash}, - twiMaster{twiMaster}, touchPanel{touchPanel}, lvgl{lvgl}, batteryController{batteryController}, - heartRateController{*this}, - bleController{bleController}, dateTimeController{*this}, - watchdog{}, watchdogView{watchdog}, - motorController{motorController}, heartRateSensor{heartRateSensor}, motionSensor{motionSensor}, - settingsController{settingsController}, - nimbleController(*this, bleController,dateTimeController, notificationManager, batteryController, spiNorFlash, heartRateController) { + Controllers::Settings& settingsController) + : spi {spi}, + lcd {lcd}, + spiNorFlash {spiNorFlash}, + twiMaster {twiMaster}, + touchPanel {touchPanel}, + lvgl {lvgl}, + batteryController {batteryController}, + heartRateController {*this}, + bleController {bleController}, + dateTimeController {*this}, + watchdog {}, + watchdogView {watchdog}, + motorController {motorController}, + heartRateSensor {heartRateSensor}, + motionSensor {motionSensor}, + settingsController {settingsController}, + nimbleController(*this, bleController, dateTimeController, notificationManager, batteryController, spiNorFlash, heartRateController) { systemTasksMsgQueue = xQueueCreate(10, 1); } @@ -60,8 +71,8 @@ void SystemTask::Start() { APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); } -void SystemTask::Process(void *instance) { - auto *app = static_cast(instance); +void SystemTask::Process(void* instance) { + auto* app = static_cast(instance); NRF_LOG_INFO("systemtask task started!"); app->Work(); } @@ -93,9 +104,18 @@ void SystemTask::Work() { motionSensor.Init(); settingsController.Init(); - displayApp = std::make_unique(lcd, lvgl, touchPanel, batteryController, bleController, - dateTimeController, watchdogView, *this, notificationManager, - heartRateController, settingsController, motionController); + displayApp = std::make_unique(lcd, + lvgl, + touchPanel, + batteryController, + bleController, + dateTimeController, + watchdogView, + *this, + notificationManager, + heartRateController, + settingsController, + motionController); displayApp->Start(); displayApp->PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel); @@ -105,7 +125,7 @@ void SystemTask::Work() { heartRateApp = std::make_unique(heartRateSensor, heartRateController); heartRateApp->Start(); - nrf_gpio_cfg_sense_input(pinButton, (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pulldown, (nrf_gpio_pin_sense_t)GPIO_PIN_CNF_SENSE_High); + nrf_gpio_cfg_sense_input(pinButton, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pulldown, (nrf_gpio_pin_sense_t) GPIO_PIN_CNF_SENSE_High); nrf_gpio_cfg_output(15); nrf_gpio_pin_set(15); @@ -113,63 +133,63 @@ void SystemTask::Work() { pinConfig.skip_gpio_setup = true; pinConfig.hi_accuracy = false; pinConfig.is_watcher = false; - pinConfig.sense = (nrf_gpiote_polarity_t)NRF_GPIOTE_POLARITY_HITOLO; - pinConfig.pull = (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pulldown; + pinConfig.sense = (nrf_gpiote_polarity_t) NRF_GPIOTE_POLARITY_HITOLO; + pinConfig.pull = (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pulldown; nrfx_gpiote_in_init(pinButton, &pinConfig, nrfx_gpiote_evt_handler); - nrf_gpio_cfg_sense_input(pinTouchIrq, (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pullup, (nrf_gpio_pin_sense_t)GPIO_PIN_CNF_SENSE_Low); + nrf_gpio_cfg_sense_input(pinTouchIrq, (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pullup, (nrf_gpio_pin_sense_t) GPIO_PIN_CNF_SENSE_Low); pinConfig.skip_gpio_setup = true; pinConfig.hi_accuracy = false; pinConfig.is_watcher = false; - pinConfig.sense = (nrf_gpiote_polarity_t)NRF_GPIOTE_POLARITY_HITOLO; - pinConfig.pull = (nrf_gpio_pin_pull_t)GPIO_PIN_CNF_PULL_Pullup; + pinConfig.sense = (nrf_gpiote_polarity_t) NRF_GPIOTE_POLARITY_HITOLO; + pinConfig.pull = (nrf_gpio_pin_pull_t) GPIO_PIN_CNF_PULL_Pullup; nrfx_gpiote_in_init(pinTouchIrq, &pinConfig, nrfx_gpiote_evt_handler); - idleTimer = xTimerCreate ("idleTimer", pdMS_TO_TICKS(settingsController.GetScreenTimeOut()), pdFALSE, this, IdleTimerCallback); + idleTimer = xTimerCreate("idleTimer", pdMS_TO_TICKS(settingsController.GetScreenTimeOut()), pdFALSE, this, IdleTimerCallback); xTimerStart(idleTimer, 0); - // Suppress endless loop diagnostic - #pragma clang diagnostic push - #pragma ide diagnostic ignored "EndlessLoop" - while(true) { +// Suppress endless loop diagnostic +#pragma clang diagnostic push +#pragma ide diagnostic ignored "EndlessLoop" + while (true) { UpdateMotion(); uint8_t msg; if (xQueueReceive(systemTasksMsgQueue, &msg, 100)) { - + // call the battery controller or use the MSG in DisplayApp to get the battery status ??? // it is necessary to validate which is the most efficient batteryController.Update(); - //displayApp->PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel); - // analyze a more efficient way to do this refreshment - // this and the UpdateMotion(); can be called on a timer to be independent of the main process ??? + // displayApp->PushMessage(Pinetime::Applications::Display::Messages::UpdateBatteryLevel); + // analyze a more efficient way to do this refreshment + // this and the UpdateMotion(); can be called on a timer to be independent of the main process ??? - Messages message = static_cast(msg); - switch(message) { + Messages message = static_cast(msg); + switch (message) { case Messages::EnableSleeping: doNotGoToSleep = false; - break; + break; case Messages::DisableSleeping: doNotGoToSleep = true; - break; + break; case Messages::UpdateTimeOut: xTimerChangePeriod(idleTimer, pdMS_TO_TICKS(settingsController.GetScreenTimeOut()), 0); - break; + break; case Messages::GoToRunning: spi.Wakeup(); twiMaster.Wakeup(); // Double Tap needs the touch screen to be in normal mode - if ( settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::DoubleTap ) { + if (settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::DoubleTap) { touchPanel.Wakeup(); } nimbleController.StartAdvertising(); xTimerStart(idleTimer, 0); - spiNorFlash.Wakeup(); + spiNorFlash.Wakeup(); lcd.Wakeup(); displayApp->PushMessage(Pinetime::Applications::Display::Messages::GoToRunning); @@ -183,16 +203,10 @@ void SystemTask::Work() { twiMaster.Wakeup(); auto touchInfo = touchPanel.GetTouchInfo(); twiMaster.Sleep(); - if( touchInfo.isTouch and - ( - ( touchInfo.gesture == Pinetime::Drivers::Cst816S::Gestures::DoubleTap and - settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::DoubleTap - ) or - ( touchInfo.gesture == Pinetime::Drivers::Cst816S::Gestures::SingleTap and - settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::SingleTap - ) - ) - ) { + if (touchInfo.isTouch and ((touchInfo.gesture == Pinetime::Drivers::Cst816S::Gestures::DoubleTap and + settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::DoubleTap) or + (touchInfo.gesture == Pinetime::Drivers::Cst816S::Gestures::SingleTap and + settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::SingleTap))) { GoToRunning(); } } break; @@ -208,7 +222,8 @@ void SystemTask::Work() { displayApp->PushMessage(Pinetime::Applications::Display::Messages::UpdateDateTime); break; case Messages::OnNewNotification: - if(isSleeping && !isWakingUp) GoToRunning(); + if (isSleeping && !isWakingUp) + GoToRunning(); motorController.SetDuration(35); displayApp->PushMessage(Pinetime::Applications::Display::Messages::NewNotification); break; @@ -219,13 +234,14 @@ void SystemTask::Work() { break; case Messages::BleFirmwareUpdateStarted: doNotGoToSleep = true; - if(isSleeping && !isWakingUp) GoToRunning(); + if (isSleeping && !isWakingUp) + GoToRunning(); displayApp->PushMessage(Pinetime::Applications::Display::Messages::BleFirmwareUpdateStarted); break; case Messages::BleFirmwareUpdateFinished: doNotGoToSleep = false; xTimerStart(idleTimer, 0); - if(bleController.State() == Pinetime::Controllers::Ble::FirmwareUpdateStates::Validated) + if (bleController.State() == Pinetime::Controllers::Ble::FirmwareUpdateStates::Validated) NVIC_SystemReset(); break; case Messages::OnTouchEvent: @@ -235,7 +251,7 @@ void SystemTask::Work() { ReloadIdleTimer(); break; case Messages::OnDisplayTaskSleeping: - if(BootloaderVersion::IsValid()) { + if (BootloaderVersion::IsValid()) { // First versions of the bootloader do not expose their version and cannot initialize the SPI NOR FLASH // if it's in sleep mode. Avoid bricked device by disabling sleep mode on these versions. spiNorFlash.Sleep(); @@ -244,11 +260,11 @@ void SystemTask::Work() { spi.Sleep(); // Double Tap needs the touch screen to be in normal mode - if ( settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::DoubleTap ) { + if (settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::DoubleTap) { touchPanel.Sleep(); } twiMaster.Sleep(); - + isSleeping = true; isGoingToSleep = false; break; @@ -257,12 +273,13 @@ void SystemTask::Work() { // Remember we'll have to reset the counter next time we're awake stepCounterMustBeReset = true; break; - default: break; + default: + break; } } - if(isBleDiscoveryTimerRunning) { - if(bleDiscoveryTimer == 0) { + if (isBleDiscoveryTimerRunning) { + if (bleDiscoveryTimer == 0) { isBleDiscoveryTimerRunning = false; // Services discovery is deffered from 3 seconds to avoid the conflicts between the host communicating with the // tharget and vice-versa. I'm not sure if this is the right way to handle this... @@ -275,49 +292,47 @@ void SystemTask::Work() { monitor.Process(); uint32_t systick_counter = nrf_rtc_counter_get(portNRF_RTC_REG); dateTimeController.UpdateTime(systick_counter); - if(!nrf_gpio_pin_read(pinButton)) + if (!nrf_gpio_pin_read(pinButton)) watchdog.Kick(); } - // Clear diagnostic suppression - #pragma clang diagnostic pop +// Clear diagnostic suppression +#pragma clang diagnostic pop } void SystemTask::UpdateMotion() { - if(isGoingToSleep or isWakingUp) return; - - if(isSleeping && settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) + if (isGoingToSleep or isWakingUp) return; - if(isSleeping) + if (isSleeping && settingsController.getWakeUpMode() != Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) + return; + + if (isSleeping) twiMaster.Wakeup(); - if(stepCounterMustBeReset) { + if (stepCounterMustBeReset) { motionSensor.ResetStepCounter(); stepCounterMustBeReset = false; } auto motionValues = motionSensor.Process(); - if(isSleeping) + if (isSleeping) twiMaster.Sleep(); motionController.IsSensorOk(motionSensor.IsOk()); - motionController.Update(motionValues.x, - motionValues.y, - motionValues.z, - motionValues.steps); + motionController.Update(motionValues.x, motionValues.y, motionValues.z, motionValues.steps); if (motionController.ShouldWakeUp(isSleeping)) { GoToRunning(); } } void SystemTask::OnButtonPushed() { - if(isGoingToSleep) return; - if(!isSleeping) { + if (isGoingToSleep) + return; + if (!isSleeping) { NRF_LOG_INFO("[systemtask] Button pushed"); PushMessage(Messages::OnButtonEvent); displayApp->PushMessage(Pinetime::Applications::Display::Messages::ButtonPushed); - } - else { - if(!isWakingUp) { + } else { + if (!isWakingUp) { NRF_LOG_INFO("[systemtask] Button pushed, waking up"); GoToRunning(); } @@ -325,25 +340,28 @@ void SystemTask::OnButtonPushed() { } void SystemTask::GoToRunning() { - if(isGoingToSleep or (not isSleeping) or isWakingUp) return; + if (isGoingToSleep or (not isSleeping) or isWakingUp) + return; isWakingUp = true; PushMessage(Messages::GoToRunning); } void SystemTask::OnTouchEvent() { - if(isGoingToSleep) return ; - if(!isSleeping) { + if (isGoingToSleep) + return; + if (!isSleeping) { PushMessage(Messages::OnTouchEvent); displayApp->PushMessage(Pinetime::Applications::Display::Messages::TouchEvent); - } else if(!isWakingUp) { - if( settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::None or - settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist ) return; + } else if (!isWakingUp) { + if (settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::None or + settingsController.getWakeUpMode() == Pinetime::Controllers::Settings::WakeUpMode::RaiseWrist) + return; PushMessage(Messages::TouchWakeUp); } } void SystemTask::PushMessage(SystemTask::Messages msg) { - if(msg == Messages::GoToSleep) { + if (msg == Messages::GoToSleep) { isGoingToSleep = true; } BaseType_t xHigherPriorityTaskWoken; @@ -356,12 +374,14 @@ void SystemTask::PushMessage(SystemTask::Messages msg) { } void SystemTask::OnIdle() { - if(doNotGoToSleep) return; + if (doNotGoToSleep) + return; NRF_LOG_INFO("Idle timeout -> Going to sleep") PushMessage(Messages::GoToSleep); } void SystemTask::ReloadIdleTimer() const { - if(isSleeping || isGoingToSleep) return; + if (isSleeping || isGoingToSleep) + return; xTimerReset(idleTimer, 0); } diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index a3868375..67e62a2d 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -17,12 +17,12 @@ #include "components/ble/NotificationManager.h" #include "components/motor/MotorController.h" #ifdef PINETIME_IS_RECOVERY -#include "displayapp/DisplayAppRecovery.h" -#include "displayapp/DummyLittleVgl.h" + #include "displayapp/DisplayAppRecovery.h" + #include "displayapp/DummyLittleVgl.h" #else -#include "components/settings/Settings.h" -#include "displayapp/DisplayApp.h" -#include "displayapp/LittleVgl.h" + #include "components/settings/Settings.h" + #include "displayapp/DisplayApp.h" + #include "displayapp/LittleVgl.h" #endif #include "drivers/Watchdog.h" @@ -38,88 +38,106 @@ namespace Pinetime { } namespace System { class SystemTask { - public: - enum class Messages {GoToSleep, GoToRunning, TouchWakeUp, OnNewTime, OnNewNotification, OnNewCall, BleConnected, UpdateTimeOut, - BleFirmwareUpdateStarted, BleFirmwareUpdateFinished, OnTouchEvent, OnButtonEvent, OnDisplayTaskSleeping, EnableSleeping, DisableSleeping, - OnNewDay - }; + public: + enum class Messages { + GoToSleep, + GoToRunning, + TouchWakeUp, + OnNewTime, + OnNewNotification, + OnNewCall, + BleConnected, + UpdateTimeOut, + BleFirmwareUpdateStarted, + BleFirmwareUpdateFinished, + OnTouchEvent, + OnButtonEvent, + OnDisplayTaskSleeping, + EnableSleeping, + DisableSleeping, + OnNewDay + }; - SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, - Pinetime::Drivers::SpiNorFlash& spiNorFlash, - Drivers::TwiMaster& twiMaster, Drivers::Cst816S &touchPanel, - Components::LittleVgl &lvgl, - Controllers::Battery &batteryController, Controllers::Ble &bleController, - Pinetime::Controllers::MotorController& motorController, - Pinetime::Drivers::Hrs3300& heartRateSensor, - Pinetime::Drivers::Bma421& motionSensor, - Controllers::Settings &settingsController); + SystemTask(Drivers::SpiMaster& spi, + Drivers::St7789& lcd, + Pinetime::Drivers::SpiNorFlash& spiNorFlash, + Drivers::TwiMaster& twiMaster, + Drivers::Cst816S& touchPanel, + Components::LittleVgl& lvgl, + Controllers::Battery& batteryController, + Controllers::Ble& bleController, + Pinetime::Controllers::MotorController& motorController, + Pinetime::Drivers::Hrs3300& heartRateSensor, + Pinetime::Drivers::Bma421& motionSensor, + Controllers::Settings& settingsController); + void Start(); + void PushMessage(Messages msg); - void Start(); - void PushMessage(Messages msg); + void OnButtonPushed(); + void OnTouchEvent(); - void OnButtonPushed(); - void OnTouchEvent(); + void OnIdle(); - void OnIdle(); + Pinetime::Controllers::NimbleController& nimble() { + return nimbleController; + }; - Pinetime::Controllers::NimbleController& nimble() {return nimbleController;}; + private: + TaskHandle_t taskHandle; - private: - TaskHandle_t taskHandle; + Pinetime::Drivers::SpiMaster& spi; + Pinetime::Drivers::St7789& lcd; + Pinetime::Drivers::SpiNorFlash& spiNorFlash; + Pinetime::Drivers::TwiMaster& twiMaster; + Pinetime::Drivers::Cst816S& touchPanel; + Pinetime::Components::LittleVgl& lvgl; + Pinetime::Controllers::Battery& batteryController; + std::unique_ptr displayApp; + Pinetime::Controllers::HeartRateController heartRateController; + std::unique_ptr heartRateApp; - Pinetime::Drivers::SpiMaster& spi; - Pinetime::Drivers::St7789& lcd; - Pinetime::Drivers::SpiNorFlash& spiNorFlash; - Pinetime::Drivers::TwiMaster& twiMaster; - Pinetime::Drivers::Cst816S& touchPanel; - Pinetime::Components::LittleVgl& lvgl; - Pinetime::Controllers::Battery& batteryController; - std::unique_ptr displayApp; - Pinetime::Controllers::HeartRateController heartRateController; - std::unique_ptr heartRateApp; + Pinetime::Controllers::Ble& bleController; + Pinetime::Controllers::DateTime dateTimeController; + QueueHandle_t systemTasksMsgQueue; + std::atomic isSleeping {false}; + std::atomic isGoingToSleep {false}; + std::atomic isWakingUp {false}; + Pinetime::Drivers::Watchdog watchdog; + Pinetime::Drivers::WatchdogView watchdogView; + Pinetime::Controllers::NotificationManager notificationManager; + Pinetime::Controllers::MotorController& motorController; + Pinetime::Drivers::Hrs3300& heartRateSensor; + Pinetime::Drivers::Bma421& motionSensor; + Pinetime::Controllers::Settings& settingsController; + Pinetime::Controllers::NimbleController nimbleController; + Controllers::BrightnessController brightnessController; + Pinetime::Controllers::MotionController motionController; - Pinetime::Controllers::Ble& bleController; - Pinetime::Controllers::DateTime dateTimeController; - QueueHandle_t systemTasksMsgQueue; - std::atomic isSleeping{false}; - std::atomic isGoingToSleep{false}; - std::atomic isWakingUp{false}; - Pinetime::Drivers::Watchdog watchdog; - Pinetime::Drivers::WatchdogView watchdogView; - Pinetime::Controllers::NotificationManager notificationManager; - Pinetime::Controllers::MotorController& motorController; - Pinetime::Drivers::Hrs3300& heartRateSensor; - Pinetime::Drivers::Bma421& motionSensor; - Pinetime::Controllers::Settings& settingsController; - Pinetime::Controllers::NimbleController nimbleController; - Controllers::BrightnessController brightnessController; - Pinetime::Controllers::MotionController motionController; + static constexpr uint8_t pinSpiSck = 2; + static constexpr uint8_t pinSpiMosi = 3; + static constexpr uint8_t pinSpiMiso = 4; + static constexpr uint8_t pinSpiCsn = 25; + static constexpr uint8_t pinLcdDataCommand = 18; + static constexpr uint8_t pinButton = 13; + static constexpr uint8_t pinTouchIrq = 28; - static constexpr uint8_t pinSpiSck = 2; - static constexpr uint8_t pinSpiMosi = 3; - static constexpr uint8_t pinSpiMiso = 4; - static constexpr uint8_t pinSpiCsn = 25; - static constexpr uint8_t pinLcdDataCommand = 18; - static constexpr uint8_t pinButton = 13; - static constexpr uint8_t pinTouchIrq = 28; + static void Process(void* instance); + void Work(); + void ReloadIdleTimer() const; + bool isBleDiscoveryTimerRunning = false; + uint8_t bleDiscoveryTimer = 0; + TimerHandle_t idleTimer; + bool doNotGoToSleep = false; - static void Process(void* instance); - void Work(); - void ReloadIdleTimer() const; - bool isBleDiscoveryTimerRunning = false; - uint8_t bleDiscoveryTimer = 0; - TimerHandle_t idleTimer; - bool doNotGoToSleep = false; - - void GoToRunning(); - void UpdateMotion(); - bool stepCounterMustBeReset = false; + void GoToRunning(); + void UpdateMotion(); + bool stepCounterMustBeReset = false; #if configUSE_TRACE_FACILITY == 1 - SystemMonitor monitor; + SystemMonitor monitor; #else - SystemMonitor monitor; + SystemMonitor monitor; #endif }; } From 69898545193a82f7d72c9f47c9d9de36167b157b Mon Sep 17 00:00:00 2001 From: Avamander Date: Sat, 24 Apr 2021 12:00:45 +0300 Subject: [PATCH 6/6] Changed access modified indentation --- .clang-format | 2 +- src/BootloaderVersion.h | 2 +- src/components/battery/BatteryController.h | 8 ++++---- src/components/ble/AlertNotificationClient.h | 4 ++-- src/components/ble/AlertNotificationService.h | 4 ++-- src/components/ble/BatteryInformationService.h | 4 ++-- src/components/ble/BleClient.h | 2 +- src/components/ble/BleController.h | 4 ++-- src/components/ble/CurrentTimeClient.h | 4 ++-- src/components/ble/CurrentTimeService.h | 4 ++-- src/components/ble/DeviceInformationService.h | 4 ++-- src/components/ble/DfuService.h | 14 +++++++------- src/components/ble/HeartRateService.h | 4 ++-- src/components/ble/ImmediateAlertService.h | 4 ++-- src/components/ble/MusicService.h | 4 ++-- src/components/ble/NavigationService.h | 4 ++-- src/components/ble/NimbleController.h | 4 ++-- src/components/ble/NotificationManager.h | 4 ++-- src/components/ble/ServiceDiscovery.h | 4 ++-- src/components/brightness/BrightnessController.h | 4 ++-- src/components/datetime/DateTimeController.h | 4 ++-- .../firmwarevalidator/FirmwareValidator.h | 4 ++-- src/components/gfx/Gfx.h | 4 ++-- src/components/heartrate/Biquad.h | 4 ++-- src/components/heartrate/HeartRateController.h | 4 ++-- src/components/heartrate/Ppg.h | 4 ++-- src/components/heartrate/Ptagc.h | 4 ++-- src/components/motion/MotionController.h | 4 ++-- src/components/motor/MotorController.h | 4 ++-- src/components/rle/RleDecoder.h | 4 ++-- src/components/settings/Settings.h | 4 ++-- src/displayapp/DisplayApp.h | 4 ++-- src/displayapp/DisplayAppRecovery.h | 4 ++-- src/displayapp/DummyLittleVgl.h | 2 +- src/displayapp/LittleVgl.h | 4 ++-- src/displayapp/screens/ApplicationList.h | 4 ++-- src/displayapp/screens/BatteryIcon.h | 2 +- src/displayapp/screens/BatteryInfo.h | 4 ++-- src/displayapp/screens/BleIcon.h | 2 +- src/displayapp/screens/Brightness.h | 4 ++-- src/displayapp/screens/Clock.h | 4 ++-- src/displayapp/screens/DropDownDemo.h | 4 ++-- src/displayapp/screens/FirmwareUpdate.cpp | 2 +- src/displayapp/screens/FirmwareUpdate.h | 4 ++-- src/displayapp/screens/FirmwareValidation.h | 4 ++-- src/displayapp/screens/FlashLight.h | 4 ++-- src/displayapp/screens/HeartRate.h | 4 ++-- src/displayapp/screens/InfiniPaint.h | 4 ++-- src/displayapp/screens/Label.h | 4 ++-- src/displayapp/screens/List.h | 4 ++-- src/displayapp/screens/Meter.h | 4 ++-- src/displayapp/screens/Motion.h | 4 ++-- src/displayapp/screens/Music.h | 4 ++-- src/displayapp/screens/Navigation.h | 4 ++-- src/displayapp/screens/NotificationIcon.h | 2 +- src/displayapp/screens/Notifications.h | 8 ++++---- src/displayapp/screens/Paddle.h | 4 ++-- src/displayapp/screens/Screen.h | 8 ++++---- src/displayapp/screens/ScreenList.h | 4 ++-- src/displayapp/screens/StopWatch.h | 6 +++--- src/displayapp/screens/SystemInfo.h | 4 ++-- src/displayapp/screens/Tile.h | 4 ++-- src/displayapp/screens/Twos.h | 4 ++-- src/displayapp/screens/WatchFaceAnalog.h | 4 ++-- src/displayapp/screens/WatchFaceDigital.h | 4 ++-- src/displayapp/screens/settings/QuickSettings.h | 4 ++-- src/displayapp/screens/settings/SettingDisplay.h | 4 ++-- .../screens/settings/SettingTimeFormat.h | 4 ++-- src/displayapp/screens/settings/SettingWakeUp.h | 4 ++-- src/displayapp/screens/settings/SettingWatchFace.h | 4 ++-- src/displayapp/screens/settings/Settings.h | 4 ++-- src/drivers/Bma421.h | 4 ++-- src/drivers/BufferProvider.h | 2 +- src/drivers/Cst816s.h | 4 ++-- src/drivers/Hrs3300.h | 4 ++-- src/drivers/InternalFlash.h | 4 ++-- src/drivers/Spi.h | 4 ++-- src/drivers/SpiMaster.h | 4 ++-- src/drivers/SpiNorFlash.h | 4 ++-- src/drivers/St7789.h | 4 ++-- src/drivers/TwiMaster.h | 4 ++-- src/drivers/Watchdog.h | 8 ++++---- src/systemtask/SystemMonitor.h | 8 ++++---- src/systemtask/SystemTask.h | 4 ++-- 84 files changed, 175 insertions(+), 175 deletions(-) diff --git a/.clang-format b/.clang-format index 5ddb7206..7430d4d6 100644 --- a/.clang-format +++ b/.clang-format @@ -1,6 +1,6 @@ --- Language: Cpp -AccessModifierOffset: 2 +AccessModifierOffset: -2 AlignAfterOpenBracket: Align AlignConsecutiveMacros: true AlignConsecutiveAssignments: false diff --git a/src/BootloaderVersion.h b/src/BootloaderVersion.h index f2fd9112..c1ede0f5 100644 --- a/src/BootloaderVersion.h +++ b/src/BootloaderVersion.h @@ -2,7 +2,7 @@ namespace Pinetime { class BootloaderVersion { - public: + public: static uint32_t Major(); static uint32_t Minor(); static uint32_t Patch(); diff --git a/src/components/battery/BatteryController.h b/src/components/battery/BatteryController.h index e5c734d2..04bcf6b8 100644 --- a/src/components/battery/BatteryController.h +++ b/src/components/battery/BatteryController.h @@ -12,7 +12,7 @@ namespace Pinetime { is given as the template parameter N. */ template class CircBuffer { - public: + public: CircBuffer() : arr {}, sz {}, cap {N}, head {} { } /** @@ -32,7 +32,7 @@ namespace Pinetime { return (sum / sz); } - private: + private: std::array arr; /**< internal array used to store the values*/ uint8_t sz; /**< The current size of the array.*/ uint8_t cap; /**< Total capacity of the CircBuffer.*/ @@ -40,7 +40,7 @@ namespace Pinetime { }; class Battery { - public: + public: Battery(); void Init(); @@ -61,7 +61,7 @@ namespace Pinetime { return isPowerPresent; } - private: + private: static Battery* instance; nrf_saadc_value_t saadc_value; diff --git a/src/components/ble/AlertNotificationClient.h b/src/components/ble/AlertNotificationClient.h index 469bd4af..dfba8143 100644 --- a/src/components/ble/AlertNotificationClient.h +++ b/src/components/ble/AlertNotificationClient.h @@ -19,7 +19,7 @@ namespace Pinetime { class NotificationManager; class AlertNotificationClient : public BleClient { - public: + public: explicit AlertNotificationClient(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::NotificationManager& notificationManager); @@ -34,7 +34,7 @@ namespace Pinetime { void Reset(); void Discover(uint16_t connectionHandle, std::function lambda) override; - private: + private: static constexpr uint16_t ansServiceId {0x1811}; static constexpr uint16_t supportedNewAlertCategoryId = 0x2a47; static constexpr uint16_t supportedUnreadAlertCategoryId = 0x2a48; diff --git a/src/components/ble/AlertNotificationService.h b/src/components/ble/AlertNotificationService.h index 66bb9be4..5c7d428c 100644 --- a/src/components/ble/AlertNotificationService.h +++ b/src/components/ble/AlertNotificationService.h @@ -20,7 +20,7 @@ namespace Pinetime { class NotificationManager; class AlertNotificationService { - public: + public: AlertNotificationService(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::NotificationManager& notificationManager); void Init(); @@ -32,7 +32,7 @@ namespace Pinetime { enum class IncomingCallResponses : uint8_t { Reject = 0x00, Answer = 0x01, Mute = 0x02 }; - private: + private: enum class Categories : uint8_t { SimpleAlert = 0x00, Email = 0x01, diff --git a/src/components/ble/BatteryInformationService.h b/src/components/ble/BatteryInformationService.h index 59ed9c64..7d060909 100644 --- a/src/components/ble/BatteryInformationService.h +++ b/src/components/ble/BatteryInformationService.h @@ -12,13 +12,13 @@ namespace Pinetime { namespace Controllers { class Battery; class BatteryInformationService { - public: + public: BatteryInformationService(Controllers::Battery& batteryController); void Init(); int OnBatteryServiceRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context); - private: + private: Controllers::Battery& batteryController; static constexpr uint16_t batteryInformationServiceId {0x180F}; static constexpr uint16_t batteryLevelId {0x2A19}; diff --git a/src/components/ble/BleClient.h b/src/components/ble/BleClient.h index d8a58e1c..6067c15f 100644 --- a/src/components/ble/BleClient.h +++ b/src/components/ble/BleClient.h @@ -5,7 +5,7 @@ namespace Pinetime { namespace Controllers { class BleClient { - public: + public: virtual void Discover(uint16_t connectionHandle, std::function lambda) = 0; }; } diff --git a/src/components/ble/BleController.h b/src/components/ble/BleController.h index 6f5c2367..2cba26a9 100644 --- a/src/components/ble/BleController.h +++ b/src/components/ble/BleController.h @@ -6,7 +6,7 @@ namespace Pinetime { namespace Controllers { class Ble { - public: + public: using BleAddress = std::array; enum class FirmwareUpdateStates { Idle, Running, Validated, Error }; enum class AddressTypes { Public, Random }; @@ -49,7 +49,7 @@ namespace Pinetime { addressType = t; } - private: + private: bool isConnected = false; bool isFirmwareUpdating = false; uint32_t firmwareUpdateTotalBytes = 0; diff --git a/src/components/ble/CurrentTimeClient.h b/src/components/ble/CurrentTimeClient.h index c48a016d..6424c035 100644 --- a/src/components/ble/CurrentTimeClient.h +++ b/src/components/ble/CurrentTimeClient.h @@ -12,7 +12,7 @@ namespace Pinetime { class DateTime; class CurrentTimeClient : public BleClient { - public: + public: explicit CurrentTimeClient(DateTime& dateTimeController); void Init(); void Reset(); @@ -27,7 +27,7 @@ namespace Pinetime { } void Discover(uint16_t connectionHandle, std::function lambda) override; - private: + private: typedef struct __attribute__((packed)) { uint16_t year; uint8_t month; diff --git a/src/components/ble/CurrentTimeService.h b/src/components/ble/CurrentTimeService.h index 0a9a18a8..ca87d970 100644 --- a/src/components/ble/CurrentTimeService.h +++ b/src/components/ble/CurrentTimeService.h @@ -12,13 +12,13 @@ namespace Pinetime { namespace Controllers { class CurrentTimeService { - public: + public: CurrentTimeService(DateTime& dateTimeController); void Init(); int OnTimeAccessed(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt); - private: + private: static constexpr uint16_t ctsId {0x1805}; static constexpr uint16_t ctsCharId {0x2a2b}; diff --git a/src/components/ble/DeviceInformationService.h b/src/components/ble/DeviceInformationService.h index 3ff48b6d..54b3e961 100644 --- a/src/components/ble/DeviceInformationService.h +++ b/src/components/ble/DeviceInformationService.h @@ -9,13 +9,13 @@ namespace Pinetime { namespace Controllers { class DeviceInformationService { - public: + public: DeviceInformationService(); void Init(); int OnDeviceInfoRequested(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt); - private: + private: static constexpr uint16_t deviceInfoId {0x180a}; static constexpr uint16_t manufacturerNameId {0x2a29}; static constexpr uint16_t modelNumberId {0x2a24}; diff --git a/src/components/ble/DfuService.h b/src/components/ble/DfuService.h index b932d80f..4708a4a6 100644 --- a/src/components/ble/DfuService.h +++ b/src/components/ble/DfuService.h @@ -20,7 +20,7 @@ namespace Pinetime { class Ble; class DfuService { - public: + public: DfuService(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::Ble& bleController, Pinetime::Drivers::SpiNorFlash& spiNorFlash); @@ -30,24 +30,24 @@ namespace Pinetime { void Reset(); class NotificationManager { - public: + public: NotificationManager(); bool AsyncSend(uint16_t connection, uint16_t charactHandle, uint8_t* data, size_t size); void Send(uint16_t connection, uint16_t characteristicHandle, const uint8_t* data, const size_t s); - private: + private: TimerHandle_t timer; uint16_t connectionHandle = 0; uint16_t characteristicHandle = 0; size_t size = 0; uint8_t buffer[10]; - public: + public: void OnNotificationTimer(); void Reset(); }; class DfuImage { - public: + public: DfuImage(Pinetime::Drivers::SpiNorFlash& spiNorFlash) : spiNorFlash {spiNorFlash} { } void Init(size_t chunkSize, size_t totalSize, uint16_t expectedCrc); @@ -56,7 +56,7 @@ namespace Pinetime { bool Validate(); bool IsComplete(); - private: + private: Pinetime::Drivers::SpiNorFlash& spiNorFlash; static constexpr size_t bufferSize = 200; bool ready = false; @@ -73,7 +73,7 @@ namespace Pinetime { uint16_t ComputeCrc(uint8_t const* p_data, uint32_t size, uint16_t const* p_crc); }; - private: + private: Pinetime::System::SystemTask& systemTask; Pinetime::Controllers::Ble& bleController; DfuImage dfuImage; diff --git a/src/components/ble/HeartRateService.h b/src/components/ble/HeartRateService.h index 7422445a..0b16703f 100644 --- a/src/components/ble/HeartRateService.h +++ b/src/components/ble/HeartRateService.h @@ -12,13 +12,13 @@ namespace Pinetime { namespace Controllers { class HeartRateController; class HeartRateService { - public: + public: HeartRateService(Pinetime::System::SystemTask& system, Controllers::HeartRateController& heartRateController); void Init(); int OnHeartRateRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context); void OnNewHeartRateValue(uint8_t hearRateValue); - private: + private: Pinetime::System::SystemTask& system; Controllers::HeartRateController& heartRateController; static constexpr uint16_t heartRateServiceId {0x180D}; diff --git a/src/components/ble/ImmediateAlertService.h b/src/components/ble/ImmediateAlertService.h index 6bd11bd7..1f778acd 100644 --- a/src/components/ble/ImmediateAlertService.h +++ b/src/components/ble/ImmediateAlertService.h @@ -12,14 +12,14 @@ namespace Pinetime { namespace Controllers { class NotificationManager; class ImmediateAlertService { - public: + public: enum class Levels : uint8_t { NoAlert = 0, MildAlert = 1, HighAlert = 2 }; ImmediateAlertService(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::NotificationManager& notificationManager); void Init(); int OnAlertLevelChanged(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt* context); - private: + private: Pinetime::System::SystemTask& systemTask; NotificationManager& notificationManager; diff --git a/src/components/ble/MusicService.h b/src/components/ble/MusicService.h index 5416219d..5f5343e4 100644 --- a/src/components/ble/MusicService.h +++ b/src/components/ble/MusicService.h @@ -37,7 +37,7 @@ namespace Pinetime { namespace Controllers { class MusicService { - public: + public: explicit MusicService(Pinetime::System::SystemTask& system); void Init(); @@ -70,7 +70,7 @@ namespace Pinetime { enum MusicStatus { NotPlaying = 0x00, Playing = 0x01 }; - private: + private: static constexpr uint8_t msId[2] = {0x00, 0x00}; static constexpr uint8_t msEventCharId[2] = {0x01, 0x00}; static constexpr uint8_t msStatusCharId[2] = {0x02, 0x00}; diff --git a/src/components/ble/NavigationService.h b/src/components/ble/NavigationService.h index dc4f0a0d..5aab263c 100644 --- a/src/components/ble/NavigationService.h +++ b/src/components/ble/NavigationService.h @@ -37,7 +37,7 @@ namespace Pinetime { namespace Controllers { class NavigationService { - public: + public: explicit NavigationService(Pinetime::System::SystemTask& system); void Init(); @@ -52,7 +52,7 @@ namespace Pinetime { int getProgress(); - private: + private: static constexpr uint8_t navId[2] = {0x01, 0x00}; static constexpr uint8_t navFlagCharId[2] = {0x01, 0x00}; static constexpr uint8_t navNarrativeCharId[2] = {0x02, 0x00}; diff --git a/src/components/ble/NimbleController.h b/src/components/ble/NimbleController.h index 6d4aa38a..5dd01e42 100644 --- a/src/components/ble/NimbleController.h +++ b/src/components/ble/NimbleController.h @@ -36,7 +36,7 @@ namespace Pinetime { class NimbleController { - public: + public: NimbleController(Pinetime::System::SystemTask& systemTask, Pinetime::Controllers::Ble& bleController, DateTime& dateTimeController, @@ -71,7 +71,7 @@ namespace Pinetime { uint16_t connHandle(); - private: + private: static constexpr const char* deviceName = "InfiniTime"; Pinetime::System::SystemTask& systemTask; Pinetime::Controllers::Ble& bleController; diff --git a/src/components/ble/NotificationManager.h b/src/components/ble/NotificationManager.h index 8e8fb374..d4072cc2 100644 --- a/src/components/ble/NotificationManager.h +++ b/src/components/ble/NotificationManager.h @@ -8,7 +8,7 @@ namespace Pinetime { namespace Controllers { class NotificationManager { - public: + public: enum class Categories { Unknown, SimpleAlert, @@ -52,7 +52,7 @@ namespace Pinetime { }; size_t NbNotifications() const; - private: + private: Notification::Id GetNextId(); static constexpr uint8_t TotalNbNotifications = 5; std::array notifications; diff --git a/src/components/ble/ServiceDiscovery.h b/src/components/ble/ServiceDiscovery.h index 56bb3e44..fc3b38c0 100644 --- a/src/components/ble/ServiceDiscovery.h +++ b/src/components/ble/ServiceDiscovery.h @@ -8,12 +8,12 @@ namespace Pinetime { class BleClient; class ServiceDiscovery { - public: + public: ServiceDiscovery(std::array&& bleClients); void StartDiscovery(uint16_t connectionHandle); - private: + private: BleClient** clientIterator; std::array clients; void OnServiceDiscovered(uint16_t connectionHandle); diff --git a/src/components/brightness/BrightnessController.h b/src/components/brightness/BrightnessController.h index e8c36e3b..c47158a9 100644 --- a/src/components/brightness/BrightnessController.h +++ b/src/components/brightness/BrightnessController.h @@ -5,7 +5,7 @@ namespace Pinetime { namespace Controllers { class BrightnessController { - public: + public: enum class Levels { Off, Low, Medium, High }; void Init(); @@ -21,7 +21,7 @@ namespace Pinetime { const char* GetIcon(); const char* ToString(); - private: + private: static constexpr uint8_t pinLcdBacklight1 = 14; static constexpr uint8_t pinLcdBacklight2 = 22; static constexpr uint8_t pinLcdBacklight3 = 23; diff --git a/src/components/datetime/DateTimeController.h b/src/components/datetime/DateTimeController.h index 823442b2..d0ae727e 100644 --- a/src/components/datetime/DateTimeController.h +++ b/src/components/datetime/DateTimeController.h @@ -9,7 +9,7 @@ namespace Pinetime { } namespace Controllers { class DateTime { - public: + public: enum class Days : uint8_t { Unknown, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; enum class Months : uint8_t { Unknown, @@ -75,7 +75,7 @@ namespace Pinetime { return uptime; } - private: + private: System::SystemTask& systemTask; uint16_t year = 0; Months month = Months::Unknown; diff --git a/src/components/firmwarevalidator/FirmwareValidator.h b/src/components/firmwarevalidator/FirmwareValidator.h index 00b5a0bb..ce644f97 100644 --- a/src/components/firmwarevalidator/FirmwareValidator.h +++ b/src/components/firmwarevalidator/FirmwareValidator.h @@ -5,13 +5,13 @@ namespace Pinetime { namespace Controllers { class FirmwareValidator { - public: + public: void Validate(); bool IsValidated() const; void Reset(); - private: + private: static constexpr uint32_t validBitAdress {0x7BFE8}; static constexpr uint32_t validBitValue {1}; }; diff --git a/src/components/gfx/Gfx.h b/src/components/gfx/Gfx.h index b45fb45c..54c4a8b7 100644 --- a/src/components/gfx/Gfx.h +++ b/src/components/gfx/Gfx.h @@ -12,7 +12,7 @@ namespace Pinetime { } namespace Components { class Gfx : public Pinetime::Drivers::BufferProvider { - public: + public: explicit Gfx(Drivers::St7789& lcd); void Init(); void ClearScreen(); @@ -28,7 +28,7 @@ namespace Pinetime { bool GetNextBuffer(uint8_t** buffer, size_t& size) override; void pixel_draw(uint8_t x, uint8_t y, uint16_t color); - private: + private: static constexpr uint8_t width = 240; static constexpr uint8_t height = 240; diff --git a/src/components/heartrate/Biquad.h b/src/components/heartrate/Biquad.h index 0d62b1fe..7c8ca58f 100644 --- a/src/components/heartrate/Biquad.h +++ b/src/components/heartrate/Biquad.h @@ -4,11 +4,11 @@ namespace Pinetime { namespace Controllers { /// Direct Form II Biquad Filter class Biquad { - public: + public: Biquad(float b0, float b1, float b2, float a1, float a2); float Step(float x); - private: + private: float b0; float b1; float b2; diff --git a/src/components/heartrate/HeartRateController.h b/src/components/heartrate/HeartRateController.h index 5558d355..d3a8460d 100644 --- a/src/components/heartrate/HeartRateController.h +++ b/src/components/heartrate/HeartRateController.h @@ -12,7 +12,7 @@ namespace Pinetime { } namespace Controllers { class HeartRateController { - public: + public: enum class States { Stopped, NotEnoughData, NoTouch, Running }; explicit HeartRateController(System::SystemTask& systemTask); @@ -31,7 +31,7 @@ namespace Pinetime { void SetService(Pinetime::Controllers::HeartRateService* service); - private: + private: System::SystemTask& systemTask; Applications::HeartRateTask* task = nullptr; States state = States::Stopped; diff --git a/src/components/heartrate/Ppg.h b/src/components/heartrate/Ppg.h index 51db7582..6a2fcf18 100644 --- a/src/components/heartrate/Ppg.h +++ b/src/components/heartrate/Ppg.h @@ -7,7 +7,7 @@ namespace Pinetime { namespace Controllers { class Ppg { - public: + public: explicit Ppg(float spl); int Preprocess(float spl); @@ -16,7 +16,7 @@ namespace Pinetime { void SetOffset(uint16_t i); void Reset(); - private: + private: std::array data; size_t dataIndex = 0; float offset; diff --git a/src/components/heartrate/Ptagc.h b/src/components/heartrate/Ptagc.h index aaa6f1e6..3476636b 100644 --- a/src/components/heartrate/Ptagc.h +++ b/src/components/heartrate/Ptagc.h @@ -3,11 +3,11 @@ namespace Pinetime { namespace Controllers { class Ptagc { - public: + public: Ptagc(float start, float decay, float threshold); float Step(float spl); - private: + private: float peak; float decay; float boost; diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h index 1a551196..bf644812 100644 --- a/src/components/motion/MotionController.h +++ b/src/components/motion/MotionController.h @@ -5,7 +5,7 @@ namespace Pinetime { namespace Controllers { class MotionController { - public: + public: void Update(int16_t x, int16_t y, int16_t z, uint32_t nbSteps); uint16_t X() const { @@ -27,7 +27,7 @@ namespace Pinetime { return isSensorOk; } - private: + private: uint32_t nbSteps; int16_t x; int16_t y; diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h index 4662a8da..df61af78 100644 --- a/src/components/motor/MotorController.h +++ b/src/components/motor/MotorController.h @@ -9,12 +9,12 @@ namespace Pinetime { static constexpr uint8_t pinMotor = 16; class MotorController { - public: + public: MotorController(Controllers::Settings& settingsController); void Init(); void SetDuration(uint8_t motorDuration); - private: + private: Controllers::Settings& settingsController; static void vibrate(void* p_context); }; diff --git a/src/components/rle/RleDecoder.h b/src/components/rle/RleDecoder.h index c21f45c2..0f607fb8 100644 --- a/src/components/rle/RleDecoder.h +++ b/src/components/rle/RleDecoder.h @@ -11,13 +11,13 @@ namespace Pinetime { * Code from https://github.com/daniel-thompson/wasp-bootloader by Daniel Thompson released under the MIT license. */ class RleDecoder { - public: + public: RleDecoder(const uint8_t* buffer, size_t size); RleDecoder(const uint8_t* buffer, size_t size, uint16_t foregroundColor, uint16_t backgroundColor); void DecodeNext(uint8_t* output, size_t maxBytes); - private: + private: const uint8_t* buffer; size_t size; diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 05d6e7ef..18c87fd4 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -8,7 +8,7 @@ namespace Pinetime { namespace Controllers { class Settings { - public: + public: enum class ClockType { H24, H12 }; enum class Vibration { ON, OFF }; enum class WakeUpMode { None, SingleTap, DoubleTap, RaiseWrist }; @@ -86,7 +86,7 @@ namespace Pinetime { return settings.brightLevel; }; - private: + private: Pinetime::Drivers::SpiNorFlash& spiNorFlash; struct SettingsData { diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index 03afb4ca..ff5ddac8 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -35,7 +35,7 @@ namespace Pinetime { }; namespace Applications { class DisplayApp { - public: + public: enum class States { Idle, Running }; enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim }; enum class TouchModes { Gestures, Polling }; @@ -60,7 +60,7 @@ namespace Pinetime { void SetFullRefresh(FullRefreshDirections direction); void SetTouchMode(TouchModes mode); - private: + private: Pinetime::Drivers::St7789& lcd; Pinetime::Components::LittleVgl& lvgl; Pinetime::Drivers::Cst816S& touchPanel; diff --git a/src/displayapp/DisplayAppRecovery.h b/src/displayapp/DisplayAppRecovery.h index b51d6b67..025be6c0 100644 --- a/src/displayapp/DisplayAppRecovery.h +++ b/src/displayapp/DisplayAppRecovery.h @@ -29,7 +29,7 @@ namespace Pinetime { }; namespace Applications { class DisplayApp { - public: + public: DisplayApp(Drivers::St7789& lcd, Components::LittleVgl& lvgl, Drivers::Cst816S&, @@ -45,7 +45,7 @@ namespace Pinetime { void Start(); void PushMessage(Pinetime::Applications::Display::Messages msg); - private: + private: TaskHandle_t taskHandle; static void Process(void* instance); void DisplayLogo(uint16_t color); diff --git a/src/displayapp/DummyLittleVgl.h b/src/displayapp/DummyLittleVgl.h index dda1f3b8..96cf153f 100644 --- a/src/displayapp/DummyLittleVgl.h +++ b/src/displayapp/DummyLittleVgl.h @@ -9,7 +9,7 @@ namespace Pinetime { namespace Components { class LittleVgl { - public: + public: enum class FullRefreshDirections { None, Up, Down }; LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel) { } diff --git a/src/displayapp/LittleVgl.h b/src/displayapp/LittleVgl.h index b10b14fa..7f7b76e0 100644 --- a/src/displayapp/LittleVgl.h +++ b/src/displayapp/LittleVgl.h @@ -10,7 +10,7 @@ namespace Pinetime { namespace Components { class LittleVgl { - public: + public: enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim }; LittleVgl(Pinetime::Drivers::St7789& lcd, Pinetime::Drivers::Cst816S& touchPanel); @@ -24,7 +24,7 @@ namespace Pinetime { void SetFullRefresh(FullRefreshDirections direction); void SetNewTapEvent(uint16_t x, uint16_t y); - private: + private: void InitDisplay(); void InitTouchpad(); void InitTheme(); diff --git a/src/displayapp/screens/ApplicationList.h b/src/displayapp/screens/ApplicationList.h index 5d519355..88534ec4 100644 --- a/src/displayapp/screens/ApplicationList.h +++ b/src/displayapp/screens/ApplicationList.h @@ -12,7 +12,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class ApplicationList : public Screen { - public: + public: explicit ApplicationList(DisplayApp* app, Pinetime::Controllers::Settings& settingsController, Pinetime::Controllers::Battery& batteryController, @@ -21,7 +21,7 @@ namespace Pinetime { bool Refresh() override; bool OnTouchEvent(TouchEvents event) override; - private: + private: Controllers::Settings& settingsController; Pinetime::Controllers::Battery& batteryController; Controllers::DateTime& dateTimeController; diff --git a/src/displayapp/screens/BatteryIcon.h b/src/displayapp/screens/BatteryIcon.h index 2a40a9c1..9c192ff7 100644 --- a/src/displayapp/screens/BatteryIcon.h +++ b/src/displayapp/screens/BatteryIcon.h @@ -4,7 +4,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class BatteryIcon { - public: + public: static const char* GetUnknownIcon(); static const char* GetBatteryIcon(int batteryPercent); static const char* GetPlugIcon(bool isCharging); diff --git a/src/displayapp/screens/BatteryInfo.h b/src/displayapp/screens/BatteryInfo.h index e95267bd..8805db58 100644 --- a/src/displayapp/screens/BatteryInfo.h +++ b/src/displayapp/screens/BatteryInfo.h @@ -15,7 +15,7 @@ namespace Pinetime { namespace Screens { class BatteryInfo : public Screen { - public: + public: BatteryInfo(DisplayApp* app, Pinetime::Controllers::Battery& batteryController); ~BatteryInfo() override; @@ -24,7 +24,7 @@ namespace Pinetime { void UpdateScreen(); void UpdateAnim(); - private: + private: Pinetime::Controllers::Battery& batteryController; lv_obj_t* voltage; diff --git a/src/displayapp/screens/BleIcon.h b/src/displayapp/screens/BleIcon.h index 5fe139aa..c1398d2a 100644 --- a/src/displayapp/screens/BleIcon.h +++ b/src/displayapp/screens/BleIcon.h @@ -4,7 +4,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class BleIcon { - public: + public: static const char* GetIcon(bool isConnected); }; } diff --git a/src/displayapp/screens/Brightness.h b/src/displayapp/screens/Brightness.h index e2a5e7a1..9ee33753 100644 --- a/src/displayapp/screens/Brightness.h +++ b/src/displayapp/screens/Brightness.h @@ -9,7 +9,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class Brightness : public Screen { - public: + public: Brightness(DisplayApp* app, Controllers::BrightnessController& brightness); ~Brightness() override; bool Refresh() override; @@ -18,7 +18,7 @@ namespace Pinetime { void OnValueChanged(); - private: + private: Controllers::BrightnessController& brightness; lv_obj_t* slider_label; diff --git a/src/displayapp/screens/Clock.h b/src/displayapp/screens/Clock.h index ef008c8d..9879985f 100644 --- a/src/displayapp/screens/Clock.h +++ b/src/displayapp/screens/Clock.h @@ -23,7 +23,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class Clock : public Screen { - public: + public: Clock(DisplayApp* app, Controllers::DateTime& dateTimeController, Controllers::Battery& batteryController, @@ -38,7 +38,7 @@ namespace Pinetime { bool OnTouchEvent(TouchEvents event) override; - private: + private: Controllers::DateTime& dateTimeController; Controllers::Battery& batteryController; Controllers::Ble& bleController; diff --git a/src/displayapp/screens/DropDownDemo.h b/src/displayapp/screens/DropDownDemo.h index 94be89e4..ff388c57 100644 --- a/src/displayapp/screens/DropDownDemo.h +++ b/src/displayapp/screens/DropDownDemo.h @@ -9,7 +9,7 @@ namespace Pinetime { namespace Screens { class DropDownDemo : public Screen { - public: + public: DropDownDemo(DisplayApp* app); ~DropDownDemo() override; @@ -17,7 +17,7 @@ namespace Pinetime { bool OnTouchEvent(TouchEvents event) override; - private: + private: lv_obj_t* ddlist; bool isDropDownOpened = false; diff --git a/src/displayapp/screens/FirmwareUpdate.cpp b/src/displayapp/screens/FirmwareUpdate.cpp index 1ca9d7ce..4086b152 100644 --- a/src/displayapp/screens/FirmwareUpdate.cpp +++ b/src/displayapp/screens/FirmwareUpdate.cpp @@ -8,7 +8,7 @@ using namespace Pinetime::Applications::Screens; FirmwareUpdate::FirmwareUpdate(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Ble& bleController) : Screen(app), bleController {bleController} { - lv_obj_t * backgroundLabel = lv_label_create(lv_scr_act(), nullptr); + lv_obj_t* backgroundLabel = lv_label_create(lv_scr_act(), nullptr); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_pos(backgroundLabel, 0, 0); diff --git a/src/displayapp/screens/FirmwareUpdate.h b/src/displayapp/screens/FirmwareUpdate.h index 7e642477..f4d34df0 100644 --- a/src/displayapp/screens/FirmwareUpdate.h +++ b/src/displayapp/screens/FirmwareUpdate.h @@ -11,13 +11,13 @@ namespace Pinetime { namespace Screens { class FirmwareUpdate : public Screen { - public: + public: FirmwareUpdate(DisplayApp* app, Pinetime::Controllers::Ble& bleController); ~FirmwareUpdate() override; bool Refresh() override; - private: + private: enum class States { Idle, Running, Validated, Error }; Pinetime::Controllers::Ble& bleController; lv_obj_t* bar1; diff --git a/src/displayapp/screens/FirmwareValidation.h b/src/displayapp/screens/FirmwareValidation.h index f35a86b5..67662fd9 100644 --- a/src/displayapp/screens/FirmwareValidation.h +++ b/src/displayapp/screens/FirmwareValidation.h @@ -12,7 +12,7 @@ namespace Pinetime { namespace Screens { class FirmwareValidation : public Screen { - public: + public: FirmwareValidation(DisplayApp* app, Pinetime::Controllers::FirmwareValidator& validator); ~FirmwareValidation() override; @@ -20,7 +20,7 @@ namespace Pinetime { void OnButtonEvent(lv_obj_t* object, lv_event_t event); - private: + private: Pinetime::Controllers::FirmwareValidator& validator; lv_obj_t* labelVersionInfo; diff --git a/src/displayapp/screens/FlashLight.h b/src/displayapp/screens/FlashLight.h index 5bd188de..a862ffdb 100644 --- a/src/displayapp/screens/FlashLight.h +++ b/src/displayapp/screens/FlashLight.h @@ -12,7 +12,7 @@ namespace Pinetime { namespace Screens { class FlashLight : public Screen { - public: + public: FlashLight(DisplayApp* app, System::SystemTask& systemTask, Controllers::BrightnessController& brightness); ~FlashLight() override; @@ -21,7 +21,7 @@ namespace Pinetime { bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; void OnClickEvent(lv_obj_t* obj, lv_event_t event); - private: + private: Pinetime::System::SystemTask& systemTask; Controllers::BrightnessController& brightness; diff --git a/src/displayapp/screens/HeartRate.h b/src/displayapp/screens/HeartRate.h index 25be427f..a23c5af8 100644 --- a/src/displayapp/screens/HeartRate.h +++ b/src/displayapp/screens/HeartRate.h @@ -16,7 +16,7 @@ namespace Pinetime { namespace Screens { class HeartRate : public Screen { - public: + public: HeartRate(DisplayApp* app, Controllers::HeartRateController& HeartRateController, System::SystemTask& systemTask); ~HeartRate() override; @@ -24,7 +24,7 @@ namespace Pinetime { void OnStartStopEvent(lv_event_t event); - private: + private: Controllers::HeartRateController& heartRateController; Pinetime::System::SystemTask& systemTask; void UpdateStartStopButton(bool isRunning); diff --git a/src/displayapp/screens/InfiniPaint.h b/src/displayapp/screens/InfiniPaint.h index 220212b1..6251752a 100644 --- a/src/displayapp/screens/InfiniPaint.h +++ b/src/displayapp/screens/InfiniPaint.h @@ -12,7 +12,7 @@ namespace Pinetime { namespace Screens { class InfiniPaint : public Screen { - public: + public: InfiniPaint(DisplayApp* app, Pinetime::Components::LittleVgl& lvgl); ~InfiniPaint() override; @@ -23,7 +23,7 @@ namespace Pinetime { bool OnTouchEvent(uint16_t x, uint16_t y) override; - private: + private: Pinetime::Components::LittleVgl& lvgl; static constexpr uint16_t width = 10; static constexpr uint16_t height = 10; diff --git a/src/displayapp/screens/Label.h b/src/displayapp/screens/Label.h index b648fdb6..62b80bec 100644 --- a/src/displayapp/screens/Label.h +++ b/src/displayapp/screens/Label.h @@ -8,13 +8,13 @@ namespace Pinetime { namespace Screens { class Label : public Screen { - public: + public: Label(uint8_t screenID, uint8_t numScreens, DisplayApp* app, lv_obj_t* labelText); ~Label() override; bool Refresh() override; - private: + private: bool running = true; lv_obj_t* labelText = nullptr; diff --git a/src/displayapp/screens/List.h b/src/displayapp/screens/List.h index 4c2973aa..a45fd1d3 100644 --- a/src/displayapp/screens/List.h +++ b/src/displayapp/screens/List.h @@ -13,7 +13,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class List : public Screen { - public: + public: struct Applications { const char* icon; const char* name; @@ -31,7 +31,7 @@ namespace Pinetime { void OnButtonEvent(lv_obj_t* object, lv_event_t event); - private: + private: Controllers::Settings& settingsController; Pinetime::Applications::Apps apps[MAXLISTITEMS]; diff --git a/src/displayapp/screens/Meter.h b/src/displayapp/screens/Meter.h index 970e4233..24af15ad 100644 --- a/src/displayapp/screens/Meter.h +++ b/src/displayapp/screens/Meter.h @@ -10,13 +10,13 @@ namespace Pinetime { namespace Screens { class Meter : public Screen { - public: + public: Meter(DisplayApp* app); ~Meter() override; bool Refresh() override; - private: + private: lv_style_t style_lmeter; lv_obj_t* lmeter; diff --git a/src/displayapp/screens/Motion.h b/src/displayapp/screens/Motion.h index a06a5d1c..11007866 100644 --- a/src/displayapp/screens/Motion.h +++ b/src/displayapp/screens/Motion.h @@ -13,14 +13,14 @@ namespace Pinetime { namespace Screens { class Motion : public Screen { - public: + public: Motion(DisplayApp* app, Controllers::MotionController& motionController); ~Motion() override; bool Refresh() override; bool OnButtonPushed() override; - private: + private: Controllers::MotionController& motionController; lv_obj_t* chart; lv_chart_series_t* ser1; diff --git a/src/displayapp/screens/Music.h b/src/displayapp/screens/Music.h index c7da233e..ef8f1fec 100644 --- a/src/displayapp/screens/Music.h +++ b/src/displayapp/screens/Music.h @@ -30,7 +30,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class Music : public Screen { - public: + public: Music(DisplayApp* app, Pinetime::Controllers::MusicService& music); ~Music() override; @@ -39,7 +39,7 @@ namespace Pinetime { void OnObjectEvent(lv_obj_t* obj, lv_event_t event); - private: + private: bool OnTouchEvent(TouchEvents event); void UpdateLength(); diff --git a/src/displayapp/screens/Navigation.h b/src/displayapp/screens/Navigation.h index 65a87047..46816c33 100644 --- a/src/displayapp/screens/Navigation.h +++ b/src/displayapp/screens/Navigation.h @@ -31,13 +31,13 @@ namespace Pinetime { namespace Applications { namespace Screens { class Navigation : public Screen { - public: + public: Navigation(DisplayApp* app, Pinetime::Controllers::NavigationService& nav); ~Navigation() override; bool Refresh() override; - private: + private: lv_obj_t* imgFlag; lv_obj_t* txtNarrative; lv_obj_t* txtManDist; diff --git a/src/displayapp/screens/NotificationIcon.h b/src/displayapp/screens/NotificationIcon.h index 40546397..dc34c3f0 100644 --- a/src/displayapp/screens/NotificationIcon.h +++ b/src/displayapp/screens/NotificationIcon.h @@ -4,7 +4,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class NotificationIcon { - public: + public: static const char* GetIcon(bool newNotificationAvailable); }; } diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index d5ea5dcb..51ca81da 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -14,7 +14,7 @@ namespace Pinetime { namespace Screens { class Notifications : public Screen { - public: + public: enum class Modes { Normal, Preview }; explicit Notifications(DisplayApp* app, Pinetime::Controllers::NotificationManager& notificationManager, @@ -26,7 +26,7 @@ namespace Pinetime { bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; class NotificationItem { - public: + public: NotificationItem(const char* title, const char* msg, uint8_t notifNr, @@ -42,7 +42,7 @@ namespace Pinetime { void OnMuteIncomingCall(lv_event_t event); void OnRejectIncomingCall(lv_event_t event); - private: + private: uint8_t notifNr = 0; uint8_t notifNb = 0; char pageText[4]; @@ -62,7 +62,7 @@ namespace Pinetime { Pinetime::Controllers::AlertNotificationService& alertNotificationService; }; - private: + private: struct NotificationData { const char* title; const char* text; diff --git a/src/displayapp/screens/Paddle.h b/src/displayapp/screens/Paddle.h index 438b4992..e133244f 100644 --- a/src/displayapp/screens/Paddle.h +++ b/src/displayapp/screens/Paddle.h @@ -12,7 +12,7 @@ namespace Pinetime { namespace Screens { class Paddle : public Screen { - public: + public: Paddle(DisplayApp* app, Pinetime::Components::LittleVgl& lvgl); ~Paddle() override; @@ -21,7 +21,7 @@ namespace Pinetime { bool OnTouchEvent(TouchEvents event) override; bool OnTouchEvent(uint16_t x, uint16_t y) override; - private: + private: Pinetime::Components::LittleVgl& lvgl; int paddleBottomY = 90; // bottom extreme of the paddle diff --git a/src/displayapp/screens/Screen.h b/src/displayapp/screens/Screen.h index fb453aa8..8e49c9de 100644 --- a/src/displayapp/screens/Screen.h +++ b/src/displayapp/screens/Screen.h @@ -9,7 +9,7 @@ namespace Pinetime { namespace Screens { template class DirtyValue { - public: + public: DirtyValue() = default; // Use NSDMI explicit DirtyValue(T const& v) : value {v} { } // Use MIL and const-lvalue-ref @@ -28,13 +28,13 @@ namespace Pinetime { return *this; } - private: + private: T value {}; // NSDMI - default initialise type bool isUpdated {true}; // NSDMI - use brace initilisation }; class Screen { - public: + public: explicit Screen(DisplayApp* app) : app {app} { } virtual ~Screen() = default; @@ -67,7 +67,7 @@ namespace Pinetime { return false; } - protected: + protected: DisplayApp* app; bool running = true; }; diff --git a/src/displayapp/screens/ScreenList.h b/src/displayapp/screens/ScreenList.h index a9a176b3..73ea4610 100644 --- a/src/displayapp/screens/ScreenList.h +++ b/src/displayapp/screens/ScreenList.h @@ -12,7 +12,7 @@ namespace Pinetime { enum class ScreenListModes { UpDown, RightLeft, LongPress }; template class ScreenList : public Screen { - public: + public: ScreenList(DisplayApp* app, uint8_t initScreen, std::array()>, N>&& screens, @@ -95,7 +95,7 @@ namespace Pinetime { return false; } - private: + private: uint8_t initScreen = 0; std::array()>, N> screens; ScreenListModes mode = ScreenListModes::UpDown; diff --git a/src/displayapp/screens/StopWatch.h b/src/displayapp/screens/StopWatch.h index 18b02069..ff604361 100644 --- a/src/displayapp/screens/StopWatch.h +++ b/src/displayapp/screens/StopWatch.h @@ -54,7 +54,7 @@ namespace Pinetime::Applications::Screens { return nullptr; } - private: + private: std::array buffer; uint8_t currentSize; uint8_t capacity; @@ -62,7 +62,7 @@ namespace Pinetime::Applications::Screens { }; class StopWatch : public Screen { - public: + public: StopWatch(DisplayApp* app); ~StopWatch() override; bool Refresh() override; @@ -70,7 +70,7 @@ namespace Pinetime::Applications::Screens { void playPauseBtnEventHandler(lv_event_t event); void stopLapBtnEventHandler(lv_event_t event); - private: + private: bool running; States currentState; Events currentEvent; diff --git a/src/displayapp/screens/SystemInfo.h b/src/displayapp/screens/SystemInfo.h index 463b8b9c..c0c65554 100644 --- a/src/displayapp/screens/SystemInfo.h +++ b/src/displayapp/screens/SystemInfo.h @@ -21,7 +21,7 @@ namespace Pinetime { namespace Screens { class SystemInfo : public Screen { - public: + public: explicit SystemInfo(DisplayApp* app, Pinetime::Controllers::DateTime& dateTimeController, Pinetime::Controllers::Battery& batteryController, @@ -33,7 +33,7 @@ namespace Pinetime { bool OnButtonPushed() override; bool OnTouchEvent(TouchEvents event) override; - private: + private: bool running = true; Pinetime::Controllers::DateTime& dateTimeController; diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h index a372a852..4ebd81cd 100644 --- a/src/displayapp/screens/Tile.h +++ b/src/displayapp/screens/Tile.h @@ -14,7 +14,7 @@ namespace Pinetime { namespace Applications { namespace Screens { class Tile : public Screen { - public: + public: struct Applications { const char* icon; Pinetime::Applications::Apps application; @@ -34,7 +34,7 @@ namespace Pinetime { void UpdateScreen(); void OnObjectEvent(lv_obj_t* obj, lv_event_t event, uint32_t buttonId); - private: + private: Pinetime::Controllers::Battery& batteryController; Controllers::DateTime& dateTimeController; diff --git a/src/displayapp/screens/Twos.h b/src/displayapp/screens/Twos.h index ade5abb0..3367618f 100644 --- a/src/displayapp/screens/Twos.h +++ b/src/displayapp/screens/Twos.h @@ -11,14 +11,14 @@ namespace Pinetime { }; namespace Screens { class Twos : public Screen { - public: + public: Twos(DisplayApp* app); ~Twos() override; bool Refresh() override; bool OnTouchEvent(TouchEvents event) override; - private: + private: lv_style_t style_cell1; lv_style_t style_cell2; lv_style_t style_cell3; diff --git a/src/displayapp/screens/WatchFaceAnalog.h b/src/displayapp/screens/WatchFaceAnalog.h index 8957aca8..667f6241 100644 --- a/src/displayapp/screens/WatchFaceAnalog.h +++ b/src/displayapp/screens/WatchFaceAnalog.h @@ -22,7 +22,7 @@ namespace Pinetime { namespace Screens { class WatchFaceAnalog : public Screen { - public: + public: WatchFaceAnalog(DisplayApp* app, Controllers::DateTime& dateTimeController, Controllers::Battery& batteryController, @@ -34,7 +34,7 @@ namespace Pinetime { bool Refresh() override; - private: + private: uint8_t sHour, sMinute, sSecond; uint8_t hour; uint8_t minute; diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h index fb6d9cbb..246efc95 100644 --- a/src/displayapp/screens/WatchFaceDigital.h +++ b/src/displayapp/screens/WatchFaceDigital.h @@ -22,7 +22,7 @@ namespace Pinetime { namespace Screens { class WatchFaceDigital : public Screen { - public: + public: WatchFaceDigital(DisplayApp* app, Controllers::DateTime& dateTimeController, Controllers::Battery& batteryController, @@ -37,7 +37,7 @@ namespace Pinetime { void OnObjectEvent(lv_obj_t* pObj, lv_event_t i); - private: + private: char displayedChar[5]; uint16_t currentYear = 1970; diff --git a/src/displayapp/screens/settings/QuickSettings.h b/src/displayapp/screens/settings/QuickSettings.h index 693fd757..8d04bec3 100644 --- a/src/displayapp/screens/settings/QuickSettings.h +++ b/src/displayapp/screens/settings/QuickSettings.h @@ -16,7 +16,7 @@ namespace Pinetime { namespace Screens { class QuickSettings : public Screen { - public: + public: QuickSettings(DisplayApp* app, Pinetime::Controllers::Battery& batteryController, Controllers::DateTime& dateTimeController, @@ -32,7 +32,7 @@ namespace Pinetime { void UpdateScreen(); - private: + private: Pinetime::Controllers::Battery& batteryController; Controllers::DateTime& dateTimeController; Controllers::BrightnessController& brightness; diff --git a/src/displayapp/screens/settings/SettingDisplay.h b/src/displayapp/screens/settings/SettingDisplay.h index ecd84465..b8ed87ec 100644 --- a/src/displayapp/screens/settings/SettingDisplay.h +++ b/src/displayapp/screens/settings/SettingDisplay.h @@ -11,14 +11,14 @@ namespace Pinetime { namespace Screens { class SettingDisplay : public Screen { - public: + public: SettingDisplay(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); ~SettingDisplay() override; bool Refresh() override; void UpdateSelected(lv_obj_t* object, lv_event_t event); - private: + private: Controllers::Settings& settingsController; uint8_t optionsTotal; lv_obj_t* cbOption[4]; diff --git a/src/displayapp/screens/settings/SettingTimeFormat.h b/src/displayapp/screens/settings/SettingTimeFormat.h index df08a944..9203b45b 100644 --- a/src/displayapp/screens/settings/SettingTimeFormat.h +++ b/src/displayapp/screens/settings/SettingTimeFormat.h @@ -11,14 +11,14 @@ namespace Pinetime { namespace Screens { class SettingTimeFormat : public Screen { - public: + public: SettingTimeFormat(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); ~SettingTimeFormat() override; bool Refresh() override; void UpdateSelected(lv_obj_t* object, lv_event_t event); - private: + private: Controllers::Settings& settingsController; uint8_t optionsTotal; lv_obj_t* cbOption[2]; diff --git a/src/displayapp/screens/settings/SettingWakeUp.h b/src/displayapp/screens/settings/SettingWakeUp.h index 4f476b0c..8b33eb06 100644 --- a/src/displayapp/screens/settings/SettingWakeUp.h +++ b/src/displayapp/screens/settings/SettingWakeUp.h @@ -11,14 +11,14 @@ namespace Pinetime { namespace Screens { class SettingWakeUp : public Screen { - public: + public: SettingWakeUp(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); ~SettingWakeUp() override; bool Refresh() override; void UpdateSelected(lv_obj_t* object, lv_event_t event); - private: + private: Controllers::Settings& settingsController; uint8_t optionsTotal; lv_obj_t* cbOption[4]; diff --git a/src/displayapp/screens/settings/SettingWatchFace.h b/src/displayapp/screens/settings/SettingWatchFace.h index 0963b4ca..1930a228 100644 --- a/src/displayapp/screens/settings/SettingWatchFace.h +++ b/src/displayapp/screens/settings/SettingWatchFace.h @@ -11,14 +11,14 @@ namespace Pinetime { namespace Screens { class SettingWatchFace : public Screen { - public: + public: SettingWatchFace(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); ~SettingWatchFace() override; bool Refresh() override; void UpdateSelected(lv_obj_t* object, lv_event_t event); - private: + private: Controllers::Settings& settingsController; uint8_t optionsTotal; lv_obj_t* cbOption[2]; diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h index 1cec2b09..7e332dfe 100644 --- a/src/displayapp/screens/settings/Settings.h +++ b/src/displayapp/screens/settings/Settings.h @@ -10,7 +10,7 @@ namespace Pinetime { namespace Screens { class Settings : public Screen { - public: + public: Settings(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); ~Settings() override; @@ -19,7 +19,7 @@ namespace Pinetime { void OnButtonEvent(lv_obj_t* object, lv_event_t event); bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; - private: + private: Controllers::Settings& settingsController; ScreenList<2> screens; diff --git a/src/drivers/Bma421.h b/src/drivers/Bma421.h index 3287ed9e..e4d925f5 100644 --- a/src/drivers/Bma421.h +++ b/src/drivers/Bma421.h @@ -5,7 +5,7 @@ namespace Pinetime { namespace Drivers { class TwiMaster; class Bma421 { - public: + public: struct Values { uint32_t steps; int16_t x; @@ -30,7 +30,7 @@ namespace Pinetime { bool IsOk() const; - private: + private: void Reset(); TwiMaster& twiMaster; diff --git a/src/drivers/BufferProvider.h b/src/drivers/BufferProvider.h index fac03bdc..53571133 100644 --- a/src/drivers/BufferProvider.h +++ b/src/drivers/BufferProvider.h @@ -5,7 +5,7 @@ namespace Pinetime { namespace Drivers { class BufferProvider { - public: + public: virtual bool GetNextBuffer(uint8_t** buffer, size_t& size) = 0; }; } diff --git a/src/drivers/Cst816s.h b/src/drivers/Cst816s.h index 7664a83e..14c296ea 100644 --- a/src/drivers/Cst816s.h +++ b/src/drivers/Cst816s.h @@ -5,7 +5,7 @@ namespace Pinetime { namespace Drivers { class Cst816S { - public: + public: enum class Gestures : uint8_t { None = 0x00, SlideDown = 0x01, @@ -38,7 +38,7 @@ namespace Pinetime { void Sleep(); void Wakeup(); - private: + private: static constexpr uint8_t pinIrq = 28; static constexpr uint8_t pinReset = 10; static constexpr uint8_t lastTouchId = 0x0f; diff --git a/src/drivers/Hrs3300.h b/src/drivers/Hrs3300.h index cf87f378..c4f28900 100644 --- a/src/drivers/Hrs3300.h +++ b/src/drivers/Hrs3300.h @@ -5,7 +5,7 @@ namespace Pinetime { namespace Drivers { class Hrs3300 { - public: + public: enum class Registers : uint8_t { Id = 0x00, Enable = 0x01, @@ -35,7 +35,7 @@ namespace Pinetime { void SetGain(uint8_t gain); void SetDrive(uint8_t drive); - private: + private: TwiMaster& twiMaster; uint8_t twiAddress; diff --git a/src/drivers/InternalFlash.h b/src/drivers/InternalFlash.h index cbf9a20b..3a3c79dc 100644 --- a/src/drivers/InternalFlash.h +++ b/src/drivers/InternalFlash.h @@ -5,11 +5,11 @@ namespace Pinetime { namespace Drivers { class InternalFlash { - public: + public: static void ErasePage(uint32_t address); static void WriteWord(uint32_t address, uint32_t value); - private: + private: static inline void Wait(); }; } diff --git a/src/drivers/Spi.h b/src/drivers/Spi.h index 27000755..6875710d 100644 --- a/src/drivers/Spi.h +++ b/src/drivers/Spi.h @@ -6,7 +6,7 @@ namespace Pinetime { namespace Drivers { class Spi { - public: + public: Spi(SpiMaster& spiMaster, uint8_t pinCsn); Spi(const Spi&) = delete; Spi& operator=(const Spi&) = delete; @@ -20,7 +20,7 @@ namespace Pinetime { void Sleep(); void Wakeup(); - private: + private: SpiMaster& spiMaster; uint8_t pinCsn; }; diff --git a/src/drivers/SpiMaster.h b/src/drivers/SpiMaster.h index aa037504..dfc195b7 100644 --- a/src/drivers/SpiMaster.h +++ b/src/drivers/SpiMaster.h @@ -9,7 +9,7 @@ namespace Pinetime { namespace Drivers { class SpiMaster { - public: + public: ; enum class SpiModule : uint8_t { SPI0, SPI1 }; enum class BitOrder : uint8_t { Msb_Lsb, Lsb_Msb }; @@ -42,7 +42,7 @@ namespace Pinetime { void Sleep(); void Wakeup(); - private: + private: void SetupWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel); void DisableWorkaroundForFtpan58(NRF_SPIM_Type* spim, uint32_t ppi_channel, uint32_t gpiote_channel); void PrepareTx(const volatile uint32_t bufferAddress, const volatile size_t size); diff --git a/src/drivers/SpiNorFlash.h b/src/drivers/SpiNorFlash.h index 77a470b7..ed6ab315 100644 --- a/src/drivers/SpiNorFlash.h +++ b/src/drivers/SpiNorFlash.h @@ -6,7 +6,7 @@ namespace Pinetime { namespace Drivers { class Spi; class SpiNorFlash { - public: + public: explicit SpiNorFlash(Spi& spi); SpiNorFlash(const SpiNorFlash&) = delete; SpiNorFlash& operator=(const SpiNorFlash&) = delete; @@ -38,7 +38,7 @@ namespace Pinetime { void Sleep(); void Wakeup(); - private: + private: enum class Commands : uint8_t { PageProgram = 0x02, Read = 0x03, diff --git a/src/drivers/St7789.h b/src/drivers/St7789.h index cea9cf19..4fbccbeb 100644 --- a/src/drivers/St7789.h +++ b/src/drivers/St7789.h @@ -6,7 +6,7 @@ namespace Pinetime { namespace Drivers { class Spi; class St7789 { - public: + public: explicit St7789(Spi& spi, uint8_t pinDataCommand); St7789(const St7789&) = delete; St7789& operator=(const St7789&) = delete; @@ -28,7 +28,7 @@ namespace Pinetime { void Sleep(); void Wakeup(); - private: + private: Spi& spi; uint8_t pinDataCommand; uint8_t verticalScrollingStartAddress = 0; diff --git a/src/drivers/TwiMaster.h b/src/drivers/TwiMaster.h index fc3bd2a7..1c0648a2 100644 --- a/src/drivers/TwiMaster.h +++ b/src/drivers/TwiMaster.h @@ -7,7 +7,7 @@ namespace Pinetime { namespace Drivers { class TwiMaster { - public: + public: enum class Modules { TWIM1 }; enum class Frequencies { Khz100, Khz250, Khz400 }; enum class ErrorCodes { NoError, TransactionFailed }; @@ -26,7 +26,7 @@ namespace Pinetime { void Sleep(); void Wakeup(); - private: + private: ErrorCodes Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop); ErrorCodes Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop); void FixHwFreezed(); diff --git a/src/drivers/Watchdog.h b/src/drivers/Watchdog.h index f1741892..03807d61 100644 --- a/src/drivers/Watchdog.h +++ b/src/drivers/Watchdog.h @@ -4,7 +4,7 @@ namespace Pinetime { namespace Drivers { class Watchdog { - public: + public: enum class ResetReasons { ResetPin, Watchdog, SoftReset, CpuLockup, SystemOff, LpComp, DebugInterface, NFC, HardReset }; void Setup(uint8_t timeoutSeconds); void Start(); @@ -14,20 +14,20 @@ namespace Pinetime { } static const char* ResetReasonToString(ResetReasons reason); - private: + private: ResetReasons resetReason; ResetReasons ActualResetReason() const; }; class WatchdogView { - public: + public: WatchdogView(const Watchdog& watchdog) : watchdog {watchdog} { } Watchdog::ResetReasons ResetReason() const { return watchdog.ResetReason(); } - private: + private: const Watchdog& watchdog; }; } diff --git a/src/systemtask/SystemMonitor.h b/src/systemtask/SystemMonitor.h index d24e9bf7..45c02c2c 100644 --- a/src/systemtask/SystemMonitor.h +++ b/src/systemtask/SystemMonitor.h @@ -9,18 +9,18 @@ namespace Pinetime { struct FreeRtosMonitor {}; template class SystemMonitor { - public: + public: SystemMonitor() = delete; }; template <> class SystemMonitor { - public: + public: void Process() const { } }; template <> class SystemMonitor { - public: + public: void Process() const { if (xTaskGetTickCount() - lastTick > 10000) { NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize()); @@ -36,7 +36,7 @@ namespace Pinetime { } } - private: + private: mutable TickType_t lastTick = 0; mutable TaskStatus_t tasksStatus[10]; }; diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index 67e62a2d..e65fbea0 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -38,7 +38,7 @@ namespace Pinetime { } namespace System { class SystemTask { - public: + public: enum class Messages { GoToSleep, GoToRunning, @@ -83,7 +83,7 @@ namespace Pinetime { return nimbleController; }; - private: + private: TaskHandle_t taskHandle; Pinetime::Drivers::SpiMaster& spi;

Rc);eyJ;N96W^56 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%0A^qPl9xoxje@cjm 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 z

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