/* Classic Ladder Project */ /* Copyright (C) 2001-2007 Marc Le Douarain */ /* http://membres.lycos.fr/mavati/classicladder/ */ /* http://www.sourceforge.net/projects/classicladder */ /* February 2001 */ /* -------------------------------------------------------------------------------------------- */ /* Spy variables windows (booleans with checkboxes, and any with entry widgets) - GTK interface */ /* -------------------------------------------------------------------------------------------- */ /* This library is free software; you can redistribute it and/or */ /* modify it under the terms of the GNU Lesser General Public */ /* License as published by the Free Software Foundation; either */ /* version 2.1 of the License, or (at your option) any later version. */ /* This library is distributed in the hope that it will be useful, */ /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ /* Lesser General Public License for more details. */ /* You should have received a copy of the GNU Lesser General Public */ /* License along with this library; if not, write to the Free Software */ /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // modified for EMC // Chris Morley Feb 08 #include #include #include #include #include #include "classicladder.h" #include "global.h" #include "vars_access.h" #include "drawing.h" #include "edit.h" #include "classicladder_gtk.h" #include "vars_names.h" #include "symbols.h" #include "spy_vars_gtk.h" #define NBR_BOOLS_VAR_SPY 15 #define NBR_TYPE_BOOLS_SPY 3 #define NBR_FREE_VAR_SPY 15 static int toggle=0; GtkWidget *SpyBoolVarsWindow; GtkWidget *SpyFreeVarsWindow; GtkWidget *offsetboolvar[ NBR_TYPE_BOOLS_SPY ]; int ValOffsetBoolVar[ NBR_TYPE_BOOLS_SPY ] = { 0, 0, 0 }; GtkWidget *chkvar[ NBR_TYPE_BOOLS_SPY ][ NBR_BOOLS_VAR_SPY ]; GtkWidget *EntryVarSpy[NBR_FREE_VAR_SPY*3], *LabelFreeVars[ NBR_FREE_VAR_SPY]; GtkTooltips * TooltipsEntryVarSpy[ NBR_FREE_VAR_SPY ]; /* defaults vars to spy list */ int VarSpy[NBR_FREE_VAR_SPY][2] = { {VAR_MEM_WORD,0}, {VAR_MEM_WORD,1}, {VAR_MEM_WORD,2}, {VAR_MEM_WORD,3}, {VAR_MEM_WORD,4}, {VAR_MEM_WORD,5}, {VAR_MEM_WORD,6}, {VAR_MEM_WORD,7}, {VAR_MEM_WORD,8}, {VAR_MEM_WORD,9}, {VAR_MEM_WORD,10}, {VAR_MEM_WORD,11}, {VAR_MEM_WORD,12}, {VAR_MEM_WORD,13}, {VAR_MEM_WORD,14} }; GtkWidget *DisplayFormatVarSpy[NBR_FREE_VAR_SPY]; static gint chkvar_press_event( GtkWidget *widget, void * numcheck ) { long NumCheckWidget = (long)numcheck; int Type = VAR_MEM_BIT; int Offset = ValOffsetBoolVar[ 0 ]; int NumCheck = NumCheckWidget; if( NumCheckWidget>=NBR_BOOLS_VAR_SPY && NumCheckWidget<2*NBR_BOOLS_VAR_SPY ) { Type = VAR_PHYS_INPUT; Offset = ValOffsetBoolVar[ 1 ]; NumCheck -= NBR_BOOLS_VAR_SPY; } if( NumCheckWidget>=2*NBR_BOOLS_VAR_SPY && NumCheckWidget<3*NBR_BOOLS_VAR_SPY ) { Type = VAR_PHYS_OUTPUT; Offset = ValOffsetBoolVar[ 2 ]; NumCheck -= 2*NBR_BOOLS_VAR_SPY; } if (gtk_toggle_button_get_active((GtkToggleButton *)widget)) WriteVar(Type,Offset+NumCheck,1); else WriteVar(Type,Offset+NumCheck,0); return TRUE; } void RefreshOneBoolVar( int Type, int Num, int Val ) { int Col = 0; switch( Type ) { case VAR_PHYS_INPUT: Col = 1; break; case VAR_PHYS_OUTPUT: Col = 2; break; } if ( Num>=ValOffsetBoolVar[ Col ] && Num%cB%d",'%', OffVar+ValOffsetBoolVar[ ColumnVar ]); break; case 1: snprintf(BufNumVar, 256, "%cI%d",'%', OffVar+ValOffsetBoolVar[ ColumnVar ]); break; case 2: snprintf(BufNumVar, 256, "%cQ%d",'%', OffVar+ValOffsetBoolVar[ ColumnVar ]); break; } gtk_label_set_markup (GTK_LABEL (GTK_BIN( chkvar[ ColumnVar ][ OffVar ] )->child),BufNumVar); } } } static gint OffsetBoolVar_activate_event(GtkWidget *widget, void * NumVarSpy) { int Maxi = 0; long NumType = (long)NumVarSpy; int ValOffset = atoi( gtk_entry_get_text((GtkEntry *)widget) ); switch( NumType ) { case 0: Maxi = NBR_BITS; break; case 1: Maxi = NBR_PHYS_INPUTS; break; case 2: Maxi = NBR_PHYS_OUTPUTS; break; } if ( ValOffset+NBR_BOOLS_VAR_SPY>Maxi || ValOffset<0 ) ValOffset = 0; ValOffsetBoolVar[ NumType ] = ValOffset; UpdateAllLabelsBoolsVars( ); RefreshAllBoolsVars( ); return TRUE; } // return true so window is not destroyed // set toggle to 3 so hitting vars button again wiil hide everything // unless we were only showing BoolVars window then start from the beginning gint BoolVarsWindowDeleteEvent( GtkWidget * widget, GdkEvent * event, gpointer data ) { gtk_widget_hide( SpyBoolVarsWindow ); if (toggle==1) {toggle=0; }else{toggle=3;} return TRUE; } void BoolVarsWindowInitGtk() { GtkWidget *vboxboolvars[ NBR_TYPE_BOOLS_SPY ],*vboxmain,*hboxvars; long NumCheckWidget,ColumnVar; GtkTooltips * WidgetTooltips[ NBR_TYPE_BOOLS_SPY ]; SpyBoolVarsWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title ((GtkWindow *)SpyBoolVarsWindow, "Bit Status Window"); vboxmain = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (SpyBoolVarsWindow), vboxmain); gtk_widget_show (vboxmain); hboxvars = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (vboxmain), hboxvars); gtk_widget_show (hboxvars); for( ColumnVar=0; ColumnVar>1; } if ( Val==0 ) strcpy( TabBin,"0" ); return TabBin; } // This function updates the signed Integer window // It checks the display format and displays the number in hex,binary or decimal // It checks to see what type of word variable it represents (Hal s32 pin in or out or an internal memory variable) and displays that label with colour // If Displays variable names or symbol names depending on the check box in the section display window void DisplayFreeVarSpy() { static int LastTime; int NumVarSpy,i=NBR_FREE_VAR_SPY; int Value; char BufferValue[50]; char DisplayFormat[10]; char * VarName; if ( NBR_WORDS < NBR_FREE_VAR_SPY) { i=NBR_WORDS ;} for (NumVarSpy=0; NumVarSpyentry) ); strcpy( BufferValue, "" ); if (strcmp( DisplayFormat,"Dec" )==0 ) sprintf(BufferValue,"%d",Value); if (strcmp( DisplayFormat,"Hex" )==0 ) sprintf(BufferValue,"%X",Value); if (strcmp( DisplayFormat,"Bin" )==0 ) strcpy( BufferValue, ConvToBin( Value ) ); gtk_entry_set_text((GtkEntry *)EntryVarSpy[NumVarSpy+(2*NBR_FREE_VAR_SPY)],BufferValue); VarName= "Other "; switch (VarSpy[NumVarSpy][0]) { case VAR_TIMER_VALUE : case VAR_TIMER_PRESET : case VAR_TIMER_RUNNING : case VAR_TIMER_DONE : VarName= "Timer "; break; case VAR_TIMER_IEC_VALUE : case VAR_TIMER_IEC_PRESET : case VAR_TIMER_IEC_DONE : VarName= "IEC Timer "; break; case VAR_COUNTER_VALUE : case VAR_COUNTER_PRESET : case VAR_COUNTER_FULL : case VAR_COUNTER_EMPTY : case VAR_COUNTER_DONE : VarName= "Counter "; break; case VAR_MONOSTABLE_RUNNING : case VAR_MONOSTABLE_PRESET : case VAR_MONOSTABLE_VALUE : VarName= "Monostable "; break; case VAR_MEM_WORD : VarName= "Memory "; break; case VAR_PHYS_INPUT : VarName= "Bit In Pin "; break; case VAR_PHYS_OUTPUT : VarName= "Bit Out Pin "; break; case VAR_PHYS_FLOAT_INPUT : VarName= "Floatin Pin "; break; case VAR_PHYS_FLOAT_OUTPUT : VarName= "Floatout Pin"; break; case VAR_PHYS_WORD_INPUT : VarName= "S32in Pin "; break; case VAR_PHYS_WORD_OUTPUT : VarName= "S32out Pin "; break; case VAR_MEM_BIT : VarName= "Bit Memory "; break; case VAR_ERROR_BIT : VarName= "Error Bit "; break; case VAR_STEP_ACTIVITY : VarName= "Step Active "; break; case VAR_STEP_TIME : VarName= "Step Run Time"; break; } gtk_label_set_markup (GTK_LABEL (LabelFreeVars[NumVarSpy]),VarName); if (InfosGene->DisplaySymbols!=LastTime) { gtk_entry_set_text((GtkEntry *)EntryVarSpy[ NumVarSpy+(1 *NBR_FREE_VAR_SPY)],CreateVarName(VarSpy[NumVarSpy][0],VarSpy[NumVarSpy][1])); } } // we do this check after the FOR loop // so it does not toggle each time thru loop // Toggle LastTime to match InfoGene if (InfosGene->DisplaySymbols!=LastTime) { LastTime=((LastTime-1)*-1); } } static gint EntryVarSpy_activate_event(GtkWidget *widget, int NumSpy) { int NewVarType,NewVarOffset; int * NumVarSpy = &VarSpy[NumSpy][0]; char BufferVar[30]; strcpy(BufferVar, gtk_entry_get_text((GtkEntry *)widget) ); if (TextParserForAVar(BufferVar , &NewVarType, &NewVarOffset, NULL, FALSE/*PartialNames*/)) { char * OtherVarName = NULL; *NumVarSpy++ = NewVarType; *NumVarSpy = NewVarOffset; if ( BufferVar[ 0 ]=='%' ) { OtherVarName = ConvVarNameToSymbol( BufferVar ); }else{ OtherVarName = ConvSymbolToVarName( BufferVar ); } if ( OtherVarName ) { gtk_tooltips_set_tip ( TooltipsEntryVarSpy[ NumSpy ], widget, OtherVarName, NULL ); } }else{ int OldType,OldOffset; /* Error Message */ if (ErrorMessageVarParser) { ShowMessageBox("Error",ErrorMessageVarParser,"Ok"); }else{ ShowMessageBox( "Error", "Unknown variable...", "Ok" ); } OldType = *NumVarSpy++; OldOffset = *NumVarSpy; /* put back old correct var */ gtk_entry_set_text((GtkEntry *)widget,CreateVarName(OldType,OldOffset)); } return TRUE; } //return true so window is not destroyed //set toggle to 3 so hitting vars button again wiil hide everything //unless we were only showing FreeVars window then start from the beginning gint FreeVarsWindowDeleteEvent( GtkWidget * widget, GdkEvent * event, gpointer data ) { gtk_widget_hide( SpyFreeVarsWindow ); if (toggle==2) { toggle=0; }else{ toggle=3; } return TRUE; } // modified this to have 3 columns so we can display variable type void FreeVarsWindowInitGtk( ) { GtkWidget * hboxfreevars[ NBR_FREE_VAR_SPY ], *vboxMain; char * VarName= NULL; long ColumnVar; int NumVarSpy,NumEntry,i=NBR_FREE_VAR_SPY; GList *DisplayFormatItems = NULL; SpyFreeVarsWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title ((GtkWindow *)SpyFreeVarsWindow, "Watch Window"); vboxMain = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (SpyFreeVarsWindow), vboxMain); gtk_widget_show (vboxMain); DisplayFormatItems = g_list_append(DisplayFormatItems,"Dec"); DisplayFormatItems = g_list_append(DisplayFormatItems,"Hex"); DisplayFormatItems = g_list_append(DisplayFormatItems,"Bin"); if ( NBR_WORDS < NBR_FREE_VAR_SPY) { i=NBR_WORDS ;} for(NumVarSpy=0; NumVarSpy