From 2d8c4787bf8caad0af046ea94f5e7aa8020804ad Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Sun, 10 Sep 2023 05:49:39 +0100 Subject: [PATCH] Channel frequency can be shown with name --- Makefile | 1 + README.md | 2 + driver/st7565.c | 5 +- firmware | Bin 167616 -> 167812 bytes firmware.bin | Bin 55504 -> 56332 bytes firmware.packed.bin | Bin 55522 -> 56350 bytes font.c | 105 +++++++++++++++++++ font.h | 2 + font5x7.png | Bin 0 -> 27909 bytes misc.c | 10 +- ui/helper.c | 112 +++++++++++++++----- ui/helper.h | 2 + ui/main.c | 243 +++++++++++++++++++++++--------------------- ui/rssi.c | 49 +++++---- version.c | 2 +- win_make.bat | 2 +- 16 files changed, 369 insertions(+), 166 deletions(-) create mode 100644 font5x7.png diff --git a/Makefile b/Makefile index 1ff162f..44887a6 100644 --- a/Makefile +++ b/Makefile @@ -96,6 +96,7 @@ CFLAGS += -DDISABLE_VOICE CFLAGS += -DDISABLE_AIRCOPY CFLAGS += -DKEEP_MEM_NAME CFLAGS += -DDISABLE_ALARM +CFLAGS += -DCHAN_NAME_FREQ #CFLAGS += -DBAND_SCOPE ifeq ($(DEBUG),1) diff --git a/README.md b/README.md index 8b012f9..1e388e9 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ You can edit those changes by (currently) editing the MakeFile, look for these l * CFLAGS += -DDISABLE_AIRCOPY .. remove AIRCOPY option * CFLAGS += -DKEEP_MEM_NAME .. maintain the memory channel's name when re-saving the memory channel * CFLAGS += -DDISABLE_ALARM .. remove the ALARM transmit option from the firmware +* CFLAGS += -DCHAN_NAME_FREQ .. show the channel frequency (as well as channel number/name) * #CFLAGS += -DBAND_SCOPE .. not yet implemented To enable the custom option just uncomment the line by removing the starting '#'. @@ -25,6 +26,7 @@ To enable the custom option just uncomment the line by removing the starting '#' * Battery voltage boot screen now includes the percentage (as well as voltage). * Slightly less intense menu style. * AM RX allowed everywhere. Although the radio really doesn't do AM, the adverts are a con ! +* Finer RSSI bar steps * "MEM-CH" and "DEL-CH" menus now include channel name * "STEP" menu, added 1.25kHz option, removed 5kHz option diff --git a/driver/st7565.c b/driver/st7565.c index ee37138..da9685f 100644 --- a/driver/st7565.c +++ b/driver/st7565.c @@ -30,7 +30,9 @@ void ST7565_DrawLine(uint8_t Column, uint8_t Line, uint16_t Size, const uint8_t uint16_t i; SPI_ToggleMasterMode(&SPI0->CR, false); + ST7565_SelectColumnAndLine(Column + 4U, Line); + GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_A0); if (!bIsClearMode) @@ -87,7 +89,8 @@ void ST7565_BlitFullScreen(void) } void ST7565_BlitStatusLine(void) -{ +{ // the top small text line on the display + unsigned int i; SPI_ToggleMasterMode(&SPI0->CR, false); diff --git a/firmware b/firmware index f951f327704769aa4dc8278ea31b0827d0373c2b..1b34bcb1021287305218908d244cad5beb7375b4 100644 GIT binary patch delta 18111 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 B_U-@x delta 16961 zcmZ{r30zdw`~S~#n1K-i5jQq*W&j075k+y|aAO!Xmn`=zGjS`*`iiBES(cf(p&gVm zP5mlriYQHKm@RH)Hj`Oun^{JCQ{VCq!z{ngnI*3MU;nAYx$o!f&w0*zuTQ-kee$K~ z^?K56Fr*KxzQmYxS|)#l|KyL$KYA(GM=Y>uQ3G+NX~ zQm5X1e3~?7FaAERqQw?wtg=KqQ++Ip*~f$=EIr!UN=h8oYjIm!R5Cp?Gf6#&K!U1^=&ppJ3U?v zYwmm|5TkWP8^n0Fff<)uf}vNuEUTBDdgu}7kwBb;idI{qo$o>(VP_f9m6RV{9$(2! zcQ~Renwy;Ys-k8iqx&s!>sz3h9Y_#m4>oEp8uhAI+>D}*e5F^U=_o6Ho+qv{uUk^7 zo<$p?onJPJJ9KnUixjVvMpq=28d$V5SDew&tH#=kjQRb)``-xq)&uYl!_EHi!y#~Q zC!Vss(2V9q@{&_F9#1X}U+uMdTGRItysXjoT_P0`zvvdZ$@D!%+1jMgU7Q~{W&2Ni z8b&SKHpbV**G4;yAwSagK^lG8j2~&V?aLw!@kbj(bv6}8wf1K*opYR^9NHXp+DCe= z^H=dw4t*XqF#t=2)kN7eM^u?;5cfBTpG>rX;>Dev$wCLj&d$^&>Tsh>W*47zrattD zXxW9jQn?t?h30qo*)^ba&u#t6m?^>@>C`l^^nRtg{^4rzK^JPDGTmKiAw!4KO_s|` zw9d3ZZUel%S(J0EEh3lZ6Xl2px>8CzyPu_}mkt}1j{G9+ESK3+zR^1W5Iee3Iz1px zb*1c1MmOpElpz~;dYRuu4w-_|O{KEr{8Ftm+9NC5&DJK5<`9|0vTk&wd8LOTioPt$ z*~8YaJ4)n_du)62Nk_4J{Q44&^JYL9U)t(=(0*#(p;7Dfx*77}Vo?E^(gwPtoIkkt zSW?SaXJ-H7T2>ilwX$ooT3(KFZuf{c3+O6;+HI@oMe{iIwMF!$UYuSK{rXcr|I}+M z?N0?fp|6jn=a)V>CLgV925o)i6R!`XRs66|6b_>M_%ff^H;87^C|mQv6h-_`43;4@ zo~DR7L#Vy}15bLH#?;(S{m7)dGS!lTY&3S}{LD}KNau2|*foUo^qDv{gc`ZkWqYTP z22zV87wNe{<7@+8hT%#>t6&@}itQ#o;1a z)bRvt{q^QdzgNffG0{vv7OpvFqEnEch3gIZg^QxtOzyTa?(GO?@sWdN*e;|ybx}+y zroJ>(Y%WHp3=%^u)E-s8%R*=9oai))KBKn6KZ-6=YjJTj&F9-ZV(=Jf`n*e&jiEJs zj>{H#8#zgKfom+yBbsKLHJ;`Y&%Y!tOrRCiT#UP&YI&(w=qA!AY9%I4gozi3brWe( zvy&cf=*_sZwP=0^S@;Q$m~;o#&_U7sPMSbtYulTh}8MiD=m z3TUhtIhmFvO!mju70HIx_RPBbvexN$+diEv$LD&t?TaboCfX!En?^q;Yn%`G$(U#9 zW=<~cX5rnFOY@4Td!%!_TYNE{x|2(^m_b*lMEp2|Qs@n#y^AK&y<+NJw3z-UF5X3p z+P~q-n|Y`{H|x41nXzk>-eOF*5?#{C8UxzE#jKe$QloM1@!Jm0q%{Q9^}C0%`6bNm z_t1L2!Y5q!P=89d^_)eAsl`!mepy#jgu}0V=8kld`1@YkO~XXxY&sr$*vpJFOIxz# zHRL=mX59y4ul9%+?}Jf{5nta&J!z3>Glz~)k~lX9)jTaal+d_l-*~&R-i(}I+Ln}1 z1knVsY%V3Wi1wOFNPo5cr;A^FlALqJ?z!}C)D4Vca%#i_^QcX?I*-1DoH3qX>syS{ zmpo}bV~V*#&YFOfJjRkJ%X;gUC6vyc?#6HGxpR)FokxNnJ0-@pCY%i(k;V#L;8InyZ}$%c*K+? zX_m9ylSl*vqN*z*(8J%44IO$jIk(irXuykw|8s~ppCA`iirN*FNvp)?D=;Pw3S|YQ z&))0Nmqu2X))`orL^5VEeYXZ>qc@8gSbQECm)E3&R|i-hU;}tXfb#;J0e&>Vg9B^? zKNR4x0nP-^6V@jwv%T!2nSp*{%vGylajYFIW|*-((>TfY_LDT7XshV3lK$qs?V|0| zG>x2M(bEwBARJFqw@x#CXFA7U*0aC!80n1NFrXTgZH?X7Ad8+(CUT>$o0M!8+0W2h zG)?^Y483g4Xk>=@mPmb4sZ05vcb+As#FU>>mYB*+%uf1~H7?~IA2Vq6F6BF~>4NtVhYyj;Ic6JKt?M)ox zQl9Z1uWwi6Qf7PGftGuZ)>CiU$`QU}^)6+K?;QS?h%T$Cmv!$M#?EUP+lDQ14E*?7 zjUltBLCL{Vo?#)D2$eN>(nrnue^gfDomDb*Zeoc`dCu!nPWhts4a!zuSoVpR0*d_H zqlJ7e!vP=DxS(J(2k!x3hMZh@2`5f zyvb#5yIdB}h_vTuHLVm?&(TP_Q~dE9Y*{DTt)V%FzkFwr>tSzvol9~1T=geM$RzQ# zer2v-hU^kAufbyI5Or%PyKQ6xrT5pHN*k2NyybU7$hf6tU>+?MMX>tp%&geIkjEHa!cF!I0T}E?DOwrcoKYu=Y zxn;Ra+2U_DI)k#YmZ8J_x*k!MT{XI%FBbmo=v8-e#6_&ya?QD{Y9kFX zDDzvfVI5^B&GAPe;+0TDCjwViKaSvc#Km=3bq9*r_1KAKi(cz#XuBxC&X~>k-U#Q* z4d0f`9WlO$m%9{?*sva3!JkC!ddi0$+ac zSN+@(j9kj=KAER%-`Iw9wmKB&A;d{6O=oLDJkKu%Z=lu~xf3@~m*!9UvN5U3L@DC= z4b)RN%cq5rUb`sX-$2DFI~sS^M0I54o!F=8wxKEHPs9w&c$G^@5M4J?zaA}oF_!id z&vgFtGOLv8<$F^p!nwoscX|q4OOz3PUaf^!T}y;iRL~g@004 z`Ncz?OcBUfZKChd(fq@AH%(f{gm^OMWknyEYAt0=7T z3>uUd!So8c{desC-0+?7*(Z!u!A_*jNPE$O3*cJ9RfALEUq-w`cuvQ2d?%L5u0W70 zp*G$U%>o->M;wY$l=EW#X6ngvKM}8Nrh=iH-AcVbC&CeF=FXx1KkBKw*8FkJpY<|F znMq${QV2HyPN_|0y8S6-I8~Q7+uxxqj?qT$%o8aukl8xjXJC;QT{oREkDW{8&WS!& zNj?3EHxsYd%Vv#yAI+&Q_Ey_flQM6qT{$T5}EA9v&@3|kX-?G`{mmAZ& zBet@fPwZ@KipHY9}74AX7{7-DXKH zV>uo>GbUpS^^3z04^}OCBcV6;d!_!7K0M8$J2f+5Y zvx6@>9rgw5YSs@6(q_MMU3Az&y`oS1TuOo8rEtHPxrH)@zTLRH-mlE_r=nDCPRbPq z-SevCQlE0W=U!u?<@1sWL;2S7LXCs;US(gSY?{s(Z9pvNgE)r$4JWPhhP0ZnUTrwmzt4k(5-jcB_js2*#h?U_2 z#J*+8x|)TJ*SYBh2U&*;7Bj9&078ecs23^K;o9{Ci9r>mX{lyIal&av5I zO(`Q&e@A6eT$Nk7S;=}7sy za!uvBQIxMKZ&o?1C*?OQkEk4$A5s3CMO#i?nd7l~>a@C^qxxH}KQk(>O3&QNZtqHS z+&(ndVMLV_rNFhzTF*^7#}i}Xs`3zFv$s3c@|L}>{z0h&(+T?{#jn?kLajqvS&^zU zmSL#ocorj!Ok*6=EL$IEIYo}jCCnJP@#VrOhqmHDbA0!>Jnn4gq4Y>pkqT1E&X~qu z))^O=x2JMvbI<%h&Jp&}md}?QFSHJ@Ybv9w63Zyhr}S%#HR$#>OU!4{#t3XRn)#Yl zrj$jMW838T^qQO}r6T)#qAH?|)LWZ1^D;RHxu?v1;K4hmnRs^qfOi>8)+u;`Eaynxl1Jk}OQGO&#g7-_?Cmex)7@UNaF*Rlh_ zsh()#@AaL`F1VX;e+5Rq94SMwK^cXSGa2q67&EQ@0gR%taMhUd+Jf)Ito$Fihv5p~ zDiC)P{8{iHgqworYO9v%^WYW&9))l&{7t7BlMB{T`1iue;kgF>0ysG_PlG=S?nT7k z0apcg814<}Q1P2e3^oSk^_t4$veyFonPP9nf|{Lp`A9%h%zolpRAmQ48&+OjMCr$v zUpeZDtRxJmH?JKKzrRFD);;Fs(ErbFJ&Q2zHm}6<4L9X7$G&S)vctRzk}upGk{tob zHuH0kTy#f3QW21BHLr!_eYXaZbpeSmZ-C@&w-%D81Cny{CP-d)Td$qTnSc2i%a&zP z8z{Sk?cyC#8<=)`^QL1VI+R#SgiTaRO@(;3;ulI|T0_1|Z)9(fUECm8knyv8e!*oZtQpz~t68kI-o zv+`17KKr3wO&ts$d@nDf2$u!7S+-($yjX9V`%-;mB{yjty2`XNd5<@|KB6*ZnY^%y zF-|b+t*kOH_L}UI*=TRd5;D!QbKGlbF*p*8qs$ekf0`Rf9wpOcJ2y?SqqPp5aim$# z4j?SvZ7SJUQeN1~jyNb<>yU$Lu=zEFahVR&XHeEZAami6QTZtHu*-P8&DN8M_#1>N zkA)NWFuxDkcT%<#x0x8!a+Z<_5{+HWpCIg0gnf=onB%@1odcoFarX^b;cWA72tVC0 z<%Vf)MSYC1qj@dHaYyrB{LM7)u9s&s-HnV;npQWAR!cgjcvz$(`i8-*yYUvxJG@fK zVIX(=uVEM*fvbjl6>cBg9=Kg_atKYwIDG#UV{$L^8+<#Q8!j2)32?W=$)U6vdG&z5 z9=;L&b;QZ$c!-9R16U5+706^goLnZyj*<(do^7b+&O>7J4jM#<#HAfHx~ET>;7Tw= zrW;^TbBFmAW8?h5C8W-nV>T6G`_UjLQa#q;2@P3gJ+o$9X3hoT&R6IO>$?ud@-#S& z<7{>q?nM-S4`!2ocyDpeGOwg!8h7@@s&vLePH%&J4{#cNeN)-sp^jb4=!Gs_nLX!v z=AeA6(cMu56MiMaJ->vRTG-_}-Q94!h+dFVSA#aduZP&#U@D6dckU!Zo0d2z1(OG@ zS<}z2Toljmr1ZGA5zAnTbG(9PC@yhgC$)_|1ep=CO2}@AZ+7Aw`;utbN$qE+y4IVU z?UVIuhQ%nDSukUnr4{L}rbXn?m26WB$NUllyIkW{2K%$h<{Gnm4^68W!t)HtEM3>l zuQYe(mZc5+Uk#a(FV8FS=P-NBbv=93d{g;CJhls$4CV%$fg4(4+cCf7{=kWnoRj?v zix)ys22r;Q#ZMRC?4mZbO(?sleRQ^edhv7w{^1g7yD6htp?_lW9pJ0NvYXb$?eonq zA$GM!k7=>YC4SgVJ**WtKA`UheFh6KphGg@euEi)0CvF18_YELtsqN*%Y^F!_c$!) zQMf$Bm)mK%d|W_YkF`EH@|#DW8uT?}^>8s~87o7apYbdY>07tR-y4G#LI$(%p#P)f z+f}u$?*>{RkoNy4BFYoPS@;c~h-3eyNo{`cudpPRvaCqV1Ix^vyXkS2xJh){L!Fw% z_#P?#kA*ou5qIvvyNOT5GmysI?!Cv%ne3ziZgFf6Zq@dSFZWOvzR@dU_EKWf9GnO9 zSo10co5(z-%j38niUsWy1NPEntKRRtp-ZPua?{$~z|v8m;1~mi{-3O8a^fz3oMgnI zLgxQQgAR5jW63y?{d`IucCXu#GzEVmCcEaL83zoJlcg=I{gQc-yCknd``TDlfjE^$oTQ8>Z= z$?aXRE?FsOjJ-VSHyn@pw6J4J0NnJyqXXvnOlO>y^)=@4jJAy)7%<@ z6faBHT#M+~YV_M!b~16SYG*XDZg|cq5tl$!kipDV@2eKdxSi*NQ(tAcLW zG2@uD7njLilU%W`jKrM0voO~&0!Nga$_^LHkUc4P*?h0IA8qm}?R+9bn%@nm?W*^O)iiyY`cjZ}p0^`)Shn5$KLL(S0-E zAB8Uuz+>@z0?&1D>hUlaayeEWhHr(dMR;^*?7f5Mm5{BwBpy0IyQC2(zDh;bIT%l$ z!ZciP6Y-oD#q_`7S%c@+c$Oy7C}(>-e+^%WWcrKne}aDo{+ICO5^)OtP^9Sw*8xsm zCv?UH{RiU6S2)Mvi+R1OfopZmeR0ZYUwoZUS=-o%L)(|)*H_8L@A8QM z9>m)KoA~h{b+x|iqs-_G^yA(n%-*z_L9J~(y1iTu8k__r$9m+f%?xddf~@r@$|GVR>qDAT;dM@#GWxC!SP zMY$bk%Lqef7w%enuf=l;ur1dIC@RpJryviZBSJ{ns z8D8bQC(kkyhI=xRdU%x4ZcXQ#4hH!Gml#`3tw*2nM;ba6VcPe1vXGHw%9HlK#>~LG zP;STlp+B?K7@$AxxHEHQmi`8XJAHpEXZ>#dNz|{{lV?o9J-SypEDl#wtB&o1Z#_|+ zPh2sE*2sL1zm?@&y^gWL&uCb(87jd`k)NvRLNmVLqV3o*daQ-5&3U{Wj+3U;WDYjp zMOw~zULUdiQ_2`v^BQBNA-4eje?o4>8`#OKo~2xJTgb!imp5$JKczIXMP4R%r^D3) zBaZUwh{BfDFj0c}VK=2SPxm|VchNB63zqRi3l4ES9V1F8NqY-(IX;F z!wa;%k0QQ!Uc)<^_vO2e3AgmmzAXy0NY~>XagX#jy(89Y zc}Jf5u6Rw0_$S{LKWTX`FL_TSNAfgY_MWY8Bp)B0kce$m@JH+yY-sR0e_K2vB$TKE z+Te=}yxzZ%z%OVM4yXc#AOJ7(4<>S73%pmd9n9iBk}qKn=J3byw!oHa;xkCTwOQMl z542u>qN%XQv{)m-84z)N<*@>V|D_7If;}ph;WJk>rI+C)Dwg3DPu?1SK*b2RvcFUU znE`vMDS^zOvx;SS4;9OB_HGD~ns^1b!rW8>nL(L~Wd=P~Hzkna zr7D);G0)u^o~mLQK1szgeTj-!41*wR&8-=fs90vOM#VCN^(vO(y~Xpnylcy`&o^Zw z#jlGGbNL`^=XJM=OI0j$drHMJ*_$es;qR$fhQGI=DL)y`u%!?Ff(BEeVuUBKT`Gah zpj5onl@BU>xct_1+yBM#;yIk}TQE$?ts#&fC!GbKwTrYop4RffztU;M=se!Rdi&<4 zM&#r7D);PpMd@?=PC-BfJ$GrV_{q4+}A{8&6AE`Y-t| zA@1+Sa})OdOa51d_$r;JjnCN9l(Ed`j>;yM6`7`D89w;MTf?uZScac{S@<$|nsw~< zrg&1Gv7?D)zUx&i!z)yL6Z)6Ou16`@A2R+)Rk)1*!>(KNTeZ815pHE?_uL|2a=RM* z5%Z$}$#~Th=*Fv!0 zA->8-*Qf49tiUfggfvy+L`Rs);Hq2Y)%(Pl9+0Q*zg5l-h{qup3wrSQ!W9Ra0%gBE ztzy|P+f^*Xcd1y0|8+q8)&rHwc(o}XDNj8pa`76Zd(pvL*-a_R2?kHly@T#&x!koXOLLVR^o`l*N?UoFxKWci1iI4ovB&RsQP zZGlW*BM!n(C_B;=Pu8>gi1j6)HSh87jvSCW%$EyH?a&~u3{Pf z-rHheZ`AwjzvQX!i2J3y$2(2wW&HK;h;357>0k0M-Vqn1{Mx_dG4Bc=r-wdp-kWLjY zU3sN-T8=ctKk8d;%I1-$@5;(Dym=xvNP0nR9&Q|bTSV4dEuKA#N z9Dc$n>=ODT?*xS7yvWv^76<$D8EtBj&r?Vz^O+jW*p??4GYZ21zF&U0a$x{}JVD+p zq85RyUu@2B+bCuXL{fR%7?%4WUx^j>q;L%679M?Cqz&R@_>d}b{~*-jw^L&6Aj}P; zPKy)pjeRi2&xcAi#Re}nu`Lc1F&NBGi@3qOFU1P;U_MKJtbA}VpTT2~h`1rVI5HAn zxlKJNW(+}A$5G)lnH3uL8?Z78i!{G#Yjxy@-WaBlDsZ5MkFjo86I_L5)jvr> zU*Z-6{eixXVD(^mT$cjLzk}s10}L)d9lc{FZXrXKn+`q&`;enY zhIauESLHt-8N*YDI{{4~L(ZlmLbvSTiAg4y4bBWLTvC@0fnRzYXNZu+tN`!cj7?jp zfS16(Lo+cUt_C}>HTfmP?}6pjN?0EsB_r_H46MeX2;U(BetP*Q9#ha?;5=20qf+py z4R8J!CxYeuPdNR3RtQ?6z@UmadlEbjgFI|K z8^PbagUJ9Dk{YN4FHvQ95S)twq47W$9S0uRYVZ}z6rE)PRHzc%7B&+M=j;$T{EKIQ_)ma$ zAA=1^qlCsj0ONH3PyEZ^0XaA(2J*8K`xb)ssuunQmUn2NJaEJ$iNmb$T;4b5FRzeMA1@8g-gQLJ2FuFw$ z^n8c0nKA?PnHBs*$EFr-22aK?8x|_y0C+Y`I$VL1;Ipb0e+2HVs=#&d-56qFqxORv zYNSzO{2NhVEVkIARSD9;@-8*3vOMrf6%PWp#6({bYLNx}2Qrm5BU^YUxC)C+cwV>< z+*6hRLtuF!y4;EcvI`!Ept&l-(_ndF99Fpi%lG}^3hf4GVh|4w6?hc9jN$wJ0CRQ@ zjBoh=G15z5`EDYd{ztHUXK4+u<30$cqYoE^GHjv8RIDm66+9hXk`W5;0v>@3<-{c$ z&>!4o9j<3W;iJHHSj@tsWG2{*xh2eHV7%zG{!^p%5Zr`O1Sg6J_7YgWX${x-0QfWt z42Qo9{tzt=R*18&z~fXE{tXtWa@-$<^1B;&IX8C5mdt4g;f{HO&1`7BF{GCdJzk+Ea z7N}4-z7S;Azl)n%+ya8}Dix-ITOzl!p#(W#r>X*d!GEdvHt;@G7u^e%-;{(k_#jxX z${!!0S=nTj3fCb*jf!`GGqL`kr=Ujmf#uus@TjN*4^d_K5%?myu&*|x0kHgr5y=Bx z_#616;m9M@Aioj)Kljn5&09h`WAgn?I6*e}Z7ddLvI2})FYq!9yYNI(3?7bI=zJ){ zN#J}{g=T}*d-jFkSCP1LDE<>xDNwD~>%j6hU(Rf@Pj`XuLZ8YO%L*I;SHWSV2KXwT zH)Fb%@n!hWU?VEP1L-3I<5hl(fTuuyZ7^K&P@ZgnH0mK)5ZnzLfMEtQ7yy1tr2z~0 zCB&BFTo!N__*DaA`Vc=Lu1v)J;1Y=S|E#hR?0N9($VP)`vYZ#ev#|oc9!jd?Gdz9xz;mD%IT%qbD~rp7sl1BzhI&d5{s_vr8Y(asJOE+g zcJ>ChR2485-18}z3p6F$IR~7K1_c$#*)s6B?da*yUUv;xz7f0^`L|@)Mr?&(3A8jR zRA3c&?wY0okArP0#oEC?-h;sxD)1ZdrPwCZa)Sq{Dj3}{_$@}*_Ko29aJUsJ?gD}Q z$EETo_pSrM-Y1%7^gF=6ss_UxaQG*;5vMi5cW+Xq()1R}@Nfahe>E5%ZUoPt2;TxO z4uuD{5mgXO9^RyZH^Jv-G$pWummF!@%YFsUM3+cglq#)8lVPwD=Ey2M7kRrpY;_jImqsx*6A5Lx4};rdmI;h8 z%)2YWGm$K)=?Jz-hNIq6F@bp*{3DjOj8OWc;D=N_djVX9Y6QbM`vLr5Q@E8iK%j?h zA$_2yq*2OOqCs23ISM>LrFpqATU>ypD>7JN6S(z1gN?J^;IXRsBf!g1AiTifn}7%T zF;TE*VXM<2Sb!GFK`lpT2{;x*>khEg$Wrj8(@pd2I`B9%DvREd;akD4HMNNC1^@UM z3Js+{2Ht(3iSb+unT-{MAIHxgQcxZRX`%R{obb0-4VQ0 z)w8|8m_`|_El|NxVEOMiP~SiUr-Fy6ZFL?5(^L^22cLU8G+1B*&w+=-FvAsm5uAxl z``Azc2PCg*T1o1_li_-Y!r#Yp1uCcsRp1BkVT=v5*&3*!3j+C7LAZv^vC9080?-SA z@b=(^25H|x?hKY+0|fh!SOGW@4G0%d1TIuHXgXN_W6p5?3&4E?j3rO@xfO!o9yquK zejZ!}lN}Z+P=JSYXyWbQD;RqHL*Z|L<>w3G0?vasV9r_^3jYEuzh;x8TTUlGfS0@n zt)u)v3x9_o7Q;#!p&VBDq>8C;nxaftGE{4AGI$o$(>;{F5G-#sM~4cS0G^;~@oaDd zY-$pQl{DHi@bkE_u!dLvwGd3i?LoLt_ka(h`dMg_Oke}Ihhc{M^gXcr-Y=~355O;B z4O$+m&{tpwTJw5{{{)Xle`SPN+Zh!iCb~}NN!Ct)UsSVkfADN*U|J~h2ylC3mKx&m zVEJ(&R*Qf-=YaRBDsw+L8O%0?~qpLvS2|(RVd%$Ug+j4{X8~{U!Jac9VK!AnoA?u>8g|+y&k)w&c6`^(0%H zCHxMZ&H4o28ErGI;pa&F`8;ondr({STHcnLjhz&H6Ly=(UdL0k6*D-C7Up$4UHi%! M&h8aYtmUo#4>*|R`2YX_ diff --git a/firmware.bin b/firmware.bin index 08b7adc32001001bd6ce02b0701df390fbfcb782..02d232ccec5c57169c426e0415ea3a376fe7ce59 100644 GIT binary patch delta 9000 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 diff --git a/firmware.packed.bin b/firmware.packed.bin index 2c2ec74125475965c16909017457e06a2c4900e0..e779e9dff8f9ab338a8ca967dbc4d38005eda9a6 100644 GIT binary patch delta 25415 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 delta 24580 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 UwV|;mFUO^EchVVfZ759ke`n~#0ssI2 diff --git a/font.c b/font.c index 1df9e4f..d78ea1c 100644 --- a/font.c +++ b/font.c @@ -142,3 +142,108 @@ const uint8_t gFontSmallDigits[11][7] = { { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00 }, }; +// ASCII 5x7 font +const uint8_t gFont5x7[5 * 16 * 6] = +{ + 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, 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, + 0x7C, 0x12, 0x11, 0x12, 0x7C, // #65 'A' + 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, + 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, + 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, + 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, + 0x3C, 0x26, 0x23, 0x26, 0x3C +}; diff --git a/font.h b/font.h index a64758c..4bba2d1 100644 --- a/font.h +++ b/font.h @@ -23,5 +23,7 @@ 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 gFont5x7[5 * 16 * 6]; + #endif diff --git a/font5x7.png b/font5x7.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb10c0d2cf4c75dd1a918ec33406da3231e3627 GIT binary patch literal 27909 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 k 9) @@ -185,14 +185,14 @@ void NUMBER_Get(char *pDigits, uint32_t *pInteger) void NUMBER_ToDigits(uint32_t Value, char *pDigits) { - uint8_t i; - + unsigned int i; for (i = 0; i < 8; i++) { const uint32_t Result = Value / 10U; pDigits[7 - i] = Value - (Result * 10U); Value = Result; } + pDigits[8] = 0; } uint8_t NUMBER_AddWithWraparound(uint8_t Base, int8_t Add, uint8_t LowerLimit, uint8_t UpperLimit) diff --git a/ui/helper.c b/ui/helper.c index b2633f4..e3c268e 100644 --- a/ui/helper.c +++ b/ui/helper.c @@ -15,6 +15,7 @@ */ #include + #include "driver/st7565.h" #include "external/printf/printf.h" #include "font.h" @@ -77,47 +78,112 @@ void UI_PrintString(const char *pString, uint8_t Start, uint8_t End, uint8_t Lin } } +void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_t Line, bool bCentered) +{ + const size_t Length = strlen(pString); + size_t i; + + if (bCentered) + Start += (((End - Start) - (Length * 8)) + 1) / 2; + + for (i = 0; i < Length; i++) + { + if (pString[i] >= 32) + { + const unsigned int Index = ((unsigned int)pString[i] - 32) * 5; + if (Index < sizeof(gFont5x7)) + { + const unsigned int ofs = (unsigned int)Start + (i * 8); + memcpy(gFrameBuffer[Line] + ofs, &gFont5x7[Index], 5); + } + } + } +} + void UI_DisplayFrequency(const char *pDigits, uint8_t X, uint8_t Y, bool bDisplayLeadingZero, bool bFlag) { - unsigned int i; - uint8_t *pFb0 = gFrameBuffer[Y] + X;; - uint8_t *pFb1 = pFb0 + 128; - bool bCanDisplay = false; - - for (i = 0; i < 3; i++) + const unsigned int char_width = 13; + uint8_t *pFb0 = gFrameBuffer[Y] + X; + uint8_t *pFb1 = pFb0 + 128; + bool bCanDisplay = false; + unsigned int i = 0; + + // MHz + while (i < 3) { - const uint8_t Digit = pDigits[i]; - - if (bDisplayLeadingZero || bCanDisplay || Digit) + const unsigned int Digit = pDigits[i++]; + if (bDisplayLeadingZero || bCanDisplay || Digit > 0) { bCanDisplay = true; - memcpy(pFb0 + (i * 13), gFontBigDigits[Digit] + 0, 13); - memcpy(pFb1 + (i * 13), gFontBigDigits[Digit] + 13, 13); + memcpy(pFb0, gFontBigDigits[Digit], char_width); + memcpy(pFb1, gFontBigDigits[Digit] + char_width, char_width); } else if (bFlag) { - pFb1 -= 6; pFb0 -= 6; + pFb1 -= 6; + } + pFb0 += char_width; + pFb1 += char_width; + } + + // decimal point + *pFb1 = 0x60; pFb0++; pFb1++; + *pFb1 = 0x60; pFb0++; pFb1++; + *pFb1 = 0x60; pFb0++; pFb1++; + + // kHz + while (i < 6) + { + const unsigned int Digit = pDigits[i++]; + memcpy(pFb0, gFontBigDigits[Digit], char_width); + memcpy(pFb1, gFontBigDigits[Digit] + char_width, char_width); + pFb0 += char_width; + pFb1 += char_width; + } +} + +void UI_DisplayFrequencySmall(const char *pDigits, uint8_t X, uint8_t Y, bool bDisplayLeadingZero) +{ + const unsigned int char_width = 7; + uint8_t *pFb = gFrameBuffer[Y] + X; + bool bCanDisplay = false; + unsigned int i = 0; + + // MHz + while (i < 3) + { + const unsigned int Digit = pDigits[i++]; + if (bDisplayLeadingZero || bCanDisplay || Digit > 0) + { + bCanDisplay = true; + memcpy(pFb, gFontSmallDigits[Digit], char_width); + pFb += char_width; } } - pFb1[0x27] = 0x60; - pFb1[0x28] = 0x60; - pFb1[0x29] = 0x60; + // decimal point + pFb++; + pFb++; + *pFb++ = 0x60; + *pFb++ = 0x60; + pFb++; - for (i = 0; i < 3; i++) + // kHz + while (i < 8) { - const uint8_t Digit = pDigits[i + 3]; - memcpy(pFb0 + (i * 13) + 42, gFontBigDigits[Digit] + 0, 13); - memcpy(pFb1 + (i * 13) + 42, gFontBigDigits[Digit] + 13, 13); + const unsigned int Digit = pDigits[i++]; + memcpy(pFb, gFontSmallDigits[Digit], char_width); + pFb += char_width; } } void UI_DisplaySmallDigits(uint8_t Size, const char *pString, uint8_t X, uint8_t Y) { - unsigned int i; - for (i = 0; i < Size; i++) - memcpy(gFrameBuffer[Y] + (i * 7) + X, gFontSmallDigits[(uint8_t)pString[i]], 7); + const unsigned int char_width = 7; + unsigned int x = X; + unsigned int i; + for (i = 0; i < Size; i++, x += char_width) + memcpy(gFrameBuffer[Y] + x, gFontSmallDigits[(unsigned int)pString[i]], char_width); } - diff --git a/ui/helper.h b/ui/helper.h index 984e2b0..13a0b9f 100644 --- a/ui/helper.h +++ b/ui/helper.h @@ -23,7 +23,9 @@ void UI_GenerateChannelString(char *pString, const uint8_t Channel); void UI_GenerateChannelStringEx(char *pString, const bool bShowPrefix, const uint8_t ChannelNumber); void UI_PrintString(const char *pString, uint8_t Start, uint8_t End, uint8_t Line, uint8_t Width, bool bCentered); +void UI_PrintStringSmall(const char *pString, uint8_t Start, uint8_t End, uint8_t Line, bool bCentered); void UI_DisplayFrequency(const char *pDigits, uint8_t X, uint8_t Y, bool bDisplayLeadingZero, bool bFlag); +void UI_DisplayFrequencySmall(const char *pDigits, uint8_t X, uint8_t Y, bool bDisplayLeadingZero); void UI_DisplaySmallDigits(uint8_t Size, const char *pString, uint8_t X, uint8_t Y); #endif diff --git a/ui/main.c b/ui/main.c index c7e9807..10cf10c 100644 --- a/ui/main.c +++ b/ui/main.c @@ -30,8 +30,8 @@ void UI_DisplayMain(void) { - char String[16]; - uint8_t i; + char String[16]; + unsigned int vfo_num; memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); @@ -43,34 +43,19 @@ void UI_DisplayMain(void) return; } - for (i = 0; i < 2; i++) + for (vfo_num = 0; vfo_num < 2; vfo_num++) { - uint8_t *pLine0; - uint8_t *pLine1; - uint8_t Line; - uint8_t Channel; - bool bIsSameVfo; - - if (i == 0) - { - pLine0 = gFrameBuffer[0]; - pLine1 = gFrameBuffer[1]; - Line = 0; - } - else - { - pLine0 = gFrameBuffer[4]; - pLine1 = gFrameBuffer[5]; - Line = 4; - } - - Channel = gEeprom.TX_CHANNEL; - bIsSameVfo = !!(Channel == i); + uint8_t Channel = gEeprom.TX_CHANNEL; + bool bIsSameVfo = !!(Channel == vfo_num); + uint8_t Line = (vfo_num == 0) ? 0 : 4; + uint8_t *pLine0 = gFrameBuffer[Line + 0]; + uint8_t *pLine1 = gFrameBuffer[Line + 1]; + uint32_t frequency_Hz = 0; if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) Channel = gEeprom.RX_CHANNEL; - if (Channel != i) + if (Channel != vfo_num) { if (gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_IsTx || gDTMF_InputMode) { @@ -105,7 +90,7 @@ void UI_DisplayMain(void) else sprintf(String, ">%s", gDTMF_InputBox); - UI_PrintString(String, 2, 127, i * 3, 8, false); + UI_PrintString(String, 2, 127, vfo_num * 3, 8, false); memset(String, 0, sizeof(String)); memset(Contact, 0, sizeof(Contact)); @@ -132,7 +117,7 @@ void UI_DisplayMain(void) sprintf(String, ">%s", gDTMF_String); } - UI_PrintString(String, 2, 127, 2 + (i * 3), 8, false); + UI_PrintString(String, 2, 127, 2 + (vfo_num * 3), 8, false); continue; } @@ -165,7 +150,7 @@ void UI_DisplayMain(void) else Channel = gEeprom.TX_CHANNEL; - if (Channel == i) + if (Channel == vfo_num) { SomeValue = 1; memcpy(pLine0 + 14, BITMAP_TX, sizeof(BITMAP_TX)); @@ -176,34 +161,34 @@ void UI_DisplayMain(void) { SomeValue = 2; - if ((gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) && gEeprom.RX_CHANNEL == i) + 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[i])) + if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { memcpy(pLine1 + 2, BITMAP_M, sizeof(BITMAP_M)); - if (gInputBoxIndex == 0 || gEeprom.TX_CHANNEL != i) - NUMBER_ToDigits(gEeprom.ScreenChannel[i] + 1, String); + if (gInputBoxIndex == 0 || gEeprom.TX_CHANNEL != vfo_num) + NUMBER_ToDigits(gEeprom.ScreenChannel[vfo_num] + 1, String); else memcpy(String + 5, gInputBox, 3); UI_DisplaySmallDigits(3, String + 5, 10, Line + 1); } else - if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[i])) + if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { char c; memcpy(pLine1 + 14, BITMAP_F, sizeof(BITMAP_F)); - c = (gEeprom.ScreenChannel[i] - FREQ_CHANNEL_FIRST) + 1; + c = (gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST) + 1; UI_DisplaySmallDigits(1, &c, 22, Line + 1); } else { memcpy(pLine1 + 7, BITMAP_NarrowBand, sizeof(BITMAP_NarrowBand)); - if (gInputBoxIndex == 0 || gEeprom.TX_CHANNEL != i) + if (gInputBoxIndex == 0 || gEeprom.TX_CHANNEL != vfo_num) { - NUMBER_ToDigits((gEeprom.ScreenChannel[i] - NOAA_CHANNEL_FIRST) + 1, String); + NUMBER_ToDigits((gEeprom.ScreenChannel[vfo_num] - NOAA_CHANNEL_FIRST) + 1, String); } else { @@ -215,7 +200,7 @@ void UI_DisplayMain(void) // 0x8FEC - uint8_t State = VfoState[i]; + uint8_t State = VfoState[vfo_num]; #ifndef DISABLE_ALARM if (gCurrentFunction == FUNCTION_TRANSMIT && gAlarmState == ALARM_STATE_ALARM) @@ -224,7 +209,7 @@ void UI_DisplayMain(void) Channel = gEeprom.RX_CHANNEL; else Channel = gEeprom.TX_CHANNEL; - if (Channel == i) + if (Channel == vfo_num) State = VFO_STATE_ALARM; } #endif @@ -259,65 +244,86 @@ void UI_DisplayMain(void) break; } - UI_PrintString(String, 31, 111, i * 4, Width, true); + UI_PrintString(String, 31, 111, vfo_num * 4, Width, true); } else { - if (gInputBoxIndex && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[i]) && gEeprom.TX_CHANNEL == i) + if (gInputBoxIndex && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_CHANNEL == vfo_num) { - UI_DisplayFrequency(gInputBox, 31, i * 4, true, false); + UI_DisplayFrequency(gInputBox, 31, vfo_num * 4, true, false); } else { - if (IS_MR_CHANNEL(gEeprom.ScreenChannel[i])) + if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { + if (gCurrentFunction == FUNCTION_TRANSMIT) + { + if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) + Channel = gEeprom.RX_CHANNEL; + else + 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: - if (gCurrentFunction == FUNCTION_TRANSMIT) + NUMBER_ToDigits(frequency_Hz, String); + UI_DisplayFrequency(String, 31, vfo_num * 4, false, false); + + if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) - Channel = gEeprom.RX_CHANNEL; - else - Channel = gEeprom.TX_CHANNEL; - - if (Channel == i) - NUMBER_ToDigits(gEeprom.VfoInfo[i].pTX->Frequency, String); - else - NUMBER_ToDigits(gEeprom.VfoInfo[i].pRX->Frequency, String); - } - else - NUMBER_ToDigits(gEeprom.VfoInfo[i].pRX->Frequency, String); - - UI_DisplayFrequency(String, 31, i * 4, false, false); - - if (IS_MR_CHANNEL(gEeprom.ScreenChannel[i])) - { - const uint8_t Attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[i]]; - + 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; + break; case MDF_CHANNEL: - sprintf(String, "CH-%03d", gEeprom.ScreenChannel[i] + 1); - UI_PrintString(String, 31, 112, i * 4, 8, true); + sprintf(String, "CH-%03d", gEeprom.ScreenChannel[vfo_num] + 1); + #ifdef CHAN_NAME_FREQ + UI_PrintStringSmall(String, 31 + 8, 0, (vfo_num * 4) + 1, false); + #else + UI_PrintString(String, 31, 112, vfo_num * 4, 8, true); + #endif break; case MDF_NAME: - if (gEeprom.VfoInfo[i].Name[0] == 0 || gEeprom.VfoInfo[i].Name[0] == 0xFF) - { - sprintf(String, "CH-%03d", gEeprom.ScreenChannel[i] + 1); - UI_PrintString(String, 31, 112, i * 4, 8, true); - } - else - UI_PrintString(gEeprom.VfoInfo[i].Name, 31, 112, i * 4, 8, true); + #ifdef CHAN_NAME_FREQ + 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); + UI_PrintStringSmall(gEeprom.VfoInfo[vfo_num].Name, 31 + 8, 0, (vfo_num * 4) + 1, false); + } + else + { // channel name + memset(String, 0, sizeof(String)); + memcpy(String, gEeprom.VfoInfo[vfo_num].Name, 8); + UI_PrintStringSmall(gEeprom.VfoInfo[vfo_num].Name, 31 + 8, 0, (vfo_num * 4) + 1, false); + } + #else + 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); + UI_PrintString(String, 31, 112, vfo_num * 4, 8, true); + } + else + { // channel name + UI_PrintString(gEeprom.VfoInfo[vfo_num].Name, 31, 112, vfo_num * 4, 8, true); + } + #endif break; } } @@ -329,20 +335,20 @@ void UI_DisplayMain(void) Channel = gEeprom.RX_CHANNEL; else Channel = gEeprom.TX_CHANNEL; - - if (Channel == i) - NUMBER_ToDigits(gEeprom.VfoInfo[i].pTX->Frequency, String); + if (Channel == vfo_num) + frequency_Hz = gEeprom.VfoInfo[vfo_num].pTX->Frequency; else - NUMBER_ToDigits(gEeprom.VfoInfo[i].pRX->Frequency, String); + frequency_Hz = gEeprom.VfoInfo[vfo_num].pRX->Frequency; } else - NUMBER_ToDigits(gEeprom.VfoInfo[i].pRX->Frequency, String); + frequency_Hz = gEeprom.VfoInfo[vfo_num].pRX->Frequency; - UI_DisplayFrequency(String, 31, i * 4, false, false); + NUMBER_ToDigits(frequency_Hz, String); // 8 digits + UI_DisplayFrequency(String, 31, vfo_num * 4, false, false); - if (IS_MR_CHANNEL(gEeprom.ScreenChannel[i])) + if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { - const uint8_t Attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[i]]; + const uint8_t Attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; if (Attributes & MR_CH_SCANLIST1) memcpy(pLine0 + 113, BITMAP_ScanList, sizeof(BITMAP_ScanList)); @@ -352,6 +358,8 @@ void UI_DisplayMain(void) } UI_DisplaySmallDigits(2, String + 6, 112, Line + 1); + + frequency_Hz = 0; } } } @@ -372,37 +380,29 @@ void UI_DisplayMain(void) else if (SomeValue == 2) { - if (gVFO_RSSI_Level[i]) - Level = gVFO_RSSI_Level[i]; + if (gVFO_RSSI_Level[vfo_num]) + Level = gVFO_RSSI_Level[vfo_num]; } - // TODO: not quite how the original does it, but it's quite entangled in Ghidra - if (Level) + // 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)); + 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)); - } - } - } - } + 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[i].IsAM) + if (gEeprom.VfoInfo[vfo_num].IsAM) { memcpy(pLine1 + 128 + 27, BITMAP_AM, sizeof(BITMAP_AM)); } @@ -410,7 +410,7 @@ void UI_DisplayMain(void) { const FREQ_Config_t *pConfig; - pConfig = (SomeValue == 1) ? gEeprom.VfoInfo[i].pTX : gEeprom.VfoInfo[i].pRX; + pConfig = (SomeValue == 1) ? gEeprom.VfoInfo[vfo_num].pTX : gEeprom.VfoInfo[vfo_num].pRX; switch (pConfig->CodeType) { @@ -427,38 +427,51 @@ void UI_DisplayMain(void) } // 0x936C - switch (gEeprom.VfoInfo[i].OUTPUT_POWER) + switch (gEeprom.VfoInfo[vfo_num].OUTPUT_POWER) { case OUTPUT_POWER_LOW: - memcpy(pLine1 + 128 + 44, BITMAP_PowerLow, sizeof(BITMAP_PowerLow)); + memcpy(pLine1 + 128 + 44, BITMAP_PowerLow, sizeof(BITMAP_PowerLow)); break; case OUTPUT_POWER_MID: - memcpy(pLine1 + 128 + 44, BITMAP_PowerMid, sizeof(BITMAP_PowerMid)); + memcpy(pLine1 + 128 + 44, BITMAP_PowerMid, sizeof(BITMAP_PowerMid)); break; case OUTPUT_POWER_HIGH: memcpy(pLine1 + 128 + 44, BITMAP_PowerHigh, sizeof(BITMAP_PowerHigh)); break; } - if (gEeprom.VfoInfo[i].ConfigRX.Frequency != gEeprom.VfoInfo[i].ConfigTX.Frequency) + if (gEeprom.VfoInfo[vfo_num].ConfigRX.Frequency != gEeprom.VfoInfo[vfo_num].ConfigTX.Frequency) { - if (gEeprom.VfoInfo[i].FREQUENCY_DEVIATION_SETTING == FREQUENCY_DEVIATION_ADD) + if (gEeprom.VfoInfo[vfo_num].FREQUENCY_DEVIATION_SETTING == FREQUENCY_DEVIATION_ADD) memcpy(pLine1 + 128 + 54, BITMAP_Add, sizeof(BITMAP_Add)); - if (gEeprom.VfoInfo[i].FREQUENCY_DEVIATION_SETTING == FREQUENCY_DEVIATION_SUB) + if (gEeprom.VfoInfo[vfo_num].FREQUENCY_DEVIATION_SETTING == FREQUENCY_DEVIATION_SUB) memcpy(pLine1 + 128 + 54, BITMAP_Sub, sizeof(BITMAP_Sub)); } - if (gEeprom.VfoInfo[i].FrequencyReverse) + if (gEeprom.VfoInfo[vfo_num].FrequencyReverse) memcpy(pLine1 + 128 + 64, BITMAP_ReverseMode, sizeof(BITMAP_ReverseMode)); - if (gEeprom.VfoInfo[i].CHANNEL_BANDWIDTH == BANDWIDTH_NARROW) + if (gEeprom.VfoInfo[vfo_num].CHANNEL_BANDWIDTH == BANDWIDTH_NARROW) memcpy(pLine1 + 128 + 74, BITMAP_NarrowBand, sizeof(BITMAP_NarrowBand)); - if (gEeprom.VfoInfo[i].DTMF_DECODING_ENABLE || gSetting_KILLED) + if (gEeprom.VfoInfo[vfo_num].DTMF_DECODING_ENABLE || gSetting_KILLED) memcpy(pLine1 + 128 + 84, BITMAP_DTMF, sizeof(BITMAP_DTMF)); - if (gEeprom.VfoInfo[i].SCRAMBLING_TYPE && gSetting_ScrambleEnable) + if (gEeprom.VfoInfo[vfo_num].SCRAMBLING_TYPE && gSetting_ScrambleEnable) memcpy(pLine1 + 128 + 110, BITMAP_Scramble, sizeof(BITMAP_Scramble)); + + #ifdef CHAN_NAME_FREQ + if (frequency_Hz > 0) + { // show the channel frequency above the channel number/name + #if 0 + NUMBER_ToDigits(frequency_Hz, String); // 8 digits + UI_DisplayFrequencySmall(String, 31 + 8, (vfo_num * 4) + 0, false); + #else + sprintf(String, "%9.5f", frequency_Hz * 0.00001); + UI_PrintStringSmall(String, 31 + 8, 0, (vfo_num * 4) + 0, false); + #endif + } + #endif } ST7565_BlitFullScreen(); diff --git a/ui/rssi.c b/ui/rssi.c index c317b5e..00095e7 100644 --- a/ui/rssi.c +++ b/ui/rssi.c @@ -27,7 +27,7 @@ static void Render(uint8_t RssiLevel, uint8_t VFO) { uint8_t *pLine; uint8_t Line; - bool bIsClearMode; + bool bIsClearMode = false; if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN) return; @@ -52,20 +52,19 @@ static void Render(uint8_t RssiLevel, uint8_t VFO) } else { - memcpy(pLine, BITMAP_Antenna, 5); - memcpy(pLine + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); - if (RssiLevel >= 2) // 2 + memcpy(pLine, BITMAP_Antenna, 5); + if (RssiLevel >= 2) + memcpy(pLine + 5, BITMAP_AntennaLevel1, sizeof(BITMAP_AntennaLevel1)); + if (RssiLevel >= 3) memcpy(pLine + 8, BITMAP_AntennaLevel2, sizeof(BITMAP_AntennaLevel2)); - if (RssiLevel >= 3) // 3 + if (RssiLevel >= 4) memcpy(pLine + 11, BITMAP_AntennaLevel3, sizeof(BITMAP_AntennaLevel3)); - if (RssiLevel >= 4) // 4 + if (RssiLevel >= 5) memcpy(pLine + 14, BITMAP_AntennaLevel4, sizeof(BITMAP_AntennaLevel4)); - if (RssiLevel >= 5) // 5 + if (RssiLevel >= 6) memcpy(pLine + 17, BITMAP_AntennaLevel5, sizeof(BITMAP_AntennaLevel5)); - if (RssiLevel >= 6) // 6 + if (RssiLevel >= 7) memcpy(pLine + 20, BITMAP_AntennaLevel6, sizeof(BITMAP_AntennaLevel6)); - - bIsClearMode = false; } ST7565_DrawLine(0, Line, 23 , pLine, bIsClearMode); @@ -73,22 +72,32 @@ static void Render(uint8_t RssiLevel, uint8_t VFO) void UI_UpdateRSSI(uint16_t RSSI) { + //const int16_t dB = (int16_t)(RSSI / 2) - 160; + + const uint16_t level0 = gEEPROM_RSSI_CALIB[gRxVfo->Band][0]; + const uint16_t level1 = gEEPROM_RSSI_CALIB[gRxVfo->Band][1]; + const uint16_t level2 = gEEPROM_RSSI_CALIB[gRxVfo->Band][2]; + const uint16_t level3 = gEEPROM_RSSI_CALIB[gRxVfo->Band][3]; + const uint16_t level01 = (level0 + level1) / 2; + const uint16_t level12 = (level1 + level2) / 2; + const uint16_t level23 = (level2 + level3) / 2; + uint8_t Level = 0; - if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][3]) - Level = 6; + if (RSSI >= level3) Level = 7; else - if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][2]) - Level = 4; + if (RSSI >= level23) Level = 6; else - if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][1]) - Level = 2; + if (RSSI >= level2) Level = 5; else - if (RSSI >= gEEPROM_RSSI_CALIB[gRxVfo->Band][0]) - Level = 1; + if (RSSI >= level12) Level = 4; + else + if (RSSI >= level1) Level = 3; + else + if (RSSI >= level01) Level = 2; + else + if (RSSI >= level0) Level = 1; - //const int16_t dB = (int16_t)(RSSI / 2) - 160; - if (gVFO_RSSI_Level[gEeprom.RX_CHANNEL] != Level) { gVFO_RSSI_Level[gEeprom.RX_CHANNEL] = Level; diff --git a/version.c b/version.c index 0f9496f..0896fbe 100644 --- a/version.c +++ b/version.c @@ -2,5 +2,5 @@ #ifdef GIT_HASH const char Version[] = "OEFW-" GIT_HASH; #else - const char Version[] = "OEFW-230909"; + const char Version[] = "OEFW-230910"; #endif diff --git a/win_make.bat b/win_make.bat index 83906b2..5450646 100644 --- a/win_make.bat +++ b/win_make.bat @@ -13,7 +13,7 @@ del /S /Q *.o >nul 2>nul del /S /Q *.d >nul 2>nul ::python -m pip install --upgrade pip crcmod -fw-pack.py firmware.bin 230909 firmware.packed.bin +fw-pack.py firmware.bin 230910 firmware.packed.bin ::arm-none-eabi-size firmware