Mercurial > hg > fxanalyse
annotate file-data-provider.c @ 239:ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
author | Daniele Nicolodi <daniele.nicolodi@obspm.fr> |
---|---|
date | Thu, 12 Feb 2015 19:13:55 +0100 |
parents | 4102fe614df2 |
children |
rev | line source |
---|---|
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
1 /* FXAnalise data provider reading data from KK data file on disc */ |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
2 |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
3 #include <userint.h> |
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
4 #include <ansi_c.h> |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
5 #include <utility.h> |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
6 #include <formatio.h> |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
7 |
91
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
8 #include "data-provider.h" |
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
9 |
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
10 //#define LOGFILEPATH "C:\\Femto\\Software\\FXQE80" |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
11 #define LOGFILEPATH "C:\\temp" |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
12 |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
13 |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
14 int CVICALLBACK FileDataProvider (void *functionData) |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
15 { |
239
ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
91
diff
changeset
|
16 int main_thread_id; |
ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
91
diff
changeset
|
17 char datafile[MAX_PATHNAME_LEN]; |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
18 int fd; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
19 int read; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
20 int year, month, day, hour, min, sec, msec; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
21 struct tm t; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
22 char line[1024]; |
91
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
23 struct event event; |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
24 double now; |
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
25 |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
26 /* get main thread id to post messages to it */ |
239
ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
91
diff
changeset
|
27 main_thread_id = CmtGetMainThreadID(); |
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
28 |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
29 /* guess current data log file name */ |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
30 GetCurrentDateTime(&now); |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
31 GetDateTimeElements(now, NULL, NULL, NULL, &month, &day, &year); |
239
ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
91
diff
changeset
|
32 snprintf(datafile, sizeof(datafile) - 1, |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
33 "%s\\%02d%02d%02d_Frequ.txt", LOGFILEPATH, year % 100, month, day); |
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
34 |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
35 /* open file */ |
239
ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
91
diff
changeset
|
36 fd = OpenFile(datafile, VAL_READ_ONLY, VAL_OPEN_AS_IS, VAL_ASCII); |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
37 if (fd < 0) { |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
38 /* notify error to the main thread */ |
239
ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
91
diff
changeset
|
39 send_message(main_thread_id, "error opening data file '%s'", datafile); |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
40 } |
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
41 |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
42 /* seek to file end */ |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
43 SetFilePtr(fd, 0, 2); |
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
44 |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
45 while (acquiring) { |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
46 |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
47 /* read one line from data file */ |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
48 read = ReadLine(fd, line, sizeof(line) - 1); |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
49 if (read < 1) { |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
50 Delay(0.05); |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
51 continue; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
52 } |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
53 |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
54 /* parse data */ |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
55 read = Scan(line, "%d[w2]%d[w2]%d[w2] %d[w2]%d[w2]%d[w2].%d %f %f %f %f", |
91
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
56 &year, &month, &day, &hour, &min, &sec, &msec, |
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
57 &event.data[0], &event.data[1], &event.data[2], &event.data[3]); |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
58 if (read != 11) { |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
59 /* notify error to the main thread */ |
239
ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
91
diff
changeset
|
60 send_message(main_thread_id, "error parsing data log line"); |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
61 /* skip line */ |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
62 continue; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
63 } |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
64 |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
65 t.tm_hour = hour; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
66 t.tm_min = min; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
67 t.tm_sec = sec; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
68 t.tm_mday = day; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
69 /* correct month count */ |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
70 t.tm_mon = month - 1; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
71 /* years since 1900 */ |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
72 t.tm_year = year + 2000 - 1900; |
91
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
73 /* deduce if daylight saving is in place from the date and time itself */ |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
74 t.tm_isdst = -1; |
91
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
75 |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
76 /* convert into seconds since 1 January 1900 00:00:00 and add milliseconds */ |
91
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
77 event.time.tv_sec = mktime(&t); |
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
78 event.time.tv_usec = msec * 1000; |
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
79 |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
80 /* convert from kHz to Hz */ |
91
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
81 event.data[0] *= 1000.0; |
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
82 event.data[1] *= 1000.0; |
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
83 event.data[2] *= 1000.0; |
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
84 event.data[3] *= 1000.0; |
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
85 |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
86 /* push data into the data queue */ |
91
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
87 CmtWriteTSQData(dataQueue, &event, 1, TSQ_INFINITE_TIMEOUT, 0); |
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
88 |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
89 /* handle switch to next data file */ |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
90 if ((hour == 23) && (min == 59) && (sec == 59)) { |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
91 |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
92 /* next data file name */ |
239
ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
91
diff
changeset
|
93 snprintf(datafile, sizeof(datafile) - 1, |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
94 "%s\\%02d%02d%02d_Frequ.txt", LOGFILEPATH, year, month, day + 1); |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
95 |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
96 /* close data file */ |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
97 CloseFile(fd); |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
98 |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
99 /* wait for new data file to appear */ |
91
4102fe614df2
Fix timestamping. Cleanup data providers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
90
diff
changeset
|
100 int retry = 20; |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
101 while (retry--) { |
239
ec81395bf08d
Solve name collisions and other problems caused by including Windows headers
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
91
diff
changeset
|
102 fd = OpenFile(datafile, VAL_READ_ONLY, VAL_OPEN_AS_IS, VAL_ASCII); |
90
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
103 if (fd != -1) |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
104 break; |
c9aec93005a4
Cleanup log file data provider
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
88
diff
changeset
|
105 Delay(0.01); |
88
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
106 } |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
107 } |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
108 } |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
109 return 0; |
9b7588cd4013
Move data acquisition into separate thread
Daniele Nicolodi <daniele.nicolodi@obspm.fr>
parents:
diff
changeset
|
110 } |