c03: implemented setdata message handling for SensorWatch

storing/restoring data from EEPROM doesn't work, yet.
This commit is contained in:
Martin Preuss
2026-01-21 22:48:44 +01:00
parent e5a999e9b6
commit d64157f7ef
5 changed files with 294 additions and 97 deletions

View File

@@ -1,5 +1,5 @@
C01 C03
=== ===
- Role: Controller with Display - Role: Controller with Display
@@ -8,3 +8,11 @@ C01
- Periphery: - Periphery:
- Display with SPI - Display with SPI
SetLimits:
aqhome-tool setdata -N nodes/xxxxxxxx/CO2_LIMIT_CRIT -v "LOWER:UPPER"
aqhome-tool setdata -N nodes/xxxxxxxx/CO2_LIMIT_WARN -v "LOWER:UPPER"

View File

@@ -66,6 +66,9 @@ winClimateSensor3Value_ramdata:
buttonClimateNetwork_ramdata: buttonClimateNetwork_ramdata:
.byte IMGVIEW_SD_SIZE .byte IMGVIEW_SD_SIZE
debugValue1_ramdata:
.byte VLABEL_SD_SIZE
; *************************************************************************** ; ***************************************************************************
@@ -158,25 +161,25 @@ winClimate_signalmap:
winClimateSensor1: winClimateSensor1:
; OBJECT ; OBJECT
.db 0x55, 0xaa ; magic .db 0x55, 0xaa ; magic
.dw winClimateSensor2*2 ; next .dw winClimateSensor2*2 ; next
.dw winClimateBody*2 ; parent .dw winClimateBody*2 ; parent
.dw winClimateSensor1Title*2 ; first child .dw winClimateSensor1Title*2 ; first child
.dw 0 ; target .dw 0 ; target
.dw 0 ; selector (ony lower 8 bits used) .dw 0 ; selector (ony lower 8 bits used)
.dw SensorWatch_DefaultSignalmap*2 ; signal map .dw SensorWatch_DefaultSignalmap*2 ; signal map
; WIDGET ; WIDGET
.db (1<<WIDGET_OPTSLO_MSGRECV_BIT), 0 ; opts lo, hi .db (1<<WIDGET_OPTSLO_MSGRECV_BIT), 0 ; opts lo, hi
.dw 4 ; X .dw 4 ; X
.dw 4 ; Y .dw 4 ; Y
.dw 100 ; W (image=96, 2 px borders) .dw 100 ; W (image=96, 2 px borders)
.dw 100 ; H .dw 100 ; H
.dw STYLE_WIN_FOREGROUND ; front color .dw STYLE_WIN_FOREGROUND ; front color
.dw STYLE_WIN_BACKGROUND ; back color .dw STYLE_WIN_BACKGROUND ; back color
.dw STYLE_WIN_FONT*2 ; font .dw STYLE_WIN_FONT*2 ; font
.dw winClimateSensor1_ramdata ; ptr to SDRAM .dw winClimateSensor1_ramdata ; ptr to SDRAM
; SENSORWATCH ; SENSORWATCH
.db 0, 0 ; baseValueId, eepromId .db VALUE_ID_SENSOR_CO2_BASE, C03_EEID_SENSOR_CO2 ; baseValueId, eepromId
winClimateSensor1Title: winClimateSensor1Title:
@@ -256,25 +259,25 @@ winClimate_signalmap:
winClimateSensor2: winClimateSensor2:
; OBJECT ; OBJECT
.db 0x55, 0xaa ; magic .db 0x55, 0xaa ; magic
.dw winClimateSensor3*2 ; next .dw winClimateSensor3*2 ; next
.dw winClimateBody*2 ; parent .dw winClimateBody*2 ; parent
.dw winClimateSensor2Title*2 ; first child .dw winClimateSensor2Title*2 ; first child
.dw 0 ; target .dw 0 ; target
.dw 0 ; selector (ony lower 8 bits used) .dw 0 ; selector (ony lower 8 bits used)
.dw SensorWatch_DefaultSignalmap*2 ; signal map .dw SensorWatch_DefaultSignalmap*2 ; signal map
; WIDGET ; WIDGET
.db (1<<WIDGET_OPTSLO_MSGRECV_BIT), 0 ; opts lo, hi .db (1<<WIDGET_OPTSLO_MSGRECV_BIT), 0 ; opts lo, hi
.dw 108 ; X .dw 108 ; X
.dw 4 ; Y .dw 4 ; Y
.dw 100 ; W (image=96, 2 px borders) .dw 100 ; W (image=96, 2 px borders)
.dw 100 ; H .dw 100 ; H
.dw STYLE_WIN_FOREGROUND ; front color .dw STYLE_WIN_FOREGROUND ; front color
.dw STYLE_WIN_BACKGROUND ; back color .dw STYLE_WIN_BACKGROUND ; back color
.dw STYLE_WIN_FONT*2 ; font .dw STYLE_WIN_FONT*2 ; font
.dw winClimateSensor2_ramdata ; ptr to SDRAM .dw winClimateSensor2_ramdata ; ptr to SDRAM
; SENSORWATCH ; SENSORWATCH
.db 0, 0 ; baseValueId, eepromId .db VALUE_ID_SENSOR_TEMP_BASE, C03_EEID_SENSOR_TEMP ; baseValueId, eepromId
@@ -355,25 +358,25 @@ winClimate_signalmap:
winClimateSensor3: winClimateSensor3:
; OBJECT ; OBJECT
.db 0x55, 0xaa ; magic .db 0x55, 0xaa ; magic
.dw buttonClimateNetwork*2 ; next .dw buttonClimateNetwork*2 ; next
.dw winClimateBody*2 ; parent .dw winClimateBody*2 ; parent
.dw winClimateSensor3Title*2 ; first child .dw winClimateSensor3Title*2 ; first child
.dw 0 ; target .dw 0 ; target
.dw 0 ; selector (ony lower 8 bits used) .dw 0 ; selector (ony lower 8 bits used)
.dw SensorWatch_DefaultSignalmap*2 ; signal map .dw SensorWatch_DefaultSignalmap*2 ; signal map
; WIDGET ; WIDGET
.db (1<<WIDGET_OPTSLO_MSGRECV_BIT), 0 ; opts lo, hi .db (1<<WIDGET_OPTSLO_MSGRECV_BIT), 0 ; opts lo, hi
.dw 212 ; X .dw 212 ; X
.dw 4 ; Y .dw 4 ; Y
.dw 100 ; W (image=96, 2 px borders) .dw 100 ; W (image=96, 2 px borders)
.dw 100 ; H .dw 100 ; H
.dw STYLE_WIN_FOREGROUND ; front color .dw STYLE_WIN_FOREGROUND ; front color
.dw STYLE_WIN_BACKGROUND ; back color .dw STYLE_WIN_BACKGROUND ; back color
.dw STYLE_WIN_FONT*2 ; font .dw STYLE_WIN_FONT*2 ; font
.dw winClimateSensor3_ramdata ; ptr to SDRAM .dw winClimateSensor3_ramdata ; ptr to SDRAM
; SENSORWATCH ; SENSORWATCH
.db 0, 0 ; baseValueId, eepromId .db VALUE_ID_SENSOR_HUM_BASE, C03_EEID_SENSOR_HUM ; baseValueId, eepromId
@@ -449,12 +452,13 @@ winClimate_signalmap:
.dw winClimateSensor3Value_ramdata ; ptr to SDRAM .dw winClimateSensor3Value_ramdata ; ptr to SDRAM
; VALUELABEL ; VALUELABEL
.db 0, 0 ; num of post-komma digits .db 0, 0 ; num of post-komma digits
buttonClimateNetwork: buttonClimateNetwork:
; OBJECT ; OBJECT
.db 0x55, 0xaa ; magic .db 0x55, 0xaa ; magic
; .dw debugValue1*2 ; next
.dw 0 ; next .dw 0 ; next
.dw winClimateBody*2 ; parent .dw winClimateBody*2 ; parent
.dw 0 ; first child .dw 0 ; first child
@@ -482,4 +486,29 @@ winClimate_signalmap:
.db 0, 0, 0, 0 ; end of table .db 0, 0, 0, 0 ; end of table
#if 0
debugValue1:
; OBJECT
.db 0x55, 0xaa ; magic
.dw 0 ; next
.dw winClimateBody*2 ; parent
.dw 0 ; first child
.dw 0 ; target
.dw 0 ; selector (ony lower 8 bits used)
.dw ValueLabel_DefaultSignalmap*2 ; signal map
; WIDGET
.db 0, (1<<WIDGET_OPTSHI_HALIGNCENTER_BIT) ; opts lo, hi
.dw 2 ; X
.dw (3*STYLE_WIN_FONT_HEIGHT)+2+96+2 ; Y
.dw 96 ; W
.dw STYLE_WIN_FONT_HEIGHT+4 ; H
.dw STYLE_WIN_FOREGROUND ; front color
.dw STYLE_WIN_BACKGROUND ; back color
.dw STYLE_WIN_FONT*2 ; font
.dw debugValue1_ramdata ; ptr to SDRAM
; VALUELABEL
.db 0, 0 ; num of post-komma digits
#endif
#endif #endif

