gui2: improved signal handling, make use of secondary signal maps.
This commit is contained in:
@@ -21,15 +21,16 @@
|
||||
.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_CURRENTWIDGET_LO = GUIAPP_OFFS_BEGIN+4
|
||||
.equ GUIAPP_OFFS_CURRENTWIDGET_HI = GUIAPP_OFFS_BEGIN+5
|
||||
.equ GUIAPP_OFFS_ROOTWINDOW_HI = GUIAPP_OFFS_BEGIN+6
|
||||
.equ GUIAPP_OFFS_TOUCHWIDGET_LO = GUIAPP_OFFS_BEGIN+7
|
||||
.equ GUIAPP_OFFS_TOUCHWIDGET_HI = GUIAPP_OFFS_BEGIN+8
|
||||
.equ GUIAPP_OFFS_DRAWTIMER = GUIAPP_OFFS_BEGIN+9
|
||||
.equ GUIAPP_SIZE = WIDGET_OFFS_BEGIN+10
|
||||
.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
|
||||
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
@@ -39,4 +40,334 @@
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @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
|
||||
|
||||
ldi r16, GUIAPP_DRAWTIMER
|
||||
std Y+GUIAPP_OFFS_DRAWTIMER, r16
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user