//
//
// Configuration Load & Parse Code
//
//
void Glideslope::LoadConfig () {
FILE* GS2cfg;
// int scancount;
char buf[256];
char bufcpy[256];
buf[255] = '\0';
char *tok=buf;
char *strtok=buf;
double tokf[7];
int j;
int ofs;
int modeTok[3];
bool unitstok = false;
char *bp;
bool prefsFound = false, runwayFound = false, baseFound = false, gsFound = false;
GS2cfg = fopen(".\\Config\\MFD\\GS2\\GS2.cfg","r");
if (GS2cfg == NULL) {
// Defaults to init code
LoadDefaultConfig();
return;
}
G->maxMod=4;
G->hacRadius = 15000;
G->finalDist = 20000;
G->BaseCount = 0;
G->RunwayCount = 0;
G->GSfileCount = 0;
FILE* GS2CfgPL=fopen(".\\Config\\MFD\\GS2\\Logs\\GS2cfgParselog.txt","w");
fprintf(GS2CfgPL,"Successfully found and opened GS2.cfg\n");
while (fgets(buf,255,GS2cfg)!=NULL) {
bp=buf;
sprintf(bufcpy,"%s",buf);
while (bp[0]==' ' || bp[0]=='\t') bp++;
if ((bp[0]=='\0')||(bp[0]=='\n')) {
fprintf(GS2CfgPL,"NUL> %s", buf);
continue;
}
if (bp[0]==';') {
fprintf(GS2CfgPL,"REM> %s", buf);
continue;
}
if (!ParseString(&bp,&tok)) goto badparse;
if (_stricmp(tok,"BASE")==0)
{
// Parsing BASE "base name" lon lat
// e.g. BASE "Cape Canaveral" -80.675 +28.5208
if (!ParseQuotedString(&bp,&strtok)) goto badparse;
if (strlen(strtok)>32) goto badparse;
for (j=0; j<2; j++) {
if (!ParseDouble(&bp,&(tokf[j]))) goto badparse;
}
if (G->BaseCount >= G->BASE_LIMIT) goto badparse;
sprintf(G->BaseName[G->BaseCount],strtok);
G->BaseLL[G->BaseCount][0] = tokf[1];
G->BaseLL[G->BaseCount][1] = tokf[0];
fprintf(GS2CfgPL,"BASE LOADED: %s Lon:%.3f Lat:%.3f\n", G->BaseName[G->BaseCount],G->BaseLL[G->BaseCount][1],G->BaseLL[G->BaseCount][0] );
baseFound = true;
G->BaseCount++;
continue;
}
if (_stricmp(tok,"RUNWAY")==0)
{
// Parsing RUNWAY "{basename}" "{rwyname}" {end1-1} {end1-3} {end2-1} {end2-3} {papi} {vasi} {alt}
// e.g. RUNWAY "Cape Canaveral" "KSC33" -8220 -600 -12670 -3155 -2000 671 2.6
if (!ParseQuotedString(&bp,&strtok)) goto badparse;
for (ofs=0; (ofs<G->BaseCount) && (_stricmp(strtok,(G->BaseName[ofs]))!=0) ; ofs++) {}
if (ofs==G->BaseCount) goto badparse;
if (!ParseQuotedString(&bp,&strtok)) goto badparse;
if (strlen(strtok)>12) goto badparse;
for (j=0; j<6; j++) {
if (!ParseDouble(&bp,&(tokf[j]))) goto badparse;
}
if (!ParseDouble(&bp,&(tokf[6]))) tokf[6] = 0.0; // Parse Altitude, but default to zero if we can't read it
if (G->RunwayCount >= G->RUNWAY_LIMIT) goto badparse;
sprintf(G->RunwayName[G->RunwayCount],strtok);
for (j=0;j<2;j++) G->RunwayData[G->RunwayCount][j] = G->BaseLL[ofs][j];
for (j=0;j<7;j++) G->RunwayData[G->RunwayCount][j+2] = tokf[j];
G->RunwayBase[G->RunwayCount] = ofs;
fprintf(GS2CfgPL,"RWY LOADED: %s\'s %s END1(%.0f, %.0f) END2(%.0f, %.0f) PAPI=%.0f VASI=%.0f ALT=%.0f\n", G->BaseName[ofs], G->RunwayName[G->RunwayCount],
G->RunwayData[G->RunwayCount][2], G->RunwayData[G->RunwayCount][3], G->RunwayData[G->RunwayCount][4],
G->RunwayData[G->RunwayCount][5], G->RunwayData[G->RunwayCount][6], G->RunwayData[G->RunwayCount][7],G->RunwayData[G->RunwayCount][8]);
runwayFound = true;
G->RunwayCount++;
continue;
}
if (_stricmp(tok,"GLIDESLOPE")==0)
{
// Parsing GLIDESLOPE {gsfilname} "gs description"
// e.g. GLIDESLOPE XR "XR Series"
if (!ParseString(&bp,&strtok)) goto badparse;
if (strlen(strtok)>31) goto badparse;
if (!LoadPreferredGlideslopeConfig(strtok)) goto badparse; // if it loads, then it's good!
if (!ParseQuotedString(&bp,&tok)) goto badparse;
if (strlen(strtok)>31) goto badparse;
if (G->GSfileCount >= G->GSFILE_LIMIT) goto badparse;
strcpy(G->GSfileName[G->GSfileCount],strtok);
strcpy(G->GSname[G->GSfileCount],tok);
fprintf(GS2CfgPL,"GLIDESLOPE LOADED: %s (%s)\n", G->GSname[G->GSfileCount], G->GSfileName[G->GSfileCount]);
gsFound = true;
G->GSfileCount++;
continue;
}
if (!_stricmp(tok,"PREFS"))
{
// Parsing PREFS {mode-L} {mode-R} {mode-X} {units} {rwy} {glideslope}
// e.g. PREFS VSIT HSIT DATA {US | METRIC} "KSC33" XR
if (prefsFound) goto badparse;
for (int i=0;i<3;i++) {
if (!ParseString(&bp,&tok)) goto badparse;
modeTok[i] = (!_stricmp(tok,"VSIT"))? 1 :
(!_stricmp(tok,"TAPE"))? 2 :
(!_stricmp(tok,"DATA"))? 3 :
(!_stricmp(tok,"HSIT"))? 4 :
(!_stricmp(tok,"DIAG"))? 5 :
(!_stricmp(tok,"DEOR"))? 6 :
(!_stricmp(tok,"1"))? 1 :
(!_stricmp(tok,"2"))? 2 :
(!_stricmp(tok,"3"))? 3 :
(!_stricmp(tok,"4"))? 4 :
(!_stricmp(tok,"5"))? 5 :
(!_stricmp(tok,"5"))? 6 : 7;
if (modeTok[i]==7) goto badparse;
}
if (!ParseString(&bp,&tok)) goto badparse;
if (_stricmp(tok,"US")==0) {
unitstok = true;
} else if (_stricmp(tok,"METRIC")==0) {
unitstok = false;
} else goto badparse;
if (!ParseQuotedString(&bp,&strtok)) goto badparse;
for (ofs=0; (ofs<G->RunwayCount) && (_stricmp(strtok,(G->RunwayName[ofs]))!=0) ; ofs++) {}
if (ofs==G->RunwayCount) goto badparse;
if (!ParseString(&bp,&tok)) goto badparse;
if (gsFound) {
for (j=0; j<G->GSfileCount; j++) {
if (!_stricmp(tok,G->GSfileName[j])) break;
}
if (j<G->GSfileCount) {
LoadPreferredGlideslopeConfig(tok);
G->GSfile = j;
} else goto badparse;
} else goto badparse;
G->ParamsModeL = (modeTok[0]<1)? 1 : (modeTok[0]>G->maxMod) ? G->maxMod : modeTok[0];
G->ParamsModeR = (modeTok[1]<1)? 1 : (modeTok[1]>G->maxMod) ? G->maxMod : modeTok[1];
G->ParamsModeX = (modeTok[2]<1)? 1 : (modeTok[2]>G->maxMod) ? G->maxMod : modeTok[2];
G->ParamsUnits = unitstok;
G->ParamsRwy = ofs;
G->runway = ofs;
fprintf(GS2CfgPL,"PREFS LOADED: Mode=%i/%i/%i Units=%s Runway=%s Glideslope=%s\n", G->ParamsModeL,G->ParamsModeR,G->ParamsModeX, (G->ParamsUnits?"US":"METRIC"), G->RunwayName[G->ParamsRwy], tok );
G->BaseCount++;
prefsFound = true;
continue;
}
badparse:
fprintf(GS2CfgPL,"Bad parse, ignored line>> %s", bufcpy);
fprintf(GS2CfgPL,"(Check for typos, base not previously defined, base>32 chars, runway >12 chars, >64 bases, > 128 rwys, >1 prefs line, etc.)\n\n");
}
if (!feof(GS2cfg)) {
fprintf(GS2CfgPL,"Bad read on GS2.cfg\n");
LoadDefaultConfig();
LoadDefaultGlideslopeConfig();
} else if ((!prefsFound)||(!baseFound)||(!runwayFound)||(!gsFound)) {
if (!prefsFound) fprintf(GS2CfgPL,"No PREFS found ... defaulting to Default Config");
if (!baseFound) fprintf(GS2CfgPL,"No BASE found ... defaulting to Default Config");
if (!runwayFound) fprintf(GS2CfgPL,"No RUNWAY found ... defaulting to Default Config");
if (!gsFound) fprintf(GS2CfgPL,"No GLIDESLOPE found ... defaulting to Default Config");
LoadDefaultConfig();
LoadDefaultGlideslopeConfig();
} else {
fprintf(GS2CfgPL,"Successfully parsed GS2.cfg\n");
}
fclose(GS2CfgPL);
fclose(GS2cfg);
return;
}