Jump to content

SimTX API/Data types

From SimTX Wiki

This page defines the types used by the SimTX API game protocol, version 25: how protobuf scalars appear on the wire, the conventions for ids, times and units, every enumeration, and the messages shared by several frames. Messages that belong to a single frame are described on that frame's page.

The authoritative definitions are the .proto files. Where this page and the files disagree, the files win.

Scalar types[edit | edit source]

Messages use standard protobuf 3 encoding. A field is a tag (a varint holding field number × 8 + wire type) followed by its value:

Proto type Wire type Encoding Python struct Used for
bool 0 (varint) 0 or 1 Flags
int32, int64 0 (varint) Two's complement as a varint. Negative values take 10 bytes. Counts, ids, Unix times
enum 0 (varint) The value's number Enumerations
fixed64 1 (64-bit) 8 bytes, little-endian, unsigned <Q IqBlock.sequence
double 1 (64-bit) IEEE 754 binary64, little-endian <d Positions, frequencies
float 5 (32-bit) IEEE 754 binary32, little-endian <f Levels, bandwidths, angles of antennas
string 2 (length-delimited) Varint length, then UTF-8 Names, callsigns, string enumerations
bytes 2 (length-delimited) Varint length, then raw bytes UUIDs, sample payloads
message 2 (length-delimited) Varint length, then the encoded message Nested messages
repeated float 2 (length-delimited) Packed: varint length, then the values back to back <nf Sample blocks, rasters
  • Zero values are omitted. In proto3 a field holding its default (0, false, empty) is not written, and a missing field reads as its default. A decoder cannot tell an absent field from an explicit default: an absent state reads as 0, SESSION_STATE_UNSPECIFIED.
  • Presence. Fields marked optional (for example ReceiverStart.noise_figure_db, the TxImperfections knobs, every TxUpdate value) do record whether they were set. Unset means "use the default", which is not the same as 0.
  • Floats must be finite. Unless a field says otherwise, NaN and infinity in a request are refused.

Conventions[edit | edit source]

What Convention
UUIDs 16 bytes in a bytes field, big-endian, most significant half first: the 16 bytes of the canonical form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx in order. Empty means "none". Station, antenna, rig, session, account and satellite ids all use this form. In Python, uuid.UUID(bytes=value).
Times Fields ending in _ms are Unix milliseconds (UTC). *_epoch_seconds and *_nanos pairs give nanosecond precision. Durations end in _seconds, _ms or _nanos.
Frequencies Hz. Carrier and centre frequencies are double; bandwidths and audio frequencies are float.
Angles Degrees. Azimuth from true north through east.
Positions Latitude −90 to 90 (north positive), longitude −180 to 180 (east positive). Heights in metres.
Units Every other quantity carries its unit in the field name: _db, _watts, _meters, _km, _mps, _rpm and so on.
Sample bytes The IQ samples inside IqBlock.samples and SampleBlock.compact_iq.samples are big-endian int16 or int8, unlike protobuf's own little-endian scalars.
Request ids Requests carry an int64 request_id chosen by the client, echoed in the response or in an Error. Use nonzero values; 0 in an Error means the whole connection.
Callsigns Trimmed of surrounding whitespace; 1 to 64 printable characters. SimTX does not check callsigns against any licensing database.

Enumerations[edit | edit source]

Proto enums travel as their number. An omitted enum field reads as 0, and the value 0 never grants or asserts anything:

  • Most enums start with an *_UNSPECIFIED = 0 value. Where the field is required (Role, SessionState, IpModerationAction, and StationKind wherever a persistent station is meant), decoders refuse 0.
  • A few have a real value at 0, the default: AuthKind ANONYMOUS, AntennaMount FIXED, PointingMode FIXED, SpinAxis ORBIT_NORMAL, StationKind ADHOC, StationVisibility UNLISTED, SampleFormat INT16, BannerLevel INFO.
  • A reader that receives a value it does not know keeps the number and treats it as unknown, as each table below says.

Role[edit | edit source]

Value Name Meaning
0 ROLE_UNSPECIFIED Refused.
1 ROLE_RECEIVER Receiver: an IQ stream. Anonymous for ad-hoc sites; a receiver ticket for station-bound ones.
2 ROLE_TX_AUDIO Transmitter whose samples the client streams. Ticket tx-audio, permission game.transmit.
3 ROLE_TX_GENERATED Transmitter whose source the server generates. Ticket tx-generated, permission game.transmit.
4 ROLE_CONTROL Control: station list, maps, health, catalog, ephemeris, passes, own-transmitter monitor. Anonymous, or ticket control.
5 ROLE_MODERATION Moderation. Ticket moderation, permission moderation.manage.

