Files
aqhomecontrol/avr/modules/lcd2/win/widget.asm
Martin Preuss dbad237826 fixed a typo.
2025-06-02 23:41:38 +02:00

205 lines
5.4 KiB
NASM

; ***************************************************************************
; copyright : (C) 2025 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. *
; ***************************************************************************
; ***************************************************************************
; defs
.equ WID_WIDGET_INTER_BORDER = 2
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine WID_Widget_new @global
;
; @param Y pointer to window SRAM
; @param X pointer to parent
; @param r18 WID_OFFS_OPTIONS1
; @param r19 WID_OFFS_OPTIONS2
WID_Widget_Init:
push r18
push r19
push xl
push xh
ldi zl, LOW(WID_Widget_Handler)
ldi zh, HIGH(WID_Widget_Handler)
clr r17
rcall OBJ_Init
pop xh
pop xl
pop r19
pop r18
std Y+WID_OFFS_OPTIONS1, r18
std Y+WID_OFFS_OPTIONS2, r19
mov r16, xl
or r16, xh
breq WID_Widget_noParent
; copy defaults from parent
adiw xh:xl, WID_OFFS_BG_COL_LO
ld r16, X+ ; WID_OFFS_BG_COL_LO
std Y+WID_OFFS_BG_COL_LO, r16
ld r16, X+ ; WID_OFFS_BG_COL_HI
std Y+WID_OFFS_BG_COL_HI, r16
ld r16, X+ ; WID_OFFS_FG_COL_LO
std Y+WID_OFFS_FG_COL_LO, r16
ld r16, X+ ; WID_OFFS_FG_COL_HI
std Y+WID_OFFS_FG_COL_HI, r16
ld r16, X+ ; WID_OFFS_FONT_LO
std Y+WID_OFFS_FONT_LO, r16
ld r16, X+ ; WID_OFFS_FONT_HI
std Y+WID_OFFS_FONT_HI, r16
rjmp WID_Widget_end
WID_Widget_noParent: ; preset without parent
clr r16
std Y+WID_OFFS_FONT_LO, r16
std Y+WID_OFFS_FONT_HI, r16
std Y+WID_OFFS_FG_COL_LO, r16 ; foreground black
std Y+WID_OFFS_FG_COL_HI, r16
dec r16
std Y+WID_OFFS_BG_COL_LO, r16 ; background white
std Y+WID_OFFS_BG_COL_HI, r16
ldi r16, 2 ; default borders
std Y+WID_OFFS_BORDER_TOP, r16
std Y+WID_OFFS_BORDER_BOT, r16
std Y+WID_OFFS_BORDER_LEFT, r16
std Y+WID_OFFS_BORDER_RIGHT, r16
WID_Widget_end:
ret
; @end
; ---------------------------------------------------------------------------
; @routine WID_Widget_Handler
;
; Signal handler for an object. A signal can have up to 3 parameters
; conveyed in registers R18, R19 and X.
;
; @param Y pointer to object SRAM
; @param r16 signal
; @param R18 1st param
; @param R19 2nd param
; @param X 3rd param
; @clobbers any, !Y
WID_Widget_Handler:
cpi r16, WID_SIGNAL_GETMINWIDTH
breq WID_Widget_Handler_getMinWidth
cpi r16, WID_SIGNAL_GETMINHEIGHT
breq WID_Widget_Handler_getMinHeight
; for now just forward signal to all children
WID_Widget_Handler_forward:
rcall OBJ_ForwardSignalToChildren
ret
WID_Widget_Handler_getMinWidth:
rjmp widgetGetMinWidth
WID_Widget_Handler_getMinHeight:
rjmp widgetGetMinHeight
; @end
; ---------------------------------------------------------------------------
; @routine widgetGetMinWidth
;
; @return r19:r18 minimum width of widget
; @clobbers any, !Y
widgetGetMinWidth:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
clr r25
widgetGetMinWidth_loop:
mov r17, xl
or r17, xh
breq widgetGetMinWidth_loopEnd
mov yl, xl
mov yh, yl
push r24
push r25
ldi r16, WID_SIGNAL_GETMINWIDTH
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
pop r25
pop r24
add r24, r18 ; TODO: handle carry later
adc r25, r19
adiw r25:r24, WID_WIDGET_INTER_BORDER
rcall Tree_GetNextSibling ; (none)
rjmp widgetGetMinWidth_loop
widgetGetMinWidth_loopEnd:
mov r18, r24
mov r19, r25
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine widgetGetMinHeight
;
; @return r19:r18 minimum height of widget
; @clobbers any, !Y
widgetGetMinHeight:
push yl
push yh
rcall Tree_GetFirstChildObject ; (none)
clr r24
clr r25
widgetGetMinHeight_loop:
mov r17, xl
or r17, xh
breq widgetGetMinHeight_loopEnd
mov yl, xl
mov yh, yl
push r24
push r25
ldi r16, WID_SIGNAL_GETMINHEIGHT
ldi r18, 1 ; default value for when the signal is not handled
ldi r19, 0 ; default value for when the signal is not handled
rcall OBJ_Handler ; ask child for its minimum size
pop r25
pop r24
add r24, r18 ; TODO: handle carry later
adc r25, r19
adiw r25:r24, WID_WIDGET_INTER_BORDER
rcall Tree_GetNextSibling ; (none)
rjmp widgetGetMinHeight_loop
widgetGetMinHeight_loopEnd:
mov r18, r24
mov r19, r25
pop yh
pop yl
ret
; @end