; *************************************************************************** ; 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 ; Widget in flash .equ GUIAPP_OFFS_BEGIN = OBJECT_SIZE .equ GUIAPP_OFFS_ROOTWINDOW_LO = GUIAPP_OFFS_BEGIN+0 .equ GUIAPP_OFFS_ROOTWINDOW_HI = GUIAPP_OFFS_BEGIN+1 .equ GUIAPP_OFFS_SCREENSAVER_LO = GUIAPP_OFFS_BEGIN+2 .equ GUIAPP_OFFS_SCREENSAVER_HI = GUIAPP_OFFS_BEGIN+3 .equ GUIAPP_OFFS_CURRENTWINDOW_LO = GUIAPP_OFFS_BEGIN+4 .equ GUIAPP_OFFS_CURRENTWINDOW_HI = GUIAPP_OFFS_BEGIN+5 .equ GUIAPP_OFFS_TOUCHWIDGET_LO = GUIAPP_OFFS_BEGIN+6 .equ GUIAPP_OFFS_TOUCHWIDGET_HI = GUIAPP_OFFS_BEGIN+7 .equ GUIAPP_OFFS_DRAWTIMER = GUIAPP_OFFS_BEGIN+8 .equ GUIAPP_SIZE = WIDGET_OFFS_BEGIN+9 .equ GUIAPP_DRAWTIMER = 2 ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine GuiApp_new @global ; ; @return CFLAG set of okay, cleared otherwise ; @return Y address of newly created object ; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r17 value for OBJECT_OFFS_OPTS_HI ; @clobbers any GuiApp_new: ldi r24, LOW(GUIAPP_SIZE) ldi r25, HIGH(GUIAPP_SIZE) bigcall Object_Alloc ; (!r16, !r17) brcc GuiApp_new_ret rcall GuiApp_Init ; (r16, r17, X) sec GuiApp_new_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_Init @global ; ; @param Y address of object in SDRAM ; @param r16 value for OBJECT_OFFS_OPTS_LO ; @param r17 value for OBJECT_OFFS_OPTS_HI ; @clobbers r16, r17, X GuiApp_Init: ; call base class bigcall OBJ_Init ; (r16, r17, X) ; clear object-specific data mov xl, yl mov xh, yh adiw xh:xl, GUIAPP_OFFS_BEGIN clr r16 ldi r17, (GUIAPP_SIZE-GUIAPP_OFFS_BEGIN) bigcall Utils_FillSram ; (r17, X) ; set default signal map ldi r16, LOW(GuiApp_DefaultSignalmap*2) std Y+OBJECT_OFFS_SIGNALMAP_LO, r16 ldi r16, HIGH(GuiApp_DefaultSignalmap*2) std Y+OBJECT_OFFS_SIGNALMAP_HI, r16 ; create root window push yl push yh mov xl, yl mov xh, yh ldi r16, 0 ; opts_lo ldi r17, 0 ; opts_hi bigcall RootWindow_new mov xl, yl mov xh, yh pop yh pop yl brcc GuiApp_Init_ret std Y+GUIAPP_OFFS_ROOTWINDOW_LO, xl std Y+GUIAPP_OFFS_ROOTWINDOW_HI, xh ldi r16, GUIAPP_DRAWTIMER std Y+GUIAPP_OFFS_DRAWTIMER, r16 GuiApp_Init_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_Every100ms @global ; ; @param Y address of object in SDRAM GuiApp_Every100ms: ldi r16, OBJECT_SIGNAL_TIMER clr r17 bigcall OBJ_HandleSignal ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_MsgReceived @global ; ; @param Y address of object in SDRAM GuiApp_MsgReceived: ldi r16, OBJECT_SIGNAL_RECVMSG clr r17 bigcall OBJ_HandleSignal ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_PreventScreenSaver @global ; ; @param Y address of object in SDRAM ; @clobbers any, !Y GuiApp_PreventScreenSaver: rcall GuiApp_GetScreenSaver brcc GuiApp_PreventScreenSaver_ret push yl push yh mov yl, r18 mov yh, r19 ldi r16, WIDGET_SIGNAL_KEEPALIVE clr r17 bigcall OBJ_HandleSignal pop yh pop yl GuiApp_PreventScreenSaver_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_GrabTouchEvents ; ; @param Y address of object in SDRAM ; @param X byte address of widget grabbing touch events ; @return CFLAG set if grabbed, cleared otherwise ; @clobbers R16, R17, Y GuiApp_GrabTouchEvents: ldd r16, Y+GUIAPP_OFFS_TOUCHWIDGET_LO ldd r17, Y+GUIAPP_OFFS_TOUCHWIDGET_HI or r16, r17 clc brne GuiApp_GrabTouchEvents_ret ; only grab if not already grabbed! std Y+GUIAPP_OFFS_TOUCHWIDGET_LO, xl std Y+GUIAPP_OFFS_TOUCHWIDGET_HI, xh sec GuiApp_GrabTouchEvents_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_UngrabTouchEvents ; ; @param Y address of object in SDRAM ; @param X byte address of widget ungrabbing touch events ; @return CFLAG set if ungrabbed, cleared otherwise ; @clobbers R16, R17 GuiApp_UngrabTouchEvents: ldd r16, Y+GUIAPP_OFFS_TOUCHWIDGET_LO ldd r17, Y+GUIAPP_OFFS_TOUCHWIDGET_HI eor r16, xl eor r17, xh or r16, r17 clc brne GuiApp_UngrabTouchEvents_ret ; only ungrab same widget! clr r16 std Y+GUIAPP_OFFS_TOUCHWIDGET_LO, r16 std Y+GUIAPP_OFFS_TOUCHWIDGET_HI, r16 sec GuiApp_UngrabTouchEvents_ret: ret ; @end ; *************************************************************************** ; getters and setters ; --------------------------------------------------------------------------- ; @routine GuiApp_GetRootWindow @global ; ; @param Y address of object in SDRAM ; @param CFLAG set if response is not a NULL pointer GuiApp_GetRootWindow: ldd r18, Y+GUIAPP_OFFS_ROOTWINDOW_LO ldd r19, Y+GUIAPP_OFFS_ROOTWINDOW_HI sec tst r18 brne GuiApp_GetRootWindow_ret tst r19 brne GuiApp_GetRootWindow_ret clc GuiApp_GetRootWindow_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_SetRootWindow @global ; ; @param Y address of object in SDRAM ; @param X address of new window GuiApp_SetRootWindow: std Y+GUIAPP_OFFS_ROOTWINDOW_LO, xl std Y+GUIAPP_OFFS_ROOTWINDOW_HI, xh ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_GetCurrentWindow @global ; ; @param Y address of object in SDRAM ; @param CFLAG set if response is not a NULL pointer GuiApp_GetCurrentWindow: ldd r18, Y+GUIAPP_OFFS_CURRENTWINDOW_LO ldd r19, Y+GUIAPP_OFFS_CURRENTWINDOW_HI sec tst r18 brne GuiApp_GetCurrentWindow_ret tst r19 brne GuiApp_GetCurrentWindow_ret clc GuiApp_GetCurrentWindow_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_SetCurrentWindow @global ; ; @param Y address of object in SDRAM ; @param X address of new window GuiApp_SetCurrentWindow: std Y+GUIAPP_OFFS_CURRENTWINDOW_LO, xl std Y+GUIAPP_OFFS_CURRENTWINDOW_HI, xh ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_GetScreenSaver @global ; ; @param Y address of object in SDRAM ; @param CFLAG set if response is not a NULL pointer GuiApp_GetScreenSaver: ldd r18, Y+GUIAPP_OFFS_SCREENSAVER_LO ldd r19, Y+GUIAPP_OFFS_SCREENSAVER_HI sec tst r18 brne GuiApp_GetScreenSaver_ret tst r19 brne GuiApp_GetScreenSaver_ret clc GuiApp_GetScreenSaver_ret: ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_SetScreenSaver @global ; ; @param Y address of object in SDRAM ; @param X address of new window GuiApp_SetScreenSaver: std Y+GUIAPP_OFFS_SCREENSAVER_LO, xl std Y+GUIAPP_OFFS_SCREENSAVER_HI, xh ret ; @end ; *************************************************************************** ; signal handlers ; --------------------------------------------------------------------------- ; @routine GuiApp_OnDestroy @global ; ; @param Y address of object in SDRAM ; @return CFLAG set if signal handled ; @clobbers any, !Y GuiApp_OnDestroy: ; TODO (destroy rootWindow) ; Clear CFLAG so that destroy handlers of base classes are called ; after this routine returns. This way the last routine called will be ; OBJ_OnDestroy which then frees the whole SDRAM object on heap. clc ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_OnTimer ; ; @param Y address of object in SDRAM GuiApp_OnTimer: ret ; @end ; --------------------------------------------------------------------------- ; @routine GuiApp_OnMsgReceived @global ; ; @param Y address of object in SDRAM ; @param X pointer to message received in SDRAM GuiApp_OnMsgReceived: ret ; @end ; *************************************************************************** ; data in FLASH GuiApp_DefaultSignalmap: ; header .dw Object_DefaultSignalmap ; next table to use ; entries .db 0, OBJECT_SIGNAL_DESTROY, LOW(GuiApp_OnDestroy), HIGH(GuiApp_OnDestroy) .db 0, 0, 0, 0 ; end of table #endif