iPDC-suite/PMUSimulator/CfgFunction.c

1253 lines
38 KiB
C
Executable File

/* -----------------------------------------------------------------------------
* CfgFunction.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 <math.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <gtk/gtk.h>
#include "CfgFunction.h"
#include "function.h"
#include "PmuGui.h"
#include "ShearedMemoryStructure.h"
#define max_data_rate 200
#define MAX_STRING_SIZE 5000
/*----------------------------------------------------------------------------------------*/
/* Functions in CfgFunction.c */
/*----------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* */
/* 1. void header_frm_gen(int len); */
/* 2. void reconfig_cfg_CC(); */
/* 3. int create_cfg(); */
/* 4. void show_pmu_details (GtkWidget *widget, gpointer udata); */
/* */
/*--------------------------------------------------------------------*/
/* ------------------------------------------------------------------ */
/* global variables */
/* ------------------------------------------------------------------ */
double t1;
int frmt, fdf, af, pf, pn, phnmr, annmr, dgnmr, num_pmu = 1;
int cfg2_frm_size, data_frm_size = 18, data_rate, cfgcnt = 0;
int i, j, n, pmu_id, indx = 0, global_data_frm_size=0, hdrFrmSize=0;
long int soc, fracsec = 0;
long int phunit = 915527, anunit = 1, digunit = 0;
const long int TB = 16777215; // roundf(powf(2,24) - 1);
char temp_5[16];
unsigned char temp[2], temp_1[4], temp_6[16];
unsigned char cfg2_frm[MAX_STRING_SIZE];
unsigned char header[MAX_STRING_SIZE];
struct timeval tim;
uint16_t chk;
/* ------------------------------------------------------------------------*/
/* FUNCTION header_frm_gen(int len) */
/* It generates the Header Frame from user given information about PMU and */
/* store in a PMU Setup File. */
/* ------------------------------------------------------------------------*/
void header_frm_gen(int len)
{
/* local variables */
int i, indx = 0;
FILE *fp1;
memset(header, '\0', sizeof(header));
/* Insert the fields in Header Frame: sync word */
header[indx++] = 0xAA;
header[indx++] = 0x001;
/* Insert frame size in Header Frame */
i2c(0, temp);
B_copy(header, temp, indx, 2);
indx = indx + 2;
/* Insert user given PMU ID in Header Frame */
i2c(pmu_id, temp);
B_copy(header, temp, indx, 2);
indx = indx + 2;
/* Insert current SOC value in Header Frame */
//time_t tm = time(NULL);
gettimeofday(&tim, NULL);
soc = (long) tim.tv_sec;
li2c(soc, temp_1);
B_copy(header, temp_1, indx, 4);
indx = indx + 4;
/* Insert the time quality fields & fraction of second value in Header Frame */
//gettimeofday(&tim, NULL);
//t1=tim.tv_sec+(tim.tv_usec/1000000.0);
//fracsec = (t1-soc)*TB;
fracsec = (long) (tim.tv_usec*TB/1e6);
li2c(fracsec, temp_1);
B_copy(header, temp_1, indx, 4);
indx = indx + 4;
/* Insert the PMU Information given by user in Header Frame */
for (i = 0; i < len; i++)
{
header[indx+i] = hdr_frame[i];
}
indx = indx + i;
/* Calculation & insert the checksum VALUE of Header frame (up to now) */
chk = compute_CRC(header,indx);
header[indx++] = (chk >> 8) & ~(~0<<8); /* CHKSUM high byte */
header[indx++] = (chk ) & ~(~0<<8); /* CHKSUM low byte */
/* Insert frame size in Header Frame */
header[2] = indx>>8;;
header[3] = indx;
/* Open the PMU Setup File */
fp1 = fopen(pmuFilePath,"ab");
if (fp1 != NULL)
{
hdrFrmSize = indx;
char buff[15];
sprintf(buff, "%d", indx);
/* Write the size of Header Frame & then Header Frame into file */
fputs("HdrFrame 1 ", fp1);
fputs(buff, fp1);
fwrite(header, sizeof(unsigned char), indx, fp1);
fputc('\n', fp1);
fclose(fp1);
printf("\n-> Size of Header frame is %d Bytes.", indx);
validation_result (" Headre Frame successfully generated.");
}
}; /* end of header_frm_gen() */
/* ---------------------------------------------------------------------------- */
/* FUNCTION reconfig_cfg_CC() */
/* This function allows user to easy modify the existing Configuration Frame. */
/* In terms of modification user can add new phasor channels or remove. */
/* It also provide the option for change Data Rate. Finally replace the new */
/* Configuration frame with old CFG in PMU Setup File and gives signal to PMU */
/* serverchange to change the appropriate bit of STAT Word while sending */
/* Data Frames to connected PDC. */
/* ---------------------------------------------------------------------------- */
void reconfig_cfg_CC()
{
/* local Variables*/
unsigned char stn[16];
int old_data_rate, indx=2;
int j, global_frmt, tmp_k;
FILE *fp1;
/* Get the Station name from CFG FRM */
memset(stn, '\0', 16);
strncpy((char *)stn, cfg_info->cfg_STNname, 16);
/* Get the FORMAT word from CFG FRM */
global_frmt = frmt;
/* Ask user's choice what type of modification he wants? */
if(new_cfg_info->add_remove_choice == 1) /* Add more Phasor/Analog channels in existing CFG as per user's wish */
{
phnmr = cfg_info->cfg_phnmr_val + new_cfg_info->new_cfg_phnmr_val;
annmr = cfg_info->cfg_annmr_val + new_cfg_info->new_cfg_annmr_val;
}
else if(new_cfg_info->add_remove_choice == 2) /* Remove Phasor/Analog channels from existing CFG as per user's wish */
{
phnmr = cfg_info->cfg_phnmr_val - new_cfg_info->new_cfg_phnmr_val;
annmr = cfg_info->cfg_annmr_val - new_cfg_info->new_cfg_annmr_val;
}
/* Calculate the size of new CFG Frame */
cfg2_frm_size = 0;
cfg2_frm_size = 54 + (16*phnmr) + (16*annmr) + (256*dgnmr) + (4*phnmr) + (4*annmr) + (4*dgnmr);
/* Calculate the corresponding data frame size */
global_data_frm_size = data_frm_size;
data_frm_size = 0;
data_frm_size = 18;
/* Calculate 4/8 bytes for each PHNMR */
if (cfg_info->cfg_pf == 0)
{
data_frm_size = data_frm_size + (4*phnmr);
}
else
{
data_frm_size = data_frm_size + (8*phnmr);
}
/* Calculate 2/4 bytes for each ANNMR */
if (cfg_info->cfg_af == 0)
{
data_frm_size = data_frm_size + (2*annmr);
}
else
{
data_frm_size = data_frm_size + (4*annmr);
}
/* Calculate 2/4 bytes for both (FREQ + DFREQ) */
if (cfg_info->cfg_fdf == 0)
{
data_frm_size = data_frm_size + 4;
}
else
{
data_frm_size = data_frm_size + 8;
}
/* Calculate 2 bytes for each DGNMR */
data_frm_size = data_frm_size + (2*dgnmr);
printf("\nCFG = %d, Data Frame = %d\n", cfg2_frm_size, data_frm_size);
/* Insert the fields in new CFG Frame: sync word */
memset(cfg2_frm,'\0',sizeof(cfg2_frm));
indx = 0;
cfg2_frm[indx++] = 0xAA;
cfg2_frm[indx++] = 0x31;
/* Insert frame size in new CFG Frame */
i2c(cfg2_frm_size, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert user given PMU ID in new CFG Frame */
i2c(pmu_id, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert current SOC value in new CFG Frame */
soc = 0;
li2c(soc, temp_1);
B_copy(cfg2_frm, temp_1, indx, 4);
indx = indx + 4;
/* Insert the time quality fields & fraction of second value in new CFG Frame, here it is static "00000000" */
li2c(fracsec, temp_1);
B_copy(cfg2_frm, temp_1, indx, 4);
indx = indx + 4;
/* Insert Time Base for calculating fraction of second in new CFG Frame, here it is static 1000000μs */
li2c(TB, temp_1);
B_copy(cfg2_frm, temp_1, indx, 4);
indx = indx + 4;
/* Insert number of PMU in new CFG Frame: static "0001" */
i2c(num_pmu, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert the station name or PMU name in new CFG Frame */
B_copy(cfg2_frm, stn, indx, 16);
indx = indx + 16;
/* Insert again pmu id in new CFG Frame */
i2c(pmu_id, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert format word in new CFG Frame */
i2c(global_frmt, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert number of phasor or PHNMR in new CFG Frame */
i2c(phnmr, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert number of analog or ANNMR in new CFG Frame */
i2c(annmr, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert number of Digital status word or DGNMR in new CFG Frame */
i2c(dgnmr, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert NEW Phasor channel Names (if any) in new CFG frame */
if (new_cfg_info->add_remove_choice == 1)
{
/* First Insert old Phasor channels in new CFG frame */
B_copy(cfg2_frm, (unsigned char *)cfg_info->cfg_phasor_channels, indx, cfg_info->cfg_phnmr_val*16);
indx = indx + (cfg_info->cfg_phnmr_val*16);
if (new_cfg_info->new_cfg_phnmr_val > 0)
{
/* Insert New Phasor channels (if any) in new CFG frame */
B_copy(cfg2_frm, (unsigned char *)new_cfg_info->new_cfg_phasor_channels, indx, (new_cfg_info->new_cfg_phnmr_val*16));
indx = indx + (new_cfg_info->new_cfg_phnmr_val*16);
free(new_cfg_info->new_cfg_phasor_channels);
}
cfg_info->cfg_phnmr_val = cfg_info->cfg_phnmr_val + new_cfg_info->new_cfg_phnmr_val;
/* First Insert old Analog channels in new CFG frame */
B_copy(cfg2_frm, (unsigned char *)cfg_info->cfg_analog_channels, indx, cfg_info->cfg_annmr_val*16);
indx = indx + (cfg_info->cfg_annmr_val*16);
if (new_cfg_info->new_cfg_annmr_val > 0)
{
/* Insert New Analog channels (if any) in new CFG frame */
B_copy(cfg2_frm, (unsigned char *)new_cfg_info->new_cfg_analog_channels, indx, (new_cfg_info->new_cfg_annmr_val*16));
indx = indx + (new_cfg_info->new_cfg_annmr_val*16);
free(new_cfg_info->new_cfg_analog_channels);
}
cfg_info->cfg_annmr_val = cfg_info->cfg_annmr_val + new_cfg_info->new_cfg_annmr_val;
}
/* Remove channel Names (from availables) from new CFG frame */
else if (new_cfg_info->add_remove_choice == 2)
{
/* Remove Phasor channels (if any) in new CFG frame */
cfg_info->cfg_phnmr_val = cfg_info->cfg_phnmr_val - new_cfg_info->new_cfg_phnmr_val;
B_copy(cfg2_frm, (unsigned char *)cfg_info->cfg_phasor_channels, indx, cfg_info->cfg_phnmr_val*16);
indx = indx + (cfg_info->cfg_phnmr_val*16);
/* Remove Analog channels (if any) in new CFG frame */
cfg_info->cfg_annmr_val = cfg_info->cfg_annmr_val - new_cfg_info->new_cfg_annmr_val;
B_copy(cfg2_frm, (unsigned char *)cfg_info->cfg_analog_channels, indx, cfg_info->cfg_annmr_val*16);
indx = indx + (cfg_info->cfg_annmr_val*16);
}
/* Insert Digital channel Names in new CFG frame */
B_copy(cfg2_frm, (unsigned char *)cfg_info->cfg_digital_channels, indx, (cfg_info->cfg_dgnmr_val*256));
indx = indx + (cfg_info->cfg_dgnmr_val*256);
/* Insert FACTOR VALUES for Phasor, Analog and Digital in new CFG frame */
for(j=0, tmp_k=0; j<cfg_info->cfg_phnmr_val; j++) /* FACTOR VALUES for Phasor */
{
cfg2_frm[indx++] = phunit_final_val[tmp_k++];
cfg2_frm[indx++] = phunit_final_val[tmp_k++];
cfg2_frm[indx++] = phunit_final_val[tmp_k++];
cfg2_frm[indx++] = phunit_final_val[tmp_k++];
}
for(j=0, tmp_k=0; j<cfg_info->cfg_annmr_val; j++) /* FACTOR VALUES for Phasor */
{
cfg2_frm[indx++] = anunit_final_val[tmp_k++];
cfg2_frm[indx++] = anunit_final_val[tmp_k++];
cfg2_frm[indx++] = anunit_final_val[tmp_k++];
cfg2_frm[indx++] = anunit_final_val[tmp_k++];
}
for(j=0; j<cfg_info->cfg_dgnmr_val; j++) /* FACTOR VALUES for Digital */
{
li2c(digunit, temp_1);
B_copy(cfg2_frm, temp_1, indx, 4);
indx = indx + 4;
}
/* Insert normal frequency or fnom VALUE in new CFG frame */
i2c(cfg_info->cfg_fnom, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Data rate change? option for user */
old_data_rate = data_rate;
if (new_cfg_info->data_rate_choice == 1)
{
data_rate = new_cfg_info->new_data_rate;
cfg_info->cfg_dataRate = new_cfg_info->new_data_rate;
printf("\n-> New Data Rate = %d\n", data_rate);
}
/* Insert configuration count or cfgcnt VALUE in new CFG frame is any of addition or removal of channel happened??? */
if ((global_data_frm_size != data_frm_size) || (old_data_rate != data_rate))
{
cfgcnt = cfgcnt + 1;
printf("\n-> CFG COUNT incremented = %d\n", cfgcnt);
i2c(cfgcnt, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
}
else
{
i2c(cfgcnt, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
}
/* Insert Data Rate VALUE in new CFG frame */
i2c(data_rate, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert current SOC value in new CFG Frame */
gettimeofday(&tim, NULL);
soc = (long) tim.tv_sec;
li2c(soc, temp_1);
B_copy(cfg2_frm, temp_1, 6, 4);
/* Insert the time quality fields & fraction of second value in new CFG Frame */
//gettimeofday(&tim, NULL);
//t1=tim.tv_sec+(tim.tv_usec/1000000.0);
//fracsec = (t1-soc)*TB;
fracsec = (long) (tim.tv_usec*TB/1e6);
li2c(fracsec, temp_1);
B_copy(cfg2_frm, temp_1, 10, 4);
/* Calculation & insert the checksum VALUE of new CFG frame (up to now) */
chk = compute_CRC(cfg2_frm,indx);
cfg2_frm[indx++] = (chk >> 8) & ~(~0<<8); /* CHKSUM high byte */
cfg2_frm[indx++] = (chk ) & ~(~0<<8); /* CHKSUM low byte */
/* Open the PMU Setup File and replace new CFG frame with old CFG if and only if
when last two calculated data frame are not equal or data rate changed */
if ((global_data_frm_size != data_frm_size) || (old_data_rate != data_rate))
{
/* Delete the old PMU Setup File and create new PMU Setup File with new CFG frame */
if (remove(pmuFilePath) == -1)
perror("Error in deleting a file");
fp1 = fopen (pmuFilePath,"wb");
char buff[50];
sprintf(buff, "%d", PMU_uport);
fputs(buff, fp1);
fputc('\n', fp1);
sprintf(buff, "%d", PMU_tport);
fputs(buff, fp1);
fputc('\n', fp1);
fputs("CFG 1 ", fp1);
sprintf(buff, "%d", indx);
fputs(buff, fp1);
fputc('\n', fp1);
fwrite(cfg2_frm, sizeof(unsigned char),indx,fp1);
fputc('\n', fp1);
if(hdrFrmSize > 0)
{
fputs("HDR 1 ", fp1);
sprintf(buff, "%d", hdrFrmSize);
fputs(buff, fp1);
fputc('\n', fp1);
fwrite(header, sizeof(unsigned char),hdrFrmSize,fp1);
fputc('\n', fp1);
}
else
{
fputs("HDR 0 0", fp1);
fputc('\n', fp1);
}
fclose (fp1);
free(new_cfg_info);
validation_result ("Modification in Configuration frame has been successfully updated.");
/* Give signal to PMU Server for change in configuration frame */
ShmPTR->cfg_bit_change_info = 1;
p1.pid = ShmPTR->pid;
kill(p1.pid, SIGUSR2);
printf("Configuration frame modification signal sent to PMU Server.\n");
/* Set raw data selection as configuration has been changed */
strcpy(ShmPTR->filePath, "nil");
ShmPTR->dataFileVar = 0;
p1.pid = ShmPTR->pid;
kill(p1.pid, SIGUSR1);
printf("Set Raw Measurements in Data Frames because configuration of PMU has been changed.\n");
}
else /* If CFG is not modified */
{
validation_result ("No modification has been done in Configuration frame.");
}
printf("\n-> New configuration frame has been generated of size %d Bytes.\nAnd the new data frame size would be %d Bytes.\n\n[", cfg2_frm_size, data_frm_size);
} /* end of reconfig_cfg_CC() */
/* ---------------------------------------------------------------------------- */
/* FUNCTION create_cfg() */
/* It generate the Configuration Frame as per user entered information. */
/* It write in the file PMU Setup File. */
/* It will also reload the saved PMU Setup File give by user. */
/* ---------------------------------------------------------------------------- */
int create_cfg()
{
/* local Variables*/
int j, a, x1, tmp_k;
int tempi, indx = 0;
char stn[17],*rline = NULL, *d1;
unsigned char cline[MAX_STRING_SIZE];
size_t len = 0;
ssize_t read;
FILE *fp1;
/* Open the saved PMU Setup File and read the CFG frame if any? */
fp1 = fopen (pmuFilePath,"rb");
if (fp1 != NULL)
{
tempi = 1;
while(tempi < 4)
{
read = getline(&rline, &len, fp1);
if(read == 0)
break;
tempi++;
}
if(read > 0)
{
d1 = strtok (rline," ");
d1 = strtok (NULL," ");
tempi = atoi(d1);
if (tempi == 1)
{
d1 = strtok (NULL,"\n");
tempi = atoi(d1);
/* Copy the full Configuration Frame into 'cline' array */
memset(cline,'\0',sizeof(cline));
fread(cline, sizeof(unsigned char), tempi, fp1);
fclose(fp1);
/* Allocate the memory for ConfigurationFrame object */
cfg_info = malloc(sizeof(struct ConfigurationFrame));
cfg_info->cfg_STNname = malloc(17);
/* Get the CFG size & store globaly */
temp[0] = cline[2];
temp[1] = cline[3];
cfg2_frm_size = c2i(temp);
/* Get the PMU ID from CFG FRM & store globally */
temp[0] = cline[4];
temp[1] = cline[5];
pmu_id = c2i(temp);
cfg_info->cfg_pmuID = pmu_id;
/* Get the PMU ID from CFG FRM & store globally */
temp_1[0] = cline[14];
temp_1[1] = cline[15];
temp_1[2] = cline[16];
temp_1[3] = cline[17];
//TB = c2li(temp_1);
/* Get the Station name from CFG FRM & store globally */
for(a=0; a<16; a++)
{
stn[a] = cline[20+a];
}
stn[16] = '\0';
strcpy(cfg_info->cfg_STNname, stn);
/* Get the FORMAT word from CFG FRM */
temp[0] = cline[38];
temp[1] = cline[39];
frmt = c2i(temp);
/* Initialize the frmt bits as in his appropriate global variable */
if(frmt == 15)
{
fdf=1, af=1, pf=1, pn=1;
}
else if(frmt == 14)
{
fdf=1, af=1, pf=1, pn=0;
}
else if(frmt == 13)
{
fdf=1, af=1, pf=0, pn=1;
}
else if(frmt == 12)
{
fdf=1, af=1, pf=0, pn=0;
}
else if(frmt == 11)
{
fdf=1, af=0, pf=1, pn=1;
}
else if(frmt == 10)
{
fdf=1, af=0, pf=1, pn=0;
}
else if(frmt == 9)
{
fdf=1, af=0, pf=0, pn=1;
}
else if(frmt == 8)
{
fdf=1, af=0, pf=0, pn=0;
}
else if(frmt == 7)
{
fdf=0, af=1, pf=1, pn=1;
}
else if(frmt == 6)
{
fdf=0, af=1, pf=1, pn=0;
}
else if(frmt == 5)
{
fdf=0, af=1, pf=0, pn=1;
}
else if(frmt == 4)
{
fdf=0, af=1, pf=0, pn=0;
}
else if(frmt == 3)
{
fdf=0, af=0, pf=1, pn=1;
}
else if(frmt == 2)
{
fdf=0, af=0, pf=1, pn=0;
}
else if(frmt == 1)
{
fdf=0, af=0, pf=0, pn=1;
}
else
{
fdf=0, af=0, pf=0, pn=0;
}
/* Store FORMAT in global data structure */
cfg_info->cfg_fdf = fdf;
cfg_info->cfg_af = af;
cfg_info->cfg_pf = pf;
cfg_info->cfg_pn = pn;
/* Get the PHNMR from CFG FRM & store globally */
temp[0] = cline[40];
temp[1] = cline[41];
phnmr = c2i(temp);
cfg_info->cfg_phnmr_val = phnmr;
/* Get the ANNMR from CFG FRM & store in globally */
temp[0] = cline[42];
temp[1] = cline[43];
annmr = c2i(temp);
cfg_info->cfg_annmr_val = annmr;
/* Get the DGNMR from CFG FRM & store globally */
temp[0] = cline[44];
temp[1] = cline[45];
dgnmr = c2i(temp);
cfg_info->cfg_dgnmr_val = dgnmr;
/* To escape the some of fields in cfg frame */
indx = 46 + (16*phnmr) + (16*annmr) + (256*dgnmr) + (4*phnmr) + (4*annmr) + (4*dgnmr) + 2;
temp[0] = cline[indx++];
temp[1] = cline[indx++];
cfgcnt = c2i(temp);
/* Get the Data Rate from CFG FRM & store globally */
temp[0] = cline[indx++];
temp[1] = cline[indx++];
data_rate = c2i(temp);
cfg_info->cfg_dataRate = data_rate;
/* Seprate the Phasor Channels from CFG FRM & store globally */
cfg_info->cfg_phasor_channels = (char *)malloc((phnmr*16) * sizeof(char));
for(x1=0, indx=46; x1< (phnmr*16); x1++,indx++)
{
cfg_info->cfg_phasor_channels[x1] = cline[indx];
}
/* Seprate the Analog Channels from CFG FRM & store globally */
cfg_info->cfg_analog_channels = (char *)malloc((annmr*16) * sizeof(char));
for(x1=0, indx; x1< (annmr*16); x1++,indx++)
{
cfg_info->cfg_analog_channels[x1] = cline[indx];
}
/* Seprate the Digital Channels from CFG FRM & store globally */
cfg_info->cfg_digital_channels = (char *)malloc((dgnmr*16*16) * sizeof(char));
for(x1=0, indx; x1< (dgnmr*16*16); x1++,indx++)
{
cfg_info->cfg_digital_channels[x1] = cline[indx];
}
/* Insert FACTOR VALUES for Phasor, Analog and Digital in new CFG frame */
for(j=0, tmp_k=0; j<cfg_info->cfg_phnmr_val; j++)/* FACTOR VALUES for Phasor */
{
phunit_final_val[tmp_k++] = cline[indx++];
phunit_final_val[tmp_k++] = cline[indx++];
phunit_final_val[tmp_k++] = cline[indx++];
phunit_final_val[tmp_k++] = cline[indx++];
}
for(j=0, tmp_k=0; j<cfg_info->cfg_annmr_val; j++)/* FACTOR VALUES for Analog */
{
anunit_final_val[tmp_k++] = cline[indx++];
anunit_final_val[tmp_k++] = cline[indx++];
anunit_final_val[tmp_k++] = cline[indx++];
anunit_final_val[tmp_k++] = cline[indx++];
}
}
}
}
else /* At the time of creating new PMU Setup File */
{
/* Store FORMAT bits from global data structure */
fdf = cfg_info->cfg_fdf;
af = cfg_info->cfg_af;
pf = cfg_info->cfg_pf;
pn = cfg_info->cfg_pn;
if(fdf==1 && af==1 && pf==1 && pn==1)
{
frmt = 15;
}
else if(fdf==1 && af==1 && pf==1 && pn==0)
{
frmt = 14;
}
else if(fdf==1 && af==1 && pf==0 && pn==1)
{
frmt = 13;
}
else if(fdf==1 && af==1 && pf==0 && pn==0)
{
frmt = 12;
}
else if(fdf==1 && af==0 && pf==1 && pn==1)
{
frmt = 11;
}
else if(fdf==1 && af==0 && pf==1 && pn==0)
{
frmt = 10;
}
else if(fdf==1 && af==0 && pf==0 && pn==1)
{
frmt = 9;
}
else if(fdf==1 && af==0 && pf==0 && pn==0)
{
frmt = 8;
}
else if(fdf==0 && af==1 && pf==1 && pn==1)
{
frmt = 7;
}
else if(fdf==0 && af==1 && pf==1 && pn==0)
{
frmt = 6;
}
else if(fdf==0 && af==1 && pf==0 && pn==1)
{
frmt = 5;
}
else if(fdf==0 && af==1 && pf==0 && pn==0)
{
frmt = 4;
}
else if(fdf==0 && af==0 && pf==1 && pn==1)
{
frmt = 3;
}
else if(fdf==0 && af==0 && pf==1 && pn==0)
{
frmt = 2;
}
else if(fdf==0 && af==0 && pf==0 && pn==1)
{
frmt = 1;
}
else
{
frmt = 0;
}
/* Accept Number of Phasor values in PHNMR */
phnmr = cfg_info->cfg_phnmr_val;
/* Accept Number of Phasor values in ANNMR */
annmr = cfg_info->cfg_annmr_val;
/* Accept Number of Phasor values in DGNMR */
dgnmr = cfg_info->cfg_dgnmr_val;
/* Calculate the total size of CFG Frame */
cfg2_frm_size = 54 + (16*phnmr) + (16*annmr) + (4*phnmr) + (4*annmr) + (4*dgnmr) + (256*dgnmr);
/* Calculate 4/8 bytes for each PHNMR & store globally */
if (pf == 0)
{
data_frm_size = data_frm_size + (4*phnmr);
}
else
{
data_frm_size = data_frm_size + (8*phnmr);
}
/* Calculate 2/4 bytes for each ANNMR & store globally */
if (af == 0)
{
data_frm_size = data_frm_size + (2*annmr);
}
else
{
data_frm_size = data_frm_size + (4*annmr);
}
/* Calculate 2/4 bytes for both (FREQ + DFREQ) & store globally */
if (fdf == 0)
{
data_frm_size = data_frm_size + 4;
}
else
{
data_frm_size = data_frm_size + 8;
}
/* Calculate 2 bytes for each DGNMR & store globally */
data_frm_size = data_frm_size + (2*dgnmr);
/* Insert the fields in CFG Frame: sync word */
memset(cfg2_frm,'\0',sizeof(cfg2_frm));
cfg2_frm[indx++] = 0xAA;
cfg2_frm[indx++] = 0x31;
/* Insert frame size in CFG Frame */
i2c(cfg2_frm_size, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert user given PMU ID in CFG Frame */
pmu_id = cfg_info->cfg_pmuID;
i2c(pmu_id, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert SOC value in CFG Frame */
soc = 0;
li2c(soc, temp_1);
B_copy(cfg2_frm, temp_1, indx, 4);
indx = indx + 4;
/* Insert the time quality fields & fraction of second value in CFG Frame, right now it is '00000000' */
li2c(fracsec, temp_1);
B_copy(cfg2_frm, temp_1, indx, 4);
indx = indx + 4;
/* Insert Time Base for calculating fraction of second in CFG Frame, here it is static 1000000μs */
li2c(TB, temp_1);
B_copy(cfg2_frm, temp_1, indx, 4);
indx = indx + 4;
/* Insert number of PMU in CFG Frame: Static "0001" */
i2c(num_pmu, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert the station name or PMU name in CFG Frame */
strncpy(temp_5, (const char *)cfg_info->cfg_STNname, 16);
B_copy(cfg2_frm, (unsigned char *)temp_5, indx, 16);
indx = indx + 16;
/* Again insert pmu id in CFG Frame */
i2c(pmu_id, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert format word in CFG Frame */
i2c(frmt, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert number of phasor or PHNMR in CFG Frame */
i2c(phnmr, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert number of analog or ANNMR in CFG Frame */
i2c(annmr, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert number of Digital status word or DGNMR in CFG Frame */
i2c(dgnmr, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* All channel names or CHNAM fields in CFG frame. */
/* Insert phasor channel names in CFG frame */
B_copy(cfg2_frm, (unsigned char *)cfg_info->cfg_phasor_channels, indx, 16*phnmr);
indx = indx + 16*phnmr;
/* Insert Digital channel names in CFG frame */
B_copy(cfg2_frm, (unsigned char *)cfg_info->cfg_analog_channels, indx, 16*annmr);
indx = indx + 16*annmr;
/* Insert Digital channel names in CFG frame */
B_copy(cfg2_frm, (unsigned char *)cfg_info->cfg_digital_channels, indx, 16*16*dgnmr);
indx = indx + 16*16*dgnmr;
/* Insert FACTOR VALUES for Phasor, Analog and Digital in CFG frame */
for(j=0, tmp_k=0; j<phnmr; j++) /* FACTOR VALUES for Phasor */
{
cfg2_frm[indx++] = phunit_final_val[tmp_k++];
cfg2_frm[indx++] = phunit_final_val[tmp_k++];
cfg2_frm[indx++] = phunit_final_val[tmp_k++];
cfg2_frm[indx++] = phunit_final_val[tmp_k++];
}
for(j=0, tmp_k=0; j<annmr; j++) /* FACTOR VALUES for Analog */
{
cfg2_frm[indx++] = anunit_final_val[tmp_k++];
cfg2_frm[indx++] = anunit_final_val[tmp_k++];
cfg2_frm[indx++] = anunit_final_val[tmp_k++];
cfg2_frm[indx++] = anunit_final_val[tmp_k++];
}
for(j=0; j< dgnmr; j++) /* FACTOR VALUES for Digital */
{
li2c(digunit, temp_1);
B_copy(cfg2_frm, temp_1, indx, 4);
indx = indx + 4;
}
/* Insert normal frequency or fnom VALUE in CFG frame */
i2c(cfg_info->cfg_fnom, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert configuration count or cfgcnt VALUE in CFG frame */
i2c(cfgcnt, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert Data Rate in CFG frame */
data_rate = cfg_info->cfg_dataRate;
i2c(data_rate, temp);
B_copy(cfg2_frm, temp, indx, 2);
indx = indx + 2;
/* Insert current SOC value in CFG Frame */
gettimeofday(&tim, NULL);
soc = (long) tim.tv_sec;
li2c(soc, temp_1);
B_copy(cfg2_frm, temp_1, 6, 4);
/* Insert the time quality fields & fraction of second value in CFG Frame */
// gettimeofday(&tim, NULL);
// t1=tim.tv_sec+(tim.tv_usec/1000000.0);
// fracsec = (t1-soc)*TB;
fracsec = (long) (tim.tv_usec*TB/1e6);
li2c(fracsec, temp_1);
B_copy(cfg2_frm, temp_1, 10, 4);
/* Calculation & insert the checksum VALUE of new CFG frame (up to now) */
chk = compute_CRC(cfg2_frm,indx);
cfg2_frm[indx++] = (chk >> 8) & ~(~0<<8); /* CHKSUM high byte */
cfg2_frm[indx++] = (chk ) & ~(~0<<8); /* CHKSUM low byte */
char buff[50];
/* Create a new PMU Setup File and save the info with 'pmuPMU-ID.txt' name */
memset(pmuFilePath, '\0', 200);
strcpy(pmuFilePath, pmuFolderPath);
strcat(pmuFilePath, "/");
strcat(pmuFilePath, "pmu");
sprintf(buff, "%d", pmu_id);
strcat(pmuFilePath, buff);
strcat(pmuFilePath, ".bin");
pmuFilePath[strlen(pmuFilePath)] = '\0';
fp1 = fopen (pmuFilePath,"wb");
sprintf(buff, "%d", PMU_uport);
fputs(buff, fp1);
fputc('\n', fp1);
sprintf(buff, "%d", PMU_tport);
fputs(buff, fp1);
fputc('\n', fp1);
fputs("CFG 1 ", fp1);
sprintf(buff, "%d", indx);
fputs(buff, fp1);
fputc('\n', fp1);
fwrite(cfg2_frm, sizeof(unsigned char),indx,fp1);
fputc('\n', fp1);
fclose (fp1);
printf("\nCFG Frame size = %d-Bytes, ", cfg2_frm_size);
printf("& Data Frame size = %d-Bytes.\n", data_frm_size);
}
/* Now send a signal for CFG file path to PMU Server process*/
strcpy(ShmPTR->cfgPath, pmuFilePath);
ShmPTR->dataFileVar = 2;
p1.pid = ShmPTR->pid;
kill(p1.pid, SIGUSR1);
printf("\nConfiguration file path has been sent to PMU Server through signal.\n");
return 0;
} /* end of function() */
/* ---------------------------------------------------------------------------- */
/* FUNCTION show_pmu_details (GtkWidget *widget, gpointer udata) */
/* It display the details of PMU Server and Configuartion details. */
/* ---------------------------------------------------------------------------- */
void show_pmu_details (GtkWidget *widget, gpointer udata)
{
/* local variables */
char tmpBuffer[30];
GtkWidget *label, *table, *close_but;
/* Create a new dialog window for the scrolled window to be packed into */
new_window = gtk_dialog_new ();
g_signal_connect (new_window, "destroy", G_CALLBACK (gtk_widget_destroy), new_window);
gtk_window_set_title (GTK_WINDOW (new_window), "PMU Properties");
gtk_container_set_border_width (GTK_CONTAINER (new_window), 10);
/* Create a table of 14 by 2 squares. */
table = gtk_table_new (16, 2, FALSE);
/* Set the spacing to 35 on x and 25 on y */
gtk_table_set_row_spacings (GTK_TABLE (table), 8);
gtk_table_set_col_spacings (GTK_TABLE (table), 5);
/* Pack the table into the scrolled window */
gtk_box_pack_start (GTK_BOX (GTK_DIALOG(new_window)->vbox), table, TRUE, TRUE, 0);
gtk_widget_show (table);
/* Add a "OK" button to the bottom of the dialog */
close_but = gtk_button_new_with_label ("OK");
/* This simply creates a grid of toggle buttons on the table to demonstrate the scrolled window */
label = gtk_label_new (" ");
markup1 = g_markup_printf_escaped ("<span foreground=\"#0000FF\" font='10'><b>PMU Server Details</b></span>");
gtk_label_set_markup (GTK_LABEL (label), markup1);
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 0, 1);
gtk_widget_show (label);
g_free (markup1);
label = gtk_label_new ("UDP Port");
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 ("TCP Port");
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);
/* We have the global variables to hold the port & protocol values */
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",PMU_uport);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 1, 2);
gtk_widget_show (label);
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",PMU_tport);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 2, 3);
gtk_widget_show (label);
/* This simply creates a grid of toggle buttons on the table to demonstrate the scrolled window */
label = gtk_label_new (" ");
markup1 = g_markup_printf_escaped ("<span foreground=\"#0000FF\" font='10'><b>PMU Configuration Details</b></span>");
gtk_label_set_markup (GTK_LABEL (label), markup1);
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 4, 5);
gtk_widget_show (label);
g_free (markup1);
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, 5, 6);
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, 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 ("Data Rate");
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 ("Format Word");
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);
label = gtk_label_new ("Configuration Count ");
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 12, 13);
gtk_widget_show (label);
label = gtk_label_new ("CFG Frame Size");
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 13, 14);
gtk_widget_show (label);
/* Printing the appropriate values from CFG objects */
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",cfg_info->cfg_pmuID);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 5, 6);
gtk_widget_show (label);
memset(tmpBuffer,'\0',30);
label = gtk_label_new (cfg_info->cfg_STNname);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 6, 7);
gtk_widget_show (label);
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",cfg_info->cfg_phnmr_val);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 7, 8);
gtk_widget_show (label);
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",cfg_info->cfg_annmr_val);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 8, 9);
gtk_widget_show (label);
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",cfg_info->cfg_dgnmr_val);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 9, 10);
gtk_widget_show (label);
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",cfg_info->cfg_dataRate);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 10, 11);
gtk_widget_show (label);
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",frmt);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 11, 12);
gtk_widget_show (label);
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",cfgcnt);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 12, 13);
gtk_widget_show (label);
memset(tmpBuffer,'\0',30);
sprintf(tmpBuffer,"%d",cfg2_frm_size);
label = gtk_label_new (tmpBuffer);
gtk_misc_set_alignment (GTK_MISC(label),0,0);
gtk_table_attach_defaults (GTK_TABLE (table), label, 1, 2, 13, 14);
gtk_widget_show (label);
label = gtk_label_new (" ");
markup = g_markup_printf_escaped ("<span foreground=\"#333333\" font='8'><b>Note : Configuration and Server info of running PMU.</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, 15, 16);
gtk_widget_show (label);
g_free (markup);
/* Signal handling for OK-button on dialog Window */
g_signal_connect_swapped (close_but, "clicked", G_CALLBACK (gtk_widget_destroy), new_window);
/* This makes it so the button is the default */
gtk_widget_set_can_default (close_but, TRUE);
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (new_window)->action_area), close_but, 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_but);
gtk_widget_show (close_but);
/* Finally show the PMU Detailed window or new_window */
gtk_widget_show (new_window);
};
/**************************************** End of File *******************************************************/