rotary: modified for rapidly pass through multiple detents
authorsungmin ha <sungmin82.ha@samsung.com>
Tue, 28 Apr 2015 13:24:45 +0000 (22:24 +0900)
committersungmin ha <sungmin82.ha@samsung.com>
Tue, 28 Apr 2015 13:32:50 +0000 (22:32 +0900)
Change-Id: I42a85b7136b0170cfd89463d771bc1f26f429a84
Signed-off-by: sungmin ha <sungmin82.ha@samsung.com>
drivers/maru/maru_virtio_rotary.c

index bc5cc5f3777776bd40a9bdf538e9be9be777667b..b8f3f69fb72137ab778afbed0806bfd09baf5574 100755 (executable)
@@ -95,7 +95,9 @@ static void vq_rotary_handler(struct virtqueue *vq)
        void *data;
        struct rotary_event event;
 
+       int i = 0;
        int pos = 0;
+       int value = 0;
 
        data = virtqueue_get_buf(vq, &len);
        if (!data) {
@@ -104,7 +106,8 @@ static void vq_rotary_handler(struct virtqueue *vq)
        }
 
        while (1) {
-               memcpy(&event, &vrtr->event[vqidx], sizeof(struct rotary_event));
+               memcpy(&event, &vrtr->event[vqidx],
+                               sizeof(struct rotary_event));
 
                event.delta %= 360;
                if (event.delta == 0) {
@@ -117,26 +120,34 @@ static void vq_rotary_handler(struct virtqueue *vq)
                        "rotary event: vqidx(%d), event.delta(%d), pos(%d)\n",
                        vqidx, event.delta, pos);
 
-               if ((pos % DETENT_UNIT) == 0) {
-                       input_report_rel(vrtr->idev, REL_WHEEL, 1);
-                       if (get_rotary_pos(pos) != last_detent) {
-                               last_detent = get_rotary_pos(pos);
-                               if (event.delta > 0) {
-                                       input_report_rel(vrtr->idev, REL_WHEEL, 2);
+               for (i = 1; i <= abs(event.delta); i++) {
+                       value = (event.delta > 0) ? last_pos + i : last_pos - i;
+                       if ((value % DETENT_UNIT) == 0) {
+                               input_report_rel(vrtr->idev, REL_WHEEL, 1);
+                               if (get_rotary_pos(value) != last_detent) {
+                                       last_detent = get_rotary_pos(value);
+                                       if (event.delta > 0) { /* CW */
+                                               input_report_rel(vrtr->idev,
+                                                               REL_WHEEL, 2);
+                                       } else { /* CCW */
+                                               input_report_rel(vrtr->idev,
+                                                               REL_WHEEL, -2);
+                                       }
                                } else {
-                                       input_report_rel(vrtr->idev, REL_WHEEL, -2);
+                                       input_report_rel(vrtr->idev,
+                                                               REL_WHEEL, -1);
                                }
-                       } else {
-                               input_report_rel(vrtr->idev, REL_WHEEL, -1);
-                       }
-                       input_sync(vrtr->idev);
+                               input_sync(vrtr->idev);
 
-                       VR_LOG(KERN_INFO, "event: delta(%d), detent(%d)\n", event.delta, last_detent);
+                               VR_LOG(KERN_INFO, "event: delta(%d),detent(%d)\n",
+                                                       event.delta, last_detent);
+                       }
                }
 
                last_pos = pos;
 
-               memset(&vrtr->event[vqidx], 0x00, sizeof(struct rotary_event));
+               memset(&vrtr->event[vqidx], 0x00,
+                               sizeof(struct rotary_event));
                vqidx++;
                if (vqidx == ROTARY_BUF_SIZE) {
                        vqidx = 0;