gui2: improved signal handling, make use of secondary signal maps.

This commit is contained in:
Martin Preuss
2026-03-06 16:00:14 +01:00
parent 16b820fae1
commit a8cb442502
6 changed files with 636 additions and 68 deletions

View File

@@ -89,7 +89,16 @@
.equ WIDGET_SIGNAL_DRAW = OBJECT_SIGNAL_NEXTFREE+3
.equ WIDGET_SIGNAL_TOUCH = OBJECT_SIGNAL_NEXTFREE+4
.equ WIDGET_SIGNAL_CLICKED = OBJECT_SIGNAL_NEXTFREE+5
.equ WIDGET_SIGNAL_NEXTFREE = OBJECT_SIGNAL_NEXTFREE+6
.equ WIDGET_SIGNAL_SETVALUE = OBJECT_SIGNAL_NEXTFREE+6
.equ WIDGET_SIGNAL_GETVALUE = OBJECT_SIGNAL_NEXTFREE+7
.equ WIDGET_SIGNAL_KEEPALIVE = OBJECT_SIGNAL_NEXTFREE+8
.equ WIDGET_SIGNAL_NEXTFREE = OBJECT_SIGNAL_NEXTFREE+9
; values for signals WIDGET_SIGNAL_SETVALUE and WIDGET_SIGNAL_GETVALUE
.equ WIDGET_VALUE_DEFAULT_WIDTH = 1
.equ WIDGET_VALUE_DEFAULT_HEIGHT = 2
.equ WIDGET_VALUE_NEXTFREE = 3
@@ -105,19 +114,24 @@
; @param Y address of object in SDRAM
; @param r16 value for OBJECT_OFFS_OPTS_LO
; @param r17 value for OBJECT_OFFS_OPTS_HI
; @param X parent widget (if any)
; @clobbers r16, r17, X
Widget_Init:
; call base class
bigcall OBJ_Init ; (r16, r17, X)
; clear widget-specific data
mov xl, yl
mov xh, yh
adiw xh:xl, WIDGET_OFFS_BEGIN
clr r16
ldi r17, (WIDGET_SIZE-WIDGET_OFFS_BEGIN)
bigcall Utils_FillSram ; (r17, X)
push xl
push xh
; call base class
bigcall OBJ_Init ; (r16, r17, X)
; clear widget-specific data
mov xl, yl
mov xh, yh
adiw xh:xl, WIDGET_OFFS_BEGIN
clr r16
ldi r17, (WIDGET_SIZE-WIDGET_OFFS_BEGIN)
bigcall Utils_FillSram ; (r17, X)
pop xh
pop xl
; set default signal map
ldi r16, LOW(Widget_DefaultSignalmap*2)
@@ -125,12 +139,26 @@ Widget_Init:
ldi r16, HIGH(Widget_DefaultSignalmap*2)
std Y+OBJECT_OFFS_SIGNALMAP_HI, r16
; set default style
; set style
mov r16, xl
or r16, xh
breq Widget_Init_setDefaultStyle
; use style from parent
adiw xh:xl, WIDGET_OFFS_STYLE_LO
ld r16, X+
std Y+WIDGET_OFFS_STYLE_LO, r16
ld r16, X
std Y+WIDGET_OFFS_STYLE_HI, r16
sbiw xh:xl, (WIDGET_OFFS_STYLE_LO+1)
rjmp Widget_Init_setDefaultSize
Widget_Init_setDefaultStyle:
ldi r16, LOW(Widget_DefaultStyle*2)
std Y+WIDGET_OFFS_STYLE_LO, r16
ldi r16, HIGH(Widget_DefaultStyle*2)
std Y+WIDGET_OFFS_STYLE_HI, r16
Widget_Init_setDefaultSize:
; initial size: 1x1 px
ldi r16, 1
clr r17
@@ -139,6 +167,13 @@ Widget_Init:
std Y+WIDGET_OFFS_HEIGHT_LO, r16
std Y+WIDGET_OFFS_HEIGHT_HI, r17
; add to parent (if any)
mov r16, xl
or r16, xh
breq Widget_Init_ret
bigcall OBJ_AddChild
Widget_Init_ret:
ret
; @end
@@ -252,6 +287,36 @@ Widget_OnDrawNop:
; ---------------------------------------------------------------------------
; @routine Widget_OnGetValue @global
;
; @param Y address of widget
; @param r17 value requested
; @param xl param1
; @param xh param2
; @return CFLAG set if signal handled
; @return r19:r18 value
; @clobbers any, !Y
Widget_OnGetValue:
cpi r17, WIDGET_VALUE_DEFAULT_WIDTH
breq Widget_OnGetValue_getDefaultWidth
cpi r17, WIDGET_VALUE_DEFAULT_HEIGHT
breq Widget_OnGetValue_getDefaultHeight
clc
rjmp Widget_OnGetValue_ret
Widget_OnGetValue_getDefaultWidth:
Widget_OnGetValue_getDefaultHeight:
ldi r18, 1
clr r19
sec
Widget_OnGetValue_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_Clear @global
;
@@ -656,8 +721,11 @@ widgetCalcAbsPosAndBorders:
; data in FLASH
Widget_DefaultSignalmap:
.db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw)
.db 0, OBJECT_SIGNAL_DESTROY, LOW(OBJ_OnDestroy), HIGH(OBJ_OnDestroy)
; header
.dw Object_DefaultSignalmap ; next table to use
; entries
.db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw)
.db 0, WIDGET_SIGNAL_GETVALUE, LOW(Widget_OnGetValue), HIGH(Widget_OnGetValue) ; handle any value here
.db 0, 0, 0, 0 ; end of table