From 83489c25abe1db822d2d09611ff3c960862df900 Mon Sep 17 00:00:00 2001 From: Nunu Date: Fri, 12 Jan 2024 21:57:16 +0100 Subject: [PATCH 01/18] remove aes related stuff --- Makefile | 3 --- app/uart.c | 70 ------------------------------------------------- driver/aes.c | 74 ---------------------------------------------------- driver/aes.h | 25 ------------------ 4 files changed, 172 deletions(-) delete mode 100644 driver/aes.c delete mode 100644 driver/aes.h diff --git a/Makefile b/Makefile index 2e3e0039..3bb745d6 100644 --- a/Makefile +++ b/Makefile @@ -83,9 +83,6 @@ OBJS += external/printf/printf.o # Drivers OBJS += driver/adc.o -ifeq ($(ENABLE_UART),1) - OBJS += driver/aes.o -endif OBJS += driver/backlight.o ifeq ($(ENABLE_FMRADIO),1) OBJS += driver/bk1080.o diff --git a/app/uart.c b/app/uart.c index ff526e0a..60cf0b66 100644 --- a/app/uart.c +++ b/app/uart.c @@ -26,7 +26,6 @@ #include "board.h" #include "bsp/dp32g030/dma.h" #include "bsp/dp32g030/gpio.h" -#include "driver/aes.h" #include "driver/backlight.h" #include "driver/bk4819.h" #include "driver/crc.h" @@ -120,11 +119,6 @@ typedef struct { } Data; } REPLY_0529_t; -typedef struct { - Header_t Header; - uint32_t Response[4]; -} CMD_052D_t; - typedef struct { Header_t Header; struct { @@ -207,25 +201,6 @@ static void SendVersion(void) SendReply(&Reply, sizeof(Reply)); } -static bool IsBadChallenge(const uint32_t *pKey, const uint32_t *pIn, const uint32_t *pResponse) -{ - unsigned int i; - uint32_t IV[4]; - - IV[0] = 0; - IV[1] = 0; - IV[2] = 0; - IV[3] = 0; - - AES_Encrypt(pKey, IV, pIn, IV, true); - - for (i = 0; i < 4; i++) - if (IV[i] != pResponse[i]) - return true; - - return false; -} - static void CMD_0514(const uint8_t *pBuffer) { const CMD_0514_t *pCmd = (const CMD_0514_t *)pBuffer; @@ -346,47 +321,6 @@ static void CMD_0529(void) SendReply(&Reply, sizeof(Reply)); } -static void CMD_052D(const uint8_t *pBuffer) -{ - const CMD_052D_t *pCmd = (const CMD_052D_t *)pBuffer; - REPLY_052D_t Reply; - bool bIsLocked; - - #ifdef ENABLE_FMRADIO - gFmRadioCountdown_500ms = fm_radio_countdown_500ms; - #endif - Reply.Header.ID = 0x052E; - Reply.Header.Size = sizeof(Reply.Data); - - bIsLocked = bHasCustomAesKey; - - if (!bIsLocked) - bIsLocked = IsBadChallenge(gCustomAesKey, gChallenge, pCmd->Response); - - if (!bIsLocked) - { - bIsLocked = IsBadChallenge(gDefaultAesKey, gChallenge, pCmd->Response); - if (bIsLocked) - gTryCount++; - } - - if (gTryCount < 3) - { - if (!bIsLocked) - gTryCount = 0; - } - else - { - gTryCount = 3; - bIsLocked = true; - } - - gIsLocked = bIsLocked; - Reply.Data.bIsLocked = bIsLocked; - - SendReply(&Reply, sizeof(Reply)); -} - static void CMD_052F(const uint8_t *pBuffer) { const CMD_052F_t *pCmd = (const CMD_052F_t *)pBuffer; @@ -544,10 +478,6 @@ void UART_HandleCommand(void) CMD_0529(); break; - case 0x052D: - CMD_052D(UART_Command.Buffer); - break; - case 0x052F: CMD_052F(UART_Command.Buffer); break; diff --git a/driver/aes.c b/driver/aes.c deleted file mode 100644 index 6a8b5c0a..00000000 --- a/driver/aes.c +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include "bsp/dp32g030/aes.h" -#include "driver/aes.h" - -static void AES_Setup_ENC_CBC(bool IsDecrypt, const void *pKey, const void *pIv) -{ - const uint32_t *pK = (const uint32_t *)pKey; - const uint32_t *pI = (const uint32_t *)pIv; - - (void)IsDecrypt; // unused - - AES_CR = (AES_CR & ~AES_CR_EN_MASK) | AES_CR_EN_BITS_DISABLE; - AES_CR = AES_CR_CHMOD_BITS_CBC; - AES_KEYR3 = pK[0]; - AES_KEYR2 = pK[1]; - AES_KEYR1 = pK[2]; - AES_KEYR0 = pK[3]; - AES_IVR3 = pI[0]; - AES_IVR2 = pI[1]; - AES_IVR1 = pI[2]; - AES_IVR0 = pI[3]; - AES_CR = (AES_CR & ~AES_CR_EN_MASK) | AES_CR_EN_BITS_ENABLE; -} - -static void AES_Transform(const void *pIn, void *pOut) -{ - const uint32_t *pI = (const uint32_t *)pIn; - uint32_t *pO = (uint32_t *)pOut; - - AES_DINR = pI[0]; - AES_DINR = pI[1]; - AES_DINR = pI[2]; - AES_DINR = pI[3]; - - while ((AES_SR & AES_SR_CCF_MASK) == AES_SR_CCF_BITS_NOT_COMPLETE) { - } - - pO[0] = AES_DOUTR; - pO[1] = AES_DOUTR; - pO[2] = AES_DOUTR; - pO[3] = AES_DOUTR; - - AES_CR |= AES_CR_CCFC_BITS_SET; -} - -void AES_Encrypt(const void *pKey, const void *pIv, const void *pIn, void *pOut, uint8_t NumBlocks) -{ - const uint8_t *pI = (const uint8_t *)pIn; - uint8_t *pO = (uint8_t *)pOut; - uint8_t i; - - AES_Setup_ENC_CBC(0, pKey, pIv); - for (i = 0; i < NumBlocks; i++) { - AES_Transform(pI + (i * 16), pO + (i * 16)); - } -} - diff --git a/driver/aes.h b/driver/aes.h deleted file mode 100644 index 9aa75e5d..00000000 --- a/driver/aes.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef DRIVER_AES_H -#define DRIVER_AES_H - -#include - -void AES_Encrypt(const void *pKey, const void *pIv, const void *pIn, void *pOut, uint8_t NumBlocks); - -#endif - From 7356d30dde6911f3699d40f6976a809d5fa7d851 Mon Sep 17 00:00:00 2001 From: Nunu Date: Fri, 12 Jan 2024 22:02:43 +0100 Subject: [PATCH 02/18] fix ChSave preventing update of current channel --- app/menu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/menu.c b/app/menu.c index b54f4cfe..571a5d89 100644 --- a/app/menu.c +++ b/app/menu.c @@ -916,7 +916,8 @@ void MENU_ShowCurrentSetting(void) break; case MENU_MEM_CH: - gSubMenuSelection = RADIO_ValidMemoryChannelsCount(false, 0); + //todo: in vfo mode select last empty channel slot + gSubMenuSelection = gEeprom.MrChannel[gEeprom.TX_VFO]; break; case MENU_MEM_NAME: From 293835c61238fe030c02c98672474eea672e4395 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 13:45:16 +0100 Subject: [PATCH 03/18] fix: fm radio tuned to wrong frequency after reboot --- driver/bk1080.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/driver/bk1080.c b/driver/bk1080.c index 584b3555..9ae34700 100644 --- a/driver/bk1080.c +++ b/driver/bk1080.c @@ -69,7 +69,8 @@ void BK1080_Init(uint16_t Frequency, bool bDoScan) BK1080_WriteRegister(BK1080_REG_02_POWER_CONFIGURATION, 0x0201); } - BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, 0x0A5F); + // Europe/USA configuration + BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, (0u << 8) | (0b00 << 6) | (0b01 << 4) | (0b1111 << 0)); BK1080_SetFrequency(Frequency); } else @@ -78,8 +79,7 @@ void BK1080_Init(uint16_t Frequency, bool bDoScan) GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BK1080); } - // Europe/USA configuration - BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, (0u << 8) | (0b00 << 6) | (0b01 << 4) | (0b1111 << 0)); + } uint16_t BK1080_ReadRegister(BK1080_Register_t Register) From 7e6c42b2c57459d692bd6253008ffbd7c04c2e7b Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 14:20:23 +0100 Subject: [PATCH 04/18] update eeprom map --- docs/UV K5 EEPROM.xlsx | Bin 68605 -> 68390 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/UV K5 EEPROM.xlsx b/docs/UV K5 EEPROM.xlsx index c037c5f19cb6caa722623ff8158e3807044d0456..2644d951a8fb3dc12808a1b8b320b4aca8979309 100644 GIT binary patch literal 68390 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 literal 68605 zcmd3P2|Uzm`?oeEOGUOs5~Z?5wk$>Vt3DMAvG3R$Lv2}fFlY?EEtVw5d= z_PxPi%*=cLrk)e$nDaO1^Stl>eLm;8&0KR|zia#6*L~gB?>^6SR%6RnCJJh5YKliL zhb~d9`p*vV+0@z6&P7NN8nYghYL^Ss22cCkJ%TyWb&C2~TA`+DA-5Rkhl37#--SM} z2>h{dhH*D-_?z;G8~!l7d1|+&!?A8*J`I!5^Or+67xP*8Au4L|H@t+z>y!Pfc1fz} zIw~G+n%libUGupwLb7N#on)M-xjuV_0i(-Q`MY;@7X76svc&Lv{F07 zcvgdoI_QbmlPTbYhRqZdXGyw=0nG5U6Y_9$wl#Njv=#KUw+q+nbnXz|={J4RbB?~m ziC;LD_JrqyxNg3bk8ka=U*A3EmBM>U8i#plnUIE(o7(QLM zmnCUqsgAS;oyErb`KVHf4qg79(W`s(PW!fFg_nyBlX9f48gR*YXWP{sskqjM70-S; z=~54D7E0`CXUZ;6T+)!I2}n0}d3Gt}l`tXjS*`B(S4~T=DTDUi+4M20 zty5j>an|G1`!j7PzR#vD)!8N|I>m{?=GC#8v&WOTBDB=oMUKADITe0kd5#xLFQuzu zq&~EVgFAt0KyHwMI{cxUWlg&@=eC52X-`|}3PbyfunRSVf)WOwVxLKwWbQi0w1hlR z=zf+#=4~;0<)HpE9g*jIjJv<-Of4Uz`NR4as>$vf*5UNT(R=O35>)CGle+Q(@3tR& zYLzO?Y`iO^EIr!lsdttV-IAlU^T}}?o%gp2VyhMMzc@{|6ugfKf`S&#dcVJG+_VN+wS2=!QtzUrw$x?P`;nKjG3iju_^gv zw(f%`Q?QR}ck50a+K=EJ+82JOJraYmeo~j#wBI1)`Ds>%LxBv>XRqFOKt1G(v3uaP z9PK)ImSs*u8qZAUcMx-SN-(F>1@YP~Uv_wZYebyR$1Wt#2+-Lu0M-z2^^>BB2U;j?8ehKVdY17x%)K*757Cw3Gt2>^= zc;V%@$h>iQ%uAGNh4UGy@}roWdofx+^uE<>spQIK)ljiCtN+xcewonkrIlN`=eo%( zyJ!%Tk-ln%-Z^hA0pU-3_n&Wx$NG<)zauOW+Wyku;+q@CODuFhjwnWS6n=XY}jTO~O6-En^F+-i&L+Fy4z zX#Q1Rz(~cm3~Jetr)dsR)-6iocJ}thrTW9%+l8X!d@e_ev)?xl+2phIW|IC%;Mop| z>as7l4!(?fc)m1_ zZn1y94>iQ~-S^tN=*oDP{nWlb@7xhGT~1M%qZW%JWA~#O^__!9s=Wu9?})ceDo!s- zxYP29R0io=ZspH=6;nic!bsgDJ&=d$_DCJ>))Dv>b@>lQbLk@|>iizLntn?>dC4a^ zP4aX1zA??N?HRV-mt0hv-4XOF9rSEL-MYGOXyA0dLirVOc8F&2go+W#&+X2qOEOzN zCs<0jmDU|qqvZB0e#tXyg8#_deEDIT`U83-cOBFIp?N2H+&G|&4 zW7X>PDvkwcET}1T)O}!L-t#NYy)aa|KZ-+BZE@O5~Aht+0oc>+=-7$o%i;I*(gzn zTD`sT_yT=JeT_|AyMA?DXv?*d=EF1r!Z}h;(v-KQ*XIe(`5B7Gi<`xcCtT>@ntF$G z=sfuyFZZeog_W*wPhHU7s>3yWV*j-sv#@(5N>N!6RdsH5#m_|;H_KWMZ9VZ^!Key!7+s)7IIZDfxxIN?cC}S$ss4VVD z7T-Iaja%GQb*}$&h4_Q7?+E^adktwUCq74iZbg@<&X0+OkKL(Iq@~PA-WpU|=}ujI z3pX{{$9ADUxx3ezH}VzN?#v>_wwo+!LI!Wql9vU|%kG~vPWh;=o!OtysGEwY~x@>Os9#7rY@bzZz_AH5vNAGj@D7IQW!=UQ>Ypo(Suz`VMFBR z>Kknjy&Q93-vj4l~VL zoK^angfA#H~P-~|a7WJ{!9rk0Po>0_1&2Y|R^cn&65mDZU z?$Ob~c)&YC2Jw!ajgx6uA*6!`L#-lacq$Kt8#XR1>VaMFEH7VfslFlUcj=}0p{A~d z8!jV{wRXUE%Q{>@%IDTc!uG(6yoybWy>L07dob`AkFI6o6u&}jb5c?0Kr13dB3s9& zhCt=QUT6F2OkgVeF_hWqz(MvuKAWXdW{O?PDrKh=Z#J`_6K^tuRlUCC!Xj}FZS%f8 zXI%A<62aW^*Od<@&3!lw|3C}62UvuCA2CNr=GMFrbPu)&6Pqxn;xPQ~z;d$swNjbK z>m3}1`k{jEAK&vF@ntFMFLk^2RVH7%KA5WYy%hN79O31Zn8?U!l!g$k$*uma zq7TR4*Nnz=7JT0=-0_c|cj;v%baHQ4**a6eT$ z6`1`Anym*tm-G<#Yj#Rj}h zYG~{8lUR-`{+&$gp=cR=&8Trl+%vXTm)X0JdAg8t>kikfd%aCQ(b5?;YQ#OeHSWbP zD&{16arzjh>HX7_UuwT94d0#8-(kd(s8OJo=wj^pa#Z`oH@BwuFHU|zv?}H08@VR4 z+X-eIeHG>~^Zv!PGQon-o*BH5ZqW{1dGL~`~yhgp#^qZ1>AQ{tcK zmS1*;I|r7G`#=Bobh@DLg)ksX9-&=+X&6BR$Vt!30C|*1mWIfkL~;p{JWC|Y5NAh1 zv%87pB_dhw$T4lV#7rO-rxFCT*`jL$l)R4NInFSaYS;UuKm*M^tvw{zz<64;=n!UGJx0OA6^Fr z3#LM3Eh1SDBJX_!k+q5B^F;D_;%p+>fk-wck}ncxKV}EBBT}otLoCx@%V?h(x^4kf z&S_x+eA}t=MkD=w^e6XCbIaXYWa<~a!>|*s=(}l_x1uoC zAi`CMnytkrVG;toXR+BVfj9?BzDD{a<+MM$=U`ir>;m63<=OE%1 z#8BJoT@^$VZ)##%HYq-Odz)EFA?(02rKr!zs@CTY<{aK_z{D?b_aU>A`Y61=L`O8S zSrZ|K;;(n5Io_p5rAgbUYrw=NaQ7awl5*IA=Soq1j)6IckN>1K%Ri5!7en2;CjD8H z>d7bt#Br~@akCuH=Va=f!Mn&*Vvrg0GIHC?E{#jPF^#m+({hLGSaS|?jtiZpZi9il@BO}42RG&?A({MU;4Ph zMEceheq$#iPS5UbsR(&ZwlK zd{_3-O}5M(5w%+yx%P3Ml0JTG#ebV1gUlsY&o?78)=how$>rrrA&4;gNS1v`Lees3 zuAXHhHFsV=Z)TNbDD2IbnUQJkyOqMj_;LE;OkoT7p3>BJ?s@rJ<&cnYdY!%dI3=WI z99=zoM`kLTqM|Hxc+K8U1`Pc8fL05kdKjU37-@Q|b_)aNz9boG8E;q51z=uN-{|x5 z0hN&9NP33-`;vfG0l++&L85skqcb0xqe2HEuk@ZyDUVjw;fwMcn>&QLr_?(1y+2oK z%h~z{+}3$%eNh4V(1h{OlDO`-X!P zE7t}41hX@aWXRQJCtubxR*xxiL@J{uy9nyNm0zl@7pljcFlxa%okEia(PL=7C-35M zW3QIqNc%o|nVva>n_KB>mnpb}_ws(-VSO|_M|f! zist&uEPSrVlBsc|P|v3?LIr|W9)-DGu5=O^b3@0>4;3zW?8EgWwwN7acW(;~_D@bJ zn%*QZ_5Hw@1iH;(O02+@#g~v8Pak;!Yu)p*vry4Th~?hMi9f0b#$UWINa!)LNnY|_ z2`fxYH14u~=oz4sE!dN8-5B5_yZDEfo2ZHEXOjCYh&t|#7AaVsZ}s!JkIu$dy|Uf;+`YIZ12Z&WKmW2xu52`OO0+52qa`A#uy!09L zmq2Emck9c%S|41%$Lo3WGLt6AA-ng4twJJC8zn-fvQxjRzU=HOAKO`Mnsvh0^h|%& z(AbX^cQIt_w@;^=Y&7zsov{U z*yx`~QtI;9E%k@=`>~P%v5vf`gJHuRQR!BFmw5h&{PHyJ-h{aH*NE!3Lumys5Cew0 zdSI`DRj!?h(KzRe-L|MFDr0z4UXtg^4px)i24>-+xfp>D@cT?{n}cJN-fUZRc|enU zvya!pZc{nxfq8DgV7S=TZ7hb}1|KfGDtdo2%gn3bgkkB-R^AFL7Q>`~PZxx9wpCbz zkB_S_2+N2t+~}w*67{UGVL^ZGHGvk#UNFW4YW$Q zV4C7tw0R(Bc{y)j4=dtJ%!Pfh#H)b(&V@)0xKAXvvU6mAkj#?1hx6Q4Wi!94x%#NE zb|yoKtjVn#27X4vvot`2{J}qm6zJ2c;T~#i%hAY-W(f;`d=Hg`33+&<1C76bT-&Fc zOSj6V5v%w~a?%S{!-|ldW?&o08OCv2BrF6s?fxzXzLOjVT+6VEW(nG!FzS1#?b8gm zZb7%gWt)DVC?4FylOI}-uL^c;CO~#pNL=oGu%V*Pcujj zxPHPaHb^G^z~2|uMu6Xl7!)gEdK0q zZL1>rhxbry(+s==u2ug;X6qhf7S**1zF1g!|4T3ij9-IeiYo8721^uI-fs(T1!Fri z3u8)dX%&;G165!o|F!S*lstNMZTo1o`L6N1l$u!vB)u`4IeuF2vT$tN)68S6-!wm8 zV5W8F8#%fo*nd;FW$9<3r*Dt3E^o_uyiE~#v-^$N2+L<9W?J0lg4%#*rl))^3(xHs z5vmm^xmY#z4NNXSCNa0eTBMc^x7oYS8L;rZg~+u;vM5AeCX$tjWE7Enf;hV#nthE( z?j({Wh_mZy06F+=8F9vJ=TQ(4-tNX>1%!vZXiTQ6F~^AHBNAa^A}`F)KMmjv*U${vm3(&#mOH?y^jg z_N8qn~Cq2iow>$Ib3&%GrPU4~0 z2zLlsVE!Sip*wogD~6nbJ7HFt|7_#BF_wQbKA*n$J+SKO0_rbaHqNS zO7BBJ;%4RvrdQBU^4soEEk2{D$c|A2;(cjYfr^8AAI?%x3&J-CZ$9O;#3al_A-V02 zMchVamFI3?)(gkaR}nX#QS3C5+eW+XX73Mvv%?fyV{|tCsY1f$iqgfi6#cEW|HG`# zeG+fmy~Nzkc{EUXGR*QgFZ_-Zaluc=Iq^dapYXfwn)aLZ;#Yl~X}RlBGtQJI9+a+i z<+@&M$EuGH5f_Ru##X}b*fi}a_2NrguC4kg^RC}`Qu;#+Wo!q9-d?loTQu!&rqc<( z+mt2_o{7mEAME=)RpPE9OWC^eUcUE9&jOVZx)FcV*1wI*sl6woMAZMre3KGdr>h5^ zJMJ_8*4OLNLR3kSI`*omNvhumq3mY4;h2jyT$tKSF)KoC=GAKanc{e?`KJ0DLjRH3 z+H)S~?T$Qe(^r0-e$U)Q8CRXvebVpsO`{vH)BDZ!Dl3cnO-y)W&ehevAmo4P!DdY* zUoLFVrq2}0R6G=3Rhy%ZtF<&p#}6LQxK!4vN_vM7_H1~ z9yuI=$l3h;0T067%sTjt^WBH$cf?K_x^L1wd-&Pr@Cd$h3WOr+TxSUe*H1xjbv?zL zP~OZ`n9}spHZiT1dnYrIFa>$$>{^GGv!m|kH>)P8m)_nM@vdIad%Led>Gn+8^i1ZJ;DqZll?e0HziFd9J$Q36iC?1LTwH(W!m)h7p=PTZ6$%~&lOxGbcc{^vH zbdKR8UcsxMVjeI(f*~o`osx7GY{y^Y9?Yklcc)Y4Ws)N@6@M?YR(ChJgJYl-<`Y3#j!>!%+H4>U@9VnOHLali&Ok#XZx<}?}d)? zQwY$}9};lHrAn%me(W{ly!~{L@>rpJs}aw(J0CZN9oug!gy+{p@@MpXa^ZXEj}(ec~uS#@TEu z79a7Z^6O0vg=}Z3j3Nn%+maVSq1|Y zcPKWySW$~5$n3)j!;ciD4VRvNJ5OQqHUIMK6oq|F9{z@bdku=Yaf&}EdsW|RQi{JG zknexK4}<5x+swU8W?p=o*XPF|cgt@|j%$;AUPu0n=q1Un3XiEf+FJWJk1G*IJnr6F zo@m+GBTeO>A#Ny@J=p$3pk8P8obnS>@8#`Kkor&NF=uyAVSaSNkdaw`iG zJ-9)P{7Rn=Y>A67*NGQc5^C+i4E|2Ts zB2-WNFONs|_+djDg_hA6qz`_kZ>3NkhD9J(7936ckoZL;`h@@D08j@zZ30`wA#qEE z$d#2mp&tVtJuoa9!9_s8a41ul0kVUD3n64>V?wx)xJVtsi}6PEl!`B|6TY%MpA_L+ zEKeB4$m3^F46v0YE`LHfoPdA6q_gy+Fs5F97!D&K(Sf+7PA+# z`s2~?9)D}O(&cI-b{MwO)nmHSNLUP!_w(KXTe2n8NA}=m;r>{d9Ikb6v^)f18Z6gH z3tOI&_xHviVQ3T*Kg0DA!8O}cLRdh|AN8-oM#7dAXAvL-YB2n44?d!cfiPRo(1UGhITM!pOrgA(-q;!sPI@yk9hI z$rOg4miHx$vn-Z-z*ZK3q@@_HK2#pIulfrChtgRAv91-G9>Ks%zB9mZgNDB7E=&(> z`H-K#H-6I5pHS<%FnTf}5{auPpvxIx_!tlo9KvG^^HHv!;4f|Nj!XD z`qE6=nq4%~r+U;fA-rX*EuO4}OhFO8DY-bs38B-ZY*$;Yu zjLmjjK|~V9M5VFB>hxDRy#4nX|AW+>65}Y-I5p4DWWycluVg6X z2i?Ez#K29*y@Q*fZq2DPs|vv9nuYM3Gg2RWVi}R`F7VsoEEtY5hc?#rVhS z=yV!?*`*<-v?I3-snw`4JDYdD+4*B9CpQ!KLvDTU7H%=_9Bx;{UoA=~d60qbPM40) z=xzNHX{EPkrC_;UO7lE*-p&U*r?^wNuX2CqmQgsYa9Ht$!V5)f1#88T24Jw~j%N&4 zsISmop}9hTMGCkj2DnA!e4pbui{2i5uK)IbHb&#G#s~sq+@|%7wazbgE`QMvLS~tk z>jydQ;NITHslcwltiV~ubNj&UNkRbPVyU}9dO17x!W|mKMYWGh*IKcLRhau&ZdWypJl+y+&K0nlp zV)~1jrz<_Pt9+!o$7fCM6FT-RA-aS<%6n-|2EwNdvtl|nh$g_Uc^O7q^M9{J;QfZ`7!1V-M6V20=x(hyNWW~ z&WgLgN2I6* zf3MlXe}8xSeRiAs%%e#oH1~hYLu9*A>J-LM>f}-a9lt`u9Oe4%Nmf4f+qX$27Y@lx zb{~?td^n*^tPL8@^6!^8czR0p?p4(YnfsghqiE8jC~cyqLW4K0c8vjQrpO01V~290 zk)Uf7r$acQW;jgjVM^ z5! zdAi=}O)D}txu|CtH~Am@(6|-!YUKCKyi4oz!ld=Jr}Z&8uqWBGYxkw~NfmYA@2(pw zt0$DJVpVLnCGV#P=!qT}1|HBvtsmvJoJ+P^<>)D`^0!*$aaw`Uuw_Hm6H!Gz8_{Wn zL>;Zf>BQ;4AV#-7IMQrZg9G_hOlG>97@>BtHnD_uvCm@bgCj0&H8}9U!Eps;hH|=s zI<;ZHTmj(#EZZgMsN#b)@@*t%HGqeY|6u#@-@uiJw{(d4H6ik&CNQVf4$gk(}s;ba)AL0B)cIZUCTL zFIVleUcE5NTb~4%14seGKcx`|py#^D6?)$9g!2=`POoh8-`Efb;M8?j@EWtFe19uy z#}2f$V+Y#&&q1O$wPmLVNCcrh8c#_a$h9sAS};4}DL2eF0KC$a)(3^wp4|jsLxkk| z=2<68Nh)izQA^ON#0SSXp`21kcqeK#D5U&>ccwrXf6DtMygYMq{SE76^J+9sTkg#V zV0^As4uQWztmt-pu!ZM4-1Q)8Ue&F3sp0-J-(n$s7>E?a3Zc&F#q< zKy|?LK!C~tPriVV1D;0$st`EmWco z7}1G3z?Ai>#*^TQzqbTL_B-I(&Jev6zuu8yXq*`awrs#TqqdU(4?n%bvJ82LZF%F~ z=>}%100ZyIfwAG9T*$><5_?~o-`^G-!>}s$!?Px6OmDL4SRea|He9Q)k8bS7jV-S&T>t|w7l?|-3gL?qF> zk#Z;!AOfgd1tKH>k%uE!1Axz#ltwTzrZkcQ5qRQn5Dfzm4FeFl0QgXkLL==caN)Wj zYFM+vmH>#n0EjpMe9kOGqtY^|rLra{&UmoI+Kc`2&j1ibm4LA!s^m6F5ItK5L@@w9 zr<WdQgQymOs1|^T7r^J?95gZO-Q<6vZp1^PcORB~CIKRa)gUqgnaBuaB0&Hj#Z)0M>ZJ;i08t@$;%^Ye01(9h z5NQDTTpEQ&qfy|(bwMP!21J7ZM3w+Vy8(PIEkonwWuVl$2b(oPab5x->H;8A1|WJ| z0>*~NCBY;?l)4UxS^<3enxS#D`64M0t;s~=07T;eL?-}zisqoPWbOn>5FK3)L_ksc zSV&#%*ngq!E)=9L8;X2&Yl!N8`WNa(#1Xw4SJF%ZMCxlm1Tv8k$V4vzd;-(5!5E#E zO$tQdiN8VA3P98fKx7Nx^I{Yl{}=@>To*(y*MMjqfXEGih#kPkZW$Wwmw{62f@n=p zoN)%&nKwSz83=d|%TQM6p40H$hF`yqg%-o_qUu+L0WtN?L71-?C6$Vb*Q^#HQ(G<* zu+B^lOm0!pMnd^7!GC-92jqcuTN*(Ne=CXPilAJS=pUNHkRXlQZE}l5HMM5N{MrjW zU;B9uwT!ZKhFEDQ`h(=U?m=oT=Z|*_eb6ecTq5e0O}d9Nl2BnD!!LQi zgpDiEg=~pYnbQCzV0hMh7INnYk;N6ge=_r2h9u`5BrIQ68h`kDAgwVyP=Ao1$gmkq?3Qf^?FzXOMbPnjQ(r5-jVvOd{Kf|Xx+Eo;DkSodsKu^_Ul?OZWL+Y#4@tjmlfSkv{^vKkEjQn-?a>N=4%V-E>d8-um1Re+TiRdcR$yoE13 z;T_I$%$VKAIOR-%M*2gw_jC7Y(jOj4f6Si#sNj*fP0H;kZ=3tdHV>}Zw0{;4*TH&- z=tKzy>*cqm+q1V<$^_9>WV%N09u-X0!Ik_Efbe zsg{bT*)h}RNe7H+sa&)5I>p|EdA$j{<)C|@D^>qfijlW!kiPmOeU0!I^)B^zv5v}9 z#bT<@#nj&B*d10Kz#G@;rG)iOOu1c;S9TZCxw2*UNEZo(bHZ-@sqoqRRk*@fgept< z>+bOu@$d=rq%z9>^95?5t}(j&(axjXdvy8F>k6FEJ?eJUzS){(%Y5_x@aBW{&2OIV z5C3Hc$Pf3u7&ZPO%)kq`=4)HfvI%zLTztehN z$Xduc!pGZete&d*DK$i2HC12jU5jc~OID8Bb7R^TjX*K=Xfci2-~h3yo=O>|0@jF~ zreN*3vRJTeAz~{4da;QoyRM z^)Jvc43^8Sv44RE$U(M#z(GyM_l#-RPYN9=O@fqvO$t25wAHV&_2R{x>9H~C9yVYJ zua{8%!rLjvxiD=`50VjM$IoQML3(i)>+sC+{bg~707LsGf93^xa!@37rhv7<4RY;O z78mNhcP@@@c#U#^1gKK-GXYB7CYd|`Vk$9rLYAU>iMfa#Pi8KHOg%kIeoS5Nfc3(S z1nXr)uu70}HvS~b`qEI>XfTK<_& zs>w@5B4Bww#Qn@-ApLC|^%2l6I`s><24y&@bn6bEkQUxqjGAkocEpPzr@fg?LGOlYU2Spo|x?XX< zMk;w_6=bFgFca7eHq%^kvI-=%tMW`iESYsOV8r4d*rAdT=gS0=Po8j+WYVn8U&SzG|(54nr5kaGapsMPgx$r`CKr1#+U;0Kx6 zPP94BxUP~M&_hz)Sr|vn8^}BPK;E$;E^ac@(Ep0S8<2&98@3SaW(8n33wIS^aTjR? z9=gKfLPxU7os$dy9RHV-s1aCULB@3_nk$U}{6HnP;ZxQ|rLK4WT`QHmvIsKMl4$cq zcae)^fgafU18@cZlgLbHj_9c+7{){C_SmtPt9B`^nhJOu^yI1f-!Ig|Pti zP`%1ax-!9vDLCr>rMa-1Sl$+a><3^dM9%rl3#?9|i9e;2mrOKL!o04qpnpjx?}%nH zVIINNR#^l}WcgQNUS!qCVa9c{P<0$T0ICMEtOX^fzZ2;AxU6iv(ja!XfK#g(ptKM{ zEbGZ=QB?{KEfNcQqRM2PAt2YliDwAnxFL}_Y6IwyuEN;Ho(E#Vg|Xn6R^`Nkwj65} zBhiBKuzA?Mw&f`}1a(XM1h0Yagvhr_U#K@+z)GScH){U>6EiJpkz>mID`-K&%Z=-x z_DD)t)cWm_C_&}btrd@Hb2*qs^T@BN_gPrf`W?1-vF1wE)g87e7L>fkvsS4;>73o4Up7^t%FtZv2>dWgW0yr69f_Nk<<%FmUm zq&1oPnnOHr;yreTt$8-7_h_H{A{#xv_Wmt*e#$-Ogc@h*MbE7XeqG7 z!8ryL={jVs*Izu~Wbgqrdr2on5*=51(8UIM71Z~7CS6PpZO!#A+h7w`LH9a zdb}ELgyb=PUHu@c4nHGAuH&Mp#tCsZv-GO8h+|*cT0&FV4VdOeJ4bsPFp1~$)ACyF`J3VNF% z@eSvA^@wlT4_n_cNQU<{z(@}qO zSJMq{tl0`5kKy-#t5yB9Tt@RZ5<5!z{`#N{J;Y2D7v_J`pFO_d4Nybq*q0jp#nYAI za`P3s?+8Jw@??&2Mk5x3Y+OJdk`KdR(kJ&eJc=G^5i!bWO4rNRf37#|l&*{r?9&a` zHZD(PPxRg%bKUMp5tVGDj%<*|3F&zb!7n2%+|YCjXgUI#-awpQ2BsGTYs|Mhb9hJp zemnC@A0t!^7pT_hqr1-4nqI$`v)g1&iyRjoQ~E^0aPMJ?)eT>>^eNczhqoT|31ykN zKo&4AaZ6MBQ7GmhDw;tT?W0LN=}!o(cA@8&+)y1^D6oyk&O2t_T;)fmV_$HNnVt)| zclA8KEDT7$^DB@1C-9x`JO%|LTuT;0CKZH}8t^RFT$& z8uR%CUD*PCDHg}Xj-tMVFc$d6uvc{5umX_;i6G+X0|a{rgwP^zyOz#roWcDUxcA&g zPtZvrW-=zL-L7MUO@G2TLvI*R1U78IiQ{`r-enEw=|J}UTAbc_yZ;)hyymwaM-%<< zU*2L868!MzUGEk?O4j?9#gy3ZkUGNTakMfG#L>q0uVf`ez9GMKWtVyr|I~%M+Bfoa zAx?9>zHJ|g$zu9Kz#8}=4M*DxA2sxy?~EL8S)d#K`SA6hLX;m*lieZLzgm;OO@>rI zy}FtOOW5P6tWRFERMB-TaSa1Qpa+#yt*b61XbzK(D(vikw(6yI{ezj8`&Z{Wb3$Q2 zQt{Cd4ijfWzP6v22QrG}`z-J7!Og#ST>CkCY|o(cj9`pQ+kmeTfFzZLK;GAcu7gz5d{QB}W(X=CANCZOBDw`a+jfjT_qwv%?@F6Om){k37cz?(VL*^*7|VrOmLKu5LU#Q^-=)QcCN6Xw+dkcKb5+C+E+B0OdX4uEzv5WQ*S06n z=i3gnrh8}{SWuWcHx#4>G#uy;vY89Ia^>+-nQtlvIdN+Bi)B_Hl`X5zs;tv6mGaV) z>KVF6B`dw3&7A)yt2?W!x;qwIEW5x0>_2P4Gr(z_= zTf9UE9m8Pp1x1DKJ9wM@Qpd6T8l)CuEcpg!;Ym8$%8149S6%P^{BThI`mZBhaV*OS)sDF^oz3!#M$6z2!ELOIzGt{uk;FT971~wY;C+1s)ye)f+{WyFg0duD zNq>F2_I0+b&#R>3#e*|}T*XN6XM_p9HBx(4ZJiHo`ktLb8Me`kW7#W;CK-+MVQx#}g>^myM0w8*gsB(q=m zh3ji#O;EWW8Kqrs^@)RLUsU76Q0-aGxDlqmerS8x_)yBA{q*YVQZ~^rTk%!PZm9=( z?WFSc+?fj#z%xTVRegS~J>YnWakQ`%C-IIyt9|W_k0+C?>Fs5mb6`1jiY-HoB=3Bj z*t;rwiA|Zl-N$pnaB)`zkS!iAvlj<)q0QW)6$!xt8NUVRXbsqaTA7JIqm1D#*aC8G zQm7xU!AxEdBD54wN92m)TSl^xnm3>BHDFmP7g4!4;F>4V&>8QM{TRW8@Tg)eB_ z;33x@<=Kr4lLFUI8tWu~jv*v3I{Y11)8-9Pf_%OspR3)*{MfVm6hlg&gazF`+UQ-e zcEKTbx!f_}Y3ObdnRj*UK(m|6cL8!1xadRX%dFh6_rZ}3SO^{9f{`6Lm$2S~e!1^r zKUhui%H%Zwr8+B(%Bwy6jS%8CwD5gPP;TDf9U9`rk_OP_pBa4)PDNy2RfC)bH-(B? za*;(8y1j-xp&)5lg1!xSJ4FY7hWiyF^4iKSuR(}(u7HBszL`}{6BjR}Hw|6<+vp`b z@Q&-A&OIc!0R(4-Z72CwWZm}@2aGj6hdvM^>@Gt7JFeSSs>Ia~G9Fo-W$=3JHsb!j zNgSXTzCH5%646(jcW223mLOQjG8YD+bx7tbTHs|(&p$r>i^cFB^eku0l8D*;U%c_^ zYtkk{61+|%{Q_yd%VgjM5+f%)lr~aCWH=_sh7}Jmxaiw2Y_zV^i<~3;a6i<3gU7JU zA!M%N$%J}DLGT@C{1&g*{m7d8?c#1x^~H737sIL*q*r?9h_`NqXwsUPw+J*Jv2PaK z*UWZSEF6;;+ju4{RQ~DAu-lOY<=oiD{8KV1;BM)k=S=NiWglr?li6RqI)=31zVPo$ zslRS%qLoU;I?SIc8Ki1;q$)~pxtlhNXGX_ai}?5VTP0U6hK9j!-11Zf_t5{WdJ}(b z(WXqA&jlzAQqFgz7)z&!KDB0_b`*h!GBd)Q`Wwgfg~MkQC&(R2RrDW0?zzGbAHktS9sI7P<(jb}ys+hNc%izCn{r>6+`<@dH z&til^iv+|#@s}Mm>max zdSop!8#0S8(hfq^Fr)Xd+zDCV$1rW4If1`~HX90U!x9i1TeWBr3d4DfMM4hQXpDet zf6Cd5AVzEzrewv)G?aP3YA1}>;2!++3TdU+0|sO;;u7JP!IojSz{TS~Z=g&6dc9C` zI9Az^Hb*rxN3GCR)#_A}Sa*+k$!-BYJjWcoHQkB5%iK=nEZ^Yo3(JRooeWvFL0Dn7 z0aw{$=tpS}KdHhR)&UcX3M&s9)P)${6QBgw&wpQA|Mlu;DcOwOUgYzEtY*H+X70pI zN+?fQ*phlqEJI%GnXo0Nu-BERHjH549dsXaw6zGAgGesx;pmMb_h^&3+&A;x0z>5+ z#chC%@6rvQuqBMf@$gw@7XW#YZgc#}c^K;Oy0CBJLLK(gSiN8-1%`TrK8jTt)5FP5N<6A8~@B@t7Dduw6}bj3Z;wD@0R zer~9lT@H&*@wWsRM#3!R{ryPQ|T-F9_)lANszi5%C`ws!yw_l z6&M;16&Pv<3Rf_rImp`8tbm@3hIKBR(Q~kAX}(5l0~OBQyHi#-tL@G?38fpF-RJLFjtNq5m4|26uMi9%4wW zm%+kBY;<7~Pf}hQIk7s#lN5QC3*^zkU&S^#*&GD1gm{vw-RMc`CscW%Y8g5cKvmC% zidV_-Y0zZB{4ADrh?O&jWaY8!!v4(BW^LD@=#W7ji(y@%z|d$l!`E033sOxMNp_1> zO_r)zJS*Da-jdblHjC~o5dw!rlvgAVsaoBPvwrpA7VQa(@RF!r5w*5EKD`hNi+KI1 zsG6;xd)+hRIpIi3wpFbXuOj)HqPA=~W|1!G5a*TXRlNi*lvQq3h((QDdTw6QW!<9+B$V)jj{e$GX5qqFv&Z)3~b9 zS3iLB8{+w5mDFXW>o?TyS0zUhMhk0UglzOpS+0AF)y!xt%5QA5BC*Jan&ehDQX?@K zqDODQ)#l?^Fl<fRu;lj>hW-w=f!{U@Q@(AKLJ{;#qk{77~7I44C{b@o8=gD+{$$6dt4fi>a= ze@(^`frBuP$wiNeI!=j_16APB?r#uOK`J2!svwB*M5w+e3#yI4Fc%1_5*vjo%`oUj z%b_0u%O*rkft6Kq=sg!hNj0Mz);6P|<&h0!TELgo=i@vU;)KXqAVBE!PoWL}B(zlK z?`!M7#cD~$!Ylz{?1C0%ch^Q2CK2Zs!MZGL1j#1^dygEb0*^94P+f8&3#w2M`yi-t zkq6bIU##SaP%YmmR0F(xaW{P6pb0GwswVU=?vFCy|2qP(KdJsV+`nZ1uP_%tm_T4@ z{Ydp_IY&i*_h^;Sp1)j8+*1bS6yZ_po>LCTsw}VWw##&bpx_?V4a7hR#rJ*VXDbp- z@1ZEU)lKinJWL!6nSvgHz+^flI>)wtKPF(^xQxmW?Tgu{eL-l@gNAzn&i<_oYCI+HREu z%Br}3k{Ym1b^G69Z6_zHh+n0#Od(nI#xU6X-Ty^t3_SX8N@K{MWR}K6xVsQ*evoa$ zHi}q~jhsO?f{Oly|I^-;fHiq+?I2fhsq$ZH<%$JdKt<79MYIYeRto}Fuz(<1NtHs% zq9BVbfdp%*trSsEsUoCmkc(9#Vnu}{F0B!vL>55`CMavz0%RlmKOdkZyMUMRzN*iq&w8o1;r@$~yhFJHJPQ8aZ^?zNbpZ&Xa z`(LXHV;ZCLhD~Ft*0MS1#aRGnW6+C(GmQ~M{}a;~nM63#_%MhdVEAc+Ha{3+tF~U; zb2~b4<9q?H0$<(+n2S&GzDB(7Wh+dyN#7 zE)XO3^;p{4bgE7kDcT)3Mn+Rv_Opp_rWJbnNn(;!(*|Z{Bx&uBtv)$e4R7iJ8aWtyJ%7wFP>MRWro2$A(7Xrz zeI<4mj7ynD{4e~*j992sTmhm7g9P*S`QHawk=@G9r%W6@ZQwK0Jyx3DxL@oho0D#$ zR)pgCUEuYY!45yQU^s;F0ps{dBFXuX&~P#7aR$I%|BiQH zOlXSKCKG{XC)@p5OKHLaq3QQ%@hpz+n0A&%PFgI;Nh{6)5oy`S9rphOmN#8rs|W{J zw1_}B+y+f(@sJ6f3bkkv22JQ*w`Kvu85sQ%IM+OOkmMd~74IpT#a=%axpf8V zIf}os!4|iD#qMlUFY!(^hd05V(shoC#iK8%=Vac+J_Z+Wf;2_Kej~NmdtDKusCeP+ zQoeyWV7TgMqTL$VY;s-XLQ|uO1$YfX23>s z2CnoS>o9hUOfe|Z8+-XG(i=hkc~=6PV}tS7*>vhkUtn$Gm;q>lMgSVj*B@5`Y+akE zmUKpw6+LKE5g#j>R7!oN97~W!R9@Y9@7h-_lb0BJEx2^sD*mW&O~*1JiK+blLnY&< z$(@EZ3qzcqet*?+7hhFJKL16lT6@O7$gG+8#SwPtYn0JlHg*q~WJ;<7)-GP&vP}?? z-GyeJJ7K3P&HsY1SQ&05J+$`}Mr5eSq)1Ei7hZAd-xisEn(=-zeQI}<)d1_(Exo}j zrzPhar=JQ|1GVR|;#RBmiD2J{Hh@zS(qjqhq)%<57sYlRv^{PoDlu^}mA#mrbA+aB zoNke7zwb~QQy#n^wkrvF`^aR4?T16>{Xph5@?j()^VwNhK^1! z-1`~UWYOQB%&2K6F@5j*$+w>u&q<~I z9K9%^%Z9#z>lfN*;$lWfk)5PAuzJtYTQ5%uqo*Jr zMhxEe>CeFL1vU)zi~lx4%IZYsv-T9AI~-{dVG16CkO6|wLIj~?+v96z=025<%*cQu zZRC7F!(6h5ntTE_#OC&%h;e;xv8)+O1(cs^n^DP(ah;p+-R~b_tz7e;;Ewd2Sugzu z%aW4XcjjIO%X0X9A0j&aYbL6xRNF{Z#1!1OZ8LmdtXJ~aB4RmKt1TL>4mKYzIWs|R zK3_{T`uXx~j{%0CibE1xNL+Zy4AYeg7ZtJ3`|ArhE`uqzIalKSz^Ab9L^sZN)-zhU zw}=$$A8DeGTcd0_Q86tmz6J2(>Ubqe4feeaD*0XS7m|Y+H_xkzk0hydzO$858SnFX z8O_UioBENw(5}zHj1Mk@ zb{#m;NMmA)*fLp~U26hpfKEB`%d|py>0mE|FJ9DB&W@Zb=}Bh2r?%cb%aD4ZTPUydDVILd077_jXSyvU22cM9D{&P<4tTG48H z6Sp^137Dg2D(^@75!zQ^M&hkn056IYaHmu)C;IsRq+gSlE@^6G#``NWydSW3NFS|I zJR0yh0C?4CqP5%kj6s7e)|fT|YDF1`-L3*V5b^Tj2Z&}cNg)@?!A6fYIo@9$e~ntE z>VGs4OT_sAF7K1!hMMLX@ewhQ+%02LyFh{Vucy<)LEq6JY_(*po(J9C z3UHp`**D~l0YooP?ej2UfW0W@Gbj2AqAHnMhL-ZM(Ss+ER4t?=)seG#U_{h1yUhwT zHQui^u!9uaVr%W@!C3Tt?CIN@}+PgnaViQ<5(`HhmQ-p3|Z%A>nd3G3=lg7fhY1mqP&x<4>L+AGUz z^8p@rH1U{*H2mxvvkB5z6B#d4xM|G5g{i&Ih(h^7w3k-`cmU5*E#v=qFK0}1u_9ok zzbSYgSGh`dJgA^=Ll{uch%YdDa0T%m)U)V-rC%;N-f^Zc{RF6Yx2q3yIr{Od09JsS z@c^v#)%SBft-mv?Mb_Z}^o21At>dVfV4y#x=y*q{+?3k+df#BW-iTm;-lDJOdg>>0 zw)KJ~V$hcv%f`1>v&(?bm&LW*I{}-6s~q(-g^zTp`mvl}>lAz1ER}2IZrm}VQzwa= zIBJ`M5&KDQv4=?)6dqEG(Y=8jj)o38^Nh0~`vn=NI!<&R)o%^p7HYV0cyaVMxdZqo z+76+-j<5Lj`5NUd0mK+^F-J&xFk>*xZX&OS8NpV*t~T(zr&srXOMm1~E7E z*D)xga$$jBhsKGS0vX{>fjvt5DbvmF)_IHuKJX|<8m$y3)di}xOKI90Vvwly^okSl z1e9P5?XZcFqh>zdTSK_T&@X2%2iL~FYn>$phc*5ty$k7 zCLap(WGKviyPz=N4TZUpwwRw=Q}pH_4=eZO@pPzgnEwQY`Hygz!|{0#6z1M=nEwXF z=1-v5{7pfArl1h$mP{zj*>HRw0EPK#ILzyyF#i<_^H4Z8FMwk6Hw5{Vwk`$G=X;?r zkA}m%9t!hkP?+=JFfW9{yaOY^W&3e3c>U!`@9B!*AXDS}))Sp~@`$?*cvU{mr>qqK>1k+_avr zOtAzog+NtlI4V=zkH5UOZ1|wZVBtz~0)wMV@7B@W+?;6X^78Js;mZzkBb}qyr;=&o zg^{Zt{!D0aSwuEZ2P;Bp9#QymM$XIo|AsFz@wiQ~J+p44nWJ2u)v}8L#}#bdLHFjj@#iLOO=zXmC{hc8)O_(3hv9T0q90 z*LPCC5$40guP#O(zA4CZXJyvoCOlP~NJ?jsD|9vPN15aB^2+y@5y#`pxUTJe1+|1b zjFL81yN-r4di31O>-S!6OSxo3E))#Zb=o&_n)!GEO8sh({|@XqSecM$FyL>HsO6k0 zOnXaBQJP-#n1svh8#C-tn#n9mxQfZI z>1!qkjm_Y121{f}8Fw!z! zcr9hb%6a=}2=F8hPlp7f!;~P(rM+Z<(4Y2_6$~R;wJ?%Jg^?^AjASuj*#C_H4g5tq zM;8M#hvS9S{l&MB2A4$#niL1aO5=sqHR;<&LxAT1g9ggZ94~BAIqXpW8K46;DH%9r zP)68z;pyCAC;!g?-6Ba{Es2T*C%7!l6z=i3${UTVyxDLT2&aM|_g^eb0Rma$@t~nQ zl97NXh`cF4K@o(79sU=K2Z6{N3-C15qWAX06oWftp z0V^jJEY)CFR{J>hcwu!b=dGi$NKwZDQ}`DPQw+tl$Kyf6ZmR%K21|<@OsHwRu)4qa z*3kf(lnTTUYR7N9u(~FF>u3N?ifko9ZHJ8)J`_2;QU7Ov4%nn^V3QtdQ*ONQhPA^v zD}M&)T!V^cyFlf{`bAV{2J%*SodS^kD9MsT>4Zmpg$gC#`_?^dEWK~ z6A$<3Nx2JaYqo{AGCEczSS09NyJ>X4nfj>@<<#|~UX}ZQsIo62n)N_xU)p8Glx9m=z8~$ z4m(e_wD6~#@jU9{?r_n0TAoD|C41#j$I6dRJ5LR?*rUIeT_6+65^W)BJS*rF>qPhH zuESW)Nuqo+Bi+#5<&o2xyg4T*hdtAc-8XeO*$2)^p?teCeP*T0Z_^`h<7;`kJq`Ma z@$T!UIRD*pfd%FG@nhlcA1-!&FK>YjhA9N$a!L(`Buv5>Z9A;H+DGd2AXfy05+@*gKAEn;O=zTX}RUx9Ljgc z)2FyQUv#p`oBI>xNOihirPFCA>%h5}Dc$RG3Hue8#&X!1$daLsx=nGKYdP;1%2&tJ zR=B$^cCyHu_k{9wb=q2YH)E&yf%AT)BwbItp_|oH_ogS}CSIIdD%MFw#}?zwwPlcJ z1w&Qn_^0|uwFXOqY3#FLiQkc-w4U>29DO@_vm|?$**dKeYmp@~Gwe9lUAj(MPkg*t z??74`;p+sH*8H2n(>2BQ$Fr^)%+Xp7`xEXoZOZ1&66sJ9wPj+uK}>uJ-~K)(QA_Fl z4<6fcF;`NK{vq;dLJb3HNpy9 z7%cC70Ly#t!}8vnoQ5OfGGGukLc=;Y6tc*53fYbtaQXutA z;%rzES`90tdtuc;1FWKXqZ7d-h~j~FaS9e#JSIl1WM;**vqmv}AmTI^-%wWMZI&Egu% znkB0ity;Xwa@CR>i*78wVbUEx5zTo|uC&=VF@Nb6t1VWZR_<0_R-agHweqm?zO?0% z=Oy<`UY9<(wDpq5CGU_eA)X=bAzmS$glrA5{f+0{izUh=-Q7ESpVuE^C|b-yailmt zhbU<&RIufIKJjv~g4#yn^XPQNP0qWr4Z$t=4~k@GqfQgB*Rxv-&3?;lWnr(gPBY|> z>0cHcR0a;+E$cub>kfF=ZQWZvD@OK?oq~muY*_biUq|Vw zl@6=Nhk4*f|5>FnKaQR9WLAS{RzvkDKkazdF<$uIVpgM1)?Gg4AU;ZuC3`3P$t<-O zD%m>a`YodsD(RJExLJ{g93I61Fg?g-Gw&Htl zvl_Q%-R;C2^p4V_g4$1J6_5Txxa#N!fQ+H?3FNywv+lzEM4LNPqK&zKcaF2LcV1x6 z%@UZO6;LuN(S{Z?VXp|b7=zey8?<)Rl0dqI{RZc!_97SHulb|?70!K zKQ|GC0}nSQEK5y{&z)m7S>n0@Gp|4EaQx@ZwkDEECDAVZ$I^J$o98d!pRX3TW@b-vfPgln6F)rDBUVPzLw#?G$iSLYsU zUl|u=T;h5@I`>%b%D7l#XSef(xyJ@p#w8e+xSbd0_L-`dUtl>HR<} z4J%cZSlc%5R*=Bg#_*CO+G~DEkRZUu@UkP-YkpmjV6Tng6-Tu9d~T3nzl|Z)k?K8P z5+oqn7+!TmZ{zpJTtCZlm{-&OUa+}e3OnC%eNDSXu(^K<`!BqviYSJc-yH5k+OrZiu!kkvRf8q>m3%&%0; zu61fQriG_`ex<^;)~Vf?7MVi1Qn91fsmqwQ|5rud2VGfhyHfRcOW$42-T9;V$_e&Q zalGv?kNgh{@XJ-QlAC*TSTvi zK6&J=;a;8ilruj`>y(o3;xT(_4xCAn`k3SMi63$F^B zm*vqiOOTpaS7K`Q%<|?-Pgo+eh2)*x%^#OJD1cWr)Y_QomnvSPt8tb}S9aNxICw z=LPX766VXR+U6|{5zf3(dCx0!*Aj?F0_lYhy*70zAVtTd`JAM@}SXFV*`Ub}X~8FYPWNbe5g3_2ahwn2N@%)zeI=#>M0b59kwx>ngb9cJ& zcDnuX*JVw@bqEdF?4oSJm0a-^&^o}}nHLwwi~HlR@n&e(j)-IbLB~U6ieqv-5&T}; zF^zwuyUC(Hntd&yI6ziTxRGkKhZ9>R>buxY;Qfa2z3~L_-!oB`c#j#nfzE$$`FdV% zVcx<$9o#(~&Y5v>nQ@gDve_512fvOc6tB2M(hKx(3-xgOt-7kdI(?N;uu4eTY){*4 z{|8@t)UOnZZj{*3_7p34yEz`JWz(Cjs#){aBnt~ZDtA{{r5AjPUDAB1nzeY%kHP{+ zpc}hX4I)OeB2yZ@PgCEXI@2QcnTyXsl&!raDu_|2h2rKdAiL4<;WIn%uc~{M_*^F2 zgx3HKPUZU$vwkDb9lar*@}`kwUn-WRY)ZY)QHnBf45CziSt+c~MUzRgp0+{*Gi-vA zTZpAQ_vTW`n3-e@!?Kc*AnO!!=t>Vdzqhp3O~r5F7aA}ILdgtTf`Y$e5<^BUq;fEd zEPWZesn!5XJ7Gpw3IbL47{!X4st`9-=P!g?nQbHmuSLeAE0y-ik4g&BjKdt9_##nK ztMX;2dQ?P-sJj$fJzo+Nifd^PDEo1_+kO?AC~NM<)~Dj=@l~lx6*W?IQzaJ`;jnV4 z=qHr`8%k36(w$>epM|FKN*YLCx^ccn^K(-<#FM;JG6ha0G|7-LO5HvoCBzF;aY`A# zmtWr&NB&jJ={{e-k^f<1f1me;Fvw`|g%MA~v}>zP&*>e}Qfs4bgxCd@$1Kuwx733Vc3;kKmHD^K^JP^j_= zDAZK&zvdrYxPM3ldKvQb_Z7Fz==({jgF@}sMWGBdYApoc#)P1wL&Jl2hlU0(i`f(M z`^s)V_$Kf{#XSp9sA(FNcY|+1<%r1G5dVl#tM*FbDnS(sK(Mh!)uZ}@RflL+?|oGI zmu3g!J!YU#b7$xPIMn}KoHRtj7rVm!Klg|X58R6%m6EmnArIWaSPuhA{;u8t3TuKw zeIDw!B|J1N0__(X?myZr{UamLga0ibYGtAxQg{mZn+SlzPX;ug{uk!`paK8@ From 86430573ae11e7e071646094e17ff55385d8c476 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 15:13:50 +0100 Subject: [PATCH 05/18] feat: power on password menu --- app/menu.c | 19 +++++++++++++++++++ ui/menu.c | 17 +++++++++++++++++ ui/menu.h | 1 + 3 files changed, 37 insertions(+) diff --git a/app/menu.c b/app/menu.c index 571a5d89..6cccc777 100644 --- a/app/menu.c +++ b/app/menu.c @@ -474,6 +474,11 @@ void MENU_AcceptSetting(void) gUpdateStatus = true; break; + case MENU_PASSWORD: + gEeprom.POWER_ON_PASSWORD = MIN(gSubMenuSelection, 9999); + gUpdateStatus = true; + break; + case MENU_W_N: gTxVfo->CHANNEL_BANDWIDTH = gSubMenuSelection; gRequestSaveChannel = 1; @@ -903,6 +908,10 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gEeprom.RX_OFFSET; break; + case MENU_PASSWORD: + gSubMenuSelection = gEeprom.POWER_ON_PASSWORD; + break; + case MENU_W_N: gSubMenuSelection = gTxVfo->CHANNEL_BANDWIDTH; break; @@ -1259,6 +1268,16 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gInputBoxIndex = 0; return; } + + if (UI_MENU_GetCurrentMenuId() == MENU_PASSWORD) + { + // get 4 digits + if (gInputBoxIndex < 4) { return; } + + uint32_t Password; + Password = StrToUL(INPUTBOX_GetAscii()); + gSubMenuSelection = Password; + } if (UI_MENU_GetCurrentMenuId() == MENU_MEM_CH || UI_MENU_GetCurrentMenuId() == MENU_DEL_CH || diff --git a/ui/menu.c b/ui/menu.c index 50efa649..b22cd4aa 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -109,6 +109,7 @@ const t_menu_item MenuList[] = #endif {"BatVol", VOICE_ID_INVALID, MENU_VOL }, // was "VOL" {"RxMode", VOICE_ID_DUAL_STANDBY, MENU_TDR }, + {"Passwd", VOICE_ID_DUAL_STANDBY, MENU_PASSWORD }, // power on password {"Sql", VOICE_ID_SQUELCH, MENU_SQL }, // hidden menu items from here on // enabled if pressing both the PTT and upper side button at power-on @@ -559,6 +560,22 @@ void UI_DisplayMenu(void) already_printed = true; break; + + case MENU_PASSWORD: + if (!gIsInSubMenu || gInputBoxIndex == 0) + { + sprintf(String, "%4d", gSubMenuSelection); + UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8); + } + else + { + const char * ascii = INPUTBOX_GetAscii(); + sprintf(String, "%.4s ",ascii); + UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8); + } + + already_printed = true; + break; case MENU_W_N: strcpy(String, bwNames[gSubMenuSelection]); diff --git a/ui/menu.h b/ui/menu.h index e0dc1cf5..47ef91e1 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -59,6 +59,7 @@ enum MENU_ABR_MIN, MENU_ABR_MAX, MENU_TDR, + MENU_PASSWORD, MENU_BEEP, #ifdef ENABLE_VOICE MENU_VOICE, From 175dbe99681fccd0689ab9b683458817762d3526 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 15:15:50 +0100 Subject: [PATCH 06/18] fix voice id --- ui/menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/menu.c b/ui/menu.c index b22cd4aa..d2299f78 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -109,7 +109,7 @@ const t_menu_item MenuList[] = #endif {"BatVol", VOICE_ID_INVALID, MENU_VOL }, // was "VOL" {"RxMode", VOICE_ID_DUAL_STANDBY, MENU_TDR }, - {"Passwd", VOICE_ID_DUAL_STANDBY, MENU_PASSWORD }, // power on password + {"Passwd", VOICE_ID_INVALID, MENU_PASSWORD }, // power on password {"Sql", VOICE_ID_SQUELCH, MENU_SQL }, // hidden menu items from here on // enabled if pressing both the PTT and upper side button at power-on From 545692b2f062ff0345d082d37d88dae68625eaa0 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 15:47:42 +0100 Subject: [PATCH 07/18] poweron password 4 digits. --- Makefile | 2 +- main.c | 2 +- ui/lock.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 3bb745d6..d5b86ce4 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ ENABLE_VOICE := 0 ENABLE_VOX := 1 ENABLE_ALARM := 0 ENABLE_TX1750 := 0 -ENABLE_PWRON_PASSWORD := 0 +ENABLE_PWRON_PASSWORD := 1 ENABLE_DTMF_CALLING := 0 #---- DEBUG ---- diff --git a/main.c b/main.c index 200d8c9b..c51d526a 100644 --- a/main.c +++ b/main.c @@ -174,7 +174,7 @@ void Main(void) } #ifdef ENABLE_PWRON_PASSWORD - if (gEeprom.POWER_ON_PASSWORD < 1000000) + if (gEeprom.POWER_ON_PASSWORD < 10000) { bIsInLockScreen = true; UI_DisplayLock(); diff --git a/ui/lock.c b/ui/lock.c index 08183d1d..cea5803b 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -32,14 +32,14 @@ static void Render(void) { unsigned int i; - char String[7]; + char String[5]; memset(gStatusLine, 0, sizeof(gStatusLine)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); strcpy(String, "LOCK"); UI_PrintString(String, 0, 127, 1, 10); - for (i = 0; i < 6; i++) + for (i = 0; i < 4; i++) String[i] = (gInputBox[i] == 10) ? '-' : '*'; String[6] = 0; UI_PrintString(String, 0, 127, 3, 12); @@ -93,7 +93,7 @@ void UI_DisplayLock(void) case KEY_9: INPUTBOX_Append(Key - KEY_0); - if (gInputBoxIndex < 6) // 6 frequency digits + if (gInputBoxIndex < 4) // 4 frequency digits { Beep = BEEP_1KHZ_60MS_OPTIONAL; } From aed640620f3c01f1c051f4cb00d0aa2aee02bde2 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 16:42:19 +0100 Subject: [PATCH 08/18] power on password on/off from menu. --- app/menu.c | 44 ++++++++++++++++++++++++++++---------------- main.c | 2 +- misc.h | 6 ++++++ ui/menu.c | 38 +++++++++++++++++++++++--------------- ui/menu.h | 2 ++ 5 files changed, 60 insertions(+), 32 deletions(-) diff --git a/app/menu.c b/app/menu.c index 6cccc777..42c34f9e 100644 --- a/app/menu.c +++ b/app/menu.c @@ -474,10 +474,12 @@ void MENU_AcceptSetting(void) gUpdateStatus = true; break; - case MENU_PASSWORD: - gEeprom.POWER_ON_PASSWORD = MIN(gSubMenuSelection, 9999); - gUpdateStatus = true; - break; + #ifdef ENABLE_PWRON_PASSWORD + case MENU_PASSWORD: + gEeprom.POWER_ON_PASSWORD = MIN(gSubMenuSelection, PASSWORD_OFF); + gUpdateStatus = true; + break; + #endif case MENU_W_N: gTxVfo->CHANNEL_BANDWIDTH = gSubMenuSelection; @@ -908,9 +910,11 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gEeprom.RX_OFFSET; break; - case MENU_PASSWORD: - gSubMenuSelection = gEeprom.POWER_ON_PASSWORD; - break; + #ifdef ENABLE_PWRON_PASSWORD + case MENU_PASSWORD: + gSubMenuSelection = gEeprom.POWER_ON_PASSWORD; + break; + #endif case MENU_W_N: gSubMenuSelection = gTxVfo->CHANNEL_BANDWIDTH; @@ -1268,16 +1272,17 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gInputBoxIndex = 0; return; } + #ifdef ENABLE_PWRON_PASSWORD + if (UI_MENU_GetCurrentMenuId() == MENU_PASSWORD) + { + // get 4 digits + if (gInputBoxIndex < 4) { return; } - if (UI_MENU_GetCurrentMenuId() == MENU_PASSWORD) - { - // get 4 digits - if (gInputBoxIndex < 4) { return; } - - uint32_t Password; - Password = StrToUL(INPUTBOX_GetAscii()); - gSubMenuSelection = Password; - } + uint32_t Password; + Password = StrToUL(INPUTBOX_GetAscii()); + gSubMenuSelection = Password; + } + #endif if (UI_MENU_GetCurrentMenuId() == MENU_MEM_CH || UI_MENU_GetCurrentMenuId() == MENU_DEL_CH || @@ -1670,6 +1675,13 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) gRequestDisplayScreen = DISPLAY_MENU; return; } + #ifdef ENABLE_PWRON_PASSWORD + if (UI_MENU_GetCurrentMenuId() == MENU_PASSWORD) + { + gSubMenuSelection = PASSWORD_OFF; + gRequestDisplayScreen = DISPLAY_MENU; + } + #endif VFO = 0; diff --git a/main.c b/main.c index c51d526a..d4d4d261 100644 --- a/main.c +++ b/main.c @@ -174,7 +174,7 @@ void Main(void) } #ifdef ENABLE_PWRON_PASSWORD - if (gEeprom.POWER_ON_PASSWORD < 10000) + if (gEeprom.POWER_ON_PASSWORD < PASSWORD_OFF) { bIsInLockScreen = true; UI_DisplayLock(); diff --git a/misc.h b/misc.h index 08a901e2..e053833e 100644 --- a/misc.h +++ b/misc.h @@ -51,6 +51,12 @@ enum { LAST_CHANNEL }; +#ifdef ENABLE_PWRON_PASSWORD +enum { + PASSWORD_OFF = 10000u +}; +#endif + enum { FLASHLIGHT_OFF = 0, FLASHLIGHT_ON, diff --git a/ui/menu.c b/ui/menu.c index d2299f78..0a265637 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -109,7 +109,9 @@ const t_menu_item MenuList[] = #endif {"BatVol", VOICE_ID_INVALID, MENU_VOL }, // was "VOL" {"RxMode", VOICE_ID_DUAL_STANDBY, MENU_TDR }, +#ifdef ENABLE_PWRON_PASSWORD {"Passwd", VOICE_ID_INVALID, MENU_PASSWORD }, // power on password +#endif {"Sql", VOICE_ID_SQUELCH, MENU_SQL }, // hidden menu items from here on // enabled if pressing both the PTT and upper side button at power-on @@ -560,22 +562,28 @@ void UI_DisplayMenu(void) already_printed = true; break; - - case MENU_PASSWORD: - if (!gIsInSubMenu || gInputBoxIndex == 0) - { - sprintf(String, "%4d", gSubMenuSelection); - UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8); - } - else - { - const char * ascii = INPUTBOX_GetAscii(); - sprintf(String, "%.4s ",ascii); + #ifdef ENABLE_PWRON_PASSWORD + case MENU_PASSWORD: + if (!gIsInSubMenu || gInputBoxIndex == 0) + { + if(gSubMenuSelection >= PASSWORD_OFF) + { + sprintf(String, "OFF"); + } + else + { + sprintf(String, "****"); + } + } + else + { + const char * ascii = INPUTBOX_GetAscii(); + sprintf(String, "%.4s ",ascii); + } UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8); - } - - already_printed = true; - break; + already_printed = true; + break; + #endif case MENU_W_N: strcpy(String, bwNames[gSubMenuSelection]); diff --git a/ui/menu.h b/ui/menu.h index 47ef91e1..ff133874 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -59,7 +59,9 @@ enum MENU_ABR_MIN, MENU_ABR_MAX, MENU_TDR, +#ifdef ENABLE_PWRON_PASSWORD MENU_PASSWORD, +#endif MENU_BEEP, #ifdef ENABLE_VOICE MENU_VOICE, From 1227460f952de4a126705bddcc36eb51ddb91ea4 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 16:58:16 +0100 Subject: [PATCH 09/18] UART disabled in locked state. --- app/uart.c | 35 +++++++++++++---------------------- board.c | 12 ------------ main.c | 1 + misc.c | 3 +-- misc.h | 3 +-- ui/lock.c | 8 +------- 6 files changed, 17 insertions(+), 45 deletions(-) diff --git a/app/uart.c b/app/uart.c index 60cf0b66..c1aa6eaa 100644 --- a/app/uart.c +++ b/app/uart.c @@ -191,7 +191,7 @@ static void SendVersion(void) Reply.Header.ID = 0x0515; Reply.Header.Size = sizeof(Reply.Data); strcpy(Reply.Data.Version, Version); - Reply.Data.bHasCustomAesKey = bHasCustomAesKey; + Reply.Data.bHasCustomAesKey = false; Reply.Data.bIsInLockScreen = bIsInLockScreen; Reply.Data.Challenge[0] = gChallenge[0]; Reply.Data.Challenge[1] = gChallenge[1]; @@ -223,7 +223,6 @@ static void CMD_051B(const uint8_t *pBuffer) { const CMD_051B_t *pCmd = (const CMD_051B_t *)pBuffer; REPLY_051B_t Reply; - bool bLocked = false; if (pCmd->Timestamp != Timestamp) return; @@ -240,11 +239,8 @@ static void CMD_051B(const uint8_t *pBuffer) Reply.Data.Offset = pCmd->Offset; Reply.Data.Size = pCmd->Size; - if (bHasCustomAesKey) - bLocked = gIsLocked; - if (!bLocked) - EEPROM_ReadBuffer(pCmd->Offset, Reply.Data.Data, pCmd->Size); + EEPROM_ReadBuffer(pCmd->Offset, Reply.Data.Data, pCmd->Size); SendReply(&Reply, pCmd->Size + 8); } @@ -254,7 +250,6 @@ static void CMD_051D(const uint8_t *pBuffer) const CMD_051D_t *pCmd = (const CMD_051D_t *)pBuffer; REPLY_051D_t Reply; bool bReloadEeprom; - bool bIsLocked; if (pCmd->Timestamp != Timestamp) return; @@ -271,27 +266,23 @@ static void CMD_051D(const uint8_t *pBuffer) Reply.Header.Size = sizeof(Reply.Data); Reply.Data.Offset = pCmd->Offset; - bIsLocked = bHasCustomAesKey ? gIsLocked : bHasCustomAesKey; - if (!bIsLocked) + unsigned int i; + for (i = 0; i < (pCmd->Size / 8); i++) { - unsigned int i; - for (i = 0; i < (pCmd->Size / 8); i++) - { - const uint16_t Offset = pCmd->Offset + (i * 8U); - - if (Offset >= 0x0F30 && Offset < 0x0F40) - if (!gIsLocked) - bReloadEeprom = true; + const uint16_t Offset = pCmd->Offset + (i * 8U); - if ((Offset < 0x0E98 || Offset >= 0x0EA0) || !bIsInLockScreen || pCmd->bAllowPassword) - EEPROM_WriteBuffer(Offset, &pCmd->Data[i * 8U], true); - } + if (Offset >= 0x0F30 && Offset < 0x0F40) + bReloadEeprom = true; - if (bReloadEeprom) - BOARD_EEPROM_Init(); + if ((Offset < 0x0E98 || Offset >= 0x0EA0) || !bIsInLockScreen || pCmd->bAllowPassword) + EEPROM_WriteBuffer(Offset, &pCmd->Data[i * 8U], true); } + if (bReloadEeprom) + BOARD_EEPROM_Init(); + + SendReply(&Reply, sizeof(Reply)); } diff --git a/board.c b/board.c index af965cdb..c2863040 100644 --- a/board.c +++ b/board.c @@ -722,18 +722,6 @@ void BOARD_EEPROM_Init(void) } } - // 0F30..0F3F - EEPROM_ReadBuffer(0x0F30, gCustomAesKey, sizeof(gCustomAesKey)); - bHasCustomAesKey = false; - for (i = 0; i < ARRAY_SIZE(gCustomAesKey); i++) - { - if (gCustomAesKey[i] != 0xFFFFFFFFu) - { - bHasCustomAesKey = true; - return; - } - } - #ifdef ENABLE_SPECTRUM_SHOW_CHANNEL_NAME BOARD_gMR_LoadChannels(); #endif diff --git a/main.c b/main.c index d4d4d261..97f77799 100644 --- a/main.c +++ b/main.c @@ -177,6 +177,7 @@ void Main(void) if (gEeprom.POWER_ON_PASSWORD < PASSWORD_OFF) { bIsInLockScreen = true; + gIsLocked = true; UI_DisplayLock(); bIsInLockScreen = false; } diff --git a/misc.c b/misc.c index 37c3d94b..5c94f6a6 100644 --- a/misc.c +++ b/misc.c @@ -97,7 +97,6 @@ uint8_t gSetting_battery_text; bool gMonitor = false; // true opens the squelch uint32_t gCustomAesKey[4]; -bool bHasCustomAesKey; uint32_t gChallenge[4]; uint8_t gTryCount; @@ -249,7 +248,7 @@ volatile uint8_t boot_counter_10ms; int16_t gCurrentRSSI[2] = {0, 0}; // now one per VFO -uint8_t gIsLocked = 0xFF; +bool gIsLocked = false; diff --git a/misc.h b/misc.h index e053833e..157934e3 100644 --- a/misc.h +++ b/misc.h @@ -172,7 +172,6 @@ extern bool gMonitor; extern const uint32_t gDefaultAesKey[4]; extern uint32_t gCustomAesKey[4]; -extern bool bHasCustomAesKey; extern uint32_t gChallenge[4]; extern uint8_t gTryCount; @@ -353,7 +352,7 @@ extern volatile uint8_t gVFOStateResumeCountdown_500ms; extern volatile bool gScheduleFM; #endif extern int16_t gCurrentRSSI[2]; // now one per VFO -extern uint8_t gIsLocked; +extern bool gIsLocked; extern volatile uint8_t boot_counter_10ms; int32_t NUMBER_AddWithWraparound(int32_t Base, int32_t Add, int32_t LowerLimit, int32_t UpperLimit); diff --git a/ui/lock.c b/ui/lock.c index cea5803b..dbf48489 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -107,6 +107,7 @@ void UI_DisplayLock(void) if ((gEeprom.POWER_ON_PASSWORD) == Password) { AUDIO_PlayBeep(BEEP_1KHZ_60MS_OPTIONAL); + gIsLocked = false; return; } @@ -143,13 +144,6 @@ void UI_DisplayLock(void) gKeyReading0 = Key; } - if (UART_IsCommandAvailable()) - { - __disable_irq(); - UART_HandleCommand(); - __enable_irq(); - } - if (gUpdateDisplay) { Render(); From a8259c05ec342b6ed0ca6ca3c6d3c43993a54e9e Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 17:18:59 +0100 Subject: [PATCH 10/18] update factory reset --- board.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/board.c b/board.c index c2863040..1c72f1ba 100644 --- a/board.c +++ b/board.c @@ -856,6 +856,8 @@ void BOARD_FactoryReset(bool bIsAll) { RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, 43350000); gEeprom.RX_OFFSET = 0; + gEeprom.POWER_ON_PASSWORD = PASSWORD_OFF; + SETTINGS_SaveSettings(); // set the first few memory channels for (i = 0; i < ARRAY_SIZE(gDefaultFrequencyTable); i++) { From 3bce162b0de66e35ac438d6779f7bfe509d2cc9e Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 17:41:25 +0100 Subject: [PATCH 11/18] password wrong attempts stored in eeprom --- board.c | 10 ++++++++-- docs/UV K5 EEPROM.xlsx | Bin 68390 -> 68468 bytes misc.h | 1 + settings.c | 3 ++- settings.h | 3 +++ ui/lock.c | 14 +++++++++++++- 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/board.c b/board.c index 1c72f1ba..5b745756 100644 --- a/board.c +++ b/board.c @@ -579,8 +579,10 @@ void BOARD_EEPROM_Init(void) gEeprom.POWER_ON_DISPLAY_MODE = (Data[7] < 4) ? Data[7] : POWER_ON_DISPLAY_MODE_VOLTAGE; // 0E98..0E9F - EEPROM_ReadBuffer(0x0E98, Data, 8); - memmove(&gEeprom.POWER_ON_PASSWORD, Data, 4); + #ifdef ENABLE_PWRON_PASSWORD + EEPROM_ReadBuffer(0x0E98, Data, 8); + memmove(&gEeprom.POWER_ON_PASSWORD, Data, 4); + #endif // 0EA0..0EA7 EEPROM_ReadBuffer(0x0EA0, Data, 8); @@ -588,6 +590,9 @@ void BOARD_EEPROM_Init(void) gEeprom.VOX_DELAY = (Data[0] < 11) ? Data[0] : 4; #endif gEeprom.RX_AGC = (Data[1] < RX_AGC_LEN) ? Data[1] : RX_AGC_SLOW; + #ifdef ENABLE_PWRON_PASSWORD + gEeprom.PASSWORD_WRONG_ATTEMPTS = (Data[2] > PASSWORD_MAX_RETRIES) ? PASSWORD_MAX_RETRIES : Data[2]; + #endif // 0EA8..0EAF EEPROM_ReadBuffer(0x0EA8, Data, 8); @@ -857,6 +862,7 @@ void BOARD_FactoryReset(bool bIsAll) RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_FIRST + BAND6_400MHz, 43350000); gEeprom.RX_OFFSET = 0; gEeprom.POWER_ON_PASSWORD = PASSWORD_OFF; + gEeprom.PASSWORD_WRONG_ATTEMPTS = 0; SETTINGS_SaveSettings(); // set the first few memory channels for (i = 0; i < ARRAY_SIZE(gDefaultFrequencyTable); i++) diff --git a/docs/UV K5 EEPROM.xlsx b/docs/UV K5 EEPROM.xlsx index 2644d951a8fb3dc12808a1b8b320b4aca8979309..3165d61b1de96b347866b4b2bce33c007248d58c 100644 GIT binary patch literal 68468 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 diff --git a/misc.h b/misc.h index 157934e3..3bf239ec 100644 --- a/misc.h +++ b/misc.h @@ -55,6 +55,7 @@ enum { enum { PASSWORD_OFF = 10000u }; +#define PASSWORD_MAX_RETRIES 3 #endif enum { diff --git a/settings.c b/settings.c index 92c0c4fc..f0211317 100644 --- a/settings.c +++ b/settings.c @@ -98,7 +98,7 @@ void SETTINGS_SaveSettings(void) EEPROM_ReadBuffer(0x0E98, State, 8); #ifdef ENABLE_PWRON_PASSWORD memcpy(&State[0], &gEeprom.POWER_ON_PASSWORD, 4); - #endif + #endif memcpy(&State[4], &gEeprom.RX_OFFSET, 4); EEPROM_WriteBuffer(0x0E98, State, true); @@ -107,6 +107,7 @@ void SETTINGS_SaveSettings(void) State[0] = gEeprom.VOX_DELAY; #endif State[1] = gEeprom.RX_AGC; + State[2] = gEeprom.PASSWORD_WRONG_ATTEMPTS; EEPROM_WriteBuffer(0x0EA0, State, true); memset(State, 0xFF, sizeof(State)); diff --git a/settings.h b/settings.h index 2664bd4d..d52c601e 100644 --- a/settings.h +++ b/settings.h @@ -243,7 +243,10 @@ typedef struct { uint8_t DAC_GAIN; VFO_Info_t VfoInfo[2]; +#ifdef ENABLE_PWRON_PASSWORD uint32_t POWER_ON_PASSWORD; + uint8_t PASSWORD_WRONG_ATTEMPTS; +#endif uint16_t VOX1_THRESHOLD; uint16_t VOX0_THRESHOLD; diff --git a/ui/lock.c b/ui/lock.c index dbf48489..2e035716 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -28,6 +28,7 @@ #include "ui/helper.h" #include "ui/inputbox.h" #include "ui/lock.h" +#include "board.h" static void Render(void) { @@ -66,7 +67,11 @@ void UI_DisplayLock(void) gNextTimeslice = false; Key = KEYBOARD_Poll(); - + if (gEeprom.PASSWORD_WRONG_ATTEMPTS >= PASSWORD_MAX_RETRIES) + { + BOARD_FactoryReset(true); + return; + } if (gKeyReading0 == Key) { if (++gDebounceCounter == key_debounce_10ms) @@ -108,8 +113,15 @@ void UI_DisplayLock(void) { AUDIO_PlayBeep(BEEP_1KHZ_60MS_OPTIONAL); gIsLocked = false; + gEeprom.PASSWORD_WRONG_ATTEMPTS = 0; return; } + else + { + gEeprom.PASSWORD_WRONG_ATTEMPTS++; + } + + SETTINGS_SaveSettings(); memset(gInputBox, 10, sizeof(gInputBox)); From a40072069f5613e94bdc4686224d9186970ad042 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 18:39:07 +0100 Subject: [PATCH 12/18] Revert "UART disabled in locked state." This reverts commit 1227460f952de4a126705bddcc36eb51ddb91ea4. --- app/uart.c | 35 ++++++++++++++++++++++------------- board.c | 12 ++++++++++++ main.c | 1 - misc.c | 3 ++- misc.h | 3 ++- ui/lock.c | 8 +++++++- 6 files changed, 45 insertions(+), 17 deletions(-) diff --git a/app/uart.c b/app/uart.c index c1aa6eaa..60cf0b66 100644 --- a/app/uart.c +++ b/app/uart.c @@ -191,7 +191,7 @@ static void SendVersion(void) Reply.Header.ID = 0x0515; Reply.Header.Size = sizeof(Reply.Data); strcpy(Reply.Data.Version, Version); - Reply.Data.bHasCustomAesKey = false; + Reply.Data.bHasCustomAesKey = bHasCustomAesKey; Reply.Data.bIsInLockScreen = bIsInLockScreen; Reply.Data.Challenge[0] = gChallenge[0]; Reply.Data.Challenge[1] = gChallenge[1]; @@ -223,6 +223,7 @@ static void CMD_051B(const uint8_t *pBuffer) { const CMD_051B_t *pCmd = (const CMD_051B_t *)pBuffer; REPLY_051B_t Reply; + bool bLocked = false; if (pCmd->Timestamp != Timestamp) return; @@ -239,8 +240,11 @@ static void CMD_051B(const uint8_t *pBuffer) Reply.Data.Offset = pCmd->Offset; Reply.Data.Size = pCmd->Size; + if (bHasCustomAesKey) + bLocked = gIsLocked; - EEPROM_ReadBuffer(pCmd->Offset, Reply.Data.Data, pCmd->Size); + if (!bLocked) + EEPROM_ReadBuffer(pCmd->Offset, Reply.Data.Data, pCmd->Size); SendReply(&Reply, pCmd->Size + 8); } @@ -250,6 +254,7 @@ static void CMD_051D(const uint8_t *pBuffer) const CMD_051D_t *pCmd = (const CMD_051D_t *)pBuffer; REPLY_051D_t Reply; bool bReloadEeprom; + bool bIsLocked; if (pCmd->Timestamp != Timestamp) return; @@ -266,22 +271,26 @@ static void CMD_051D(const uint8_t *pBuffer) Reply.Header.Size = sizeof(Reply.Data); Reply.Data.Offset = pCmd->Offset; + bIsLocked = bHasCustomAesKey ? gIsLocked : bHasCustomAesKey; - unsigned int i; - for (i = 0; i < (pCmd->Size / 8); i++) + if (!bIsLocked) { - const uint16_t Offset = pCmd->Offset + (i * 8U); + unsigned int i; + for (i = 0; i < (pCmd->Size / 8); i++) + { + const uint16_t Offset = pCmd->Offset + (i * 8U); - if (Offset >= 0x0F30 && Offset < 0x0F40) - bReloadEeprom = true; + if (Offset >= 0x0F30 && Offset < 0x0F40) + if (!gIsLocked) + bReloadEeprom = true; - if ((Offset < 0x0E98 || Offset >= 0x0EA0) || !bIsInLockScreen || pCmd->bAllowPassword) - EEPROM_WriteBuffer(Offset, &pCmd->Data[i * 8U], true); - } + if ((Offset < 0x0E98 || Offset >= 0x0EA0) || !bIsInLockScreen || pCmd->bAllowPassword) + EEPROM_WriteBuffer(Offset, &pCmd->Data[i * 8U], true); + } - if (bReloadEeprom) - BOARD_EEPROM_Init(); - + if (bReloadEeprom) + BOARD_EEPROM_Init(); + } SendReply(&Reply, sizeof(Reply)); } diff --git a/board.c b/board.c index 5b745756..29e26fd6 100644 --- a/board.c +++ b/board.c @@ -727,6 +727,18 @@ void BOARD_EEPROM_Init(void) } } + // 0F30..0F3F + EEPROM_ReadBuffer(0x0F30, gCustomAesKey, sizeof(gCustomAesKey)); + bHasCustomAesKey = false; + for (i = 0; i < ARRAY_SIZE(gCustomAesKey); i++) + { + if (gCustomAesKey[i] != 0xFFFFFFFFu) + { + bHasCustomAesKey = true; + return; + } + } + #ifdef ENABLE_SPECTRUM_SHOW_CHANNEL_NAME BOARD_gMR_LoadChannels(); #endif diff --git a/main.c b/main.c index 97f77799..d4d4d261 100644 --- a/main.c +++ b/main.c @@ -177,7 +177,6 @@ void Main(void) if (gEeprom.POWER_ON_PASSWORD < PASSWORD_OFF) { bIsInLockScreen = true; - gIsLocked = true; UI_DisplayLock(); bIsInLockScreen = false; } diff --git a/misc.c b/misc.c index 5c94f6a6..37c3d94b 100644 --- a/misc.c +++ b/misc.c @@ -97,6 +97,7 @@ uint8_t gSetting_battery_text; bool gMonitor = false; // true opens the squelch uint32_t gCustomAesKey[4]; +bool bHasCustomAesKey; uint32_t gChallenge[4]; uint8_t gTryCount; @@ -248,7 +249,7 @@ volatile uint8_t boot_counter_10ms; int16_t gCurrentRSSI[2] = {0, 0}; // now one per VFO -bool gIsLocked = false; +uint8_t gIsLocked = 0xFF; diff --git a/misc.h b/misc.h index 3bf239ec..30a89bd4 100644 --- a/misc.h +++ b/misc.h @@ -173,6 +173,7 @@ extern bool gMonitor; extern const uint32_t gDefaultAesKey[4]; extern uint32_t gCustomAesKey[4]; +extern bool bHasCustomAesKey; extern uint32_t gChallenge[4]; extern uint8_t gTryCount; @@ -353,7 +354,7 @@ extern volatile uint8_t gVFOStateResumeCountdown_500ms; extern volatile bool gScheduleFM; #endif extern int16_t gCurrentRSSI[2]; // now one per VFO -extern bool gIsLocked; +extern uint8_t gIsLocked; extern volatile uint8_t boot_counter_10ms; int32_t NUMBER_AddWithWraparound(int32_t Base, int32_t Add, int32_t LowerLimit, int32_t UpperLimit); diff --git a/ui/lock.c b/ui/lock.c index 2e035716..8af64d3a 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -112,7 +112,6 @@ void UI_DisplayLock(void) if ((gEeprom.POWER_ON_PASSWORD) == Password) { AUDIO_PlayBeep(BEEP_1KHZ_60MS_OPTIONAL); - gIsLocked = false; gEeprom.PASSWORD_WRONG_ATTEMPTS = 0; return; } @@ -156,6 +155,13 @@ void UI_DisplayLock(void) gKeyReading0 = Key; } + if (UART_IsCommandAvailable()) + { + __disable_irq(); + UART_HandleCommand(); + __enable_irq(); + } + if (gUpdateDisplay) { Render(); From ab91c1d36b6fd26a6c3d3352fc08701fe7734e51 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 18:49:17 +0100 Subject: [PATCH 13/18] reset wrong passwords attempts on each boot. disable uart in lock screen. --- main.c | 2 ++ ui/lock.c | 7 ------- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/main.c b/main.c index d4d4d261..b457441c 100644 --- a/main.c +++ b/main.c @@ -179,6 +179,8 @@ void Main(void) bIsInLockScreen = true; UI_DisplayLock(); bIsInLockScreen = false; + gEeprom.PASSWORD_WRONG_ATTEMPTS = 0; + gFlagSaveSettings = true; } #endif diff --git a/ui/lock.c b/ui/lock.c index 8af64d3a..e3fb1ea2 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -155,13 +155,6 @@ void UI_DisplayLock(void) gKeyReading0 = Key; } - if (UART_IsCommandAvailable()) - { - __disable_irq(); - UART_HandleCommand(); - __enable_irq(); - } - if (gUpdateDisplay) { Render(); From 15428a29e278b790c871ffd3ced0e22d231e4f19 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 19:56:56 +0100 Subject: [PATCH 14/18] fix bug last key passed to main app --- ui/lock.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ui/lock.c b/ui/lock.c index e3fb1ea2..b434297b 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -52,6 +52,7 @@ static void Render(void) void UI_DisplayLock(void) { KEY_Code_t Key; + KEY_Code_t gKeyReadingLocal; BEEP_Type_t Beep; gUpdateDisplay = true; @@ -72,7 +73,7 @@ void UI_DisplayLock(void) BOARD_FactoryReset(true); return; } - if (gKeyReading0 == Key) + if (gKeyReadingLocal == Key) { if (++gDebounceCounter == key_debounce_10ms) { @@ -152,7 +153,7 @@ void UI_DisplayLock(void) else { gDebounceCounter = 0; - gKeyReading0 = Key; + gKeyReadingLocal = Key; } if (gUpdateDisplay) From e9bb31e5cfe3366037dff01cf6a397525f684b92 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 20:11:06 +0100 Subject: [PATCH 15/18] always reset wrong attempts on boot. --- main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index b457441c..4364990f 100644 --- a/main.c +++ b/main.c @@ -179,9 +179,9 @@ void Main(void) bIsInLockScreen = true; UI_DisplayLock(); bIsInLockScreen = false; - gEeprom.PASSWORD_WRONG_ATTEMPTS = 0; - gFlagSaveSettings = true; } + gEeprom.PASSWORD_WRONG_ATTEMPTS = 0; + gFlagSaveSettings = true; #endif BOOT_ProcessMode(BootMode); From 7ca63dea3c576569edba1cdf9aa872af53819956 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 20:31:07 +0100 Subject: [PATCH 16/18] reboot after factory reset --- board.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/board.c b/board.c index 29e26fd6..cc470e66 100644 --- a/board.c +++ b/board.c @@ -45,6 +45,7 @@ #include "sram-overlay.h" #endif #include "ui/menu.h" +#include "ARMCM0.h" static const uint32_t gDefaultFrequencyTable[] = { @@ -885,5 +886,7 @@ void BOARD_FactoryReset(bool bIsAll) gRxVfo->Band = FREQUENCY_GetBand(Frequency); SETTINGS_SaveChannel(MR_CHANNEL_FIRST + i, 0, gRxVfo, 2); } + // reboot device + NVIC_SystemReset(); } } From 6e8169cad2ddc94320c9075a3f9c249c45a8135a Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 20:50:35 +0100 Subject: [PATCH 17/18] properly display password off. --- ui/menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/menu.c b/ui/menu.c index 0a265637..4a930606 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -566,7 +566,7 @@ void UI_DisplayMenu(void) case MENU_PASSWORD: if (!gIsInSubMenu || gInputBoxIndex == 0) { - if(gSubMenuSelection >= PASSWORD_OFF) + if((unsigned int)gSubMenuSelection >= PASSWORD_OFF) { sprintf(String, "OFF"); } From 8719df9071613a2682cf9b07db23ee6fbbb35cd5 Mon Sep 17 00:00:00 2001 From: Nunu Date: Sat, 13 Jan 2024 21:19:42 +0100 Subject: [PATCH 18/18] show "OK" message as we erase eeprom. --- ui/lock.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/ui/lock.c b/ui/lock.c index b434297b..92503883 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -30,21 +30,26 @@ #include "ui/lock.h" #include "board.h" -static void Render(void) +static void Render(bool maxAttemptsReached) { unsigned int i; char String[5]; memset(gStatusLine, 0, sizeof(gStatusLine)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); - - strcpy(String, "LOCK"); - UI_PrintString(String, 0, 127, 1, 10); - for (i = 0; i < 4; i++) - String[i] = (gInputBox[i] == 10) ? '-' : '*'; - String[6] = 0; - UI_PrintString(String, 0, 127, 3, 12); - + if (maxAttemptsReached){ + strcpy(String, "OK"); + UI_PrintString(String, 0, 127, 2, 10); + } + else + { + strcpy(String, "LOCK"); + UI_PrintString(String, 0, 127, 1, 10); + for (i = 0; i < 4; i++) + String[i] = (gInputBox[i] == 10) ? '-' : '*'; + String[6] = 0; + UI_PrintString(String, 0, 127, 3, 12); + } ST7565_BlitStatusLine(); ST7565_BlitFullScreen(); } @@ -69,7 +74,8 @@ void UI_DisplayLock(void) Key = KEYBOARD_Poll(); if (gEeprom.PASSWORD_WRONG_ATTEMPTS >= PASSWORD_MAX_RETRIES) - { + { + Render(true); BOARD_FactoryReset(true); return; } @@ -158,7 +164,7 @@ void UI_DisplayLock(void) if (gUpdateDisplay) { - Render(); + Render(false); gUpdateDisplay = false; } }