/* ----------------------------------------------------------------------------- * 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 * Kedar V. Khandeparkar * * ----------------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #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; jcfg_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; jcfg_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; jcfg_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; jcfg_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; jcfg_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; jcfg_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 ("PMU Server Details"); 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 ("PMU Configuration Details"); 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 ("Note : Configuration and Server info of running PMU."); 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 *******************************************************/