// SPDX-License-Identifier: GPL-3.0-only // Copyright (c) 2022, Sylvain Huet, Ambermind // Minimacy (r) System #ifdef i2cInit var _Bmp;; var _W;; var _H;; var _FUpdate :(fun Bitmap -> Bool);; var _SwitchDownCb;; var _SwitchUpCb;; var _GpioKeyList;; fun displaySetup(width, height, fUpdate) = set _W=width; set _H=height; set _FUpdate=fUpdate;; fun keyEmulateWithGpio(key, pin)= set _GpioKeyList=[key, pin]::_GpioKeyList;; fun _keyStartEmulation(key:Int, pin)= gpioSetPulls(true, false, gpioSetDir(false, gpioInit(pin))); let watcherOpen(strFormat("pin*", pin)) -> watcher in let gpioWatcherAddress(pin) -> addr in let gpioWatcherMask(pin) -> mask in ( watcherUpdate(watcher, addr, mask, mask); watcherOnEvent(watcher, lambda()= let gpioGet(pin) -> state in ( // watcher is fired when memory value gets different from value argument watcherUpdate(watcher, addr, mask, (if state then mask else 0)); call if state then _SwitchUpCb else _SwitchDownCb(key) ) ) );; fun screenW ()= _W;; fun screenH ()= _H;; fun uiW()= bitmapW(_Bmp);; fun uiH()= bitmapH(_Bmp);; fun uiBuffer ()= _Bmp;; fun uiStart(x, y, w, h, flags, title) = set _Bmp=bitmapCreate(_W, _H, 0); for [key, pin] in _GpioKeyList do _keyStartEmulation(key, pin); set _GpioKeyList=nil; 0;; fun uiUpdate ()= call _FUpdate(_Bmp);; fun uiOnKeyDown(cb) = set _SwitchDownCb = (lambda(key) = call cb(key); true);; fun uiOnKeyUp(cb) = set _SwitchUpCb = (lambda(key) = call cb(key); true);; #else use bios as bios;; fun keyEmulateWithGpio(key, pin)= nil;; fun displaySetup (width, height, fUpdate) = nil;; #ifdef glSwapBuffers const _SCALE=8;; #else const _SCALE=1;; #endif fun uiStart( x, y, w, h, flags, title)= bios.uiStart( x, y, w*_SCALE, h*_SCALE, flags, title); uiBufferSetSize( w, h, false);; #endif const _FONT_20_7f= strBuild({ "\$00\$00\$00\$00\$00\$00\$00\$00\$5f\$00\$00\$00\$00\$07\$00\$07\$00\$00\$14\$7f\$14\$7f\$14\$00\$24\$2a\$6b\$2a\$12\$00\$23\$13\$08\$64\$62\$00\$36\$49\$55\$22\$50\$00\$00\$00\$05\$03\$00\$00", "\$00\$1c\$22\$41\$00\$00\$00\$41\$22\$1c\$00\$00\$14\$08\$3e\$08\$14\$00\$08\$08\$3e\$08\$08\$00\$00\$00\$50\$30\$00\$00\$08\$08\$08\$08\$08\$00\$00\$00\$60\$60\$00\$00\$20\$10\$08\$04\$02\$00", "\$3e\$51\$49\$45\$3e\$00\$00\$42\$7f\$40\$00\$00\$42\$61\$51\$49\$46\$00\$21\$41\$45\$4b\$31\$00\$18\$14\$12\$7f\$10\$00\$27\$45\$45\$45\$39\$00\$3c\$4a\$49\$49\$30\$00\$01\$01\$79\$05\$03\$00", "\$36\$49\$49\$49\$36\$00\$06\$49\$49\$29\$1e\$00\$00\$00\$36\$36\$00\$00\$00\$00\$56\$36\$00\$00\$00\$08\$14\$22\$41\$00\$14\$14\$14\$14\$14\$00\$41\$22\$14\$08\$00\$00\$02\$01\$51\$09\$06\$00", "\$3e\$41\$49\$55\$0e\$00\$7e\$11\$11\$11\$7e\$00\$7f\$49\$49\$49\$36\$00\$3e\$41\$41\$41\$22\$00\$7f\$41\$41\$22\$1c\$00\$7f\$49\$49\$49\$41\$00\$7f\$09\$09\$09\$01\$00\$3e\$41\$41\$51\$32\$00", "\$7f\$08\$08\$08\$7f\$00\$00\$41\$7f\$41\$00\$00\$20\$40\$41\$3f\$01\$00\$7f\$08\$14\$22\$41\$00\$7f\$40\$40\$40\$40\$00\$7f\$02\$0c\$02\$7f\$00\$7f\$04\$08\$10\$7f\$00\$3e\$41\$41\$41\$3e\$00", "\$7f\$09\$09\$09\$06\$00\$3e\$41\$51\$21\$5e\$00\$7f\$09\$19\$29\$46\$00\$26\$49\$49\$49\$32\$00\$01\$01\$7f\$01\$01\$00\$3f\$40\$40\$40\$3f\$00\$1f\$20\$40\$20\$1f\$00\$7f\$20\$18\$20\$7f\$00", "\$63\$14\$08\$14\$63\$00\$07\$08\$78\$08\$07\$00\$61\$51\$49\$45\$43\$00\$00\$7f\$41\$41\$00\$00\$02\$04\$08\$10\$20\$00\$00\$41\$41\$7f\$00\$00\$04\$02\$01\$02\$04\$00\$80\$80\$80\$80\$80\$80", "\$00\$03\$05\$00\$00\$00\$38\$44\$44\$24\$7c\$00\$7f\$48\$44\$44\$38\$00\$38\$44\$44\$44\$20\$00\$38\$44\$44\$48\$7f\$00\$38\$54\$54\$54\$58\$00\$08\$7e\$09\$09\$02\$00\$08\$54\$54\$54\$3c\$00", "\$7f\$08\$04\$04\$78\$00\$00\$44\$7d\$40\$00\$00\$20\$40\$44\$3d\$00\$00\$7f\$20\$10\$28\$44\$00\$00\$41\$7f\$40\$00\$00\$7c\$04\$18\$04\$78\$00\$7c\$08\$04\$04\$78\$00\$38\$44\$44\$44\$38\$00", "\$7c\$14\$14\$14\$08\$00\$08\$14\$14\$14\$7c\$00\$7c\$08\$04\$04\$08\$00\$48\$54\$54\$54\$24\$00\$04\$3f\$44\$44\$20\$00\$3c\$40\$40\$20\$7c\$00\$1c\$20\$40\$20\$1c\$00\$3c\$40\$30\$40\$3c\$00", "\$44\$28\$10\$28\$44\$00\$4c\$50\$50\$50\$3c\$00\$44\$64\$54\$4c\$44\$00\$00\$08\$3e\$41\$41\$00\$00\$00\$7f\$00\$00\$00\$41\$41\$3e\$08\$00\$00\$08\$04\$0c\$08\$04\$00\$ff\$ff\$ff\$ff\$ff\$ff" });; const _FONT_a0_ff= strBuild({ "\$00\$00\$00\$00\$00\$00\$00\$00\$7d\$00\$00\$00\$18\$24\$66\$24\$00\$00\$48\$7e\$49\$42\$20\$00\$5d\$22\$22\$22\$5d\$00\$15\$16\$7c\$16\$15\$00\$00\$00\$77\$00\$00\$00\$4a\$55\$55\$55\$29\$00", "\$00\$01\$00\$01\$00\$00\$3e\$63\$5d\$5d\$3e\$00\$00\$06\$09\$05\$0f\$00\$08\$14\$2a\$14\$22\$00\$08\$08\$08\$08\$38\$00\$00\$08\$08\$08\$00\$00\$3e\$41\$6d\$51\$3e\$00\$00\$01\$01\$01\$00\$00", "\$00\$02\$05\$02\$00\$00\$44\$44\$5f\$44\$44\$00\$00\$09\$0d\$0a\$00\$00\$00\$11\$15\$0b\$00\$00\$00\$02\$01\$00\$00\$00\$00\$3e\$50\$10\$0e\$00\$06\$09\$7f\$01\$7f\$00\$00\$00\$08\$00\$00\$00", "\$00\$40\$30\$00\$00\$00\$00\$02\$0f\$00\$00\$00\$00\$06\$09\$06\$00\$00\$00\$22\$14\$2a\$14\$00\$13\$28\$34\$7a\$21\$00\$13\$08\$04\$6a\$59\$00\$35\$1f\$28\$34\$7a\$00\$30\$48\$45\$40\$20\$00", "\$70\$29\$2a\$28\$70\$00\$70\$28\$2a\$29\$70\$00\$70\$2a\$29\$2a\$70\$00\$70\$2a\$29\$2a\$71\$00\$70\$29\$28\$29\$70\$00\$70\$28\$29\$28\$70\$00\$7c\$0a\$09\$7f\$49\$00\$5e\$61\$61\$21\$12\$00", "\$7c\$55\$56\$44\$44\$00\$7c\$54\$56\$45\$44\$00\$7c\$56\$55\$46\$44\$00\$7c\$55\$54\$45\$44\$00\$00\$49\$7a\$48\$00\$00\$00\$48\$7a\$49\$00\$00\$00\$4a\$79\$4a\$00\$00\$00\$49\$78\$49\$00\$00", "\$08\$7f\$49\$22\$1c\$00\$7d\$09\$11\$21\$7d\$00\$38\$45\$46\$44\$38\$00\$38\$44\$46\$45\$38\$00\$38\$46\$45\$46\$38\$00\$38\$46\$45\$46\$39\$00\$38\$45\$44\$45\$38\$00\$22\$14\$08\$14\$22\$00", "\$5c\$32\$2a\$26\$1d\$00\$3c\$41\$42\$40\$3c\$00\$3c\$40\$42\$41\$3c\$00\$38\$42\$41\$42\$38\$00\$3c\$41\$40\$41\$3c\$00\$0c\$10\$62\$11\$0c\$00\$7f\$14\$22\$22\$1c\$00\$7e\$09\$4d\$5a\$30\$00", "\$30\$49\$4a\$28\$78\$00\$30\$48\$4a\$29\$78\$00\$30\$4a\$49\$2a\$78\$00\$30\$4a\$49\$2a\$79\$00\$30\$49\$48\$29\$78\$00\$30\$48\$49\$28\$78\$00\$24\$54\$38\$54\$48\$00\$58\$64\$64\$24\$10\$00", "\$38\$55\$56\$54\$58\$00\$38\$54\$56\$55\$58\$00\$38\$56\$55\$56\$58\$00\$38\$55\$54\$55\$58\$00\$00\$49\$7a\$40\$00\$00\$00\$48\$7a\$41\$00\$00\$00\$4a\$79\$42\$00\$00\$00\$49\$78\$41\$00\$00", "\$30\$49\$4a\$49\$30\$00\$7a\$11\$0a\$09\$70\$00\$30\$49\$4a\$48\$30\$00\$30\$48\$4a\$49\$30\$00\$30\$4a\$49\$4a\$30\$00\$30\$4a\$49\$4a\$31\$00\$30\$49\$48\$49\$30\$00\$08\$08\$2a\$08\$08\$00", "\$58\$24\$3c\$24\$1a\$00\$38\$41\$42\$20\$78\$00\$38\$40\$42\$21\$78\$00\$38\$42\$41\$22\$78\$00\$38\$41\$40\$21\$78\$00\$4c\$50\$52\$51\$3c\$00\$7f\$14\$22\$1c\$00\$00\$4c\$51\$50\$51\$3c\$00" });; const _FONT_H=8;; const _FONT_W=6;; fun drawChar(x, y, c, inverse)= let if inverse then 255 else 0 -> inverse in let if c<128 then _FONT_20_7f else _FONT_a0_ff -> font in let _FONT_W*((c&0x7f)-32) -> c in let uiBuffer() -> bmp in for i=0;i<_FONT_W do let inverse ^ strGet(font, c+i) -> mask in for j=0;j<_FONT_H do bitmapPlot(bmp, x+i, y+j, if bitTest(mask, 1<>1, y, str, inverse);; fun drawStringRight(x, y, str, inverse)= drawString(x-_FONT_W*strLength(str), y, str, inverse);; fun drawBitmap(x, y, src, w)= let (w+7)>>3 -> nextLine in let (nextLine-1+strLength(src))/nextLine -> h in let uiBuffer() -> bmp in for j=0;j index in for i=0;i>3)), 128>>(i&7)) then 0xffffff else 0, nil);;