185 lines
6.2 KiB
NASM
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
|
|
|
|
|
|
|
|
|