NAME
Astro::App::Satpass2::FormatValue - Format Astro::App::Satpass2 output as text.
SYNOPSIS
use strict;
use warnings;
use Astro::App::Satpass2::FormatValue;
use Astro::Coord::ECI;
use Astro::Coord::ECI::Moon;
use Astro::Coord::ECI::Sun;
use Astro::Coord::ECI::Utils qw{ deg2rad };
my $time = time();
my $moon = Astro::Coord::ECI::Moon->universal( $time );
my $sun = Astro::Coord::ECI::Sun->universal( $time );
my $station = Astro::Coord::ECI->new(
name => 'White House',
)->geodetic(
deg2rad(38.8987), # latitude
deg2rad(-77.0377), # longitude
17 / 1000); # height above sea level, Km
foreach my $body ( $sun, $moon ) {
my $fmt = Astro::App::Satpass2::FormatValue->new(
data => {
body => $body,
station => $station,
time => $time,
} );
print join( ' ', $fmt->date(), $fmt->time(),
$fmt->name( width => 10 ),
$fmt->azimuth( bearing => 2 ),
$fmt->elevation() ), "\n";
}
DETAILS
This class is intended to take care of the details of performing field formatting for an Astro::App::Satpass2::Format object, and was actually written to format data for Template-Toolkit
. It is not intended to be used outside one of these, though I suppose it could be.
This class is intended to be initialized with a hash containing data in known locations. Not coincidentally, the hash corresponds to the hashes produced by methods of interest in Astro::Coord::ECI and its subclasses.
METHODS
This class supports the following public methods.
Instantiator
new
$fmt = Astro::App::Satpass2::FormatValue->new();
This static method instantiates a new value formatter. It takes as arguments name/value pairs.
Because this class has no mutators you must give it all the information it needs to do its job when you instantiate it.
The following argument names are recognized:
- data
-
This argument is a hash containing the data to be displayed. The keys in the hash are accessed by the various transformation and formatter methods. This argument is technically optional, but unless you have specified
title => 1
(which see) you will not get a very useful object if you omit it.If this hash contains a {time} key, the Astro::Coord::ECI objects in the
{body}
and{station}
keys (if any) will be set to that value. - date_format
-
This argument is the string that the
time_formatter
will use to format dates. It is assumed that this format will not produce any time information, though this is not enforced. The default is whatever the default date format is for thetime_formatter
. - default
-
This optional argument is a hash used to override the defaults for the various formatters. The keys are formatter names, and the values of those keys are hashes containing the specific argument defaults.
- desired_equinox_dynamical
-
This optional argument is the desired equinox in dynamical time. If specified as a non-zero Perl time, inertial coordinates will be precessed to this equinox. The default is
0
. - fixed_width
-
This optional argument specifies whether or not fixed-width fields are to be produced. If true (the default) numeric default widths are applied where needed. If false the default width is
''
, which is the convention for variable-width fields. - list_formatter
-
This optional argument provides the implementation of the list() formatter method. If you provide a defined value it must be a code reference. The code reference will be called with the same arguments as were used for
local_coord()
, including the invocant. - local_coordinates
-
This optional argument provides the implementation of the local_coord() formatter method. You can provide either a code reference of one of the following strings:
az_rng --------- Azimuth and range; azel ----------- Elevation and azimuth; azel_rng ------- Elevation, azimuth and range; equatorial ----- Right ascension and declination; equatorial_rng - Right ascension, declination, and range.
The code reference will be called with the same arguments as were used for
local_coord()
, including the invocant.The default is
azel_rng
. - overflow
-
If this optional argument is true (in the Perl sense, i.e. anything but
undef
,0
, or''
) fields will be allowed to overflow their widths. If false (the default) too-long strings will be truncated on the right, and too-long numeric fields will generally be*
-filled. - report
-
This optional argument is the name of the report being produced (e.g.
'pass'
,'flare'
, or whatever). If specified, format effectors will use this for report-specific localization of titles, missing data text, and literals.The localization will come from key
{"-$report"}{string}{$string}
, where$report
is the value of this argument, and$string
is the string being localized. - time_format
-
This argument is the string that the
time_formatter
will use to format times of day. It is assumed that this format will not produce any date information, though this is not enforced. The default is whatever the default time format is for thetime_formatter
. - time_formatter
-
This argument is either the name or an instance of an Astro::App::Satpass2::FormatTime subclass. This object is used to format times. The default is
Astro::App::Satpass2::FormatTime
. - title
-
If this argument is true, the formatter methods will produce titles rather than values. In this case the
data
hash is unused. The default is false. - title_gravity
-
This argument specifies the value for the title_gravity attribute. See the title_gravity() documentation for full details.
- warner
-
This optional argument must be an instance of Astro::App::Satpass2::Warner. If not provided, a new
Warner
object will be instantiated.
Accessors
These are kept to a minimum, since the main purpose of the object is to provide formatting.
body
$fmt->body();
This accessor returns the contents of the {body}
key of the original hash passed to the data
argument when the object was instantiated. It returns a false value if the {body}
key exists but is not an Astro::Coord::ECI|Astro::Coord::ECI
, or if the key does not exist.
This accessor exists because the Astro::App::Satpass2::Format::Template list() method needs to look at the body to decide what to display.
data
$fmt->data();
This accessor returns the original data
argument.
Mutators
These also are kept to a minimum.
If called without an argument, all mutators act as accessors, and return the value of the attribute.
If called with an argument, they change the attribute (or croak if the new value is invalid), and return their invocant.
fixed_width
$fmt->fixed_width( 0 );
say 'Fixed-width formatting is ',
$fmt->fixed_width() ? 'on' : 'off';
If false, this boolean attribute causes all widths not explicitly specified to default to ''
, which is the convention for non-fixed-width fields. It can also be set via the fixed_width
argument to new()
. The default is 1
(i.e. true
).
If called without an argument, this method acts as an accessor, returning the current value.
This boolean attribute has a mutator because Template-Toolkit
needs to modify it, and Template-Toolkit
-style named arguments can't be used for clone()
because of the way the interface is designed.
title_gravity
$fmt->title_gravity( 'bottom' );
say 'Title gravity is ', $fmt->title_gravity();
This attribute specifies how multiline titles are aligned. The possible values are 'top'
or 'bottom'
. The manifest constants TITLE_GRAVITY_TOP
and TITLE_GRAVITY_BOTTOM
are defined to represent these, but they are not exported.
If you specify 'bottom'
, you get an extra empty line above the titles. This is an annoying behavior necessitated by the fact that the first line of the first title has to be inserted into the output before we know how many lines are needed to print all the titles. So we force an extra line with blanks to get the process rolling.
This hack means that you do not want to use 'bottom'
unless you intend to actually display all the lines of each title.
The default is 'top'
.
This attribute has a mutator because Template-Toolkit
needs to modify it.
Transformations
Some of the methods of interest produce hashes that contain supplementary data. For example, the output of the Astro::Coord::ECI::TLE pass()
method may contain an <{appulse}> key describing the appulsed body. These methods give access to such data. If the requested data exists, they typically return an Astro::App::Satpass2::FormatValue
object, though they may return a reference to an array of them, or to an iterator function. If the requested data do not exist, they typically return undef
.
appulse
my $apls = $fmt->appulse();
This method returns an Astro::App::Satpass2::FormatValue
object based on the invocant, with the data coming from the {appulse}
key of the original object's data, augmented with the {station}
and {time}
of the original data.
bodies
my $array_ref = $fmt->bodies();
For reasons that seemed logical at the time, the Astro::App::Satpass2 position() method produces a hash containing the time, some other relevant data, and a {bodies}
key which contains a reference to an array of all the relevant bodies.
This method extracts an array of more-normally-structured Astro::App::Satpass2::FormatValue
objects which give access to the original bodies.
center
$center = $fmt->center();
This method returns an Astro::App::Satpass2::FormatValue
object based on the invocant, with the data coming from the {center}
key of the original object's data, augmented with the {station}
and {time}
of the original data.
clone
my $clone = $fmt->( %arg );
This method performs a shallow clone the invocant. That is to say, the clone is a separate object, but it shares all contained objects and references with the original object. If any arguments are passed, they are used to initialize the cloned object, instead of the corresponding data from the invocant.
earth
my $earth = $fmt->earth();
This method returns an Astro::App::Satpass2::FormatValue
object based on the invocant, with its {station}
key set to the center of the Earth.
events
foreach my $event ( @{ $fmt->events() || [] } ) {
... do something with the event ...
}
This method returns a reference to an array of Astro::App::Satpass2::FormatValue
objects manufactured out of the contents of the {events}
key of the invocant's data.
reflections
$array_ref = $fmt->reflections();
This method returns a reference to an array of Astro::App::Satpass2::FormatValue
objects which represent the results of calling $fmt->body()->reflection()
, passing it the contents of the {station}
and {time}
keys. It will return undef
if the body does not support this method, or if it is below the horizon or not lit.
station
my $station = $fmt->station();
This method returns an object identical to the invocant, with the exception that the {body}
and {station}
contents are exchanged. With this,
$fmt->station()->latitude()
(e.g.) gets you the latitude of the observing station, whereas
$fmt->latitude()
would get you the latitude of the orbiting body.
tle_events
foreach my $event ( @{ $fmt->tle_events() || [] } ) {
... do something with the event ...
}
This method returns a reference to an array of Astro::App::Satpass2::FormatValue
objects manufactured out of the contents of the {events}
key of the invocant's data, but only those elements whose {body}
key contains an Astro::Coord::ECI::TLE or equivalent. If you want all elements in {events}
, call events().
Formatters
Each formatter converts the value of a specific key or keys in the data
hash to text. Typically the conversion is to a fixed-width field unless the width
argument is non-numeric. If the underlying item does not exist, a user-specified string will be returned instead, or spaces if no string was specified.
All the formatter arguments are passed by name: that is, as name/value pairs. Because of the idiosyncrasies of Template-Toolkit
, or because of the author's lack of experience with it, some weirdness has been introduced into what would have been a straightforward signature:
* Template-Toolkit
recognizes special named-argument syntax, and presents the arguments as a hash appended to the argument list. Therefore, if the formatters see a hash as the last argument, that hash will be expanded into a list and prepended to the argument list. Because Template-Toolkit
does not supply an empty hash if none of its named arguments are seen, you can not pass a hash as the last argument.
* Template-Toolkit
seems to have a strong preference for dealing with arrays as references. But array references are not flattened when passed as arguments. If the caller wants an array reference flattened, it must be made into an instance of Astro::App::Satpass2::Wrap::Array. This is really (I think and hope!) only a problem for whoever writes the code reference that gets passed to the local_coordinates
argument of new()
(i.e. me).
The summary of all this is that arguments are taken in the following order:
- 1) arguments from the final hash, if any
- 2) everything else except
- 3) Astro::App::Satpass2::Wrap::Array objects, which are expanded and put last.
Since arguments are passed by name, you can specify the same argument more than once. If this happens, the last
specification of the argument is the one taken.
One additional complication: for convenience in overriding default titles, if the list of arguments from item (2)
above ('everything else') has an odd number of elements, 'title'
is prepended. The net result of this is that if $title
is an Astro::App::Satpass2::FormatValue
object with title => 1
, something like $title->azimuth( '' ) will produce an empty field of the proper width.
The following arguments are accepted by all formatters:
- align_left
-
This argument specifies that the given value be left-aligned in its field. This defaults to true for text items, and false for numeric items.
- literal
-
This argument specifies text to be displayed in place of the underlying datum.
- missing
-
This argument specifies the text to be filled in if the underlying datum is not available. It defaults to spaces.
- title
-
This argument specifies the text to be used as the title of the formatter -- that is, the text which is displayed when the formatter is initialized with
title => 1
. The default is appropriate to the formatter.
almanac
print $fmt->almanac();
The almanac_hash()
method provided by some subclasses of Astro::Coord::ECI
returns a hash which includes an {almanac}
key, which contains various items describing the almanac entry. This method provides access to the contents of the {almanac}
key.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any almanac_pseudo_units units are accepted; anything else will result in an exception. The default is
description
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
40
.
altitude
print $fmt->altitude();
This method formats the altitude of the {body}
object above sea level.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
1
. - units
-
This argument specifies the units of the field. Any length units are accepted; anything else will result in an exception. The default is
kilometers
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
7
.
angle
print $fmt->angle();
This method formats the {angle}
value, which typically represents an appulse angle.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
1
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
5
.
apoapsis
print $fmt->apoapsis();
This method formats the apoapsis of the {body}
object's orbit.
In addition to the standard arguments, it takes the following:
- as_altitude
-
If this boolean argument is true (in the Perl sense) the value is given as altitude above the Earth's surface. If false, the value is given as distance from the Earth's center. The default is
1
. - places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
0
. - units
-
This argument specifies the units of the field. Any length units are accepted; anything else will result in an exception. The default is
kilometers
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
6
.
apogee
print $fmt->apogee();
This method formats the apogee of the {body}
object's orbit. Yes, this is the same as the apoapsis.
In addition to the standard arguments, it takes the following:
- as_altitude
-
If this boolean argument is true (in the Perl sense) the value is given as altitude above the Earth's surface. If false, the value is given as distance from the Earth's center. The default is
1
. - places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
0
. - units
-
This argument specifies the units of the field. Any length units are accepted; anything else will result in an exception. The default is
kilometers
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
6
.
argument_of_perigee
print $fmt->argument_of_perigee();
This method formats the argument of perigee from the {body}
object's TLE data.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
4
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
9
.
ascending_node
print $fmt->ascending_node();
This method formats the ascending node from the {body}
object's TLE data.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
2
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
right_ascension
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
11
.
azimuth
print $fmt->azimuth();
This method formats the azimuth of the {body}
object as seen from the {station}
object.
In addition to the standard arguments, it takes the following:
- bearing
-
This argument specifies the size of the bearing information to append to the azimuth. If zero or any non-numeric value, no bearing information will be appended. The default is
0
. - places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
1
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
5
.
b_star_drag
print $fmt->b_star_drag();
This method formats the B* drag from the {body}
object's TLE data..
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
4
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
11
.
classification
print $fmt->classification();
This method formats the classification of the {body}
object's TLE data. This will usually be 'U', for 'unclassified'.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any string_pseudo_units units are accepted; anything else will result in an exception. The default is
string
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
1
.
date
print $fmt->date();
This method formats the {time}
value using the date_format
template. This is intended to produce the date, without time information.
In addition to the standard arguments, it takes the following:
- delta
-
This argument specifies a number of seconds to add to the value before it is formatted. The default is
0
. - format
-
This argument specifies the format to use for formatting the value. The default is ...
- gmt
-
If this boolean argument is true, the value is formatted in GMT, regardless of how the time formatter is set up. If false, it is formatted according to the
time_formatter
's zone setting. The default is thetime_formatter
'sgmt
setting. - places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
5
. - units
-
This argument specifies the units of the field. Any time_units units are accepted; anything else will result in an exception. The default is
local
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
.
declination
print $fmt->declination();
This method formats the declination of the {body}
object as seen from the {station}
object.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
1
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
5
.
eccentricity
print $fmt->eccentricity();
This method formats the eccentricity of the {body}
object's orbit.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
5
. - units
-
This argument specifies the units of the field. Any dimensionless units are accepted; anything else will result in an exception. The default is
unity
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
8
.
effective_date
print $fmt->effective_date();
This method formats the effective date of the {body}
object's TLE data.
In addition to the standard arguments, it takes the following:
- format
-
This argument specifies the format to use for formatting the value. The default is ...
- gmt
-
If this boolean argument is true, the value is formatted in GMT, regardless of how the time formatter is set up. If false, it is formatted according to the
time_formatter
's zone setting. The default is thetime_formatter
'sgmt
setting. - places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
.
- units
-
This argument specifies the units of the field. Any time_units units are accepted; anything else will result in an exception. The default is
local
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
.
element_number
print $fmt->element_number();
This method formats the number of the {body}
object's TLE data. This is usually incremented each time a new set is published.
In addition to the standard arguments, it takes the following:
- width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
4
.
elevation
print $fmt->elevation();
This method formats the elevation of the {body}
object above the horizon as seen from the {station}
object.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
1
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
5
.
ephemeris_type
print $fmt->ephemeris_type();
This method formats the ephemeris type of the {body}
object's TLE data. This is supposed to say which model is to be used to calculate the object's position, but in practice is typically 0 or blank.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any string_pseudo_units units are accepted; anything else will result in an exception. The default is
string
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
1
.
epoch
print $fmt->epoch();
This method formats the epoch from the {body}
object's TLE data.
In addition to the standard arguments, it takes the following:
- format
-
This argument specifies the format to use for formatting the value. The default is ...
- gmt
-
If this boolean argument is true, the value is formatted in GMT, regardless of how the time formatter is set up. If false, it is formatted according to the
time_formatter
's zone setting. The default is thetime_formatter
'sgmt
setting. - places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
.
- units
-
This argument specifies the units of the field. Any time_units units are accepted; anything else will result in an exception. The default is
local
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
.
event
print $fmt->event();
This method formats the contents of {event}
, which generally comes from an Astro::Coord::ECI::TLE pass()
calculation.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any event_pseudo_units units are accepted; anything else will result in an exception. The default is
localized
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
5
.
first_derivative
print $fmt->first_derivative();
This method formats the first derivative from the {body}
object's TLE data. The units are actually angle per minute squared, but this formatter treats them as angle. That is, it will give you output in radians per minute squared if you so desire, but not in radians per second squared.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
10
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
17
.
fraction_lit
print $fmt->fraction_lit();
This method formats the fraction of the {body}
object which is lit. This is only available if that object supports the phase()
method.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
2
. - units
-
This argument specifies the units of the field. Any dimensionless units are accepted; anything else will result in an exception. The default is
unity
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
4
.
illumination
print $fmt->illumination();
This method formats the contents of {illumination}
, which generally comes from an Astro::Coord::ECI::TLE pass()
calculation, though it is also present if the template calls data.bodies()
.
If the satellite is above the horizon, the illumination returned by bodies()
is the same as that provided by the pass calculation. Prior to version 0.019_01, nothing was returned if the satellite was below the horizon. Beginning with version 0.019_01, the satellite will be shown as either lit or shadowed if it is below the horizon.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any event_pseudo_units units are accepted; anything else will result in an exception. The default is
localized
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
5
.
inclination
print $fmt->inclination();
This method formats the orbital inclination from the {body}
object's TLE data.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
4
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
8
.
inertial
print $fmt->inertial()
This method formats the inertial
attribute of the {body}
object, as 0
if the attribute is false, or 1
if it is true.
In addition to the standard arguments, it takes the following:
- width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
1
.
international
print $fmt->international();
This method formats the international launch designator from the {body}
object's TLE data.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any string_pseudo_units units are accepted; anything else will result in an exception. The default is
string
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
8
.
latitude
print $fmt->latitude();
This method formats the latitude of the {body}
object.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
4
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
8
.
list
print $fmt->list();
This method formats the object as specified by the list_formatter
argument when the object was initialized. It has no arguments of its own, but will pass through any arguments given to the methods it calls. See local_coord() below for details.
local_coord
print $fmt->local_coord();
This method formats the local coordinates as specified by the local_coordinates
argument when the object was initialized. It has no arguments of its own, but will pass through any arguments given to the methods it calls. You can pass arguments selectively by specifying them as a hash - for example $fmt->local_coord( title => { azimuth => 'azimuth', elevation => 'elevation', }, );
Scalar arguments will be passed to all called methods, except for append
, which will be appended to the entire formatted value.
longitude
print $fmt->longitude();
This method formats the longitude of the {body}
object.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
4
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
9
.
magnitude
print $fmt->magnitude();
This method formats the contents of {data}{magnitude}
, which generally represents the magnitude of an Iridium flare. If {magnitude}
is undefined but the body supports the magnitude()
method, the body time is set to the contents of {time}
, and then $body->magnitude( $station )
is called.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
1
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
4
.
maidenhead
print $fmt->maidenhead();
This method formats the Maidenhead Grid Locator position of the {body}
object.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the precision of the position, as the number of grid levels to provide. The default is half the width, truncated to an integer. If no specific width is provided, the default is
3
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
6
.
mean_anomaly
print $fmt->mean_anomaly();
This method formats the mean anomaly from the {body}
object's TLE data.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
4
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
9
.
mean_motion
print $fmt->mean_motion();
This method formats the mean motion from the {body}
object's TLE data. The units are actually angle per minute, but this formatter treats them as angle. That is, it will give you output in radians per minute if you so desire, but not in radians per second.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
10
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
12
.
mma
print $fmt->mma();
This method formats the contents of {mma}
, which generally indicates the flaring antenna for an Iridium flare.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any string_pseudo_units units are accepted; anything else will result in an exception. The default is
string
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
3
.
name
print $fmt->name();
This method formats the name of the {body}
object. If the name is missing and you specify missing => 'oid'
the OID will be displayed instead.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any string_pseudo_units units are accepted; anything else will result in an exception. The default is
string
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
24
.
oid
print $fmt->oid();
This method formats the OID of the {body}
object.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any string_pseudo_units units are accepted; anything else will result in an exception. The default is
string
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
6
.
operational
print $fmt->operational();
This method formats the operational status of the {body}
object. This is generally only available if the object represents an Iridium satellite.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any string_pseudo_units units are accepted; anything else will result in an exception. The default is
string
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
1
.
periapsis
print $fmt->periapsis();
This method formats the periapsis of the {body}
object's orbit.
In addition to the standard arguments, it takes the following:
- as_altitude
-
If this boolean argument is true (in the Perl sense) the value is given as altitude above the Earth's surface. If false, the value is given as distance from the Earth's center. The default is
1
. - places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
0
. - units
-
This argument specifies the units of the field. Any length units are accepted; anything else will result in an exception. The default is
kilometers
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
6
.
perigee
print $fmt->perigee();
This method formats the perigee of the {body}
object's orbit. Yes, this is the same as the periapsis.
In addition to the standard arguments, it takes the following:
- as_altitude
-
If this boolean argument is true (in the Perl sense) the value is given as altitude above the Earth's surface. If false, the value is given as distance from the Earth's center. The default is
1
. - places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
0
. - units
-
This argument specifies the units of the field. Any length units are accepted; anything else will result in an exception. The default is
kilometers
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
6
.
period
print $fmt->period();
This method formats the period of the {body}
object's orbit.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
0
. - units
-
This argument specifies the units of the field. Any duration units are accepted; anything else will result in an exception. The default is
composite
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
12
.
phase
print $fmt->phase();
This method formats the phase of the {body}
object. This is only available if that object supports the phase()
method.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
0
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
4
.
range
print $fmt->range();
This method formats the distance of the {body}
object from the {station}
object.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
1
. - units
-
This argument specifies the units of the field. Any length units are accepted; anything else will result in an exception. The default is
kilometers
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
10
.
revolutions_at_epoch
print $fmt->revolutions_at_epoch();
This method formats the revolutions at epoch from the {body}
object's TLE data.
In addition to the standard arguments, it takes the following:
- width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
6
.
right_ascension
print $fmt->right_ascension();
This method formats the right ascension of the {body}
object as seen from the {station}
object.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
0
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
right_ascension
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
8
.
second_derivative
print $fmt->second_derivative();
This method formats the second derivative from the {body}
object's TLE data. The units are actually angle per minute cubed, but this formatter treats them as angle. That is, it will give you output in radians per minute cubed if you so desire, but not in radians per second cubed.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
10
. - units
-
This argument specifies the units of the field. Any angle_units units are accepted; anything else will result in an exception. The default is
degrees
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
17
.
semimajor
print $fmt->semimajor();
This method formats the semimajor axis of the {body}
object's orbit, calculated using that object's semimajor()
method.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
0
. - units
-
This argument specifies the units of the field. Any length units are accepted; anything else will result in an exception. The default is
kilometers
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
6
.
semiminor
print $fmt->semiminor();
This method formats the semiminor axis of the {body}
object's orbit, calculated using that object's semiminor()
method.
In addition to the standard arguments, it takes the following:
- places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
0
. - units
-
This argument specifies the units of the field. Any length units are accepted; anything else will result in an exception. The default is
kilometers
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
6
.
status
print $fmt->status();
This method formats the contents of {status}
, which usually come from the Astro::App::Satpass2 position()
method.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any string_pseudo_units units are accepted; anything else will result in an exception. The default is
string
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
60
.
time
print $fmt->time();
This method formats the {time}
value using the time_format
template. This is intended to produce the time, without date information.
In addition to the standard arguments, it takes the following:
- delta
-
This argument specifies a number of seconds to add to the value before it is formatted. The default is
0
. - format
-
This argument specifies the format to use for formatting the value. The default is ...
- gmt
-
If this boolean argument is true, the value is formatted in GMT, regardless of how the time formatter is set up. If false, it is formatted according to the
time_formatter
's zone setting. The default is thetime_formatter
'sgmt
setting. - places
-
This argument specifies the number of decimal places in the field. Specify a non-numeric value if you do not wish to enforce a specific number of decimal places. The default is
5
. - units
-
This argument specifies the units of the field. Any time_units units are accepted; anything else will result in an exception. The default is
local
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
.
tle
print $fmt->tle();
This method formats the TLE data from the {body}
object. Unlike the other formatters, which produce a fixed-width string, this formatter produces a block of text, whatever is contained by the {body}
object's tle
attribute if any.
type
print $fmt->type();
This method formats the contents of {type}
. This usually comes from the flare()
method, and says whether the flare occurred in the am, day, or pm.
In addition to the standard arguments, it takes the following:
- units
-
This argument specifies the units of the field. Any string_pseudo_units units are accepted; anything else will result in an exception. The default is
string
. - width
-
This argument specifies the width of the field. Specify a non-numeric value if you do not wish to enforce a specific width. The default is
3
.
Title Control
Titles can consist of multiple lines, wrapped with Text::Wrap. The display is 'top-heavy', meaning that the column titles are justified to the top.
Nothing special needs to be done to get the first line, other than to initialize the object title => 1
. To get all the lines, you need to use a while
loop, calling more_title_lines()
in the test. When this returns false you must exit the loop, otherwise you loop infinitely.
is_valid_title_gravity
Returns a true value if the argument is a valid title gravity setting, and a false value otherwise. Can be called as a static method, or even a subroutine, though it is not exported.
more_title_lines
my $fmt = Astro::App::Satpass2::Format->new( title => 1 );
while ( $fmt->more_title_lines() ) {
print join( ' ',
$fmt->azimuth( title => 'Azimuth of object',
bearing => 2 ),
$fmt->elevation( title => 'Elevation of object' ),
), "\n";
}
This method returns true until there are no more lines of title to display. It also increments the internal line counter causing the next line of title to be displayed.
reset_title_lines
my $fmt->reset_title_lines();
This method resets the title line logic to its original state. You will not normally need to call this unless you want to display titles more than once and you have previously exited a more_title_lines()
loop prematurely.
Adding format effectors
add_formatter_method
$fmt->add_formatter_method( ... );
This experimental method takes as its arguments one or more Astro::App::Satpass2::FormatValue::Formatter objects, and makes them available for use in formatting values. An exception will be thrown if you try to replace an existing formatter, whether it is built-in or previously added with this method.
It is not anticipated that the user will need to call this directly. Instead the formatter object will call it on the user's behalf.
The whole idea of custom format effectors is highly experimental, and should be considered undocumented and subject to change without notice.
UNITS
Most of the format effectors format a quantity that is measured in some physical units; that is, kilometers, feet, seconds, or whatever. The units=
argument can be used to specify the displayed units for the field. This mechanism has been subverted in a couple cases to select among the representations of items that have more than one representation, even when the different representations are not, strictly speaking, physical units.
Each format effector that has physical units has an associated dimension, which determines which units are valid for it. The dimension specifies units, synonyms for canonical units, and the default units, though the individual format effector can have its own default (e.g. right_ascension).
Typically the default field widths and decimal places are appropriate for the default units, so if you specify different units you should probably specify the field width and decimal places as well.
The dimensions are:
almanac_pseudo_units
The first example is a case where the units mechanism was subverted to select among alternate representations, rather than to convert between physical units. The possible pseudo-units are:
description
= the text description of the event;
event
= the generic name of the event (e.g. 'horizon'
for rise or set);
detail
= the numeric event detail, whose meaning depends on the event (e.g. for 'horizon'
, 1
is rise and 0
is set).
The default is 'description'
.
angle_units
This dimension represents a geometric angle. The possible units are:
bearing
= a compass bearing;
decimal
= a synonym for degrees
;
degrees
= angle in decimal degrees;
radians
= angle in radians;
phase
= name of phase ('new', 'waxing crescent', and so on);
right_ascension
= angle in hours, minutes, and seconds of right ascension.
When the angle units are specified as units => 'bearing'
, the precision of the bearing is specified by the bearing
argument. That is, bearing => 1
gets you the cardinal points (N
, E
, S
and W
), bearing => 2
gets you the semi-cardinal points, and similarly for bearing => 3
. If bearing
is not specified it defaults to the same value as the width
argument, or 2
if no width is specified. The net result is that you need to specify the bearing
argument if you specify width => ''
and do not like the default of 2
. Yes, I could have equivocated on places
, but this seemed more straight forward.
The default is normally degrees, though this is overridden for right_ascension.
dimensionless
A few displayed quantities are simply numbers, having no associated physical dimension. These can be specified as:
percent
= display as a percentage value, without the trailing '%';
unity
= display unaltered.
The default is unity
.
duration
This dimension represents a span of time, such as an orbital period. The units are:
composite
= days hours:minutes:seconds.fraction;
days
= duration in days and fractions of days;
hours
= duration in hours and fractions of hours;
minutes
= duration in minutes and fractions of minutes;
seconds
= duration in seconds and fractions of seconds.
The default is composite
.
event_pseudo_units
Like almanac_pseudo_units, this is not a physical dimension, just a way of selecting different representations. The units are:
integer
= event number (see Astro::Coord::ECI::TLE);
localized
= localized event name;
string
= unlocalized event name.
The default is localized
.
length
This dimension represents lengths and distances. The possible units are:
feet
= US/British feet;
ft
= synonym for 'feet';
kilometers
= standard kilometers;
km
= synonym for kilometers;
meters
= standard meters;
m
= synonym for 'meters';
miles
= statute miles.
The default is kilometers
.
string_pseudo_units
Like almanac_pseudo_units, this is not a physical dimension, just a way of selecting different representations. The units are:
lower_case
= all lower case;
string
= the unmodified string;
title_case
= lower case, with initial letters upper case,
upper_case
= all upper case.
time_units
This dimension represents time. The possible units are:
days_since_epoch
= the number of days and fractions thereof since the epoch of the body (undefined if there is no epoch);
gmt
= GMT;
julian
= Julian day (implies GMT -- you may want to set the places
argument for this);
local
= local time (actually, whatever zone the time formatter is set to);
universal
= an alias for gmt
;
z
= an alias for gmt
;
zulu
= an alias for gmt
.
The default is local
.
SUPPORT
Support is by the author. Please file bug reports at https://rt.cpan.org/Public/Dist/Display.html?Name=Astro-App-Satpass2, https://github.com/trwyant/perl-Astro-App-Satpass2/issues, or in electronic mail to the author.
AUTHOR
Thomas R. Wyant, III wyant at cpan dot org
COPYRIGHT AND LICENSE
Copyright (C) 2010-2024 by Thomas R. Wyant, III
This program is free software; you can redistribute it and/or modify it under the same terms as Perl 5.10.0. For more details, see the full text of the licenses in the directory LICENSES.
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.