SEDSAT-1 “Heartbeat” Telemetry Specification

Reference:
http://www.seds.org/sedsat

Contacts:
Chris Bond Chris_Bond@usa.net
Chris Lewicki chrisl@seds.org

This is the specification for the data transmitted during SEDSAT-1 “heartbeats” for the “default” software on the EPROMS aboard SEDSAT-1. By default, this telemetry is sent out every 10 seconds if the satellite is at 90% charge-level, every 20 seconds if above 50% charge level, every 30 seconds if above 15% charge level, and every 60 seconds if below  15% charge level.  Actual results may vary, as we’ve seen in operation, so most of the time you’ll probably see packets every minute (or less).

Each telemetry value gets it's own little wrapper. This adds a few bytes overhead, but also allows for decoding of individual values (so, should we want to, we could send only partial "Packets" - useful if someone wants a particular value, or if some values are sent more often than others; Didn't use it in the PROM code, though, because the transmitter costs too much power.)

The general format for each packet is:
1)	A '5' (0x05), a nice, non-ascii, unlikely-to-show-up-anywhere-else number.
2)	Packet length (2 bytes, Little-Endian. Just memcopy to a short unsigned int). It should be made clear here that the “packet length” does not include the “0x05” or the packet length itself.  It contains the packet identifier (step 3) and the data in step 4.

3)	One of the following numbers (packet identifier):
        
AMPSINBAT 	0	
MAINCURRENT 	1	
MAINVOLTAGE 	2	
IMAGENUM 	3	
TEMPS 	4	
PANELS 	5	
SEASISBOOT 	6	
CDSBOOT 	7	
FILTERCURRENT 	8	
POWERMODE 	9	
MODELSTATE 	10	
MODEASTATE 	11	
CAMERASTATE 	12	
SEASISSTATE 	13	
RESETCOUNT 	14	
PANELSTATE 	15	

Note that not all of these are used (filtercurrent was redundant, and powermode... well, I'm not sure why I didn't use that). If one of these numbers is not found, it is not a valid packet. Go back to step one and look for the next beginning-of-packet symbol.

4)	The actual data. If its not temperature or solar panel arrays, it will be a single value, otherwise, an array as described below. After this data, the stream may end, or start over again at step 1.

Some things to know:
    The temps are in an array of chars, and are in the following order:
        
Temps(0)	battery 1	
Temps(1)	battery 2	
Temps(2)	CDC DC/DC	
Temps(3)	MODE-L DC/DC	
Temps(4)	EMP	
Temps(5)	MB DC/DC	
Temps(6)	Deployer 1	
Temps(7)	Deployer 2	
Temps(8)	(empty)	
Temps(9)	Mode-L Power Amp	

    The Panels are in an array of long ints, and are in the following order:

SolarPanels(0)	+X	
SolarPanels(1)	+Y	
SolarPanels(2)	+Z	
SolarPanels(3)	-X	
SolarPanels(4)	-Y	

So, a typical packet looks something like (in hex):

0x05	0x0200	0x02	0x2B54	

This packet indicates that the main voltage (value 2) is at a value of 21547mV (don’t forget the byte swap).

A good packet struct to use for collecting all this is:

 typedef struct SensorPacket_s {
  char Temps[10];
  long MainVoltage;
  long MainCurrent;
  long FilterCurrent;
  long AmpsInBat;
  long SolarPanels[5];

  char MODEL;
  char MODEA;
  char ANTDEPLOYER;
  char ANTDEPLOYED;
  char CAMERAS;
  char SEASIS;
  char PANEL;

  char ResetCount;

  int PowerMode;
  int SeasisBoot;
  int CDSBoot;
  int Images;
 } SensorPacket;

All these values are assumed “signed” with the exception of the 8-bit integers (chars) which are signed.

Along with this packetized data, there is also other embedded data.  Before each packet, an “Uptime” string is sent, which indicates the amount of time since the last spacecraft boot.  This is in the format:
“Uptime is 000/13:10:00” (days/hours:minutes:seconds) and is not encoded in binary format elsewhere.  Also note that the time of transmission of the packet, and the data associated with it, is not encoded in the data.  In order to record this information, you must put a timestamp on the packet when it is received at the ground station.  The MSTAMP function of most TNCs will not work for this, as it is not printed out in KISS mode.

Lastly, there are no “equations” associated with the data set contained in the packets.  These values are the actual values and do not need to be scaled.