AuthKind[edit | edit source]

Value Name Meaning
0 AUTH_KIND_ANONYMOUS No credential. An anonymous hello that carries a credential is refused.
1 AUTH_KIND_GAME_TICKET credential holds a game ticket.

HelloStatus[edit | edit source]

Value Name Meaning
0 HELLO_STATUS_UNSPECIFIED Not sent by servers. Treat it, and unknown values, as SERVER_UNAVAILABLE.
1 HELLO_STATUS_ACCEPTED The session may begin.
2 HELLO_STATUS_VERSION_UNSUPPORTED The preface version is not 25.
3 HELLO_STATUS_AUTHENTICATION_REQUIRED The role needs a ticket and none was sent. Typical message: This role requires a SimTX account.
4 HELLO_STATUS_CREDENTIAL_INVALID The ticket is unknown, expired, used, or minted for another server or role. Typical message: Game ticket is invalid or expired.
5 HELLO_STATUS_ACCOUNT_RESTRICTED The account is restricted.
6 HELLO_STATUS_ROLE_FORBIDDEN The account lacks the permission the role needs. Typical message: Account is not permitted to transmit.
7 HELLO_STATUS_SERVER_UNAVAILABLE The server cannot verify the ticket or take the connection now. The only status worth retrying unchanged.
8 HELLO_STATUS_IP_BANNED The client address is banned. The message gives the reason.

ErrorCode[edit | edit source]

Value Name Meaning
0 ERROR_CODE_UNSPECIFIED No specific code: an ENDED session that simply ended. Also how to treat unknown codes.
1 ERROR_CODE_INVALID_REQUEST Malformed or out-of-range request, or a frame not allowed in this session.
2 ERROR_CODE_UNAUTHENTICATED Needs an account or a valid ticket.
3 ERROR_CODE_FORBIDDEN Not allowed, or the ticket's station binding does not match the request.
4 ERROR_CODE_NOT_FOUND Unknown station, satellite, session or catalog entry.
5 ERROR_CODE_LIMIT_REACHED Server, address, account or station capacity reached.
6 ERROR_CODE_RATE_LIMITED Too many requests.
7 ERROR_CODE_UNAVAILABLE Transient condition: disabled, busy or not reachable.
8 ERROR_CODE_STATION_INACTIVE The station is deleted or deorbited, or the satellite has reentered.
9 ERROR_CODE_STATION_REQUIRED Ad-hoc transmitter refused; bind one of your stations.
10 ERROR_CODE_INTERNAL Server fault.
11 ERROR_CODE_CANCELLED Superseded by a newer request of the same kind (coverage maps).

SessionState[edit | edit source]

Value Name Meaning
0 SESSION_STATE_UNSPECIFIED Never sent. Decoders refuse it.
1 SESSION_STATE_BOUND Start accepted. TxQueue / TxAccept or IqStreamDescriptor follow.
2 SESSION_STATE_REJECTED Start refused. code and reason say why; the connection closes.
3 SESSION_STATE_ENDED Ended by the server: kick, ban, station deleted, reentry, access revoked. The connection closes.
4 SESSION_STATE_UPDATED The session keeps running with a changed state; see update_reason.

UpdateReason[edit | edit source]

Value Name Meaning
0 UPDATE_REASON_UNSPECIFIED Not an UPDATED status. On an UPDATED status: apply the snapshot fields.
1 UPDATE_REASON_POINTING This session's AntennaPointingUpdate was applied (request_id).
2 UPDATE_REASON_TRACKING The server changed tracking, for example because the target was deleted or reentered.
3 UPDATE_REASON_STATION_EDIT The station, its antenna or its rig was edited; revisions are bumped.
4 UPDATE_REASON_ORBIT_CHANGE The bound satellite's elements or attitude changed.
5 UPDATE_REASON_DEORBIT_SCHEDULED The bound satellite fired its deorbit burn; station.core.deorbit says when it reenters.
6 UPDATE_REASON_RETUNE This session's ReceiverRetune took effect (request_id).

