gui: more work on light settings window.

This commit is contained in:
Martin Preuss
2026-04-30 00:11:19 +02:00
parent db4825f483
commit 721b06a044

View File

@@ -18,24 +18,22 @@
.equ LIGHTSETTINGSWIN_OFFS_BEGIN = MAINWINDOW_SIZE
.equ LIGHTSETTINGSWIN_OFFS_ID = LIGHTSETTINGSWIN_OFFS_BEGIN+0
.equ LIGHTSETTINGSWIN_OFFS_TYPE = LIGHTSETTINGSWIN_OFFS_BEGIN+1
.equ LIGHTSETTINGSWIN_OFFS_TEXTRES_LO = LIGHTSETTINGSWIN_OFFS_BEGIN+2
.equ LIGHTSETTINGSWIN_OFFS_TEXTRES_HI = LIGHTSETTINGSWIN_OFFS_BEGIN+3
.equ LIGHTSETTINGSWIN_OFFS_NODEADDR = LIGHTSETTINGSWIN_OFFS_BEGIN+4
.equ LIGHTSETTINGSWIN_OFFS_EEPROM_ID = LIGHTSETTINGSWIN_OFFS_BEGIN+5 ; maybe remove...
.equ LIGHTSETTINGSWIN_OFFS_LEDNUM_LO = LIGHTSETTINGSWIN_OFFS_BEGIN+6
.equ LIGHTSETTINGSWIN_OFFS_LEDNUM_HI = LIGHTSETTINGSWIN_OFFS_BEGIN+7
.equ LIGHTSETTINGSWIN_OFFS_ONTIME_LO = LIGHTSETTINGSWIN_OFFS_BEGIN+8
.equ LIGHTSETTINGSWIN_OFFS_ONTIME_HI = LIGHTSETTINGSWIN_OFFS_BEGIN+9
.equ LIGHTSETTINGSWIN_OFFS_SOURCE1_NODEADDR = LIGHTSETTINGSWIN_OFFS_BEGIN+10
.equ LIGHTSETTINGSWIN_OFFS_SOURCE1_VALUEID = LIGHTSETTINGSWIN_OFFS_BEGIN+11
.equ LIGHTSETTINGSWIN_OFFS_SOURCE2_NODEADDR = LIGHTSETTINGSWIN_OFFS_BEGIN+12
.equ LIGHTSETTINGSWIN_OFFS_SOURCE2_VALUEID = LIGHTSETTINGSWIN_OFFS_BEGIN+13
.equ LIGHTSETTINGSWIN_OFFS_BSOURCE_NODEADDR = LIGHTSETTINGSWIN_OFFS_BEGIN+14
.equ LIGHTSETTINGSWIN_OFFS_BSOURCE_VALUEID = LIGHTSETTINGSWIN_OFFS_BEGIN+15
.equ LIGHTSETTINGSWIN_OFFS_COLORS = LIGHTSETTINGSWIN_OFFS_BEGIN+16
.equ LIGHTSETTINGSWIN_SIZE = LIGHTSETTINGSWIN_OFFS_COLORS+(LIGHTSETTINGSWIN_NUM_COLORS*2)
.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
@@ -50,17 +48,22 @@
; @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
bigcall GuiApp_GetRootWindow ; r19:r18=root window (none)
brcc LightSettingsWin_new_ret
mov xl, r18 ; use root window as parent for main window
mov xl, r18 ; use root window as parent for main window
mov xh, r19
ldi r24, LOW(LIGHTSETTINGSWIN_SIZE)
ldi r25, HIGH(LIGHTSETTINGSWIN_SIZE)
bigcall Object_Alloc ; Y=space (!r16, !r17, !X)
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:
@@ -74,17 +77,33 @@ LightSettingsWin_new_ret:
;
; @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:
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_ROOMCLIMATE)
ldi r21, HIGH(RESSOURCE_TXT_ROOMCLIMATE)
bigcall MainWindow_new ; Y=main window
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
@@ -95,7 +114,7 @@ LightSettingsWin_Init:
push yh
push xl ; content window
push xh
rcall lightSettingsWinCreateSensorWatches
rcall lightSettingsWinCreateContent
pop xh ; content window
pop xl
bigcall C03App_CreateBackButton
@@ -107,75 +126,36 @@ LightSettingsWin_Init_ret:
; ***************************************************************************
; signal handlers
; ---------------------------------------------------------------------------
; @routine lightSettingsWinCreateSensorWatches
; @routine LightSettingsWin_OnDestroy @global
;
; @param X pointer to MainWindow content window (becomes parent)
; @return CFLAG set of okay, cleared otherwise
; @param Y address of object in SDRAM
; @return CFLAG set if signal handled
; @clobbers any, !Y
lightSettingsWinCreateSensorWatches:
ldi r16, 0 ; OPTS
ldi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; PACK
ldi r20, HLAYOUT_MODE_SPREAD
bigcall HLayout_new
brcc lightSettingsWinCreateSensorWatches_ret
ldi r16, LOW(LightSettingsWindow_HLayoutStyle*2)
std Y+WIDGET_OFFS_STYLE_LO, r16
ldi r16, HIGH(LightSettingsWindow_HLayoutStyle*2)
std Y+WIDGET_OFFS_STYLE_HI, r16
mov xl, yl ; use HLayout as parent
mov xh, yh
; CO2 sensor watch
push xl ; HLayout
push xh
ldi r16, (1<<OBJECT_OPTS_TIMER_BIT) | \
(1<<WIDGET_OPTS_INPUT_BIT) | \
(1<<OBJECT_OPTS_MSGRECV_BIT) ; OPTS
ldi r17, (WIDGET_PACK_BEGIN<<WIDGET_PACK_HSELF0_BIT) | \
(WIDGET_PACK_BEGIN<<WIDGET_PACK_VSELF0_BIT) ; PACK
ldi r20, VALUE_ID_SENSOR_CO2_BASE
ldi r21, C03_EEID_SENSOR_CO2
ldi r22, SENSORWATCH_TYPE_CO2
bigcall SensorWatch_new
pop xh
pop xl
brcc lightSettingsWinCreateSensorWatches_ret
; temp sensor watch
push xl ; HLayout
push xh
ldi r16, (1<<OBJECT_OPTS_TIMER_BIT) | \
(1<<WIDGET_OPTS_INPUT_BIT) | \
(1<<OBJECT_OPTS_MSGRECV_BIT); OPTS
ldi r17, (WIDGET_PACK_BEGIN<<WIDGET_PACK_HSELF0_BIT) | \
(WIDGET_PACK_BEGIN<<WIDGET_PACK_VSELF0_BIT) ; PACK
ldi r20, VALUE_ID_SENSOR_TEMP_BASE
ldi r21, C03_EEID_SENSOR_TEMP
ldi r22, SENSORWATCH_TYPE_TEMP
bigcall SensorWatch_new
pop xh
pop xl
brcc lightSettingsWinCreateSensorWatches_ret
; humidity sensor watch
push xl ; HLayout
push xh
ldi r16, (1<<OBJECT_OPTS_TIMER_BIT) | \
(1<<WIDGET_OPTS_INPUT_BIT) | \
(1<<OBJECT_OPTS_MSGRECV_BIT); OPTS
ldi r17, (WIDGET_PACK_BEGIN<<WIDGET_PACK_HSELF0_BIT) | \
(WIDGET_PACK_BEGIN<<WIDGET_PACK_VSELF0_BIT) ; PACK
ldi r20, VALUE_ID_SENSOR_HUM_BASE
ldi r21, C03_EEID_SENSOR_HUM
ldi r22, SENSORWATCH_TYPE_HUM
bigcall SensorWatch_new
pop xh
pop xl
lightSettingsWinCreateSensorWatches_ret:
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
@@ -184,5 +164,196 @@ lightSettingsWinCreateSensorWatches_ret:
; ---------------------------------------------------------------------------
; @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