Files
aqhomecontrol/avr/apps/ma_light/recv.asm
2026-04-26 15:18:38 +02:00

185 lines
6.2 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. *
; ***************************************************************************
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine AppMotionLight_OnPacketReceived @global
;
; @clobbers any, -X
AppMotionLight_OnPacketReceived:
ldi zl, LOW(appMotionLightMsgTable*2)
ldi zh, HIGH(appMotionLightMsgTable*2)
rjmp Main_HandleValueMsg
; ---------------------------------------------------------------------------
; @routine appMotionLightHandleReport
;
; @param R17 value id
; @param R19:R18 value
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
; @param R22 source address
; @param R23 command
; @param R25:R24 message id
appMotionLightHandleReport:
; is brightness source?
rcall appMotionLightIsBrightnessSource ; (R16, Y)
brcs appMotionLightHandleReport_brightness
; is motion source?
rcall appMotionLightHasSource ; (r16, r24, Y)
brcc appMotionLightHandleReport_ret
; motion detected?
mov r16, r18
or r16, r19
breq appMotionLightHandleReport_ret ; zero value, ignore
; motion detected, check for brightness source
lds r16, (appMotionLightLSource+APP_MOTIONLIGHT_SOURCE_OFFS_ADDR) ; do we have a source for brightness value?
tst r16
breq appMotionLightHandleReport_trigger ; no, jmp and don't check brightness
cpi r16, 0xff
breq appMotionLightHandleReport_trigger ; no, jmp and don't check brightness
; we have a brightness source configured, do we have a value?
lds r16, appMotionLightFlags ; check last brightness reported
andi r16, APP_MOTIONLIGHT_FLAGS_HAVELIGHT
breq appMotionLightHandleReport_ret ; no brightness, yet
appMotionLightHandleReport_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 appMotionLightHandleReport_ret ; yes, too bright to turn on
appMotionLightHandleReport_trigger:
bigcall SK6812_Trigger
rjmp appMotionLightHandleReport_ret
; received report is our brightness source
appMotionLightHandleReport_brightness:
sts appMotionLightLastBrightness, r18
sts appMotionLightLastBrightness+1, r19
lds r16, appMotionLightFlags
ori r16, APP_MOTIONLIGHT_FLAGS_HAVELIGHT
sts appMotionLightFlags, r16
appMotionLightHandleReport_ret:
clc ; don't send ACK
ret
; @end
; ---------------------------------------------------------------------------
; @routine appMotionLightSetValueOnTime
;
; @param R17 value id
; @param R19:R18 value
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
; @param R22 source address
; @param R23 command
; @param R25:R24 message id
appMotionLightSetValueOnTime:
sts appMotionLightOnTime, r18
sts appMotionLightOnTime+1, r19
rcall SK6812_SetAutoTimerReload
rjmp appMotionLightSetValueReturn
; @end
; ---------------------------------------------------------------------------
; @routine appMotionLightSetValueSource1
;
; @param R17 value id
; @param R19:R18 value
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
; @param R22 source address
; @param R23 command
; @param R25:R24 message id
appMotionLightSetValueSource1:
sts (appMotionLightMSources+APP_MOTIONLIGHT_SOURCE_OFFS_ADDR), r18 ; peerAddr
sts (appMotionLightMSources+APP_MOTIONLIGHT_SOURCE_OFFS_VALUEID), r19 ; valueId
rjmp appMotionLightSetValueReturn
; @end
; ---------------------------------------------------------------------------
; @routine appMotionLightSetValueSource2
;
; @param R17 value id
; @param R19:R18 value
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
; @param R22 source address
; @param R23 command
; @param R25:R24 message id
appMotionLightSetValueSource2:
sts (appMotionLightMSources+APP_MOTIONLIGHT_SOURCE_SIZE+APP_MOTIONLIGHT_SOURCE_OFFS_ADDR), r18 ; peerAddr
sts (appMotionLightMSources+APP_MOTIONLIGHT_SOURCE_SIZE+APP_MOTIONLIGHT_SOURCE_OFFS_VALUEID), r19 ; valueId
rjmp appMotionLightSetValueReturn
; @end
; ---------------------------------------------------------------------------
; @routine appMotionLightSetValueBValue
;
; @param R17 value id
; @param R19:R18 value
; @param R21:R20 denom (e.g. 100, meaning value must be divided by 100)
; @param R22 source address
; @param R23 command
; @param R25:R24 message id
appMotionLightSetValueBValue:
sts (appMotionLightMSources+APP_MOTIONLIGHT_SOURCE_OFFS_ADDR), r18 ; peerAddr
sts (appMotionLightMSources+APP_MOTIONLIGHT_SOURCE_OFFS_VALUEID), r19 ; valueId
rjmp appMotionLightSetValueReturn
; @end
; ---------------------------------------------------------------------------
; @routine appMotionLightSetValueReturn
;
; Common return code
appMotionLightSetValueReturn:
rcall appMotionLightWriteConfToEeprom ; (r16, r17, X, Y)
ldi r23, NETMSG_CMD_VALUE_SET_ACK
sec
ret
; @end
appMotionLightMsgTable:
.db NETMSG_CMD_VALUE_REPORT, 0, LOW(appMotionLightHandleReport), HIGH(appMotionLightHandleReport)
.db NETMSG_CMD_VALUE_SET, VALUE_ID_MAL_ONTIME, LOW(appMotionLightSetValueOnTime), HIGH(appMotionLightSetValueOnTime)
.db NETMSG_CMD_VALUE_SET, VALUE_ID_MAL_SOURCE1, LOW(appMotionLightSetValueSource1), HIGH(appMotionLightSetValueSource1)
.db NETMSG_CMD_VALUE_SET, VALUE_ID_MAL_SOURCE2, LOW(appMotionLightSetValueSource2), HIGH(appMotionLightSetValueSource2)
.db NETMSG_CMD_VALUE_SET, VALUE_ID_MAL_BVALUE, LOW(appMotionLightSetValueBValue), HIGH(appMotionLightSetValueBValue)
.db 0, 0, 0, 0