SampleFormat[edit | edit source]

Value Name Meaning
0 SAMPLE_FORMAT_INT16 Big-endian int16 components; divide by 32767. The default.
1 SAMPLE_FORMAT_INT8 int8 components; divide by 127.

TxLiveField[edit | edit source]

Value Name Meaning
0 TX_LIVE_FIELD_UNSPECIFIED In a TxUpdateAck result, like an unknown value: a field this client does not know. Ignore that result.
1 TX_LIVE_FIELD_FREQUENCY frequency_hz
2 TX_LIVE_FIELD_POWER power_watts
3 TX_LIVE_FIELD_BANDWIDTH bandwidth_hz
4 TX_LIVE_FIELD_LOW_CUT audio_low_cut_hz
5 TX_LIVE_FIELD_FINAL_DRIVE final_drive_db
6 TX_LIVE_FIELD_PA_HEADROOM pa_headroom_db
7 TX_LIVE_FIELD_AUDIO_COMPRESSION audio_compression_db
8 TX_LIVE_FIELD_AUDIO_GAIN audio_gain

AntennaMount[edit | edit source]

Value Name Meaning
0 ANTENNA_MOUNT_FIXED No rotator. The default.
1 ANTENNA_MOUNT_AZ Azimuth rotator. Elevation stays at the pointing's elevation.
2 ANTENNA_MOUNT_AZEL Azimuth and elevation rotator.

PointingMode[edit | edit source]

Value Name Meaning
0 POINTING_MODE_FIXED Hold the given azimuth and elevation. The default.
1 POINTING_MODE_TRACK Follow a target station.

SpinAxis[edit | edit source]

Value Name Meaning
0 SPIN_AXIS_ORBIT_NORMAL Spin about the orbit normal. The default.
1 SPIN_AXIS_NADIR Spin about the nadir direction.
2 SPIN_AXIS_VELOCITY Spin about the along-track direction.

StationKind[edit | edit source]

Value Name Meaning
0 STATION_KIND_ADHOC No persistent station. Only in StationList entries; refused wherever a persistent station is meant.
1 STATION_KIND_GROUND Ground station.
2 STATION_KIND_SATELLITE User-launched satellite.

StationVisibility[edit | edit source]

Value Name Meaning
0 STATION_VISIBILITY_UNLISTED Private. Other accounts see only the callsign, as an ad-hoc-style entry. The default.
1 STATION_VISIBILITY_PUBLIC Listed with id and placement; any signed-in account may receive through it.

SessionRole[edit | edit source]

Value Name Meaning
0 SESSION_ROLE_UNSPECIFIED Unknown role; show the session without one.
1 SESSION_ROLE_TX Transmitter.
2 SESSION_ROLE_RX Receiver.

BannerLevel[edit | edit source]

Value Name Meaning
0 BANNER_LEVEL_INFO Information. The default; also how to show unknown levels.
1 BANNER_LEVEL_BAN_NOTICE Sent to control sessions of an address that has just been banned. The text explains the ban.

IpModerationAction[edit | edit source]

Value Name Meaning
0 IP_MODERATION_ACTION_UNSPECIFIED Refused, so an omitted action never bans.
1 IP_MODERATION_ACTION_UNBAN Lift a ban.
2 IP_MODERATION_ACTION_BAN Ban an address.

String enumerations[edit | edit source]

Modulations, sources, antenna types, weather layers, duct types and catalog types travel as upper-case ASCII names in string fields and are compared exactly. Servers may add names without a schema change. A server that does not know a name refuses the request with Error or SessionStatus INVALID_REQUEST naming the value. Clients accept names they do not know in server messages and display them as they are.

Modulation[edit | edit source]

Used by TransmitterStart.modulation, CoverageMapRequest.modulation, LiveSession.modulation (empty for receivers), TransmitterHealth.modulation and TransmitterImpact.modulation.

Name Description Typical bandwidth
AM_DSB_FC AM, double sideband, full carrier 10 kHz
AM_DSB_SC AM, double sideband, suppressed carrier 6 kHz
USB Upper sideband 2.7 kHz
LSB Lower sideband 2.7 kHz
CW Continuous wave (Morse) 150 Hz
NFM Narrow FM 12.5 kHz
WFM Wide FM 180 kHz
IQ External complex baseband supplied by the client As declared
WSPR Weak Signal Propagation Reporter 6 Hz
FT8 FT8 50 Hz

