2865 lines
104 KiB
C
Executable File
2865 lines
104 KiB
C
Executable File
/* -----------------------------------------------------------------------------
|
|
* CfgGuiFunctions.c
|
|
*
|
|
* PMU Simulator - Phasor Measurement Unit Simulator
|
|
*
|
|
* Copyright (C) 2011-2012 Nitesh Pandit
|
|
* Copyright (C) 2011-2012 Kedar V. Khandeparkar
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program 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 General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*
|
|
* Authors:
|
|
* Nitesh Pandit <panditnitesh@gmail.com>
|
|
* Kedar V. Khandeparkar <kedar.khandeparkar@gmail.com>
|
|
*
|
|
* ----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <strings.h>
|
|
#include <netinet/in.h>
|
|
#include <gtk/gtk.h>
|
|
#include "PmuGui.h"
|
|
#include "CfgFunction.h"
|
|
#include "CfgGuiFunctions.h"
|
|
#include "ShearedMemoryStructure.h"
|
|
|
|
#define PHUNIT_VOLTAGE (float)1000*100000/32768
|
|
#define PHUNIT_CURRENT (float)100000/32768
|
|
#define ANUNIT_EACH (float)100000/32768
|
|
|
|
/* -------------------------------------------------------------------------------------- */
|
|
/* Functions in CfgGuiFunctions.c */
|
|
/* -------------------------------------------------------------------------------------- */
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* */
|
|
/* 1. int validation_cfg_create (); */
|
|
/* 2. int validation_phasor_names(GtkWidget *widget, gpointer udata); */
|
|
/* 3. int validation_analog_names(GtkWidget *widget, gpointer udata); */
|
|
/* 4. int validation_digital_names(GtkWidget *widget, gpointer udata); */
|
|
/* 5. int validation_ph_an_num (GtkButton *but, gpointer udata); */
|
|
/* 6. int validation_new_phasor_names(); */
|
|
/* 7. int validation_new_analog_names(GtkWidget *widget, gpointer udata); */
|
|
/* 8. int validation_new_data_rate (GtkButton *but, gpointer udata); */
|
|
/* 9. int validation_remove_ph_an_num (GtkButton *but, gpointer udata); */
|
|
/* 10. void validation_hdr_frm (GtkWidget *widget, gpointer udata); */
|
|
/* 11. int validation_setup_file_name (GtkWidget *widget, gpointer udata); */
|
|
|
|
/* 12. void cfg_create_function (GtkWidget *widget, gpointer udata); */
|
|
/* 13. void channel_names_for_phasor (); */
|
|
/* 14. void channel_names_for_analog (); */
|
|
/* 15. void channel_names_for_digital (); */
|
|
/* 16. void final_cfg_create (); */
|
|
/* 17. void cfg_create_call(); */
|
|
/* 18. void checkbox_function(GtkWidget *widget, gpointer data); */
|
|
|
|
/* 19. void stat_chng_options(GtkWidget *widget, gpointer udata); */
|
|
/* 20. void cfg_STAT_change (GtkWidget *widget, gpointer udata); */
|
|
/* 21. void Change_pmu_configuration(GtkWidget *widget, gpointer udata); */
|
|
/* 22. void new_phasor_num(GtkWidget *widget, gpointer udata); */
|
|
/* 23. void new_channel_names_for_phasor (); */
|
|
/* 24. void new_channel_names_for_analog (); */
|
|
/* 25. void change_data_rate_option(); */
|
|
/* 26. void enter_new_data_rate(GtkWidget *widget, gpointer udata); */
|
|
/* 27. void remove_phasor_num (GtkWidget *widget, gpointer udata); */
|
|
/* 28. int final_cfg_update_call (GtkButton *but, gpointer udata); */
|
|
/* 29. void hdr_create_function (GtkWidget *widget, gpointer udata); */
|
|
/* */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_cfg_create () */
|
|
/* It Validates the user enterd details for PMU Simulator Configuration. It */
|
|
/* gives the successful message and go ahead with entered data if all entries */
|
|
/* were right, else it shows the validation error message to user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_cfg_create ()
|
|
{
|
|
/* local variables */
|
|
int i, j;
|
|
const char *text, *text1, *text2, *text3, *text4;
|
|
const char *text5, *text6, *text7, *text8, *text9, *text10;
|
|
char *display_msg, stn[16], c = ' ';
|
|
|
|
/* Get the text entries and combo box values filled by user */
|
|
text = gtk_entry_get_text(GTK_ENTRY(p_id));
|
|
text1 = gtk_entry_get_text(GTK_ENTRY(p_stn));
|
|
text2 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(p_ff));
|
|
text3 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(p_af));
|
|
text4 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(p_pf));
|
|
text5 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(p_pn));
|
|
text6 = gtk_entry_get_text(GTK_ENTRY(p_phNumber));
|
|
text7 = gtk_entry_get_text(GTK_ENTRY(p_anNumber));
|
|
text8 = gtk_entry_get_text(GTK_ENTRY(p_dgNumber));
|
|
text9 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(p_drate));
|
|
text10 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(p_frequency));
|
|
|
|
if(!isNumber((char *)text) || !atoi(text) > 0) /* Check text_box entry for valid integer or not? */
|
|
{
|
|
display_msg = " Not a valid PMU ID number! Try again ";
|
|
validation_result (display_msg); /* Show the unsuccess message to user */
|
|
return 0;
|
|
}
|
|
else if(strlen(text1) == 0) /* Check text_box entry should not be NULL */
|
|
{
|
|
display_msg = " Please enter a PMU Station name! ";
|
|
validation_result (display_msg);
|
|
return 0;
|
|
}
|
|
else if(!isNumber((char *)text6) || !atoi(text6) > 0) /* Check text_box entry for valid integer or not? and greater than 1 */
|
|
{
|
|
display_msg = " Not a valid Phasor number! Try again ";
|
|
validation_result (display_msg);
|
|
return 0;
|
|
}
|
|
else if(!isNumber((char *)text7)) /* Check text_box entry for valid integer or not? */
|
|
{
|
|
display_msg = " Not a valid Analog number! Try again ";
|
|
validation_result (display_msg);
|
|
return 0;
|
|
}
|
|
else if(!isNumber((char *)text8)) /* Check text_box entry for valid integer or not? */
|
|
{
|
|
display_msg = " Not a valid Digital number! Try again ";
|
|
validation_result (display_msg);
|
|
return 0;
|
|
}
|
|
else /* Only if all the text_box entries were right */
|
|
{
|
|
/* Allocate the memory for the ConfigurationFrame object and assigned couple of fields */
|
|
cfg_info = malloc(sizeof(struct ConfigurationFrame));
|
|
cfg_info->cfg_STNname = malloc(16);
|
|
memset(cfg_info->cfg_STNname,'\0',16);
|
|
|
|
memset(stn, '\0', 16);
|
|
strcpy(stn, text1);
|
|
j = strlen(stn);
|
|
for(i = j; i < 16 ; i++)
|
|
{
|
|
stn[i] = c;
|
|
}
|
|
|
|
cfg_info->cfg_pmuID = atoi(text);
|
|
strcpy(cfg_info->cfg_STNname, stn);
|
|
cfg_info->cfg_phnmr_val = atoi(text6);
|
|
cfg_info->cfg_annmr_val = atoi(text7);
|
|
cfg_info->cfg_dgnmr_val = atoi(text8);
|
|
cfg_info->cfg_dataRate = atoi(text9);
|
|
|
|
if(!strcmp(text2, "Fix Point"))
|
|
cfg_info->cfg_fdf = 0;
|
|
else
|
|
cfg_info->cfg_fdf = 1;
|
|
|
|
if(!strcmp(text3, "Fix Point"))
|
|
cfg_info->cfg_af = 0;
|
|
else
|
|
cfg_info->cfg_af = 1;
|
|
|
|
if(!strcmp(text4, "Fix Point"))
|
|
cfg_info->cfg_pf = 0;
|
|
else
|
|
cfg_info->cfg_pf = 1;
|
|
|
|
if(!strcmp(text5, "Rectangular"))
|
|
cfg_info->cfg_pn = 0;
|
|
else
|
|
cfg_info->cfg_pn = 1;
|
|
|
|
if(atoi(text10) == 50)
|
|
cfg_info->cfg_fnom = 1;
|
|
else
|
|
cfg_info->cfg_fnom = 0;
|
|
|
|
/* Close/destroy the cfg_setup_window */
|
|
gtk_widget_destroy(cfg_setup_window);
|
|
|
|
cfg_setup_window = NULL;
|
|
|
|
/* Next call for Enter Phasor channels */
|
|
channel_names_for_phasor ();
|
|
|
|
return 1;
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_phasor_names(GtkWidget *widget, gpointer udata) */
|
|
/* It Validates the user enterd Phasor channel names. It gives the */
|
|
/* successful message and go ahead with entered data if all entries */
|
|
/* were right, else it shows the validation error message to user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_phasor_names(GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
int ia, i, j, ia1 = 0;
|
|
int k, vtr;
|
|
long int li;
|
|
char stn[16], c = ' ';
|
|
char *display_msg;
|
|
const char *aa[20];
|
|
const char *text1;
|
|
|
|
/* First get how many Phasor channel we have? */
|
|
vtr = cfg_info->cfg_phnmr_val+1;
|
|
memset(stn, '\0', 16);
|
|
|
|
/* Allocate the memory for Phasor channel names */
|
|
cfg_info->cfg_phasor_channels = (char *)malloc((vtr*16) * sizeof(char));
|
|
memset(cfg_info->cfg_phasor_channels, '\0', sizeof(cfg_info->cfg_phasor_channels));
|
|
|
|
for (ia=1; ia<vtr; ia++)
|
|
{
|
|
/* Get the text entry value filled by user */
|
|
aa[ia] = gtk_entry_get_text(GTK_ENTRY(num_text[ia]));
|
|
|
|
if(strlen(aa[ia]) == 0)
|
|
{
|
|
free (cfg_info->cfg_phasor_channels);
|
|
display_msg = " Please enter Phasor channel names! ";
|
|
validation_result (display_msg);
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
memset(stn, '\0', 16);
|
|
strcpy(stn, aa[ia]);
|
|
j = strlen(stn);
|
|
if(j < 17)
|
|
{
|
|
for(i = j; i < 16 ; i++)
|
|
{
|
|
stn[i] = c;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i=0; i< 16 && i< vtr*16; i++, ia1++)
|
|
{
|
|
/* Copy all phasor name in an array */
|
|
cfg_info->cfg_phasor_channels[ia1] = stn[i];
|
|
}
|
|
}
|
|
|
|
/* Get the Pahsor maximum values at text entry filled by user */
|
|
for(i=1, k=0; i<vtr; i++)
|
|
{
|
|
if(cfg_info->cfg_pf == 1)
|
|
{
|
|
text1 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(num_combo[i]));
|
|
|
|
if(!strcmp(text1, "Voltage"))
|
|
{
|
|
/* Fill the phasor factor values for voltage */
|
|
phunit_final_val[k++] = 0; // 0- Indicating Voltage
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = 1;
|
|
}
|
|
else
|
|
{
|
|
/* Fill the phasor factor values for current */
|
|
phunit_final_val[k++] = 1; // 1- Indicating Current
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
text1 = gtk_entry_get_text(GTK_ENTRY(num_text1[i]));
|
|
|
|
if(!isNumber((char *)text1)) /* Check text_box entry for valid integer or not? */
|
|
{
|
|
display_msg = " Not a valid Phasor maximum value! Try again ";
|
|
validation_result (display_msg);
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
li = atol(text1);
|
|
|
|
text1 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(num_combo[i]));
|
|
|
|
if(!strcmp(text1, "Voltage"))
|
|
{
|
|
li = li*PHUNIT_VOLTAGE;
|
|
|
|
/* Fill the phasor factor values for voltage */
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = li>>16;
|
|
phunit_final_val[k++] = li>>8;
|
|
phunit_final_val[k++] = li;
|
|
}
|
|
else
|
|
{
|
|
li = li*PHUNIT_CURRENT;
|
|
|
|
/* Fill the phasor factor values for current */
|
|
phunit_final_val[k++] = 1;
|
|
phunit_final_val[k++] = li>>16;
|
|
phunit_final_val[k++] = li>>8;
|
|
phunit_final_val[k++] = li;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Close/destroy the PhasorChWin */
|
|
gtk_widget_destroy(PhasorChWin);
|
|
|
|
/* Next call for Enter Analog channels */
|
|
channel_names_for_analog ();
|
|
|
|
return 0;
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_analog_names(GtkWidget *widget, gpointer udata) */
|
|
/* It Validates the user enterd Analog channel names. It gives the */
|
|
/* successful message and go ahead with entered data if all entries */
|
|
/* were right, else it shows the validation error message to user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_analog_names(GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
int ia, i, j, ia1 = 0, vtr, k;
|
|
long int li;
|
|
char stn[16], c = ' ';
|
|
char *display_msg;
|
|
const char *aa[20], *text1;
|
|
|
|
/* First get how many Analog channel we have? */
|
|
vtr = cfg_info->cfg_annmr_val+1;
|
|
memset(stn, '\0', 16);
|
|
|
|
/* Allocate the memory for Analog channel names */
|
|
cfg_info->cfg_analog_channels = (char *)malloc((vtr*16) * sizeof(char));
|
|
memset(cfg_info->cfg_analog_channels, '\0', sizeof(cfg_info->cfg_analog_channels));
|
|
|
|
for (ia=1; ia<vtr; ia++)
|
|
{
|
|
/* Get the text entry value filled by user */
|
|
aa[ia] = gtk_entry_get_text(GTK_ENTRY(num_text[ia]));
|
|
|
|
if(strlen(aa[ia]) == 0)
|
|
{
|
|
free (cfg_info->cfg_analog_channels);
|
|
display_msg = " Please enter Analog channel names! ";
|
|
validation_result (display_msg);
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
memset(stn, '\0', 16);
|
|
strcpy(stn, aa[ia]);
|
|
j = strlen(stn);
|
|
if(j < 17)
|
|
{
|
|
for(i = j; i < 16 ; i++)
|
|
{
|
|
stn[i] = c;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i=0; i< 16 && i< vtr*16; i++, ia1++)
|
|
{
|
|
/* Copy all phasor name in an array */
|
|
cfg_info->cfg_analog_channels[ia1] = stn[i];
|
|
}
|
|
}
|
|
|
|
/* Get the Pahsor maximum values at text entry filled by user */
|
|
for(i=1, k=0; i<vtr; i++)
|
|
{
|
|
if(cfg_info->cfg_af == 1)
|
|
{
|
|
text1 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(num_combo[i]));
|
|
|
|
if(!strcmp(text1, "PMO"))
|
|
{
|
|
/* Fill the analog factor values for PMO */
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 1;
|
|
}
|
|
else if(!strcmp(text1, "RMS"))
|
|
{
|
|
/* Fill the analog factor values for RMS */
|
|
anunit_final_val[k++] = 1;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 1;
|
|
}
|
|
else
|
|
{
|
|
/* Fill the analog factor values for PEAK */
|
|
anunit_final_val[k++] = 2;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
text1 = gtk_entry_get_text(GTK_ENTRY(num_text1[i]));
|
|
|
|
if(!isNumber((char *)text1)) /* Check text_box entry for valid integer or not? */
|
|
{
|
|
display_msg = " Not a valid analog maximum value! Try again ";
|
|
validation_result (display_msg);
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
li = atol(text1);
|
|
|
|
text1 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(num_combo[i]));
|
|
|
|
if(!strcmp(text1, "POW"))
|
|
{
|
|
li = li*ANUNIT_EACH;
|
|
|
|
/* Fill the analog factor values for PMO */
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = li>>16;
|
|
anunit_final_val[k++] = li>>8;
|
|
anunit_final_val[k++] = li;
|
|
}
|
|
else if(!strcmp(text1, "RMS"))
|
|
{
|
|
li = li*ANUNIT_EACH;
|
|
|
|
/* Fill the analog factor values for RMS */
|
|
anunit_final_val[k++] = 1;
|
|
anunit_final_val[k++] = li>>16;
|
|
anunit_final_val[k++] = li>>8;
|
|
anunit_final_val[k++] = li;
|
|
}
|
|
else
|
|
{
|
|
li = li*ANUNIT_EACH;
|
|
|
|
/* Fill the analog factor values for PEAK */
|
|
anunit_final_val[k++] = 2;
|
|
anunit_final_val[k++] = li>>16;
|
|
anunit_final_val[k++] = li>>8;
|
|
anunit_final_val[k++] = li;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Close/destroy the AnalogChWin */
|
|
gtk_widget_destroy(AnalogChWin);
|
|
|
|
/* Next call for Enter Digital channels */
|
|
channel_names_for_digital ();
|
|
|
|
return 0;
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_digital_names(GtkWidget *widget, gpointer udata) */
|
|
/* It Validates the user enterd Digital channel names. It gives the */
|
|
/* successful message and go ahead with entered data if all entries */
|
|
/* were right, else it shows the validation error message to user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_digital_names(GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
int ia, i, j, ia1 = 0, vtr;
|
|
char stn[16], c = ' ';
|
|
char *display_msg;
|
|
const char *aa[20];
|
|
|
|
/* First get how many Digital channel we have? */
|
|
vtr = cfg_info->cfg_dgnmr_val*16+1;
|
|
memset(stn, '\0', 16);
|
|
|
|
/* Allocate the memory for Digital channel names */
|
|
cfg_info->cfg_digital_channels = (char *)malloc((vtr*16) * sizeof(char));
|
|
memset(cfg_info->cfg_digital_channels, '\0', sizeof(cfg_info->cfg_digital_channels));
|
|
|
|
for (ia=1; ia<vtr; ia++)
|
|
{
|
|
/* Get the text entry value filled by user */
|
|
aa[ia] = gtk_entry_get_text(GTK_ENTRY(num_text[ia]));
|
|
|
|
if(strlen(aa[ia]) == 0)
|
|
{
|
|
free (cfg_info->cfg_digital_channels);
|
|
display_msg = " Please enter Digital channel names! ";
|
|
validation_result (display_msg);
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
memset(stn, '\0', 16);
|
|
strcpy(stn, aa[ia]);
|
|
j = strlen(stn);
|
|
if(j < 17)
|
|
{
|
|
for(i = j; i < 16 ; i++)
|
|
{
|
|
stn[i] = c;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i=0; i< 16 && i< vtr*16; i++, ia1++)
|
|
{
|
|
/* Copy all digital name in an array */
|
|
cfg_info->cfg_digital_channels[ia1] = stn[i];
|
|
}
|
|
}
|
|
|
|
/* Close/destroy the AnalogChWin */
|
|
gtk_widget_destroy(AnalogChWin);
|
|
|
|
/* Next call for finaly create Configuration Frame */
|
|
final_cfg_create ();
|
|
|
|
return 0;
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_ph_an_num (GtkButton *but, gpointer udata) */
|
|
/* It Validates the user enterd number of phasors (PHNMR) and number of */
|
|
/* analogs (ANNMR) for new CFG. It will go ahead with entered data if all */
|
|
/* entries were right, else it shows the validation error message to user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_ph_an_num (GtkButton *but, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
const char *text, *text1;
|
|
|
|
/* Get the text entry value filled by user */
|
|
text = gtk_entry_get_text(GTK_ENTRY(phtext));
|
|
text1 = gtk_entry_get_text(GTK_ENTRY(angtext));
|
|
|
|
if(!isNumber((char *)text) || !(atoi(text) >= 0))
|
|
{
|
|
validation_result (" Not a valid Phasor number! Try again ");
|
|
return 1;
|
|
}
|
|
if(!isNumber((char *)text1) || !(atoi(text1) >= 0))
|
|
{
|
|
validation_result (" Not a valid Analog number! Try again ");
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
/* Next call for Enter New Analog channels */
|
|
new_cfg_info->new_cfg_annmr_val = atoi(text1);
|
|
|
|
/* Next call for Enter New Phasor channels */
|
|
new_cfg_info->new_cfg_phnmr_val = atoi(text);
|
|
new_channel_names_for_phasor ();
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_new_phasor_names(GtkWidget *widget, gpointer udata) */
|
|
/* It Validates the New Phasor channel names. It willgo ahead with */
|
|
/* entered data if all entries were right, else it shows the validation */
|
|
/* error message to user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_new_phasor_names()
|
|
{
|
|
/* local variables */
|
|
int ia, i, j, ia1 = 0, vtr;
|
|
int old_ph_count, k;
|
|
long int li;
|
|
char stn[16], c = ' ';
|
|
char *display_msg;
|
|
const char *aa[20], *text1;
|
|
|
|
/* First get how many New Phasor channel he wants to add? */
|
|
vtr = new_cfg_info->new_cfg_phnmr_val+1;
|
|
memset(stn, '\0', 16);
|
|
|
|
/* Allocate the memory for New Phasor channel names */
|
|
new_cfg_info->new_cfg_phasor_channels = (char *)malloc((vtr*16) * sizeof(char));
|
|
memset(new_cfg_info->new_cfg_phasor_channels, '\0', sizeof(new_cfg_info->new_cfg_phasor_channels));
|
|
|
|
for (ia=1; ia<vtr; ia++)
|
|
{
|
|
/* Get the text entry value filled by user */
|
|
aa[ia] = gtk_entry_get_text(GTK_ENTRY(num_text[ia]));
|
|
|
|
if(strlen(aa[ia]) == 0)
|
|
{
|
|
free (new_cfg_info->new_cfg_phasor_channels);
|
|
display_msg = " Please enter new Phasor channel names! ";
|
|
validation_result (display_msg);
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
memset(stn, '\0', 16);
|
|
strcpy(stn, aa[ia]);
|
|
j = strlen(stn);
|
|
if(j < 17)
|
|
{
|
|
for(i = j; i < 16 ; i++)
|
|
{
|
|
stn[i] = c;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i=0; ((i< 16) && (i< vtr*16)); i++, ia1++)
|
|
{
|
|
/* Copy all phasor name in an array */
|
|
new_cfg_info->new_cfg_phasor_channels[ia1] = stn[i];
|
|
}
|
|
}
|
|
|
|
/* Get the Pahsor maximum values at text entry filled by user */
|
|
old_ph_count = cfg_info->cfg_phnmr_val;
|
|
|
|
for(i=1, k=old_ph_count*4; i<vtr; i++, old_ph_count++)
|
|
{
|
|
if(cfg_info->cfg_pf == 1)
|
|
{
|
|
text1 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(num_combo[i]));
|
|
|
|
if(!strcmp(text1, "Voltage"))
|
|
{
|
|
/* Fill the phasor factor values for voltage */
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = 1;
|
|
}
|
|
else
|
|
{
|
|
/* Fill the phasor factor values for current */
|
|
phunit_final_val[k++] = 1;
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
text1 = gtk_entry_get_text(GTK_ENTRY(num_text1[i]));
|
|
|
|
if(!isNumber((char *)text1)) /* Check text_box entry for valid integer or not? */
|
|
{
|
|
display_msg = " Not a valid Phasor maximum value! Try again ";
|
|
validation_result (display_msg);
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
li = atol(text1);
|
|
|
|
text1 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(num_combo[i]));
|
|
|
|
if(!strcmp(text1, "Voltage"))
|
|
{
|
|
li = li*PHUNIT_VOLTAGE;
|
|
|
|
/* Fill the phasor factor values for voltage */
|
|
phunit_final_val[k++] = 0;
|
|
phunit_final_val[k++] = li>>16;
|
|
phunit_final_val[k++] = li>>8;
|
|
phunit_final_val[k++] = li;
|
|
}
|
|
else
|
|
{
|
|
li = li*PHUNIT_CURRENT;
|
|
|
|
/* Fill the phasor factor values for current */
|
|
phunit_final_val[k++] = 1;
|
|
phunit_final_val[k++] = li>>16;
|
|
phunit_final_val[k++] = li>>8;
|
|
phunit_final_val[k++] = li;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validate_func(GtkWidget *widget, gpointer udata) */
|
|
/* It will validate the new phasor and analog names. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validate_func(GtkWidget *widget, gpointer udata)
|
|
{
|
|
if(!validation_new_phasor_names())
|
|
{
|
|
/* Close/destroy the PhasorChWin */
|
|
gtk_widget_destroy(PhasorChWin);
|
|
|
|
/* Next call for Enter New Phasor channels */
|
|
new_channel_names_for_analog ();
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_new_analog_names(GtkWidget *widget, gpointer udata) */
|
|
/* It Validates the New Analog channel names. It gives the successful message */
|
|
/* and go ahead with entered data if all entries were right, */
|
|
/* else it shows the validation error message to user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_new_analog_names(GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
int ia, i, j, ia1 = 0;
|
|
int k, vtr, old_an_count;
|
|
long int li;
|
|
char stn[16], c = ' ';
|
|
char *display_msg;
|
|
const char *aa[20], *text1;
|
|
|
|
/* First get how many New Analog channel he wants to add? */
|
|
vtr = new_cfg_info->new_cfg_annmr_val+1;
|
|
memset(stn, '\0', 16);
|
|
|
|
/* Allocate the memory for New Analog channel names */
|
|
new_cfg_info->new_cfg_analog_channels = (char *)malloc((vtr*16) * sizeof(char));
|
|
memset(new_cfg_info->new_cfg_analog_channels, '\0', sizeof(new_cfg_info->new_cfg_analog_channels));
|
|
|
|
for (ia=1; ia<vtr; ia++)
|
|
{
|
|
/* Get the text entry value filled by user */
|
|
aa[ia] = gtk_entry_get_text(GTK_ENTRY(num_text[ia]));
|
|
|
|
if(strlen(aa[ia]) == 0)
|
|
{
|
|
free (new_cfg_info->new_cfg_analog_channels);
|
|
display_msg = " Please enter new Analog channel names! ";
|
|
validation_result (display_msg);
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
memset(stn, '\0', 16);
|
|
strcpy(stn, aa[ia]);
|
|
j = strlen(stn);
|
|
if(j < 17)
|
|
{
|
|
for(i = j; i < 16 ; i++)
|
|
{
|
|
stn[i] = c;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (i=0; i< 16 && i< vtr*16; i++, ia1++)
|
|
{
|
|
/* Copy all Analog name in an array */
|
|
new_cfg_info->new_cfg_analog_channels[ia1] = stn[i];
|
|
}
|
|
}
|
|
|
|
/* Get the Analog maximum values at text entry filled by user */
|
|
old_an_count = cfg_info->cfg_annmr_val;
|
|
|
|
for(i=1, k=old_an_count*4; i<vtr; i++, old_an_count++)
|
|
{
|
|
if(cfg_info->cfg_af == 1)
|
|
{
|
|
text1 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(num_combo[i]));
|
|
|
|
if(!strcmp(text1, "POW"))
|
|
{
|
|
/* Fill the analog factor values for POW */
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 1;
|
|
}
|
|
else if(!strcmp(text1, "RMS"))
|
|
{
|
|
/* Fill the analog factor values for RMS */
|
|
anunit_final_val[k++] = 1;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 1;
|
|
}
|
|
else
|
|
{
|
|
/* Fill the analog factor values for PEAK */
|
|
anunit_final_val[k++] = 2;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = 1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
text1 = gtk_entry_get_text(GTK_ENTRY(num_text1[i]));
|
|
|
|
if(!isNumber((char *)text1)) /* Check text_box entry for valid integer or not? */
|
|
{
|
|
display_msg = " Not a valid Analog maximum value! Try again ";
|
|
validation_result (display_msg);
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
li = atol(text1);
|
|
|
|
text1 = gtk_combo_box_get_active_text(GTK_COMBO_BOX(num_combo[i]));
|
|
|
|
if(!strcmp(text1, "POW"))
|
|
{
|
|
li = li*ANUNIT_EACH;
|
|
|
|
/* Fill the analog factor values for POW */
|
|
anunit_final_val[k++] = 0;
|
|
anunit_final_val[k++] = li>>16;
|
|
anunit_final_val[k++] = li>>8;
|
|
anunit_final_val[k++] = li;
|
|
}
|
|
if(!strcmp(text1, "RMS"))
|
|
{
|
|
li = li*ANUNIT_EACH;
|
|
|
|
/* Fill the analog factor values for RMS */
|
|
anunit_final_val[k++] = 1;
|
|
anunit_final_val[k++] = li>>16;
|
|
anunit_final_val[k++] = li>>8;
|
|
anunit_final_val[k++] = li;
|
|
}
|
|
else
|
|
{
|
|
li = li*ANUNIT_EACH;
|
|
|
|
/* Fill the analog factor values for PEAK */
|
|
anunit_final_val[k++] = 2;
|
|
anunit_final_val[k++] = li>>16;
|
|
anunit_final_val[k++] = li>>8;
|
|
anunit_final_val[k++] = li;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Close/destroy the PhasorChWin */
|
|
gtk_widget_destroy(AnalogChWin);
|
|
|
|
/* Next call for Data Rate change option? */
|
|
change_data_rate_option();
|
|
|
|
return 0;
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_new_data_rate (GtkButton *but, gpointer udata) */
|
|
/* It checks whether user have changed the old data rate or continue with it. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_new_data_rate (GtkButton *but, gpointer udata)
|
|
{
|
|
/* Get the combo box value selected by user */
|
|
const char *text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(p_drate));
|
|
|
|
new_cfg_info->data_rate_choice = 1;
|
|
new_cfg_info->new_data_rate = atoi(text);
|
|
|
|
/* Close/destroy the CCWin */
|
|
gtk_widget_destroy(CCWin);
|
|
|
|
/* Final call to recreate configuration frame */
|
|
reconfig_cfg_CC();
|
|
|
|
return 0;
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_remove_ph_an_num (GtkButton *but, gpointer udata) */
|
|
/* It Validates the number of phasor and analog channels for removal in new */
|
|
/* CFG. It gives the successful message and go ahead with entered data if all */
|
|
/* entries were right, else it shows the validation error message to user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_remove_ph_an_num (GtkButton *but, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
const char *text, *text1;
|
|
|
|
/* Get the text entry value filled by user */
|
|
text = gtk_entry_get_text(GTK_ENTRY(phtext));
|
|
text1 = gtk_entry_get_text(GTK_ENTRY(angtext));
|
|
|
|
/* Atleast one phasor should be present there in CFG Frame */
|
|
if(!isNumber((char *)text) || !(atoi(text) < cfg_info->cfg_phnmr_val))
|
|
{
|
|
validation_result (" Not a valid Phasor number within range! Try again ");
|
|
return 1;
|
|
}
|
|
if(!isNumber((char *)text1) || !(atoi(text1) <= cfg_info->cfg_annmr_val))
|
|
{
|
|
validation_result (" Not a valid Analog within range! Try again ");
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
/* If Phasor & Analog removal? */
|
|
new_cfg_info->new_cfg_phnmr_val = atoi(text);
|
|
new_cfg_info->new_cfg_annmr_val = atoi(text1);
|
|
|
|
/* Close/destroy the CCWin */
|
|
gtk_widget_destroy(CCWin);
|
|
|
|
change_data_rate_option();
|
|
|
|
return 0;
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_hdr_frm (GtkWidget *widget, gpointer udata) */
|
|
/* It Validates the Header frame entered by user. It gives the successful */
|
|
/* message and go ahead with entered data if all entries were right, */
|
|
/* else it shows the validation error message to user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void validation_hdr_frm (GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
int i, j;
|
|
const char *text;
|
|
GtkTextBuffer *buffer;
|
|
GtkTextIter start;
|
|
GtkTextIter end;
|
|
GtkTextIter iter;
|
|
|
|
/* Obtain iters for the start and end of points of the buffer */
|
|
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (HdrFrm));
|
|
gtk_text_buffer_get_start_iter (buffer, &start);
|
|
gtk_text_buffer_get_end_iter (buffer, &end);
|
|
|
|
/* Get the text entry value filled by user */
|
|
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
|
//text = gtk_entry_get_text(GTK_ENTRY(HdrFrm));
|
|
i = strlen(text);
|
|
|
|
if(i > 0)
|
|
{
|
|
hdr_frame = (char *)malloc(i * sizeof(char));
|
|
memset(hdr_frame, '\0', sizeof(hdr_frame));
|
|
|
|
for (j=0; j<i ; j++)
|
|
{
|
|
hdr_frame[j] = text[j];
|
|
}
|
|
|
|
/* Close/destroy the hdr_frame_window */
|
|
gtk_widget_destroy(hdr_frame_window);
|
|
|
|
/* Finally call below function to generate header frame */
|
|
header_frm_gen(i);
|
|
|
|
gtk_widget_set_sensitive(GTK_WIDGET(pmu_data->header_frm_button), FALSE);
|
|
}
|
|
else
|
|
{
|
|
validation_result (" Pleas enter proper Header Frame! ");
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION validation_setup_file_name (GtkWidget *widget, gpointer udata) */
|
|
/* Validates the setup file name based on check boxes. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int validation_setup_file_name (GtkWidget *widget, gpointer udata)
|
|
{
|
|
if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chkBtn1)) == TRUE)
|
|
{
|
|
gtk_widget_destroy(CCWin);
|
|
|
|
memset(pmuFilePath,'\0', 200);
|
|
cfg_create_call();
|
|
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
const char *text = gtk_entry_get_text(GTK_ENTRY(p_id));
|
|
|
|
if(!isNumber((char *)text) || !(atoi(text) > 0) || (cfg_info->cfg_pmuID == atoi(text)))
|
|
{
|
|
validation_result (" Not a valid PMU ID number! Try again ");
|
|
return 0;
|
|
}
|
|
|
|
cfg_info->cfg_pmuID = atoi(text);
|
|
gtk_widget_destroy(CCWin);
|
|
final_cfg_create ();
|
|
return 1;
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION cfg_create_function (GtkWidget *widget, gpointer udata) */
|
|
/* It shows the configuration window to user with diffrent attributes like, */
|
|
/* PMU ID Code, data rate, Station name, PHNMR, FREQ, etc. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void cfg_create_function (GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
GtkWidget *table, *label, *cancel_button;
|
|
GtkWidget *valdbutton, *help_button;
|
|
|
|
/* Create a new dialog window for the PMU Configuration Setup window */
|
|
cfg_setup_window = gtk_dialog_new ();
|
|
g_signal_connect (cfg_setup_window, "destroy", G_CALLBACK (gtk_widget_destroy), cfg_setup_window);
|
|
gtk_window_set_title (GTK_WINDOW (cfg_setup_window), "PMU Configuration Setup");
|
|
gtk_container_set_border_width (GTK_CONTAINER (cfg_setup_window), 10);
|
|
//gtk_widget_set_size_request (cfg_setup_window, 350, 600);
|
|
|
|
/* Create a table of 11 by 2 squares. */
|
|
table = gtk_table_new (12, 2, FALSE);
|
|
|
|
/* Set the spacing to 10 on x and 25 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 10);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 25);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(cfg_setup_window)->vbox), table, TRUE, TRUE, 0);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add few buttons to the bottom of the dialog */
|
|
valdbutton = gtk_button_new_with_label ("Next");
|
|
help_button = gtk_button_new_with_label ("Help");
|
|
cancel_button = gtk_button_new_with_label ("Cancel");
|
|
|
|
/* This simply creates a grid of toggle buttons on the table */
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#990033\" font='12'><b>Setup PMU Configuration</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
label = gtk_label_new ("PMU ID");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Station Name");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Frequency Format");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Analog Format");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 4, 5);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Phasor Format");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 5, 6);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Phasor Notation");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 6, 7);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Number of Phasors");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 7, 8);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Number of Analog");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 8, 9);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Digital Status Word");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 9, 10);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Frequency");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 10, 11);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Data Rate");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 11, 12);
|
|
gtk_widget_show (label);
|
|
|
|
/* Create text boxes for user to enter appropriate values */
|
|
p_id = gtk_entry_new();
|
|
gtk_entry_set_max_length ((GtkEntry *)p_id, 5);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_id, 1, 2, 1, 2);
|
|
gtk_widget_show (p_id);
|
|
|
|
p_stn = gtk_entry_new();
|
|
gtk_entry_set_max_length ((GtkEntry *)p_stn, 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_stn, 1, 2, 2, 3);
|
|
gtk_widget_show (p_stn);
|
|
|
|
p_ff = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_ff), "Fix Point");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_ff), "Floating Point");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_ff), 0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_ff, 1, 2, 3, 4);
|
|
gtk_widget_show (p_ff);
|
|
|
|
p_af = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_af), "Fix Point");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_af), "Floating Point");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_af), 0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_af, 1, 2, 4, 5);
|
|
gtk_widget_show (p_af);
|
|
|
|
p_pf = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_pf), "Fix Point");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_pf), "Floating Point");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_pf), 0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_pf, 1, 2, 5, 6);
|
|
gtk_widget_show (p_pf);
|
|
|
|
p_pn = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_pn), "Rectangular");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_pn), "Polar");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_pn), 0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_pn, 1, 2, 6, 7);
|
|
gtk_widget_show (p_pn);
|
|
|
|
p_phNumber = gtk_entry_new();
|
|
gtk_entry_set_max_length ((GtkEntry *)p_phNumber, 2);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_phNumber, 1, 2, 7, 8);
|
|
gtk_widget_show (p_phNumber);
|
|
|
|
p_anNumber = gtk_entry_new();
|
|
gtk_entry_set_max_length ((GtkEntry *)p_anNumber, 2);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_anNumber, 1, 2, 8, 9);
|
|
gtk_widget_show (p_anNumber);
|
|
|
|
p_dgNumber = gtk_entry_new();
|
|
gtk_entry_set_max_length ((GtkEntry *)p_dgNumber, 1);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_dgNumber, 1, 2, 9, 10);
|
|
gtk_widget_show (p_dgNumber);
|
|
|
|
p_frequency = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_frequency), "50");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_frequency), "60");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_frequency), 0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_frequency, 1, 2, 10, 11);
|
|
gtk_widget_show (p_frequency);
|
|
|
|
p_drate = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "1");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "25");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "30");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "50");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "60");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "100");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "120");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_drate), 1);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_drate, 1, 2, 11, 12);
|
|
gtk_widget_show (p_drate);
|
|
|
|
/* Signal handling for buttons on CFG Setuo Window */
|
|
//g_signal_connect (p_frequency, "changed", G_CALLBACK (freq_val), NULL);
|
|
g_signal_connect_swapped (help_button, "clicked", G_CALLBACK (Pmu_Help), NULL);
|
|
g_signal_connect_swapped (valdbutton, "clicked", G_CALLBACK (validation_cfg_create), valdbutton);
|
|
g_signal_connect_swapped (cancel_button, "clicked", G_CALLBACK (gtk_widget_destroy), cfg_setup_window);
|
|
g_signal_connect_swapped (cfg_setup_window, "destroy", G_CALLBACK (gtk_widget_destroy), cfg_setup_window);
|
|
|
|
/* This makes it so the button is the default. */
|
|
gtk_widget_set_can_default (valdbutton, TRUE);
|
|
gtk_widget_set_can_default (help_button, TRUE);
|
|
gtk_widget_set_can_default (cancel_button, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cfg_setup_window)->action_area), valdbutton, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cfg_setup_window)->action_area), help_button, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cfg_setup_window)->action_area), cancel_button, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (valdbutton);
|
|
gtk_widget_show (valdbutton);
|
|
gtk_widget_grab_default (help_button);
|
|
gtk_widget_show (help_button);
|
|
gtk_widget_grab_default (cancel_button);
|
|
gtk_widget_show (cancel_button);
|
|
|
|
/* Finally show the cfg_setup_window */
|
|
gtk_widget_show (cfg_setup_window);
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION freq_val() */
|
|
/* Call at nominal frequency changes, from 50 to 60 or vice versa */
|
|
/* ---------------------------------------------------------------------------- */
|
|
/*
|
|
void freq_val()
|
|
{
|
|
int i;
|
|
const char *tx = gtk_combo_box_get_active_text(GTK_COMBO_BOX(p_frequency));
|
|
|
|
if(!strcmp(tx, "50"))
|
|
{
|
|
for (i=0; i<10; i++)
|
|
{
|
|
gtk_combo_box_remove_text(GTK_COMBO_BOX(p_drate), i);
|
|
}
|
|
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "1");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "10");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "25");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "50");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "100");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_drate), 2);
|
|
}
|
|
else
|
|
{
|
|
for (i=0; i<10; i++)
|
|
{
|
|
gtk_combo_box_remove_text(GTK_COMBO_BOX(p_drate), i);
|
|
}
|
|
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "1");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "10");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "12");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "15");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "30");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "60");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "120");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_drate), 4);
|
|
}
|
|
};
|
|
*/
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION channel_names_for_phasor () */
|
|
/* It shows the window for phasor channel names as per PHNMR entred by user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void channel_names_for_phasor ()
|
|
{
|
|
/* local variables */
|
|
int i, j, jj, temp_local, table_rows = 10;
|
|
char line[20];
|
|
GtkWidget *table, *label, *next_button;
|
|
GtkWidget *scrolled_window, *cancel_button;
|
|
|
|
/* Create a new dialog window for the scrolled window to be packed into */
|
|
PhasorChWin = gtk_dialog_new ();
|
|
g_signal_connect (PhasorChWin, "destroy", G_CALLBACK (gtk_widget_destroy), PhasorChWin);
|
|
gtk_window_set_title (GTK_WINDOW (PhasorChWin), "Phasor Channels");
|
|
gtk_window_set_resizable (GTK_WINDOW (PhasorChWin), FALSE);
|
|
gtk_container_set_border_width (GTK_CONTAINER (PhasorChWin), 10);
|
|
|
|
/* Create a new scrolled window */
|
|
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
|
gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
|
|
gtk_widget_set_size_request (scrolled_window, -1, 400);
|
|
|
|
/* The policy is one of GTK_POLICY AUTOMATIC, or GTK_POLICY_ALWAYS. */
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
|
|
|
/* The dialog window is created with a vbox packed into it */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(PhasorChWin)->vbox), scrolled_window, TRUE, FALSE, 0);
|
|
gtk_widget_show (scrolled_window);
|
|
|
|
/* Create a table of ? by 2 squares. */
|
|
temp_local = cfg_info->cfg_phnmr_val;
|
|
if (temp_local >= table_rows)
|
|
{
|
|
table_rows = temp_local;
|
|
}
|
|
if(cfg_info->cfg_pf == 0)
|
|
table = gtk_table_new (table_rows+1, 6, FALSE);
|
|
else
|
|
table = gtk_table_new (table_rows+1, 3, FALSE);
|
|
|
|
/* Set the spacing to 15 on x and 25 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add a "Next" button to the bottom of the dialog */
|
|
next_button = gtk_button_new_with_label ("Next");
|
|
cancel_button = gtk_button_new_with_label ("Cancel");
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#990033\" font='10'><b>Enter Phasor Channel Name</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 6, 0, 1);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* This simply creates a grid of Lables with text on the table to demonstrate the scrolled window. */
|
|
for(i=1, j=1; i<=temp_local; j++)
|
|
{
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "Phasor Ch %d : ", j);
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1);
|
|
gtk_widget_show (label);
|
|
|
|
num_text[j] = gtk_entry_new ();
|
|
gtk_entry_set_max_length ((GtkEntry *)num_text[j], 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_text[j], 1, 2, i, i+1);
|
|
gtk_widget_show (num_text[j]);
|
|
|
|
num_combo[j] = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "Voltage");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "Current");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(num_combo[j]), 0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_combo[j], 2, 3, i, i+1);
|
|
gtk_widget_show (num_combo[j]);
|
|
|
|
if(cfg_info->cfg_pf == 0)
|
|
{
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "Max Limit %d : ", j);
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, i, i+1);
|
|
gtk_widget_show (label);
|
|
|
|
num_text1[j] = gtk_entry_new ();
|
|
gtk_entry_set_max_length ((GtkEntry *)num_text1[j], 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_text1[j], 4, 5, i, i+1);
|
|
gtk_widget_show (num_text1[j]);
|
|
if(cfg_info->cfg_pf == 1) gtk_widget_set_sensitive(GTK_WIDGET(num_text1[j]), FALSE);
|
|
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "(kV or Amp)");
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 5, 6, i, i+1);
|
|
gtk_widget_show (label);
|
|
}
|
|
i = i+1;
|
|
}
|
|
|
|
if (temp_local < table_rows)
|
|
{
|
|
for (jj = i; jj < table_rows; jj++)
|
|
{
|
|
label = gtk_label_new ("-- ");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 6, jj, jj+1);
|
|
gtk_widget_show (label);
|
|
}
|
|
}
|
|
|
|
/* Signal handling for buttons on CFG Setuo Window */
|
|
g_signal_connect_swapped (next_button, "clicked", G_CALLBACK (validation_phasor_names), NULL);
|
|
g_signal_connect_swapped (cancel_button, "clicked", G_CALLBACK (gtk_widget_destroy), PhasorChWin);
|
|
g_signal_connect_swapped (PhasorChWin, "destroy", G_CALLBACK (gtk_widget_destroy), PhasorChWin);
|
|
|
|
/* This makes it so the button is the default. */
|
|
gtk_widget_set_can_default (next_button, TRUE);
|
|
gtk_widget_set_can_default (cancel_button, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (PhasorChWin)->action_area), next_button, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (PhasorChWin)->action_area), cancel_button, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (next_button);
|
|
gtk_widget_show (next_button);
|
|
gtk_widget_grab_default (cancel_button);
|
|
gtk_widget_show (cancel_button);
|
|
|
|
/* Finally show the PhasorChWin */
|
|
gtk_widget_show (PhasorChWin);
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION channel_names_for_analog () */
|
|
/* It shows the window for analog channel names as per ANNMR entred by user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void channel_names_for_analog ()
|
|
{
|
|
/* Analog is not Mandatory component in CFG, it could be zero */
|
|
if (cfg_info->cfg_annmr_val == 0)
|
|
{
|
|
/* Next call to digital channel names */
|
|
channel_names_for_digital ();
|
|
}
|
|
else /* if ANNMR > 0 */
|
|
{
|
|
/* local variables */
|
|
int i,temp_local,j,jj,table_rows = 9;
|
|
char line[30];
|
|
GtkWidget *table, *scrolled_window;
|
|
GtkWidget *label, *next_button, *cancel_button;
|
|
|
|
/* Create a new dialog window for the scrolled window to be packed into */
|
|
AnalogChWin = gtk_dialog_new ();
|
|
g_signal_connect (AnalogChWin, "destroy", G_CALLBACK (gtk_widget_destroy), AnalogChWin);
|
|
gtk_window_set_title (GTK_WINDOW (AnalogChWin), "Analog Channels");
|
|
gtk_container_set_border_width (GTK_CONTAINER (AnalogChWin), 10);
|
|
gtk_window_set_resizable (GTK_WINDOW (AnalogChWin), FALSE);
|
|
|
|
/* Create a new scrolled window */
|
|
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
|
gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
|
|
gtk_widget_set_size_request (scrolled_window, -1, 400);
|
|
|
|
/* The policy is one of GTK_POLICY AUTOMATIC, or GTK_POLICY_ALWAYS. */
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
|
|
|
/* The dialog window is created with a vbox packed into it */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(AnalogChWin)->vbox), scrolled_window, TRUE, TRUE, 0);
|
|
gtk_widget_show (scrolled_window);
|
|
|
|
/* Create a table as per phasor numbers and phasor type */
|
|
temp_local = cfg_info->cfg_annmr_val;
|
|
if (temp_local >= table_rows)
|
|
{
|
|
table_rows = temp_local;
|
|
}
|
|
|
|
if(cfg_info->cfg_af == 0)
|
|
table = gtk_table_new (table_rows+1, 5, FALSE);
|
|
else
|
|
table = gtk_table_new (table_rows+1, 3, FALSE);
|
|
|
|
next_button = gtk_button_new_with_label ("Next");
|
|
cancel_button = gtk_button_new_with_label ("Cancel");
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#990033\" font='10'><b>Enter Analog Channel Name</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 0, 1);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Set the spacing to 15 on x and 25 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add a "Next" button to the bottom of the dialog */
|
|
next_button = gtk_button_new_with_label ("Next");
|
|
|
|
/* This simply creates a grid of Lables with text on the table to demonstrate the scrolled window. */
|
|
for(i=1, j=1; i<=temp_local; j++)
|
|
{
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "Analog Ch %d : ", j);
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1);
|
|
gtk_widget_show (label);
|
|
|
|
num_text[j] = gtk_entry_new ();
|
|
gtk_entry_set_max_length ((GtkEntry *)num_text[j], 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_text[j], 1, 2, i, i+1);
|
|
gtk_widget_show (num_text[j]);
|
|
|
|
num_combo[j] = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "RMS");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "POW");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "Peak");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(num_combo[j]), 0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_combo[j], 2, 3, i, i+1);
|
|
gtk_widget_show (num_combo[j]);
|
|
|
|
/* Add only in case of phasors are in fix point format */
|
|
if(cfg_info->cfg_af == 0)
|
|
{
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "Max Value %d : ", j);
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, i , i+1);
|
|
gtk_widget_show (label);
|
|
|
|
num_text1[j] = gtk_entry_new ();
|
|
gtk_entry_set_max_length ((GtkEntry *)num_text1[j], 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_text1[j], 4, 5, i , i+1);
|
|
gtk_widget_show (num_text1[j]);
|
|
if(cfg_info->cfg_af == 1) gtk_widget_set_sensitive(GTK_WIDGET(num_text1[j]), FALSE);
|
|
}
|
|
i = i+1;
|
|
}
|
|
|
|
if (temp_local < table_rows)
|
|
{
|
|
for (jj = i; jj < table_rows; jj++)
|
|
{
|
|
label = gtk_label_new ("-- ");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, jj, jj+1);
|
|
gtk_widget_show (label);
|
|
}
|
|
}
|
|
|
|
/* Signal handling for Next button on Window */
|
|
g_signal_connect_swapped (next_button, "clicked", G_CALLBACK (validation_analog_names), NULL);
|
|
g_signal_connect_swapped (cancel_button, "clicked", G_CALLBACK (gtk_widget_destroy), AnalogChWin);
|
|
g_signal_connect_swapped (AnalogChWin, "destroy", G_CALLBACK (gtk_widget_destroy), AnalogChWin);
|
|
|
|
/* This makes it so the button is the default. */
|
|
gtk_widget_set_can_default (next_button, TRUE);
|
|
gtk_widget_set_can_default (cancel_button, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (AnalogChWin)->action_area), next_button, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (AnalogChWin)->action_area), cancel_button, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (next_button);
|
|
gtk_widget_show (next_button);
|
|
gtk_widget_grab_default (cancel_button);
|
|
gtk_widget_show (cancel_button);
|
|
|
|
/* Finally show the AnalogChWin */
|
|
gtk_widget_show (AnalogChWin);
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION channel_names_for_digital () */
|
|
/* It shows the window for digital channel names as per DGNMR entred by user. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void channel_names_for_digital ()
|
|
{
|
|
/* Analog is not Mandatory component in CFG, it could be zero */
|
|
if (cfg_info->cfg_dgnmr_val == 0)
|
|
{
|
|
/* Next call to 'final_cfg_create ()' */
|
|
final_cfg_create ();
|
|
}
|
|
else /* if DGNMR > 0 */
|
|
{
|
|
/* local variables */
|
|
int i;
|
|
char line[30];
|
|
GtkWidget *table, *scrolled_window;
|
|
GtkWidget *label, *next_button, *cancel_button;
|
|
|
|
/* Create a new dialog window for the scrolled window to be packed into */
|
|
AnalogChWin = gtk_dialog_new ();
|
|
g_signal_connect (AnalogChWin, "destroy", G_CALLBACK (gtk_widget_destroy), AnalogChWin);
|
|
gtk_window_set_title (GTK_WINDOW (AnalogChWin), "Digital Channels");
|
|
gtk_container_set_border_width (GTK_CONTAINER (AnalogChWin), 10);
|
|
gtk_window_set_resizable (GTK_WINDOW (AnalogChWin), FALSE);
|
|
|
|
/* Create a new scrolled window */
|
|
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
|
gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
|
|
gtk_widget_set_size_request (scrolled_window, -1, 550);
|
|
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
|
|
|
/* The dialog window is created with a vbox packed into it */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(AnalogChWin)->vbox), scrolled_window, TRUE, TRUE, 0);
|
|
gtk_widget_show (scrolled_window);
|
|
|
|
/* Create a table of ? by 2 squares. */
|
|
table = gtk_table_new (cfg_info->cfg_dgnmr_val*16+1, 2, FALSE);
|
|
|
|
/* Set the spacing to 15 on x and 25 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add a "Next" button to the bottom of the dialog */
|
|
next_button = gtk_button_new_with_label ("Next");
|
|
cancel_button = gtk_button_new_with_label ("Cancel");
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#990033\" font='10'><b>Enter Digital Channels Name</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* This simply creates a grid of Lables with text on the table to demonstrate the scrolled window. */
|
|
for(i=1; i<cfg_info->cfg_dgnmr_val*16+1; i++)
|
|
{
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "Digital Ch %d : ", i);
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1);
|
|
gtk_widget_show (label);
|
|
}
|
|
|
|
for(i=1; i<cfg_info->cfg_dgnmr_val*16+1; i++)
|
|
{
|
|
num_text[i] = gtk_entry_new ();
|
|
//gtk_entry_set_max_length (GtkEntry *entry, gint max);
|
|
gtk_entry_set_max_length ((GtkEntry *)num_text[i], 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_text[i], 1, 2, i, i+1);
|
|
gtk_widget_show (num_text[i]);
|
|
}
|
|
|
|
/* Signal handling for Next button on Window */
|
|
g_signal_connect_swapped (next_button, "clicked", G_CALLBACK (validation_digital_names), NULL);
|
|
g_signal_connect_swapped (cancel_button, "clicked", G_CALLBACK (gtk_widget_destroy), AnalogChWin);
|
|
g_signal_connect_swapped (AnalogChWin, "response", G_CALLBACK (gtk_widget_destroy), AnalogChWin);
|
|
|
|
/* This makes it so the button is the default. */
|
|
gtk_widget_set_can_default (next_button, TRUE);
|
|
gtk_widget_set_can_default (cancel_button, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (AnalogChWin)->action_area), next_button, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (AnalogChWin)->action_area), cancel_button, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (next_button);
|
|
gtk_widget_show (next_button);
|
|
gtk_widget_grab_default (cancel_button);
|
|
gtk_widget_show (cancel_button);
|
|
|
|
/* Finally show the AnalogChWin */
|
|
gtk_widget_show (AnalogChWin);
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION final_cfg_create () */
|
|
/* It call the final function for generate configuration frame. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void final_cfg_create ()
|
|
{
|
|
/* local variables */
|
|
char buff[50], tbuff[200];
|
|
FILE *fp1;
|
|
|
|
strcpy(pmuFilePath, pmuFolderPath);
|
|
strcat(pmuFilePath, "/");
|
|
strcat(pmuFilePath, "pmu");
|
|
sprintf(buff, "%d", cfg_info->cfg_pmuID);
|
|
strcat(pmuFilePath, buff);
|
|
strcat(pmuFilePath, ".bin");
|
|
pmuFilePath[strlen(pmuFilePath)] = '\0';
|
|
|
|
/* Check whether any PMU Setup File already exist with the same name? */
|
|
fp1 = fopen (pmuFilePath,"rb");
|
|
|
|
if (fp1 != NULL)
|
|
{
|
|
/* Close the open PMU Setup File */
|
|
fclose(fp1);
|
|
|
|
/* local variables */
|
|
GtkWidget *table, *label, *ok;
|
|
|
|
/* Create a new dialog window for PMU Server Setup */
|
|
CCWin = gtk_dialog_new ();
|
|
gtk_window_set_title (GTK_WINDOW (CCWin), "Setup Warning!");
|
|
gtk_container_set_border_width (GTK_CONTAINER (CCWin), 10);
|
|
|
|
/* Create a table of 4 by 2 squares. */
|
|
table = gtk_table_new (9, 2, FALSE);
|
|
|
|
/* Set the spacing to 50 on x and 5 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(CCWin)->vbox), table, TRUE, TRUE, 0);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add few buttons to the bottom of the dialog */
|
|
ok = gtk_button_new_with_label ("OK");
|
|
|
|
/* This simply creates a grid of toggle buttons on the table */
|
|
memset(tbuff, '\0', 200);
|
|
strcat(tbuff, "Setup File with PMU ID - ");
|
|
sprintf(buff, "%d", cfg_info->cfg_pmuID);
|
|
strcat(tbuff, buff);
|
|
strcat(tbuff, " is already present in system!");
|
|
label = gtk_label_new (tbuff);
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_hseparator_new();
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 1, 2);
|
|
gtk_widget_show (label);
|
|
|
|
chkBtn1 = gtk_check_button_new_with_label("Overwrite with new PMU setup");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), chkBtn1, 0, 2, 3, 4);
|
|
gtk_widget_show (chkBtn1);
|
|
|
|
chkBtn2 = gtk_check_button_new_with_label("Change the PMU ID Code");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), chkBtn2, 0, 2, 4, 5);
|
|
gtk_widget_show (chkBtn2);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#113312\" font='10'><b>New PMU ID</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 5, 6);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Create text boxes for user to enter appropriate values */
|
|
p_id = gtk_entry_new();
|
|
gtk_entry_set_max_length ((GtkEntry *)p_id, 5);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_id, 1, 2, 5, 6);
|
|
gtk_widget_show (p_id);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#333333\" font='8'><b>Note : Please give a new PMU ID to save the old PMU Configuration.</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 7, 8);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
label = gtk_hseparator_new();
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 8, 9);
|
|
gtk_widget_show (label);
|
|
|
|
/* Signal handling for buttons on Setup Warning Window */
|
|
g_signal_connect_swapped (ok, "clicked", G_CALLBACK (validation_setup_file_name), NULL);
|
|
g_signal_connect (chkBtn1, "toggled", G_CALLBACK (checkbox_function), "1");
|
|
g_signal_connect (chkBtn2, "toggled", G_CALLBACK (checkbox_function), "2");
|
|
g_signal_connect (CCWin, "destroy", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
g_signal_connect_swapped (CCWin, "response", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (chkBtn2),TRUE);
|
|
|
|
/* This makes it so the button is the default. */
|
|
gtk_widget_set_can_default (ok, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), ok, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (ok);
|
|
gtk_widget_show (ok);
|
|
|
|
/* Finally show the CCWin */
|
|
gtk_widget_show (CCWin);
|
|
}
|
|
else
|
|
{
|
|
/* If not matched, call final call to create a new CFG */
|
|
cfg_create_call();
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION checkbox_function(GtkWidget *widget, gpointer data) */
|
|
/* This is called when checkboxes are selected, and do the appropriate */
|
|
/* changes in the other checkbox or widget? */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void checkbox_function(GtkWidget *widget, gpointer data)
|
|
{
|
|
char t[2];
|
|
strcpy(t, (char *) data);
|
|
|
|
if(!strcmp(t, "1"))
|
|
{
|
|
if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chkBtn1)) == TRUE)
|
|
{
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (chkBtn2),FALSE);
|
|
gtk_widget_set_sensitive(GTK_WIDGET(p_id), FALSE);
|
|
}
|
|
else
|
|
{
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (chkBtn2),TRUE);
|
|
gtk_widget_set_sensitive(GTK_WIDGET(p_id), TRUE);
|
|
gtk_entry_set_text(GTK_ENTRY(p_id), " ");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (chkBtn2)) == TRUE)
|
|
{
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (chkBtn1),FALSE);
|
|
gtk_widget_set_sensitive(GTK_WIDGET(p_id), TRUE);
|
|
gtk_entry_set_text(GTK_ENTRY(p_id), " ");
|
|
}
|
|
else
|
|
{
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (chkBtn1),TRUE);
|
|
gtk_widget_set_sensitive(GTK_WIDGET(p_id), FALSE);
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION cfg_create_call() */
|
|
/* This is final call for configuration creation. It will call the create_cfg() */
|
|
/* function in CfgFunction.c file and make the setup file also. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void cfg_create_call()
|
|
{
|
|
/* local variables */
|
|
int ret_val;
|
|
|
|
/* To create CFG call 'create_cfg()' */
|
|
ret_val = create_cfg();
|
|
|
|
if(ret_val == 0)
|
|
{
|
|
/* Enable rest of the buttons on PMU Simulator Window */
|
|
gtk_widget_set_sensitive(GTK_WIDGET(pmu_data->manage_data_source), TRUE);
|
|
gtk_widget_set_sensitive(GTK_WIDGET(pmu_data->header_frm_button), TRUE);
|
|
gtk_widget_set_sensitive(GTK_WIDGET(pmu_data->stat_modification_button), TRUE);
|
|
gtk_widget_set_sensitive(GTK_WIDGET(pmu_data->cfg_modification_button), TRUE);
|
|
gtk_widget_set_sensitive(GTK_WIDGET(pmu_data->pmu_details_button), TRUE);
|
|
|
|
gtk_widget_set_visible(GTK_WIDGET(pmu_data->menuitem2), TRUE);
|
|
gtk_widget_set_visible(GTK_WIDGET(pmu_data->pmu_properties), TRUE);
|
|
|
|
gtk_widget_set_visible(GTK_WIDGET(pmu_data->menu_data_source), TRUE);
|
|
gtk_widget_set_visible(GTK_WIDGET(pmu_data->menu_header_frm), TRUE);
|
|
gtk_widget_set_visible(GTK_WIDGET(pmu_data->menu_cfg_modify), TRUE);
|
|
gtk_widget_set_visible(GTK_WIDGET(pmu_data->menu_stat_modify), TRUE);
|
|
|
|
/* Disable create CFG buttons on PMU Simulator Window */
|
|
gtk_widget_set_sensitive(GTK_WIDGET(pmu_data->create_cfg_button), FALSE);
|
|
gtk_widget_set_visible(GTK_WIDGET(pmu_data->menu_setup_cfg), FALSE);
|
|
}
|
|
else
|
|
{
|
|
validation_result (" PMU Simulator Setup has failed! Try again ");
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION stat_chng_options(GtkWidget *widget, gpointer udata) */
|
|
/* It provides multiple options to user regarding STAT Word change. User can */
|
|
/* introduce error bit, Configuration modification, etc. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void stat_chng_options(GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
GtkWidget *table, *label;
|
|
GtkWidget *ID_butn, *PE_butn, *DS_butn, *chk_butn;
|
|
GtkWidget *PT_butn, *CC_butn, *close_butn;
|
|
|
|
/* Create a new dialog window for the Configration Modification */
|
|
CCOptionWin = gtk_dialog_new ();
|
|
gtk_window_set_title (GTK_WINDOW (CCOptionWin), "STAT Word Modification");
|
|
gtk_container_set_border_width (GTK_CONTAINER (CCOptionWin), 10);
|
|
|
|
/* Create a table of 7 by 3 squares */
|
|
table = gtk_table_new (10, 3, FALSE);
|
|
|
|
/* Set the spacing to 15 on x and 60 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(CCOptionWin)->vbox), table, TRUE, TRUE, 0);
|
|
gtk_widget_show (table);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#990033\" font='12'><b>Modification of bits in STAT Word</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
ID_butn = gtk_button_new_with_label ("Set Invalid Data bit (Bit-15)");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), ID_butn, 1, 2, 2, 3);
|
|
gtk_widget_show (ID_butn);
|
|
|
|
PE_butn = gtk_button_new_with_label ("Set PMU Error bit (Bit-14)");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), PE_butn, 1, 2, 3, 4);
|
|
gtk_widget_show (PE_butn);
|
|
|
|
DS_butn = gtk_button_new_with_label ("Set Data Sorting bit (Bit-12)");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), DS_butn, 1, 2, 4, 5);
|
|
gtk_widget_show (DS_butn);
|
|
|
|
PT_butn = gtk_button_new_with_label ("Set PMU Trigger bit (Bit-11)");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), PT_butn, 1, 2, 5, 6);
|
|
gtk_widget_show (PT_butn);
|
|
|
|
chk_butn = gtk_button_new_with_label ("CheckSum Error in Data Frame");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), chk_butn, 1, 2, 6, 7);
|
|
gtk_widget_show (chk_butn);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#333333\" font='8'><b>Note : The Synchronization Error (Bit-13) handled\ninternaly. CheckSum Error will not change\nany bit in STAT Word.</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 9, 10);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Add a "close" button to the bottom of the dialog */
|
|
close_butn = gtk_button_new_with_label ("close");
|
|
|
|
/* Signal handling for all buttons on Window */
|
|
g_signal_connect (ID_butn, "clicked", G_CALLBACK (cfg_STAT_change), (gpointer) "a");
|
|
g_signal_connect (PE_butn, "clicked", G_CALLBACK (cfg_STAT_change), (gpointer) "b");
|
|
g_signal_connect (DS_butn, "clicked", G_CALLBACK (cfg_STAT_change), (gpointer) "c");
|
|
g_signal_connect (PT_butn, "clicked", G_CALLBACK (cfg_STAT_change), (gpointer) "d");
|
|
g_signal_connect (chk_butn, "clicked", G_CALLBACK (cfg_STAT_change), (gpointer) "e");
|
|
g_signal_connect_swapped (close_butn, "clicked", G_CALLBACK (gtk_widget_destroy), CCOptionWin);
|
|
g_signal_connect_swapped (CCOptionWin, "response", G_CALLBACK (gtk_widget_destroy), CCOptionWin);
|
|
|
|
/* This makes it so the button is the default */
|
|
gtk_widget_set_can_default (close_butn, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCOptionWin)->action_area), close_butn, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (close_butn);
|
|
gtk_widget_show (close_butn);
|
|
|
|
/* Finally show the CCOptionWin */
|
|
gtk_widget_show (CCOptionWin);
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION cfg_STAT_change (GtkWidget *widget, gpointer udata) */
|
|
/* This function change the STAT Word bits according to user's wish. It also */
|
|
/* has option to do CheckSum invalid for next data frame, and its not a STAT */
|
|
/* Word error. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void cfg_STAT_change (GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* Local variables */
|
|
char find_butn[2];
|
|
|
|
/* For identifing singnal came from which button? */
|
|
strcpy(find_butn,(char *) udata);
|
|
|
|
if(!strcmp(find_butn, "a"))
|
|
{
|
|
validation_result(" STAT WORD CHANGED\nBit 15 of Stat word has been set to 1 for Invalid Data.");
|
|
ShmPTR->cfg_bit_change_info = 2;
|
|
}
|
|
else if(!strcmp(find_butn, "b"))
|
|
{
|
|
validation_result("STAT WORD CHANGED\nBit 14 of Stat word has been set to 1 for PMU Error.");
|
|
ShmPTR->cfg_bit_change_info = 3;
|
|
}
|
|
else if(!strcmp(find_butn, "c"))
|
|
{
|
|
validation_result("STAT WORD CHANGED\nBit 12 of Stat word has been set to 1 for Data Sorting.");
|
|
ShmPTR->cfg_bit_change_info = 4;
|
|
}
|
|
else if(!strcmp(find_butn, "d"))
|
|
{
|
|
validation_result("STAT WORD CHANGED\nBit 11 of Stat word has been set to 1 for PMU Trigger Detected.");
|
|
|
|
ShmPTR->cfg_bit_change_info = 5;
|
|
}
|
|
else if(!strcmp(find_butn, "e"))
|
|
{
|
|
validation_result("CHECKSUM ERROR\nA data frame with invalid CRC would be sent.");
|
|
|
|
ShmPTR->cfg_bit_change_info = 6;
|
|
}
|
|
|
|
p1.pid = ShmPTR->pid;
|
|
|
|
kill(p1.pid, SIGUSR2);
|
|
printf("STAT word bit changed signal sent to PMU Server Process.\n");
|
|
|
|
/* Close/destroy the CCOptionWin */
|
|
gtk_widget_destroy(CCOptionWin);
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION Change_pmu_configuration(GtkWidget *widget, gpointer udata) */
|
|
/* By this function user have option window to choose Add New Channels or */
|
|
/* Remove Channels?. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void Change_pmu_configuration(GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
GtkWidget *table;
|
|
GtkWidget *close_butn, *label;
|
|
GtkWidget *Addbutton, *Removebutton;
|
|
GSList *group;
|
|
int ch = 0;
|
|
|
|
/* Create a new dialog window for the Option Window */
|
|
CCWin = gtk_dialog_new ();
|
|
gtk_window_set_title (GTK_WINDOW (CCWin), "Operation");
|
|
gtk_container_set_border_width (GTK_CONTAINER (CCWin), 10);
|
|
|
|
/* Create a table of 4 by 2 squares */
|
|
table = gtk_table_new (6, 2, FALSE);
|
|
|
|
/* Set the spacing to 15 on x and 25 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(CCWin)->vbox), table, TRUE, TRUE, 0);
|
|
gtk_widget_show (table);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#990033\" font='12'><b>Channel Operation</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Add few radio buttons on the dialog window */
|
|
Addbutton = gtk_radio_button_new_with_label (NULL, "Add New Channels");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), Addbutton, 0, 1, 2, 3);
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (Addbutton), TRUE);
|
|
gtk_widget_show (Addbutton);
|
|
|
|
group = gtk_radio_button_group (GTK_RADIO_BUTTON (Addbutton));
|
|
Removebutton = gtk_radio_button_new_with_label (NULL, "Remove Channels");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), Removebutton, 0, 1, 3, 4);
|
|
gtk_widget_show (Removebutton);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#333333\" font='8'><b>Note : Both Phasor and Analog channels could be add.\nYou will get the change Data Rate option at the end.\nIt will change the bit-10 from 0 to 1 in STAT Word in data frames.</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 5, 6);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Add 'Close' buttons on the dialog window */
|
|
close_butn = gtk_button_new_with_label ("Close");
|
|
|
|
/* Signal handling for buttons on Option Window */
|
|
g_signal_connect_swapped (Addbutton, "clicked", G_CALLBACK (new_phasor_num), NULL);
|
|
g_signal_connect_swapped (Removebutton, "clicked", G_CALLBACK (remove_phasor_num), NULL);
|
|
g_signal_connect_swapped (close_butn, "clicked", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
g_signal_connect_swapped (CCWin, "response", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
|
|
/* This makes it so the button is the default. */
|
|
gtk_widget_set_can_default (close_butn, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), close_butn, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (close_butn);
|
|
gtk_widget_show (close_butn);
|
|
|
|
/* Finally show the CCWin */
|
|
gtk_widget_show (CCWin);
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION new_phasor_num(GtkWidget *widget, gpointer udata) */
|
|
/* It will ask user to number of new phasor channels that he wants to add? */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void new_phasor_num(GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
GtkWidget *table, *help_button;
|
|
GtkWidget *next_butn, *label, *cancel_button;
|
|
|
|
/* Allocate the memory for the ConfigurationChange object */
|
|
new_cfg_info = malloc(sizeof(struct ConfigurationChange));
|
|
new_cfg_info->add_remove_choice = 1;
|
|
|
|
/* Create a new dialog window for New Phasor Channels */
|
|
gtk_widget_destroy(CCWin);
|
|
CCWin = gtk_dialog_new ();
|
|
gtk_window_set_title (GTK_WINDOW (CCWin), "Add New Phasors");
|
|
gtk_container_set_border_width (GTK_CONTAINER (CCWin), 10);
|
|
//gtk_widget_set_size_request (CCWin, 350, 300);
|
|
|
|
/* Create a table of 3 by 3 squares. */
|
|
table = gtk_table_new (3, 3, FALSE);
|
|
|
|
/* Set the spacing to 25 on x and 40 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(CCWin)->vbox), table, TRUE, TRUE, 0);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add few buttons to the bottom of the dialog */
|
|
next_butn = gtk_button_new_with_label ("Next");
|
|
help_button = gtk_button_new_with_label ("Help");
|
|
cancel_button = gtk_button_new_with_label ("Cancel");
|
|
|
|
label = gtk_label_new ("New Phasors");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("New Analogs");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
|
|
gtk_widget_show (label);
|
|
|
|
/* Create text boxes for user to enter appropriate values */
|
|
phtext = gtk_entry_new ();
|
|
gtk_table_attach_defaults (GTK_TABLE (table), phtext, 1, 2, 0, 1);
|
|
gtk_widget_show (phtext);
|
|
|
|
angtext = gtk_entry_new ();
|
|
gtk_table_attach_defaults (GTK_TABLE (table), angtext, 1, 2, 1, 2);
|
|
gtk_widget_show (angtext);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#333333\" font='8'><b>Note : New channels will be added to existing configuration frame.</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 2, 3);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Signal handling for buttons on Window */
|
|
g_signal_connect (next_butn, "clicked", G_CALLBACK (validation_ph_an_num), NULL);
|
|
g_signal_connect_swapped (help_button, "clicked", G_CALLBACK (Pmu_Help), NULL);
|
|
g_signal_connect_swapped (cancel_button, "clicked", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
g_signal_connect_swapped (CCWin, "response", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
|
|
/* This makes it so the button is the default */
|
|
gtk_widget_set_can_default (next_butn, TRUE);
|
|
gtk_widget_set_can_default (help_button, TRUE);
|
|
gtk_widget_set_can_default (cancel_button, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), next_butn, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), help_button, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), cancel_button, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (next_butn);
|
|
gtk_widget_show (next_butn);
|
|
gtk_widget_grab_default (help_button);
|
|
gtk_widget_show (help_button);
|
|
gtk_widget_grab_default (cancel_button);
|
|
gtk_widget_show (cancel_button);
|
|
|
|
/* Finally show the CCWin */
|
|
gtk_widget_show (CCWin);
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION new_channel_names_for_phasor () */
|
|
/* It shows the window to enter new phasor channel names. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void new_channel_names_for_phasor ()
|
|
{
|
|
/* new_phasor number could be zero? */
|
|
if(new_cfg_info->new_cfg_phnmr_val > 0)
|
|
{
|
|
/* local variables */
|
|
int i, j, jj, temp_local, table_rows = 10;
|
|
char line[20];
|
|
GtkWidget *table, *scrolled_window, *cancel_button;
|
|
GtkWidget *label, *next_button;
|
|
|
|
/* Create a new dialog window for the scrolled window to be packed into */
|
|
gtk_widget_destroy(CCWin);
|
|
PhasorChWin = gtk_dialog_new ();
|
|
g_signal_connect (PhasorChWin, "destroy", G_CALLBACK (gtk_widget_destroy), PhasorChWin);
|
|
gtk_window_set_title (GTK_WINDOW (PhasorChWin), "New Phasor Channels");
|
|
gtk_window_set_resizable (GTK_WINDOW (PhasorChWin), FALSE);
|
|
gtk_container_set_border_width (GTK_CONTAINER (PhasorChWin), 10);
|
|
|
|
/* Create a new scrolled window */
|
|
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
|
gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
|
|
gtk_widget_set_size_request (scrolled_window, -1, 400);
|
|
|
|
/* The policy is one of GTK_POLICY AUTOMATIC, or GTK_POLICY_ALWAYS. */
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
|
|
|
/* The dialog window is created with a vbox packed into it */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(PhasorChWin)->vbox), scrolled_window, TRUE, FALSE, 0);
|
|
gtk_widget_show (scrolled_window);
|
|
|
|
/* Create a table of ? by 2 squares. Based on phasor numbers and phasor type */
|
|
temp_local = new_cfg_info->new_cfg_phnmr_val;
|
|
if (temp_local >= table_rows)
|
|
{
|
|
table_rows = temp_local;
|
|
}
|
|
if(cfg_info->cfg_pf == 0)
|
|
table = gtk_table_new (table_rows+1, 6, FALSE);
|
|
else
|
|
table = gtk_table_new (table_rows+1, 3, FALSE);
|
|
|
|
/* Set the spacing to 15 on x and 25 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add a "Next" button to the bottom of the dialog */
|
|
next_button = gtk_button_new_with_label ("Next");
|
|
cancel_button = gtk_button_new_with_label ("Cancel");
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#990033\" font='10'><b>Enter Phasor Channel Name</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 6, 0, 1);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* This simply creates a grid of Lables with text on the table to demonstrate the scrolled window. */
|
|
for(i=1, j=1; i<=temp_local; j++)
|
|
{
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "Phasor Ch %d : ", j);
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1);
|
|
gtk_widget_show (label);
|
|
|
|
num_text[j] = gtk_entry_new ();
|
|
gtk_entry_set_max_length ((GtkEntry *)num_text[j], 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_text[j], 1, 2, i, i+1);
|
|
gtk_widget_show (num_text[j]);
|
|
|
|
num_combo[j] = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "Voltage");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "Current");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(num_combo[j]), 0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_combo[j], 2, 3, i, i+1);
|
|
gtk_widget_show (num_combo[j]);
|
|
|
|
/* Add only in case of phasors are in fix point format */
|
|
if(cfg_info->cfg_pf == 0)
|
|
{
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "Max Limit %d : ", j);
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, i, i+1);
|
|
gtk_widget_show (label);
|
|
|
|
num_text1[j] = gtk_entry_new ();
|
|
gtk_entry_set_max_length ((GtkEntry *)num_text1[j], 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_text1[j], 4, 5, i, i+1);
|
|
gtk_widget_show (num_text1[j]);
|
|
if(cfg_info->cfg_pf == 1) gtk_widget_set_sensitive(GTK_WIDGET(num_text1[j]), FALSE);
|
|
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "(kV or Amp)");
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 5, 6, i, i+1);
|
|
gtk_widget_show (label);
|
|
}
|
|
i = i+1;
|
|
}
|
|
|
|
if (temp_local < table_rows)
|
|
{
|
|
for (jj = i; jj < table_rows; jj++)
|
|
{
|
|
label = gtk_label_new ("-- ");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 6, jj, jj+1);
|
|
gtk_widget_show (label);
|
|
}
|
|
}
|
|
|
|
/* Signal handling for Next button on Window */
|
|
g_signal_connect_swapped (next_button, "clicked", G_CALLBACK (validate_func), NULL);
|
|
g_signal_connect_swapped (cancel_button, "clicked", G_CALLBACK (gtk_widget_destroy), PhasorChWin);
|
|
g_signal_connect_swapped (PhasorChWin, "response", G_CALLBACK (gtk_widget_destroy), PhasorChWin);
|
|
|
|
/* This makes it so the button is the default */
|
|
gtk_widget_set_can_default (next_button, TRUE);
|
|
gtk_widget_set_can_default (cancel_button, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (PhasorChWin)->action_area), next_button, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (PhasorChWin)->action_area), cancel_button, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (next_button);
|
|
gtk_widget_show (next_button);
|
|
gtk_widget_grab_default (cancel_button);
|
|
gtk_widget_show (cancel_button);
|
|
|
|
/* Finally show the PhasorChWin */
|
|
gtk_widget_show (PhasorChWin);
|
|
}
|
|
else /* In case of number of new phasors are zero */
|
|
{
|
|
gtk_widget_destroy(CCWin);
|
|
|
|
new_channel_names_for_analog ();
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION new_channel_names_for_analog () */
|
|
/* It shows the window to enter new analog channel names. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void new_channel_names_for_analog ()
|
|
{
|
|
/* new_analog number could be zero? */
|
|
if(new_cfg_info->new_cfg_annmr_val > 0)
|
|
{
|
|
/* local variables */
|
|
int i,temp_local,j,jj,table_rows = 9;
|
|
char line[30];
|
|
GtkWidget *table, *scrolled_window;
|
|
GtkWidget *label, *next_button, *cancel_button;
|
|
|
|
/* Create a new dialog window for the scrolled window to be packed into */
|
|
AnalogChWin = gtk_dialog_new ();
|
|
g_signal_connect (AnalogChWin, "destroy", G_CALLBACK (gtk_widget_destroy), AnalogChWin);
|
|
gtk_window_set_title (GTK_WINDOW (AnalogChWin), "New Analog Channels");
|
|
gtk_container_set_border_width (GTK_CONTAINER (AnalogChWin), 10);
|
|
gtk_window_set_resizable (GTK_WINDOW (AnalogChWin), FALSE);
|
|
|
|
/* Create a new scrolled window */
|
|
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
|
gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 10);
|
|
gtk_widget_set_size_request (scrolled_window, -1, 400);
|
|
|
|
/* The policy is one of GTK_POLICY AUTOMATIC, or GTK_POLICY_ALWAYS.*/
|
|
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
|
|
|
/* The dialog window is created with a vbox packed into it */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(AnalogChWin)->vbox), scrolled_window, TRUE, TRUE, 0);
|
|
gtk_widget_show (scrolled_window);
|
|
|
|
/* Create a table of ? by 2 squares. Based on analog numbers and analog types */
|
|
temp_local = new_cfg_info->new_cfg_annmr_val;
|
|
if (temp_local >= table_rows)
|
|
{
|
|
table_rows = temp_local;
|
|
}
|
|
|
|
if(cfg_info->cfg_af == 0)
|
|
table = gtk_table_new (table_rows+1, 5, FALSE);
|
|
else
|
|
table = gtk_table_new (table_rows+1, 3, FALSE);
|
|
|
|
next_button = gtk_button_new_with_label ("Next");
|
|
cancel_button = gtk_button_new_with_label ("Cancel");
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#990033\" font='10'><b>Enter Analog Channel Name</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, 0, 1);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Set the spacing to 15 on x and 25 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled_window), table);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add a "Next" button to the bottom of the dialog */
|
|
next_button = gtk_button_new_with_label ("Next");
|
|
|
|
/* This simply creates a grid of Lables with text on the table to demonstrate the scrolled window. */
|
|
for(i=1, j=1; i<=temp_local; j++)
|
|
{
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "Analog Ch %d : ", j);
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, i, i+1);
|
|
gtk_widget_show (label);
|
|
|
|
num_text[j] = gtk_entry_new ();
|
|
gtk_entry_set_max_length ((GtkEntry *)num_text[j], 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_text[j], 1, 2, i, i+1);
|
|
gtk_widget_show (num_text[j]);
|
|
|
|
num_combo[j] = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "RMS");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "POW");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(num_combo[j]), "Peak");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(num_combo[j]), 0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_combo[j], 2, 3, i, i+1);
|
|
gtk_widget_show (num_combo[j]);
|
|
|
|
/* Add only in case of analogs are in fix point format */
|
|
if(cfg_info->cfg_af == 0)
|
|
{
|
|
memset(line,'\0',sizeof(line));
|
|
sprintf(line, "Max Value %d : ", j);
|
|
label = gtk_label_new (line);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, i , i+1);
|
|
gtk_widget_show (label);
|
|
|
|
num_text1[j] = gtk_entry_new ();
|
|
gtk_entry_set_max_length ((GtkEntry *)num_text1[j], 16);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), num_text1[j], 4, 5, i , i+1);
|
|
gtk_widget_show (num_text1[j]);
|
|
if(cfg_info->cfg_af == 1) gtk_widget_set_sensitive(GTK_WIDGET(num_text1[j]), FALSE);
|
|
}
|
|
i = i+1;
|
|
}
|
|
|
|
if (temp_local < table_rows)
|
|
{
|
|
for (jj = i; jj < table_rows; jj++)
|
|
{
|
|
label = gtk_label_new ("-- ");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 5, jj, jj+1);
|
|
gtk_widget_show (label);
|
|
}
|
|
}
|
|
|
|
/* Signal handling for Next button on Window */
|
|
g_signal_connect_swapped (next_button, "clicked", G_CALLBACK (validation_new_analog_names), NULL);
|
|
g_signal_connect_swapped (cancel_button, "clicked", G_CALLBACK (gtk_widget_destroy), AnalogChWin);
|
|
g_signal_connect_swapped (AnalogChWin, "response", G_CALLBACK (gtk_widget_destroy), AnalogChWin);
|
|
|
|
/* This makes it so the button is the default */
|
|
gtk_widget_set_can_default (next_button, TRUE);
|
|
gtk_widget_set_can_default (cancel_button, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (AnalogChWin)->action_area), next_button, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (AnalogChWin)->action_area), cancel_button, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (next_button);
|
|
gtk_widget_show (next_button);
|
|
gtk_widget_grab_default (cancel_button);
|
|
gtk_widget_show (cancel_button);
|
|
|
|
/* Finally show the AnalogChWin */
|
|
gtk_widget_show (AnalogChWin);
|
|
}
|
|
else /* if new_phasor < 0 */
|
|
{
|
|
/* Next call to data rate change option? */
|
|
change_data_rate_option();
|
|
}
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION change_data_rate_option() */
|
|
/* It will ask user to choose wether he wants to change data rate or not? */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void change_data_rate_option()
|
|
{
|
|
/* local variables */
|
|
GtkWidget *table;
|
|
GtkWidget *Addbutton, *Removebutton;
|
|
GtkWidget *close_butn, *label;
|
|
GSList *group;
|
|
|
|
/* Create a new dialog window for PMU Data Rate */
|
|
CCWin = gtk_dialog_new ();
|
|
gtk_window_set_title (GTK_WINDOW (CCWin), "PMU Data Rate ");
|
|
gtk_container_set_border_width (GTK_CONTAINER (CCWin), 10);
|
|
|
|
/* Create a table of 4 by 2 squares */
|
|
table = gtk_table_new (6, 2, FALSE);
|
|
|
|
/* Set the spacing to 15 on x and 25 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(CCWin)->vbox), table, TRUE, TRUE, 0);
|
|
gtk_widget_show (table);
|
|
|
|
label = gtk_label_new ("Do you want to change data rate?");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1);
|
|
gtk_widget_show (label);
|
|
|
|
/* Add few radio buttons on the dialog window */
|
|
Addbutton = gtk_radio_button_new_with_label (NULL, "YES");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), Addbutton, 0, 1, 2, 3);
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (Addbutton), TRUE);
|
|
gtk_widget_show (Addbutton);
|
|
|
|
group = gtk_radio_button_group (GTK_RADIO_BUTTON (Addbutton));
|
|
Removebutton = gtk_radio_button_new_with_label (NULL, "NO");
|
|
gtk_table_attach_defaults (GTK_TABLE (table), Removebutton, 0, 1, 3, 4);
|
|
gtk_widget_show (Removebutton);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#333333\" font='8'><b>Note : Changed data rate will be mentioned in the new CFG\nand will be informed to communicating PDCs.</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 5, 6);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Add a "close" button to the bottom of the dialog */
|
|
close_butn = gtk_button_new_with_label ("Close");
|
|
|
|
/* Signal handling for buttons on Data rate Window */
|
|
g_signal_connect_swapped (Addbutton, "clicked", G_CALLBACK (enter_new_data_rate), NULL);
|
|
g_signal_connect_swapped (Removebutton, "clicked", G_CALLBACK (final_cfg_update_call), NULL);
|
|
g_signal_connect_swapped (close_butn, "clicked", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
g_signal_connect_swapped (CCWin, "response", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
|
|
/* This makes it so the button is the default */
|
|
gtk_widget_set_can_default (close_butn, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), close_butn, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (close_butn);
|
|
gtk_widget_show (close_butn);
|
|
|
|
/* Finally show the CCWin */
|
|
gtk_widget_show (CCWin);
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION enter_new_data_rate(GtkWidget *widget, gpointer udata) */
|
|
/* If user wants to change data rate then it will show him a window for */
|
|
/* entring new data rate. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void enter_new_data_rate(GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
GtkWidget *table, *cancel_button;
|
|
GtkWidget *next_butn, *label;
|
|
|
|
/* Create a new dialog window for the New Data Rate */
|
|
gtk_widget_destroy(CCWin);
|
|
CCWin = gtk_dialog_new ();
|
|
gtk_window_set_title (GTK_WINDOW (CCWin), "New Frame Rate");
|
|
gtk_container_set_border_width (GTK_CONTAINER (CCWin), 10);
|
|
|
|
/* Create a table of 3 by 3 squares */
|
|
table = gtk_table_new (5, 2, FALSE);
|
|
|
|
/* Set the spacing to 25 on x and 40 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 10);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 5);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(CCWin)->vbox), table, TRUE, TRUE, 0);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add a "next" button to the bottom of the dialog */
|
|
next_butn = gtk_button_new_with_label ("Next");
|
|
cancel_button = gtk_button_new_with_label ("Cancel");
|
|
|
|
label = gtk_label_new ("Select New Data Rate");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
|
|
gtk_widget_show (label);
|
|
|
|
/* Create combo boxe for user with some fixed values */
|
|
p_drate = gtk_combo_box_new_text();
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "1");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "25");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "30");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "50");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "60");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "100");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "120");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_drate), 3);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), p_drate, 1, 2, 0, 1);
|
|
gtk_widget_show (p_drate);
|
|
/*
|
|
if(cfg_info->cfg_fnom == 1)
|
|
{
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "1");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "10");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "25");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "50");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "100");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_drate), 2);
|
|
}
|
|
else
|
|
{
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "1");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "10");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "12");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "15");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "30");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "60");
|
|
gtk_combo_box_append_text(GTK_COMBO_BOX(p_drate), "120");
|
|
gtk_combo_box_set_active(GTK_COMBO_BOX(p_drate), 4);
|
|
}
|
|
*/
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#333333\" font='8'><b>Note : Frames would be send as per the new data rate.</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 4, 5);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Signal handling for buttons on Data Rate Window */
|
|
g_signal_connect (next_butn, "clicked", G_CALLBACK (validation_new_data_rate), NULL);
|
|
g_signal_connect_swapped (cancel_button, "clicked", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
g_signal_connect_swapped (CCWin, "response", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
|
|
/* This makes it so the button is the default */
|
|
gtk_widget_set_can_default (next_butn, TRUE);
|
|
gtk_widget_set_can_default (cancel_button, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), next_butn, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), cancel_button, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (next_butn);
|
|
gtk_widget_show (next_butn);
|
|
gtk_widget_grab_default (cancel_button);
|
|
gtk_widget_show (cancel_button);
|
|
|
|
/* Finally show the CCWin */
|
|
gtk_widget_show (CCWin);
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION remove_phasor_num (GtkWidget *widget, gpointer udata) */
|
|
/* If wish to remove some of phasor channels from CFG then it provides this */
|
|
/* option, but it should be lessthan maximum phasor numbers. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void remove_phasor_num (GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
char line[50], buff[10];
|
|
GtkWidget *table, *label;
|
|
GtkWidget *next_butn, *cancel_button;
|
|
|
|
/* Allocate the memory for the ConfigurationChange object */
|
|
new_cfg_info = malloc(sizeof(struct ConfigurationChange));
|
|
new_cfg_info->add_remove_choice = 2;
|
|
|
|
/* Create a new dialog window for the Remove Phasor */
|
|
gtk_widget_destroy(CCWin);
|
|
CCWin = gtk_dialog_new ();
|
|
gtk_window_set_title (GTK_WINDOW (CCWin), "Phasor Removal");
|
|
gtk_container_set_border_width (GTK_CONTAINER (CCWin), 10);
|
|
|
|
/* Create a table of 5 by 3 squares */
|
|
table = gtk_table_new (3, 3, FALSE);
|
|
|
|
/* Set the spacing to 5 on x and 40 on y */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table),8);
|
|
gtk_table_set_col_spacings (GTK_TABLE (table),2);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(CCWin)->vbox), table, TRUE, TRUE, 0);
|
|
gtk_widget_show (table);
|
|
|
|
/* Add a "next" button to the bottom of the dialog */
|
|
next_butn = gtk_button_new_with_label ("Next");
|
|
cancel_button = gtk_button_new_with_label ("Cancel");
|
|
|
|
/* Create text boxes for user to enter appropriate values */
|
|
label = gtk_label_new ("Phasors to be remove");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 0, 1);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new ("Analogs to be remove");
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
|
|
gtk_widget_show (label);
|
|
|
|
/* Create text boxes for user to enter appropriate values */
|
|
phtext = gtk_entry_new ();
|
|
gtk_table_attach_defaults (GTK_TABLE (table), phtext, 1, 2, 0, 1);
|
|
gtk_widget_show (phtext);
|
|
|
|
angtext = gtk_entry_new ();
|
|
gtk_table_attach_defaults (GTK_TABLE (table), angtext, 1, 2, 1, 2);
|
|
gtk_widget_show (angtext);
|
|
|
|
memset(line, '\0', 50);
|
|
memset(buff, '\0', 10);
|
|
strcat(line, "< ");
|
|
sprintf(buff,"%d",cfg_info->cfg_phnmr_val);
|
|
strcat(line, buff);
|
|
label = gtk_label_new (line);
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 0, 1);
|
|
gtk_widget_show (label);
|
|
|
|
memset(line, '\0', 50);
|
|
memset(buff, '\0', 10);
|
|
strcat(line, "<= ");
|
|
sprintf(buff,"%d",cfg_info->cfg_annmr_val);
|
|
strcat(line, buff);
|
|
label = gtk_label_new (line);
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 2, 3, 1, 2);
|
|
gtk_widget_show (label);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#333333\" font='8'><b>Note : New channels will be added to existing configuration frame.</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_misc_set_alignment (GTK_MISC(label),0,0);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 2, 3);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Signal handling for buttons on Window */
|
|
g_signal_connect (next_butn, "clicked", G_CALLBACK (validation_remove_ph_an_num), NULL);
|
|
g_signal_connect_swapped (cancel_button, "clicked", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
g_signal_connect_swapped (CCWin, "response", G_CALLBACK (gtk_widget_destroy), CCWin);
|
|
|
|
/* This makes it so the button is the default */
|
|
gtk_widget_set_can_default (next_butn, TRUE);
|
|
gtk_widget_set_can_default (cancel_button, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), next_butn, TRUE, TRUE, 0);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (CCWin)->action_area), cancel_button, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (next_butn);
|
|
gtk_widget_show (next_butn);
|
|
gtk_widget_grab_default (cancel_button);
|
|
gtk_widget_show (cancel_button);
|
|
|
|
/* Finally show the CCWin */
|
|
gtk_widget_show (CCWin);
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION final_cfg_update_call (GtkButton *but, gpointer udata) */
|
|
/* It finally call the 'reconfig_cfg_CC()' for recreate configuration frame. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
int final_cfg_update_call (GtkButton *but, gpointer udata)
|
|
{
|
|
new_cfg_info->data_rate_choice = 0;
|
|
new_cfg_info->new_data_rate = 0;
|
|
|
|
/* Close/destroy the CCWin */
|
|
gtk_widget_destroy(CCWin);
|
|
|
|
/* Final call to recreate configuration frame */
|
|
reconfig_cfg_CC();
|
|
|
|
return 0;
|
|
};
|
|
|
|
|
|
/* ---------------------------------------------------------------------------- */
|
|
/* FUNCTION hdr_create_function (GtkWidget *widget, gpointer udata) */
|
|
/* It will take the PMU information and make Header Frame. */
|
|
/* ---------------------------------------------------------------------------- */
|
|
|
|
void hdr_create_function (GtkWidget *widget, gpointer udata)
|
|
{
|
|
/* local variables */
|
|
GtkWidget *table, *label;
|
|
GtkWidget *close_butn, *vald_butn;
|
|
|
|
/* Create a new dialog window for the Header Frame Window */
|
|
hdr_frame_window = gtk_dialog_new ();
|
|
gtk_window_set_title (GTK_WINDOW (hdr_frame_window), "Header Frame");
|
|
gtk_container_set_border_width (GTK_CONTAINER (hdr_frame_window), 10);
|
|
|
|
/* Create a table of 3 by 2 squares */
|
|
table = gtk_table_new (3, 2, FALSE);
|
|
|
|
/* Set the spacing to 30 on x */
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 10);
|
|
|
|
/* Pack the table into the window */
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(hdr_frame_window)->vbox), table, TRUE, TRUE, 0);
|
|
gtk_widget_show (table);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#990033\" font='12'><b>Enter Header Frame Details</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Create text boxes for user to enter appropriate values */
|
|
HdrFrm = gtk_text_view_new ();//gtk_entry_new();
|
|
gtk_table_attach_defaults (GTK_TABLE (table), HdrFrm, 0, 1, 1, 2);
|
|
gtk_widget_show (HdrFrm);
|
|
|
|
label = gtk_label_new (" ");
|
|
markup = g_markup_printf_escaped ("<span foreground=\"#333333\" font='8'><b>Note : Header frame includes the information about the PMU, the data sources,\nscaling, algorithms, filtering, or other related information.</b></span>");
|
|
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 2, 3);
|
|
gtk_widget_show (label);
|
|
g_free (markup);
|
|
|
|
/* Add few buttons at the bottom of the dialog */
|
|
vald_butn = gtk_button_new_with_label ("Create");
|
|
close_butn = gtk_button_new_with_label ("Close");
|
|
|
|
/* Signal handling for buttons on Window */
|
|
g_signal_connect (vald_butn, "clicked", G_CALLBACK (validation_hdr_frm), (gpointer) "2");
|
|
g_signal_connect_swapped (close_butn, "clicked", G_CALLBACK (gtk_widget_destroy), hdr_frame_window);
|
|
g_signal_connect_swapped (hdr_frame_window, "response", G_CALLBACK (gtk_widget_destroy), hdr_frame_window);
|
|
|
|
/* This makes it so the button is the default */
|
|
gtk_widget_set_can_default (vald_butn, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (hdr_frame_window)->action_area), vald_butn, TRUE, TRUE, 0);
|
|
gtk_widget_set_can_default (close_butn, TRUE);
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (hdr_frame_window)->action_area), close_butn, TRUE, TRUE, 0);
|
|
|
|
/* This grabs this button to be the default button. Simply hitting the "Enter" key will cause this button to activate. */
|
|
gtk_widget_grab_default (vald_butn);
|
|
gtk_widget_show (vald_butn);
|
|
gtk_widget_grab_default (close_butn);
|
|
gtk_widget_show (close_butn);
|
|
|
|
/* Finally show the hdr_frame_window */
|
|
gtk_widget_show (hdr_frame_window);
|
|
};
|
|
|
|
/*************************************** End of Program ***********************************************/
|