Code:
GCC -o empfangen_gpio_wiring -l rt empfangen_gpio_wiring.c -lwiringPi
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
//WiringPi include für SEN/STA Erkennung
#include <wiringPi.h>
#include <stdio.h>
//Konfig RASPI USART
#define BAUDRATE B9600 // 9600 Baud definieren für 8E1 I-Bus
char MODEMDEVICE[]= "/dev/ttyAMA0"; // Schnittstelle
int getit; //Nachrichtenblock angekommen
/*
Sx x=0 aktuellen Sender neu abspielen Nach Stop oder zum neu puffern, x>49 Sender x-48 abspielen
Bx x=0 abspielen stoppen, x=1 mpd neu starten
Px x=0 einen Senderplatz zurück x=1 einen Senderplatz hoch
Tx Taste x am Gerät gedrückt
resetreset Reboot des Raspi
*/
char eingang[255]="";
char d[1]="";
int anzahl=0;
int laenge=0;
int logg=0;
int fd; // File descriptor
int sender;
int lautst=95;
long int time_back;
long int time_ok;
struct termios newtio={};
unsigned char eingangleer() //Eingangstring leeren
{
int i;
for(i=0; i < laenge; i++){
eingang[i] = 0;
}
laenge=0;
}
unsigned char platzlautsenden() //Lautstärke und Senderplatz auf den kleinen Zahlen ausgeben
{ //Lautstärke 100% und Senderplatz 3 wird zu 100:03
char nummer[3];
int i=0;
char befehl[255]="";
sprintf(nummer,"%d",lautst);
strcpy(befehl,"/var/scripte/senden 2");
if (strlen(nummer)<3){
strcat(befehl,"0");
}
if (strlen(nummer)<2){
strcat(befehl,"0");
}
strcat(befehl,nummer);
strcat(befehl,":");
i=sender;
if(i>99){ //Die Anzeige ist 2-Stellig
i=99;
}
sprintf(nummer,"%d",i);
if (strlen(nummer)<2){
strcat(befehl,"0");
}
strcat(befehl,nummer);
system(befehl);
}
unsigned char radioein() //gewählten Platz in der Playlist abspielen
{
char nummer[3];
char befehl[255]="";
sprintf(nummer,"%d",sender);
strcpy(befehl,"mpc -q play ");
strcat(befehl,nummer);
system(befehl);
platzlautsenden();
}
unsigned char initmpd() //Schnittstelle parametrieren und öffnen
{
char befehl[30]="";
char s[2]="";
lautst=95;
system("/var/scripte/radio2.sh"); //InitScript für mpd
sleep(1);
system("mpc playlist > /tmp/mpdlist"); //Playlist zwischenspeichern
sleep(1);
FILE *f;
char Text[300]="";
char Text1[70]="";
char Text2[7]="volume";
f = fopen("/tmp/mpdlist","r");
anzahl=0; //Anzahl Einträge der Senderliste zählen
if(f!=NULL){
fgets(Text, sizeof(Text), f);
if(strlen(Text)<2){
fclose(f);
return;
}else{
anzahl=1;
while( fgets(Text, sizeof(Text), f) !=0 ){
if(strlen(Text)>2){
anzahl++;
}
if(anzahl>199){ //Nicht mehr wie 200
break;
}
}
}
fclose(f);
}
strcpy(befehl,"/var/scripte/senden 6"); //kleine Symbole im Display anzeigen lassen
s[0]=208; //Antennensymbol + FM anzeigen, als Zeichen für Bereit
strcat(befehl,s);
system(befehl);
strcpy(befehl,"/var/scripte/senden 7");
s[0]=130; //Stereo anzeigen
strcat(befehl,s);
system(befehl);
}
unsigned char abspielen() //Wiedergabe fortsetzen. Ist noch nichts abgespielt worden, Platz 1 abspielen
{
if (anzahl>0){
if (sender==0){
sender=1;
}else{ if(sender>anzahl){
sender=anzahl;
}
radioein();
}
}
}
unsigned char platzplus() //Senderplatz um 1 erhöhen
{ //Bei weniger Sendern in Liste auf Platz 1 zurück
if (anzahl>0){
sender++;
if (sender>anzahl){
sender=1;
}
radioein();
}
}
unsigned char platzminus() //Senderplatz um 1 verringern
{ //Bei 0 auf letzten Platz springen
if (anzahl>0){
sender--;
if (sender<1){
sender=anzahl;
}
radioein();
}
}
unsigned char lautsetzen() //Lautstärke einstellen
{
char nummer[3];
char befehl[255]="";
sprintf(nummer,"%d",lautst);
strcpy(befehl,"mpc -q volume ");
strcat(befehl,nummer);
system(befehl);
platzlautsenden();
}
unsigned char lauter() //Senderplatz um 5 Prozentpunkte erhöhen
{
if (lautst<96){
lautst+=5;
lautsetzen();
}
}
unsigned char leiser() //Senderplatz um 5 Prozentpunkte verringern
{
if (lautst>5){
lautst-=5;
}else{
lautst=0;
}
lautsetzen();
}
unsigned char radioaus() //Wiedergabe anhalten
{
system("mpc -q stop");
system("/var/scripte/senden 45");
sleep(1);
}
unsigned char auswerten() //Angekommene Daten auswerten
{ int i;
int fd1;
int zeile;
char ret;
char farbe[6]="";
/* Zum Schreiben öffnen */
if ((strcmp(eingang,"resetreset") ==0 )){
system("reboot");
}
if (eingang[0] == 83){ // S
zeile=eingang[1]-48; //Werte von 48-255 = 207 mögliche Sender, wird auf 200 limitiert
if (zeile == 0){ // bei 0 einfach weiter abspielen oder Platz 1 beginnen
abspielen();
}else if (zeile<=anzahl){
sender=zeile;
radioein();
}
}
if (eingang[0] == 84){ // T
if (eingang[1]>49&&eingang[1]<57){ //Wert soweit OK, Taste 1 = Powertaste und wird vom AVR ausgewertet
if (eingang[1]==50){ //2 - OK Taste
abspielen();
}
if (eingang[1]==51){ //3 - Wippe rechts
lauter();
}
if (eingang[1]==52){ //4 - BACK Taste
radioaus();
}
if (eingang[1]==53){ //5 - Menü Taste
system("/var/scripte/senden");
}
if (eingang[1]==54){ //6 - Wippe hoch
platzplus();
}
if (eingang[1]==55){ //7 - Wippe links
leiser();
}
if (eingang[1]==56){ //8 - Wippe runter
platzminus();
}
}
}
if (eingang[0] == 80){ // P
if (eingang[1]==49){ //1
platzplus();
}else{
platzminus();
}
}
if (eingang[0] == 66){ // B
if (eingang[1]==48){ //0 Wiedergabe stoppen
radioaus();
}
if (eingang[1]==49){ //1 mpd zurücksetzen
initmpd();
}
}
eingangleer();
}
unsigned char receive() //Zeichen empfangen
{
int res;
unsigned char buffer;
res = read(fd, &buffer, 1);
getit = fd;
return buffer;
}
int init() //Schnittstelle parametrieren und öffnen für I-Bus 9600 8E1
{
//O_RDONLY, O_WRONLY or O_RDWR -
//O_NDELAY (geht weiter, wenn keine Daten da sind und gibt "-1" zurueck)
// man 2 open fuer mehr Infos - see "man 2 open" for more info
// O_NOCTTY No ControllTeleType
fd = open(MODEMDEVICE, O_RDONLY | O_NOCTTY );
if (fd < 0){
printf("Fehler beim oeffnen von %s\n", MODEMDEVICE);
exit(-1);
}
memset(&newtio, 0, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD | PARENB; //setzt die neuen Porteinstellungen
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0; /* set input mode (non-canonical, no echo, ...) */
newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 chars received old 1 */
tcflush(fd, TCIFLUSH);
tcsetattr(fd, TCSANOW, &newtio);
//getit = O_NDELAY;
return fd;
}
int main(int argc, char** argv) //Programmstart
{
//new
int pin = 7; //GPIO 4
int value = 0; // Deklaration Eingangswert GPIO4
getit = 0;
printf ("Raspberry Pi wiringPi test program\n") ;
if (wiringPiSetup () == -1)
exit (1) ;
//new end Check wiring pi
pinMode(pin,INPUT);
char c;
init(); //Schnittstelle UART parametrieren und öffnen
sleep(5); //warten bis mpd gestartet ist
initmpd(); //mpd auf definierten Zustand bringen
while (1)
{
value = digitalRead (pin);
printf("Status Schnittstelle %d \n", getit );
//printf("SEN/STA: %d\n", value); // BUSRUHE?
c=receive();
//if((value==1)){
printf("MESSAGE %X\n", c); // c in Hex ausgeben %d = Dezimal %H = Hex
//}
/*
c=receive(); //Zeichen holen
if((c==13)){ //CR als Abschluß einer Zeile
auswerten();
}else if(c>13&&c<128){ //Alles von ASCii 14 bis 127 wird akzetpiert
eingang[laenge]=c;
laenge++;
if (laenge >254){ //Bei 254 Zeichen im Puffer wird automatisch ausgewertet
auswerten();
}
}
printf("The answer is %X\n", c); // c in Hex ausgeben %d = Dezimal %H = Hex
*/
}
close (fd);
return 0;
}
Grüße Rainer
Lesezeichen