See Modulation Modes for how each mode behaves on air.

Source type[edit | edit source]

Used by TransmitterStart.source_type and TransmitterHealth.source_type.

Name Meaning
AUDIO_STREAM Mono audio streamed by the client, for example a file or a network stream.
MICROPHONE Mono audio from a microphone. Identical to AUDIO_STREAM on the wire.
WHITE_NOISE Generated by the server. Only valid for ROLE_TX_GENERATED.
PIPEWIRE Mono audio from a desktop audio graph. Identical to AUDIO_STREAM on the wire.
GNU_RADIO_IQ Complex baseband streamed by the client. Use with modulation IQ.

The three audio types differ only in how they are labelled. A third-party client normally uses AUDIO_STREAM or GNU_RADIO_IQ.

Antenna types[edit | edit source]

Used by AntennaConfig.type.

Name Antenna Notes
DIPOLE Half-wave dipole See Dipole Antenna.
VERTICAL Vertical monopole over ground See Vertical Antenna.
YAGI_3EL Three-element Yagi See Yagi Antenna.
YAGI_5EL Five-element Yagi See Yagi Antenna.
LOOP Full-wave loop See Full-Wave Loop Antenna.
BEVERAGE Beverage receiving antenna See Beverage Antenna.
LONGWIRE Long wire See Longwire Antenna.
INVERTED_V Inverted-V dipole See Inverted-V Antenna.
EFHW_32M_49_1 End-fed half-wave, 32 m, 49:1 transformer See End-Fed Half-Wave Antenna.
MONOPOLE Monopole Satellite type; free space.
TURNSTILE Turnstile (crossed dipoles), circular polarisation Satellite and ground station type.
CROSSED_YAGI Crossed Yagi, circular polarisation Steerable ground station type.
HELIX Axial-mode helix, circular polarisation Steerable ground station and satellite type.

Satellite antennas are modelled in free space. A NEC deck in nec_deck replaces any template.

Weather type[edit | edit source]

Used by WeatherMapRequest.type and WeatherMapResponse.type.

Name Quantity Unit
DUCT_STRENGTH Strength of the strongest tropospheric duct; 0 where there is none M-units
RAIN_RATE Rain rate mm/h
CLOUD_WATER Cloud liquid water content g/m³
SURFACE_TEMPERATURE Air temperature at the surface °C
LIGHTNING_RATE Lightning flash rate flashes/min

Duct type[edit | edit source]

Used by WeatherMapResponse.duct_type.

Name Meaning
NONE No duct.
SURFACE Surface duct.
ELEVATED Elevated duct.

Catalog type[edit | edit source]

Used by CatalogEntrySummary.types.

Name Display name
MODULATION Modulation
AUDIO_ADDON Audio add-on
THEME Theme
ACTION Tool / action
LIBRARY Library
PRESET Preset

Shared messages[edit | edit source]

GeoPoint[edit | edit source]

A geographic position.

message GeoPoint {
  double latitude_deg = 1;
  double longitude_deg = 2;
  double altitude_meters = 3;
}
# Field Type Description
1 latitude_deg double Latitude in degrees, −90 to 90. North is positive.
2 longitude_deg double Longitude in degrees, −180 to 180. East is positive.
3 altitude_meters double Height in metres. For a ground site, the height of the ground at the site; the antenna height is separate (AntennaConfig.height_meters). For a sub-satellite point or an ephemeris sample, the height above the 6,371 km reference sphere.

AntennaConfig[edit | edit source]

An antenna: a built-in type or a NEC-2 deck, with its height, bearing, feed line loss and, for steerable antennas, its pointing.

message AntennaConfig {
  string type = 1;              // antenna type (string enum, see the top of this file)
  float height_meters = 2;
  float azimuth_deg = 3;
  float feedline_loss_db = 4;
  float wire_length_meters = 5;
  // NEC-2 card deck (UTF-8, <= 262144 bytes). Empty = built-in template for `type`.
  string nec_deck = 6;
  AntennaPointing pointing = 7;
}
# Field Type Description
1 type string Antenna type name, for example DIPOLE. Required, also when nec_deck is set.
2 height_meters float Height of the antenna above ground in metres, ≥ 0. Satellite antennas use 0.
3 azimuth_deg float Bearing of the main lobe, or of the wire, in degrees from true north.
4 feedline_loss_db float Feed line loss in dB, ≥ 0.
5 wire_length_meters float Wire or element length in metres, ≥ 0. 0 sizes the built-in template for the operating frequency.
6 nec_deck string NEC-2 card deck in UTF-8, at most 262,144 bytes. Empty selects the built-in template for type. A deck replaces the template: the server solves the geometry itself. Satellite antennas are in free space, so their decks must not contain a GN card. See NEC File Import.
7 pointing AntennaPointing Pointing of a steerable antenna. In a BoundStation, the antenna's stored default pointing. Unset for a FIXED mount.

