app_remote.C

Go to the documentation of this file.
00001 /* Gxsm - Gnome X Scanning Microscopy
00002  * universal STM/AFM/SARLS/SPALEED/... controlling and
00003  * data analysis software
00004  * 
00005  * Copyright (C) 1999,2000,2001,2002,2003 Percy Zahl
00006  *
00007  * Authors: Percy Zahl <zahl@users.sf.net>
00008  * additional features: Andreas Klust <klust@users.sf.net>
00009  * WWW Home: http://gxsm.sf.net
00010  *
00011  * This program is free software; you can redistribute it and/or modify
00012  * it under the terms of the GNU General Public License as published by
00013  * the Free Software Foundation; either version 2 of the License, or
00014  * (at your option) any later version.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU General Public License
00022  * along with this program; if not, write to the Free Software
00023  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00024  */
00025 
00026 /* -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 8 c-style: "K&R" -*- */
00027 
00028 #include <locale.h>
00029 #include <libintl.h>
00030 
00031 
00032 // #include <unistd.h>
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 // #define CMDFKTARGS gchar **arglist, gpointer data
00061 int r_startscan(CMDFKTARGS){
00062         // starts scan and returns, play() is exec. at scan end
00063         gapp->action_toolbar_callback(NULL, (void*)"Toolbar_Scan_Start"); 
00064         return 0;
00065 }
00066 
00067 int r_waitscan(CMDFKTARGS){
00068 //  if( gapp->xsm->ScanInProgress() )
00069 //    XSM_DEBUG(DBG_L2, "Scan in progress " );
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){ // limit to 10ms .. 600000ms
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                 //  gapp->xsm->hardware->SetAnalog("da-name", atof(arglist[2]));
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         //  gtk_object_set_data (GTK_OBJECT (widget), "list", list);
00438         gtk_widget_show (list);
00439         gtk_container_add (GTK_CONTAINER (scrollwnd), list);
00440         gtk_widget_set_size_request (list, 250, 300);
00441         //  gtk_signal_connect (GTK_OBJECT (list), "select_row",
00442         //                      GTK_SIGNAL_FUNC (on_list_select_row),
00443         //                      NULL);
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 //    g_io_channel_shutdown (gio, FALSE, NULL);
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 //              g_source_remove( tag );
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 }

Generated on Sat Apr 1 09:03:47 2006 for GXSM by  doxygen 1.4.6