Files
aqhomecontrol/avr/devices/c03/main/w_lightsettings.asm
2026-04-30 00:11:19 +02:00

360 lines
9.6 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_W_LIGHTSETTINGS_ASM
#define AQH_AVR_W_LIGHTSETTINGS_ASM
; ***************************************************************************
; defines
.equ LIGHTSETTINGSWIN_NUM_COLORS = 8
.equ LIGHTSETTINGSWIN_OFFS_BEGIN = MAINWINDOW_SIZE
.equ LIGHTSETTINGSWIN_OFFS_SETTINGS_LO = LIGHTSETTINGSWIN_OFFS_BEGIN+0
.equ LIGHTSETTINGSWIN_OFFS_SETTINGS_HI = LIGHTSETTINGSWIN_OFFS_BEGIN+1
.equ LIGHTSETTINGSWIN_SIZE = LIGHTSETTINGSWIN_OFFS_BEGIN+2
; selectors
.equ LIGHTSETTINGSWIN_SEL_DIALOG_OK = 1
.equ LIGHTSETTINGSWIN_SEL_DIALOG_ABORT = 2
.equ LIGHTSETTINGSWIN_SEL_NODEADDR = 3
.equ LIGHTSETTINGSWIN_SEL_LEDCOUNT = 4
.equ LIGHTSETTINGSWIN_SEL_ONTIME = 5
.equ LIGHTSETTINGSWIN_SEL_MSRC1 = 6
.equ LIGHTSETTINGSWIN_SEL_MSRC2 = 7
.equ LIGHTSETTINGSWIN_SEL_BSRC = 8
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine LightSettingsWin_new @global
;
; @param Y pointer to GUIAPP
; @param r21:r20 pointer to settings
; @return CFLAG set of okay, cleared otherwise
; @return Y address of newly created object
LightSettingsWin_new:
bigcall GuiApp_GetRootWindow ; r19:r18=root window (none)
brcc LightSettingsWin_new_ret
mov xl, r18 ; use root window as parent for main window
mov xh, r19
ldi r24, LOW(LIGHTSETTINGSWIN_SIZE)
ldi r25, HIGH(LIGHTSETTINGSWIN_SIZE)
push r20
push r21
bigcall Object_Alloc ; Y=space (!r16, !r17, !X)
pop r21
pop r20
brcc LightSettingsWin_new_ret
rcall LightSettingsWin_Init
LightSettingsWin_new_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine LightSettingsWin_new @global
;
; @param Y pointer to newly allocated widget data
; @param X pointer to root window
; @param r21:r20 pointer to settings
; @return CFLAG set of okay, cleared otherwise
; @clobbers any, !Y
LightSettingsWin_Init:
push r20
push r21
ldi r16, 0 ; OPTS
ldi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; PACK
ldi r20, LOW(RESSOURCE_TXT_LIGHTSETTINGS)
ldi r21, HIGH(RESSOURCE_TXT_LIGHTSETTINGS)
bigcall MainWindow_Init ; Y=main window
pop r21
pop r20
brcc LightSettingsWin_Init_ret
; store data
std Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_LO, r20
std Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_HI, r21
; set default signal map
ldi r16, LOW(LightSettingsWin_DefaultSignalmap*2)
std Y+OBJECT_OFFS_SIGNALMAP_LO, r16
ldi r16, HIGH(LightSettingsWin_DefaultSignalmap*2)
std Y+OBJECT_OFFS_SIGNALMAP_HI, r16
; create child widgets
bigcall MainWindow_GetContentWidget ; r19:r18=content window
brcc LightSettingsWin_Init_ret
mov xl, r18 ; use content window as parent
mov xh, r19
; Y=MainWindow
push yl ; main window
push yh
push xl ; content window
push xh
rcall lightSettingsWinCreateContent
pop xh ; content window
pop xl
bigcall C03App_CreateBackButton
pop yh ; main window
pop yl
LightSettingsWin_Init_ret:
ret
; @end
; ***************************************************************************
; signal handlers
; ---------------------------------------------------------------------------
; @routine LightSettingsWin_OnDestroy @global
;
; @param Y address of object in SDRAM
; @return CFLAG set if signal handled
; @clobbers any, !Y
LightSettingsWin_OnDestroy:
ldd xl, Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_LO
ldd xh, Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_HI
mov r16, xl
or r16, xh
breq LightSettingsWin_OnDestroy_done
clr r16
std Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_LO, r16
std Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_HI, r16
bigcall Heap_Free
; 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.
LightSettingsWin_OnDestroy_done:
clc
ret
; @end
; ---------------------------------------------------------------------------
; @routine lightSettingsWinCreateContent
;
; @param Y pointer to MainWindow
; @param X pointer to MainWindow content window (becomes parent)
; @return CFLAG set of okay, cleared otherwise
lightSettingsWinCreateContent:
mov zl, yl
mov zh, yh
; create MLayout
ldi r16, 0 ; OPTS
ldi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; PACK
ldi r20, 2 ; columns per row
push zl
push zh
bigcall MCLayout_new
pop zh
pop zl
brcc lightSettingsWinCreateContent_ret
mov xl, yl ; use MLayout as parent
mov xh, yh
rcall lightSettingsWinCreateLine1
brcc lightSettingsWinCreateContent_ret
rcall lightSettingsWinCreateLine2
brcc lightSettingsWinCreateContent_ret
sec
lightSettingsWinCreateContent_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine lightSettingsWinCreateLine1
;
; @param X parent (mlayout widget)
; @param Z main window
; @clobbers any, !X, !Z
lightSettingsWinCreateLine1:
; label
ldi r20, LOW(RESSOURCE_TXT_LEDNODEADDR)
ldi r21, HIGH(RESSOURCE_TXT_LEDNODEADDR)
rcall lightSettingsWinCreateLabel ; Y=new widget (any, !X, !Z)
brcc lightSettingsWinCreateLine1_ret
; input
ldi r20, 0 ; postkomma digits
ldi r21, 3 ; total digits
ldi r22, LIGHTSETTINGSWIN_SEL_NODEADDR
ldi r18, 0
ldi r19, 255
rcall lightSettingsWinCreateHSpinner ; Y=new widget (any, !X, !Z)
lightSettingsWinCreateLine1_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine lightSettingsWinCreateLine2
;
; @param X parent (mlayout widget)
; @param Z main window
; @clobbers any, !X, !Z
lightSettingsWinCreateLine2:
; label
ldi r20, LOW(RESSOURCE_TXT_LEDCOUNT)
ldi r21, HIGH(RESSOURCE_TXT_LEDCOUNT)
rcall lightSettingsWinCreateLabel ; Y=new widget (any, !X, !Z)
brcc lightSettingsWinCreateLine2_ret
; input
ldi r20, 0 ; postkomma digits
ldi r21, 3 ; total digits
ldi r22, LIGHTSETTINGSWIN_SEL_LEDCOUNT
ldi r18, 1
ldi r19, 255
rcall lightSettingsWinCreateHSpinner ; Y=new widget (any, !X, !Z)
lightSettingsWinCreateLine2_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine lightSettingsWinCreateLabel
;
; @param X parent
; @param r21:r20 id of text ressource
; @return CFLAG set if created, cleared otherwise
; @return Y new object created
; @clobbers any, !X, !Z
lightSettingsWinCreateLabel:
push xl
push xh
push zl
push zh
ldi r16, 0
ldi r17, (WIDGET_PACK_BEGIN<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VSELF0_BIT) | \
(WIDGET_PACK_BEGIN<<WIDGET_PACK_HCONTENT0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VCONTENT0_BIT)
bigcall Label_new
pop zh
pop zl
pop xh
pop xl
ret
; @end
; ---------------------------------------------------------------------------
; @routine lightSettingsWinCreateHSpinner
;
; @param X parent
; @param r20 number of postkomma digits
; @param r21 total number of digits (including komma, if r20>0)
; @param r22 selector
; @param r18 minimum value
; @param r19 maximum value
; @param Z target
; @return CFLAG set if created, cleared otherwise
; @return Y new object created
; @clobbers any, !X, !Z
lightSettingsWinCreateHSpinner:
push r18
push r19
push r22
push xl
push xh
push zl
push zh
ldi r16, 0
ldi r17, (WIDGET_PACK_BEGIN<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VSELF0_BIT) | \
(WIDGET_PACK_BEGIN<<WIDGET_PACK_HCONTENT0_BIT) | (WIDGET_PACK_CENTER<<WIDGET_PACK_VCONTENT0_BIT)
bigcall HSpinner_new
pop zh
pop zl
pop xh
pop xl
pop r22
pop r19
pop r18
brcc lightSettingsWinCreateHSpinner_ret
std Y+OBJECT_OFFS_SELECTOR, r22
std Y+OBJECT_OFFS_TARGET_LO, zl ; main window
std Y+OBJECT_OFFS_TARGET_HI, zh
push xl
push xh
push zl
push zh
mov xl, r18
clr xh
push r19
bigcall HSpinner_SetMinValue
pop r19
mov xl, r19
clr xh
bigcall HSpinner_SetMaxValue
pop zh
pop zl
pop xh
pop xl
sec
lightSettingsWinCreateHSpinner_ret:
ret
; @end
; ***************************************************************************
; data in FLASH
LightSettingsWin_DefaultSignalmap:
; header
.dw MainWindow_DefaultSignalmap*2 ; next table to use
; entries
.db 0, OBJECT_SIGNAL_DESTROY, LOW(LightSettingsWin_OnDestroy), HIGH(LightSettingsWin_OnDestroy)
.db 0, 0, 0, 0 ; end of table
#endif