00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <stdio.h>
00024 #include <stdlib.h>
00025 #include <string.h>
00026 #include <math.h>
00027 #include <time.h>
00028 #include <signal.h>
00029 #include <sys/types.h>
00030 #include <gtk/gtk.h>
00031 #include <gdk/gdkrgb.h>
00032
00033 #include "GUILofar.hh"
00034
00035
00036 G_LOCK_DEFINE_STATIC(gmInputMutex);
00037
00038 static const char *cpWindowTxt = "LOFAR / DEMON";
00039
00040 static const char *cpLServerTxt = "Server";
00041 static const char *cpaLChannelTxt[] = { "Channel", "Direction" };
00042 static const char *cpBConnectTxt = "Connect";
00043 static const char *cpBDisconnectTxt = "Disconnect";
00044 static const char *cpCBFreezeTxt = "Freeze";
00045
00046 static const char *cpLTypeTxt = "Type";
00047 static const char *cpaLTypeMenu[] = { "FFT", "Cepstrum", "Autocorr." };
00048 static const char *cpLWindowTxt = "Window";
00049 static const char *cpaLWindowMenu[] = { "Rectangle", "Bartlett",
00050 "Blackman", "Blackman-Harris", "Cosine tapered", "Exponential",
00051 "Flat-top", "Hamming", "Hanning", "Kaiser", "Kaiser-Bessel", "Tukey" };
00052 static const char *cpLWinParamTxt = "Window param.";
00053 static const char *cpLWinLengthTxt = "Window length";
00054 static const char *cpaLWinLengthMenu[] = { "1024", "2048", "4096", "8192",
00055 "16384", "32768", "65536" };
00056 static const char *cpLLowerFreqTxt = "Lower freq.";
00057 static const char *cpLHigherFreqTxt = "Higher freq.";
00058 static const char *cpLOverlapTxt = "Overlap %";
00059
00060 static const char *cpLRemoveNoiseTxt = "Remove noise";
00061 static const char *cpaLRemoveNoiseMenu[] = { "None", "TPSW", "OTA",
00062 "Diff", "InvDiff", "StdDev" };
00063 static const char *cpLAlphaTxt = "Alpha";
00064 static const char *cpLMeanLengthTxt = "Mean length";
00065 static const char *cpLGapLengthTxt = "Gap length";
00066 static const char *cpLAverageCountTxt = "Average count";
00067 static const char *cpLClipTxt = "Clip";
00068 static const char *cpaLClipMenu[] = { "None", "Low", "Both", "Mean" ,
00069 "Median", "10 dB", "20 dB", "50%", "75%", "Offset", "Offset 2",
00070 "Offset 3", "Sliding" };
00071 static const char *cpCBLinearTxt = "Linear";
00072 static const char *cpCBDemonTxt = "DEMON";
00073 static const char *cpLPaletteTxt = "Palette";
00074 static const char *cpaLPaletteMenu[] = { "BW", "HSV", "Light", "Temp",
00075 "Dir", "Green", "Green2", "Green3", "Green4", "PureGreen", "WB" };
00076 static const char *cpCBAverageTxt = "ContAvg";
00077 static const char *cpCBSavingTxt = "Saving";
00078 static const char *cpBSaveTxt = "Save";
00079 static const char *cpFSSaveTxt = "Save to TIFF file";
00080
00081 static const char *cpLClipValueTxt = "Clip value";
00082
00083 clGUILofar *GUILofar;
00084
00085
00086 int main(int argc, char *argv[])
00087 {
00088 int iRetVal;
00089
00090 signal(SIGPIPE, SIG_IGN);
00091 signal(SIGFPE, SIG_IGN);
00092 GUILofar = new clGUILofar(&argc, &argv);
00093 iRetVal = GUILofar->Exec();
00094 delete GUILofar;
00095 return iRetVal;
00096 }
00097
00098
00099 gint WrapOnDelete (GtkWidget *gwSender, GdkEventAny *geaEvent)
00100 {
00101 return GUILofar->OnDelete(gwSender, geaEvent);
00102 }
00103
00104
00105 void WrapOnHideToggled (GtkToggleButton *gtbSender, gpointer gpData)
00106 {
00107 GUILofar->OnHideToggled(gtbSender, gpData);
00108 }
00109
00110
00111 gint WrapOnConnectClick (GtkWidget *gwSender, gpointer gpData)
00112 {
00113 return GUILofar->OnConnectClick(gwSender, gpData);
00114 }
00115
00116
00117 void WrapOnFreezeToggled (GtkToggleButton *gtbSender, gpointer gpData)
00118 {
00119 GUILofar->OnFreezeToggled(gtbSender, gpData);
00120 }
00121
00122
00123 gint WrapOnExposeLofar (GtkWidget *gwSender, GdkEventExpose *geeEvent,
00124 gpointer gpData)
00125 {
00126 return GUILofar->OnExposeLofar(gwSender, geeEvent, gpData);
00127 }
00128
00129
00130 gint WrapOnConfigureLofar (GtkWidget *gwSender, GdkEventConfigure *gecEvent,
00131 gpointer gpData)
00132 {
00133 return GUILofar->OnConfigureLofar(gwSender, gecEvent, gpData);
00134 }
00135
00136
00137 gint WrapOnExposeLine (GtkWidget *gwSender, GdkEventExpose *geeEvent,
00138 gpointer gpData)
00139 {
00140 return GUILofar->OnExposeLine(gwSender, geeEvent, gpData);
00141 }
00142
00143
00144 gint WrapOnExposeCursor (GtkWidget *gwSender, GdkEventExpose *geeEvent,
00145 gpointer gpData)
00146 {
00147 return GUILofar->OnExposeCursor(gwSender, geeEvent, gpData);
00148 }
00149
00150
00151 gint WrapOnMotionLofar (GtkWidget *gwSender, GdkEventMotion *gemEvent,
00152 gpointer gpData)
00153 {
00154 return GUILofar->OnMotionLofar(gwSender, gemEvent, gpData);
00155 }
00156
00157
00158 gint WrapOnPaletteActivate (GtkWidget *gwSender, gpointer gpData)
00159 {
00160 return GUILofar->OnPaletteActivate(gwSender, gpData);
00161 }
00162
00163
00164 void WrapOnAverageToggled (GtkToggleButton *gtbSender, gpointer gpData)
00165 {
00166 GUILofar->OnAverageToggled(gtbSender, gpData);
00167 }
00168
00169
00170 void WrapOnClipValueChanged (GtkAdjustment *gaSender, gpointer gpData)
00171 {
00172 GUILofar->OnClipValueChanged(gaSender, gpData);
00173 }
00174
00175
00176 void WrapOnSaveClicks (GtkWidget *gwSender, gpointer gpData)
00177 {
00178 GUILofar->OnSaveClicks(gwSender, gpData);
00179 }
00180
00181
00182 void WrapOnGdkInput (gpointer gpData, gint giSource,
00183 GdkInputCondition gicCondition)
00184 {
00185 GUILofar->OnGdkInput(gpData, giSource, gicCondition);
00186 }
00187
00188
00189 bool clGUILofar::Build ()
00190 {
00191
00192 gwWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
00193 gtk_window_set_title(GTK_WINDOW(gwWindow), cpWindowTxt);
00194
00195 gtk_window_set_policy(GTK_WINDOW(gwWindow), TRUE, TRUE, FALSE);
00196 #if (GTK_MAJOR_VERSION == 1)
00197 gtk_window_set_default_size(GTK_WINDOW(gwWindow),
00198 gdk_screen_width() - LGUI_PADDING * 2,
00199 gwWindow->requisition.height);
00200 #endif
00201
00202
00203
00204
00205
00206 gwVBox = gtk_vbox_new(FALSE, LGUI_PADDING);
00207 gtk_container_add(GTK_CONTAINER(gwWindow), gwVBox);
00208 gtk_widget_show(gwVBox);
00209
00210
00211 gwCBHide = gtk_check_button_new();
00212 gtk_box_pack_start(GTK_BOX(gwVBox), gwCBHide, FALSE, FALSE, 0);
00213 gtk_widget_show(gwCBHide);
00214
00215
00216 if (!BuildTable1()) return false;
00217
00218
00219 if (!BuildTable2()) return false;
00220
00221
00222 if (!BuildTable3()) return false;
00223
00224
00225 if (!BuildTable4()) return false;
00226
00227
00228 if (!BuildTableLofar()) return false;
00229
00230
00231 gwStatusBar = gtk_statusbar_new();
00232 gtk_box_pack_start(GTK_BOX(gwVBox), gwStatusBar, FALSE, FALSE, 0);
00233 gtk_widget_show(gwStatusBar);
00234 guSbCtxt = gtk_statusbar_get_context_id(GTK_STATUSBAR(gwStatusBar),
00235 "status");
00236 gtk_statusbar_push(GTK_STATUSBAR(gwStatusBar), guSbCtxt, "");
00237
00238
00239 gtk_widget_show(gwWindow);
00240 #if (GTK_MAJOR_VERSION > 1)
00241 gtk_window_resize(GTK_WINDOW(gwWindow),
00242 gdk_screen_width() - LGUI_PADDING * 2,
00243 gwWindow->requisition.height);
00244 #endif
00245
00246
00247 if (!BuildDrawingPrims()) return false;
00248
00249
00250 gdk_window_set_cursor(gwDALofar->window, gcCrossHair);
00251 gdk_window_set_cursor(gwDALine->window, gcCrossHair);
00252
00253
00254
00255
00256
00257
00258
00259 return true;
00260 }
00261
00262
00263 bool clGUILofar::BuildTable1 ()
00264 {
00265
00266 gwTable1 = gtk_table_new(2, 5, FALSE);
00267
00268 gtk_box_pack_start(GTK_BOX(gwVBox), gwTable1, FALSE, FALSE, 0);
00269 gtk_widget_show(gwTable1);
00270
00271
00272 gwLServer = gtk_label_new(cpLServerTxt);
00273 gtk_label_set_justify(GTK_LABEL(gwLServer), GTK_JUSTIFY_LEFT);
00274 gtk_table_attach(GTK_TABLE(gwTable1), gwLServer,
00275 0, 1, 0, 1,
00276 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00277 (GtkAttachOptions) 0,
00278 LGUI_PADDING / 2, 0);
00279 gtk_widget_show(gwLServer);
00280 gwCServer = gtk_combo_new();
00281 gtk_entry_set_max_length(GTK_ENTRY(GTK_COMBO(gwCServer)->entry),
00282 LGUI_SERVER_MAXLEN);
00283 gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(gwCServer)->entry),
00284 "127.0.0.1:30001");
00285
00286
00287 gtk_table_attach(GTK_TABLE(gwTable1), gwCServer,
00288 0, 1, 1, 2,
00289 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00290 (GtkAttachOptions) 0,
00291 LGUI_PADDING / 2, 0);
00292 gtk_widget_show(gwCServer);
00293 GtkUtils.ComboListFromFile(gwCServer, &glServer, LGUI_HOSTFILE);
00294
00295
00296 if (iBeamCount)
00297 gwLChannel = gtk_label_new(cpaLChannelTxt[1]);
00298 else
00299 gwLChannel = gtk_label_new(cpaLChannelTxt[0]);
00300 gtk_label_set_justify(GTK_LABEL(gwLChannel), GTK_JUSTIFY_LEFT);
00301 gtk_table_attach(GTK_TABLE(gwTable1), gwLChannel,
00302 1, 2, 0, 1,
00303 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00304 LGUI_PADDING / 2, 0);
00305 gtk_widget_show(gwLChannel);
00306 if (iBeamCount)
00307 {
00308
00309
00310 goAChannel = gtk_adjustment_new(0.0, -90.0, 90.0, 1.0, 1.0, 1.0);
00311
00312 gwSBChannel = gtk_spin_button_new(GTK_ADJUSTMENT(goAChannel), 1.0, 1);
00313 }
00314 else
00315 {
00316
00317
00318 goAChannel = gtk_adjustment_new(1.0, LGUI_CH_LOWER, LGUI_CH_UPPER, 1.0,
00319 1.0, 1.0);
00320
00321 gwSBChannel = gtk_spin_button_new(GTK_ADJUSTMENT(goAChannel), 1.0, 0);
00322 }
00323 gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(gwSBChannel), TRUE);
00324 gtk_table_attach(GTK_TABLE(gwTable1), gwSBChannel,
00325 1, 2, 1, 2,
00326 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00327 LGUI_PADDING / 2, 0);
00328 gtk_widget_show(gwSBChannel);
00329
00330
00331 gwBConnect = gtk_button_new_with_label(cpBConnectTxt);
00332 gtk_table_attach(GTK_TABLE(gwTable1), gwBConnect,
00333 2, 3, 1, 2,
00334 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00335 LGUI_PADDING / 2, 0);
00336 gtk_widget_show(gwBConnect);
00337
00338
00339 gwBDisconnect = gtk_button_new_with_label(cpBDisconnectTxt);
00340 gtk_table_attach(GTK_TABLE(gwTable1), gwBDisconnect,
00341 3, 4, 1, 2,
00342 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00343 LGUI_PADDING / 2, 0);
00344 gtk_widget_show(gwBDisconnect);
00345
00346
00347 gwCBFreeze = gtk_check_button_new_with_label(cpCBFreezeTxt);
00348 gtk_table_attach(GTK_TABLE(gwTable1), gwCBFreeze,
00349 4, 5, 1, 2,
00350 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00351 LGUI_PADDING / 2, 0);
00352 gtk_widget_show(gwCBFreeze);
00353
00354 return true;
00355 }
00356
00357
00358 bool clGUILofar::BuildTable2 ()
00359 {
00360 char cpConvBuf[LGUI_CONV_BUF_SIZE];
00361
00362
00363 gwTable2 = gtk_table_new(2, 7, FALSE);
00364
00365 gtk_box_pack_start(GTK_BOX(gwVBox), gwTable2, FALSE, FALSE, 0);
00366 gtk_widget_show(gwTable2);
00367
00368
00369 gwLType = gtk_label_new(cpLTypeTxt);
00370 gtk_label_set_justify(GTK_LABEL(gwLType), GTK_JUSTIFY_LEFT);
00371 gtk_table_attach(GTK_TABLE(gwTable2), gwLType,
00372 0, 1, 0, 1,
00373 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00374 LGUI_PADDING / 2, 0);
00375 gtk_widget_show(gwLType);
00376 gwOMType = gtk_option_menu_new();
00377 gtk_table_attach(GTK_TABLE(gwTable2), gwOMType,
00378 0, 1, 1, 2,
00379 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00380 LGUI_PADDING / 2, 0);
00381 gtk_widget_show(gwOMType);
00382 GtkUtils.BuildOptionMenu(gwOMType, &gwMType, gwaMIType,
00383 cpaLTypeMenu, LGUI_TYPE_ITEMS);
00384
00385
00386 gwLWindow = gtk_label_new(cpLWindowTxt);
00387 gtk_label_set_justify(GTK_LABEL(gwLWindow), GTK_JUSTIFY_LEFT);
00388 gtk_table_attach(GTK_TABLE(gwTable2), gwLWindow,
00389 1, 2, 0, 1,
00390 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00391 LGUI_PADDING / 2, 0);
00392 gtk_widget_show(gwLWindow);
00393 gwOMWindow = gtk_option_menu_new();
00394 gtk_table_attach(GTK_TABLE(gwTable2), gwOMWindow,
00395 1, 2, 1, 2,
00396 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00397 LGUI_PADDING / 2, 0);
00398 gtk_widget_show(gwOMWindow);
00399 GtkUtils.BuildOptionMenu(gwOMWindow, &gwMWindow, gwaMIWindow,
00400 cpaLWindowMenu, LGUI_WINDOW_ITEMS);
00401
00402
00403 gwLWinParam = gtk_label_new(cpLWinParamTxt);
00404 gtk_label_set_justify(GTK_LABEL(gwLWinParam), GTK_JUSTIFY_LEFT);
00405 gtk_table_attach(GTK_TABLE(gwTable2), gwLWinParam,
00406 2, 3, 0, 1,
00407 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00408 (GtkAttachOptions) 0,
00409 LGUI_PADDING / 2, 0);
00410 gtk_widget_show(gwLWinParam);
00411 gwEWinParam = gtk_entry_new();
00412 gtk_table_attach(GTK_TABLE(gwTable2), gwEWinParam,
00413 2, 3, 1, 2,
00414 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00415 (GtkAttachOptions) 0,
00416 LGUI_PADDING / 2, 0);
00417 gtk_widget_show(gwEWinParam);
00418 gtk_widget_set_usize(gwEWinParam, LGUI_ENTRY_WIDTH,
00419 gwEWinParam->requisition.height);
00420
00421
00422 gwLWinLength = gtk_label_new(cpLWinLengthTxt);
00423 gtk_label_set_justify(GTK_LABEL(gwLWinLength), GTK_JUSTIFY_LEFT);
00424 gtk_table_attach(GTK_TABLE(gwTable2), gwLWinLength,
00425 3, 4, 0, 1,
00426 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00427 LGUI_PADDING / 2, 0);
00428 gtk_widget_show(gwLWinLength);
00429 gwOMWinLength = gtk_option_menu_new();
00430 gtk_table_attach(GTK_TABLE(gwTable2), gwOMWinLength,
00431 3, 4, 1, 2,
00432 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00433 LGUI_PADDING / 2, 0);
00434 gtk_widget_show(gwOMWinLength);
00435 GtkUtils.BuildOptionMenu(gwOMWinLength, &gwMWinLength, gwaMIWinLength,
00436 cpaLWinLengthMenu, LGUI_WIN_LENGTH_ITEMS);
00437 gtk_option_menu_set_history(GTK_OPTION_MENU(gwOMWinLength),
00438 ((guint) (log(sLofarRq.lWinLength) / log(2.0) + 0.5) - 10));
00439
00440
00441 gwLLowerFreq = gtk_label_new(cpLLowerFreqTxt);
00442 gtk_label_set_justify(GTK_LABEL(gwLLowerFreq), GTK_JUSTIFY_LEFT);
00443 gtk_table_attach(GTK_TABLE(gwTable2), gwLLowerFreq,
00444 4, 5, 0, 1,
00445 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00446 (GtkAttachOptions) 0,
00447 LGUI_PADDING / 2, 0);
00448 gtk_widget_show(gwLLowerFreq);
00449 gwELowerFreq = gtk_entry_new();
00450 gtk_table_attach(GTK_TABLE(gwTable2), gwELowerFreq,
00451 4, 5, 1, 2,
00452 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00453 (GtkAttachOptions) 0,
00454 LGUI_PADDING / 2, 0);
00455 gtk_widget_show(gwELowerFreq);
00456 gtk_widget_set_usize(gwELowerFreq, LGUI_ENTRY_WIDTH,
00457 gwELowerFreq->requisition.height);
00458 g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g", sLofarRq.fLowFreq);
00459 gtk_entry_set_text(GTK_ENTRY(gwELowerFreq), cpConvBuf);
00460
00461
00462 gwLHigherFreq = gtk_label_new(cpLHigherFreqTxt);
00463 gtk_label_set_justify(GTK_LABEL(gwLHigherFreq), GTK_JUSTIFY_LEFT);
00464 gtk_table_attach(GTK_TABLE(gwTable2), gwLHigherFreq,
00465 5, 6, 0, 1,
00466 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00467 (GtkAttachOptions) 0,
00468 LGUI_PADDING / 2, 0);
00469 gtk_widget_show(gwLHigherFreq);
00470 gwEHigherFreq = gtk_entry_new();
00471 gtk_table_attach(GTK_TABLE(gwTable2), gwEHigherFreq,
00472 5, 6, 1, 2,
00473 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00474 (GtkAttachOptions) 0,
00475 LGUI_PADDING / 2, 0);
00476 gtk_widget_show(gwEHigherFreq);
00477 gtk_widget_set_usize(gwEHigherFreq, LGUI_ENTRY_WIDTH,
00478 gwEHigherFreq->requisition.height);
00479 g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g", sLofarRq.fHighFreq);
00480 gtk_entry_set_text(GTK_ENTRY(gwEHigherFreq), cpConvBuf);
00481
00482
00483 gwLOverlap = gtk_label_new(cpLOverlapTxt);
00484 gtk_label_set_justify(GTK_LABEL(gwLOverlap), GTK_JUSTIFY_LEFT);
00485 gtk_table_attach(GTK_TABLE(gwTable2), gwLOverlap,
00486 6, 7, 0, 1,
00487 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00488 (GtkAttachOptions) 0,
00489 LGUI_PADDING / 2, 0);
00490 gtk_widget_show(gwLOverlap);
00491 gwEOverlap = gtk_entry_new();
00492 gtk_table_attach(GTK_TABLE(gwTable2), gwEOverlap,
00493 6, 7, 1, 2,
00494 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00495 (GtkAttachOptions) 0,
00496 LGUI_PADDING / 2, 0);
00497 gtk_widget_show(gwEOverlap);
00498 gtk_widget_set_usize(gwEOverlap, LGUI_ENTRY_WIDTH,
00499 gwEOverlap->requisition.height);
00500
00501 return true;
00502 }
00503
00504
00505 bool clGUILofar::BuildTable3 ()
00506 {
00507 char cpConvBuf[LGUI_CONV_BUF_SIZE];
00508
00509
00510 gwTable3 = gtk_table_new(2, 10, FALSE);
00511
00512 gtk_box_pack_start(GTK_BOX(gwVBox), gwTable3, FALSE, FALSE, 0);
00513 gtk_widget_show(gwTable3);
00514
00515
00516 gwLRemoveNoise = gtk_label_new(cpLRemoveNoiseTxt);
00517 gtk_label_set_justify(GTK_LABEL(gwLRemoveNoise), GTK_JUSTIFY_LEFT);
00518 gtk_table_attach(GTK_TABLE(gwTable3), gwLRemoveNoise,
00519 0, 1, 0, 1,
00520 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00521 LGUI_PADDING / 2, 0);
00522 gtk_widget_show(gwLRemoveNoise);
00523 gwOMRemoveNoise = gtk_option_menu_new();
00524 gtk_table_attach(GTK_TABLE(gwTable3), gwOMRemoveNoise,
00525 0, 1, 1, 2,
00526 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00527 LGUI_PADDING / 2, 0);
00528 gtk_widget_show(gwOMRemoveNoise);
00529 GtkUtils.BuildOptionMenu(gwOMRemoveNoise, &gwMRemoveNoise,
00530 gwaMIRemoveNoise, cpaLRemoveNoiseMenu, LGUI_REMOVE_NOISE_ITEMS);
00531 gtk_option_menu_set_history(GTK_OPTION_MENU(gwOMRemoveNoise),
00532 sLofarRq.iRemoveNoise);
00533
00534
00535 gwLAlpha = gtk_label_new(cpLAlphaTxt);
00536 gtk_label_set_justify(GTK_LABEL(gwLAlpha), GTK_JUSTIFY_LEFT);
00537 gtk_table_attach(GTK_TABLE(gwTable3), gwLAlpha,
00538 1, 2, 0, 1,
00539 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00540 (GtkAttachOptions) 0,
00541 LGUI_PADDING / 2, 0);
00542 gtk_widget_show(gwLAlpha);
00543 gwEAlpha = gtk_entry_new();
00544 gtk_table_attach(GTK_TABLE(gwTable3), gwEAlpha,
00545 1, 2, 1, 2,
00546 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00547 (GtkAttachOptions) 0,
00548 LGUI_PADDING / 2, 0);
00549 gtk_widget_show(gwEAlpha);
00550 gtk_widget_set_usize(gwEAlpha, LGUI_ENTRY_WIDTH,
00551 gwEAlpha->requisition.height);
00552 g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g", sLofarRq.fAlpha);
00553 gtk_entry_set_text(GTK_ENTRY(gwEAlpha), cpConvBuf);
00554
00555
00556 gwLMeanLength = gtk_label_new(cpLMeanLengthTxt);
00557 gtk_label_set_justify(GTK_LABEL(gwLMeanLength), GTK_JUSTIFY_LEFT);
00558 gtk_table_attach(GTK_TABLE(gwTable3), gwLMeanLength,
00559 2, 3, 0, 1,
00560 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00561 (GtkAttachOptions) 0,
00562 LGUI_PADDING / 2, 0);
00563 gtk_widget_show(gwLMeanLength);
00564 gwEMeanLength = gtk_entry_new();
00565 gtk_table_attach(GTK_TABLE(gwTable3), gwEMeanLength,
00566 2, 3, 1, 2,
00567 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00568 (GtkAttachOptions) 0,
00569 LGUI_PADDING / 2, 0);
00570 gtk_widget_show(gwEMeanLength);
00571 gtk_widget_set_usize(gwEMeanLength, LGUI_ENTRY_WIDTH,
00572 gwEMeanLength->requisition.height);
00573 g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%li", sLofarRq.lMeanLength);
00574 gtk_entry_set_text(GTK_ENTRY(gwEMeanLength), cpConvBuf);
00575
00576
00577 gwLGapLength = gtk_label_new(cpLGapLengthTxt);
00578 gtk_label_set_justify(GTK_LABEL(gwLGapLength), GTK_JUSTIFY_LEFT);
00579 gtk_table_attach(GTK_TABLE(gwTable3), gwLGapLength,
00580 3, 4, 0, 1,
00581 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00582 (GtkAttachOptions) 0,
00583 LGUI_PADDING / 2, 0);
00584 gtk_widget_show(gwLGapLength);
00585 gwEGapLength = gtk_entry_new();
00586 gtk_table_attach(GTK_TABLE(gwTable3), gwEGapLength,
00587 3, 4, 1, 2,
00588 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00589 (GtkAttachOptions) 0,
00590 LGUI_PADDING / 2, 0);
00591 gtk_widget_show(gwEGapLength);
00592 gtk_widget_set_usize(gwEGapLength, LGUI_ENTRY_WIDTH,
00593 gwEGapLength->requisition.height);
00594 g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%li", sLofarRq.lGapLength);
00595 gtk_entry_set_text(GTK_ENTRY(gwEGapLength), cpConvBuf);
00596
00597
00598 gwLAverageCount = gtk_label_new(cpLAverageCountTxt);
00599 gtk_label_set_justify(GTK_LABEL(gwLAverageCount), GTK_JUSTIFY_LEFT);
00600 gtk_table_attach(GTK_TABLE(gwTable3), gwLAverageCount,
00601 4, 5, 0, 1,
00602 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00603 (GtkAttachOptions) 0,
00604 LGUI_PADDING / 2, 0);
00605 gtk_widget_show(gwLAverageCount);
00606 gwEAverageCount = gtk_entry_new();
00607 gtk_table_attach(GTK_TABLE(gwTable3), gwEAverageCount,
00608 4, 5, 1, 2,
00609 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00610 (GtkAttachOptions) 0,
00611 LGUI_PADDING / 2, 0);
00612 gtk_widget_show(gwEAverageCount);
00613 gtk_widget_set_usize(gwEAverageCount, LGUI_ENTRY_WIDTH,
00614 gwEGapLength->requisition.height);
00615 g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%li", sLofarRq.lAvgCount);
00616 gtk_entry_set_text(GTK_ENTRY(gwEAverageCount), cpConvBuf);
00617
00618
00619 gwLClip = gtk_label_new(cpLClipTxt);
00620 gtk_label_set_justify(GTK_LABEL(gwLClip), GTK_JUSTIFY_LEFT);
00621 gtk_table_attach(GTK_TABLE(gwTable3), gwLClip,
00622 5, 6, 0, 1,
00623 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00624 LGUI_PADDING / 2, 0);
00625 gtk_widget_show(gwLClip);
00626 gwOMClip = gtk_option_menu_new();
00627 gtk_table_attach(GTK_TABLE(gwTable3), gwOMClip,
00628 5, 6, 1, 2,
00629 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00630 LGUI_PADDING / 2, 0);
00631 gtk_widget_show(gwOMClip);
00632 GtkUtils.BuildOptionMenu(gwOMClip, &gwMClip, gwaMIClip, cpaLClipMenu,
00633 LGUI_CLIP_ITEMS);
00634 gtk_option_menu_set_history(GTK_OPTION_MENU(gwOMClip), sLofarRq.iClip);
00635
00636
00637 gwCBLinear = gtk_check_button_new_with_label(cpCBLinearTxt);
00638 gtk_table_attach(GTK_TABLE(gwTable3), gwCBLinear,
00639 6, 7, 0, 1,
00640 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00641 LGUI_PADDING / 2, 0);
00642 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gwCBLinear), TRUE);
00643 gtk_widget_show(gwCBLinear);
00644
00645
00646 gwCBDemon = gtk_check_button_new_with_label(cpCBDemonTxt);
00647 gtk_table_attach(GTK_TABLE(gwTable3), gwCBDemon,
00648 6, 7, 1, 2,
00649 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00650 LGUI_PADDING / 2, 0);
00651
00652 gtk_widget_show(gwCBDemon);
00653
00654
00655 gwLPalette = gtk_label_new(cpLPaletteTxt);
00656 gtk_label_set_justify(GTK_LABEL(gwLPalette), GTK_JUSTIFY_LEFT);
00657 gtk_table_attach(GTK_TABLE(gwTable3), gwLPalette,
00658 7, 8, 0, 1,
00659 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00660 LGUI_PADDING / 2, 0);
00661 gtk_widget_show(gwLPalette);
00662 gwOMPalette = gtk_option_menu_new();
00663 gtk_table_attach(GTK_TABLE(gwTable3), gwOMPalette,
00664 7, 8, 1, 2,
00665 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00666 LGUI_PADDING / 2, 0);
00667 gtk_widget_show(gwOMPalette);
00668 GtkUtils.BuildOptionMenu(gwOMPalette, &gwMPalette, gwaMIPalette,
00669 cpaLPaletteMenu, LGUI_PALETTE_ITEMS);
00670 gtk_option_menu_set_history(GTK_OPTION_MENU(gwOMPalette),
00671 (guint) iPalette);
00672
00673
00674 gwCBAverage = gtk_check_button_new_with_label(cpCBAverageTxt);
00675 gtk_table_attach(GTK_TABLE(gwTable3), gwCBAverage,
00676 8, 9, 1, 2,
00677 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00678 LGUI_PADDING / 2, 0);
00679
00680 gtk_widget_show(gwCBAverage);
00681
00682
00683 gwCBSaving = gtk_check_button_new_with_label(cpCBSavingTxt);
00684 gtk_table_attach(GTK_TABLE(gwTable3), gwCBSaving,
00685 9, 10, 0, 1,
00686 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00687 LGUI_PADDING / 2, 0);
00688 gtk_widget_show(gwCBSaving);
00689
00690
00691 gwBSave = gtk_button_new_with_label(cpBSaveTxt);
00692 gtk_table_attach(GTK_TABLE(gwTable3), gwBSave,
00693 9, 10, 1, 2,
00694 (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0,
00695 LGUI_PADDING / 2, 0);
00696 gtk_widget_show(gwBSave);
00697
00698
00699 gwFSSave = gtk_file_selection_new(cpFSSaveTxt);
00700
00701 return true;
00702 }
00703
00704
00705 bool clGUILofar::BuildTable4 ()
00706 {
00707
00708 gwTable4 = gtk_table_new(2, 1, FALSE);
00709
00710 gtk_box_pack_start(GTK_BOX(gwVBox), gwTable4, FALSE, FALSE, 0);
00711 gtk_widget_show(gwTable4);
00712
00713
00714 gwLClipValue = gtk_label_new(cpLClipValueTxt);
00715 gtk_table_attach(GTK_TABLE(gwTable4), gwLClipValue,
00716 0, 1, 0, 1,
00717 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00718 (GtkAttachOptions) 0,
00719 LGUI_PADDING / 2, 0);
00720 gtk_widget_show(gwLClipValue);
00721
00722
00723 goAClipValue = gtk_adjustment_new(1, 0, 1.01, 0.01, 0.1, 0.01);
00724 gwHSClipValue = gtk_hscale_new(GTK_ADJUSTMENT(goAClipValue));
00725 gtk_scale_set_digits(GTK_SCALE(gwHSClipValue), 2);
00726 gtk_table_attach(GTK_TABLE(gwTable4), gwHSClipValue,
00727 0, 1, 1, 2,
00728 (GtkAttachOptions) (GTK_FILL|GTK_EXPAND|GTK_SHRINK),
00729 (GtkAttachOptions) 0,
00730 LGUI_PADDING / 2, 0);
00731 gtk_widget_show(gwHSClipValue);
00732
00733 return true;
00734 }
00735
00736
00737 bool clGUILofar::BuildTableLofar ()
00738 {
00739
00740 gwTableLofar = gtk_table_new(4, 1, FALSE);
00741
00742 gtk_box_pack_start(GTK_BOX(gwVBox), gwTableLofar, TRUE, TRUE, 0);
00743 gtk_widget_show(gwTableLofar);
00744
00745
00746 gwLTopTime = gtk_label_new("00:00:00");
00747 gtk_label_set_justify(GTK_LABEL(gwLTopTime), GTK_JUSTIFY_RIGHT);
00748 gtk_table_attach(GTK_TABLE(gwTableLofar), gwLTopTime,
00749 0, 1, 0, 1,
00750 (GtkAttachOptions) (GTK_FILL),
00751 (GtkAttachOptions) 0,
00752 0, 0);
00753 gtk_widget_show(gwLTopTime);
00754
00755
00756 gwLBottomTime = gtk_label_new("00:00:00");
00757 gtk_label_set_justify(GTK_LABEL(gwLBottomTime), GTK_JUSTIFY_RIGHT);
00758 gtk_table_attach(GTK_TABLE(gwTableLofar), gwLBottomTime,
00759 0, 1, 2, 3,
00760 (GtkAttachOptions) (GTK_FILL),
00761 (GtkAttachOptions) 0,
00762 0, 0);
00763 gtk_widget_show(gwLBottomTime);
00764
00765
00766 gwSWLofar = gtk_scrolled_window_new(NULL, NULL);
00767 if (iFit)
00768 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gwSWLofar),
00769 GTK_POLICY_NEVER, GTK_POLICY_NEVER);
00770 else
00771 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gwSWLofar),
00772 GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
00773 gtk_table_attach(GTK_TABLE(gwTableLofar), gwSWLofar,
00774 0, 1, 1, 2,
00775 (GtkAttachOptions) (GTK_FILL|GTK_SHRINK|GTK_EXPAND),
00776 (GtkAttachOptions) (GTK_FILL|GTK_SHRINK|GTK_EXPAND),
00777 0, 0);
00778 gtk_widget_show(gwSWLofar);
00779
00780
00781 gwTableLofar2 = gtk_table_new(3, 2, FALSE);
00782 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(gwSWLofar),
00783 gwTableLofar2);
00784 gtk_widget_show(gwTableLofar2);
00785
00786
00787 gwHRFrequency = gtk_hruler_new();
00788 gtk_ruler_set_metric(GTK_RULER(gwHRFrequency), GTK_PIXELS);
00789
00790 gtk_ruler_set_range(GTK_RULER(gwHRFrequency),
00791 0.0, (gfloat) sLofarRq.lWinLength, 0.0, (gfloat) sLofarRq.lWinLength);
00792 gtk_table_attach(GTK_TABLE(gwTableLofar2), gwHRFrequency,
00793 1, 2, 0, 1,
00794 (GtkAttachOptions) (GTK_FILL),
00795 (GtkAttachOptions) 0,
00796 0, 0);
00797 gtk_widget_show(gwHRFrequency);
00798
00799
00800 gwDALine = gtk_drawing_area_new();
00801
00802 gtk_drawing_area_size(GTK_DRAWING_AREA(gwDALine), 1000,
00803 LGUI_LINESPECT_HEIGHT);
00804 gtk_table_attach(GTK_TABLE(gwTableLofar2), gwDALine,
00805 1, 2, 1, 2,
00806 (GtkAttachOptions) (GTK_FILL),
00807 (GtkAttachOptions) (GTK_FILL),
00808 0, 0);
00809 gtk_widget_show(gwDALine);
00810
00811
00812 gwDACursor = gtk_drawing_area_new();
00813
00814 gtk_drawing_area_size(GTK_DRAWING_AREA(gwDACursor), 1000,
00815 LGUI_CURSOR_HEIGHT);
00816 gtk_table_attach(GTK_TABLE(gwTableLofar2), gwDACursor,
00817 1, 2, 2, 3,
00818 (GtkAttachOptions) (GTK_FILL),
00819 (GtkAttachOptions) (GTK_FILL),
00820 0, 0);
00821 gtk_widget_show(gwDACursor);
00822
00823
00824 gwVRTime = gtk_vruler_new();
00825 gtk_ruler_set_metric(GTK_RULER(gwVRTime), GTK_PIXELS);
00826
00827 gtk_ruler_set_range(GTK_RULER(gwVRTime), 0.0, -1.0, 0.0, 0.0);
00828 gtk_table_attach(GTK_TABLE(gwTableLofar2), gwVRTime,
00829 0, 1, 3, 4,
00830 (GtkAttachOptions) 0,
00831 (GtkAttachOptions) (GTK_FILL|GTK_SHRINK|GTK_EXPAND),
00832 0, 0);
00833 gtk_widget_show(gwVRTime);
00834
00835
00836 gwDALofar = gtk_drawing_area_new();
00837
00838 gtk_drawing_area_size(GTK_DRAWING_AREA(gwDALofar), 1000, 100);
00839 gtk_table_attach(GTK_TABLE(gwTableLofar2), gwDALofar,
00840 1, 2, 3, 4,
00841 (GtkAttachOptions) (GTK_FILL),
00842 (GtkAttachOptions) (GTK_FILL),
00843 0, 0);
00844 gtk_widget_show(gwDALofar);
00845
00846 return true;
00847 }
00848
00849
00850 bool clGUILofar::BuildDrawingPrims ()
00851 {
00852 int iPalType;
00853
00854
00855 ggcLofarBG = gdk_gc_new(gwDALofar->window);
00856 gdk_rgb_gc_set_foreground(ggcLofarBG, LGUI_LOFAR_BG);
00857 gdk_rgb_gc_set_background(ggcLofarBG, LGUI_LOFAR_BG);
00858 gdk_gc_set_function(ggcLofarBG, GDK_COPY);
00859 gdk_gc_set_fill(ggcLofarBG, GDK_SOLID);
00860
00861 ggcLofarFG = gdk_gc_new(gwDALofar->window);
00862 gdk_rgb_gc_set_foreground(ggcLofarFG, LGUI_LOFAR_FG);
00863 gdk_rgb_gc_set_background(ggcLofarFG, LGUI_LOFAR_BG);
00864 gdk_gc_set_function(ggcLofarFG, GDK_COPY);
00865 gdk_gc_set_fill(ggcLofarFG, GDK_SOLID);
00866
00867 ggcLineBG = gdk_gc_new(gwDALine->window);
00868 gdk_rgb_gc_set_foreground(ggcLineBG, LGUI_LINE_BG);
00869 gdk_rgb_gc_set_background(ggcLineBG, LGUI_LINE_BG);
00870 gdk_gc_set_function(ggcLineBG, GDK_COPY);
00871 gdk_gc_set_fill(ggcLineBG, GDK_SOLID);
00872
00873 ggcLineFG = gdk_gc_new(gwDALine->window);
00874 gdk_rgb_gc_set_foreground(ggcLineFG, LGUI_LINE_FG);
00875 gdk_rgb_gc_set_background(ggcLineFG, LGUI_LINE_BG);
00876 gdk_gc_set_function(ggcLineFG, GDK_COPY);
00877 gdk_gc_set_fill(ggcLineFG, GDK_SOLID);
00878
00879 ggcCursorBG = gdk_gc_new(gwDACursor->window);
00880 gdk_rgb_gc_set_foreground(ggcCursorBG, LGUI_CURSOR_BG);
00881 gdk_rgb_gc_set_background(ggcCursorBG, LGUI_CURSOR_BG);
00882 gdk_gc_set_function(ggcCursorBG, GDK_COPY);
00883 gdk_gc_set_fill(ggcCursorBG, GDK_SOLID);
00884
00885 ggcCursorFG = gdk_gc_new(gwDACursor->window);
00886 gdk_rgb_gc_set_foreground(ggcCursorFG, LGUI_CURSOR_FG);
00887 gdk_rgb_gc_set_background(ggcCursorFG, LGUI_CURSOR_BG);
00888 gdk_gc_set_function(ggcCursorFG, GDK_COPY);
00889 gdk_gc_set_fill(ggcCursorFG, GDK_SOLID);
00890
00891
00892 gcCrossHair = gdk_cursor_new(GDK_CROSSHAIR);
00893
00894
00895 Cfg.GetInt("Palette", &iPalType);
00896 SetPalette(iPalType);
00897
00898 return true;
00899 }
00900
00901
00902 void clGUILofar::FreeDrawingPrims ()
00903 {
00904 gdk_cursor_destroy(gcCrossHair);
00905 gdk_gc_destroy(ggcLofarBG);
00906 gdk_gc_destroy(ggcLofarFG);
00907 gdk_gc_destroy(ggcLineBG);
00908 gdk_gc_destroy(ggcLineFG);
00909 gdk_gc_destroy(ggcCursorBG);
00910 gdk_gc_destroy(ggcCursorFG);
00911 }
00912
00913
00914 bool clGUILofar::ConnectSignals ()
00915 {
00916 int iWidgetCntr;
00917
00918 gtk_signal_connect(GTK_OBJECT(gwWindow), "delete_event",
00919 GTK_SIGNAL_FUNC(WrapOnDelete), NULL);
00920
00921 gtk_signal_connect(GTK_OBJECT(gwCBHide), "toggled",
00922 GTK_SIGNAL_FUNC(WrapOnHideToggled), NULL);
00923
00924
00925 gtk_widget_add_events(gwDALofar,
00926 (GDK_POINTER_MOTION_MASK|GDK_BUTTON_MOTION_MASK|
00927 GDK_BUTTON1_MOTION_MASK|GDK_BUTTON2_MOTION_MASK|GDK_BUTTON3_MOTION_MASK|
00928 GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK|
00929 GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK));
00930 GtkUtils.ConnectMotionEvent(gwHRFrequency, gwDALofar);
00931 GtkUtils.ConnectMotionEvent(gwVRTime, gwDALofar);
00932 gtk_signal_connect(GTK_OBJECT(gwDALofar), "expose_event",
00933 GTK_SIGNAL_FUNC(WrapOnExposeLofar), NULL);
00934 gtk_signal_connect(GTK_OBJECT(gwDALofar), "configure_event",
00935 GTK_SIGNAL_FUNC(WrapOnConfigureLofar), NULL);
00936 gtk_signal_connect(GTK_OBJECT(gwDALofar), "motion_notify_event",
00937 GTK_SIGNAL_FUNC(WrapOnMotionLofar), NULL);
00938
00939 gtk_widget_add_events(gwDALine, GDK_POINTER_MOTION_MASK);
00940 GtkUtils.ConnectMotionEvent(gwHRFrequency, gwDALine);
00941 gtk_signal_connect(GTK_OBJECT(gwDALine), "expose_event",
00942 GTK_SIGNAL_FUNC(WrapOnExposeLine), NULL);
00943
00944 gtk_signal_connect(GTK_OBJECT(gwDACursor), "expose_event",
00945 GTK_SIGNAL_FUNC(WrapOnExposeCursor), NULL);
00946
00947 gtk_signal_connect(GTK_OBJECT(gwBConnect), "clicked",
00948 GTK_SIGNAL_FUNC(WrapOnConnectClick), NULL);
00949 gtk_signal_connect(GTK_OBJECT(gwBDisconnect), "clicked",
00950 GTK_SIGNAL_FUNC(WrapOnConnectClick), NULL);
00951 gtk_signal_connect(GTK_OBJECT(gwCBFreeze), "toggled",
00952 GTK_SIGNAL_FUNC(WrapOnFreezeToggled), NULL);
00953
00954 for (iWidgetCntr = 0; iWidgetCntr < LGUI_PALETTE_ITEMS; iWidgetCntr++)
00955 {
00956 gtk_signal_connect(GTK_OBJECT(gwaMIPalette[iWidgetCntr]), "activate",
00957 GTK_SIGNAL_FUNC(WrapOnPaletteActivate), (gpointer) iWidgetCntr);
00958 }
00959
00960 gtk_signal_connect(GTK_OBJECT(gwCBAverage), "toggled",
00961 GTK_SIGNAL_FUNC(WrapOnAverageToggled), NULL);
00962
00963 gtk_signal_connect(GTK_OBJECT(gwCBSaving), "toggled",
00964 GTK_SIGNAL_FUNC(WrapOnSaveClicks), GINT_TO_POINTER(3));
00965 gtk_signal_connect(GTK_OBJECT(gwBSave), "clicked",
00966 GTK_SIGNAL_FUNC(WrapOnSaveClicks), GINT_TO_POINTER(2));
00967 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(gwFSSave)->ok_button),
00968 "clicked", GTK_SIGNAL_FUNC(WrapOnSaveClicks), GINT_TO_POINTER(1));
00969 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(gwFSSave)->cancel_button),
00970 "clicked", GTK_SIGNAL_FUNC(WrapOnSaveClicks), GINT_TO_POINTER(0));
00971
00972 gtk_signal_connect(GTK_OBJECT(goAClipValue), "value-changed",
00973 GTK_SIGNAL_FUNC(WrapOnClipValueChanged), NULL);
00974
00975 return true;
00976 }
00977
00978
00979 bool clGUILofar::ParseServerStr (char *cpHostRes, int *ipPortRes,
00980 const char *cpSourceStr)
00981 {
00982 char cpTempStr[LGUI_SERVER_MAXLEN + 1];
00983 char *cpTempHost;
00984 char *cpTempPort;
00985
00986 strncpy(cpTempStr, cpSourceStr, LGUI_SERVER_MAXLEN);
00987 cpTempHost = strtok(cpTempStr, ": \t\n");
00988 if (cpTempHost != NULL)
00989 {
00990 strcpy(cpHostRes, cpTempHost);
00991 cpTempPort = strtok(NULL, " \t\n");
00992 if (cpTempPort != NULL)
00993 {
00994 *ipPortRes = atoi(cpTempPort);
00995 if (*ipPortRes > 0) return true;
00996 }
00997 }
00998 return false;
00999 }
01000
01001
01002 bool clGUILofar::InitConnection (const char *cpServerHost, int iServerPort)
01003 {
01004 int iSockH;
01005 char cpReqProcName[GLOBAL_HEADER_LEN];
01006
01007 iSockH = SClient.Connect(cpServerHost, NULL, iServerPort);
01008 if (iSockH < 0)
01009 {
01010 g_print("Failed to connect host!\n");
01011 return false;
01012 }
01013 g_print("Connection established - sending process request...\n");
01014 bConnected = true;
01015 SOp.SetHandle(iSockH);
01016 strcpy(cpReqProcName, LGUI_REQ_PROC);
01017 if (SOp.WriteN(cpReqProcName, GLOBAL_HEADER_LEN) < GLOBAL_HEADER_LEN)
01018 {
01019 g_print("Failed to send process request!\n");
01020 return false;
01021 }
01022 g_print("Sending settings...\n");
01023 if (!SendSettings())
01024 {
01025 g_print("Failed to send settings!\n");
01026 return false;
01027 }
01028 lSpectSize = sLofarRq.lWinLength / 2L + 1L;
01029 SpectData.Size(sizeof(GDT) * lSpectSize);
01030 AvgSpectData.Size(sizeof(GDT) * lSpectSize);
01031 bConfigured = false;
01032 iClips = 0;
01033 giGdkTag = gdk_input_add(iSockH, GDK_INPUT_READ, WrapOnGdkInput, NULL);
01034 return true;
01035 }
01036
01037
01038 bool clGUILofar::SendSettings ()
01039 {
01040 float fDirection;
01041 char cpMsgBuf[GLOBAL_HEADER_LEN];
01042
01043 if (iBeamCount)
01044 {
01045 fDirection = gtk_spin_button_get_value_as_float(
01046 GTK_SPIN_BUTTON(gwSBChannel)) + 90.0f;
01047 sLofarRq.iChannel = (int)
01048 (fDirection / (180.0f / (float) (iBeamCount - 1)));
01049 g_print("Channel: %i\n", sLofarRq.iChannel);
01050 }
01051 else
01052 {
01053 sLofarRq.iChannel = gtk_spin_button_get_value_as_int(
01054 GTK_SPIN_BUTTON(gwSBChannel)) - 1;
01055 }
01056 sLofarRq.iType = GtkUtils.OptionMenuGetActive(gwOMType, gwaMIType,
01057 LGUI_TYPE_ITEMS);
01058 sLofarRq.iWindow = GtkUtils.OptionMenuGetActive(gwOMWindow, gwaMIWindow,
01059 LGUI_WINDOW_ITEMS);
01060 sscanf(gtk_entry_get_text(GTK_ENTRY(gwEWinParam)), "%g",
01061 &sLofarRq.fWinParameter);
01062 sLofarRq.lWinLength = (long) (pow(2.0,
01063 10 + GtkUtils.OptionMenuGetActive(gwOMWinLength, gwaMIWinLength,
01064 LGUI_WIN_LENGTH_ITEMS)) + 0.5);
01065 sscanf(gtk_entry_get_text(GTK_ENTRY(gwELowerFreq)), "%g",
01066 &sLofarRq.fLowFreq);
01067 sscanf(gtk_entry_get_text(GTK_ENTRY(gwEHigherFreq)), "%g",
01068 &sLofarRq.fHighFreq);
01069 sscanf(gtk_entry_get_text(GTK_ENTRY(gwEOverlap)), "%i",
01070 &sLofarRq.iOverlap);
01071 sLofarRq.bLinear = (gtk_toggle_button_get_active(
01072 GTK_TOGGLE_BUTTON(gwCBLinear))) ? true : false;
01073 sLofarRq.iRemoveNoise = GtkUtils.OptionMenuGetActive(gwOMRemoveNoise,
01074 gwaMIRemoveNoise, LGUI_REMOVE_NOISE_ITEMS);
01075 sscanf(gtk_entry_get_text(GTK_ENTRY(gwEAlpha)), "%g",
01076 &sLofarRq.fAlpha);
01077 sscanf(gtk_entry_get_text(GTK_ENTRY(gwEMeanLength)), "%li",
01078 &sLofarRq.lMeanLength);
01079 sscanf(gtk_entry_get_text(GTK_ENTRY(gwEGapLength)), "%li",
01080 &sLofarRq.lGapLength);
01081 sscanf(gtk_entry_get_text(GTK_ENTRY(gwEAverageCount)), "%li",
01082 &sLofarRq.lAvgCount);
01083 if (sLofarRq.lAvgCount <= 0) sLofarRq.lAvgCount = 1;
01084 sLofarRq.bDemon = (gtk_toggle_button_get_active(
01085 GTK_TOGGLE_BUTTON(gwCBDemon))) ? true : false;
01086 sLofarRq.iClip = GtkUtils.OptionMenuGetActive(gwOMClip, gwaMIClip,
01087 LGUI_CLIP_ITEMS);
01088
01089 LofarMsg.SetRequest(cpMsgBuf, &sLofarRq);
01090 if (SOp.WriteN(cpMsgBuf, GLOBAL_HEADER_LEN) != GLOBAL_HEADER_LEN)
01091 return false;
01092
01093 return true;
01094 }
01095
01096
01097 void clGUILofar::PrintStatus ()
01098 {
01099 time_t ttCursorTime;
01100 float fFreqRes;
01101 float fFreq;
01102 float fTime;
01103 float fCursorC;
01104 float fCursorD;
01105 char cpTimeBuf[LGUI_CONV_BUF_SIZE];
01106 char cpConvBuf[LGUI_CONV_BUF_SIZE];
01107
01108 if (iFit)
01109 {
01110 if (iLofarWidth != 0)
01111 {
01112 if (!sLofarRq.bDemon)
01113 {
01114 fFreqRes = (sLofarResHdr.fHighFreq - sLofarResHdr.fLowFreq) /
01115 ((float) iLofarWidth);
01116 }
01117 else
01118 {
01119 fFreqRes = sLofarResHdr.fDemonBand /
01120 (float) iLofarWidth;
01121 }
01122 }
01123 else fFreqRes = 0.0f;
01124 }
01125 else
01126 {
01127 if (sLofarResHdr.lSpectLength != 0)
01128 {
01129 if (!sLofarRq.bDemon)
01130 {
01131 fFreqRes = (sLofarResHdr.fHighFreq - sLofarResHdr.fLowFreq) /
01132 ((float) sLofarResHdr.lSpectLength);
01133 }
01134 else
01135 {
01136 fFreqRes = sLofarResHdr.fDemonBand /
01137 (float) sLofarResHdr.lSpectLength;
01138 }
01139 }
01140 else fFreqRes = 0.0f;
01141 }
01142 fFreq = ((float) iCursorX) * fFreqRes;
01143 if (!sLofarRq.bDemon)
01144 fFreq += sLofarResHdr.fLowFreq;
01145 fTime = sLofarResHdr.fLineTime * (float) iCursorY;
01146 fCursorC = ((float) sLCursor.iPosition) * fFreqRes;
01147 fCursorD = ((float) sLCursor.iDistance) * fFreqRes;
01148 ttCursorTime = (time_t)
01149 ((float) sLofarResHdr.sTimeStamp.tv_sec - fTime + 0.5f);
01150 strftime(cpTimeBuf, LGUI_CONV_BUF_SIZE, "%H:%M:%S",
01151 localtime(&ttCursorTime));
01152 g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE,
01153 "%.2f Hz %.2f s (%s) / %.2f dB %i clips, c = %.2f Hz d = %.2f Hz",
01154 fFreq, fTime, cpTimeBuf, sLofarResHdr.fPeakLevel, iClips,
01155 fCursorC, fCursorD);
01156 gtk_statusbar_pop(GTK_STATUSBAR(gwStatusBar), guSbCtxt);
01157 gtk_statusbar_push(GTK_STATUSBAR(gwStatusBar), guSbCtxt, cpConvBuf);
01158 }
01159
01160
01161 void clGUILofar::SetPalette (int iPalType)
01162 {
01163 switch (iPalType)
01164 {
01165 case LGUI_PAL_BW:
01166 FBLofar.PalGenBW();
01167 break;
01168 case LGUI_PAL_HSV:
01169 FBLofar.PalGenHSV();
01170 break;
01171 case LGUI_PAL_LIGHT:
01172 FBLofar.PalGenLight();
01173 break;
01174 case LGUI_PAL_TEMP:
01175 FBLofar.PalGenTemp();
01176 break;
01177 case LGUI_PAL_DIR:
01178 FBLofar.PalGenDir();
01179 break;
01180 case LGUI_PAL_GREEN:
01181 FBLofar.PalGenGreen();
01182 break;
01183 case LGUI_PAL_GREEN2:
01184 FBLofar.PalGenGreen2();
01185 break;
01186 case LGUI_PAL_GREEN3:
01187 FBLofar.PalGenGreen3();
01188 break;
01189 case LGUI_PAL_GREEN4:
01190 FBLofar.PalGenGreen4();
01191 break;
01192 case LGUI_PAL_PUREGREEN:
01193 FBLofar.PalGenPureGreen();
01194 break;
01195 case LGUI_PAL_WB:
01196 FBLofar.PalGenWB();
01197 break;
01198 default:
01199 FBLofar.PalGenBW();
01200 }
01201 }
01202
01203
01204 void clGUILofar::Configure ()
01205 {
01206 char cpConvBuf[LGUI_CONV_BUF_SIZE];
01207
01208 lSpectSize = sLofarResHdr.lSpectLength;
01209 if (iFit)
01210 iLofarWidth =
01211 gwSWLofar->allocation.width - gwVRTime->allocation.width - 2;
01212 else
01213 iLofarWidth = (int) lSpectSize;
01214 FBLofar.SetSize(iLofarWidth, iLofarHeight);
01215
01216
01217 gtk_widget_set_usize(gwWindow, gwWindow->allocation.width,
01218 gwWindow->allocation.height);
01219 gtk_drawing_area_size(GTK_DRAWING_AREA(gwDALofar), iLofarWidth,
01220 iLofarHeight);
01221 gtk_drawing_area_size(GTK_DRAWING_AREA(gwDALine), iLofarWidth,
01222 gwDALine->requisition.height);
01223 gtk_drawing_area_size(GTK_DRAWING_AREA(gwDACursor), iLofarWidth,
01224 gwDACursor->requisition.height);
01225 if (!sLofarRq.bDemon)
01226 {
01227 gtk_ruler_set_range(GTK_RULER(gwHRFrequency),
01228 sLofarResHdr.fLowFreq, sLofarResHdr.fHighFreq,
01229 sLofarResHdr.fLowFreq, sLofarResHdr.fHighFreq);
01230 }
01231 else
01232 {
01233 gtk_ruler_set_range(GTK_RULER(gwHRFrequency),
01234 0.0, sLofarResHdr.fDemonBand,
01235 0.0, sLofarResHdr.fDemonBand);
01236 }
01237 gtk_ruler_set_range(GTK_RULER(gwVRTime),
01238 0.0, iLofarHeight * sLofarResHdr.fLineTime / 60.0f,
01239 0.0, 0.0);
01240 g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g", sLofarResHdr.fLowFreq);
01241 gtk_entry_set_text(GTK_ENTRY(gwELowerFreq), cpConvBuf);
01242 g_snprintf(cpConvBuf, LGUI_CONV_BUF_SIZE, "%g",
01243 sLofarResHdr.fHighFreq);
01244 gtk_entry_set_text(GTK_ENTRY(gwEHigherFreq), cpConvBuf);
01245 bConfigured = true;
01246 }
01247
01248
01249 void clGUILofar::ConfigureHeight ()
01250 {
01251 iLofarHeight = gwDALofar->allocation.height;
01252 FBLofar.SetSize(iLofarWidth, iLofarHeight);
01253 gtk_ruler_set_range(GTK_RULER(gwVRTime),
01254 0.0, iLofarHeight * sLofarResHdr.fLineTime / 60.0f,
01255 0.0, 0.0);
01256 }
01257
01258
01259 void clGUILofar::DrawCursor ()
01260 {
01261 int iLineCntr;
01262 int iLineX;
01263
01264 gdk_draw_rectangle(gwDACursor->window, ggcCursorBG, TRUE,
01265 0, 0, gwDACursor->allocation.width, gwDACursor->allocation.height);
01266 switch (sLCursor.iType)
01267 {
01268 case LGUI_CURSOR_11:
01269 for (iLineCntr = -5; iLineCntr <= 5; iLineCntr++)
01270 {
01271 iLineX = sLCursor.iPosition + iLineCntr * sLCursor.iDistance;
01272 gdk_draw_line(gwDACursor->window, ggcCursorFG,
01273 iLineX, 0, iLineX, gwDACursor->allocation.height - 1);
01274 }
01275 break;
01276 case LGUI_CURSOR_INF:
01277 if (sLCursor.iDistance <= 0) break;
01278 iLineX = 0;
01279 do {
01280 gdk_draw_line(gwDACursor->window, ggcCursorFG,
01281 iLineX, 0, iLineX, gwDACursor->allocation.height - 1);
01282 iLineX += sLCursor.iDistance;
01283 } while (iLineX < gwDACursor->allocation.width);
01284 break;
01285 default:
01286 g_warning("Uknown cursor type %i", sLCursor.iType);
01287 }
01288 }
01289
01290
01291 void clGUILofar::SaveInfo (const char *cpFileName, time_t ttStartTime)
01292 {
01293 char *cpFullFileName;
01294 char cpTime[20];
01295 FILE *fileInfo;
01296
01297 cpFullFileName = g_strdup_printf("%s.inf", cpFileName);
01298 fileInfo = fopen(cpFullFileName, FB_TIFF_MODE);
01299 g_free(cpFullFileName);
01300 if (fileInfo == NULL) return;
01301 strftime(cpTime, 20, "%Y/%m/%d %H:%M:%S", localtime(&ttStartTime));
01302 fprintf(fileInfo, "Time: %s\n", cpTime);
01303 fprintf(fileInfo, "LowFreq: %f\n", sLofarResHdr.fLowFreq);
01304 fprintf(fileInfo, "HighFreq: %f\n", sLofarResHdr.fHighFreq);
01305 if (sLofarRq.bDemon)
01306 fprintf(fileInfo, "DemonBand: %f\n", sLofarResHdr.fDemonBand);
01307 fprintf(fileInfo, "LineTime: %f\n", sLofarResHdr.fLineTime);
01308 fclose(fileInfo);
01309 }
01310
01311
01312 void clGUILofar::StartNewImgFile ()
01313 {
01314 char *cpCompleteFileName;
01315
01316 FBLofar.StopSaveToFile();
01317 cpCompleteFileName = g_strdup_printf("%s%02i.tif",
01318 strImgFileName.c_str(), iImgCount);
01319 if (!FBLofar.StartSaveToFile(cpCompleteFileName, iCompressMode,
01320 iJPEGQuality, "LOFAR/DEMON", FB_TIFF_CONT_VERTICAL))
01321 {
01322 g_warning("Saving to file failed!");
01323 gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(gwCBSaving));
01324 bSaving = false;
01325 }
01326 SaveInfo(cpCompleteFileName, time(NULL));
01327 g_free(cpCompleteFileName);
01328 }
01329
01330
01331 clGUILofar::clGUILofar (int *ipArgC, char ***cpapArgV)
01332 {
01333 bRun = true;
01334 bConnected = false;
01335 bFreezed = false;
01336 bConfigured = false;
01337 bAveraged = false;
01338 bCursorDrag = false;
01339 fClip = 1;
01340 glServer = NULL;
01341 memset(&sLCursor, 0x00, sizeof(stLofarCursor));
01342 g_print("%s GUI v%i.%i.%i\n", cpWindowTxt,
01343 LGUI_VER_MAJ, LGUI_VER_MIN, LGUI_VER_PL);
01344 g_print("Copyright (C) 2000-2002 Jussi Laako\n\n");
01345 g_print("Gtk+ version %i.%i.%i\n", gtk_major_version, gtk_minor_version,
01346 gtk_micro_version);
01347 g_print("Locale set to %s\n", gtk_set_locale());
01348 gtk_init(ipArgC, cpapArgV);
01349 gdk_rgb_init();
01350 gtk_widget_set_default_colormap(gdk_rgb_get_cmap());
01351 gtk_widget_set_default_visual(gdk_rgb_get_visual());
01352 Cfg.SetFileName(LGUI_CFGFILE);
01353 if (!Cfg.GetInt("WindowLength", &sLofarRq.lWinLength))
01354 sLofarRq.lWinLength = LGUI_DEF_WIN_LENGTH;
01355 if (!Cfg.GetFlt("LowFrequency", &sLofarRq.fLowFreq))
01356 sLofarRq.fLowFreq = LGUI_DEF_LOW_FREQ;
01357 if (!Cfg.GetFlt("HighFrequency", &sLofarRq.fHighFreq))
01358 sLofarRq.fHighFreq = LGUI_DEF_HIGH_FREQ;
01359 if (!Cfg.GetInt("RemoveNoise", &sLofarRq.iRemoveNoise))
01360 sLofarRq.iRemoveNoise = LGUI_DEF_REMOVE_NOISE;
01361 if (!Cfg.GetFlt("Alpha", &sLofarRq.fAlpha))
01362 sLofarRq.fAlpha = LGUI_DEF_ALPHA;
01363 if (!Cfg.GetInt("MeanLength", &sLofarRq.lMeanLength))
01364 sLofarRq.lMeanLength = LGUI_DEF_MEAN_LENGTH;
01365 if (!Cfg.GetInt("GapLength", &sLofarRq.lGapLength))
01366 sLofarRq.lGapLength = LGUI_DEF_GAP_LENGTH;
01367 if (!Cfg.GetInt("AverageCount", &sLofarRq.lAvgCount))
01368 sLofarRq.lAvgCount = 1;
01369 if (!Cfg.GetInt("Clip", &sLofarRq.iClip))
01370 sLofarRq.iClip = MSG_LOFAR_CLIP_NONE;
01371 if (!Cfg.GetInt("Fit", &iFit))
01372 iFit = 0;
01373 if (!Cfg.GetInt("Palette", &iPalette))
01374 iPalette = 0;
01375 if (!iFit)
01376 iLofarWidth = sLofarRq.lWinLength;
01377 if (!Cfg.GetInt("Height", &iLofarHeight))
01378 iLofarHeight = LGUI_DEF_HEIGHT;
01379 if (!Cfg.GetInt("TIFFCompression", &iTIFFCompression))
01380 iTIFFCompression = 0;
01381 if (!Cfg.GetInt("JPEGQuality", &iJPEGQuality))
01382 iJPEGQuality = 100;
01383 if (!Cfg.GetInt("ContSaveScans", &iContSaveScans))
01384 iContSaveScans = 1024;
01385 if (!Cfg.GetInt("BeamCount", &iBeamCount))
01386 iBeamCount = 0;
01387 switch (iTIFFCompression)
01388 {
01389 case 0:
01390 iCompressMode = FB_TIFF_COMPRESS_NONE;
01391 break;
01392 case 1:
01393 iCompressMode = FB_TIFF_COMPRESS_RLE;
01394 break;
01395 case 2:
01396 iCompressMode = FB_TIFF_COMPRESS_LZW;
01397 break;
01398 case 3:
01399 iCompressMode = FB_TIFF_COMPRESS_JPEG;
01400 break;
01401 case 4:
01402 iCompressMode = FB_TIFF_COMPRESS_DEFLATE;
01403 break;
01404 default:
01405 iCompressMode = FB_TIFF_COMPRESS_NONE;
01406 }
01407 }
01408
01409
01410 clGUILofar::~clGUILofar ()
01411 {
01412 }
01413
01414
01415 int clGUILofar::Exec ()
01416 {
01417 FBLofar.SetSize(iLofarWidth, iLofarHeight);
01418 FBLofar.Clear();
01419 if (!Build())
01420 {
01421 g_print("User interface creation failed\n");
01422 return 1;
01423 }
01424 if (!ConnectSignals())
01425 {
01426 g_print("User interface signal connection failed\n");
01427 return 1;
01428 }
01429 gtk_main();
01430 FreeDrawingPrims();
01431 return 0;
01432 }
01433
01434
01435 gint clGUILofar::OnDelete (GtkWidget *gwSender, GdkEventAny *geaEvent)
01436 {
01437 bRun = false;
01438 if (bSaving)
01439 {
01440 FBLofar.StopSaveToFile();
01441 }
01442 gtk_main_quit();
01443 return 0;
01444 }
01445
01446
01447 void clGUILofar::OnHideToggled (GtkToggleButton *gtbSender, gpointer gpData)
01448 {
01449 if (gtk_toggle_button_get_active(gtbSender))
01450 {
01451 gtk_widget_hide(gwTable1);
01452 gtk_widget_hide(gwTable2);
01453 gtk_widget_hide(gwTable3);
01454 gtk_widget_hide(gwTable4);
01455 }
01456 else
01457 {
01458 gtk_widget_show(gwTable1);
01459 gtk_widget_show(gwTable2);
01460 gtk_widget_show(gwTable3);
01461 gtk_widget_show(gwTable4);
01462 }
01463 }
01464
01465
01466 gint clGUILofar::OnConnectClick (GtkWidget *gwSender, gpointer gpData)
01467 {
01468 char cpHost[LGUI_SERVER_MAXLEN + 1];
01469 int iPort;
01470
01471 if (bConnected)
01472 {
01473 gdk_input_remove(giGdkTag);
01474 SOp.Shutdown(2);
01475 SOp.Close();
01476 bConnected = false;
01477 }
01478 if (gwSender == gwBConnect)
01479 {
01480 if (ParseServerStr(cpHost, &iPort,
01481 gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(gwCServer)->entry))))
01482 {
01483 g_print("Connecting to host %s port %i...\n",
01484 cpHost, iPort);
01485 if (InitConnection(cpHost, iPort))
01486 {
01487 g_print("OK\n\n");
01488 }
01489 else
01490 {
01491 g_print("Failed\n\n");
01492 }
01493 }
01494 else
01495 {
01496 g_print("Incorrect server entry! Format: <host>:<port>\n");
01497 }
01498 }
01499
01500 return 0;
01501 }
01502
01503
01504 void clGUILofar::OnFreezeToggled (GtkToggleButton *gtbSender, gpointer gpData)
01505 {
01506 bFreezed = (gtk_toggle_button_get_active(gtbSender)) ? true : false;
01507 }
01508
01509
01510 gint clGUILofar::OnExposeLofar (GtkWidget *gwSender, GdkEventExpose *geeEvent,
01511 gpointer gpData)
01512 {
01513 int iExposeX;
01514 int iExposeY;
01515 int iExposeWidth;
01516 int iExposeHeight;
01517
01518 iExposeX = (geeEvent->area.x >= iLofarWidth) ? 0 : geeEvent->area.x;
01519 iExposeY = (geeEvent->area.y >= iLofarHeight) ? 0 : geeEvent->area.y;
01520 iExposeWidth = (geeEvent->area.width > (iLofarWidth - iExposeX)) ?
01521 (iLofarWidth - iExposeX) : geeEvent->area.width;
01522 iExposeHeight = (geeEvent->area.height > (iLofarHeight - iExposeY)) ?
01523 (iLofarHeight - iExposeY) : geeEvent->area.height;
01524 gdk_draw_rgb_32_image(gwDALofar->window, ggcLofarFG,
01525 iExposeX, iExposeY, iExposeWidth, iExposeHeight,
01526 GDK_RGB_DITHER_NONE, FBLofar.GetCurPtr(iExposeX, iExposeY),
01527 FBLofar.GetRowStride());
01528 return 0;
01529 }
01530
01531
01532 gint clGUILofar::OnConfigureLofar (GtkWidget *gwSender,
01533 GdkEventConfigure *gecEvent, gpointer gpData)
01534 {
01535
01536 return 0;
01537 }
01538
01539
01540 gint clGUILofar::OnExposeLine (GtkWidget *gwSender, GdkEventExpose *geeEvent,
01541 gpointer gpData)
01542 {
01543 int iExposeX;
01544 int iExposeY;
01545 int iExposeWidth;
01546 int iExposeHeight;
01547 int iWinHeight;
01548 int iLineCntr;
01549 int iLineY1;
01550 GDT *fpSpectData = SpectData;
01551
01552 if (fpSpectData == NULL) return 0;
01553 iWinHeight = gwDALine->allocation.height;
01554 iExposeX = (geeEvent->area.x >= lSpectSize) ? 0 : geeEvent->area.x;
01555 iExposeY = (geeEvent->area.y >= iWinHeight - 1) ? 0 : geeEvent->area.y;
01556 iExposeWidth = (geeEvent->area.width > (lSpectSize - iExposeX)) ?
01557 (lSpectSize - iExposeX) : geeEvent->area.width;
01558 iExposeHeight = (geeEvent->area.height > (iWinHeight - iExposeY)) ?
01559 (iWinHeight - iExposeY) : geeEvent->area.height;
01560 for (iLineCntr = iExposeX; iLineCntr < iExposeWidth; iLineCntr++)
01561 {
01562 iLineY1 = (int)
01563 ((iWinHeight - iWinHeight * fpSpectData[iLineCntr]) + 0.5);
01564 gdk_draw_line(gwDALine->window, ggcLineFG,
01565 iLineCntr, iLineY1,
01566 iLineCntr, iWinHeight - 1);
01567 }
01568 return 0;
01569 }
01570
01571
01572 gint clGUILofar::OnExposeCursor (GtkWidget *gwSender, GdkEventExpose *geeEvent,
01573 gpointer gpData)
01574 {
01575 DrawCursor();
01576 return 0;
01577 }
01578
01579
01580 gint clGUILofar::OnMotionLofar (GtkWidget *gwSender, GdkEventMotion *gemEvent,
01581 gpointer gpData)
01582 {
01583 iCursorX = (int) gemEvent->x;
01584 iCursorY = (int) gemEvent->y;
01585
01586
01587
01588
01589
01590
01591
01592
01593 if (gemEvent->state & GDK_BUTTON1_MASK)
01594 {
01595 if (!bCursorDrag)
01596 {
01597 sLCursor.iType = LGUI_CURSOR_11;
01598 sLCursor.iPosition = (int) gemEvent->x;
01599 bCursorDrag = true;
01600 }
01601 sLCursor.iDistance = abs(((int) gemEvent->x) - sLCursor.iPosition);
01602 DrawCursor();
01603 }
01604 else if (gemEvent->state & GDK_BUTTON2_MASK)
01605 {
01606 if (!bCursorDrag)
01607 {
01608 sLCursor.iType = LGUI_CURSOR_INF;
01609 sLCursor.iPosition = (int) gemEvent->x;
01610 bCursorDrag = true;
01611 }
01612 sLCursor.iDistance = abs(((int) gemEvent->x) - sLCursor.iPosition);
01613 DrawCursor();
01614 }
01615 else if (gemEvent->state & GDK_BUTTON3_MASK)
01616 {
01617 sLCursor.iPosition = (int) gemEvent->x;
01618 DrawCursor();
01619 }
01620 else bCursorDrag = false;
01621 PrintStatus();
01622 return 0;
01623 }
01624
01625
01626 gint clGUILofar::OnPaletteActivate (GtkWidget *gwSender, gpointer gpData)
01627 {
01628 iPalette = GtkUtils.OptionMenuGetActive(gwOMPalette, gwaMIPalette,
01629 LGUI_PALETTE_ITEMS);
01630 SetPalette(iPalette);
01631 return 0;
01632 }
01633
01634
01635 void clGUILofar::OnAverageToggled (GtkToggleButton *gtbSender, gpointer gpData)
01636 {
01637 bAveraged = (gtk_toggle_button_get_active(gtbSender)) ? true : false;
01638 }
01639
01640
01641 void clGUILofar::OnClipValueChanged (GtkAdjustment *gaSender, gpointer gpData)
01642 {
01643 fClip = gaSender->value;
01644 }
01645
01646
01647 void clGUILofar::OnSaveClicks (GtkWidget *gwSender, gpointer gpData)
01648 {
01649 int iAction = GPOINTER_TO_INT(gpData);
01650 const char *cpFileName;
01651 char *cpParseFileName;
01652 char *cpParsePtr;
01653 char *cpCompleteFileName;
01654 double dMinX;
01655 double dMaxX;
01656
01657
01658
01659 bSaving = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gwCBSaving)) ?
01660 true : false;
01661 switch (iAction)
01662 {
01663 case 0:
01664 gtk_widget_hide(gwFSSave);
01665 if (bSaving)
01666 {
01667 gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(gwCBSaving));
01668 }
01669 break;
01670 case 1:
01671 gtk_widget_hide(gwFSSave);
01672 cpFileName =
01673 gtk_file_selection_get_filename(GTK_FILE_SELECTION(gwFSSave));
01674 if (cpFileName == NULL) break;
01675 cpParseFileName = g_strdup(cpFileName);
01676 cpParsePtr = strtok(cpParseFileName, ".");
01677 if (cpParsePtr != NULL)
01678 {
01679 strImgFileName = cpParsePtr;
01680 }
01681 g_free(cpParseFileName);
01682 if (cpParsePtr == NULL) break;
01683 if (!bSaving)
01684 {
01685 if (!sLofarRq.bDemon)
01686 {
01687 dMinX = sLofarResHdr.fLowFreq;
01688 dMaxX = sLofarResHdr.fHighFreq;
01689 }
01690 else
01691 {
01692 dMinX = 0;
01693 dMaxX = sLofarResHdr.fDemonBand;
01694 }
01695 cpCompleteFileName = g_strdup_printf("%s.tif",
01696 strImgFileName.c_str());
01697
01698
01699
01700
01701 if (!FBLofar.SaveToFile(cpCompleteFileName, iCompressMode,
01702 iJPEGQuality, "LOFAR/DEMON"))
01703 {
01704 g_warning("Saving to file failed!");
01705 }
01706 SaveInfo(cpCompleteFileName, time(NULL) - (time_t)
01707 (FBLofar.GetHeight() * sLofarResHdr.fLineTime + 0.5f));
01708 }
01709 else
01710 {
01711 iScanCount = 0;
01712 iImgCount = 0;
01713 cpCompleteFileName = g_strdup_printf("%s%02i.tif",
01714 strImgFileName.c_str(), iImgCount);
01715 if (!FBLofar.StartSaveToFile(cpCompleteFileName,
01716 iCompressMode, iJPEGQuality, "LOFAR/DEMON",
01717 FB_TIFF_CONT_VERTICAL))
01718 {
01719 g_warning("Saving to file failed!");
01720 gtk_toggle_button_toggled(GTK_TOGGLE_BUTTON(gwCBSaving));
01721 }
01722 SaveInfo(cpCompleteFileName, time(NULL));
01723 }
01724 g_free(cpCompleteFileName);
01725 break;
01726 case 2:
01727 if (!bSaving)
01728 {
01729 gtk_widget_show(gwFSSave);
01730 }
01731 break;
01732 case 3:
01733 if (bSaving)
01734 {
01735 gtk_widget_show(gwFSSave);
01736 }
01737 else
01738 {
01739 FBLofar.StopSaveToFile();
01740 }
01741 break;
01742 }
01743 }
01744
01745
01746 void clGUILofar::OnGdkInput (gpointer gpData, gint giSource,
01747 GdkInputCondition gicCondition)
01748 {
01749 int iResMsgBufSize = GLOBAL_HEADER_LEN + sizeof(GDT) * lSpectSize;
01750 int iLineHeight;
01751 int iLineCntr;
01752 int iLineY1;
01753 long lAvgCntr;
01754 time_t ttBottomTime;
01755 char cpConvBuf[LGUI_CONV_BUF_SIZE];
01756 #ifdef __GNUG__
01757 char cpResMsgBuf[iResMsgBufSize];
01758 #else
01759 clAlloc ResMsgBuf;
01760 char *cpResMsgBuf = (char *) ResMsgBuf.Size(iResMsgBufSize * sizeof(char));
01761 #endif
01762 clAlloc LineData;
01763 GDT *fpSpectData = SpectData;
01764 GDT *fpAvgSpectData = AvgSpectData;
01765 GDT *fpLineData;
01766
01767 if (!bRun) return;
01768 G_LOCK(gmInputMutex);
01769 while (SOp.ReadSelect(0))
01770 {
01771 if (SOp.ReadN(cpResMsgBuf, iResMsgBufSize) == iResMsgBufSize)
01772 {
01773 if (bFreezed) continue;
01774 LofarMsg.GetResult(cpResMsgBuf, &sLofarResHdr, fpSpectData);
01775 if (fClip < 1)
01776 {
01777 DSP.Clip(fpSpectData, fClip, lSpectSize);
01778 DSP.Mul(fpSpectData, 1 / fClip, lSpectSize);
01779 }
01780 if (!bConfigured) Configure();
01781 if (sLofarResHdr.fPeakLevel >= 0.0f) iClips++;
01782 if (gwDALofar->allocation.height != iLofarHeight)
01783 ConfigureHeight();
01784 fpLineData = (GDT *) LineData.Size(iLofarWidth * sizeof(GDT));
01785 if (!bAveraged)
01786 {
01787 switch (iFit)
01788 {
01789 case LGUI_FIT_NEIGHBOR:
01790 DSP.Resample(fpLineData, iLofarWidth,
01791 fpSpectData, lSpectSize);
01792 FBLofar.DrawLine(fpLineData);
01793 break;
01794 case LGUI_FIT_AVERAGE:
01795 DSP.ResampleAvg(fpLineData, iLofarWidth,
01796 fpSpectData, lSpectSize);
01797 FBLofar.DrawLine(fpLineData);
01798 break;
01799 default:
01800 FBLofar.DrawLine(fpSpectData);
01801 }
01802 }
01803 else
01804 {
01805 for (lAvgCntr = 0L; lAvgCntr < lSpectSize; lAvgCntr++)
01806 {
01807 fpAvgSpectData[lAvgCntr] += fpSpectData[lAvgCntr];
01808 fpAvgSpectData[lAvgCntr] *= (GDT) 0.5;
01809 }
01810 switch (iFit)
01811 {
01812 case LGUI_FIT_NEIGHBOR:
01813 DSP.Resample(fpLineData, iLofarWidth,
01814 fpAvgSpectData, lSpectSize);
01815 FBLofar.DrawLine(fpLineData);
01816 break;
01817 case LGUI_FIT_AVERAGE:
01818 DSP.ResampleAvg(fpLineData, iLofarWidth,
01819 fpAvgSpectData, lSpectSize);
01820 FBLofar.DrawLine(fpLineData);
01821 break;
01822 default:
01823 FBLofar.DrawLine(fpAvgSpectData);
01824 }
01825 }
01826 gdk_window_copy_area(gwDALofar->window, ggcLofarFG,
01827 0, 1,
01828 gwDALofar->window,
01829 0, 0, iLofarWidth, iLofarHeight - 1);
01830 gdk_draw_rgb_32_image(gwDALofar->window, ggcLofarFG,
01831 0, 0, iLofarWidth, 1,
01832 GDK_RGB_DITHER_NONE,
01833 FBLofar.GetCurPtr(0,0), FBLofar.GetRowStride());
01834 gdk_window_clear(gwDALine->window);
01835 iLineHeight = gwDALine->allocation.height;
01836 if (iFit)
01837 {
01838 for (iLineCntr = 0; iLineCntr < iLofarWidth; iLineCntr++)
01839 {
01840 iLineY1 = (int)
01841 ((iLineHeight - iLineHeight * fpLineData[iLineCntr]) +
01842 0.5);
01843 gdk_draw_line(gwDALine->window, ggcLineFG,
01844 iLineCntr, iLineY1, iLineCntr, iLineHeight - 1);
01845 }
01846 }
01847 else
01848 {
01849 for (iLineCntr = 0; iLineCntr < lSpectSize; iLineCntr++)
01850 {
01851 iLineY1 = (int)
01852 ((iLineHeight - iLineHeight * fpSpectData[iLineCntr]) +
01853 0.5);
01854 gdk_draw_line(gwDALine->window, ggcLineFG,
01855 iLineCntr, iLineY1, iLineCntr, iLineHeight - 1);
01856 }
01857 }
01858 PrintStatus();
01859 strftime(cpConvBuf, LGUI_CONV_BUF_SIZE, "%H:%M:%S",
01860 localtime((time_t *) &sLofarResHdr.sTimeStamp.tv_sec));
01861 gtk_label_set_text(GTK_LABEL(gwLTopTime), cpConvBuf);
01862 ttBottomTime = (time_t) (sLofarResHdr.sTimeStamp.tv_sec -
01863 iLofarHeight * sLofarResHdr.fLineTime + 0.5f);
01864 strftime(cpConvBuf, LGUI_CONV_BUF_SIZE, "%H:%M:%S",
01865 localtime(&ttBottomTime));
01866 gtk_label_set_text(GTK_LABEL(gwLBottomTime), cpConvBuf);
01867 if (bSaving)
01868 {
01869 iScanCount++;
01870 if (iScanCount >= iContSaveScans)
01871 {
01872 iImgCount++;
01873 StartNewImgFile();
01874 iScanCount = 0;
01875 }
01876 }
01877 }
01878 else
01879 {
01880 g_print("clSockOp::ReadN() error: %s\n", strerror(SOp.GetErrno()));
01881 gdk_input_remove(giGdkTag);
01882 SOp.Shutdown(2);
01883 SOp.Close();
01884 bConnected = false;
01885 break;
01886 }
01887 }
01888 G_UNLOCK(gmInputMutex);
01889 }
01890