From 16434c8d14efcd2768bab5e409b4212c74af8167 Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Sun, 10 Sep 2023 13:52:41 +0100 Subject: [PATCH] clean up --- app/app.c | 5 +- driver/keyboard.c | 70 +++-- driver/keyboard.h | 44 +-- firmware | Bin 172692 -> 172692 bytes firmware.bin | Bin 57016 -> 56804 bytes firmware.packed.bin | Bin 57034 -> 56822 bytes font.c | 637 ++++++++++++++++++++++---------------------- font.h | 10 +- radio.c | 71 ++--- radio.h | 10 +- ui/helper.c | 35 ++- ui/lock.c | 1 + ui/main.c | 244 ++++++++--------- 13 files changed, 567 insertions(+), 560 deletions(-) diff --git a/app/app.c b/app/app.c index 8453ff5..cdb2e88 100644 --- a/app/app.c +++ b/app/app.c @@ -1661,9 +1661,8 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gUpdateStatus = true; } - if (gF_LOCK) - if (Key == KEY_PTT || Key == KEY_SIDE2 || Key == KEY_SIDE1) - return; + if (gF_LOCK && (Key == KEY_PTT || Key == KEY_SIDE2 || Key == KEY_SIDE1)) + return; if (!bFlag) { diff --git a/driver/keyboard.c b/driver/keyboard.c index cc19af6..ffc3422 100644 --- a/driver/keyboard.c +++ b/driver/keyboard.c @@ -37,33 +37,45 @@ KEY_Code_t KEYBOARD_Poll(void) SYSTICK_DelayUs(1); // Keys connected to gnd - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) + { Key = KEY_SIDE1; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) + { Key = KEY_SIDE2; goto Bye; } + // Original doesn't do PTT // First row GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4); SYSTICK_DelayUs(1); - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) { + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) + { Key = KEY_MENU; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) + { Key = KEY_1; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2)) + { Key = KEY_4; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3)) + { Key = KEY_7; goto Bye; } @@ -75,19 +87,26 @@ KEY_Code_t KEYBOARD_Poll(void) GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_4); SYSTICK_DelayUs(1); - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) { + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) + { Key = KEY_UP; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) + { Key = KEY_2; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2)) + { Key = KEY_5; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3)) + { Key = KEY_8; goto Bye; } @@ -105,19 +124,26 @@ KEY_Code_t KEYBOARD_Poll(void) GPIO_ClearBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6); SYSTICK_DelayUs(1); - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) { + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) + { Key = KEY_DOWN; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) + { Key = KEY_3; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2)) + { Key = KEY_6; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3)) + { Key = KEY_9; goto Bye; } @@ -129,19 +155,26 @@ KEY_Code_t KEYBOARD_Poll(void) GPIO_SetBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_6); SYSTICK_DelayUs(1); - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) { + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_0)) + { Key = KEY_EXIT; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_1)) + { Key = KEY_STAR; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_2)) + { Key = KEY_0; goto Bye; } - if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3)) { + + if (!GPIO_CheckBit(&GPIOA->DATA, GPIOA_PIN_KEYBOARD_3)) + { Key = KEY_F; goto Bye; } @@ -154,4 +187,3 @@ Bye: return Key; } - diff --git a/driver/keyboard.h b/driver/keyboard.h index dba318d..36a5d3c 100644 --- a/driver/keyboard.h +++ b/driver/keyboard.h @@ -22,34 +22,34 @@ #include enum KEY_Code_t { - KEY_0 = 0, - KEY_1 = 1, - KEY_2 = 2, - KEY_3 = 3, - KEY_4 = 4, - KEY_5 = 5, - KEY_6 = 6, - KEY_7 = 7, - KEY_8 = 8, - KEY_9 = 9, - KEY_MENU = 10, - KEY_UP = 11, - KEY_DOWN = 12, - KEY_EXIT = 13, - KEY_STAR = 14, - KEY_F = 15, - KEY_PTT = 21, - KEY_SIDE2 = 22, - KEY_SIDE1 = 23, - KEY_INVALID = 255, + KEY_0 = 0, + KEY_1 = 1, + KEY_2 = 2, + KEY_3 = 3, + KEY_4 = 4, + KEY_5 = 5, + KEY_6 = 6, + KEY_7 = 7, + KEY_8 = 8, + KEY_9 = 9, + KEY_MENU = 10, + KEY_UP = 11, + KEY_DOWN = 12, + KEY_EXIT = 13, + KEY_STAR = 14, + KEY_F = 15, + KEY_PTT = 21, + KEY_SIDE2 = 22, + KEY_SIDE1 = 23, + KEY_INVALID = 255 }; typedef enum KEY_Code_t KEY_Code_t; extern KEY_Code_t gKeyReading0; extern KEY_Code_t gKeyReading1; -extern uint16_t gDebounceCounter; -extern bool gWasFKeyPressed; +extern uint16_t gDebounceCounter; +extern bool gWasFKeyPressed; KEY_Code_t KEYBOARD_Poll(void); diff --git a/firmware b/firmware index b7e296f92e14bc9ae64d68060c75613cf559945f..6f715c1d2b8a0b537017c821ec1fbca0a0ca86e8 100644 GIT binary patch delta 13474 zcmbPolxxaSt_d!7M{Y4NfG{fq2rx1*f+z+i5UBtXS72sfc)`QKzzz~&fXIXRFL)Rf zp4{EowCg|P$EmiA_n9vK+%Ct+IEj<7V*5re#_ya=M{aFjCBpcQk&$!zOfg1vHl>3n z7#RNlfB*j|gs$Ilf`MW02?mDLvu7Ps&z?Pa;l%bwGK^Vlj0)R*l^Oea8B@03HDL5) z6ngPXV6VVd&JS;(^oL*DEsPkSaWTF6HC@4$F@W*l^g>(4*^HIbdF>by!&In$5ZGuAW4Om}x+yei-P)3#u_zjXzJHuD9x4|9GpC|egSf%844TRSq! zN`L(|+nZ5QzF>;?jY`%Ji+(dIuzooC*MfoL!-4I^j*QuijEAP*cVd(l&-lThtX$yY zqg=tD&31u7kKuy!L$(i{(*>Owl^NNmn>sW4Gw$8q>dYw3#I66AL0P*%p@RLxlI^Qq z8M7Ig-u>M!;m#<+$e6iZ*Mo62Blq^-tRJTSW>8@L&^P_DC!;Rw#b4|n!l#RRF@9$H z`g=Qw_8D8JRBpoZb<_7{s`5`t1-#S;pAuKSLO0 zncn@IE)mM8z?eJTGL-Q*W9W9%Fh*ZS#(mS9!x@bk=WX8}&Ul=WF>ZQ&B;#d9x9P!A zjMF9d{9#g7F39$lu3*q+xxnz@*iQxpwhuplPiKl|bYPq?-8q`^BCqh@hnp%Tn3Z%r z*go)1SBzoIXDpgNF@{lDwDKeaLku9`sG5# zuZ+^$PZlxivoQYO{XV}W`-MfL`lX(Tx zWR?$aeox;}&uGFl?bh~Z^^9DM+)IBcF=%*xkYxF=VEXR{MrocWzmyml6fGE7KHUE` zU8#|=i?MzB+D67uMxp77Rrx${FA=4*!Gukp*OuyL8sLv?7ow0{enUU?yRR)F?SEprS*LSU7iVPe|wjRtMQvZNhHXh6$62L4g59SZif2_bN zEj@mH7X_=d@L>KB0G2oNVE*7eeQ7V_e@3b4OZyn*8F{B4?PI*owBYpgdHsxOAewCg zqZXshcEbsb>P(Ez(<3J_u9Y?V�q&(G;Bem@hCWaxnb(e(FEdhfDt%K75+4Jee_= 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 delta 13747 zcmbPolxxaSt_d!7Gj205fG{fq2rx1*f+z+i5UBtXS72sfc)`QKzzz~&fXIXRFL)Rf zcHG<8wCg|P%c-`E_nA0{d8B3@0+A%(4WSRcnj!~2G z{d7rt#NRlfeGZNYMX>k0;K<_l~eX8dGOwk}u#=eta|c4U;5 z{`hOQH>09_!4&Tsm8>5Y{bp2P{c!ZJ1p~*2AKQx^8M7G~_f5a=#3(JE@`FKHxxmFo zxq?BP?E-@y!v*PwY#&;u3pz6@Gcr#%b!PNu+_}BgnNgaFTl+7AvUY(&1^b6P+gH0X zW-~IW{o5|#&M3mjn7UopgK;$@_vYWMA13~0P+&U+f?Hr;Bwm4B9Lg7(N{P$)LdY!SK&?rf5b7#-8cU(To>)z5hPkR4Ku%r0c=< z!F9S~3}Zgyqv;c47?nj|o@8Li;b2fO<6uyDbCQ7}mxDp!)Ao}wjNFWpk4`c$WN(GuZ+|c<8F(9dN);G-GZ{%07gBmcL5#ufV7%oqQEzy6Em!~5+!D;VE0GOBD}Ud71E%(!s+ z)>_8jjLOqD)-l?%tNwZToaw`)>EG)Z=gNFP$-uDs?En9FcK!d)u$AAtcLTpC^9rWP zEFV<^=0B?bmX3kH@C;=iXW zH8OTFexJU!kuj9fYdUiiqdjBWcIPHWQ6|Pa+ap^TFETSu+OFNfc$twgZ2SLCMr}sM z1Jkv;85J4VPxtL+RA!tzy%5CfnLfFj(Ux(=^o!k$`i!C58G9I&8QBh8V_>McHeIWi zQ7dr82?hq?t=|+Jd^nU885|gYeb@S>$iSgw>%shC?jI1##)J983^2>egZabcKUQFs zmL9*pi-J{JcrbtH0LzyneP(E)(<3J_u9eOD�q&(G;Bem@hCWaxnb(e(FE-2d*CsAKpz@p3E4` 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 diff --git a/firmware.bin b/firmware.bin index c07ad4138e438db4da00691fe6889fb803f77b1e..92bb02a65e32a3853e9edc3ad2d24d940184240f 100644 GIT binary patch delta 7489 zcmdn7m-)$V<_R{8A1B)0XS(=vvmE0jPR5GO8@ax7G99_Kd6mdJMn=xfGsV=|ln$O? zVEF(4{r{s7x_-wA28O*S7#LE|o^?z;d-mXk6Pq8&WU(|=VeUUeAmE}QRu}l zfxQA-IX}FC(jR_pwlI3e#q{deWChy*#)Fd!ZD%u9PUf|H$jCAIy`3iG=gE@xYZ>QE zK5k#n7&F=3;i`P|Puqg!{?-)?+RPW&KFs;apln^R1kU%EZ0#s3{q@&uZ$?G=f+^lN zDp@})`pu}o`r+hX3kHr42R0WwW-~G#ntb0$T0G+igR*jgi;r>zgErd*20exg(hu1_ zbWRp@R%T?MZ0hXKxOa1_vosU8{$B=V?E-}g_76)ouXfF5WP0~^vxK_{BV*=fU60j_ z+}nS%ewg~3L4ox{-{i-hx~vy}v404kEb8@{>Fe*!T;4fMj7K(?`!N!+aST_f2jNH)fo-d3*SA zM#i|w^^unu-6jV|O_$j7he=tvAlqBIfg)6KN%F*KK%SWnJLUhY!mo_dn@<+$ zvoQYO{IhH$BmcgC#ufV7%oqQEzy6Em!}iTPE8a3PYHVI!#mmgNbn@2P-;C;$H`dv+ zYyNrooaw`~$=~bd%Cw(kU|4r zXZ2i++)IBcF=%*xkYxF=VDj$lHb=HxWM+)otle>$kx_2*|4wa2#*WF_-HMFmlYP6D8B-@0b}KT5OrG3r z%V;tAVz)k{>}JLuWk$9)R~Z;qT%D}ds}*Q*f`LJJ>o)}l9}Xo&1_#Dp-?e@zGH@u_ zdN6-T{R3jzcrbrR0JE$-m_J1Su>z~K^!W8%6s*$1gZV=MSl-No`Gfc5rM>?dr6w=! zlV{|ee6;U6(}L5J=k=$7D7Fb&j5eDMC#W+qI!}(Av{u&WKckNBMN@E6V!ptj$ieXA z`>Fp-A1?i8`0#16^5kH~JCn;NM>9^?e0j1wBjbe0pQmgVUiQyiiQQYOfZbcBKwvL} z0@H`Nn|Dr)XNm&(>Im3p3=BWEvM}&5h%+!Kx+uvqFntL9ugsulEMLH+{NH$SE4Md; z(&A=i22JB-j>OXVEAglz{sIw$k4Fq=Xdenh75Mz3XBINn3OmS z8#eu9`p!3b?rcfU;ERkiBohP@j3@7(t;=XL`R#0J?vB5G&lnV!7%&#tOctJ_Xzuh} zf`L)-xPhQU5IbYR3FArp9?y^Kblo&&*kHEBm_bRh!yx1Tceh^#2@TH$6BuVnC9HZb zRd9N8?i|BlQEx`2nRQH>Ocxk6*)B3D-736Q8R+EYcxe;+gQz+tEs=|iRv`8YZUIL|7aVZh-v!!S}pT0${FIN|^I4SxjoGHSiL$e{Fm^2<5WywiR$DCT&x zDM%Ll_#Qr4aIR?TvA+z8tO`HAd;Eo@i3@)j6d4tMe0TWEsKTT0<9o($HU>2Z1t<0k z42nz&Kfb^Ct-$c}`}cnzo*OdQEByHW;CGmBt%5d#qp@U#yt1T2h_|HkkMCE12lyyw zNN37tSTOwfzGrgxTut%we?jaYe+?KI6@PsH_s2uQ(euamb(2reHDq1;O#`Kst~7QO=0Yl*st;{rR6C z-?jg7Dg6A-_75gz_?Ho!hs^)5D*XKZ>#uS~RHlZpM1^3+kMBGGfYg5Y3szgnsKIfe zNsdvA=SF1ZzwfXA|M+hBM?h(BbS1l2G{cOjAK%^ne1HDqJM+IU&p{c8ceQVpvriE^3nyl_F?}{DE#~``Bz}?kMA-6empCqJvBE>-Q&rv)yJCDl>FI`FH+iyWJ>!tB~o&!1&|49N0XN4<`Ij zX6S;dIrTT&O`<@Vp$E!81TwQgnIX%q-&ndL(`|BrlE;tl4F9s+7T0IG2^T!Bm-h%R z_+3A_;Pd3aOC`Bq{?%mQPy(46Jy~&?DaXmbtQ$V;)xS15Zkd-f=kLXv*wq*&t210v z-tH{T_+NrU$%27t<&WQer)dNZwjAo1gS{NMY}54f3KV_@juVo-?SXJGiSm5qUip>+eBqJf7fgFM5}@7pH( zFV|%>n_RoRkm>KA$sd+WFxg+5%(X(rI^_rZUIry*@2}4p~X{$o^TQDT@ZuBgnww1VLS^Ut5(O()l`l&uf>b^Q4OH+^OXg~V$N z49|EN6jH7+Fg)d9P{_K*z_6Z!K>?Hknm8B~@~<&4EV#zNP<@Sop`L?5q3s$2!yO(5 zg$51=h2Con3JvI zK1nXmGKr;53>Uxe)vS=$2jhpOe;z0?C{ALq^hGn`|9{W;FXJs$!Kx*FlR?RVfoY{w!N2dPey1o& zc;C(lc4nG2*@@*Mqr%_se7`|iheL@=(SU*RgX13shQHrgCP%L`mEH(V5TFF}KrZ1QxGTj03Cr;WjZ zi9zyoCEEm#Iw=MQ4VDX=JQyk%G#D;)S2E4)c4D~L`(T~7WW_pgbBXifS}@IekwKH; zV#9;gUaLJb9x!PBx+tK;vx4!%k>5+aLFH=D#bw^hJ*6v{v>7-qEc4`8!T5oDa_o9Z z=bpcs3<63Z{?gx5yd^7EI*CKI&iy^nd%7=3Gt&hoZRd+qeKi<(R{r{a=nu~-1`URb zS`0m&94o$kx1YRmy(nA4U*_2^=9AB?m#8m#&Zu1VoJpJaVxtewN(F{r-={;hC^6K6 zwTS#*`n(A2?u8eMy(>LImdw0R;W_#6Hk(7K*mH&q0 zVa&j##H{fD`_I3T-b}OR#xUqITs-ywRNR2V>ff&nIWA>Zjp!R+zf1iHP2I3*%eLE< zJDxKsFvbszeFZFE{IE4!WiE;1_1D>BbI z;=wTW|M$v2?6VoQ87|y@aL`*igTwe^5Nhu>2>p9>c|*V3GBn z^?e46ALjjJ(POx{0W7q}bD{y`hp9hV^%yQL2aBxmoMOQEq37p<2g|)JGo>qdGmdM8 z-eA<`yg1W)W*vhj@5R~Ryv}&BI#V`diua6KW{rh6zI=cFFMyjx>2~FZ=hh4+p!SmW z?M;8Rd2TWqUD`Ai94c9V8S9l9C$k$fOfFDjo-O>GQJG~1j4!XqJX_R&8>*RQ9;5Z` zO`>LhwRvwc8nt;|+62nYUVj;s^c4*lm}fIg`u~07@3iNzG~fOc)b#+ReuJNHo`W2l z2hN7ZAji&{>;!SF217l^%75RPe=>jro?$X5Y3=(BN|MG5oDu~}ObY+M2mN84EnRV3 zo8jj1XPI7CV=jj=XtUm8o57}(=2>XK_<`Z4gR-m>!^IuXKw^oW6$XqSzWvzv>~`g; z=j^kYv{^64dNa+M7Xun#QF+cXTe=oB2En5g>8ZdlyWW8J0Vtm9E>>qsS2AkXTwtbcE;@xx}2-U^TtKw^$yv6VkqX3wr-&}O{=605iMJYc~1VLnJ< zHKR5}v!&-LP#OS<)i7u?Uo-=!S&#+^B@@pp28CU_y5{n+TLHk-~YkHz|Fw1Leulx_rgC6O3btM6&a0hZ(^vQ1PbzN zzl@$*XVyRGQBv|OeJ*^RfkFB@1B3E)1_sURkn9G^*Wl&^H-p0JlMD^}*~rl2MVs3CXq6azyKH-p0TlMD<7rx+M!o?>8Fe3F6T;VA}& zgU~E%RL;$y;B<>BtQ-R^zcbDIcYWfw7({%M2E;v0>wKry{S29vmU|^X3|9jG8{~h9jVLw@wL1NoI z7^i_m{U(?1uw*j)IeF6#B_{cwldtViV&eTd`PU95#@~}=cdF~|{>2E*a3F083@q0F zzu*0#U2#i}S&Q+ernbPv5^qHYiHrlA{(f(qT)0zI_R3Ga3OT#an;5mFZ)EyvW&GD- zxS;e%fuX|l+xMQyi+8HZFa7c3yXOy3D+zVRo@E86?Z_XU%^cd2uJ_!I0E;{D}& z$K>i=(|KR~HOgRQxU@-u;otW&ljV2I)=OPuU|?W)VDEmNfnnlx28OBE85o}MFeq4G zXJBx=&cGnR#h}n}je&umhe1J{he1J+he1J;he4r^gF(RwG)8wF(k2BZDwbOe4Amm* z+#go8*!y2+U=X^+zz}|&fnmXE28P623=GlN85nF%Gce4W2?9Iq!)`GcGkm`ZNtLj~ zVsZ;o5h&hbU`V>ozyNBMTYwyPlY!yZO$G*oo0H$|u3?-qIeU*O=gQx;UbWs|z86kj zxksN#_W$Htd(^l;{>t%WVgSYZjmg}5l^H)x*59kocxZC`US; zBe`SIgMvOAz7k;aul-h<{J(;{g1oo?Qw$8xI2jbaaWW_zI?2Ew%g&(i zg_A*n^)v&6FgqmhDo!ylaI!Nf$em_j_{PSdU~rm&;Uyb`!b?y~hK)f1R01AhV^Fwq zl7ZpbNd|@=Cn3F8J!S@lyi*Jen>iR1l1?!&2yEr@mZ)IXV7>AAyXJo;Ru1le9N(Y* z71;al`;N)}hc7Zdove7oxnBFPnzuy9m+y!Ft9z+?fBD}1lX*59LxgmSGCxCvbE5R; z?|T1@7#Jp4Gbnm;toZs}_%EX>mkNV2%L++`dL_oG3{(DnH~r1Af(evr6(M}x-=K1i zK~dBL!dLzM{rm4<-@hOKwe0z81(uZpN(_wOzAyXtMnRxniDM;*v*6$5=Lg)@voR=u zdTF4X4oZ5UqzOuf%}BYv`xXPkv|9`e>{~%Y8tlf5iV_UpzkmA8zL$Z))7#6dV5?NZ z_wNb6|9qeN^ZWNnzvUI(JidQ_^xM@(fq~&e)K5kR1%~h6Z~bOgbn^KAo$=b_{M{QG^^&%fU{{04Q-?*BIOPGB%( zI3U4j^5?t5PZphT7a0`(d{6wZ3$9${FY174>5Hrif4=Ye$EK+1@$Gx!KMik2B?eVc zpVH`;8h93m>B5iiYX4LVRMNrRPZxfC_x`V1@b3Bl?;rnt{cij3m%;&t@82)}GEkE7 zmMZx3ecOL&?^hWt46~frZZIlK`f3;a`@ZHkXrxMk;m`M*|9KQeJ-&U{`6udq^7#Qb z4h9B?b`}PyMbHpCcx!Xkv0AqJcm@Urb_R9^k$RDO5f!a^Eg@xLj+7)b&oG4m1`c*+ z1_l`=M+OE*B^d@SnR*#54h}mG4u*yT0|pKdU|>i{U{Da?U}3Uzbab?1aH@A;DDw35 zbW?Qn^fi_c5vmtZcXf5OwDI!vG;~xH>Io}Na`^^En5 z%=Qir4)*d24hr)24i*mf$s!yg$;>PjEX;|Kp1#fuAWNB8I0O_J9336&S(q4^SU|=* zFfg-oFerqCR5;XYxVTtYxVX4zSh%=o)LVpvgh()O)NwLNELk$AqMn0=rGmkw)`3C6 z!NHcHUO>Zzfx)rffuV+_BAlh71|$vAZ1G1zMMVOH|A53eJVHW3R9IN-T~urw929C~ z6dV*}Y#a<6Y+N)1G+cZpOqfvPk`m(M!oXqX$iTo*&cMLnXvV<+av#%Xh4V4&ldG>S m+ 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 I@%m#n01;n>3;+NC diff --git a/firmware.packed.bin b/firmware.packed.bin index 9b269faaf69ac0617eabac0041bc0ba60b3a9c2c..3f3decfe9965ab4800fb05452da6f0e7b7773511 100644 GIT binary patch delta 18446 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 delta 18660 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 iIx6mZ*=hRCXC%+' - 0x3844041800100000, // '?' - - 0x003C449C945C201C, // '@' - 0x1818243C42420000, // 'A' - 0x7844784444780000, // 'B' - 0x3844808044380000, // 'C' - 0x7844444444780000, // 'D' - 0x7C407840407C0000, // 'E' - 0x7C40784040400000, // 'F' - 0x3844809C44380000, // 'G' - 0x42427E4242420000, // 'H' - 0x3E080808083E0000, // 'I' - 0x1C04040444380000, // 'J' - 0x4448507048440000, // 'K' - 0x40404040407E0000, // 'L' - 0x4163554941410000, // 'M' - 0x4262524A46420000, // 'N' - 0x1C222222221C0000, // 'O' - - 0x7844784040400000, // 'P' - 0x1C222222221C0200, // 'Q' - 0x7844785048440000, // 'R' - 0x1C22100C221C0000, // 'S' - 0x7F08080808080000, // 'T' - 0x42424242423C0000, // 'U' - 0x8142422424180000, // 'V' - 0x4141495563410000, // 'W' - 0x4224181824420000, // 'X' - 0x4122140808080000, // 'Y' - 0x7E040810207E0000, // 'Z' - 0x3820202020380000, // '[' - 0x4020100804020000, // '\' - 0x3808080808380000, // ']' - 0x1028000000000000, // '^' - 0x00000000007E0000, // '_' - - 0x1008000000000000, // '`' - 0x003C023E463A0000, // 'a' - 0x40407C42625C0000, // 'b' - 0x00001C20201C0000, // 'c' - 0x02023E42463A0000, // 'd' - 0x003C427E403C0000, // 'e' - 0x0018103810100000, // 'f' - 0x0000344C44340438, // 'g' - 0x2020382424240000, // 'h' - 0x0800080808080000, // 'i' - 0x0800180808080870, // 'j' - 0x20202428302C0000, // 'k' - 0x1010101010180000, // 'l' - 0x0000665A42420000, // 'm' - 0x00002E3222220000, // 'n' - 0x00003C42423C0000, // 'o' - - 0x00005C62427C4040, // 'p' - 0x00003A46423E0202, // 'q' - 0x00002C3220200000, // 'r' - 0x001C201804380000, // 's' - 0x00103C1010180000, // 't' - 0x00002222261A0000, // 'u' - 0x0000424224180000, // 'v' - 0x000081815A660000, // 'w' - 0x0000422418660000, // 'x' - 0x0000422214081060, // 'y' - 0x00003C08103C0000, // 'z' - 0x1C103030101C0000, // '{' - 0x0808080808080800, // '|' - 0x38080C0C08380000, // '}' - 0x000000324C000000, // '~' - 0x7E7E7E7E7E7E0000 // 'DEL' + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 'space' + {0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00, 0x00}, // '!' + {0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '"' + {0x00, 0x28, 0x7C, 0x28, 0x7C, 0x28, 0x00, 0x00}, // '#' + {0x08, 0x1E, 0x28, 0x1C, 0x0A, 0x3C, 0x08, 0x00}, // '$' + {0x60, 0x94, 0x68, 0x16, 0x29, 0x06, 0x00, 0x00}, // '%' + {0x1C, 0x20, 0x20, 0x19, 0x26, 0x19, 0x00, 0x00}, // '&' + {0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // ''' + {0x08, 0x10, 0x20, 0x20, 0x10, 0x08, 0x00, 0x00}, // '(' + {0x10, 0x08, 0x04, 0x04, 0x08, 0x10, 0x00, 0x00}, // ')' + {0x2A, 0x1C, 0x3E, 0x1C, 0x2A, 0x00, 0x00, 0x00}, // '*' + {0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, 0x00}, // '+' + {0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00}, // ',' + {0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00}, // '-' + {0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00}, // '.' + {0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00}, // '/' + {0x18, 0x24, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00}, // '0' + {0x08, 0x18, 0x08, 0x08, 0x08, 0x1C, 0x00, 0x00}, // '1' + {0x3C, 0x42, 0x04, 0x18, 0x20, 0x7E, 0x00, 0x00}, // '2' + {0x3C, 0x42, 0x04, 0x18, 0x42, 0x3C, 0x00, 0x00}, // '3' + {0x08, 0x18, 0x28, 0x48, 0x7C, 0x08, 0x00, 0x00}, // '4' + {0x7E, 0x40, 0x7C, 0x02, 0x42, 0x3C, 0x00, 0x00}, // '5' + {0x3C, 0x40, 0x7C, 0x42, 0x42, 0x3C, 0x00, 0x00}, // '6' + {0x7E, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00}, // '7' + {0x3C, 0x42, 0x3C, 0x42, 0x42, 0x3C, 0x00, 0x00}, // '8' + {0x3C, 0x42, 0x42, 0x3E, 0x02, 0x3C, 0x00, 0x00}, // '9' + {0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00, 0x00}, // ':' + {0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x00}, // ';' + {0x00, 0x06, 0x18, 0x60, 0x18, 0x06, 0x00, 0x00}, // '<' + {0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00}, // '=' + {0x00, 0x60, 0x18, 0x06, 0x18, 0x60, 0x00, 0x00}, // '>' + {0x38, 0x44, 0x04, 0x18, 0x00, 0x10, 0x00, 0x00}, // '?' + {0x00, 0x3C, 0x44, 0x9C, 0x94, 0x5C, 0x20, 0x1C}, // '@' + {0x18, 0x18, 0x24, 0x3C, 0x42, 0x42, 0x00, 0x00}, // 'A' + {0x78, 0x44, 0x78, 0x44, 0x44, 0x78, 0x00, 0x00}, // 'B' + {0x38, 0x44, 0x80, 0x80, 0x44, 0x38, 0x00, 0x00}, // 'C' + {0x78, 0x44, 0x44, 0x44, 0x44, 0x78, 0x00, 0x00}, // 'D' + {0x7C, 0x40, 0x78, 0x40, 0x40, 0x7C, 0x00, 0x00}, // 'E' + {0x7C, 0x40, 0x78, 0x40, 0x40, 0x40, 0x00, 0x00}, // 'F' + {0x38, 0x44, 0x80, 0x9C, 0x44, 0x38, 0x00, 0x00}, // 'G' + {0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x00, 0x00}, // 'H' + {0x3E, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00}, // 'I' + {0x1C, 0x04, 0x04, 0x04, 0x44, 0x38, 0x00, 0x00}, // 'J' + {0x44, 0x48, 0x50, 0x70, 0x48, 0x44, 0x00, 0x00}, // 'K' + {0x40, 0x40, 0x40, 0x40, 0x40, 0x7E, 0x00, 0x00}, // 'L' + {0x41, 0x63, 0x55, 0x49, 0x41, 0x41, 0x00, 0x00}, // 'M' + {0x42, 0x62, 0x52, 0x4A, 0x46, 0x42, 0x00, 0x00}, // 'N' + {0x1C, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00, 0x00}, // 'O' + {0x78, 0x44, 0x78, 0x40, 0x40, 0x40, 0x00, 0x00}, // 'P' + {0x1C, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x02, 0x00}, // 'Q' + {0x78, 0x44, 0x78, 0x50, 0x48, 0x44, 0x00, 0x00}, // 'R' + {0x1C, 0x22, 0x10, 0x0C, 0x22, 0x1C, 0x00, 0x00}, // 'S' + {0x7F, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00}, // 'T' + {0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00}, // 'U' + {0x81, 0x42, 0x42, 0x24, 0x24, 0x18, 0x00, 0x00}, // 'V' + {0x41, 0x41, 0x49, 0x55, 0x63, 0x41, 0x00, 0x00}, // 'W' + {0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x00, 0x00}, // 'X' + {0x41, 0x22, 0x14, 0x08, 0x08, 0x08, 0x00, 0x00}, // 'Y' + {0x7E, 0x04, 0x08, 0x10, 0x20, 0x7E, 0x00, 0x00}, // 'Z' + {0x38, 0x20, 0x20, 0x20, 0x20, 0x38, 0x00, 0x00}, // '[' + {0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00}, // '\' + {0x38, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00}, // ']' + {0x10, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '^' + {0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00}, // '_' + {0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // '`' + {0x00, 0x3C, 0x02, 0x3E, 0x46, 0x3A, 0x00, 0x00}, // 'a' + {0x40, 0x40, 0x7C, 0x42, 0x62, 0x5C, 0x00, 0x00}, // 'b' + {0x00, 0x00, 0x1C, 0x20, 0x20, 0x1C, 0x00, 0x00}, // 'c' + {0x02, 0x02, 0x3E, 0x42, 0x46, 0x3A, 0x00, 0x00}, // 'd' + {0x00, 0x3C, 0x42, 0x7E, 0x40, 0x3C, 0x00, 0x00}, // 'e' + {0x00, 0x18, 0x10, 0x38, 0x10, 0x10, 0x00, 0x00}, // 'f' + {0x00, 0x00, 0x34, 0x4C, 0x44, 0x34, 0x04, 0x38}, // 'g' + {0x20, 0x20, 0x38, 0x24, 0x24, 0x24, 0x00, 0x00}, // 'h' + {0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00}, // 'i' + {0x08, 0x00, 0x18, 0x08, 0x08, 0x08, 0x08, 0x70}, // 'j' + {0x20, 0x20, 0x24, 0x28, 0x30, 0x2C, 0x00, 0x00}, // 'k' + {0x10, 0x10, 0x10, 0x10, 0x10, 0x18, 0x00, 0x00}, // 'l' + {0x00, 0x00, 0x66, 0x5A, 0x42, 0x42, 0x00, 0x00}, // 'm' + {0x00, 0x00, 0x2E, 0x32, 0x22, 0x22, 0x00, 0x00}, // 'n' + {0x00, 0x00, 0x3C, 0x42, 0x42, 0x3C, 0x00, 0x00}, // 'o' + {0x00, 0x00, 0x5C, 0x62, 0x42, 0x7C, 0x40, 0x40}, // 'p' + {0x00, 0x00, 0x3A, 0x46, 0x42, 0x3E, 0x02, 0x02}, // 'q' + {0x00, 0x00, 0x2C, 0x32, 0x20, 0x20, 0x00, 0x00}, // 'r' + {0x00, 0x1C, 0x20, 0x18, 0x04, 0x38, 0x00, 0x00}, // 's' + {0x00, 0x10, 0x3C, 0x10, 0x10, 0x18, 0x00, 0x00}, // 't' + {0x00, 0x00, 0x22, 0x22, 0x26, 0x1A, 0x00, 0x00}, // 'u' + {0x00, 0x00, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00}, // 'v' + {0x00, 0x00, 0x81, 0x81, 0x5A, 0x66, 0x00, 0x00}, // 'w' + {0x00, 0x00, 0x42, 0x24, 0x18, 0x66, 0x00, 0x00}, // 'x' + {0x00, 0x00, 0x42, 0x22, 0x14, 0x08, 0x10, 0x60}, // 'y' + {0x00, 0x00, 0x3C, 0x08, 0x10, 0x3C, 0x00, 0x00}, // 'z' + {0x1C, 0x10, 0x30, 0x30, 0x10, 0x1C, 0x00, 0x00}, // '{' + {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00}, // '|' + {0x38, 0x08, 0x0C, 0x0C, 0x08, 0x38, 0x00, 0x00}, // '}' + {0x00, 0x00, 0x00, 0x32, 0x4C, 0x00, 0x00, 0x00} // '~' }; */ - -const uint8_t gFont6x8[96][6] = +const uint8_t gFont5x8[95][5] = { -{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, -{ 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00 }, -{ 0x00, 0x07, 0x00, 0x07, 0x00, 0x00 }, -{ 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00 }, -{ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00 }, -{ 0x23, 0x13, 0x08, 0x64, 0x62, 0x00 }, -{ 0x36, 0x49, 0x56, 0x20, 0x50, 0x00 }, -{ 0x00, 0x08, 0x07, 0x03, 0x00, 0x00 }, -{ 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00 }, -{ 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00 }, -{ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00 }, -{ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00 }, -{ 0x00, 0x80, 0x70, 0x30, 0x00, 0x00 }, -{ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }, -{ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, -{ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00 }, + {0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x5F, 0x00, 0x00}, + {0x00, 0x07, 0x00, 0x07, 0x00}, + {0x14, 0x7F, 0x14, 0x7F, 0x14}, + {0x24, 0x2A, 0x7F, 0x2A, 0x12}, + {0x23, 0x13, 0x08, 0x64, 0x62}, + {0x36, 0x49, 0x56, 0x20, 0x50}, + {0x00, 0x08, 0x07, 0x03, 0x00}, + {0x00, 0x1C, 0x22, 0x41, 0x00}, + {0x00, 0x41, 0x22, 0x1C, 0x00}, + {0x2A, 0x1C, 0x7F, 0x1C, 0x2A}, + {0x08, 0x08, 0x3E, 0x08, 0x08}, + {0x00, 0x80, 0x70, 0x30, 0x00}, + {0x08, 0x08, 0x08, 0x08, 0x08}, + {0x00, 0x00, 0x60, 0x60, 0x00}, + {0x20, 0x10, 0x08, 0x04, 0x02}, -//{ 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00 }, -{ 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00 }, -{ 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00 }, -{ 0x72, 0x49, 0x49, 0x49, 0x46, 0x00 }, -{ 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00 }, -{ 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00 }, -{ 0x27, 0x45, 0x45, 0x45, 0x39, 0x00 }, -{ 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00 }, -{ 0x41, 0x21, 0x11, 0x09, 0x07, 0x00 }, -{ 0x36, 0x49, 0x49, 0x49, 0x36, 0x00 }, -{ 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00 }, -{ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00 }, -{ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00 }, -{ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, -{ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00 }, -{ 0x00, 0x41, 0x22, 0x14, 0x08, 0x00 }, -{ 0x02, 0x01, 0x59, 0x09, 0x06, 0x00 }, + {0x3E, 0x41, 0x41, 0x41, 0x3E}, + {0x00, 0x42, 0x7F, 0x40, 0x00}, + {0x72, 0x49, 0x49, 0x49, 0x46}, + {0x21, 0x41, 0x49, 0x4D, 0x33}, + {0x18, 0x14, 0x12, 0x7F, 0x10}, + {0x27, 0x45, 0x45, 0x45, 0x39}, + {0x3C, 0x4A, 0x49, 0x49, 0x31}, + {0x41, 0x21, 0x11, 0x09, 0x07}, + {0x36, 0x49, 0x49, 0x49, 0x36}, + {0x46, 0x49, 0x49, 0x29, 0x1E}, + {0x00, 0x00, 0x14, 0x00, 0x00}, + {0x00, 0x40, 0x34, 0x00, 0x00}, + {0x00, 0x08, 0x14, 0x22, 0x41}, + {0x14, 0x14, 0x14, 0x14, 0x14}, + {0x00, 0x41, 0x22, 0x14, 0x08}, + {0x02, 0x01, 0x59, 0x09, 0x06}, -{ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00 }, -{ 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00 }, -{ 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00 }, -{ 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00 }, -{ 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00 }, -{ 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00 }, -{ 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00 }, -{ 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00 }, -{ 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00 }, -{ 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00 }, -{ 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00 }, -{ 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00 }, -{ 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00 }, -{ 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00 }, -{ 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00 }, -{ 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00 }, + {0x3E, 0x41, 0x5D, 0x59, 0x4E}, + {0x7C, 0x12, 0x11, 0x12, 0x7C}, + {0x7F, 0x49, 0x49, 0x49, 0x36}, + {0x3E, 0x41, 0x41, 0x41, 0x22}, + {0x7F, 0x41, 0x41, 0x41, 0x3E}, + {0x7F, 0x49, 0x49, 0x49, 0x41}, + {0x7F, 0x09, 0x09, 0x09, 0x01}, + {0x3E, 0x41, 0x41, 0x51, 0x73}, + {0x7F, 0x08, 0x08, 0x08, 0x7F}, + {0x00, 0x41, 0x7F, 0x41, 0x00}, + {0x20, 0x40, 0x41, 0x3F, 0x01}, + {0x7F, 0x08, 0x14, 0x22, 0x41}, + {0x7F, 0x40, 0x40, 0x40, 0x40}, + {0x7F, 0x02, 0x1C, 0x02, 0x7F}, + {0x7F, 0x04, 0x08, 0x10, 0x7F}, + {0x3E, 0x41, 0x41, 0x41, 0x3E}, -{ 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00 }, -{ 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00 }, -{ 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00 }, -{ 0x26, 0x49, 0x49, 0x49, 0x32, 0x00 }, -{ 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00 }, -{ 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00 }, -{ 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00 }, -{ 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00 }, -{ 0x63, 0x14, 0x08, 0x14, 0x63, 0x00 }, -{ 0x03, 0x04, 0x78, 0x04, 0x03, 0x00 }, -{ 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00 }, -{ 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00 }, -{ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00 }, -{ 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00 }, -{ 0x04, 0x02, 0x01, 0x02, 0x04, 0x00 }, -{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00 }, + {0x7F, 0x09, 0x09, 0x09, 0x06}, + {0x3E, 0x41, 0x51, 0x21, 0x5E}, + {0x7F, 0x09, 0x19, 0x29, 0x46}, + {0x26, 0x49, 0x49, 0x49, 0x32}, + {0x03, 0x01, 0x7F, 0x01, 0x03}, + {0x3F, 0x40, 0x40, 0x40, 0x3F}, + {0x1F, 0x20, 0x40, 0x20, 0x1F}, + {0x3F, 0x40, 0x38, 0x40, 0x3F}, + {0x63, 0x14, 0x08, 0x14, 0x63}, + {0x03, 0x04, 0x78, 0x04, 0x03}, + {0x61, 0x59, 0x49, 0x4D, 0x43}, + {0x00, 0x7F, 0x41, 0x41, 0x41}, + {0x02, 0x04, 0x08, 0x10, 0x20}, + {0x00, 0x41, 0x41, 0x41, 0x7F}, + {0x04, 0x02, 0x01, 0x02, 0x04}, + {0x40, 0x40, 0x40, 0x40, 0x40}, -{ 0x00, 0x03, 0x07, 0x08, 0x00, 0x00 }, -{ 0x20, 0x54, 0x54, 0x78, 0x40, 0x00 }, -{ 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00 }, -{ 0x38, 0x44, 0x44, 0x44, 0x28, 0x00 }, -{ 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00 }, -{ 0x38, 0x54, 0x54, 0x54, 0x18, 0x00 }, -{ 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00 }, -{ 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00 }, -{ 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00 }, -{ 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00 }, -{ 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00 }, -{ 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00 }, -{ 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00 }, -{ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00 }, -{ 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00 }, -{ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00 }, + {0x00, 0x03, 0x07, 0x08, 0x00}, + {0x20, 0x54, 0x54, 0x78, 0x40}, + {0x7F, 0x28, 0x44, 0x44, 0x38}, + {0x38, 0x44, 0x44, 0x44, 0x28}, + {0x38, 0x44, 0x44, 0x28, 0x7F}, + {0x38, 0x54, 0x54, 0x54, 0x18}, + {0x00, 0x08, 0x7E, 0x09, 0x02}, + {0x18, 0xA4, 0xA4, 0x9C, 0x78}, + {0x7F, 0x08, 0x04, 0x04, 0x78}, + {0x00, 0x44, 0x7D, 0x40, 0x00}, + {0x20, 0x40, 0x40, 0x3D, 0x00}, + {0x7F, 0x10, 0x28, 0x44, 0x00}, + {0x00, 0x41, 0x7F, 0x40, 0x00}, + {0x7C, 0x04, 0x78, 0x04, 0x78}, + {0x7C, 0x08, 0x04, 0x04, 0x78}, + {0x38, 0x44, 0x44, 0x44, 0x38}, -{ 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00 }, -{ 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00 }, -{ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00 }, -{ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00 }, -{ 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00 }, -{ 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00 }, -{ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00 }, -{ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00 }, -{ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00 }, -{ 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00 }, -{ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00 }, -{ 0x00, 0x08, 0x36, 0x41, 0x00, 0x00 }, -{ 0x00, 0x00, 0x77, 0x00, 0x00, 0x00 }, -{ 0x00, 0x41, 0x36, 0x08, 0x00, 0x00 }, -{ 0x02, 0x01, 0x02, 0x04, 0x02, 0x00 }, -{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } + {0xFC, 0x18, 0x24, 0x24, 0x18}, + {0x18, 0x24, 0x24, 0x18, 0xFC}, + {0x7C, 0x08, 0x04, 0x04, 0x08}, + {0x48, 0x54, 0x54, 0x54, 0x24}, + {0x04, 0x04, 0x3F, 0x44, 0x24}, + {0x3C, 0x40, 0x40, 0x20, 0x7C}, + {0x1C, 0x20, 0x40, 0x20, 0x1C}, + {0x3C, 0x40, 0x30, 0x40, 0x3C}, + {0x44, 0x28, 0x10, 0x28, 0x44}, + {0x4C, 0x90, 0x90, 0x90, 0x7C}, + {0x44, 0x64, 0x54, 0x4C, 0x44}, + {0x00, 0x08, 0x36, 0x41, 0x00}, + {0x00, 0x00, 0x77, 0x00, 0x00}, + {0x00, 0x41, 0x36, 0x08, 0x00}, + {0x02, 0x01, 0x02, 0x04, 0x02} }; /* // ASCII 5x7 font @@ -374,7 +368,6 @@ const uint8_t gFont5x7[96][5] = {0x00, 0x00, 0x60, 0x60, 0x00}, {0x20, 0x10, 0x08, 0x04, 0x02}, -// {0x3E, 0x51, 0x49, 0x45, 0x3E}, // '0' {0x3E, 0x41, 0x41, 0x41, 0x3E}, // '0' {0x00, 0x42, 0x7F, 0x40, 0x00}, {0x72, 0x49, 0x49, 0x49, 0x46}, diff --git a/font.h b/font.h index c525ff6..bf7cd0d 100644 --- a/font.h +++ b/font.h @@ -19,12 +19,12 @@ #include -extern const uint8_t gFontBig[95][16]; -extern const uint8_t gFontBigDigits[11][26]; -extern const uint8_t gFontSmallDigits[11][7]; +extern const uint8_t gFontBig[95][16]; +extern const uint8_t gFontBigDigits[11][26]; +extern const uint8_t gFontSmallDigits[11][7]; -//extern const uint64_t gFont8x8[16 * 6]; -extern const uint8_t gFont6x8[96][6]; +//extern const uint8_t gFont8x8[95][8]; +extern const uint8_t gFont5x8[95][5]; //extern const uint8_t gFont5x7[96][5]; #endif diff --git a/radio.c b/radio.c index b3af4b4..ec0e34a 100644 --- a/radio.c +++ b/radio.c @@ -116,7 +116,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, uint8_t ChannelSave, uint8_t Band, uint32 pInfo->Band = Band; pInfo->SCANLIST1_PARTICIPATION = true; pInfo->SCANLIST2_PARTICIPATION = true; - pInfo->STEP_SETTING = STEP_25_0kHz; + pInfo->STEP_SETTING = STEP_12_5kHz; // STEP_25_0kHz; pInfo->StepFrequency = 2500; pInfo->CHANNEL_SAVE = ChannelSave; pInfo->FrequencyReverse = false; @@ -137,8 +137,6 @@ void RADIO_ConfigureChannel(uint8_t VFO, uint32_t Arg) uint8_t Band; bool bParticipation2; uint16_t Base; - uint8_t Data[8]; - uint8_t Tmp; uint32_t Frequency; VFO_Info_t *pRadio = &gEeprom.VfoInfo[VFO]; @@ -199,8 +197,8 @@ void RADIO_ConfigureChannel(uint8_t VFO, uint32_t Arg) } Index = Channel - FREQ_CHANNEL_FIRST; - RADIO_InitInfo(pRadio, Channel, Index, gLowerLimitFrequencyBandTable[Index]); + RADIO_InitInfo(pRadio, Channel, Index, gLowerLimitFrequencyBandTable[Index]); return; } @@ -232,27 +230,28 @@ void RADIO_ConfigureChannel(uint8_t VFO, uint32_t Arg) if (Arg == 2 || Channel >= FREQ_CHANNEL_FIRST) { - EEPROM_ReadBuffer(Base + 8, Data, 8); + uint8_t Tmp; + uint8_t Data[8]; + + EEPROM_ReadBuffer(Base + 8, Data, sizeof(Data)); Tmp = Data[3] & 0x0F; if (Tmp > 2) Tmp = 0; - gEeprom.VfoInfo[VFO].FREQUENCY_DEVIATION_SETTING = Tmp; gEeprom.VfoInfo[VFO].AM_CHANNEL_MODE = !!(Data[3] & 0x10); Tmp = Data[6]; if (Tmp > STEP_8_33kHz) Tmp = STEP_25_0kHz; - gEeprom.VfoInfo[VFO].STEP_SETTING = Tmp; gEeprom.VfoInfo[VFO].StepFrequency = StepFrequencyTable[Tmp]; Tmp = Data[7]; if (Tmp > 10) Tmp = 0; + gEeprom.VfoInfo[VFO].SCRAMBLING_TYPE = Tmp; - gEeprom.VfoInfo[VFO].SCRAMBLING_TYPE = Tmp; gEeprom.VfoInfo[VFO].ConfigRX.CodeType = (Data[2] >> 0) & 0x0F; gEeprom.VfoInfo[VFO].ConfigTX.CodeType = (Data[2] >> 4) & 0x0F; @@ -307,10 +306,11 @@ void RADIO_ConfigureChannel(uint8_t VFO, uint32_t Arg) } else { - gEeprom.VfoInfo[VFO].FrequencyReverse = !!(Data[4] & 1u); - gEeprom.VfoInfo[VFO].CHANNEL_BANDWIDTH = !!(Data[4] & 2u); - gEeprom.VfoInfo[VFO].OUTPUT_POWER = (Data[4] >> 2) & 3u; - gEeprom.VfoInfo[VFO].BUSY_CHANNEL_LOCK = !!(Data[4] & 0x10); + const uint8_t d4 = Data[4]; + gEeprom.VfoInfo[VFO].FrequencyReverse = !!(d4 & 0x01); + gEeprom.VfoInfo[VFO].CHANNEL_BANDWIDTH = !!(d4 & 0x02); + gEeprom.VfoInfo[VFO].OUTPUT_POWER = (d4 >> 2) & 0x03; + gEeprom.VfoInfo[VFO].BUSY_CHANNEL_LOCK = !!(d4 & 0x10); } if (Data[5] == 0xFF) @@ -320,17 +320,17 @@ void RADIO_ConfigureChannel(uint8_t VFO, uint32_t Arg) } else { - gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = !!(Data[5] & 1u); - gEeprom.VfoInfo[VFO].DTMF_PTT_ID_TX_MODE = (Data[5] >> 1) & 3u; + gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = !!(Data[5] & 0x01); + gEeprom.VfoInfo[VFO].DTMF_PTT_ID_TX_MODE = (Data[5] >> 1) & 0x03; } struct { uint32_t Frequency; uint32_t Offset; - } Info; + } __attribute__((packed)) Info; - EEPROM_ReadBuffer(Base, &Info, 8); + EEPROM_ReadBuffer(Base, &Info, sizeof(Info)); pRadio->ConfigRX.Frequency = Info.Frequency; @@ -341,24 +341,23 @@ void RADIO_ConfigureChannel(uint8_t VFO, uint32_t Arg) } Frequency = pRadio->ConfigRX.Frequency; + + // TODO: FIX-ME !!! if (Frequency < gLowerLimitFrequencyBandTable[Band]) - pRadio->ConfigRX.Frequency = gLowerLimitFrequencyBandTable[Band]; + Frequency = gLowerLimitFrequencyBandTable[Band]; else if (Frequency > gUpperLimitFrequencyBandTable[Band]) - pRadio->ConfigRX.Frequency = gUpperLimitFrequencyBandTable[Band]; + Frequency = gUpperLimitFrequencyBandTable[Band]; else if (Channel >= FREQ_CHANNEL_FIRST) - pRadio->ConfigRX.Frequency = FREQUENCY_FloorToStep(pRadio->ConfigRX.Frequency, gEeprom.VfoInfo[VFO].StepFrequency, gLowerLimitFrequencyBandTable[Band]); + Frequency = FREQUENCY_FloorToStep(Frequency, gEeprom.VfoInfo[VFO].StepFrequency, gLowerLimitFrequencyBandTable[Band]); pRadio->ConfigRX.Frequency = Frequency; if (Frequency >= 10800000 && Frequency < 13600000) gEeprom.VfoInfo[VFO].FREQUENCY_DEVIATION_SETTING = FREQUENCY_DEVIATION_OFF; else if (!IS_MR_CHANNEL(Channel)) - { - Frequency = FREQUENCY_FloorToStep(gEeprom.VfoInfo[VFO].FREQUENCY_OF_DEVIATION, gEeprom.VfoInfo[VFO].StepFrequency, 0); - gEeprom.VfoInfo[VFO].FREQUENCY_OF_DEVIATION = Frequency; - } + gEeprom.VfoInfo[VFO].FREQUENCY_OF_DEVIATION = FREQUENCY_FloorToStep(gEeprom.VfoInfo[VFO].FREQUENCY_OF_DEVIATION, gEeprom.VfoInfo[VFO].StepFrequency, 0); RADIO_ApplyOffset(pRadio); @@ -466,6 +465,7 @@ void RADIO_ApplyOffset(VFO_Info_t *pInfo) break; } + // limit to 50MHz to 600MHz if (Frequency < 5000000) Frequency = 5000000; else @@ -494,13 +494,12 @@ void RADIO_SelectVfos(void) if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_A) gEeprom.TX_CHANNEL = 0; - gTxVfo = &gEeprom.VfoInfo[gEeprom.TX_CHANNEL]; - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) gEeprom.RX_CHANNEL = gEeprom.TX_CHANNEL; else gEeprom.RX_CHANNEL = (gEeprom.TX_CHANNEL == 0) ? 1 : 0; + gTxVfo = &gEeprom.VfoInfo[gEeprom.TX_CHANNEL]; gRxVfo = &gEeprom.VfoInfo[gEeprom.RX_CHANNEL]; RADIO_SelectCurrentVfo(); @@ -509,11 +508,11 @@ void RADIO_SelectVfos(void) void RADIO_SetupRegisters(bool bSwitchToFunction0) { BK4819_FilterBandwidth_t Bandwidth; - uint16_t Status; uint16_t InterruptMask; uint32_t Frequency; GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); + gEnableSpeaker = false; BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_GREEN, false); @@ -521,17 +520,18 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) Bandwidth = gRxVfo->CHANNEL_BANDWIDTH; if (Bandwidth != BK4819_FILTER_BW_WIDE) Bandwidth = BK4819_FILTER_BW_NARROW; - BK4819_SetFilterBandwidth(Bandwidth); BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, false); + BK4819_SetupPowerAmplifier(0, 0); + BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1, false); while (1) { - Status = BK4819_ReadRegister(BK4819_REG_0C); - if ((Status & 1U) == 0) // INTERRUPT REQUEST + const uint16_t Status = BK4819_ReadRegister(BK4819_REG_0C); + if ((Status & 1u) == 0) // INTERRUPT REQUEST break; BK4819_WriteRegister(BK4819_REG_02, 0); @@ -559,8 +559,12 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) gRxVfo->SquelchCloseNoiseThresh, gRxVfo->SquelchCloseGlitchThresh, gRxVfo->SquelchOpenGlitchThresh); + BK4819_PickRXFilterPathBasedOnFrequency(Frequency); + BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, true); + + // AF Rx Gain and DAC BK4819_WriteRegister(BK4819_REG_48, 0xB3A8); InterruptMask = 0 | BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; @@ -571,11 +575,8 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) { if (!gRxVfo->IsAM) { - uint8_t CodeType; - uint8_t Code; - - CodeType = gSelectedCodeType; - Code = gSelectedCode; + uint8_t CodeType = gSelectedCodeType; + uint8_t Code = gSelectedCode; if (gCssScanMode == CSS_SCAN_MODE_OFF) { CodeType = gRxVfo->pRX->CodeType; @@ -655,6 +656,8 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) BK4819_EnableDTMF(); InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND; } + + // enable/disable BK4819 interrupts BK4819_WriteRegister(BK4819_REG_3F, InterruptMask); FUNCTION_Init(); diff --git a/radio.h b/radio.h index 20ffca9..9dc48ab 100644 --- a/radio.h +++ b/radio.h @@ -48,7 +48,8 @@ enum PTT_ID_t { typedef enum PTT_ID_t PTT_ID_t; #if 0 - enum STEP_Setting_t { + enum STEP_Setting_t + { STEP_2_5kHz, STEP_5_0kHz, STEP_6_25kHz, @@ -58,7 +59,8 @@ typedef enum PTT_ID_t PTT_ID_t; STEP_8_33kHz, }; #else - enum STEP_Setting_t { + enum STEP_Setting_t + { STEP_1_25kHz, STEP_2_5kHz, STEP_6_25kHz, @@ -71,7 +73,8 @@ typedef enum PTT_ID_t PTT_ID_t; typedef enum STEP_Setting_t STEP_Setting_t; -enum VfoState_t { +enum VfoState_t +{ VFO_STATE_NORMAL = 0, VFO_STATE_BUSY, VFO_STATE_BAT_LOW, @@ -156,4 +159,3 @@ void RADIO_PrepareCssTX(void); void RADIO_SendEndOfTransmission(void); #endif - diff --git a/ui/helper.c b/ui/helper.c index 8adfee0..543170f 100644 --- a/ui/helper.c +++ b/ui/helper.c @@ -92,50 +92,49 @@ void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_ #if 0 { // 5x7 font + const unsigned int char_width = ARRAY_SIZE(gFont5x7[0]); + const unsigned int char_spacing = char_width + 1; + uint8_t *pFb = gFrameBuffer[Line] + Start; for (i = 0; i < Length; i++) { if (pString[i] >= 32) { const unsigned int Index = ((unsigned int)pString[i] - 32); if (Index < ARRAY_SIZE(gFont5x7)) - { - const unsigned int ofs = (unsigned int)Start + (i * 6); - memcpy(gFrameBuffer[Line] + ofs, &gFont5x7[Index], ARRAY_SIZE(gFont5x7[Index])); - } + memcpy(pfB + (i * char_spacing), &gFont5x7[Index], char_width); } } } - #else - { // 6x8 font + #elif 1 + { // 5x8 font + const unsigned int char_width = ARRAY_SIZE(gFont5x8[0]); + const unsigned int char_spacing = char_width + 1; + uint8_t *pFb = gFrameBuffer[Line] + Start; for (i = 0; i < Length; i++) { if (pString[i] >= 32) { const unsigned int Index = (unsigned int)pString[i] - 32; - if (Index < ARRAY_SIZE(gFont6x8)) - { - const unsigned int ofs = (unsigned int)Start + (i * 7); - memcpy(gFrameBuffer[Line] + ofs, &gFont6x8[Index], ARRAY_SIZE(gFont6x8[Index])); - } + if (Index < ARRAY_SIZE(gFont5x8)) + memcpy(pFb + (i * char_spacing), &gFont5x8[Index], char_width); } } } -/* - { // 8x8 font + #else + { // 8x8 font .. not yet working + const unsigned int char_width = ARRAY_SIZE(gFont8x8[0]); + const unsigned int char_spacing = char_width + 1; + uint8_t *pFb = gFrameBuffer[Line] + Start; for (i = 0; i < Length; i++) { if (pString[i] >= 32) { const unsigned int Index = (unsigned int)pString[i] - 32; if (Index < ARRAY_SIZE(gFont8x8)) - { - const unsigned int ofs = (unsigned int)Start + (i * 8); - memcpy(gFrameBuffer[Line] + ofs, &gFont8x8[Index], 8); - } + memcpy(pFb + (i * char_spacing), &gFont8x8[Index], char_width); } } } -*/ #endif } diff --git a/ui/lock.c b/ui/lock.c index b45b794..4856f69 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -15,6 +15,7 @@ */ #include + #include "ARMCM0.h" #include "app/uart.h" #include "audio.h" diff --git a/ui/main.c b/ui/main.c index 17ee218..9fc29cb 100644 --- a/ui/main.c +++ b/ui/main.c @@ -43,11 +43,13 @@ void UI_DisplayMain(void) return; } -//#ifndef SINGLE_VFO_CHAN +// #ifdef SINGLE_VFO_CHAN +// const bool single_vfo = (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF && gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? true : false; +// #else + const bool single_vfo = false; +// #endif + for (vfo_num = 0; vfo_num < 2; vfo_num++) -//#else -// vfo_num = 0; -//#endif { uint8_t Channel = gEeprom.TX_CHANNEL; bool bIsSameVfo = !!(Channel == vfo_num); @@ -55,7 +57,17 @@ void UI_DisplayMain(void) uint8_t *pLine0 = gFrameBuffer[Line + 0]; uint8_t *pLine1 = gFrameBuffer[Line + 1]; uint32_t frequency_Hz = 0; + + if (single_vfo) + { + if (!bIsSameVfo) + continue; // skip the unused vfo .. screen is dedicated to just a single VFO + //Line = 1; + //pLine0 = gFrameBuffer[Line + 0]; + //pLine1 = gFrameBuffer[Line + 1]; + } + if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) Channel = gEeprom.RX_CHANNEL; @@ -67,73 +79,53 @@ void UI_DisplayMain(void) if (!gDTMF_InputMode) { + memset(Contact, 0, sizeof(Contact)); if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) - { - if (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) - strcpy(String, "CALL OUT(RSP)"); - else - strcpy(String, "CALL OUT"); - } + strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT"); else if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) - { - if (DTMF_FindContact(gDTMF_Caller, Contact)) - sprintf(String, "CALL:%s", Contact); - else - sprintf(String, "CALL:%s", gDTMF_Caller); - } + sprintf(String, "CALL:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller); else if (gDTMF_IsTx) - { - if (gDTMF_State == DTMF_STATE_TX_SUCC) - strcpy(String, "DTMF TX(SUCC)"); - else - strcpy(String, "DTMF TX"); - } + strcpy(String, (gDTMF_State == DTMF_STATE_TX_SUCC) ? "DTMF TX(SUCC)" : "DTMF TX"); } else sprintf(String, ">%s", gDTMF_InputBox); - UI_PrintString(String, 2, 127, vfo_num * 3, 8, false); memset(String, 0, sizeof(String)); - memset(Contact, 0, sizeof(Contact)); - if (!gDTMF_InputMode) { + memset(Contact, 0, sizeof(Contact)); if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) { - if (DTMF_FindContact(gDTMF_String, Contact)) - sprintf(String, ">%s", Contact); - else - sprintf(String, ">%s", gDTMF_String); + sprintf(String, ">%s", (DTMF_FindContact(gDTMF_String, Contact)) ? Contact : gDTMF_String); } else if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) { - if (DTMF_FindContact(gDTMF_Callee, Contact)) - sprintf(String, ">%s", Contact); - else - sprintf(String, ">%s", gDTMF_Callee); + sprintf(String, ">%s", (DTMF_FindContact(gDTMF_Callee, Contact)) ? Contact : gDTMF_Callee); } else if (gDTMF_IsTx) sprintf(String, ">%s", gDTMF_String); } - UI_PrintString(String, 2, 127, 2 + (vfo_num * 3), 8, false); + continue; } - if (bIsSameVfo) + // highlight the selected/used VFO with a marker + if (!single_vfo && bIsSameVfo) memcpy(pLine0 + 2, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); } else - { + if (!single_vfo) + { // highlight the selected/used VFO with a marker if (bIsSameVfo) memcpy(pLine0 + 2, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); - else - memcpy(pLine0 + 2, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); + //else + //memcpy(pLine0 + 2, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); } // 0x8EE2 @@ -149,29 +141,23 @@ void UI_DisplayMain(void) else #endif { - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) - Channel = gEeprom.RX_CHANNEL; - else - Channel = gEeprom.TX_CHANNEL; - + Channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; if (Channel == vfo_num) - { + { // show the TX symbol SomeValue = 1; memcpy(pLine0 + 14, BITMAP_TX, sizeof(BITMAP_TX)); } } } else - { + { // show the RX symbol SomeValue = 2; - if ((gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) && gEeprom.RX_CHANNEL == vfo_num) memcpy(pLine0 + 14, BITMAP_RX, sizeof(BITMAP_RX)); } - // 0x8F3C if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) - { + { // show the mrmory channel number memcpy(pLine1 + 2, BITMAP_M, sizeof(BITMAP_M)); if (gInputBoxIndex == 0 || gEeprom.TX_CHANNEL != vfo_num) NUMBER_ToDigits(gEeprom.ScreenChannel[vfo_num] + 1, String); @@ -181,7 +167,7 @@ void UI_DisplayMain(void) } else if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num])) - { + { // show the frequency band number char c; memcpy(pLine1 + 14, BITMAP_F, sizeof(BITMAP_F)); c = (gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST) + 1; @@ -189,7 +175,9 @@ void UI_DisplayMain(void) } else { + // show the 'N' narrow band symbol memcpy(pLine1 + 7, BITMAP_NarrowBand, sizeof(BITMAP_NarrowBand)); + if (gInputBoxIndex == 0 || gEeprom.TX_CHANNEL != vfo_num) { NUMBER_ToDigits((gEeprom.ScreenChannel[vfo_num] - NOAA_CHANNEL_FIRST) + 1, String); @@ -209,16 +197,13 @@ void UI_DisplayMain(void) #ifndef DISABLE_ALARM if (gCurrentFunction == FUNCTION_TRANSMIT && gAlarmState == ALARM_STATE_ALARM) { - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) - Channel = gEeprom.RX_CHANNEL; - else - Channel = gEeprom.TX_CHANNEL; + Channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; if (Channel == vfo_num) State = VFO_STATE_ALARM; } #endif - if (State) + if (State != VFO_STATE_NORMAL) { uint8_t Width = 10; @@ -226,23 +211,23 @@ void UI_DisplayMain(void) switch (State) { - case 1: + case VFO_STATE_BUSY: strcpy(String, "BUSY"); Width = 15; break; - case 2: + case VFO_STATE_BAT_LOW: strcpy(String, "BAT LOW"); break; - case 3: + case VFO_STATE_TX_DISABLE: strcpy(String, "DISABLE"); break; - case 4: + case VFO_STATE_TIMEOUT: strcpy(String, "TIMEOUT"); break; - case 5: + case VFO_STATE_ALARM: strcpy(String, "ALARM"); break; - case 6: + case VFO_STATE_VOL_HIGH: sprintf(String, "VOL HIGH"); Width = 8; break; @@ -251,7 +236,7 @@ void UI_DisplayMain(void) UI_PrintString(String, 31, 111, vfo_num * 4, Width, true); } else - { + { // normal state if (gInputBoxIndex && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_CHANNEL == vfo_num) { UI_DisplayFrequency(gInputBox, 31, vfo_num * 4, true, false); @@ -260,23 +245,17 @@ void UI_DisplayMain(void) { if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { + frequency_Hz = gEeprom.VfoInfo[vfo_num].pRX->Frequency; if (gCurrentFunction == FUNCTION_TRANSMIT) - { - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) - Channel = gEeprom.RX_CHANNEL; - else - Channel = gEeprom.TX_CHANNEL; + { // transmitting + Channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; if (Channel == vfo_num) frequency_Hz = gEeprom.VfoInfo[vfo_num].pTX->Frequency; - else - frequency_Hz = gEeprom.VfoInfo[vfo_num].pRX->Frequency; } - else - frequency_Hz = gEeprom.VfoInfo[vfo_num].pRX->Frequency; switch (gEeprom.CHANNEL_DISPLAY_MODE) { - case MDF_FREQUENCY: + case MDF_FREQUENCY: // show the channel frequency NUMBER_ToDigits(frequency_Hz, String); // show the first lot of the frequency digits @@ -296,13 +275,13 @@ void UI_DisplayMain(void) frequency_Hz = 0; break; - case MDF_CHANNEL: + case MDF_CHANNEL: // show the channel number sprintf(String, "CH-%03d", gEeprom.ScreenChannel[vfo_num] + 1); UI_PrintString(String, 31, 112, vfo_num * 4, 8, true); frequency_Hz = 0; break; - case MDF_NAME: + case MDF_NAME: // show the channel name if (gEeprom.VfoInfo[vfo_num].Name[0] == 0 || gEeprom.VfoInfo[vfo_num].Name[0] == 0xFF) { // channel number sprintf(String, "CH-%03d", gEeprom.ScreenChannel[vfo_num] + 1); @@ -316,7 +295,7 @@ void UI_DisplayMain(void) break; #ifdef CHAN_NAME_FREQ - case MDF_NAME_FREQ: + case MDF_NAME_FREQ: // show the channel name and frequency if (gEeprom.VfoInfo[vfo_num].Name[0] == 0 || gEeprom.VfoInfo[vfo_num].Name[0] == 0xFF) { // channel number sprintf(String, "CH-%03d", gEeprom.ScreenChannel[vfo_num] + 1); @@ -334,96 +313,92 @@ void UI_DisplayMain(void) } else { + frequency_Hz = gEeprom.VfoInfo[vfo_num].pRX->Frequency; if (gCurrentFunction == FUNCTION_TRANSMIT) - { - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) - Channel = gEeprom.RX_CHANNEL; - else - Channel = gEeprom.TX_CHANNEL; + { // transmitting + Channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_CHANNEL : gEeprom.TX_CHANNEL; if (Channel == vfo_num) frequency_Hz = gEeprom.VfoInfo[vfo_num].pTX->Frequency; - else - frequency_Hz = gEeprom.VfoInfo[vfo_num].pRX->Frequency; } - else - frequency_Hz = gEeprom.VfoInfo[vfo_num].pRX->Frequency; NUMBER_ToDigits(frequency_Hz, String); // 8 digits + + // show main part of frequency UI_DisplayFrequency(String, 31, vfo_num * 4, false, false); + // show the remaing 2 small frequency digits + UI_DisplaySmallDigits(2, String + 6, 112, Line + 1); if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { const uint8_t Attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; - if (Attributes & MR_CH_SCANLIST1) memcpy(pLine0 + 113, BITMAP_ScanList, sizeof(BITMAP_ScanList)); - if (Attributes & MR_CH_SCANLIST2) memcpy(pLine0 + 120, BITMAP_ScanList, sizeof(BITMAP_ScanList)); } - - UI_DisplaySmallDigits(2, String + 6, 112, Line + 1); frequency_Hz = 0; } } } - // 0x926E - uint8_t Level = 0; + { // show the TX/RX level - if (SomeValue == 1) - { - if (gRxVfo->OUTPUT_POWER == OUTPUT_POWER_LOW) - Level = 2; + uint8_t Level = 0; + + if (SomeValue == 1) + { // TX power level + switch (gRxVfo->OUTPUT_POWER) + { + case OUTPUT_POWER_LOW: + Level = 2; + break; + case OUTPUT_POWER_MID: + Level = 4; + break; + case OUTPUT_POWER_HIGH: + Level = 6; + break; + } + } else - if (gRxVfo->OUTPUT_POWER == OUTPUT_POWER_MID) - Level = 4; - else - Level = 6; + if (SomeValue == 2) + { // RX signal level + if (gVFO_RSSI_Level[vfo_num]) + Level = gVFO_RSSI_Level[vfo_num]; + } + + if (Level >= 1) + { + memcpy(pLine1 + 128 + 0, BITMAP_Antenna, sizeof(BITMAP_Antenna)); + memcpy(pLine1 + 128 + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); + if (Level >= 2) + memcpy(pLine1 + 128 + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); + if (Level >= 3) + memcpy(pLine1 + 128 + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3)); + if (Level >= 4) + memcpy(pLine1 + 128 + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4)); + if (Level >= 5) + memcpy(pLine1 + 128 + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5)); + if (Level >= 6) + memcpy(pLine1 + 128 + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6)); + } } - else - if (SomeValue == 2) - { - if (gVFO_RSSI_Level[vfo_num]) - Level = gVFO_RSSI_Level[vfo_num]; - } - - // show TX power level - if (Level >= 1) - { - memcpy(pLine1 + 128 + 0, BITMAP_Antenna, sizeof(BITMAP_Antenna)); - memcpy(pLine1 + 128 + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); - if (Level >= 2) - memcpy(pLine1 + 128 + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); - if (Level >= 3) - memcpy(pLine1 + 128 + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3)); - if (Level >= 4) - memcpy(pLine1 + 128 + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4)); - if (Level >= 5) - memcpy(pLine1 + 128 + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5)); - if (Level >= 6) - memcpy(pLine1 + 128 + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6)); - } - - // 0x931E + if (gEeprom.VfoInfo[vfo_num].IsAM) - { + { // show the AM symbol memcpy(pLine1 + 128 + 27, BITMAP_AM, sizeof(BITMAP_AM)); } else - { - const FREQ_Config_t *pConfig; - - pConfig = (SomeValue == 1) ? gEeprom.VfoInfo[vfo_num].pTX : gEeprom.VfoInfo[vfo_num].pRX; - + { // show the CTCSS or DCS symbol + const FREQ_Config_t *pConfig = (SomeValue == 1) ? gEeprom.VfoInfo[vfo_num].pTX : gEeprom.VfoInfo[vfo_num].pRX; switch (pConfig->CodeType) { - case CODE_TYPE_CONTINUOUS_TONE: + case CODE_TYPE_CONTINUOUS_TONE: // CTCSS memcpy(pLine1 + 128 + 27, BITMAP_CT, sizeof(BITMAP_CT)); break; case CODE_TYPE_DIGITAL: - case CODE_TYPE_REVERSE_DIGITAL: + case CODE_TYPE_REVERSE_DIGITAL: // DCS memcpy(pLine1 + 128 + 24, BITMAP_DCS, sizeof(BITMAP_DCS)); break; default: @@ -431,9 +406,8 @@ void UI_DisplayMain(void) } } - // 0x936C switch (gEeprom.VfoInfo[vfo_num].OUTPUT_POWER) - { + { // show the TX power symbol case OUTPUT_POWER_LOW: memcpy(pLine1 + 128 + 44, BITMAP_PowerLow, sizeof(BITMAP_PowerLow)); break; @@ -446,22 +420,26 @@ void UI_DisplayMain(void) } if (gEeprom.VfoInfo[vfo_num].ConfigRX.Frequency != gEeprom.VfoInfo[vfo_num].ConfigTX.Frequency) - { + { // show the TX offset symbol if (gEeprom.VfoInfo[vfo_num].FREQUENCY_DEVIATION_SETTING == FREQUENCY_DEVIATION_ADD) memcpy(pLine1 + 128 + 54, BITMAP_Add, sizeof(BITMAP_Add)); if (gEeprom.VfoInfo[vfo_num].FREQUENCY_DEVIATION_SETTING == FREQUENCY_DEVIATION_SUB) memcpy(pLine1 + 128 + 54, BITMAP_Sub, sizeof(BITMAP_Sub)); } + // show the TX/RX reverse symbol if (gEeprom.VfoInfo[vfo_num].FrequencyReverse) memcpy(pLine1 + 128 + 64, BITMAP_ReverseMode, sizeof(BITMAP_ReverseMode)); + // show the narrow band symbol if (gEeprom.VfoInfo[vfo_num].CHANNEL_BANDWIDTH == BANDWIDTH_NARROW) memcpy(pLine1 + 128 + 74, BITMAP_NarrowBand, sizeof(BITMAP_NarrowBand)); + // show the DTMF decoding symbol if (gEeprom.VfoInfo[vfo_num].DTMF_DECODING_ENABLE || gSetting_KILLED) memcpy(pLine1 + 128 + 84, BITMAP_DTMF, sizeof(BITMAP_DTMF)); + // show the audio scramble symbol if (gEeprom.VfoInfo[vfo_num].SCRAMBLING_TYPE && gSetting_ScrambleEnable) memcpy(pLine1 + 128 + 110, BITMAP_Scramble, sizeof(BITMAP_Scramble));