So, der Wiki Artikel ist erstmal fertig. Jetzt lass ich mich überraschen, was da noch geändert wird.![]()
Damit nichts verloren geht, stelle ich jetzt hier auch nochmal die aktuellen Quellcodes ein.
empfangen
sendenCode:// Kompilieren mit: GCC /var/scripte/empfangen.c -o /var/scripte/empfangen #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> #define BAUDRATE B19200 char MODEMDEVICE[]= "/dev/ttyAMA0"; // Schnittstelle /* 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); return buffer; } int init() //Schnittstelle parametrieren und öffnen { //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; //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 */ tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio); return fd; } int main(int argc, char** argv) //Programmstart { char c; init(); //Schnittstelle parametrieren und öffnen sleep(5); //warten bis mpd gestartet ist initmpd(); //mpd auf definierten Zustand bringen while (1) { 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(); } } } close (fd); return 0; }
mpcout (Der Überwacher)Code:// Kompilieren mit: GCC /var/scripte/senden.c -o /var/scripte/senden //#include <iostream> //using namespace std; #include <sys/types.h> //nicht benötigtes scheint keinen Platz zu verschwenden... #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> #define BAUDRATE B19200 char MODEMDEVICE[]= "/dev/ttyAMA0"; // !!! int fd; // File descriptor struct termios newtio={}; unsigned char send(char c) { int res=write(fd, &c, 1); if (res<0) printf("Fehler beim Senden\n"); return res; } int init() //Schnittstelle parametrieren und öffnen { /*** Init ***/ //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_WRONLY | 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; //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 */ tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio); return fd; } int einmal() //Sucht bereits laufende Instanzen und zählt diese { int i=0; int anzahl=0; int laenge=0; char *ptr; FILE *in; extern FILE *popen(); char buff[30]; if(!(in = popen("pidof senden", "r"))){ exit(1); } fgets(buff, sizeof(buff), in); pclose(in); laenge=strlen(buff); for(i=0;i<laenge;i++) { if(buff[i]==' ') anzahl++; } return anzahl; } int main(int argc, char** argv) //Programmstart { char vBuf[100]="",*pBuf; char buffer [100]=""; char buffer1 [100]=""; int i=0; int anzahl; anzahl=einmal(); if (anzahl>0){ anzahl++; sleep(anzahl); } init(); if (argc == 1) { //Wenn nichts angegeben, dann Uhrzeit und Datum senden time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); strftime (buffer,80,"U%H:%M:%S",timeinfo); //Uhh:mm:ss pBuf=buffer; strcat(pBuf,"\r"); while(pBuf && *pBuf) //Zeichen einzeln senden send(*pBuf++); strftime (buffer,80,"D%d.%m.%y",timeinfo); //Dtt.mm.yy pBuf=buffer; strcat(pBuf,"\r"); sleep(1); while(pBuf && *pBuf) //Zeichen einzeln senden send(*pBuf++); }else{ //Sonst Parameter einlesen und senden if(strlen(argv[1])>75){ //Puffer im AVR ist auf 80 gestellt strncpy(buffer,argv[1],76); buffer[76]='\0'; }else{ strcpy(buffer,argv[1]); if (argc >2){ for (i=2;i<argc;i++){ if(strlen(buffer)+strlen(argv[i])>75){ strcat(buffer," "); strncat(buffer,argv[i],(76-strlen(buffer))); buffer[76]='\0'; break; //exit for in c... }else{ strcat(buffer," "); strcat(buffer,argv[i]); } } } } int o=0; //Umlaute anpassen, ASCii 195 verwerfen for(i=0;i<strlen(buffer);i++){ buffer1[o]=buffer[i]; if (buffer1[o]==164){ //ä buffer1[o]= 228; } if (buffer1[o]==188){ //ü buffer1[o]= 252; } if (buffer1[o]==182){ //ö buffer1[o]= 246; } if (buffer1[o]==132){ //Ä buffer1[o]= 196; } if (buffer1[o]==156){ //Ü buffer1[o]= 220; } if (buffer1[o]==150){ //Ö buffer1[o]= 214; } if (buffer1[o]==159){ //ß buffer1[o]= 223; } if (buffer1[o]==138){ //& buffer1[o]= 38; } if (buffer1[o] != 195){ //Initialisierung Umlaut o++; } } pBuf=buffer1; strcat(pBuf,"\r"); //CR (ASCii13) anfügen, damit der AVR auswertet while(pBuf && *pBuf){ //Zeichen einzeln senden send(*pBuf++); } } close (fd); return 0; }
radio2.sh (Initialisert den mpd)Code:// Kompilieren mit: GCC /var/scripte/mpcout.c -o /var/scripte/mpcout #include <stdio.h> #include <stdlib.h> #include <string.h> char Textalt[75]=""; int anzahl=0; int wachhund() //Sucht bereits laufende Instanzen und zählt diese { char *ptr; FILE *in; extern FILE *popen(); char buff[30]; if(!(in = popen("pidof mpd", "r"))){ exit(1); } fgets(buff, sizeof(buff), in); pclose(in); anzahl=(strlen(buff)); } unsigned char aktualisieren() { int i=0; int o=0; char befehl[255]=""; FILE *f; if(!(f = popen("mpc current", "r"))){ exit(1); } char Text[300]=""; char Text1[75]=""; fgets(Text, sizeof(Text), f); fclose(f); if(strlen(Text)<2){ strcpy(Text1,""); if((strcmp(Text1, Textalt)) != 0){ strcpy(Textalt, Text1); system("/var/scripte/senden 0"); system("/var/scripte/senden 45"); } }else{ o=0; for (i=0;i<strlen(Text);i++){ if (Text[i]==38){ //& Text1[o]=138; //+ }else{ Text1[o]=Text[i]; } o++; if (o>74){ break; } } Text1[o]='\0'; if((strcmp(Text1, Textalt)) != 0){ strcpy(Textalt, Text1); strcpy(befehl,"/var/scripte/senden '1"); // \" funktioniert nicht, ' schon strcat(befehl,Text1); strcat(befehl,"'"); system(befehl); system("/var/scripte/senden 44"); } } } int main(int argc, char** argv) { while (1) { sleep(2); anzahl=0; wachhund(); if (anzahl <2){ system("/var/scripte/radio2.sh"); } aktualisieren(); } return 0; }
autostart.sh (wird von rc.local aufgerufen)Code:#!/bin/bash # # Radio starten # # /etc/init.d/mpd restart #Versetzt den mpd in einen definierten Zustand mpc -q clear #Nicht nötig, wenn man kein Status File nutzt, schadet aber auch nicht, wenn man keines nutzt... mpc -q load radiosender #lädt die von uns erstellte Playlist mpc -q volume 95 #setzt die Lautstärke auf 95 % exit 0
Code:#!/bin/bash # # Autostart # # ##sound amixer cset numid=3 1 amixer -c 0 cset numid=2 on,off amixer set PCM 95% aplay /var/sounds/start.wav nice -1 /var/scripte/empfangen & nice -1 /var/scripte/mpcout &







Zitieren

Lesezeichen