Fixed version of RemoteIR

Fork of RemoteIR by Shinichiro Nakamura

Files at this revision

API Documentation at this revision

Comitter:
altex
Date:
Thu Oct 30 09:20:06 2014 +0000
Parent:
11:268cc2ab63bd
Commit message:
Fixed SONY protocol

Changed in this revision

ReceiverIR.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 268cc2ab63bd -r b6a25dc72156 ReceiverIR.cpp
--- a/ReceiverIR.cpp	Mon Sep 20 00:54:59 2010 +0000
+++ b/ReceiverIR.cpp	Thu Oct 30 09:20:06 2014 +0000
@@ -228,44 +228,6 @@
                 timeout.attach_us(this, &ReceiverIR::isr_timeout, RemoteIR::TUS_AEHA * 5);
 #endif
             } else if (RemoteIR::SONY == data.format) {
-                work.d1 = timer.read_us();
-            }
-            break;
-        case Received:
-            break;
-        default:
-            break;
-    }
-    UNLOCK();
-}
-
-void ReceiverIR::isr_rise(void) {
-    LOCK();
-    switch (work.state) {
-        case Idle:
-            if (0 <= work.c1) {
-                work.c2 = timer.read_us();
-                int a = work.c2 - work.c1;
-                if (InRange(a, RemoteIR::TUS_SONY * 4)) {
-                    data.format = RemoteIR::SONY;
-                    work.state = Receiving;
-                    data.bitcount = 0;
-                } else {
-                    static const int MINIMUM_LEADER_WIDTH = 150;
-                    if (a < MINIMUM_LEADER_WIDTH) {
-                        init_state();
-                    }
-                }
-            } else {
-                init_state();
-            }
-            break;
-        case Receiving:
-            if (RemoteIR::NEC == data.format) {
-                work.d1 = timer.read_us();
-            } else if (RemoteIR::AEHA == data.format) {
-                work.d1 = timer.read_us();
-            } else if (RemoteIR::SONY == data.format) {
                 work.d2 = timer.read_us();
                 int a = work.d2 - work.d1;
                 if (InRange(a, RemoteIR::TUS_SONY * 2)) {
@@ -305,6 +267,45 @@
     UNLOCK();
 }
 
+void ReceiverIR::isr_rise(void) {
+    LOCK();
+    switch (work.state) {
+        case Idle:
+            if (0 <= work.c1) {
+                work.c2 = timer.read_us();
+                int a = work.c2 - work.c1;
+                if (InRange(a, RemoteIR::TUS_SONY * 4)) {
+                    data.format = RemoteIR::SONY;
+                    work.state = Receiving;
+                    data.bitcount = 0;
+                    work.d1 = timer.read_us();
+                } else {
+                    static const int MINIMUM_LEADER_WIDTH = 150;
+                    if (a < MINIMUM_LEADER_WIDTH) {
+                        init_state();
+                    }
+                }
+            } else {
+                init_state();
+            }
+            break;
+        case Receiving:
+            if (RemoteIR::NEC == data.format) {
+                work.d1 = timer.read_us();
+            } else if (RemoteIR::AEHA == data.format) {
+                work.d1 = timer.read_us();
+            } else if (RemoteIR::SONY == data.format) {
+                work.d1 = timer.read_us();
+            }
+            break;
+        case Received:
+            break;
+        default:
+            break;
+    }
+    UNLOCK();
+}
+
 void ReceiverIR::isr_timeout(void) {
     LOCK();
 #if 0
@@ -325,6 +326,18 @@
         work.c3 = -1;
         work.d1 = -1;
         work.d2 = -1;
+
+        if (RemoteIR::SONY == data.format) {
+            // Fix for SONY empty bits, for example if 31 bits was sended, we need to fill 32nd bit with "1".
+            // We need to append unreceived bits with "1"s.
+            int bitsCount = data.bitcount % 8;
+            if (bitsCount != 0) {
+                int bytesCount = data.bitcount / 8;
+                for (int i = bitsCount; i < 8; i++) {
+                    data.buffer[bytesCount] |= (1 << i);
+                }
+            }
+        }
     }
     UNLOCK();
 }