Files
aqhomecontrol/avr/modules/lcd2/gui/dialog.asm
2025-11-10 14:49:23 +01:00

279 lines
5.9 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. *
; ***************************************************************************
#ifndef AQHOME_AVR_MODS_GUI_DIALOG_ASM
#define AQHOME_AVR_MODS_GUI_DIALOG_ASM
; ***************************************************************************
; defines
.equ DIALOG_MAX_ACTIVE = 8
.equ DIALOG_OFFS_HANDLER_LO = 0
.equ DIALOG_OFFS_HANDLER_HI = 1
.equ DIALOG_OFFS_OPTIONS = 2
.equ DIALOG_OFFS_COUNTER = 3
.equ DIALOG_SIZE = 4
.equ DIALOG_OPT_ACTIVE_BIT = 7
.equ DIALOG_FN_INIT = 0
.equ DIALOG_FN_FINI = 1
.equ DIALOG_FN_SHOW = 2
.equ DIALOG_FN_HIDE = 3
.equ DIALOG_FN_DRAW = 4
.equ DIALOG_FN_TOUCH = 5
.equ DIALOG_FN_TIMER = 6
; ***************************************************************************
; data
.dseg
dialogCurrent: .byte 2
dialogStack: .byte DIALOG_MAX_ACTIVE*2
dialogStackPos: .byte 1
dialogWindow: .byte WIN_SIZE
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine GraphApp_Init @global
;
DialogMgr_Init:
clr r16
sts dialogStackPos, r16
sts dialogCurrent, r16
sts dialogCurrent+1, r16
ldi yl, LOW(dialogWindow)
ldi yh, HIGH(dialogWindow)
bigcall TitleWindow_Init
ldi zl, LOW(ili9341Font12x20_1*2)
ldi zh, HIGH(ili9341Font12x20_1*2)
std Y+WIN_OFFS_FONT_LO, zl
std Y+WIN_OFFS_FONT_HI, zh
bigcall TitleWindow_SetFullSize
bigcall TitleWindow_SetStyleColors
bigcall Window_Clear
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_Every100ms @global
;
; Send timer event to every app in the stack (started with last added app).
DialogMgr_Every100ms:
ldi xl, LOW(dialogStack)
ldi xh, HIGH(dialogStack)
lds r16, dialogStackPos
mov r17, r16
add r16, r16
add xl, r16
adc xh, r16
sub xh, r16
DialogMgr_Every100ms_loop:
tst r17
breq DialogMgr_Every100ms_ret
ld yh, -X
ld yl, -X
push xl
push xh
push r17
ldi r23, DIALOG_FN_TIMER
rcall DialogMgr_CallCurrentHandler
pop r17
pop xh
pop xl
dec r17
rjmp DialogMgr_Every100ms_loop
DialogMgr_Every100ms_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_CallHandler @global
;
; @param Y pointer to app data
; @param R23 number of function to call
; @clobbers R16, R17, R22, X (any)
DialogMgr_CallHandler:
ldi xl, LOW(dialogWindow)
ldi xh, HIGH(dialogWindow)
ldd r16, Y+DIALOG_OFFS_HANDLER_LO
ldd r17, Y+DIALOG_OFFS_HANDLER_HI
mov r22, r16
and r22, r17
breq DialogMgr_CallHandler_ret
push r16
push r17
DialogMgr_CallHandler_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_CallCurrentHandler @global
;
; @param X pointer to window
; @param R23 number of function to call
; @clobbers R22 (any)
DialogMgr_CallCurrentHandler:
lds yl, dialogCurrent
lds yh, dialogCurrent+1
rjmp DialogMgr_CallHandler
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_PushDialog @global
;
; @param Y pointer to app data
;
DialogMgr_PushDialog:
lds r16, dialogStackPos
cpi r16, DIALOG_MAX_ACTIVE
brcc DialogMgr_PushDialog_ret
tst r16
brne DialogMgr_PushDialog_push
; deactivate previous app
push yl
push yh
lds yl, dialogCurrent
lds yh, dialogCurrent+1
ldi r23, DIALOG_FN_HIDE
rcall DialogMgr_CallHandler
ldd r17, Y+DIALOG_OFFS_OPTIONS
cbr r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
pop yh
pop yl
DialogMgr_PushDialog_push:
lds r16, dialogStackPos
add r17, r17 ; *2
push xl
push xh
ldi xl, LOW(dialogStack)
ldi xh, HIGH(dialogStack)
add xl, r17
adc xh, r17
sub xh, r17
st X+, yl
st X, yh
pop xh
pop xl
inc r16
sts dialogStackPos, r16
; activate new app
ldd r17, Y+DIALOG_OFFS_OPTIONS
ori r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
ldi r23, DIALOG_FN_SHOW
rcall DialogMgr_CallHandler
sec
DialogMgr_PushDialog_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine DialogMgr_PopDialog @global
;
; @return CFLAG set if app popped from stack, cleared otherwise
; @return Y app popped from stack (if CFLAG set)
DialogMgr_PopDialog:
lds r16, dialogStackPos
tst r16
clc
brne DialogMgr_PopDialog_ret
; deactivate previous app
push yl
push yh
lds yl, dialogCurrent
lds yh, dialogCurrent+1
ldi r23, DIALOG_FN_HIDE
rcall DialogMgr_CallHandler
ldd r17, Y+DIALOG_OFFS_OPTIONS
cbr r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
pop yh
pop yl
lds r16, dialogStackPos
dec r16
sts dialogStackPos, r16
brne DialogMgr_PopDialog_pop
clr r16
sts dialogCurrent, r16
sts dialogCurrent+1, r16
sec
rjmp DialogMgr_PopDialog_ret
DialogMgr_PopDialog_pop:
push xl
push xh
ldi xl, LOW(dialogStack)
ldi xh, HIGH(dialogStack)
add xl, r16
adc xh, r16
sub xh, r16
ld yl, X+
ld yh, X
sts dialogCurrent, yl
sts dialogCurrent+1, yh
pop xh
pop xl
; activate new active app
ldd r17, Y+DIALOG_OFFS_OPTIONS
ori r17, (1<<DIALOG_OPT_ACTIVE_BIT)
std Y+DIALOG_OFFS_OPTIONS, r17
ldi r23, DIALOG_FN_SHOW
rcall DialogMgr_CallHandler
sec
DialogMgr_PopDialog_ret:
ret
; @end
#endif ; AQHOME_AVR_MODS_GUI_DIALOG_ASM