; *************************************************************************** ; 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_WIDGET_ASM #define AQH_AVR_GUI2_WIDGET_ASM ; *************************************************************************** ; defines ; Widget in flash .equ WIDGET_OFFS_BEGIN = OBJECT_SIZE .equ WIDGET_OFFS_X_LO = WIDGET_OFFS_BEGIN+0 .equ WIDGET_OFFS_X_HI = WIDGET_OFFS_BEGIN+1 .equ WIDGET_OFFS_Y_LO = WIDGET_OFFS_BEGIN+2 .equ WIDGET_OFFS_Y_HI = WIDGET_OFFS_BEGIN+3 .equ WIDGET_OFFS_WIDTH_LO = WIDGET_OFFS_BEGIN+4 .equ WIDGET_OFFS_WIDTH_HI = WIDGET_OFFS_BEGIN+5 .equ WIDGET_OFFS_HEIGHT_LO = WIDGET_OFFS_BEGIN+6 .equ WIDGET_OFFS_HEIGHT_HI = WIDGET_OFFS_BEGIN+7 .equ WIDGET_OFFS_STYLE_LO = WIDGET_OFFS_BEGIN+8 ; byte address (for LPM!) .equ WIDGET_OFFS_STYLE_HI = WIDGET_OFFS_BEGIN+9 .equ WIDGET_OFFS_TMP_LO = WIDGET_OFFS_BEGIN+10 .equ WIDGET_OFFS_TMP_HI = WIDGET_OFFS_BEGIN+11 .equ WIDGET_SIZE = WIDGET_OFFS_BEGIN+12 ; widget style object .equ WIDGET_STYLE_OFFS_FRONTCOL_NORM = 0 .equ WIDGET_STYLE_OFFS_BACKCOL_NORM = 2 .equ WIDGET_STYLE_OFFS_BORDERCOL_NORM = 4 .equ WIDGET_STYLE_OFFS_SHADOWCOL_NORM = 6 .equ WIDGET_STYLE_OFFS_FRONTCOL_ACTIVATED = 8 .equ WIDGET_STYLE_OFFS_BACKCOL_ACTIVATED = 10 .equ WIDGET_STYLE_OFFS_BORDERCOL_ACTIVATED = 12 .equ WIDGET_STYLE_OFFS_SHADOWCOL_ACTIVATED = 14 .equ WIDGET_STYLE_OFFS_OUTERBORDERSIZE = 16 .equ WIDGET_STYLE_OFFS_SPACING = 17 .equ WIDGET_STYLE_OFFS_FONT_LO = 18 .equ WIDGET_STYLE_OFFS_FONT_HI = 19 .equ WIDGET_STYLE_OFFS_CHARWIDTH = 20 .equ WIDGET_STYLE_OFFS_CHARHEIGHT = 21 .equ WIDGET_STYLE_SIZE = 22 ; widget opts_lo (bits 7 and 6 used by OBJECT_OPTSLO) .equ WIDGET_OPTSLO_INPUT_BIT = 5 ; TOUCH, KEY .equ WIDGET_OPTSLO_BORDER_BIT = 4 .equ WIDGET_OPTSLO_FILLX_BIT = 3 .equ WIDGET_OPTSLO_FILLY_BIT = 2 ; widget opts_hi .equ WIDGET_OPTSHI_CONTENT_XALIGN1_BIT = 7 ; (2 bit: left, right, center, filled) .equ WIDGET_OPTSHI_CONTENT_XALIGN0_BIT = 6 .equ WIDGET_OPTSHI_CONTENT_YALIGN1_BIT = 5 ; (2 bit: top, bottom, center, filled) .equ WIDGET_OPTSHI_CONTENT_YALIGN0_BIT = 4 ; values for WIDGET_OPTSHI_CONTENT_XALIGN (2 bits) .equ WIDGET_XALIGN_LEFT = 0 .equ WIDGET_XALIGN_RIGHT = 1 .equ WIDGET_XALIGN_CENTER = 2 .equ WIDGET_XALIGN_FILLED = 3 ; values for WIDGET_OPTSHI_CONTENT_YALIGN (2 bits) .equ WIDGET_YALIGN_TOP = 0 .equ WIDGET_YALIGN_BOTTOM = 1 .equ WIDGET_YALIGN_CENTER = 2 .equ WIDGET_YALIGN_FILLED = 3 ; widget flags .equ WIDGET_FLAGS_VISIBLE_BIT = 7 .equ WIDGET_FLAGS_TOUCH_BIT = 6 .equ WIDGET_FLAGS_DIRTY_BIT = 5 .equ WIDGET_FLAGS_LAYOUT_BIT = 4 .equ WIDGET_FLAGS_ACTIVATED_BIT = 3 .equ WIDGET_FLAGS_SELECTED_BIT = 2 ; SDRAM data for signal WIDGET_SIGNAL_TOUCH .equ WIDGET_TOUCH_OFFS_X_LO = 0 .equ WIDGET_TOUCH_OFFS_X_HI = 1 .equ WIDGET_TOUCH_OFFS_Y_LO = 2 .equ WIDGET_TOUCH_OFFS_Y_HI = 3 .equ WIDGET_TOUCH_OFFS_STATE = 4 .equ WIDGET_TOUCH_SIZE = 5 ; signals .equ WIDGET_SIGNAL_SHOW = OBJECT_SIGNAL_NEXTFREE+0 .equ WIDGET_SIGNAL_HIDE = OBJECT_SIGNAL_NEXTFREE+1 .equ WIDGET_SIGNAL_LAYOUT = OBJECT_SIGNAL_NEXTFREE+2 .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_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 ; args to Widget_AlignPos .equ WIDGET_1DALIGN_END_BIT = 0 .equ WIDGET_1DALIGN_CENTER_BIT = 1 .equ WIDGET_1DALIGN_BORDER_BIT = 2 ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine Widget_new @global ; ; @return CFLAG set of okay, cleared otherwise ; @return Y address of newly created object ; @param X parent widget ; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r17 value for OBJECT_OFFS_OPTS_HI ; @clobbers any Widget_new: ldi r24, LOW(WIDGET_SIZE) ldi r25, HIGH(WIDGET_SIZE) bigcall Object_Alloc ; (!r16, !r17, !X) brcc Widget_new_ret rcall Widget_Init ; (r16, r17, X) sec Widget_new_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine Widget_Init @global ; ; @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: 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) std Y+OBJECT_OFFS_SIGNALMAP_LO, r16 ldi r16, HIGH(Widget_DefaultSignalmap*2) std Y+OBJECT_OFFS_SIGNALMAP_HI, r16 ; 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 std Y+WIDGET_OFFS_WIDTH_LO, r16 std Y+WIDGET_OFFS_WIDTH_HI, r17 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 ; (r18, r19) ; preset flags ldd r16, Y+OBJECT_OFFS_FLAGS sbr r16, (1<