So, der Wiki Artikel ist erstmal fertig. Jetzt lass ich mich überraschen, was da noch geändert wird. ![Zwinkern](https://www.roboternetz.de/phpBB2/images/smiles/icon_wink.gif)
Damit nichts verloren geht, stelle ich jetzt hier auch nochmal die aktuellen Quellcodes ein.
empfangen
Code:
// 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;
}
senden
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;
}
mpcout (Der Überwacher)
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;
}
radio2.sh (Initialisert den mpd)
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
autostart.sh (wird von rc.local aufgerufen)
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 &
Lesezeichen