From 495d4ed9037be694551c82f41a2a9bbfe5b2bf68 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 1 Sep 2015 17:06:51 +0900 Subject: [PATCH 1/5] Fix the pixel mapping and improve image processing The indexing of the byte array was wrong, which is why the images produced had that funky spiral shape (which wasn't real). The polar mapping was also incorrect (the tracks were mapped to cylinders and vice versa). Besides correcting these issues, improve the output by: - Point scaling the source vertically by 3x to produce better-defined tracks - Overlaying a "venetian blinds" pattern to add gaps between tracks - Resizing horizontally to 3072 pixels to reduce aliasing - 2x oversampling on the polar conversion again to reduce aliasing --- DSK Image/DSK-Image.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/DSK Image/DSK-Image.py b/DSK Image/DSK-Image.py index 8228ad4..66cd3f8 100644 --- a/DSK Image/DSK-Image.py +++ b/DSK Image/DSK-Image.py @@ -50,9 +50,8 @@ PIXELS = [] try: byte = DSK.read(1) # read a byte while byte !="": # while the file still has bytes in it - byte = DSK.read(1) - if len(byte) > 0: # the last byte, for whatever reason, is length 0. Bah. - BYTES.append(ord(byte)) # append the number representing the byte (0-255) to the BYTES array + BYTES.append(ord(byte)) # append the number representing the byte (0-255) to the BYTES array + byte = DSK.read(1) except: print("\n\nOops. Is " + INPUTFILE + " a DSK file of 143kb?\n\n") @@ -62,11 +61,10 @@ finally: sys.stdout.write("\r Starting.\n\n") - for TRACK in range(0,TRACKS,1): # for each of the 35 tracks + for TRACK in range(TRACKS): # for each of the 35 tracks LINE=[] # start a new line of pixels - for SECTOR in range(0,SECTORS*BYTESPERSECTOR,1): # write the bytes for the sectors in that track to the line array - offset = (SECTOR * TRACK) + SECTOR - LINE.append(BYTES[(SECTOR * TRACK) + SECTOR]) + for SECTOR in range(SECTORS*BYTESPERSECTOR): # write the bytes for the sectors in that track to the line array + LINE.append(BYTES[(SECTORS*BYTESPERSECTOR * TRACK) + SECTOR]) sys.stdout.write("\r Track: " + str(TRACK)) sys.stdout.flush() @@ -92,7 +90,8 @@ OUTPUTFILE = os.path.join(INPUTFILE + ".png") try: - subprocess.call(['convert', 'DiskImageTEMP.png', '-matte', '-virtual-pixel', 'transparent', '-resize', '1024x1024!', '-rotate', '90', '-distort', 'Polar', '512 110 512,512 -180,180', OUTPUTFILE]) + subprocess.call(['convert', 'DiskImageTEMP.png', '-scale', '100%x300%', '-resize', '3072x!', '(', '-size', '3072x115', 'pattern:horizontal3', '-negate', '-alpha', 'copy', '-fx', '#000', ')', '-composite', '-virtual-pixel', 'HorizontalTile', '-flip', '+distort', 'Polar', '1024 220', '-resize', '50%x50%', OUTPUTFILE]) + # convert the 4096x35px image to a square, rotate, then rotate around an axis. except OSError: print("\n\nOops. This script requires ImageMagick: http://www.imagemagick.org/") From 5963f88448c70d9eddb9d7cd9aa303a42e6f7119 Mon Sep 17 00:00:00 2001 From: Hector Martin Date: Tue, 1 Sep 2015 17:16:31 +0900 Subject: [PATCH 2/5] Update BLANK-PRODOS.dsk.png with the new code --- DSK Image/BLANK-PRODOS.dsk.png | Bin 58664 -> 33323 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/DSK Image/BLANK-PRODOS.dsk.png b/DSK Image/BLANK-PRODOS.dsk.png index fd800af8120c03784b07de397ae68f300a8e3371..dcc68feea1e1193034c2dfb2cb29529a2b3c797e 100644 GIT binary patch literal 33323 zcmX6^bzBtR*PdM#Vd<1^1f)?AkXkwf0qF)2>F(U6r9~;F1*E${T2w%~yQI5&_qX5o z{bN4!xpU4v_qk{0J~MO9Jy9C374dPXaR30oS5}gH0{{@ve+M@D0uZ$Q_b2)Uv6fbo z27u}W+5Uoy_^|;1A`Ad-(U%b00N}|F0K4V@@G=bmC|ojHG{w;Z@Y`34 zasVna;co}J1$9wWdD2`Qcns2g$u3ny^xK&+C&I*$?O#|MH zPa!`kVl#y>Vu!FQg|MnKudsq_A}sVHtPE1DL{lt9<2UrDd$jD~HSJU=?92gqQW#!iTsX)Tng6_9RxQ`-I=Z#W+BTg)f2XVv9pCPCr&s*8*Gz%w%F z1BfdGQbkE;|FyF@VGj8|S7h7&o5ju9yyI}~ufG)JLO~{PCS{bFnkp8&`@1(Rf3;e>W9Q~d$Wy5#rztMP8$2Z)X zjb9grZs~tziwlbE42OaBF%`ak=Zwyedi%8LqiMG7A#MDU{u}DzJ<6UQXnBI?cK~QthOWkTy?-WQePoq$EAT2|2VE4Aze0iS? zt~{=AP}{`dxiy<%00AudJ_B)Wn@> zmi9QeTcU|%KIABUwenrs@n~Lj8iqCw?5t4Y++u8ELCu}MetT<7irrUFCpE<7XuwK# z!htgJvhSa_dxu>iBapGJ6G=omA@S^ORrZuErlm<<-Aj`5GBzPAx|5=P60hv&ud!aqdUsARf>d!Wb*4`v zaehC3j@&$cn^#vp@Kr|B&7|yi())?7SK4)dkBMg|sm%qw6N{|EQ@A&&sSWIk9jvmS zYIs!ZFqZnoF&Zc9c-0znX$cmb$mlY=R<~&>W^!VW3L3yZ$Q3CmN?rySHw#7SZ9`o-p9&@kol zrB0=v*i8A1CeqlsUf!kRAu%?>yOHEcURuIEmGwK_f9ckBCk95nRy+Ul zloTnWU2no<^K0ky7Ng6YgAC`M5 z8RgNYt$lVXm}I7YGHPO6R^X|e=qdmBJVS%ngFNr0jFN1NE#HH%xjb<+Yfq~<62?!9 z6D}*=G2JI^)~WvyP-1o?{Yjg}W@zICQ#MyggqGm8%|+3iRSC%3E`PzpP}gfo()@yR zknhu47@3~kxUBrQw!2IvA*O#xUUYgNrV{hFxOSzD@(q<5J0l-{o6Fm7+DvVnV96#b zv6A3miW5BE#EwOi3`B>>BS8QBrC!WWfy=P`i{LlfFxDg6mcp#Dx$*h?c0N6~D4k|z z7i}Jd=spR9iYKew5;|KBsmqOq9orYS3)d}cq%jJueYu2 zZ|?HlU`h<{vp?MYlB?@?<7tco7Ra;t6(3A&kbaS;G~InLNjLMbQgCYnr#aF8bT9T@w97 zcXCW#9!5RdsE2x`|Eb?Ll8-X#H))iQ;P!g1cFq7Js6{1JuEfxgsNvGyX;faz*!@b( z(zh?+_gGvTXaiC3?3?bSj#?RW+p-_hT7xDIZwsoh7A40_jDJUq1^|JMNVF*RV+o}M z(!S@q^UQulf)TZ!dt?vy`74a!VJTbom|9hL#L7tR+&hE~`^LnZk(x#ck9F<;`#x#n zd1df#S>$_RLRP>q&pC@#oIv6-zIFZvOnhZBq07`EayWU&O@Qc#dYj`@&F;#gsXc zF{?ZpyC8jDy|F`>pnymk?T7F-+6kx!H7m^8LjLEjbg|DL9g4u}v0FY&&PfD(qt#+U z(ru!~@7Be?me>03``p%Um2pMBMAu9w?3pMLVY5LV&AaCxfz14;lM=zu{iBKTSjD0+ z69d29C=KO+m$_5!%qDvEc4|YGkSiob$i|zSPMT;!*3W&x`XiXKU^=wB1@!f3eixW& zhnx+1lrp`BTqfD@ru*p{xk?beBYe)IM&e2S{hk-|Rrp#vUk0UW!6yvj4vfP`FEL4S zWIdWIl*^O5$2SDtYNv`wtCN+o_}EGhrpWlCqUVY^sEzORg69vqv!q^rRK>?bP@ zeK`YRg|Tl(&pb{Ll;Lr}-g66hHu{~6X}9n8=a!qVnbj+y@1RuFr0w8)FLp`>)q;pe z>(Uf|@jU?6&SVRd6746_Qe}^9OE%reaSswRx>H4yWZ%AEr{(-w;c07$MCR$1DyApO zaSA0-$KIM-=W>NYnwZOT1@rf-L;iRf;$GkXo3Xoai7&+tPtoB0ToCG%*+1HmFJlXr zcp)Mvn4}VBu74cO2&w>=svg)HP3{^+r=G1S{E=vR*=(Ti-uS%yQy7;c$>x2lv~#_i z*s7eJk4SQ?wBm{iBZyZ$^?99#w(!xl^gt|P{=e8ab8~nv?PrBY;qK*gsy2O^mqgU%PqOgJUVzSSqp+MJO z(dcC2_>U4N@xRsgE6>p2r0vP$FRw1W22R@Q83MMZ63CLzQgCTG=|9GuCaQLBEI)5r z96Bn05~=X(lPt!M(ei3$B?PXP-RwE?aH-3+*}(lBa^Ly>)VkSRr!wh}*I5-0j?3Ay zrCqaIlPJIVISf~XmY>l@^CLjPnvy{1<$X0aTN0}g6yaaz>+L6I%;ct{W+TMo`zdu} zRhO$ng6j0~H&=>aG&&hHIxuc{UfW{kgGX*IlbpFUL;ro3bDZSty9qb>M2qGQ3s!-# znT;Yu>CA_wIH%YG7&s$)>Mz6o!Tup#vMK$V>`Hg%Dnlgyl2@J8^|dewTi&^*k`<>^ z`2%_6>#o7hW@&Ins^I|r{{B8Kt)8jb9_5C_{cgwiqzHfk6~XKhkW${duwacksy_NB zkF^ys+vOet5n*Wd`_Wii>;AEv%Q?uPkL2LDF{v~_84a8GOGJRjmJYvOpFefQUmYc$ z(LWAg1P#e@(j7QDAANU^^S-()dagtk=VZFfa^A`KlwDCK`@VQf!MEVYa8T&EJS8QW zIF=G3!JdN9yRp%GJbdboH1OpDG96HGI{0%yP$IQ_gVmEBX_QSEcifZpov45bL-G;H z3X4nY$EDe&ISKB1i*L(i{Kd3M5v7A|486#g1`a$2g0N6A+MVM(%%v zUJVW2gs+YboZmNnYtrF+xZfefa*MN@6XVv5?_H)bZI7apoH4r&WdunAxXlj-<>hTX zINYZ~!ra(8(sQOMk=_Xdt-Em+UP<>o8+Zhhi=#G>l5i=2WJR?pd473mVNRlgLl4eB z;^@}Um1_ALK3n2^^FH$=YEZq2&zV-xB)58AoKRlI8tqXGr;W?T7mZ#CTvbEAnGJa+ zklkHV{p-9!y(qcVxxP%2Q_bMrpZsdFi6c9Vpx5Ey3rka*n}@FC6>zR%A%jRnT3M(M z()Zm(gm>Fa^sbbqcs?yuI&P#GtsES_fSmfZd8mnB0goA-V}AcC&B#x4Gm0jpG9_sM18e79*!_Q&hb+iBAGonuHkuU3rZT=T)qEpOOt&w0IULaVc;ey! zxdj~sLwr*8XXfW-W<tU_kgQs+D9C9!l>Bg)2YV@YX7D)X0*3wboZnPRgEFf#L;k5 z+^F1>3E^|^mNG_ zAaBe_EEq$)I;~b{927)5ZDsT1^7i(Z6T#4R4QY9FbWBZ0A^{zAn(o&0`H1QA-9;PX z*K^*y`S&Cr0c@tQx!KH%`nXJ0+$q$oTCKe8{9tEL8tmY^bJcBg`W)5de6aMKrN_7` zhy-9_rSKA-nrcYcb$OU4{N<<2J^q#bh^wflJ#MX$wZv5;ZBb>=RpTih6hSoBe@A0) zpKi+m)Ns|aF)mBbYhK-!in+Ug>$n%yFO9kUMHEk5j zFOl_bi_@IVZ?hz&0)BLm!g%+~D$5+Z0COn~oj``tp~b|x3X%Y%OI6fH%j2@%&kt=b zP1&Td%Kgg9GNk;7y4uS6g*WO@m%A4k9SO{!hqbl?lPIjqE{P>gatK<}F?%buYZyGwJYr;iqZbKwy0 z>xbgXK1^wghoXCt<5EBLn@{FqQSt3^+sftY=IPj+6O|KiOXC!C@DioZVzYGQL{GbH zoca}3Aj)!ATI}CWvP99j%82aJ6TI}kzWNln%s4&X_=79U2m_RnzLJNh zVqez+LX;sxp=7XZwO{<-`ksPk_Lt_j40%9_db#Lj$L#JxZxQd{%N!y z!D8i6+cJC!&C&BpG373|wxEF>Ti{D;RL9Gb26s>*6*fLEX9S$yII}EXZb*Bn13Na3 zC%vci9zds}ty)ND#_(O!jZyV7&Fx+}YMu~-M;dqT{&nXP6j3@qFiau*Yy<>s1q(3$ zS?o1pDcxPpMzQzvMMb7BsQ$D-kK8{6Wwf3${h_}UOaO=o7t{?aUS>b+R^FeFqqJSCo%YLJ|KjP%p}oP9A`^JR#J z`yO8wpQ9{3&_qNxnKJ5dvMhpPdwFkbtI8f9pdv)oc<>^mK@Bmrbb7XBA6bP*X`IB^ zRD*iE1=r+4I{0&Z(m4HR)-U}1jhBS|%y(!Gg|Ml(*+Q5Ou<|TS-r{hZ&rr%8KbF<4 zivcBF^G27=;U%NZFocLuFH6culql8-tBTF|iJO#ZxzhMjJ{jlzRk&R;CEg`uz8I|RMjOGHyU z3SRDe&onKP0I4rb#RIDiB1B;>R;L!SyxIn2cef!OY>zHp#&|?j8$6of1|{VsTdSvD zSzr@+gyWU)qbL0+vV>#gp1q*oj$TELZcyH96Ak*4jerz^H#3)n1E^qo9Ess=S ziw9r?3W* zI*gC&gxG%0zc2o1f}Ye=wp38H!Sfcn&WQ8dEW^?g@-aFq0)CxTW`bVZ)Lq7OR)pV= z`}02L1rXwp$ctKrM?ge&TJr-(mEov7b9xzNgCe-jn}R_qTof1)vU|<_U9PeuGE;t0 zk6pRt@N|wDy#EnsYB_4RMxTGF)F^s3~zz|5lGMov}o#CKR`Z?$0THPGjs)a<_y$1$ZEThc0Jp2 ze1Cp9*MA|+XK|Am#*+<{A8aLLmyxd$03LKshk`iR?22`G8*?|QfALS0UDAYGboAbx zKsu8z&_Ak1wBJvO-MP# zN2#Yv9lz0ClAq{@GCD}X&)?NUWPzO2u(poF_uV4Eu4*-SB@=4@;GMcR|^saV>%aY`{>Zc+hzOVFUmh-XSN0 zp^zNU)*nbuj*zq6e-i4&BnL}MG0VRKbE9i{iZL3PKrEAlUK{Dp)K-*v&rKt0?L@+@ zPuOPk78b*Xs6*Wk{2ss*A%alK64@xO@AOv+bD<*Rq+(U?}BfEDbC2c@)+Zc*tDV}s9Rk#Gv=2kC*pd=lN#Ld~(^j(ayz zEK5YE4}{rrndhMQ+w1ALBb4cmf80d=Z#!c1dPzjx-Fb{+>65&45FmriqIPe~rTXdc z#_Vo%o#8%gwa@0~+x6hbuK>y*o@Y7>eKgP~dMQ%_J84Wa!|;GK0ZWxHab=BkSfWt8SH7QmFfwf*)33 z+;dW^@x7&wr=h6N_IxQvzE33vBg)^<+ayCYF0+F!H{52o-vchxboH0My;q?-=lvH{ z3=h30D{_CCQ&Z%>K0Oe>*&pT1z`_2jQlYUQ;_n!E8#HrODMPwGL)z3y0v`mUZh-~FCR92?TzMtA9a9H{t=L~e;Bn+$i)NFjO@>Be55y1 z;oj;tbPWG?@2klDK)OnZU%RQ<5=)6?&mBRxpLGA-i#zvE~d zn&>?0R0vm?Y>|c4$GPi}ajFZ$zdwo1*B~PaSwXiqxHCj}`f~-Sy|yJPmr#)XPc8_m z3q@OKz$*<7wt_Od4ZQ3rjt^_$VxbQI+id+oloTfBbKhq@Q1w)#inmOYWK(G}*+T_$ zEI0Liq$(BYyDESUm}7j6Pduc=<05(DP&U}a?DYJQ-sTr%gn%BkcDC`d?9rpC2=Z8# z*jR~oj+yE?HDu3PKozt;N?)6V{yxHaYbZ4VC7TdG z_=47^K@t&k4RHb?0&U92ynOE?R~Lk{9;TOnn3(XT9q`S+3j`jncM7xlr0IYv{Q8Ks z_1#Nhdej;G-rG&8z!{6`T?rM){Q~6j2n@{NDR^AkUR$Hq;CBgU9cS*+^Mh%ez+X=% z#v#d@UUoinGz^L*?`$LFFw$ZZg?xJ`9d)w@(n`im+u;SavIB2tnIS+GRbtTC_54)| z>SF5RCOZ|CI`nMsnIGs19?_;$FlbeaMga0dTu=oAsTpwPI@#nyt$ zA#vBsu70M_2uAQ8<7>wIoB0PEt4BzhtXB*+i;m-Ue)-N+RC9f^HH`b8j#E+j{_Z~p z1{8y}6zV1=Os`RU{I7RlEuz>=TC9kapwrnr$N#8q#Br6A0kh<3Tm#XD$)23CZhRulL=r;l?P=~+Q zr#tRD6go_ehN))AFbY?nnIX@&Uh!a!Gd8_p4lSu`IWQ6mk+;-A}C)FXqercj;i3}fMD>kxxw}N zU#R=YdH6Qcbi=%J(HlCl9^a zAtyQ)zDYQGqCcIK&_Hg2sb$`;6{`o)Ss6YIwF8B*-?#(S1&z9(7#-d?3yO;(ED zae!PlZ&KC0%;|~Fg*9m_ku#!KJXQjQwxmf;eRhhdu%G z{3WP_DqtQ>i-hXH)c}@2n$vaz(Zv9czfZM`5sUntVk>+w zdi&}0Od{}di49S6cYg9Fw@@95m=(G-*74r{CA8)$pns*#UTiAqt4<0qbokug6Dfc| zKCevqRMp~khE>qnkvM^c@wLt@Hkif9Xsv_@0}-Ne2lK6xVdeN7MRRd}gTTtss=F4d z&U;wL?Do92AY%15E6DsM^?d(X9D70W(ZFzqYkMSxGT|LCb~(<@JIYnN)m~PEQEImPZ9q*rzWT2g58y2!li$or%3p<-xt7I(C*P6nPNEjQh|A|h3 z!7eR!Vqfy%*|!%=Jb4j*P1gFuBsn#w|90Y;1{gq9V9cXKvpX)!G0oW{tGSk1MN)8^ z3gU8eoPBSQUV;jk3QZ^xCRMFpz>9l1eWggTpA76Sow0KjEQwP9x?xXR>W48G)L{H!mKv>+&M78E1@o+ zlkxs_)aBXo?ZK$-=*E$<0Zg3)eP8x>6mTCyz{k=}pXUDtDm;8<5Q%?=lS+Fe&zD1i zUbAgJErt5M$>`n*Nsq7IET_Gln;g@;ZfvfQGMnBbz!^|a z%^?90XC%)Z`JVQb55ikfgYPP44(_&`u0Yg#!={~6od7yoQg%XWPD_3^bwWA@S_r1STyVclpndSG8+aBr^< zem^*jOh1R;bA>N%Yv?uN?l^(9r?Pmy*H=hl0u3y51n|h~Oeq3nDvK2S#kp{6tC@x# zDQv;-GT>F1ojJe@(ONiDkLfr~Fht!aP#}M^w2TdwAe>CI=7!W!_Y}5h7dCOEc%d>o zwC+>0ANt`hYTAW`CVL^9`KSU;~4i@Pul`&eM_b6Qhpn zg6q#x#yyKh2J>x_u%L|_90vk|&H|#DE~$q$^$4Wy14S}wbP?E{Q-V#C|DS?l z(GUoAcEH!X>;gB;y3QphVI;f)0FU^9b4AF>@e~q{a#(GZtY4>a_{~t&Twe$NPa56i zCvwXrn|+Vmyh3*6|J2INBG~o-+w5%gI_jgX{#N?oj~Z23fnPbkX0LwjB?5k#2^7@# z3jHU=MfW4h{;eW@sr9uSw*$uHZa!5gM-bFE+=;S`~_F z6TUN)b31lD%>_JCvX!Pq-fvxXzzF1b_hr2s2sIY&iIiyE zW!ks3!=~8d9yV2>2@8D?8wZ~9?i=)UvrJF7W!jO~6n6w~`ByJI4im-F07E}3-^QLE zG5`o88soxRF!Wp3XClbP>e0$HVxH)NaFp{o!$kQ36U}8_4z)>X+&g1d>R8WxSFu!J zZRixo0UsOYZ4-{ucWS6*e*{rr2RjtfH(Fi*BDD=a@C(qxMpZCQJSLK<(H_)&`C@6R zS`rp$?@Olw0=DUOo>VKed>fk6{JFkA66(bXnmF(8m!u`dflZqyPgL`5uK!ufS{7T# zebuN1)i5-hEu+4e0!Ao2I7KMe-xVWloU3Hh!#y}aKNpjAX2=0V1+!0MD09__&7)Ia zJ?lppV$VrF)Y@~2RdE4;Nw|)(4fNt=7j9(asuhMJozHT)fo?Xkant}?)_zJ zEE=z{Ku3kQuLQPkA32}dmqm2O`!Tma7 zmuMK{Hk$nKQ7Yg9Yaa&2ZY`w|)hEM)@o}itte&2I{d&drDBy20!_jVSut;rt3sy`B zXdBw5qm$`GP^|JC{;}7Y@=o9Ud z@8?EGT41@}V6~`#C%mR|D6s*S?Sr?WYa|5Uk_TA96$4Tu7XV-!6O@_Fo}hku-a}AKlWpq z*TTg@RvCkOydALZQ*Y45L7d496*dsMeb6vc)F}AXW-EbjnX1Es0Vay>lo<^0$IiX; zXdF-@3D@~`(Bj~DTtJ%hqpcmwIt(zUT=*{9k>L0*-FHi=AKs_f>;V3QMPuZm%?~^p zBg2om2#Ci~>HW6#DH6;01xRI{=FTy183f#ZUFc6GC%b5}n^j%;gd4{D1#t6o$Bl<# zbZXeCc_^%xl~I@#m8G{%SQyyqi@sW?0Jl$Zl} z5!Ku{-R~1$j|@g1y`ebUAjyH40DvmYVdHZ5uZBp)*0bDBEBe(pP{smb?;KnJv3hR! zg@zJ`u|6Xz!esx+e!rI!e;5P+Xn_vTt7$*%Om5&bRsS0E%+8Q5{Lr+Ezpcj9r# zIEkLy_3jN*{7Bt~7_));#nSn40K`)zPb?lmBRnlprQQ$<)XghaL_kwB#(yBB9rff2 zrzaopP0IB7pX}X`*kcTc8QE@w0dskNY9a?t` zbuBmiCId&GgiyRj>@Mk2U;Zaz&5iQhclV|74?2>^#o$Ay8Q=S3{U?z-|9%+rTO?Q8 zN%ZX!t{0g1D{#?Pj`1HhX8nH|^fg|_Idwnv7vR+l?dIU^*@H~+eFAJmv5gGxv{OT$ z+pYOe|7t2EE*s1eeh0k3e$=V$(mG;p^GTCB*-q!j%+nBx0o;t`*}g6TX&^0T&Z#u* zT^mzHR=H_eLJ*o{_ssn}EY3?YfgiHd+Cy8G9@S}lk8Wb_|MlJi;ftC3i34~_lcM zUCcNQs>oD39q?8rk+?Tl`_lWl20jGgYwMWr-{TZ-Pp=@eB_Xx_n0?gh;_6(9trZNUrStBU zEf0%ZY*h20j znA0wL^ct5QdEotE*=$Dn9gWU0L$30sotnjrm7#$XF0RVo;V9b0%_J-Uj4Gngt zwJYG-KI}o4sAPhCkkWUge!u|%)+}`StSsQ%Cwvx@lI?DDOiuA6X5{> zE)Dm)on6uPBW9?^Ylg=boB;5u==;^#mdL_77@Y*Y93Me1BclnpqKI`6T|J{xae z^1+|qpKM5PsUuWwbAWXOkjC)7`?>cKLE;l8@;iOul?8MboRGkRmI%OIVGp_<=xP3K zuM?+|DyY8x5zO-Zab!K`LW4KP+>=oVoFbVm#w33`2|1iW}I zMwyq+*br%=2(=KPDonSl@};68mUt4gh@@NCiZ5x7Um9;G8@k>jgaead>1rZ|WW7M_ zGhiqgh`kk#4rz1lS#s7ZnB+d8MIH+U4METm_IDPwEM=(67s zgrksfK%s*Z=)753>q7Jx%nY5>vM}6CojpNhykh7%gaP{DX$HK{YIbQdPwMFy76i@% zpd%tL!v=$aDm@RM0Gz2!c2v(^Bxc^GyWQFlR4PswN{6mW4OiRWSMxA$GfNA`RM zF{lDyi{u<4lG;crjz>VJid_QLTs^$i0< zxyS7%<{z19t-ZmLBUl=zkyIe!-Jq}CTQlxtXsWGO*hiY(9l~sH&N}NyUp;|wxhLrn zu_@90$I)&f%lCsuz3{6tArD2J;r1b^kHE&dDmhb_&{{?$E*SV5%6;D|HL5I`;j&7Y zbe5S3xUF*d*F5JiMgjWjrksPZkyQPIJ2gR@j-9j6k$zf=91==kfSESfCsq@hUt$f9 z&dvmq*YU_efVoLc2o-xNXLpbztFNx(@fRo~MSQIW6c6Fq7Z*`f>Yv~pvP{!-Z35%+ zHx3hp0cEcolV0dHdKcX|4~;u+Q7wDC2WzjQtGDb+C4z`sE?+Te&b`B+Py-4+_H|KN z0Qz74n85jG7Cwd$7pzLIzmehsg)O*3--CgwXP=xagqcTmFMP>cF$&?s22hQ`ccluA z41f!{-)#CjyDx3;?L_t^*Zqf-fO>3U5V|1A$$|dUP}Ka@@9UJkbMg>tR>Vg!-flYp zC{yDh5e~ZX551uW;6~9Fi!lq`JG|tS~=71O}iG~R6-k*CspOc3|z==7>=qEWiUM zR`{sxu!@h|TAk-iiU*YRrh<`r(FOgBXTwaK6@8XJ(35FM>|zMUzHy*xKrevD97iik z3w_7Nt+0$5x$8Pe(bkz~UOGOojV)gw+jD!kR(*BYsJMjM(jtMC{yVMW#0LB|l7EeD zmGZeEotMP79CEb(BHjX!GQGQOgG)XEeGNCB+(t+BUdlRuz;Jih zl$qj+8)+uVN#TM?GXh@HguH(vJi-$SWD1iYZP|d^Q$oyOU?ze$iKd4|I)$}g`&0$3pMj63b-;`RtM5>A)UJCm#?d^=$!{LsqOM3_ zm76jA6xfKsx~$5gmoz_u4h|WkqP&qOZIF+z!b$dt&>|cBtK<4UM){h!h^<8~WE+Gi z`i8m;ZA~F#z48718@0!j@XoWLjBL!{6e-d_oPr$GNPOfPbPJaw4wDqv?mFulM-@dB_nf!jLB==RZ+b{0GY| zzEpy1|GtF3k5md|$W=l>RTReP1Y-X4)9FLWwDa~e^&?hTsWw7F22@40@U0SceCJ-_ z=bEm5y?k5fO_F2E-Gi==^y(RWm^_ltk}`0>gZCWym-1g9Ks4;-XXvqkdCgj>pl?tS zucIZ0?E|>47%1P3I06Jz(K&WVpvtlGGRmN3SLG%>%ddf4?Jx@f*#9kb*HigB|I_Z< z8Fapo0AFxO>`Gt0TY{WzO8rO%WSSxWb>r1+ZX0`3&<&#p??DSnN-4 zIU?RuMnAFnlq0Cp(-Li^rm2mt%Y3lvqx^?hEZV^59emmn>bK{8rvT;PTmCbvw0YTH2^-fZR_L2oWDw1yjnA|QvMSO7V~5e8{1MvX4gs=j zG=-wml8@ghQYM!5th)NQ(N_+vdx+AC4~%jvlajG{%Jh`*mVV-HnCHnIEfL& zdXk^$*e8P^qTr8rdpHcc&6KaizGmz(b(~6pG56z`4V5;0?}!(az9Xul*HJHtfBWxsT;a&hP<2ZH|UhI zW0&+NuN>&4tl^T$fM|t8nx6#Cu@1PX9tRIHhrNL#XBp+gOpkxFa6e#nJwVL3R>$CT zA+O5#X{!w??=YouUsA8guu; zu~QE^QlV?XI6}|i?ZYUPq{{Y9nmul$ZxWsrgW`h7V3R_A-+Y!4%@!3GS7M+@A0e(1 z+}ihcYOc+G{KNfft+L}<2VBRgQ-oE6@ryz|4v(;4jY&9^*Zrcy?Gw0eT1>>C|2yF& zdSg9xEVh1{+x2+)hh^cH{DPfr$hAGl2#wD5#TwD25!x#o- zTTy@gkMPRd`!YV)VWNes&;RZau!|ZLC-=MXK6wdB@+$yg1nd5e)M6pEWa;~G_b%wj zE>+6!ffB-yfTvD(c;IkQ5c3hF+uOYD$I@!%H7MyKY8rIl3I0>hi3c&HrJEEKEOrKj^nwuT&DXSKmoGKwGW^UTl-`c}PUBK(?|C^v7oA@&U0nrp3*GlV$ zmpG(Dxif!${@a|IG9`AREHCn8#K&L0xa-DveJ~lYvIik5@!VcCpd_dKl955pfK!X@ z`TYvT3ugL>AEuSJo|m5PPo73mMb8;uBLo>6?6{vRg^Z;06WLgVi3tfwNC?rc zRv`5mei4LyVquZpqp@wWt)nf|_1-I*-Tcs0)KNwhm<-spJ;Df1>Fs5+wzmHDHojD9 zLNtq;ikg;QrNU{`TuV7-)ZT#Ii}CNwt78bYfvVRHC zQma0}()HpxX1C-i86qTTC30Iy*|PFJ(E)#`r$#%AR7#|cUrKDPumY*ECGW%5jS-3w zv!}@K_3mjt7a6PDmk9rUs=%89Jt*UZIpfHu4=dOA7vX)B^YeuTGFjU&=Jq<12q#4N zpVBTS?btgYewOVf%S6 zonnv^$--{t_XRMlB^Z$8{v+JrvUlqd+kVSp65{=WGAe??+fJbacV&T^OYC)_JGX!Y zY>&M$jt}KEp@2`)=~lFTUOs=8Cz+R(P49u#!?f&2kM!UM@3r?4tGBYH4s@dntf9r4 zk-@Oi)i-C}PJ;wqZIBg=fZ8S4NJmnH7$}CZPB-}i|Iw$OT;V+sHtQ66!PtpgHXbgd z5q#Ez=X0$nESPqnb_g;=9r3?fuB}oUm6CaeNKlFU`BIEj2s8fT3CI4s)b4J%VCfJNBq)9JVu#@_H&P&;`DCqLwD{R3|Fo$hM<jxso2;kGe91OHJP1Ocwieom~4(;~O60QXwU7xaRko*>&|M zr;B$>JoLHK(2=r6#_sY^s%B5rVZBCW2|_A@c7>JzxkK;4GFW->R>!Hq^|*cdYSSTS z!J#hBiCTmm?7r?zzmR!Jv-nZ?D_MKj8Eq|3mvZQP_CKRv`rZltudw%yYU+vpMNdM2 zgc^!;qzVX#^e(+ODS{|16afJNA<|3eh#*aRk)j|VO+}hO0HsJ5q*rM{dhhU#-}ifK z-MiMi>*gQGnK}FHnd~#OXXdl_CzXlh?FQ042{0^#7(r+hQ9*yV+8d23%H$sqo~}Mh z&6iM#29j+Zg4fPH1H{tGIMtfq;3=V3Ap)!&!aRK3?B!j+O&oF;E2cb5T~B7A`PoQV z{_>HRjP~7&!F^-sJXp0|l4c>h`TDSN(OlvP(nz$CUci%N8r3H3nJjVSn8ex?maObH zg6DWg11NLXkv}eyh=(1ObMXvt}}Oi z*7Ur?2?h{pEP zwKaT&C~Mhs5kJ!$dXiF6Gm?f-U@bu)P>7B3naUZlg*#XTwA!|zsC24oIQ(VF=Hm$V zCrJhO|8_fuBa<=(Z=moGc5rHzv z1OwklPr7B$Pd9^fr)j#Q5v>Z>4#ly75(h(Jf-+FT%9$3Kb@4Si?7BVs@y8KY?I%2B zqI|lP3=O>d>8v|Fu)%P9#)fBHQ8S;txBBV7vW?@PtW5SD?H3L80S*Z_coR@BCTUTY zzwvmKh>M`TuXE~r-Q--*eEqj%=bXNppp>xhG-g@$x_?Vsm^@n5gm#tF=-{U_Nue*d z4#VrW0ZTT@F~+zRGBjVGW`9eUP@lBkG{eYH84SrY7rNn0t zM3}85&|n@Wl!S;odx}m1lKwSBVtb=6Yf;UWC_rf1r^%4&@4tGH2V4%3lGSmOp9`#>|MMCX4d(w}=z1ajhs%SM0H)8hK$@E9=M`udEm>NTKX*0}uQk?$bAoW5h z6j6^@$BW(>aR&m5;Z@>7K{g8wB@aPunD5fQ66|qN^C+9mdqLX$>7!9}NBA!qly0}WRfWO$bunkVuN zZwTJK`85>97WL>y@hW$@H#r8W)ZD#caD~O0V7yCe0{Yk4a=wiza;R`{5*I|W0y;lM zj}+I)g{(vC_4Aq z9O3cT;^*JdO8V#sAJRyhq>LTUObNc2v>U{!nLl1{go9rP4gnNgV*pyxZ}H*>~HYWjoocrd!5l76<8VZ z+N?f$P>eYLl8JZe>DS zRTE#X{B78; z|MnfGrW}2WIBJ7X55UOADA{&&^2WSqes%XI`?NzQ!bI~rFYO)F_V#MG1;B~9jjztl zKZmaneP1_rt35ZwUdbnlMvciP`OV{J+~qw9XFh9E6UL5;Ue{0+^J0WpOm+f)dEin5*_;kt8JLU!eE|pYRf;TQbts=M# z;@1sqnM4(xKEXgusBbd79JjS#rl+U>)Zy!JsWkQ?99{q0@n`xd7;!K1hmu3Hb|?;q z^!DI<4l`C<$u|+#tkiduRCCiCF6D2REJvIgDho~G)X;EdMy+Qn|9Y*w>5Z3RQdb-m z6$2+mDlzfFPd7A&bjMpQ)fhnaZ=j|A^taDx$gMTqw(WGvMS!5 zPb021#*f1qfzQv+@s1b?6r#ybX516%q#RF+Rcp;tzKz`+WB^A7l4XPseIerzeyqfN z{`_JG^_P$7#CZIevI>WBqtCl~ki)g%gtdEy6@m7(d-dw$nfZ`6(I^utF)nJ3E6 zzW;=O_X*UKxl)4{5A(50OD*H&Pc!_i^ zD4(hoy=Qh z7vR3H2u+79voy;sCYp7vhCc^B=bH=k=i;rvRy_>dHQv)Zs=vK?qN%vsJ6rey{zQaL z@Q2ifv}K2sBoW2VOIz8tV={X1-7>cEODs zE|jLq(FzTvQ{M9vrB$wTi_^yAv28knYA{7G>a-}d+I4D;J{EN&rW*-+nMZ{Zh$$UE z1GJ|Chg&+?gIs~@oTQe~)NY8*3s5dypYkacc#zQ{>yAeEjNslioJ(6vOaC~f2 z{LQ6|joHGL|=g?yKJgS#%8bkDK#R%mxT?U^u>*|RIJ2ssv_;>uShve zcLFCG+8d$piFHyOqN4cq$#KUgcxX5%8}&}}SvP3gFGo^E&B#0+(`qJh@=u7P6hHG5V#1m7HkshUd)SMctbfgi8>%U z5el1X7J>~oEZ9aEpW)mxi4+YuRTBjjZQ1E=A7-LD=ioF>FYvEMbzmGx1sa*5p@63W zV@)J;6tqUI9C9mUMafWf8bAH@=!cO_N$L+Hd|!3M`8arD-pxxs{QT5}uK*m%pw))Y z7-k4|#AAvyG9w#-{IZ)kG$k{I8f_OwP4hi(FFdz z{qGG+$KASg%HQyMG0j$q5>aAf-OC?*nk#;9%KIC|J7~v~$@LT*_*^n0Y}&!uz`W2D z6Qb}rpDy#=Q%UJTm&qSWKU`VT>I`|>6!InpLGO?U4oZD#4n`F{rEcZ}U;teEUFHpCD(SZ~|b@u_B`C zUye+DmGSLzMdIUYlxgNWdLD!@Gq~|TRmNYHGVlgvfSE`TRaR!fzH#d8{3pfW_u^va z&@*7$Z-Nk&PmYq_+%TBctA%)6@eq546e)iq(f!5Gi8*zQXphYy=+De(hfc%N$+|y@ zYJMhp1IxI7h^w-D+bv=)EnCVk1K+usY5g?GUW$iU{O!@M;;5XeqT$gzoh!6A>JO;S zBO1`43u%9?m4Z$|x|6g;)tsNhdf_7tV7T->xrf&y_Kz!MzXYjJN}@f#IDb5k9U_Hn zCky*WdC?QQ+}wJy;i+xQLDFf!`9lesZn%pY;JW9~ROPKN+CVW+P10$|+3lfEX{XkA zu$6yLZD2C0@o6L4!6gDEnaZh|YRd-E(HPj;OpSF_QGerg{OJhSH%`*(!LLclPku|W z=)ugC=2Sk_pdNUD9_I>^#P8nYS4`pu=W?yTLr1O?pp&BD>wVrO@R{LA=@XN7QuKl^ z*uC%fwoE3^_?&(mq}~bbjpWI7K)$5A83XOp)N|W14d%@I@;T${FgrJ6eq9;@tE`zI zmGV`be-42hW;7d(7xFK#I)wOuM!xIK?v?yCuO zzEAk&cud@y8vAZM8J6cm2o4fj(&kgW3^UPu-L4hPO0?K_bcFZWC=Fx>=x3dk;|wql^e6XFKI{>QFtgoer<85t2&M@zG^g87lRC-bJ`GcnTD@O0{KDIdzj=p``8 zS6M@o%fdNsZ)MNxH%<*Bl5Kt}%I+H#7Mgh{`B(gCB&Fr6*&6q-T$z4nIgQ$;_Qyd(W*T)4FY)nYao z0fng2oAz!hK{Ax(9}`I?^D0w$-Pxe(x+jNEbib76O~icu5A znwB~$%bN#OJIyFX1}W_65xxYgEW1mAgC13T)T`D!ZX2|SK*5)TfL)|?s=b<&#ocot z+FJ@0k2FfIy$q7y2IGWQ$4mpy0vJ~yI&mI#KHvg1d-%s=f6~&;-wy*J+aI40xV+zV z7%(aSR#3uHCBPk}M~Qg>x&#x;Y2Pfz(p4LrCR;yuYWsrCl#6}QV0yp{F;6{3uRS~q znOb~K^0AaCO#Oas!L#T{Q{9fbeh29*vUPu>>?}%>iHW!vOov#%vO4 zP2lI6R|0ZkMNRY}vumgB+o8>qy2+n~on^Wo1cju2EqED%y9OG?J({3*!Kk+UBq}V+ z+tz3ffhwp!!@XJ-<`)x@`MKtignI&&oYo`q@(^m8CeF2WV77k^=zNj58FY7FAgPYbeKmk;ufOm<%O+M7b7RL< zB1$mCF+6&V8H)1yMWagTm@Q-rLn%$1?j_%?o%aE>=Vt^6DDG}UdD1#T+e#g@D-Ly_?J7@F4ld)zGS+z70%tRS@`MLKfKST(iyQmuAL_xGXtTlv{kR^Vgkv5y{+ zHfRNbH{jR{!6fk;n$(pMIwI5 z7`TfH*4o^yUl>7_4GAliKj6RL>1dm4)mILpSpN~{Rz`zb&TF?}<<>MwSD%nPB5pTqBw z{)k93i&$(w=r#SQ{z_)DKBwmQ?>?qjz?6Dn&p$ow`jQvoSP8C0jPq1A*R)o4P<~F5 zzry|iB~>le&CQ9fZG@4=LpR?ZAEsRIT_?M?kpB(6Lo6}6A4TYIw5YrwK#utNBWyFS zudj)ym+2Ah;(nvm@1*8jO|P>i*%5rRG?S0ao11z%uiq;%Db0*4lTg7m-yih>auxESq+?- z4o_!5V}7=0{XE#&&c=n4{<(L6tG+W0*|FExqhG4&kS~&Lo5xMfj{Qq=!fDNB>S%OJouiN zuMLLF@AyU6zgQ_n*a1h^rwTtH<9gA6)&;qX`{-ux>xK6r|C8Z!4V#n$Q;ut|IZHcIY` z-{tr+xoY8%sVLKdzXiW`K^g=zbX#-h?<<&61Apz`-yTA5dsg?~I}u;;Z-gJ=2e_FZ zS6;t5fCcbhly0h&n2*wk{9VB-)SVNz}Ueg zl^hmhVipFRnvN1#hmXq*?>sE6iDYf3nLk=2fz3&JY{kLc&+sZjhsyDoi(lDf*fEpE zPl2gPEp8U~EX+T8ZLgV`Cs;zoVDjQoie2@LD zcBGACWWH%A7ecF0^kbRnD7C7wsOqql-2a?$Z4Xs?_6VT;9X$b1&JZc_$Off~e@k)N6@Blig(GJANrewV%OXtV!D zfG6utIe7HLMm~LZh!?PR7uv`sn~%*}4QulK%d|*-Mk4JG1qP|UY?p^%Ybh}Yk)e?{ zl?VZxumIg&^NZgtr}10*$gd=X*#7L+g!8^@-RAvxF3I?tV2+1eZ@HB@Er1Id8Ug?= zu}2Y5H!{3$Ilz~@OdF@Co&YA-I&7gxkt7MA^}XGZ(Dw? z{1S+25TM)Ir1%10ZWdfDc-voqS3r0*wttq9z=s=>AaP;RCkSBm%v-CDH!Hs-0~Pu( zF!r{J?>^^2zxss?0vo~pPoA#9l?E=S?b@3Xa}=dqB?_Vy{wP^r%ZLSUa{_yj?f>fB zt8d!|RZIhl1Be0aO}$f0umq$|Ulgv52UKxL(*Su)%NZ33;(;2aedD3+1n5ZK+_h^ zo_`#3HKz^yVj-33KgIw6@$>M)tK+*T$IX3=acu#tz>(+Q_m@G?odrjLC=61?$crRx zksmk?f>z}_(*1WufGIGTZvG8Sq1hDn--U;qEB@DI#he%!%6-NeQ$Qi=)HcybD^O1p z5TFc;3k8FT#pzyUd-w-yLG?pSsaNno#EQD8*Cg`#HUiiOaWez-X@^e{^RXRaf-G=M zj()4p!IyRgJ#B!C`W5y}0oVwS|E_oE7z8pU$lnaR1aU1?_xZQvH`j}~Fft6p|5XWt ze=jH&IF}cLjB7xDLLpTY0@=~o(w)Ih(1cbW>VH?rABx_Ty|j@(oVr&XK8NE10ZAQi zC2d_mtDZ01g}(s-IkYaEH}3@ofmiaBUK*{EK>(AbST3dFv6Jjvpo>vH@Gk(M6t8?P zVx{LqD6#a6@OD?Q0eDn5qjQEzg>>aDy2V5C<;M_nZO&G_4fcD*X(jGJKGPVAcg?09fC@MR4J8IhBE! zk0B4YP6knG@kHd`2R`n}i$KP^6qsVbo)rj{t^by@8}eB@U_b|;#(OS>fvp|c18 z5Kz4PMqHhM(7vrOnPu`|Um2mGo{VR9qtFTt%(ua3UryHZ(>EW74J}1|Jv*7#e;bSv zgd+gVp}wtmTf||XQ_%B^QNrW1QxsH^s(U=&?!XxWn7?U|-zmR-y3Z}&%|%&3Ua`%# z6LocXG7x-y_mx@;4S>CM(tK5RJg##`n&o`ZJ5Ul5K5#XEe^ma28307sk!m~#53l+! zf%8^5;PAfuNu|w#WHH0#V=$AvdO~=W7mogF=QegJ>RK#`>45Q432Z#(MeHBt4fU0M z`D~y|COrl##|D^E7AYwgE|3Qgs8eEI6%(M|B7u+HQVFqvOVm5@oB&Z#k|G#tUVsul ztnN9sMaJ!vX;Ub2`j5#3m>9UCG433rnkR)8LL!OV~ zRW8wGy?kqHJm>owwm{k5-BdbsmjrOX`SX{@#X>DhlIyl_#n%1-1Zh0rzz1hjLF(Ux zW4bBoYR)`QJ96S_@$x($z}UhQ_@rd99N}xY+VZM_tzv*1IPdBL`13gPdUiD zjm>5;(4U-0a{!p#x{$_nK1>M&c5E8>7_RZ0vq9b-r-E6~d?C@k)tIIu?C zw;iFTMwkbJK=%s>1$-)l@?q|rol${mEh+#uBcOeemJy88jJt1#-jHQP;sGRzKRVU! ziaP{X!`w;Z$lEOyf%Fsyp8%ZA3x8T|fL&Ug;C(9?{y@*j_{!2n{hHXapEjNjP^dI7 zNDgX+u`Vvs_JLpBkVDnGC#rYXh~=WZ?QG!UBrt4jwlWn5twme#5G;>!(bk~QiU*jd z2J3xSUHvN{`*D>eqYnE^8I&byL`BOBSA$!yLvXFTLgQj|z&;{Aj@+`&{`ilPe@OMq zd`~yXyDsqM?9b^5BWe zp783Kg;U0T#{e5R83hb0TbHjL#BT*w8sQuPWwS3-caOZ6OSxM+A|Wb=&jA6_3FJjz zbj$4b+yc@vnWFRnz@Fk}iyiHJ5(3jU2x65*Px4E8f;g>&A>$)UFlquQiY)PE_sFgI zy}FH5tNh&(Ye^*%K*XKI%8Pn_4}m4q)y2wzauv}wPPk9Sz7~E{1M?>b@C_=^P_sFP z7t?MNs=zJSAn8jZb|hY4S39b>c<}n}s)pRP2wLBsKN;b1VI;u}nHL(RZ9~o3AULoh zR2l-%z0%OpyLC4>d-cZa>z(-f@s?;?LqNg7SG~9sOog$_#|el@-V*}|;Sdz32g=EB zhbYR|a+&BTt}nLTpbenwmXH(iN-5jnMJSNzSS%C30C!`w$6u#=yL^X#?%9e^(avR4 z1B16iUS?GDF|P)`hq3-K8cwTFg#zX`WJK@XX!#X8{abC%yig>$N{bFC4Ci*JFir9N zQGJ0M>4kr!B*4;LboGwhNLw`*f}A8~l%x;2;Q@iXUWfPR%lcQNxE(sC)mq4bgImYr zzqi{eGlAa0UeP!B5ES5n^0UYN(hjw}*JW%*k)9s$i4`E3XMEdq=5mojh0*HoEz0AE zV=N1eK8tkojo`hl^CO&9 zyfB~sp^4k$ci@;@b{nJ5h0No{l~nB~Lu>WV|6R27h#S!LwyB)e;{;?xWkld2p}+x| zl%&X1qL>tOy?a>l=j19iBxV+&)30Y4Mx3C_*CtN04~FrGjp2GbXb*` z|KhO@e4iF&Vkc0jR4H2Js`zpT>zq@v%=SlQtuO|)WCq4iy1(x0Gk<1=8Iu;pbjJ7h zwV_yndx~WJ{c&E7#zDn@eU*o!qTYY91|5DUqJmy9MNA%Jhm-7tT@wXM`fM z5@XdhlFaM%{@fKW-YGzU9qXYrXDViyvSQn^v*_==3(sqw^#1p>IIFC+Y2Uyc#-_#2 zioRRcf=J93d$Q+Phjgu!1L4D?sG|7STB>;efe(0MRxV% zQ0h@z<3rA#?Ntt}z>E_4fCb|wPBAd2$@0=DLua?H_+JA#r9TTUZ{s+;#35a+^@}c~ zF;DPYE`tL3FfKCvC-xPt*Y0$SF)=>!nLkRrxXQ9wg5#A zcHh%`Xu_oe`lA&;#CXbffSEe`QF`2qh3AclKyQ~)1#k=j&}8yos|4H7 z3n7h$Kelszu4=infD!8G^_zLx2!-#fd-!$aK%P)>@@feuV0+wBpjl3()n9(=cxoqTTvKg%*K)7*VPo`G8CS^&kql6p^5jZoWI1 z)zHu=FK=+$n8x}g5=aX>eaR@nE$yv?yWQa5td1&rP`ZVE!wRG+y{B>Qhc%p0&*%a+ zC@>d(`)Dg*uI00}a-r~$2G%sXEYh4lq*cQHU+wvfX5S`l;!w-=quar`Yg#2lU zlZfBt3YvQWA*VYwa2jjQm$vTyP7>UmBk7-OpjkWmjJ^jddFb&T(HH@^E9Os_jWtSB zL?izyLRo_f9#?!_5H$b_b#d(Y=i z^{G=0nux_?i+8e2^NX#Dps ziU;%vTPsS;B)FNId`fdc-?jI5sUS6gl^Oy?54@;lI5{*rTzV9J5>PWK`)>)-A3|qd zcW*9d5i&cR1yeZCD17X!Xbd`t$jrvTLhdl&g98G?lzjNu!sQ4z0aOVdA8eX6(Zdv) zv;pe$vM~l{kIGy!pv2sfQ7-xv&_4NgpyP9E!|QhDaLQUGPWgkuSyI|3Wo4S^2*bBhijP&%(G;PY)4>`E)}EsVY?(7U;~5Cf-A z0PObEK2OYs4JiP#N=2@-O^KZTmtXGP2UOyT`ci$S_gC?;BY(!WXBoui{WdQ7mboKL zwE2&(UP1&b=W80hxf)x}T)o{-aMcJ2yBefru5e@*@y} zMuyeCSjuVKXXD77NPw|YO28DS!x0bwsRS3Yt=*o{IQRnIpiBuQ-Znt0q$2?^_ioon zpMS04y|)AkaQYM=n%S8+6ixCz1Yl)nm;d1SHOFT+H)0S7;c-RdG-O zKR`(47Xr`Fyvp5V@9jC&8C!lDr5J@%Ic z--_wSVE~CL>5QLy*~3n}oS$8*Y8&DFT6+|4@G)|#WYYoe4sCh9SgOc>KbmI2J1jjk z@4l+rbc^%2>^#Dj3h=dmqG`CGVlbEn>c2hU7yB%%6@h_{acTyUbw*>Fl~LC<=f{$Ko>cS!$yK-wq-?m1rB`X1eAEH@=7L$ zzkwjuyhe73o3f^Y4KycwE1CdxL&eic5z|{RmpcKMt?la_&xnq0Qh`gUxk1rQDJCAc z3xD0t`~qn^E#9|Q9fX34+uw$(0vogpfJ?=;wO7u>X4=64HoFR#g33iv#Ud?u+740h zKB2uCv}r%B13~>O_>)?({z~j$fyBuQOTcETP$yn)w>bjS1+f_0rBnf`*yb+6DrXo3 zgQVuobW(w69h=x)L*}oyMayN1xJB}eoTkS+j0X0*{QE;oSrc=HPNpx8XTPKgP;mhThIH0nNF<1SuAdgfsytmT~{h zg|Tgt3_(CA1Bhl&g1dr4ak>Q1``)fg*6j6PYdk+iHR9JB(xG~?`CxnaszEGf%EpBD#cGI<_X2ZIyuX%)<1Q!foLXH zjU>O^C^$f)s^TW=<1=hm2AQ*80XsJI9nYRG4Li7*LD90ilaJ6NyhIvt1MD`nJefgW zB&%?Mn4Qp7F2Mbs&0hdaQ_0HikzBy@7fD8qm#TcrO)j7cDeMiT--942niYpdUjUsk z&{z3UuJ;1m?>M4Gm%;oW0ACLt0>ME<-@^#juo4~AX3QS=H+3qn-%tH=a zQ6n>N3BGQ~7z1&~!v9P!bGgpp=?79Mms+vwY>R|j>1RdxU#LPx_aK$n1ZTLYWXLRr-Y{?G04M7RpZA>=# zOBmAJ#`EcO0-Hn8zu^82!;FWi*Y93G-nwJz01ols%95SXbarjtS_?==NO&w>Z*}Bb|o=$p`5?v%mq%-zQsNDKCoMDSoeeZwwXra zFq20_2d?XJuGm`!xBJ&T?#)rfxx#VY7hQ3U-YfiHDCeJ<=mIL=C5xw)r(Hl0{@|Q! zvc&exrzN_1L=P9BbcJ6$wfOi>YbpdQsN#5ZG{d+!$_op66+s0^6@z4K&Zl%SVHm{^ zArJpjb{cvXUsT?(76cCHD01rqS3Bx%^%cvpJI$^JowOwDUjn;m}yr^uBvF+*1SC7Dh2sXPYn1bE(!Y&xM zW?V-F+*3L!cAc)5TK;^51eCgH5E%G%=+x@|M|+7$}f;O=;}_5nZ&9Knh=u!<}Md%cMTTAP4TzqfVsfgC4DbP4{ta2LcZC2 z{-@&_IRRdodd$!r$Wa?f|7@L@yv;(Bf}TSy*v(SQq~W33GF3Ko=mZCstChHky2}dM z^Cor`@&>$oebha2ywE&lFf!>diSJt`p4;2|p$Sp{?3X~BF<-BNEH z#oAh1I+mQF>$s*hHYhqo{+L#yB zFEhY+h(b$7GDx%C984kHO#t~)E!F$)ASt+-@ae3uXpu{7rs<+x%}`1?4FEzg5p(Ld-aVvvJ`@mvIdoCyVm;CjkFQT8h!lDPi72oG~s21aB2B9h_L=F6ft z6(yN%zs0q>vf9D^W{7mHBnaF93I9-cS6DFJbm~q!jm`X>2kvP5t4X_GG=xwqg|}cT z5GB7CZqIyu7po?`E19z6+_{S@EVAg=l5b-r4j!=pY$^mZi6O16zc-nti7;t(<0l(6 z^}FdgX^^-1*Py+N(?^qX5sn@4y7Pgq^aGTgy{jwl^50?#?8CEd0nmp|FqyEhdNdnu z28I=Rd+be4A2{ZeqN@rT-^^NnX;z=pMz zxA&#|KAfSXh93$^i%Q>w zHzz}5d`oox)!H#kp)Pm!vBlIlU#nVZU<4vgr>|Gv= z@L+Oi^z3ZK5>kZk68kDvNALc9lC!fq==`$;z-owht^Dw?{F0K1A7$j?=wsvO$Nsxm z8_>f?>~OtDSJgCErwFu<q}hr!Ys7?F7s*I;K)=VQ7KSa~cNNvxiZ9!ck!H*o?;0(#j@e@ zZ2M+vp2@gPoxTS;z{Z7#XzZF$5gGtIdH;W7kn& zv3a9UU1L*ImH>9r+L_fnaRhgA;wVf)jFBgzoR@v~YiRc9$W?j_^DII)O2O@#G&$GQ z2^|n%Cpc264vs{e*we1xi%mH>IbklBIWI%Judfs;DR6yOki|IiIPgPql7Dq=4w7bR zmp>u*^70~k&F4l&LJkrF@Pj^8a30_e!=oNx5cfgLUL`U|A&I^H1Fh?7v!ze za840k3kwS?G{-L@@QXmhY{Hb4l}l9MYS$HT%K4vF<~=O$$$zcs+w5zLYMN$o5sG3X21CgvtEDp^waPA+qe zCIQL+o|b!To$T!FNSc-Q?DTsfTm6)GL+n64L*ll1D{fGQ^lAPl@#N(3@t(_(P&Zd~ zWGpuwBb^2pAs7traxwHM0bq`L?=eW)t!mq;X&L169_|Dv}y#PP^=W> z=e~8P+hiJ;t)a;p8*$HUss3d?UBoPom`(EkUmRsPKN>!az6nTW}>P>J6_r z?++z`w>`94zau}iHO3>^9cLHGRST*e`6NzOqVG65hM=FGRelNR&du-d#t{Bc3kDqJJd+xH>_ zB}q*b6&h5T99A|5GU0ON{ZuM^d^=6+y+^%ac`fY6>l{d^Js7Pbk0gmy%12?hpMP>+ zbd&wZB5arcsPe(je?;8nqnV)}#vSc2_CCc^tH*?4ttc?5MMM6o8x1J3fX}APpxlIa zS?j%F*>AJZcaAjI_!QLbQWlnP?;_zaJV?vj;vf3-JrQzHY-=h17ls-Pik_*PN>=0ha#rJgo5?pZ;0Amr}@g)s9jX2df)jTdAV~9&-{aN~= z0S~77`P=aF?#Z{HmbvZyQ&|CSLY7N=7y|V;lfA|)POaRs?6=dQU(*D&ih+zhi;71|Nmpn zZvWxtlmO7=Ime99JnrjwY5#eG5==?*#8{$PT|u9-@008{x?$S2b~Suz8SPGjKNGYc z2CE{`HBza*^Chz!+|6|Pnt4YNISB^7#1ySLiiEune06UBd-5qY2iwZGp?_m z86bjt!iMb`x~u0_JY|q zR;Z0GXNH*-$qrXR!W0uYHNjwHBhfxVlJ-yhoqJ53p5MY&nPovz`_~SSBJ(wHyJqy9 zm^-+JqLLUe9G|~CiBtO%XU`}8o|un3F{R+gDYNKlX2tr+JMSH7V)(&c0k;Mi_ybms zDR>GNMOvFiK6#Y-L@L!*>h-eeYiqj5A|A@Kb1wjadT~zq* zad{2784+Yb^yYXD0DxO)Ra3N`HTsFPt;ZAa4W-k$10e}%A#rJ8aXvvQ nX+c4upNZW6+YQg$?4H{D{-1A9NV}Z{-T-K->Zw#Hp+f&3A=A%= literal 58664 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 From cc921cd825823f4201ceb8583b32006ec3903543 Mon Sep 17 00:00:00 2001 From: chris-torrence Date: Sun, 4 Sep 2016 12:01:48 -0600 Subject: [PATCH 3/5] Improve caps lock behavior, clean up code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a delay so the initial caps lock state is in sync with the keyboard. Light up LED to show caps lock. Remove unneeded digitalWrite’s for Shift, Ctrl, OApple, CApple, clean up indentation. --- IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino | 166 ++++++++---------- 1 file changed, 76 insertions(+), 90 deletions(-) diff --git a/IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino b/IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino index 1b750b6..26b40ea 100644 --- a/IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino +++ b/IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino @@ -8,14 +8,12 @@ http://www.pjrc.com/teensy/teensyduino.html #include - /* Declares the matrix rows/cols of the Apple IIe keyboard. More information here: http://apple2.info/wiki/index.php?title=Pinouts#Apple_.2F.2Fe_Motherboard_keyboard_connector - */ const byte ROWS = 10; // rows @@ -119,79 +117,88 @@ byte colPins[COLS] = { // X0 - X7 Keypad KPD = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); +// these pins are special in that they are dis/connected to ground, instead of to a row/col const int SHIFTPin = 21; // the pin that the shift key is attached to const int CTRLPin = 5; // the pin that the control key is attached to const int APPLEPin1 = 8; // the pin that the open-apple key is attached to const int APPLEPin2 = 9; // the pin that the closed-apple key is attached to -// these pins are special in that they are dis/connected to ground, instead of to a row/col -const int CAPSPin = 7; - +const int CAPSPin = 7; +#define LED 6 char modifierKeys[4]; +#define KEY_CAPS_UNLOCK 0 - - #define KEY_CAPS_UNLOCK 0 - - boolean resetCapsLock = false; // Allows one caps unlock signal. - unsigned long dTime = 0; - char CAPSState; // Initialize this to a reasonable value. +boolean resetCapsLock = false; // Allows one caps unlock signal. +unsigned long dTime = 0; +boolean CAPSLock = false; // Initialize this to a reasonable value. - boolean FKEYS = false; // used to set numbers to F-Key equivalent. currently tied to caps lock +boolean FKEYS = false; // used to set numbers to F-Key equivalent. currently tied to caps lock -void setup(){ +void setup() +{ + pinMode(SHIFTPin, INPUT_PULLUP); + digitalWrite(SHIFTPin, HIGH); + + pinMode(CTRLPin, INPUT_PULLUP); + digitalWrite(CTRLPin, HIGH); - pinMode(SHIFTPin, INPUT); - pinMode(CTRLPin, INPUT); pinMode(APPLEPin1, INPUT); - pinMode(APPLEPin2, INPUT); - digitalWrite(APPLEPin1, LOW); + + pinMode(APPLEPin2, INPUT); digitalWrite(APPLEPin2, LOW); - digitalWrite(SHIFTPin, HIGH); - digitalWrite(CTRLPin, HIGH); - - pinMode(CAPSPin, INPUT); + pinMode(CAPSPin, INPUT_PULLUP); digitalWrite(CAPSPin, HIGH); - - // DEBUG +// Serial.begin(115200); + pinMode(LED, OUTPUT); - //Serial.begin(115200); - //Serial.println(CAPSState); + // This gives time for the keyboard to hook up to the PC. + // Otherwise the caps lock state may be incorrect. + delay(1000); } + void loop() { //probably should be on an interrupt, to catch high->low transition - // Only do something if the pin is different from previous state. - if ( (CAPSState!=digitalRead(CAPSPin)) && !resetCapsLock) { - CAPSState = digitalRead(CAPSPin); // Remember new CAPSState. - Keyboard.set_key6(KEY_CAPS_LOCK); // Send KEY_CAPS_LOCK. - dTime = millis(); // Reset delay timer. - resetCapsLock = true; - - Serial.print("Caps = "); - Serial.println(CAPSState); - - } - if ( resetCapsLock && (millis()-dTime) > 10) { - Keyboard.set_key6(KEY_CAPS_UNLOCK); - resetCapsLock = false; + // Only do something if the pin is different from previous state. + boolean newCaps = digitalRead(CAPSPin) ? false : true; + + if ( (CAPSLock != newCaps) && !resetCapsLock) + { + CAPSLock = newCaps; // Remember new CAPSLock. + Keyboard.set_key6(KEY_CAPS_LOCK); // Send KEY_CAPS_LOCK. + dTime = millis(); // Reset delay timer. + resetCapsLock = true; + +// Serial.print("Caps = "); +// Serial.println(CAPSLock); + + // Turn on the LED for caps lock. + digitalWrite(LED, CAPSLock ? HIGH : LOW); + } -FKEYS = !CAPSState; + if ( resetCapsLock && (millis()-dTime) > 10) + { + Keyboard.set_key6(KEY_CAPS_UNLOCK); + resetCapsLock = false; + } + // If caps lock is set, then turn number keys into function keys. + FKEYS = CAPSLock; -/*char CAPSState = digitalRead(CAPSPin); - if (CAPSState == LOW) { +/*char CAPSLock = digitalRead(CAPSPin); + if (CAPSLock == LOW) { Keyboard.set_key6(KEY_CAPS_LOCK); } else { Keyboard.set_key6(0);89 @@ -202,9 +209,7 @@ FKEYS = !CAPSState; if (SHIFTState == LOW) { modifierKeys[0] = MODIFIERKEY_SHIFT; - digitalWrite(SHIFTPin, HIGH); } else { - digitalWrite(SHIFTPin, HIGH); modifierKeys[0] = 0; } @@ -212,10 +217,8 @@ FKEYS = !CAPSState; if (CTRLState == LOW) { modifierKeys[1] = MODIFIERKEY_CTRL; - digitalWrite(CTRLPin, HIGH); } else { modifierKeys[1] = 0; - digitalWrite(CTRLPin, HIGH); } char OAPPLEState = digitalRead(APPLEPin1); @@ -233,28 +236,20 @@ FKEYS = !CAPSState; */ - // *** NOW USING CLOSED APPLE AS ALT/OPTION if (OAPPLEState == HIGH) { modifierKeys[2] = MODIFIERKEY_GUI; - digitalWrite(APPLEPin1, LOW); } else { modifierKeys[2] = 0; - digitalWrite(APPLEPin1, LOW); } if (CAPPLEState == HIGH) { modifierKeys[3] = MODIFIERKEY_ALT; - digitalWrite(APPLEPin2, LOW); } else { modifierKeys[3] = 0; - digitalWrite(APPLEPin2, LOW); } - - - // to use the TILDE key as ALT/OPTION /* modifierKeys[3] = 0; if( KPD.isPressed(KEY_TILDE) ) { @@ -264,13 +259,9 @@ FKEYS = !CAPSState; // *** NOW USING CLOSED APPLE AS ALT/OPTION -   Keyboard.set_modifier( modifierKeys[0] | modifierKeys[1] | modifierKeys[2] | modifierKeys[3] ); - - KPD.getKeys(); // Scan for all pressed keys. 6 Max, + 4 modifiers. Should be plenty, but can be extended to 10+ - - - + Keyboard.set_modifier( modifierKeys[0] | modifierKeys[1] | modifierKeys[2] | modifierKeys[3] ); + KPD.getKeys(); // Scan for all pressed keys. 6 Max, + 4 modifiers. Should be plenty, but can be extended to 10+ // Set keyboard keys to default values. Keyboard.set_key1(0); @@ -280,42 +271,37 @@ FKEYS = !CAPSState; Keyboard.set_key5(0); //Keyboard.set_key6(0); - - /* based on suggestion from Craig Brooks - uses CAPS LOCK to turn number keys into F-Key equivalent. - */ - - + /* based on suggestion from Craig Brooks + uses CAPS LOCK to turn number keys into F-Key equivalent. + */ // Update keyboard keys to active values. - if( KPD.key[0].kchar && ( KPD.key[0].kstate==PRESSED || KPD.key[0].kstate==HOLD )) { + if ( KPD.key[0].kchar && ( KPD.key[0].kstate==PRESSED || KPD.key[0].kstate==HOLD )) + { + //Serial.println(FKEYS); + + if (FKEYS) + { + // number keys 1 through 0 for f1 - f10 + if ((KPD.key[0].kchar >= 0x1E) && (KPD.key[0].kchar <= 0x27)) + { + KPD.key[0].kchar += 0x1C; +// Serial.println( KPD.key[0].kchar, HEX ); + } + else if ( KPD.key[0].kchar == 0x2D || KPD.key[0].kchar == 0x2E ) + { +// - and = for f11 and f12 + KPD.key[0].kchar += 0x17; + } + } + + Keyboard.set_key1( KPD.key[0].kchar ); + } - //Serial.println(FKEYS); - - - if (FKEYS) { - // number keys 1 through 0 for f1 - f10 - if((KPD.key[0].kchar >= 0x1E) && (KPD.key[0].kchar <= 0x27)){ - KPD.key[0].kchar += 0x1C; - // Serial.println( KPD.key[0].kchar, HEX ); - - // - and = for f11 and f12 - } else if( KPD.key[0].kchar == 0x2D || KPD.key[0].kchar == 0x2E ) { - KPD.key[0].kchar += 0x17; - } - - - } - - Keyboard.set_key1( KPD.key[0].kchar ); - - - } - - if( KPD.key[1].kchar && ( KPD.key[1].kstate==PRESSED || KPD.key[1].kstate==HOLD )) + if ( KPD.key[1].kchar && ( KPD.key[1].kstate==PRESSED || KPD.key[1].kstate==HOLD )) Keyboard.set_key2( KPD.key[1].kchar ); if( KPD.key[2].kchar && ( KPD.key[2].kstate==PRESSED || KPD.key[2].kstate==HOLD )) From 0961b9714af7c7bd76e31e0eb384189c88c3c4e3 Mon Sep 17 00:00:00 2001 From: chris-torrence Date: Sun, 4 Sep 2016 16:08:29 -0600 Subject: [PATCH 4/5] Remove unsigned int warnings Use casts to remove all unsigned int to char warnings --- IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino b/IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino index 26b40ea..8ab3fca 100644 --- a/IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino +++ b/IIe-USB/arduino/IIe_keyboard/IIe_keyboard.ino @@ -16,37 +16,40 @@ http://apple2.info/wiki/index.php?title=Pinouts#Apple_.2F.2Fe_Motherboard_keyboa */ +// Prevent compiler warning about casts from unsigned ints to chars +#define C(x) ((char) (x)) + const byte ROWS = 10; // rows const byte COLS = 8; // columns char keys[ROWS][COLS] = { - { KEY_ESC, KEY_TAB, KEY_A, KEY_Z, KEYPAD_SLASH , 0 , KEYPAD_ASTERIX, KEY_ESC}, + { C(KEY_ESC), C(KEY_TAB), C(KEY_A), C(KEY_Z), C(KEYPAD_SLASH), 0, C(KEYPAD_ASTERIX), C(KEY_ESC)}, - { KEY_1, KEY_Q, KEY_D, KEY_X, 0, 0, 0, 0}, + { C(KEY_1), C(KEY_Q), C(KEY_D), C(KEY_X), 0, 0, 0, 0}, - { KEY_2, KEY_W, KEY_S, KEY_C, KEYPAD_0, KEYPAD_4, KEYPAD_8, 0}, + { C(KEY_2), C(KEY_W), C(KEY_S), C(KEY_C), C(KEYPAD_0), C(KEYPAD_4), C(KEYPAD_8), 0}, - { KEY_3, KEY_E, KEY_H, KEY_V, KEYPAD_1, KEYPAD_5, KEYPAD_9, KEYPAD_MINUS}, + { C(KEY_3), C(KEY_E), C(KEY_H), C(KEY_V), C(KEYPAD_1), C(KEYPAD_5), C(KEYPAD_9), C(KEYPAD_MINUS)}, - { KEY_4, KEY_R, KEY_F, KEY_B, KEYPAD_2, KEYPAD_6, KEYPAD_PERIOD, KEYPAD_ENTER}, + { C(KEY_4), C(KEY_R), C(KEY_F), C(KEY_B), C(KEYPAD_2), C(KEYPAD_6), C(KEYPAD_PERIOD), C(KEYPAD_ENTER)}, - { KEY_6, KEY_Y, KEY_G, KEY_N, KEYPAD_3, KEYPAD_7, KEYPAD_PLUS, 0}, + { C(KEY_6), C(KEY_Y), C(KEY_G), C(KEY_N), C(KEYPAD_3), C(KEYPAD_7), C(KEYPAD_PLUS), 0}, - { KEY_5, KEY_T, KEY_J, KEY_M, KEY_BACKSLASH, KEY_TILDE, KEY_ENTER, KEY_BACKSPACE}, + { C(KEY_5), C(KEY_T), C(KEY_J), C(KEY_M), C(KEY_BACKSLASH), C(KEY_TILDE), C(KEY_ENTER), C(KEY_BACKSPACE)}, - { KEY_7, KEY_U, KEY_K, KEY_COMMA, KEY_EQUAL, KEY_P, KEY_UP, KEY_DOWN }, + { C(KEY_7), C(KEY_U), C(KEY_K), C(KEY_COMMA), C(KEY_EQUAL), C(KEY_P), C(KEY_UP), C(KEY_DOWN) }, - { KEY_8, KEY_I, KEY_SEMICOLON, KEY_PERIOD, KEY_0, KEY_LEFT_BRACE, KEY_SPACE, KEY_LEFT }, + { C(KEY_8), C(KEY_I), C(KEY_SEMICOLON), C(KEY_PERIOD), C(KEY_0), C(KEY_LEFT_BRACE), C(KEY_SPACE), C(KEY_LEFT) }, - { KEY_9, KEY_O, KEY_L, KEY_SLASH, KEY_MINUS, KEY_RIGHT_BRACE, KEY_QUOTE, KEY_RIGHT }, + { C(KEY_9), C(KEY_O), C(KEY_L), C(KEY_SLASH), C(KEY_MINUS), C(KEY_RIGHT_BRACE), C(KEY_QUOTE), C(KEY_RIGHT) }, }; char Fkeys[2][10] = { - {KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0 }, - {KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10 } + {C(KEY_1), C(KEY_2), C(KEY_3), C(KEY_4), C(KEY_5), C(KEY_6), C(KEY_7), C(KEY_8), C(KEY_9), C(KEY_0)}, + {C(KEY_F1), C(KEY_F2), C(KEY_F3), C(KEY_F4), C(KEY_F5), C(KEY_F6), C(KEY_F7), C(KEY_F8), C(KEY_F9), C(KEY_F10)} }; @@ -126,7 +129,7 @@ const int CAPSPin = 7; #define LED 6 -char modifierKeys[4]; +uint16_t modifierKeys[4]; #define KEY_CAPS_UNLOCK 0 @@ -176,7 +179,7 @@ void loop() if ( (CAPSLock != newCaps) && !resetCapsLock) { CAPSLock = newCaps; // Remember new CAPSLock. - Keyboard.set_key6(KEY_CAPS_LOCK); // Send KEY_CAPS_LOCK. + Keyboard.set_key6((uint8_t) KEY_CAPS_LOCK); // Send KEY_CAPS_LOCK. dTime = millis(); // Reset delay timer. resetCapsLock = true; From 64ec4f2f21e676266255788294b0a95c9d4b1e5c Mon Sep 17 00:00:00 2001 From: Charles Mangin Date: Tue, 4 Oct 2016 15:19:01 -0400 Subject: [PATCH 5/5] Another big post-KFest update some cleanup, some new versions --- .gitignore | 4 + .../M0100_USB_Trinket/M0100_USB_Trinket.ino | 191 ++++++++++++++++++ M0110 to USB/M0110 adapter.fzz | Bin 0 -> 1383 bytes 3 files changed, 195 insertions(+) create mode 100644 M0100 USB/M0100_USB_Trinket/M0100_USB_Trinket.ino create mode 100644 M0110 to USB/M0110 adapter.fzz diff --git a/.gitignore b/.gitignore index 3ab7c79..4c2c9be 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,7 @@ */.DS_Store .DS_Store + +.DS_Store + +IIe-USB/arduino/.DS_Store diff --git a/M0100 USB/M0100_USB_Trinket/M0100_USB_Trinket.ino b/M0100 USB/M0100_USB_Trinket/M0100_USB_Trinket.ino new file mode 100644 index 0000000..d377ea5 --- /dev/null +++ b/M0100 USB/M0100_USB_Trinket/M0100_USB_Trinket.ino @@ -0,0 +1,191 @@ +/* + + + +CANT HAVE ANYTHING HOOKED UP TO PINS 3 OR 4 AND DO USB. FFFFUUUUUU + + +M0100 pins: + + +if LPIN & RPIN are HIGH or LPIN & RPIN are LOW + + if LPIN goes HIGH to LOW or LPIN goes LOW to HIGH + + moving right, X++ + + if RPIN goes HIGH to LOW or RPIN goes LOW to HIGH + + moving left, X-- + + / +/ + +Mouse.move(X, Y), where X and Y range from -127 to +127. Positive X moves to the right. Positive Y moves downwards. + +*/ + + +// mouse is essentially two rotary encoders. one for L/R one for U/D + +int LPIN = 0; +int RPIN = 4; +int led = 1; // blink 'digital' pin 1 - AKA the built in red LED + +static uint8_t X_prev_pos = 0; +static uint8_t X_flags = 0; + + +int DPIN = 2; +int UPIN = 3; + +static uint8_t Y_prev_pos = 0; +static uint8_t Y_flags = 0; + +// using comparison to previous read to check direction instead of interrupts. + +volatile int DeltaX = 0; +volatile int DeltaY = 0; + +int MouseButtonPin = 1; + +boolean MouseButton = 0; + +int MouseCalibration = 4; // how fast does the movement translate (3 - 6 seems okay, 10 is too fast) + +#include +//#include + +//Bounce button4 = Bounce(4, 10); + + + +void setup() { + pinMode(MouseButtonPin, INPUT_PULLUP); + pinMode(led, OUTPUT); + + pinMode(LPIN, INPUT); +// pinMode(RPIN, INPUT); +// pinMode(UPIN, INPUT); +// pinMode(DPIN, INPUT); + + digitalWrite(LPIN, HIGH); +// digitalWrite(RPIN, HIGH); +// digitalWrite(UPIN, HIGH); +// digitalWrite(DPIN, HIGH); + + + TrinketMouse.begin(); + + // get an initial reading on the encoder pins +/* if (digitalRead(LPIN) == LOW) { + X_prev_pos |= (1 << 0); + + } + if (digitalRead(RPIN) == LOW) { + X_prev_pos |= (1 << 1); + } + + if (digitalRead(UPIN) == LOW) { + Y_prev_pos |= (1 << 0); + } + if (digitalRead(DPIN) == LOW) { + Y_prev_pos |= (1 << 1); + } +*/ + +} + + + +void loop() +{ + +/* + + int8_t X_action = 0; // 1 or -1 if moved, sign is direction + + uint8_t X_cur_pos = 0; + // read in the encoder state first + + + if ( digitalRead(LPIN) ) { + X_cur_pos |= (1 << 0); + } + if ( digitalRead(RPIN) ) { + X_cur_pos |= (1 << 1); + } + + // if any rotation at all + if (X_cur_pos != X_prev_pos) + { + if (X_prev_pos == 0x00) + { + // this is the first edge + if (X_cur_pos == 0x01) { + X_flags |= (1 << 0); + } + else if (X_cur_pos == 0x02) { + X_flags |= (1 << 1); + } + } + + if (X_cur_pos == 0x03) + { + // this is when the Xoder is in the middle of a "step" + X_flags |= (1 << 4); + } + else if (X_cur_pos == 0x00) + { + // this is the final edge + if (X_prev_pos == 0x02) { + X_flags |= (1 << 2); + } + else if (X_prev_pos == 0x01) { + X_flags |= (1 << 3); + } + + // check the first and last edge + // or maybe one edge is missing, if missing then require the middle state + // this will reject bounces and false movements + if (bit_is_set(X_flags, 0) && (bit_is_set(X_flags, 2) || bit_is_set(X_flags, 4))) { + X_action = 1; + } + else if (bit_is_set(X_flags, 2) && (bit_is_set(X_flags, 0) || bit_is_set(X_flags, 4))) { + X_action = 1; + } + else if (bit_is_set(X_flags, 1) && (bit_is_set(X_flags, 3) || bit_is_set(X_flags, 4))) { + X_action = -1; + } + else if (bit_is_set(X_flags, 3) && (bit_is_set(X_flags, 1) || bit_is_set(X_flags, 4))) { + X_action = -1; + } + + X_flags = 0; // reset for next time + } + } + + X_prev_pos = X_cur_pos; + + + DeltaX = X_action; + + +// now do Y... + + + if( (DeltaX != 0) || (DeltaY != 0) ) { + TrinketMouse.move(DeltaX * MouseCalibration, DeltaY * MouseCalibration, 0, MouseButton); + DeltaX = 0; + DeltaY = 0; + } +*/ + + digitalWrite(led, digitalRead(LPIN)); + TrinketMouse.move(1,0,0,0); + + +} + + + diff --git a/M0110 to USB/M0110 adapter.fzz b/M0110 to USB/M0110 adapter.fzz new file mode 100644 index 0000000000000000000000000000000000000000..f451a666c82a68ca5543b3deb7b6911205d69e6c GIT binary patch literal 1383 zcmV-t1(^C!O9KQH0000804{S;M#AaVTIB=)0H7BD01yBG08KD4F)$!uWMOc0WpXZN zdhJ-ra^p4-z56Rr%$Xn-t|`e=V<(>RBrZ=$8edghAc--zA}P!A*QWuJT5PFoSsEXb zVetSo8r==x^~2Kp^q3~-L6lXTXMK%gq9Kumc@$^UzV>5urMudv^Rr%>NApCWNg3Bq z&~(>zAlSnsz{JLs;>b6Jc7BH7>jk-AMpaW;3s7U{I_hhqMgF(H6y-pKwVzEB@%{4R zrfK~{Lv>syqOY}$^TaO^v?Co2L=`{zK_WC1XB9MtpaxA;LyI`7XMK%f+qP(!YG@|n z>8$Q+7UqWqt~lgHrgBQoaMBh5|plpO*PNi!SpdFZf82Ctap3v85>K{>(+O3X*$^oNCPo>4NIUZlItuIj{pwB znT85q0_At36jeSi!GlrwWnCFzUJ4MlM#eDkalOdLiL_ne$y1@NLs8)rWnPG~UbZvU zD8l&sWDZrfIitJu6=K)wHU{9n)~5mWs*}aB#5Qplvpp!i=&my9TxLkmXv*8|&%nQS z+pIcLV}eAGIiS7NQ@T@;r=l*G=t)wDr6D=f+{WAkY%KelgDIy_Hg@9JrQV61Z`ppfAjWe#GCI(|ngRx_vSdAdY*%75NL$BqAozB#{93v$ z9Rf++gajkDsa8g3*fkk-gig&hvhsD23-a`x8UinYG7YcL)@Ge>Kl^KwJhC zoR^h8_~z-~M_;#rOD*P6>j>yp($fSyg=g%7oJzbsAI5f_($nS*8b5zHTRz zO4RcFWKn8MkDWyKK;+0duf=2C?fpc38k)c~H+#ReXJ9J2D6R^ahQGuT-3y3d?=Xz5 zahzhuI1K%)V+%?-b{K8gf^q`#6Y|7LcvwtuxHK)+#-u9l`vKu#Lb=@_-JRUn4Ihg}DX>R+_}q6_u&`^~9GnwKQDIGnp5b_0RjL36aWAK2mmf~QAWb))>`ER005vD000mG00000000310000000000 pO)xPrFd$)MVQ_S1axP|iP)h{{000000RRC2J^%m!69oVO002+{dk_Es literal 0 HcmV?d00001