From 15da60bd953ff280afebdb5dab21697255684a95 Mon Sep 17 00:00:00 2001 From: Hrvoje Cavrak Date: Sun, 21 Jan 2024 01:45:22 +0100 Subject: [PATCH] Cleanup, Refactoring, Silkscreen update - Code refactor, still far from great but a bit less crappy - Unify behavior - Mouse Zoom feature was made toggle and moved from ALT to Right ALT + Right CTRL to avoid interfering with OS - Added optional screensaver "Pong" mode, prevents sleep and it's fun - Updated README - Added more visible pin1 marking on PCB for digital isolator - Marked pins to solder with a star * - Added checksum and version format support for flash config --- README.md | 26 +- binaries/board_A.uf2 | Bin 123904 -> 126976 bytes binaries/board_B.uf2 | Bin 123904 -> 126976 bytes img/screensaver.gif | Bin 0 -> 186714 bytes pcb/DeskHop.kicad_pcb | 58 ++-- pcb/DeskHop.kicad_prl | 2 +- pcb/Gerber/DeskHop-B_Cu.gbr | 4 +- pcb/Gerber/DeskHop-B_Mask.gbr | 4 +- pcb/Gerber/DeskHop-B_Paste.gbr | 4 +- pcb/Gerber/DeskHop-B_Silkscreen.gbr | 4 +- pcb/Gerber/DeskHop-Edge_Cuts.gbr | 4 +- pcb/Gerber/DeskHop-F_Cu.gbr | 4 +- pcb/Gerber/DeskHop-F_Mask.gbr | 4 +- pcb/Gerber/DeskHop-F_Paste.gbr | 4 +- pcb/Gerber/DeskHop-F_Silkscreen.gbr | 446 ++++++++++++++++++++++------ pcb/Gerber/DeskHop-NPTH.drl | 4 +- pcb/Gerber/DeskHop-PTH.drl | 4 +- pcb/Gerber/DeskHop-job.gbrjob | 2 +- src/defaults.c | 14 +- src/handlers.c | 105 ++++--- src/hid_parser.c | 295 +++++++++--------- src/hid_parser.h | 29 +- src/keyboard.c | 196 ++++++------ src/led.c | 25 +- src/main.c | 41 +-- src/main.h | 270 +++++++++-------- src/mouse.c | 284 +++++++++--------- src/setup.c | 34 +-- src/tusb_config.h | 59 ++-- src/uart.c | 138 ++++----- src/usb.c | 101 +++---- src/usb_descriptors.c | 95 +++--- src/usb_descriptors.h | 87 +++++- src/user_config.h | 25 +- src/utils.c | 91 +++++- 35 files changed, 1462 insertions(+), 1001 deletions(-) create mode 100644 img/screensaver.gif diff --git a/README.md b/README.md index 7d19f68..c55e867 100644 --- a/README.md +++ b/README.md @@ -73,17 +73,23 @@ This will make the corresponding Pico board enter the bootloader upgrade mode an ## Misc features -#### Mouse slowdown +### Mouse slowdown Ever tried to move that YT video slider to a specific position but your mouse moves too jumpy and suddenly you are moving your hand super-carefully like you're 5 and playing "Operation" all over again? -**Holding right ALT** while moving the mouse will slow it down considerably, enabling you to get the finer precision work done and still have your mouse moving quickly otherwise. +**Press right CTRL + right ALT** to toggle a slow-mouse mode. The mouse pointer will slow down considerably, enabling you to get the finer precision work done and still have your mouse moving normally by quickly pressing the same keys again. -#### Switch Lock +### Switch Lock If you want to lock yourself to one screen, use ```RIGHT CTRL + L```. This will make sure you won't accidentally leave your current screen. To turn off, press the same key combo again. +### Screensaver + +Supposedly built in to prevent computer from entering standby, but truth be told - it is just fun to watch. Off by default, will make your mouse pointer bounce around the screen like a Pong ball. When enabled, it activates after a period of inactivity defined in user config header and automatically switches off as soon as you send any output towards that screen. + +![Image](img/screensaver.gif) + ## Hardware [The circuit](schematics/DeskHop.pdf) is based on two Raspberry Pi Pico boards, chosen because they are cheap (4.10 € / pc), can be hand soldered and most suppliers have them in stock. @@ -152,22 +158,23 @@ The standard process to do that is using isopropyl alcohol and an old toothbrush ## Usage guide -#### Keyboard shortcuts +### Keyboard shortcuts _Firmware upgrade_ - ```Right Shift + F12 + Left Shift + A``` - put board A in FW upgrade mode - ```Right Shift + F12 + Left Shift + B``` - put board B in FW upgrade mode _Usage_ -- ```Right ALT``` - mouse slows down while it's pressed +- ```Right CTRL + Right ALT``` - Toggle slower mouse mode - ```Right CTRL + L``` - Lock/Unlock mouse desktop switching - ```Caps Lock``` - Switch between outputs _Config_ - ```Right Shift + F12 + D``` - remove flash config - ```Right Shift + F12 + Y``` - save screen switch offset +- ```Right Shift + F12 + S``` - turn on/off screensaver option -#### Switch cursor height calibration +### Switch cursor height calibration This step is not required, but it can be handy if your screens are not perfectly aligned or differ in size. The objective is to have the mouse pointer come out at exactly the same height. @@ -177,11 +184,11 @@ Just park your mouse on the LARGER screen at the height of the smaller/lower scr Repeat for the bottom border (if it's above the larger screen's border). This will get saved to flash and it should keep this calibration value from now on. -#### Other configuration +### Other configuration Mouse speed can now be configured per output screen and per axis. If you have multiple displays under Linux, your X speed is probably too fast, so you need to configure it in user_config.h and rebuild. In the future, this will be configurable without having to do that. -#### Functional verification +### Functional verification When you connect a new USB peripheral, the board will flash the led twice, and instruct the other board to do the same. This way you can test if USB and outgoing communication works for each board. @@ -239,7 +246,7 @@ There are several software alternatives you can use if that works in your partic - Not tested with a wide variety of devices, I don't know how it will work with your hardware. There is a reasonable chance things might not work out-of-the-box. - Advanced keyboards (with knobs, extra buttons or sliders) will probably face issues where this additional hardware doesn't work. - Super-modern mice with 300 buttons might see some buttons not work as expected. -- NOTE: Both computers need to be connected and powered on for this to work (as each board gets powered by the computer it plugs into). +- NOTE: Both computers need to be connected and provide power to the USB for this to work (as each board gets powered by the computer it plugs into). Many desktops and laptops will provide power even when shut down nowadays. If you need to run with one board fully disconnected, you should be able to use a USB hub to plug both keyboard and mouse to a single port. ## Progress @@ -252,6 +259,7 @@ Planned features: - ~~Support for USB hubs and single-sided operation~~ - Configurable screens (partially) - ~~Permament configuration stored in flash~~ +- Better support for keyboards with knobs and mice with mickeys - Unified firmware for both Picos - ... and more! diff --git a/binaries/board_A.uf2 b/binaries/board_A.uf2 index 537e0be70bf20a097817a3d91b1c43eae70290ad..adeb6e6f702533d07109b785f40c9b6dde0ee2b2 100644 GIT binary patch delta 27093 zcmcJ&dwf$x7C1hWq-pv{32lM&LAgmv2`#Xt1+0J=l5%Mqgi@;VC|F)v9%4XbQ($R$ zDI%_gi(F_ydHCR^)=Ck9x>b}_bln6|i=Z12xd`Y+MQ+ok$?wd)H|g!}e!supKfm%h znYlCPoH=vm%*>g`y|_M!c6p;~^|oA*@q>s`qq5Q??^I6t{E8TVI$f!_ zEXB)>`}bUfcog7#KmSe@;rz)BL|p(ls6aaJjd#>hi8!?lA@oq_xob+d%8qi7d*^sv zGm+%l9VSn0R7=t6>a19eAAwv5Z8^nkR%i5%hesklDsqgcu8ZN8ADQ>nBh60*@GwP# zqnTt?{fH<>6EYj!O7pGX%`@9By3INICP8|4~5Zs?01vq!%*%5`!XHYw04 zM||E|Q|z{(#u;eT+EMFHE+4gCfzFLOwL*z{9M$J#=4)!>x2>Zu7?FWO35?pexvl4s z1M>#VM}sAKV$y5ES{dLe_aX}CAdkb@Gy2&ccwoL;G4NqG8kpqiF?6%7Cz>!|@4ZFV zv17e6WAs-Z?1@^0Cw!0i?8+{6Pfx#ZnggFl8v?& z;*p8Y>E(M(KTNHs4=mnEU*Hrm2u*SBq7OX2Yuwi!#;Mq|i>|TJGiL4@_fOB1swifU z^C*o5BRA*8d-}QdI4Vp(RMdlBchjaNyXd(zX)(Z#?D(m^Om#o;6kzyn2VYCTx5wrPkVSe%wVNMH0{cmAD z7cgE93q$nhUc^mVEsBHO^Eqa9mq5rplbf<2tcVpJK@BzkQxB}bc>VvSXo9iGEop%? zm^+`FvS#n&BsPR&)+l!F20iF2HjG2=Ebjb*S|>8+dvJY4F5{poOiNtReO#^{*c`jS ztuRmV=o?EbBYLUPh-Raanawtro)0{k*^j^eQ$k+CtAMoSd=yFiPx{7j8!t@%@0*U^&7S2dopgvnD z)52U!vLZ8KZbS=(f)*0fh!(cYoNHMwXd!;4V#HiQ3!7(7v8;b=g0YH@@}+i$n=nym z!pimyzsKq}Nr}dYUTWe+vx%3P%>r6mR0ebJi$J5>G`2xhlCL?en76}<$=pgGi74hZ zj+h6r;N>RNbfy9(=^TZ}b@~KMFbdy&{{2-yRJl@jfys?<_qF$ZpnhR?RefqrdI@8_ zebF@_ttfq>vMR4CO_7$oOMk!OJ*(o&GHYJtF1@n)Lucw6rsL|H20 zF!f9lLd*4-x^WZrqOO745K5bvaKYq|q}F;Q^`vyo@Yrb1|G45o%g5!&x36pl2Jr885d1H@rK=$QrjV{{!nt4oz6E}T@5#2k zl~*ct&5kB5Dol?hH4L^NaL#ddnM{IcG6|?_h9|AFXrrn6s*}WyY*hGWwH>VdsWPk@ zt1}**D?gb3Sp~{bdI-~B+I7t^*!xQSJoG404J-aj4L0ZW3})^>=pTxZ^k16)nOHQ9(o(DnSx+YTK_W~`!4)HCWB=56M zP?^cu?tn>^k zil~RtW^|1-dBsZKeQnA*#V))P`KpBCUhYhxkS{spHo1&f41*p>Q*TpEpJPVPDiuDq zqs5rBC{dAQ8Bk(INtIwQCTvvrCI`$294+4|2r-1u1QdpN;PPTnVbDUjHHdt#hLngx zE-*0=|`P38o$;J&G}v3-z(@JMc(@r{;vTtbEMfXK0JcZ$&H9FC3VBr#R3>VP5>0aKCoV%@AZdLVea0?6J zmvV1_-@fjT;5XHcO?C8z!nw3=xF#pn9S44=`<(ksVpVFTmCkYgQk`mn0mOrbXxzy7 zjPp7D4Cg89S00?#Xl=VRm)7H=LIg6a8fv_!PttGG2VppBp#vbc8%*X*#kvNRgFT7{ zU2{Y30$K&teYYK%@46S!*pTW(lp+3UVFoH^5%qMqSh93ME3>DtE(B z4N8HW955_hlcKl*6x|==?V4?&mE3JLlG(XH$V2B z74U9y8tCr1fE)B*BVFt+nXJ}>@%92!iiTMt1A52Ac5GZkmszLRI9z#kjsf<}pSWr5wVjijr*7#xc18N0^bM8Bi@w6e5%M5gfl`eJLw;}1SQyax(mHG3%NwnIFS%0BDD|l--?#0kaqmWDgAb~*fF_2?`eV;= z(ME-#3MSV`SE@-AO(s!hGOznT;ilTu#VX&~c2^2&{0UZn9H%JyQL19725JnG&>Jub zeOZx=Nc$qs^WHa2Usf0p8BNaWbJ3=uAztk_peVF`XfD(XK|C7m72@q}2IQhwL%b%$ z-)XbaXB($AnoZt{Bl%Y=&Y(0H-+$1zE-pj$i_bSEjn$1^WOLfG2V8xmUhgs{Dj2Kn z(r|lf0VL3$;|BRp?$v(A@fDIm~+1E0vF}GC-^-lbuUuW@5sWxG+8u+ zWSJq5uGb=Uz319=&1S*tSl=+sI&JJ%#YqvY_&((fSR|? z_AozZ_xn?fFSYF_Fq_xG6=*d@89yvl*y|QvHhoy?7*AYHts7$IeNDe#z>cOn`#|!e|Atm%|Ak|uvGnylbUN_ zx+(0#o1troQtp#UnM9;yJ{x36JQ6y~ZJm9SBQn$!VD!442@W!=2nJRb6UaUzxK#jA0BV3}01ZG4 zKr8`cO&pB!$dq1UT9H)w9hV{$bMbh%U>Ml-5*j=#*6k20+|&0*tjoWkhil*V5;mGL$gWxUC$jW@uUufqs=jf*i} z1x+h0chs12T?dB{HloJEIDQaq!UM4fn~_`B98nLW9n#h36xjif-l?%?<<(Wx>1!Px zV;vZW5|*hUzB>2|r#6ImTj(Z7x`rDDV{G3AE`~T1yP=cFpTRlt-5~h4YqQzE%X-B*#RWI{HbgDY6G8Ci~67pDEvyNSRa*JB(4s&H4jAvNL2z3 zaNrI{;uzu&27VEA^af~TI`Q;`p(K{VzVi0C2~<^xFX})B5)SLY6f#(>QNE1<@_fFH z{3-*~6bLqS`amzMZy^f2w1!xstb;0Fb5J{>e--wnb(rTYn4|WM1&yfOBAaO6OMXKY zJ{aO(2@*#C>LkCX{nrIP%*tWLWEZdlYXFyN2$ZdBCeJc!$cxJecWdyX3tAdue7C@- z4##^2n6tyiWGBN2Lo(Mx)zkEsz)JP2uxYA=7z4=*qjz>NLq-&s107^rRM)hwL3K29 z6D~m83ExQp;-wH@SuCedfcfi)u9aL;s@QQ;WgVAk7~x>3f?C!n?VvK+5pkNZz)VBI zQpPay1*tmsq|0(f0^R6ZSw%<6=|)5Dn6BKU46*2pZbgp)Buj;&_7=0ol94a~MRLxxoO2On6u4eNUKfF@$V*DX&7siY!wBJK zgub}N{8luCp-P;3f=ZH!5Cn|~LQo|U#>;C|0_9GSms=8-5N;r19xgp|e8NJ8n%ISt zlqFUmt6K#o0;AF{Bt|k_Z?|m7>c7eDL!j{KZCPY~f z8U_Sc%f>KNxjErKk{>Fc9#JWyEt3~k4uw6ml^ES6GJ7Xwi}Gf7llLL8y{Tc_BTe~` zoW)dNF+I%UVY#5w2PvL4GT%?PGE{|A|0>8DmYd9%#NkH18*MVtrpx(O0N+^~;t2^M z^}$Y;ggQfB$SgpsEXXuA0`BfoZ^8v^!y27lf%#)Qj zOI}_jFq-4kf0~1+g32fhVMLgc<<%&82e?77~VjAWE^}GpcQ4D6;yfG1c zMmr}iwhfTU{`w(3(>QMlLp>U9{<-qHJPJ&z!Z}3IkIDtCg4~5&xkj}xxB`^r4CfKKR>&!x zK)JFjH)*se(CBUgtt?akr@Je&8EW-B5`B7gR~;DbN;$*TVCriIDCWg6C2Jm)D!NLp zr!^GGJilflL%F&NX0&VMTwMCB&*8-FGC(L4!m!n2ISp}=29gOQ9?63fxnEpEVvC|N zB&*;|kjYw?m$(>)-_-yxc@%~CYa!PaX5l)S`B}s|T7Xm7s+fj#pok4}dDhA0*#Nmu zcjYEoMHaAmC1de4AZ-fwV;Bl-B9g5e(k9T)=I~JPj9f9BfqYBX^p!MDBp=s}d?Pocp|-c`f8@3+E6ksFl-ggWT<1xk<%h(Z$`0-VR7Rx{w&{b~%e3 zkh^nO!gkR6768|VA!B!6Vdm_lH9O(a2}i7wF}x@jYbQ|E$$9RS^Q?p1-7<|lAd2-s zH?ejD(o1p{yX7oivgH1w2vL==KhX+1*y*r>t^ycai%?vhxji=OwJsz^`-+^!YhW4& z=PI7Pk9qoFxPQGWm*60fAC^mSP)>dra*uW~PkK<4fGm2t%={=Iy(wpLRLb^{9^31y^y6Xie4Dx20Ml&aLy8NXjI*&oVo9vBAue+Iu6x2UUInM* z*bVmqY*DcJ$b8s1i=mD!RFrfwTaIN$$daasHJ#S2rpG2Kbe-FpD26&7uJ1c?WgdsR zo(ShaZ=E4BnbD2O2|zm8g~Vu2$klanaq_zrh|(YHV^6CJ(3sIQqknx+!Q`G!S5!a3 zOgueA-FFsDymy&(r-yWjJ5wxaX19_~LrL!!DOT&5h3|*Qs#9`#-|wv%IGYTA!0wCp z%NVMqAi)QVhY9%zt%j*$V+HeQOEwgSs2<0Zr{hoinsDZ|=(!f;^)6+WIB^LZIXs*mk6782|7@rX)--Oj|K zbZ3aq^ur=?P=rg;e6hs&-AeqtFo95o6=|4D6j?)(9I(KPotO)IhX>&#L*;ui6otss zj7~H-${l4Nl(O53Tg}MPtSsu}Zv@C3MJA$GV90a8;bA=~Zh#SHPrvSD0B}mr2aOlpFHbV1BJ;bt`zd zxmTHqt#cxa&ZI@61dF;!(CT2Et?A6@Zi^;Doy_GhrF0x;QURmA9j6V~9lP84dgkq4Y`B{F;};lqd|il1e-?H1XDBy}&m8p) z!FkLjUmC1enKqx9p?>S4V6;AYO@GV8&oG|f`sIdeLTW{%A1&2r64XXrzYwKWm8Fn< zR-$CqJEMxB?kuL(cPcXOc=r4_)cz1$xg%MduKW4a(8lWz(o^i^Wptdg}&E)e$v@@JT)wna5BH|9HQa;{!fPZ){D(iEf@fz=t& zZRlWRuqW&T2!jKf49Zj#1^GNUvli1~@|#UMKEZ)OX#y5R3-SXxk?BC?4{($(<~f=Q zCiF!nry6}5^J&axs}6ifayQP=Y|z34PWpps0i4deWol}R>mN2IBV2jNg#$|rcP;l; z)#OCABJ(hJHX2wQ&a=~8tqkc>s;Vk{nb9L5ecl3m8kTA%<8z8E1b1nli{sXr8Ka(lM z*EAthJa{f-)(86FV@!P@MVfg0>3ze(2l>r`38p7)A-xf76H(RBpWkLa4fIP`8hE4e z8i;ZWm|pfXcLSM8Qv(w+m)m+zLe!{~X>hwR#4ln72m8-i98^ZG!q{mmJrJcXt4!Az zgZ!TYF{T?(mxEx*rocbB%R*C3keVu0xU11UO&3Y?HQB4xU<~UUlsPiZ2V@3%ENH>+ zF@FSe5-3wHGUtVO9Q+Cjd2tAylQ6U0fE4KWO=i%eGWg<4xKCtip=w0CgTuMVn1KF< z%>RNOLeMY0_yHc9;f8JP_c%Q8YqxUXSFXOw zx8BSV+J3NUU*8FnBhWD(Y$9oCkhYawtH4RrGmz!r8W)p0qKgEABvAP3&PTZ)s`po? zDI)cp46`Z12)SeuCfTSQba9qIrUsr*0JEta8lbkf2#VbxU~!br05zb+zW8U z&;F*sLs&|M^{K-V6HMP#;2g)d8_8GHLVp1%Y|IRVp5QO zG!{=#csqsi*g!N+kMwed$z1j1Q%avH=rZIv->HhV{JNFRzUM_wW$)*7a8s3VItMK*(@`vr z8xz)%2E5Kz$R-1!%1-V@fnnq*;9%L$f8*CR@9K>xC3s1p0$avT=_cgz+wAptJSZVH zln)+IK6pTWeoly`60poQd|GVJr{(S0kbnn0yd0c>#Q@1ray$T$;AK6g01;JzBt)99 z&~0F{xZq5qDo54&kkM*W*xeP5@x*KE5GqD+$tC!y3e2w3;d^@i7VyEC^b43JVF9d3 za@YLDY7=l=TDa~Z{_cOFpV8r&L+4gAwz*5^Rx9&Jctt3xt;v@0Z6i6NQ)TyTeJE>| zO*_eqPNiIgPI88woQMs&#sD(kapyXJmSkhsB|?{iUDnHNpa)KmY(~^MH#;sl)1uRQ z{1(RiFcFW;{5>#d!GQ&T`~8s@kfCSgdbmOeozRncWtCHr<8aS!MLDb7ER~Ea@Kfwx zl5xJQNfU9`u*WtegQ0)MehDb4vr0nx@Hf4!5eBjAH{JeY8K5vu0dqR1JEh z^`ZU`+REs%l*H=u(Nn*gj>=MGVkOJPI@lX$On=F3qsNxa_zQ96(D_r|^7P%-(UT6Yd$NzTy3LK=g^Hcna%xUyg`dQ})`-l>Y6K%)77utTfo(l(# zmpX=3MWHzh;CAL(meS*7gWz`>9;sEubE0KG2lg7aq++YSDw#LM-3GUtN#0ZIv5?cp!MC_c{G_muUTfoj0V&^1%K<{khquEY9HsMLEAr<$E zMsURgdCJ)PQgK>E;q@LRyW##!a#cMj2@OJS8&}P#>U$hiIo{srOz8umn1ni zUT>jag`%RP5DFJViX_ED7q@FrnlqGx-61|6Zuhl_J47sa0bQH@(8rIb;&~4$eMkI@ z{_-tMVM=!a)athXDu+!&o?7(OzN(w+i0V4|vw~gU+Gk#x41?0_kC5Sd`F6%qz;*VtFn#1 z!2T-(=M;P&_?hbg1PXU5%6BF?@}0Lf!%Ppu)h93_5xL1oER9Tp{6uz8wH5Yfu#SC> z!r|2;Y-qh8>f;5OKGS*Iv1>`lTsqW<8Z=WL6fn7fonP(FD zm$DCL;zuHlle|?_$X1y`HnL5b_x(RRgZp$<=-K zn>Prrh@amnc1U8?5#_MjY}|GJt*=t}UhQO04#Gne&v&vn2jTQIOS=j+{7>tJiDU@Q z!S}Hb48ds`|7oUc;ar$>HOW+;9wNR`F&y_(1b^lTAte$m8HVM$&%<#& z!o}%~6bkU`*i*x>p>Qc|`ULqML6~bCPdLnI$kN3idY1ndj0Yk+6)Jv_ERD}NH^FT= zoo9VjdNmpp?}>7zmMrR*hU@h#H3DZs>x>(L2Y~TCJ_7g2EhnO2jQ#?&;$5bXoSWfr z#R~LM&RNy^>V^G^?TL6Ny&Z10eN-5+lbSlQ#p+}&HWyB->Q|0XsBQf$Db{=s+>l1; z5G(Vj3_TD@8|TqTX~@0AtCLb^xrtAxG~Qz$YmK!e*%VC3qI0&UnfdCV#inBqI;; zN80|y5juQthTUStmN?rP@p-7lnrbJ{f*41M7zZRVI1q#B>_PY>BlUKWgAMV|w4LJS z(yF{^PP5Se*}!m|J|WzS*aYv*v4{=ws$hdqK-9e!s|E`AMzjN*EGVDCI`r%g1dWjh zu4+$!B;;u7i{g+PvD8RxPMXxYh*mN2^%Tl-s9%hRk=Dx27>S3&c(rvTPD<2}MSj=ek*r{Dh$4D`Hvzf)RkVF!-EeN!etulm+wqgBJEIY*}8T2zZoq<4S9J~9UX3C>qu7z55h8hdCA?w8C2 z_HZVo$=^j|(|d(VsWbS2?30G?Y9ahR&$y|1H-jJ-_Zz8kDfj)3=!9#=Z(YRMr18F0D9XC9HM~ z?z(76unu^l3{m|*;`9Q|K9Aar>}ALo*Ur#;ZkHT~b>dJ0eVo)|++ z|ASnD@U+VlYl!W?kBb+cSWlcGu74e8hJAz>SR#&9Amjm(El`jE}TVQKWTBBCRta(mD@BT4!RUbtXkxr&Ma4 z*tOQlKth^KrWgy3>l5zZYprEMqs^)a8J@P5v8OD!e@zp#+D)M)wp!nTmbfOh!&d9t z&<@{8t+3Vl7PP|GTtCpnR_mM41a6@{wnFPg8O}jtko2RV=a0A)A$|n3{65!5h#v+W zpWu24@k5~DMnU&mtp`1^cEeFn{dMPziaUn-RC42fhBd{4GH*E#JL86;AqPCKgZV@6 zM?~%aq4NLGIH~scWQwlYCypBXWTS?!iM(+#iEe3HSEYs*fwwfoj>0*Li)UbTuzFsa zFr~Ur^>C*VUP)TIV3h4JykPvaw-)Yilh~UOD??)ZZEvd-AMCC*ZWB_6x{pb*VeVFl z)ezKs+yN$9$2WAnchYDK!F$ywt)F|8#;veZOnX<9 zkmpZ5D&cvI_etUTtS3r%9^rKe&u2X9UP8hU@8d#3izixmmc|g9Yz)crE)-CjJsJTe z!~2-UzY8-JaU4GMPqg=U#4-x-S~NT2 zm>}O2SkG+*?Gxs9xKB)&yE&tz6678ax3o#xSxyNrr9RFD`Bwi}`kksT&{Dku9LJs2 zm#Sx1q$!lPL%?AscTX`IsB{<8X2kR3+GFx1xx`seFqs3Q$sCZG%rw~Mc+CF*XQj_0 zYhfbZukTZ>I=a&O@Yq2m>Ni!}LdGP^0oN55>{1*4Ju<*Q4yR+o9r&JHq}d+J#KAmT z85qLZ=6{d=(K0=1z!%;BA7Bl{GZ#Rgc0cf-W3qqtH+cf4xxX%gs2DLWX1sR`YPen z5y7SLICdzFdnHoUwVCnLgXZZAQKrb*0b-^u<;VdUZnBxjO_w}#!jIDj;I$2!808i$vu*7 z+KqozY?4=HP2vx8jX~(aJ;V=$_btpl+;Ic7t)HWw6X)qO@vAd8TGgI=Qq1T*XOKVG z##R>L)S9bp!rmsh9b)=%xN5@-nrwyFvxpON9xTyL-VFh%SCx=A`+7Q6Xsz{r7-}b1 z?6VdM!!?P`5{7FMdsG;%Nep?Gc*%4s#+Q4^get~YdSOb|BF&MUiHhCu$A+yHqL+~mTF3nAZU3v;3*tf^j*DwPVLy?E9Dt9K#yCk;5qsSsN zz(qrGjgS=u(~Fpe+|P5$ET!R}TtTr&bdL}s_cNR-OJz924U^LIrS!F2R92MXT`pHj z|C5xyic@E)4M(^^QhJV*{uCFT6>WH#GYikLD)#^>BVwX8uZ!mKy39PD;51np1H)xX z+)NVD0xl*i#_$YBN$LHh^toJYR;*zamoBBJN$In=xU4wC6P&0joun$BpVWq_QrK*r z2xeGA>;%e2R`3CA0OtX|1egQ6# zi$~7&*8AMGrdt&Utm7b@fk+J8HYqk8(&~k@`R-#R)(f)X6C&PLDH(ZIc>`TUgn=mP zE{|2nR|)yFKwl5}Le)vl-GAlo6)>U%jNzeUz=2>y^x) z1dLyU`%N{-NKhi`c0bJZ5Kv+T6mO8!gJ47&!99Uf3m9<%#y^8+B@Bx&e5JtP?rRe7 zIFEx{&dI2(I)R)JW|w&k)#p%IYGU5D#yYFL)dc60`+60^2PB+^oI=m6Nuz|7(GG8| zXf|wMifpLqfH(Y*XFFuhKw^9=*jhOLS4gjy(w_t43CA}H_9)_S1bYmpuLJx`5`K+f zcp}bf!SKX*H8H#z0Vx_z6ycRm*=J|s^6TjtbP2c=n3(}iMXUSS`# z7Va-PS1mnI4O>cXOuYd|mzWy0^boxGSWmwNo5%I=DF_Ap9^#bn`x>W$-ve9}{O;w{ z@VkeLhTl3)1HUX61Haq3Soqy4&37=H*9faT6-tFolXcbt@G0vm_FM0TundvdbZ|Yz zScTx2lC)WZV@hI=2#zUW)YX|(-mM_nX6pwYOrb$O_lGD^PZoU{)eGq-t+U4Fuxlscq?!)? zW`Ot&{q1;!84UuzA$mtAe>vn4ygb6-WsidTh9hn;dD`PqQf@A-gv57yRMa_m+mFQS zJyFz0TpuA`=TTGdbG?N4E>ARdf=d$OJ3Shzk?SeMSx*dglUVyVi9H;*`Crc^pVW`NQB<-b6$8quD^%l>s>0o^mac*J)yyM36zqG;Ym#7ED z^WU_wd8K%c;?*{GM=36e|MW2UVbP#Ocn3&w(`U#ICO$sQ{!)rFlK<#f3r&?QRfc!xcJL2%&R#$*=-|sbuL$A9&OG>D3%Q{6e5k>R4K0m#d3DGq#UisP ztDS}8riUfQfT|Qw;{jESMTf9~f)Qt^CO+-e3F*QM&=EzGBCelQD&VBiO;e&|X>`mEOTS+N0sOq1|F~HG0dy0|uA0gLk## z^a4nq(f*9#)2I%9X?q9%Qu~=ktI<|`pxg{O!ZMxHV%}yrni&2RJ2c!G40?70UePw zTB7Re>B z<5ZlL+QHum%%hM2HeTSc|G<;v2u#YKGZk(XY>#K_rs7Y!#A*S&%TYKavEjI z@xh{@4LS;t+?@*hVAOO>_5Ru423L4H_#@yH5hr~+NPYV%`_Oc3!5^~hbZk;g=wMGz z$C>dY%lspmv{2W{537AtzKM2wIv%7s@jXF0OS4o3&g^{`PBZcFd73|@&%{`O#cn-2 zy#i+|R^MiyuE5jdItyfq_CA#dP}8JXb4 zxd~B7gJAd}NBv|0J^rLv_(@seZT#MLTROQlM(#g%xN|D~oF$r^$F7f#bt{q5pzz}S zIBS#}KAw^7_vlmMA;Hxz9)e9QK604 zItLD4ZzlV|t7R8)U^B#^G3KIrx}ERrVA~xyL-R(E8g$810tUSd4DXkCcH}a=IQ`M! zk?2cb!4ddDn*%Di^r zahk@o)Ko<-XRy=?Jg?7w7>;~Vu=|gZPS=F(F@J}XN(@uMo9j}Eb$op_cis$JD}>44R4z+G>%s7g|W z+lgSFrMtm~s$hS`39U-4#E&YD``Jw^u~`ZCrP+5@;(H^NOgbZK>`XU}tt8iDR^#=G z0e<$i)!k0DHgz+%)p%Gec{O}z-**1THa2?=&Qf^V*s?V^S8<|^-LM8%2}QAiXS>yV z4Jp8d&uBm(YBWGZAXdAjTL~^qCGP{ZqTHUPI=Guhs<#prjV!fJ)(w*WE>`33-Kw#U zH2emWdT(|CoRoC% z%^fQjoa%P>DG$wdQXr%PM0=)+A5oZYZ#mNn8a%Y^}BX_{ZtyG{roYU9chuyjb z_no+#XVLC8K8Lmb3gdypG-cSG-21ojM#xwLw#p_lm7_j4Hu48SOQmk9r4=V6F7os^j=r zAq)5XZ$xPFzYq=N3z>nClfbSwUl>@!Zf$_CW^En22rkF*XFFN*Hk_5`=LZHc^u<#8 z4xbkyu>y359~`=AFQxy`FUr_6Ry}+mq{N2?!j~fM@R|_o+J*;J+~sv4KmS|%#bQ5y zpk5{@@m!=@to9`wXAG-?vE)@z3zBU4mCE|GRW)!!^@A%dP<(MG zYut|WviKQl#2@lQr(uuoz`29&@@<`d{#*aUP?gjEwX~lP_@5z~ z{8NIv0L1x+AEy^V>OucAT^=N>-H+oUFJFBc<>%k``}tdbqF`0s{i+-^nU1#MJPWO1 z{rr2KZ1zt4Gzdj?vd4DfAz77yJd}@AFBOC0{X99JEkM8O$!DcBZ>Wdf;pxtws&wJE zBXG~+^P+v7m)X}TMNdnL?Yry33MCYJ8KHzy;%%G3i3rvB;3ce(Hx!B;19v`LxAwwX z#*2{iCOf7Mj~Lx2kPo*{C({Q`_=Wx6e)vR*%S;kt#b`Te0iUxEv_;SVX~d?jk)E14!x z-R-K!=nEDLy)6B2DfWzQjg#-8tpA1^mV0G=l+_-UN%sy&778Imym4f-SHs8fVDrRe zW2yakVO$&kcj#}Gk9YFJ*%$Z2RpYRGk@JmM{5P`V=R%*DJDZ%i-Sv!HdWRz`0kQ~T zsaJ4SY8yBTm5&dEU7F*a^HP+tdzb&P98(uL$5-tBS8$%zZ#z4s=v?!(`>yw<(ey)5+_PFKW#&5n5upX-wBqA1x#nPks7XVb1Ml$oZAvkg`s z$9-+H(E|3z$_Hsfvhi9O9?KZO0J*w_pdiJdXYAn|NhJ5BGj2O7@*h zval8}!5Aoy_+dLwsZ4vXuKo z;2V;At^rKF%Z)fK(^-g5@0f1V7;l!vmY5z-vc$j#J)=F8fu$P3BL>=$jra?xg_~uy zPOVI@nnKTuny01EZung1S8Y@1%-9yF^)Z~R-5NTw2<2RLW2%#XjvadpuFOZw&?{Eb zE34!Tq_kaX#G_gpu^C-l!cDc>#tx${HL}!k?CMR{+{7rI;I0sLZh$x}b&ns1Rq_ch z`^#~-rxEUBtoB1$_xzjrB2IA8hlMG>6)yhp%8a0m`mPXM01{)y=>kiV^PWMB~;!}*7!cY9?=`CJtz16 zG=GCP4l-NdVq-+H*G1+qs-iXk;sQMJ)RSoJym`y!Klvn;OU+)qZ2s(d)zo|^OMM7p z^%pLM|3g-dnDVEVEuo%RLOGsTwj6%`JbxK^eGjVfk*pf5)-6*qj#2Ex8x=8lABu`e z!2_duq5k;AsHa%!EG|_M2by)9#g=ly2Ll|6gU>QT*bE`K#^@&q;V=eiU~* zhHxl^(GZS>5Wf709)J)I8PQS*VK)#x4`HP8toFRjFN}lizd-gY#jseHV7DwDPLqe* zrTi^2ybTbaIss89AuN-^(Naj#{sU@+gronR5lQy~aRTK3{{yjIj3bJvxhY!3O;AbL zD*jKUF9zw30+8_kg!BJ3-8E6&BJp(Yrvrkc}I{8VW4@e2^wf^95(0#Wo*M4fOTip1+6Tn7*jZ~~r>0+cUD)JOmy;89Yj zf$+|gVwxAiH>LQnKf})Ha#TYdTp?x>qRkM8M1cW${$H>HaCWUi)EfXF02HqV0oTB^ z4S(ApKKd{4?kT`#0P_5w@I9oR1fU?ltQOk0tQI~Qvqfh3HMhm~y$u{A?fbllI1j=# z0J{NdAdcdqsdq1K+MN4!8bh9mN!527LG4&=p@e7>Vwa9UH`Hg zExI!e*rIAVhoWF(>*!5({}-^Ak}2(1vD$BOTxPfquG_G>f(^x1FUSn=2{dgANRbS{ zdcVN>nh!u7@PJCm5BzO~aRkEvqk}yb_`}8UOa>fk92rHBVs_-2d>j!esw29B zAK)9ukcrrWJjUR|~v!Y+bX7~j#!&QhWz{Q)!$Fhc#h1 zq4Ye~BojRmy2by7|Mdf4v=345!jzDX*}!+Q)grK%%BsGE|B)mYZxL=y`$UO-Kpd8s z5MIJe2To+QS7ozJS9;QKBGqp)Dq!8pZuk~1c9Km#0%SvuK#K$sHP!qslK(Cv{{)Z- zxFu+XkbqZ$8xRukNzeu%0raZ~8VCvKB+x@hfRexrA%R?g8uC*hfdxVWMG}-kNMNc2 zl@JoBlE48W0jC5m2nlSGpcX;`J0;i)A%TMuH2eymr-UEsgaj=R66jLT9Z@}ZnxED#bXlAshq z0#hZZgpfd$1P%xZI3;jFNMMr$wGa~6DZyR{2^^H5;di1QcsLwM{2fQE45%u#7L^aQW@C2gn#p3As30CDk@pkP01LWEQr~m)} delta 24916 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 V1&I3SgTLnf1h-dZc~2dT{yz?ozi$8l diff --git a/binaries/board_B.uf2 b/binaries/board_B.uf2 index 17c3548a83183d3bf51822219e5207e729cfe6d9..77e2bb4e36f2dcd3be8de9253f2431af0f7674ad 100644 GIT binary patch delta 27123 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 F|39%K1PA~C delta 24946 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 diff --git a/img/screensaver.gif b/img/screensaver.gif new file mode 100644 index 0000000000000000000000000000000000000000..d49cfc4321f3b99d58e707bb7a250fb01e1dbb56 GIT binary patch literal 186714 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 return; state->active_output ^= 1; - switch_output(state->active_output); + switch_output(state, state->active_output); }; /* This key combo records switch y top coordinate for different-size monitors */ -void screen_border_hotkey_handler(device_state_t* state) { +void screen_border_hotkey_handler(device_t *state) { border_size_t *border = &state->config.output[state->active_output].border; - /* To deal away with 2 different keys, if we're above half, it's the top coord and vice versa */ + /* To avoid having 2 different keys, if we're above half, it's the top coord */ if (state->mouse_y > (MAX_SCREEN_COORD / 2)) border->bottom = state->mouse_y; else border->top = state->mouse_y; - send_packet((uint8_t*)border, SYNC_BORDERS_MSG, sizeof(border_size_t)); - save_config(); + send_packet((uint8_t *)border, SYNC_BORDERS_MSG, sizeof(border_size_t)); + save_config(state); }; /* This key combo puts board A in firmware upgrade mode */ -void fw_upgrade_hotkey_handler_A(device_state_t* state) { +void fw_upgrade_hotkey_handler_A(device_t *state) { reset_usb_boot(1 << PICO_DEFAULT_LED_PIN, 0); }; /* This key combo puts board B in firmware upgrade mode */ -void fw_upgrade_hotkey_handler_B(device_state_t* state) { +void fw_upgrade_hotkey_handler_B(device_t *state) { send_value(ENABLE, FIRMWARE_UPGRADE_MSG); }; /* This key combo prevents mouse from switching outputs */ -void switchlock_hotkey_handler(device_state_t* state) { +void switchlock_hotkey_handler(device_t *state) { state->switch_lock ^= 1; send_value(state->switch_lock, SWITCH_LOCK_MSG); } -/* When pressed, erases stored config in flash and loads defaults */ -void wipe_config_hotkey_handler(device_state_t* state) { +/* When pressed, erases stored config in flash and loads defaults on both boards */ +void wipe_config_hotkey_handler(device_t *state) { wipe_config(); - load_config(); + load_config(state); + send_value(ENABLE, WIPE_CONFIG_MSG); } -void mouse_zoom_hotkey_handler(device_state_t* state) { - if (state->mouse_zoom) - return; +void screensaver_hotkey_handler(device_t *state) { + state->config.screensaver_enabled ^= 1; + send_value(state->config.screensaver_enabled, SCREENSAVER_MSG); +} - send_value(ENABLE, MOUSE_ZOOM_MSG); - state->mouse_zoom = true; -}; - -void all_keys_released_handler(device_state_t* state) { - if (state->mouse_zoom) { - state->mouse_zoom = false; - send_value(DISABLE, MOUSE_ZOOM_MSG); - } +/* When pressed, toggles the current mouse zoom mode state */ +void mouse_zoom_hotkey_handler(device_t *state) { + state->mouse_zoom ^= 1; + send_value(state->mouse_zoom, MOUSE_ZOOM_MSG); }; /**==================================================== * * ========== UART Message Handling Routines ======== * * ==================================================== */ -void handle_keyboard_uart_msg(uart_packet_t* packet, device_state_t* state) { - queue_kbd_report((hid_keyboard_report_t*)packet->data, state); +/* Function handles received keypresses from the other board */ +void handle_keyboard_uart_msg(uart_packet_t *packet, device_t *state) { + queue_kbd_report((hid_keyboard_report_t *)packet->data, state); state->last_activity[BOARD_ROLE] = time_us_64(); } -void handle_mouse_abs_uart_msg(uart_packet_t* packet, device_state_t* state) { - hid_abs_mouse_report_t* mouse_report = (hid_abs_mouse_report_t*)packet->data; +/* Function handles received mouse moves from the other board */ +void handle_mouse_abs_uart_msg(uart_packet_t *packet, device_t *state) { + mouse_abs_report_t *mouse_report = (mouse_abs_report_t *)packet->data; queue_mouse_report(mouse_report, state); state->mouse_x = mouse_report->x; @@ -100,52 +100,69 @@ void handle_mouse_abs_uart_msg(uart_packet_t* packet, device_state_t* state) { state->last_activity[BOARD_ROLE] = time_us_64(); } -void handle_output_select_msg(uart_packet_t* packet, device_state_t* state) { +/* Function handles request to switch output */ +void handle_output_select_msg(uart_packet_t *packet, device_t *state) { state->active_output = packet->data[0]; if (state->tud_connected) - stop_pressing_any_keys(&global_state); + release_all_keys(state); restore_leds(state); } /* On firmware upgrade message, reboot into the BOOTSEL fw upgrade mode */ -void handle_fw_upgrade_msg(void) { +void handle_fw_upgrade_msg(uart_packet_t *packet, device_t *state) { reset_usb_boot(1 << PICO_DEFAULT_LED_PIN, 0); } -void handle_mouse_zoom_msg(uart_packet_t* packet, device_state_t* state) { +/* Comply with request to turn mouse zoom mode on/off */ +void handle_mouse_zoom_msg(uart_packet_t *packet, device_t *state) { state->mouse_zoom = packet->data[0]; } -void handle_set_report_msg(uart_packet_t* packet, device_state_t* state) { - /* Only board B sends LED state through this message type */ +/* Process request to update keyboard LEDs */ +void handle_set_report_msg(uart_packet_t *packet, device_t *state) { state->keyboard_leds[BOARD_ROLE] = packet->data[0]; restore_leds(state); } -void handle_switch_lock_msg(uart_packet_t* packet, device_state_t* state) { +/* Process request to block mouse from switching, update internal state */ +void handle_switch_lock_msg(uart_packet_t *packet, device_t *state) { state->switch_lock = packet->data[0]; } /* Handle border syncing message that lets the other device know about monitor height offset */ -void handle_sync_borders_msg(uart_packet_t* packet, device_state_t* state) { - border_size_t *border = &state->config.output[state->active_output].border; - memcpy(border, packet->data, sizeof(border_size_t)); - save_config(); +void handle_sync_borders_msg(uart_packet_t *packet, device_t *state) { + border_size_t *border = &state->config.output[state->active_output].border; + memcpy(border, packet->data, sizeof(border_size_t)); + save_config(state); } /* When this message is received, flash the locally attached LED to verify serial comms */ -void handle_flash_led_msg(uart_packet_t* packet, device_state_t* state) { +void handle_flash_led_msg(uart_packet_t *packet, device_t *state) { blink_led(state); } +/* When this message is received, wipe the local flash config */ +void handle_wipe_config_msg(uart_packet_t *packet, device_t *state) { + wipe_config(); + load_config(state); +} + +void handle_screensaver_msg(uart_packet_t *packet, device_t *state) { + state->config.screensaver_enabled = packet->data[0]; +} + +/**==================================================== * + * ============== Output Switch Routines ============ * + * ==================================================== */ + /* Update output variable, set LED on/off and notify the other board so they are in sync. */ -void switch_output(uint8_t new_output) { - global_state.active_output = new_output; - restore_leds(&global_state); +void switch_output(device_t *state, uint8_t new_output) { + state->active_output = new_output; + restore_leds(state); send_value(new_output, OUTPUT_SELECT_MSG); /* If we were holding a key down and drag the mouse to another screen, the key gets stuck. Changing outputs = no more keypresses on the previous system. */ - stop_pressing_any_keys(&global_state); + release_all_keys(state); } diff --git a/src/hid_parser.c b/src/hid_parser.c index 3e25a62..c53bf90 100644 --- a/src/hid_parser.c +++ b/src/hid_parser.c @@ -1,63 +1,62 @@ -/* +/* * This file is part of DeskHop (https://github.com/hrvach/deskhop). * Copyright (c) 2024 Hrvoje Cavrak - * - * Based on the TinyUSB HID parser routine and the amazing USB2N64 + * + * Based on the TinyUSB HID parser routine and the amazing USB2N64 * adapter (https://github.com/pdaxrom/usb2n64-adapter) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License + * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "main.h" -#include "hid_parser.h" #define IS_BLOCK_END (collection.start == collection.end) -#define MAX_BUTTONS 16 +#define MAX_BUTTONS 16 enum { SIZE_0_BIT = 0, SIZE_8_BIT = 1, SIZE_16_BIT = 2, SIZE_32_BIT = 3 }; -/* Size is 0, 1, 2, or 3, describing cases of no data, 8-bit, 16-bit, +/* Size is 0, 1, 2, or 3, describing cases of no data, 8-bit, 16-bit, or 32-bit data. */ uint32_t get_descriptor_value(uint8_t const *report, int size) { - switch (size) { - case SIZE_8_BIT: - return report[0]; - case SIZE_16_BIT: - return tu_u16(report[1], report[0]); - case SIZE_32_BIT: - return tu_u32(report[3], report[2], report[1], report[0]); - default: - return 0; - } + switch (size) { + case SIZE_8_BIT: + return report[0]; + case SIZE_16_BIT: + return tu_u16(report[1], report[0]); + case SIZE_32_BIT: + return tu_u32(report[3], report[2], report[1], report[0]); + default: + return 0; + } } /* We store all globals as unsigned to avoid countless switch/cases. In case of e.g. min/max, we need to treat some data as signed retroactively. */ int32_t to_signed(globals_t *data) { - switch (data->hdr.size) { - case SIZE_8_BIT: - return (int8_t)data->val; - case SIZE_16_BIT: - return (int16_t)data->val; - default: - return data->val; - } + switch (data->hdr.size) { + case SIZE_8_BIT: + return (int8_t)data->val; + case SIZE_16_BIT: + return (int16_t)data->val; + default: + return data->val; + } } -/* Given a value struct with size and offset in bits, +/* Given a value struct with size and offset in bits, find and return a value from the HID report */ -int32_t get_report_value(uint8_t* report, report_val_t *val) { +int32_t get_report_value(uint8_t *report, report_val_t *val) { /* Calculate the bit offset within the byte */ uint8_t offset_in_bits = val->offset % 8; @@ -78,7 +77,7 @@ int32_t get_report_value(uint8_t* report, report_val_t *val) { result |= report[++byte_offset] << remaining_bits; remaining_bits += 8; } - + /* Apply the mask to retain only the desired number of bits */ result = result & mask; @@ -92,119 +91,135 @@ int32_t get_report_value(uint8_t* report, report_val_t *val) { return result; } -/* This method is far from a generalized HID descriptor parsing, but should work - * well enough to find the basic values we care about to move the mouse around. - * Your descriptor for a mouse with 2 wheels and 264 buttons might not parse correctly. - **/ -uint8_t parse_report_descriptor(mouse_t *mouse, uint8_t arr_count, - uint8_t const *report, uint16_t desc_len) { +void update_usage(parser_state_t *parser, int i) { + /* If we don't have as many usages as elements, the usage for the previous element applies */ + if (i && i >= parser->usage_count) { + *(parser->p_usage + i) = *(parser->p_usage + parser->usage_count - 1); + } +} - /* Get these elements and store them in the proper place in the mouse struct - * For example, to match wheel, we want collection usage to be HID_USAGE_DESKTOP_MOUSE, page to be HID_USAGE_PAGE_DESKTOP, - * usage to be HID_USAGE_DESKTOP_WHEEL, then if all of that is matched we store the value to mouse->wheel */ - const usage_map_t usage_map[] = { - {HID_USAGE_DESKTOP_MOUSE, HID_USAGE_PAGE_BUTTON, HID_USAGE_DESKTOP_POINTER, &mouse->buttons}, - {HID_USAGE_DESKTOP_MOUSE, HID_USAGE_PAGE_DESKTOP, HID_USAGE_DESKTOP_X, &mouse->move_x}, - {HID_USAGE_DESKTOP_MOUSE, HID_USAGE_PAGE_DESKTOP, HID_USAGE_DESKTOP_Y, &mouse->move_y}, - {HID_USAGE_DESKTOP_MOUSE, HID_USAGE_PAGE_DESKTOP, HID_USAGE_DESKTOP_WHEEL, &mouse->wheel}, +void find_and_store_element(parser_state_t *parser, int map_len, int i) { + usage_map_t *map = &parser->map[0]; + + for (int j = 0; j < map_len; j++, map++) { + /* Filter based on usage criteria */ + if (map->report_usage == parser->global_usage + && map->usage_page == parser->globals[RI_GLOBAL_USAGE_PAGE].val + && map->usage == *(parser->p_usage + i)) { + + /* Buttons are the ones that appear multiple times, aggregate for now */ + if (map->element->size) { + map->element->size++; + continue; + } + + /* Store the found element's attributes */ + map->element->offset = parser->offset_in_bits; + map->element->size = parser->globals[RI_GLOBAL_REPORT_SIZE].val; + map->element->min = to_signed(&parser->globals[RI_GLOBAL_LOGICAL_MIN]); + map->element->max = to_signed(&parser->globals[RI_GLOBAL_LOGICAL_MAX]); + } + } +} + +void handle_global_item(parser_state_t *parser, header_t *header, uint32_t data, mouse_t *mouse) { + /* There are just 16 possible tags, store any one that comes along to an array + instead of doing switch and 16 cases */ + parser->globals[header->tag].val = data; + parser->globals[header->tag].hdr = *header; + + if (header->tag == RI_GLOBAL_REPORT_ID) { + /* Important to track, if report IDs are used reports are preceded/offset by a 1-byte ID value */ + if (parser->global_usage == HID_USAGE_DESKTOP_MOUSE) + mouse->report_id = data; + + mouse->uses_report_id = true; + } +} + +void handle_local_item(parser_state_t *parser, header_t *header, uint32_t data) { + if (header->tag == RI_LOCAL_USAGE) { + /* If we are not within a collection, the usage tag applies to the entire section */ + if (parser->collection.start == parser->collection.end) { + parser->global_usage = data; + } else { + *(parser->p_usage + parser->usage_count++) = data; + } + } +} + +void handle_main_item(parser_state_t *parser, header_t *header, int map_len) { + /* Update Collection */ + parser->collection.start += (header->tag == RI_MAIN_COLLECTION); + parser->collection.end += (header->tag == RI_MAIN_COLLECTION_END); + + if (header->tag == RI_MAIN_INPUT) { + for (int i = 0; i < parser->globals[RI_GLOBAL_REPORT_COUNT].val; i++) { + update_usage(parser, i); + find_and_store_element(parser, map_len, i); + + /* Iterate times and increase offset by amount, moving by x bits */ + parser->offset_in_bits += parser->globals[RI_GLOBAL_REPORT_SIZE].val; + } + + /* Advance the usage array pointer by global report count and reset the count variable */ + parser->p_usage += parser->globals[RI_GLOBAL_REPORT_COUNT].val; + parser->usage_count = 0; + } +} + + +/* This method is sub-optimal and far from a generalized HID descriptor parsing, but should + * hopefully work well enough to find the basic values we care about to move the mouse around. + * Your descriptor for a mouse with 2 wheels and 264 buttons might not parse correctly. + **/ +uint8_t parse_report_descriptor(mouse_t *mouse, uint8_t arr_count, uint8_t const *report, uint16_t desc_len) { + usage_map_t usage_map[] = { + {.report_usage = HID_USAGE_DESKTOP_MOUSE, + .usage_page = HID_USAGE_PAGE_BUTTON, + .usage = HID_USAGE_DESKTOP_POINTER, + .element = &mouse->buttons}, + + {.report_usage = HID_USAGE_DESKTOP_MOUSE, + .usage_page = HID_USAGE_PAGE_DESKTOP, + .usage = HID_USAGE_DESKTOP_X, + .element = &mouse->move_x}, + + {.report_usage = HID_USAGE_DESKTOP_MOUSE, + .usage_page = HID_USAGE_PAGE_DESKTOP, + .usage = HID_USAGE_DESKTOP_Y, + .element = &mouse->move_y}, + + {.report_usage = HID_USAGE_DESKTOP_MOUSE, + .usage_page = HID_USAGE_PAGE_DESKTOP, + .usage = HID_USAGE_DESKTOP_WHEEL, + .element = &mouse->wheel}, }; - /* Some variables used for keeping tabs on parsing */ - uint8_t usage_count = 0; - uint8_t g_usage = 0; - - uint32_t offset_in_bits = 0; + parser_state_t parser = {0}; + parser.p_usage = parser.usages; + parser.map = usage_map; - uint8_t usages[64] = {0}; - uint8_t* p_usage = usages; + while (desc_len > 0) { + header_t header = *(header_t *)report++; + uint32_t data = get_descriptor_value(report, header.size); - collection_t collection = {0}; + switch (header.type) { + case RI_TYPE_MAIN: + handle_main_item(&parser, &header, ARRAY_SIZE(usage_map)); + break; - /* as tag is 4 bits, there can be 16 different tags in global header type */ - globals_t globals[16] = {0}; + case RI_TYPE_GLOBAL: + handle_global_item(&parser, &header, data, mouse); + break; - for (int len = desc_len; len > 0; len--) { - header_t header = *(header_t *)report++; - uint32_t data = get_descriptor_value(report, header.size); - - switch (header.type) { - case RI_TYPE_MAIN: - // Keep count of collections, starts and ends - collection.start += (header.tag == RI_MAIN_COLLECTION); - collection.end += (header.tag == RI_MAIN_COLLECTION_END); - - if (header.tag == RI_MAIN_INPUT) { - for (int i = 0; i < globals[RI_GLOBAL_REPORT_COUNT].val; i++) { - - /* If we don't have as many usages as elements, the usage for the previous - element applies */ - if (i && i >= usage_count ) { - *(p_usage + i) = *(p_usage + usage_count - 1); - } - - const usage_map_t *map = usage_map; - - /* Only focus on the items we care about (buttons, x and y, wheels, etc) */ - for (int j=0; jreport_usage == g_usage && - map->usage_page == globals[RI_GLOBAL_USAGE_PAGE].val && - map->usage == *(p_usage + i)) { - - /* Buttons are the ones that appear multiple times, will handle them properly - For now, let's just aggregate the length and combine them into one :) */ - if (map->element->size) { - map->element->size++; - continue; - } - - /* Store the found element's attributes */ - map->element->offset = offset_in_bits; - map->element->size = globals[RI_GLOBAL_REPORT_SIZE].val; - map->element->min = to_signed(&globals[RI_GLOBAL_LOGICAL_MIN]); - map->element->max = to_signed(&globals[RI_GLOBAL_LOGICAL_MAX]); - } - }; - - /* Iterate times and increase offset by amount, moving by x bits */ - offset_in_bits += globals[RI_GLOBAL_REPORT_SIZE].val; + case RI_TYPE_LOCAL: + handle_local_item(&parser, &header, data); + break; } - /* Advance the usage array pointer by global report count and reset the count variable */ - p_usage += globals[RI_GLOBAL_REPORT_COUNT].val; - usage_count = 0; - } - break; - - case RI_TYPE_GLOBAL: - /* There are just 16 possible tags, store any one that comes along to an array instead of doing - switch and 16 cases */ - globals[header.tag].val = data; - globals[header.tag].hdr = header; - - if (header.tag == RI_GLOBAL_REPORT_ID) { - /* Important to track, if report IDs are used reports are preceded/offset by a 1-byte ID value */ - if(g_usage == HID_USAGE_DESKTOP_MOUSE) - mouse->report_id = data; - - mouse->uses_report_id = true; - } - break; - - case RI_TYPE_LOCAL: - if (header.tag == RI_LOCAL_USAGE) { - /* If we are not within a collection, the usage tag applies to the entire section */ - if (IS_BLOCK_END) - g_usage = data; - else - *(p_usage + usage_count++) = data; - } - break; + /* Move to the next position and decrement size by header length + data length */ + report += header.size; + desc_len -= header.size + 1; } - - /* If header specified some non-zero length data, move by that much to get to the new byte - we should interpret as a header element */ - report += header.size; - len -= header.size; - } - return 0; + return 0; } diff --git a/src/hid_parser.h b/src/hid_parser.h index 4d9381b..4ab2250 100644 --- a/src/hid_parser.h +++ b/src/hid_parser.h @@ -18,9 +18,12 @@ * along with this program. If not, see . */ #pragma once + +#include "main.h" + #define MAX_REPORTS 32 -/* Counts how many collection starts and ends we've seen, when they equalize +/* Counts how many collection starts and ends we've seen, when they equalize (and not zero), we are at the end of a block */ typedef struct { uint8_t start; @@ -52,8 +55,8 @@ typedef struct { /* Describes where can we find a value in a HID report */ typedef struct { - uint16_t offset; // In bits - uint8_t size; // In bits + uint16_t offset; // In bits + uint8_t size; // In bits int32_t min; int32_t max; } report_val_t; @@ -61,15 +64,14 @@ typedef struct { /* Defines information about HID report format for the mouse. */ typedef struct { report_val_t buttons; - report_val_t move_x; report_val_t move_y; - report_val_t wheel; - bool uses_report_id; uint8_t report_id; uint8_t protocol; + + bool uses_report_id; } mouse_t; /* For each element type we're interested in there is an entry @@ -79,5 +81,18 @@ typedef struct { uint8_t report_usage; uint8_t usage_page; uint8_t usage; - report_val_t* element; + report_val_t *element; } usage_map_t; + +typedef struct { + uint8_t usage_count; + uint8_t global_usage; + uint32_t offset_in_bits; + uint8_t usages[64]; + uint8_t *p_usage; + + collection_t collection; + usage_map_t *map; + + globals_t globals[16]; /* as tag is 4 bits, there can be 16 different tags in global header type */ +} parser_state_t; \ No newline at end of file diff --git a/src/keyboard.c b/src/keyboard.c index 8d0ed3e..1bf42a3 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -18,63 +18,114 @@ #include "main.h" /* ==================================================== * - * Hotkeys to trigger actions via the keyboard + * Hotkeys to trigger actions via the keyboard. * ==================================================== */ hotkey_combo_t hotkeys[] = { /* Main keyboard switching hotkey */ - {.modifier = 0, - .keys = {HOTKEY_TOGGLE}, - .key_count = 1, + {.modifier = 0, + .keys = {HOTKEY_TOGGLE}, + .key_count = 1, + .pass_to_os = false, .action_handler = &output_toggle_hotkey_handler}, - /* Holding down right ALT slows the mouse down */ - {.modifier = KEYBOARD_MODIFIER_RIGHTALT, - .keys = {}, - .key_count = 0, - .pass_to_os = true, + /* Pressing right ALT + right CTRL toggles the slow mouse mode */ + {.modifier = KEYBOARD_MODIFIER_RIGHTALT | KEYBOARD_MODIFIER_RIGHTCTRL, + .keys = {}, + .key_count = 0, + .pass_to_os = true, + .acknowledge = true, .action_handler = &mouse_zoom_hotkey_handler}, /* Switch lock */ - {.modifier = KEYBOARD_MODIFIER_RIGHTCTRL, - .keys = {HID_KEY_L}, - .key_count = 1, - .acknowledge = true, + {.modifier = KEYBOARD_MODIFIER_RIGHTCTRL, + .keys = {HID_KEY_L}, + .key_count = 1, + .acknowledge = true, .action_handler = &switchlock_hotkey_handler}, /* Erase stored config */ - {.modifier = KEYBOARD_MODIFIER_RIGHTSHIFT, - .keys = {HID_KEY_F12, HID_KEY_D}, - .key_count = 2, - .acknowledge = true, + {.modifier = KEYBOARD_MODIFIER_RIGHTSHIFT, + .keys = {HID_KEY_F12, HID_KEY_D}, + .key_count = 2, + .acknowledge = true, .action_handler = &wipe_config_hotkey_handler}, + /* Toggle screensaver function */ + {.modifier = KEYBOARD_MODIFIER_RIGHTSHIFT, + .keys = {HID_KEY_F12, HID_KEY_S}, + .key_count = 2, + .acknowledge = true, + .action_handler = &screensaver_hotkey_handler}, + /* Record switch y coordinate */ - {.modifier = KEYBOARD_MODIFIER_RIGHTSHIFT, - .keys = {HID_KEY_F12, HID_KEY_Y}, - .key_count = 2, - .acknowledge = true, + {.modifier = KEYBOARD_MODIFIER_RIGHTSHIFT, + .keys = {HID_KEY_F12, HID_KEY_Y}, + .key_count = 2, + .acknowledge = true, .action_handler = &screen_border_hotkey_handler}, /* Hold down left shift + right shift + F12 + A ==> firmware upgrade mode for board A (kbd) */ - {.modifier = KEYBOARD_MODIFIER_RIGHTSHIFT | KEYBOARD_MODIFIER_LEFTSHIFT, - .keys = {HID_KEY_F12, HID_KEY_A}, - .key_count = 2, - .acknowledge = true, + {.modifier = KEYBOARD_MODIFIER_RIGHTSHIFT | KEYBOARD_MODIFIER_LEFTSHIFT, + .keys = {HID_KEY_F12, HID_KEY_A}, + .key_count = 2, + .acknowledge = true, .action_handler = &fw_upgrade_hotkey_handler_A}, /* Hold down left shift + right shift + F12 + B ==> firmware upgrade mode for board B (mouse) */ - {.modifier = KEYBOARD_MODIFIER_RIGHTSHIFT | KEYBOARD_MODIFIER_LEFTSHIFT, - .keys = {HID_KEY_F12, HID_KEY_B}, - .key_count = 2, - .acknowledge = true, + {.modifier = KEYBOARD_MODIFIER_RIGHTSHIFT | KEYBOARD_MODIFIER_LEFTSHIFT, + .keys = {HID_KEY_F12, HID_KEY_B}, + .key_count = 2, + .acknowledge = true, .action_handler = &fw_upgrade_hotkey_handler_B}}; +/* ============================================================ * + * Detect if any hotkeys were pressed + * ============================================================ */ + +/* Tries to find if the keyboard report contains key, returns true/false */ +bool key_in_report(uint8_t key, const hid_keyboard_report_t *report) { + for (int j = 0; j < KEYS_IN_USB_REPORT; j++) { + if (key == report->keycode[j]) { + return true; + } + } + + return false; +} + +/* Check if the current report matches a specific hotkey passed on */ +bool check_specific_hotkey(hotkey_combo_t keypress, const hid_keyboard_report_t *report) { + /* We expect all modifiers specified to be detected in the report */ + if (keypress.modifier != (report->modifier & keypress.modifier)) + return false; + + for (int n = 0; n < keypress.key_count; n++) { + if (!key_in_report(keypress.keys[n], report)) { + return false; + } + } + + /* Getting here means all of the keys were found. */ + return true; +} + +/* Go through the list of hotkeys, check if any of them match. */ +hotkey_combo_t *check_all_hotkeys(hid_keyboard_report_t *report, device_t *state) { + for (int n = 0; n < ARRAY_SIZE(hotkeys); n++) { + if (check_specific_hotkey(hotkeys[n], report)) { + return &hotkeys[n]; + } + } + + return NULL; +} + /* ==================================================== * * Keyboard Queue Section * ==================================================== */ -void process_kbd_queue_task(device_state_t* state) { +void process_kbd_queue_task(device_t *state) { hid_keyboard_report_t report; /* If we're not connected, we have nowhere to send reports to. */ @@ -93,7 +144,7 @@ void process_kbd_queue_task(device_state_t* state) { queue_try_remove(&state->kbd_queue, &report); } -void queue_kbd_report(hid_keyboard_report_t* report, device_state_t* state) { +void queue_kbd_report(hid_keyboard_report_t *report, device_t *state) { /* It wouldn't be fun to queue up a bunch of messages and then dump them all on host */ if (!state->tud_connected) return; @@ -101,18 +152,18 @@ void queue_kbd_report(hid_keyboard_report_t* report, device_state_t* state) { queue_try_add(&state->kbd_queue, report); } -void stop_pressing_any_keys(device_state_t* state) { +void release_all_keys(device_t *state) { static hid_keyboard_report_t no_keys_pressed_report = {0, 0, {0}}; queue_try_add(&state->kbd_queue, &no_keys_pressed_report); } /* If keys need to go locally, queue packet to kbd queue, else send them through UART */ -void send_key(hid_keyboard_report_t* report, device_state_t* state) { - if (state->active_output == BOARD_ROLE) { +void send_key(hid_keyboard_report_t *report, device_t *state) { + if (CURRENT_BOARD_IS_ACTIVE_OUTPUT) { queue_kbd_report(report, state); state->last_activity[BOARD_ROLE] = time_us_64(); } else { - send_packet((uint8_t*)report, KEYBOARD_REPORT_MSG, KBD_REPORT_LENGTH); + send_packet((uint8_t *)report, KEYBOARD_REPORT_MSG, KBD_REPORT_LENGTH); } } @@ -120,81 +171,30 @@ void send_key(hid_keyboard_report_t* report, device_state_t* state) { * Parse and interpret the keys pressed on the keyboard * ==================================================== */ -bool no_keys_are_pressed(const hid_keyboard_report_t* report) { - if (report->modifier != 0) - return false; - - for (int n = 0; n < KEYS_IN_USB_REPORT; n++) { - if (report->keycode[n] != 0) - return false; - } - return true; -} - -hotkey_combo_t* check_hotkeys(hid_keyboard_report_t* report, int length, device_state_t* state) { - /* Go through the list of hotkeys, check if any are pressed, then execute their handler */ - for (int n = 0; n < sizeof(hotkeys) / sizeof(hotkeys[0]); n++) { - if (is_key_pressed(hotkeys[n], report)) { - return &hotkeys[n]; - } - } - - return NULL; -} - -void process_keyboard_report(uint8_t* raw_report, int length, device_state_t* state) { - hid_keyboard_report_t* keyboard_report = (hid_keyboard_report_t*)raw_report; - hotkey_combo_t* hotkey = NULL; +void process_keyboard_report(uint8_t *raw_report, int length, device_t *state) { + hid_keyboard_report_t *keyboard_report = (hid_keyboard_report_t *)raw_report; + hotkey_combo_t *hotkey = NULL; if (length < KBD_REPORT_LENGTH) return; - - /* If no keys are pressed anymore, take care of checking and deactivating stuff */ - if(no_keys_are_pressed(keyboard_report)) - all_keys_released_handler(state); - else - /* Check if it was a hotkey, makes sense only if a key is pressed */ - hotkey = check_hotkeys(keyboard_report, length, state); + + /* Check if any hotkey was pressed */ + hotkey = check_all_hotkeys(keyboard_report, state); /* ... and take appropriate action */ - if(hotkey != NULL) { + if (hotkey != NULL) { /* Provide visual feedback we received the action */ if (hotkey->acknowledge) blink_led(state); - + + /* Execute the corresponding handler */ hotkey->action_handler(state); + + /* And pass the key to the output PC if configured to do so. */ if (!hotkey->pass_to_os) return; } - + /* This method will decide if the key gets queued locally or sent through UART */ send_key(keyboard_report, state); } - -/* ============================================================ * - * Check if a specific key combination is present in the report - * ============================================================ */ - -bool is_key_pressed(hotkey_combo_t keypress, const hid_keyboard_report_t* report) { - int matches = 0; - - /* We expect all modifiers specified to be detected in the report */ - if (keypress.modifier != (report->modifier & keypress.modifier)) - return false; - - for (int n = 0; n < keypress.key_count; n++) { - for (int j = 0; j < KEYS_IN_USB_REPORT; j++) { - if (keypress.keys[n] == report->keycode[j]) { - matches++; - break; - } - } - /* If any of the keys are not found, we can bail out early. */ - if (matches < n + 1) { - return false; - } - } - - /* Getting here means all of the keys were found. */ - return true; -} \ No newline at end of file diff --git a/src/led.c b/src/led.c index 443cf77..4f890b4 100644 --- a/src/led.c +++ b/src/led.c @@ -21,35 +21,40 @@ * ========== Update pico and keyboard LEDs ========== * * ==================================================== */ -void set_keyboard_leds(uint8_t requested_led_state, device_state_t* state) { +void set_keyboard_leds(uint8_t requested_led_state, device_t *state) { static uint8_t new_led_value; new_led_value = requested_led_state; if (state->keyboard_connected) { - tuh_hid_set_report(state->kbd_dev_addr, state->kbd_instance, 0, HID_REPORT_TYPE_OUTPUT, - &new_led_value, sizeof(uint8_t)); + tuh_hid_set_report(state->kbd_dev_addr, + state->kbd_instance, + 0, + HID_REPORT_TYPE_OUTPUT, + &new_led_value, + sizeof(uint8_t)); } } -void restore_leds(device_state_t* state) { +void restore_leds(device_t *state) { + /* Light up on-board LED if current board is active output */ state->onboard_led_state = (state->active_output == BOARD_ROLE); gpio_put(GPIO_LED_PIN, state->onboard_led_state); + /* Light up appropriate keyboard leds (if it's connected locally) */ if (state->keyboard_connected) { uint8_t leds = state->keyboard_leds[state->active_output]; set_keyboard_leds(leds, state); } } -void blink_led(device_state_t* state) { +void blink_led(device_t *state) { /* Since LEDs might be ON previously, we go OFF, ON, OFF, ON, OFF */ - state->blinks_left = 5; + state->blinks_left = 5; state->last_led_change = time_us_32(); } -void led_blinking_task(device_state_t* state) { - /* 80 ms off, 80 ms on */ - const int blink_interval_us = 80000; +void led_blinking_task(device_t *state) { + const int blink_interval_us = 80000; /* 80 ms off, 80 ms on */ static uint8_t leds; /* If there is no more blinking to be done, exit immediately */ @@ -77,4 +82,4 @@ void led_blinking_task(device_state_t* state) { /* Restore LEDs in the last pass */ if (state->blinks_left == 0) restore_leds(state); -} +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index 58ca8a3..dcb673e 100644 --- a/src/main.c +++ b/src/main.c @@ -1,24 +1,25 @@ -/* +/* * This file is part of DeskHop (https://github.com/hrvach/deskhop). * Copyright (c) 2024 Hrvoje Cavrak - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License + * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "main.h" /********* Global Variable **********/ -device_state_t global_state = {0}; +device_t global_state = {0}; +device_t *device = &global_state; /**================================================== * * ============== Main Program Loops ============== * @@ -29,25 +30,24 @@ void main(void) { sleep_ms(10); // Initial board setup - initial_setup(); + initial_setup(device); // Initial state, A is the default output - switch_output(ACTIVE_OUTPUT_A); - + switch_output(device, OUTPUT_A); + while (true) { // USB device task, needs to run as often as possible tud_task(); // Verify core1 is still running and if so, reset watchdog timer - kick_watchdog(); + kick_watchdog(device); // Check if there were any keypresses and send them - process_kbd_queue_task(&global_state); + process_kbd_queue_task(device); // Check if there were any mouse movements and send them - process_mouse_queue_task(&global_state); + process_mouse_queue_task(device); } - } void core1_main() { @@ -55,17 +55,20 @@ void core1_main() { while (true) { // Update the timestamp, so core0 can figure out if we're dead - global_state.core1_last_loop_pass = time_us_64(); + device->core1_last_loop_pass = time_us_64(); // USB host task, needs to run as often as possible if (tuh_inited()) tuh_task(); // Receives data over serial from the other board - receive_char(&in_packet, &global_state); + receive_char(&in_packet, device); // Check if LED needs blinking - led_blinking_task(&global_state); + led_blinking_task(device); + + // Mouse screensaver task + screensaver_task(device); } } diff --git a/src/main.h b/src/main.h index 6208fbd..f14dce2 100644 --- a/src/main.h +++ b/src/main.h @@ -17,47 +17,48 @@ #pragma once -#include "pico/stdlib.h" - #include +#include +#include #include #include #include -#include "hardware/flash.h" -#include "hardware/sync.h" -#include "hardware/watchdog.h" #include "hid_parser.h" -#include "pico/bootrom.h" -#include "pico/multicore.h" -#include "pico/stdlib.h" -#include "pico/util/queue.h" #include "pio_usb.h" #include "tusb.h" #include "usb_descriptors.h" #include "user_config.h" +#include +#include +#include +#include +#include +#include +#include /********* Misc definitions for better readability **********/ #define PICO_A 0 #define PICO_B 1 -#define ACTIVE_OUTPUT_A 0 -#define ACTIVE_OUTPUT_B 1 +#define OUTPUT_A 0 +#define OUTPUT_B 1 -#define ENABLE 1 +#define ENABLE 1 #define DISABLE 0 -#define DIRECTION_X 0 -#define DIRECTION_Y 1 - -#define MAX_REPORT_ITEMS 16 +#define MAX_REPORT_ITEMS 16 #define MOUSE_BOOT_REPORT_LEN 4 -#define NUM_SCREENS 2 // Will be more in the future +#define NUM_SCREENS 2 // Will be more in the future +#define MOUSE_ZOOM_SCALING_FACTOR 2 + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#define CURRENT_BOARD_IS_ACTIVE_OUTPUT (global_state.active_output == BOARD_ROLE) /********* Pinout definitions **********/ -#define PIO_USB_DP_PIN 14 // D+ is pin 14, D- is pin 15 -#define GPIO_LED_PIN 25 // LED is connected to pin 25 on a PICO +#define PIO_USB_DP_PIN 14 // D+ is pin 14, D- is pin 15 +#define GPIO_LED_PIN 25 // LED is connected to pin 25 on a PICO #if BOARD_ROLE == PICO_B #define SERIAL_TX_PIN 16 @@ -68,17 +69,17 @@ #endif /********* Serial port definitions **********/ -#define SERIAL_UART uart0 +#define SERIAL_UART uart0 #define SERIAL_BAUDRATE 3686400 #define SERIAL_DATA_BITS 8 #define SERIAL_STOP_BITS 1 -#define SERIAL_PARITY UART_PARITY_NONE +#define SERIAL_PARITY UART_PARITY_NONE /********* Watchdog definitions **********/ -#define WATCHDOG_TIMEOUT 500 // In milliseconds => needs to be reset every 500 ms -#define WATCHDOG_PAUSE_ON_DEBUG 1 // When using a debugger, disable watchdog -#define CORE1_HANG_TIMEOUT_US 500000 // In microseconds, wait up to 0.5s to declare core1 dead +#define WATCHDOG_TIMEOUT 500 // In milliseconds => needs to be reset every 500 ms +#define WATCHDOG_PAUSE_ON_DEBUG 1 // When using a debugger, disable watchdog +#define CORE1_HANG_TIMEOUT_US 500000 // In microseconds, wait up to 0.5s to declare core1 dead /********* Protocol definitions ********* * @@ -91,15 +92,17 @@ */ enum packet_type_e { - KEYBOARD_REPORT_MSG = 1, - MOUSE_REPORT_MSG = 2, - OUTPUT_SELECT_MSG = 3, + KEYBOARD_REPORT_MSG = 1, + MOUSE_REPORT_MSG = 2, + OUTPUT_SELECT_MSG = 3, FIRMWARE_UPGRADE_MSG = 4, - MOUSE_ZOOM_MSG = 5, - KBD_SET_REPORT_MSG = 6, - SWITCH_LOCK_MSG = 7, - SYNC_BORDERS_MSG = 8, - FLASH_LED_MSG = 9, + MOUSE_ZOOM_MSG = 5, + KBD_SET_REPORT_MSG = 6, + SWITCH_LOCK_MSG = 7, + SYNC_BORDERS_MSG = 8, + FLASH_LED_MSG = 9, + SCREENSAVER_MSG = 10, + WIPE_CONFIG_MSG = 11, }; /* @@ -112,45 +115,48 @@ enum packet_type_e { /* Data structure defining packets of information transferred */ typedef struct { - uint8_t type; // Enum field describing the type of packet - uint8_t data[8]; // Data goes here (type + payload + checksum) - uint8_t checksum; // Checksum, a simple XOR-based one + uint8_t type; // Enum field describing the type of packet + uint8_t data[8]; // Data goes here (type + payload + checksum) + uint8_t checksum; // Checksum, a simple XOR-based one } uart_packet_t; /********* Packet parameters **********/ -#define START1 0xAA -#define START2 0x55 +#define START1 0xAA +#define START2 0x55 #define START_LENGTH 2 -#define TYPE_LENGTH 1 -#define PACKET_DATA_LENGTH 8 // For simplicity, all packet types are the same length -#define CHECKSUM_LENGTH 1 +#define TYPE_LENGTH 1 +#define PACKET_DATA_LENGTH 8 // For simplicity, all packet types are the same length +#define CHECKSUM_LENGTH 1 -#define PACKET_LENGTH (TYPE_LENGTH + PACKET_DATA_LENGTH + CHECKSUM_LENGTH) +#define PACKET_LENGTH (TYPE_LENGTH + PACKET_DATA_LENGTH + CHECKSUM_LENGTH) #define RAW_PACKET_LENGTH (START_LENGTH + PACKET_LENGTH) -#define KBD_QUEUE_LENGTH 128 +#define KBD_QUEUE_LENGTH 128 #define MOUSE_QUEUE_LENGTH 2048 -#define KEYS_IN_USB_REPORT 6 -#define KBD_REPORT_LENGTH 8 +#define KEYS_IN_USB_REPORT 6 +#define KBD_REPORT_LENGTH 8 #define MOUSE_REPORT_LENGTH 7 /********* Screen **********/ +#define MIN_SCREEN_COORD 0 #define MAX_SCREEN_COORD 32767 /********* Configuration storage definitions **********/ +#define CURRENT_CONFIG_VERSION 2 + typedef struct { - int top; // When jumping from a smaller to a bigger screen, go to THIS top height - int bottom; // When jumping from a smaller to a bigger screen, go to THIS bottom - // height + int top; // When jumping from a smaller to a bigger screen, go to THIS top height + int bottom; // When jumping from a smaller to a bigger screen, go to THIS bottom + // height } border_size_t; /* Define output parameters */ typedef struct { - int number; // Number of this output (e.g. ACTIVE_OUTPUT_A = 0 etc) + int number; // Number of this output (e.g. OUTPUT_A = 0 etc) int screen_count; // How many monitors per output (e.g. Output A is Windows with 3 monitors) int screen_index; // Current active screen int speed_x; // Mouse speed per output, in direction X @@ -161,8 +167,11 @@ typedef struct { /* Data structure defining how configuration is stored */ typedef struct { uint32_t magic_header; + uint32_t version; uint8_t force_mouse_boot_mode; output_t output[NUM_SCREENS]; + uint8_t screensaver_enabled; + // Keep checksum at the end of the struct uint32_t checksum; } config_t; @@ -175,13 +184,18 @@ extern config_t ADDR_CONFIG[]; typedef void (*action_handler_t)(); +typedef struct { // Maps message type -> message handler function + enum packet_type_e type; + action_handler_t handler; +} uart_handler_t; + typedef struct { - uint8_t modifier; // Which modifier is pressed - uint8_t keys[6]; // Which keys need to be pressed - uint8_t key_count; // How many keys are pressed - action_handler_t action_handler; // What to execute when the key combination is detected - bool pass_to_os; // True if we are to pass the key to the OS too - bool acknowledge; // True if we are to notify the user about registering keypress + uint8_t modifier; // Which modifier is pressed + uint8_t keys[6]; // Which keys need to be pressed + uint8_t key_count; // How many keys are pressed + action_handler_t action_handler; // What to execute when the key combination is detected + bool pass_to_os; // True if we are to pass the key to the OS too + bool acknowledge; // True if we are to notify the user about registering keypress } hotkey_combo_t; typedef struct TU_ATTR_PACKED { @@ -190,120 +204,118 @@ typedef struct TU_ATTR_PACKED { int16_t y; int8_t wheel; int8_t pan; -} hid_abs_mouse_report_t; +} mouse_abs_report_t; typedef enum { IDLE, READING_PACKET, PROCESSING_PACKET } receiver_state_t; typedef struct { - uint8_t kbd_dev_addr; // Address of the keyboard device - uint8_t kbd_instance; // Keyboard instance (d'uh - isn't this a useless comment) + uint8_t kbd_dev_addr; // Address of the keyboard device + uint8_t kbd_instance; // Keyboard instance (d'uh - isn't this a useless comment) - uint8_t keyboard_leds[NUM_SCREENS]; // State of keyboard LEDs (index 0 = A, index 1 = B) - uint64_t last_activity[NUM_SCREENS]; // Timestamp of the last input activity (-||-) - receiver_state_t receiver_state; // Storing the state for the simple receiver state machine + uint8_t keyboard_leds[NUM_SCREENS]; // State of keyboard LEDs (index 0 = A, index 1 = B) + uint64_t last_activity[NUM_SCREENS]; // Timestamp of the last input activity (-||-) + receiver_state_t receiver_state; // Storing the state for the simple receiver state machine + uint64_t core1_last_loop_pass; // Timestamp of last core1 loop execution + uint8_t active_output; // Currently selected output (0 = A, 1 = B) - uint64_t core1_last_loop_pass; // Timestamp of last core1 loop execution - uint8_t active_output; // Currently selected output (0 = A, 1 = B) - - int16_t mouse_x; // Store and update the location of our mouse pointer + int16_t mouse_x; // Store and update the location of our mouse pointer int16_t mouse_y; - config_t config; // Device configuration, loaded from flash or defaults used - - mouse_t mouse_dev; // Mouse device specifics, e.g. stores locations for keys in report - queue_t kbd_queue; // Queue that stores keyboard reports - queue_t mouse_queue; // Queue that stores mouse reports + config_t config; // Device configuration, loaded from flash or defaults used + mouse_t mouse_dev; // Mouse device specifics, e.g. stores locations for keys in report + queue_t kbd_queue; // Queue that stores keyboard reports + queue_t mouse_queue; // Queue that stores mouse reports /* Connection status flags */ - bool tud_connected; // True when TinyUSB device successfully connects - bool keyboard_connected; // True when our keyboard is connected locally - bool mouse_connected; // True when a mouse is connected locally + bool tud_connected; // True when TinyUSB device successfully connects + bool keyboard_connected; // True when our keyboard is connected locally + bool mouse_connected; // True when a mouse is connected locally /* Feature flags */ - bool mouse_zoom; // True when "mouse zoom" is enabled - bool switch_lock; // True when device is prevented from switching - bool onboard_led_state; // True when LED is ON + bool mouse_zoom; // True when "mouse zoom" is enabled + bool switch_lock; // True when device is prevented from switching + bool onboard_led_state; // True when LED is ON /* Onboard LED blinky (provide feedback when e.g. mouse connected) */ - int32_t blinks_left; // How many blink transitions are left - int32_t last_led_change; // Timestamp of the last time led state transitioned + int32_t blinks_left; // How many blink transitions are left + int32_t last_led_change; // Timestamp of the last time led state transitioned -} device_state_t; +} device_t; /********* Setup **********/ -void initial_setup(void); +void initial_setup(device_t *); void serial_init(void); void core1_main(void); /********* Keyboard **********/ -bool is_key_pressed(hotkey_combo_t, const hid_keyboard_report_t*); -void process_keyboard_report(uint8_t*, int, device_state_t*); -void stop_pressing_any_keys(device_state_t*); -void queue_kbd_report(hid_keyboard_report_t*, device_state_t*); -void process_kbd_queue_task(device_state_t*); -void send_key(hid_keyboard_report_t*, device_state_t*); +bool check_specific_hotkey(hotkey_combo_t, const hid_keyboard_report_t *); +void process_keyboard_report(uint8_t *, int, device_t *); +void release_all_keys(device_t *); +void queue_kbd_report(hid_keyboard_report_t *, device_t *); +void process_kbd_queue_task(device_t *); +void send_key(hid_keyboard_report_t *, device_t *); /********* Mouse **********/ -bool tud_hid_abs_mouse_report(uint8_t report_id, - uint8_t buttons, - int16_t x, - int16_t y, - int8_t vertical, - int8_t horizontal); +bool tud_hid_abs_mouse_report( + uint8_t report_id, uint8_t buttons, int16_t x, int16_t y, int8_t vertical, int8_t horizontal); -void process_mouse_report(uint8_t*, int, device_state_t*); -uint8_t parse_report_descriptor(mouse_t* mouse, - uint8_t arr_count, - uint8_t const* desc_report, - uint16_t desc_len); -int32_t get_report_value(uint8_t* report, report_val_t* val); -void process_mouse_queue_task(device_state_t*); -void queue_mouse_report(hid_abs_mouse_report_t*, device_state_t*); -void send_mouse(hid_abs_mouse_report_t*, device_state_t*); +void process_mouse_report(uint8_t *, int, device_t *); +uint8_t +parse_report_descriptor(mouse_t *mouse, uint8_t arr_count, uint8_t const *desc_report, uint16_t desc_len); +int32_t get_report_value(uint8_t *report, report_val_t *val); +void process_mouse_queue_task(device_t *); +void queue_mouse_report(mouse_abs_report_t *, device_t *); +void output_mouse_report(mouse_abs_report_t *, device_t *); /********* UART **********/ -void receive_char(uart_packet_t*, device_state_t*); -void send_packet(const uint8_t*, enum packet_type_e, int); +void receive_char(uart_packet_t *, device_t *); +void send_packet(const uint8_t *, enum packet_type_e, int); void send_value(const uint8_t, enum packet_type_e); /********* LEDs **********/ -void restore_leds(device_state_t*); -void blink_led(device_state_t*); -void led_blinking_task(device_state_t*); +void restore_leds(device_t *); +void blink_led(device_t *); +void led_blinking_task(device_t *); /********* Checksum **********/ -uint8_t calc_checksum(const uint8_t*, int); -bool verify_checksum(const uart_packet_t*); +uint8_t calc_checksum(const uint8_t *, int); +bool verify_checksum(const uart_packet_t *); /********* Watchdog **********/ -void kick_watchdog(void); +void kick_watchdog(device_t *); /********* Configuration **********/ -void load_config(void); -void save_config(void); +void load_config(device_t *); +void save_config(device_t *); void wipe_config(void); +/********* Misc **********/ +void screensaver_task(device_t *); + /********* Handlers **********/ -void output_toggle_hotkey_handler(device_state_t*); -void screen_border_hotkey_handler(device_state_t*); -void fw_upgrade_hotkey_handler_A(device_state_t*); -void fw_upgrade_hotkey_handler_B(device_state_t*); -void mouse_zoom_hotkey_handler(device_state_t*); -void all_keys_released_handler(device_state_t*); -void switchlock_hotkey_handler(device_state_t*); -void wipe_config_hotkey_handler(device_state_t*); +void output_toggle_hotkey_handler(device_t *); +void screen_border_hotkey_handler(device_t *); +void fw_upgrade_hotkey_handler_A(device_t *); +void fw_upgrade_hotkey_handler_B(device_t *); +void mouse_zoom_hotkey_handler(device_t *); +void all_keys_released_handler(device_t *); +void switchlock_hotkey_handler(device_t *); +void wipe_config_hotkey_handler(device_t *); +void screensaver_hotkey_handler(device_t *); -void handle_keyboard_uart_msg(uart_packet_t*, device_state_t*); -void handle_mouse_abs_uart_msg(uart_packet_t*, device_state_t*); -void handle_output_select_msg(uart_packet_t*, device_state_t*); -void handle_mouse_zoom_msg(uart_packet_t*, device_state_t*); -void handle_set_report_msg(uart_packet_t*, device_state_t*); -void handle_switch_lock_msg(uart_packet_t*, device_state_t*); -void handle_sync_borders_msg(uart_packet_t*, device_state_t*); -void handle_flash_led_msg(uart_packet_t*, device_state_t*); -void handle_fw_upgrade_msg(void); +void handle_keyboard_uart_msg(uart_packet_t *, device_t *); +void handle_mouse_abs_uart_msg(uart_packet_t *, device_t *); +void handle_output_select_msg(uart_packet_t *, device_t *); +void handle_mouse_zoom_msg(uart_packet_t *, device_t *); +void handle_set_report_msg(uart_packet_t *, device_t *); +void handle_switch_lock_msg(uart_packet_t *, device_t *); +void handle_sync_borders_msg(uart_packet_t *, device_t *); +void handle_flash_led_msg(uart_packet_t *, device_t *); +void handle_fw_upgrade_msg(uart_packet_t *, device_t *); +void handle_wipe_config_msg(uart_packet_t *, device_t *); +void handle_screensaver_msg(uart_packet_t *, device_t *); -void switch_output(uint8_t); +void switch_output(device_t *, uint8_t); /********* Global variables (don't judge) **********/ -extern device_state_t global_state; +extern device_t global_state; diff --git a/src/mouse.c b/src/mouse.c index 1bdae44..9438f13 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -17,205 +17,187 @@ #include "main.h" -int get_mouse_offset(int32_t movement, const int direction) { - int offset = 0; - output_t *active_output = - &global_state.config.output[global_state.active_output]; +/* Move mouse coordinate 'position' by 'offset', but don't fall off the screen */ +int32_t move_and_keep_on_screen(int position, int offset) { + /* Lowest we can go is 0 */ + if (position + offset < MIN_SCREEN_COORD) + return MIN_SCREEN_COORD; - if (direction == DIRECTION_X) - offset = movement * active_output->speed_x; - else - offset = movement * active_output->speed_y; + /* Highest we can go is MAX_SCREEN_COORD */ + else if (position + offset > MAX_SCREEN_COORD) + return MAX_SCREEN_COORD; - /* Holding a special hotkey enables mouse to slow down as much as possible - when you need that extra precision */ - if (global_state.mouse_zoom) - offset = offset >> 2; - - return offset; + /* We're still on screen, all good */ + return position + offset; } -void keep_cursor_on_screen(int16_t *position, const int32_t *movement, - const int direction) { - int16_t offset = get_mouse_offset(*movement, direction); +void update_mouse_position(device_t *state, mouse_values_t *values) { + output_t *current = &state->config.output[state->active_output]; + uint8_t reduce_speed = 0; - /* Lowest we can go is 0 */ - if (*position + offset < 0) - *position = 0; + /* Check if we are configured to move slowly */ + if (state->mouse_zoom) + reduce_speed = MOUSE_ZOOM_SCALING_FACTOR; - /* Highest we can go is MAX_SCREEN_COORD */ - else if (*position + offset > MAX_SCREEN_COORD) - *position = MAX_SCREEN_COORD; + /* Calculate movement */ + int offset_x = values->move_x * (current->speed_x >> reduce_speed); + int offset_y = values->move_y * (current->speed_y >> reduce_speed); - /* We're still on screen, all good */ - else - *position += offset; + /* Update movement */ + state->mouse_x = move_and_keep_on_screen(state->mouse_x, offset_x); + state->mouse_y = move_and_keep_on_screen(state->mouse_y, offset_y); } -/* If mouse needs to go locally, queue packet to mouse queue, else send them - * through UART */ -void send_mouse(hid_abs_mouse_report_t *report, device_state_t *state) { - if (state->active_output == BOARD_ROLE) { - queue_mouse_report(report, state); - state->last_activity[BOARD_ROLE] = time_us_64(); - } else { - send_packet((uint8_t *)report, MOUSE_REPORT_MSG, MOUSE_REPORT_LENGTH); - } +/* If we are active output, queue packet to mouse queue, else send them through UART */ +void output_mouse_report(mouse_abs_report_t *report, device_t *state) { + if (CURRENT_BOARD_IS_ACTIVE_OUTPUT) { + queue_mouse_report(report, state); + state->last_activity[BOARD_ROLE] = time_us_64(); + } else { + send_packet((uint8_t *)report, MOUSE_REPORT_MSG, MOUSE_REPORT_LENGTH); + } } -int16_t scale_y_coord(output_t *from, output_t *to, device_state_t *state) { - int size_to = to->border.bottom - to->border.top; - int size_from = from->border.bottom - from->border.top; +/* Calculate and return Y coordinate when moving from screen out_from to screen out_to */ +int16_t scale_y_coordinate(int screen_from, int screen_to, device_t *state) { + output_t *from = &state->config.output[screen_from]; + output_t *to = &state->config.output[screen_to]; - /* If sizes match, there is nothing to do */ - if (size_from == size_to) - return state->mouse_y; + int size_to = to->border.bottom - to->border.top; + int size_from = from->border.bottom - from->border.top; + + /* If sizes match, there is nothing to do */ + if (size_from == size_to) + return state->mouse_y; + + /* Moving from smaller ==> bigger screen + y_a = top + (((bottom - top) * y_b) / HEIGHT) */ + + if (size_from > size_to) { + return to->border.top + ((size_to * state->mouse_y) / MAX_SCREEN_COORD); + } + + /* Moving from bigger ==> smaller screen + y_b = ((y_a - top) * HEIGHT) / (bottom - top) */ - /* Moving from bigger ==> smaller screen */ - if (size_from < size_to) { if (state->mouse_y < from->border.top) - return 0; + return MIN_SCREEN_COORD; if (state->mouse_y > from->border.bottom) - return MAX_SCREEN_COORD; + return MAX_SCREEN_COORD; - /* y_b = ((y_a - top) * HEIGHT) / (bottom - top) */ - return ((state->mouse_y - from->border.top) * MAX_SCREEN_COORD) / - size_from; - } - - /* Moving from smaller ==> bigger screen, - y_a = top + (((bottom - top) * y_b) / HEIGHT) */ - return to->border.top + ((size_to * state->mouse_y) / MAX_SCREEN_COORD); + return ((state->mouse_y - from->border.top) * MAX_SCREEN_COORD) / size_from; } -void check_mouse_switch(const mouse_values_t *values, device_state_t *state) { - hid_abs_mouse_report_t report = {.y = 0, .x = MAX_SCREEN_COORD}; +void switch_screen(device_t *state, int new_x, int output_from, int output_to) { + mouse_abs_report_t hidden_pointer = {.y = MIN_SCREEN_COORD, .x = MAX_SCREEN_COORD}; - /* No switching allowed if explicitly disabled */ - if (state->switch_lock) - return; + output_mouse_report(&hidden_pointer, state); + switch_output(state, output_to); + state->mouse_x = (output_to == OUTPUT_A) ? MIN_SCREEN_COORD : MAX_SCREEN_COORD; + state->mouse_y = scale_y_coordinate(output_from, output_to, state); +} - /* End of screen left switches screen A->B */ - bool jump_from_A_to_B = - (state->mouse_x + values->move_x < -MOUSE_JUMP_THRESHOLD && - state->active_output == ACTIVE_OUTPUT_A); +void check_screen_switch(const mouse_values_t *values, device_t *state) { + int new_x = state->mouse_x + values->move_x; - /* End of screen right switches screen B->A */ - bool jump_from_B_to_A = (state->mouse_x + values->move_x > - MAX_SCREEN_COORD + MOUSE_JUMP_THRESHOLD && - state->active_output == ACTIVE_OUTPUT_B); + /* No switching allowed if explicitly disabled */ + if (state->switch_lock) + return; - if (jump_from_A_to_B || jump_from_B_to_A) { - /* Hide mouse pointer in the upper right corner on the system we are - switching FROM If the mouse is locally attached to the current board or - notify other board if not */ - send_mouse(&report, state); - - if (jump_from_A_to_B) { - switch_output(ACTIVE_OUTPUT_B); - state->mouse_x = MAX_SCREEN_COORD; - - state->mouse_y = scale_y_coord(&state->config.output[ACTIVE_OUTPUT_A], - &state->config.output[ACTIVE_OUTPUT_B], - state); - - } else { - switch_output(ACTIVE_OUTPUT_A); - state->mouse_x = 0; - - state->mouse_y = scale_y_coord(&state->config.output[ACTIVE_OUTPUT_B], - &state->config.output[ACTIVE_OUTPUT_A], - state); + /* End of screen left switches screen A->B TODO: make configurable */ + if (new_x < MIN_SCREEN_COORD - JUMP_THRESHOLD && state->active_output == OUTPUT_A) { + switch_screen(state, new_x, OUTPUT_A, OUTPUT_B); + } + + /* End of screen right switches screen B->A TODO: make configurable */ + else if (new_x > MAX_SCREEN_COORD + JUMP_THRESHOLD && state->active_output == OUTPUT_B) { + switch_screen(state, new_x, OUTPUT_B, OUTPUT_A); } - } } -void extract_values_report_protocol(uint8_t *report, device_state_t *state, - mouse_values_t *values) { - /* If Report ID is used, the report is prefixed by the report ID so we have to - * move by 1 byte */ - if (state->mouse_dev.uses_report_id) { - /* Move past the ID to parse the report */ - report++; - } +void extract_report_values(uint8_t *raw_report, device_t *state, mouse_values_t *values) { + /* Interpret values depending on the current protocol used. */ + if (state->mouse_dev.protocol == HID_PROTOCOL_BOOT) { + hid_mouse_report_t *mouse_report = (hid_mouse_report_t *)raw_report; - values->move_x = get_report_value(report, &state->mouse_dev.move_x); - values->move_y = get_report_value(report, &state->mouse_dev.move_y); - values->wheel = get_report_value(report, &state->mouse_dev.wheel); - values->buttons = get_report_value(report, &state->mouse_dev.buttons); + values->move_x = mouse_report->x; + values->move_y = mouse_report->y; + values->wheel = mouse_report->wheel; + values->buttons = mouse_report->buttons; + return; + } + + /* If HID Report ID is used, the report is prefixed by the report ID so we have to move by 1 byte */ + if (state->mouse_dev.uses_report_id) + raw_report++; + + values->move_x = get_report_value(raw_report, &state->mouse_dev.move_x); + values->move_y = get_report_value(raw_report, &state->mouse_dev.move_y); + values->wheel = get_report_value(raw_report, &state->mouse_dev.wheel); + values->buttons = get_report_value(raw_report, &state->mouse_dev.buttons); } -void extract_values_boot_protocol(uint8_t *report, device_state_t *state, - mouse_values_t *values) { - hid_mouse_report_t *mouse_report = (hid_mouse_report_t *)report; - - values->move_x = mouse_report->x; - values->move_y = mouse_report->y; - values->wheel = mouse_report->wheel; - values->buttons = mouse_report->buttons; +mouse_abs_report_t create_mouse_report(device_t *state, mouse_values_t *values) { + mouse_abs_report_t abs_mouse_report = {.buttons = values->buttons, + .x = state->mouse_x, + .y = state->mouse_y, + .wheel = values->wheel, + .pan = 0}; + return abs_mouse_report; } -void process_mouse_report(uint8_t *raw_report, int len, device_state_t *state) { - mouse_values_t values = {0}; +void process_mouse_report(uint8_t *raw_report, int len, device_t *state) { + mouse_values_t values = {0}; - /* Interpret values depending on the current protocol used */ - if (state->mouse_dev.protocol == HID_PROTOCOL_BOOT) - extract_values_boot_protocol(raw_report, state, &values); - else - extract_values_report_protocol(raw_report, state, &values); + /* Interpret the mouse HID report, extract and save values we need. */ + extract_report_values(raw_report, state, &values); - /* We need to enforce the cursor doesn't go off-screen, that would be bad. */ - keep_cursor_on_screen(&state->mouse_x, &values.move_x, DIRECTION_X); - keep_cursor_on_screen(&state->mouse_y, &values.move_y, DIRECTION_Y); + /* Calculate and update mouse pointer movement. */ + update_mouse_position(state, &values); - hid_abs_mouse_report_t abs_mouse_report = {.buttons = values.buttons, - .x = state->mouse_x, - .y = state->mouse_y, - .wheel = values.wheel, - .pan = 0}; + /* Create the report for the output PC based on the updated values */ + mouse_abs_report_t report = create_mouse_report(state, &values); - /* Move the mouse, depending where the output is supposed to go */ - send_mouse(&abs_mouse_report, state); + /* Move the mouse, depending where the output is supposed to go */ + output_mouse_report(&report, state); - /* We use the mouse to switch outputs, the logic is in check_mouse_switch() */ - check_mouse_switch(&values, state); + /* We use the mouse to switch outputs, the logic is in check_screen_switch() */ + check_screen_switch(&values, state); } /* ==================================================== * * Mouse Queue Section * ==================================================== */ -void process_mouse_queue_task(device_state_t *state) { - hid_abs_mouse_report_t report = {0}; +void process_mouse_queue_task(device_t *state) { + mouse_abs_report_t report = {0}; - /* We need to be connected to the host to send messages */ - if (!state->tud_connected) - return; + /* We need to be connected to the host to send messages */ + if (!state->tud_connected) + return; - /* Peek first, if there is anything there... */ - if (!queue_try_peek(&state->mouse_queue, &report)) - return; + /* Peek first, if there is anything there... */ + if (!queue_try_peek(&state->mouse_queue, &report)) + return; - /* If we are suspended, let's wake the host up */ - if (tud_suspended()) - tud_remote_wakeup(); + /* If we are suspended, let's wake the host up */ + if (tud_suspended()) + tud_remote_wakeup(); - /* ... try sending it to the host, if it's successful */ - bool succeeded = - tud_hid_abs_mouse_report(REPORT_ID_MOUSE, report.buttons, report.x, - report.y, report.wheel, report.pan); + /* ... try sending it to the host, if it's successful */ + bool succeeded = tud_hid_abs_mouse_report( + REPORT_ID_MOUSE, report.buttons, report.x, report.y, report.wheel, report.pan); - /* ... then we can remove it from the queue */ - if (succeeded) - queue_try_remove(&state->mouse_queue, &report); + /* ... then we can remove it from the queue */ + if (succeeded) + queue_try_remove(&state->mouse_queue, &report); } -void queue_mouse_report(hid_abs_mouse_report_t *report, device_state_t *state) { - /* It wouldn't be fun to queue up a bunch of messages and then dump them all - * on host */ - if (!state->tud_connected) - return; +void queue_mouse_report(mouse_abs_report_t *report, device_t *state) { + /* It wouldn't be fun to queue up a bunch of messages and then dump them all on host */ + if (!state->tud_connected) + return; - queue_try_add(&state->mouse_queue, report); + queue_try_add(&state->mouse_queue, report); } diff --git a/src/setup.c b/src/setup.c index 1235dc1..8b51230 100644 --- a/src/setup.c +++ b/src/setup.c @@ -1,17 +1,17 @@ -/* +/* * This file is part of DeskHop (https://github.com/hrvach/deskhop). * Copyright (c) 2024 Hrvoje Cavrak - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License + * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -52,9 +52,9 @@ void serial_init() { * ================================================== */ void pio_usb_host_config(void) { - /* tuh_configure() must be called before tuh_init() */ + /* tuh_configure() must be called before tuh_init() */ static pio_usb_configuration_t config = PIO_USB_DEFAULT_CONFIG; - config.pin_dp = PIO_USB_DP_PIN_DEFAULT; + config.pin_dp = PIO_USB_DP_PIN_DEFAULT; tuh_configure(BOARD_TUH_RHPORT, TUH_CFGID_RPI_PIO_USB_CONFIGURATION, &config); /* Initialize and configure TinyUSB Host */ @@ -65,12 +65,12 @@ void pio_usb_host_config(void) { * Perform initial board/usb setup * ================================================== */ -void initial_setup(void) { +void initial_setup(device_t *state) { /* PIO USB requires a clock multiple of 12 MHz, setting to 120 MHz */ set_sys_clock_khz(120000, true); /* Search the persistent storage sector in flash for valid config or use defaults */ - load_config(); + load_config(state); /* Init and enable the on-board LED GPIO as output */ gpio_init(GPIO_LED_PIN); @@ -80,9 +80,9 @@ void initial_setup(void) { serial_init(); /* Initialize keyboard and mouse queues */ - queue_init(&global_state.kbd_queue, sizeof(hid_keyboard_report_t), KBD_QUEUE_LENGTH); - queue_init(&global_state.mouse_queue, sizeof(hid_abs_mouse_report_t), MOUSE_QUEUE_LENGTH); - + queue_init(&state->kbd_queue, sizeof(hid_keyboard_report_t), KBD_QUEUE_LENGTH); + queue_init(&state->mouse_queue, sizeof(mouse_abs_report_t), MOUSE_QUEUE_LENGTH); + /* Setup RP2040 Core 1 */ multicore_reset_core1(); multicore_launch_core1(core1_main); @@ -94,8 +94,8 @@ void initial_setup(void) { pio_usb_host_config(); /* Update the core1 initial pass timestamp before enabling the watchdog */ - global_state.core1_last_loop_pass = time_us_64(); - + state->core1_last_loop_pass = time_us_64(); + /* Setup the watchdog so we reboot and recover from a crash */ watchdog_enable(WATCHDOG_TIMEOUT, WATCHDOG_PAUSE_ON_DEBUG); } diff --git a/src/tusb_config.h b/src/tusb_config.h index 04e72a4..9c306c9 100644 --- a/src/tusb_config.h +++ b/src/tusb_config.h @@ -27,23 +27,23 @@ #define _TUSB_CONFIG_H_ #ifdef __cplusplus - extern "C" { +extern "C" { #endif //-------------------------------------------------------------------- // COMMON CONFIGURATION //-------------------------------------------------------------------- -#define CFG_TUSB_OS OPT_OS_PICO +#define CFG_TUSB_OS OPT_OS_PICO // Enable device stack -#define CFG_TUD_ENABLED 1 +#define CFG_TUD_ENABLED 1 // RHPort number used for device is port 0 -#define BOARD_TUD_RHPORT 0 +#define BOARD_TUD_RHPORT 0 // RHPort number used for host is port 1 -#define BOARD_TUH_RHPORT 1 +#define BOARD_TUH_RHPORT 1 // Enable host stack with pio-usb if Pico-PIO-USB library is available #define CFG_TUH_ENABLED 1 @@ -51,28 +51,29 @@ // defined by board.mk #ifndef CFG_TUSB_MCU - #error CFG_TUSB_MCU must be defined +#error CFG_TUSB_MCU must be defined #endif // RHPort number used for device can be defined by board.mk, default to port 0 #ifndef BOARD_DEVICE_RHPORT_NUM - #define BOARD_DEVICE_RHPORT_NUM 0 +#define BOARD_DEVICE_RHPORT_NUM 0 #endif // RHPort max operational speed can defined by board.mk // Default to Highspeed for MCU with internal HighSpeed PHY (can be port specific), otherwise FullSpeed #ifndef BOARD_DEVICE_RHPORT_SPEED - #if (CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_LPC43XX || CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX || \ - CFG_TUSB_MCU == OPT_MCU_NUC505 || CFG_TUSB_MCU == OPT_MCU_CXD56 || CFG_TUSB_MCU == OPT_MCU_SAMX7X) - #define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_HIGH_SPEED - #else - #define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_FULL_SPEED - #endif +#if (CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_LPC43XX \ + || CFG_TUSB_MCU == OPT_MCU_MIMXRT10XX || CFG_TUSB_MCU == OPT_MCU_NUC505 \ + || CFG_TUSB_MCU == OPT_MCU_CXD56 || CFG_TUSB_MCU == OPT_MCU_SAMX7X) +#define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_HIGH_SPEED +#else +#define BOARD_DEVICE_RHPORT_SPEED OPT_MODE_FULL_SPEED +#endif #endif // Device mode with rhport and speed defined by board.mk -#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED) -#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_HOST | BOARD_DEVICE_RHPORT_SPEED) +#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED) +#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_HOST | BOARD_DEVICE_RHPORT_SPEED) // CFG_TUSB_DEBUG is defined by compiler in DEBUG build // #define CFG_TUSB_DEBUG 0 @@ -89,7 +90,7 @@ #endif #ifndef CFG_TUSB_MEM_ALIGN -#define CFG_TUSB_MEM_ALIGN __attribute__ ((aligned(4))) +#define CFG_TUSB_MEM_ALIGN __attribute__((aligned(4))) #endif //-------------------------------------------------------------------- @@ -97,18 +98,18 @@ //-------------------------------------------------------------------- #ifndef CFG_TUD_ENDPOINT0_SIZE -#define CFG_TUD_ENDPOINT0_SIZE 64 +#define CFG_TUD_ENDPOINT0_SIZE 64 #endif //------------- CLASS -------------// -#define CFG_TUD_HID 1 -#define CFG_TUD_CDC 0 -#define CFG_TUD_MSC 0 -#define CFG_TUD_MIDI 0 -#define CFG_TUD_VENDOR 0 +#define CFG_TUD_HID 1 +#define CFG_TUD_CDC 0 +#define CFG_TUD_MSC 0 +#define CFG_TUD_MIDI 0 +#define CFG_TUD_VENDOR 0 // HID buffer size Should be sufficient to hold ID (if any) + Data -#define CFG_TUD_HID_EP_BUFSIZE 32 +#define CFG_TUD_HID_EP_BUFSIZE 32 //-------------------------------------------------------------------- // HOST CONFIGURATION @@ -117,16 +118,16 @@ // Size of buffer to hold descriptors and other data used for enumeration #define CFG_TUH_ENUMERATION_BUFSIZE 256 -#define CFG_TUH_HUB 1 +#define CFG_TUH_HUB 1 // max device support (excluding hub device) -#define CFG_TUH_DEVICE_MAX (CFG_TUH_HUB ? 4 : 1) // hub typically has 4 ports +#define CFG_TUH_DEVICE_MAX (CFG_TUH_HUB ? 4 : 1) // hub typically has 4 ports -#define CFG_TUH_HID 4 -#define CFG_TUH_HID_EPIN_BUFSIZE 64 -#define CFG_TUH_HID_EPOUT_BUFSIZE 64 +#define CFG_TUH_HID 3 * CFG_TUH_DEVICE_MAX +#define CFG_TUH_HID_EPIN_BUFSIZE 64 +#define CFG_TUH_HID_EPOUT_BUFSIZE 64 #ifdef __cplusplus - } +} #endif #endif /* _TUSB_CONFIG_H_ */ diff --git a/src/uart.c b/src/uart.c index dffdebb..ef20b80 100644 --- a/src/uart.c +++ b/src/uart.c @@ -21,7 +21,7 @@ * =============== Sending Packets ================ * * ================================================== */ -void send_packet(const uint8_t* data, enum packet_type_e packet_type, int length) { +void send_packet(const uint8_t *data, enum packet_type_e packet_type, int length) { uint8_t raw_packet[RAW_PACKET_LENGTH] = {[0] = START1, [1] = START2, [2] = packet_type, @@ -31,60 +31,42 @@ void send_packet(const uint8_t* data, enum packet_type_e packet_type, int length if (length > 0) memcpy(&raw_packet[START_LENGTH + TYPE_LENGTH], data, length); + /* Packets are short, fixed length, high speed and there is no flow control to block this */ uart_write_blocking(SERIAL_UART, raw_packet, RAW_PACKET_LENGTH); } void send_value(const uint8_t value, enum packet_type_e packet_type) { - const uint8_t data[8] = {[0] = value}; - - send_packet((uint8_t*)&data, packet_type, 1); + const uint8_t data = value; + send_packet(&data, packet_type, sizeof(uint8_t)); } /**================================================== * * =============== Parsing Packets ================ * * ================================================== */ -void process_packet(uart_packet_t* packet, device_state_t* state) { - if (!verify_checksum(packet)) { +const uart_handler_t uart_handler[] = { + {.type = KEYBOARD_REPORT_MSG, .handler = handle_keyboard_uart_msg}, + {.type = MOUSE_REPORT_MSG, .handler = handle_mouse_abs_uart_msg}, + {.type = OUTPUT_SELECT_MSG, .handler = handle_output_select_msg}, + {.type = FIRMWARE_UPGRADE_MSG, .handler = handle_fw_upgrade_msg}, + {.type = MOUSE_ZOOM_MSG, .handler = handle_mouse_zoom_msg}, + {.type = KBD_SET_REPORT_MSG, .handler = handle_set_report_msg}, + {.type = SWITCH_LOCK_MSG, .handler = handle_switch_lock_msg}, + {.type = SYNC_BORDERS_MSG, .handler = handle_sync_borders_msg}, + {.type = FLASH_LED_MSG, .handler = handle_flash_led_msg}, + {.type = SCREENSAVER_MSG, .handler = handle_screensaver_msg}, + {.type = WIPE_CONFIG_MSG, .handler = handle_wipe_config_msg}, +}; + +void process_packet(uart_packet_t *packet, device_t *state) { + if (!verify_checksum(packet)) return; - } - switch (packet->type) { - case KEYBOARD_REPORT_MSG: - handle_keyboard_uart_msg(packet, state); - break; - - case MOUSE_REPORT_MSG: - handle_mouse_abs_uart_msg(packet, state); - break; - - case OUTPUT_SELECT_MSG: - handle_output_select_msg(packet, state); - break; - - case FIRMWARE_UPGRADE_MSG: - handle_fw_upgrade_msg(); - break; - - case MOUSE_ZOOM_MSG: - handle_mouse_zoom_msg(packet, state); - break; - - case KBD_SET_REPORT_MSG: - handle_set_report_msg(packet, state); - break; - - case SWITCH_LOCK_MSG: - handle_switch_lock_msg(packet, state); - break; - - case SYNC_BORDERS_MSG: - handle_sync_borders_msg(packet, state); - break; - - case FLASH_LED_MSG: - handle_flash_led_msg(packet, state); - break; + for (int i = 0; i < ARRAY_SIZE(uart_handler); i++) { + if (uart_handler[i].type == packet->type) { + uart_handler[i].handler(packet, state); + return; + } } } @@ -92,41 +74,59 @@ void process_packet(uart_packet_t* packet, device_state_t* state) { * ============== Receiving Packets =============== * * ================================================== */ -void receive_char(uart_packet_t* packet, device_state_t* state) { - uint8_t* raw_packet = (uint8_t*)packet; - static int count = 0; +/* We are in IDLE state until we detect the packet start (0xAA 0x55) */ +void handle_idle_state(uint8_t *raw_packet, device_t *state) { + if (!uart_is_readable(SERIAL_UART)) { + return; + } + + raw_packet[0] = raw_packet[1]; /* Remember the previous byte received */ + raw_packet[1] = uart_getc(SERIAL_UART); /* Try to match packet start */ + + /* If we found 0xAA 0x55, we're in sync and can move on to read/process the packet */ + if (raw_packet[0] == START1 && raw_packet[1] == START2) { + state->receiver_state = READING_PACKET; + } +} + +/* Read a character off the line until we reach fixed packet length */ +void handle_reading_state(uint8_t *raw_packet, device_t *state, int *count) { + if (!uart_is_readable(SERIAL_UART)) { + return; + } + + /* Read and store the incoming byte */ + raw_packet[(*count)++] = uart_getc(SERIAL_UART); + + /* Check if a complete packet is received */ + if (*count >= PACKET_LENGTH) { + state->receiver_state = PROCESSING_PACKET; + } +} + +/* Process that packet, restart counters and state machine to have it back to IDLE */ +void handle_processing_state(uart_packet_t *packet, device_t *state, int *count) { + process_packet(packet, state); + state->receiver_state = IDLE; + *count = 0; +} + +/* Very simple state machine to receive and process packets over serial */ +void receive_char(uart_packet_t *packet, device_t *state) { + uint8_t *raw_packet = (uint8_t *)packet; + static int count = 0; switch (state->receiver_state) { case IDLE: - if (uart_is_readable(SERIAL_UART)) { - raw_packet[0] = raw_packet[1]; /* Remember the previous byte received */ - raw_packet[1] = uart_getc(SERIAL_UART); /* ... and try to match packet start */ - - /* If we found 0xAA 0x55, we're in sync and can move on to read/process the packet - */ - if (raw_packet[0] == START1 && raw_packet[1] == START2) { - state->receiver_state = READING_PACKET; - } - } + handle_idle_state(raw_packet, state); break; case READING_PACKET: - if (uart_is_readable(SERIAL_UART)) { - raw_packet[count++] = uart_getc(SERIAL_UART); - - /* Check if a complete packet is received */ - if (count >= PACKET_LENGTH) { - state->receiver_state = PROCESSING_PACKET; - } - } + handle_reading_state(raw_packet, state, &count); break; case PROCESSING_PACKET: - process_packet(packet, state); - - /* Cleanup and return to IDLE when done */ - count = 0; - state->receiver_state = IDLE; + handle_processing_state(packet, state, &count); break; } } diff --git a/src/usb.c b/src/usb.c index a29b788..fe6f0bd 100644 --- a/src/usb.c +++ b/src/usb.c @@ -1,17 +1,17 @@ -/* +/* * This file is part of DeskHop (https://github.com/hrvach/deskhop). * Copyright (c) 2024 Hrvoje Cavrak - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3. * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License + * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -21,14 +21,14 @@ * =========== TinyUSB Device Callbacks =========== * * ================================================== */ -/* Invoked when we get GET_REPORT control request. - * We are expected to fill buffer with the report content, update reqlen +/* Invoked when we get GET_REPORT control request. + * We are expected to fill buffer with the report content, update reqlen * and return its length. We return 0 to STALL the request. */ uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, - uint8_t* buffer, - uint16_t reqlen) { + uint8_t *buffer, + uint16_t request_len) { return 0; } @@ -42,31 +42,29 @@ uint16_t tud_hid_get_report_cb(uint8_t instance, void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, - uint8_t const* buffer, + uint8_t const *buffer, uint16_t bufsize) { - if (report_id == REPORT_ID_KEYBOARD && bufsize == 1 && report_type == HID_REPORT_TYPE_OUTPUT) { - /** - * If we are using caps lock LED to indicate the chosen output, we will - * override whatever is sent through the SetReport message. - */ - uint8_t leds = buffer[0]; + if (report_id != REPORT_ID_KEYBOARD || bufsize != 1 || report_type != HID_REPORT_TYPE_OUTPUT) + return; - if (KBD_LED_AS_INDICATOR) { - leds = leds & 0xFD; /* 1111 1101 (Clear Caps Lock bit) */ + uint8_t leds = buffer[0]; - if (global_state.active_output) - leds |= KEYBOARD_LED_CAPSLOCK; - } + /* If we are using caps lock LED to indicate the chosen output, that has priority */ + if (KBD_LED_AS_INDICATOR) { + leds = leds & 0xFD; /* 1111 1101 (Clear Caps Lock bit) */ - global_state.keyboard_leds[global_state.active_output] = leds; - - /* If we are board without the keyboard hooked up directly, we need to send this information - to the other one since that one has the keyboard connected to it (and LEDs you can turn on :)) */ - if (global_state.keyboard_connected) - restore_leds(&global_state); - else - send_value(leds, KBD_SET_REPORT_MSG); + if (global_state.active_output) + leds |= KEYBOARD_LED_CAPSLOCK; } + + global_state.keyboard_leds[global_state.active_output] = leds; + + /* If the board doesn't have the keyboard hooked up directly, we need to relay this information + to the other one that has (and LEDs you can turn on). */ + if (global_state.keyboard_connected) + restore_leds(&global_state); + else + send_value(leds, KBD_SET_REPORT_MSG); } /* Invoked when device is mounted */ @@ -85,6 +83,7 @@ void tud_umount_cb(void) { void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) { uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance); + switch (itf_protocol) { case HID_ITF_PROTOCOL_KEYBOARD: global_state.keyboard_connected = false; @@ -94,23 +93,20 @@ void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) { global_state.mouse_connected = false; /* Clear this so reconnecting a mouse doesn't try to continue in HID REPORT protocol */ - memset(&global_state.mouse_dev, 0, sizeof(global_state.mouse_dev)); + memset(&global_state.mouse_dev, 0, sizeof(global_state.mouse_dev)); break; } } - -void tuh_hid_mount_cb(uint8_t dev_addr, - uint8_t instance, - uint8_t const* desc_report, - uint16_t desc_len) { - uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance); + +void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *desc_report, uint16_t desc_len) { + uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance); switch (itf_protocol) { case HID_ITF_PROTOCOL_KEYBOARD: - /* Keeping this is needed for setting leds from device set_report callback */ - global_state.kbd_dev_addr = dev_addr; - global_state.kbd_instance = instance; - global_state.keyboard_connected = true; + /* Keeping this is required for setting leds from device set_report callback */ + global_state.kbd_dev_addr = dev_addr; + global_state.kbd_instance = instance; + global_state.keyboard_connected = true; break; case HID_ITF_PROTOCOL_MOUSE: @@ -121,35 +117,30 @@ void tuh_hid_mount_cb(uint8_t dev_addr, } parse_report_descriptor(&global_state.mouse_dev, MAX_REPORTS, desc_report, desc_len); - global_state.mouse_connected = true; + global_state.mouse_connected = true; break; } /* Flash local led to indicate a device was connected */ - blink_led(&global_state); + blink_led(&global_state); /* Also signal the other board to flash LED, to enable easy verification if serial works */ send_value(ENABLE, FLASH_LED_MSG); - /* Kick off the report querying */ tuh_hid_receive_report(dev_addr, instance); } /* Invoked when received report from device via interrupt endpoint */ -void tuh_hid_report_received_cb(uint8_t dev_addr, - uint8_t instance, - uint8_t const* report, - uint16_t len) { - (void)len; +void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) { uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance); switch (itf_protocol) { case HID_ITF_PROTOCOL_KEYBOARD: - process_keyboard_report((uint8_t*)report, len, &global_state); + process_keyboard_report((uint8_t *)report, len, &global_state); break; case HID_ITF_PROTOCOL_MOUSE: - process_mouse_report((uint8_t*)report, len, &global_state); + process_mouse_report((uint8_t *)report, len, &global_state); break; } @@ -158,9 +149,7 @@ void tuh_hid_report_received_cb(uint8_t dev_addr, } /* Set protocol in a callback. If we were called, command succeeded. We're only - doing this for the mouse anyway, so we can only be called about the mouse */ + doing this for the mouse for now, so we can only be called about the mouse */ void tuh_hid_set_protocol_complete_cb(uint8_t dev_addr, uint8_t idx, uint8_t protocol) { - (void) dev_addr; - (void) idx; global_state.mouse_dev.protocol = protocol; } diff --git a/src/usb_descriptors.c b/src/usb_descriptors.c index ffde131..7cc26fd 100644 --- a/src/usb_descriptors.c +++ b/src/usb_descriptors.c @@ -23,36 +23,36 @@ * */ -#include "main.h" #include "usb_descriptors.h" +#include "main.h" #include "tusb.h" //--------------------------------------------------------------------+ // Device Descriptors //--------------------------------------------------------------------+ -tusb_desc_device_t const desc_device = {.bLength = sizeof(tusb_desc_device_t), +tusb_desc_device_t const desc_device = {.bLength = sizeof(tusb_desc_device_t), .bDescriptorType = TUSB_DESC_DEVICE, - .bcdUSB = 0x0200, - .bDeviceClass = 0x00, + .bcdUSB = 0x0200, + .bDeviceClass = 0x00, .bDeviceSubClass = 0x00, .bDeviceProtocol = 0x00, .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, // https://github.com/raspberrypi/usb-pid - .idVendor = 0x2E8A, + .idVendor = 0x2E8A, .idProduct = 0x107C, .bcdDevice = 0x0100, .iManufacturer = 0x01, - .iProduct = 0x02, + .iProduct = 0x02, .iSerialNumber = 0x03, .bNumConfigurations = 0x01}; // Invoked when received GET DEVICE DESCRIPTOR // Application return pointer to descriptor -uint8_t const* tud_descriptor_device_cb(void) { - return (uint8_t const*)&desc_device; +uint8_t const *tud_descriptor_device_cb(void) { + return (uint8_t const *)&desc_device; } //--------------------------------------------------------------------+ @@ -65,29 +65,24 @@ uint8_t const desc_hid_report[] = {TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(RE // Invoked when received GET HID REPORT DESCRIPTOR // Application return pointer to descriptor // Descriptor contents must exist long enough for transfer to complete -uint8_t const* tud_hid_descriptor_report_cb(uint8_t instance) { +uint8_t const *tud_hid_descriptor_report_cb(uint8_t instance) { (void)instance; return desc_hid_report; } bool tud_hid_n_abs_mouse_report(uint8_t instance, - uint8_t report_id, - uint8_t buttons, - int16_t x, - int16_t y, - int8_t vertical, - int8_t horizontal) { - hid_abs_mouse_report_t report = { - .buttons = buttons, .x = x, .y = y, .wheel = vertical, .pan = horizontal}; + uint8_t report_id, + uint8_t buttons, + int16_t x, + int16_t y, + int8_t vertical, + int8_t horizontal) { + mouse_abs_report_t report = {.buttons = buttons, .x = x, .y = y, .wheel = vertical, .pan = horizontal}; return tud_hid_n_report(instance, report_id, &report, sizeof(report)); } -bool tud_hid_abs_mouse_report(uint8_t report_id, - uint8_t buttons, - int16_t x, - int16_t y, - int8_t vertical, - int8_t horizontal) { +bool tud_hid_abs_mouse_report( + uint8_t report_id, uint8_t buttons, int16_t x, int16_t y, int8_t vertical, int8_t horizontal) { return tud_hid_n_abs_mouse_report(0, report_id, buttons, x, y, vertical, horizontal); } @@ -103,12 +98,7 @@ enum { ITF_NUM_HID, ITF_NUM_TOTAL }; uint8_t const desc_configuration[] = { // Config number, interface count, string index, total length, attribute, power in mA - TUD_CONFIG_DESCRIPTOR(1, - ITF_NUM_TOTAL, - 0, - CONFIG_TOTAL_LEN, - TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, - 500), + TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 500), // Interface number, string index, protocol, report descriptor len, EP In address, size & // polling interval @@ -129,34 +119,33 @@ uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN]; // device qualifier is mostly similar to device descriptor since we don't change configuration based // on speed -tusb_desc_device_qualifier_t const desc_device_qualifier = { - .bLength = sizeof(tusb_desc_device_qualifier_t), - .bDescriptorType = TUSB_DESC_DEVICE_QUALIFIER, - .bcdUSB = USB_BCD, +tusb_desc_device_qualifier_t const desc_device_qualifier = {.bLength = sizeof(tusb_desc_device_qualifier_t), + .bDescriptorType = TUSB_DESC_DEVICE_QUALIFIER, + .bcdUSB = USB_BCD, - .bDeviceClass = 0x00, - .bDeviceSubClass = 0x00, - .bDeviceProtocol = 0x00, + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, - .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, - .bNumConfigurations = 0x01, - .bReserved = 0x00}; + .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, + .bNumConfigurations = 0x01, + .bReserved = 0x00}; // Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request // Application return pointer to descriptor, whose contents must exist long enough for transfer to // complete. device_qualifier descriptor describes information about a high-speed capable device // that would change if the device were operating at the other speed. If not highspeed capable stall // this request. -uint8_t const* tud_descriptor_device_qualifier_cb(void) { - return (uint8_t const*)&desc_device_qualifier; +uint8_t const *tud_descriptor_device_qualifier_cb(void) { + return (uint8_t const *)&desc_device_qualifier; } // Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request // Application return pointer to descriptor, whose contents must exist long enough for transfer to // complete Configuration descriptor in the other speed e.g if high speed then this is for full // speed and vice versa -uint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) { - (void)index; // for multiple configurations +uint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) { + (void)index; // for multiple configurations // other speed config is basically configuration with type = OHER_SPEED_CONFIG memcpy(desc_other_speed_config, desc_configuration, CONFIG_TOTAL_LEN); @@ -166,13 +155,13 @@ uint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) { return desc_other_speed_config; } -#endif // highspeed +#endif // highspeed // Invoked when received GET CONFIGURATION DESCRIPTOR // Application return pointer to descriptor // Descriptor contents must exist long enough for transfer to complete -uint8_t const* tud_descriptor_configuration_cb(uint8_t index) { - (void)index; // for multiple configurations +uint8_t const *tud_descriptor_configuration_cb(uint8_t index) { + (void)index; // for multiple configurations // This example use the same configuration for both high and full speed mode return desc_configuration; @@ -191,11 +180,11 @@ enum { }; // array of pointer to string descriptors -char const* string_desc_arr[] = { - (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) - "Hrvoje Cavrak", // 1: Manufacturer - "DeskHop Switch", // 2: Product - "0", // 3: Serials, should use chip ID +char const *string_desc_arr[] = { + (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409) + "Hrvoje Cavrak", // 1: Manufacturer + "DeskHop Switch", // 2: Product + "0", // 3: Serials, should use chip ID }; static uint16_t _desc_str[32]; @@ -203,7 +192,7 @@ static uint16_t _desc_str[32]; // Invoked when received GET STRING DESCRIPTOR request // Application return pointer to descriptor, whose contents must exist long enough for transfer to // complete -uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) { +uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) { (void)langid; uint8_t chr_count; @@ -218,7 +207,7 @@ uint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) { if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) return NULL; - const char* str = string_desc_arr[index]; + const char *str = string_desc_arr[index]; // Cap at max char chr_count = strlen(str); diff --git a/src/usb_descriptors.h b/src/usb_descriptors.h index 193cea5..a05b53a 100644 --- a/src/usb_descriptors.h +++ b/src/usb_descriptors.h @@ -30,16 +30,14 @@ enum REPORT_ID_KEYBOARD = 1, REPORT_ID_MOUSE, REPORT_ID_CONSUMER_CONTROL, - REPORT_ID_GAMEPAD, REPORT_ID_COUNT }; - #define TUD_HID_REPORT_DESC_ABSMOUSE(...) \ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\ HID_USAGE ( HID_USAGE_DESKTOP_MOUSE ) ,\ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\ - /* Report ID if any */\ + /* Report ID */\ __VA_ARGS__ \ HID_USAGE ( HID_USAGE_DESKTOP_POINTER ) ,\ HID_COLLECTION ( HID_COLLECTION_PHYSICAL ) ,\ @@ -48,15 +46,18 @@ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\ HID_USAGE_MAX ( 5 ) ,\ HID_LOGICAL_MIN ( 0 ) ,\ HID_LOGICAL_MAX ( 1 ) ,\ + \ /* Left, Right, Middle, Backward, Forward buttons */ \ HID_REPORT_COUNT( 5 ) ,\ HID_REPORT_SIZE ( 1 ) ,\ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\ + \ /* 3 bit padding */ \ HID_REPORT_COUNT( 1 ) ,\ HID_REPORT_SIZE ( 3 ) ,\ HID_INPUT ( HID_CONSTANT ) ,\ HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\ + \ /* X, Y absolute position [0, 32767] */ \ HID_USAGE ( HID_USAGE_DESKTOP_X ) ,\ HID_USAGE ( HID_USAGE_DESKTOP_Y ) ,\ @@ -65,6 +66,7 @@ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\ HID_REPORT_SIZE ( 16 ) ,\ HID_REPORT_COUNT ( 2 ) ,\ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\ + \ /* Vertical wheel scroll [-127, 127] */ \ HID_USAGE ( HID_USAGE_DESKTOP_WHEEL ) ,\ HID_LOGICAL_MIN ( 0x81 ) ,\ @@ -73,7 +75,8 @@ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\ HID_REPORT_SIZE ( 8 ) ,\ HID_INPUT ( HID_DATA | HID_VARIABLE | HID_RELATIVE ) ,\ HID_USAGE_PAGE ( HID_USAGE_PAGE_CONSUMER ), \ - /* Horizontal wheel scroll [-127, 127] */ \ + \ + /* Horizontal wheel scroll [-127, 127] */ \ HID_USAGE_N ( HID_USAGE_CONSUMER_AC_PAN, 2 ), \ HID_LOGICAL_MIN ( 0x81 ), \ HID_LOGICAL_MAX ( 0x7f ), \ @@ -83,4 +86,80 @@ HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\ HID_COLLECTION_END , \ HID_COLLECTION_END \ +/* Generated report */ +/* */ +/* 0x05, 0x01, Usage Page (Desktop), */ +/* 0x09, 0x06, Usage (Keyboard), */ +/* 0xA1, 0x01, Collection (Application), */ +/* 0x85, 0x01, Report ID (1), */ +/* 0x05, 0x07, Usage Page (Keyboard), */ +/* 0x19, 0xE0, Usage Minimum (KB Leftcontrol), */ +/* 0x29, 0xE7, Usage Maximum (KB Right GUI), */ +/* 0x15, 0x00, Logical Minimum (0), */ +/* 0x25, 0x01, Logical Maximum (1), */ +/* 0x95, 0x08, Report Count (8), */ +/* 0x75, 0x01, Report Size (1), */ +/* 0x81, 0x02, Input (Variable), */ +/* 0x95, 0x01, Report Count (1), */ +/* 0x75, 0x08, Report Size (8), */ +/* 0x81, 0x01, Input (Constant), */ +/* 0x05, 0x08, Usage Page (LED), */ +/* 0x19, 0x01, Usage Minimum (01h), */ +/* 0x29, 0x05, Usage Maximum (05h), */ +/* 0x95, 0x05, Report Count (5), */ +/* 0x75, 0x01, Report Size (1), */ +/* 0x91, 0x02, Output (Variable), */ +/* 0x95, 0x01, Report Count (1), */ +/* 0x75, 0x03, Report Size (3), */ +/* 0x91, 0x01, Output (Constant), */ +/* 0x05, 0x07, Usage Page (Keyboard), */ +/* 0x19, 0x00, Usage Minimum (None), */ +/* 0x2A, 0xFF, 0x00, Usage Maximum (FFh), */ +/* 0x15, 0x00, Logical Minimum (0), */ +/* 0x26, 0xFF, 0x00, Logical Maximum (255), */ +/* 0x95, 0x06, Report Count (6), */ +/* 0x75, 0x08, Report Size (8), */ +/* 0x81, 0x00, Input, */ +/* 0xC0, End Collection, */ +/* 0x05, 0x01, Usage Page (Desktop), */ +/* 0x09, 0x02, Usage (Mouse), */ +/* 0xA1, 0x01, Collection (Application), */ +/* 0x85, 0x02, Report ID (2), */ +/* 0x09, 0x01, Usage (Pointer), */ +/* 0xA1, 0x00, Collection (Physical), */ +/* 0x05, 0x09, Usage Page (Button), */ +/* 0x19, 0x01, Usage Minimum (01h), */ +/* 0x29, 0x05, Usage Maximum (05h), */ +/* 0x15, 0x00, Logical Minimum (0), */ +/* 0x25, 0x01, Logical Maximum (1), */ +/* 0x95, 0x05, Report Count (5), */ +/* 0x75, 0x01, Report Size (1), */ +/* 0x81, 0x02, Input (Variable), */ +/* 0x95, 0x01, Report Count (1), */ +/* 0x75, 0x03, Report Size (3), */ +/* 0x81, 0x01, Input (Constant), */ +/* 0x05, 0x01, Usage Page (Desktop), */ +/* 0x09, 0x30, Usage (X), */ +/* 0x09, 0x31, Usage (Y), */ +/* 0x15, 0x00, Logical Minimum (0), */ +/* 0x26, 0xFF, 0x7F, Logical Maximum (32767), */ +/* 0x75, 0x10, Report Size (16), */ +/* 0x95, 0x02, Report Count (2), */ +/* 0x81, 0x02, Input (Variable), */ +/* 0x09, 0x38, Usage (Wheel), */ +/* 0x15, 0x81, Logical Minimum (-127), */ +/* 0x25, 0x7F, Logical Maximum (127), */ +/* 0x95, 0x01, Report Count (1), */ +/* 0x75, 0x08, Report Size (8), */ +/* 0x81, 0x06, Input (Variable, Relative), */ +/* 0x05, 0x0C, Usage Page (Consumer), */ +/* 0x0A, 0x38, 0x02, Usage (AC Pan), */ +/* 0x15, 0x81, Logical Minimum (-127), */ +/* 0x25, 0x7F, Logical Maximum (127), */ +/* 0x95, 0x01, Report Count (1), */ +/* 0x75, 0x08, Report Size (8), */ +/* 0x81, 0x06, Input (Variable, Relative), */ +/* 0xC0, End Collection, */ +/* 0xC0 End Collection */ + #endif /* USB_DESCRIPTORS_H_ */ diff --git a/src/user_config.h b/src/user_config.h index ef214a4..194ad9c 100644 --- a/src/user_config.h +++ b/src/user_config.h @@ -35,11 +35,11 @@ * * MOUSE_SPEED_A_FACTOR_X: [1-128], mouse moves at this speed in X direction * MOUSE_SPEED_A_FACTOR_Y: [1-128], mouse moves at this speed in Y direction - * - * MOUSE_JUMP_THRESHOLD: [0-32768], sets the "force" you need to use to drag the + * + * JUMP_THRESHOLD: [0-32768], sets the "force" you need to use to drag the * mouse to another screen, 0 meaning no force needed at all, and ~500 some force * needed, ~1000 no accidental jumps, you need to really mean it. - * + * * This is now configurable per-screen. * * */ @@ -52,5 +52,22 @@ #define MOUSE_SPEED_B_FACTOR_X 16 #define MOUSE_SPEED_B_FACTOR_Y 16 -#define MOUSE_JUMP_THRESHOLD 0 +#define JUMP_THRESHOLD 0 + +/**================================================== * + * ============== Screensaver Config ============== * + * ================================================== + * + * Defines how long does an output need to be idle for screensaver to kick in. + * With this function, after being left idle for a certain amount of time (defined below), + * mouse cursor starts moving around like a bouncy-ball in pong. No clicking, of course. + * Move mouse on that active output to stop. + * + * SCREENSAVER_ENABLED: [0 or 1] 0 means screensaver is disabled, 1 means it is enabled. + * SCREENSAVER_TIME_SEC: time in seconds + * + * */ + +#define SCREENSAVER_ENABLED 0 +#define SCREENSAVER_TIME_SEC 240 \ No newline at end of file diff --git a/src/utils.c b/src/utils.c index 17a90ba..5d75766 100644 --- a/src/utils.c +++ b/src/utils.c @@ -21,7 +21,7 @@ * ============== Checksum Functions ============== * * ================================================== */ -uint8_t calc_checksum(const uint8_t* data, int length) { +uint8_t calc_checksum(const uint8_t *data, int length) { uint8_t checksum = 0; for (int i = 0; i < length; i++) { @@ -31,7 +31,7 @@ uint8_t calc_checksum(const uint8_t* data, int length) { return checksum; } -bool verify_checksum(const uart_packet_t* packet) { +bool verify_checksum(const uart_packet_t *packet) { uint8_t checksum = calc_checksum(packet->data, PACKET_DATA_LENGTH); return checksum == packet->checksum; } @@ -40,12 +40,12 @@ bool verify_checksum(const uart_packet_t* packet) { * ============== Watchdog Functions ============== * * ================================================== */ -void kick_watchdog(void) { +void kick_watchdog(device_t *state) { /* Read the timer AFTER duplicating the core1 timestamp, so it doesn't get updated in the meantime. */ - uint64_t core1_last_loop_pass = global_state.core1_last_loop_pass; - uint64_t current_time = time_us_64(); + uint64_t core1_last_loop_pass = state->core1_last_loop_pass; + uint64_t current_time = time_us_64(); /* If core1 stops updating the timestamp, we'll stop kicking the watchog and reboot */ if (current_time - core1_last_loop_pass < CORE1_HANG_TIMEOUT_US) @@ -62,24 +62,85 @@ void wipe_config(void) { restore_interrupts(ints); } -void load_config(void) { - config_t* config = ADDR_CONFIG_BASE_ADDR; +void load_config(device_t *state) { + const config_t *config = ADDR_CONFIG_BASE_ADDR; + config_t *running_config = &state->config; - /* If no config is detected, copy default values to our struct. TODO checksum */ - if (config->magic_header != 0x0B00B1E5) { - config = (config_t*)&default_config; - } + /* Load the flash config first, including the checksum */ + memcpy(running_config, config, sizeof(config_t)); - memcpy(&global_state.config, config, sizeof(config_t)); + /* Calculate and update checksum, size without checksum */ + uint8_t checksum = calc_checksum((uint8_t *)running_config, sizeof(config_t) - sizeof(uint32_t)); + + /* We expect a certain byte to start the config header */ + bool magic_header_fail = (running_config->magic_header != 0xB00B1E5); + + /* We expect the checksum to match */ + bool checksum_fail = (running_config->checksum != checksum); + + /* We expect the config version to match exactly, to avoid erroneous values */ + bool version_fail = (running_config->version != CURRENT_CONFIG_VERSION); + + /* On any condition failing, we fall back to default config */ + if (magic_header_fail || checksum_fail || version_fail) + memcpy(running_config, &default_config, sizeof(config_t)); } -void save_config(void) { +void save_config(device_t *state) { uint8_t buf[FLASH_PAGE_SIZE]; - memcpy(buf, &global_state.config, sizeof(config_t)); + uint8_t *raw_config = (uint8_t *)&state->config; + /* Calculate and update checksum, size without checksum */ + uint8_t checksum = calc_checksum(raw_config, sizeof(config_t) - sizeof(uint32_t)); + state->config.checksum = checksum; + + /* Copy the config to buffer and wipe the old one */ + memcpy(buf, raw_config, sizeof(config_t)); wipe_config(); + /* Disable interrupts, then write the flash page and re-enable */ uint32_t ints = save_and_disable_interrupts(); flash_range_program(PICO_FLASH_SIZE_BYTES - FLASH_SECTOR_SIZE, buf, FLASH_PAGE_SIZE); restore_interrupts(ints); -} \ No newline at end of file +} + +/* Have something fun and entertaining when idle */ +void screensaver_task(device_t *state) { + const uint64_t idle_timeout_us = SCREENSAVER_TIME_SEC * 1000000; + const int mouse_move_delay = 5000; + + static mouse_abs_report_t report = {.x = 0, .y = 0}; + static int last_pointer_move = 0; + + /* "Randomly" chosen initial values */ + static int dx = 20; + static int dy = 25; + + /* If we're not enabled, nothing to do here. */ + if (!state->config.screensaver_enabled) + return; + + /* We are enabled, but idle time still too small to activate. */ + if (time_us_64() - state->last_activity[BOARD_ROLE] < idle_timeout_us) + return; + + /* We're active! Now check if it's time to move the cursor yet. */ + if ((time_us_32()) - last_pointer_move < mouse_move_delay) + return; + + /* Check if we are bouncing off the walls and reverse direction in that case. */ + if (report.x + dx < MIN_SCREEN_COORD || report.x + dx > MAX_SCREEN_COORD) + dx = -dx; + + if (report.y + dy < MIN_SCREEN_COORD || report.y + dy > MAX_SCREEN_COORD) + dy = -dy; + + report.x += dx; + report.y += dy; + + /* Move mouse pointer */ + queue_mouse_report(&report, state); + + /* Update timer of the last pointer move */ + last_pointer_move = time_us_32(); +}