/* * TcPacketStored.cpp * * Created on: 20.11.2012 * Author: baetz */ #include #include #include #include #include TcPacketStored::TcPacketStored( store_address_t setAddress) : TcPacketBase(NULL), storeAddress(setAddress) { this->setStoreAddress( this->storeAddress ); } TcPacketStored::TcPacketStored( uint16_t apid, uint8_t ack, uint8_t service, uint8_t subservice, uint8_t sequence_count, const uint8_t* data, uint32_t size) : TcPacketBase(NULL) { this->storeAddress.raw = StorageManagerIF::INVALID_ADDRESS; if ( this->checkAndSetStore() ) { TcPacket temp_packet( apid, ack, service, subservice, sequence_count); uint8_t* p_data = NULL; ReturnValue_t returnValue = this->store->getFreeElement( &this->storeAddress, (TC_PACKET_MIN_SIZE + size), &p_data ); if ( returnValue == this->store->RETURN_OK ) { memcpy(p_data, temp_packet.getWholeData(), temp_packet.getFullSize() ); this->setData( p_data ); memcpy( &tc_data->data, data, size ); this->setPacketDataLength( size + sizeof(PUSTcDataFieldHeader) + CRC_SIZE - 1 ); this->setErrorControl(); } } } TcPacketStored::TcPacketStored() : TcPacketBase(NULL) { this->storeAddress.raw = StorageManagerIF::INVALID_ADDRESS; this->checkAndSetStore(); } //TODO: return code? void TcPacketStored::deletePacket() { this->store->deleteData( this->storeAddress ); this->storeAddress.raw = StorageManagerIF::INVALID_ADDRESS; this->setData( NULL ); } bool TcPacketStored::checkAndSetStore() { if (this->store == NULL) { this->store = objectManager->get( objects::TC_STORE ); if ( this->store == NULL ) { error << "TcPacketStored::TcPacketStored: TC Store not found!" << std::endl; return false; } } return true; } void TcPacketStored::setStoreAddress(store_address_t setAddress) { this->storeAddress = setAddress; const uint8_t* temp_data = NULL; uint32_t temp_size; ReturnValue_t status = StorageManagerIF::RETURN_FAILED; if ( this->checkAndSetStore() ) { status = this->store->getData(this->storeAddress, &temp_data, &temp_size ); } if (status == StorageManagerIF::RETURN_OK) { this->setData(temp_data); } else { this->setData(NULL); this->storeAddress.raw = StorageManagerIF::INVALID_ADDRESS; } } store_address_t TcPacketStored::getStoreAddress() { return this->storeAddress; } bool TcPacketStored::isSizeCorrect() { const uint8_t* temp_data = NULL; uint32_t temp_size; ReturnValue_t status = this->store->getData(this->storeAddress, &temp_data, &temp_size ); if (status == StorageManagerIF::RETURN_OK) { if (this->getFullSize() == temp_size ) { return true; } } return false; } StorageManagerIF* TcPacketStored::store = NULL; TcPacketStored::TcPacketStored(const uint8_t* data, uint32_t size) : TcPacketBase(data) { if (getFullSize() != size) { return; } if ( this->checkAndSetStore() ) { ReturnValue_t status = store->addData(&storeAddress, data, size); if (status != HasReturnvaluesIF::RETURN_OK) { this->setData(NULL); } } }