Johannes Stratmann
/
IRMP_Receiver
Sample code for IRMP library
main.cpp@1:57d9ea192a5e, 2016-01-09 (annotated)
- Committer:
- JojoS
- Date:
- Sat Jan 09 14:26:06 2016 +0000
- Revision:
- 1:57d9ea192a5e
- Parent:
- 0:4146c9dd6aa5
added comments;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JojoS | 0:4146c9dd6aa5 | 1 | #include "mbed.h" |
JojoS | 0:4146c9dd6aa5 | 2 | #include "irmp.h" |
JojoS | 0:4146c9dd6aa5 | 3 | |
JojoS | 0:4146c9dd6aa5 | 4 | #define LED_ON 0 |
JojoS | 0:4146c9dd6aa5 | 5 | #define LED_OFF 1 |
JojoS | 0:4146c9dd6aa5 | 6 | |
JojoS | 1:57d9ea192a5e | 7 | // LED as test output |
JojoS | 1:57d9ea192a5e | 8 | DigitalOut led(P0_14, LED_OFF); |
JojoS | 1:57d9ea192a5e | 9 | DigitalOut flash(P0_12, LED_OFF); |
JojoS | 0:4146c9dd6aa5 | 10 | |
JojoS | 1:57d9ea192a5e | 11 | // cyclic interrupt for IRMP ISR worker |
JojoS | 0:4146c9dd6aa5 | 12 | Ticker t; |
JojoS | 0:4146c9dd6aa5 | 13 | |
JojoS | 0:4146c9dd6aa5 | 14 | // only for performance test |
JojoS | 0:4146c9dd6aa5 | 15 | Timer timerPerfTest; |
JojoS | 0:4146c9dd6aa5 | 16 | int timeISRMax = 0; |
JojoS | 0:4146c9dd6aa5 | 17 | float timeISRAvg; |
JojoS | 0:4146c9dd6aa5 | 18 | int timeISRAvgSum = 0; |
JojoS | 0:4146c9dd6aa5 | 19 | int countISRCalls = 0; |
JojoS | 0:4146c9dd6aa5 | 20 | |
JojoS | 1:57d9ea192a5e | 21 | // this ISR must be called cyclic |
JojoS | 0:4146c9dd6aa5 | 22 | void irmpISR(void) |
JojoS | 0:4146c9dd6aa5 | 23 | { |
JojoS | 1:57d9ea192a5e | 24 | int t1 = timerPerfTest.read_us(); // read performance timer |
JojoS | 0:4146c9dd6aa5 | 25 | |
JojoS | 1:57d9ea192a5e | 26 | irmp_ISR(); // call irmp ISR |
JojoS | 0:4146c9dd6aa5 | 27 | |
JojoS | 0:4146c9dd6aa5 | 28 | int timeISR = timerPerfTest.read_us() - t1; // calc time spent in worker ISR |
JojoS | 0:4146c9dd6aa5 | 29 | if (timeISR > timeISRMax) // store maximum |
JojoS | 0:4146c9dd6aa5 | 30 | timeISRMax = timeISR; |
JojoS | 0:4146c9dd6aa5 | 31 | timeISRAvgSum += timeISR; // sum for avg |
JojoS | 0:4146c9dd6aa5 | 32 | countISRCalls++; |
JojoS | 0:4146c9dd6aa5 | 33 | } |
JojoS | 0:4146c9dd6aa5 | 34 | |
JojoS | 0:4146c9dd6aa5 | 35 | int main() { |
JojoS | 0:4146c9dd6aa5 | 36 | printf("IRMP on mbed\n"); |
JojoS | 0:4146c9dd6aa5 | 37 | |
JojoS | 0:4146c9dd6aa5 | 38 | led = LED_OFF; |
JojoS | 0:4146c9dd6aa5 | 39 | timerPerfTest.start(); |
JojoS | 0:4146c9dd6aa5 | 40 | |
JojoS | 1:57d9ea192a5e | 41 | // irmp_data holds result of received IR code |
JojoS | 0:4146c9dd6aa5 | 42 | IRMP_DATA irmp_data; |
JojoS | 0:4146c9dd6aa5 | 43 | |
JojoS | 0:4146c9dd6aa5 | 44 | irmp_init(); // initialize irmp |
JojoS | 0:4146c9dd6aa5 | 45 | t.attach_us(&irmpISR, 1E6 / F_INTERRUPTS); // call ISR 15.000 / s |
JojoS | 0:4146c9dd6aa5 | 46 | |
JojoS | 0:4146c9dd6aa5 | 47 | // infinite loop, interrupts will blink PORTD pins and handle UART communications. |
JojoS | 0:4146c9dd6aa5 | 48 | while (1) |
JojoS | 0:4146c9dd6aa5 | 49 | { |
JojoS | 1:57d9ea192a5e | 50 | flash = !flash; // test output. flashes at 15/2 kHz, you will not see it blinking |
JojoS | 0:4146c9dd6aa5 | 51 | |
JojoS | 1:57d9ea192a5e | 52 | // check for received IR commands |
JojoS | 0:4146c9dd6aa5 | 53 | if (irmp_get_data (&irmp_data)) |
JojoS | 0:4146c9dd6aa5 | 54 | { |
JojoS | 0:4146c9dd6aa5 | 55 | // ir signal decoded, do something here... |
JojoS | 0:4146c9dd6aa5 | 56 | // irmp_data.protocol is the protocol, see irmp.h |
JojoS | 0:4146c9dd6aa5 | 57 | // irmp_data.address is the address/manufacturer code of ir sender |
JojoS | 0:4146c9dd6aa5 | 58 | // irmp_data.command is the command code |
JojoS | 0:4146c9dd6aa5 | 59 | // irm_data.flags is press/release information |
JojoS | 0:4146c9dd6aa5 | 60 | // irmp_protocol_names[irmp_data.protocol] is the protocol name (if enabled, see irmpconfig.h) |
JojoS | 0:4146c9dd6aa5 | 61 | // printf("proto %d addr %d cmd %d\n", irmp_data.protocol, irmp_data.address, irmp_data.command ); |
JojoS | 0:4146c9dd6aa5 | 62 | |
JojoS | 0:4146c9dd6aa5 | 63 | // sample decoding, turn LED on / off |
JojoS | 0:4146c9dd6aa5 | 64 | if (irmp_data.protocol == IRMP_RC5_PROTOCOL && irmp_data.address == 5) // old RC5 VCR Remote. TV uses address 0 |
JojoS | 0:4146c9dd6aa5 | 65 | { |
JojoS | 0:4146c9dd6aa5 | 66 | if (irmp_data.flags == 0) // switch only on button press |
JojoS | 0:4146c9dd6aa5 | 67 | { |
JojoS | 0:4146c9dd6aa5 | 68 | switch (irmp_data.command) |
JojoS | 0:4146c9dd6aa5 | 69 | { |
JojoS | 0:4146c9dd6aa5 | 70 | case 0: // Key '0' |
JojoS | 0:4146c9dd6aa5 | 71 | led = LED_OFF; |
JojoS | 0:4146c9dd6aa5 | 72 | break; |
JojoS | 0:4146c9dd6aa5 | 73 | case 1: // Key '1' |
JojoS | 0:4146c9dd6aa5 | 74 | led = LED_ON; |
JojoS | 0:4146c9dd6aa5 | 75 | break; |
JojoS | 0:4146c9dd6aa5 | 76 | case 53: // Key 'play' |
JojoS | 0:4146c9dd6aa5 | 77 | printf("bring me a beer!\n"); |
JojoS | 0:4146c9dd6aa5 | 78 | break; |
JojoS | 0:4146c9dd6aa5 | 79 | case 54: // Key 'stop' |
JojoS | 0:4146c9dd6aa5 | 80 | timeISRAvg = (float)timeISRAvgSum / countISRCalls; |
JojoS | 0:4146c9dd6aa5 | 81 | timeISRAvgSum = 0; |
JojoS | 0:4146c9dd6aa5 | 82 | countISRCalls = 0; |
JojoS | 0:4146c9dd6aa5 | 83 | printf("ISR max / avg runtime [microseconds] : %d / %5.2f\n", timeISRMax, timeISRAvg); |
JojoS | 0:4146c9dd6aa5 | 84 | timeISRMax = 0; |
JojoS | 0:4146c9dd6aa5 | 85 | break; |
JojoS | 0:4146c9dd6aa5 | 86 | } |
JojoS | 0:4146c9dd6aa5 | 87 | } |
JojoS | 0:4146c9dd6aa5 | 88 | } |
JojoS | 0:4146c9dd6aa5 | 89 | |
JojoS | 0:4146c9dd6aa5 | 90 | // log to stdout |
JojoS | 0:4146c9dd6aa5 | 91 | printf("proto %d addr %d cmd %d flags %x name %s\n", irmp_data.protocol, irmp_data.address, irmp_data.command, irmp_data.flags, irmp_protocol_names[irmp_data.protocol] ); |
JojoS | 0:4146c9dd6aa5 | 92 | } |
JojoS | 0:4146c9dd6aa5 | 93 | } |
JojoS | 0:4146c9dd6aa5 | 94 | |
JojoS | 0:4146c9dd6aa5 | 95 | } |