config_gtk.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 643 行 · 第 1/2 页
C
643 行
/* Classic Ladder Project *//* Copyright (C) 2001-2003 Marc Le Douarain *//* mavati@club-internet.fr *//* http://www.multimania.com/mavati/classicladder *//* July 2003 *//* ----------------------------- *//* Editor Config - 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 */#include <gtk/gtk.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include "classicladder.h"#include "manager.h"#include "edit.h"#include "global.h"#include "config_gtk.h"#define NBR_OBJECTS 11GtkWidget *LabelParam[ NBR_OBJECTS ],*ValueParam[ NBR_OBJECTS ];static char * Devices[] = { "None", "DirectPortAccess",#ifdef COMEDI_SUPPORT"/dev/comedi0", "/dev/comedi1", "/dev/comedi2", "/dev/comedi3",#endif NULL };#define NBR_IO_PARAMS 6GtkWidget *InputParamEntry[ NBR_INPUTS_CONF ][ NBR_IO_PARAMS ];GtkWidget *InputDeviceParam[ NBR_INPUTS_CONF ];GtkWidget *InputFlagParam[ NBR_INPUTS_CONF ];GtkWidget *OutputParamEntry[ NBR_OUTPUTS_CONF ][ NBR_IO_PARAMS ];GtkWidget *OutputDeviceParam[ NBR_OUTPUTS_CONF ];GtkWidget *OutputFlagParam[ NBR_OUTPUTS_CONF ];#ifdef USE_MODBUSstatic char * ModbusReqType[] = { "Inputs", "Coils", /* TODO: "WriteRegs", "ReadRegas",*/ NULL };#define NBR_MODBUS_PARAMS 6GtkWidget *ModbusParamEntry[ NBR_MODBUS_MASTER_REQ ][ NBR_MODBUS_PARAMS ];GtkWidget *SerialPortEntry;GtkWidget *SerialSpeedEntry;GtkWidget *PauseInterFrameEntry;GtkWidget *DebugLevelEntry;#endifGtkWidget *ConfigWindow;GtkWidget * CreateSizesPage( void ){ GtkWidget *vbox; GtkWidget *hbox[ NBR_OBJECTS ]; int NumObj; vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); for (NumObj=0; NumObj<NBR_OBJECTS; NumObj++) { char BuffLabel[ 50 ]; char BuffValue[ 20 ]; int InfoUsed = 0; hbox[NumObj] = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (vbox), hbox[NumObj]); gtk_widget_show (hbox[NumObj]); switch( NumObj ) { case 0: InfoUsed = GetNbrRungsDefined( )*100/InfosGene->SizesInfos.nbr_rungs; sprintf( BuffLabel, "Nbr.rungs (%d%c used)", InfoUsed,'%' ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_rungs ); break; case 1: sprintf( BuffLabel, "Nbr.Bits" ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_bits ); break; case 2: sprintf( BuffLabel, "Nbr.Words" ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_words ); break; case 3: sprintf( BuffLabel, "Nbr.Timers" ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_timers ); break; case 4: sprintf( BuffLabel, "Nbr.Monostables" ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_monostables ); break; case 5: sprintf( BuffLabel, "Nbr.Phys.Inputs" ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_phys_inputs ); break; case 6: sprintf( BuffLabel, "Nbr.Phys.Oututs" ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_phys_outputs ); break; case 7: sprintf( BuffLabel, "Nbr.Arithm.Expr" ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_arithm_expr ); break; case 8: InfoUsed = NbrSectionsDefined( )*100/InfosGene->SizesInfos.nbr_sections; sprintf( BuffLabel, "Nbr.Sections (%d%c used)", InfoUsed,'%' ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_sections ); break; case 9: sprintf( BuffLabel, "Nbr.S32.inputs " ); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_s32in ); break; case 10: sprintf( BuffLabel, "Nbr.S32.outputs "); sprintf( BuffValue, "%d", InfosGene->SizesInfos.nbr_s32out ); break; default: sprintf( BuffLabel, "???" ); sprintf( BuffValue, "???" ); break; } LabelParam[NumObj] = gtk_label_new(BuffLabel); gtk_widget_set_usize((GtkWidget *)LabelParam[NumObj],150,0); gtk_box_pack_start (GTK_BOX (hbox[NumObj]), LabelParam[NumObj], FALSE, FALSE, 0); gtk_widget_show (LabelParam[NumObj]); /* For numbers */ ValueParam[NumObj] = gtk_entry_new(); gtk_widget_set_usize((GtkWidget *)ValueParam[NumObj],50,0); gtk_box_pack_start (GTK_BOX (hbox[NumObj]), ValueParam[NumObj], FALSE, FALSE, 0); gtk_widget_show (ValueParam[NumObj]); gtk_entry_set_text( GTK_ENTRY(ValueParam[NumObj]), BuffValue); gtk_editable_set_editable( GTK_EDITABLE(ValueParam[NumObj]), FALSE); } return vbox;}GtkWidget * CreateIOConfPage( char ForInputs ){ static char * Labels[] = { "First %", "Type", "PortAdr/SubDev", "First Channel", "Nbr Channels", "Logic" }; GtkWidget *vbox; GtkWidget *hbox[ (ForInputs?NBR_INPUTS_CONF:NBR_OUTPUTS_CONF)+1 +30]; int NumObj; int NumLine; GList * ItemsDevices = NULL; int ScanDev = 0; StrIOConf * pConf; GtkWidget *InputParamLabel[ NBR_IO_PARAMS]; GtkWidget *OutputParamLabel[ NBR_IO_PARAMS ];int testpack; do { ItemsDevices = g_list_append( ItemsDevices, Devices[ ScanDev++ ] ); } while( Devices[ ScanDev ] ); vbox = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox); for (NumLine=-1; NumLine<(ForInputs?NBR_INPUTS_CONF:NBR_OUTPUTS_CONF); NumLine++ ) { hbox[NumLine+1] = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (vbox), hbox[NumLine+1]); gtk_widget_show (hbox[NumLine+1]); for (NumObj=0; NumObj<NBR_IO_PARAMS; NumObj++) { if ( NumLine==-1 ) { GtkWidget **IOParamLabel = ForInputs?&InputParamLabel[ NumObj ]:&OutputParamLabel[ NumObj ]; if ( NumObj==0 ) *IOParamLabel = gtk_label_new( ForInputs?"1st %I mapped":"1st %Q mapped" ); else *IOParamLabel = gtk_label_new( Labels[ NumObj ] ); gtk_widget_set_usize(*IOParamLabel,NumObj==1?130:90,0); gtk_box_pack_start(GTK_BOX (hbox[ NumLine+1 ]), *IOParamLabel, FALSE, FALSE, 0); gtk_widget_show( *IOParamLabel ); } else { char BuffValue[ 30 ]; if ( ForInputs ) pConf = &InfosGene->InputsConf[ NumLine ]; else pConf = &InfosGene->OutputsConf[ NumLine ]; switch( NumObj ) { /* For devices */ case 1: { int ValueToDisplay = pConf->DeviceType; if ( pConf->FirstClassicLadderIO==-1 ) { ValueToDisplay = 0; } else { if ( ValueToDisplay==DEVICE_TYPE_DIRECT_ACCESS ) ValueToDisplay = 1; if ( ValueToDisplay>=DEVICE_TYPE_COMEDI ) ValueToDisplay = ValueToDisplay-DEVICE_TYPE_COMEDI+2; } { GtkWidget **IOParamDevice = ForInputs?&InputDeviceParam[ NumLine ]:&OutputDeviceParam[ NumLine ]; *IOParamDevice = gtk_combo_new( ); gtk_combo_set_value_in_list( GTK_COMBO(*IOParamDevice), TRUE /*val*/, FALSE /*ok_if_empty*/ ); gtk_combo_set_popdown_strings( GTK_COMBO(*IOParamDevice), ItemsDevices ); gtk_widget_set_usize( *IOParamDevice,130,0 ); gtk_box_pack_start ( GTK_BOX (hbox[NumLine+1]), *IOParamDevice, FALSE, FALSE, 0 ); gtk_widget_show ( *IOParamDevice ); gtk_entry_set_text((GtkEntry*)((GtkCombo *)*IOParamDevice)->entry,Devices[ ValueToDisplay ]); } break; } /* For flags */ case 5: { GtkWidget **IOParamFlag = ForInputs?&InputFlagParam[ NumLine ]:&OutputFlagParam[ NumLine ]; *IOParamFlag = gtk_check_button_new_with_label( "Inverted" ); gtk_widget_set_usize( *IOParamFlag,90,0 ); gtk_box_pack_start( GTK_BOX (hbox[NumLine+1]), *IOParamFlag, FALSE, FALSE, 0 ); gtk_widget_show ( *IOParamFlag ); if ( pConf->FlagInverted ) gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( *IOParamFlag ), TRUE ); break; } /* For numbers */ default: { switch( NumObj ) { case 0: if ( pConf->FirstClassicLadderIO==-1 ) strcpy( BuffValue, "" ); else sprintf( BuffValue, "%d", pConf->FirstClassicLadderIO ); break; case 2: if ( pConf->DeviceType==DEVICE_TYPE_DIRECT_ACCESS ) sprintf( BuffValue, "%X", pConf->SubDevOrAdr ); else sprintf( BuffValue, "%d", pConf->SubDevOrAdr ); break; case 3: sprintf( BuffValue, "%d", pConf->FirstChannel ); break; case 4: sprintf( BuffValue, "%d", pConf->NbrConsecutivesChannels ); break; } { GtkWidget **IOParamEntry = ForInputs?&InputParamEntry[ NumLine ][ NumObj ]:&OutputParamEntry[ NumLine ][ NumObj ]; *IOParamEntry = gtk_entry_new( ); gtk_widget_set_usize( *IOParamEntry,90,0 ); gtk_box_pack_start( GTK_BOX (hbox[NumLine+1]), *IOParamEntry, FALSE, FALSE, 0 ); gtk_widget_show ( *IOParamEntry ); gtk_entry_set_text( GTK_ENTRY(*IOParamEntry), BuffValue ); } break; } } } }//for (NumObj=0; }//TODO: I've not found how to not have all the hbox vertically expanded...?for(testpack=0; testpack<30; testpack++){ hbox[(ForInputs?NBR_INPUTS_CONF:NBR_OUTPUTS_CONF)+1+testpack] = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (vbox), hbox[(ForInputs?NBR_INPUTS_CONF:NBR_OUTPUTS_CONF)+1+testpack]);//gtk_box_pack_start(GTK_BOX(vbox), hbox[ (ForInputs?NBR_INPUTS_CONF:NBR_OUTPUTS_CONF)+1+testpack ], TRUE, TRUE, 0); gtk_widget_show (hbox[(ForInputs?NBR_INPUTS_CONF:NBR_OUTPUTS_CONF)+1+testpack]);} return vbox;}int ConvComboToNum( char * text, char ** list ){ int Value = 0; char Found = FALSE; while( !Found && list[ Value ]!=NULL ) { if ( strcmp( list[ Value ], text )==0 ) Found = TRUE; else Value++; } return Value;}void GetIOSettings( char ForInputs ){ int NumObj; int NumLine; StrIOConf * pConf; int ComboVal; GtkWidget **IOParamDevice; GtkWidget **IOParamEntry; GtkWidget **IOParamFlag; char * text; for (NumLine=0; NumLine<(ForInputs?NBR_INPUTS_CONF:NBR_OUTPUTS_CONF); NumLine++ ) { if ( ForInputs ) pConf = &InfosGene->InputsConf[ NumLine ]; else pConf = &InfosGene->OutputsConf[ NumLine ]; pConf->FirstClassicLadderIO = -1;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?