472 lines
13 KiB
NASM
472 lines
13 KiB
NASM
; ***************************************************************************
|
|
; 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_SCREENSAVER_ASM
|
|
#define AQH_AVR_GUI2_SCREENSAVER_ASM
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; defines
|
|
|
|
.equ SCREENSAVER_TIMER100ms = 6000 ; 10mins
|
|
;.equ SCREENSAVER_TIMER100ms = 300 ; 30 secs
|
|
|
|
; SDRAM data
|
|
.equ SCREENSAVER_SD_OFFS_BEGIN = WIDGET_SD_SIZE
|
|
.equ SCREENSAVER_SD_OFFS_TIMER_LO = SCREENSAVER_SD_OFFS_BEGIN+0
|
|
.equ SCREENSAVER_SD_OFFS_TIMER_HI = SCREENSAVER_SD_OFFS_BEGIN+1
|
|
.equ SCREENSAVER_SD_OFFS_PREV_VIEW_LO = SCREENSAVER_SD_OFFS_BEGIN+2
|
|
.equ SCREENSAVER_SD_OFFS_PREV_VIEW_HI = SCREENSAVER_SD_OFFS_BEGIN+3
|
|
.equ SCREENSAVER_SD_OFFS_NODEADDR1 = SCREENSAVER_SD_OFFS_BEGIN+4
|
|
.equ SCREENSAVER_SD_OFFS_VALUEID1 = SCREENSAVER_SD_OFFS_BEGIN+5
|
|
.equ SCREENSAVER_SD_OFFS_NODEADDR2 = SCREENSAVER_SD_OFFS_BEGIN+6
|
|
.equ SCREENSAVER_SD_OFFS_VALUEID2 = SCREENSAVER_SD_OFFS_BEGIN+7
|
|
.equ SCREENSAVER_SD_SIZE = SCREENSAVER_SD_OFFS_BEGIN+8
|
|
|
|
|
|
; EEPROM data
|
|
.equ SCREENSAVER_EE_OFFS_NODEADDR1 = 0
|
|
.equ SCREENSAVER_EE_OFFS_VALUEID1 = 1
|
|
.equ SCREENSAVER_EE_OFFS_NODEADDR2 = 2
|
|
.equ SCREENSAVER_EE_OFFS_VALUEID2 = 3
|
|
.equ SCREENSAVER_EE_SIZE = 4
|
|
|
|
|
|
; signals
|
|
.equ SCREENSAVER_SIGNAL_SETSOURCE1 = WIDGET_SIGNAL_NEXTFREE+0
|
|
.equ SCREENSAVER_SIGNAL_SETSOURCE2 = WIDGET_SIGNAL_NEXTFREE+1
|
|
.equ SCREENSAVER_SIGNAL_NEXTFREE = WIDGET_SIGNAL_NEXTFREE+2
|
|
|
|
|
|
|
|
; ***************************************************************************
|
|
; code
|
|
|
|
.cseg
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine ScreenSaver_KeepAlive @global
|
|
;
|
|
; @param Z byte address of widget object (for LPM!)
|
|
; @clobbers any, !Y, !Z
|
|
|
|
ScreenSaver_KeepAlive:
|
|
push yl
|
|
push yh
|
|
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget (none)
|
|
ldd r24, Y+SCREENSAVER_SD_OFFS_TIMER_LO
|
|
ldd r25, Y+SCREENSAVER_SD_OFFS_TIMER_HI
|
|
mov r16, r24
|
|
or r16, r25
|
|
brne ScreenSaver_KeepAlive_restartCounter
|
|
; counter is 0, screen saver active, leave
|
|
rcall ScreenSaver_Leave ; (any, !Z)
|
|
|
|
ScreenSaver_KeepAlive_restartCounter:
|
|
ldi r16, LOW(SCREENSAVER_TIMER100ms)
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r16
|
|
ldi r16, HIGH(SCREENSAVER_TIMER100ms)
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r16
|
|
ScreenSaver_KeepAlive_ret:
|
|
pop yh
|
|
pop yl
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine ScreenSaver_Enter @global
|
|
;
|
|
; @param Z byte address of widget object (for LPM!)
|
|
; @clobbers any, !Z
|
|
|
|
ScreenSaver_Enter:
|
|
bigcall Widget_GetApp ; r19;r18=app
|
|
push zl
|
|
push zh
|
|
mov zl, r18
|
|
mov zh, r19
|
|
bigcall GuiApp_GetCurrentView ; X=current view (Y)
|
|
pop zh
|
|
pop zl
|
|
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget (none)
|
|
cp xl, zl
|
|
brne ScreenSaver_Enter_store
|
|
cp xh, zh
|
|
breq ScreenSaver_Enter_ret
|
|
ScreenSaver_Enter_store:
|
|
std Y+SCREENSAVER_SD_OFFS_PREV_VIEW_LO, xl
|
|
std Y+SCREENSAVER_SD_OFFS_PREV_VIEW_HI, xh
|
|
clr r16
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r16
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r16
|
|
|
|
push zl
|
|
push zh
|
|
mov xl, zl
|
|
mov xh, zh
|
|
mov zl, r18
|
|
mov zh, r19
|
|
bigcall GuiApp_ShowView ; select view: screensaver
|
|
pop zh
|
|
pop zl
|
|
|
|
clr r16
|
|
bigcall Display_SetBacklight
|
|
ScreenSaver_Enter_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine ScreenSaver_Leave @global
|
|
;
|
|
; @param Z byte address of widget object (for LPM!)
|
|
; @clobbers any, !Z
|
|
|
|
ScreenSaver_Leave:
|
|
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget (none)
|
|
ldd xl, Y+SCREENSAVER_SD_OFFS_PREV_VIEW_LO
|
|
ldd xh, Y+SCREENSAVER_SD_OFFS_PREV_VIEW_HI
|
|
|
|
; restart screen saver timer
|
|
ldi r16, LOW(SCREENSAVER_TIMER100ms)
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r16
|
|
ldi r16, HIGH(SCREENSAVER_TIMER100ms)
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r16
|
|
|
|
; show previous view
|
|
bigcall Widget_GetApp ; r19;r18=app
|
|
push zl
|
|
push zh
|
|
mov zl, r18
|
|
mov zh, r19
|
|
bigcall GuiApp_ShowView
|
|
pop zh
|
|
pop zl
|
|
|
|
ldi r16, 0xff
|
|
bigcall Display_SetBacklight
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine ScreenSaver_OnTimer @global
|
|
;
|
|
; @param Z byte address of widget object (for LPM!)
|
|
; @clobbers any, !Z
|
|
|
|
ScreenSaver_OnTimer:
|
|
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget (none)
|
|
ldd r24, Y+SCREENSAVER_SD_OFFS_TIMER_LO
|
|
ldd r25, Y+SCREENSAVER_SD_OFFS_TIMER_HI
|
|
mov r16, r24
|
|
or r16, r25
|
|
breq ScreenSaver_OnTimer_ret
|
|
sbiw r25:r24, 1
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r24
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r25
|
|
brne ScreenSaver_OnTimer_ret
|
|
rcall ScreenSaver_Enter ; (any, !Z)
|
|
ScreenSaver_OnTimer_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine ScreenSaver_OnCreate @global
|
|
;
|
|
; @param Z byte address of widget object (for LPM!)
|
|
; @return CFLAG set if signal handled
|
|
; @clobbers any, !Z
|
|
|
|
ScreenSaver_OnCreate:
|
|
bigcall OBJ_IsObject ; (none)
|
|
brcc ScreenSaver_OnCreate_ret
|
|
|
|
; preset SDRAM
|
|
bigcall Widget_GetSdramPtr ; (none)
|
|
clr r16
|
|
ldi r17, SCREENSAVER_SD_SIZE
|
|
push yl
|
|
push yh
|
|
ScreenSaver_OnCreate_loop:
|
|
st Y+, r16
|
|
dec r17
|
|
brne ScreenSaver_OnCreate_loop
|
|
pop yh
|
|
pop yl
|
|
|
|
push yl
|
|
push yh
|
|
bigcall Widget_OnCreate
|
|
pop yh
|
|
pop yl
|
|
|
|
ldi r16, LOW(SCREENSAVER_TIMER100ms)
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_LO, r16
|
|
ldi r16, HIGH(SCREENSAVER_TIMER100ms)
|
|
std Y+SCREENSAVER_SD_OFFS_TIMER_HI, r16
|
|
|
|
ldi r16, 0xff
|
|
bigcall Display_SetBacklight
|
|
|
|
rcall screenSaverReadFromEeprom
|
|
|
|
ScreenSaver_OnCreate_ret:
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine ScreenSaver_OnTouch @global
|
|
;
|
|
; @param Z byte address of widget object (for LPM!)
|
|
; @param X pointer to TOUCH event (see @ref WIDGET_DATA_TOUCH_OFFS_X_LO)
|
|
; @return CFLAG set if signal handled
|
|
; @clobbers any, !Z
|
|
|
|
ScreenSaver_OnTouch:
|
|
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget
|
|
|
|
; read touch signal data from X
|
|
adiw xh:xl, WIDGET_DATA_TOUCH_OFFS_STATE
|
|
ld r22, X ; WIDGET_DATA_TOUCH_OFFS_STATE
|
|
sbiw xh:xl, WIDGET_DATA_TOUCH_OFFS_STATE
|
|
|
|
sbrs r22, DISPLAY_IFLAGS_PRESSED_BIT
|
|
rjmp ScreenSaver_OnTouch_up
|
|
; down (active touch), switch display on
|
|
ldi r16, 0xff
|
|
bigcall Display_SetBacklight
|
|
rjmp ScreenSaver_OnTouch_ret
|
|
ScreenSaver_OnTouch_up:
|
|
rcall ScreenSaver_Leave
|
|
ScreenSaver_OnTouch_ret:
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine ScreenSaver_OnMsgReceived @global
|
|
;
|
|
; @param Z byte address of widget object (for LPM!)
|
|
; @param XL node addr
|
|
; @param XH value id
|
|
; @return CFLAG set if signal handled
|
|
; @clobbers any, !Z
|
|
|
|
ScreenSaver_OnMsgReceived:
|
|
push zl
|
|
push zh
|
|
mov yl, zl
|
|
mov yh, zh
|
|
ldi zl, LOW(ScreenSaver_MsgTable*2)
|
|
ldi zh, HIGH(ScreenSaver_MsgTable*2)
|
|
bigcall Main_HandleValueMsg ; (any)
|
|
pop zh
|
|
pop zl
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine screenSaverHandleSetSource1
|
|
;
|
|
; @param Y byte address of widget object (for LPM!)
|
|
; @param R17 value id
|
|
; @param R19:R18 value
|
|
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
|
|
; @param R22 source address
|
|
; @param R23 command
|
|
; @param R25:R24 message id
|
|
; @return CFLAG set if ACK/NACK requested
|
|
; @return R23 command value for ACK/NACK message
|
|
; @clobbers R16, R17, R18, R20, R21, X, Y, Z
|
|
|
|
screenSaverHandleSetSource1:
|
|
mov zl, yl
|
|
mov zh, yh
|
|
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget
|
|
std Y+SCREENSAVER_SD_OFFS_NODEADDR1, r18
|
|
std Y+SCREENSAVER_SD_OFFS_VALUEID1, r19
|
|
rcall screenSaverWriteToEeprom ; (R16, R17, R18, R20, R21, X, Y)
|
|
ldi r23, NETMSG_CMD_VALUE_SET_ACK
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine screenSaverHandleSetSource2
|
|
;
|
|
; @param Y byte address of widget object (for LPM!)
|
|
; @param R17 value id
|
|
; @param R19:R18 value
|
|
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
|
|
; @param R22 source address
|
|
; @param R23 command
|
|
; @param R25:R24 message id
|
|
; @return CFLAG set if ACK/NACK requested
|
|
; @return R23 command value for ACK/NACK message
|
|
; @clobbers R16, R17, R18, R20, R21, X, Y, Z
|
|
|
|
screenSaverHandleSetSource2:
|
|
mov zl, yl
|
|
mov zh, yh
|
|
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget
|
|
std Y+SCREENSAVER_SD_OFFS_NODEADDR1, r18
|
|
std Y+SCREENSAVER_SD_OFFS_VALUEID1, r19
|
|
rcall screenSaverWriteToEeprom ; (R16, R17, R18, R20, R21, X, Y)
|
|
ldi r23, NETMSG_CMD_VALUE_SET_ACK
|
|
sec
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine screenSaverHandleReport
|
|
;
|
|
; @param Y byte address of widget object (for LPM!)
|
|
; @param R17 value id
|
|
; @param R19:R18 value
|
|
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
|
|
; @param R22 source address
|
|
; @param R23 command
|
|
; @param R25:R24 message id
|
|
; @return CFLAG cleared (no ACK/NACK requested)
|
|
; @clobbers any
|
|
|
|
screenSaverHandleReport:
|
|
mov zl, yl
|
|
mov zh, yh
|
|
bigcall Widget_GetSdramPtr ; Y:=SDRAM data for widget
|
|
mov r16, r18 ; check for non-zero value
|
|
or r16, r19
|
|
breq screenSaverHandleReport_end
|
|
ldd r16, Y+SCREENSAVER_SD_OFFS_NODEADDR1
|
|
cp r16, r22
|
|
brne screenSaverHandleReport_l1
|
|
ldd r16, Y+SCREENSAVER_SD_OFFS_VALUEID1
|
|
cp r16, r17
|
|
breq screenSaverHandleReport_matches
|
|
|
|
screenSaverHandleReport_l1:
|
|
ldd r16, Y+SCREENSAVER_SD_OFFS_NODEADDR2
|
|
cp r16, r22
|
|
brne screenSaverHandleReport_end
|
|
ldd r16, Y+SCREENSAVER_SD_OFFS_VALUEID2
|
|
cp r16, r17
|
|
brne screenSaverHandleReport_end
|
|
screenSaverHandleReport_matches:
|
|
rcall ScreenSaver_KeepAlive
|
|
screenSaverHandleReport_end:
|
|
clc ; no ACK needed
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine screenSaverWriteToEeprom
|
|
;
|
|
; @param Z byte address of widget object (for LPM!)
|
|
; @return CFLAG set if data found and read, cleared on error
|
|
; @clobbers R16, R17, R18, R20, R21, X, Y
|
|
|
|
screenSaverWriteToEeprom:
|
|
ldi r16, EEID_SCREENSAVER
|
|
bigcall EepromTlv_FindFirst ; (R18)
|
|
brcs screenSaverWriteToEeprom_write
|
|
ldi r16, EEID_SCREENSAVER
|
|
ldi r17, SCREENSAVER_EE_SIZE
|
|
bigcall EepromTlv_AddTlv ; X=pointer to EEPROM data (R16, R18, R20, R21)
|
|
brcc screenSaverWriteToEeprom_ret
|
|
screenSaverWriteToEeprom_write:
|
|
bigcall Widget_GetSdramPtr ; (none)
|
|
adiw yh:yl, SCREENSAVER_SD_OFFS_NODEADDR1
|
|
ldi r18, SCREENSAVER_EE_SIZE
|
|
screenSaverWriteToEeprom_loop:
|
|
ld r16, Y+
|
|
bigcall Eeprom_WriteByteIfChanged ; (R17)
|
|
brcc screenSaverWriteToEeprom_ret
|
|
adiw xh:xl, 1
|
|
dec r18
|
|
brne screenSaverWriteToEeprom_loop
|
|
sec
|
|
screenSaverWriteToEeprom_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine screenSaverReadFromEeprom
|
|
;
|
|
; @param Z byte address of widget object (for LPM!)
|
|
; @return CFLAG set if data found and read, cleared on error
|
|
; @clobbers R16, R18, X, Y
|
|
|
|
screenSaverReadFromEeprom:
|
|
ldi r16, EEID_SCREENSAVER
|
|
bigcall EepromTlv_FindFirst ; (R18)
|
|
brcc screenSaverReadFromEeprom_ret
|
|
bigcall Widget_GetSdramPtr ; (none)
|
|
adiw yh:yl, SCREENSAVER_SD_OFFS_NODEADDR1
|
|
ldi r18, SCREENSAVER_EE_SIZE
|
|
screenSaverReadFromEeprom_loop:
|
|
bigcall Eeprom_ReadByte ; R16=byte (none)
|
|
brcc screenSaverReadFromEeprom_ret
|
|
st Y+, r16
|
|
adiw xh:xl, 1
|
|
dec r18
|
|
brne screenSaverReadFromEeprom_loop
|
|
sec
|
|
screenSaverReadFromEeprom_ret:
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
ScreenSaver_MsgTable:
|
|
.dw NETMSG_CMD_VALUE_SET | (VALUE_ID_SCREENSAVER_SETSOURCE1<<8), screenSaverHandleSetSource1
|
|
.dw NETMSG_CMD_VALUE_SET | (VALUE_ID_SCREENSAVER_SETSOURCE2<<8), screenSaverHandleSetSource2
|
|
.dw NETMSG_CMD_VALUE_REPORT, screenSaverHandleReport
|
|
.dw 0, 0
|
|
|
|
|
|
ScreenSaver_DefaultSignalmap:
|
|
.db 0, OBJECT_SIGNAL_TIMER, LOW(ScreenSaver_OnTimer), HIGH(ScreenSaver_OnTimer)
|
|
.db 0, WIDGET_SIGNAL_TOUCH, LOW(ScreenSaver_OnTouch), HIGH(ScreenSaver_OnTouch)
|
|
.db 0, OBJECT_SIGNAL_RECVMSG, LOW(ScreenSaver_OnMsgReceived), HIGH(ScreenSaver_OnMsgReceived)
|
|
.db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw)
|
|
.db 0, OBJECT_SIGNAL_CREATE, LOW(ScreenSaver_OnCreate), HIGH(ScreenSaver_OnCreate)
|
|
.db 0, 0, 0, 0 ; end of table
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|