MIDAS
Loading...
Searching...
No Matches
mhist.cxx
Go to the documentation of this file.
1 /********************************************************************\
2
3 Name: mhist.c
4 Created by: Stefan Ritt
5
6 Contents: MIDAS history display utility
7
8\********************************************************************/
9
10#include "midas.h"
11#include "msystem.h"
12#include "history.h"
13#include "mstrlcpy.h"
14
15#define CALLOC(num, type) (type*)calloc((num),sizeof(type))
16#define FREE(ptr) free(ptr); (ptr)=NULL;
17
19
20#if 0
21void tmp()
22{
23 time_t tm;
24
25 time(&tm);
26 tm = ss_time();
27 hs_dump(1, (DWORD) tm - 3600, (DWORD) tm, 0, FALSE);
28}
29
30/*------------------------------------------------------------------*/
31
32TAG temp_tag[] = {
33 {"Temperatures", TID_FLOAT, 100},
34 {"Humidity", TID_FLOAT, 99},
35 {"Pressure1", TID_FLOAT, 1},
36};
37
38TAG hv_tag[] = {
39 {"HV", TID_FLOAT, 100},
40};
41
42float hist[200];
43float hv[100];
44TAG tag[10];
46/* write some history */
47{
48 DWORD start_time, act_time;
49 int i, j, bytes;
50
51 hs_define_event(1, "Temperature", temp_tag, sizeof(temp_tag));
52 hs_define_event(2, "HV", hv_tag, sizeof(hv_tag));
53
54 start_time = ss_millitime();
55 j = bytes = 0;
56 do {
57 for (i = 0; i < 100; i++) {
58 hist[i] = (float) j;
59 hs_write_event(1, hist, sizeof(hist));
60 hs_write_event(2, hv, sizeof(hv));
61 }
62
63 j += 2 * i;
64 bytes += (sizeof(hist) + sizeof(hv)) * i;
66
67 printf("%d\n", ss_time());
68
69 } while (act_time - start_time < 10000);
70
71 printf("%d events (%d kB) per sec.\n", j / (act_time - start_time) * 1000,
72 bytes / 1024 / (act_time - start_time) * 1000);
73}
74
75void generate_hist()
76/* write some history */
77{
78 int i, j;
79
80 hs_define_event(1, "Temperature", temp_tag, sizeof(temp_tag));
81 hs_write_event(1, hist, sizeof(hist));
82
83 hs_define_event(2, "HV", hv_tag, sizeof(hv_tag));
84 hs_write_event(2, hv, sizeof(hv));
85
86 for (i = 0; i < 10; i++) {
87 hist[0] = (float) i;
88 hist[1] = i / 10.f;
89 hs_write_event(1, hist, sizeof(hist));
90
91 for (j = 0; j < 100; j++)
92 hv[j] = j + i / 10.f;
93 hs_write_event(2, hv, sizeof(hv));
94 printf("%d\n", ss_time());
95 ss_sleep(1000);
96 }
97}
98#endif
99
100/*------------------------------------------------------------------*/
102 std::string* event_name,
103 DWORD * start_time, DWORD * end_time, DWORD * interval,
104 char *var_name, DWORD * var_type,
106{
108 int var_index;
109 int rd;
110
111 time_t t = 0;
112
113 std::vector<std::string> events;
115
116 if (status != HS_SUCCESS) {
117 printf("hs_get_events() error %d\n", status);
118 return status;
119 }
120
121 printf("Available events:\n");
122 for (unsigned i = 0; i < events.size(); i++) {
123 printf("%d: %s\n", i, events[i].c_str());
124 }
125
126 if (events.size() == 0)
127 return HS_FILE_ERROR;
128 else if (events.size() == 1)
129 *event_name = events[0];
130 else {
131 int i;
132 printf("\nSelect event: ");
133 rd = scanf("%d", &i);
134 if (rd != 1)
135 return HS_FILE_ERROR;
136 *event_name = events[i];
137 }
138
139 std::vector<TAG> tags;
140 status = mh->hs_get_tags(event_name->c_str(), t, &tags);
141
142 if (status != HS_SUCCESS) {
143 printf("hs_get_tags() error %d\n", status);
144 return status;
145 }
146
147 printf("\nAvailable variables:\n");
148
149 for (unsigned j = 0; j < tags.size(); j++)
150 if (tags[j].n_data > 1)
151 printf("%d: %s[%d]\n", j, tags[j].name, tags[j].n_data);
152 else
153 printf("%d: %s\n", j, tags[j].name);
154
155 *index = var_index = 0;
156 if (tags.size() > 1) {
157 printf("\nSelect variable (0..%d,-1 for all): ", (int)tags.size() - 1);
158 rd = scanf("%d", &var_index);
159 if (rd != 1)
160 return HS_FILE_ERROR;
161 if (var_index >= (int)tags.size())
162 var_index = tags.size() - 1;
163 } else {
164 var_index = 0;
165 }
166
167 var_name[0] = 0;
168
169 if (var_index >= 0) {
170 mstrlcpy(var_name, tags[var_index].name, NAME_LENGTH);
171 *var_type = tags[var_index].type;
172 *var_n_data = tags[var_index].n_data;
173
174 if (tags[var_index].n_data > 1 && tags[var_index].type != TID_STRING) {
175 printf("\nSelect index (0..%d): ", tags[var_index].n_data - 1);
176 rd = scanf("%d", index);
177 if (rd != 1)
178 return HS_FILE_ERROR;
179 }
180 }
181
182 printf("\nHow many hours: ");
183 rd = scanf("%d", &hour);
184 if (rd != 1)
185 return HS_FILE_ERROR;
186 *end_time = ss_time();
187 *start_time = (*end_time) - hour * 3600;
188
189 printf("\nInterval [sec]: ");
190 rd = scanf("%d", interval);
191 if (rd != 1)
192 return HS_FILE_ERROR;
193 printf("\n");
194
195 return HS_SUCCESS;
196}
197
198/*------------------------------------------------------------------*/
199#if 0
201{
202 DWORD status, i, j, bytes, n, nv, ltime, n_bytes, name_size, id_size;
203
204 ltime = 0;
205 if (file_name[0]) {
206 struct tm tms;
207
208 memset(&tms, 0, sizeof(tms));
209 tms.tm_hour = 12;
210 tms.tm_year = 10 * (file_name[0] - '0') + (file_name[1] - '0');
211 if (tms.tm_year < 90)
212 tms.tm_year += 100;
213 tms.tm_mon = 10 * (file_name[2] - '0') + (file_name[3] - '0') - 1;
214 tms.tm_mday = 10 * (file_name[4] - '0') + (file_name[5] - '0');
215 ltime = (DWORD) ss_mktime(&tms);
216 }
217
219 if (status != HS_SUCCESS)
220 return status;
221
223 id_size = n * sizeof(INT);
224 char* event_name = (char*)malloc(name_size);
226 hs_enum_events(ltime, event_name, (DWORD *) & name_size, event_id,
227 (DWORD *) & id_size);
228
229 for (i = 0; i < n; i++) {
230 printf("\nEvent ID %d: %s\n", event_id[i], event_name + i * NAME_LENGTH);
232 bytes = nv * NAME_LENGTH;
233 n_bytes = nv * sizeof(DWORD);
234 char* var_names = (char*)malloc(bytes);
235 DWORD* var_n = (DWORD*)malloc(nv * sizeof(DWORD));
236
237 hs_enum_vars(ltime, event_id[i], var_names, &bytes, var_n, &n_bytes);
238 for (j = 0; j < nv; j++)
239 if (var_n[j] > 1)
240 printf("%d: %s[%d]\n", j, var_names + j * NAME_LENGTH, var_n[j]);
241 else
242 printf("%d: %s\n", j, var_names + j * NAME_LENGTH);
243
244 free(var_n);
245 free(var_names);
246 }
247
248 free(event_name);
249 free(event_id);
250
251 return HS_SUCCESS;
252}
253#endif
254
255/********************************************************************/
256static INT hs_fdump(const char *file_name, DWORD id, BOOL binary_time)
257/********************************************************************\
258
259 Routine: hs_fdump
260
261 Purpose: Display history for a given history file
262
263 Input:
264 char *file_name Name of file to dump
265 DWORD event_id Event ID
266 BOOL binary_time Display DWORD time stamp
267
268 Output:
269 <screen output>
270
271 Function value:
272 HS_SUCCESS Successful completion
273 HS_FILE_ERROR Cannot open history file
274
275\********************************************************************/
276{
277 int fh;
278 INT n;
281 char event_name[NAME_LENGTH];
282
283 /* open file, add O_BINARY flag for Windows NT */
284 fh = open(file_name, O_RDONLY | O_BINARY, 0644);
285 if (fh < 0) {
286 cm_msg(MERROR, "hs_fdump", "cannot open file %s", file_name);
287 return HS_FILE_ERROR;
288 }
289
290 /* loop over file records in .hst file */
291 do {
292 n = read(fh, (char *) &rec, sizeof(rec));
293 if (n == 0)
294 break; // end of file
295 if (n < 0) {
296 printf("Error reading \"%s\", errno %d (%s)\n", file_name, errno, strerror(errno));
297 break;
298 }
299 if (n != (int)sizeof(rec)) {
300 printf("Error reading \"%s\", truncated data, requested %d bytes, read %d bytes\n", file_name, (int)sizeof(rec), n);
301 break;
302 }
303
304 /* check if record type is definition */
305 if (rec.record_type == RT_DEF) {
306 /* read name */
307 n = read(fh, event_name, sizeof(event_name));
308 if (n != sizeof(event_name)) {
309 printf("Error reading \"%s\", truncated data or error, requested %d bytes, read %d bytes, errno %d (%s)\n", file_name, (int)sizeof(rec), n, errno, strerror(errno));
310 break;
311 }
312
313 if (rec.event_id == id || id == 0)
314 printf("Event definition %s, ID %d\n", event_name, rec.event_id);
315
316 /* skip tags */
317 lseek(fh, rec.data_size, SEEK_CUR);
318 } else {
319 /* print data record */
320 char str[32];
321 if (binary_time) {
322 sprintf(str, "%d ", rec.time);
323 } else {
324 ltime = (time_t) rec.time;
325 char ctimebuf[32];
327 mstrlcpy(str, ctimebuf + 4, sizeof(str));
328 str[15] = 0;
329 }
330 if (rec.event_id == id || id == 0)
331 printf("ID %d, %s, size %d\n", rec.event_id, str, rec.data_size);
332
333 /* skip data */
334 lseek(fh, rec.data_size, SEEK_CUR);
335 }
336
337 } while (TRUE);
338
339 close(fh);
340
341 return HS_SUCCESS;
342}
343
345{
346 std::vector<std::string> events;
347 int status = mh->hs_get_events(t, &events);
348
349 if (status != HS_SUCCESS) {
350 printf("hs_get_events() error %d\n", status);
351 return status;
352 }
353
354 for (unsigned i = 0; i < events.size(); i++) {
355 printf("\nEvent \'%s\'\n", events[i].c_str());
356
357 std::vector<TAG> tags;
358 status = mh->hs_get_tags(events[i].c_str(), t, &tags);
359
360 if (status != HS_SUCCESS) {
361 printf("hs_get_tags() error %d\n", status);
362 continue;
363 }
364
365 for (unsigned j = 0; j < tags.size(); j++)
366 if (tags[j].n_data > 1)
367 printf("%d: %s[%d]\n", j, tags[j].name, tags[j].n_data);
368 else
369 printf("%d: %s\n", j, tags[j].name);
370 }
371
372 return HS_SUCCESS;
373}
374
375/*------------------------------------------------------------------*/
377 const char* event_name,
378 time_t start_time, time_t end_time, time_t interval,
379 const char *var_name, int index)
380/* read back history */
381{
383 double *buffer = NULL;
384 int n;
385 int status = 0;
386 int hs_status = 0;
387
388 status = mh->hs_read(start_time, end_time, interval, 1, &event_name, &var_name, &index, &n, &tbuffer, &buffer, &hs_status);
389
390 if (status != HS_SUCCESS) {
391 printf("hs_read() error %d\n", status);
392 return;
393 }
394
395 if (hs_status != HS_SUCCESS) {
396 printf("hs_read() cannot read event, status %d\n", hs_status);
397 return;
398 }
399
400 if (n == 0)
401 printf("No data for event \"%s\" variable \"%s\" found in specified time range\n", event_name, var_name);
402
403 for (int i = 0; i < n; i++) {
404 char str[256];
405
406 if (binary_time)
407 sprintf(str, "%d %.16g", (int)tbuffer[i], buffer[i]);
408 else {
409 char ctimebuf[32];
411 sprintf(str, "%s %.16g", ctimebuf + 4, buffer[i]);
412 }
413
414 char* s = strchr(str, '\n');
415 if (s)
416 *s = ' ';
417
418 printf("%s\n", str);
419 }
420
421 free(tbuffer);
422 free(buffer);
423}
424
425/*------------------------------------------------------------------*/
426
428 const char* event_name,
429 time_t start_time, time_t end_time, time_t interval,
430 const char *var_name, int index1, int index2)
431/* read back history */
432{
433 INT status = 0;
434
435 if (index2 < index1) {
436 printf("Wrong specified range (low>high)\n");
437 return;
438 }
439
440 int nvars = index2 - index1 + 1;
441
442 const char** en = CALLOC(nvars, const char*);
443 const char** vn = CALLOC(nvars, const char*);
444 int* in = CALLOC(nvars, int);
445
446 for (int i=0; i<nvars; i++) {
447 en[i] = event_name;
448 vn[i] = var_name;
449 in[i] = index1 + i;
450 }
451
452 int* n = CALLOC(nvars, int);
453 time_t** tbuffer = CALLOC(nvars, time_t*);
454 double** vbuffer = CALLOC(nvars, double*);
455 int* hs_status = CALLOC(nvars, int);
456
457 status = mh->hs_read(start_time, end_time, interval, nvars, en, vn, in, n, tbuffer, vbuffer, hs_status);
458
459 if (status != HS_SUCCESS) {
460 printf("Cannot read history data, hs_read() error %d\n", status);
461 return;
462 }
463
464 for (int i=0; i<nvars; i++) {
465 if (n[i] == 0)
466 printf("No data for event \"%s\" variable \"%s\" index %d found in specified time range\n", event_name, var_name, index1+i);
467 else if (hs_status[i] != HS_SUCCESS)
468 printf("Cannot read event \"%s\" variable \"%s\" index %d, status %d\n", event_name, var_name, index1+i, hs_status[i]);
469 }
470
471 printf("mhist for Var:%s[%d:%d]\n", var_name, index1, index2);
472 for (int i = 0; i < n[0]; i++) {
473 if (binary_time)
474 printf("%d ", (int)tbuffer[0][i]);
475 else {
476 char str[256];
477 time_t ltime = (time_t) tbuffer[0][i];
478 char ctimebuf[32];
480 sprintf(str, "%s", ctimebuf + 4);
481 str[20] = '\t';
482 printf("%s", str);
483 }
484
485 for (int j = 0, idx = index1; idx < index2 + 1; idx++, j++) {
486 putchar('\t');
487 printf("%.16g", vbuffer[j][i]);
488 }
489
490 putchar('\n');
491 }
492
493 for (int i=0; i<nvars; i++) {
494 FREE(tbuffer[i]);
495 FREE(vbuffer[i]);
496 }
497
498 FREE(n);
499 FREE(tbuffer);
500 FREE(vbuffer);
502
503 FREE(en);
504 FREE(vn);
505 FREE(in);
506}
507
508/*------------------------------------------------------------------*/
509
511 const char* event_name,
512 time_t start_time, time_t end_time, time_t interval)
513/* read back history */
514{
515 INT status = 0;
516
517 std::vector<TAG> tags;
518 status = mh->hs_get_tags(event_name, start_time, &tags);
519
520 if (status != HS_SUCCESS) {
521 printf("Cannot get list of variables for event \'%s\', hs_get_tags() error %d\n", event_name, status);
522 return;
523 }
524
525 for (unsigned j = 0; j < tags.size(); j++) {
526 if (tags[j].n_data > 1)
527 printf("%d: %s[%d]\n", j, tags[j].name, tags[j].n_data);
528 else
529 printf("%d: %s\n", j, tags[j].name);
530 }
531
532 int xvars = 0;
533
534 for (unsigned i=0; i<tags.size(); i++) {
535 if (tags[i].n_data == 1) {
536 xvars++;
537 } else {
538 for (unsigned j=0; j<tags[i].n_data; j++) {
539 xvars++;
540 }
541 }
542 }
543
544 const char** en = CALLOC(xvars, const char*);
545 const char** vn = CALLOC(xvars, const char*);
546 int* in = CALLOC(xvars, int);
547 int* n_data = CALLOC(xvars, int);
548
549 int nvars = 0;
550
551 for (unsigned i=0; i<tags.size(); i++) {
552 if (tags[i].name[0] == '/') // skip system tags
553 continue;
554 if (tags[i].n_data == 1) {
555 en[nvars] = event_name;
556 vn[nvars] = tags[i].name;
557 in[nvars] = 0;
558 n_data[nvars] = tags[i].n_data;
559 nvars++;
560 } else {
561 for (unsigned j=0; j<tags[i].n_data; j++) {
562 en[nvars] = event_name;
563 vn[nvars] = tags[i].name;
564 in[nvars] = j;
565 n_data[nvars] = tags[i].n_data;
566 nvars++;
567 }
568 }
569 }
570
571 assert(nvars <= xvars);
572
573 int* n = CALLOC(nvars, int);
574 time_t** tbuffer = CALLOC(nvars, time_t*);
575 double** vbuffer = CALLOC(nvars, double*);
576 int* hs_status = CALLOC(nvars, int);
577
578 status = mh->hs_read(start_time, end_time, interval, nvars, en, vn, in, n, tbuffer, vbuffer, hs_status);
579
580 if (status != HS_SUCCESS) {
581 printf("Cannot read history data, hs_read() error %d\n", status);
582 return;
583 }
584
585 int nread = n[0];
586
587 bool ok = true;
588 bool no_data = true;
589
590 for (int i=0; i<nvars; i++) {
591 if (n[i] == 0) {
592 printf("No data for event \"%s\" variable \"%s\" index %d found in specified time range\n", en[i], vn[i], in[i]);
593 ok = false;
594 } else if (hs_status[i] != HS_SUCCESS) {
595 printf("Cannot read event \"%s\" variable \"%s\" index %d, status %d\n", en[i], vn[i], in[i], hs_status[i]);
596 ok = false;
597 } else if (n[i] != nread) {
598 printf("Number of entries for event \"%s\" variable \"%s\" index %d is %d instead of %d\n", en[i], vn[i], in[i], n[i], nread);
599 ok = false;
600 no_data = false;
601 } else {
602 no_data = false;
603 }
604 }
605
606 if (no_data) {
607 printf("No data, nothing to print\n");
608 return;
609 }
610
611 if (!ok) {
612 printf("Cannot print history data because of timestamp skew\n");
613 return;
614 }
615
616 printf("Event \'%s\', %d variables, %d entries\n", event_name, nvars, nread);
617
618 printf("Time ");
619 printf("\t");
620 for (int i=0; i<nvars; i++) {
621 if (n_data[i] == 1) {
622 printf("\t");
623 printf("%s ", vn[i]);
624 } else {
625 printf("\t");
626 printf("%s[%d] ", vn[i], in[i]);
627 }
628 }
629 printf("\n");
630
631 for (int i = 0; i < nread; i++) {
632 if (binary_time)
633 printf("%d ", (int)tbuffer[0][i]);
634 else {
635 char buf[256];
636 time_t ltime = (time_t) tbuffer[0][i];
637 char ctimebuf[32];
639 sprintf(buf, "%s", ctimebuf + 4);
640 char* c = strchr(buf, '\n');
641 if (c)
642 *c = 0; // kill trailing '\n'
643 printf("%s", buf);
644 putchar('\t');
645 }
646
647 for (int j=0; j<nvars; j++) {
648 if (tbuffer[j][i] != tbuffer[0][i]) {
649 printf("Cannot print history data because of timestamp skew\n");
650 return;
651 }
652 putchar('\t');
653 printf("%.16g", vbuffer[j][i]);
654 }
655
656 putchar('\n');
657 }
658
659 for (int i=0; i<nvars; i++) {
660 FREE(tbuffer[i]);
661 FREE(vbuffer[i]);
662 }
663
664 FREE(n);
665 FREE(tbuffer);
666 FREE(vbuffer);
668
669 FREE(en);
670 FREE(vn);
671 FREE(in);
672 FREE(n_data);
673}
674
675/*------------------------------------------------------------------*/
676static DWORD convert_time(char *t)
677/* convert date in format YYMMDD[.HHMM[SS]] into decimal time */
678{
679 struct tm tms;
680 INT isdst;
681
682 ss_tzset(); // required for localtime_r()
683
684 memset(&tms, 0, sizeof(tms));
685
686 tms.tm_year = 10 * (t[0] - '0') + (t[1] - '0');
687 tms.tm_mon = 10 * (t[2] - '0') + (t[3] - '0') - 1;
688 tms.tm_mday = 10 * (t[4] - '0') + (t[5] - '0');
689 if (tms.tm_year < 90)
690 tms.tm_year += 100;
691 if (t[6] == '.') {
692 tms.tm_hour = 10 * (t[7] - '0') + (t[8] - '0');
693 tms.tm_min = 10 * (t[9] - '0') + (t[10] - '0');
694 if (t[11])
695 tms.tm_sec = 10 * (t[11] - '0') + (t[12] - '0');
696 }
697
699
700 /* correct for dst */
702
703 isdst = tms.tm_isdst;
704 memset(&tms, 0, sizeof(tms));
705 tms.tm_isdst = isdst;
706
707 tms.tm_year = 10 * (t[0] - '0') + (t[1] - '0');
708 tms.tm_mon = 10 * (t[2] - '0') + (t[3] - '0') - 1;
709 tms.tm_mday = 10 * (t[4] - '0') + (t[5] - '0');
710 if (tms.tm_year < 90)
711 tms.tm_year += 100;
712 if (t[6] == '.') {
713 tms.tm_hour = 10 * (t[7] - '0') + (t[8] - '0');
714 tms.tm_min = 10 * (t[9] - '0') + (t[10] - '0');
715 if (t[11])
716 tms.tm_sec = 10 * (t[11] - '0') + (t[12] - '0');
717 }
718
719 ltime = (DWORD) ss_mktime(&tms);
720
721 return (DWORD)ltime;
722}
723
724void usage()
725{
726 printf("\nusage: mhist [-e Event Name] [-v Variable Name]\n");
727 printf(" [-i Index] index of variables which are arrays\n");
728 printf(" [-i Index1:Index2] index range of variables which are arrays (max 50)\n");
729 printf(" [-t Interval] minimum interval in sec. between two displayed records\n");
730 printf(" [-h Hours] display between some hours ago and now\n");
731 printf(" [-d Days] display between some days ago and now\n");
732 printf(" [-f File] specify history file explicitly\n");
733 printf(" [-s Start date] specify start date YYMMDD[.HHMM[SS]]\n");
734 printf(" [-p End date] specify end date YYMMDD[.HHMM[SS]]\n");
735 printf(" [-l] list available events and variables\n");
736 printf(" [-b] display time stamp in decimal format\n");
737 exit(1);
738}
739
740int main(int argc, char *argv[])
741{
743 DWORD start_time = 0;
744 DWORD end_time = 0;
745 DWORD interval = 0;
746 DWORD index1 = 0;
747 DWORD index2 = 0;
751 char var_name[NAME_LENGTH];
752 std::string path_name;
753 char *column;
754 BOOL do_hst_file = false;
755 std::string event_name;
756 int debug = 0;
757
758 /* turn off system message */
760
761 var_name[0] = 0;
763
764 HNDLE hDB;
765 char host_name[256];
766 char expt_name[256];
767 host_name[0] = 0;
768 expt_name[0] = 0;
769
771
773
774 if (argc == 1) {
776 assert(status == CM_SUCCESS);
777
779 assert(status == CM_SUCCESS);
780
782 assert(status == HS_SUCCESS);
783
784 status = query_params(mh, &event_name, &start_time, &end_time, &interval, var_name, &var_type, &var_n_data, &index1);
785 if (status != HS_SUCCESS)
786 return 1;
787 } else {
788 /* at least one argument */
789 end_time = ss_time();
790 start_time = end_time - 3600;
791 interval = 1;
792 index1 = 0;
793 index2 = 0;
794 var_type = 0;
795 event_name = "";
797
798 for (i = 1; i < argc; i++) {
799 if (argv[i][0] == '-' && argv[i][1] == 'b')
801 else if (argv[i][0] == '-' && argv[i][1] == 'l')
803 else if (argv[i][0] == '-') {
804 if (i + 1 >= argc) {
805 printf("Error: command line switch value after \"%s\" is missing\n", argv[i]);
806 usage();
807 } else if (argv[i+1][0] == '-') {
808 printf("Error: command line switch value after \"%s\" starts with a dash: %s\n", argv[i], argv[i+1]);
809 usage();
810 } else if (strncmp(argv[i], "-e", 2) == 0) {
811 event_name = argv[++i];
812 } else if (strncmp(argv[i], "-v", 2) == 0) {
813 strcpy(var_name, argv[++i]);
814 } else if (strncmp(argv[i], "-i", 2) == 0) {
815 if ((column = strchr(argv[++i], ':')) == NULL) {
816 index1 = atoi(argv[i]);
817 index2 = 0;
818 } else {
819 *column = 0;
820 index1 = atoi(argv[i]);
821 index2 = atoi(column + 1);
822 }
823 } else if (strncmp(argv[i], "-h", 2) == 0) {
824 start_time = ss_time() - atoi(argv[++i]) * 3600;
825 } else if (strncmp(argv[i], "-d", 2) == 0) {
826 start_time = ss_time() - atoi(argv[++i]) * 3600 * 24;
827 } else if (strncmp(argv[i], "-s", 2) == 0) {
828 start_time = convert_time(argv[++i]);
829 } else if (strncmp(argv[i], "-p", 2) == 0) {
830 end_time = convert_time(argv[++i]);
831 } else if (strncmp(argv[i], "-t", 2) == 0) {
832 interval = atoi(argv[++i]);
833 } else if (strncmp(argv[i], "-f", 2) == 0) {
834 path_name = argv[++i];
835 do_hst_file = true;
836 }
837 } else {
838 printf("Error: unknown command line switch: %s\n", argv[i]);
839 usage();
840 }
841 }
842 }
843
844 if (do_hst_file) {
845 hs_fdump(path_name.c_str(), atoi(event_name.c_str()), binary_time);
846 return 0;
847 }
848
849 if (!mh) {
851 assert(status == CM_SUCCESS);
852
854 assert(status == CM_SUCCESS);
855
857 if (status != HS_SUCCESS) {
858 printf("hs_connect() error %d\n", status);
859 return 1;
860 }
861 }
862
863 /* -l listing only */
864 if (list_query) {
865 display_vars(mh, 0);
866 }
867 /* -v given takes -e -s -p -t -b */
868 else if (var_name[0] == 0) {
869 // hs_dump(event_id, start_time, end_time, interval, binary_time);
870 display_all_hist(mh, event_name.c_str(), start_time, end_time, interval);
871 }
872 /* Interactive variable display */
873 else if (index2 == 0)
874 display_single_hist(mh, event_name.c_str(), start_time, end_time, interval, var_name, index1);
875 else
876 display_range_hist(mh, event_name.c_str(), start_time, end_time, interval, var_name, index1, index2);
877
878 delete mh;
879
881
882 return 0;
883}
884
885/* emacs
886 * Local Variables:
887 * tab-width: 8
888 * c-basic-offset: 3
889 * indent-tabs-mode: nil
890 * End:
891 */
#define FALSE
Definition cfortran.h:309
virtual int hs_read(time_t start_time, time_t end_time, time_t interval, int num_var, const char *const event_name[], const char *const tag_name[], const int var_index[], int num_entries[], time_t *time_buffer[], double *data_buffer[], int status[])=0
see hs_read(), returns HS_SUCCESS
virtual int hs_get_events(time_t time_from, std::vector< std::string > *pevents)=0
get list of events that exist(ed) at given time and later (value 0 means "return all events from begi...
virtual int hs_get_tags(const char *event_name, time_t time_from, std::vector< TAG > *ptags)=0
get list of history variables for given event (use event names returned by hs_get_events()) that exis...
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
Definition midas.cxx:3011
INT cm_connect_experiment1(const char *host_name, const char *default_exp_name, const char *client_name, void(*func)(char *), INT odb_size, DWORD watchdog_timeout)
Definition midas.cxx:2297
INT cm_disconnect_experiment(void)
Definition midas.cxx:2846
INT cm_get_environment(char *host_name, int host_name_size, char *exp_name, int exp_name_size)
Definition midas.cxx:2134
#define CM_SUCCESS
Definition midas.h:582
#define HS_SUCCESS
Definition midas.h:727
#define HS_FILE_ERROR
Definition midas.h:728
static INT hs_enum_vars(DWORD ltime, DWORD event_id, char *var_name, DWORD *size, DWORD *var_n, DWORD *n_size)
Definition history.cxx:1128
static INT hs_define_event(DWORD event_id, const char *name, const TAG *tag, DWORD size)
Definition history.cxx:427
static INT hs_count_vars(DWORD ltime, DWORD event_id, DWORD *count)
Definition history.cxx:1060
static INT hs_count_events(DWORD ltime, DWORD *count)
Definition history.cxx:907
static INT hs_enum_events(DWORD ltime, char *event_name, DWORD *name_size, INT event_id[], DWORD *id_size)
Definition history.cxx:823
static INT hs_dump(DWORD event_id, DWORD start_time, DWORD end_time, DWORD interval, BOOL binary_time)
Definition history.cxx:1954
static INT hs_write_event(DWORD event_id, const void *data, DWORD size)
Definition history.cxx:656
unsigned int DWORD
Definition mcstd.h:51
#define MT_ALL
Definition midas.h:549
#define TID_STRING
Definition midas.h:346
#define MERROR
Definition midas.h:559
#define TID_FLOAT
Definition midas.h:341
#define O_BINARY
Definition msystem.h:219
time_t ss_mktime(struct tm *tms)
Definition system.cxx:3365
DWORD ss_millitime()
Definition system.cxx:3393
void ss_tzset()
Definition system.cxx:3355
DWORD ss_time()
Definition system.cxx:3462
INT ss_sleep(INT millisec)
Definition system.cxx:3628
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
Definition midas.cxx:915
INT cm_set_msg_print(INT system_mask, INT user_mask, int(*func)(const char *))
Definition midas.cxx:647
#define HS_GET_DEFAULT
Definition history.h:38
#define HS_GET_INACTIVE
Definition history.h:37
#define HS_GET_READER
Definition history.h:35
int hs_get_history(HNDLE hDB, HNDLE hKey, int flags, int debug_flag, MidasHistoryInterface **mh)
int main()
Definition hwtest.cxx:23
DWORD n[4]
Definition mana.cxx:247
INT index
Definition mana.cxx:271
BOOL debug
debug printouts
Definition mana.cxx:254
INT type
Definition mana.cxx:269
HNDLE hDB
main ODB handle
Definition mana.cxx:207
char host_name[HOST_NAME_LENGTH]
Definition mana.cxx:242
INT i
Definition mdump.cxx:32
char expt_name[NAME_LENGTH]
Definition mevb.cxx:44
#define DWORD
Definition mhdump.cxx:31
#define FREE(ptr)
Definition mhist.cxx:16
static void display_all_hist(MidasHistoryInterface *mh, const char *event_name, time_t start_time, time_t end_time, time_t interval)
Definition mhist.cxx:510
static void display_single_hist(MidasHistoryInterface *mh, const char *event_name, time_t start_time, time_t end_time, time_t interval, const char *var_name, int index)
Definition mhist.cxx:376
void usage()
Definition mhist.cxx:724
static DWORD convert_time(char *t)
Definition mhist.cxx:676
#define CALLOC(num, type)
Definition mhist.cxx:15
static INT query_params(MidasHistoryInterface *mh, std::string *event_name, DWORD *start_time, DWORD *end_time, DWORD *interval, char *var_name, DWORD *var_type, INT *var_n_data, DWORD *index)
Definition mhist.cxx:101
static INT display_vars(MidasHistoryInterface *mh, time_t t)
Definition mhist.cxx:344
static INT hs_fdump(const char *file_name, DWORD id, BOOL binary_time)
Definition mhist.cxx:256
BOOL binary_time
Definition mhist.cxx:18
static void display_range_hist(MidasHistoryInterface *mh, const char *event_name, time_t start_time, time_t end_time, time_t interval, const char *var_name, int index1, int index2)
Definition mhist.cxx:427
INT HNDLE
Definition midas.h:132
DWORD BOOL
Definition midas.h:105
int INT
Definition midas.h:129
#define RT_DEF
Definition midas.h:1358
#define TRUE
Definition midas.h:182
#define DEFAULT_ODB_SIZE
Definition midas.h:270
#define NAME_LENGTH
Definition midas.h:272
MidasHistoryInterface * mh
#define read(n, a, f)
#define event_id
#define name(x)
Definition midas_macro.h:24
MUTEX_T * tm
Definition odbedit.cxx:39
INT j
Definition odbhist.cxx:40
char str[256]
Definition odbhist.cxx:33
char file_name[256]
Definition odbhist.cxx:41
DWORD status
Definition odbhist.cxx:39
char var_name[256]
Definition odbhist.cxx:41
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
Definition rmidas.h:24
Definition midas.h:1234
char c
Definition system.cxx:1310