-
Notifications
You must be signed in to change notification settings - Fork 4
Home
Welcome to the wiki of Ccsds-utils!
This wiki helps to install the Ccsds module from sources and gives short examples on possible use cases
#Overview
The present library allows decoding and encoding of CCSDS stream defined in the PSS/ECSS standards. It relies on the Data::ParseBinary module which helps greatly in doing these kind of tasks. TM/TC binary encoding and decoding of source packet as well as frame level is supported. It is possible to customize the library to suite a specific need. Basic Unit tests for regression are included. Plateform supported: any plateform where Perl has been successfully ported ie: Windows, Linux, Mac, Tablets, iPhone,...
#Decode binary input as CCSDS TM Source Packet
my $tm = $TMSourcePacket->parse($input);
my $header = $tm->{'Packet Header'};
my $dataf = $tm->{'Packet Data Field'};
my $data = $dataf->{'Data Field'};
my $pid = $header->{'Packet Id'}->{'Apid'}->{'PID'};
#Install Get source
-
clone the repository:
$ git clone git://github.com/architek/ccsds-standalone.git
or if you are behind a firewall :
$ git clone https://[email protected]/architek/ccsds-standalone.git
-
build
$ cd ccsds-standalone/Ccsds $ perl Makefile.PL
-
you need to run the following command as root to trigger automatic build and installation of dependencies
$ make
-
install to your system
$ sudo make install
-
check
$ perl -MCcsds -e 'print "$Ccsds::VERSION\n"' 1.95 $
#Usage
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Ccsds::TM::SourcePacket; # the TM Source parser
use Ccsds::TM::Printer; # "pretty" printer
#Convert ascii input into binary packed stream.
my $pstring = pack ( qq{H*} , qq{$buf} );
#parse binary, including s2k header
my $decoded=$ScosTMSourcePacket->parse($pstring);
#you can also rebuild the packet now:
my $decoded->Field('PacketId')=0x3232;
my $data = $tmsourcepacket->build($decoded);
#display its content, raw of using TMPrint
print Dumper($decoded); # unordered hashes..
TMPrint($decoded);
Some working applications are available:
-
decoder.pl which takes as input a ascii representation of packets, either pure TM source packet or SCOS TM source packet (includes a SCOS Header)
-
decoder_raw which takes as input binary TM Source packets
-
proxy is an a tcp proxy with one end always connected (requirement). The lib can be used for every transmitted PDU to decode CCSDS packets or encode TC to send them
-
s2packet decodes a file containing frames into packets
-
ccsds-web is a small perl CGI using the ccsds library which allow to decode and print structures
#Customization As the standard is flexible and allows mission customization, it is possible to override some of the structures (Sat_Time, PacketSecHeader,..) from the caller application. Here is one way to do it:
#!/usr/bin/perl
use strict;
use warnings;
#Redefine with own structures
BEGIN { require custo-projet.pm; }
use Ccsds::TM::SourcePacket; # the TM Source parser
use Data::Dumper;
#Parse binary
my $decoded=$TMSourcePacket->parse($pstring);
custo-projet.pm:
#Sample customization for PROJECT
#############################
use Data::ParseBinary;
our $Sat_Time = Struct( 'Sat_Time',
UBInt32('Seconds'),
UBInt16('SubSeconds'),
Value(
'OBT', sub { $_->ctx->{'Seconds'} + \
$_->ctx->{'SubSeconds'} / 65535 }
)
);
our $TMSourceSecondaryHeader =
Struct('TMSourceSecondaryHeader',
Value('Length',10),
BitStruct('SecHeadFirstField',
BitField('Spare1',1),
BitField('PUS Version Number',3),
Nibble('Spare2')
),
UBInt8('Service Type'),
UBInt8('Service Subtype'),
UBInt8('Destination Id'),
$Sat_Time,
);
The element Length shall be provided as a virtual element containing the size of your TM Source Packet Sec Header.
#Standard Time
In the Recommendation, four Levels of time code formats can be defined based on the four degrees of interpretability of the code.
This library allows to decode CUC and CDS formats. Currently, PField and self-identified OBT type is not auto-detected, it must be provided by the user if needed.
-
CUC
1 to 4 octets of Coarse time, 0 to 3 of Fine time This allows 136 years and 60ns granularity #Sample customization for PROJECT ############################# use Ccsds::StdTime; # CUC 48 bits our $Sat_Time = CUC(4,2); # or CUC 56 bits our $Sat_Time = CUC(4,3);
-
CDS
16 or 24 bits for DAY, 32 bits for MS of the day, submilliseconds of ms (0,16 or 32 bits) This code is UTC based and leap second correction has to be made (with perl libraries) #Sample customization for PROJECT ############################# use Ccsds::StdTime; # or CDS with DoE on 24 bits and no submilli, epoch is 1/1/1958 our $Sat_Time = CDS(24,0); # CDS with DoE on 16 bits and submilli on 16 bits, epoch is 1/1/2000 our $Sat_Time = CDS(16,16,2000);
Feel free to contact me for questions, bug reports, ...