; *************************************************************************** ; 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_WIDGET = OBJECT_SIZE .equ WIDGET_OFFS_X_LO = WIDGET_OFFS_WIDGET+0 .equ WIDGET_OFFS_X_HI = WIDGET_OFFS_WIDGET+1 .equ WIDGET_OFFS_Y_LO = WIDGET_OFFS_WIDGET+2 .equ WIDGET_OFFS_Y_HI = WIDGET_OFFS_WIDGET+3 .equ WIDGET_OFFS_WIDTH_LO = WIDGET_OFFS_WIDGET+4 .equ WIDGET_OFFS_WIDTH_HI = WIDGET_OFFS_WIDGET+5 .equ WIDGET_OFFS_HEIGHT_LO = WIDGET_OFFS_WIDGET+6 .equ WIDGET_OFFS_HEIGHT_HI = WIDGET_OFFS_WIDGET+7 .equ WIDGET_OFFS_STYLE_LO = WIDGET_OFFS_WIDGET+8 ; byte address (for LPM!) .equ WIDGET_OFFS_STYLE_HI = WIDGET_OFFS_WIDGET+9 .equ WIDGET_SIZE = WIDGET_OFFS_WIDGET+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 ; @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_WIDGET clr r16 ldi r17, (WIDGET_SIZE-WIDGET_OFFS_WIDGET) 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 ret ; @end ; --------------------------------------------------------------------------- ; @routine Widget_Fini @global ; ; @param Y address of object in SDRAM ; @clobbers none Widget_Fini: ret ; @end ; --------------------------------------------------------------------------- ; @routine Widget_OnDraw @global ; ; @param Y address of widget ; @param xl param1 ; @param xh param2 ; @return CFLAG set if signal handled ; @clobbers any, !Y Widget_OnDraw: ldd r17, Y+OBJECT_OFFS_FLAGS ; check whether widget is visible sbrs r17, WIDGET_FLAGS_VISIBLE_BIT rjmp Widget_OnDraw_ret ; check whether widget is dirty sbrs r17, WIDGET_FLAGS_DIRTY_BIT rjmp Widget_OnDraw_ret ; clear dirty bit cbr r17, (1<