Files
aqhomecontrol/avr/apps/ma_light/recv.asm
2025-10-01 23:22:41 +02:00

137 lines
6.0 KiB
NASM

; ***************************************************************************
; copyright : (C) 2025 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. *
; ***************************************************************************
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine AppMotionLight_OnPacketReceived @global
;
; @clobbers any, -X
AppMotionLight_OnPacketReceived:
adiw xh:xl, 2 ; command
ld r16, X
sbiw xh:xl, 2
cpi r16, NETMSG_CMD_VALUE_SET
breq AppMotionLight_OnPacketReceived_set
cpi r16, NETMSG_CMD_VALUE_REPORT
breq AppMotionLight_OnPacketReceived_report
clc ; unexpected msg
ret
; "report value" message
AppMotionLight_OnPacketReceived_report:
rcall NETMSG_ValueRead ; (none)
rcall appMotionLightIsBrightnessSource ; (R16)
brcs AppMotionLight_OnPacketReceived_isBrightness
mov r16, r18
or r16, r19
breq AppMotionLight_OnPacketReceived_clcRet ; zero value, ignore
rcall appMotionLightHasSource ; (r16, r24, Y)
brcs AppMotionLight_OnPacketReceived_turnOn
ret
AppMotionLight_OnPacketReceived_turnOn:
lds r16, appMotionLightLSourceAddr ; do we have a source for brightness value?
tst r16
breq AppMotionLight_OnPacketReceived_checkTimer ; no, jmp and don't check brightness
lds r16, appMotionLightFlags ; check last brightness reported
andi r16, APP_MOTIONLIGHT_FLAGS_HAVELIGHT
breq AppMotionLight_OnPacketReceived_secRet ; no brightness, yet
AppMotionLight_OnPacketReceived_checkBrightness:
lds r16, appMotionLightLSourceValue ; check last brightness reported
lds r17, appMotionLightLSourceValue+1
lds r24, appMotionLightLastBrightness ; r25:r24>r17:r16?
lds r25, appMotionLightLastBrightness+1 ; appMotionLightLastBrightness>appMotionLightLSourceValue?
sub r16, r24
sbc r17, r25
brcs AppMotionLight_OnPacketReceived_secRet ; yes, too bright to turn on
AppMotionLight_OnPacketReceived_checkTimer:
lds r16, appMotionLightTimer ; time up?
lds r17, appMotionLightTimer+1
or r16, r17
brne AppMotionLight_OnPacketReceived_startTimer ; no, just restart timer (light already on)
push xl
push xh
rcall appMotionLightTurnOn ; (r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, X)
pop xh
pop xl
AppMotionLight_OnPacketReceived_startTimer:
rcall appMotionLightStartTimer
AppMotionLight_OnPacketReceived_secRet:
sec
ret
AppMotionLight_OnPacketReceived_isBrightness:
sts appMotionLightLastBrightness, r18
sts appMotionLightLastBrightness+1, r19
lds r16, appMotionLightFlags
ori r16, APP_MOTIONLIGHT_FLAGS_HAVELIGHT
sts appMotionLightFlags, r16
sec
ret
; "set value" message
AppMotionLight_OnPacketReceived_set:
rcall NETMSG_ValueRead ; (none)
cpi r17, VALUE_ID_MAL_ONTIME
breq AppMotionLight_OnPacketReceived_setOnTime
cpi r17, VALUE_ID_MAL_SOURCE1
breq AppMotionLight_OnPacketReceived_setSource1
cpi r17, VALUE_ID_MAL_SOURCE2
breq AppMotionLight_OnPacketReceived_setSource2
cpi r17, VALUE_ID_MAL_BSOURCE
breq AppMotionLight_OnPacketReceived_setBSource
cpi r17, VALUE_ID_MAL_BVALUE
breq AppMotionLight_OnPacketReceived_setBValue
AppMotionLight_OnPacketReceived_clcRet:
clc ; unexpected message
ret
AppMotionLight_OnPacketReceived_setBSource: ; setValue "nodes/XXXXXXXX/MALSOURCEB 0xVVNN" (VV=value id, NN=node addr)
sts appMotionLightLSourceAddr, r18
sts appMotionLightLSourceValueId, r19
rjmp AppMotionLight_OnPacketReceived_sendAck
AppMotionLight_OnPacketReceived_setBValue: ; "setValue nodes/XXXXXXXX/MALVALUEB n" (n brightness value)
sts appMotionLightLSourceValue, r18
sts appMotionLightLSourceValue+1, r19
rjmp AppMotionLight_OnPacketReceived_sendAck
AppMotionLight_OnPacketReceived_setOnTime: ; "setValue nodes/XXXXXXXX/MALONTIME n" (n in 1/10 secs)
sts appMotionLightOnTime, r18
sts appMotionLightOnTime+1, r19
lds r16, appMotionLightTimer ; timer active?
lds r17, appMotionLightTimer+1
or r16, r17
breq AppMotionLight_OnPacketReceived_sendAck ; nope, just set it and leave
sts appMotionLightTimer, r18 ; restart timer with new value
sts appMotionLightTimer+1, r19
rjmp AppMotionLight_OnPacketReceived_sendAck
AppMotionLight_OnPacketReceived_setSource1: ; setValue "nodes/XXXXXXXX/MALSOURCE1 0xVVNN" (VV=value id, NN=node addr)
sts appMotionLightSources, r18 ; peerAddr
sts appMotionLightSources+1, r19 ; valueId
rjmp AppMotionLight_OnPacketReceived_sendAck
AppMotionLight_OnPacketReceived_setSource2: ; setValue "nodes/XXXXXXXX/MALSOURCE2 0xVVNN" (VV=value id, NN=node addr)
sts appMotionLightSources+APP_MOTIONLIGHT_SOURCE_SIZE, r18 ; peerAddr
sts appMotionLightSources+APP_MOTIONLIGHT_SOURCE_SIZE+1, r19 ; valueId
AppMotionLight_OnPacketReceived_sendAck:
push xl
push xh
ldi r23, NETMSG_CMD_VALUE_SET_ACK
rcall Main_SendValueResponse ; (clobbers all, including Y)
rcall appMotionLightWriteConfToEeprom ; (r16, r17, X)
pop xh
pop xl
sec
ret
; @end