source: fact/tools/ListenToPt100Logger/ListenToPt100Logger.c@ 16858

Last change on this file since 16858 was 117, checked in by daqct3, 15 years ago
initial commit
File size: 7.6 KB
Line 
1 #include <sys/types.h>
2 #include <sys/stat.h>
3 #include <sys/time.h>
4 #include <fcntl.h>
5 #include <termios.h>
6 #include <stdio.h>
7 #include <time.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <unistd.h>
11 #include <sys/select.h>
12
13 #define bzero(b,len) (memset((b), '\0' ,(len)), (void) 0)
14
15 /* baudrate settings are defined in <asm/termbits.h>, which is
16 included by <termios.h> */
17// #define BAUDRATE B9600 // Baudrate of ATmega on Arduino board
18 #define BAUDRATE B38400 //Baudrate of ATmega on Pt100-Logger
19
20 /* change this definition for the correct port */
21// #define MODEMDEVICE "/dev/myArduino" //Addess of Arduino device
22 #define MODEMDEVICE "/dev/FTE33RWR" //Address of Pt100 Logger
23
24 #define _POSIX_SOURCE 1 /* POSIX compliant source */
25
26 #define FALSE 0
27 #define TRUE 1
28
29 #define myPath "/ct3data/SlowData/" // will be used later on
30 //#define myPath "" // for testing purposes
31
32
33 FILE * openOutfile(char *path);
34 static int poll_stdin_time(int microsekunden) ;
35
36 volatile int STOP=FALSE;
37
38 int main(int argc, char *argv[])
39 {
40 int fd, res;
41 struct termios oldtio,newtio;
42 char buf[255];
43 char dummy[255];
44
45 /*
46 Open modem device for reading and writing and not as controlling tty
47 because we don't want to get killed if linenoise sends CTRL-C.
48 */
49 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
50 if (fd <0) {perror(MODEMDEVICE); exit(-1); }
51
52 tcgetattr(fd,&oldtio); /* save current serial port settings */
53 bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
54
55 /*
56 BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
57 CRTSCTS : output hardware flow control (only used if the cable has
58 all necessary lines. See sect. 7 of Serial-HOWTO)
59 CS8 : 8n1 (8bit,no parity,1 stopbit)
60 CLOCAL : local connection, no modem contol
61 CREAD : enable receiving characters
62 */
63 newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
64
65 // CRTSCTS | maybe not needed //DN 090907
66
67 /*
68 IGNPAR : ignore bytes with parity errors
69 ICRNL : map CR to NL (otherwise a CR input on the other computer
70 will not terminate input)
71 otherwise make device raw (no other input processing)
72 */
73 newtio.c_iflag = IGNPAR ;
74
75 // | ICRNL // i guess this is not needed here. DN 090907
76
77 /*
78 Raw output.
79 */
80 newtio.c_oflag = 0;
81
82 /*
83 ICANON : enable canonical input
84 disable all echo functionality, and don't send signals to calling program
85 */
86 newtio.c_lflag = ICANON;
87
88 /*
89 initialize all control characters
90 default values can be found in /usr/include/termios.h, and are given
91 in the comments, but we don't need them here
92 */
93 newtio.c_cc[VINTR] = 0; /* Ctrl-c */
94 newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */
95 newtio.c_cc[VERASE] = 0; /* del */
96 newtio.c_cc[VKILL] = 0; /* @ */
97 newtio.c_cc[VEOF] = 4; /* Ctrl-d */
98 newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
99 newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
100 newtio.c_cc[VSWTC] = 0; /* '\0' */
101 newtio.c_cc[VSTART] = 0; /* Ctrl-q */
102 newtio.c_cc[VSTOP] = 0; /* Ctrl-s */
103 newtio.c_cc[VSUSP] = 0; /* Ctrl-z */
104 newtio.c_cc[VEOL] = 0; /* '\0' */
105 newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */
106 newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */
107 newtio.c_cc[VWERASE] = 0; /* Ctrl-w */
108 newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */
109 newtio.c_cc[VEOL2] = 0; /* '\0' */
110
111 /*
112 now clean the modem line and activate the settings for the port
113 */
114 tcflush(fd, TCIFLUSH);
115 tcsetattr(fd,TCSANOW,&newtio);
116
117 /*
118 terminal settings done, now handle input
119 In this example, inputting a 'z' at the beginning of a line will
120 exit the program.
121 */
122
123 FILE *outfile;
124 outfile = openOutfile(myPath);
125
126 if (outfile == NULL) {return -1;}
127
128 char outstring[400];
129 //char c;
130
131 while (STOP==FALSE) { /* loop until we have a terminating condition */
132 /* read blocks program execution until a line terminating character is
133 input, even if more than 255 chars are input. If the number
134 of characters read is smaller than the number of chars available,
135 subsequent reads will return the remaining chars. res will be set
136 to the actual number of characters actually read */
137 res = read(fd,buf,255);
138 buf[res]=0; /* set end of string, so we can printf */
139
140 if (strncmp (buf,"T:",2) != 0) continue;
141 if (strlen(buf)>2) strcpy(dummy, buf+2);
142 else continue;
143 strcpy(buf,dummy);
144// printf("%s\n",dummy);
145
146 time_t rawtime;
147 struct tm * timeinfo;
148
149 time ( &rawtime );
150 timeinfo = localtime ( &rawtime );
151
152 struct timeval timeofday;
153 gettimeofday(&timeofday, NULL);
154
155
156 sprintf(outstring, "PT100 Sensorvalues %04d %02d %02d %02d %02d %02d %03d %d %s",
157 (*timeinfo).tm_year+1900,
158 (*timeinfo).tm_mon+1,
159 (*timeinfo).tm_mday,
160 (*timeinfo).tm_hour,
161 (*timeinfo).tm_min,
162 (*timeinfo).tm_sec,
163 timeofday.tv_usec/1000,
164 (long)rawtime,
165 buf);
166
167 printf("%s", outstring);
168
169 fprintf(outfile, "%s", outstring);
170 fflush(outfile);
171
172 if (poll_stdin_time(1500000)==1) {
173 STOP=TRUE;
174 }
175
176
177 } //end while(STOP==FALSE)
178
179
180
181 /* restore the old port settings */
182 tcsetattr(fd,TCSANOW,&oldtio);
183 fclose(outfile);
184
185return 0;
186} //end main();
187
188// OPens or Creates an Outfile named
189// "PT100_YYYYMMDD.slow"
190// this file should contain all enviromentals from noon to noon.
191// The File is created if it doesn't exist.
192// all data is appended, nothing will be deleted or overwritten.
193
194FILE * openOutfile(char *path)
195{
196 FILE *outfile;
197
198 time_t rawtime;
199 struct tm * timeinfo;
200
201 time ( &rawtime );
202 timeinfo = gmtime ( &rawtime );
203
204 // check what day it is today :-)
205 if ((*timeinfo).tm_hour >13){ //then it is already tommorow
206 rawtime += 86400;
207 timeinfo = gmtime ( &rawtime );
208 }
209 //generate filename
210 char *outfilename;
211 outfilename =(char*) calloc( strlen(path)+25 , sizeof(char));
212 if (outfilename ==NULL)
213 {
214 perror("could not allocate space for outputfilename");
215 return NULL;
216 }
217 sprintf(outfilename,"%sPT100_%04d%02d%02d.slow",
218 path, // from user
219 (*timeinfo).tm_year+1900,
220 (*timeinfo).tm_mon+1,
221 (*timeinfo).tm_mday );
222
223 // there is no need to check if file is already existing.
224 // if not fopen(name,"a") will create it.
225 // if it exists
226 // it will only be opened for appnendign
227 outfile = fopen(outfilename,"a");
228
229 if (outfile==NULL){
230 perror("could not open outputfile");
231 return NULL;}
232
233 return outfile;
234}
235
236static int poll_stdin_time(int microsekunden) {
237 struct timeval timeout;
238 fd_set read_fds;
239 int c;
240 int stdin_status;
241
242 FD_ZERO(&read_fds);
243 FD_SET(STDIN_FILENO, &read_fds);
244 timeout.tv_sec = 0;
245 timeout.tv_usec =microsekunden;
246 stdin_status = select(STDIN_FILENO+1, &read_fds, NULL, NULL, &timeout);
247 if (stdin_status == 1 ) {
248 c=getchar();
249 fflush(stdin);
250 if (c=='q') {
251 return 1;
252 }
253 } else if (stdin_status ==0) {
254 return 0;
255 } else {
256 perror("select()");
257 }
258
259
260
261 return -1;
262
263
264}
Note: See TracBrowser for help on using the repository browser.