V4L/DVB: IR: JVC: make repeat work
authorMaxim Levitsky <maximlevitsky@gmail.com>
Sat, 31 Jul 2010 14:59:18 +0000 (11:59 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 9 Aug 2010 02:42:59 +0000 (23:42 -0300)
Currently, jvc decoder will attempt misdetect next press as a repeat
of last keypress, therefore second keypress isn't detected.

Signed-off-by: Maxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/IR/ir-jvc-decoder.c

index 8894d8b360486e56595efbf6617a14925c0ea67e..77a89c4de0143beba0d01d9ba19ec329ca0dc9b8 100644 (file)
@@ -32,6 +32,7 @@ enum jvc_state {
        STATE_BIT_SPACE,
        STATE_TRAILER_PULSE,
        STATE_TRAILER_SPACE,
+       STATE_CHECK_REPEAT,
 };
 
 /**
@@ -60,6 +61,7 @@ static int ir_jvc_decode(struct input_dev *input_dev, struct ir_raw_event ev)
        IR_dprintk(2, "JVC decode started at state %d (%uus %s)\n",
                   data->state, TO_US(ev.duration), TO_STR(ev.pulse));
 
+again:
        switch (data->state) {
 
        case STATE_INACTIVE:
@@ -149,8 +151,18 @@ static int ir_jvc_decode(struct input_dev *input_dev, struct ir_raw_event ev)
                }
 
                data->count = 0;
-               data->state = STATE_BIT_PULSE;
+               data->state = STATE_CHECK_REPEAT;
                return 0;
+
+       case STATE_CHECK_REPEAT:
+               if (!ev.pulse)
+                       break;
+
+               if (eq_margin(ev.duration, JVC_HEADER_PULSE, JVC_UNIT / 2))
+                       data->state = STATE_INACTIVE;
+  else
+                       data->state = STATE_BIT_PULSE;
+               goto again;
        }
 
 out: