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.