Lib for sending IR signals from mbed.
Dependents: ir-puck ir-puck2 ir-puck
Diff: IRSender.cpp
- Revision:
- 0:741de6c95ae9
- Child:
- 2:4576fcd93ffd
diff -r 000000000000 -r 741de6c95ae9 IRSender.cpp --- /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; +}