summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c b/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c
index 4486af95b1..f454867cfc 100644
--- a/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c
+++ b/firmware/target/arm/as3525/sansa-fuzev2/button-fuzev2.c
@@ -34,6 +34,7 @@ static bool hold_button = false;
34#define TIMER_TICK (KERNEL_TIMER_FREQ/HZ)/* how long a tick lasts */ 34#define TIMER_TICK (KERNEL_TIMER_FREQ/HZ)/* how long a tick lasts */
35#define TIMER_MS (TIMER_TICK/(1000/HZ))/* how long a ms lasts */ 35#define TIMER_MS (TIMER_TICK/(1000/HZ))/* how long a ms lasts */
36 36
37#define WHEEL_LOOP_INTERVAL ( 3*TIMER_MS) /* 3 ms */
37#define WHEEL_REPEAT_INTERVAL (300*TIMER_MS) /* 300ms */ 38#define WHEEL_REPEAT_INTERVAL (300*TIMER_MS) /* 300ms */
38#define WHEEL_FAST_ON_INTERVAL ( 20*TIMER_MS) /* 20ms */ 39#define WHEEL_FAST_ON_INTERVAL ( 20*TIMER_MS) /* 20ms */
39#define WHEEL_FAST_OFF_INTERVAL ( 60*TIMER_MS) /* 60ms */ 40#define WHEEL_FAST_OFF_INTERVAL ( 60*TIMER_MS) /* 60ms */
@@ -76,6 +77,18 @@ static void scrollwheel(unsigned int wheel_value)
76 { 1, 3, 0, 2 }, /* Counter-clockwise */ 77 { 1, 3, 0, 2 }, /* Counter-clockwise */
77 }; 78 };
78 79
80 int repeat = 1; /* assume repeat */
81 long time = TIMER2_VALUE + current_tick*TIMER_TICK; /* to timer unit */
82 long v = (time - last_wheel_post);
83 if (v < WHEEL_LOOP_INTERVAL) /* avoid too frequent updates */
84 return ;
85
86 /* interpolate velocity in timer_freq/timer_unit == 1/s */
87 if (v) v = TIMER_FREQ / v;
88
89 /* accumulate velocities over time with each v */
90 wheel_velocity = (7*wheel_velocity + v) / 8;
91
79 unsigned int btn = BUTTON_NONE; 92 unsigned int btn = BUTTON_NONE;
80 93
81 if (old_wheel_value == wheel_tbl[0][wheel_value]) 94 if (old_wheel_value == wheel_tbl[0][wheel_value])
@@ -89,16 +102,6 @@ static void scrollwheel(unsigned int wheel_value)
89 return; 102 return;
90 } 103 }
91 104
92 int repeat = 1; /* assume repeat */
93 long time = TIMER2_VALUE + current_tick*TIMER_TICK; /* to timer unit */
94 long v = (time - last_wheel_post);
95
96 /* interpolate velocity in timer_freq/timer_unit == 1/s */
97 if (v) v = TIMER_FREQ / v;
98
99 /* accumulate velocities over time with each v */
100 wheel_velocity = (7*wheel_velocity + v) / 8;
101
102 if (btn != wheel_repeat) 105 if (btn != wheel_repeat)
103 { 106 {
104 /* direction reversals nullify all fast mode states */ 107 /* direction reversals nullify all fast mode states */