Code comments, renaming of methods. Updated test programs.
parent
d8cd6e682b
commit
62da021303
|
|
@ -1,8 +1,8 @@
|
||||||
# Exact paths to config junk
|
# Exact paths to config junk
|
||||||
^INSTALL$
|
^INSTALL$
|
||||||
^aclocal.m4$
|
^aclocal.m4$
|
||||||
^(config.guess|config.sub|depcomp|install-sh|ltmain.sh|missing)$
|
^(stamp-h1|depcomp|install-sh|ltmain.sh|missing)$
|
||||||
^config.(log|status)$
|
^config.(h|log|status|guess|sub)$
|
||||||
^autom4te.cache$
|
^autom4te.cache$
|
||||||
|
|
||||||
# Build artifacts
|
# Build artifacts
|
||||||
|
|
|
||||||
25
config.h.in
25
config.h.in
|
|
@ -1,25 +0,0 @@
|
||||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#undef PACKAGE
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#undef PACKAGE_BUGREPORT
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#undef PACKAGE_NAME
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#undef PACKAGE_STRING
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#undef PACKAGE_TARNAME
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#undef PACKAGE_URL
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#undef PACKAGE_VERSION
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#undef VERSION
|
|
||||||
|
|
@ -579,6 +579,7 @@ CC
|
||||||
am__fastdepCXX_FALSE
|
am__fastdepCXX_FALSE
|
||||||
am__fastdepCXX_TRUE
|
am__fastdepCXX_TRUE
|
||||||
CXXDEPMODE
|
CXXDEPMODE
|
||||||
|
am__nodep
|
||||||
AMDEPBACKSLASH
|
AMDEPBACKSLASH
|
||||||
AMDEP_FALSE
|
AMDEP_FALSE
|
||||||
AMDEP_TRUE
|
AMDEP_TRUE
|
||||||
|
|
@ -595,6 +596,8 @@ CXX
|
||||||
RANLIB
|
RANLIB
|
||||||
AM_BACKSLASH
|
AM_BACKSLASH
|
||||||
AM_DEFAULT_VERBOSITY
|
AM_DEFAULT_VERBOSITY
|
||||||
|
AM_DEFAULT_V
|
||||||
|
AM_V
|
||||||
am__untar
|
am__untar
|
||||||
am__tar
|
am__tar
|
||||||
AMTAR
|
AMTAR
|
||||||
|
|
@ -2358,11 +2361,11 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
|
||||||
|
|
||||||
# We need awk for the "check" target. The system "awk" is bad on
|
# We need awk for the "check" target. The system "awk" is bad on
|
||||||
# some platforms.
|
# some platforms.
|
||||||
# Always define AMTAR for backward compatibility.
|
# Always define AMTAR for backward compatibility. Yes, it's still used
|
||||||
|
# in the wild :-( We should find a proper way to deprecate it ...
|
||||||
|
AMTAR='$${TAR-tar}'
|
||||||
|
|
||||||
AMTAR=${AMTAR-"${am_missing_run}tar"}
|
am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
|
||||||
|
|
||||||
am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -2378,13 +2381,37 @@ yes) AM_DEFAULT_VERBOSITY=0;;
|
||||||
no) AM_DEFAULT_VERBOSITY=1;;
|
no) AM_DEFAULT_VERBOSITY=1;;
|
||||||
*) AM_DEFAULT_VERBOSITY=0;;
|
*) AM_DEFAULT_VERBOSITY=0;;
|
||||||
esac
|
esac
|
||||||
|
am_make=${MAKE-make}
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
|
||||||
|
$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
|
||||||
|
if ${am_cv_make_support_nested_variables+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
if $as_echo 'TRUE=$(BAR$(V))
|
||||||
|
BAR0=false
|
||||||
|
BAR1=true
|
||||||
|
V=1
|
||||||
|
am__doit:
|
||||||
|
@$(TRUE)
|
||||||
|
.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
|
||||||
|
am_cv_make_support_nested_variables=yes
|
||||||
|
else
|
||||||
|
am_cv_make_support_nested_variables=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
|
||||||
|
$as_echo "$am_cv_make_support_nested_variables" >&6; }
|
||||||
|
if test $am_cv_make_support_nested_variables = yes; then
|
||||||
|
AM_V='$(V)'
|
||||||
|
AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
|
||||||
|
else
|
||||||
|
AM_V=$AM_DEFAULT_VERBOSITY
|
||||||
|
AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
|
||||||
|
fi
|
||||||
AM_BACKSLASH='\'
|
AM_BACKSLASH='\'
|
||||||
|
|
||||||
#AC_CANONICAL_BUILD
|
|
||||||
|
|
||||||
|
|
||||||
ac_config_headers="$ac_config_headers config.h"
|
|
||||||
|
|
||||||
|
|
||||||
CFLAGS=" $CFLAGS"
|
CFLAGS=" $CFLAGS"
|
||||||
CXXFLAGS=" $CXXFLAGS"
|
CXXFLAGS=" $CXXFLAGS"
|
||||||
|
|
@ -3039,6 +3066,7 @@ fi
|
||||||
if test "x$enable_dependency_tracking" != xno; then
|
if test "x$enable_dependency_tracking" != xno; then
|
||||||
am_depcomp="$ac_aux_dir/depcomp"
|
am_depcomp="$ac_aux_dir/depcomp"
|
||||||
AMDEPBACKSLASH='\'
|
AMDEPBACKSLASH='\'
|
||||||
|
am__nodep='_no'
|
||||||
fi
|
fi
|
||||||
if test "x$enable_dependency_tracking" != xno; then
|
if test "x$enable_dependency_tracking" != xno; then
|
||||||
AMDEP_TRUE=
|
AMDEP_TRUE=
|
||||||
|
|
@ -3063,6 +3091,7 @@ else
|
||||||
# instance it was reported that on HP-UX the gcc test will end up
|
# instance it was reported that on HP-UX the gcc test will end up
|
||||||
# making a dummy file named `D' -- because `-MD' means `put the output
|
# making a dummy file named `D' -- because `-MD' means `put the output
|
||||||
# in D'.
|
# in D'.
|
||||||
|
rm -rf conftest.dir
|
||||||
mkdir conftest.dir
|
mkdir conftest.dir
|
||||||
# Copy depcomp to subdir because otherwise we won't find it if we're
|
# Copy depcomp to subdir because otherwise we won't find it if we're
|
||||||
# using a relative directory.
|
# using a relative directory.
|
||||||
|
|
@ -3122,7 +3151,7 @@ else
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
msvisualcpp | msvcmsys)
|
msvc7 | msvc7msys | msvisualcpp | msvcmsys)
|
||||||
# This compiler won't grok `-c -o', but also, the minuso test has
|
# This compiler won't grok `-c -o', but also, the minuso test has
|
||||||
# not run yet. These depmodes are late enough in the game, and
|
# not run yet. These depmodes are late enough in the game, and
|
||||||
# so weak that their functioning should not be impacted.
|
# so weak that their functioning should not be impacted.
|
||||||
|
|
@ -3187,9 +3216,9 @@ fi
|
||||||
|
|
||||||
|
|
||||||
if test x$enable_debug = xyes; then
|
if test x$enable_debug = xyes; then
|
||||||
AM_CXXFLAGS="-g -O0 -Werror -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long"
|
AM_CXXFLAGS="-g -O0 -Werror -Wextra -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long -Wconversion"
|
||||||
else
|
else
|
||||||
AM_CXXFLAGS="-DNDEBUG -O2 -fomit-frame-pointer -Werror -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long"
|
AM_CXXFLAGS="-DNDEBUG -O2 -fomit-frame-pointer -Wextra -Werror -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long -Wconversion"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ac_ext=c
|
ac_ext=c
|
||||||
|
|
@ -3745,6 +3774,7 @@ else
|
||||||
# instance it was reported that on HP-UX the gcc test will end up
|
# instance it was reported that on HP-UX the gcc test will end up
|
||||||
# making a dummy file named `D' -- because `-MD' means `put the output
|
# making a dummy file named `D' -- because `-MD' means `put the output
|
||||||
# in D'.
|
# in D'.
|
||||||
|
rm -rf conftest.dir
|
||||||
mkdir conftest.dir
|
mkdir conftest.dir
|
||||||
# Copy depcomp to subdir because otherwise we won't find it if we're
|
# Copy depcomp to subdir because otherwise we won't find it if we're
|
||||||
# using a relative directory.
|
# using a relative directory.
|
||||||
|
|
@ -3804,7 +3834,7 @@ else
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
msvisualcpp | msvcmsys)
|
msvc7 | msvc7msys | msvisualcpp | msvcmsys)
|
||||||
# This compiler won't grok `-c -o', but also, the minuso test has
|
# This compiler won't grok `-c -o', but also, the minuso test has
|
||||||
# not run yet. These depmodes are late enough in the game, and
|
# not run yet. These depmodes are late enough in the game, and
|
||||||
# so weak that their functioning should not be impacted.
|
# so weak that their functioning should not be impacted.
|
||||||
|
|
@ -3914,6 +3944,8 @@ ac_res=$ac_cv_search_clock_gettime
|
||||||
if test "$ac_res" != no; then :
|
if test "$ac_res" != no; then :
|
||||||
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
|
test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -4012,7 +4044,43 @@ test "x$prefix" = xNONE && prefix=$ac_default_prefix
|
||||||
# Let make expand exec_prefix.
|
# Let make expand exec_prefix.
|
||||||
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
|
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
|
||||||
|
|
||||||
DEFS=-DHAVE_CONFIG_H
|
# Transform confdefs.h into DEFS.
|
||||||
|
# Protect against shell expansion while executing Makefile rules.
|
||||||
|
# Protect against Makefile macro expansion.
|
||||||
|
#
|
||||||
|
# If the first sed substitution is executed (which looks for macros that
|
||||||
|
# take arguments), then branch to the quote section. Otherwise,
|
||||||
|
# look for a macro that doesn't take arguments.
|
||||||
|
ac_script='
|
||||||
|
:mline
|
||||||
|
/\\$/{
|
||||||
|
N
|
||||||
|
s,\\\n,,
|
||||||
|
b mline
|
||||||
|
}
|
||||||
|
t clear
|
||||||
|
:clear
|
||||||
|
s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
|
||||||
|
t quote
|
||||||
|
s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g
|
||||||
|
t quote
|
||||||
|
b any
|
||||||
|
:quote
|
||||||
|
s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g
|
||||||
|
s/\[/\\&/g
|
||||||
|
s/\]/\\&/g
|
||||||
|
s/\$/$$/g
|
||||||
|
H
|
||||||
|
:any
|
||||||
|
${
|
||||||
|
g
|
||||||
|
s/^\n//
|
||||||
|
s/\n/ /g
|
||||||
|
p
|
||||||
|
}
|
||||||
|
'
|
||||||
|
DEFS=`sed -n "$ac_script" confdefs.h`
|
||||||
|
|
||||||
|
|
||||||
ac_libobjs=
|
ac_libobjs=
|
||||||
ac_ltlibobjs=
|
ac_ltlibobjs=
|
||||||
|
|
@ -4478,15 +4546,11 @@ case $ac_config_files in *"
|
||||||
"*) set x $ac_config_files; shift; ac_config_files=$*;;
|
"*) set x $ac_config_files; shift; ac_config_files=$*;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case $ac_config_headers in *"
|
|
||||||
"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||||
# Files that config.status was made for.
|
# Files that config.status was made for.
|
||||||
config_files="$ac_config_files"
|
config_files="$ac_config_files"
|
||||||
config_headers="$ac_config_headers"
|
|
||||||
config_commands="$ac_config_commands"
|
config_commands="$ac_config_commands"
|
||||||
|
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
@ -4508,15 +4572,10 @@ Usage: $0 [OPTION]... [TAG]...
|
||||||
--recheck update $as_me by reconfiguring in the same conditions
|
--recheck update $as_me by reconfiguring in the same conditions
|
||||||
--file=FILE[:TEMPLATE]
|
--file=FILE[:TEMPLATE]
|
||||||
instantiate the configuration file FILE
|
instantiate the configuration file FILE
|
||||||
--header=FILE[:TEMPLATE]
|
|
||||||
instantiate the configuration header FILE
|
|
||||||
|
|
||||||
Configuration files:
|
Configuration files:
|
||||||
$config_files
|
$config_files
|
||||||
|
|
||||||
Configuration headers:
|
|
||||||
$config_headers
|
|
||||||
|
|
||||||
Configuration commands:
|
Configuration commands:
|
||||||
$config_commands
|
$config_commands
|
||||||
|
|
||||||
|
|
@ -4583,18 +4642,7 @@ do
|
||||||
esac
|
esac
|
||||||
as_fn_append CONFIG_FILES " '$ac_optarg'"
|
as_fn_append CONFIG_FILES " '$ac_optarg'"
|
||||||
ac_need_defaults=false;;
|
ac_need_defaults=false;;
|
||||||
--header | --heade | --head | --hea )
|
--he | --h | --help | --hel | -h )
|
||||||
$ac_shift
|
|
||||||
case $ac_optarg in
|
|
||||||
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
|
|
||||||
esac
|
|
||||||
as_fn_append CONFIG_HEADERS " '$ac_optarg'"
|
|
||||||
ac_need_defaults=false;;
|
|
||||||
--he | --h)
|
|
||||||
# Conflict between --help and --header
|
|
||||||
as_fn_error $? "ambiguous option: \`$1'
|
|
||||||
Try \`$0 --help' for more information.";;
|
|
||||||
--help | --hel | -h )
|
|
||||||
$as_echo "$ac_cs_usage"; exit ;;
|
$as_echo "$ac_cs_usage"; exit ;;
|
||||||
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
|
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
|
||||||
| -silent | --silent | --silen | --sile | --sil | --si | --s)
|
| -silent | --silent | --silen | --sile | --sil | --si | --s)
|
||||||
|
|
@ -4655,7 +4703,6 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||||
for ac_config_target in $ac_config_targets
|
for ac_config_target in $ac_config_targets
|
||||||
do
|
do
|
||||||
case $ac_config_target in
|
case $ac_config_target in
|
||||||
"config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
|
|
||||||
"depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
|
"depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
|
||||||
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
|
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
|
||||||
"libsgp4/Makefile") CONFIG_FILES="$CONFIG_FILES libsgp4/Makefile" ;;
|
"libsgp4/Makefile") CONFIG_FILES="$CONFIG_FILES libsgp4/Makefile" ;;
|
||||||
|
|
@ -4674,7 +4721,6 @@ done
|
||||||
# bizarre bug on SunOS 4.1.3.
|
# bizarre bug on SunOS 4.1.3.
|
||||||
if $ac_need_defaults; then
|
if $ac_need_defaults; then
|
||||||
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
|
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
|
||||||
test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
|
|
||||||
test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
|
test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -4863,116 +4909,8 @@ fi
|
||||||
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||||
fi # test -n "$CONFIG_FILES"
|
fi # test -n "$CONFIG_FILES"
|
||||||
|
|
||||||
# Set up the scripts for CONFIG_HEADERS section.
|
|
||||||
# No need to generate them if there are no CONFIG_HEADERS.
|
|
||||||
# This happens for instance with `./config.status Makefile'.
|
|
||||||
if test -n "$CONFIG_HEADERS"; then
|
|
||||||
cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
|
|
||||||
BEGIN {
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
# Transform confdefs.h into an awk script `defines.awk', embedded as
|
eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS"
|
||||||
# here-document in config.status, that substitutes the proper values into
|
|
||||||
# config.h.in to produce config.h.
|
|
||||||
|
|
||||||
# Create a delimiter string that does not exist in confdefs.h, to ease
|
|
||||||
# handling of long lines.
|
|
||||||
ac_delim='%!_!# '
|
|
||||||
for ac_last_try in false false :; do
|
|
||||||
ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
|
|
||||||
if test -z "$ac_tt"; then
|
|
||||||
break
|
|
||||||
elif $ac_last_try; then
|
|
||||||
as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
|
|
||||||
else
|
|
||||||
ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# For the awk script, D is an array of macro values keyed by name,
|
|
||||||
# likewise P contains macro parameters if any. Preserve backslash
|
|
||||||
# newline sequences.
|
|
||||||
|
|
||||||
ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
|
|
||||||
sed -n '
|
|
||||||
s/.\{148\}/&'"$ac_delim"'/g
|
|
||||||
t rset
|
|
||||||
:rset
|
|
||||||
s/^[ ]*#[ ]*define[ ][ ]*/ /
|
|
||||||
t def
|
|
||||||
d
|
|
||||||
:def
|
|
||||||
s/\\$//
|
|
||||||
t bsnl
|
|
||||||
s/["\\]/\\&/g
|
|
||||||
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
|
|
||||||
D["\1"]=" \3"/p
|
|
||||||
s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p
|
|
||||||
d
|
|
||||||
:bsnl
|
|
||||||
s/["\\]/\\&/g
|
|
||||||
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\
|
|
||||||
D["\1"]=" \3\\\\\\n"\\/p
|
|
||||||
t cont
|
|
||||||
s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
|
|
||||||
t cont
|
|
||||||
d
|
|
||||||
:cont
|
|
||||||
n
|
|
||||||
s/.\{148\}/&'"$ac_delim"'/g
|
|
||||||
t clear
|
|
||||||
:clear
|
|
||||||
s/\\$//
|
|
||||||
t bsnlc
|
|
||||||
s/["\\]/\\&/g; s/^/"/; s/$/"/p
|
|
||||||
d
|
|
||||||
:bsnlc
|
|
||||||
s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
|
|
||||||
b cont
|
|
||||||
' <confdefs.h | sed '
|
|
||||||
s/'"$ac_delim"'/"\\\
|
|
||||||
"/g' >>$CONFIG_STATUS || ac_write_fail=1
|
|
||||||
|
|
||||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
|
||||||
for (key in D) D_is_set[key] = 1
|
|
||||||
FS = ""
|
|
||||||
}
|
|
||||||
/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
|
|
||||||
line = \$ 0
|
|
||||||
split(line, arg, " ")
|
|
||||||
if (arg[1] == "#") {
|
|
||||||
defundef = arg[2]
|
|
||||||
mac1 = arg[3]
|
|
||||||
} else {
|
|
||||||
defundef = substr(arg[1], 2)
|
|
||||||
mac1 = arg[2]
|
|
||||||
}
|
|
||||||
split(mac1, mac2, "(") #)
|
|
||||||
macro = mac2[1]
|
|
||||||
prefix = substr(line, 1, index(line, defundef) - 1)
|
|
||||||
if (D_is_set[macro]) {
|
|
||||||
# Preserve the white space surrounding the "#".
|
|
||||||
print prefix "define", macro P[macro] D[macro]
|
|
||||||
next
|
|
||||||
} else {
|
|
||||||
# Replace #undef with comments. This is necessary, for example,
|
|
||||||
# in the case of _POSIX_SOURCE, which is predefined and required
|
|
||||||
# on some systems where configure will not decide to define it.
|
|
||||||
if (defundef == "undef") {
|
|
||||||
print "/*", prefix defundef, macro, "*/"
|
|
||||||
next
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{ print }
|
|
||||||
_ACAWK
|
|
||||||
_ACEOF
|
|
||||||
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|
||||||
as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
|
|
||||||
fi # test -n "$CONFIG_HEADERS"
|
|
||||||
|
|
||||||
|
|
||||||
eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS"
|
|
||||||
shift
|
shift
|
||||||
for ac_tag
|
for ac_tag
|
||||||
do
|
do
|
||||||
|
|
@ -5191,64 +5129,7 @@ which seems to be undefined. Please make sure it is defined" >&2;}
|
||||||
esac \
|
esac \
|
||||||
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
||||||
;;
|
;;
|
||||||
:H)
|
|
||||||
#
|
|
||||||
# CONFIG_HEADER
|
|
||||||
#
|
|
||||||
if test x"$ac_file" != x-; then
|
|
||||||
{
|
|
||||||
$as_echo "/* $configure_input */" \
|
|
||||||
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
|
|
||||||
} >"$ac_tmp/config.h" \
|
|
||||||
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
|
||||||
if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
|
|
||||||
$as_echo "$as_me: $ac_file is unchanged" >&6;}
|
|
||||||
else
|
|
||||||
rm -f "$ac_file"
|
|
||||||
mv "$ac_tmp/config.h" "$ac_file" \
|
|
||||||
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
$as_echo "/* $configure_input */" \
|
|
||||||
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
|
|
||||||
|| as_fn_error $? "could not create -" "$LINENO" 5
|
|
||||||
fi
|
|
||||||
# Compute "$ac_file"'s index in $config_headers.
|
|
||||||
_am_arg="$ac_file"
|
|
||||||
_am_stamp_count=1
|
|
||||||
for _am_header in $config_headers :; do
|
|
||||||
case $_am_header in
|
|
||||||
$_am_arg | $_am_arg:* )
|
|
||||||
break ;;
|
|
||||||
* )
|
|
||||||
_am_stamp_count=`expr $_am_stamp_count + 1` ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
|
|
||||||
$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$_am_arg" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$_am_arg" : 'X\(//\)$' \| \
|
|
||||||
X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
$as_echo X"$_am_arg" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'`/stamp-h$_am_stamp_count
|
|
||||||
;;
|
|
||||||
|
|
||||||
:C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
|
:C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
|
||||||
$as_echo "$as_me: executing $ac_file commands" >&6;}
|
$as_echo "$as_me: executing $ac_file commands" >&6;}
|
||||||
|
|
|
||||||
12
configure.ac
12
configure.ac
|
|
@ -2,10 +2,8 @@ AC_PREREQ([2.61])
|
||||||
AC_INIT([sgp4], 1.0, [info@danrw.com])
|
AC_INIT([sgp4], 1.0, [info@danrw.com])
|
||||||
AM_INIT_AUTOMAKE
|
AM_INIT_AUTOMAKE
|
||||||
AM_SILENT_RULES([yes])
|
AM_SILENT_RULES([yes])
|
||||||
#AC_CANONICAL_BUILD
|
|
||||||
|
|
||||||
AC_CONFIG_SRCDIR([libsgp4/Tle.cpp])
|
AC_CONFIG_SRCDIR([libsgp4/Tle.cpp])
|
||||||
AM_CONFIG_HEADER([config.h])
|
|
||||||
|
|
||||||
CFLAGS=" $CFLAGS"
|
CFLAGS=" $CFLAGS"
|
||||||
CXXFLAGS=" $CXXFLAGS"
|
CXXFLAGS=" $CXXFLAGS"
|
||||||
|
|
@ -21,12 +19,16 @@ AC_ARG_ENABLE(debug,
|
||||||
enable_debug=no)
|
enable_debug=no)
|
||||||
|
|
||||||
if test x$enable_debug = xyes; then
|
if test x$enable_debug = xyes; then
|
||||||
AM_CXXFLAGS="-g -O0 -Werror -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long"
|
AM_CXXFLAGS="-g -O0 -Werror -Wextra -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long -Wconversion"
|
||||||
else
|
else
|
||||||
AM_CXXFLAGS="-DNDEBUG -O2 -fomit-frame-pointer -Werror -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long"
|
AM_CXXFLAGS="-DNDEBUG -O2 -fomit-frame-pointer -Wextra -Werror -W -Wall -ansi -pedantic -Wpointer-arith -Wwrite-strings -Wno-long-long -Wconversion"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_SEARCH_LIBS(clock_gettime, [rt])
|
AC_SEARCH_LIBS([clock_gettime],
|
||||||
|
[rt],
|
||||||
|
[AC_DEFINE(HAVE_CLOCK_GETTIME,
|
||||||
|
[1],
|
||||||
|
[Define if clock_gettime is available.])])
|
||||||
|
|
||||||
AC_SUBST(AM_CXXFLAGS)
|
AC_SUBST(AM_CXXFLAGS)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
#include "CoordGeodetic.h"
|
||||||
|
|
@ -25,18 +25,28 @@ public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
* @param[in] arg_latitude the latitude in degrees
|
* @param[in] lat the latitude (degrees by default)
|
||||||
* @param[in] arg_longitude the longitude in degrees
|
* @param[in] lon the longitude (degrees by default)
|
||||||
* @param[in] arg_altitude the altitude in kilometers
|
* @param[in] alt the altitude in kilometers
|
||||||
|
* @param[in] is_radians whether the latitude/longitude is in radians
|
||||||
*/
|
*/
|
||||||
CoordGeodetic(
|
CoordGeodetic(
|
||||||
double arg_latitude,
|
double lat,
|
||||||
double arg_longitude,
|
double lon,
|
||||||
double arg_altitude)
|
double alt,
|
||||||
|
bool is_radians = false)
|
||||||
{
|
{
|
||||||
latitude = Util::DegreesToRadians(arg_latitude);
|
if (is_radians)
|
||||||
longitude = Util::DegreesToRadians(arg_longitude);
|
{
|
||||||
altitude = arg_altitude;
|
latitude = lat;
|
||||||
|
longitude = lon;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
latitude = Util::DegreesToRadians(lat);
|
||||||
|
longitude = Util::DegreesToRadians(lon);
|
||||||
|
}
|
||||||
|
altitude = alt;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -127,6 +137,11 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump a Coordgeodetic to a stream
|
||||||
|
* @params[in,out] strm stream to output to
|
||||||
|
* @params[in] g the CoordGeodetic to print
|
||||||
|
*/
|
||||||
inline std::ostream& operator<<(std::ostream& strm, const CoordGeodetic& g)
|
inline std::ostream& operator<<(std::ostream& strm, const CoordGeodetic& g)
|
||||||
{
|
{
|
||||||
return strm << g.ToString();
|
return strm << g.ToString();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
#include "CoordTopographic.h"
|
||||||
|
|
@ -24,42 +24,69 @@ namespace
|
||||||
class DateTime
|
class DateTime
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* Default contructor
|
||||||
|
* Initialise to 0001/01/01 00:00:00.000000
|
||||||
|
*/
|
||||||
DateTime()
|
DateTime()
|
||||||
{
|
{
|
||||||
Initialise(1, 1, 1, 0, 0, 0, 0);
|
Initialise(1, 1, 1, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param[in] ticks raw tick value
|
||||||
|
*/
|
||||||
DateTime(unsigned long long ticks)
|
DateTime(unsigned long long ticks)
|
||||||
: m_encoded(ticks)
|
: m_encoded(ticks)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param[in] year the year
|
||||||
|
* @param[in] doy the day of the year
|
||||||
|
*/
|
||||||
DateTime(int year, double doy)
|
DateTime(int year, double doy)
|
||||||
{
|
{
|
||||||
m_encoded = TimeSpan(AbsoluteDays(year, doy) * TicksPerDay).Ticks();
|
m_encoded = TimeSpan(static_cast<long long int>(AbsoluteDays(year, doy) * TicksPerDay)).Ticks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param[in] year the year
|
||||||
|
* @param[in] month the month
|
||||||
|
* @param[in] day the day
|
||||||
|
*/
|
||||||
DateTime(int year, int month, int day)
|
DateTime(int year, int month, int day)
|
||||||
{
|
{
|
||||||
Initialise(year, month, day, 0, 0, 0, 0);
|
Initialise(year, month, day, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param[in] year the year
|
||||||
|
* @param[in] month the month
|
||||||
|
* @param[in] day the day
|
||||||
|
* @param[in] hour the hour
|
||||||
|
* @param[in] minute the minute
|
||||||
|
* @param[in] second the second
|
||||||
|
*/
|
||||||
DateTime(int year, int month, int day, int hour, int minute, int second)
|
DateTime(int year, int month, int day, int hour, int minute, int second)
|
||||||
{
|
{
|
||||||
Initialise(year, month, day, hour, minute, second, 0);
|
Initialise(year, month, day, hour, minute, second, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTime(int year,
|
/**
|
||||||
int month,
|
* Constructor
|
||||||
int day,
|
* @param[in] year the year
|
||||||
int hour,
|
* @param[in] month the month
|
||||||
int minute,
|
* @param[in] day the day
|
||||||
int second,
|
* @param[in] hour the hour
|
||||||
int microsecond)
|
* @param[in] minute the minute
|
||||||
{
|
* @param[in] second the second
|
||||||
Initialise(year, month, day, hour, minute, second, microsecond);
|
* @param[in] microsecond the microsecond
|
||||||
}
|
*/
|
||||||
|
|
||||||
void Initialise(int year,
|
void Initialise(int year,
|
||||||
int month,
|
int month,
|
||||||
int day,
|
int day,
|
||||||
|
|
@ -84,6 +111,11 @@ public:
|
||||||
microsecond).Ticks();
|
microsecond).Ticks();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the current time
|
||||||
|
* @param[in] microseconds whether to set the microsecond component
|
||||||
|
* @returns a DateTime object set to the current date and time
|
||||||
|
*/
|
||||||
static DateTime Now(bool microseconds = false)
|
static DateTime Now(bool microseconds = false)
|
||||||
{
|
{
|
||||||
DateTime dt;
|
DateTime dt;
|
||||||
|
|
@ -111,6 +143,11 @@ public:
|
||||||
return dt;
|
return dt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find whether a year is a leap year
|
||||||
|
* @param[in] year the year to check
|
||||||
|
* @returns whether the year is a leap year
|
||||||
|
*/
|
||||||
static bool IsLeapYear(int year)
|
static bool IsLeapYear(int year)
|
||||||
{
|
{
|
||||||
if (!IsValidYear(year))
|
if (!IsValidYear(year))
|
||||||
|
|
@ -121,6 +158,11 @@ public:
|
||||||
return (((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0);
|
return (((year % 4) == 0 && (year % 100) != 0) || (year % 400) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given year is valid
|
||||||
|
* @param[in] year the year to check
|
||||||
|
* @returns whether the year is valid
|
||||||
|
*/
|
||||||
static bool IsValidYear(int year)
|
static bool IsValidYear(int year)
|
||||||
{
|
{
|
||||||
bool valid = true;
|
bool valid = true;
|
||||||
|
|
@ -131,6 +173,12 @@ public:
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the year/month is valid
|
||||||
|
* @param[in] year the year to check
|
||||||
|
* @param[in] month the month to check
|
||||||
|
* @returns whether the year/month is valid
|
||||||
|
*/
|
||||||
static bool IsValidYearMonth(int year, int month)
|
static bool IsValidYearMonth(int year, int month)
|
||||||
{
|
{
|
||||||
bool valid = true;
|
bool valid = true;
|
||||||
|
|
@ -148,6 +196,13 @@ public:
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the year/month/day is valid
|
||||||
|
* @param[in] year the year to check
|
||||||
|
* @param[in] month the month to check
|
||||||
|
* @param[in] day the day to check
|
||||||
|
* @returns whether the year/month/day is valid
|
||||||
|
*/
|
||||||
static bool IsValidYearMonthDay(int year, int month, int day)
|
static bool IsValidYearMonthDay(int year, int month, int day)
|
||||||
{
|
{
|
||||||
bool valid = true;
|
bool valid = true;
|
||||||
|
|
@ -165,6 +220,12 @@ public:
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the number of days in a month given the year/month
|
||||||
|
* @param[in] year the year
|
||||||
|
* @param[in] month the month
|
||||||
|
* @returns the days in the given month
|
||||||
|
*/
|
||||||
static int DaysInMonth(int year, int month)
|
static int DaysInMonth(int year, int month)
|
||||||
{
|
{
|
||||||
if (!IsValidYearMonth(year, month))
|
if (!IsValidYearMonth(year, month))
|
||||||
|
|
@ -186,6 +247,13 @@ public:
|
||||||
return daysInMonthPtr[month];
|
return daysInMonthPtr[month];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the day of the year given the year/month/day
|
||||||
|
* @param[in] year the year
|
||||||
|
* @param[in] month the month
|
||||||
|
* @param[in] day the day
|
||||||
|
* @returns the day of the year
|
||||||
|
*/
|
||||||
int DayOfYear(int year, int month, int day) const
|
int DayOfYear(int year, int month, int day) const
|
||||||
{
|
{
|
||||||
if (!IsValidYearMonthDay(year, month, day))
|
if (!IsValidYearMonthDay(year, month, day))
|
||||||
|
|
@ -207,6 +275,9 @@ public:
|
||||||
return daysThisYear;
|
return daysThisYear;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
double AbsoluteDays(int year, double doy) const
|
double AbsoluteDays(int year, double doy) const
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -223,7 +294,7 @@ public:
|
||||||
- previousYear / 100
|
- previousYear / 100
|
||||||
+ previousYear / 400;
|
+ previousYear / 400;
|
||||||
|
|
||||||
return daysSoFar + doy - 1.0;
|
return static_cast<double>(daysSoFar) + doy - 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AbsoluteDays(int year, int month, int day) const
|
int AbsoluteDays(int year, int month, int day) const
|
||||||
|
|
@ -263,7 +334,7 @@ public:
|
||||||
* 5 Friday
|
* 5 Friday
|
||||||
* 6 Saturday
|
* 6 Saturday
|
||||||
*/
|
*/
|
||||||
return (((m_encoded / TicksPerDay) + 1) % 7);
|
return static_cast<int>(((m_encoded / TicksPerDay) + 1LL) % 7LL);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Equals(const DateTime& dt) const
|
bool Equals(const DateTime& dt) const
|
||||||
|
|
@ -318,6 +389,11 @@ public:
|
||||||
return DateTime(year, month, day).Add(TimeOfDay());
|
return DateTime(year, month, day).Add(TimeOfDay());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a TimeSpan to this DateTime
|
||||||
|
* @param[in] t the TimeSpan to add
|
||||||
|
* @returns a DateTime which has the given TimeSpan added
|
||||||
|
*/
|
||||||
DateTime Add(const TimeSpan& t) const
|
DateTime Add(const TimeSpan& t) const
|
||||||
{
|
{
|
||||||
return AddTicks(t.Ticks());
|
return AddTicks(t.Ticks());
|
||||||
|
|
@ -345,7 +421,7 @@ public:
|
||||||
|
|
||||||
DateTime AddMicroseconds(const double microseconds) const
|
DateTime AddMicroseconds(const double microseconds) const
|
||||||
{
|
{
|
||||||
long long ticks = microseconds * TicksPerMicrosecond;
|
long long ticks = static_cast<long long>(microseconds * TicksPerMicrosecond);
|
||||||
return AddTicks(ticks);
|
return AddTicks(ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -354,6 +430,10 @@ public:
|
||||||
return DateTime(m_encoded + ticks);
|
return DateTime(m_encoded + ticks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the number of ticks
|
||||||
|
* @returns the number of ticks
|
||||||
|
*/
|
||||||
long long Ticks() const
|
long long Ticks() const
|
||||||
{
|
{
|
||||||
return m_encoded;
|
return m_encoded;
|
||||||
|
|
@ -361,7 +441,7 @@ public:
|
||||||
|
|
||||||
void FromTicks(int& year, int& month, int& day) const
|
void FromTicks(int& year, int& month, int& day) const
|
||||||
{
|
{
|
||||||
int totalDays = m_encoded / TicksPerDay;
|
int totalDays = static_cast<int>(m_encoded / TicksPerDay);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* number of 400 year cycles
|
* number of 400 year cycles
|
||||||
|
|
@ -452,36 +532,60 @@ public:
|
||||||
return day;
|
return day;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hour component
|
||||||
|
* @returns the hour component
|
||||||
|
*/
|
||||||
int Hour() const
|
int Hour() const
|
||||||
{
|
{
|
||||||
return m_encoded % TicksPerDay / TicksPerHour;
|
return static_cast<int>(m_encoded % TicksPerDay / TicksPerHour);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minute component
|
||||||
|
* @returns the minute component
|
||||||
|
*/
|
||||||
int Minute() const
|
int Minute() const
|
||||||
{
|
{
|
||||||
return m_encoded % TicksPerHour / TicksPerMinute;
|
return static_cast<int>(m_encoded % TicksPerHour / TicksPerMinute);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Second component
|
||||||
|
* @returns the Second component
|
||||||
|
*/
|
||||||
int Second() const
|
int Second() const
|
||||||
{
|
{
|
||||||
return m_encoded % TicksPerMinute / TicksPerSecond;
|
return static_cast<int>(m_encoded % TicksPerMinute / TicksPerSecond);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Microsecond component
|
||||||
|
* @returns the microsecond component
|
||||||
|
*/
|
||||||
int Microsecond() const
|
int Microsecond() const
|
||||||
{
|
{
|
||||||
return m_encoded % TicksPerSecond / TicksPerMicrosecond;
|
return static_cast<int>(m_encoded % TicksPerSecond / TicksPerMicrosecond);
|
||||||
}
|
}
|
||||||
|
|
||||||
double Julian() const
|
/**
|
||||||
|
* Convert to a julian date
|
||||||
|
* @returns the julian date
|
||||||
|
*/
|
||||||
|
double ToJulian() const
|
||||||
{
|
{
|
||||||
TimeSpan ts = TimeSpan(Ticks());
|
TimeSpan ts = TimeSpan(Ticks());
|
||||||
return ts.TotalDays() + 1721425.5;
|
return ts.TotalDays() + 1721425.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert to greenwich sidereal time
|
||||||
|
* @returns the greenwich sidereal time
|
||||||
|
*/
|
||||||
double ToGreenwichSiderealTime() const
|
double ToGreenwichSiderealTime() const
|
||||||
{
|
{
|
||||||
// t = Julian centuries from 2000 Jan. 1 12h UT1
|
// t = Julian centuries from 2000 Jan. 1 12h UT1
|
||||||
const double t = (Julian() - 2451545.0) / 36525.0;
|
const double t = (ToJulian() - 2451545.0) / 36525.0;
|
||||||
|
|
||||||
// Rotation angle in arcseconds
|
// Rotation angle in arcseconds
|
||||||
double theta = 67310.54841
|
double theta = 67310.54841
|
||||||
|
|
@ -493,7 +597,12 @@ public:
|
||||||
return Util::WrapTwoPI(Util::DegreesToRadians(theta / 240.0));
|
return Util::WrapTwoPI(Util::DegreesToRadians(theta / 240.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
double ToLocalMeanSiderealTime(const double& lon) const
|
/**
|
||||||
|
* Convert to local mean sidereal time (GMST plus the observer's longitude)
|
||||||
|
* @param[in] lon observers longitude
|
||||||
|
* @returns the local mean sidereal time
|
||||||
|
*/
|
||||||
|
double ToLocalMeanSiderealTime(const double lon) const
|
||||||
{
|
{
|
||||||
return Util::WrapTwoPI(ToGreenwichSiderealTime() + lon);
|
return Util::WrapTwoPI(ToGreenwichSiderealTime() + lon);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
#ifndef DECAYEDEXCEPTION_H_
|
#ifndef DECAYEDEXCEPTION_H_
|
||||||
#define DECAYEDEXCEPTION_H_
|
#define DECAYEDEXCEPTION_H_
|
||||||
|
|
||||||
#include <exception>
|
|
||||||
|
|
||||||
#include "DateTime.h"
|
#include "DateTime.h"
|
||||||
#include "Vector.h"
|
#include "Vector.h"
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
class DecayedException : public std::exception
|
class DecayedException : public std::exception
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -38,7 +38,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @returns the date
|
* @returns the date
|
||||||
*/
|
*/
|
||||||
DateTime GetDateTime() const
|
DateTime Decayed() const
|
||||||
{
|
{
|
||||||
return _dt;
|
return _dt;
|
||||||
}
|
}
|
||||||
|
|
@ -46,7 +46,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @returns the position
|
* @returns the position
|
||||||
*/
|
*/
|
||||||
Vector GetPosition() const
|
Vector Position() const
|
||||||
{
|
{
|
||||||
return _pos;
|
return _pos;
|
||||||
}
|
}
|
||||||
|
|
@ -54,7 +54,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @returns the velocity
|
* @returns the velocity
|
||||||
*/
|
*/
|
||||||
Vector GetVelocity() const
|
Vector Velocity() const
|
||||||
{
|
{
|
||||||
return _vel;
|
return _vel;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ void Eci::ToEci(const DateTime& dt, const CoordGeodetic &geo)
|
||||||
m_position.x = achcp * cos(theta);
|
m_position.x = achcp * cos(theta);
|
||||||
m_position.y = achcp * sin(theta);
|
m_position.y = achcp * sin(theta);
|
||||||
m_position.z = (kXKMPER * s + geo.altitude) * sin(geo.latitude);
|
m_position.z = (kXKMPER * s + geo.altitude) * sin(geo.latitude);
|
||||||
m_position.w = m_position.GetMagnitude();
|
m_position.w = m_position.Magnitude();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* X velocity in km/s
|
* X velocity in km/s
|
||||||
|
|
@ -50,7 +50,7 @@ void Eci::ToEci(const DateTime& dt, const CoordGeodetic &geo)
|
||||||
m_velocity.x = -mfactor * m_position.y;
|
m_velocity.x = -mfactor * m_position.y;
|
||||||
m_velocity.y = mfactor * m_position.x;
|
m_velocity.y = mfactor * m_position.x;
|
||||||
m_velocity.z = 0.0;
|
m_velocity.z = 0.0;
|
||||||
m_velocity.w = m_velocity.GetMagnitude();
|
m_velocity.w = m_velocity.Magnitude();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -85,5 +85,5 @@ CoordGeodetic Eci::ToGeodetic() const
|
||||||
|
|
||||||
const double alt = r / cos(lat) - kXKMPER * c;
|
const double alt = r / cos(lat) - kXKMPER * c;
|
||||||
|
|
||||||
return CoordGeodetic(lat, lon, alt);
|
return CoordGeodetic(lat, lon, alt, true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @returns the position
|
* @returns the position
|
||||||
*/
|
*/
|
||||||
Vector GetPosition() const
|
Vector Position() const
|
||||||
{
|
{
|
||||||
return m_position;
|
return m_position;
|
||||||
}
|
}
|
||||||
|
|
@ -106,7 +106,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @returns the velocity
|
* @returns the velocity
|
||||||
*/
|
*/
|
||||||
Vector GetVelocity() const
|
Vector Velocity() const
|
||||||
{
|
{
|
||||||
return m_velocity;
|
return m_velocity;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
#include "Globals.h"
|
||||||
|
|
@ -1,12 +1,17 @@
|
||||||
lib_LIBRARIES = libsgp4.a
|
lib_LIBRARIES = libsgp4.a
|
||||||
libsgp4_a_SOURCES = Tle.cpp \
|
libsgp4_a_SOURCES = \
|
||||||
OrbitalElements.cpp \
|
CoordGeodetic.cpp \
|
||||||
Observer.cpp \
|
CoordTopographic.cpp \
|
||||||
Util.cpp \
|
DateTime.cpp \
|
||||||
Eci.cpp \
|
Eci.cpp \
|
||||||
|
Globals.cpp \
|
||||||
|
Observer.cpp \
|
||||||
|
OrbitalElements.cpp \
|
||||||
SGP4.cpp \
|
SGP4.cpp \
|
||||||
TimeSpan.cpp \
|
TimeSpan.cpp \
|
||||||
DateTime.cpp
|
Tle.cpp \
|
||||||
|
Util.cpp \
|
||||||
|
Vector.cpp
|
||||||
include_HEADERS = CoordGeodetic.h \
|
include_HEADERS = CoordGeodetic.h \
|
||||||
Eci.h \
|
Eci.h \
|
||||||
OrbitalElements.h \
|
OrbitalElements.h \
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,10 @@ CoordTopographic Observer::GetLookAngle(const Eci &eci)
|
||||||
/*
|
/*
|
||||||
* calculate differences
|
* calculate differences
|
||||||
*/
|
*/
|
||||||
Vector range_rate = eci.GetVelocity() - m_eci.GetVelocity();
|
Vector range_rate = eci.Velocity() - m_eci.Velocity();
|
||||||
Vector range = eci.GetPosition() - m_eci.GetPosition();
|
Vector range = eci.Position() - m_eci.Position();
|
||||||
|
|
||||||
range.w = range.GetMagnitude();
|
range.w = range.Magnitude();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculate Local Mean Sidereal Time for observers longitude
|
* Calculate Local Mean Sidereal Time for observers longitude
|
||||||
|
|
|
||||||
|
|
@ -698,7 +698,7 @@ void SGP4::DeepSpaceInitialise(
|
||||||
/*
|
/*
|
||||||
* initialize lunar / solar terms
|
* initialize lunar / solar terms
|
||||||
*/
|
*/
|
||||||
const double jday = elements_.Epoch().Julian() - kEPOCH_JAN1_12H_2000;
|
const double jday = elements_.Epoch().ToJulian() - kEPOCH_JAN1_12H_2000;
|
||||||
|
|
||||||
const double xnodce = 4.5236020 - 9.2422029e-4 * jday;
|
const double xnodce = 4.5236020 - 9.2422029e-4 * jday;
|
||||||
const double xnodce_temp = fmod(xnodce, kTWOPI);
|
const double xnodce_temp = fmod(xnodce, kTWOPI);
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,12 @@
|
||||||
#include "SatelliteException.h"
|
#include "SatelliteException.h"
|
||||||
#include "DecayedException.h"
|
#include "DecayedException.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @mainpage
|
||||||
|
*
|
||||||
|
* This documents the SGP4 tracking library.
|
||||||
|
*/
|
||||||
|
|
||||||
class SGP4
|
class SGP4
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,11 @@
|
||||||
#ifndef TIMESPAN_H_
|
#ifndef TIMESPAN_H_
|
||||||
#define TIMESPAN_H_
|
#define TIMESPAN_H_
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
static const long long TicksPerDay = 86400000000LL;
|
static const long long TicksPerDay = 86400000000LL;
|
||||||
|
|
@ -71,34 +76,34 @@ public:
|
||||||
return m_ticks == ts.m_ticks;
|
return m_ticks == ts.m_ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Days()
|
int Days() const
|
||||||
{
|
{
|
||||||
return m_ticks / TicksPerDay;
|
return static_cast<int>(m_ticks / TicksPerDay);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Hours()
|
int Hours() const
|
||||||
{
|
{
|
||||||
return (m_ticks % TicksPerDay / TicksPerHour);
|
return static_cast<int>(m_ticks % TicksPerDay / TicksPerHour);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Minutes() const
|
int Minutes() const
|
||||||
{
|
{
|
||||||
return (m_ticks % TicksPerHour / TicksPerMinute);
|
return static_cast<int>(m_ticks % TicksPerHour / TicksPerMinute);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Seconds() const
|
int Seconds() const
|
||||||
{
|
{
|
||||||
return (m_ticks % TicksPerMinute / TicksPerSecond);
|
return static_cast<int>(m_ticks % TicksPerMinute / TicksPerSecond);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Milliseconds() const
|
int Milliseconds() const
|
||||||
{
|
{
|
||||||
return (m_ticks % TicksPerSecond / TicksPerMillisecond);
|
return static_cast<int>(m_ticks % TicksPerSecond / TicksPerMillisecond);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Microseconds() const
|
int Microseconds() const
|
||||||
{
|
{
|
||||||
return (m_ticks % TicksPerSecond / TicksPerMicrosecond);
|
return static_cast<int>(m_ticks % TicksPerSecond / TicksPerMicrosecond);
|
||||||
}
|
}
|
||||||
|
|
||||||
long long Ticks() const
|
long long Ticks() const
|
||||||
|
|
@ -108,32 +113,60 @@ public:
|
||||||
|
|
||||||
double TotalDays() const
|
double TotalDays() const
|
||||||
{
|
{
|
||||||
return m_ticks / static_cast<double>(TicksPerDay);
|
return static_cast<double>(m_ticks) / TicksPerDay;
|
||||||
}
|
}
|
||||||
|
|
||||||
double TotalHours() const
|
double TotalHours() const
|
||||||
{
|
{
|
||||||
return m_ticks / static_cast<double>(TicksPerHour);
|
return static_cast<double>(m_ticks) / TicksPerHour;
|
||||||
}
|
}
|
||||||
|
|
||||||
double TotalMinutes() const
|
double TotalMinutes() const
|
||||||
{
|
{
|
||||||
return m_ticks / static_cast<double>(TicksPerMinute);
|
return static_cast<double>(m_ticks) / TicksPerMinute;
|
||||||
}
|
}
|
||||||
|
|
||||||
double TotalSeconds() const
|
double TotalSeconds() const
|
||||||
{
|
{
|
||||||
return m_ticks / static_cast<double>(TicksPerSecond);
|
return static_cast<double>(m_ticks) / TicksPerSecond;
|
||||||
}
|
}
|
||||||
|
|
||||||
double TotalMilliseconds() const
|
double TotalMilliseconds() const
|
||||||
{
|
{
|
||||||
return m_ticks / static_cast<double>(TicksPerMillisecond);
|
return static_cast<double>(m_ticks) / TicksPerMillisecond;
|
||||||
}
|
}
|
||||||
|
|
||||||
double TotalMicroseconds() const
|
double TotalMicroseconds() const
|
||||||
{
|
{
|
||||||
return m_ticks / static_cast<double>(TicksPerMicrosecond);
|
return static_cast<double>(m_ticks) / TicksPerMicrosecond;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string ToString() const
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
|
||||||
|
ss << std::right << std::setfill('0');
|
||||||
|
|
||||||
|
if (m_ticks < 0)
|
||||||
|
{
|
||||||
|
ss << '-';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Days() != 0)
|
||||||
|
{
|
||||||
|
ss << std::setw(2) << std::abs(Days()) << '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
ss << std::setw(2) << std::abs(Hours()) << ':';
|
||||||
|
ss << std::setw(2) << std::abs(Minutes()) << ':';
|
||||||
|
ss << std::setw(2) << std::abs(Seconds());
|
||||||
|
|
||||||
|
if (Microseconds() != 0)
|
||||||
|
{
|
||||||
|
ss << '.' << std::setw(6) << std::abs(Microseconds());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -151,6 +184,11 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline std::ostream& operator<<(std::ostream& strm, const TimeSpan& t)
|
||||||
|
{
|
||||||
|
return strm << t.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
inline TimeSpan operator+(const TimeSpan& ts1, const TimeSpan& ts2)
|
inline TimeSpan operator+(const TimeSpan& ts1, const TimeSpan& ts2)
|
||||||
{
|
{
|
||||||
return ts1.Add(ts2);
|
return ts1.Add(ts2);
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,7 @@ void Tle::Initialize()
|
||||||
*/
|
*/
|
||||||
bool Tle::IsValidLineLength(const std::string& str)
|
bool Tle::IsValidLineLength(const std::string& str)
|
||||||
{
|
{
|
||||||
return str.length() == GetLineLength() ? true : false;
|
return str.length() == LineLength() ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ public:
|
||||||
* Get the satellite name
|
* Get the satellite name
|
||||||
* @returns the satellite name
|
* @returns the satellite name
|
||||||
*/
|
*/
|
||||||
std::string GetName() const
|
std::string Name() const
|
||||||
{
|
{
|
||||||
return name_;
|
return name_;
|
||||||
}
|
}
|
||||||
|
|
@ -86,7 +86,7 @@ public:
|
||||||
* Get the first line of the tle
|
* Get the first line of the tle
|
||||||
* @returns the first line of the tle
|
* @returns the first line of the tle
|
||||||
*/
|
*/
|
||||||
std::string GetLine1() const
|
std::string Line1() const
|
||||||
{
|
{
|
||||||
return line_one_;
|
return line_one_;
|
||||||
}
|
}
|
||||||
|
|
@ -95,7 +95,7 @@ public:
|
||||||
* Get the second line of the tle
|
* Get the second line of the tle
|
||||||
* @returns the second line of the tle
|
* @returns the second line of the tle
|
||||||
*/
|
*/
|
||||||
std::string GetLine2() const
|
std::string Line2() const
|
||||||
{
|
{
|
||||||
return line_two_;
|
return line_two_;
|
||||||
}
|
}
|
||||||
|
|
@ -253,7 +253,7 @@ public:
|
||||||
* Get the expected tle line length
|
* Get the expected tle line length
|
||||||
* @returns the tle line length
|
* @returns the tle line length
|
||||||
*/
|
*/
|
||||||
static unsigned int GetLineLength()
|
static unsigned int LineLength()
|
||||||
{
|
{
|
||||||
return TLE_LEN_LINE_DATA;
|
return TLE_LEN_LINE_DATA;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
#include "Vector.h"
|
||||||
|
|
@ -97,7 +97,7 @@ public:
|
||||||
* Calculates the magnitude of the vector
|
* Calculates the magnitude of the vector
|
||||||
* @returns magnitude of the vector
|
* @returns magnitude of the vector
|
||||||
*/
|
*/
|
||||||
double GetMagnitude() const
|
double Magnitude() const
|
||||||
{
|
{
|
||||||
return sqrt(x * x + y * y + z * z);
|
return sqrt(x * x + y * y + z * z);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ struct PassDetails
|
||||||
double max_elevation;
|
double max_elevation;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if 0
|
||||||
double FindMaxElevation(
|
double FindMaxElevation(
|
||||||
const CoordGeodetic& user_geo,
|
const CoordGeodetic& user_geo,
|
||||||
SGP4& sgp4,
|
SGP4& sgp4,
|
||||||
|
|
@ -101,6 +102,88 @@ double FindMaxElevation(
|
||||||
|
|
||||||
return max_elevation;
|
return max_elevation;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
double FindMaxElevation(
|
||||||
|
const CoordGeodetic& user_geo,
|
||||||
|
SGP4& sgp4,
|
||||||
|
const DateTime& aos,
|
||||||
|
const DateTime& los)
|
||||||
|
{
|
||||||
|
Observer obs(user_geo);
|
||||||
|
|
||||||
|
bool running;
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
double time_step = (los - aos).TotalSeconds() / 9.0;
|
||||||
|
DateTime current_time(aos); //! current time
|
||||||
|
DateTime time1(aos); //! start time of search period
|
||||||
|
DateTime time2(los); //! end time of search period
|
||||||
|
double max_elevation; //! max elevation
|
||||||
|
|
||||||
|
running = true;
|
||||||
|
cnt = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
running = true;
|
||||||
|
max_elevation = -99999999999999.0;
|
||||||
|
while (running && current_time < time2)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* find position
|
||||||
|
*/
|
||||||
|
Eci eci = sgp4.FindPosition(current_time);
|
||||||
|
CoordTopographic topo = obs.GetLookAngle(eci);
|
||||||
|
|
||||||
|
if (topo.elevation > max_elevation)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* still going up
|
||||||
|
*/
|
||||||
|
max_elevation = topo.elevation;
|
||||||
|
/*
|
||||||
|
* move time along
|
||||||
|
*/
|
||||||
|
current_time = current_time.AddSeconds(time_step);
|
||||||
|
if (current_time > time2)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* dont go past end time
|
||||||
|
*/
|
||||||
|
current_time = time2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* stop
|
||||||
|
*/
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* make start time to 2 time steps back
|
||||||
|
*/
|
||||||
|
time1 = current_time.AddSeconds(-2.0 * time_step);
|
||||||
|
/*
|
||||||
|
* make end time to current time
|
||||||
|
*/
|
||||||
|
time2 = current_time;
|
||||||
|
/*
|
||||||
|
* current time to start time
|
||||||
|
*/
|
||||||
|
current_time = time1;
|
||||||
|
/*
|
||||||
|
* recalculate time step
|
||||||
|
*/
|
||||||
|
time_step = (time2 - time1).TotalSeconds() / 9.0;
|
||||||
|
}
|
||||||
|
while (time_step > 1.0);
|
||||||
|
|
||||||
|
return max_elevation;
|
||||||
|
}
|
||||||
|
|
||||||
DateTime FindCrossingPoint(
|
DateTime FindCrossingPoint(
|
||||||
const CoordGeodetic& user_geo,
|
const CoordGeodetic& user_geo,
|
||||||
|
|
@ -111,25 +194,18 @@ DateTime FindCrossingPoint(
|
||||||
{
|
{
|
||||||
Observer obs(user_geo);
|
Observer obs(user_geo);
|
||||||
|
|
||||||
bool searching = true;
|
bool running;
|
||||||
int cnt = 0;
|
int cnt;
|
||||||
|
|
||||||
DateTime time1(initial_time1);
|
DateTime time1(initial_time1);
|
||||||
DateTime time2(initial_time2);
|
DateTime time2(initial_time2);
|
||||||
|
DateTime middle_time;
|
||||||
|
|
||||||
double diff = (time2 - time1).TotalSeconds();
|
running = true;
|
||||||
if (finding_aos)
|
cnt = 0;
|
||||||
{
|
while (running && cnt++ < 16)
|
||||||
diff = std::floor(diff);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
diff = std::ceil(diff);
|
|
||||||
}
|
|
||||||
DateTime middle_time(time1.AddSeconds(diff));
|
|
||||||
|
|
||||||
while (searching && cnt < 25)
|
|
||||||
{
|
{
|
||||||
|
middle_time = time1.AddSeconds((time2 - time1).TotalSeconds() / 2.0);
|
||||||
/*
|
/*
|
||||||
* calculate satellite position
|
* calculate satellite position
|
||||||
*/
|
*/
|
||||||
|
|
@ -138,6 +214,9 @@ DateTime FindCrossingPoint(
|
||||||
|
|
||||||
if (topo.elevation > 0.0)
|
if (topo.elevation > 0.0)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* satellite above horizon
|
||||||
|
*/
|
||||||
if (finding_aos)
|
if (finding_aos)
|
||||||
{
|
{
|
||||||
time2 = middle_time;
|
time2 = middle_time;
|
||||||
|
|
@ -159,28 +238,41 @@ DateTime FindCrossingPoint(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((time2 - time1).TotalSeconds() < 1.0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* two times are within a second, stop
|
||||||
|
*/
|
||||||
|
running = false;
|
||||||
|
/*
|
||||||
|
* remove microseconds
|
||||||
|
*/
|
||||||
|
int us = middle_time.Microsecond();
|
||||||
|
middle_time = middle_time.AddMicroseconds(-us);
|
||||||
|
/*
|
||||||
|
* step back into the pass by 1 second
|
||||||
|
*/
|
||||||
|
middle_time = middle_time.AddSeconds(finding_aos ? 1 : -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* when two times are within a second, stop
|
* go back/forward 1second until below the horizon
|
||||||
*/
|
*/
|
||||||
if ((time2 - time1).TotalSeconds() < 1.5)
|
running = true;
|
||||||
|
cnt = 0;
|
||||||
|
while (running && cnt++ < 6)
|
||||||
{
|
{
|
||||||
searching = false;
|
Eci eci = sgp4.FindPosition(middle_time);
|
||||||
|
CoordTopographic topo = obs.GetLookAngle(eci);
|
||||||
|
if (topo.elevation > 0)
|
||||||
|
{
|
||||||
|
middle_time = middle_time.AddSeconds(finding_aos ? -1 : 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
diff = (time2 - time1).TotalSeconds();
|
running = false;
|
||||||
if (finding_aos)
|
|
||||||
{
|
|
||||||
diff = std::floor(diff);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
diff = std::ceil(diff);
|
|
||||||
}
|
|
||||||
middle_time = time1.AddSeconds(diff);
|
|
||||||
}
|
|
||||||
|
|
||||||
cnt++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return middle_time;
|
return middle_time;
|
||||||
|
|
@ -201,30 +293,30 @@ std::list<struct PassDetails> GeneratePassList(
|
||||||
DateTime los_time;
|
DateTime los_time;
|
||||||
|
|
||||||
bool found_aos = false;
|
bool found_aos = false;
|
||||||
bool found_los = false;
|
|
||||||
|
|
||||||
DateTime previous_time(start_time);
|
DateTime previous_time(start_time);
|
||||||
DateTime current_time(start_time);
|
DateTime current_time(start_time);
|
||||||
|
|
||||||
while (current_time < end_time)
|
while (current_time < end_time)
|
||||||
{
|
{
|
||||||
|
bool end_of_pass = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* calculate satellite position
|
* calculate satellite position
|
||||||
*/
|
*/
|
||||||
Eci eci = sgp4.FindPosition(current_time);
|
Eci eci = sgp4.FindPosition(current_time);
|
||||||
CoordTopographic topo = obs.GetLookAngle(eci);
|
CoordTopographic topo = obs.GetLookAngle(eci);
|
||||||
|
|
||||||
std::cout << std::fixed << current_time << " " << topo.elevation << std::endl;
|
if (!found_aos && topo.elevation > 0.0)
|
||||||
|
|
||||||
if (topo.elevation > 0.0)
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* satellite is above horizon
|
* aos hasnt occured yet, but the satellite is now above horizon
|
||||||
|
* this must have occured within the last time_step
|
||||||
*/
|
*/
|
||||||
if (start_time == current_time)
|
if (start_time == current_time)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* satellite was already above the horizon at the start time,
|
* satellite was already above the horizon at the start,
|
||||||
* so use the start time
|
* so use the start time
|
||||||
*/
|
*/
|
||||||
aos_time = start_time;
|
aos_time = start_time;
|
||||||
|
|
@ -241,15 +333,18 @@ std::list<struct PassDetails> GeneratePassList(
|
||||||
current_time,
|
current_time,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
found_aos = true;
|
found_aos = true;
|
||||||
found_los = false;
|
|
||||||
}
|
}
|
||||||
else if (found_aos)
|
else if (found_aos && topo.elevation < 0.0)
|
||||||
{
|
{
|
||||||
|
found_aos = false;
|
||||||
/*
|
/*
|
||||||
* satellite now below horizon and we have an AOS, so record the
|
* end of pass, so move along more than time_step
|
||||||
* pass
|
*/
|
||||||
|
end_of_pass = true;
|
||||||
|
/*
|
||||||
|
* already have the aos, but now the satellite is below the horizon,
|
||||||
|
* so find the los
|
||||||
*/
|
*/
|
||||||
los_time = FindCrossingPoint(
|
los_time = FindCrossingPoint(
|
||||||
user_geo,
|
user_geo,
|
||||||
|
|
@ -258,9 +353,6 @@ std::list<struct PassDetails> GeneratePassList(
|
||||||
current_time,
|
current_time,
|
||||||
false);
|
false);
|
||||||
|
|
||||||
found_aos = false;
|
|
||||||
found_los = true;
|
|
||||||
|
|
||||||
struct PassDetails pd;
|
struct PassDetails pd;
|
||||||
pd.aos = aos_time;
|
pd.aos = aos_time;
|
||||||
pd.los = los_time;
|
pd.los = los_time;
|
||||||
|
|
@ -273,14 +365,17 @@ std::list<struct PassDetails> GeneratePassList(
|
||||||
pass_list.push_back(pd);
|
pass_list.push_back(pd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* save current time
|
||||||
|
*/
|
||||||
previous_time = current_time;
|
previous_time = current_time;
|
||||||
|
|
||||||
if (found_los)
|
if (end_of_pass)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* at the end of the pass move the time along by 20mins
|
* at the end of the pass move the time along by 30mins
|
||||||
*/
|
*/
|
||||||
current_time = current_time + TimeSpan(0, 20, 0);
|
current_time = current_time + TimeSpan(0, 30, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -297,8 +392,6 @@ std::list<struct PassDetails> GeneratePassList(
|
||||||
*/
|
*/
|
||||||
current_time = end_time;
|
current_time = end_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
found_los = false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (found_aos)
|
if (found_aos)
|
||||||
|
|
@ -310,7 +403,7 @@ std::list<struct PassDetails> GeneratePassList(
|
||||||
struct PassDetails pd;
|
struct PassDetails pd;
|
||||||
pd.aos = aos_time;
|
pd.aos = aos_time;
|
||||||
pd.los = end_time;
|
pd.los = end_time;
|
||||||
pd.max_elevation = FindMaxElevation(user_geo, sgp4, aos_time, los_time);
|
pd.max_elevation = FindMaxElevation(user_geo, sgp4, aos_time, end_time);
|
||||||
|
|
||||||
pass_list.push_back(pd);
|
pass_list.push_back(pd);
|
||||||
}
|
}
|
||||||
|
|
@ -318,24 +411,23 @@ std::list<struct PassDetails> GeneratePassList(
|
||||||
return pass_list;
|
return pass_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main()
|
||||||
|
{
|
||||||
CoordGeodetic geo(51.507406923983446, -0.12773752212524414, 0.05);
|
CoordGeodetic geo(51.507406923983446, -0.12773752212524414, 0.05);
|
||||||
Tle tle("UK-DMC 2 ",
|
Tle tle("GALILEO-PFM (GSAT0101) ",
|
||||||
"1 25544U 98067A 12285.65009259 .00017228 00000-0 30018-3 0 4501",
|
"1 37846U 11060A 12293.53312491 .00000049 00000-0 00000-0 0 1435",
|
||||||
"2 25544 051.6477 262.7396 0017757 155.0745 185.1532 15.50683239796101");
|
"2 37846 54.7963 119.5777 0000994 319.0618 40.9779 1.70474628 6204");
|
||||||
SGP4 sgp4(tle);
|
SGP4 sgp4(tle);
|
||||||
|
|
||||||
std::cout << tle << std::endl;
|
std::cout << tle << std::endl;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* generate 1 day schedule
|
* generate 7 day schedule
|
||||||
*/
|
*/
|
||||||
DateTime start_date = DateTime::Now();
|
DateTime start_date = DateTime::Now(true);
|
||||||
DateTime end_date(start_date.AddDays(1.0));
|
DateTime end_date(start_date.AddDays(7.0));
|
||||||
|
|
||||||
std::list<struct PassDetails> pass_list;
|
std::list<struct PassDetails> pass_list;
|
||||||
std::list<struct PassDetails>::const_iterator itr;
|
|
||||||
|
|
||||||
std::cout << "Start time: " << start_date << std::endl;
|
std::cout << "Start time: " << start_date << std::endl;
|
||||||
std::cout << "End time : " << end_date << std::endl << std::endl;
|
std::cout << "End time : " << end_date << std::endl << std::endl;
|
||||||
|
|
@ -351,16 +443,22 @@ int main() {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
itr = pass_list.begin();
|
std::stringstream ss;
|
||||||
|
|
||||||
|
ss << std::right << std::setprecision(1) << std::fixed;
|
||||||
|
|
||||||
|
std::list<struct PassDetails>::const_iterator itr = pass_list.begin();
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
std::cout
|
ss << "AOS: " << itr->aos
|
||||||
<< "AOS: " << itr->aos
|
|
||||||
<< ", LOS: " << itr->los
|
<< ", LOS: " << itr->los
|
||||||
<< ", Max El: " << Util::RadiansToDegrees(itr->max_elevation)
|
<< ", Max El: " << std::setw(4) << Util::RadiansToDegrees(itr->max_elevation)
|
||||||
|
<< ", Duration: " << (itr->los - itr->aos)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
}
|
}
|
||||||
while (++itr != pass_list.end());
|
while (++itr != pass_list.end());
|
||||||
|
|
||||||
|
std::cout << ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -47,8 +47,8 @@ void RunTle(Tle tle, double start, double end, double inc)
|
||||||
}
|
}
|
||||||
|
|
||||||
Eci eci = model.FindPosition(tsince);
|
Eci eci = model.FindPosition(tsince);
|
||||||
position = eci.GetPosition();
|
position = eci.Position();
|
||||||
velocity = eci.GetVelocity();
|
velocity = eci.Velocity();
|
||||||
}
|
}
|
||||||
catch (SatelliteException& e)
|
catch (SatelliteException& e)
|
||||||
{
|
{
|
||||||
|
|
@ -60,8 +60,8 @@ void RunTle(Tle tle, double start, double end, double inc)
|
||||||
{
|
{
|
||||||
std::cerr << e.what() << std::endl;
|
std::cerr << e.what() << std::endl;
|
||||||
|
|
||||||
position = e.GetPosition();
|
position = e.Position();
|
||||||
velocity = e.GetVelocity();
|
velocity = e.Velocity();
|
||||||
|
|
||||||
if (!first_run)
|
if (!first_run)
|
||||||
{
|
{
|
||||||
|
|
@ -182,9 +182,9 @@ void RunTest(const char* infile)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (line.length() >= Tle::GetLineLength())
|
if (line.length() >= Tle::LineLength())
|
||||||
{
|
{
|
||||||
//Tle::IsValidLine(line.substr(0, Tle::GetLineLength()), 1);
|
//Tle::IsValidLine(line.substr(0, Tle::LineLength()), 1);
|
||||||
/*
|
/*
|
||||||
* store line and now read in second line
|
* store line and now read in second line
|
||||||
*/
|
*/
|
||||||
|
|
@ -208,15 +208,15 @@ void RunTest(const char* infile)
|
||||||
* split line, first 69 is the second line of the tle
|
* split line, first 69 is the second line of the tle
|
||||||
* the rest is the test parameters, if there is any
|
* the rest is the test parameters, if there is any
|
||||||
*/
|
*/
|
||||||
line2 = line.substr(0, Tle::GetLineLength());
|
line2 = line.substr(0, Tle::LineLength());
|
||||||
double start = 0.0;
|
double start = 0.0;
|
||||||
double end = 1440.0;
|
double end = 1440.0;
|
||||||
double inc = 120.0;
|
double inc = 120.0;
|
||||||
if (line.length() > 69)
|
if (line.length() > 69)
|
||||||
{
|
{
|
||||||
std::vector<std::string> tokens;
|
std::vector<std::string> tokens;
|
||||||
parameters = line.substr(Tle::GetLineLength() + 1,
|
parameters = line.substr(Tle::LineLength() + 1,
|
||||||
line.length() - Tle::GetLineLength());
|
line.length() - Tle::LineLength());
|
||||||
tokenize(parameters, tokens);
|
tokenize(parameters, tokens);
|
||||||
if (tokens.size() >= 3)
|
if (tokens.size() >= 3)
|
||||||
{
|
{
|
||||||
|
|
@ -231,9 +231,9 @@ void RunTest(const char* infile)
|
||||||
*/
|
*/
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (line.length() >= Tle::GetLineLength())
|
if (line.length() >= Tle::LineLength())
|
||||||
{
|
{
|
||||||
//Tle::IsValidLine(line.substr(0, Tle::GetLineLength()), 2);
|
//Tle::IsValidLine(line.substr(0, Tle::LineLength()), 2);
|
||||||
Tle tle("Test", line1, line2);
|
Tle tle("Test", line1, line2);
|
||||||
RunTle(tle, start, end, inc);
|
RunTle(tle, start, end, inc);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,13 @@
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
Observer obs(51.507406923983446, -0.12773752212524414, 0.05);
|
Observer obs(51.507406923983446, -0.12773752212524414, 0.05);
|
||||||
Tle tle = Tle("MASAT 1 ",
|
Tle tle = Tle("UK-DMC 2 ",
|
||||||
"1 25544U 98067A 12285.65009259 .00017228 00000-0 30018-3 0 4501",
|
"1 35683U 09041C 12289.23158813 .00000484 00000-0 89219-4 0 5863",
|
||||||
"2 25544 051.6477 262.7396 0017757 155.0745 185.1532 15.50683239796101");
|
"2 35683 98.0221 185.3682 0001499 100.5295 259.6088 14.69819587172294");
|
||||||
SGP4 sgp4(tle);
|
SGP4 sgp4(tle);
|
||||||
|
|
||||||
|
std::cout << tle << std::endl;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue