Sungo SXL MQTT Anbindung: Unterschied zwischen den Versionen
Zeile 542: | Zeile 542: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
+ | </syntaxhighlight> | ||
+ | </div></div> | ||
+ | |||
+ | ==Sungoauswertungcurses== | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:600px; overflow:auto;"> | ||
+ | <div style="font-weight:bold;line-height:1.6;">Sungoauswertungcurses.c</div> | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="c" line> | ||
+ | #include <string.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <stdio.h> | ||
+ | #include <unistd.h> | ||
+ | #include <sys/types.h> | ||
+ | #include <sys/stat.h> | ||
+ | #include <fcntl.h> | ||
+ | #include <termios.h> // termios is the API that is in general recommended for serial I/O in Unix. | ||
+ | #include <curses.h> | ||
+ | |||
+ | #define BAUDRATE B115200 | ||
+ | #define MODEMDEVICE "/dev/ttyS1" | ||
+ | #define _POSIX_SOURCE 1 /* POSIX compliant source */ | ||
+ | #define FALSE 0 | ||
+ | #define TRUE 1 | ||
+ | |||
+ | volatile int STOP=FALSE; | ||
+ | |||
+ | char datum[11]; | ||
+ | char uhrzeit[7]; | ||
+ | char temperatur[25]; | ||
+ | char prozent[7]; | ||
+ | char fehler[17]; | ||
+ | char stunden[8]; | ||
+ | char dummy[7]; | ||
+ | |||
+ | |||
+ | unsigned int hextodec(char hex[10]){ | ||
+ | unsigned int decimal=0; | ||
+ | unsigned int length=0; | ||
+ | unsigned int base = 1; | ||
+ | int i=0; | ||
+ | |||
+ | while(hex[i]!='\0'){ | ||
+ | i++; | ||
+ | } | ||
+ | length=i; | ||
+ | |||
+ | //printf("hextodec %s\n\r",hex); | ||
+ | //printf("length %d\n\r",length); | ||
+ | |||
+ | for(i = length-1; i >= 0; i--){ | ||
+ | //printf("i: %d\n\r",i); | ||
+ | if (i<0)i=0; | ||
+ | if(hex[i] >= '0' && hex[i] <= '9'){ | ||
+ | decimal += ((unsigned char)hex[i] - 48) * base; | ||
+ | base *= 16; | ||
+ | } | ||
+ | else if(hex[i] >= 'A' && hex[i] <= 'F'){ | ||
+ | decimal += ((unsigned char)hex[i] - 55) * base; | ||
+ | base *= 16; | ||
+ | } | ||
+ | else if(hex[i] >= 'a' && hex[i] <= 'f'){ | ||
+ | decimal += ((unsigned char)hex[i] - 87) * base; | ||
+ | base *= 16; | ||
+ | } | ||
+ | } | ||
+ | //printf("decimal %d\n\r",decimal); | ||
+ | return decimal; | ||
+ | } | ||
+ | |||
+ | |||
+ | void datumformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char datumStr_formatted[]="00.00.2021"; | ||
+ | char datumStr[5]=""; | ||
+ | unsigned int datumInt; | ||
+ | size_t l; | ||
+ | |||
+ | sprintf(tmp,"%X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | //strcpy(data,"0135"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | datumInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",datumInt); | ||
+ | sprintf(datumStr,"%d",datumInt); | ||
+ | if(strlen(datumStr)==3){ | ||
+ | datumStr_formatted[0]=datumStr[1]; | ||
+ | datumStr_formatted[1]=datumStr[2]; | ||
+ | datumStr_formatted[4]=datumStr[0]; | ||
+ | strcpy(datum,datumStr_formatted); | ||
+ | } | ||
+ | else if(strlen(datumStr)==4){ | ||
+ | datumStr_formatted[0]=datumStr[2]; | ||
+ | datumStr_formatted[1]=datumStr[3]; | ||
+ | datumStr_formatted[3]=datumStr[0]; | ||
+ | datumStr_formatted[4]=datumStr[1]; | ||
+ | strcpy(datum,datumStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(datum,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | void uhrzeitformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char uhrzeitStr_formatted[]="00:00"; | ||
+ | unsigned int uhrzeitInt, stunden, minuten; | ||
+ | size_t l; | ||
+ | |||
+ | sprintf(tmp,"%02X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%02X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | //strcpy(data,"1500"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | uhrzeitInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",uhrzeitInt); | ||
+ | stunden=(unsigned int)uhrzeitInt/60; | ||
+ | minuten=uhrzeitInt-(stunden*60); | ||
+ | if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen | ||
+ | sprintf(uhrzeitStr_formatted,"%02d:%02d",stunden,minuten); | ||
+ | strcpy(uhrzeit,uhrzeitStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(uhrzeit,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | void temperaturformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char temperaturStr_formatted[20]=""; | ||
+ | unsigned int temperaturInt; | ||
+ | float temperaturFloat; | ||
+ | size_t l; | ||
+ | |||
+ | memset(data,'\0',sizeof(data)); | ||
+ | memset(tmp,'\0',sizeof(tmp)); | ||
+ | |||
+ | |||
+ | sprintf(tmp,"%02X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%02X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | |||
+ | //strcpy(data,"0500"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | temperaturInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",temperaturInt); | ||
+ | temperaturFloat=(float)temperaturInt/10.0; | ||
+ | |||
+ | if(TRUE){ | ||
+ | memset(temperaturStr_formatted,'\0',sizeof(temperaturStr_formatted)); | ||
+ | sprintf(temperaturStr_formatted,"%5.1f °C (%d) ",temperaturFloat,temperaturInt); | ||
+ | strcpy(temperatur,temperaturStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(temperatur,"Error!\0"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | void prozentformatieren(unsigned char byte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char prozentStr_formatted[]="000%"; | ||
+ | unsigned int prozentInt; | ||
+ | size_t l; | ||
+ | |||
+ | sprintf(tmp,"%X",byte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | |||
+ | //strcpy(data,"1500"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | prozentInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",prozentInt); | ||
+ | |||
+ | if(TRUE){ | ||
+ | sprintf(prozentStr_formatted,"%3d%%",prozentInt); | ||
+ | strcpy(prozent,prozentStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(prozent,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | void stundenformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char stundenStr_formatted[]="000000h"; | ||
+ | unsigned int stundenInt; | ||
+ | |||
+ | sprintf(tmp,"%X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | //strcpy(data,"1500"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | stundenInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",temperaturInt); | ||
+ | |||
+ | if(TRUE){ | ||
+ | sprintf(stundenStr_formatted,"%dh",stundenInt); | ||
+ | strcpy(stunden,stundenStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(stunden,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | void fehlerformatieren(unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4,unsigned char byte5,unsigned char byte6,unsigned char byte7,unsigned char byte8){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char fehlerStr_formatted[9]; | ||
+ | unsigned int fehlerInt; | ||
+ | |||
+ | fehlerInt=12345; | ||
+ | |||
+ | if(TRUE){ | ||
+ | sprintf(fehlerStr_formatted,"%d",fehlerInt); | ||
+ | strcpy(fehler,fehlerStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(fehler,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | void dummyformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | |||
+ | sprintf(tmp,"%X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | if(TRUE){ | ||
+ | strcpy(dummy,data); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(dummy,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | |||
+ | struct termios oldtio,newtio; | ||
+ | |||
+ | int fd; | ||
+ | int c; | ||
+ | int res; | ||
+ | int i,k,l; | ||
+ | unsigned int x,y,z,t1,t2,t3,dsIndex, dfIndex, dfX, dfY, sort1,sort2, stelle, zeilenproblock; | ||
+ | unsigned int state=0, syncstate=0; | ||
+ | |||
+ | unsigned char buf[1]; | ||
+ | unsigned char merker[6]; | ||
+ | unsigned char datensatz[200]; | ||
+ | unsigned char datenfeld[100]; | ||
+ | unsigned char datenfelder[50][16]; | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | bool printflag; | ||
+ | |||
+ | memset(temperatur, '\0', sizeof(temperatur)); | ||
+ | |||
+ | |||
+ | // wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nim diese sonst veruche default | ||
+ | if (argc > 1) | ||
+ | fd = open(argv[1], O_RDWR | O_NOCTTY ); | ||
+ | else | ||
+ | fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); | ||
+ | if (fd <0) { | ||
+ | perror(MODEMDEVICE); | ||
+ | exit(-1); | ||
+ | } | ||
+ | |||
+ | // sichere die aktuellen Einstellungen | ||
+ | tcgetattr(fd,&oldtio); | ||
+ | |||
+ | // baue die neuen Einstellungen zusammen | ||
+ | bzero(&newtio, sizeof(newtio)); | ||
+ | newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; | ||
+ | newtio.c_iflag = IGNPAR | IXON | IXOFF; | ||
+ | newtio.c_oflag = 0; | ||
+ | newtio.c_lflag = 0; | ||
+ | newtio.c_cc[VTIME] = 0; /* inter-character timer unused */ | ||
+ | newtio.c_cc[VMIN] = 5; /* blocking read until 5 chars received */ | ||
+ | |||
+ | tcflush(fd, TCIFLUSH); | ||
+ | tcsetattr(fd,TCSANOW,&newtio); | ||
+ | |||
+ | setvbuf(stdout, (char *)NULL, _IONBF, 0); | ||
+ | |||
+ | initscr(); | ||
+ | getmaxyx(stdscr,x,y); | ||
+ | printf("X:%d/Y:%d\n",x,y); | ||
+ | while (STOP==FALSE) { /* loop for input */ | ||
+ | res = read(fd,buf,1); /* returns after 5 chars have been input */ | ||
+ | //printf("A: syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]); | ||
+ | |||
+ | //sobald ein AA kommt beginne die Beobachtung | ||
+ | if ((buf[0]==170) && (syncstate==5)){ | ||
+ | syncstate=0; | ||
+ | } | ||
+ | if ((buf[0]==170) && (syncstate==0)){ | ||
+ | syncstate=1; | ||
+ | merker[0]=buf[0]; | ||
+ | } | ||
+ | if ((buf[0]==85) && (syncstate==1)){ | ||
+ | syncstate=2; | ||
+ | merker[1]=buf[0]; | ||
+ | } | ||
+ | if ((buf[0]==85) && (syncstate==2)){ | ||
+ | syncstate=3; | ||
+ | merker[2]=buf[0]; | ||
+ | } | ||
+ | if ((buf[0]==170) && (syncstate==3)){ | ||
+ | syncstate=4; | ||
+ | merker[3]=buf[0]; | ||
+ | state=0; | ||
+ | } | ||
+ | if (((buf[0]==1)||(buf[0]==2)||(buf[0]==3)) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==4)){ | ||
+ | merker[4]=buf[0]; | ||
+ | syncstate=5; | ||
+ | } | ||
+ | |||
+ | |||
+ | if ((buf[0]==0) && (merker[4]==1) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){ | ||
+ | state=10; // state 10 bereit fuer 0100 | ||
+ | printflag=FALSE; | ||
+ | for(i=0;i<5;i++)merker[i]=0; | ||
+ | x=1; | ||
+ | y=8; | ||
+ | stelle=0; | ||
+ | } | ||
+ | if ((buf[0]==0) && (merker[4]==2) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){ | ||
+ | state=20; // state 10 bereit fuer 0100 | ||
+ | printflag=FALSE; | ||
+ | for(i=0;i<5;i++)merker[i]=0; | ||
+ | x=2; | ||
+ | y=8; | ||
+ | stelle=0; | ||
+ | } | ||
+ | if ((buf[0]==0) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){ | ||
+ | state=30; // state 10 bereit fuer 0100 | ||
+ | printflag=FALSE; | ||
+ | for(i=0;i<5;i++)merker[i]=0; | ||
+ | dsIndex=0; | ||
+ | x=3; | ||
+ | y=8; | ||
+ | stelle=0; | ||
+ | } | ||
+ | if ((buf[0]==1) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){ | ||
+ | state=31; // state 10 bereit fuer 0100 | ||
+ | printflag=FALSE; | ||
+ | for(i=0;i<5;i++)merker[i]=0; | ||
+ | dfIndex=0; | ||
+ | x=4; | ||
+ | y=8; | ||
+ | stelle=0; | ||
+ | } | ||
+ | |||
+ | zeilenproblock=3; | ||
+ | |||
+ | if ((state==10) && printflag) { | ||
+ | z=(x-1)*zeilenproblock+x; | ||
+ | mvprintw(z,1,"0100:"); | ||
+ | mvaddch(z,y,buf[0]); | ||
+ | mvprintw(z+1,y,"%02X ",buf[0]); | ||
+ | mvprintw(z+2,y,"%d ",stelle); | ||
+ | y+=3; | ||
+ | stelle++; | ||
+ | } | ||
+ | else if ((state==20) && printflag) { | ||
+ | z=(x-1)*zeilenproblock+x; | ||
+ | mvprintw(z,1,"0200:"); | ||
+ | mvaddch(z,y,buf[0]); | ||
+ | mvprintw(z+1,y,"%02X ",buf[0]); | ||
+ | mvprintw(z+2,y,"%d ",stelle); | ||
+ | y+=3; | ||
+ | stelle++; | ||
+ | } | ||
+ | else if ((state==30) && printflag){ | ||
+ | z=(x-1)*zeilenproblock+x; | ||
+ | mvprintw(z,1,"0300:"); | ||
+ | mvaddch(z,y,buf[0]); | ||
+ | mvprintw(z+1,y,"%02X ",buf[0]); | ||
+ | mvprintw(z+2,y,"%d ",stelle); | ||
+ | y+=3; | ||
+ | stelle++; | ||
+ | if(dsIndex<100)datensatz[dsIndex++]=buf[0]; | ||
+ | } | ||
+ | else if ((state==31) && printflag) { | ||
+ | z=(x-1)*zeilenproblock+x; | ||
+ | mvprintw(z,1,"0301:"); | ||
+ | mvaddch(z,y,buf[0]); | ||
+ | mvprintw(z+1,y,"%02X ",buf[0]); | ||
+ | mvprintw(z+2,y,"%d ",stelle); | ||
+ | y+=3; | ||
+ | stelle++; | ||
+ | if(dfIndex<100)datenfeld[dfIndex++]=buf[0]; | ||
+ | } | ||
+ | else{ | ||
+ | //printf("syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]); | ||
+ | } | ||
+ | //mvprintw(5,1,"Test"); | ||
+ | printflag=TRUE; | ||
+ | refresh(); | ||
+ | //printf("E: syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]); | ||
+ | //if (buf[0]=='z') STOP=TRUE; | ||
+ | //x max = 4 | ||
+ | z=20; | ||
+ | t1=35; | ||
+ | t2=t1+30; | ||
+ | sort1=0; | ||
+ | mvprintw(z+sort1,1,"Datum: (2,3)"); | ||
+ | datumformatieren(datensatz[2],datensatz[3]); | ||
+ | //printf("datum: %s",datum); | ||
+ | mvprintw(z+sort1,t1,datum); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[2],datensatz[3]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Uhrzeit: (4,5)"); | ||
+ | uhrzeitformatieren(datensatz[4],datensatz[5]); | ||
+ | //printf("uhrzeit: %s",uhrzeit); | ||
+ | mvprintw(z+sort1,t1,uhrzeit); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[4],datensatz[5]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Kollektor: (6,7)"); | ||
+ | temperaturformatieren(datensatz[6],datensatz[7]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,"%s",temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[6],datensatz[7]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Speicher unten: (8,9)"); | ||
+ | temperaturformatieren(datensatz[8],datensatz[9]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,"%s",temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[8],datensatz[9]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Speicher oben: (10,11)"); | ||
+ | temperaturformatieren(datensatz[10],datensatz[11]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,"%s",temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[10],datensatz[11]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Thermostat: (12,13)"); | ||
+ | temperaturformatieren(datensatz[12],datensatz[13]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,"%s",temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[12],datensatz[13]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Poolschutz: (14,15)"); | ||
+ | temperaturformatieren(datensatz[14],datensatz[15]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,"%s",temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[14],datensatz[15]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Ertrag: (16,17)"); | ||
+ | temperaturformatieren(datensatz[16],datensatz[17]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,"%s",temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[16],datensatz[17]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Ruecklaufanhebung T7: (18,19)"); | ||
+ | temperaturformatieren(datensatz[18],datensatz[19]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,"%s",temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[18],datensatz[19]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Ruecklaufanhebung T8: (20,21)"); | ||
+ | temperaturformatieren(datensatz[20],datensatz[21]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,"%s",temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[20],datensatz[21]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"T: (22,23)"); | ||
+ | temperaturformatieren(datensatz[22],datensatz[23]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,"%s",temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[22],datensatz[23]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Dummy: (24,25)"); | ||
+ | dummyformatieren(datensatz[24],datensatz[25]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[24],datensatz[25]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Strahlung: (26,27)"); | ||
+ | temperaturformatieren(datensatz[26],datensatz[27]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[26],datensatz[27]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Dummy: (28,29)"); | ||
+ | dummyformatieren(datensatz[28],datensatz[29]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[28],datensatz[29]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Dummy: (30,31)"); | ||
+ | temperaturformatieren(datensatz[30],datensatz[31]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[30],datensatz[31]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Ausgang 1: (32)"); | ||
+ | prozentformatieren(datensatz[32]); | ||
+ | //printf("prozent: %s",prozent); | ||
+ | mvprintw(z+sort1,t1,prozent); | ||
+ | mvprintw(z+sort1,t2,"%02X",datensatz[32]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Ausgang 2: (33)"); | ||
+ | prozentformatieren(datensatz[33]); | ||
+ | //printf("prozent: %s",prozent); | ||
+ | mvprintw(z+sort1,t1,prozent); | ||
+ | mvprintw(z+sort1,t2,"%02X",datensatz[33]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Ausgang 3: (34)"); | ||
+ | prozentformatieren(datensatz[34]); | ||
+ | //printf("prozent: %s",prozent); | ||
+ | mvprintw(z+sort1,t1,prozent); | ||
+ | mvprintw(z+sort1,t2,"%02X",datensatz[34]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Ausgang 4: (35)"); | ||
+ | prozentformatieren(datensatz[35]); | ||
+ | //printf("prozent: %s",prozent); | ||
+ | mvprintw(z+sort1,t1,prozent); | ||
+ | mvprintw(z+sort1,t2,"%02X",datensatz[35]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Ausgang 5: (36)"); | ||
+ | prozentformatieren(datensatz[36]); | ||
+ | //printf("prozent: %s",prozent); | ||
+ | mvprintw(z+sort1,t1,prozent); | ||
+ | mvprintw(z+sort1,t2,"%02X",datensatz[36]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Ausgang 6: (37)"); | ||
+ | prozentformatieren(datensatz[37]); | ||
+ | //printf("prozent: %s",prozent); | ||
+ | mvprintw(z+sort1,t1,prozent); | ||
+ | mvprintw(z+sort1,t2,"%02X",datensatz[37]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Fehler: (38-45)"); | ||
+ | fehlerformatieren(datensatz[38],datensatz[39],datensatz[40],datensatz[41],datensatz[42],datensatz[43],datensatz[44],datensatz[45]); | ||
+ | //printf("fehler: %s",fehler); | ||
+ | mvprintw(z+sort1,t1,fehler); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X %02X %02X %02X %02X %02X %02X",datensatz[38],datensatz[39],datensatz[40],datensatz[41],datensatz[42],datensatz[43],datensatz[44],datensatz[45]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Speicher 1: (46,47)"); | ||
+ | temperaturformatieren(datensatz[46],datensatz[47]); | ||
+ | //printf("temperatur: %s",temperatur); | ||
+ | mvprintw(z+sort1,t1,temperatur); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[46],datensatz[47]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Dummy: (48,49)"); | ||
+ | dummyformatieren(datensatz[48],datensatz[49]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[48],datensatz[49]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Speicher 2: (50,51)"); | ||
+ | stundenformatieren(datensatz[50],datensatz[51]); | ||
+ | //printf("stunden: %s",stunden); | ||
+ | mvprintw(z+sort1,t1,stunden); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[50],datensatz[51]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Dummy: (52,53)"); | ||
+ | dummyformatieren(datensatz[52],datensatz[53]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[52],datensatz[53]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Dummy: (54,55)"); | ||
+ | dummyformatieren(datensatz[54],datensatz[55]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[54],datensatz[55]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Funktion 1 aktiv: (56,57)"); | ||
+ | dummyformatieren(datensatz[56],datensatz[57]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[56],datensatz[57]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Funktion 2 aktiv: (58,59)"); | ||
+ | dummyformatieren(datensatz[58],datensatz[59]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[58],datensatz[59]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Volumenstrom: (60,61)"); | ||
+ | dummyformatieren(datensatz[60],datensatz[61]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[60],datensatz[61]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Dummy: (62,63)"); | ||
+ | dummyformatieren(datensatz[62],datensatz[63]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[62],datensatz[63]); | ||
+ | sort1++; | ||
+ | mvprintw(z+sort1,1,"Dummy: (64,65)"); | ||
+ | dummyformatieren(datensatz[64],datensatz[65]); | ||
+ | //printf("dummy: %s",dummy); | ||
+ | mvprintw(z+sort1,t1,dummy); | ||
+ | mvprintw(z+sort1,t2,"%02X %02X",datensatz[64],datensatz[65]); | ||
+ | |||
+ | t3=t2+20; | ||
+ | sort2=0; | ||
+ | |||
+ | i=0; | ||
+ | mvprintw(z+sort2,t3,"%02X ",datenfeld[i++]); | ||
+ | mvprintw(z+sort2,t3+3,"%02X ",datenfeld[i++]); | ||
+ | mvprintw(z+sort2,t3+6,"%02X ",datenfeld[i++]); | ||
+ | for(k=0;k<32;k++){ | ||
+ | sprintf(tmp,"%X",datenfeld[i+(k*16)]); | ||
+ | strcpy(data,tmp); | ||
+ | sort2=hextodec(data)*2; | ||
+ | if (sort2>62) sort2=64; | ||
+ | for(l=0;l<16;l++){ | ||
+ | mvprintw(z+sort2,t3+(l*3),"%02X ",datenfeld[i+(k*16)+l]); | ||
+ | if (datenfeld[i+(k*16)+l]!=0){ mvprintw(z+sort2+1,t3+(l*3),"%c ",datenfeld[i+(k*16)+l]); } | ||
+ | else { mvprintw(z+sort2+1,t3+(l*3)," "); } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | endwin(); | ||
+ | |||
+ | close(fd); | ||
+ | |||
+ | tcsetattr(fd,TCSANOW,&oldtio); | ||
+ | |||
+ | return EXIT_SUCCESS; | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | </div></div> | ||
+ | |||
+ | ==Sungoserialcapture== | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:600px; overflow:auto;"> | ||
+ | <div style="font-weight:bold;line-height:1.6;">Sungoserialcapture.c</div> | ||
+ | <div class="mw-collapsible-content"> | ||
+ | <syntaxhighlight lang="c" line> | ||
+ | #include <string.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <stdio.h> | ||
+ | #include <unistd.h> | ||
+ | #include <sys/types.h> | ||
+ | #include <sys/stat.h> | ||
+ | #include <fcntl.h> | ||
+ | #include <termios.h> // termios is the API that is in general recommended for serial I/O in Unix. | ||
+ | #include <curses.h> | ||
+ | |||
+ | #define BAUDRATE B115200 | ||
+ | #define MODEMDEVICE "/dev/ttyS1" | ||
+ | #define _POSIX_SOURCE 1 /* POSIX compliant source */ | ||
+ | #define FALSE 0 | ||
+ | #define TRUE 1 | ||
+ | |||
+ | volatile int STOP=FALSE; | ||
+ | |||
+ | char datum[11]; | ||
+ | char uhrzeit[7]; | ||
+ | char temperatur[8]; | ||
+ | char prozent[7]; | ||
+ | char fehler[17]; | ||
+ | char stunden[8]; | ||
+ | char dummy[7]; | ||
+ | |||
+ | unsigned int hextodec(char hex[10]){ | ||
+ | unsigned int decimal=0; | ||
+ | unsigned int length=0; | ||
+ | unsigned int base = 1; | ||
+ | int i=0; | ||
+ | |||
+ | while(hex[i]!='\0'){ | ||
+ | i++; | ||
+ | } | ||
+ | length=i; | ||
+ | |||
+ | //printf("hextodec %s\n\r",hex); | ||
+ | //printf("length %d\n\r",length); | ||
+ | |||
+ | for(i = length-1; i >= 0; i--){ | ||
+ | //printf("i: %d\n\r",i); | ||
+ | if (i<0)i=0; | ||
+ | if(hex[i] >= '0' && hex[i] <= '9'){ | ||
+ | decimal += ((unsigned char)hex[i] - 48) * base; | ||
+ | base *= 16; | ||
+ | } | ||
+ | else if(hex[i] >= 'A' && hex[i] <= 'F'){ | ||
+ | decimal += ((unsigned char)hex[i] - 55) * base; | ||
+ | base *= 16; | ||
+ | } | ||
+ | else if(hex[i] >= 'a' && hex[i] <= 'f'){ | ||
+ | decimal += ((unsigned char)hex[i] - 87) * base; | ||
+ | base *= 16; | ||
+ | } | ||
+ | } | ||
+ | //printf("decimal %d\n\r",decimal); | ||
+ | return decimal; | ||
+ | } | ||
+ | |||
+ | |||
+ | void datumformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char datumStr_formatted[]="00.00.2021"; | ||
+ | char datumStr[5]=""; | ||
+ | unsigned int datumInt; | ||
+ | size_t l; | ||
+ | |||
+ | sprintf(tmp,"%X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | //strcpy(data,"0135"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | datumInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",datumInt); | ||
+ | sprintf(datumStr,"%d",datumInt); | ||
+ | if(strlen(datumStr)==3){ | ||
+ | datumStr_formatted[0]=datumStr[1]; | ||
+ | datumStr_formatted[1]=datumStr[2]; | ||
+ | datumStr_formatted[4]=datumStr[0]; | ||
+ | strcpy(datum,datumStr_formatted); | ||
+ | } | ||
+ | else if(strlen(datumStr)==4){ | ||
+ | datumStr_formatted[0]=datumStr[2]; | ||
+ | datumStr_formatted[1]=datumStr[3]; | ||
+ | datumStr_formatted[3]=datumStr[0]; | ||
+ | datumStr_formatted[4]=datumStr[1]; | ||
+ | strcpy(datum,datumStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(datum,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | void uhrzeitformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char uhrzeitStr_formatted[]="00:00"; | ||
+ | unsigned int uhrzeitInt, stunden, minuten; | ||
+ | size_t l; | ||
+ | |||
+ | sprintf(tmp,"%X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | //strcpy(data,"1500"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | uhrzeitInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",uhrzeitInt); | ||
+ | stunden=(unsigned int)uhrzeitInt/60; | ||
+ | minuten=uhrzeitInt-(stunden*60); | ||
+ | if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen | ||
+ | sprintf(uhrzeitStr_formatted,"%d:%d",stunden,minuten); | ||
+ | strcpy(uhrzeit,uhrzeitStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(uhrzeit,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | void temperaturformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char temperaturStr_formatted[]="000.0°C"; | ||
+ | unsigned int temperaturInt; | ||
+ | float temperaturFloat; | ||
+ | size_t l; | ||
+ | |||
+ | sprintf(tmp,"%X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | //strcpy(data,"1500"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | temperaturInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",temperaturInt); | ||
+ | temperaturFloat=(float)temperaturInt/10.0; | ||
+ | |||
+ | if(TRUE){ | ||
+ | sprintf(temperaturStr_formatted,"%.1f°C",temperaturFloat); | ||
+ | strcpy(temperatur,temperaturStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(temperatur,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | void prozentformatieren(unsigned char byte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char prozentStr_formatted[]="000%"; | ||
+ | unsigned int prozentInt; | ||
+ | size_t l; | ||
+ | |||
+ | sprintf(tmp,"%X",byte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | |||
+ | //strcpy(data,"1500"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | prozentInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",prozentInt); | ||
+ | |||
+ | if(TRUE){ | ||
+ | sprintf(prozentStr_formatted,"%d%%",prozentInt); | ||
+ | strcpy(prozent,prozentStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(prozent,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | void stundenformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char stundenStr_formatted[]="000000h"; | ||
+ | unsigned int stundenInt; | ||
+ | |||
+ | sprintf(tmp,"%X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | //strcpy(data,"1500"); | ||
+ | //printf("data: %s\n\r",data); | ||
+ | stundenInt=hextodec(data); | ||
+ | //printf("int: %d\n\r",temperaturInt); | ||
+ | |||
+ | if(TRUE){ | ||
+ | sprintf(stundenStr_formatted,"%dh",stundenInt); | ||
+ | strcpy(stunden,stundenStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(stunden,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | void fehlerformatieren(unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4,unsigned char byte5,unsigned char byte6,unsigned char byte7,unsigned char byte8){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | char fehlerStr_formatted[9]; | ||
+ | unsigned int fehlerInt; | ||
+ | |||
+ | fehlerInt=12345; | ||
+ | |||
+ | if(TRUE){ | ||
+ | sprintf(fehlerStr_formatted,"%d",fehlerInt); | ||
+ | strcpy(fehler,fehlerStr_formatted); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(fehler,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | |||
+ | void dummyformatieren(unsigned char lowbyte,unsigned char highbyte){ | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | |||
+ | sprintf(tmp,"%X",highbyte); | ||
+ | strcpy(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | sprintf(tmp,"%X",lowbyte); | ||
+ | strcat(data,tmp); | ||
+ | //l=strlen(data); | ||
+ | //printf("data: %s (%d)\n\r",data,l); | ||
+ | |||
+ | if(TRUE){ | ||
+ | strcpy(dummy,data); | ||
+ | } | ||
+ | else{ | ||
+ | strcpy(dummy,"Error!"); | ||
+ | } | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | FILE *fp; | ||
+ | |||
+ | |||
+ | struct termios oldtio,newtio; | ||
+ | |||
+ | int fd; | ||
+ | int c; | ||
+ | int res; | ||
+ | int i,k,l; | ||
+ | unsigned int x,y,z,t1,t2,dsIndex, dfIndex, dfX, dfY, sort1,sort2, stelle, zeilenproblock; | ||
+ | unsigned int state=0, syncstate=0; | ||
+ | |||
+ | unsigned char buf[1]; | ||
+ | unsigned char merker[6]; | ||
+ | unsigned char datensatz[100]; | ||
+ | unsigned char datenfeld[100]; | ||
+ | unsigned char datenfelder[50][16]; | ||
+ | char data[10]=""; | ||
+ | char tmp[3]=""; | ||
+ | bool printflag; | ||
+ | |||
+ | // wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nim diese sonst veruche default | ||
+ | if (argc > 1) | ||
+ | fd = open(argv[1], O_RDWR | O_NOCTTY ); | ||
+ | else | ||
+ | fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); | ||
+ | if (fd <0) { | ||
+ | perror(MODEMDEVICE); | ||
+ | exit(-1); | ||
+ | } | ||
+ | |||
+ | // sichere die aktuellen Einstellungen | ||
+ | tcgetattr(fd,&oldtio); | ||
+ | |||
+ | // baue die neuen Einstellungen zusammen | ||
+ | bzero(&newtio, sizeof(newtio)); | ||
+ | newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; | ||
+ | newtio.c_iflag = IGNPAR | IXON | IXOFF; | ||
+ | newtio.c_oflag = 0; | ||
+ | newtio.c_lflag = 0; | ||
+ | newtio.c_cc[VTIME] = 0; /* inter-character timer unused */ | ||
+ | newtio.c_cc[VMIN] = 5; /* blocking read until 5 chars received */ | ||
+ | |||
+ | tcflush(fd, TCIFLUSH); | ||
+ | tcsetattr(fd,TCSANOW,&newtio); | ||
+ | |||
+ | setvbuf(stdout, (char *)NULL, _IONBF, 0); | ||
+ | |||
+ | fp=fopen("sungocapture.bin","w"); | ||
+ | |||
+ | if (fp == NULL) | ||
+ | return 0; | ||
+ | |||
+ | while (STOP==FALSE) { /* loop for input */ | ||
+ | res = read(fd,buf,1); /* returns after 5 chars have been input */ | ||
+ | //printf("A: syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]); | ||
+ | |||
+ | fputc(res,fp); | ||
+ | |||
+ | } | ||
+ | |||
+ | fclose(fp); | ||
+ | |||
+ | close(fd); | ||
+ | |||
+ | tcsetattr(fd,TCSANOW,&oldtio); | ||
+ | |||
+ | return EXIT_SUCCESS; | ||
+ | } | ||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
</div></div> | </div></div> |
Version vom 18. September 2021, 11:39 Uhr
Inhaltsverzeichnis
Allgemeines
Nach einer kleinen Pause (5 Monate) versuche ich die SunGO SXL Anbindung aus dem Versuchstadium zu befreien und mal alles ordentlich zu machen. Die Hardware kommt in eine Gehäuse und die Software soll ihren ersten Stresztest bestehen.
Ausgangssituation
Abgesehen von der SunGo SXL Steuerung sind aktuelle noch ein RasPi 3B, ein CP2102 USBSER und Arduino NANO und 4 DS18B20 im Einsatz. Das Netzteil ist nur eine Übergangslösung. Am liebsten wuerde ich eine MiniUSV mit ins Gehaeuse packen. Mal schauen was es da von der Stange gibt. Auf dem RasPi laeuft derzeit nur eine Software die die Aufgabe hat die Daten des SunGo-Interfaces und die Temperaturen der 4 DS18B20 (Vor-/Ruecklauf-Heizkreis1 und Vor-/Ruecklauf-Fuszbodenheizung) einzulesen und per MQTT an den FHEM-Broker (MQTT-Server) zu liefern.
Software
Sungo_MQTT
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <stdbool.h>
6 #include <time.h>
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <fcntl.h>
10 #include <termios.h> // termios is the API that is in general recommended for serial I/O in Unix.
11 #include "MQTTClient.h"
12
13 // MQTT defines
14 #define ADDRESS "tcp://192.168.178.12:1883"
15 //#define ADDRESS "tcp://localhost:1883"
16 #define CLIENTID "SunGo"
17 //#define TOPIC "MQTTExamples"
18 //#define PAYLOAD "Hello World!"
19 #define QOS 0
20 #define TIMEOUT 10000L
21
22 // SERCOM defines
23 #define BAUDRATE B115200
24 #define MODEMDEVICE "/dev/ttyS1"
25 #define _POSIX_SOURCE 1 /* POSIX compliant source */
26 #define FALSE 0
27 #define TRUE 1
28
29
30 // SunGo defines
31 #define DUMMY 0
32 #define TEMPERATUR 1 // °C
33 #define STRAHLUNG 2 // W/m²
34 #define SPEICHER1 7 // kwh
35 #define DATUM 8
36 #define UHRZEIT 9
37 #define PROZENT 10 // %
38 #define FUNKTION1 11
39 #define FUNKTION2 12
40 #define SPEICHER2 15 // h
41 #define VOLUMENSTROM 19 // l/min
42
43
44 volatile int STOP=FALSE; // braucht man eigentlich nicht
45
46
47 // globale Variablen
48 char datum[11];
49 char uhrzeit[7];
50 char temperatur[25];
51 char prozent[7];
52 char strahlung[8];
53 char fehler[17];
54 char stunden[8];
55 char dummy[7];
56
57 // hexadezimale Darstellung in dezimale umstellen
58 unsigned int hextodec(char hex[10]){
59 unsigned int decimal=0;
60 unsigned int length=0;
61 unsigned int base = 1;
62 int i=0;
63
64 while(hex[i]!='\0'){
65 i++;
66 }
67 length=i;
68
69 //printf("hextodec %s\n\r",hex);
70 //printf("length %d\n\r",length);
71
72 for(i = length-1; i >= 0; i--){
73 //printf("i: %d\n\r",i);
74 if (i<0)i=0;
75 if(hex[i] >= '0' && hex[i] <= '9'){
76 decimal += ((unsigned char)hex[i] - 48) * base;
77 base *= 16;
78 }
79 else if(hex[i] >= 'A' && hex[i] <= 'F'){
80 decimal += ((unsigned char)hex[i] - 55) * base;
81 base *= 16;
82 }
83 else if(hex[i] >= 'a' && hex[i] <= 'f'){
84 decimal += ((unsigned char)hex[i] - 87) * base;
85 base *= 16;
86 }
87 }
88 //printf("decimal %d\n\r",decimal);
89 return decimal;
90 }
91
92 void delay(int number_of_seconds) // wird doch nicht gebraucht
93 {
94 // Converting time into milli_seconds
95 int milli_seconds = 1000 * number_of_seconds;
96
97 // Storing start time
98 clock_t start_time = clock();
99
100 // looping till required time is not achieved
101 while (clock() < start_time + milli_seconds)
102 ;
103 }
104
105 // allgemeine Funktion; die verschiedenen Typen werden ueber switch case angesprochen
106 void formatieren(unsigned char typ,unsigned char lowbyte,unsigned char highbyte){
107 char data[10]=""; // dient der Aufnahme des zu wandelnden Wertes gebildet aus highbyte und lowbyte
108 char tmp[3]=""; // hilfvariable
109 char formatted[25]="";
110 char dataStr[5]="";
111 unsigned int dataInteger;
112 float dataFloat;
113 unsigned int dataStunden, dataMinuten;
114
115 //memset(formatted,'\0',sizeof(formatted));
116 //memset(data,'\0',sizeof(data));
117 //memset(tmp,'\0',sizeof(tmp));
118
119 // aus den beiden Einzelwerten wird der "Gesamtwert in der "richtigen" Reihenfolge gebildet
120 sprintf(tmp,"%02X",highbyte);
121 strcpy(data,tmp);
122 sprintf(tmp,"%02X",lowbyte);
123 strcat(data,tmp);
124
125 //printf("Data: %s\n",data);
126
127 dataInteger=hextodec(data);
128
129 switch(typ) {
130 case DUMMY: if(TRUE){
131 strcpy(dummy,data);
132 }
133 else{
134 strcpy(dummy,"Error!");
135 }
136 break;
137 case DATUM: sprintf(dataStr,"%d",dataInteger);
138 strcpy(formatted,"00.00.2021");
139 if(strlen(dataStr)==3){
140 formatted[0]=dataStr[1];
141 formatted[1]=dataStr[2];
142 formatted[4]=dataStr[0];
143 strcpy(datum,formatted);
144 }
145 else if(strlen(dataStr)==4){
146 formatted[0]=dataStr[2];
147 formatted[1]=dataStr[3];
148 formatted[3]=dataStr[0];
149 formatted[4]=dataStr[1];
150 strcpy(datum,formatted);
151 }
152 else{
153 strcpy(datum,"Error!");
154 }
155 break;
156 case UHRZEIT: dataStunden=(unsigned int)dataInteger/60;
157 dataMinuten=dataInteger-(dataStunden*60);
158 if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen
159 sprintf(formatted,"%02d:%02d",dataStunden,dataMinuten);
160 strcpy(uhrzeit,formatted);
161 }
162 else{
163 strcpy(uhrzeit,"Error!");
164 }
165 break;
166 case TEMPERATUR: dataFloat=(float)dataInteger/10.0;
167 if(TRUE){
168 //sprintf(formatted,"%5.1f °C (%d) ",dataFloat,dataInteger);
169 sprintf(formatted,"%5.1f °C",dataFloat);
170 strcpy(temperatur,formatted);
171 }
172 else{
173 strcpy(temperatur,"Error!\0");
174 }
175 break;
176 case SPEICHER2: if(TRUE){
177 sprintf(formatted,"%dh",dataInteger);
178 strcpy(stunden,formatted);
179 }
180 else{
181 strcpy(stunden,"Error!");
182 }
183 break;
184 case PROZENT: if(TRUE){
185 sprintf(formatted,"%3d%%",dataInteger);
186 strcpy(prozent,formatted);
187 }
188 else{
189 strcpy(prozent,"Error!");
190 }
191 break;
192 case STRAHLUNG: if(TRUE){
193 sprintf(formatted,"%d W/m² ",dataInteger);
194 strcpy(strahlung,formatted);
195 }
196 else{
197 strcpy(strahlung,"Error!\0");
198 }
199 break;
200 default: printf("Type Error (unknown)\n"); break;
201 }
202
203 return;
204 }
205
206 int main(int argc, char **argv)
207 { int i; // Schleifenzaehler allgemein
208 unsigned int state=0, syncstate=0; // state 10,20,30 oder 31 entsprechend 0100, 0200, 0300, 0301
209 unsigned int dsIndex, dfIndex; // Zeiger auf Datensatz und Datenfeld
210 unsigned long zeitzaehler=0; // Ausgabe verlangsamen 500000 etwa 1 Minute
211
212 unsigned char buf[1];
213 unsigned char merker[6];
214 unsigned char datensatz[100];
215 unsigned char datenfeld[100];
216 unsigned char datenfelder[50][16];
217 bool printflag;
218
219 // MQTT Vorbereitung
220 MQTTClient client;
221 MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
222 MQTTClient_message pubmsg = MQTTClient_message_initializer;
223 MQTTClient_deliveryToken token;
224 int mqttrc;
225 char topic[255]; // zur Aufnahme Werte unterhalb des basetopic
226 char *basetopic = "Haus/Heizung/Solaranlage/SunGo/";
227
228 // SerCOM Vorbereitung
229 struct termios oldtio,newtio;
230 int fd; // FileDescriptor SerCOM
231 int res; // SerCOM Einlesekontrolle
232
233 // MQTT Cleint Struktur anlegen
234 if ((mqttrc = MQTTClient_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL)) != MQTTCLIENT_SUCCESS){
235 printf("Failed to create mqttclient, return code %d\n", mqttrc);
236 exit(EXIT_FAILURE);
237 }
238
239 // wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nimm diese sonst versuche default
240 if (argc > 1)
241 fd = open(argv[1], O_RDWR | O_NOCTTY );
242 else
243 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
244 if (fd <0) {
245 perror(MODEMDEVICE);
246 exit(-1);
247 }
248
249 // sichere die aktuellen Einstellungen
250 tcgetattr(fd,&oldtio);
251
252 // baue die neuen Einstellungen zusammen
253 bzero(&newtio, sizeof(newtio));
254 newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
255 newtio.c_iflag = IGNPAR | IXON | IXOFF;
256 newtio.c_oflag = 0;
257 newtio.c_lflag = 0;
258 newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
259 newtio.c_cc[VMIN] = 1; /* blocking read until 1 chars received */
260
261 tcflush(fd, TCIFLUSH);
262 tcsetattr(fd,TCSANOW,&newtio);
263
264 setvbuf(stdout, (char *)NULL, _IONBF, 0);
265
266 while (STOP==FALSE) { // Endlosschleife
267
268 res = read(fd,buf,1);
269
270 //sobald ein AA kommt beginne die Beobachtung
271 if ((buf[0]==170) && (syncstate==5)){
272 syncstate=0;
273 }
274 if ((buf[0]==170) && (syncstate==0)){
275 syncstate=1;
276 merker[0]=buf[0];
277 }
278 if ((buf[0]==85) && (syncstate==1)){
279 syncstate=2;
280 merker[1]=buf[0];
281 }
282 if ((buf[0]==85) && (syncstate==2)){
283 syncstate=3;
284 merker[2]=buf[0];
285 }
286 if ((buf[0]==170) && (syncstate==3)){
287 syncstate=4;
288 merker[3]=buf[0];
289 state=0;
290 }
291 if (((buf[0]==1)||(buf[0]==2)||(buf[0]==3)) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==4)){
292 merker[4]=buf[0];
293 syncstate=5;
294 }
295
296
297 if ((buf[0]==0) && (merker[4]==1) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
298 state=10; // state 10 bereit fuer 0100
299 printflag=FALSE;
300 for(i=0;i<5;i++)merker[i]=0;
301
302 }
303 if ((buf[0]==0) && (merker[4]==2) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
304 state=20; // state 10 bereit fuer 0100
305 printflag=FALSE;
306 for(i=0;i<5;i++)merker[i]=0;
307
308 }
309 if ((buf[0]==0) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
310 state=30; // state 10 bereit fuer 0100
311 printflag=FALSE;
312 for(i=0;i<5;i++)merker[i]=0;
313 dsIndex=0;
314
315 }
316 if ((buf[0]==1) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
317 state=31; // state 10 bereit fuer 0100
318 printflag=FALSE;
319 for(i=0;i<5;i++)merker[i]=0;
320 dfIndex=0;
321
322 }
323
324
325
326 if ((state==10) && printflag) {
327
328 }
329 else if ((state==20) && printflag) {
330
331 }
332 else if ((state==30) && printflag){
333
334 if(dsIndex<100)datensatz[dsIndex++]=buf[0];
335 }
336 else if ((state==31) && printflag) {
337
338 if(dfIndex<100)datenfeld[dfIndex++]=buf[0];
339 }
340 else{
341 //printf("syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
342 }
343
344 printflag=TRUE;
345
346 if (zeitzaehler==10000){
347 conn_opts.keepAliveInterval = 20;
348 conn_opts.cleansession = 1;
349 // Baue MQTT Verbindung auf
350 if ((mqttrc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS){
351 printf("Failed to connect, return code %d\n", mqttrc);
352 exit(EXIT_FAILURE);
353 }
354 //Datum
355 formatieren(DATUM,datensatz[2],datensatz[3]);
356 printf("Datum: %s\n",datum);
357 strcpy(topic,basetopic);
358 strcat(topic,"Datum");
359 pubmsg.payload = datum;
360 pubmsg.payloadlen = (int)strlen(datum);
361 pubmsg.qos = QOS;
362 pubmsg.retained = 0;
363 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
364 printf("Failed to publish message, return code %d\n", mqttrc);
365 exit(EXIT_FAILURE);
366 }else{
367 printf("Message published, return code %d\n", mqttrc);
368 }
369 //Uhrzeit
370 formatieren(UHRZEIT,datensatz[4],datensatz[5]);
371 printf("Uhrzeit: %s\n",uhrzeit);
372 strcpy(topic,basetopic);
373 strcat(topic,"Uhrzeit");
374 pubmsg.payload = uhrzeit;
375 pubmsg.payloadlen = (int)strlen(uhrzeit);
376 pubmsg.qos = QOS;
377 pubmsg.retained = 0;
378 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
379 printf("Failed to publish message, return code %d\n", mqttrc);
380 exit(EXIT_FAILURE);
381 }else{
382 printf("Message published, return code %d\n", mqttrc);
383 }
384 //Kollektor
385 formatieren(TEMPERATUR,datensatz[6],datensatz[7]);
386 printf("Kollektor: %s\n",temperatur);
387 strcpy(topic,basetopic);
388 strcat(topic,"Kollektor/Temperatur");
389 pubmsg.payload = temperatur;
390 pubmsg.payloadlen = (int)strlen(temperatur);
391 pubmsg.qos = QOS;
392 pubmsg.retained = 0;
393 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
394 printf("Failed to publish message, return code %d\n", mqttrc);
395 exit(EXIT_FAILURE);
396 }else{
397 printf("Message published, return code %d\n", mqttrc);
398 }
399 //Speicher unten
400 formatieren(TEMPERATUR,datensatz[8],datensatz[9]);
401 printf("Speicher unten: %s\n",temperatur);
402 strcpy(topic,basetopic);
403 strcat(topic,"Speicher/unten/Temperatur");
404 pubmsg.payload = temperatur;
405 pubmsg.payloadlen = (int)strlen(temperatur);
406 pubmsg.qos = QOS;
407 pubmsg.retained = 0;
408 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
409 printf("Failed to publish message, return code %d\n", mqttrc);
410 exit(EXIT_FAILURE);
411 }else{
412 printf("Message published, return code %d\n", mqttrc);
413 }
414 //Speicher oben
415 formatieren(TEMPERATUR,datensatz[10],datensatz[11]);
416 printf("Speicher oben: %s\n",temperatur);
417 strcpy(topic,basetopic);
418 strcat(topic,"Speicher/oben/Temperatur");
419 pubmsg.payload = temperatur;
420 pubmsg.payloadlen = (int)strlen(temperatur);
421 pubmsg.qos = QOS;
422 pubmsg.retained = 0;
423 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
424 printf("Failed to publish message, return code %d\n", mqttrc);
425 exit(EXIT_FAILURE);
426 }else{
427 printf("Message published, return code %d\n", mqttrc);
428 }
429 //Rücklaufanhebung T7
430 formatieren(TEMPERATUR,datensatz[18],datensatz[19]);
431 printf("Rücklaufanhebung T7: %s\n",temperatur);
432 strcpy(topic,basetopic);
433 strcat(topic,"Rücklaufanhebung/T7/Temperatur");
434 pubmsg.payload = temperatur;
435 pubmsg.payloadlen = (int)strlen(temperatur);
436 pubmsg.qos = QOS;
437 pubmsg.retained = 0;
438 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
439 printf("Failed to publish message, return code %d\n", mqttrc);
440 exit(EXIT_FAILURE);
441 }else{
442 printf("Message published, return code %d\n", mqttrc);
443 }
444 //Rücklaufanhebung T8
445 formatieren(TEMPERATUR,datensatz[20],datensatz[21]);
446 printf("Rücklaufanhebung T8: %s\n",temperatur);
447 strcpy(topic,basetopic);
448 strcat(topic,"Rücklaufanhebung/T8/Temperatur");
449 pubmsg.payload = temperatur;
450 pubmsg.payloadlen = (int)strlen(temperatur);
451 pubmsg.qos = QOS;
452 pubmsg.retained = 0;
453 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
454 printf("Failed to publish message, return code %d\n", mqttrc);
455 exit(EXIT_FAILURE);
456 }else{
457 printf("Message published, return code %d\n", mqttrc);
458 }
459 //Ausgang 1
460 formatieren(PROZENT,datensatz[32],0);
461 printf("Ausgang 1: %s\n",prozent);
462 strcpy(topic,basetopic);
463 strcat(topic,"Ausgang/1/Prozent");
464 pubmsg.payload = prozent;
465 pubmsg.payloadlen = (int)strlen(prozent);
466 pubmsg.qos = QOS;
467 pubmsg.retained = 0;
468 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
469 printf("Failed to publish message, return code %d\n", mqttrc);
470 exit(EXIT_FAILURE);
471 }else{
472 printf("Message published, return code %d\n", mqttrc);
473 }
474 //Ausgang 6
475 formatieren(PROZENT,datensatz[37],0);
476 printf("Ausgang 6: %s\n",prozent);
477 strcpy(topic,basetopic);
478 strcat(topic,"Ausgang/6/Prozent");
479 pubmsg.payload = prozent;
480 pubmsg.payloadlen = (int)strlen(prozent);
481 pubmsg.qos = QOS;
482 pubmsg.retained = 0;
483 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
484 printf("Failed to publish message, return code %d\n", mqttrc);
485 exit(EXIT_FAILURE);
486 }else{
487 printf("Message published, return code %d\n", mqttrc);
488 }
489 // Speicherstunden
490 formatieren(SPEICHER2,datensatz[50],datensatz[51]);
491 printf("Speicher 2: %s\n",stunden);
492 strcpy(topic,basetopic);
493 strcat(topic,"Speicher/Stunden");
494 pubmsg.payload = stunden;
495 pubmsg.payloadlen = (int)strlen(stunden);
496 pubmsg.qos = QOS;
497 pubmsg.retained = 0;
498 if ((mqttrc = MQTTClient_publishMessage(client, topic, &pubmsg, &token)) != MQTTCLIENT_SUCCESS){
499 printf("Failed to publish message, return code %d\n", mqttrc);
500 exit(EXIT_FAILURE);
501 }else{
502 printf("Message published, return code %d\n", mqttrc);
503 }
504 /* printf("Waiting for up to %d seconds for publication of %s\n"
505 "on topic %s for client with ClientID: %s\n",
506 (int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
507 rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
508 printf("Message with delivery token %d delivered\n", token);
509 */
510 if ((mqttrc = MQTTClient_disconnect(client, 10000)) != MQTTCLIENT_SUCCESS){
511 printf("Failed to disconnect, return code %d\n", mqttrc);
512 }
513 zeitzaehler=0;
514 }
515 zeitzaehler++;
516 if (zeitzaehler%100000==0)printf("%d\n",zeitzaehler); // Lebenszeichen
517
518 }
519
520 close(fd);
521
522 tcsetattr(fd,TCSANOW,&oldtio);
523
524 MQTTClient_destroy(&client);
525
526 return EXIT_SUCCESS;
527 }
Sungoauswertungcurses
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <termios.h> // termios is the API that is in general recommended for serial I/O in Unix.
9 #include <curses.h>
10
11 #define BAUDRATE B115200
12 #define MODEMDEVICE "/dev/ttyS1"
13 #define _POSIX_SOURCE 1 /* POSIX compliant source */
14 #define FALSE 0
15 #define TRUE 1
16
17 volatile int STOP=FALSE;
18
19 char datum[11];
20 char uhrzeit[7];
21 char temperatur[25];
22 char prozent[7];
23 char fehler[17];
24 char stunden[8];
25 char dummy[7];
26
27
28 unsigned int hextodec(char hex[10]){
29 unsigned int decimal=0;
30 unsigned int length=0;
31 unsigned int base = 1;
32 int i=0;
33
34 while(hex[i]!='\0'){
35 i++;
36 }
37 length=i;
38
39 //printf("hextodec %s\n\r",hex);
40 //printf("length %d\n\r",length);
41
42 for(i = length-1; i >= 0; i--){
43 //printf("i: %d\n\r",i);
44 if (i<0)i=0;
45 if(hex[i] >= '0' && hex[i] <= '9'){
46 decimal += ((unsigned char)hex[i] - 48) * base;
47 base *= 16;
48 }
49 else if(hex[i] >= 'A' && hex[i] <= 'F'){
50 decimal += ((unsigned char)hex[i] - 55) * base;
51 base *= 16;
52 }
53 else if(hex[i] >= 'a' && hex[i] <= 'f'){
54 decimal += ((unsigned char)hex[i] - 87) * base;
55 base *= 16;
56 }
57 }
58 //printf("decimal %d\n\r",decimal);
59 return decimal;
60 }
61
62
63 void datumformatieren(unsigned char lowbyte,unsigned char highbyte){
64 char data[10]="";
65 char tmp[3]="";
66 char datumStr_formatted[]="00.00.2021";
67 char datumStr[5]="";
68 unsigned int datumInt;
69 size_t l;
70
71 sprintf(tmp,"%X",highbyte);
72 strcpy(data,tmp);
73 //l=strlen(data);
74 //printf("data: %s (%d)\n\r",data,l);
75
76 sprintf(tmp,"%X",lowbyte);
77 strcat(data,tmp);
78 //l=strlen(data);
79 //printf("data: %s (%d)\n\r",data,l);
80
81 //strcpy(data,"0135");
82 //printf("data: %s\n\r",data);
83 datumInt=hextodec(data);
84 //printf("int: %d\n\r",datumInt);
85 sprintf(datumStr,"%d",datumInt);
86 if(strlen(datumStr)==3){
87 datumStr_formatted[0]=datumStr[1];
88 datumStr_formatted[1]=datumStr[2];
89 datumStr_formatted[4]=datumStr[0];
90 strcpy(datum,datumStr_formatted);
91 }
92 else if(strlen(datumStr)==4){
93 datumStr_formatted[0]=datumStr[2];
94 datumStr_formatted[1]=datumStr[3];
95 datumStr_formatted[3]=datumStr[0];
96 datumStr_formatted[4]=datumStr[1];
97 strcpy(datum,datumStr_formatted);
98 }
99 else{
100 strcpy(datum,"Error!");
101 }
102 return;
103 }
104
105
106 void uhrzeitformatieren(unsigned char lowbyte,unsigned char highbyte){
107 char data[10]="";
108 char tmp[3]="";
109 char uhrzeitStr_formatted[]="00:00";
110 unsigned int uhrzeitInt, stunden, minuten;
111 size_t l;
112
113 sprintf(tmp,"%02X",highbyte);
114 strcpy(data,tmp);
115 //l=strlen(data);
116 //printf("data: %s (%d)\n\r",data,l);
117
118 sprintf(tmp,"%02X",lowbyte);
119 strcat(data,tmp);
120 //l=strlen(data);
121 //printf("data: %s (%d)\n\r",data,l);
122
123 //strcpy(data,"1500");
124 //printf("data: %s\n\r",data);
125 uhrzeitInt=hextodec(data);
126 //printf("int: %d\n\r",uhrzeitInt);
127 stunden=(unsigned int)uhrzeitInt/60;
128 minuten=uhrzeitInt-(stunden*60);
129 if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen
130 sprintf(uhrzeitStr_formatted,"%02d:%02d",stunden,minuten);
131 strcpy(uhrzeit,uhrzeitStr_formatted);
132 }
133 else{
134 strcpy(uhrzeit,"Error!");
135 }
136 return;
137 }
138
139 void temperaturformatieren(unsigned char lowbyte,unsigned char highbyte){
140 char data[10]="";
141 char tmp[3]="";
142 char temperaturStr_formatted[20]="";
143 unsigned int temperaturInt;
144 float temperaturFloat;
145 size_t l;
146
147 memset(data,'\0',sizeof(data));
148 memset(tmp,'\0',sizeof(tmp));
149
150
151 sprintf(tmp,"%02X",highbyte);
152 strcpy(data,tmp);
153 //l=strlen(data);
154 //printf("data: %s (%d)\n\r",data,l);
155
156 sprintf(tmp,"%02X",lowbyte);
157 strcat(data,tmp);
158 //l=strlen(data);
159 //printf("data: %s (%d)\n\r",data,l);
160
161
162 //strcpy(data,"0500");
163 //printf("data: %s\n\r",data);
164 temperaturInt=hextodec(data);
165 //printf("int: %d\n\r",temperaturInt);
166 temperaturFloat=(float)temperaturInt/10.0;
167
168 if(TRUE){
169 memset(temperaturStr_formatted,'\0',sizeof(temperaturStr_formatted));
170 sprintf(temperaturStr_formatted,"%5.1f °C (%d) ",temperaturFloat,temperaturInt);
171 strcpy(temperatur,temperaturStr_formatted);
172 }
173 else{
174 strcpy(temperatur,"Error!\0");
175 }
176 return;
177 }
178
179
180 void prozentformatieren(unsigned char byte){
181 char data[10]="";
182 char tmp[3]="";
183 char prozentStr_formatted[]="000%";
184 unsigned int prozentInt;
185 size_t l;
186
187 sprintf(tmp,"%X",byte);
188 strcpy(data,tmp);
189 //l=strlen(data);
190 //printf("data: %s (%d)\n\r",data,l);
191
192
193 //strcpy(data,"1500");
194 //printf("data: %s\n\r",data);
195 prozentInt=hextodec(data);
196 //printf("int: %d\n\r",prozentInt);
197
198 if(TRUE){
199 sprintf(prozentStr_formatted,"%3d%%",prozentInt);
200 strcpy(prozent,prozentStr_formatted);
201 }
202 else{
203 strcpy(prozent,"Error!");
204 }
205 return;
206 }
207
208
209 void stundenformatieren(unsigned char lowbyte,unsigned char highbyte){
210 char data[10]="";
211 char tmp[3]="";
212 char stundenStr_formatted[]="000000h";
213 unsigned int stundenInt;
214
215 sprintf(tmp,"%X",highbyte);
216 strcpy(data,tmp);
217 //l=strlen(data);
218 //printf("data: %s (%d)\n\r",data,l);
219
220 sprintf(tmp,"%X",lowbyte);
221 strcat(data,tmp);
222 //l=strlen(data);
223 //printf("data: %s (%d)\n\r",data,l);
224
225 //strcpy(data,"1500");
226 //printf("data: %s\n\r",data);
227 stundenInt=hextodec(data);
228 //printf("int: %d\n\r",temperaturInt);
229
230 if(TRUE){
231 sprintf(stundenStr_formatted,"%dh",stundenInt);
232 strcpy(stunden,stundenStr_formatted);
233 }
234 else{
235 strcpy(stunden,"Error!");
236 }
237 return;
238 }
239
240 void fehlerformatieren(unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4,unsigned char byte5,unsigned char byte6,unsigned char byte7,unsigned char byte8){
241 char data[10]="";
242 char tmp[3]="";
243 char fehlerStr_formatted[9];
244 unsigned int fehlerInt;
245
246 fehlerInt=12345;
247
248 if(TRUE){
249 sprintf(fehlerStr_formatted,"%d",fehlerInt);
250 strcpy(fehler,fehlerStr_formatted);
251 }
252 else{
253 strcpy(fehler,"Error!");
254 }
255 return;
256 }
257
258
259 void dummyformatieren(unsigned char lowbyte,unsigned char highbyte){
260 char data[10]="";
261 char tmp[3]="";
262
263 sprintf(tmp,"%X",highbyte);
264 strcpy(data,tmp);
265 //l=strlen(data);
266 //printf("data: %s (%d)\n\r",data,l);
267
268 sprintf(tmp,"%X",lowbyte);
269 strcat(data,tmp);
270 //l=strlen(data);
271 //printf("data: %s (%d)\n\r",data,l);
272
273 if(TRUE){
274 strcpy(dummy,data);
275 }
276 else{
277 strcpy(dummy,"Error!");
278 }
279 return;
280 }
281
282 int main(int argc, char **argv)
283 {
284
285 struct termios oldtio,newtio;
286
287 int fd;
288 int c;
289 int res;
290 int i,k,l;
291 unsigned int x,y,z,t1,t2,t3,dsIndex, dfIndex, dfX, dfY, sort1,sort2, stelle, zeilenproblock;
292 unsigned int state=0, syncstate=0;
293
294 unsigned char buf[1];
295 unsigned char merker[6];
296 unsigned char datensatz[200];
297 unsigned char datenfeld[100];
298 unsigned char datenfelder[50][16];
299 char data[10]="";
300 char tmp[3]="";
301 bool printflag;
302
303 memset(temperatur, '\0', sizeof(temperatur));
304
305
306 // wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nim diese sonst veruche default
307 if (argc > 1)
308 fd = open(argv[1], O_RDWR | O_NOCTTY );
309 else
310 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
311 if (fd <0) {
312 perror(MODEMDEVICE);
313 exit(-1);
314 }
315
316 // sichere die aktuellen Einstellungen
317 tcgetattr(fd,&oldtio);
318
319 // baue die neuen Einstellungen zusammen
320 bzero(&newtio, sizeof(newtio));
321 newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
322 newtio.c_iflag = IGNPAR | IXON | IXOFF;
323 newtio.c_oflag = 0;
324 newtio.c_lflag = 0;
325 newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
326 newtio.c_cc[VMIN] = 5; /* blocking read until 5 chars received */
327
328 tcflush(fd, TCIFLUSH);
329 tcsetattr(fd,TCSANOW,&newtio);
330
331 setvbuf(stdout, (char *)NULL, _IONBF, 0);
332
333 initscr();
334 getmaxyx(stdscr,x,y);
335 printf("X:%d/Y:%d\n",x,y);
336 while (STOP==FALSE) { /* loop for input */
337 res = read(fd,buf,1); /* returns after 5 chars have been input */
338 //printf("A: syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
339
340 //sobald ein AA kommt beginne die Beobachtung
341 if ((buf[0]==170) && (syncstate==5)){
342 syncstate=0;
343 }
344 if ((buf[0]==170) && (syncstate==0)){
345 syncstate=1;
346 merker[0]=buf[0];
347 }
348 if ((buf[0]==85) && (syncstate==1)){
349 syncstate=2;
350 merker[1]=buf[0];
351 }
352 if ((buf[0]==85) && (syncstate==2)){
353 syncstate=3;
354 merker[2]=buf[0];
355 }
356 if ((buf[0]==170) && (syncstate==3)){
357 syncstate=4;
358 merker[3]=buf[0];
359 state=0;
360 }
361 if (((buf[0]==1)||(buf[0]==2)||(buf[0]==3)) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==4)){
362 merker[4]=buf[0];
363 syncstate=5;
364 }
365
366
367 if ((buf[0]==0) && (merker[4]==1) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
368 state=10; // state 10 bereit fuer 0100
369 printflag=FALSE;
370 for(i=0;i<5;i++)merker[i]=0;
371 x=1;
372 y=8;
373 stelle=0;
374 }
375 if ((buf[0]==0) && (merker[4]==2) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
376 state=20; // state 10 bereit fuer 0100
377 printflag=FALSE;
378 for(i=0;i<5;i++)merker[i]=0;
379 x=2;
380 y=8;
381 stelle=0;
382 }
383 if ((buf[0]==0) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
384 state=30; // state 10 bereit fuer 0100
385 printflag=FALSE;
386 for(i=0;i<5;i++)merker[i]=0;
387 dsIndex=0;
388 x=3;
389 y=8;
390 stelle=0;
391 }
392 if ((buf[0]==1) && (merker[4]==3) && (merker[0]==170) && (merker[1]==85) && (merker[2]==85) && (merker[3]==170) && (syncstate==5)){
393 state=31; // state 10 bereit fuer 0100
394 printflag=FALSE;
395 for(i=0;i<5;i++)merker[i]=0;
396 dfIndex=0;
397 x=4;
398 y=8;
399 stelle=0;
400 }
401
402 zeilenproblock=3;
403
404 if ((state==10) && printflag) {
405 z=(x-1)*zeilenproblock+x;
406 mvprintw(z,1,"0100:");
407 mvaddch(z,y,buf[0]);
408 mvprintw(z+1,y,"%02X ",buf[0]);
409 mvprintw(z+2,y,"%d ",stelle);
410 y+=3;
411 stelle++;
412 }
413 else if ((state==20) && printflag) {
414 z=(x-1)*zeilenproblock+x;
415 mvprintw(z,1,"0200:");
416 mvaddch(z,y,buf[0]);
417 mvprintw(z+1,y,"%02X ",buf[0]);
418 mvprintw(z+2,y,"%d ",stelle);
419 y+=3;
420 stelle++;
421 }
422 else if ((state==30) && printflag){
423 z=(x-1)*zeilenproblock+x;
424 mvprintw(z,1,"0300:");
425 mvaddch(z,y,buf[0]);
426 mvprintw(z+1,y,"%02X ",buf[0]);
427 mvprintw(z+2,y,"%d ",stelle);
428 y+=3;
429 stelle++;
430 if(dsIndex<100)datensatz[dsIndex++]=buf[0];
431 }
432 else if ((state==31) && printflag) {
433 z=(x-1)*zeilenproblock+x;
434 mvprintw(z,1,"0301:");
435 mvaddch(z,y,buf[0]);
436 mvprintw(z+1,y,"%02X ",buf[0]);
437 mvprintw(z+2,y,"%d ",stelle);
438 y+=3;
439 stelle++;
440 if(dfIndex<100)datenfeld[dfIndex++]=buf[0];
441 }
442 else{
443 //printf("syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
444 }
445 //mvprintw(5,1,"Test");
446 printflag=TRUE;
447 refresh();
448 //printf("E: syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
449 //if (buf[0]=='z') STOP=TRUE;
450 //x max = 4
451 z=20;
452 t1=35;
453 t2=t1+30;
454 sort1=0;
455 mvprintw(z+sort1,1,"Datum: (2,3)");
456 datumformatieren(datensatz[2],datensatz[3]);
457 //printf("datum: %s",datum);
458 mvprintw(z+sort1,t1,datum);
459 mvprintw(z+sort1,t2,"%02X %02X",datensatz[2],datensatz[3]);
460 sort1++;
461 mvprintw(z+sort1,1,"Uhrzeit: (4,5)");
462 uhrzeitformatieren(datensatz[4],datensatz[5]);
463 //printf("uhrzeit: %s",uhrzeit);
464 mvprintw(z+sort1,t1,uhrzeit);
465 mvprintw(z+sort1,t2,"%02X %02X",datensatz[4],datensatz[5]);
466 sort1++;
467 mvprintw(z+sort1,1,"Kollektor: (6,7)");
468 temperaturformatieren(datensatz[6],datensatz[7]);
469 //printf("temperatur: %s",temperatur);
470 mvprintw(z+sort1,t1,"%s",temperatur);
471 mvprintw(z+sort1,t2,"%02X %02X",datensatz[6],datensatz[7]);
472 sort1++;
473 mvprintw(z+sort1,1,"Speicher unten: (8,9)");
474 temperaturformatieren(datensatz[8],datensatz[9]);
475 //printf("temperatur: %s",temperatur);
476 mvprintw(z+sort1,t1,"%s",temperatur);
477 mvprintw(z+sort1,t2,"%02X %02X",datensatz[8],datensatz[9]);
478 sort1++;
479 mvprintw(z+sort1,1,"Speicher oben: (10,11)");
480 temperaturformatieren(datensatz[10],datensatz[11]);
481 //printf("temperatur: %s",temperatur);
482 mvprintw(z+sort1,t1,"%s",temperatur);
483 mvprintw(z+sort1,t2,"%02X %02X",datensatz[10],datensatz[11]);
484 sort1++;
485 mvprintw(z+sort1,1,"Thermostat: (12,13)");
486 temperaturformatieren(datensatz[12],datensatz[13]);
487 //printf("temperatur: %s",temperatur);
488 mvprintw(z+sort1,t1,"%s",temperatur);
489 mvprintw(z+sort1,t2,"%02X %02X",datensatz[12],datensatz[13]);
490 sort1++;
491 mvprintw(z+sort1,1,"Poolschutz: (14,15)");
492 temperaturformatieren(datensatz[14],datensatz[15]);
493 //printf("temperatur: %s",temperatur);
494 mvprintw(z+sort1,t1,"%s",temperatur);
495 mvprintw(z+sort1,t2,"%02X %02X",datensatz[14],datensatz[15]);
496 sort1++;
497 mvprintw(z+sort1,1,"Ertrag: (16,17)");
498 temperaturformatieren(datensatz[16],datensatz[17]);
499 //printf("temperatur: %s",temperatur);
500 mvprintw(z+sort1,t1,"%s",temperatur);
501 mvprintw(z+sort1,t2,"%02X %02X",datensatz[16],datensatz[17]);
502 sort1++;
503 mvprintw(z+sort1,1,"Ruecklaufanhebung T7: (18,19)");
504 temperaturformatieren(datensatz[18],datensatz[19]);
505 //printf("temperatur: %s",temperatur);
506 mvprintw(z+sort1,t1,"%s",temperatur);
507 mvprintw(z+sort1,t2,"%02X %02X",datensatz[18],datensatz[19]);
508 sort1++;
509 mvprintw(z+sort1,1,"Ruecklaufanhebung T8: (20,21)");
510 temperaturformatieren(datensatz[20],datensatz[21]);
511 //printf("temperatur: %s",temperatur);
512 mvprintw(z+sort1,t1,"%s",temperatur);
513 mvprintw(z+sort1,t2,"%02X %02X",datensatz[20],datensatz[21]);
514 sort1++;
515 mvprintw(z+sort1,1,"T: (22,23)");
516 temperaturformatieren(datensatz[22],datensatz[23]);
517 //printf("temperatur: %s",temperatur);
518 mvprintw(z+sort1,t1,"%s",temperatur);
519 mvprintw(z+sort1,t2,"%02X %02X",datensatz[22],datensatz[23]);
520 sort1++;
521 mvprintw(z+sort1,1,"Dummy: (24,25)");
522 dummyformatieren(datensatz[24],datensatz[25]);
523 //printf("dummy: %s",dummy);
524 mvprintw(z+sort1,t1,dummy);
525 mvprintw(z+sort1,t2,"%02X %02X",datensatz[24],datensatz[25]);
526 sort1++;
527 mvprintw(z+sort1,1,"Strahlung: (26,27)");
528 temperaturformatieren(datensatz[26],datensatz[27]);
529 //printf("temperatur: %s",temperatur);
530 mvprintw(z+sort1,t1,temperatur);
531 mvprintw(z+sort1,t2,"%02X %02X",datensatz[26],datensatz[27]);
532 sort1++;
533 mvprintw(z+sort1,1,"Dummy: (28,29)");
534 dummyformatieren(datensatz[28],datensatz[29]);
535 //printf("dummy: %s",dummy);
536 mvprintw(z+sort1,t1,dummy);
537 mvprintw(z+sort1,t2,"%02X %02X",datensatz[28],datensatz[29]);
538 sort1++;
539 mvprintw(z+sort1,1,"Dummy: (30,31)");
540 temperaturformatieren(datensatz[30],datensatz[31]);
541 //printf("dummy: %s",dummy);
542 mvprintw(z+sort1,t1,dummy);
543 mvprintw(z+sort1,t2,"%02X %02X",datensatz[30],datensatz[31]);
544 sort1++;
545 mvprintw(z+sort1,1,"Ausgang 1: (32)");
546 prozentformatieren(datensatz[32]);
547 //printf("prozent: %s",prozent);
548 mvprintw(z+sort1,t1,prozent);
549 mvprintw(z+sort1,t2,"%02X",datensatz[32]);
550 sort1++;
551 mvprintw(z+sort1,1,"Ausgang 2: (33)");
552 prozentformatieren(datensatz[33]);
553 //printf("prozent: %s",prozent);
554 mvprintw(z+sort1,t1,prozent);
555 mvprintw(z+sort1,t2,"%02X",datensatz[33]);
556 sort1++;
557 mvprintw(z+sort1,1,"Ausgang 3: (34)");
558 prozentformatieren(datensatz[34]);
559 //printf("prozent: %s",prozent);
560 mvprintw(z+sort1,t1,prozent);
561 mvprintw(z+sort1,t2,"%02X",datensatz[34]);
562 sort1++;
563 mvprintw(z+sort1,1,"Ausgang 4: (35)");
564 prozentformatieren(datensatz[35]);
565 //printf("prozent: %s",prozent);
566 mvprintw(z+sort1,t1,prozent);
567 mvprintw(z+sort1,t2,"%02X",datensatz[35]);
568 sort1++;
569 mvprintw(z+sort1,1,"Ausgang 5: (36)");
570 prozentformatieren(datensatz[36]);
571 //printf("prozent: %s",prozent);
572 mvprintw(z+sort1,t1,prozent);
573 mvprintw(z+sort1,t2,"%02X",datensatz[36]);
574 sort1++;
575 mvprintw(z+sort1,1,"Ausgang 6: (37)");
576 prozentformatieren(datensatz[37]);
577 //printf("prozent: %s",prozent);
578 mvprintw(z+sort1,t1,prozent);
579 mvprintw(z+sort1,t2,"%02X",datensatz[37]);
580 sort1++;
581 mvprintw(z+sort1,1,"Fehler: (38-45)");
582 fehlerformatieren(datensatz[38],datensatz[39],datensatz[40],datensatz[41],datensatz[42],datensatz[43],datensatz[44],datensatz[45]);
583 //printf("fehler: %s",fehler);
584 mvprintw(z+sort1,t1,fehler);
585 mvprintw(z+sort1,t2,"%02X %02X %02X %02X %02X %02X %02X %02X",datensatz[38],datensatz[39],datensatz[40],datensatz[41],datensatz[42],datensatz[43],datensatz[44],datensatz[45]);
586 sort1++;
587 mvprintw(z+sort1,1,"Speicher 1: (46,47)");
588 temperaturformatieren(datensatz[46],datensatz[47]);
589 //printf("temperatur: %s",temperatur);
590 mvprintw(z+sort1,t1,temperatur);
591 mvprintw(z+sort1,t2,"%02X %02X",datensatz[46],datensatz[47]);
592 sort1++;
593 mvprintw(z+sort1,1,"Dummy: (48,49)");
594 dummyformatieren(datensatz[48],datensatz[49]);
595 //printf("dummy: %s",dummy);
596 mvprintw(z+sort1,t1,dummy);
597 mvprintw(z+sort1,t2,"%02X %02X",datensatz[48],datensatz[49]);
598 sort1++;
599 mvprintw(z+sort1,1,"Speicher 2: (50,51)");
600 stundenformatieren(datensatz[50],datensatz[51]);
601 //printf("stunden: %s",stunden);
602 mvprintw(z+sort1,t1,stunden);
603 mvprintw(z+sort1,t2,"%02X %02X",datensatz[50],datensatz[51]);
604 sort1++;
605 mvprintw(z+sort1,1,"Dummy: (52,53)");
606 dummyformatieren(datensatz[52],datensatz[53]);
607 //printf("dummy: %s",dummy);
608 mvprintw(z+sort1,t1,dummy);
609 mvprintw(z+sort1,t2,"%02X %02X",datensatz[52],datensatz[53]);
610 sort1++;
611 mvprintw(z+sort1,1,"Dummy: (54,55)");
612 dummyformatieren(datensatz[54],datensatz[55]);
613 //printf("dummy: %s",dummy);
614 mvprintw(z+sort1,t1,dummy);
615 mvprintw(z+sort1,t2,"%02X %02X",datensatz[54],datensatz[55]);
616 sort1++;
617 mvprintw(z+sort1,1,"Funktion 1 aktiv: (56,57)");
618 dummyformatieren(datensatz[56],datensatz[57]);
619 //printf("dummy: %s",dummy);
620 mvprintw(z+sort1,t1,dummy);
621 mvprintw(z+sort1,t2,"%02X %02X",datensatz[56],datensatz[57]);
622 sort1++;
623 mvprintw(z+sort1,1,"Funktion 2 aktiv: (58,59)");
624 dummyformatieren(datensatz[58],datensatz[59]);
625 //printf("dummy: %s",dummy);
626 mvprintw(z+sort1,t1,dummy);
627 mvprintw(z+sort1,t2,"%02X %02X",datensatz[58],datensatz[59]);
628 sort1++;
629 mvprintw(z+sort1,1,"Volumenstrom: (60,61)");
630 dummyformatieren(datensatz[60],datensatz[61]);
631 //printf("dummy: %s",dummy);
632 mvprintw(z+sort1,t1,dummy);
633 mvprintw(z+sort1,t2,"%02X %02X",datensatz[60],datensatz[61]);
634 sort1++;
635 mvprintw(z+sort1,1,"Dummy: (62,63)");
636 dummyformatieren(datensatz[62],datensatz[63]);
637 //printf("dummy: %s",dummy);
638 mvprintw(z+sort1,t1,dummy);
639 mvprintw(z+sort1,t2,"%02X %02X",datensatz[62],datensatz[63]);
640 sort1++;
641 mvprintw(z+sort1,1,"Dummy: (64,65)");
642 dummyformatieren(datensatz[64],datensatz[65]);
643 //printf("dummy: %s",dummy);
644 mvprintw(z+sort1,t1,dummy);
645 mvprintw(z+sort1,t2,"%02X %02X",datensatz[64],datensatz[65]);
646
647 t3=t2+20;
648 sort2=0;
649
650 i=0;
651 mvprintw(z+sort2,t3,"%02X ",datenfeld[i++]);
652 mvprintw(z+sort2,t3+3,"%02X ",datenfeld[i++]);
653 mvprintw(z+sort2,t3+6,"%02X ",datenfeld[i++]);
654 for(k=0;k<32;k++){
655 sprintf(tmp,"%X",datenfeld[i+(k*16)]);
656 strcpy(data,tmp);
657 sort2=hextodec(data)*2;
658 if (sort2>62) sort2=64;
659 for(l=0;l<16;l++){
660 mvprintw(z+sort2,t3+(l*3),"%02X ",datenfeld[i+(k*16)+l]);
661 if (datenfeld[i+(k*16)+l]!=0){ mvprintw(z+sort2+1,t3+(l*3),"%c ",datenfeld[i+(k*16)+l]); }
662 else { mvprintw(z+sort2+1,t3+(l*3)," "); }
663 }
664 }
665
666 }
667 endwin();
668
669 close(fd);
670
671 tcsetattr(fd,TCSANOW,&oldtio);
672
673 return EXIT_SUCCESS;
674 }
Sungoserialcapture
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <termios.h> // termios is the API that is in general recommended for serial I/O in Unix.
9 #include <curses.h>
10
11 #define BAUDRATE B115200
12 #define MODEMDEVICE "/dev/ttyS1"
13 #define _POSIX_SOURCE 1 /* POSIX compliant source */
14 #define FALSE 0
15 #define TRUE 1
16
17 volatile int STOP=FALSE;
18
19 char datum[11];
20 char uhrzeit[7];
21 char temperatur[8];
22 char prozent[7];
23 char fehler[17];
24 char stunden[8];
25 char dummy[7];
26
27 unsigned int hextodec(char hex[10]){
28 unsigned int decimal=0;
29 unsigned int length=0;
30 unsigned int base = 1;
31 int i=0;
32
33 while(hex[i]!='\0'){
34 i++;
35 }
36 length=i;
37
38 //printf("hextodec %s\n\r",hex);
39 //printf("length %d\n\r",length);
40
41 for(i = length-1; i >= 0; i--){
42 //printf("i: %d\n\r",i);
43 if (i<0)i=0;
44 if(hex[i] >= '0' && hex[i] <= '9'){
45 decimal += ((unsigned char)hex[i] - 48) * base;
46 base *= 16;
47 }
48 else if(hex[i] >= 'A' && hex[i] <= 'F'){
49 decimal += ((unsigned char)hex[i] - 55) * base;
50 base *= 16;
51 }
52 else if(hex[i] >= 'a' && hex[i] <= 'f'){
53 decimal += ((unsigned char)hex[i] - 87) * base;
54 base *= 16;
55 }
56 }
57 //printf("decimal %d\n\r",decimal);
58 return decimal;
59 }
60
61
62 void datumformatieren(unsigned char lowbyte,unsigned char highbyte){
63 char data[10]="";
64 char tmp[3]="";
65 char datumStr_formatted[]="00.00.2021";
66 char datumStr[5]="";
67 unsigned int datumInt;
68 size_t l;
69
70 sprintf(tmp,"%X",highbyte);
71 strcpy(data,tmp);
72 //l=strlen(data);
73 //printf("data: %s (%d)\n\r",data,l);
74
75 sprintf(tmp,"%X",lowbyte);
76 strcat(data,tmp);
77 //l=strlen(data);
78 //printf("data: %s (%d)\n\r",data,l);
79
80 //strcpy(data,"0135");
81 //printf("data: %s\n\r",data);
82 datumInt=hextodec(data);
83 //printf("int: %d\n\r",datumInt);
84 sprintf(datumStr,"%d",datumInt);
85 if(strlen(datumStr)==3){
86 datumStr_formatted[0]=datumStr[1];
87 datumStr_formatted[1]=datumStr[2];
88 datumStr_formatted[4]=datumStr[0];
89 strcpy(datum,datumStr_formatted);
90 }
91 else if(strlen(datumStr)==4){
92 datumStr_formatted[0]=datumStr[2];
93 datumStr_formatted[1]=datumStr[3];
94 datumStr_formatted[3]=datumStr[0];
95 datumStr_formatted[4]=datumStr[1];
96 strcpy(datum,datumStr_formatted);
97 }
98 else{
99 strcpy(datum,"Error!");
100 }
101 return;
102 }
103
104
105 void uhrzeitformatieren(unsigned char lowbyte,unsigned char highbyte){
106 char data[10]="";
107 char tmp[3]="";
108 char uhrzeitStr_formatted[]="00:00";
109 unsigned int uhrzeitInt, stunden, minuten;
110 size_t l;
111
112 sprintf(tmp,"%X",highbyte);
113 strcpy(data,tmp);
114 //l=strlen(data);
115 //printf("data: %s (%d)\n\r",data,l);
116
117 sprintf(tmp,"%X",lowbyte);
118 strcat(data,tmp);
119 //l=strlen(data);
120 //printf("data: %s (%d)\n\r",data,l);
121
122 //strcpy(data,"1500");
123 //printf("data: %s\n\r",data);
124 uhrzeitInt=hextodec(data);
125 //printf("int: %d\n\r",uhrzeitInt);
126 stunden=(unsigned int)uhrzeitInt/60;
127 minuten=uhrzeitInt-(stunden*60);
128 if(TRUE){ // hier koennte man die gueltig der stunden und minuten noch testen
129 sprintf(uhrzeitStr_formatted,"%d:%d",stunden,minuten);
130 strcpy(uhrzeit,uhrzeitStr_formatted);
131 }
132 else{
133 strcpy(uhrzeit,"Error!");
134 }
135 return;
136 }
137
138 void temperaturformatieren(unsigned char lowbyte,unsigned char highbyte){
139 char data[10]="";
140 char tmp[3]="";
141 char temperaturStr_formatted[]="000.0°C";
142 unsigned int temperaturInt;
143 float temperaturFloat;
144 size_t l;
145
146 sprintf(tmp,"%X",highbyte);
147 strcpy(data,tmp);
148 //l=strlen(data);
149 //printf("data: %s (%d)\n\r",data,l);
150
151 sprintf(tmp,"%X",lowbyte);
152 strcat(data,tmp);
153 //l=strlen(data);
154 //printf("data: %s (%d)\n\r",data,l);
155
156 //strcpy(data,"1500");
157 //printf("data: %s\n\r",data);
158 temperaturInt=hextodec(data);
159 //printf("int: %d\n\r",temperaturInt);
160 temperaturFloat=(float)temperaturInt/10.0;
161
162 if(TRUE){
163 sprintf(temperaturStr_formatted,"%.1f°C",temperaturFloat);
164 strcpy(temperatur,temperaturStr_formatted);
165 }
166 else{
167 strcpy(temperatur,"Error!");
168 }
169 return;
170 }
171
172
173 void prozentformatieren(unsigned char byte){
174 char data[10]="";
175 char tmp[3]="";
176 char prozentStr_formatted[]="000%";
177 unsigned int prozentInt;
178 size_t l;
179
180 sprintf(tmp,"%X",byte);
181 strcpy(data,tmp);
182 //l=strlen(data);
183 //printf("data: %s (%d)\n\r",data,l);
184
185
186 //strcpy(data,"1500");
187 //printf("data: %s\n\r",data);
188 prozentInt=hextodec(data);
189 //printf("int: %d\n\r",prozentInt);
190
191 if(TRUE){
192 sprintf(prozentStr_formatted,"%d%%",prozentInt);
193 strcpy(prozent,prozentStr_formatted);
194 }
195 else{
196 strcpy(prozent,"Error!");
197 }
198 return;
199 }
200
201
202 void stundenformatieren(unsigned char lowbyte,unsigned char highbyte){
203 char data[10]="";
204 char tmp[3]="";
205 char stundenStr_formatted[]="000000h";
206 unsigned int stundenInt;
207
208 sprintf(tmp,"%X",highbyte);
209 strcpy(data,tmp);
210 //l=strlen(data);
211 //printf("data: %s (%d)\n\r",data,l);
212
213 sprintf(tmp,"%X",lowbyte);
214 strcat(data,tmp);
215 //l=strlen(data);
216 //printf("data: %s (%d)\n\r",data,l);
217
218 //strcpy(data,"1500");
219 //printf("data: %s\n\r",data);
220 stundenInt=hextodec(data);
221 //printf("int: %d\n\r",temperaturInt);
222
223 if(TRUE){
224 sprintf(stundenStr_formatted,"%dh",stundenInt);
225 strcpy(stunden,stundenStr_formatted);
226 }
227 else{
228 strcpy(stunden,"Error!");
229 }
230 return;
231 }
232
233 void fehlerformatieren(unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4,unsigned char byte5,unsigned char byte6,unsigned char byte7,unsigned char byte8){
234 char data[10]="";
235 char tmp[3]="";
236 char fehlerStr_formatted[9];
237 unsigned int fehlerInt;
238
239 fehlerInt=12345;
240
241 if(TRUE){
242 sprintf(fehlerStr_formatted,"%d",fehlerInt);
243 strcpy(fehler,fehlerStr_formatted);
244 }
245 else{
246 strcpy(fehler,"Error!");
247 }
248 return;
249 }
250
251
252 void dummyformatieren(unsigned char lowbyte,unsigned char highbyte){
253 char data[10]="";
254 char tmp[3]="";
255
256 sprintf(tmp,"%X",highbyte);
257 strcpy(data,tmp);
258 //l=strlen(data);
259 //printf("data: %s (%d)\n\r",data,l);
260
261 sprintf(tmp,"%X",lowbyte);
262 strcat(data,tmp);
263 //l=strlen(data);
264 //printf("data: %s (%d)\n\r",data,l);
265
266 if(TRUE){
267 strcpy(dummy,data);
268 }
269 else{
270 strcpy(dummy,"Error!");
271 }
272 return;
273 }
274
275 int main(int argc, char **argv)
276 {
277 FILE *fp;
278
279
280 struct termios oldtio,newtio;
281
282 int fd;
283 int c;
284 int res;
285 int i,k,l;
286 unsigned int x,y,z,t1,t2,dsIndex, dfIndex, dfX, dfY, sort1,sort2, stelle, zeilenproblock;
287 unsigned int state=0, syncstate=0;
288
289 unsigned char buf[1];
290 unsigned char merker[6];
291 unsigned char datensatz[100];
292 unsigned char datenfeld[100];
293 unsigned char datenfelder[50][16];
294 char data[10]="";
295 char tmp[3]="";
296 bool printflag;
297
298 // wenn in Kommandozeile die Schnittstelle mitgegeben wird, dann nim diese sonst veruche default
299 if (argc > 1)
300 fd = open(argv[1], O_RDWR | O_NOCTTY );
301 else
302 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
303 if (fd <0) {
304 perror(MODEMDEVICE);
305 exit(-1);
306 }
307
308 // sichere die aktuellen Einstellungen
309 tcgetattr(fd,&oldtio);
310
311 // baue die neuen Einstellungen zusammen
312 bzero(&newtio, sizeof(newtio));
313 newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
314 newtio.c_iflag = IGNPAR | IXON | IXOFF;
315 newtio.c_oflag = 0;
316 newtio.c_lflag = 0;
317 newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
318 newtio.c_cc[VMIN] = 5; /* blocking read until 5 chars received */
319
320 tcflush(fd, TCIFLUSH);
321 tcsetattr(fd,TCSANOW,&newtio);
322
323 setvbuf(stdout, (char *)NULL, _IONBF, 0);
324
325 fp=fopen("sungocapture.bin","w");
326
327 if (fp == NULL)
328 return 0;
329
330 while (STOP==FALSE) { /* loop for input */
331 res = read(fd,buf,1); /* returns after 5 chars have been input */
332 //printf("A: syncstate: %d, state: %d, %X\n\r",syncstate,state,buf[0]);
333
334 fputc(res,fp);
335
336 }
337
338 fclose(fp);
339
340 close(fd);
341
342 tcsetattr(fd,TCSANOW,&oldtio);
343
344 return EXIT_SUCCESS;
345 }