When nec_deck is not empty it replaces the built-in antenna model: the server solves the geometry itself and derives the feed-point impedance, SWR and radiation pattern. The type field must still contain a valid name. Supported cards and limits are described in NEC File Import. There is no way to upload a precomputed radiation pattern.

AntennaPointing[edit | edit source]

The pointing of a steerable antenna. See SimTX API/Tracking and pointing.

message AntennaPointing {
  AntennaMount mount = 1;
  PointingMode mode = 2;
  float azimuth_deg = 3;
  float elevation_deg = 4;
  bytes target_station_id = 5;
  float azimuth_rate_deg_per_sec = 6;
  float elevation_rate_deg_per_sec = 7;
}
# Field Type Description
1 mount AntennaMount Rotator fitted to the antenna. A FIXED mount has no pointing; the other fields are then unused.
2 mode PointingMode FIXED: hold azimuth_deg / elevation_deg. TRACK: follow target_station_id.
3 azimuth_deg float Azimuth in degrees from true north through east. In TRACK mode, the park position the rotator starts from.
4 elevation_deg float Elevation above the horizon in degrees. An AZ mount keeps this elevation in every mode.
5 target_station_id bytes TRACK mode: 16-byte UUID of the station to follow, usually a satellite. Empty in FIXED mode.
6 azimuth_rate_deg_per_sec float Rotator slew rate in azimuth, °/s. 0 selects the default: 6 °/s on an AZEL mount, 3 °/s on an AZ mount.
7 elevation_rate_deg_per_sec float Rotator slew rate in elevation, °/s. 0 selects the default of 4 °/s.

AntennaAim[edit | edit source]

Where a session's antenna points when the session starts: ReceiverStart.aim and TransmitterStart.aim. Unset means the antenna's stored heading. A FIXED mount ignores it, and an AZ mount ignores the elevation; the pointing of SessionStatus BOUND reports the pointing in effect. With tracking.point_antenna set, the aim is the rotator's position when the session starts, and it slews from there towards the target.

message AntennaAim {
  float azimuth_deg = 1;
  float elevation_deg = 2;
}
# Field Type Description
1 azimuth_deg float Azimuth in degrees from true north through east. Finite; normalised to 0 to 360.
2 elevation_deg float Elevation in degrees, −90 to 90. Ignored by an AZ mount.

SessionSite[edit | edit source]

Where a session, or a coverage prediction, sits: one of the account's persistent stations, or an inline ad-hoc site. Used by ReceiverStart, TransmitterStart and CoverageMapRequest. Exactly one member must be set; a site with neither is refused.

message SessionSite {
  oneof site {
    StationBinding station = 1;   // one of your persistent stations; needs a game ticket
    AdhocStation adhoc = 2;       // inline site; anonymous OK (TX: see the ad-hoc policy)
  }
}
# Field Type Description
1 station StationBinding Member of oneof site. One of your persistent stations, or a PUBLIC station of another account for a receiver. Needs a game ticket minted for it.
2 adhoc AdhocStation Member of oneof site. An inline site. Receivers may use it anonymously; transmitters only under the ad-hoc policy.

StationBinding[edit | edit source]

Which persistent station, antenna and rig a session uses. The binding must match the game ticket of the connection. See Binding a session.

message StationBinding {
  bytes station_id = 1;
  bytes antenna_id = 2;   // empty = the station's first antenna
  bytes rig_id = 3;       // empty = the station's first rig (by ordinal); rig-less only when it has no rig
}
# Field Type Description
1 station_id bytes 16-byte UUID of the station. Must be the station the game ticket was minted for.
2 antenna_id bytes 16-byte UUID of the antenna. Empty: the station's first antenna, or the antenna the ticket was minted for if its request named one.
3 rig_id bytes 16-byte UUID of the rig. Empty: the station's first rig by ordinal, or the rig the ticket was minted for if its request named one. The session is rig-less only when the station has no rig.

