diff --git a/avr/modules/motion/main.asm b/avr/modules/motion/main.asm index ee79dbf..8920692 100644 --- a/avr/modules/motion/main.asm +++ b/avr/modules/motion/main.asm @@ -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