boIR_n.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pigpio.h>
#include <unistd.h>

int inPin = 27;//Physical 13
int level;
int p_count = 1;
int flag = 0;
char i_c = '0';
char stringCom[12] = "mpc play 1";
char stringComStop[10] = "mpc stop";
int stringDat[9];
int i = 0;
uint32_t tick;
uint32_t startTick, endTick;
uint32_t diffTick;
int count = 0;
int start = 0;
int last = 0;
int res = 0;
int resU = 0;


int decode (int res)
    {
        flag = 1;
        switch (res)
        {
        case 19 : {//PHONO
          p_count = 1;
                  }
                  break;
    case 17 : {//A.TAPE
                  p_count = 1;
                  }
                  break;
    case 53 : {//PLAY
//                  p_count = 1;
          flag = 1;
                  }
                  break;
        case 54 : {//STOP
                  system (stringComStop);
                  flag = 0;
                  }
                  break;
        case 12 : {//OFF
                  system (stringComStop);
                  flag = 0;
                  }
                  break;
        case 30 : p_count ++;//RIGHT ARROW
                  break;
        case 31 : p_count --;//LEFT ARROW
                  break;
    case 1: {//1
          p_count = 1;
          }
          break;
    case 2: {//2
          p_count = 2;
          }
          break;
    case 3: {//3
          p_count = 3;
          }
          break;
    case 4: {//4
                  p_count = 4;
                  }
                  break;
        case 5: {//5
                  p_count = 5;
                  }
                  break;
        case 6: {//6
                  p_count = 6;
                  }
                  break;
    case 7: {//7
                  p_count = 7;
                  }
                  break;
        case 8: {//8
                  p_count = 8;
                  }
                  break;
        case 9: {//9
                  p_count = 9;
                  }
                  break;
     default:  {
                  flag = 0;
          return 0;
                  }
                }
                if (flag == 1)
                {
                if (p_count > 9)
                  {
                  p_count = 1;
                  }
                if (p_count < 1)
                  {
                  p_count = 9;
                  }
                i_c = p_count + 48;//int to char max 9
                stringCom[9] = i_c;
                system (stringCom);
                }
        return 0;
}

void func (int gpio, int level, uint32_t tick;)
{
        endTick = gpioTick();
        diffTick = endTick - startTick;
//        printf ("GPIO %d became %d at %d \n ", inPin, level, diffTick);
    if (count > 0 && diffTick > 20000)//test for bad reception
        {
        count = 0;
        resU = 1;
        }
        startTick = gpioTick();
        count ++;
        switch (count)
        {
        case 14: last = 0;
        break;
        case 15: {
                if (last == 1 && diffTick > 4000 && diffTick < 8000)
                        {
                        res = res + 64;
                        last = 1;
                        }
                else if (last == 0 && diffTick > 8000)
                        {
                        res = res + 64;
                        last = 1;
                        }
                else
                        {
                        last = 0;
                        }
                }
        break;
    case 16: {
                if (last == 1 && diffTick > 4000 && diffTick < 8000)
                        {
                        res = res + 32;
                        last = 1;
                        }
                else if (last == 0 && diffTick > 8000)
                        {
                        res = res + 32;
                        last = 1;
                        }
                else
                        {
                        last = 0;
                        }
                }
        break;
    case 17: {
                if (last == 1 && diffTick > 4000 && diffTick < 8000)
                        {
                        res = res + 16;
                        last = 1;
                        }
                else if (last == 0 && diffTick > 8000)
                        {
                        res = res + 16;
                        last = 1;
                        }
                else
                        {
                        last = 0;
                        }
                }
        break;
        case 18: {
                if (last == 1 && diffTick > 4000 && diffTick < 8000)
                        {
                        res = res + 8;
                        last = 1;
                        }
                else if (last == 0 && diffTick > 8000)
                        {
                        res = res + 8;
                        last = 1;
                        }
                else
                        {
                        last = 0;
                        }
                }
        break;
    case 19: {
                if (last == 1 && diffTick > 4000 && diffTick < 8000)
                        {
                        res = res + 4;
                        last = 1;
                        }
                else if (last == 0 && diffTick > 8000)
                        {
                        res = res + 4;
                        last = 1;
                        }
                else
                        {
                        last = 0;
                        }
                }
        break;
        case 20: {
                if (last == 1 && diffTick > 4000 && diffTick < 8000)
                        {
                        res = res + 2;
                        last = 1;
                        }
                else if (last == 0 && diffTick > 8000)
                        {
                        res = res + 2;
                        last = 1;
                        }
                else
                        {
                        last = 0;
                        }
                }
        break;
    case 21: {
                if (last == 1 && diffTick > 4000 && diffTick < 8000)
                        {
                        res = res + 1;
                        last = 1;
                        }
                else if (last == 0 && diffTick > 8000)
                        {
                        res = res + 1;
                        last = 1;
                        }
                else
                        {
                        last = 0;
                        }
                }
        break;
        case 22: {
//            printf ("Resultat %d\n", res);
        if (resU == 0)//test for bad reception
            decode (res);
        count = 0;
        res = 0;
        resU = 0;
        }
        break;
    default: {
         }
        }
}


void main (void)
{
count = 0;
int cfg = gpioCfgGetInternals();
cfg |= PI_CFG_NOSIGHANDLER;  // (1<<10)
gpioCfgSetInternals(cfg);
int status = gpioInitialise();
  if (gpioInitialise() < 0)
startTick = gpioTick();
gpioSetMode (inPin, PI_INPUT);
gpioSetISRFunc (inPin, FALLING_EDGE, 0, func);
while (1){
    sleep (0.01);
    }
gpioTerminate();
}


Compile med:   gcc -o boIR_n boIR_n.c -lpigpio  ,  pigpio se http://abyz.me.uk/rpi/pigpio/download.html
Bemærk: dette er ekspermentel software der er ingen garanti for brugbarhed, det kan derimod sandsynligvis være skadeligt, kun til brug i Danmark.