; *************************************************************************** ; 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. * ; *************************************************************************** .equ MOTION_SEND_1_AFTER = 1 ; send motion message after 100ms .equ MOTION_SEND_2_AFTER = 11 ; send motion message after 1100ms ;.equ MOTION_SEND_3_AFTER = 50 ; repeat motion message after 5s .equ MOTION_RESTART_AFTER = 100 ; restart motion report counter after 10s .equ MOTION_UPCOUNTER_VALUE = 50 .dseg motionDataBegin: ;motionCurrentState: .byte 1 motionStateCounter: .byte 1 motionUpCounter: .byte 1 motionDataEnd: .cseg Motion_Init: ; preset SRAM data area ldi xh, HIGH(motionDataBegin) ldi xl, LOW(motionDataBegin) clr r16 ldi r17, (motionDataEnd-motionDataBegin) rcall Utils_FillSram ; setup pins cbi MOTION_DDR, MOTION_PIN ; set DATA port as input cbi MOTION_OUTPUT, MOTION_PIN ; disable internal pullup for TXD sec ret Motion_Fini: cbi MOTION_DDR, MOTION_PIN ; set DATA port as input cbi MOTION_OUTPUT, MOTION_PIN ; disable internal pullup for TXD ret Motion_Run: clc ret 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 ; @param R18 sensor value 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 rjmp COM2_SendPacket