; *************************************************************************** ; 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_SIZE = WIDGET_OFFS_BEGIN+10 ; widget style object .equ WIDGET_STYLE_OFFS_FRONTCOL_NORM = 0 .equ WIDGET_STYLE_OFFS_BACKCOL_NORM = 1 .equ WIDGET_STYLE_OFFS_BORDERCOL_NORM = 2 .equ WIDGET_STYLE_OFFS_SHADOWCOL_NORM = 3 .equ WIDGET_STYLE_OFFS_FRONTCOL_ACTIVATED = 4 .equ WIDGET_STYLE_OFFS_BACKCOL_ACTIVATED = 5 .equ WIDGET_STYLE_OFFS_BORDERCOL_ACTIVATED = 6 .equ WIDGET_STYLE_OFFS_SHADOWCOL_ACTIVATED = 7 .equ WIDGET_STYLE_OFFS_OUTERBORDERSIZE = 8 .equ WIDGET_STYLE_OFFS_INNERBORDERSIZE = 9 .equ WIDGET_STYLE_OFFS_FONT_LO = 10 .equ WIDGET_STYLE_OFFS_FONT_HI = 11 .equ WIDGET_STYLE_OFFS_CHARWIDTH = 12 .equ WIDGET_STYLE_OFFS_CHARHEIGHT = 13 .equ WIDGET_STYLE_SIZE = 14 ; 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_XALIGN1_BIT = 3 ; (2 bit: left, right, center, filled) .equ WIDGET_OPTSLO_XALIGN0_BIT = 2 .equ WIDGET_OPTSLO_YALIGN1_BIT = 1 ; (2 bit: top, bottom, center, filled) .equ WIDGET_OPTSLO_YALIGN0_BIT = 0 ; values for WIDGET_OPTSLO_XALIGN (2 bits) .equ WIDGET_OPTSLO_XALIGN_LEFT = 0 .equ WIDGET_OPTSLO_XALIGN_RIGHT = 1 .equ WIDGET_OPTSLO_XALIGN_CENTER = 2 .equ WIDGET_OPTSLO_XALIGN_FILLED = 3 ; values for WIDGET_OPTSLO_YALIGN (2 bits) .equ WIDGET_OPTSLO_YALIGN_TOP = 0 .equ WIDGET_OPTSLO_YALIGN_BOTTOM = 1 .equ WIDGET_OPTSLO_YALIGN_CENTER = 2 .equ WIDGET_OPTSLO_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_NEXTFREE = OBJECT_SIGNAL_NEXTFREE+6 ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @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 ; @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) ; 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 default style 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 ; 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 ret ; @end ; --------------------------------------------------------------------------- ; @routine Widget_Fini @global ; ; @param Y address of object in SDRAM ; @clobbers none Widget_Fini: ret ; @end ; --------------------------------------------------------------------------- ; @routine Widget_Resize @global ; ; @param Y address of widget ; @param r9:r8 W ; @param r11:r10 H ; @clobbers r16 Widget_Resize: std Y+WIDGET_OFFS_WIDTH_LO, r8 std Y+WIDGET_OFFS_WIDTH_HI, r9 std Y+WIDGET_OFFS_HEIGHT_LO, r10 std Y+WIDGET_OFFS_HEIGHT_HI, r11 ldd r16, Y+OBJECT_OFFS_FLAGS ori r16, (1<