Lib for sending IR signals from mbed.

Dependents:   ir-puck ir-puck2 ir-puck

Revision:
0:741de6c95ae9
Child:
2:4576fcd93ffd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IRSender.cpp	Fri Jul 25 07:43:47 2014 +0000
@@ -0,0 +1,57 @@
+
+#include "mbed.h"
+#include "IRSender.h"
+
+bool IRSender::irSeq(unsigned freq, unsigned len, const unsigned *data)
+{
+    // TODO: implement a lock or semaphore here
+    if (_inUse) {
+        return false;
+    }
+    _inUse = true;
+
+    int pos = 0;
+    senderPin.write(0.0);
+    senderPin.period_us(freq);
+
+    int times[len];
+    for (int i=0; i<len; i++) {
+        times[i] = 0;
+    }
+
+    int bit = 1;
+    LOG("Start\n");
+    senderPin.write(0.5);
+    timer.start();
+
+    int time = timer.read_us();
+    int old_time = time;
+    int dt = 0;
+
+    while (pos < len) {
+        // TODO: Handle timer overflow
+        // Consider using GPIOTE
+        old_time = time;
+        time = timer.read_us();
+        dt += time - old_time;
+
+        while (dt > data[pos] && pos < len) {
+            dt -= data[pos];
+            bit = !bit;
+            senderPin.write(0.5 * bit);
+            times[pos] = dt;
+            pos++;
+        }
+    }
+
+    timer.stop();
+    senderPin.write(0);
+    LOG("Success, wrote %i/%i\n", pos, len);
+    LOG("Miss timings: %i", times[0]);
+    for (int i=1; i<len; i++) {
+        APPEND(", %i", times[i]);
+    }
+    APPEND("]\n");
+    _inUse = false;
+    return true;
+}