Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 130 | f9daq | 1 | #include "../include/root_app.h" |
| 2 | #include "../include/workstation.h" |
||
| 3 | |||
| 4 | #include <stdio.h> |
||
| 5 | #include <stdlib.h> |
||
| 6 | #include <unistd.h> |
||
| 7 | |||
| 8 | // Main window constructor (+layout) --------------------------------- |
||
| 9 | |||
| 10 | TGAppMainFrame::TGAppMainFrame(const TGWindow *p, int w, int h) |
||
| 11 | { |
||
| 12 | // Define main window and menubar |
||
| 13 | fMain = new TGMainFrame(p, w, h, kVerticalFrame); |
||
| 14 | |||
| 15 | AppLayout(); |
||
| 16 | fMain->SetWindowName(WINDOW_NAME); |
||
| 17 | fMain->MapSubwindows(); |
||
| 18 | fMain->MapWindow(); |
||
| 19 | fMain->Layout(); |
||
| 20 | } |
||
| 21 | |||
| 22 | TGAppMainFrame::~TGAppMainFrame() |
||
| 23 | { |
||
| 24 | fMain->Cleanup(); |
||
| 25 | delete fMain; |
||
| 26 | } |
||
| 27 | |||
| 28 | // Closing main window and checking about information ---------------- |
||
| 29 | |||
| 30 | void TGAppMainFrame::CloseWindow() |
||
| 31 | { |
||
| 32 | fMain->Cleanup(); |
||
| 33 | delete fMain; |
||
| 34 | gApplication->Terminate(0); |
||
| 35 | } |
||
| 36 | |||
| 37 | // ------------------------------------------------------------------- |
||
| 38 | |||
| 39 | // ------------------------------------------------------------------- |
||
| 40 | |||
| 41 | // Separate functions ----------------------------------------- |
||
| 42 | void GetTime(int intime, char *outtime) |
||
| 43 | { |
||
| 44 | time_t rawtime; |
||
| 45 | struct tm * timeinfo; |
||
| 46 | if(intime < 0) |
||
| 47 | time(&rawtime); |
||
| 48 | else |
||
| 49 | rawtime = (time_t)intime; |
||
| 50 | timeinfo = localtime(&rawtime); |
||
| 51 | sprintf(outtime, "%s", asctime(timeinfo)); |
||
| 52 | int len = strlen(outtime); |
||
| 53 | if(len) outtime[len-1] = 0; |
||
| 54 | } |
||
| 55 | |||
| 56 | // ---------------------------------------------------------- |
||
| 57 | |||
| 58 | // Temperature sensor functions ----------------------------- |
||
| 59 | const char* dbname = "mysql://f9lab08.ijs.si/f9phdet"; |
||
| 60 | const char* tblname = "fprtd122"; |
||
| 61 | const char* username = "f9daq"; |
||
| 62 | const char* userpass = "f9lab"; |
||
| 63 | |||
| 64 | // Get the temperature from MYSQL database |
||
| 65 | double GetTemperature(int ch, const char *s) |
||
| 66 | { |
||
| 67 | int bin=5+7*4-ch*4; |
||
| 68 | char hex[16]; |
||
| 69 | strncpy(hex, (const char *) &s[bin], 4); |
||
| 70 | hex[4]=0; |
||
| 71 | int ix; |
||
| 72 | sscanf (hex,"%x",&ix); |
||
| 73 | //printf("0x%s\t",hex); |
||
| 74 | return (ix/65535.)*1050.-200.; |
||
| 75 | } |
||
| 76 | |||
| 77 | // Transform local time to timestamp |
||
| 78 | int GetTimeStamp(int *intime) |
||
| 79 | { |
||
| 80 | time_t rawtime; |
||
| 81 | struct tm * timeinfo; |
||
| 82 | time(&rawtime); |
||
| 83 | timeinfo = localtime(&rawtime); |
||
| 84 | |||
| 85 | if(DBGSIG) |
||
| 86 | printf("%d.%d.%d, %d:%d:%d\n", intime[0], intime[1], intime[2], intime[3], intime[4], intime[5]); |
||
| 87 | |||
| 88 | timeinfo->tm_mday = intime[0]; |
||
| 89 | timeinfo->tm_mon = intime[1] - 1; |
||
| 90 | timeinfo->tm_year = intime[2] - 1900; |
||
| 91 | timeinfo->tm_hour = intime[3]; |
||
| 92 | timeinfo->tm_min = intime[4]; |
||
| 93 | timeinfo->tm_sec = intime[5]; |
||
| 94 | |||
| 95 | return (int)mktime(timeinfo); |
||
| 96 | } |
||
| 97 | |||
| 98 | // Get data from MYSQL database |
||
| 99 | void TGAppMainFrame::fieldpoint(int *timerange, int selch) |
||
| 100 | { |
||
| 101 | char humantime[256]; |
||
| 102 | |||
| 103 | // Display selected timestamps |
||
| 104 | GetTime(timerange[0], humantime); |
||
| 105 | printf("Minimum time set to: %s (%d)\n", humantime, timerange[0]); |
||
| 106 | if(timerange[1] != -1) |
||
| 107 | { |
||
| 108 | GetTime(timerange[1], humantime); |
||
| 109 | printf("Maximum time set to: %s (%d)\n", humantime, timerange[1]); |
||
| 110 | } |
||
| 111 | printf("Selected fieldpoint channel: %d\n", selch); |
||
| 112 | printf("\n"); |
||
| 113 | |||
| 114 | // Database settings |
||
| 115 | TSQLServer *db = TSQLServer::Connect(dbname, username, userpass); |
||
| 116 | printf("Server info: %s\n", db->ServerInfo()); |
||
| 117 | TSQLRow *row; |
||
| 118 | TSQLResult *res; |
||
| 119 | |||
| 120 | if(DBGSIG) |
||
| 121 | { |
||
| 122 | // list databases available on server |
||
| 123 | printf("\nList all databases on server %s\n", db->GetHost()); |
||
| 124 | res = db->GetDataBases(); |
||
| 125 | while ((row = res->Next())) { |
||
| 126 | printf("%s\n", row->GetField(0)); |
||
| 127 | delete row; |
||
| 128 | } |
||
| 129 | delete res; |
||
| 130 | |||
| 131 | // list tables in database "test" (the permission tables) |
||
| 132 | printf("\nList all tables in database \"f9phdet\" on server %s\n", db->GetHost()); |
||
| 133 | res = db->GetTables("f9phdet"); |
||
| 134 | while ((row = res->Next())) { |
||
| 135 | printf("%s\n", row->GetField(0)); |
||
| 136 | delete row; |
||
| 137 | } |
||
| 138 | delete res; |
||
| 139 | |||
| 140 | // list columns in table "runcatalog" in database "mysql" |
||
| 141 | printf("\nList all columns in table \"f9phdet\" in database \"f9rtd122\" on server %s\n", db->GetHost()); |
||
| 142 | res = db->GetColumns("f9phdet", "fprtd122"); |
||
| 143 | while ((row = res->Next())) { |
||
| 144 | printf("%s\n", row->GetField(0)); |
||
| 145 | delete row; |
||
| 146 | } |
||
| 147 | delete res; |
||
| 148 | } |
||
| 149 | |||
| 150 | // query database and print results |
||
| 151 | char sql[1000] = "SELECT status,data,timestamp FROM fprtd122 WHERE status='A272727272727272748' AND substring(data,1,4)='A00C' "; |
||
| 152 | if(timerange[1] == -1) |
||
| 153 | sprintf(sql,"%s AND timestamp>='%d'", sql, timerange[0]); |
||
| 154 | else |
||
| 155 | sprintf(sql,"%s AND timestamp>='%d' AND timestamp<='%d'", sql, timerange[0], timerange[1]); |
||
| 156 | if(DBGSIG) |
||
| 157 | printf("%s\n",sql); |
||
| 158 | |||
| 159 | res = db->Query(sql); |
||
| 160 | |||
| 161 | int nrows = res->GetRowCount(); |
||
| 162 | printf("\nGot %d rows in result\n", nrows); |
||
| 163 | |||
| 164 | // Printing and plotting |
||
| 165 | char timeval[256]; |
||
| 166 | TGraph *gr; |
||
| 167 | double *x, *y; |
||
| 168 | double firsttime, lasttime; |
||
| 169 | |||
| 170 | gr = new TGraph(nrows); |
||
| 171 | gr->SetLineColor(kRed); |
||
| 172 | gr->SetLineWidth(1); |
||
| 173 | gr->SetMarkerColor(kBlack); |
||
| 174 | gr->SetMarkerSize(0.8); |
||
| 175 | gr->SetMarkerStyle(20); |
||
| 176 | gr->SetTitle("Temperature sensor;Time;Temperature (deg.)"); |
||
| 177 | |||
| 178 | FILE *fp; |
||
| 179 | fp = fopen("./fieldpoint/dataout_fieldpoint.txt", "w"); |
||
| 180 | |||
| 181 | if(DBGSIG) |
||
| 182 | printf("Time\tTemperature\n"); |
||
| 183 | for (int i = 0; i < nrows; i++) { |
||
| 184 | row = res->Next(); |
||
| 185 | |||
| 186 | GetTime((int)atof(row->GetField(2))-TIMEOFF, timeval); |
||
| 187 | x = new double; |
||
| 188 | y = new double; |
||
| 189 | |||
| 190 | *x = atof(row->GetField(2))-TIMEOFF; |
||
| 191 | *y = GetTemperature(selch,row->GetField(1)); |
||
| 192 | gr->SetPoint(i,*x,*y); |
||
| 193 | |||
| 194 | if(i == 0) firsttime = *x; |
||
| 195 | else if(i == nrows-1) lasttime = *x; |
||
| 196 | |||
| 197 | if(datSettings->GetSelected() == 0) |
||
| 198 | { |
||
| 199 | fprintf(fp, "%s\t%d\t%f\n",timeval,(int)*x,*y); |
||
| 200 | if(DBGSIG) |
||
| 201 | printf("%s\t%d\t%f\n",timeval,(int)*x,*y); |
||
| 202 | } |
||
| 203 | else if(datSettings->GetSelected() == 1) |
||
| 204 | { |
||
| 205 | fprintf(fp, "%s\t%f\n",timeval,*y); |
||
| 206 | if(DBGSIG) |
||
| 207 | printf("%s\t%f\n",timeval,*y); |
||
| 208 | } |
||
| 209 | else if(datSettings->GetSelected() == 2) |
||
| 210 | { |
||
| 211 | fprintf(fp, "%d\t%f\n",(int)*x,*y); |
||
| 212 | if(DBGSIG) |
||
| 213 | printf("%d\t%f\n",(int)*x,*y); |
||
| 214 | } |
||
| 215 | |||
| 216 | delete x; |
||
| 217 | delete y; |
||
| 218 | |||
| 219 | delete row; |
||
| 220 | } |
||
| 221 | |||
| 222 | fclose(fp); |
||
| 223 | |||
| 224 | delete res; |
||
| 225 | delete db; |
||
| 226 | |||
| 227 | TCanvas *gCanvas = displayCanvas->GetCanvas(); |
||
| 228 | gCanvas->SetGrid(); |
||
| 229 | gr->GetXaxis()->SetTimeDisplay(1); |
||
| 230 | gr->GetXaxis()->SetTimeFormat("%H:%M, %d.%m."); |
||
| 231 | gr->GetXaxis()->SetTimeOffset(0); |
||
| 232 | gr->GetXaxis()->SetLabelSize(0.027); |
||
| 233 | gr->GetXaxis()->SetLabelOffset(0.015); |
||
| 234 | gr->GetXaxis()->SetTitleSize(0.038); |
||
| 235 | gr->GetXaxis()->SetTitleOffset(1.2); |
||
| 236 | gr->GetYaxis()->SetLabelSize(0.027); |
||
| 237 | gr->GetYaxis()->SetTitleSize(0.038); |
||
| 238 | gr->GetXaxis()->SetNdivisions(-507); |
||
| 239 | gr->GetXaxis()->SetRange(firsttime,lasttime); |
||
| 240 | gr->GetXaxis()->SetRangeUser(firsttime,lasttime); |
||
| 241 | gr->Draw("APL"); |
||
| 242 | |||
| 243 | gCanvas->Modified(); |
||
| 244 | gCanvas->Update(); |
||
| 245 | } |
||
| 246 | |||
| 247 | // Update the temperature plot |
||
| 248 | void TGAppMainFrame::UpdateTempPlot() |
||
| 249 | { |
||
| 250 | int stime[6]; |
||
| 251 | int etime[6]; |
||
| 252 | |||
| 253 | int timestamp[2]; |
||
| 254 | |||
| 255 | time_t rtime; |
||
| 256 | int curyear; |
||
| 257 | time(&rtime); |
||
| 258 | curyear = (int)(localtime(&rtime))->tm_year+1900; |
||
| 259 | |||
| 260 | int leapy = 0; |
||
| 261 | |||
| 262 | // Getting the start time |
||
| 263 | stime[0] = (int)(tempDay[0]->GetSelected())+1; |
||
| 264 | stime[2] = curyear - (int)(tempYear[0]->GetSelected()); |
||
| 265 | if(DBGSIG) |
||
| 266 | printf("%d, %d, %d\n", stime[2], curyear, (int)(tempYear[0]->GetSelected())); |
||
| 267 | stime[3] = (int)(tempHour[0]->GetSelected()); |
||
| 268 | stime[4] = (int)(tempMinute[0]->GetSelected()); |
||
| 269 | stime[5] = (int)(tempSecond[0]->GetSelected()); |
||
| 270 | |||
| 271 | switch( tempMonth[0]->GetSelected() ) |
||
| 272 | { |
||
| 273 | case 0: |
||
| 274 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 275 | break; |
||
| 276 | case 1: |
||
| 277 | if( stime[2]%4 == 0) |
||
| 278 | leapy = 1; |
||
| 279 | |||
| 280 | if( (leapy == 1) && (stime[0] > 29) ) |
||
| 281 | { |
||
| 282 | stime[0] = 29; |
||
| 283 | tempDay[0]->Select(28); |
||
| 284 | } |
||
| 285 | else if( (leapy == 0) && (stime[0] > 28) ) |
||
| 286 | { |
||
| 287 | stime[0] = 28; |
||
| 288 | tempDay[0]->Select(27); |
||
| 289 | } |
||
| 290 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 291 | break; |
||
| 292 | case 2: |
||
| 293 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 294 | break; |
||
| 295 | case 3: |
||
| 296 | if(stime[0] > 30) |
||
| 297 | { |
||
| 298 | stime[0] = 30; |
||
| 299 | tempDay[0]->Select(29); |
||
| 300 | } |
||
| 301 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 302 | break; |
||
| 303 | case 4: |
||
| 304 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 305 | break; |
||
| 306 | case 5: |
||
| 307 | if(stime[0] > 30) |
||
| 308 | { |
||
| 309 | stime[0] = 30; |
||
| 310 | tempDay[0]->Select(29); |
||
| 311 | } |
||
| 312 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 313 | break; |
||
| 314 | case 6: |
||
| 315 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 316 | break; |
||
| 317 | case 7: |
||
| 318 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 319 | break; |
||
| 320 | case 8: |
||
| 321 | if(stime[0] > 30) |
||
| 322 | { |
||
| 323 | stime[0] = 30; |
||
| 324 | tempDay[0]->Select(29); |
||
| 325 | } |
||
| 326 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 327 | break; |
||
| 328 | case 9: |
||
| 329 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 330 | break; |
||
| 331 | case 10: |
||
| 332 | if(stime[0] > 30) |
||
| 333 | { |
||
| 334 | stime[0] = 30; |
||
| 335 | tempDay[0]->Select(29); |
||
| 336 | } |
||
| 337 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 338 | break; |
||
| 339 | case 11: |
||
| 340 | stime[1] = (int)(tempMonth[0]->GetSelected())+1; |
||
| 341 | break; |
||
| 342 | default: |
||
| 343 | break; |
||
| 344 | } |
||
| 345 | |||
| 346 | timestamp[0] = GetTimeStamp(stime); |
||
| 347 | if(DBGSIG) |
||
| 348 | printf("Start time: %d\n", timestamp[0]); |
||
| 349 | |||
| 350 | // Getting the end time |
||
| 351 | etime[0] = (int)(tempDay[1]->GetSelected())+1; |
||
| 352 | etime[2] = curyear - (int)(tempYear[1]->GetSelected()); |
||
| 353 | etime[3] = (int)(tempHour[1]->GetSelected()); |
||
| 354 | etime[4] = (int)(tempMinute[1]->GetSelected()); |
||
| 355 | etime[5] = (int)(tempSecond[1]->GetSelected()); |
||
| 356 | |||
| 357 | switch( tempMonth[1]->GetSelected() ) |
||
| 358 | { |
||
| 359 | case 0: |
||
| 360 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 361 | break; |
||
| 362 | case 1: |
||
| 363 | if( etime[2]%4 == 0) |
||
| 364 | leapy = 1; |
||
| 365 | |||
| 366 | if( (leapy == 1) && (etime[0] > 29) ) |
||
| 367 | { |
||
| 368 | etime[0] = 29; |
||
| 369 | tempDay[1]->Select(28); |
||
| 370 | } |
||
| 371 | else if( (leapy == 0) && (etime[0] > 28) ) |
||
| 372 | { |
||
| 373 | etime[0] = 28; |
||
| 374 | tempDay[1]->Select(27); |
||
| 375 | } |
||
| 376 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 377 | break; |
||
| 378 | case 2: |
||
| 379 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 380 | break; |
||
| 381 | case 3: |
||
| 382 | if(etime[0] > 30) |
||
| 383 | { |
||
| 384 | etime[0] = 30; |
||
| 385 | tempDay[1]->Select(29); |
||
| 386 | } |
||
| 387 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 388 | break; |
||
| 389 | case 4: |
||
| 390 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 391 | break; |
||
| 392 | case 5: |
||
| 393 | if(etime[0] > 30) |
||
| 394 | { |
||
| 395 | etime[0] = 30; |
||
| 396 | tempDay[1]->Select(29); |
||
| 397 | } |
||
| 398 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 399 | break; |
||
| 400 | case 6: |
||
| 401 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 402 | break; |
||
| 403 | case 7: |
||
| 404 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 405 | break; |
||
| 406 | case 8: |
||
| 407 | if(etime[0] > 30) |
||
| 408 | { |
||
| 409 | etime[0] = 30; |
||
| 410 | tempDay[1]->Select(29); |
||
| 411 | } |
||
| 412 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 413 | break; |
||
| 414 | case 9: |
||
| 415 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 416 | break; |
||
| 417 | case 10: |
||
| 418 | if(etime[0] > 30) |
||
| 419 | { |
||
| 420 | etime[0] = 30; |
||
| 421 | tempDay[1]->Select(29); |
||
| 422 | } |
||
| 423 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 424 | break; |
||
| 425 | case 11: |
||
| 426 | etime[1] = (int)(tempMonth[1]->GetSelected())+1; |
||
| 427 | break; |
||
| 428 | default: |
||
| 429 | break; |
||
| 430 | } |
||
| 431 | |||
| 432 | if( tempEndOn->IsDown() ) |
||
| 433 | timestamp[1] = -1; |
||
| 434 | else |
||
| 435 | timestamp[1] = GetTimeStamp(etime); |
||
| 436 | if(DBGSIG) |
||
| 437 | printf("End time: %d\n", timestamp[1]); |
||
| 438 | |||
| 439 | fieldpoint(timestamp, tempCh->GetSelected()); |
||
| 440 | } |
||
| 441 | |||
| 442 | // Export the temperature plot to pdf |
||
| 443 | void TGAppMainFrame::ExportTempPlot() |
||
| 444 | { |
||
| 445 | TCanvas *gCanvas = displayCanvas->GetCanvas(); |
||
| 446 | gCanvas->Modified(); |
||
| 447 | gCanvas->Update(); |
||
| 448 | gCanvas->SaveAs("./fieldpoint/plotout_fieldpoint.pdf"); |
||
| 449 | } |
||
| 450 | |||
| 451 | // Toggle the endtime settings for temperature sensor |
||
| 452 | void TGAppMainFrame::TempEndToggle() |
||
| 453 | { |
||
| 454 | if( tempEndOn->IsDown() ) |
||
| 455 | { |
||
| 456 | tempDay[1]->SetEnabled(kFALSE); |
||
| 457 | tempMonth[1]->SetEnabled(kFALSE); |
||
| 458 | tempYear[1]->SetEnabled(kFALSE); |
||
| 459 | tempHour[1]->SetEnabled(kFALSE); |
||
| 460 | tempMinute[1]->SetEnabled(kFALSE); |
||
| 461 | tempSecond[1]->SetEnabled(kFALSE); |
||
| 462 | } |
||
| 463 | else |
||
| 464 | { |
||
| 465 | tempDay[1]->SetEnabled(kTRUE); |
||
| 466 | tempMonth[1]->SetEnabled(kTRUE); |
||
| 467 | tempYear[1]->SetEnabled(kTRUE); |
||
| 468 | tempHour[1]->SetEnabled(kTRUE); |
||
| 469 | tempMinute[1]->SetEnabled(kTRUE); |
||
| 470 | tempSecond[1]->SetEnabled(kTRUE); |
||
| 471 | } |
||
| 472 | } |
||
| 473 | |||
| 474 | // -------------------------------------------------------------- |
||
| 475 | |||
| 476 | // Setting the application layout ------------------------------------ |
||
| 477 | |||
| 478 | void TGAppMainFrame::AppLayout() |
||
| 479 | { |
||
| 480 | // Fieldpoint window ------------------------ |
||
| 481 | |||
| 482 | TGLayoutHints *f0 = new TGLayoutHints(kLHintsLeft | kLHintsTop,2,2,2,2); |
||
| 483 | TGLayoutHints *f0centerx = new TGLayoutHints(kLHintsCenterX,2,2,2,2); |
||
| 484 | TGLayoutHints *f0centery = new TGLayoutHints(kLHintsLeft | kLHintsCenterY,2,2,2,2); |
||
| 485 | TGLayoutHints *f1 = new TGLayoutHints(kLHintsExpandX | kLHintsExpandY,2,2,2,2); |
||
| 486 | TGLayoutHints *f2 = new TGLayoutHints(kLHintsExpandX,2,2,2,2); |
||
| 487 | |||
| 488 | TGHorizontalFrame *fH1, *fH2; |
||
| 489 | TGGroupFrame *fG1; |
||
| 490 | TGLabel *lab; |
||
| 491 | |||
| 492 | time_t rtime; |
||
| 493 | int yearrange[2]; |
||
| 494 | int subwin[2]; |
||
| 495 | char ctemp[256]; |
||
| 496 | |||
| 497 | subwin[0] = winWidth-10; |
||
| 498 | subwin[1] = 6.6*winHeight/12; |
||
| 499 | |||
| 500 | // Display canvas for temperature sensor |
||
| 501 | displayCanvas = new TRootEmbeddedCanvas("displayCanvas",fMain,subwin[0],subwin[1]); |
||
| 502 | fMain->AddFrame(displayCanvas, f0centerx); |
||
| 503 | TCanvas *gCanvas = displayCanvas->GetCanvas(); |
||
| 504 | gCanvas->SetGridx(); |
||
| 505 | gCanvas->SetGridy(); |
||
| 506 | |||
| 507 | fG1 = new TGGroupFrame(fMain, "Temperature sensor settings"); |
||
| 508 | // Channel selector |
||
| 509 | fH1 = new TGHorizontalFrame(fG1, subwin[0], 30); |
||
| 510 | lab = new TGLabel(fH1, "Fieldpoint channel:"); |
||
| 511 | fH1->AddFrame(lab, f0centery); |
||
| 512 | tempCh = new TGComboBox(fH1, 200); |
||
| 513 | tempCh->AddEntry("0", 0); |
||
| 514 | tempCh->AddEntry("1", 1); |
||
| 515 | tempCh->AddEntry("2", 2); |
||
| 516 | tempCh->AddEntry("3", 3); |
||
| 517 | tempCh->AddEntry("4", 4); |
||
| 518 | tempCh->AddEntry("5", 5); |
||
| 519 | tempCh->AddEntry("6", 6); |
||
| 520 | tempCh->AddEntry("7", 7); |
||
| 521 | tempCh->Resize(50,22); |
||
| 522 | tempCh->Select(1); |
||
| 523 | fH1->AddFrame(tempCh, f0centery); |
||
| 524 | fG1->AddFrame(fH1, f2); |
||
| 525 | |||
| 526 | // Start and stop time ------------------------ |
||
| 527 | time(&rtime); |
||
| 528 | |||
| 529 | lab = new TGLabel(fG1, "Start time:"); |
||
| 530 | fG1->AddFrame(lab, f0); |
||
| 531 | fH1 = new TGHorizontalFrame(fG1, subwin[0], 30); |
||
| 532 | // Start day |
||
| 533 | lab = new TGLabel(fH1, "\tDay: "); |
||
| 534 | fH1->AddFrame(lab, f0centery); |
||
| 535 | tempDay[0] = new TGComboBox(fH1, 200); |
||
| 536 | for(int i = 0; i < 31; i++) |
||
| 537 | { |
||
| 538 | sprintf(ctemp, "%d", i+1); |
||
| 539 | tempDay[0]->AddEntry(ctemp, i); |
||
| 540 | } |
||
| 541 | tempDay[0]->Resize(50,22); |
||
| 542 | tempDay[0]->Select((int)(localtime(&rtime))->tm_mday-1); |
||
| 543 | fH1->AddFrame(tempDay[0], f0centery); |
||
| 544 | |||
| 545 | // Start month |
||
| 546 | lab = new TGLabel(fH1, " Month: "); |
||
| 547 | fH1->AddFrame(lab, f0centery); |
||
| 548 | tempMonth[0] = new TGComboBox(fH1, 200); |
||
| 549 | tempMonth[0]->AddEntry("January", 0); |
||
| 550 | tempMonth[0]->AddEntry("February", 1); |
||
| 551 | tempMonth[0]->AddEntry("March", 2); |
||
| 552 | tempMonth[0]->AddEntry("April", 3); |
||
| 553 | tempMonth[0]->AddEntry("May", 4); |
||
| 554 | tempMonth[0]->AddEntry("June", 5); |
||
| 555 | tempMonth[0]->AddEntry("July", 6); |
||
| 556 | tempMonth[0]->AddEntry("August", 7); |
||
| 557 | tempMonth[0]->AddEntry("September", 8); |
||
| 558 | tempMonth[0]->AddEntry("October", 9); |
||
| 559 | tempMonth[0]->AddEntry("November", 10); |
||
| 560 | tempMonth[0]->AddEntry("December", 11); |
||
| 561 | tempMonth[0]->Resize(80,22); |
||
| 562 | tempMonth[0]->Select((int)(localtime(&rtime))->tm_mon); |
||
| 563 | fH1->AddFrame(tempMonth[0], f0centery); |
||
| 564 | |||
| 565 | // Start year |
||
| 566 | yearrange[0] = 2010; |
||
| 567 | yearrange[1] = (int)(localtime(&rtime))->tm_year+1900; |
||
| 568 | |||
| 569 | lab = new TGLabel(fH1, " Year: "); |
||
| 570 | fH1->AddFrame(lab, f0centery); |
||
| 571 | tempYear[0] = new TGComboBox(fH1, 200); |
||
| 572 | for(int i = 0; i < (yearrange[1]-yearrange[0])+1; i++) |
||
| 573 | { |
||
| 574 | sprintf(ctemp, "%d", yearrange[1]-i); |
||
| 575 | tempYear[0]->AddEntry(ctemp, i); |
||
| 576 | } |
||
| 577 | tempYear[0]->Resize(60,22); |
||
| 578 | tempYear[0]->Select(0); |
||
| 579 | fH1->AddFrame(tempYear[0], f0centery); |
||
| 580 | |||
| 581 | // Start hour |
||
| 582 | lab = new TGLabel(fH1, " Hour: "); |
||
| 583 | fH1->AddFrame(lab, f0centery); |
||
| 584 | tempHour[0] = new TGComboBox(fH1, 200); |
||
| 585 | for(int i = 0; i < 24; i++) |
||
| 586 | { |
||
| 587 | if(i < 10) |
||
| 588 | sprintf(ctemp, "0%d", i); |
||
| 589 | else |
||
| 590 | sprintf(ctemp, "%d", i); |
||
| 591 | tempHour[0]->AddEntry(ctemp, i); |
||
| 592 | } |
||
| 593 | tempHour[0]->Resize(50,22); |
||
| 594 | tempHour[0]->Select(7); |
||
| 595 | fH1->AddFrame(tempHour[0], f0centery); |
||
| 596 | |||
| 597 | // Start minute |
||
| 598 | lab = new TGLabel(fH1, " Minute: "); |
||
| 599 | fH1->AddFrame(lab, f0centery); |
||
| 600 | tempMinute[0] = new TGComboBox(fH1, 200); |
||
| 601 | for(int i = 0; i < 60; i++) |
||
| 602 | { |
||
| 603 | if(i < 10) |
||
| 604 | sprintf(ctemp, "0%d", i); |
||
| 605 | else |
||
| 606 | sprintf(ctemp, "%d", i); |
||
| 607 | tempMinute[0]->AddEntry(ctemp, i); |
||
| 608 | } |
||
| 609 | tempMinute[0]->Resize(50,22); |
||
| 610 | tempMinute[0]->Select(0); |
||
| 611 | fH1->AddFrame(tempMinute[0], f0centery); |
||
| 612 | |||
| 613 | // Start second |
||
| 614 | lab = new TGLabel(fH1, " Second: "); |
||
| 615 | fH1->AddFrame(lab, f0centery); |
||
| 616 | tempSecond[0] = new TGComboBox(fH1, 200); |
||
| 617 | for(int i = 0; i < 60; i++) |
||
| 618 | { |
||
| 619 | if(i < 10) |
||
| 620 | sprintf(ctemp, "0%d", i); |
||
| 621 | else |
||
| 622 | sprintf(ctemp, "%d", i); |
||
| 623 | tempSecond[0]->AddEntry(ctemp, i); |
||
| 624 | } |
||
| 625 | tempSecond[0]->Resize(50,22); |
||
| 626 | tempSecond[0]->Select(0); |
||
| 627 | fH1->AddFrame(tempSecond[0], f0centery); |
||
| 628 | |||
| 629 | fG1->AddFrame(fH1, f2); |
||
| 630 | |||
| 631 | // Use the end time or not |
||
| 632 | tempEndOn = new TGCheckButton(fG1, "Draw to last time point (ON/OFF)"); |
||
| 633 | tempEndOn->Resize(100,22); |
||
| 634 | tempEndOn->SetState(kButtonUp); |
||
| 635 | fG1->AddFrame(tempEndOn, f0); |
||
| 636 | |||
| 637 | lab = new TGLabel(fG1, "End time:"); |
||
| 638 | fG1->AddFrame(lab, f0); |
||
| 639 | fH1 = new TGHorizontalFrame(fG1, subwin[0], 30); |
||
| 640 | // End day |
||
| 641 | lab = new TGLabel(fH1, "\tDay: "); |
||
| 642 | fH1->AddFrame(lab, f0centery); |
||
| 643 | tempDay[1] = new TGComboBox(fH1, 200); |
||
| 644 | for(int i = 0; i < 31; i++) |
||
| 645 | { |
||
| 646 | sprintf(ctemp, "%d", i+1); |
||
| 647 | tempDay[1]->AddEntry(ctemp, i); |
||
| 648 | } |
||
| 649 | tempDay[1]->Resize(50,22); |
||
| 650 | tempDay[1]->Select((int)(localtime(&rtime))->tm_mday-1); |
||
| 651 | fH1->AddFrame(tempDay[1], f0centery); |
||
| 652 | |||
| 653 | // End month |
||
| 654 | lab = new TGLabel(fH1, " Month: "); |
||
| 655 | fH1->AddFrame(lab, f0centery); |
||
| 656 | tempMonth[1] = new TGComboBox(fH1, 200); |
||
| 657 | tempMonth[1]->AddEntry("January", 0); |
||
| 658 | tempMonth[1]->AddEntry("February", 1); |
||
| 659 | tempMonth[1]->AddEntry("March", 2); |
||
| 660 | tempMonth[1]->AddEntry("April", 3); |
||
| 661 | tempMonth[1]->AddEntry("May", 4); |
||
| 662 | tempMonth[1]->AddEntry("June", 5); |
||
| 663 | tempMonth[1]->AddEntry("July", 6); |
||
| 664 | tempMonth[1]->AddEntry("August", 7); |
||
| 665 | tempMonth[1]->AddEntry("September", 8); |
||
| 666 | tempMonth[1]->AddEntry("October", 9); |
||
| 667 | tempMonth[1]->AddEntry("November", 10); |
||
| 668 | tempMonth[1]->AddEntry("December", 11); |
||
| 669 | tempMonth[1]->Resize(80,22); |
||
| 670 | tempMonth[1]->Select((int)(localtime(&rtime))->tm_mon); |
||
| 671 | fH1->AddFrame(tempMonth[1], f0centery); |
||
| 672 | |||
| 673 | // End year |
||
| 674 | time(&rtime); |
||
| 675 | yearrange[0] = 2010; |
||
| 676 | yearrange[1] = (int)(localtime(&rtime))->tm_year+1900; |
||
| 677 | |||
| 678 | lab = new TGLabel(fH1, " Year: "); |
||
| 679 | fH1->AddFrame(lab, f0centery); |
||
| 680 | tempYear[1] = new TGComboBox(fH1, 200); |
||
| 681 | for(int i = 0; i < (yearrange[1]-yearrange[0])+1; i++) |
||
| 682 | { |
||
| 683 | sprintf(ctemp, "%d", yearrange[1]-i); |
||
| 684 | tempYear[1]->AddEntry(ctemp, i); |
||
| 685 | } |
||
| 686 | tempYear[1]->Resize(60,22); |
||
| 687 | tempYear[1]->Select(0); |
||
| 688 | fH1->AddFrame(tempYear[1], f0centery); |
||
| 689 | |||
| 690 | // End hour |
||
| 691 | lab = new TGLabel(fH1, " Hour: "); |
||
| 692 | fH1->AddFrame(lab, f0centery); |
||
| 693 | tempHour[1] = new TGComboBox(fH1, 200); |
||
| 694 | for(int i = 0; i < 24; i++) |
||
| 695 | { |
||
| 696 | if(i < 10) |
||
| 697 | sprintf(ctemp, "0%d", i); |
||
| 698 | else |
||
| 699 | sprintf(ctemp, "%d", i); |
||
| 700 | tempHour[1]->AddEntry(ctemp, i); |
||
| 701 | } |
||
| 702 | tempHour[1]->Resize(50,22); |
||
| 703 | tempHour[1]->Select(18); |
||
| 704 | fH1->AddFrame(tempHour[1], f0centery); |
||
| 705 | |||
| 706 | // End minute |
||
| 707 | lab = new TGLabel(fH1, " Minute: "); |
||
| 708 | fH1->AddFrame(lab, f0centery); |
||
| 709 | tempMinute[1] = new TGComboBox(fH1, 200); |
||
| 710 | for(int i = 0; i < 60; i++) |
||
| 711 | { |
||
| 712 | if(i < 10) |
||
| 713 | sprintf(ctemp, "0%d", i); |
||
| 714 | else |
||
| 715 | sprintf(ctemp, "%d", i); |
||
| 716 | tempMinute[1]->AddEntry(ctemp, i); |
||
| 717 | } |
||
| 718 | tempMinute[1]->Resize(50,22); |
||
| 719 | tempMinute[1]->Select(0); |
||
| 720 | fH1->AddFrame(tempMinute[1], f0centery); |
||
| 721 | |||
| 722 | // End second |
||
| 723 | lab = new TGLabel(fH1, " Second: "); |
||
| 724 | fH1->AddFrame(lab, f0centery); |
||
| 725 | tempSecond[1] = new TGComboBox(fH1, 200); |
||
| 726 | for(int i = 0; i < 60; i++) |
||
| 727 | { |
||
| 728 | if(i < 10) |
||
| 729 | sprintf(ctemp, "0%d", i); |
||
| 730 | else |
||
| 731 | sprintf(ctemp, "%d", i); |
||
| 732 | tempSecond[1]->AddEntry(ctemp, i); |
||
| 733 | } |
||
| 734 | tempSecond[1]->Resize(50,22); |
||
| 735 | tempSecond[1]->Select(0); |
||
| 736 | fH1->AddFrame(tempSecond[1], f0centery); |
||
| 737 | |||
| 738 | fG1->AddFrame(fH1, f2); |
||
| 739 | // Start and stop time ------------------------ |
||
| 740 | |||
| 741 | // Dataout settings |
||
| 742 | fH1 = new TGHorizontalFrame(fG1, subwin[0], 30); |
||
| 743 | lab = new TGLabel(fH1, "Output data settings: "); |
||
| 744 | fH1->AddFrame(lab, f0centery); |
||
| 745 | datSettings = new TGComboBox(fH1, 200); |
||
| 746 | datSettings->AddEntry("Export local time and UNIX timestamp", 0); |
||
| 747 | datSettings->AddEntry("Export only local time", 1); |
||
| 748 | datSettings->AddEntry("Export only UNIX timestamp", 2); |
||
| 749 | datSettings->Resize(300,22); |
||
| 750 | datSettings->Select(0); |
||
| 751 | fH1->AddFrame(datSettings, f0centery); |
||
| 752 | |||
| 753 | fG1->AddFrame(fH1, f2); |
||
| 754 | |||
| 755 | // Control buttons |
||
| 756 | fH2 = new TGHorizontalFrame(fG1, subwin[0], 30); |
||
| 757 | fH1 = new TGHorizontalFrame(fH2, subwin[0], 30); |
||
| 758 | updateTemp = new TGTextButton(fH1, "Update"); |
||
| 759 | updateTemp->SetTextJustify(36); |
||
| 760 | updateTemp->SetWrapLength(-1); |
||
| 761 | updateTemp->Resize(80,22); |
||
| 762 | fH1->AddFrame(updateTemp, f0); |
||
| 763 | |||
| 764 | exportTemp = new TGTextButton(fH1, "Export"); |
||
| 765 | exportTemp->SetTextJustify(36); |
||
| 766 | exportTemp->SetWrapLength(-1); |
||
| 767 | exportTemp->Resize(80,22); |
||
| 768 | fH1->AddFrame(exportTemp, f0); |
||
| 769 | |||
| 770 | closeTemp = new TGTextButton(fH1, "Close"); |
||
| 771 | closeTemp->SetTextJustify(36); |
||
| 772 | closeTemp->SetWrapLength(-1); |
||
| 773 | closeTemp->Resize(80,22); |
||
| 774 | fH1->AddFrame(closeTemp, f0); |
||
| 775 | fH2->AddFrame(fH1, f0centerx); |
||
| 776 | |||
| 777 | fG1->AddFrame(fH2, f2); |
||
| 778 | |||
| 779 | fMain->AddFrame(fG1, f1); |
||
| 780 | |||
| 781 | // Action connections |
||
| 782 | updateTemp->Connect("Clicked()", "TGAppMainFrame", this, "UpdateTempPlot()"); |
||
| 783 | tempEndOn->Connect("Clicked()", "TGAppMainFrame", this, "TempEndToggle()"); |
||
| 784 | exportTemp->Connect("Clicked()", "TGAppMainFrame", this, "ExportTempPlot()"); |
||
| 785 | closeTemp->Connect("Clicked()", "TGAppMainFrame", this, "CloseWindow()"); |
||
| 786 | |||
| 787 | // Fieldpoint window ------------------------ |
||
| 788 | |||
| 789 | } |
||
| 790 | |||
| 791 | // ------------------------------------------------------------------- |
||
| 792 | |||
| 793 | // Main function ----------------------------------------------------- |
||
| 794 | |||
| 795 | void root_app() |
||
| 796 | { |
||
| 797 | new TGAppMainFrame(gClient->GetRoot(), winWidth, winHeight); |
||
| 798 | } |
||
| 799 | |||
| 800 | int main(int argc, char **argv) |
||
| 801 | { |
||
| 802 | TApplication theApp("TGAppMainFrame", &argc, argv); |
||
| 803 | root_app(); |
||
| 804 | theApp.Run(); |
||
| 805 | |||
| 806 | return 0; |
||
| 807 | } |
||
| 808 | |||
| 809 | // ------------------------------------------------------------------- |