gui: added LONG mode for buttons (handles short and long presses).

This commit is contained in:
Martin Preuss
2026-05-18 17:12:39 +02:00
parent ed899dbe6f
commit b2e5be974e

View File

@@ -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