gui: added LONG mode for buttons (handles short and long presses).
This commit is contained in:
@@ -27,6 +27,7 @@
|
|||||||
; button modes
|
; button modes
|
||||||
.equ BUTTON_MODE_NORMAL = 0
|
.equ BUTTON_MODE_NORMAL = 0
|
||||||
.equ BUTTON_MODE_REPEATED = 1
|
.equ BUTTON_MODE_REPEATED = 1
|
||||||
|
.equ BUTTON_MODE_LONG = 2
|
||||||
|
|
||||||
; button states
|
; button states
|
||||||
.equ BUTTON_STATE_INACTIVE = 0
|
.equ BUTTON_STATE_INACTIVE = 0
|
||||||
@@ -35,6 +36,8 @@
|
|||||||
.equ BUTTON_STATE_REPEATING = 3
|
.equ BUTTON_STATE_REPEATING = 3
|
||||||
|
|
||||||
|
|
||||||
|
.equ BUTTON_LONGPRESS_TIME100MS = 50
|
||||||
|
|
||||||
|
|
||||||
; ***************************************************************************
|
; ***************************************************************************
|
||||||
; code
|
; code
|
||||||
@@ -145,10 +148,15 @@ Button_OnTouchBegin:
|
|||||||
ldd r16, Y+BUTTON_OFFS_MODE
|
ldd r16, Y+BUTTON_OFFS_MODE
|
||||||
cpi r16, BUTTON_MODE_REPEATED
|
cpi r16, BUTTON_MODE_REPEATED
|
||||||
breq Button_OnTouchBegin_repeated
|
breq Button_OnTouchBegin_repeated
|
||||||
|
cpi r16, BUTTON_MODE_LONG
|
||||||
|
breq Button_OnTouchBegin_setActiveResetTimer
|
||||||
|
cpi r16, BUTTON_MODE_NORMAL
|
||||||
|
brne Button_OnTouchBegin_done
|
||||||
|
Button_OnTouchBegin_setActiveResetTimer:
|
||||||
ldi r16, BUTTON_STATE_ACTIVE
|
ldi r16, BUTTON_STATE_ACTIVE
|
||||||
std Y+BUTTON_OFFS_STATE, r16
|
std Y+BUTTON_OFFS_STATE, r16
|
||||||
clr r16
|
clr r16
|
||||||
std Y+BUTTON_OFFS_TIMER, r16
|
std Y+BUTTON_OFFS_TIMER, r16 ; reset timer
|
||||||
rjmp Button_OnTouchBegin_done
|
rjmp Button_OnTouchBegin_done
|
||||||
Button_OnTouchBegin_repeated:
|
Button_OnTouchBegin_repeated:
|
||||||
ldi r16, BUTTON_STATE_WAITREPEAT
|
ldi r16, BUTTON_STATE_WAITREPEAT
|
||||||
@@ -176,14 +184,32 @@ Button_OnTouchEnd:
|
|||||||
bigcall OBJ_SubFlagsDown ; (r17, r18, r19)
|
bigcall OBJ_SubFlagsDown ; (r17, r18, r19)
|
||||||
ldi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
|
ldi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
|
||||||
bigcall OBJ_AddFlagsDown ; (r17, r18, r19)
|
bigcall OBJ_AddFlagsDown ; (r17, r18, r19)
|
||||||
clr r16
|
|
||||||
std Y+BUTTON_OFFS_TIMER, r16
|
; check mode
|
||||||
|
ldd r17, Y+BUTTON_OFFS_MODE
|
||||||
|
cpi r17, BUTTON_MODE_REPEATED
|
||||||
|
breq Button_OnTouchEnd_repeating
|
||||||
|
cpi r17, BUTTON_MODE_NORMAL
|
||||||
|
breq Button_OnTouchEnd_emitCommand
|
||||||
|
cpi r17, BUTTON_MODE_LONG
|
||||||
|
brne Button_OnTouchEnd_done
|
||||||
|
Button_OnTouchEnd_long:
|
||||||
|
ldd r17, Y+BUTTON_OFFS_TIMER
|
||||||
|
cpi r17, BUTTON_LONGPRESS_TIME100MS
|
||||||
|
brcs Button_OnTouchEnd_emitCommand
|
||||||
|
ldi r16, WIDGET_SIGNAL_ALTCMD
|
||||||
|
rjmp Button_OnTouchEnd_emit
|
||||||
|
Button_OnTouchEnd_repeating:
|
||||||
ldd r16, Y+BUTTON_OFFS_STATE
|
ldd r16, Y+BUTTON_OFFS_STATE
|
||||||
cpi r16, BUTTON_STATE_REPEATING
|
cpi r16, BUTTON_STATE_REPEATING
|
||||||
breq Button_OnTouchEnd_done
|
breq Button_OnTouchEnd_done
|
||||||
|
Button_OnTouchEnd_emitCommand:
|
||||||
ldi r16, WIDGET_SIGNAL_COMMAND
|
ldi r16, WIDGET_SIGNAL_COMMAND
|
||||||
|
Button_OnTouchEnd_emit:
|
||||||
bigcall OBJ_EmitSignal
|
bigcall OBJ_EmitSignal
|
||||||
Button_OnTouchEnd_done:
|
Button_OnTouchEnd_done:
|
||||||
|
clr r16
|
||||||
|
std Y+BUTTON_OFFS_TIMER, r16
|
||||||
ldi r16, BUTTON_STATE_INACTIVE
|
ldi r16, BUTTON_STATE_INACTIVE
|
||||||
std Y+BUTTON_OFFS_STATE, r16
|
std Y+BUTTON_OFFS_STATE, r16
|
||||||
sec
|
sec
|
||||||
@@ -218,6 +244,20 @@ Button_OnTouchMove:
|
|||||||
; @clobbers any, !Y
|
; @clobbers any, !Y
|
||||||
|
|
||||||
Button_OnTimer:
|
Button_OnTimer:
|
||||||
|
ldd r16, Y+BUTTON_OFFS_MODE
|
||||||
|
cpi r16, BUTTON_MODE_NORMAL
|
||||||
|
breq Button_OnTimer_ret ; nothing to do in normal mode
|
||||||
|
cpi r16, BUTTON_MODE_REPEATED
|
||||||
|
breq Button_OnTimer_repeated ; handle repeats in repeating mode
|
||||||
|
cpi r16, BUTTON_MODE_LONG
|
||||||
|
brne Button_OnTimer_ret ; jump on invalid mode
|
||||||
|
; long mode: increment timer counter
|
||||||
|
ldd r16, Y+BUTTON_OFFS_TIMER
|
||||||
|
inc r16
|
||||||
|
breq Button_OnTimer_ret
|
||||||
|
std Y+BUTTON_OFFS_TIMER, r16
|
||||||
|
rjmp Button_OnTimer_ret
|
||||||
|
Button_OnTimer_repeated:
|
||||||
ldd r16, Y+BUTTON_OFFS_TIMER
|
ldd r16, Y+BUTTON_OFFS_TIMER
|
||||||
tst r16
|
tst r16
|
||||||
breq Button_OnTimer_ret
|
breq Button_OnTimer_ret
|
||||||
|
|||||||
Reference in New Issue
Block a user