Index: firmware/target/arm/as3525/sansa-e200v2/button-e200v2.c =================================================================== --- firmware/target/arm/as3525/sansa-e200v2/button-e200v2.c (Revision 20694) +++ firmware/target/arm/as3525/sansa-e200v2/button-e200v2.c (Arbeitskopie) @@ -75,6 +75,14 @@ /* did the wheel value change? */ unsigned int btn = BUTTON_NONE; + + /* getting BUTTON_REPEAT works like this: We increment repeat by 2 if the + * wheel was turned, and decrement it by 1 each tick, + * that means: if you change the wheel fast enough, repeat will be >1 and + * we send BUTTON_REPEAT + */ + static int repeat = 0; + if (old_wheel_value == wheel_tbl[0][wheel_value]) btn = BUTTON_SCROLL_FWD; else if (old_wheel_value == wheel_tbl[1][wheel_value]) @@ -82,7 +90,6 @@ if (btn != BUTTON_NONE) { - int repeat = 1; /* assume repeat */ unsigned long usec = TIMER1_VALUE; unsigned v = (usec - last_wheel_usec) & 0x7fffffff; @@ -96,7 +103,7 @@ { /* direction reversals nullify all fast mode states */ wheel_repeat = btn; - repeat = + repeat = 0; wheel_fast_mode = wheel_velocity = wheel_click_count = 0; @@ -113,8 +120,8 @@ wheel_fast_mode = 0; /* reset velocity */ wheel_velocity = 0; - /* wheel_delta is always 1 in slow mode */ - wheel_delta = 1; + /* wheel_delta is always 0 in slow mode */ + wheel_delta = 0; } } else @@ -132,8 +139,8 @@ btn = BUTTON_NONE; } - /* wheel_delta is always 1 in slow mode */ - wheel_delta = 1; + /* wheel_delta is always 0 in slow mode */ + wheel_delta = 0; } if (TIME_AFTER(current_tick, next_backlight_on) || @@ -154,17 +161,21 @@ /* generate repeats if quick enough */ if (repeat && TIME_BEFORE(usec, last_wheel_post + WHEEL_REPEAT_INTERVAL)) + { btn |= BUTTON_REPEAT; + wheel_delta = repeat>>2; + } last_wheel_post = usec; + repeat += 2; if (queue_empty(&button_queue)) { queue_post(&button_queue, btn, wheel_fast_mode | - (wheel_delta << 24) | + ((wheel_delta + 1) << 24) | wheel_velocity*360/WHEELCLICKS_PER_ROTATION); /* message posted - reset delta */ - wheel_delta = 1; + wheel_delta = 0; } else { @@ -175,6 +186,10 @@ } last_wheel_usec = usec; } + if (repeat > 0) + repeat--; + else + repeat = 0; old_wheel_value = wheel_value; }