gui: added LONG mode for buttons (handles short and long presses).
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
; button modes
|
||||
.equ BUTTON_MODE_NORMAL = 0
|
||||
.equ BUTTON_MODE_REPEATED = 1
|
||||
.equ BUTTON_MODE_LONG = 2
|
||||
|
||||
; button states
|
||||
.equ BUTTON_STATE_INACTIVE = 0
|
||||
@@ -35,6 +36,8 @@
|
||||
.equ BUTTON_STATE_REPEATING = 3
|
||||
|
||||
|
||||
.equ BUTTON_LONGPRESS_TIME100MS = 50
|
||||
|
||||
|
||||
; ***************************************************************************
|
||||
; code
|
||||
@@ -145,10 +148,15 @@ Button_OnTouchBegin:
|
||||
ldd r16, Y+BUTTON_OFFS_MODE
|
||||
cpi r16, BUTTON_MODE_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
|
||||
std Y+BUTTON_OFFS_STATE, r16
|
||||
clr r16
|
||||
std Y+BUTTON_OFFS_TIMER, r16
|
||||
std Y+BUTTON_OFFS_TIMER, r16 ; reset timer
|
||||
rjmp Button_OnTouchBegin_done
|
||||
Button_OnTouchBegin_repeated:
|
||||
ldi r16, BUTTON_STATE_WAITREPEAT
|
||||
@@ -176,14 +184,32 @@ Button_OnTouchEnd:
|
||||
bigcall OBJ_SubFlagsDown ; (r17, r18, r19)
|
||||
ldi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
|
||||
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
|
||||
cpi r16, BUTTON_STATE_REPEATING
|
||||
breq Button_OnTouchEnd_done
|
||||
Button_OnTouchEnd_emitCommand:
|
||||
ldi r16, WIDGET_SIGNAL_COMMAND
|
||||
Button_OnTouchEnd_emit:
|
||||
bigcall OBJ_EmitSignal
|
||||
Button_OnTouchEnd_done:
|
||||
clr r16
|
||||
std Y+BUTTON_OFFS_TIMER, r16
|
||||
ldi r16, BUTTON_STATE_INACTIVE
|
||||
std Y+BUTTON_OFFS_STATE, r16
|
||||
sec
|
||||
@@ -218,6 +244,20 @@ Button_OnTouchMove:
|
||||
; @clobbers any, !Y
|
||||
|
||||
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
|
||||
tst r16
|
||||
breq Button_OnTimer_ret
|
||||
|
||||
Reference in New Issue
Block a user