From 9ae8b458cff62ae193a3feb91ff27c56da5551bc Mon Sep 17 00:00:00 2001 From: Rene Richarz Date: Mon, 4 Mar 2024 09:19:17 +0100 Subject: [PATCH] Version 1.8 with improved handling of bright drawing spot and fading released for all systems --- Manual.odt | Bin 1730918 -> 1729855 bytes Manual.pdf | Bin 1042668 -> 1041024 bytes README.md | 20 +- RPi5/ards.c | 240 ------------- RPi5/install | 11 - RPi5/main.c | 332 ------------------ RPi5/main.h | 20 -- RPi5/makefile | 14 - RPi5/tek4010.c | 710 ------------------------------------- RPi5/tube.c | 922 ------------------------------------------------- RPi5/tube.h | 62 ---- install | 2 +- src/ards.c | 2 +- src/main.c | 4 +- src/tek4010.c | 4 +- src/tube.c | 24 +- versions.txt | 4 + 17 files changed, 40 insertions(+), 2331 deletions(-) delete mode 100755 RPi5/ards.c delete mode 100755 RPi5/install delete mode 100644 RPi5/main.c delete mode 100644 RPi5/main.h delete mode 100644 RPi5/makefile delete mode 100755 RPi5/tek4010.c delete mode 100755 RPi5/tube.c delete mode 100755 RPi5/tube.h diff --git a/Manual.odt b/Manual.odt index 5f0f09fbe516a7a49510b696a3ee430269722778..4121a3db065f70386254df686d2f32bb9cff0774 100644 GIT binary patch delta 47594 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

