/* * TcPacket.cpp * * Created on: 18.06.2012 * Author: baetz */ #include #include #include template TcPacket::TcPacket() : TcPacketBase( (uint8_t*)&this->local_data ) { memset( &this->local_data, 0, sizeof(this->local_data) ); //Set all constant elements in header according to ECSS E-70-41A (2003) //Primary header: //Set APID to idle packet this->local_data.primary.packet_id_h = 0b00011000; this->setAPID( APID_IDLE_PACKET ); //Set Sequence Flags to "stand-alone packet" this->local_data.primary.sequence_control_h = 0b11000000; //Set packet size to size of data field header + CRC this->setPacketDataLength( sizeof(this->local_data.data_field) + CRC_SIZE ); //Data Field Header: //Set CCSDS_secondary_header_flag to 0, version number to 001 and ack to 0000 this->local_data.data_field.version_type_ack = 0b00010000; } template TcPacket::TcPacket( uint16_t new_apid, uint8_t new_ack, uint8_t new_service, uint8_t new_subservice, uint16_t new_sequence_count) : TcPacketBase( (uint8_t*)&this->local_data ) { memset( &this->local_data, 0, sizeof(this->local_data) ); //Set all constant elements in header according to ECSS E-70-41A (2003) //Primary header: //Set APID to idle packet this->local_data.primary.packet_id_h = 0b00011000; this->setAPID( new_apid ); //Set Sequence Flags to "stand-alone packet" this->local_data.primary.sequence_control_h = 0b11000000; this->setPacketSequenceCount( new_sequence_count ); this->setPacketDataLength( sizeof(this->local_data.data_field) + CRC_SIZE ); //Data Field Header: //Set CCSDS_secondary_header_flag to 0, version number to 001 and ack to 0000 this->local_data.data_field.version_type_ack = 0b00010000; this->local_data.data_field.version_type_ack |= ( new_ack & 0x0F); this->local_data.data_field.service_type = new_service; this->local_data.data_field.service_subtype = new_subservice; this->setErrorControl(); } template TcPacket< byte_size >::~TcPacket() { } template bool TcPacket::addApplicationData( uint8_t* newData, uint32_t amount ) { if ( amount <= ( sizeof(this->local_data.application_data) - CRC_SIZE ) ) { memcpy( this->local_data.application_data, newData, amount ); this->setPacketDataLength( amount + sizeof(this->local_data.data_field) + CRC_SIZE - 1 ); this->setErrorControl(); return true; } else { return false; } } template class TcPacket; template class TcPacket<32>; template class TcPacket<64>; template class TcPacket<128>; template class TcPacket<256>; template class TcPacket<1024>;