From 5a81655dfaf5ffe9dcb900090ed4991ef5f0a7ac Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 4 Apr 2021 17:24:14 +0900 Subject: [PATCH] adding BMS display --- assets/4008_portable_full.png | Bin 2277 -> 2337 bytes assets/lcd.png | Bin 3741 -> 3758 bytes .../gdx/TextureRegionPack.kt | 100 ++++++++++++++++++ .../tsvm/peripheral/CharacterLCDdisplay.kt | 41 +++++++ 4 files changed, 141 insertions(+) create mode 100755 src/net/torvald/terrarumsansbitmap/gdx/TextureRegionPack.kt diff --git a/assets/4008_portable_full.png b/assets/4008_portable_full.png index 98b5f12542b32a9c06327c3292aea323b9185d7d..8c56bf9b9bbffb602846d697abfb9d34039330ea 100644 GIT binary patch delta 1080 zcmV-81jqa35up;07YZ&21^@s62b7P)u_2WKe^yCEK~#9!?cFhJ6JZ>{;Y$fBSW&T4 zEg1DHxQL*On}d^s^aB*3gB={4#K}QW1QGlI0ilRfaS=pO?BG{WD@3PC9pW6lA&}NI zce$i_@4b7TvDcdGKfTK@Z!WQsWa#d6dI}RUi~#^3 zZh{T~AaV^aw*r%Z0&GC5_6t3J`rN$=0F1P@x+3Vx9CGdUy1!BYpjKg5iJ(hkPRIcO zc@1_$6{5~HbN~Q?E-b5a06gwKfN+n+ z2s(dA06?XAQv{Q}11LoG2)eb^m1KGOhIODQNmdOIF|}KB0A{SU%d{x4@*mn$@z0<&7wrJ0B|l1uhHG<^!!PY_n_O{+zh%O z-EKGe@OC3vSU6=CC71<(b7?uah7JHAa)J(%0Rf7`puyGP?paM zG7A9bQb9+wwzq!;z5OyBbY=nITq@`Q0GJBb&;bAlIsgC!9RL7=4gf&V0RRxCrV#)D zF}ZN@>d>!${`97{Gx4z{06^3sC+q|r01#o!?Txmq?Sc+6o)z^EnyhC|g9lfh;nql7U09Ahs$~xbT^SxE#O%Y5KbJPC!^4`|8_i0x1Dbs!f#Aev4T-{gZ z`n)NE!Uxi*?fnC6)X!usmyi2>A!bo@#jNP|y|-&+4zQ>&`e*BMp0q*-07Sp2Q1pAN z!U`P|Jxj7els&6qGn#Ze01UE1$3)L`X7TcWXa5?BVb@B847MWsk`-?NP=pmaq70ET zty&G+m%P^wdeHas^Cc{T4ger>-V~Fq16Gr62oICG2p1GpGO5-p-3^xj0000{;XCN0iwU?W zF;z#6lZ!FY#f`zim}vL_EG!HROoWMn!NtW7Kte)@6LB#y8jTEo1(g9e3=Y+e)Rd%2 z#nQW83-7&m&odbh?C~$x{`&TMrb&j@;eI;-03et@M@MP*&zGmJC25-ev%S%7|KDrB zP=EapaR2}%aba?@x6RU%+b6^v06;wYwOZP{LMP?`0OD}*($%#4*6W0r0|1CmZ@V3@ z(1|$!fH-wl>L!c<03dFH4ger>sq4%E0L0A-9h0F5Rg;eb4@5xCHLCUly?FV`y$S#f zw74)Y=*k>&8yj1GO96mdgHgEI=@H& zK&AOm1e2i%C`I)My2XY0WNz-MdlCQ`TBjj8Eg|Rt00^p4g&(4~tT#5c+^Yb~a;QYA`9l3q| z_C1+>{5xcBM2 z=2NEq28d0+Rk^ya%ys!t1ceWzLEF0r*r4ypS}q^<>q5+;=!#j5<2xUMj$j8y zl@GYnK1N^kvMhoTsPl{ZqR$tuLkDMgunco46Eg&0(2LzNUfL=I|5F425M|5_vt7^u z0F*H5PE*HsJ_H>AP>Has^C>KX4ger>J`@3yk_dYgT|uwkLMR~c00000NkvXXu0mjf D%6H@p diff --git a/assets/lcd.png b/assets/lcd.png index 9c5e514b1def5b8a2d696168bd9433d025081ad2..736ab029ca54229d4f469d12cbb831957d31962e 100644 GIT binary patch delta 3568 zcmX9>dpwi-AOCK`FC2AZ)Jais!iuAmQby&HQk&S=)~MWaNx3E0O}(6oLnoIm2jhCbDPU{@Ozx!^Y8O~Kd<-a{dvFNpYM~iqhiOO`qU8rQ>SqL zUS0qgK8$$CIr|Ey`I?7mbt}4~Ua)%`bfg-m+3GBQS9H1*RmRq@b42U=*E>G^VqAYj zQ^!`@^UhjA#cjrIJ;U4glGkWVyEDh@jH*w^{I`2~W@v85l$G{$Nx1LFmLr#*sPpwT z-UkGq6U94h#>`*QDLlX`PYkD8CZ^8JovzW`WY)_FqYRGo8HW{Oty)=czo^d~4+-e1 z+#vaRQ)R)ky_j98p_Y0x8x)o|jtosQZ3fxu@D zpY&g3p}R61uBNouD>>@xoj9>A``u?f`~DYCYZlwYO$HfnUX5RWjy#`=Orm~ENh1|k z82hAzXJU4s%of+?s%xJ5Gh+-9;av9A*oJr9O&_2Nd5nl%b5L&@c`^GO_5OGB#dFa$ zrFN+a)9N>({`!!iFdCq}HNMu{L|6p&^NJC=+RZlVTN{;SeO%(9g^<+^-gQ6jPtjiO zxs)b)wVnDR!EbaW{l!%PKzbemMg8h%d&2eBz+{e9sJ?}oy^m1mwTUi2VUI(q&eDeL zp!&Lt4i~QZ3wFn2Xycz_p1#P{%C>4%{!?$MOG5o;Va1@?le)J2S+ce=X5AsBG}d+v zs7s{1@vc&rh1I@AtvH@wq);H2Nfk#g?F>j>UX`F#!y|YMx%>Vk;jDWem2qZcaaHt# zVaciaHFxG>t+FD}wE29DX+M=|!26}eql@hGyii5!+Fjw6nt1A*lhF8SMRVv9#pMi|=BNG;9j9m^N-lYV_|3DNZg+%Bw?VO4E zbpAw5y}%3)!y`5XQDdO#CR0s-19oaJFZ@owVmtP*ys1{UN>sdH#1O6a$|**i=)U&t z+kaL7|1_JHd`F)1U;A(|KU1-ebcuPu*2^|D0a&8I=r$X~XprKPY_eYi)|CV#;}5P!#|>Vh+%A$J-lU+L~}CYy*Guh+FbV~E7nNZlnZJDvGAGfP-kv6r67>AdUKcGD2hP9ln*ZN&ThTwZea zeEDE{%~G#yB@&@XEBqV_ZW%Xr-h)}3erQ^fTFVek-x@3$U@?N%s6+gVjHI6gf==Q_ zrKJRi@Y?5)RtZE3A)F{!8yUn%dya_ZP}WdC7xQIOR}=IQXmo?g3YJE9zjK>DC$`@& zJMMnGXW5z2Nl#6X`n}u)XFgcTAlgdGt-_wuZMdM(8Zb%f2gaC?#pq^3eXZ>L=?y)%(JV-rrY!5P|{&qW5#5yb|(7K@3i+ zx~@oX+o>vd4)zb;_Wt-MnCwR@P0zuNTBJ9YI8Q1NtQ1amOhw`4={ibVG!-V4X@w`& z?Q^SKZA>~;EK$CfenJUFZK*POH@^Z(KCE=~B;DFyDV^($Kr++(A`6}akZ07)a<677qb!GtMf&jXX)S{l}A7FT1@5qAf8!w-k;n00}SZ7ilU}9&9n5* z4k#Bj!8XnO3_Lz=0^KU+`?b~yqU)5p#E$s;T`e7W+}+N!{5oMGHa7%1-FHmh5Z?~r zx45Fju9HtZC_0K@$tm4Pc_+dx{j{rkb8kMdQJZ$c?O+#Mmsg%T ztkFEE9&iVl4{m51r1U!0^eKa)btRxl zUhQJS#hbbw@*An^im_4we(j)FHX{)HQSz;wEZ%H~`Z^_y;aRvz`Um+QiF!(4DM;%y zUT8&)Nn2u(TRDZ6yK*xx(HvFsJ5e*nuYY)pS0d+DSL{Z_84?B9Ry4m21YrkHl_ED_ zXI>Vnw~RNbY686$G9^D~{KMIP&@uB}CyGBaBy9}nIv%0*)4F14E8xZfSdS?| z*3DC5Mr=5qBMA)-j*PjF0QV5{RIRg8IfLgm*_<_y2gT#+`0|4)VA@&j9mP8S?=JHG zq(yxxx?pS*naMk=_HM^^TjpFYGd2Ql(a@&#E(4P6ta0+_+L@vV1%&!y^IVMxwbtyo zcqTFo1894d>Q#w~oUTTW8?hj%AZxN?;d=PZyIVnX0pQHO6g0(C2}g^KM>8x>_gjsM z7F#U=jaHXAS}~B*D`v#CP_!%ttU0K9*~K3wI9P?_N=H!tX0gz!#aY+#82aV0Jdd2@ z_mk<^j`KOu9tarv#s`8Y@_~7@zE>2)X?{i_xN}}89 zSb_;SAxO#} z5SL$g8Ib4zYizW~%%haCqninwmAGQtr~fm|df z7(KGE9v&R&kN?E=ED)_4f>A0G@f&~#(JW3UwCgcsr}6yfNe#sl+VyO8*poJ9q4+&< z1Lq9|M-k}com^_IC=?ah0B1J5`rnjS+#M0*URC>3`jmru&#tmAvV!;FZY7$B-Gw16 zcQ%W=R=og&Py;{-00poWfcDwHwq535Sc|uyNF|KfDQbCmd7k&+eI$Tk!0)fuyWM8Q zwFcN~&&|7tN_Is%Wl+Q$;nlN4!P`NUfpV8R9^?$1D|dzS_+L0Q1Zbwh{{Ssq z_0gi}+?Y=P--lKTp})QkMdF6?h9iGa#Wam)uY`a4Tr_y=(u2sq;TcvwM46|QyJYyp(*8cu>fWwb732+zmRZtFe2;n z{Gvx<>1+pAVz&}j(@sr50yA2>cE!$zk$FEQ5wL_DoELtI{$KJS&(eBe`y4#R2^?Uy z4f-T-#u$P}rN+PBH+HI-C0e^tN;j`NY_#)anfqi#esUGCYP6K==$%3o!G+$%8)2u;XtU!|TrFZ(6vZgHQ67?88y;PVb9; z8%~cdZr%6)TY}bjg;dV%tPI>FVYU5-B7yf#VaOOV%FhmB@<}G=y=U5fiwv}Yo%R&@ iQWxYB8*qSzUD8#xOS*meLQN%rA4j|MwiPEY-TohAW!+=| delta 3516 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 diff --git a/src/net/torvald/terrarumsansbitmap/gdx/TextureRegionPack.kt b/src/net/torvald/terrarumsansbitmap/gdx/TextureRegionPack.kt new file mode 100755 index 0000000..52a3e5a --- /dev/null +++ b/src/net/torvald/terrarumsansbitmap/gdx/TextureRegionPack.kt @@ -0,0 +1,100 @@ +/* + * Terrarum Sans Bitmap + * + * Copyright (c) 2017 Minjae Song (Torvald) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.torvald.terrarumsansbitmap.gdx + +import com.badlogic.gdx.files.FileHandle +import com.badlogic.gdx.graphics.Texture +import com.badlogic.gdx.graphics.g2d.TextureRegion +import com.badlogic.gdx.utils.Disposable + +/** + * Created by minjaesong on 2017-06-15. + */ +class TextureRegionPack( + val texture: Texture, + val tileW: Int, + val tileH: Int, + val hGap: Int = 0, + val vGap: Int = 0, + val hFrame: Int = 0, + val vFrame: Int = 0, + val xySwapped: Boolean = false // because Unicode chart does, duh +): Disposable { + + constructor(ref: String, tileW: Int, tileH: Int, hGap: Int = 0, vGap: Int = 0, hFrame: Int = 0, vFrame: Int = 0, xySwapped: Boolean = false) : + this(Texture(ref), tileW, tileH, hGap, vGap, hFrame, vFrame, xySwapped) + constructor(fileHandle: FileHandle, tileW: Int, tileH: Int, hGap: Int = 0, vGap: Int = 0, hFrame: Int = 0, vFrame: Int = 0, xySwapped: Boolean = false) : + this(Texture(fileHandle), tileW, tileH, hGap, vGap, hFrame, vFrame, xySwapped) + + companion object { + /** Intented for Y-down coord system, typically fon Non-GDX codebase */ + var globalFlipY = false + } + + val regions: Array + + val horizontalCount = (texture.width - 2 * hFrame + hGap) / (tileW + hGap) + val verticalCount = (texture.height - 2 * vFrame + vGap) / (tileH + vGap) + + init { + //println("texture: $texture, dim: ${texture.width} x ${texture.height}, grid: $horizontalCount x $verticalCount, cellDim: $tileW x $tileH") + + if (!xySwapped) { + regions = Array(horizontalCount * verticalCount) { + val region = TextureRegion() + val rx = (it % horizontalCount * (tileW + hGap)) + hFrame + val ry = (it / horizontalCount * (tileH + vGap)) + vFrame + + region.setRegion(texture) + region.setRegion(rx, ry, tileW, tileH) + + region.flip(false, globalFlipY) + + /*return*/region + } + } + else { + regions = Array(horizontalCount * verticalCount) { + val region = TextureRegion() + val rx = (it / verticalCount * (tileW + hGap)) + hFrame + val ry = (it % verticalCount * (tileH + vGap)) + vFrame + + region.setRegion(texture) + region.setRegion(rx, ry, tileW, tileH) + + region.flip(false, globalFlipY) + + /*return*/region + } + } + } + + fun get(x: Int, y: Int) = regions[y * horizontalCount + x] + + override fun dispose() { + texture.dispose() + } + +} \ No newline at end of file diff --git a/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt b/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt index cc23c54..4a38940 100644 --- a/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt +++ b/src/net/torvald/tsvm/peripheral/CharacterLCDdisplay.kt @@ -3,6 +3,8 @@ package net.torvald.tsvm.peripheral import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.toUlong +import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import net.torvald.tsvm.VM class CharacterLCDdisplay(vm: VM) : GraphicsAdapter(vm, AdapterConfig( @@ -11,6 +13,7 @@ class CharacterLCDdisplay(vm: VM) : GraphicsAdapter(vm, AdapterConfig( ) { private val machine = Texture("./assets/4008_portable_full.png") + private val lcdFont = TextureRegionPack(Texture("./assets/lcd.png"), 12, 16) override fun peek(addr: Long): Byte? { return when (addr) { @@ -33,10 +36,48 @@ class CharacterLCDdisplay(vm: VM) : GraphicsAdapter(vm, AdapterConfig( batch.draw(machine, xoff, yoff) } super.render(delta, batch, xoff+74, yoff+102) + + // draw BMS and RTC + val batPerc = "89" + val batVolt = "5.1" + val batText = " $batPerc% ${batVolt}V" + vm.poke(-69,2) + val time_t = currentTimeInMills() + val min = (time_t / 60000) % 60 + val hour = (time_t / 3600000) % 24 + val clock = "${"$hour".padStart(2,'0')}:${"$min".padStart(2,'0')} " + + batch.shader = null + batch.inUse { + batch.color = Color.WHITE + val y = yoff + 102 + config.height * config.drawScale + for (x in 0 until config.textCols) { + batch.draw(lcdFont.get(0,0), xoff+74 + x * lcdFont.tileW, y) + } + for (x in clock.indices) { + val ccode = clock[x].toInt() + batch.draw(lcdFont.get(ccode % 16, ccode / 16), xoff+74 + x * lcdFont.tileW, y) + } + for (x in batText.indices) { + val ccode = batText[x].toInt() + batch.draw(lcdFont.get(ccode % 16, ccode / 16), xoff+74 + (config.textCols - batText.length + x) * lcdFont.tileW, y) + } + } } + fun currentTimeInMills(): Long { + vm.poke(-69, -1) + var r = 0L + for (i in 0L..7L) { + r = r or vm.peek(-81 - i)!!.toUlong().shl(8 * i.toInt()) + } + return r + } + + override fun dispose() { machine.dispose() + lcdFont.dispose() super.dispose() } } \ No newline at end of file