Files
aqhomecontrol/avr/modules/lcd2/gui/dialog.asm
2025-11-17 23:01:26 +01:00

315 lines
6.7 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_TOUCH = 4
.equ DIALOG_FN_TIMER = 5
; ***************************************************************************
; 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
;
; Handle display touch events
; Send timer event to every app in the stack (started with last added app).
DialogMgr_Every100ms:
; check for touch input changes
rcall Display_InputGetState ; r16=flags, r5:r4=x, r7:r6=y
mov r17, r16
andi r17, (1<<DISPLAY_IFLAGS_CHGCOORD_BIT) | (1<<DISPLAY_IFLAGS_CHGPRESS_BIT)
breq DialogMgr_Every100ms_sendTimer
mov r18, r16
ldi r23, DIALOG_FN_TOUCH
rcall DialogMgr_CallCurrentHandler
DialogMgr_Every100ms_sendTimer:
; send timer event to all dialogs in stack
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_CallHandler
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:
tst yl
brne DialogMgr_CallHandler_go
tst yh
breq DialogMgr_CallHandler_ret
DialogMgr_CallHandler_go:
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
mov r17, r16
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
sts dialogCurrent, yl
sts dialogCurrent+1, yh
; 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
; ---------------------------------------------------------------------------
; @routine Dialog_Init @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers R16, R17, X
Dialog_Init:
mov xl, yl
mov xh, yh
ldi r17, DIALOG_SIZE
clr r16
bigcall Utils_FillSram ; (R17, X)
ret
; @end
#endif ; AQHOME_AVR_MODS_GUI_DIALOG_ASM