View File

@@ -99,7 +99,20 @@
.equ VALUE_ID_LEDSIMPLE_TIMING = 0x88 .equ VALUE_ID_LEDSIMPLE_TIMING = 0x88
.equ VALUE_ID_SENSOR_CO2_BASE = 0x90
.equ VALUE_ID_SENSOR_CO2_SOURCE = 0x90
.equ VALUE_ID_SENSOR_CO2_LIMWARN = 0x91
.equ VALUE_ID_SENSOR_CO2_LIMCRIT = 0x92
.equ VALUE_ID_SENSOR_TEMP_BASE = 0x93
.equ VALUE_ID_SENSOR_TEMP_SOURCE = 0x93
.equ VALUE_ID_SENSOR_TEMP_LIMWARN = 0x94
.equ VALUE_ID_SENSOR_TEMP_LIMCRIT = 0x95
.equ VALUE_ID_SENSOR_HUM_BASE = 0x96
.equ VALUE_ID_SENSOR_HUM_SOURCE = 0x96
.equ VALUE_ID_SENSOR_HUM_LIMWARN = 0x97
.equ VALUE_ID_SENSOR_HUM_LIMCRIT = 0x98
@@ -301,6 +314,10 @@ test:
;.include "modules/lcd2/ili9341/font12x20_1.asm" ;.include "modules/lcd2/ili9341/font12x20_1.asm"
;.include "common/list_t.asm" ;.include "common/list_t.asm"
;.include "common/tree_t.asm" ;.include "common/tree_t.asm"
.include "common/eeprom_tlv.asm"
;.include "common/eeprom-r.asm"
.include "common/divide.asm" .include "common/divide.asm"
.include "common/itoa.asm" .include "common/itoa.asm"
.include "common/ressource.asm" .include "common/ressource.asm"

