322 lines
7.1 KiB
NASM
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
|