00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <locale.h>
00029 #include <libintl.h>
00030
00031
00032
00033
00034 #include "gxsm_app.h"
00035 #include "app_remote.h"
00036
00037 #include "unit.h"
00038 #include "pcs.h"
00039 #include "xsmtypes.h"
00040
00041 #include "action_id.h"
00042
00043 #include "glbvars.h"
00044
00045 typedef struct REMOTEENTRY{
00046 gchar *label;
00047 gint width;
00048 gchar *data;
00049 };
00050
00051 REMOTEENTRY remotetabledef[] = {
00052 { "X", 10, NULL },
00053 { "verb", 50, NULL },
00054 { "command", 50, NULL },
00055 { "arg1", 50, NULL },
00056 { "arg2", 50, NULL },
00057 { NULL, 0, NULL }
00058 };
00059
00060
00061 int r_startscan(CMDFKTARGS){
00062
00063 gapp->action_toolbar_callback(NULL, (void*)"Toolbar_Scan_Start");
00064 return 0;
00065 }
00066
00067 int r_waitscan(CMDFKTARGS){
00068
00069
00070 return 0;
00071 }
00072
00073 int r_stopscan(CMDFKTARGS){
00074 gapp->action_toolbar_callback(NULL, (void*)"Toolbar_Scan_Stop");
00075 return 0;
00076 }
00077
00078 int r_scaninit(CMDFKTARGS){
00079 gapp->action_toolbar_callback(NULL, (void*)"Toolbar_Scan_Init");
00080 return 0;
00081 }
00082
00083 int r_scanupdate(CMDFKTARGS){
00084 gapp->action_toolbar_callback(NULL, (void*)"Toolbar_Scan_UpdateParam");
00085 return 0;
00086 }
00087
00088 int r_scanline(CMDFKTARGS){
00089 if(arglist[2]){
00090 gchar *cmd=NULL;
00091 if(arglist[3] && arglist[4]){
00092 cmd = g_strdup_printf ("3 %d %d %d",
00093 atoi(arglist[2]),
00094 atoi(arglist[3]),
00095 atoi(arglist[4]));
00096 gapp->PutPluginData (cmd);
00097 gapp->action_toolbar_callback (NULL, (void*)"Toolbar_Scan_Partial_Line");
00098 }
00099 else{
00100 cmd = g_strdup_printf ("d %d",
00101 atoi(arglist[2]));
00102 gapp->PutPluginData (cmd);
00103 gapp->action_toolbar_callback (NULL, (void*)"Toolbar_Scan_Line");
00104 }
00105 g_free (cmd);
00106 }
00107 return 0;
00108 }
00109
00110 int r_scanylookup(CMDFKTARGS){
00111 if(arglist[2] && arglist[3]){
00112 gchar *cmd=NULL;
00113 cmd = g_strdup_printf ("2 %d %g",
00114 atoi(arglist[2]),
00115 atof(arglist[3]));
00116 gapp->PutPluginData (cmd);
00117 gapp->action_toolbar_callback (NULL, (void*)"Toolbar_Scan_SetYLookup");
00118 g_free (cmd);
00119 }
00120 return 0;
00121 }
00122
00123 int r_save(CMDFKTARGS){
00124 gapp->xsm->save (TRUE);
00125 return 0;
00126 }
00127 int r_saveas(CMDFKTARGS){
00128 if(arglist[3] && arglist[2])
00129 gapp->xsm->save(FALSE, arglist[2], atoi(arglist[3]));
00130 return 0;
00131 }
00132 int r_load(CMDFKTARGS){
00133 if(arglist[3] && arglist[2]){
00134 gapp->xsm->ActivateChannel( atoi(arglist[3]) );
00135 gapp->xsm->load(arglist[2]);
00136 }
00137 return 0;
00138 }
00139
00140 int r_gnuimport(CMDFKTARGS){
00141 if(arglist[3] && arglist[2]){
00142 gapp->xsm->ActivateChannel( atoi(arglist[3]) );
00143 gapp->xsm->load(arglist[2]);
00144 }
00145 return 0;
00146 }
00147
00148 int r_gnuexport(CMDFKTARGS){
00149 if(arglist[3] && arglist[2]){
00150 gapp->xsm->ActivateChannel( atoi(arglist[3]) );
00151 gapp->xsm->gnuexport(arglist[2]);
00152 }
00153 return 0;
00154 }
00155 int r_autodisp(CMDFKTARGS){
00156 gapp->xsm->AutoDisplay();
00157 return 0;
00158 }
00159 int r_chmode_a(CMDFKTARGS){
00160 if(arglist[2])
00161 gapp->xsm->ActivateChannel(atoi(arglist[2]));
00162 return 0;
00163 }
00164 int r_chmode_m(CMDFKTARGS){
00165 if(arglist[2])
00166 gapp->xsm->SetMode(atoi(arglist[2]), ID_CH_M_MATH);
00167 return 0;
00168 }
00169 int r_chmode_x(CMDFKTARGS){
00170 if(arglist[2])
00171 gapp->xsm->SetMode(atoi(arglist[2]), ID_CH_M_X);
00172 return 0;
00173 }
00174 int r_chmode_n(CMDFKTARGS){
00175 if(arglist[2] && arglist[3])
00176 gapp->xsm->SetMode(atoi(arglist[2]), ID_CH_M_X+atoi(arglist[3]));
00177 return 0;
00178 }
00179 int r_chview_no(CMDFKTARGS){
00180 if(arglist[2])
00181 gapp->xsm->SetView(atoi(arglist[2]), ID_CH_V_NO);
00182 return 0;
00183 }
00184 int r_chview_1d(CMDFKTARGS){
00185 if(arglist[2])
00186 gapp->xsm->SetView(atoi(arglist[2]), ID_CH_V_PROFILE);
00187 return 0;
00188 }
00189 int r_chview_2d(CMDFKTARGS){
00190 if(arglist[2])
00191 gapp->xsm->SetView(atoi(arglist[2]), ID_CH_V_GREY);
00192 return 0;
00193 }
00194 int r_chview_3d(CMDFKTARGS){
00195 if(arglist[2])
00196 gapp->xsm->SetView(atoi(arglist[2]), ID_CH_V_SURFACE);
00197 return 0;
00198 }
00199
00200 int r_cmdquick(CMDFKTARGS){
00201 gapp->xsm->SetVM(SCAN_V_QUICK);
00202 return 0;
00203 }
00204
00205 int r_cmddirect(CMDFKTARGS){
00206 gapp->xsm->SetVM(SCAN_V_DIRECT);
00207 return 0;
00208 }
00209
00210 int r_cmdlog(CMDFKTARGS){
00211 gapp->xsm->SetVM(SCAN_V_LOG);
00212 return 0;
00213 }
00214
00215 int r_cmdunitbz(CMDFKTARGS){
00216 gapp->xsm->SetModeFlg(MODE_BZUNIT);
00217 gapp->xsm->ClrModeFlg(MODE_VOLTUNIT);
00218 return 0;
00219 }
00220
00221 int r_cmdunitvolt(CMDFKTARGS){
00222 gapp->xsm->SetModeFlg(MODE_VOLTUNIT);
00223 gapp->xsm->ClrModeFlg(MODE_BZUNIT);
00224 return 0;
00225 }
00226
00227 int r_cmduniteV(CMDFKTARGS){
00228 gapp->xsm->SetModeFlg(MODE_ENERGY_EV);
00229 gapp->xsm->ClrModeFlg(MODE_ENERGY_S);
00230 return 0;
00231 }
00232
00233 int r_cmdunitS(CMDFKTARGS){
00234 gapp->xsm->SetModeFlg(MODE_ENERGY_S);
00235 gapp->xsm->ClrModeFlg(MODE_ENERGY_EV);
00236 return 0;
00237 }
00238
00239
00240 gint r_WakeUp(gpointer *data){
00241 gapp->remotecontrol->resume();
00242 return FALSE;
00243 }
00244
00245 int r_cmdsleep(CMDFKTARGS){
00246 if(arglist[2]){
00247 int ms;
00248 if( (ms=atoi(arglist[2])) )
00249 if(ms > 10L && ms < 600000){
00250 gapp->remotecontrol->pause();
00251 gtk_timeout_add( ms, (GtkFunction) r_WakeUp, NULL);
00252 }
00253 }
00254 return 0;
00255 }
00256
00257 int r_cmdecho(CMDFKTARGS){
00258 if(arglist[2]){
00259 gchar *mld=g_strconcat(arglist[2],"\n",NULL);
00260 gapp->remotecontrol->writestatus(mld);
00261 g_free(mld);
00262 }
00263 return 0;
00264 }
00265
00266 int r_logev(CMDFKTARGS){
00267 if(arglist[2]){
00268 gapp->monitorcontrol->LogEvent("RemoteLogEv", arglist[2]);
00269 }else{
00270 gapp->monitorcontrol->LogEvent("RemoteLogEv", "--");
00271 }
00272 return 0;
00273 }
00274
00275 int r_cmdquit(CMDFKTARGS){
00276 gapp->remotecontrol->stop();
00277 return 0;
00278 }
00279
00280 int r_analog_da0(CMDFKTARGS){
00281 if(arglist[2]){
00282 XSM_DEBUG(DBG_L3, "Setting DA0 to " << arglist[2] );
00283
00284 }
00285 return 0;
00286 }
00287
00288 int search_for_menupath_cb(CMDFKTARGS){
00289 GtkWidget *menushell;
00290 GtkWidget *menuitem;
00291 gint pos;
00292 XSM_DEBUG(DBG_L2, "Looking for menupath:" << arglist[0] << ", " << arglist[1] << ", " << arglist[2] );
00293
00294 menushell = gnome_app_find_menu_pos (gapp->gxsmmenu, arglist[1], &pos);
00295
00296 --pos;
00297
00298 if(! menushell) return 0;
00299 XSM_DEBUG(DBG_L2, "Menu Shell Found: " << pos << " Item=" << menushell );
00300
00301 menuitem = (GtkWidget*)g_list_nth_data(GTK_MENU_SHELL (menushell) -> children, pos);
00302
00303 if(! menuitem) return 0;
00304 XSM_DEBUG(DBG_L2, "Menu Item Found: " << menuitem );
00305
00306 GdkEvent event;
00307 gint return_val;
00308 gtk_signal_emit (GTK_OBJECT(GTK_MENU_ITEM (menuitem) ),
00309 gtk_signal_lookup ("activate", GTK_OBJECT_TYPE (GTK_OBJECT(menuitem))),
00310 &event, &return_val);
00311
00312 XSM_DEBUG(DBG_L2, "Signal emitted to pos " << pos << " ! ret=" << return_val );
00313
00314 return 0;
00315 }
00316
00317 remote_cmd scan_list[] = {
00318 { "start", r_startscan, NULL },
00319 { "wait", r_waitscan, NULL },
00320 { "stop", r_stopscan, NULL },
00321 { "init", r_scaninit, NULL },
00322 { "update", r_scanupdate, NULL },
00323 { "setylookup", r_scanylookup, NULL },
00324 { "line", r_scanline, NULL },
00325 { NULL, NULL, NULL }
00326 };
00327
00328 remote_cmd file_list[] = {
00329 { "load", r_load, NULL },
00330 { "save", r_save, NULL },
00331 { "saveas", r_saveas, NULL },
00332 { NULL, NULL, NULL }
00333 };
00334
00335 remote_cmd gnu_list[] = {
00336 { "import", r_gnuimport, NULL },
00337 { "export", r_gnuexport, NULL },
00338 { NULL, NULL, NULL }
00339 };
00340
00341 remote_cmd cmd_list[] = {
00342 { "echo", r_cmdecho, NULL },
00343 { "logev", r_logev, NULL },
00344 { "autodisp", r_autodisp, NULL },
00345 { "chmodeA", r_chmode_a, NULL },
00346 { "chmodeM", r_chmode_m, NULL },
00347 { "chmodeX", r_chmode_x, NULL },
00348 { "chmodeN", r_chmode_n, NULL },
00349 { "chviewNo", r_chview_no, NULL },
00350 { "chview1D", r_chview_1d, NULL },
00351 { "chview2D", r_chview_2d, NULL },
00352 { "chview3D", r_chview_3d, NULL },
00353 { "quick", r_cmdquick, NULL },
00354 { "direct", r_cmddirect, NULL },
00355 { "log", r_cmdlog, NULL },
00356 { "unitbz", r_cmdunitbz, NULL },
00357 { "unitvolt", r_cmdunitvolt, NULL },
00358 { "uniteV", r_cmduniteV, NULL },
00359 { "unitS", r_cmdunitS, NULL },
00360 { "sleepms", r_cmdsleep, NULL },
00361 { "quit", r_cmdquit, NULL },
00362 { NULL, NULL, NULL }
00363 };
00364
00365 remote_cmd analog_list[] = {
00366 { "da0", r_analog_da0, NULL },
00367 { NULL, NULL, NULL }
00368 };
00369
00370 remote_cmd use_menupath_as_list[] = {
00371 { NULL, search_for_menupath_cb, NULL }
00372 };
00373
00374
00375 remote_verb remote_verbs[] = {
00376 { REMO_SETENTRY, "set", NULL },
00377 { REMO_CBACTION, "action", NULL },
00378 { REMO_ACTION, "scan", scan_list },
00379 { REMO_ACTION, "file", file_list },
00380 { REMO_ACTION, "gnu", gnu_list },
00381 { REMO_ACTION, "cmd", cmd_list },
00382 { REMO_ACTION, "analog", analog_list },
00383 { REMO_MENUACTION, "menupath", use_menupath_as_list },
00384 { REMO_ENDLIST, NULL, NULL }
00385 };
00386
00387 RemoteControl::RemoteControl () : remote_crtl (remote_verbs)
00388 {
00389 Dlg=NULL;
00390 op=FALSE;
00391 gio=NULL;
00392 }
00393
00394 RemoteControl::~RemoteControl (){
00395 stop();
00396 }
00397
00398 void RemoteControl::run(){
00399 int i;
00400 GtkWidget *dialog;
00401 GtkWidget *vbox;
00402 GtkWidget *label, *scrollwnd, *input;
00403
00404 DlgStart();
00405 Dlg = dialog = gtk_dialog_new_with_buttons (_("Remote Control"),
00406 NULL,
00407 (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
00408 GTK_STOCK_EXECUTE, MY_GTK_RESPONSE_RUN,
00409 "Pause", MY_GTK_RESPONSE_PAUSE,
00410 GTK_STOCK_STOP, MY_GTK_RESPONSE_STOP,
00411 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
00412 NULL);
00413
00414 vbox = gtk_vbox_new (FALSE, 0);
00415 gtk_widget_show (vbox);
00416
00417 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
00418 vbox, TRUE, TRUE, GNOME_PAD);
00419
00420 input = gtk_entry_new();
00421 gtk_object_set_data( GTK_OBJECT (dialog), "statusfield", input);
00422 gtk_entry_set_editable(GTK_ENTRY(input), FALSE);
00423 gtk_entry_set_text(GTK_ENTRY(input), "Open other side and press run to enable remote fifo !");
00424 gtk_widget_show (input);
00425 gtk_box_pack_start (GTK_BOX (vbox), input, TRUE, TRUE, 0);
00426
00427 scrollwnd = gtk_scrolled_window_new (NULL, NULL);
00428 gtk_widget_set_name (scrollwnd, "scrollwnd");
00429 gtk_widget_show (scrollwnd);
00430 gtk_box_pack_start (GTK_BOX (vbox), scrollwnd, TRUE, TRUE, 0);
00431 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrollwnd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
00432
00433 for(i=0; remotetabledef[i++].label;);
00434
00435 list = gtk_clist_new (ncol=i);
00436 gtk_widget_set_name (list, "list");
00437
00438 gtk_widget_show (list);
00439 gtk_container_add (GTK_CONTAINER (scrollwnd), list);
00440 gtk_widget_set_size_request (list, 250, 300);
00441
00442
00443
00444 for(i=0; remotetabledef[i].label; ++i){
00445 gtk_clist_set_column_width (GTK_CLIST (list), i, remotetabledef[i].width);
00446 label = gtk_label_new (_(remotetabledef[i].label));
00447 gtk_widget_set_name (label, remotetabledef[i].label);
00448 gtk_widget_show (label);
00449 gtk_clist_set_column_widget (GTK_CLIST (list), i, label);
00450 }
00451 gtk_clist_column_titles_show (GTK_CLIST (list));
00452
00453 gtk_signal_connect(GTK_OBJECT(dialog), "clicked",
00454 GTK_SIGNAL_FUNC(RemoteControl::dlg_clicked),
00455 this);
00456
00457 gtk_widget_show(dialog);
00458 }
00459
00460 void RemoteControl::stop(){
00461 XSM_DEBUG(DBG_L2, "---STOP--- press Play to reopen fifo... " );
00462 if(gio){
00463 g_io_channel_close (gio);
00464
00465 gio = NULL;
00466 }
00467 if(op){
00468 rcclose();
00469 op = FALSE;
00470 }
00471 wait(FALSE);
00472 gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data( GTK_OBJECT (Dlg), "statusfield")),
00473 "- STOP - Press run to enable remote fifo !");
00474 }
00475
00476 void RemoteControl::pause(){
00477 XSM_DEBUG(DBG_L2, "---PAUSE---" );
00478 wait(TRUE);
00479 gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data( GTK_OBJECT (Dlg), "statusfield")),
00480 "- PAUSE -");
00481 }
00482
00483 void RemoteControl::resume(){
00484 XSM_DEBUG(DBG_L2, "---RESUME---" );
00485 wait(FALSE);
00486 if(!op) return;
00487 if(!gio){
00488 gio = g_io_channel_unix_new (remotefifo);
00489 g_io_add_watch (gio,
00490 (GIOCondition)(G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP | G_IO_NVAL),
00491 InputFunction, this);
00492 }
00493 gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data( GTK_OBJECT (Dlg), "statusfield")),
00494 "- RESUME -");
00495 }
00496
00497 void RemoteControl::play(){
00498 XSM_DEBUG(DBG_L2, "---PLAY---" );
00499 wait(FALSE);
00500 if(!gio){
00501 if(!op){
00502 rcopen(xsmres.RemoteFifo, xsmres.RemoteFifoOut);
00503 op = TRUE;
00504 }
00505 gio = g_io_channel_unix_new (remotefifo);
00506 g_io_add_watch (gio,
00507 (GIOCondition)(G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP | G_IO_NVAL),
00508 InputFunction, this);
00509 }
00510 gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data( GTK_OBJECT (Dlg), "statusfield")),
00511 "- PLAYING -");
00512 }
00513
00514 void RemoteControl::dlg_clicked(GtkDialog * dialog, gint response, RemoteControl *rc){
00515 switch(response){
00516 case MY_GTK_RESPONSE_RUN:
00517 rc->play();
00518 break;
00519 case MY_GTK_RESPONSE_PAUSE:
00520 if(!rc->gio)
00521 rc->resume();
00522 else
00523 rc->pause();
00524 break;
00525 case MY_GTK_RESPONSE_STOP:
00526 rc->stop();
00527 break;
00528 case GTK_RESPONSE_CLOSE:
00529 rc->stop();
00530 gtk_widget_destroy (GTK_WIDGET (dialog));
00531 rc->DlgDone();
00532 break;
00533 }
00534 }
00535
00536 gboolean RemoteControl::InputFunction(GIOChannel *ch,
00537 GIOCondition condition,
00538 void *rc){
00539 switch (condition) {
00540 case G_IO_IN:
00541 case (G_IO_IN | G_IO_HUP):
00542 if (! ((RemoteControl*)rc)->waiting())
00543 ((RemoteControl*)rc)->readfifo(ch);
00544 break;
00545 case G_IO_PRI:
00546 g_warning( "G_IO_PRI" );
00547 break;
00548 case G_IO_ERR:
00549 g_warning( "G_IO_ERR" );
00550 break;
00551 case G_IO_HUP:
00552 g_warning( "G_IO_HUP" );
00553 g_io_channel_close( ch );
00554 return FALSE;
00555 case G_IO_NVAL:
00556 g_warning( "G_IO_NVAL - Pipe broken/closed, stopping remotecontrol." );
00557
00558 ((RemoteControl*)rc)->stop();
00559 return FALSE;
00560 break;
00561 default:
00562 g_error( "unknown exception: %d", condition );
00563 }
00564
00565 return TRUE;
00566 }
00567
00568 int RemoteControl::addcmd(gchar **cmdargvlist){
00569 int n;
00570 gchar **columns;
00571 gchar **p;
00572 columns = new gchar*[ncol];
00573 columns[0]=NULL;
00574 for(n=1, p=cmdargvlist; *p && n<ncol; ++p, ++n)
00575 columns[n] = g_strdup(*p);
00576 for(; n<ncol; ++n)
00577 columns[n]=NULL;
00578 gtk_clist_append (GTK_CLIST (list), columns);
00579 delete [] columns;
00580
00581 return 0;
00582 }