From edc291261f7042ed734db047a6b643d36be622e5 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 19 Jan 2026 18:33:36 +0100 Subject: [PATCH] gui2: added Button, RootWindow. Touch now works again. --- avr/devices/c03/main/main.asm | 2 + avr/devices/c03/main/testwin.asm | 1053 +++++++++++++++----------- avr/modules/lcd2/gui2/button.asm | 99 +++ avr/modules/lcd2/gui2/guiapp.asm | 86 ++- avr/modules/lcd2/gui2/rootwidget.asm | 56 ++ avr/modules/lcd2/gui2/widget.asm | 190 +++-- 6 files changed, 959 insertions(+), 527 deletions(-) create mode 100644 avr/modules/lcd2/gui2/button.asm create mode 100644 avr/modules/lcd2/gui2/rootwidget.asm diff --git a/avr/devices/c03/main/main.asm b/avr/devices/c03/main/main.asm index 579df2d..5c2e9f0 100644 --- a/avr/devices/c03/main/main.asm +++ b/avr/devices/c03/main/main.asm @@ -309,7 +309,9 @@ test: .include "modules/lcd2/gui2/object.asm" .include "modules/lcd2/gui2/widget.asm" +.include "modules/lcd2/gui2/rootwidget.asm" .include "modules/lcd2/gui2/label.asm" +.include "modules/lcd2/gui2/button.asm" .include "modules/lcd2/gui2/imageview.asm" .include "modules/lcd2/gui2/sensorwatch.asm" .include "modules/lcd2/gui2/valuelabel.asm" diff --git a/avr/devices/c03/main/testwin.asm b/avr/devices/c03/main/testwin.asm index f06baa3..b8c387b 100644 --- a/avr/devices/c03/main/testwin.asm +++ b/avr/devices/c03/main/testwin.asm @@ -74,6 +74,18 @@ winSensorWatch3Image_ramdata: winSensorWatch3Value_ramdata: .byte VLABEL_SD_SIZE +buttonNetwork_ramdata: + .byte IMGVIEW_SD_SIZE + + +debugValue1_ramdata: + .byte VLABEL_SD_SIZE + +debugValue2_ramdata: + .byte VLABEL_SD_SIZE + +debugValue3_ramdata: + .byte VLABEL_SD_SIZE @@ -102,9 +114,11 @@ testApp_signalmap: .db 0, WIDGET_SIGNAL_TOUCH, LOW(GuiApp_OnTouch), HIGH(GuiApp_OnTouch) .db 0, OBJECT_SIGNAL_RECVMSG, LOW(GuiApp_OnMsgReceived), HIGH(GuiApp_OnMsgReceived) .db 0, OBJECT_SIGNAL_CREATE, LOW(GuiApp_OnCreate), HIGH(GuiApp_OnCreate) + .db 0, GUIAPP_SIGNAL_DEBUG, LOW(onAppDebug), HIGH(onAppDebug) .db 0, 0, 0, 0 ; end of table + testRootWin_flashdata: ; OBJECT .db 0x55, 0xaa ; magic @@ -121,10 +135,11 @@ testRootWin_flashdata: .dw DISPLAY_WIDTH ; W .dw DISPLAY_HEIGHT ; H .dw STYLE_WIN_FOREGROUND ; front color -; .dw STYLE_WIN_BACKGROUND ; back color - .dw DISPLAY_COLOR_YELLOW + .dw STYLE_WIN_BACKGROUND ; back color .dw STYLE_WIN_FONT*2 ; font .dw testRootWin_ramdata ; ptr to SDRAM + ; ROOTWIDGET + .dw testApp_flashdata*2 ; GuiApp testRootWin_signalmap: .db 0, OBJECT_SIGNAL_CREATE, LOW(Widget_OnCreate), HIGH(Widget_OnCreate) .db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDrawNop), HIGH(Widget_OnDrawNop) @@ -157,441 +172,607 @@ testWin_signalmap: .db 0, 0, 0, 0 ; end of table -testWinHeader_flashdata: - ; OBJECT - .db 0x55, 0xaa ; magic - .dw testWinBody_flashdata*2 ; next - .dw testWin_flashdata*2 ; parent - .dw 0 ; first child - .dw 0 ; target - .dw 0 ; selector (ony lower 8 bits used) - .dw testWinHeader_signalmap*2 ; signal map - ; WIDGET - .db 0, 0 ; opts lo, hi - .dw 0 ; X - .dw 0 ; Y - .dw DISPLAY_WIDTH ; W - .dw STYLE_WIN_TITLE_HEIGHT ; H - .dw STYLE_WIN_TITLE_FOREGROUND ; front color - .dw STYLE_WIN_TITLE_BACKGROUND ; back color - .dw STYLE_WIN_FONT*2 ; font - .dw testWinHeader_ramdata ; ptr to SDRAM - ; LABEL - .dw testWinHeader_text*2 ; text - -testWinHeader_text: - .db "Test-Window", 0 -testWinHeader_signalmap: - .db 0, OBJECT_SIGNAL_CREATE, LOW(Widget_OnCreate), HIGH(Widget_OnCreate) - .db 0, WIDGET_SIGNAL_DRAW, LOW(Label_OnDraw), HIGH(Label_OnDraw) - .db 0, 0, 0, 0 ; end of table - - - -testWinBody_flashdata: - ; OBJECT - .db 0x55, 0xaa ; magic - .dw 0 ; next - .dw testWin_flashdata*2 ; parent - .dw winSensorWatch1*2 ; first child - .dw 0 ; target - .dw 0 ; selector (ony lower 8 bits used) - .dw testWinBody_signalmap*2 ; signal map - ; WIDGET - .db 0, 0 ; opts lo, hi - .dw 0 ; X - .dw STYLE_WIN_TITLE_HEIGHT ; Y - .dw DISPLAY_WIDTH ; W - .dw DISPLAY_HEIGHT-STYLE_WIN_TITLE_HEIGHT ; H - .dw STYLE_WIN_FOREGROUND ; front color -; .dw DISPLAY_COLOR_YELLOW - .dw STYLE_WIN_BACKGROUND ; back color - .dw STYLE_WIN_FONT*2 ; font - .dw testWinBody_ramdata ; ptr to SDRAM - -testWinBody_signalmap: - .db 0, OBJECT_SIGNAL_CREATE, LOW(Widget_OnCreate), HIGH(Widget_OnCreate) - .db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw) - .db 0, 0, 0, 0 ; end of table - - - -winSensorWatch1: - ; OBJECT - .db 0x55, 0xaa ; magic - .dw winSensorWatch2*2 ; next - .dw testWinBody_flashdata*2 ; parent - .dw winSensorWatch1Title*2 ; first child - .dw 0 ; target - .dw 0 ; selector (ony lower 8 bits used) - .dw winSensorWatch1_signalmap*2 ; signal map - ; WIDGET - .db (1<cntrl: X=WIDGET to raise .equ GUIAPP_SIGNAL_SHOW = OBJECT_SIGNAL_NEXTFREE+1 ; cntrl->app .equ GUIAPP_SIGNAL_HIDE = OBJECT_SIGNAL_NEXTFREE+2 ; cntrl->app -.equ GUIAPP_SIGNAL_NEXTFREE = OBJECT_SIGNAL_NEXTFREE+3 +.equ GUIAPP_SIGNAL_DEBUG = OBJECT_SIGNAL_NEXTFREE+3 +.equ GUIAPP_SIGNAL_NEXTFREE = OBJECT_SIGNAL_NEXTFREE+4 ; SDRAM data for guiapp .equ GUIAPP_SD_OFFS_FLAGS = 0 @@ -75,7 +76,7 @@ GuiApp_Init: ; --------------------------------------------------------------------------- -; @routine GuiApp_Every100ms +; @routine GuiApp_Every100ms @global ; ; @param Z byte address of guiapp object (for LPM!) @@ -89,7 +90,7 @@ GuiApp_Every100ms: ; --------------------------------------------------------------------------- -; @routine GuiApp_Every100ms +; @routine GuiApp_MsgReceived @global ; ; @param Z byte address of guiapp object (for LPM!) @@ -109,7 +110,7 @@ GuiApp_MsgReceived: GuiApp_OnTimer: ; check for touch event -; rcall guiAppCheckTouch + rcall guiAppCheckTouch ; send timer signal to all accepting widgets push zl @@ -154,14 +155,25 @@ GuiApp_OnTimer_ret: ; @param X pointer to touch event in SDRAM GuiApp_OnTouch: +bigcall onAppDebug + push zl push zh - adiw zh:zl, GUIAPP_OFFS_ROOTWIDGET_LO - lpm r18, Z+ - lpm zh, Z + rcall GuiApp_GetSdramPtr + ldd r18, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO + ldd r19, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI + mov r16, r18 + or r16, r19 + breq GuiApp_OnTouch_sendToAll mov zl, r18 - or r18, zh - breq GuiApp_OnTouch_done + mov zh, r19 + ldi r16, WIDGET_SIGNAL_TOUCH + clr r17 + bigcall OBJ_HandleSignal + rjmp GuiApp_OnTouch_done +GuiApp_OnTouch_sendToAll: + rcall GuiApp_GetRootWidgetToZ + brcc GuiApp_OnTouch_done ; send touch signal (TODO: check for grabbed touch) bigcall Widget_Tree_SendTouchSignal GuiApp_OnTouch_done: @@ -326,6 +338,62 @@ GuiApp_ShowView_ret: + +; --------------------------------------------------------------------------- +; @routine GuiApp_GrabTouchEvents +; +; @param Z byte address of gui app object (for LPM!) +; @param X byte address of widget grabbing touch events +; @return CFLAG set if grabbed, cleared otherwise +; @clobbers R16, R17, Y + +GuiApp_GrabTouchEvents: + rcall OBJ_IsObject ; (none) + brcc GuiApp_GrabTouchEvents_ret + rcall GuiApp_GetSdramPtr ; (none) + ldd r16, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO + ldd r17, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI + or r16, r17 + clc + brne GuiApp_GrabTouchEvents_ret ; only grab if not already grabbed! + std Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO, xl + std Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI, xh + sec +GuiApp_GrabTouchEvents_ret: + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine GuiApp_UngrabTouchEvents +; +; @param Z byte address of gui app object (for LPM!) +; @param X byte address of widget ungrabbing touch events +; @return CFLAG set if ungrabbed, cleared otherwise +; @clobbers R16, R17 + +GuiApp_UngrabTouchEvents: + rcall OBJ_IsObject ; (none) + brcc GuiApp_UngrabTouchEvents_ret + rcall GuiApp_GetSdramPtr ; (none) + ldd r16, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO + ldd r17, Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI + eor r16, xl + eor r17, xh + or r16, r17 + clc + brne GuiApp_UngrabTouchEvents_ret ; only ungrab same widget! + clr r16 + std Y+GUIAPP_SD_OFFS_TOUCHWIDGET_LO, r16 + std Y+GUIAPP_SD_OFFS_TOUCHWIDGET_HI, r16 + sec +GuiApp_UngrabTouchEvents_ret: + ret +; @end + + + ; --------------------------------------------------------------------------- ; @routine guiAppHideCurrent ; diff --git a/avr/modules/lcd2/gui2/rootwidget.asm b/avr/modules/lcd2/gui2/rootwidget.asm new file mode 100644 index 0000000..4e56103 --- /dev/null +++ b/avr/modules/lcd2/gui2/rootwidget.asm @@ -0,0 +1,56 @@ +; *************************************************************************** +; copyright : (C) 2026 by Martin Preuss +; email : martin@libchipcard.de +; +; *************************************************************************** +; * This file is part of the project "AqHome". * +; * Please see toplevel file COPYING of that project for license details. * +; *************************************************************************** + +#ifndef AQH_AVR_GUI2_ROOTWIDGET_ASM +#define AQH_AVR_GUI2_ROOTWIDGET_ASM + + +; *************************************************************************** +; defines + +; RootWidget in flash +.equ ROOTWIDGET_OFFS_BEGIN = WIDGET_SIZE +.equ ROOTWIDGET_OFFS_APP_LO = ROOTWIDGET_OFFS_BEGIN+0 +.equ ROOTWIDGET_OFFS_APP_HI = ROOTWIDGET_OFFS_BEGIN+1 +.equ ROOTWIDGET_SIZE = ROOTWIDGET_OFFS_BEGIN+2 + + + +; *************************************************************************** +; code + +.cseg + + + +; --------------------------------------------------------------------------- +; @routine RootWidget_GetApp @global +; +; @param Z byte address of object (for LPM!) +; @return R19:R18 byte address pointer to GuiApp +; @clobbers none + +RootWidget_GetApp: + bigcall OBJ_IsObject ; (none) + brcc RootWidget_GetApp_ret + adiw zh:zl, ROOTWIDGET_OFFS_APP_LO + lpm r18, Z+ + lpm r19, Z + sbiw zh:zl, ROOTWIDGET_OFFS_APP_LO+1 + sec +RootWidget_GetApp_ret: + ret +; @end + + + +#endif + + + diff --git a/avr/modules/lcd2/gui2/widget.asm b/avr/modules/lcd2/gui2/widget.asm index c62478d..c2b935c 100644 --- a/avr/modules/lcd2/gui2/widget.asm +++ b/avr/modules/lcd2/gui2/widget.asm @@ -118,85 +118,6 @@ Widget_OnCreate: -; --------------------------------------------------------------------------- -; @routine Widget_OnTouch @global -; -; @param Z byte address of widget object (for LPM!) -; @param xl param1 -; @param xh param2 -; @return CFLAG set if signal handled -; @clobbers any, !Z - -Widget_OnTouch: - ; check whether inputs are handled by this widget - adiw zh:zl, WIDGET_OFFS_OPTS_LO - lpm r16, Z - sbiw zh:zl, WIDGET_OFFS_OPTS_LO - andi r16, (1<