📄 predict.c
字号:
}
}
/* PREDICT functions follow... */
void Banner()
{
curs_set(0);
bkgdset(COLOR_PAIR(3));
clear();
refresh();
attrset(COLOR_PAIR(6)|A_BOLD);
mvprintw(3,18," ");
mvprintw(4,18," --== PREDICT v%sd ==-- ",version);
mvprintw(5,18," By John A. Magliacane ");
mvprintw(6,18," KD2BD Software -- Copyright 1991-2002 ");
mvprintw(7,18," ");
}
void AnyKey()
{
mvprintw(23,24,"<< Press Any Key To Continue >>");
refresh();
getch();
}
void bailout(string)
char *string;
{
/* This function quits ncurses, resets and "beeps"
the terminal, and displays an error message (string)
when we need to bail out of the program in a hurry. */
beep();
curs_set(1);
bkgdset(COLOR_PAIR(1));
clear();
refresh();
endwin();
fprintf(stderr,"*** predict: %s!\n",string);
}
void TrackDataOut(antfd, elevation, azimuth)
int antfd;
double elevation, azimuth;
{
/* This function sends Azimuth and Elevation data
to an antenna tracker connected to the serial port */
int n, port;
char message[30]="\n";
port=antfd;
sprintf(message, "AZ%3.1f EL%3.1f \x0D\x0A", azimuth,elevation);
n=write(port,message,30);
if (n<0)
{
bailout("Error Writing To Antenna Port");
exit(-1);
}
}
double FixAngle(x)
double x;
{
/* This function reduces angles greater than
two pi by subtracting two pi from the angle */
while (x>twopi)
x-=twopi;
return x;
}
char *SubString(string,start,end)
unsigned char *string, start, end;
{
/* This function returns a substring based on the starting
and ending positions provided. It is used heavily in the
AutoUpdate function when parsing 2-line element data. */
unsigned x, y;
if (end>=start)
{
for (x=start, y=0; x<=end && string[x]!=0; x++)
if (string[x]!=' ')
{
temp[y]=string[x];
y++;
}
temp[y]=0;
return temp;
}
else
return NULL;
}
void CopyString(source, destination, start, end)
unsigned char *source, *destination, start, end;
{
/* This function copies elements of the string "source"
bounded by "start" and "end" into the string "destination". */
unsigned j, k=0;
for (j=start; j<=end; j++)
if (source[k]!=0)
{
destination[j]=source[k];
k++;
}
}
char *Abbreviate(string,n)
unsigned char *string, n;
{
/* This function returns an abbreviated substring of the original,
including a '~' character if a non-blank character is chopped
out of the generated substring. n is the length of the desired
substring. It is used for abbreviating satellite names. */
strncpy(temp,string,79);
if (temp[n]!=0 && temp[n]!=32)
{
temp[n-2]='~';
temp[n-1]=temp[strlen(temp)-1];
}
temp[n]=0;
return temp;
}
char KepCheck(line1,line2)
char *line1, *line2;
{
/* This function scans line 1 and line 2 of a NASA 2-Line element
set and returns a 1 if the element set appears to be valid or
a 0 if it does not. If the data survives this torture test,
it's a pretty safe bet we're looking at a valid 2-line
element set and not just some random text that might pass
as orbital data based on a simple checksum calculation alone. */
int x;
unsigned sum1, sum2;
/* Compute checksum for each line */
for (x=0, sum1=0, sum2=0; x<=67; sum1+=val[(int)line1[x]], sum2+=val[(int)line2[x]], x++);
/* Perform a "torture test" on the data */
x=(val[(int)line1[68]]^(sum1%10)) | (val[(int)line2[68]]^(sum2%10)) |
(line1[0]^'1') | (line1[1]^' ') | (line1[7]^'U') |
(line1[8]^' ') | (line1[17]^' ') | (line1[23]^'.') |
(line1[32]^' ') | (line1[34]^'.') | (line1[43]^' ') |
(line1[52]^' ') | (line1[61]^' ') | (line1[62]^'0') |
(line1[63]^' ') | (line2[0]^'2') | (line2[1]^' ') |
(line2[7]^' ') | (line2[11]^'.') | (line2[16]^' ') |
(line2[20]^'.') | (line2[25]^' ') | (line2[33]^' ') |
(line2[37]^'.') | (line2[42]^' ') | (line2[46]^'.') |
(line2[51]^' ') | (line2[54]^'.') | (line1[2]^line2[2]) |
(line1[3]^line2[3]) | (line1[4]^line2[4]) |
(line1[5]^line2[5]) | (line1[6]^line2[6]) |
(isdigit(line1[68]) ? 0 : 1) | (isdigit(line2[68]) ? 0 : 1) |
(isdigit(line1[18]) ? 0 : 1) | (isdigit(line1[19]) ? 0 : 1) |
(isdigit(line2[31]) ? 0 : 1) | (isdigit(line2[32]) ? 0 : 1);
return (x ? 0 : 1);
}
void InternalUpdate(x)
int x;
{
/* Updates data in TLE structure based on
line1 and line2 stored in structure. */
double tempnum;
strncpy(sat[x].designator,SubString(sat[x].line1,9,16),8);
sat[x].designator[9]=0;
sat[x].catnum=atol(SubString(sat[x].line1,2,6));
sat[x].year=atoi(SubString(sat[x].line1,18,19));
sat[x].refepoch=atof(SubString(sat[x].line1,20,31));
tempnum=1.0e-5*atof(SubString(sat[x].line1,44,49));
sat[x].nddot6=tempnum/pow(10.0,(sat[x].line1[51]-'0'));
tempnum=1.0e-5*atof(SubString(sat[x].line1,53,58));
sat[x].bstar=tempnum/pow(10.0,(sat[x].line1[60]-'0'));
sat[x].setnum=atol(SubString(sat[x].line1,64,67));
sat[x].incl=atof(SubString(sat[x].line2,8,15));
sat[x].raan=atof(SubString(sat[x].line2,17,24));
sat[x].eccn=1.0e-07*atof(SubString(sat[x].line2,26,32));
sat[x].argper=atof(SubString(sat[x].line2,34,41));
sat[x].meanan=atof(SubString(sat[x].line2,43,50));
sat[x].meanmo=atof(SubString(sat[x].line2,52,62));
sat[x].drag=atof(SubString(sat[x].line1,33,42));
sat[x].orbitnum=atof(SubString(sat[x].line2,63,67));
}
char *noradEvalue(value)
double value;
{
/* Converts numeric values to E notation used in NORAD TLEs */
char string[15];
sprintf(string,"%11.4e",value*10.0);
output[0]=string[0];
output[1]=string[1];
output[2]=string[3];
output[3]=string[4];
output[4]=string[5];
output[5]=string[6];
output[6]='-';
output[7]=string[10];
output[8]=0;
return output;
}
void Data2TLE(x)
int x;
{
/* This function converts orbital data held in the numeric
portion of the sat tle structure to ASCII TLE format,
and places the result in ASCII portion of the structure. */
int i;
char string[15], line1[70], line2[70];
unsigned sum;
/* Fill lines with blanks */
for (i=0; i<70; line1[i]=32, line2[i]=32, i++);
line1[69]=0;
line2[69]=0;
/* Insert static characters */
line1[0]='1';
line1[7]='U'; /* Unclassified */
line2[0]='2';
line1[62]='0'; /* For publically released TLEs */
/* Insert orbital data */
sprintf(string,"%05ld",sat[x].catnum);
CopyString(string,line1,2,6);
CopyString(string,line2,2,6);
CopyString(sat[x].designator,line1,9,16);
sprintf(string,"%02d",sat[x].year);
CopyString(string,line1,18,19);
sprintf(string,"%12.8f",sat[x].refepoch);
CopyString(string,line1,20,32);
sprintf(string,"%.9f",fabs(sat[x].drag));
CopyString(string,line1,33,42);
if (sat[x].drag<0.0)
line1[33]='-';
else
line1[33]=32;
CopyString(noradEvalue(sat[x].nddot6),line1,44,51);
CopyString(noradEvalue(sat[x].bstar),line1,53,60);
sprintf(string,"%4lu",sat[x].setnum);
CopyString(string,line1,64,67);
sprintf(string,"%9.4f",sat[x].incl);
CopyString(string,line2,7,15);
sprintf(string,"%9.4f",sat[x].raan);
CopyString(string,line2,16,24);
sprintf(string,"%13.12f",sat[x].eccn);
/* Erase eccentricity's decimal point */
for (i=2; i<=9; string[i-2]=string[i], i++);
CopyString(string,line2,26,32);
sprintf(string,"%9.4f",sat[x].argper);
CopyString(string,line2,33,41);
sprintf(string,"%9.5f",sat[x].meanan);
CopyString(string,line2,43,50);
sprintf(string,"%12.9f",sat[x].meanmo);
CopyString(string,line2,52,62);
sprintf(string,"%5lu",sat[x].orbitnum);
CopyString(string,line2,63,67);
/* Compute and insert checksum for line 1 and line 2 */
for (i=0, sum=0; i<=67; sum+=val[(int)line1[i]], i++);
line1[68]=(sum%10)+'0';
for (i=0, sum=0; i<=67; sum+=val[(int)line2[i]], i++);
line2[68]=(sum%10)+'0';
line1[69]=0;
line2[69]=0;
strcpy(sat[x].line1,line1);
strcpy(sat[x].line2,line2);
}
char ReadDataFiles()
{
/* This function reads "predict.qth", "predict.tle", and
(optional) "predict.db" files into memory. Return
values are as follows:
0 : No files were loaded
1 : Only the qth file was loaded
2 : Only the tle file was loaded
3 : Both files were loaded successfully */
FILE *fd;
long catnum;
unsigned char dayofweek;
int x=0, y, entry=0, max_entries=10, transponders=0;
char flag=0, match, name[80], line1[80], line2[80];
fd=fopen(qthfile,"r");
if (fd!=NULL)
{
fgets(qth.callsign,16,fd);
qth.callsign[strlen(qth.callsign)-1]=0;
fscanf(fd,"%lf", &qth.stnlat);
fscanf(fd,"%lf", &qth.stnlong);
fscanf(fd,"%d", &qth.stnalt);
fscanf(fd,"%f",&qth.utc_offset);
fclose(fd);
obs_geodetic.lat=qth.stnlat*deg2rad;
obs_geodetic.lon=-qth.stnlong*deg2rad;
obs_geodetic.alt=((double)qth.stnalt)/1000.0;
obs_geodetic.theta=0.0;
flag=1;
}
fd=fopen(tlefile,"r");
if (fd!=NULL)
{
while (x<24 && feof(fd)==0)
{
/* Initialize variables */
name[0]=0;
line1[0]=0;
line2[0]=0;
/* Read element set */
fgets(name,75,fd);
fgets(line1,75,fd);
fgets(line2,75,fd);
if (KepCheck(line1,line2) && (feof(fd)==0))
{
/* We found a valid TLE! */
/* Some TLE sources left justify the sat
name in a 24-byte field that is padded
with blanks. The following lines cut
out the blanks as well as the line feed
character read by the fgets() function. */
y=strlen(name);
while (name[y]==32 || name[y]==0 || name[y]==10 || name[y]==13 || y==0)
{
name[y]=0;
y--;
}
/* Copy TLE data into the sat data structure */
strncpy(sat[x].name,name,24);
strncpy(sat[x].line1,line1,69);
strncpy(sat[x].line2,line2,69);
/* Update individual parameters */
InternalUpdate(x);
x++;
}
}
fclose(fd);
flag+=2;
resave=0;
/* Load satellite database file */
fd=fopen(dbfile,"r");
if (fd!=NULL)
{
database=1;
fgets(line1,40,fd);
while (strncmp(line1,"end",3)!=0 && line1[0]!='\n' && feof(fd)==0)
{
/* The first line is the satellite
name which is ignored here. */
fgets(line1,40,fd);
sscanf(line1,"%ld",&catnum);
/* Search for match */
for (y=0, match=0; y<24 && match==0; y++)
{
if (catnum==sat[y].catnum)
match=1;
}
if (match)
{
transponders=0;
entry=0;
y--;
}
fgets(line1,40,fd);
if (match)
{
if (strncmp(line1,"No",2)!=0)
{
sscanf(line1,"%lf, %lf",&sat_db[y].alat, &sat_db[y].alon);
sat_db[y].squintflag=1;
}
else
sat_db[y].squintflag=0;
}
fgets(line1,80,fd);
while (strncmp(line1,"end",3)!=0 && line1[0]!='\n' && feof(fd)==0)
{
if (entry<max_entries)
{
if (match)
{
if (strncmp(line1,"No",2)!=0)
{
line1[strlen(line1)-1]=0;
strcpy(sat_db[y].transponder_name[entry],line1);
}
else
sat_db[y].transpond
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -