Sample code for IRMP library

Dependencies:   IRMP mbed

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?

UserRevisionLine numberNew 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 }