View File

@@ -57,6 +57,16 @@
.equ SENSORWATCH_SD_SIZE = SENSORWATCH_SD_OFFS_SENSORWATCH+12 .equ SENSORWATCH_SD_SIZE = SENSORWATCH_SD_OFFS_SENSORWATCH+12
; EEPROM data for SensorWatch
.equ SENSORWATCH_EE_OFFS_NODEADDR = 0
.equ SENSORWATCH_EE_OFFS_VALUEID = 1
.equ SENSORWATCH_EE_OFFS_UPPER_LIMIT_WARN_LO = 2
.equ SENSORWATCH_EE_OFFS_UPPER_LIMIT_WARN_HI = 3
.equ SENSORWATCH_EE_OFFS_UPPER_LIMIT_CRIT_LO = 4
.equ SENSORWATCH_EE_OFFS_UPPER_LIMIT_CRIT_HI = 5
.equ SENSORWATCH_EE_SIZE = 6
; signals ; signals
.equ SENSORWATCH_SIGNAL_SETSOURCE = WIDGET_SIGNAL_NEXTFREE+0 .equ SENSORWATCH_SIGNAL_SETSOURCE = WIDGET_SIGNAL_NEXTFREE+0
.equ SENSORWATCH_SIGNAL_SETUPPERLIMWARN = WIDGET_SIGNAL_NEXTFREE+1 .equ SENSORWATCH_SIGNAL_SETUPPERLIMWARN = WIDGET_SIGNAL_NEXTFREE+1
@@ -102,6 +112,8 @@ SensorWatch_OnCreate_loop:
bigcall Widget_OnCreate bigcall Widget_OnCreate
rcall sensorWatchReadFromEeprom ; (R16, R18, X, Y)
SensorWatch_OnCreate_ret: SensorWatch_OnCreate_ret:
sec sec
ret ret
@@ -263,8 +275,50 @@ SensorWatch_OnMsgReceived_report:
SensorWatch_OnMsgReceived_set: SensorWatch_OnMsgReceived_set:
bigcall Widget_GetSdramPtr ; (none) bigcall Widget_GetSdramPtr ; (none)
bigcall NETMSG_ValueRead ; R17=valueId, R22=nodeAddr R19:R18=value R21:R20=denom (none) bigcall NETMSG_ValueRead ; R17=valueId, R22=nodeAddr R19:R18=value (none)
; TODO: check valueid, read and set value adiw zh:zl, SENSORWATCH_OFFS_BASEVALUEID
lpm r16, Z
sbiw zh:zl, SENSORWATCH_OFFS_BASEVALUEID
sub r17, r16
brcs SensorWatch_OnMsgReceived_ret ; not my value
cpi r17, 3
brcc SensorWatch_OnMsgReceived_ret ; not my value
cpi r17, 0
breq SensorWatch_OnMsgReceived_setSource
cpi r17, 1
breq SensorWatch_OnMsgReceived_setLimWarn
cpi r17, 2
breq SensorWatch_OnMsgReceived_setLimCrit
rjmp SensorWatch_OnMsgReceived_ret
SensorWatch_OnMsgReceived_setSource:
std Y+SENSORWATCH_SD_OFFS_NODEADDR, r18
std Y+SENSORWATCH_SD_OFFS_VALUEID, r19
rjmp SensorWatch_OnMsgReceived_sendACK
SensorWatch_OnMsgReceived_setLimWarn:
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_WARN_LO, r18
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_WARN_HI, r19
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO, r20
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_HI, r21
rjmp SensorWatch_OnMsgReceived_sendACK
SensorWatch_OnMsgReceived_setLimCrit:
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_CRIT_LO, r18
std Y+SENSORWATCH_SD_OFFS_LOWER_LIMIT_CRIT_HI, r19
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO, r20
std Y+SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_HI, r21
SensorWatch_OnMsgReceived_sendACK:
add r17, r16 ; restore valueId
push xl
push xh
push yl
push yh
ldi r23, NETMSG_CMD_VALUE_SET_ACK
bigcall Main_SendValueResponse ; (clobbers all except Z)
pop yh
pop yl
rcall sensorWatchSetColor ; (any, !Y, !Z)
rcall sensorWatchWriteToEeprom ; (R16, R17, R18, R20, R21, X, Y)
pop xh
pop xl
SensorWatch_OnMsgReceived_ret: SensorWatch_OnMsgReceived_ret:
sec sec
ret ret
@@ -339,52 +393,56 @@ SensorWatch_GetValueLabel_ret:
; @clobbers any, !Y, !Z ; @clobbers any, !Y, !Z
sensorWatchSetColor: sensorWatchSetColor:
; default color is green push yl
ldi xl, LOW(DISPLAY_COLOR_DARKGREEN) push yh
ldi xh, HIGH(DISPLAY_COLOR_DARKGREEN) ; default color is green
ldd r20, Y+SENSORWATCH_SD_OFFS_VALUE_LO ldi xl, LOW(DISPLAY_COLOR_DARKGREEN)
ldd r21, Y+SENSORWATCH_SD_OFFS_VALUE_HI ldi xh, HIGH(DISPLAY_COLOR_DARKGREEN)
mov r16, r20 ldd r20, Y+SENSORWATCH_SD_OFFS_VALUE_LO
or r16, r21 ldd r21, Y+SENSORWATCH_SD_OFFS_VALUE_HI
breq sensorWatchSetColor_ret ; do nothing mov r16, r20
or r16, r21
; check against critical limits breq sensorWatchSetColor_ret ; do nothing
adiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO
rcall sensorWatchCheckAgainstLimit ; (r16, r17, r22, r23) ; check against critical limits
sbiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO adiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO
brcs sensorWatchSetColor_setRed rcall sensorWatchCheckAgainstLimit ; (r16, r17, r22, r23)
brcs sensorWatchSetColor_setRed
; check against warning limits sbiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_CRIT_LO
adiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO
rcall sensorWatchCheckAgainstLimit ; (r16, r17, r22, r23) ; check against warning limits
sbiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO adiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO
brcs sensorWatchSetColor_setYellow rcall sensorWatchCheckAgainstLimit ; (r16, r17, r22, r23)
brcs sensorWatchSetColor_setYellow
; set green background sbiw yh:yl, SENSORWATCH_SD_OFFS_UPPER_LIMIT_WARN_LO
rjmp sensorWatchSetColor_setColor
; set green background
rjmp sensorWatchSetColor_setColor
sensorWatchSetColor_setRed: sensorWatchSetColor_setRed:
ldi xl, LOW(DISPLAY_COLOR_RED) ldi xl, LOW(DISPLAY_COLOR_RED)
ldi xh, HIGH(DISPLAY_COLOR_RED) ldi xh, HIGH(DISPLAY_COLOR_RED)
rjmp sensorWatchSetColor_setColor rjmp sensorWatchSetColor_setColor
sensorWatchSetColor_setYellow: sensorWatchSetColor_setYellow:
ldi xl, LOW(DISPLAY_COLOR_YELLOW) ldi xl, LOW(DISPLAY_COLOR_YELLOW)
ldi xh, HIGH(DISPLAY_COLOR_YELLOW) ldi xh, HIGH(DISPLAY_COLOR_YELLOW)
sensorWatchSetColor_setColor: sensorWatchSetColor_setColor:
rcall SensorWatch_GetImageView ; (none) rcall SensorWatch_GetImageView ; (none)
brcc sensorWatchSetColor_ret brcc sensorWatchSetColor_ret
push zl push zl
push zh push zh
mov zl, r18 mov zl, r18
mov zh, r19 mov zh, r19
ldi r16, IMGVIEW_SIGNAL_SETBGCOL ldi r16, IMGVIEW_SIGNAL_SETBGCOL
clr r17 clr r17
bigcall OBJ_HandleSignal ; (any, !X, !Y, !Z) bigcall OBJ_HandleSignal ; (any, !X, !Y, !Z)
pop zh pop zh
pop zl pop zl
sensorWatchSetColor_ret: sensorWatchSetColor_ret:
pop yh
pop yl
ret ret
; @end ; @end
@@ -447,6 +505,7 @@ sensorWatchSetValueLabel:
mov zh, r19 mov zh, r19
ldd xl, Y+SENSORWATCH_SD_OFFS_VALUE_LO ldd xl, Y+SENSORWATCH_SD_OFFS_VALUE_LO
ldd xh, Y+SENSORWATCH_SD_OFFS_VALUE_HI ldd xh, Y+SENSORWATCH_SD_OFFS_VALUE_HI
ldi r16, VLABEL_SIGNAL_SETVALUE ldi r16, VLABEL_SIGNAL_SETVALUE
clr r17 clr r17
bigcall OBJ_HandleSignal ; (any, !X, !Y, !Z) bigcall OBJ_HandleSignal ; (any, !X, !Y, !Z)
@@ -458,6 +517,78 @@ sensorWatchSetValueLabel_ret:
; ---------------------------------------------------------------------------
; @routine sensorWatchWriteToEeprom
;
; @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
sensorWatchWriteToEeprom:
adiw zh:zl, SENSORWATCH_OFFS_EEPROMID
lpm r16, Z
sbiw zh:zl, SENSORWATCH_OFFS_EEPROMID
tst r16
clc
breq sensorWatchWriteToEeprom_ret
ldi xl, LOW(EEPROM_OFFS_TLV)
ldi xh, HIGH(EEPROM_OFFS_TLV)
bigcall EepromTlv_FindFirst ; (R18)
brcs sensorWatchWriteToEeprom_write
ldi r17, SENSORWATCH_EE_SIZE
ldi xl, LOW(EEPROM_OFFS_TLV)
ldi xh, HIGH(EEPROM_OFFS_TLV)
bigcall EepromTlv_AddTlv ; X=pointer to EEPROM data (R16, R18, R20, R21)
brcc sensorWatchWriteToEeprom_ret
sensorWatchWriteToEeprom_write:
bigcall Widget_GetSdramPtr ; (none)
adiw yh:yl, SENSORWATCH_SD_OFFS_NODEADDR
ldi r18, SENSORWATCH_EE_SIZE
sensorWatchWriteToEeprom_loop:
ld r16, Y+
bigcall Eeprom_WriteByteIfChanged ; (R17)
brcc sensorWatchWriteToEeprom_ret
adiw xh:xl, 1
dec r18
brne sensorWatchWriteToEeprom_loop
sec
sensorWatchWriteToEeprom_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine sensorWatchReadFromEeprom
;
; @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
sensorWatchReadFromEeprom:
adiw zh:zl, SENSORWATCH_OFFS_EEPROMID
lpm r16, Z
sbiw zh:zl, SENSORWATCH_OFFS_EEPROMID
ldi xl, LOW(EEPROM_OFFS_TLV)
ldi xh, HIGH(EEPROM_OFFS_TLV)
bigcall EepromTlv_FindFirst ; (R18)
brcc sensorWatchReadFromEeprom_ret
bigcall Widget_GetSdramPtr ; (none)
adiw yh:yl, SENSORWATCH_SD_OFFS_NODEADDR
ldi r18, SENSORWATCH_EE_SIZE
sensorWatchReadFromEeprom_loop:
bigcall Eeprom_ReadByte ; R16=byte (none)
brcc sensorWatchReadFromEeprom_ret
st Y+, r16
adiw xh:xl, 1
dec r18
brne sensorWatchReadFromEeprom_loop
sec
sensorWatchReadFromEeprom_ret:
ret
; @end
SensorWatch_DefaultSignalmap: SensorWatch_DefaultSignalmap:

View File

@@ -5,7 +5,19 @@
<deviceversion>3</deviceversion> <deviceversion>3</deviceversion>
<values> <values>
<value name="LEDTIMING" id="0x88" type="actor" dataType="uint16" /> <value name="LEDTIMING" id="0x88" type="actor" dataType="uint16" />
<value name="CO2_SOURCE" id="0x90" type="actor" dataType="uint16" />
<value name="CO2_LIMIT_WARN" id="0x91" type="actor" dataType="uint32" />
<value name="CO2_LIMIT_CRIT" id="0x92" type="actor" dataType="uint32" />
<value name="TEMP_SOURCE" id="0x93" type="actor" dataType="uint16" />
<value name="TEMP_LIMIT_WARN" id="0x94" type="actor" dataType="uint32" />
<value name="TEMP_LIMIT_CRIT" id="0x95" type="actor" dataType="uint32" />
<value name="HUM_SOURCE" id="0x96" type="actor" dataType="uint16" />
<value name="HUM_LIMIT_WARN" id="0x97" type="actor" dataType="uint32" />
<value name="HUM_LIMIT_CRIT" id="0x98" type="actor" dataType="uint32" />
</values> </values>