; *************************************************************************** ; 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<