Files
aqhomecontrol/avr/modules/lcd2/gui2/guiapp.asm
2026-01-14 22:57:14 +01:00

322 lines
7.1 KiB
NASM

; ***************************************************************************
; 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_GUIAPP_ASM
#define AQH_AVR_GUI2_GUIAPP_ASM
; ***************************************************************************
; defines
; GuiApp in flash
.equ GUIAPP_OFFS_GUIAPP = OBJECT_SIZE
.equ GUIAPP_OFFS_SDRAM_LO = GUIAPP_OFFS_GUIAPP+0
.equ GUIAPP_OFFS_SDRAM_HI = GUIAPP_OFFS_GUIAPP+1
.equ GUIAPP_OFFS_ROOTWIDGET_LO = GUIAPP_OFFS_GUIAPP+2
.equ GUIAPP_OFFS_ROOTWIDGET_HI = GUIAPP_OFFS_GUIAPP+3
.equ GUIAPP_OFFS_ROOTTIMER_LO = GUIAPP_OFFS_GUIAPP+4
.equ GUIAPP_OFFS_ROOTTIMER_HI = GUIAPP_OFFS_GUIAPP+5
.equ GUIAPP_SIZE = GUIAPP_OFFS_GUIAPP+6
; signals
.equ GUIAPP_SIGNAL_RAISE = OBJECT_SIGNAL_NEXTFREE+0 ; app->cntrl: X=GUIAPP to raise
.equ GUIAPP_SIGNAL_SHOW = OBJECT_SIGNAL_NEXTFREE+1 ; cntrl->app
.equ GUIAPP_SIGNAL_HIDE = OBJECT_SIGNAL_NEXTFREE+2 ; cntrl->app
.equ GUIAPP_SIGNAL_NEXTFREE = OBJECT_SIGNAL_NEXTFREE+3
; SDRAM data for guiapp
.equ GUIAPP_SD_OFFS_FLAGS = 0
.equ GUIAPP_SD_OFFS_DRAWTIMER = 1
.equ GUIAPP_SD_SIZE = 2
; guiapp flags
.equ GUIAPP_FLAGS_ACTIVE_BIT = 7
.equ GUIAPP_DRAWTIMER = 3
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine GuiApp_Init
;
; @param Z byte address of guiapp object (for LPM!)
GuiApp_Init:
; init sdram data
rcall GuiApp_GetSdramPtr
clr r16
std Y+GUIAPP_SD_OFFS_FLAGS, r16
ldi r16, GUIAPP_DRAWTIMER
std Y+GUIAPP_SD_OFFS_DRAWTIMER, r16
rcall guiAppInitWidgets
rcall guiAppInitTimers
ret
; @end
; ---------------------------------------------------------------------------
; @routine guiAppInitWidgets
;
; @param Z byte address of guiapp object (for LPM!)
guiAppInitWidgets:
; init widgets
push zl
push zh
adiw zh:zl, GUIAPP_OFFS_ROOTWIDGET_LO
lpm r16, Z+
lpm zh, Z
mov zl, r16
or r16, zh
breq guiAppInitWidgets_done
ldi r16, OBJECT_SIGNAL_CREATE
clr r17
bigcall OBJ_TreeAllHandleSignal
guiAppInitWidgets_done:
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine guiAppInitTimers
;
; @param Z byte address of guiapp object (for LPM!)
guiAppInitTimers:
; init timers
push zl
push zh
adiw zh:zl, GUIAPP_OFFS_ROOTTIMER_LO
lpm r16, Z+
lpm zh, Z
mov zl, r16
or r17, zh
breq guiAppInitTimers_done
ldi r16, OBJECT_SIGNAL_CREATE
clr r17
bigcall OBJ_TreeAllHandleSignal
guiAppInitTimers_done:
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnShow
;
; @param Z byte address of guiapp object (for LPM!)
GuiApp_OnShow:
push zl
push zh
adiw zh:zl, GUIAPP_OFFS_ROOTWIDGET_LO
lpm r16, Z+
lpm zh, Z
mov zl, r16
or r17, zh
breq GuiApp_OnShow_done
ldi r16, (1<<WIDGET_FLAGS_ACTIVE_BIT) | (1<<WIDGET_FLAGS_DIRTY_BIT)
rcall Widget_AddFlagsDown
GuiApp_OnShow_done:
pop zh
pop zl
rcall GuiApp_GetSdramPtr
ldd r16, Y+GUIAPP_SD_OFFS_FLAGS
sbr r16, (1<<GUIAPP_FLAGS_ACTIVE_BIT)
std Y+GUIAPP_SD_OFFS_FLAGS, r16
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnHide
;
; @param Z byte address of guiapp object (for LPM!)
GuiApp_OnHide:
push zl
push zh
adiw zh:zl, GUIAPP_OFFS_ROOTWIDGET_LO
lpm r16, Z+
lpm zh, Z
mov zl, r16
or r17, zh
breq GuiApp_OnHide_done
ldi r16, (1<<WIDGET_FLAGS_ACTIVE_BIT) | (1<<WIDGET_FLAGS_DIRTY_BIT)
rcall Widget_SubFlagsDown
GuiApp_OnHide_done:
pop zh
pop zl
rcall GuiApp_GetSdramPtr
ldd r16, Y+GUIAPP_SD_OFFS_FLAGS
cbr r16, (1<<GUIAPP_FLAGS_ACTIVE_BIT)
std Y+GUIAPP_SD_OFFS_FLAGS, r16
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnTimer
;
; @param Z byte address of guiapp object (for LPM!)
GuiApp_OnTimer:
; generate timer event for all app timers
push zl
push zh
; TODO: send timer event to all widgets
pop zh
pop zl
; draw widgets
rcall GuiApp_GetSdramPtr
ldd r16, Y+GUIAPP_SD_OFFS_FLAGS
sbrs r16, GUIAPP_FLAGS_ACTIVE_BIT
rjmp GuiApp_OnTimer_ret
ldd r16, Y+GUIAPP_SD_OFFS_DRAWTIMER
tst r16
breq GuiApp_OnTimer_ret
dec r16
brne GuiApp_OnTimer_writeDrawTimer
rcall guiAppDrawWidgets
ldi r16, GUIAPP_DRAWTIMER
GuiApp_OnTimer_writeDrawTimer:
std Y+GUIAPP_SD_OFFS_DRAWTIMER, r16
GuiApp_OnTimer_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnTouch
;
; @param Z byte address of guiapp object (for LPM!)
; @param X pointer to touch event in SDRAM
GuiApp_OnTouch:
push zl
push zh
adiw zh:zl, GUIAPP_OFFS_ROOTWIDGET_LO
lpm r18, Z+
lpm zh, Z
mov zl, r18
or r18, zh
breq GuiApp_OnTouch_done
ldi r16, WIDGET_SIGNAL_TOUCH
clr r17
rcall OBJ_TreeHandleSignal ; TODO: let function only send TOUCH signal for widget with matching OPTS
GuiApp_OnTouch_done:
pop zh
pop zl
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnMsgReceived @global
;
; @param Z byte address of guiapp object (for LPM!)
; @param X pointer to touch event in SDRAM
GuiApp_OnMsgReceived:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_OnCreate @global
;
; @param Z byte address of object (for LPM!)
; @return CFLAG set if signal handled
; @clobbers any, !Z
GuiApp_OnCreate:
rcall GuiApp_Init
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine guiAppDrawWidgets
;
; @param Z byte address of guiapp object (for LPM!)
guiAppDrawWidgets:
rcall GuiApp_GetSdramPtr
ldd r16, Y+GUIAPP_SD_OFFS_FLAGS
sbrs r16, GUIAPP_FLAGS_ACTIVE_BIT
rjmp guiAppDrawWidgets_ret
push zl
push zh
adiw zh:zl, GUIAPP_OFFS_ROOTWIDGET_LO
lpm r16, Z+
lpm zh, Z
mov zl, r16
or r17, zh
breq guiAppDrawWidgets_done
bigcall Widget_Tree_Draw
guiAppDrawWidgets_done:
pop zh
pop zl
guiAppDrawWidgets_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine GuiApp_GetSdramPtr @global
;
; @param Z byte address of object (for LPM!)
; @return Y pointer to SDRAM data for widget
; @clobbers none
GuiApp_GetSdramPtr:
adiw zh:zl, GUIAPP_OFFS_SDRAM_LO
lpm yl, Z+
lpm yh, Z
sbiw zh:zl, GUIAPP_OFFS_SDRAM_LO+1
ret
; @end
#endif