AdhocStation[edit | edit source]

An inline station for anonymous and ad-hoc sessions.

message AdhocStation {
  string callsign = 1;
  GeoPoint location = 2;
  AntennaConfig antenna = 3;
}
# Field Type Description
1 callsign string Callsign shown in station lists. Trimmed; 1 to 64 printable characters.
2 location GeoPoint Site of the station. Required.
3 antenna AntennaConfig Antenna. Required.

Tracking[edit | edit source]

Follow a target station, usually a satellite, with the antenna and with Doppler correction. See SimTX API/Tracking and pointing.

message Tracking {
  bytes target_station_id = 1;
  bool point_antenna = 2;     // drive the antenna's rotator toward the target
  bool doppler_correct = 3;   // RX: shift tuning by the target's Doppler; TX: pre-correct so it arrives on frequency
  // Simulation time at which the rotator began slewing toward this target (point_antenna only; both 0 =
  // not known). Servers set it in SessionStatus; with the antenna's slew rate it gives the rotator position.
  // Ignored in a client's start or AntennaPointingUpdate.
  int64 since_epoch_seconds = 4;
  int32 since_nanos = 5;
}
# Field Type Description
1 target_station_id bytes 16-byte UUID of the station to track, usually a satellite.
2 point_antenna bool Drive the antenna's rotator towards the target. Needs an AZ or AZEL mount.
3 doppler_correct bool Receiver: shift the tuning by the target's Doppler. Transmitter: pre-correct the carrier so that the signal arrives on frequency at the target.
4 since_epoch_seconds int64 Simulation time at which the rotator began slewing towards this target, Unix seconds (point_antenna only). Set by servers in SessionStatus BOUND and UPDATED; with the antenna's slew rates it gives the rotator's position for display. Clients leave it unset; servers ignore it in a client's start or AntennaPointingUpdate. 0 together with since_nanos 0: not known.
5 since_nanos int32 Nanoseconds added to since_epoch_seconds.

StationCore[edit | edit source]

The fields every view of a persistent station shares. Embedded as core by BoundStation (in session status) and by Station (in the station list).

message StationCore {
  bytes station_id = 1;          // empty only for ad-hoc StationList entries
  int64 revision = 2;            // bumped on every edit of the station
  StationKind kind = 3;
  string name = 4;
  string callsign = 5;
  string owner_handle = 6;
  StationVisibility visibility = 7;
  GeoPoint location = 8;         // ground: the site; satellite: the sub-satellite point (see the embedding message)
  OrbitalElements orbit = 9;     // satellites
  Attitude attitude = 10;        // satellites
  Deorbit deorbit = 11;          // satellites with a deorbit burn scheduled or done
}
# Field Type Description
1 station_id bytes 16-byte station UUID. Empty only for the ad-hoc entries of a StationList.
2 revision int64 Station revision. Bumped on every edit of the station.
3 kind StationKind GROUND or SATELLITE; ADHOC only in a StationList.
4 name string Station name, 1 to 64 characters.
5 callsign string Callsign, 1 to 64 characters.
6 owner_handle string Handle of the account that owns the station. Empty for ad-hoc entries.
7 visibility StationVisibility PUBLIC or UNLISTED.
8 location GeoPoint Ground: the station site. Satellite: the sub-satellite point at the time the containing message was captured.
9 orbit OrbitalElements Satellites: the current element set. After a deorbit burn, the post-burn elements.
10 attitude Attitude Satellites: the attitude law.
11 deorbit Deorbit Satellites whose deorbit burn has fired. Unset otherwise.

BoundStation[edit | edit source]

The station a session is attached to, as the server resolved it. Sent in SessionStatus BOUND, and in UPDATED when the station changed. core.kind is GROUND or SATELLITE. core.location is the site of a ground station, or the sub-satellite point when the status was sent.