w<5M;7sV{ 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 UGr)a)5T7+Z4a|b!zX$670h||dP5=M^ delta 48687 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 z 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 OtrMCPCzQ2SX#O8_)|hJm delta 17171 zcmcJ#cRZHw`#+A5kjvh26B!w|d*9hvA$um2Rc7`|y2&h&eVJKhM9GTC-U$iG%*aZK zN=C--qSyQVF1_EM?_WQU$N9L=>o}jsIFI8vkMp>$hk#buPkpk{=Lya;7}~mdqXp9j zlRAE4WgdiFS+n^AuL~WYE8HWkh{1Lfs zS=k$Y?l-D7qfW4iUf1JD&T&p04&6FCn%_oz)3Scnr*J+e^tfRwAtcRSgVh=vUcha2 zL|?$bk%-Z)CT0{RseQXejgLC~VZrc5{m+Y)Ox`|w0YW=%Ke!^mWu8m33I5lW?x0-h zAGOk7p5rSQOn^0KswYXYaHM90a2T@Ni=YE3%Uq6>sR?KZk~!Q zuE)wPG{VlPDmoAA5XdK`wmWN)Bj%ph+-i-d*&CS`a{{C}T0(;1fk0A?$9!ZSCNNVe-DWJW)UCN_8!UWr z>8qR%c*eVvGJ-QCjpnF=!PSnW67Phmo44g|NC_s3IS;-geaOz*{I>qv^US+tsHv|X z2gIsEXf{7nD}uG!u1x1~=UZufcUoUk#FLSO4f;fdktWkGXIlqCE4VqRoyG;uXG_yx zc$(Rs=5-sTS5QRQ1kK)jzVU?J@@PMh@Z85-TlE{BFk)+6?M@S^i+r10othJ4Z6hJR zY;E$!(%qi>%@@+X=EsrIr{`i}-XhFzsz@Wr5-IQHbhpwfdm5B^RgZLG#hl)|jpWh= zF=r|UDSM@`_G_HT2vc@-l^%?3wsa`lv3Gl3G{Ii(VS0X$;IE%hSeVOhQ&HCYGB+W3 zNSU67bpG6Q|HJN_R%8sHFqzXs|17lc8^fLC>X8Vh*A82PBk%>hN~*luXcyZTedHU3 zE16T&PHFE8IwMvh{LrnEioP?9^Wz-BZj>09mdcLGEOtE8bmh z|CozPspjX1C%Bca464jq=wDCaczr_&Bp*rO8ww~w`%^cwGG`cX%WVxph3>!k zh|5c0H2-$zrk_EzCDuZ+J0=II6Gnnh+F44uo2tA(KAKBVFPr;0gd@#&PbHW<9hq%!2#<1Y5%uI_(yr)g75*^Vb~gtMsXFkm-HFR^+Zm5{;p(5dFgKYqnlUAKEh<9S=zf>-w?!^d=-eCGrw~-q!(?G4cxwz z`Ho{2^X=RHJ!)Mqi+JlataTr$JXZmuXh1Y>)0AaSmFwPkTb@ z-z6vhimaqw@baC>=9X8qgQ+qto||3K4c(FHe$@A?iyx6i(T;W}#EJ7c<HNZQa>@lzI)W)XDy-Ep5*_JCZ)tTRs2g;Wa6^YG!6oH5BuVt*K{c zhLzWJr|f%NK9Tg5Q0n0aQHE7Ci7wYCc_#{=bp+g$s3RO3nk+N%{c6~cd2iezbI19* zZrW7sOcUA4)BCgDI`V0JN6Syk5;We=XY0r6`Fd%U8{Xo4^pauNb^-m=_Tf^*xm3pK zDbJ|0KJcVxZeH+rs<4aOZ`|%l-AZOueg}IV4Qt_%q9XH@`c~(=CI;SryrNBUATdFD8eH0@`Wo4Fj?5Ng^kmZ^5 zxoN^9e`A3p&ab#GiOE2s>xOMI9w*nrKSuH}3fG@iD-6~6l-*13Ct7nsfZ$6wqSnwp z8-8PNEph?V6g2BEkiNukwmrDh;7?=BQDL?r?An0VCp1^tZQLcyG=(b})zGL6e9lgY z81{hMiN3meMm!)sRhzYTsu3mfMR$&o!0mkc3^lNXi*|jyC@4AhwxLa)=les9;yu0q zbbH35u%27*l0cQm)ZFofE2R&VHH__LK3|q03X6U9-t#7J#i!3GPy4g?LcFrQ)7j%Q z-rgAC89Tx55;fVWC_cOqmGQ&-{R`~)R0hql}ph*#EXgGl9^LUqPu zbrErMMe>X3Ym4)hd-n%a(-SUeeZyo3)TX^vO^@7L&#SNBS;Xe;J&@ea$k^TV+WCR0 z`F7pJ(EWbi=J(IedGBRjsTTHE61F!93dNxJw=8FHR>42?Ql#$k*K4xn&#T<*>XQIZ zz-W;EiRP63me}6%!j(N!pX)~3H>%qgTzGD#ijBI2sm4if_!7#xj>t@RuRc4i#b&hd zRna#zq#d(uO$f2CZ4r2b$b0&&3M>6{X}8^vv9+lySEsAAxqIko@P^`zcMmcW3G1#i zb~C1SxZ3Ck71Lce$#&~D&t_Oep7~-UWYsnrJC+-9g6hIzxkurX)oIb)vF3*yV@$K$ z^JzI7&B*H~`$9OHiL4{CfACY-_V=2JfkA@FV0M~Y+)WEPr1!Q}ir8|H z)Gfx6t7VssZa)j~GBRzT&@+9PDg5|MdE;07^ZRge#8bRK(<{#c0bc))(ggzJ>38)5 z@4f3S8Htx1HF;?+UDjuEVVlN_W?eIpd@BWWt(d z`ov`aTt)e#)K!!IRP@{2r3v^c*@-J@Ti?&rruJrPmHGNlRlvXgpWSqsu3UtY#02-OM)WQeI8_Dx|7-jVbXN$ z$NPF(0{f~e%M&CY^E=z9E3nt~^bn$7M@<$N$y2yk-|Z5>R z`1S8ojeb5PbQ5jN7H?U1`-wJ>1oxc~YD8N-q;mi4dm>S;jQP?tm%9_b%~8_?j0iIs z(NcKk0yb7`Sn=dbm3Hgg=IgQjN)p56XSioYoJbP1J#gh0b9ydXskL_IXeMb!lWbMF z9p!!z`;v$9eCF*Z;g>2N@RB_3ZZUQo@STo4eZdIj^z5V0Pfc6ZOoT)hX*IcAK~UnF zfN{eK=}^*=b~J(f;e_xdJGM*hFal>WIs9H_dgPD2Q|27`u%9v4qOtwAm~BFHa}&S4 zNlF>_WgC7y!Sdr+?WiQxmx_+TXy(_F=lXiLmt!f3tuLQpbhnhcSAOeg_t6zz4StP8 zE7J!}6xOsh{ld z2C5`n!KRuuYyxylnS6imZQ|vwB+@6DxfGSXU!6O%&0p5z!}*MmBaEep$a6(gz?+EeWv==&A zt4Od)gl>|S_QjW1Vx9dEp1(`OTfKq*&xxls{HT0ar5 zzM;I;&EfQ^)MU+Ew~ane_=mm{(*xepY59}a!b?Tid7cR-T%7BVbfQ`cE={EXBb(zw zPg&AGj}2|C>3vUk{r<|jLiPpg{J{KD{mD73wvm@9}2 z_)gM45iQvv6gFFUa`(->?#F?KC4?GvKl(Amu5~JF*1~dLxD}hR7v;EqlRJr0)-yep zX+A6N`1sqDb;i2P+i9nmx3|arzng}2+%V%0`&i^>n3n$e)rBKWh90}ff-v*JTm#|3 zw(BS2P0#vknhiSXpHJ={FeG%5wz1W}GEMf)uUU=S+0oNjYV)-4e{+g|RECJ)P@I}} zu}A*gDP9NV6aKx12}QV$VnH;S0LZnv-gjbZZnBW}jOWwN%R>sjS`l+-F78(Ax1oz+ z?WuPbu{z?LR2xqovI@IBj*YR1)|@h;r8P1*!fN|o$xg7js^EnxGk=!M!%dQ_VXQ)! zn01@_fKTZ0;8z#^8`KPSXn?}aApSav!ifr;CL83s`qkJ zFNbVKV(ccl6T^?AA(v!AVkmv-DRO-m2bv-nODM~%EOPPbL1Q1}>e*gdtetNwRm3Yj zY&hzYZ0Bx#XUE#F^vo`e<-99@Z<75t{ve(J4N16S0lnxr!s_ng8~uXZTki<7gWrlf zpNO`w%O<2qH`)8IuY9C?-CN}=_5JcZVLdA8iJ!=ue#U4-_6PR+I^MNg^G(FyoP0TfZ{W|w8aU*Aq zkII@=%<5F2!+Q#;!VRvbF)>r;WZGnY9MXD5f8K7LQfMoIj>kyY#K- z``ox^x+8Od_s25HXt@!pyf!B~->p|R%e3%Qp1v8eh%K+US4f5%1gavg`@L@b061rNu?T#d9ZFjHRAvLHVz*5&@SGZN;D`c1F6o;2}X z599UVVQ3=HMi~Q1deaUVw4KvQoU>XdYh#$bY&KbqB8_lD_uWA2e9lF!3wLEs`YR2LBijF?4Nq&?}ChR?qn(wspBA$iEhkf~i+w6PrLDev@l)Giesh1)=MY5ep zp{zijcS=;GQ(DUx0E*&l*{D?PBH)6UONe&N~ciYZT$K#%V;&^>zkG_Mhj!Bznmuy8$lAYAv zEwt;$T{vFNv(9(`tB#GEEIq!eq1*VDOS8W2VYN6%kYK}issxul6T`bC9lZ=qBGuR} zA7qh$SC9P<1-^y}ei4GB&P*DNzQp+nNt0#7PP~GT@d+DAV;UV5OW&{w*2Ryel&5V* zvwWXlE48R8nVMXAxNL=K5}8yLyueZ*83Si5LHSC#BXNL;a^5pdLiYI{=ANs$j#+)pI_y`n z*Q%6O#Uuc$XM?^t1rHm@{!1Q zFXtgqZDeR$dG$5Oc~s>z0~Z@jTYk-+Z@Xm_o5qCCQi^!m`t4_7SvL|Zni|DbI+$ImOJ1i62|e;dA_-(Zd$?|*Ki*0XAKP$Q~7*9HD(u%-kMn= z$x~2YVhKHom^p)E1FqA+l34gOX4+Ga)LkCvpy5(x8=kPy|cJl)Tx^rUz83&*hQ}WZU{YlO*V( zR&_$Sm|XxGRpBSg!B^)UGkRQvmTekMs4L#N1@uil)ZCTf$qyWGEzsV&mGMC4E?u{Y zvZIODFse>uwW+}tzg}K}dwRM=$g}Zh=P56w-0Dau6<0RF4y*k^NIIIqCOg;5k7naa zr_3q8F=Cq8rLyN;Gf6Qt#~)vO-K`r!^X=x39o}{IMZu)hD`&!L=-0f?@h`1sq@;ZP zCL_GU+@++uP+fG|H&#in?O35b&5=qe@&wBj9NOC#i~kYl9{2@*;m){(y4rNZv_*ar zw)o`dg|Fv!6bZ$}3NXPT2N>+=J70TuKh3@x^!u4>QX;p@lP{6o+@byo8rG>+#VE)x=(1{*_j}R43s}ATU~_h8C8PF?v*ey^ z;}pRsQ}*#H!X&hqZ>eXgH_qg2zoR3K`|kTzm3$q6C-(1I=Ebe<-Y<(jQsLgU=M>ns zIrUxECF(`g!3!ricKP_RBWN4~T)2E(p77YDD@p`SJ-%)$btTJO?;I94NJ+#r=)Ml>`3R!YrGU`e$f-xZ(*F4 za(;Vn5$s>TL`|5!yRp7l*+2Uk_0x{6$uf7iyLq&?IV_B=oPFZv&Xkf}PVcT#@;8F* zrGX`1l=yX-R2EOIBU`y+_z$ZFzN{WsuQ#d+H!PjJ9e8^#kyPX=Et;I3;!+mQm|D5j zNIAwwkF<4okxH8uyhWU{rwwekXZOP+de6FOQ{jbvtOe-vI z=I^q)WIu!3FBo*th?iT+@#Md&9Zs?%i0Dzz^$T9SL1q@bVsF7}>>UCMg_b%e8Kb&z@wCspKhL}j-1a1+WODxj4xE1OUD5B^zRNreHO?^|ron$#-F<9|7Gl3X; z@+uupzBfU}CE$ZJvy=|0K6`T6d^AxFg#_y@^YeMI`mzGWq&~lQcMMpP+%>qb%{tvJ zR!Fjy-HgmgKb<&qF-ct(zTBt3GMqoH=*4sVT@#B=+W0Vl4oZ^w^4^*!!$n z;psa?DNG{MP1{FpspxAkJ>rH{P0@tjh}X(Vz2Cd*xT-sg1AD_byW5tO?0!BqAHN^z zP`{z-Y};6n$)yvFG2h&fRTMdK>{wK17L(h?WibBbM|%U7oRg{{`6055)`_Y%^4DLJ zFAA~isg&_asxKa7B}q9?p(KB#9LZ9B$-nVa0a(%ub=%)>y@l6_~T5u?!qOP z>sQDwrOBI$hhK{mu}GYG>1cg4hK?{sDZoh2;>)NzcjR6~h&$q4^sLQnUsKmWUdFrO zpFZVhh;yCSuSS~YKhEF0%shX#vmX&6>FRX9ot=(rutyGQ&Lmrkwu7<7YA^t4NW}h4ikdA(YHcKT~ z1I?)+Fjh%rG3*XU>s3{C@q3}>B%_SJV@egrZIj!J;bO)|-58{Z%q4o&r|IQe^ENLx zR4O@oF+I3S&OI3TVVYe`Q(3mxS3aWr_!xL&!A12diVQAf!Pv5N_Chl!z!*DoXP7vh z1bs^#_*`(Fg@S{WHF8q%$NMm((~r9Xn8&i$-UpLu=jX#}dIL z(aJSuVn!>fK|0S89h}g7+pR1oCLK{*)#ecHCy(I$f_+J(HQt?2}!#)spH zF8r5Q<@4U(;TFH;d|L31u5--1baXKpD@S9S8Px|$5pFB&R#c%zM`u|Iqd@f&0a{a? zzE@GpZEHzaC!JWiNVw~|Qklb^*Uab{>rtG3caig%h_Z(og&(jS9o|RDR43+Ez#Ll; zTgZ0#v?8nAKt|>_gUikd+GTg83GHa_Ja4`78%M7-db3|Shq`4Dz`>{gmO7EpNTc#> z$;RC3lwPU`nRvXNSY}khytA!|H;ax3Rw%c&xvgQ1b$gNTJ<&vP*<;t{t6tXx!u{v- z-*|e^K4ir6EJlvZGagO#vLsKZX37A~>U5WRc;|K)nfy<ja(q>X{m^N@)@}d#V02}rJhc_))Hgx<%=j|X%KApAP^fS2+Ob! zT+#mV^QF~A$B6G#7OfO5TZvs!E5Rv5`*^eC}vP$3YhFB%U80UPXNGjFZ?2 zMd`1Kxnd6Y3boHN$|$qfrA3k?+S2)&&Eb6ML;6mu_as+!(1rVB&qRfO`ZTi@Wbx=;vIwh;~_^z9}Vyun*e&AW2*MV53cmkbu*|e zib!^S?9hBMf4cE0OieBtU%bO(kF~Ln9BDqH8cjDRBv5B$7{=s#}>;viG!@d-U;@cF7r; zsnIVuafUFNM2&1U*{aUZKk5iAW?97r5xAYdZx%mA2 zbanAmZ0;SgaJo#9xtG%6q3>G8nLb3R88)yo;8voYaGG>V?@RPNz0>r^GZUmv!Ba?% znBO-qlE#|pds=8SiA%406yFt9nM|NNc~gtl>5hkBLnU`n({~jLWZ{>1!pq)Z&o-X| zT5_VZHE+!WGvt|MdHJ9Sc4m>@JsnN8xp zV%z1vyJ0Qf9O^ryFj|{pBtqGuq{ms>eN!>#q4%KS;|Og^>(!{QP^`(j3(KR!|=g(u2T|OsX4Rk9IDt_(} zcH2iU?Y-U!d;f0l=jJ8nd%cx?m*%gf{9Hoa9iM++BYQ0u`RwQRJn)4u=UbDszB@Db zzI(@u?fuW6-E}p-d+;A#t6z4i_6C5ruepCHYl$VkAKjyQ%(7+LoX2)n%fV;(?&9&X zV6U-yz)Wi(O$9zCMLn!FB?Kt#0Ek;upScl(D{Of?GxHe}Z+k1h%-kuqa%O(7^=-1W z)vqw3GJVl*^;*?)covmEVGF*!n=mikb$+boVeic0fSFK{{Yu3>#o>RlcBWdOz zb_??Ojk~|Wf6iwu#p>&NSFeiO}s4B^Y($5d9r0X&S0mCvOdWQ$Li{4sNNsy*V>3Dd=%U6o!Msbo6! zOJUX~++*?+no&zu%`t>Zcx2`^t~tcYSI(WZni6MU*JtKPjEjI@>v*Wxi8y0e=*Ak2 zWci!>UFMpdGoRz&RIe>XZq11L0mpL0HeZ}4%9XdRrZR5z7dOWc9=N_O&KA+_CXOZx zbC?o3e`$_teDjsR&xKF^O@8KfUn~dxrxBfoHLFD%z~jKh*t^dOHA4z_IoVE2C~csQ zx8F9eW#D_PDrH-D!DD0N8Qrob!_g&?QkRj|uhk2+lc1Y}FKOYT_Zy6F!&PcI9|`c;d^MO2)!>!BQW2 z>tBw&Xi)tzxD+Hp-A4m^H=uJVx+dfEpugns>NM*oy|0O?ftkCV$WbfWByWSG^EV+S@C4tq-?5 zJ>y(ES#ZL`(JPVj>wS$+!#_Tzi=D?hauxfQKfjrJP8x^yr=4&emnu}<_B)nn>_%Kg z#ct1Vk|?h3!unntig2s^9b)vN{Evx7LDn;-g-hTOjyscJ{{1ORMi;UtZ}OV+Y_mB} zlFXjJR_=3GhqUjQE_-pHbw93wA%U87CW<1%ATC|-N+BGriaPg^@7@)0IegU6LrlKz zh7QIeZ`9$er|4SMys@eiVDsYP@KwKDMM`^w&eez1f%R(HjGqVsQPH1?q6R)4)h(PL z9hg6_$hRyn7(-z^>3tzMIN;fW0p;zN=g&|ieMj>hJx#*mmS#C=W#aHnh}?lE8adPR2sOi58C;_EohqArnI6FVJxQ=xf6);jW!w zBE6F~xA+Z2U#WB5FI7}WMwKV1dHcbo+xu{StvWG{sk}khvMVbLd8<|?o==&FL+(2$ z*N4^jukMUBNX%L*QTW_?O;(3^=-T^|GoQ0p{XzrRF(&r>DEl*nk6(gf9~*x2X;y5n ztSHkyyEdwDG_a{JR+swq4VqPRhYK4T>L#qOi0?A0#(E7)b}i+@GYQ!^kU99$l>0cCwa5OC5c!!THVcEo7AM^LyuzLiz=OMIDxxR zqb0(hVb6Wkkh~L3=|{NE9}`A1b>WE1Ht{z(rEkNrtiG=vsnP2=QEx_QU+h#D;Q!g; z=6)f9+`^XG%GJE{ExR$nfjSS?!5_k@sVCBKm;GaA>~5B6sL7H+PvbcbNA++dc(sxD zbnmsQrxcv8ule#)6lZbnl2Z>Yj@9}!#H^hRn*ZfRQO^9Cjf)!Gbtc1s(q&j!QG`Tk-xzhpO>|;rT zdhcjfGgn0ysIBO19DCBjwo_L`>hjohmCsn<6JT{KUsrbd-^+r8E)sv;8N`=oeN%hdJ$ z#rxLGszXY4w7ugaBQPzN%%?_S;(^7d1&#&gjXB+~?vZD-TW~UtlYG%&@eLk4MScCG zq(Peb7YpH`h$g$B<+~kaBMyC=3dE%Wx{i!%>bFTdNmjkOPII~ujK1<1kt%+q&~g(% z>G#aHe%SJB@)-G|Xge8Xu(2m6ZQ_D@r|v1IkNaMDAvDh`^Qc&d)e{lnf>b3#0$KhX z+fg4~YBfdkub`wQEk$9whK7rA`d`?u*U0?$h8 zQFj^^Dw?IfDkl*buOO69C{Fh2T+WX>^Mqr;jEt9c%SCSl5cX2zDj73>Sz%$$ew(-} zy^0b1+9kqk*v?{$Ng?lb>Y0BgFgZ*mB{Kbw-^y zXMQ3L9saJ2L8-_p14G%&%$RNN*rWMV@^u|Y%furpKUqC!Fm}O@%O;D=YAaL`S_?#f zvJXD7;rT|4-%8t}DHUOy8!T`q7pFbVf?o)^K_A2%FKp^L%`Gi`Wll$ZwzG*b!rZ_$ z`iq%plI+48xM$%Q;Q@|B#Aa3Kohto z^OX-F1mSCv4R2xhjO=c>-+Oww$EwQcDSKiw$8C1W7RLKFF_MI457Eb09&1_$ldlkQ z!s$80B8rImgRJI@OnyjGE)IdR>B+@2fsbcGZgufJyLna#mc{!vdtjtS93^Hpchdj! z+gY61=hcVm*vK$kXOp_{F3B2i4vI3_6BW8}e>~~-ImOGWPR9nQwcRxJS%uIX{bR7x z0WT9Xsw2NWE~Ba?h;lFlat?XE3q31Bdb4gYCjGL%DASov(|Q-SidPADJI#1=-v9V~ zL6G*!uliYiu6uvz9P^5nk|4I#el%kIZeMpT< zGco$&mKrU*6XDF+gb5*WcJl6IuEsH+a^ys*w_md}aM8hz74wo~wUZk*ELpiH)bhfC z|CW;WYr>F@kY?ZMwb?W&TRvH_)9AFHE8TY`40%m$L^p%P^ZF7hHR{XWcfnvm1 zP(lu1CdTa>AOJec0eAoQ2_9cbBM-2U9Fc(ka!RFv0)QcA|H~`*e|ZHgxd||URf+&L z@h=}#Lh+cyLl3n#0T$we?FxX~H-S)!f9)CE3j~-eGYNn_3HUJxpsIv+TTIOO*G47a zD3C1};8K-Vj+4Ur+n|FZJM{{N?h5_&3!-A2k9w(-r_$GlweFGz{Q0?{tF}V zE2Vy6kOzCF1RDo|InX*15CjPc02zpi0z|>ONI-`cgAl{)=bM?hwuPI`H4l*S9&i@S zsRsN(+AM$qoQneZpq*~t1Jpsod%#0zZWjZnSE@t zhbZ_sKxuzDAOYfg84pxI^V^Bgyek2yh2~x$G#^L=vY@$p5}*YNJOu)OY1B+Q(8!t$ zQJazg0|+s@Kfjs`_(St2DbO610{B96tyE~flL8f%l;;5FDFhr2$Kau%2!~^#ITj*d zl%Zb?^oxcD3JyoWL5pU9i{=2kPv2ihfKn9zmJMP-La>7+h>TH!h61#V2Ln?8R`5(J zzz8W_*;jf$6;k@L2s%ixbbyr!gT#v=QNOuyKUAPbI)s!>1E|4AsQ?eyodwV`q49|S zf@HoAA=A>zoInNy(klf{g7xXZStgXke*?iYA;-c~08+?O?R+49 z->0lhNVJ3){x5;jS&%?NCS>2~ykFiwMvMWS3ISHCf3o3V8(;Tfce5Z^L?#fWb#O+- zjW3wM&=@f+42wdE;eXGde`l$-n~fJt0`V(lHEn#L{6!v|#NRF}2_#6H0>D7&Yybe+ z9|B?*WGKZIZQMOBA`j_76juZ-{r`LxA){cRWGZkBJpLHUNwO!94~!lI zkHPOx09jDs2~Y~w7DF^-F>nVQe+tch76a4Z=MrefQ3AXH*~*|hQMeTN0!o+f^OixS zakT=Fsq`xcyokZ%N@yzn46r8#g`Pvxp-MoP7?iGtpjV#*gP?v5q{gor7y$)e02olK z462fGH9!FAeklb*YXOx?^A`Y~7<8$Fmb+^K3MLc^dr)POShN@xy1-EwxEKy}X@Ww( zTMM{>W%UrUt`j)Q0F|l(Bm#*Q!$U|cRGU7(fkH7{2Pu5m0ARTGg*tRx3~f=C(t$={9IJp#z$Yw?nJpozQAm2T%)Y zbOD%3$Q}2HL56N<8q@_u6N92X|7-`;?gqxe_5DYy9;m_%^+F=VdVzef={0l|XkG&q zU~C_>y7?MN2Gia^tDSv7KiJ(5(cZiPeu5ve0a`Gi4mib$$3X5z!jMP_F(h<~5l{^G z-Ht>dpa5ldK>><-0m*b203Ja-AM+rQ9QM%ea2OP3|MK_^x33t7JLIi>92)Aie#1fXuvh}>Pk|6K)KmOP zI{@ytm47f};dnIE?f*vG=Y@9i2MrEw1Ha$!{)U5SNF?T$4#L0UzR!%5_*38kaQ{W^ zPi8C}_1BK^D9qvAVX^SPX%Oy@kU;*&VezQHV~59}4kZm9a^N9X!|@m#?k_JOFcSN{ z_-{r_z!8|kxwTKjpa_SP1_3pwe=%bb=s%5tn6c0$d{_w<2mgzPlQ?urAYRXaU;m*5q9Ne_g@%;C5&iz`ggBC&s*_x+;{ z!Tx;|3BRfyL_|Sn;xID`x}5%^{TDBwA(@A9Xs8(eMMJ|6d4>SJ1YrNlU?dukKLms$ zF$k!FAKD!T%KyVOti<20#-a|DU}(cw3<3k&uYbRlU?djzSN0=uPysru1h;>6AL50| z?Vp7UQi6jD-ys|VYOepyOZau^?4RSqRSJ(qp(XzG0#wRSXyl&)_i5O_X=wPN(CwE& zNcA7a!11SXkh}hj6C4lG4q3fVLxNco00RNP|83(pr$I|Nl*FGlL0?)R|NbfVfcDo3 zhr^-U@eg?rPU7G_<~JStG&JJCX==YkO9F%3|FZQ55V9O0slMu5Kx6Voc0I_4E!&F z(7V=OI0V#U9oifM0UgZWXpnxW_9C!1>sAByk5Q)V7jYI!+E)hulq3adW zi-HsOKT7=(K?LgWgATRcxW94GVLi-?hX1>?{j0Jepx3R#S%QF$>aUGJH|2kT*#8{N ze>z3T=tB(vbg1!2G!iVH0yqh1ab0KU{a0;B!TuLt)oWLrp(n`HgC|AUMVQoC6zVMg ztO8sa4fPF31x1WJ8jHfAQBW6$m&Yke$WZ>jAuu!OMcvs-!Pdsg!QImdCXP{3R7OI* z9QrICErC{mS|JGqB@9YgUIB$w!eZnV_CI5~dsw)69Q4EcMq|-9N`8JNEoI9855arB AQUCw| diff --git a/README.md b/README.md index e7ffca0..47d260c 100644 --- a/README.md +++ b/README.md @@ -32,10 +32,22 @@ Dave Ault using tek4010. ![scale model](scalemodel.jpg?raw=true "scale model of Tektronix 4010") -All instructions can now be found in [Manual.pdf](https://github.com/rricharz/Tek4010/blob/master/Manual.pdf) +All instructions can be found in [Manual.pdf](https://github.com/rricharz/Tek4010/blob/master/Manual.pdf) in the main Tek4010 directory. -**Version 1.8 for the Raspberry Pi 5 includes a somewhat improved handling of the fading of the bright -drawing spot at the expense of requiring much more computer power. See chapter 14 of the manual on how -to switch to it. The standard version is 1.7, which works on all Raspberry Pi models.** +The storage tube emulator and the Tektronix 4010/4014 decoder were witten by Rene Richarz. The ARDS +decoder was written by Lars Brinkhoff. He also provided some interesting historical documents and +the ARDS plot files. Teunis van Beelen has written the helper program “rs232-console” to connect +to a host using a serial link. Dave Ault tested the serial link to his PDP-11/73. The historical +plot data for the Tektronix 4014 was obtained from Jos Dreesen. The special plot mode pictures +with variable brightness were obtained from Monty McGraw. He also helped to debug the special +plot point mode. The historical plot data of the spacelab from the ICEMDDN CAD package on a CDC +Cyber 175 mainframe emulator was obtained from Nick Glazzard. He also helped to improve the GIN +mode substantially. The CP/M GSXBASIC plot files are from Udo Munk. Thanks to Ian Schofield for +his critical comments and a code snippet for drawing dashed and dotted lines, and to Oscar Vermeulen +and Mark Matlock for their support. The manuals were obtained from bitsavers.org. Thanks also to all +others who contributed important ideas, helped with the debugging and preserved the historical data. +This program is the result of a community effort. +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. diff --git a/RPi5/ards.c b/RPi5/ards.c deleted file mode 100755 index 1c43609..0000000 --- a/RPi5/ards.c +++ /dev/null @@ -1,240 +0,0 @@ -/* - * ards.c - * - * ARDS option for tek4010 graphics emulator - * - * Copyright 2019 Lars Brinkhoff - * - * https://github.com/rricharz/Tek4010 - * - * 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; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "main.h" -#include "tube.h" - -static long startPaintTime; - -// mode handles the current state of the emulator: -// -// mode 0 symbol mode -// mode 1 set point mode -// mode 2 extended vector mode -// mode 3 short vector mode - -static int mode; - -static double efactor; - -static int args; -static unsigned char data[4]; - -static int x0 = -485, y0 = 450, x2, y2; - -static void draw_char (cairo_t *cr, cairo_t *cr2, char ch) -{ - tube_x0 = (int)(efactor * (x0 + 540)); - tube_y0 = (int)(efactor * (y0 + 707)); - //fprintf (stderr, "[tube: %d,%d]", tube_x0, tube_y0); - tube_drawCharacter(cr, cr2, ch); - x0 += (int)(hDotsPerChar / efactor); -} - -static void draw_vector (cairo_t *cr, cairo_t *cr2) -{ - tube_x0 = (int)(efactor * (x0 + 540)); - tube_y0 = (int)(efactor * (y0 + 707)); - tube_x2 = (int)(efactor * (x2 + 540)); - tube_y2 = (int)(efactor * (y2 + 707)); - //fprintf (stderr, "[tube: %d,%d - %d,%d]", tube_x0, tube_y0, tube_x2, tube_y2); - tube_drawVector(cr, cr2); -} - -void ards_draw(cairo_t *cr, cairo_t *cr2, int first) -// draw onto the main window using cairo -// cr is used for persistent drawing, cr2 for temporary drawing - -{ - int ch; - - refreshCount++; // to calculate the average refresh rate - - if (first) { - first = 0; - efactor = windowWidth / 1080.0; - // fprintf (stderr, "efactor: %0.2f\n", efactor); - refresh_interval = 30; - tube_changeCharacterSize(cr, cr2, 80, 50, efactor * 1.1); - - } - - startPaintTime = tube_mSeconds(); // start to measure time for this draw operation - - showCursor = 1; - isBrightSpot = 0; - - // clear the second surface - tube_clearSecond(cr2); - - // clear persistent surface, if necessary - if (tube_doClearPersistent) { - tube_clearPersistent(cr,cr2); - } - - tube_setupPainting(cr, cr2, STANDARD_FONT); - - do { - ch = tube_getInputChar(); - - if (tube_isInput() == 0) { - } - - if (ch == -1) { - return; // no char available, need to allow for updates - } - - //fprintf (stderr, "\n[INPUT %03o [%d/%d]]", ch, mode, args); - - if (args > 0) { - data[--args] = ch; - } - - switch (ch) { - case 007: - mode = 0; - args = 0; - break; - case 010: - mode = 0; - args = 0; - x0 -= hDotsPerChar; - break; - case 012: - mode = 0; - args = 0; - y0 -= vDotsPerChar; - break; - case 014: - mode = 0; - args = 0; - x0 = -485; - y0 = 450; - tube_clearPersistent(cr, cr2); - break; - case 015: - mode = 0; - args = 0; - x0 = -479; - break; - case 034: - mode = 0; - args = 0; - break; - case 035: - //fprintf (stderr, "[POINT]"); - mode = 1; - args = 4; - break; - case 036: - //fprintf (stderr, "[E VEC]"); - mode = 2; - args = 4; - break; - case 037: - //fprintf (stderr, "[S VEC]"); - mode = 3; - args = 2; - break; - default: - if (args == 0) { - switch (mode) { - case 0: - //fprintf (stderr, "[SYMBOL %c @ %d, %d]", ch, x0, y0); - draw_char (cr, cr2, ch); - break; - case 1: - args = 4; - x0 = (data[3] & 076) >> 1; - x0 |= (data[2] & 037) << 5; - if (data[3] & 1) - x0 = -x0; - y0 = (data[1] & 076) >> 1; - y0 |= (data[0] & 037) << 5; - if (data[1] & 1) - y0 = -y0; - //fprintf (stderr, "[POINT @ %d, %d]", x0, y0); - break; - case 2: - args = 4; - x2 = (data[3] & 076) >> 1; - x2 |= (data[2] & 037) << 5; - if (data[3] & 1) - x2 = -x2; - x2 += x0; - y2 = (data[1] & 076) >> 1; - y2 |= (data[0] & 037) << 5; - if (data[1] & 1) - y2 = -y2; - y2 += y0; - //fprintf (stderr, "[E VEC @ %d,%d - %d,%d]", x0, y0, x2, y2); - if (data[2] & 040) - ; //fprintf (stderr, "[INVISIBLE]"); - else - draw_vector(cr, cr2); - if (data[0] & 040) - ; //fprintf (stderr, "[DOTTED]"); - x0 = x2; - y0 = y2; - break; - case 3: - args = 2; - x2 = (data[1] & 076) >> 1; - if (data[1] & 1) - x2 = -x2; - x2 += x0; - y2 = (data[0] & 076) >> 1; - if (data[0] & 1) - y2 = -y2; - y2 += y0; - draw_vector(cr, cr2); - //fprintf (stderr, "[S VEC @ %d,%d - %d,%d]", x0, y0, x2, y2); - x0 = x2; - y0 = y2; - break; - } - } - break; - } - } - while (((tube_mSeconds() - startPaintTime) < refresh_interval)); - - // display cursor - - if (showCursor && (tube_isInput() == 0)) tube_doCursor(cr2); - -} diff --git a/RPi5/install b/RPi5/install deleted file mode 100755 index 836378b..0000000 --- a/RPi5/install +++ /dev/null @@ -1,11 +0,0 @@ -# install tek4010 in ~/bin - -# create ~/bin directory, if it does not exist -[ ! -d ~/bin ] && mkdir ~/bin - -# copy the file to ~/bin, make it executable -cp ../tek4010 ~/bin -chmod +x ~/bin/tek4010 - -echo "tek4010 version 1.8 for Raspberry Pi 5 installed." -echo "Reboot if this is the first time tek4010 is installed" diff --git a/RPi5/main.c b/RPi5/main.c deleted file mode 100644 index 331bf89..0000000 --- a/RPi5/main.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * - * main.c - * provides a simple framework for basic drawing with cairo and gtk+ 3.0 - * - * Version adapted for tek4010 - * - * Copyright 2016,2019 rricharz - * - * https://github.com/rricharz/Tek4010 - * - * 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; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - * - * - */ - -#define TIME_INTERVAL 35 // time interval for timer function in msec (after last refresh) - -#define GDK_DISABLE_DEPRECATION_WARNINGS - -#include -#include -#include -#include -#include - -#include "main.h" -#include "tube.h" - -extern FILE *putKeys; - -char *windowName; - -static int global_firstcall; - -extern int argFull; -extern int argFullV; -extern int argARDS; - -static GtkWidget *window; -int windowWidth; -int windowHeight; -static double aspectRatio; -static int windowHeightOffset = 0; -static int windowWidthOffset = 0; - -guint global_timeout_ref; - -extern int tube_doClearPersistent; - -static void do_drawing(cairo_t *, GtkWidget *); - -static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, - gpointer user_data) -{ - do_drawing(cr, widget); - return FALSE; -} - -static gboolean on_timer_event(GtkWidget *widget) -{ - if (tube_on_timer_event()) - gtk_widget_queue_draw(widget); - return TRUE; -} - -static gboolean clicked(GtkWidget *widget, GdkEventButton *event, gpointer user_data) -{ - if (tube_clicked(event->button, event->x - windowWidthOffset, event->y - windowHeightOffset)) - gtk_widget_queue_draw(widget); - return TRUE; -} - -static void on_quit_event() -{ - tube_quit(); - gtk_main_quit(); - exit(0); -} - -static void do_drawing(cairo_t *cr, GtkWidget *widget) -{ - static cairo_surface_t *permanent_surface, *temporary_surface; - - g_source_remove(global_timeout_ref); // stop timer, in case do_drawing takes too long - - if (global_firstcall) { - // force aspect ratio by making black stripes at left and right, or top and bottom - gtk_window_get_size(GTK_WINDOW(window), &windowWidth, &windowHeight); - // gtk_window_set_resizable(GTK_WINDOW(window), 0); // do not allow further resizing - - if ((windowWidth != 1024) || (windowHeight != 768)) { - if (windowWidth > (int)((double)windowHeight * aspectRatio + 0.5)) { - windowWidthOffset = (windowWidth - (int)((double)windowHeight * aspectRatio)) / 2; - windowWidth = (int)((double)windowHeight * aspectRatio + 0.5); - } - if (windowHeight > (int)((double)windowWidth / aspectRatio + 0.5) ) { - windowHeightOffset = (windowHeight - (int)((double)windowWidth / aspectRatio)) / 2; - windowHeight = (int)((double)windowWidth / aspectRatio + 0.5); - } - } - printf("Window dimensions: %d x %d\n", windowWidth, windowHeight); - - permanent_surface = cairo_surface_create_similar(cairo_get_target(cr), - CAIRO_CONTENT_COLOR, windowWidth, windowHeight); - temporary_surface = cairo_surface_create_similar(cairo_get_target(cr), - CAIRO_CONTENT_COLOR_ALPHA, windowWidth, windowHeight); - - if (argHideCursor) { // hide cursor (does not allow GIN mode) - GdkCursor* Cursor = gdk_cursor_new(GDK_BLANK_CURSOR); - GdkWindow* win = gtk_widget_get_window(window); - gdk_window_set_cursor((win), Cursor); - } - } - - cairo_t *permanent_cr = cairo_create(permanent_surface); - cairo_t *temporary_cr = cairo_create(temporary_surface); - if ((permanent_cr == NULL) || (temporary_cr == NULL)) { - printf("Cannot create drawing surfaces\n"); - exit(1); - } - if (argARDS) - ards_draw(permanent_cr, temporary_cr, global_firstcall); - else - tek4010_draw(permanent_cr, temporary_cr, global_firstcall); - global_firstcall = FALSE; - - cairo_set_source_surface(cr, permanent_surface, windowWidthOffset, windowHeightOffset); - cairo_paint(cr); - cairo_set_operator(cr, CAIRO_OPERATOR_LIGHTEN); - cairo_set_source_surface(cr, temporary_surface, windowWidthOffset, windowHeightOffset); - cairo_paint(cr); - cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); - - cairo_destroy(permanent_cr); - cairo_destroy(temporary_cr); - global_timeout_ref = g_timeout_add(TIME_INTERVAL, (GSourceFunc) on_timer_event, - (gpointer) window); -} - -static void on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer user_data) -{ - int ch; - // printf("key pressed, state =%04X, keyval=%04X, isGinMode = %d\r\n", event->state, event->keyval, isGinMode); - - if ((event->keyval == 0xFF50) || // "home" key - (event->keyval == 0xFF55) || // "page up" key - (event->keyval == 0xFF56)) // "page down" key - { - tube_doClearPersistent = 1; - gtk_widget_queue_draw(widget); - return; - } - - if (event->keyval == 0x8BF) { // "option b" sends break code to target - if (putKeys) { - printf("sending break code\n"); - putc(0xFF, putKeys); - putc(0xF3, putKeys); - } - } - - // control keys - else if ((event->keyval >= 0xFF00) && (event->keyval <= 0xFF1F)) - ch = event->keyval & 0x1F; - else if (event->state & GDK_CONTROL_MASK) { - if ((event->keyval == 0xFF51) || // "left arrow" key - (event->keyval == 0xFF52)) { // "up arrow" key - tube_doClearPersistent = 1; - gtk_widget_queue_draw(widget); - return; - } - else if (event->keyval == 0x0077) { // "w" makes screendump - system("scrot --focussed"); - return; - } - else if (event->keyval == 0x0071) { // "q" quits tek4010 - on_quit_event(); - return; - } - else if (argAPL && (event->keyval == 0x006E)) { // "n" switch to alternative character set - aplMode = 1; - // printf("Setting APL mode to 1 from keyboard\n"); - return; - } - else if (argAPL && (event->keyval == 0x006F)) { // "o" switch to normalcharacter set - aplMode = 0; - // printf("Setting APL mode to 0 from keyboard\n"); - return; - } - else - ch = event->keyval & 0x1F; - } - else if (event->keyval == 0xFF52) ch = 16; // arrow up for history up - else if (event->keyval == 0xFF54) ch = 14; // arrow down for history down - - else if ((event->state & GDK_MOD1_MASK) && (aplMode)) { // alt key - printf("alt key, ch = %4X\n", event->keyval & 0x7F); - ch = (event->keyval & 0x7F) + 128; - } - - // normal keys - else if ((event->keyval >= 0x0020) && (event->keyval <= 0x007F)) - ch = event->keyval & 0x7F; - - else return; - - if (isGinMode) { // need to pass key to GIN mode handling, not to child process - isGinMode = ch; - gtk_widget_queue_draw(widget); - } - - else if (putKeys) { - // pipe key to child process, if stream open - if (aplMode) { - ch = tube_translateKeyCode(ch); - putc(ch & 0xFF, putKeys); - if (ch >> 8) { // overstrike - putc(8, putKeys); - putc(ch >> 8, putKeys); - } - } - else - putc(ch,putKeys); - } -} - -int main (int argc, char *argv[]) -{ - GtkWidget *darea; - - int askWindowWidth; - int askWindowHeight; - - tube_init(argc, argv); - - if (argARDS) { - askWindowWidth = 1080; - askWindowHeight = 1414; - } - - else if (argFull) { - askWindowWidth = 4096; - askWindowHeight = 3120; - } - else { - askWindowWidth = 1024; - askWindowHeight = 780; - } - - aspectRatio = (double)askWindowWidth / (double)askWindowHeight; - - gtk_init(&argc, &argv); - - global_firstcall = TRUE; - - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - - // set the background color - GdkColor color; - color.red = 0; - color.green = 0; - color.blue = 0; - gtk_widget_modify_bg(window, GTK_STATE_NORMAL, &color); - - darea = gtk_drawing_area_new(); - gtk_container_add(GTK_CONTAINER(window), darea); - gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK); - gtk_widget_add_events(window, GDK_KEY_PRESS_MASK); - - gtk_widget_set_events(darea,gtk_widget_get_events(darea) | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK); - g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), NULL); - g_signal_connect(G_OBJECT(darea), "destroy", G_CALLBACK(on_quit_event), NULL); - g_signal_connect(G_OBJECT(darea), "button-press-event", G_CALLBACK(clicked), NULL); - g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(on_key_press), NULL); - - GdkScreen *screen = gtk_window_get_screen(GTK_WINDOW(window)); - int screenWidth = gdk_screen_get_width(screen); - int screenHeight = gdk_screen_get_height(screen); - printf("Screen dimensions: %d x %d\n", screenWidth, screenHeight); - - if (argFull) { - // DISPLAY UNDECORATED FULL SCREEN WINDOW - gtk_window_set_decorated(GTK_WINDOW(window), FALSE); - gtk_window_fullscreen(GTK_WINDOW(window)); - gtk_window_set_keep_above(GTK_WINDOW(window), FALSE); - windowWidth = screenWidth; - windowHeight = screenHeight; - } - - else { - // DISPLAY DECORATED WINDOW - if (argFullV || (askWindowHeight > (screenHeight - BORDER))) { - askWindowWidth = (int)((double)(screenHeight - BORDER) * aspectRatio); - askWindowHeight = screenHeight - BORDER; - } - gtk_window_set_decorated(GTK_WINDOW(window), TRUE); - gtk_window_set_default_size(GTK_WINDOW(window), askWindowWidth, askWindowHeight); - windowWidth = askWindowWidth; - windowHeight = askWindowHeight; - } - // printf("Requested window dimensions: %d x %d\n", windowWidth, windowHeight); - - if (TIME_INTERVAL > 0) { - // Add timer event - // Register the timer and set time in mS. - // The timer_event() function is called repeatedly until it returns FALSE. - global_timeout_ref = g_timeout_add(TIME_INTERVAL, (GSourceFunc) on_timer_event, - (gpointer) window); - } - - gtk_window_set_title(GTK_WINDOW(window), windowName); - - gtk_widget_show_all(window); - - gtk_main(); - - return 0; -} diff --git a/RPi5/main.h b/RPi5/main.h deleted file mode 100644 index 8f9fefb..0000000 --- a/RPi5/main.h +++ /dev/null @@ -1,20 +0,0 @@ - -#include - -#define BORDER 80 // we need to make an educated guess to make sure that the full vertical - // space is used if required - // if BORDER is too small, we might end up with a too large window - // if BORDER is too large, the decorated window will be smaller than possible - // with a reasonable size BORDER, both are acceptable - // ideally, one could force the window manager to use a certain aspect ratio - -void tube_init(int argc, char* argv[]); -void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first); -void tek4010_clicked(int x, int y); -int tube_on_timer_event(); -int tube_clicked(int button, int x, int y); -void tube_quit(); - -void ards_draw(cairo_t *cr, cairo_t *cr2, int first); - - diff --git a/RPi5/makefile b/RPi5/makefile deleted file mode 100644 index d2176ea..0000000 --- a/RPi5/makefile +++ /dev/null @@ -1,14 +0,0 @@ -LIBS = `pkg-config --libs gtk+-3.0` - -CFLAGS = -std=c99 `pkg-config --cflags gtk+-3.0` - -all: ../tek4010 - -../tek4010: main.c main.h tube.c tube.h tek4010.c ards.c - $(CC) -o ../tek4010 main.c tube.c tek4010.c ards.c $(LIBS) $(CFLAGS) - -install: ../tek4010 - ./install - -clean : ../tek4010 - -rm -f ../tek4010 diff --git a/RPi5/tek4010.c b/RPi5/tek4010.c deleted file mode 100755 index 89eeced..0000000 --- a/RPi5/tek4010.c +++ /dev/null @@ -1,710 +0,0 @@ -/* - * tek4010.c - * - * A tek4010/4014 graphics emulator - * - * Copyright 2019 rricharz - * - * https://github.com/rricharz/Tek4010 - * - * 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; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - * - */ - -#define DEBUG 0 // print debug info - - -#define TODO (long)(16) // draw multiple objects until screen updates - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "main.h" -#include "tube.h" - -// mode handles the current state of the emulator: -// -// mode 0 alpha mode -// -// mode 1 expecting address byte of dark mode (move to) address -// mode 2 expecting second byte of dark mode (move to) address -// mode 3 expecting third byte of dark mode (move to) address -// mode 4 expecting fourth byte of dark mode (move to) address -// mode 5 expecting first byte of persistent vector end point address -// mode 6 expecting second byte of persistent vector end point address -// mode 7 expecting third byte of persistent vector end point address -// mode 8 expecting fourth byte of persistent vector end point address -// -// mode 30 expecting escape sequence, escape code received -// mode 31 received in ANSI escape sequence, escape sequence continues if next char is digit -// -// mode 40 incremental plot mode; is ignored until exit from incremental plot received -// mode 50 special point plot mode -// mode 60 crosshair mode -// mode 101 ignore until group separator - -int mode, savemode; -int penDown = 1; - -extern int leftmargin; -extern FILE *putKeys; - -static long startPaintTime; -static int xh,xl,yh,yl,xy4014; -static long todo; -static double efactor; - -int ginCharacter[6] = {0, 0, 0, 0, 0, 0}; - -// table for special plot point mode -// 4014 manual page F-9 -int intensityTable[] = {14,16,17,19, 20,22,23,25, 28,31,34,38, 41,33,47,50, - 56,62,69,75, 81,88,94,100, 56,62,69,75, 81,88,96,100, - 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 9,10, 11,12,12,13, - 14,16,17,19, 20,22,23,25, 28,31,34,38, 41,44,47,50, - 56,62,69,75, 81,88,94,100, 56,63,69,75, 81,88}; - - -void tek4010_checkLimits(cairo_t *cr, cairo_t *cr2) -/* check whether char is in visibel space */ -{ - /* don't check here for leftmargin, graphics needs to write characters to the whole screen */ - if (tube_x0 < 0) tube_x0 = 0; - - if (tube_x0 > windowWidth - hDotsPerChar) { - tube_x0 = leftmargin; tube_y0 -= vDotsPerChar; - } - if (tube_y0 < 4) { // new line at bottom of page - tube_y0 = windowHeight - vDotsPerChar; - if (leftmargin) leftmargin = 0; - else leftmargin = windowWidth / 2; - if (argAutoClear) { - leftmargin = 0; - tube_clearPersistent(cr,cr2); - } - /* check here for leftmargin */ - if (tube_x0 < leftmargin) tube_x0 = leftmargin; - } - if (tube_y0 > (windowHeight - vDotsPerChar)) tube_y0 = windowHeight - vDotsPerChar; -} - -void tek4010_bell() -{ - // bell function, delay 0.05 sec - tube_u100ResetSeconds(1); - usleep(50000); - showCursor=0; - todo = 0; -} - -void sendCoordinates() -{ - // send 4 coordinate bytes - int x,y,ch; - x = (int)((double)tube_x0 / efactor); - y = (int)((double)tube_y0 / efactor); - - if (DEBUG) printf("sendCoordinates, x=%d, y=%d\n", x, y); - - ch = (x >> 5) + 0x20; - putc(ch, putKeys); - ginCharacter[4] = ch; // save to check for echo - ch = (x & 31) + 0x20; - putc(ch,putKeys); - ginCharacter[3] = ch; // save to check for echo - ch = (y >> 5) + 0x20; - putc(ch, putKeys); - ginCharacter[2] = ch; // save to check for echo - ch = (y & 31) + 0x20; - putc(ch,putKeys); - ginCharacter[1] = ch; // save to check for echo -} - -void enqMode() -{ - // activated by sending ESC ENQ - int status; - status = 0x20; - if (leftmargin == 0) status += 2; - if (mode == 0) status += 4; - putc(status,putKeys); // send status byte - sendCoordinates(); - putc(13, putKeys); // cannot send a EOT here -} - -void ginMode(cairo_t *cr, cairo_t *cr2) -{ - // activated by sending ESC SUB - if (DEBUG) printf("GIN, mode = %d, isGinMode = %d\n", mode, isGinMode); - tube_crosshair(cr, cr2); - mode = 60; - todo = 0; - showCursor = 0; - isGinMode = 1; -} - -void ginSend(int ch) -{ - // user has stoken a key during GIN mode - if (DEBUG) printf("ginSend, ch = %d\n", ch); - putc(ch,putKeys); // user key stroke character - ginCharacter[5] = ch; // save to check for echo - sendCoordinates(); // 4 characters of packed coordinates - // cannot send a EOT here - // wait 5 ms, then send CR. - usleep(5000); - putc(13,putKeys); // cr - ginCharacter[0] = 13; - // prepare to suppress unwanted echoed characters. - isGinSuppress = 6; -} - -void tek4010_clicked(int x, int y) -{ - if (DEBUG) printf("Clicked, mode = %d\n", mode); - if (mode == 60) { - tube_x0 = x; - tube_y0 = y; - } -} - -void tek4010_escapeCodeHandler(cairo_t *cr, cairo_t *cr2, int ch) -// handle escape sequencies, see 4014 user manual, table page G-1 -// codes identical for all modes are handled elsewhere -{ - if (DEBUG) printf("Escape %02X, savemode=%d\n",ch,savemode); - switch (ch) { - case 0: break; // ignore filler 0 - - case 5: // ENQ: ask for status and position - enqMode(); - mode = 0; break; - case 6: break; - - case 8: // backspace during ESC - tube_x0 -= hDotsPerChar; - tek4010_checkLimits(cr, cr2); - mode = 0; break; - case 9: // tab during ESC - if (argTab1) - tube_x0 += hDotsPerChar; - else - tube_x0 = tube_x0 - (tube_x0 % (8 * hDotsPerChar)) + 8 * hDotsPerChar; - tek4010_checkLimits(cr, cr2); - mode = 0; break; - - case 11:// VT during ESC, move one line up - tube_y0 += vDotsPerChar; - tek4010_checkLimits(cr, cr2); - mode = 0; break; - case 12:// FF during ESC - if (!argKeepSize) - tube_changeCharacterSize(cr, cr2, 74, 35, efactor); - tube_clearPersistent(cr,cr2); - mode = 0; break; - case 13:mode = 0; break; - case 14: // SO activate alternative char set - if (argAPL) { // switch only of argAPL is set - aplMode = 1; - // printf("Setting APL mode to 1 from computer\n"); - } - mode = 0; - todo = 0; - break; - case 15: // SI deactivate alternative char set - aplMode = 0; - mode = 0; - todo = 0; - // printf("Setting APL mode to 0 from computer\n"); - break; - - case 23: system("scrot --focussed"); mode= 0; break; - - case 26: // sub - ginMode(cr, cr2); - break; - - // modes 27 and 29 - 31 are identical in all modes - case 28: // record separator - if (DEBUG) printf("Special point plot mode, mode=%d\n",savemode); - mode = 50; // for the intensity/focus character - plotPointMode = 1; - specialPlotMode = 1; - double intensity = 1.0; - int defocussed = 0; - break; - - case '8': tube_changeCharacterSize(cr, cr2, 74, 35, efactor); mode = 0; break; - case '9': tube_changeCharacterSize(cr, cr2, 81, 38, efactor * 0.9); mode = 0; break; - case ':': tube_changeCharacterSize(cr, cr2, 121, 58, efactor * 0.65); mode = 0; break; - case ';': tube_changeCharacterSize(cr, cr2, 133, 64, efactor * 0.55); mode = 0; break; - - case '[': printf("Ignoring ANSI escape sequence: ["); - mode=31; - break; - - // normal mode - case '`': ltype = SOLID; writeThroughMode = 0; mode = savemode; break; - case 'a': ltype = DOTTED; writeThroughMode = 0; mode = savemode; break; - case 'b': ltype = DOTDASH; writeThroughMode = 0; mode = savemode; break; - case 'c': ltype = SHORTDASH;writeThroughMode = 0; mode = savemode; break; - case 'd': ltype = LONGDASH; writeThroughMode = 0; mode = savemode; break; - case 'e': ltype = SOLID; writeThroughMode = 0; mode = savemode; break; - case 'f': ltype = SOLID; writeThroughMode = 0; mode = savemode; break; - case 'g': ltype = SOLID; writeThroughMode = 0; mode = savemode; break; - - // defocussed mode - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': if (DEBUG) printf("Defocussed mode ESC %c not supported, ignored\n", ch); - mode = 101; break; - - // write-trough mode - case 'p': ltype = SOLID; writeThroughMode = 1; mode = 101; showCursor = 0; break; - case 'q': ltype = DOTTED; writeThroughMode = 1; mode = 101; showCursor = 0; break; - case 'r': ltype = DOTDASH; writeThroughMode = 1; mode = 101; showCursor = 0; break; - case 's': ltype = SHORTDASH;writeThroughMode = 1; mode = 101; showCursor = 0; break; - case 't': ltype = LONGDASH; writeThroughMode = 1; mode = 101; showCursor = 0; break; - case 'u': ltype = SOLID; writeThroughMode = 1; mode = 101; showCursor = 0; break; - case 'v': ltype = SOLID; writeThroughMode = 1; mode = 101; showCursor = 0; break; - case 'w': ltype = SOLID; writeThroughMode = 1; mode = 101; showCursor = 0; break; - - default: - printf("Ignoring escape code: 0x%02x\n",ch); - mode = 0; - break; - } -} - -int tek4010_checkReturnToAlpha(int ch) -// test for return to alpha character set -// see 4014 manual, page F-10, note 1 -{ - if (ch == 27) - savemode = mode; - if ((ch==31) || (ch==13) || (ch==27) /*|| (ch==12)*/) { - if (DEBUG && mode) printf("Going to alpha mode\n"); - mode = 0; - showCursor = 0; - //if (ch == 12) { - // tube_doClearPersistent = 1; - // todo = 0; - //} - if (ch == 27) { - mode = 30; - todo = 0; - } - plotPointMode = 0; - specialPlotMode = 0; - if (isGinMode && DEBUG) - printf("clearing isGinMode, char = %d\n", ch); - isGinMode = 0; - return 1; - } - else return 0; -} - -int digit(char ch) -{ - return ((ch>='0') && (ch<='9')); -} - -void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) -// draw onto the main window using cairo -// cr is used for persistent drawing, cr2 for temporary drawing - -{ - int ch, tag; - - refreshCount++; - - if (first) { - first = 0; - efactor = windowWidth / 1024.0; - refresh_interval = 30; - tube_changeCharacterSize(cr, cr2, 74, 35, efactor); - if (efactor > 0.8) pensize = efactor * 1.25; - if (windowWidth != 1024) printf("Scaling: %0.3f\n", efactor / 4.0); - } - - startPaintTime = tube_mSeconds(); // start to measure time for this draw operation - - showCursor = 1; - isBrightSpot = 0; - - // clear the second surface - tube_clearSecond(cr2); - - // clear persistent surface, if necessary - if (tube_doClearPersistent) { - tube_clearPersistent(cr,cr2); - if (!argKeepSize) - tube_changeCharacterSize(cr, cr2, 74, 35, efactor); - } - - if (aplMode) - tube_setupPainting(cr, cr2, APL_FONT); - else - tube_setupPainting(cr, cr2, STANDARD_FONT); - - if (plotPointMode) - todo = 100 * TODO; - else if (writeThroughMode) - todo = 8 * TODO; - else if (mode == 0) - todo = 4 * TODO; // for text speed - else - todo = TODO; - - do { - ch = tube_getInputChar(); - - if (tube_isInput() == 0) { - todo = 0; - } - - if (ch == -1) { - if ((mode == 0) && showCursor) tube_doCursor(cr2); - if (mode != 60) return; // no char available, need to allow for updates - } - - // Try suppressing GIN echoed characters here. - if (isGinSuppress){ - if (ch == 10) // additional line feed may be echoed if cr is typed - return; - if ((ch & 0x7F) == ginCharacter[isGinSuppress - 1]) { - if (DEBUG) printf( "isGinSuppress (%d): suppressing: %d\n", - isGinSuppress, ch); - isGinSuppress --; - return; - } - else { - if (DEBUG) printf("isGinSuppress, characters are different (%d,%d)\n", - ch & 0x7F, ginCharacter[isGinSuppress - 1]); - isGinSuppress = 0; - } - } - - // if (aplMode) printf("Receiving character %d from host\n", ch); - - if (DEBUG) { - printf("mode=%d, ch code %02X",mode,ch); - if ((ch>0x20)&&(ch<=0x7E)) printf(" (%c)",ch); - printf("\n"); - } - - if (tek4010_checkReturnToAlpha(ch)) { - todo = todo - 4; - goto endDo; - } - - // the following chars are identical in all modes (with exception: 13,28) - // see 4014 user manual, table on page G1 ff - - switch (ch) { - case 7: tek4010_bell(); - goto endDo; - case 10: // new line - tube_y0 -= vDotsPerChar; - if (!argRaw) tube_x0 = leftmargin; - tek4010_checkLimits(cr, cr2); - goto endDo; - case 13: // return - if (mode != 30) { // special handling in ESC mode - mode = 0; tube_x0 = leftmargin; - goto endDo; - } - break; - case 27: // escape code, all modes - savemode = mode; - mode = 30; - goto endDo; - case 28: // file separator >> point plot mode - if (mode != 30) { // special handling in ESC mode - mode = 5; - plotPointMode= 1; - goto endDo; - } - break; - case 29: // group separator >> graphics mode - mode = 1; - plotPointMode = 0; - goto endDo; - case 30: // record separator >> incremental plot mode - if (DEBUG) printf("Incremental point plot mode\n"); - penDown = 1; - mode = 40; - goto endDo; - case 31: // US, normal mode - mode = 0; - goto endDo; - } - - - // handle skipping coordinate bytes - // this cannot be done in switch(mode) below, because multiple bytes - // can be skipped and the current byte must be executed after a mode change - - tag = (ch >> 5) & 3; - - if ((mode >= 1) && (mode <= 8)) { - - if ((mode == 5) && (ch == 29)) { - if (DEBUG) printf("group separator, go from mode 5 to mode 1\n"); - mode = 1; - goto endDo; // goto end of do loop - } - - if (DEBUG) { - if (mode & 1) - printf(" mode=%d,tag=%d-H-val=%d,", - mode,tag, 32 * (ch & 31)); - else - printf(" mode=%d,tag=%d-L-val=%d,", - mode,tag, ch & 31); - printf("xh=%d,xl=%d,yh=%d,yl=%d\n",xh,xl,yh,yl); - } - - if (tag != 0) { - - if ((mode == 1) && (tag != 1)) mode = 2; - - if ((mode == 3) && (tag == 3)) { - // this overwrites the extra data byte of the 4014 for the - // persistent mode ccordinates and stores it for further use - mode = 2; - xy4014 = yl; - if (DEBUG) - printf("4014 coordinates, overwrite last value\n"); - } - - if ((mode == 2) && (tag != 3)) mode = 3; - if ((mode == 3) && (tag != 1)) mode = 4; - - if ((mode == 5) && (tag != 1)) mode = 6; - - if ((mode == 7) && (tag == 3)) { - // this overwrites the extra data byte of the 4014 for the - // persistent mode ccordinates and stores it for further use - mode = 6; - xy4014 = yl; - if (DEBUG) - printf("4014 coordinates, overwrite last value\n"); - } - - if ((mode == 6) && (tag != 3)) mode = 7; - if ((mode == 7) && (tag != 1)) mode = 8; - } - else { - if (ch == 0) return; - if (ch == 29) mode = 1; // group separator - else if (ch == 28) { plotPointMode = 1; todo = 16 * todo; } - else if (DEBUG) printf("Plot mode, unknown char %d, plotPointMode = %d\n",ch,plotPointMode); - return; - } - - } - - - // handling anything specific to a mode - - switch (mode) { - case 1: plotPointMode = 0; // normal graphics mode, starting coordinates - yh = 32 * (ch & 31); mode++; - if (DEBUG) printf("setting yh to %d\n", yh); - break; - case 2: yl = (ch & 31); - mode++; - if (DEBUG) printf("setting yl to %d\n", yl); - break; - case 3: if (tag == 1) xh = 32 * (ch & 31); mode++; - if (DEBUG) printf("setting xh to %d\n", xh); - break; - case 4: xl = (ch & 31); - if (windowWidth != 1024) { - int xb = xy4014 & 3; - tube_x0 = (int)(efactor * (double)(((xh+xl) << 2) + xb) / 4.0); - int yb = (xy4014 >> 2) & 3; - tube_y0 = (int)(efactor * (double)(((yh+yl) << 2) + yb) / 4.0); - } - else { - tube_x0 = xh + xl; - tube_y0 = yh + yl; - } - mode++; - tube_emulateDeflectionTime(); - if (DEBUG) printf("setting xl to %d\n", xl); - if (DEBUG) printf("******************************************** Moving to (%d,%d)\n",tube_x0,tube_y0); - break; - case 5: if (ch == 29) { - if (DEBUG) printf("setting mode to 1\n"); - mode = 1; - } - else if (tag != 0) { - yh = 32 * (ch & 31); mode++; - } - else if (DEBUG) printf("case 5: tag is 0\n"); - if (DEBUG) printf(">>>>>yh=%d\n",yh); - break; - case 6: yl = (ch & 31); mode++; - break; - if (DEBUG) printf(">>>>>yl=%d\n",yl); - case 7: xh = 32 * (ch & 31); mode++; - break; - if (DEBUG) printf(">>>>>xh=%d\n",xh); - case 8: xl = (ch & 31); - if (windowWidth != 1024) { - int xb = xy4014 & 3; - tube_x2 = (int)(efactor * (double)(((xh+xl) << 2) + xb) / 4.0); - int yb = (xy4014 >> 2) & 3; - tube_y2 = (int)(efactor * (double)(((yh+yl) << 2) + yb) / 4.0); - } - else { - tube_x2 = xh + xl; - tube_y2 = yh + yl; - } - if (DEBUG) printf(">>>>>xl=%d\n",xl); - - if (plotPointMode>0.0) { - - // draw the point - tube_drawPoint(cr, cr2); - - todo--; - } - - else { - tube_drawVector(cr,cr2); - - todo--; - } - - showCursor = 0; - - tube_x0 = tube_x2; // prepare for additional vectors - tube_y0 = tube_y2; - if (specialPlotMode) mode = 50; // another intensity/focus char follows - else mode = 5; - break; - case 30: // escape code handler - tek4010_escapeCodeHandler(cr, cr2, ch); - break; - case 31: // ANSI CSI sequence - printf("%c",ch); - if ((ch<0x20) || (ch>0x3F)) { - mode=0; - printf("\n"); - } - case 40: // incremental plot mode - tek4010_checkReturnToAlpha(ch); // check for exit - if (DEBUG) printf("Incremental plot mode, ch = %d, penDown = %d\n",ch, penDown); - if (ch == 32) penDown = 0; - else if (ch == 80) penDown = 1; - else if ((ch & 0x70) == 0x40){ - if (ch & 4) tube_y0++; - if (ch & 1) tube_x0++; - if (ch & 8) tube_y0--; - if (ch & 2) tube_x0--; - if (DEBUG) printf("point (%d,%d)\n", tube_x0, tube_y0); - tube_x2 = tube_x0; - tube_y2 = tube_y0; - if (penDown) tube_drawPoint(cr, cr2); - } - else if (DEBUG) printf("Illegal byte 0x%02X in incremental plot\n", ch); - break; - case 50:// special plot mode - tag = ch >> 5; - if ((ch < 32) || (ch >= 126)) return; - if (DEBUG) printf("intensity/focus control = %c: %d: ", ch, tag); - defocussed = (tag == 1); - intensity = intensityTable[ch - 32]; - if (DEBUG) printf("defocussed = %d, intensity = %d%%\n", defocussed, intensity); - mode = 5; // coordinates follow - break; - case 60:// crosshair mode - if (isGinMode > 1) { // key stroken by user - ginSend(isGinMode); - mode = 0; - todo = 0; - if (DEBUG) printf("GIN: key stroken by user, exiting GIN mode\n"); - isGinMode = 0; - } - else - ginMode(cr, cr2); - break; - case 101: - if (DEBUG) printf("Ignore until group separator, ch = %02x\n", ch); - if (ch == 29) mode = 1; - break; - case 0: // handle ALPHA mode; 4014 user manual, table page G-1 - // some characters are indentical for all modes and handled elsewhere - switch (ch) { - case 0: break; - case 8: // backspace - tube_x0 -= hDotsPerChar; - tek4010_checkLimits(cr, cr2); - break; - case 9: // tab - if (argTab1) - tube_x0 += hDotsPerChar; - else - tube_x0 = tube_x0 - (tube_x0 % (8 * hDotsPerChar)) + 8 * hDotsPerChar; - tek4010_checkLimits(cr, cr2); - break; - case 11: // VT, move one line up - tube_y0 += vDotsPerChar; - tek4010_checkLimits(cr, cr2); - break; - case 23: // ctrl-w screen dump - system("scrot --focussed"); - break; - - default: if ((ch >= 32) && (ch <127)) { // printable character - tek4010_checkLimits(cr, cr2); - tube_drawCharacter(cr,cr2, ch); - todo-= 2; - } - break; - } - break; - default: if (DEBUG) printf("Illegal mode - this is a tek4010decoder error and should not happen\n"); - break; - } - endDo:; - } - while ((todo > 0) && ((tube_mSeconds() - startPaintTime) < refresh_interval)); - - // display cursor - - if (showCursor && (tube_isInput() == 0)) tube_doCursor(cr2); - -} diff --git a/RPi5/tube.c b/RPi5/tube.c deleted file mode 100755 index 9a2c3c6..0000000 --- a/RPi5/tube.c +++ /dev/null @@ -1,922 +0,0 @@ -/* - * tube.c - * - * A tek4010/4014 graphics emulator - * - * Copyright 2019 rricharz - * - * https://github.com/rricharz/Tek4010 - * - * 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; either version 2 of the License, or - * (at your option) any later version. - * - * 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 - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. - * - */ - -#define DEBUG 0 // print debug info -#define DEBUGMAX 0 // exit after DEBUGMAX chars, 0 means no exit - -#define WRITE_TROUGH_INTENSITY 0.5 // green only -#define NORMAL_INTENSITY 0.7 -#define CURSOR_INTENSITY 0.7 -#define BRIGHT_SPOT_COLOR 1.0 -#define BRIGHT_SPOT_COLOR_HALF 0.6 -#define BLACK_COLOR 0.08 // effect of flood gun -#define FADE 0.3 // lower value means slower fading - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -// Cygwin defines FIONREAD in . #26 -#ifndef FIONREAD -#include -#endif - -#include "main.h" -#include "tube.h" - -extern void gtk_main_quit(); -extern int windowWidth; -extern int windowHeight; -extern char *windowName; - - -// variables for APL keycode translator -#define MAXKEYCODES 256 -struct keyCode { - int inputCode; - int outputCode; -}; - -struct keyCode keyTable[MAXKEYCODES]; - -int argNoexit = 0; // options -int argRaw = 0; -int argBaud = 19200; -int argTab1 = 0; -int argFull = 0; -int argFullV = 0; -int argARDS = 0; -int argAPL = 0; -int argAutoClear = 0; -int argKeepSize = 0; -int argHideCursor = 0; -int argWait = 0; - -int refresh_interval; // after this time in msec next refresh is done - -int showCursor; // set of cursor is shown (not set in graphics mode) -int isBrightSpot = 0; // set if there is currently a bright spot on the screen - -int xlast, ylast; - -enum LineType ltype; -double dashset[] = {2,6,2,2,6,3,3,3,6,6}; - -int plotPointMode = 0; // plot point mode -int writeThroughMode = 0; // write through mode -int isGinMode = 0; // set if GIN mode is active -int isGinSuppress = 0; // suppressing characters after GIN. -int tube_doClearPersistent; - -int specialPlotMode = 0; -int defocussed = 0; -int intensity = 100; -int aplMode = 0; - -int tube_x0, tube_x2,tube_y0, tube_y2; - -double pensize = 1.0; - -static int debugCount = 0; - -long refreshCount = 0; // variables for baud rate and refresh rate measurements - -static long charCount = 0; -static long charResetCount = 0; -static long characterInterval = 0; -static int currentFontSize = 18; -static int currentCharacterOffset = 0; - -long startPaintTime; -long firstWait; - -int leftmargin; - -int hDotsPerChar; -int vDotsPerChar; - -FILE *getData; -int getDataPipe[2]; - -FILE *putKeys; -int putKeysPipe[2]; - -long tube_mSeconds() -// return time in msec since start of program -{ - static int initialized = 0; - static long startTime; - struct timeval tv; - gettimeofday(&tv,NULL); - long t = (1000 * tv.tv_sec) + (tv.tv_usec/1000); - if (!initialized) startTime = t; - initialized = 1; - t = t - startTime; - if (t < 0) t += 86400000; - return t; -} - -long tube_u100ResetSeconds(int reset) -// returns time in 100 usec since last reset -{ - static long startTime; - struct timeval tv; - gettimeofday(&tv,NULL); - long t = (10000 * tv.tv_sec) + (tv.tv_usec/100); - if (reset) { - startTime = t; - charResetCount = 0; - } - t = t - startTime; - if (t < 0) t += 864000000; - return t; -} - -int tube_isInput() -// is char available on getDataPipe? -{ - int bytesWaiting; - if (isGinMode) - // delay any input from host during GIN mode - // this allows to test .plt files with GIN mode - return 0; - ioctl(getDataPipe[0], FIONREAD, &bytesWaiting); - if (DEBUG) { - debugCount++; - if (DEBUGMAX && (debugCount > DEBUGMAX)) return 0; - } - if (bytesWaiting == 0) { - // reset the baud rate counter - // without this, baud rate goal would not work after waiting for chars - tube_u100ResetSeconds(1); - } - return bytesWaiting; -} - -int tube_getInputChar() -// get a char from getDataPipe, if available, otherwise return -1 -{ - static long lastTime = 0; - - long t = tube_u100ResetSeconds(0); - if (tube_isInput()) { - // handle baud rate since last no input available - if (t < charResetCount * characterInterval) - return -1; // there is time to refresh the screen - int c = getc(getData) & 0x7F; - charCount++; - charResetCount++; - lastTime = t; - return c; - } - else - return -1; -} - -void checkFont(char *fontName) -// check whether font has been installed -{ -#define MAXL 255 - FILE *f; - int i, ch; - char line[MAXL]; - sprintf(line,"fc-list \'%s\'", fontName); // prepare system call - f = popen(line, "r"); - if (f != NULL) { - i = 0; - line[0] = 0; - while (((ch=fgetc(f))!=EOF) && (i 0) { - pclose(f); - return; - } - } - pclose(f); - printf("Error: APL font \'%s\' not installed. This font is required for the APL mode.\n", fontName); - printf("See github.com/rricharz/tek4010 paragraph \'APL mode\'\n"); - exit(1); -} - -void readKeyTranslationTable() -// read keyboard translation table from ~/.tekaplkeys -{ - FILE *confFile; - int code1, code2, i; - char *homedir = getpwuid(getuid())->pw_dir; - char s[255]; - - memset(keyTable, 0, sizeof(keyTable)); - - strcpy(s, homedir); - strcat(s, "/.tek4010conf/aplkeys" ); - // printf("Looking for conf file %s\n",s); - confFile = fopen(s,"r"); - if (confFile) { - // printf("confFile open\n"); - i = 0; - while (!feof(confFile)) { - if (fscanf(confFile, "%d %d\n", &code1, & code2) == 2) { - // printf("%d %d\n", code1, code2); - keyTable[i].inputCode = code1; - keyTable[i].outputCode = code2; - i++; - if (i >= MAXKEYCODES) { - printf("Error: APL key code table too large, max %d entries\n",MAXKEYCODES); - fclose(confFile); - exit(1); - } - } - else - fscanf(confFile,"%s\n",s); // skip comment line - } - fclose(confFile); - } -} - -int tube_translateKeyCode(int ch) -{ - int i = 0; - // printf("TranslateKeyCode %d ", ch); - while ((i < MAXKEYCODES) && (keyTable[i].inputCode != 0)) { - if (keyTable[i].inputCode == ch) { - // printf("%d\n", keyTable[i].outputCode); - return keyTable[i].outputCode; - } - i++; - } - printf("\n"); - return ch; -} - -void tube_init(int argc, char* argv[]) -// put any code here to initialize the tek4010 -{ - char *argv2[20]; - size_t bufsize = 127; - int firstArg = 1; - printf("tek4010 version 1.8\n"); - windowName = "Tektronix 4010/4014 emulator"; - if ((argc<2) || (argc>19)) { - printf("Error:number of arguments\n"); - exit(1); - } - - // this stays here for compatibility with early versions of tek4010 - if (strcmp(argv[argc-1],"-noexit") == 0) { - argNoexit = 1; - argc--; - } - - while ((argv[firstArg][0] == '-') && (firstArg < argc-1)) { - if (strcmp(argv[firstArg],"-raw") == 0) - argRaw = 1; - else if (strcmp(argv[firstArg],"-noexit") == 0) - argNoexit = 1; - else if (strcmp(argv[firstArg],"-b100000") == 0) - argBaud = 100000; - else if (strcmp(argv[firstArg],"-b38400") == 0) - argBaud = 38400; - else if (strcmp(argv[firstArg],"-b19200") == 0) - argBaud = 19200; - else if (strcmp(argv[firstArg],"-b9600") == 0) - argBaud = 9600; - else if (strcmp(argv[firstArg],"-b4800") == 0) - argBaud = 4800; - else if (strcmp(argv[firstArg],"-b2400") == 0) - argBaud = 2400; - else if (strcmp(argv[firstArg],"-b1200") == 0) - argBaud = 1200; - else if (strcmp(argv[firstArg],"-b600") == 0) - argBaud = 600; - else if (strcmp(argv[firstArg],"-b300") == 0) - argBaud = 300; - else if (strcmp(argv[firstArg],"-tab1") == 0) - argTab1 = 1; - else if (strcmp(argv[firstArg],"-full") == 0) - argFull = 1; - else if (strcmp(argv[firstArg],"-fullv") == 0) - argFullV = 1; - else if (strcmp(argv[firstArg],"-autoClear") == 0) - argAutoClear = 1; - else if (strcmp(argv[firstArg],"-keepsize") == 0) - argKeepSize = 1; - else if (strcmp(argv[firstArg],"-hidecursor") == 0) - argHideCursor = 1; - else if (strcmp(argv[firstArg],"-APL") == 0) { - argAPL = 1; - windowName = "Tektronix 4013/4015 emulator (APL)"; - checkFont(APL_FONT); - readKeyTranslationTable(); - } - else if (strcmp(argv[firstArg],"-ARDS") == 0) { - argARDS = 1; - windowName = "ARDS emulator"; - } - else if (strcmp(argv[firstArg],"-wait") == 0) { - argWait = 3; - if (firstArg < argc-2) { - if ((argv[firstArg+1][0] >= '0') && - (argv[firstArg+1][0] <= '9')) { - firstArg++; - argWait = atoi(argv[firstArg]); - } - } - // printf("Waiting %d seconds after end of plot\n", argWait); - } - else { - printf("tek4010: unknown argument %s\n", argv[firstArg]); - exit(1); - } - firstArg++; - - } - - // A child process for rsh is forked and communication - // between parent and child are established - - // expand argv[firstArg] to full path and check, whether it exists - char *str = (char *) malloc(bufsize * sizeof(char)); - if (str == NULL) { - printf("Cannot allocate memory for absolute path\n"); - exit(1); - } - strcpy(str,"which "); - strcat(str, argv[firstArg]); - FILE *fullPath = popen(str,"r"); - if (fullPath) { - getline(&str, &bufsize,fullPath); - - // remove the endline character - str[strlen(str)-1] = 0; - - if (strncmp(str,"which",5) == 0) { - printf("Unknown command %s\n", argv[firstArg]); - exit(1); - } - - argv[firstArg] = str; - pclose(fullPath); - } - else { - printf("Unknown command %s\n", argv[firstArg]); - exit(1); - } - - characterInterval = 100000 / argBaud; // in 100 usecs, assuming 1 start and 1 stop bit. - - if (DEBUG) printf("character_interval = %0.1f msec\n",(double)characterInterval/10.0); - - tube_doClearPersistent = 1; - - // create pipes for communication between parent and child - if (pipe(getDataPipe) == -1) { - printf("Cannot initialize data pipe\n"); - exit(1); - } - - if (pipe(putKeysPipe) == -1) { - printf("Cannot initialize key pipe\n"); - exit(1); - } - - // now fork a child process - pid_t pid = fork(); - if (pid == -1) { - printf("Cannot fork child process\n"); - exit(1); - } - else if (pid == 0) { // child process - - // we need a second string array with an empty string as last item! - argv2[0] = argv[firstArg]; - for (int i = 1; i < argc; i++) - argv2[i] = argv[firstArg+i-1]; - argv2[argc-firstArg+1] = (char*) NULL; - - // int i = 0; - // do { - // printf("argv2[%d] = %s\n",i,argv2[i]); - // i++; - // } - // while (argv2[i] != (char*) NULL); - - // set stdout of child process to getDataPipe - while ((dup2(getDataPipe[1], STDOUT_FILENO) == -1) && (errno == EINTR)) {} - close(getDataPipe[1]); // not used anymore - close(getDataPipe[0]); // not used - - // set stdin of child process to putKeysPipe - while ((dup2(putKeysPipe[0], STDIN_FILENO) == -1) && (errno == EINTR)) {} - close(putKeysPipe[1]); // not used - close(putKeysPipe[0]); // not used anymore - - // run rsh in the child process - execv(argv2[0],argv2+1); - free(str); - exit(0); - } - - // parent process - - free(str); - - close(getDataPipe[1]); // not used - close(putKeysPipe[0]); // not used - - // use termios to turn off line buffering for both pipes - // struct termios term; - // tcgetattr(getDataPipe[0], &term); - // term.c_lflag &= ~ICANON ; - // tcsetattr(getDataPipe[0], TCSANOW,&term); - // tcgetattr(putKeysPipe[1], &term); - // tcsetattr(putKeysPipe[0], TCSANOW,&term); - - // open now a stream from the getDataPipe descriptor - getData = fdopen(getDataPipe[0],"r"); - if (getData == 0) { - printf("Parent: Cannot open input stream\n"); - exit(1); - } - setbuf(getData,0); - - // open now a stream from the putKeysPipe descriptor - putKeys = fdopen(putKeysPipe[1],"w"); - if (putKeys == 0) { - printf("Parent: Cannot open output stream\n"); - exit(1); - } - setbuf(putKeys,0); - - tube_mSeconds(); // initialize the timer - tube_u100ResetSeconds(1); -} - -int tube_on_timer_event() -// if TIMER_INTERVAL in tek4010.h is larger than zero, this function -// is called every TIMER-INTERVAL milliseconds -// if the function returns 1, the window is redrawn by calling applicatin_draw -{ - // if there is a char available on the imput stream - // or there is still a bright spot, return 1 to ask for - // one more redraw - - // is child process still running? - - int status; - if (argWait && (tube_isInput() == 0) && (waitpid(-1, &status, WNOHANG))) { - if (firstWait == 0) - firstWait = tube_mSeconds(); - else { - if ((int)((tube_mSeconds() - firstWait) / 1000) > argWait) { - tube_quit(); - gtk_main_quit(); - printf("Process has been terminated after %d seconds\n", argWait); - exit(0); - } - } - } - else if ((!argNoexit) && (tube_isInput() == 0) && (waitpid(-1, &status, WNOHANG))) { - long t = tube_mSeconds(); - // printf("Execution time: %0.3f sec\n", (double)t/1000.0); - // if (t > 0) { - // printf("Average screen refresh rate: %0.1f Hz\n",(double)(1000.0*refreshCount)/t); - // printf("Average character rate: %0.0f baud\n",(double)(8000.0*charCount)/t); - // } - tube_quit(); - gtk_main_quit(); - printf("Process has been terminated\n"); - exit(0); - } - return (isBrightSpot || tube_isInput()); -} - -int tube_clicked(int button, int x, int y) -// is called if a mouse button is clicked in the window -// button = 1: means left mouse button; button = 3 means right mouse button -// x and y are the coordinates -// if the function returns 1, the window is redrawn by calling applicatin_draw -{ - if (argARDS) return 0; - if (button == 1) { - tek4010_clicked(x, windowHeight - y); - return 1; - } - return 0; -} - -void tube_quit() -// is called if the main window is quit bevore the tek4010 exits -// put any code here which needs to be called on exit -{ - pclose(getData); - system("pkill rs232-console"); -} - -void tube_doCursor(cairo_t *cr2) -{ - cairo_set_source_rgb(cr2, 0, CURSOR_INTENSITY, 0); - cairo_set_line_width (cr2, 1); - cairo_rectangle(cr2, tube_x0, windowHeight - tube_y0 - vDotsPerChar + 6 + currentCharacterOffset, - hDotsPerChar - 3, vDotsPerChar - 3); - cairo_fill(cr2); - cairo_stroke (cr2); -} - -void tube_clearPersistent(cairo_t *cr, cairo_t *cr2) -// clear the persistant surface -// flash using the second surface -{ - cairo_set_source_rgb(cr, 0.0, BLACK_COLOR, 0.0); - cairo_paint(cr); - tube_doClearPersistent = 0; - tube_x0 = 0; - tube_y0 = windowHeight - vDotsPerChar; - tube_x2 = tube_x0; - tube_y2 = tube_y0; - leftmargin = 0; - cairo_set_source_rgb(cr, 0, NORMAL_INTENSITY, 0); - cairo_set_source_rgb(cr2, 0, BRIGHT_SPOT_COLOR / 2, 0); - cairo_paint(cr2); - isBrightSpot = 1; - plotPointMode = 0; - ltype = SOLID; - xlast = 0; - ylast = 0; - specialPlotMode = 0; - defocussed = 0; - intensity = 100; -} - -void tube_clearSecond(cairo_t *cr2) -// clear second surface -{ - cairo_set_source_rgba(cr2, 0, 0, 0, FADE); - cairo_set_operator(cr2, CAIRO_OPERATOR_MULTIPLY); - cairo_paint(cr2); - cairo_set_operator(cr2, CAIRO_OPERATOR_OVER); - isBrightSpot = 1; -} - -void tube_line_type(cairo_t *cr, cairo_t *cr2, enum LineType ln) -{ - int ndash,ndx; - double ofs = 0.5; - - switch (ln) { - case SOLID: - ndx = 0; - ndash = 0; - break; - case DOTTED: - ndx = 0; - ndash = 2; - break; - case DOTDASH: - ndx = 2; - ndash = 4; - break; - case LONGDASH: - ndx = 8; - ndash = 2; - break; - case SHORTDASH: - ndx = 6; - ndash = 2; - break; - } - cairo_set_dash (cr,&dashset[ndx],ndash,ofs); - cairo_set_dash (cr2,&dashset[ndx],ndash,ofs); -} - -void tube_drawCharacter(cairo_t *cr, cairo_t *cr2, char ch) -{ - char s[8]; - - if (ch < 32) return; // non printable control character - - if (aplMode) { - switch (ch) { - case 32: sprintf(s," "); - break; - case 33: sprintf(s,"\u00A8"); - break; - case 34: sprintf(s,")"); - break; - case 35: sprintf(s,"<"); - break; - case 36: sprintf(s,"\u2264"); - break; - case 37: sprintf(s,"="); - break; - case 38: sprintf(s,">"); - break; - case 39: sprintf(s,"]"); - break; - case 40: sprintf(s,"\u2228"); - break; - case 41: sprintf(s,"\u2227"); - break; - case 42: sprintf(s,"\u2260"); - break; - case 43: sprintf(s,"\u00F7"); - break; - case 44: sprintf(s,","); - break; - case 45: sprintf(s,"+"); - break; - case 46: sprintf(s,"."); - break; - case 47: sprintf(s,"/"); - break; - - // 48 - 57: Digits - - case 58: sprintf(s,"("); - break; - case 59: sprintf(s,"["); - break; - case 60: sprintf(s,";"); - break; - case 61: sprintf(s,"\u00D7"); - break; - case 62: sprintf(s,":"); - break; - case 63: sprintf(s,"\\"); - break; - case 64: sprintf(s,"\u00AF"); - break; - case 65: sprintf(s,"\u237A"); - break; - case 66: sprintf(s,"\u22A5"); - break; - case 67: sprintf(s,"\u2229"); - break; - case 68: sprintf(s,"\u230A"); - break; - case 69: sprintf(s,"\u220A"); - break; - case 70: sprintf(s,"_"); - break; - case 71: sprintf(s,"\u2207"); - break; - case 72: sprintf(s,"\u2206"); - break; - case 73: sprintf(s,"\u2373"); - break; - case 74: sprintf(s,"\u2218"); - break; - case 75: sprintf(s,"'"); - break; - case 76: sprintf(s,"\u2395"); - break; - case 77: sprintf(s,"\u2223"); - break; - case 78: sprintf(s,"\u22A4"); - break; - case 79: sprintf(s,"\u25CB"); - break; - - case 80: sprintf(s,"\u22c6"); - break; - case 81: sprintf(s,"?"); - break; - case 82: sprintf(s,"\u2374"); - break; - case 83: sprintf(s,"\u2308"); - break; - case 84: sprintf(s,"\u223C"); - break; - case 85: sprintf(s,"\u2193"); - break; - case 86: sprintf(s,"\u222A"); - break; - case 87: sprintf(s,"\u03C9"); - break; - case 88: sprintf(s,"\u2283"); - break; - case 89: sprintf(s,"\u2191"); - break; - case 90: sprintf(s,"\u2282"); - break; - case 91: sprintf(s,"\u2190"); - break; - case 92: sprintf(s,"\u22A2"); - break; - case 93: sprintf(s,"\u2192"); - break; - case 94: sprintf(s,"\u2265"); - break; - case 95: sprintf(s,"-"); - break; - case 96: sprintf(s,"\u22C4"); - break; - - // 97 - 122 capital letters - - case 123: sprintf(s,"{"); - break; - case 124: sprintf(s,"\u22A3"); - break; - case 125: sprintf(s,"}"); - break; - case 126: sprintf(s,"$"); - break; - - default: if ((ch>=48) && (ch<=57)) sprintf(s,"%c", ch); // digits - else if ((ch>=97) && (ch<=122)) sprintf(s,"%c", ch - 32); // capital letters - else sprintf(s," "); - break; - } - } - else { - s[0] = ch; - s[1] = 0; - } - cairo_set_font_size(cr, currentFontSize); - cairo_set_font_size(cr2,currentFontSize); - - if (writeThroughMode) { // draw the write-through character - cairo_set_source_rgb(cr2, 0, WRITE_TROUGH_INTENSITY, 0); - cairo_move_to(cr2, tube_x0, windowHeight - tube_y0 + currentCharacterOffset); - cairo_show_text(cr2, s); - } - - else { - // draw the character - cairo_set_source_rgb(cr, 0, BLACK_COLOR + ((NORMAL_INTENSITY - BLACK_COLOR) * intensity) / 100, 0); - cairo_move_to(cr, tube_x0, windowHeight - tube_y0 + currentCharacterOffset); - cairo_show_text(cr, s); - - // draw the bright spot - cairo_set_source_rgb(cr2, 0, BRIGHT_SPOT_COLOR, 0); - cairo_move_to(cr2, tube_x0, windowHeight - tube_y0 + currentCharacterOffset); - cairo_show_text(cr2, s); - } - - tube_x0 += hDotsPerChar; - isBrightSpot = 1; -} - -void tube_emulateDeflectionTime() -{ - // find length of longer component - int l = tube_x2 - tube_x0; - if ((tube_x0-tube_x2) > l) l = tube_x0 - tube_x2; - if ((tube_y2-tube_y0) > l) l = tube_y2 - tube_y0; - if ((tube_y0-tube_y2) > l) l = tube_y0 - tube_y2; - if (l > 300) { // the 300 accounts for other overheads - usleep((l - 300) * 2); // roughly 2 usec per dot - } -} - -void tube_drawPoint(cairo_t *cr, cairo_t *cr2) -{ -#define PI2 6.283185307 - int i1; - cairo_set_line_width (cr, pensize + defocussed); - cairo_set_source_rgb(cr, 0, BLACK_COLOR + ((1.0 - BLACK_COLOR) * intensity) / 100, 0); - cairo_move_to(cr, tube_x2, windowHeight - tube_y2); - cairo_line_to(cr, tube_x2 + 1, windowHeight - tube_y2 + 1); - cairo_stroke (cr); - - // speed is a problem here - // do not draw adjacent bright spots - - if (((tube_x2 - xlast) > 2) || ((xlast - tube_x2) > 2) || - ((tube_y2 - ylast) > 2) || ((ylast - tube_y2) > 2)) { - - // draw the bright spot - cairo_set_line_width (cr2, 0.1); - double bsc = (BRIGHT_SPOT_COLOR * intensity) / 100; - - cairo_set_source_rgb(cr2, 0, bsc, 0); - cairo_arc(cr2, tube_x2, windowHeight - tube_y2, 2 + defocussed, 0, PI2); - cairo_fill(cr2); - - xlast = tube_x2; - ylast = tube_y2; - } - - isBrightSpot = 1; -} - -void tube_crosshair(cairo_t *cr, cairo_t *cr2) -{ - // printf("crosshair at %d,%d\n", tube_x0, tube_y0); - cairo_set_line_width (cr2, 1); - cairo_set_source_rgb(cr2, 0.0, WRITE_TROUGH_INTENSITY, 0.0); - cairo_move_to(cr2, tube_x0, 0); - cairo_line_to(cr2, tube_x0, windowHeight); - cairo_move_to(cr2, 0, windowHeight - tube_y0); - cairo_line_to(cr2, windowWidth, windowHeight - tube_y0); - cairo_stroke (cr2); -} - -void tube_drawVector(cairo_t *cr, cairo_t *cr2) -{ - if (DEBUG) { - printf("********************************************"); - printf("Drawing from (%d,%d) to (%d,%d), writethrough = %d\n", - tube_x0, tube_y0, tube_x2, tube_y2, writeThroughMode); - } - tube_emulateDeflectionTime(); - - if ((tube_x2 == tube_x0) && (tube_y2 == tube_y0)) tube_x0++; // cairo cannot draw a dot - - if (writeThroughMode) { - cairo_set_line_width (cr2, pensize + 1); - cairo_set_source_rgb(cr2, 0.0, WRITE_TROUGH_INTENSITY, 0.0); - cairo_move_to(cr2, tube_x0, windowHeight - tube_y0); - cairo_line_to(cr2, tube_x2, windowHeight - tube_y2); - cairo_stroke (cr2); - } - - else { - // draw the actual vector on permanent surface - cairo_set_line_width (cr, pensize + defocussed); - cairo_set_source_rgb(cr, 0, BLACK_COLOR + ((NORMAL_INTENSITY - BLACK_COLOR) * intensity) / 100, 0); - tube_line_type(cr, cr2, ltype); - cairo_move_to(cr, tube_x0, windowHeight - tube_y0); - cairo_line_to(cr, tube_x2, windowHeight - tube_y2); - cairo_stroke (cr); - - - // draw the bright spot, high intensity - cairo_set_line_width (cr, (pensize+1) + defocussed); - cairo_set_source_rgb(cr2, 0, BRIGHT_SPOT_COLOR, 0); - cairo_move_to(cr2, tube_x0, windowHeight - tube_y0); - cairo_line_to(cr2, tube_x2, windowHeight - tube_y2); - cairo_stroke(cr2); - } - - isBrightSpot = 1; // also to be set if writeThroughMode -} - -void tube_setupPainting(cairo_t *cr, cairo_t *cr2, char *fontName) -{ - cairo_set_antialias(cr, CAIRO_ANTIALIAS_BEST); - cairo_set_line_width (cr, pensize); - cairo_set_source_rgb(cr, 0, NORMAL_INTENSITY, 0); - cairo_select_font_face(cr, fontName, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - cairo_select_font_face(cr2, fontName, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); -} - -void tube_changeCharacterSize(cairo_t *cr, cairo_t *cr2,int charsPerLine, int charsPerPage, double fontSize) -{ - cairo_font_extents_t et; - hDotsPerChar = windowWidth / charsPerLine; - vDotsPerChar = windowHeight / charsPerPage; - leftmargin = 0; - if (argARDS) { - currentFontSize = (int) (fontSize * APL_FONT_SIZE); - } - else { - currentFontSize = (int) (fontSize * STANDARD_FONT_SIZE); - } - cairo_set_font_size(cr, currentFontSize); - cairo_set_font_size(cr2,currentFontSize); - if (argARDS) { - cairo_font_extents(cr, &et); - currentCharacterOffset =(int)et.ascent; - if (DEBUG) printf("Set vertical character offset for ARDS mode to %d\n", currentCharacterOffset); - } - else - currentCharacterOffset = 0; -} diff --git a/RPi5/tube.h b/RPi5/tube.h deleted file mode 100755 index 6f83fa8..0000000 --- a/RPi5/tube.h +++ /dev/null @@ -1,62 +0,0 @@ -// tube.h - -// fonts -#define STANDARD_FONT "Monospace" -#define STANDARD_FONT_SIZE 18.0 -#define APL_FONT "APL385 Unicode" -#define APL_FONT_SIZE 20.0 - -enum LineType {SOLID,DOTTED,DOTDASH,SHORTDASH,LONGDASH}; -extern enum LineType ltype; - -extern int tube_doClearPersistent; -extern int windowWidth; -extern int windowHeight; - -extern int argFull; -extern int argTab1; -extern int argRaw; -extern int argAPL; -extern int argAutoClear; -extern int argKeepSize; -extern int argHideCursor; -extern int argWait; - -extern int hDotsPerChar; -extern int vDotsPerChar; - -extern int refresh_interval; // after this time in msec next refresh is done -extern long refreshCount; - -extern int showCursor; // set of cursor is shown (not set in graphics mode) -extern int isBrightSpot; // set if there is currently a bright spot on the screen -extern int isGinMode; // set if GIN mode is active -extern int isGinSuppress; // set if suppressing echoed chars in/after GIN. - -extern int specialPlotMode; -extern int defocussed; -extern int intensity; -extern int aplMode; - -extern int plotPointMode; -extern int writeThroughMode; - -extern int tube_x0, tube_x2, tube_y0, tube_y2; - -extern double pensize; - -extern long tube_mSeconds(); -extern long tube_u100ResetSeconds(int reset); -extern int tube_translateKeyCode(int ch); -extern void tube_doCursor(cairo_t *cr2); -extern void tube_clearPersistent(cairo_t *cr, cairo_t *cr2); -extern void tube_clearSecond(cairo_t *cr2); -extern int tube_isInput(); -extern int tube_getInputChar(); -extern void tube_emulateDeflectionTime(); -extern void tube_crosshair(cairo_t *cr, cairo_t *cr2); -extern void tube_drawVector(cairo_t *cr, cairo_t *cr2); -extern void tube_drawCharacter(cairo_t *cr, cairo_t *cr2, char ch); -extern void tube_drawPoint(cairo_t *cr, cairo_t *cr2); -extern void tube_setupPainting(cairo_t *cr, cairo_t *cr2, char *fontName); -extern void tube_changeCharacterSize(cairo_t *cr, cairo_t *cr2, int charsPerLine, int charsPerPage, double fontSize); diff --git a/install b/install index aa4c030..9629f41 100755 --- a/install +++ b/install @@ -7,5 +7,5 @@ cp tek4010 ~/bin chmod +x ~/bin/tek4010 -echo "tek4010 version 1.7 installed." +echo "tek4010 installed." echo "Reboot if this is the first time tek4010 is installed" diff --git a/src/ards.c b/src/ards.c index 1c43609..e9e040a 100755 --- a/src/ards.c +++ b/src/ards.c @@ -88,7 +88,7 @@ void ards_draw(cairo_t *cr, cairo_t *cr2, int first) first = 0; efactor = windowWidth / 1080.0; // fprintf (stderr, "efactor: %0.2f\n", efactor); - refresh_interval = 30; + refresh_interval = 50; tube_changeCharacterSize(cr, cr2, 80, 50, efactor * 1.1); } diff --git a/src/main.c b/src/main.c index 24793c2..331bf89 100644 --- a/src/main.c +++ b/src/main.c @@ -140,8 +140,10 @@ static void do_drawing(cairo_t *cr, GtkWidget *widget) cairo_set_source_surface(cr, permanent_surface, windowWidthOffset, windowHeightOffset); cairo_paint(cr); - cairo_set_source_surface(cr, temporary_surface, windowWidthOffset, windowHeightOffset); + cairo_set_operator(cr, CAIRO_OPERATOR_LIGHTEN); + cairo_set_source_surface(cr, temporary_surface, windowWidthOffset, windowHeightOffset); cairo_paint(cr); + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_destroy(permanent_cr); cairo_destroy(temporary_cr); diff --git a/src/tek4010.c b/src/tek4010.c index 89eeced..d22ae4c 100755 --- a/src/tek4010.c +++ b/src/tek4010.c @@ -27,7 +27,7 @@ #define DEBUG 0 // print debug info -#define TODO (long)(16) // draw multiple objects until screen updates +#define TODO (long)(32) // draw multiple objects until screen updates #define _GNU_SOURCE @@ -350,7 +350,7 @@ void tek4010_draw(cairo_t *cr, cairo_t *cr2, int first) if (first) { first = 0; efactor = windowWidth / 1024.0; - refresh_interval = 30; + refresh_interval = 50; tube_changeCharacterSize(cr, cr2, 74, 35, efactor); if (efactor > 0.8) pensize = efactor * 1.25; if (windowWidth != 1024) printf("Scaling: %0.3f\n", efactor / 4.0); diff --git a/src/tube.c b/src/tube.c index eecba77..9a2c3c6 100755 --- a/src/tube.c +++ b/src/tube.c @@ -28,11 +28,12 @@ #define DEBUGMAX 0 // exit after DEBUGMAX chars, 0 means no exit #define WRITE_TROUGH_INTENSITY 0.5 // green only -#define NORMAL_INTENSITY 0.75 -#define CURSOR_INTENSITY 0.75 +#define NORMAL_INTENSITY 0.7 +#define CURSOR_INTENSITY 0.7 #define BRIGHT_SPOT_COLOR 1.0 #define BRIGHT_SPOT_COLOR_HALF 0.6 #define BLACK_COLOR 0.08 // effect of flood gun +#define FADE 0.3 // lower value means slower fading #define _GNU_SOURCE @@ -290,7 +291,7 @@ void tube_init(int argc, char* argv[]) char *argv2[20]; size_t bufsize = 127; int firstArg = 1; - printf("tek4010 version 1.7\n"); + printf("tek4010 version 1.8\n"); windowName = "Tektronix 4010/4014 emulator"; if ((argc<2) || (argc>19)) { printf("Error:number of arguments\n"); @@ -571,7 +572,7 @@ void tube_clearPersistent(cairo_t *cr, cairo_t *cr2) tube_y2 = tube_y0; leftmargin = 0; cairo_set_source_rgb(cr, 0, NORMAL_INTENSITY, 0); - cairo_set_source_rgb(cr2, 0, BRIGHT_SPOT_COLOR, 0); + cairo_set_source_rgb(cr2, 0, BRIGHT_SPOT_COLOR / 2, 0); cairo_paint(cr2); isBrightSpot = 1; plotPointMode = 0; @@ -586,10 +587,11 @@ void tube_clearPersistent(cairo_t *cr, cairo_t *cr2) void tube_clearSecond(cairo_t *cr2) // clear second surface { - cairo_set_source_rgba(cr2, 0, 0, 0, 0); - cairo_set_operator(cr2, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba(cr2, 0, 0, 0, FADE); + cairo_set_operator(cr2, CAIRO_OPERATOR_MULTIPLY); cairo_paint(cr2); cairo_set_operator(cr2, CAIRO_OPERATOR_OVER); + isBrightSpot = 1; } void tube_line_type(cairo_t *cr, cairo_t *cr2, enum LineType ln) @@ -825,7 +827,7 @@ void tube_drawPoint(cairo_t *cr, cairo_t *cr2) double bsc = (BRIGHT_SPOT_COLOR * intensity) / 100; cairo_set_source_rgb(cr2, 0, bsc, 0); - cairo_arc(cr2, tube_x2, windowHeight - tube_y2, 1 + defocussed, 0, PI2); + cairo_arc(cr2, tube_x2, windowHeight - tube_y2, 2 + defocussed, 0, PI2); cairo_fill(cr2); xlast = tube_x2; @@ -874,11 +876,11 @@ void tube_drawVector(cairo_t *cr, cairo_t *cr2) cairo_move_to(cr, tube_x0, windowHeight - tube_y0); cairo_line_to(cr, tube_x2, windowHeight - tube_y2); cairo_stroke (cr); - + + // draw the bright spot, high intensity - // cairo_set_line_width (cr2, pensize + 2 + 2 * defocussed); - double bsc = (BRIGHT_SPOT_COLOR * intensity) / 100; - cairo_set_source_rgb(cr2, 0, bsc, 0); + cairo_set_line_width (cr, (pensize+1) + defocussed); + cairo_set_source_rgb(cr2, 0, BRIGHT_SPOT_COLOR, 0); cairo_move_to(cr2, tube_x0, windowHeight - tube_y0); cairo_line_to(cr2, tube_x2, windowHeight - tube_y2); cairo_stroke(cr2); diff --git a/versions.txt b/versions.txt index 3e0ff07..1fbdde7 100644 --- a/versions.txt +++ b/versions.txt @@ -1,3 +1,7 @@ +Version 1.8 March 4, 2024 +========================= +Improved bright spot with proper fading + Version 1.7 October 18, 2023 ============================ Added -wait n seconds as argument, staying alive n seconds after