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