; *************************************************************************** ; copyright : (C) 2024 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. * ; *************************************************************************** ; *************************************************************************** ; defs .equ MOTION_SEND_1_AFTER = 1 ; send motion message after 100ms .equ MOTION_SEND_2_AFTER = 11 ; send motion message after 1100ms .equ MOTION_RESTART_AFTER = 100 ; restart motion report counter after 10s .equ MOTION_UPCOUNTER_VALUE = 50 ; keep MOTION state active for at least 5s ; *************************************************************************** ; data .dseg motionDataBegin: motionStateCounter: .byte 1 motionUpCounter: .byte 1 motionDataEnd: ; *************************************************************************** ; code .cseg ; --------------------------------------------------------------------------- ; @routine Motion_Init @global ; ; @return CFLAG set if okay, clear on error ; @clobbers R16, R17, X Motion_Init: ; preset SRAM data area ldi xh, HIGH(motionDataBegin) ldi xl, LOW(motionDataBegin) clr r16 ldi r17, (motionDataEnd-motionDataBegin) rcall Utils_FillSram ; (R17, X) ; setup pins cbi MOTION_DDR, MOTION_PIN ; set DATA port as input cbi MOTION_OUTPUT, MOTION_PIN ; disable internal pullup for TXD sec ret ; @end ; --------------------------------------------------------------------------- ; @routine Motion_Fini @global ; ; @clobbers none Motion_Fini: cbi MOTION_DDR, MOTION_PIN ; set DATA port as input cbi MOTION_OUTPUT, MOTION_PIN ; disable internal pullup for TXD ret ; @end ; --------------------------------------------------------------------------- ; @routine Motion_Every100ms @global ; ; @clobbers any Motion_Every100ms: clr r16 sbic MOTION_INPUT, MOTION_PIN inc r16 tst r16 brne Motion_Every100ms_up ; motion pin is inactive, decrement counter lds r17, motionUpCounter tst r17 breq Motion_Every100ms_end dec r17 sts motionUpCounter, r17 brne Motion_Every100ms_handleStateCounter ; reached 0, virtual state is now NO_MOTION sts motionStateCounter, r17 ret Motion_Every100ms_up: ; motion is active, keep uptimer up ldi r17, MOTION_UPCOUNTER_VALUE sts motionUpCounter, r17 Motion_Every100ms_handleStateCounter: tst r17 ; motionUpCounter? breq Motion_Every100ms_end ; 0, jmp lds r17, motionStateCounter inc r17 sts motionStateCounter, r17 cpi r17, MOTION_SEND_1_AFTER breq Motion_Every100ms_send cpi r17, MOTION_SEND_2_AFTER breq Motion_Every100ms_send cpi r17, MOTION_RESTART_AFTER brne Motion_Every100ms_end clr r17 ; restart counter sts motionStateCounter, r17 ret Motion_Every100ms_send: ldi r18, 1 rjmp Motion_SendReport Motion_Every100ms_end: ret ; @end ; --------------------------------------------------------------------------- ; @routine Motion_SendReport @global ; ; @param R18 sensor value ; @return CFLAG set if okay, cleared on error ; @clobbers any Motion_SendReport: ldi r16, 0xff ; destination address ldi r17, VALUE_ID_MOTION ; value id ldi r22, AQHOME_VALUETYPE_MOTION clr r19 ldi r20, 1 ; denominator clr r21 ldi xl, LOW(com2SendBuffer) ldi xh, HIGH(com2SendBuffer) rcall CPRO_WriteReportValue ; (R16, R17, R18, R19, R20, R21) rjmp COM2_SendPacket ; any (depending on implementation) ; @end