message BoundStation {
  StationCore core = 1;
  bytes antenna_id = 2;
  int64 antenna_revision = 3;
  bytes rig_id = 4;                // empty = rig-less (the station has no rig)
  int64 rig_revision = 5;
  float pa_cap_watts = 6;          // effective PA cap; 0 = uncapped
  AntennaConfig antenna = 7;       // pointing = the antenna's default pointing
}
# Field Type Description
1 core StationCore The station: id, revision, kind, name, callsign, owner, visibility, placement and deorbit state. kind is GROUND or SATELLITE; decoders refuse ADHOC here.
2 antenna_id bytes 16-byte UUID of the bound antenna.
3 antenna_revision int64 Revision of the bound antenna.
4 rig_id bytes 16-byte UUID of the bound rig. Empty: no rig.
5 rig_revision int64 Revision of the bound rig; 0 without a rig.
6 pa_cap_watts float Effective PA cap in watts: the smaller of the rig's cap and the account's tx.pa_limit. 0 = uncapped.
7 antenna AntennaConfig The bound antenna as the server models it. pointing is the antenna's stored default.

OrbitalElements[edit | edit source]

The mean orbital elements of a satellite in the simtx-j2-v1 model. See Orbit model.

message OrbitalElements {
  string model = 1;            // "simtx-j2-v1"
  int64 epoch_seconds = 2;     // Unix seconds of the element epoch
  int32 epoch_nanos = 3;
  double semi_major_axis_km = 4;
  double eccentricity = 5;
  double inclination_deg = 6;
  double raan_deg = 7;
  double argument_of_perigee_deg = 8;
  double mean_anomaly_deg = 9;
}
# Field Type Description
1 model string Orbit model. Always simtx-j2-v1; see Orbit model.
2 epoch_seconds int64 Element epoch, Unix seconds. Set by the account service to the launch instant, or to the burn time after a deorbit burn.
3 epoch_nanos int32 Nanoseconds added to epoch_seconds, 0 to 999,999,999.
4 semi_major_axis_km double Mean semi-major axis a in km.
5 eccentricity double Mean eccentricity e, 0 ≤ e < 1.
6 inclination_deg double Mean inclination i in degrees, 0 to 180.
7 raan_deg double Right ascension of the ascending node Ω at the epoch, degrees.
8 argument_of_perigee_deg double Argument of perigee ω at the epoch, degrees.
9 mean_anomaly_deg double Mean anomaly M0 at the epoch, degrees.

Attitude[edit | edit source]

How a satellite's body is oriented. No mode set means nadir pointing with yaw 0. The frames are defined on Satellites.

message Attitude {
  message Nadir { double yaw_deg = 1; }
  message Inertial { double right_ascension_deg = 1; double declination_deg = 2; double roll_deg = 3; }
  message Spin { SpinAxis axis = 1; double rate_rpm = 2; double phase_deg = 3; }
  oneof mode {
    Nadir nadir = 1;
    Inertial inertial = 2;
    Spin spin = 3;
  }
}
# Field Type Description
1 nadir Nadir Member of oneof mode. Nadir pointing with a yaw angle.
2 inertial Inertial Member of oneof mode. The body z axis held fixed in the inertial frame.
3 spin Spin Member of oneof mode. Spin about an axis of the orbiting frame.

Nadir

# Field Type Description
1 yaw_deg double Rotation about the body z axis (nadir), degrees.

Inertial

# Field Type Description
1 right_ascension_deg double Right ascension α of the body z axis, degrees.
2 declination_deg double Declination δ of the body z axis, degrees, −90 to 90.
3 roll_deg double Rotation about the body z axis, degrees. At 0 the body x axis points towards increasing right ascension.

Spin

# Field Type Description
1 axis SpinAxis Spin axis in the orbiting frame. 0 = ORBIT_NORMAL.
2 rate_rpm double Spin rate in revolutions per minute, 0 to 60, relative to the orbiting frame.
3 phase_deg double Spin phase φ0 at the orbit epoch, degrees.

Deorbit[edit | edit source]

The deorbit burn of a satellite, once it has fired. See Deorbit.

message Deorbit {
  int64 burn_at_ms = 1;
  int64 reentry_at_ms = 2;
  GeoPoint reentry_point = 3;
  double delta_v_mps = 4;
}
# Field Type Description
1 burn_at_ms int64 When the retrograde burn fired, Unix ms.
2 reentry_at_ms int64 When the satellite reaches 80 km and burns up, Unix ms. Its sessions end at this time.
3 reentry_point GeoPoint Sub-satellite point at reentry_at_ms; altitude_meters is 80,000.
4 delta_v_mps double Velocity change of the burn, m/s.

