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_BEGIN = MAINWINDOW_SIZE
.equ LIGHTSETTINGSWIN_OFFS_ID = LIGHTSETTINGSWIN_OFFS_BEGIN+0 .equ LIGHTSETTINGSWIN_OFFS_SETTINGS_LO = LIGHTSETTINGSWIN_OFFS_BEGIN+0
.equ LIGHTSETTINGSWIN_OFFS_TYPE = LIGHTSETTINGSWIN_OFFS_BEGIN+1 .equ LIGHTSETTINGSWIN_OFFS_SETTINGS_HI = LIGHTSETTINGSWIN_OFFS_BEGIN+1
.equ LIGHTSETTINGSWIN_OFFS_TEXTRES_LO = LIGHTSETTINGSWIN_OFFS_BEGIN+2 .equ LIGHTSETTINGSWIN_SIZE = 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... ; selectors
.equ LIGHTSETTINGSWIN_OFFS_LEDNUM_LO = LIGHTSETTINGSWIN_OFFS_BEGIN+6 .equ LIGHTSETTINGSWIN_SEL_DIALOG_OK = 1
.equ LIGHTSETTINGSWIN_OFFS_LEDNUM_HI = LIGHTSETTINGSWIN_OFFS_BEGIN+7 .equ LIGHTSETTINGSWIN_SEL_DIALOG_ABORT = 2
.equ LIGHTSETTINGSWIN_OFFS_ONTIME_LO = LIGHTSETTINGSWIN_OFFS_BEGIN+8 .equ LIGHTSETTINGSWIN_SEL_NODEADDR = 3
.equ LIGHTSETTINGSWIN_OFFS_ONTIME_HI = LIGHTSETTINGSWIN_OFFS_BEGIN+9 .equ LIGHTSETTINGSWIN_SEL_LEDCOUNT = 4
.equ LIGHTSETTINGSWIN_OFFS_SOURCE1_NODEADDR = LIGHTSETTINGSWIN_OFFS_BEGIN+10 .equ LIGHTSETTINGSWIN_SEL_ONTIME = 5
.equ LIGHTSETTINGSWIN_OFFS_SOURCE1_VALUEID = LIGHTSETTINGSWIN_OFFS_BEGIN+11 .equ LIGHTSETTINGSWIN_SEL_MSRC1 = 6
.equ LIGHTSETTINGSWIN_OFFS_SOURCE2_NODEADDR = LIGHTSETTINGSWIN_OFFS_BEGIN+12 .equ LIGHTSETTINGSWIN_SEL_MSRC2 = 7
.equ LIGHTSETTINGSWIN_OFFS_SOURCE2_VALUEID = LIGHTSETTINGSWIN_OFFS_BEGIN+13 .equ LIGHTSETTINGSWIN_SEL_BSRC = 8
.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)
@@ -50,17 +48,22 @@
; @routine LightSettingsWin_new @global ; @routine LightSettingsWin_new @global
; ;
; @param Y pointer to GUIAPP ; @param Y pointer to GUIAPP
; @param r21:r20 pointer to settings
; @return CFLAG set of okay, cleared otherwise ; @return CFLAG set of okay, cleared otherwise
; @return Y address of newly created object ; @return Y address of newly created object
LightSettingsWin_new: LightSettingsWin_new:
bigcall GuiApp_GetRootWindow bigcall GuiApp_GetRootWindow ; r19:r18=root window (none)
brcc LightSettingsWin_new_ret 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 mov xh, r19
ldi r24, LOW(LIGHTSETTINGSWIN_SIZE) ldi r24, LOW(LIGHTSETTINGSWIN_SIZE)
ldi r25, HIGH(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 brcc LightSettingsWin_new_ret
rcall LightSettingsWin_Init rcall LightSettingsWin_Init
LightSettingsWin_new_ret: LightSettingsWin_new_ret:
@@ -74,17 +77,33 @@ LightSettingsWin_new_ret:
; ;
; @param Y pointer to newly allocated widget data ; @param Y pointer to newly allocated widget data
; @param X pointer to root window ; @param X pointer to root window
; @param r21:r20 pointer to settings
; @return CFLAG set of okay, cleared otherwise ; @return CFLAG set of okay, cleared otherwise
; @clobbers any, !Y ; @clobbers any, !Y
LightSettingsWin_Init: LightSettingsWin_Init:
ldi r16, 0 ; OPTS push r20
ldi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; PACK push r21
ldi r20, LOW(RESSOURCE_TXT_ROOMCLIMATE) ldi r16, 0 ; OPTS
ldi r21, HIGH(RESSOURCE_TXT_ROOMCLIMATE) ldi r17, (WIDGET_PACK_FILLED<<WIDGET_PACK_HSELF0_BIT) | (WIDGET_PACK_FILLED<<WIDGET_PACK_VSELF0_BIT) ; PACK
bigcall MainWindow_new ; Y=main window 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 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 bigcall MainWindow_GetContentWidget ; r19:r18=content window
brcc LightSettingsWin_Init_ret brcc LightSettingsWin_Init_ret
mov xl, r18 ; use content window as parent mov xl, r18 ; use content window as parent
@@ -95,7 +114,7 @@ LightSettingsWin_Init:
push yh push yh
push xl ; content window push xl ; content window
push xh push xh
rcall lightSettingsWinCreateSensorWatches rcall lightSettingsWinCreateContent
pop xh ; content window pop xh ; content window
pop xl pop xl
bigcall C03App_CreateBackButton 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) ; @param Y address of object in SDRAM
; @return CFLAG set of okay, cleared otherwise ; @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) LightSettingsWin_OnDestroy:
std Y+WIDGET_OFFS_STYLE_LO, r16 ldd xl, Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_LO
ldi r16, HIGH(LightSettingsWindow_HLayoutStyle*2) ldd xh, Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_HI
std Y+WIDGET_OFFS_STYLE_HI, r16 mov r16, xl
or r16, xh
mov xl, yl ; use HLayout as parent breq LightSettingsWin_OnDestroy_done
mov xh, yh clr r16
std Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_LO, r16
; CO2 sensor watch std Y+LIGHTSETTINGSWIN_OFFS_SETTINGS_HI, r16
push xl ; HLayout bigcall Heap_Free
push xh
ldi r16, (1<<OBJECT_OPTS_TIMER_BIT) | \ ; Clear CFLAG so that destroy handlers of base classes are called
(1<<WIDGET_OPTS_INPUT_BIT) | \ ; after this routine returns. This way the last routine called will be
(1<<OBJECT_OPTS_MSGRECV_BIT) ; OPTS ; OBJ_OnDestroy which then frees the whole SDRAM object on heap.
ldi r17, (WIDGET_PACK_BEGIN<<WIDGET_PACK_HSELF0_BIT) | \ LightSettingsWin_OnDestroy_done:
(WIDGET_PACK_BEGIN<<WIDGET_PACK_VSELF0_BIT) ; PACK clc
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:
ret ret
; @end ; @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 #endif