motion: repeat messages.

This commit is contained in:
Martin Preuss
2024-12-15 19:56:38 +01:00
parent 01133cc35b
commit 9c87c3e5f3

View File

@@ -8,13 +8,17 @@
; ***************************************************************************
.equ MOTION_TIMER_REPORT = 50 ; report motion at most every 5s
.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 = 150 ; restart motion report counter after 15s
.dseg
motionDataBegin:
motionTimer: .byte 1
motionCurrentState: .byte 1
motionStateCounter: .byte 1
motionDataEnd:
@@ -53,25 +57,42 @@ Motion_Run:
Motion_Every100ms:
sbis MOTION_INPUT, MOTION_PIN
rjmp Motion_Every100ms_skipReport
; pin high
lds r16, motionTimer
tst r16
brne Motion_Every100ms_skipReport
; timer was 0
ldi r18, 1
rcall Motion_SendReport
brcc Motion_Every100ms_end
ldi r16, MOTION_TIMER_REPORT ; reset report timer
sts motionTimer, r16
Motion_Every100ms_skipReport:
lds r16, motionTimer
clr r16
sbic MOTION_INPUT, MOTION_PIN
inc r16
; check against stored state
lds r17, motionCurrentState
cp r16, r17
brne Motion_Every100ms_stateChanged
; state not changed
tst r16
breq Motion_Every100ms_end
dec r16
sts motionTimer, r16
; state unchanged, active motion
lds r16, motionStateCounter
inc r16
sts motionStateCounter, r16
cpi r16, MOTION_SEND_1_AFTER
breq Motion_Every100ms_send
cpi r16, MOTION_SEND_2_AFTER
breq Motion_Every100ms_send
; cpi r16, MOTION_SEND_3_AFTER
; breq Motion_Every100ms_send
cpi r16, MOTION_RESTART_AFTER
brne Motion_Every100ms_end
clr r16
sts motionStateCounter, r16 ; restart motion state counter (thus report again on motion)
ret
Motion_Every100ms_stateChanged:
sts motionCurrentState, r16
clr r16
sts motionStateCounter, r16
ret ; only send according to timers above
Motion_Every100ms_send:
lds r18, motionCurrentState
; only send if state is != 0
tst r18
breq Motion_Every100ms_end
rjmp Motion_SendReport
Motion_Every100ms_end:
ret