TxImperfections[edit | edit source]

The fifteen transmitter imperfection knobs of TransmitterStart. Every knob is optional; an unset knob takes the bound rig's value, or the generic HF preset without a rig. They are rendered in-band, around the carrier. Advanced Transmitter Settings explains what each one does.

message TxImperfections {
  optional float final_drive_db = 1;
  optional float pa_headroom_db = 2;
  optional float audio_compression_db = 3;
  optional float pa_softness = 4;
  optional float pa_am_pm_deg = 5;
  optional float carrier_leak_db = 6;
  optional float opposite_sideband_suppression_db = 7;
  optional float frequency_offset_hz = 8;
  optional float mains_hum_db = 9;
  optional float mains_hum_hz = 10;
  optional float am_modulation_index = 11;
  optional float pa_supply_sag_db = 12;
  optional float tx_noise_floor_db = 13;
  optional float oscillator_phase_noise_db = 14;
  optional float cw_key_rise_ms = 15;
}
# Field Type Description
1 final_drive_db optional float Drive level into the final amplifier, dB. −40 to 40; generic default 0.
2 pa_headroom_db optional float Amplifier headroom above the nominal output, dB. 0.1 to 40; default 12.
3 audio_compression_db optional float Audio compression, dB. 0 to 30; default 1.5.
4 pa_softness optional float Softness of the amplifier's saturation curve. 0.5 to 10; default 2.8.
5 pa_am_pm_deg optional float AM-to-PM conversion at saturation, degrees. 0 to 45; default 6.
6 carrier_leak_db optional float Carrier suppression, dB below the carrier. 0 to 120; default 60.
7 opposite_sideband_suppression_db optional float Suppression of the unwanted sideband, dB. 0 to 120; default 60.
8 frequency_offset_hz optional float Frequency error, Hz; the RF frequency is frequency_hz + offset. −10,000 to 10,000; default 0.
9 mains_hum_db optional float Mains hum level, dB down. 0 to 120; default 120.
10 mains_hum_hz optional float Mains hum frequency, Hz. 0 to 400; default 0.
11 am_modulation_index optional float AM modulation index. 0 to 1.2; default 0.85.
12 pa_supply_sag_db optional float Supply sag under load, dB. 0 to 30; default 0.
13 tx_noise_floor_db optional float Broadband transmitter noise, dB down. 0 to 160; default 120.
14 oscillator_phase_noise_db optional float Oscillator phase noise, dB down. 0 to 160; default 120.
15 cw_key_rise_ms optional float CW keying rise time, ms. 0 to 50; default 5.

CatalogFile[edit | edit source]

One file of an extension catalog entry. Used by CatalogEntry and CatalogUpload.

message CatalogFile {
  string path = 1;
  string content = 2;
}
# Field Type Description
1 path string Relative path, at most 128 characters, / separators, no empty, . or .. segments.
2 content string Full text of the file, at most 60,000 bytes of UTF-8.
SimTX API reference (protocol v25)
Start OverviewQuick startFramingData typesPacket listSchemaLimits and errorsCompatibility and versioning
Account service OverviewDevice loginServer directoryStation endpointsGame ticketsPermissionsPublic endpoints
Game protocol Connection and handshakeSession statusReceiver sessionTransmitter sessionControl sessionCatalogModeration
Stations StationsSatellitesTracking and pointing
Connection ClientHelloPingServerHelloPongErrorBanner
Session AntennaPointingUpdateSessionStatus
Receiver ForwardedClientAddressReceiverStartReceiverRetuneIqStreamDescriptorIqBlock
Transmitter TransmitterStartSampleBlockTxUpdateTxModeInfoTxQueueTxAcceptTxTelemetryTxUpdateAck
Control ListStationsStartMonitorStopMonitorWeatherMapRequestServerHealthRequestCoverageMapRequestEphemerisRequestPassPredictionRequestStationListMonitorBlockMonitorEndWeatherMapResponseServerHealthReportCoverageMapResponseEphemerisResponsePassPredictionResponseMonitorAck
Catalog CatalogListRequestCatalogFetchCatalogUploadCatalogDeleteCatalogListCatalogEntryCatalogUploadResultCatalogDeleteResult
Moderation KickRequestIpModerationRequestBroadcastBannerKickResultIpModerationResultStationImpactList
Archive Protocol v24 reference