A lot of new features and tweaks #12
@ -156,8 +156,8 @@ ReturnValue_t MessageQueue::receiveMessage(MessageQueueMessageIF* message) {
|
|||||||
|
|
||||||
if(message->getMaximumMessageSize() < maxMessageSize) {
|
if(message->getMaximumMessageSize() < maxMessageSize) {
|
||||||
sif::error << "MessageQueue::receiveMessage: Message size "
|
sif::error << "MessageQueue::receiveMessage: Message size "
|
||||||
<< message->getMaximumMessageSize() <<
|
<< message->getMaximumMessageSize()
|
||||||
" too small to receive data!" << std::endl;
|
<< " too small to receive data!" << std::endl;
|
||||||
return HasReturnvaluesIF::RETURN_FAILED;
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,12 +68,12 @@ void PeriodicPosixTask::taskFunctionality(void) {
|
|||||||
char name[20] = {0};
|
char name[20] = {0};
|
||||||
int status = pthread_getname_np(pthread_self(),name,sizeof(name));
|
int status = pthread_getname_np(pthread_self(),name,sizeof(name));
|
||||||
if(status == 0){
|
if(status == 0){
|
||||||
sif::error << "PeriodicPosixTask " << name << ": Deadline "
|
//sif::error << "PeriodicPosixTask " << name << ": Deadline "
|
||||||
"missed." << std::endl;
|
// "missed." << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sif::error << "PeriodicPosixTask X: Deadline missed. " <<
|
//sif::error << "PeriodicPosixTask X: Deadline missed. " <<
|
||||||
status << std::endl;
|
// status << std::endl;
|
||||||
}
|
}
|
||||||
if (this->deadlineMissedFunc != nullptr) {
|
if (this->deadlineMissedFunc != nullptr) {
|
||||||
this->deadlineMissedFunc();
|
this->deadlineMissedFunc();
|
||||||
|
@ -26,8 +26,7 @@ TcUnixUdpPollingTask::TcUnixUdpPollingTask(object_id_t objectId,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TcUnixUdpPollingTask::~TcUnixUdpPollingTask() {
|
TcUnixUdpPollingTask::~TcUnixUdpPollingTask() {}
|
||||||
}
|
|
||||||
|
|
||||||
ReturnValue_t TcUnixUdpPollingTask::performOperation(uint8_t opCode) {
|
ReturnValue_t TcUnixUdpPollingTask::performOperation(uint8_t opCode) {
|
||||||
// Poll for new UDP datagrams in permanent loop.
|
// Poll for new UDP datagrams in permanent loop.
|
||||||
@ -59,6 +58,30 @@ ReturnValue_t TcUnixUdpPollingTask::performOperation(uint8_t opCode) {
|
|||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ReturnValue_t TcUnixUdpPollingTask::handleSuccessfullTcRead(size_t bytesRead) {
|
||||||
|
store_address_t storeId = 0;
|
||||||
|
ReturnValue_t result = tcStore->addData(&storeId,
|
||||||
|
receptionBuffer.data(), bytesRead);
|
||||||
|
// arrayprinter::print(receptionBuffer.data(), bytesRead);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
sif::debug << "TcSerialPollingTask::transferPusToSoftwareBus: Data "
|
||||||
|
"storage failed" << std::endl;
|
||||||
|
sif::debug << "Packet size: " << bytesRead << std::endl;
|
||||||
|
return HasReturnvaluesIF::RETURN_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
TmTcMessage message(storeId);
|
||||||
|
|
||||||
|
result = MessageQueueSenderIF::sendMessage(targetTcDestination, &message);
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
sif::error << "Serial Polling: Sending message to queue failed"
|
||||||
|
<< std::endl;
|
||||||
|
tcStore->deleteData(storeId);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
ReturnValue_t TcUnixUdpPollingTask::initialize() {
|
ReturnValue_t TcUnixUdpPollingTask::initialize() {
|
||||||
tcStore = objectManager->get<StorageManagerIF>(objects::TC_STORE);
|
tcStore = objectManager->get<StorageManagerIF>(objects::TC_STORE);
|
||||||
if (tcStore == nullptr) {
|
if (tcStore == nullptr) {
|
||||||
@ -74,41 +97,27 @@ ReturnValue_t TcUnixUdpPollingTask::initialize() {
|
|||||||
return ObjectManagerIF::CHILD_INIT_FAILED;
|
return ObjectManagerIF::CHILD_INIT_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
targetTcDestination = tmtcBridge->getReportReceptionQueue();
|
|
||||||
|
|
||||||
serverUdpSocket = tmtcBridge->serverSocket;
|
serverUdpSocket = tmtcBridge->serverSocket;
|
||||||
|
|
||||||
// Set receive timeout.
|
|
||||||
// int result = setsockopt(serverUdpSocket, SOL_SOCKET, SO_RCVTIMEO,
|
|
||||||
// &receptionTimeout, sizeof(receptionTimeout));
|
|
||||||
// if(result == -1) {
|
|
||||||
// sif::error << "TcSocketPollingTask::TcSocketPollingTask: Setting "
|
|
||||||
// "receive timeout failed with " << strerror(errno) << std::endl;
|
|
||||||
// return ObjectManagerIF::CHILD_INIT_FAILED;
|
|
||||||
// }
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t TcUnixUdpPollingTask::handleSuccessfullTcRead(size_t bytesRead) {
|
ReturnValue_t TcUnixUdpPollingTask::initializeAfterTaskCreation() {
|
||||||
store_address_t storeId = 0;
|
// Initialize the destination after task creation. This ensures
|
||||||
ReturnValue_t result = tcStore->addData(&storeId,
|
// that the destination will be set in the TMTC bridge.
|
||||||
receptionBuffer.data(), bytesRead);
|
targetTcDestination = tmtcBridge->getRequestQueue();
|
||||||
// arrayprinter::print(receptionBuffer.data(), bytesRead);
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
}
|
||||||
sif::debug << "TcSerialPollingTask::transferPusToSoftwareBus: Data "
|
|
||||||
"storage failed" << std::endl;
|
|
||||||
sif::debug << "Packet size: " << bytesRead << std::endl;
|
|
||||||
return HasReturnvaluesIF::RETURN_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
TmTcMessage message(storeId);
|
void TcUnixUdpPollingTask::setTimeout(double timeoutSeconds) {
|
||||||
result = MessageQueueSenderIF::sendMessage(targetTcDestination, &message);
|
timeval tval;
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
tval = timevalOperations::toTimeval(timeoutSeconds);
|
||||||
sif::error << "Serial Polling: Sending message to queue failed"
|
int result = setsockopt(serverUdpSocket, SOL_SOCKET, SO_RCVTIMEO,
|
||||||
<< std::endl;
|
&tval, sizeof(receptionTimeout));
|
||||||
tcStore->deleteData(storeId);
|
if(result == -1) {
|
||||||
|
sif::error << "TcSocketPollingTask::TcSocketPollingTask: Setting "
|
||||||
|
"receive timeout failed with " << strerror(errno) << std::endl;
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,8 +29,16 @@ public:
|
|||||||
size_t frameSize = 0, double timeoutSeconds = -1);
|
size_t frameSize = 0, double timeoutSeconds = -1);
|
||||||
virtual~ TcUnixUdpPollingTask();
|
virtual~ TcUnixUdpPollingTask();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turn on optional timeout for UDP polling. In the default mode,
|
||||||
|
* the receive function will block until a packet is received.
|
||||||
|
* @param timeoutSeconds
|
||||||
|
*/
|
||||||
|
void setTimeout(double timeoutSeconds);
|
||||||
|
|
||||||
virtual ReturnValue_t performOperation(uint8_t opCode) override;
|
virtual ReturnValue_t performOperation(uint8_t opCode) override;
|
||||||
virtual ReturnValue_t initialize() override;
|
virtual ReturnValue_t initialize() override;
|
||||||
|
virtual ReturnValue_t initializeAfterTaskCreation() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
StorageManagerIF* tcStore = nullptr;
|
StorageManagerIF* tcStore = nullptr;
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
#include <framework/osal/linux/TmTcUnixUdpBridge.h>
|
#include <framework/osal/linux/TmTcUnixUdpBridge.h>
|
||||||
#include <framework/serviceinterface/ServiceInterfaceStream.h>
|
#include <framework/serviceinterface/ServiceInterfaceStream.h>
|
||||||
#include <errno.h>
|
|
||||||
#include <framework/ipc/MutexHelper.h>
|
#include <framework/ipc/MutexHelper.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
TmTcUnixUdpBridge::TmTcUnixUdpBridge(object_id_t objectId,
|
TmTcUnixUdpBridge::TmTcUnixUdpBridge(object_id_t objectId,
|
||||||
object_id_t ccsdsPacketDistributor, uint16_t serverPort,
|
object_id_t ccsdsPacketDistributor, uint16_t serverPort,
|
||||||
uint16_t clientPort):
|
uint16_t clientPort):
|
||||||
@ -14,17 +15,16 @@ TmTcUnixUdpBridge::TmTcUnixUdpBridge(object_id_t objectId,
|
|||||||
setServerPort = serverPort;
|
setServerPort = serverPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t setClientPort = DEFAULT_UDP_CLIENT_PORT;
|
// uint16_t setClientPort = DEFAULT_UDP_CLIENT_PORT;
|
||||||
if(clientPort != 0xFFFF) {
|
// if(clientPort != 0xFFFF) {
|
||||||
setClientPort = clientPort;
|
// setClientPort = clientPort;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// Set up UDP socket: https://man7.org/linux/man-pages/man7/ip.7.html
|
// Set up UDP socket: https://man7.org/linux/man-pages/man7/ip.7.html
|
||||||
serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
|
serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if(socket < 0) {
|
if(socket < 0) {
|
||||||
sif::error << "TmTcUnixUdpBridge::TmTcUnixUdpBridge: Could not open"
|
sif::error << "TmTcUnixUdpBridge::TmTcUnixUdpBridge: Could not open"
|
||||||
" UDP socket!" << std::endl;
|
" UDP socket!" << std::endl;
|
||||||
// check errno here.
|
|
||||||
handleSocketError();
|
handleSocketError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -44,7 +44,6 @@ TmTcUnixUdpBridge::TmTcUnixUdpBridge(object_id_t objectId,
|
|||||||
sif::error << "TmTcUnixUdpBridge::TmTcUnixUdpBridge: Could not bind "
|
sif::error << "TmTcUnixUdpBridge::TmTcUnixUdpBridge: Could not bind "
|
||||||
"local port " << setServerPort << " to server socket!"
|
"local port " << setServerPort << " to server socket!"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
// check errno here.
|
|
||||||
handleBindError();
|
handleBindError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -57,14 +56,21 @@ ReturnValue_t TmTcUnixUdpBridge::sendTm(const uint8_t *data, size_t dataLen) {
|
|||||||
int flags = 0;
|
int flags = 0;
|
||||||
ssize_t result = send(serverSocket, data, dataLen, flags);
|
ssize_t result = send(serverSocket, data, dataLen, flags);
|
||||||
if(result < 0) {
|
if(result < 0) {
|
||||||
//handle error
|
// todo: handle errors
|
||||||
sif::error << "TmTcUnixUdpBridge::sendTm: Send operation failed "
|
sif::error << "TmTcUnixUdpBridge::sendTm: Send operation failed "
|
||||||
"with error " << strerror(errno) << std::endl;
|
"with error " << strerror(errno) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TmTcUnixUdpBridge::checkAndSetClientAddress(sockaddr_in newAddress) {
|
||||||
|
MutexHelper lock(mutex, 10);
|
||||||
|
// Set new IP address if it has changed.
|
||||||
|
if(clientAddress.sin_addr.s_addr != newAddress.sin_addr.s_addr) {
|
||||||
|
clientAddress.sin_addr.s_addr = newAddress.sin_addr.s_addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TmTcUnixUdpBridge::handleSocketError() {
|
void TmTcUnixUdpBridge::handleSocketError() {
|
||||||
|
|
||||||
// See: https://man7.org/linux/man-pages/man2/socket.2.html
|
// See: https://man7.org/linux/man-pages/man2/socket.2.html
|
||||||
@ -87,17 +93,6 @@ void TmTcUnixUdpBridge::handleSocketError() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TmTcUnixUdpBridge::setTimeout(float timeoutSeconds) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void TmTcUnixUdpBridge::checkAndSetClientAddress(sockaddr_in newAddress) {
|
|
||||||
MutexHelper lock(mutex, 10);
|
|
||||||
// Set new IP address if it has changed.
|
|
||||||
if(clientAddress.sin_addr.s_addr != newAddress.sin_addr.s_addr) {
|
|
||||||
clientAddress.sin_addr.s_addr = newAddress.sin_addr.s_addr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void TmTcUnixUdpBridge::handleBindError() {
|
void TmTcUnixUdpBridge::handleBindError() {
|
||||||
// See: https://man7.org/linux/man-pages/man2/bind.2.html
|
// See: https://man7.org/linux/man-pages/man2/bind.2.html
|
||||||
switch(errno) {
|
switch(errno) {
|
||||||
@ -128,16 +123,10 @@ void TmTcUnixUdpBridge::handleBindError() {
|
|||||||
<< " with " << strerror(errno) << std::endl;
|
<< " with " << strerror(errno) << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default:
|
||||||
sif::error << "TmTcUnixBridge::TmTcUnixBridge: Unknown error"
|
sif::error << "TmTcUnixBridge::TmTcUnixBridge: Unknown error"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ReturnValue_t TmTcUnixUdpBridge::receiveTc(uint8_t **recvBuffer, size_t *size) {
|
|
||||||
// TC reception handled by separate polling task because it is blocking.
|
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
|
||||||
}
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef FRAMEWORK_OSAL_LINUX_TMTCUNIXUDPBRIDGE_H_
|
#ifndef FRAMEWORK_OSAL_LINUX_TMTCUNIXUDPBRIDGE_H_
|
||||||
#define FRAMEWORK_OSAL_LINUX_TMTCUNIXUDPBRIDGE_H_
|
#define FRAMEWORK_OSAL_LINUX_TMTCUNIXUDPBRIDGE_H_
|
||||||
|
|
||||||
|
#include <framework/tmtcservices/AcceptsTelecommandsIF.h>
|
||||||
#include <framework/tmtcservices/TmTcBridge.h>
|
#include <framework/tmtcservices/TmTcBridge.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
@ -18,13 +19,11 @@ public:
|
|||||||
uint16_t serverPort = 0xFFFF,uint16_t clientPort = 0xFFFF);
|
uint16_t serverPort = 0xFFFF,uint16_t clientPort = 0xFFFF);
|
||||||
virtual~ TmTcUnixUdpBridge();
|
virtual~ TmTcUnixUdpBridge();
|
||||||
|
|
||||||
void setTimeout(float timeoutSeconds);
|
|
||||||
void checkAndSetClientAddress(sockaddr_in clientAddress);
|
void checkAndSetClientAddress(sockaddr_in clientAddress);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ReturnValue_t receiveTc(uint8_t ** recvBuffer,
|
|
||||||
size_t * size) override;
|
|
||||||
virtual ReturnValue_t sendTm(const uint8_t * data, size_t dataLen) override;
|
virtual ReturnValue_t sendTm(const uint8_t * data, size_t dataLen) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int serverSocket = 0;
|
int serverSocket = 0;
|
||||||
const int serverSocketOptions = 0;
|
const int serverSocketOptions = 0;
|
||||||
@ -43,6 +42,4 @@ private:
|
|||||||
void handleBindError();
|
void handleBindError();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* FRAMEWORK_OSAL_LINUX_TMTCUNIXUDPBRIDGE_H_ */
|
#endif /* FRAMEWORK_OSAL_LINUX_TMTCUNIXUDPBRIDGE_H_ */
|
||||||
|
@ -9,7 +9,7 @@ CCSDSDistributor::CCSDSDistributor(uint16_t setDefaultApid,
|
|||||||
|
|
||||||
CCSDSDistributor::~CCSDSDistributor() {}
|
CCSDSDistributor::~CCSDSDistributor() {}
|
||||||
|
|
||||||
TcDistributor::TcMessageQueueMapIter CCSDSDistributor::selectDestination() {
|
TcDistributor::TcMqMapIter CCSDSDistributor::selectDestination() {
|
||||||
// sif::debug << "CCSDSDistributor::selectDestination received: " <<
|
// sif::debug << "CCSDSDistributor::selectDestination received: " <<
|
||||||
// this->currentMessage.getStorageId().pool_index << ", " <<
|
// this->currentMessage.getStorageId().pool_index << ", " <<
|
||||||
// this->currentMessage.getStorageId().packet_index << std::endl;
|
// this->currentMessage.getStorageId().packet_index << std::endl;
|
||||||
@ -25,7 +25,7 @@ TcDistributor::TcMessageQueueMapIter CCSDSDistributor::selectDestination() {
|
|||||||
|
|
||||||
// sif:: info << "CCSDSDistributor::selectDestination has packet with APID "
|
// sif:: info << "CCSDSDistributor::selectDestination has packet with APID "
|
||||||
// << std::hex << currentPacket.getAPID() << std::dec << std::endl;
|
// << std::hex << currentPacket.getAPID() << std::dec << std::endl;
|
||||||
TcMessageQueueMapIter position = this->queueMap.find(currentPacket.getAPID());
|
TcMqMapIter position = this->queueMap.find(currentPacket.getAPID());
|
||||||
if ( position != this->queueMap.end() ) {
|
if ( position != this->queueMap.end() ) {
|
||||||
return position;
|
return position;
|
||||||
} else {
|
} else {
|
||||||
|
@ -24,14 +24,14 @@ public:
|
|||||||
* TcDistributor ctor with a certain object id.
|
* TcDistributor ctor with a certain object id.
|
||||||
* @details
|
* @details
|
||||||
* @c tcStore is set in the @c initialize method.
|
* @c tcStore is set in the @c initialize method.
|
||||||
* @param set_default_apid The default APID, where packets with unknown
|
* @param setDefaultApid The default APID, where packets with unknown
|
||||||
* destination are sent to.
|
* destination are sent to.
|
||||||
*/
|
*/
|
||||||
CCSDSDistributor( uint16_t setDefaultApid, object_id_t setObjectId );
|
CCSDSDistributor(uint16_t setDefaultApid, object_id_t setObjectId);
|
||||||
/**
|
/**
|
||||||
* The destructor is empty.
|
* The destructor is empty.
|
||||||
*/
|
*/
|
||||||
~CCSDSDistributor();
|
virtual ~CCSDSDistributor();
|
||||||
|
|
||||||
MessageQueueId_t getRequestQueue() override;
|
MessageQueueId_t getRequestQueue() override;
|
||||||
ReturnValue_t registerApplication( uint16_t apid,
|
ReturnValue_t registerApplication( uint16_t apid,
|
||||||
@ -49,7 +49,7 @@ protected:
|
|||||||
* where a Acceptance Failure message should be generated.
|
* where a Acceptance Failure message should be generated.
|
||||||
* @return Iterator to map entry of found APID or iterator to default APID.
|
* @return Iterator to map entry of found APID or iterator to default APID.
|
||||||
*/
|
*/
|
||||||
TcMessageQueueMapIter selectDestination();
|
TcMqMapIter selectDestination() override;
|
||||||
/**
|
/**
|
||||||
* The default APID, where packets with unknown APID are sent to.
|
* The default APID, where packets with unknown APID are sent to.
|
||||||
*/
|
*/
|
||||||
|
@ -12,9 +12,9 @@ PUSDistributor::PUSDistributor(uint16_t setApid, object_id_t setObjectId,
|
|||||||
|
|
||||||
PUSDistributor::~PUSDistributor() {}
|
PUSDistributor::~PUSDistributor() {}
|
||||||
|
|
||||||
TcDistributor::TcMessageQueueMapIter PUSDistributor::selectDestination() {
|
TcDistributor::TcMqMapIter PUSDistributor::selectDestination() {
|
||||||
// debug << "PUSDistributor::handlePacket received: " << this->current_packet_id.store_index << ", " << this->current_packet_id.packet_index << std::endl;
|
// debug << "PUSDistributor::handlePacket received: " << this->current_packet_id.store_index << ", " << this->current_packet_id.packet_index << std::endl;
|
||||||
TcMessageQueueMapIter queueMapIt = this->queueMap.end();
|
TcMqMapIter queueMapIt = this->queueMap.end();
|
||||||
this->currentPacket.setStoreAddress(this->currentMessage.getStorageId());
|
this->currentPacket.setStoreAddress(this->currentMessage.getStorageId());
|
||||||
if (currentPacket.getWholeData() != NULL) {
|
if (currentPacket.getWholeData() != NULL) {
|
||||||
tcStatus = checker.checkPacket(¤tPacket);
|
tcStatus = checker.checkPacket(¤tPacket);
|
||||||
|
@ -66,7 +66,7 @@ protected:
|
|||||||
* @return Iterator to map entry of found service id
|
* @return Iterator to map entry of found service id
|
||||||
* or iterator to @c map.end().
|
* or iterator to @c map.end().
|
||||||
*/
|
*/
|
||||||
TcMessageQueueMapIter selectDestination();
|
TcMqMapIter selectDestination() override;
|
||||||
/**
|
/**
|
||||||
* The callback here handles the generation of acceptance
|
* The callback here handles the generation of acceptance
|
||||||
* success/failure messages.
|
* success/failure messages.
|
||||||
|
@ -28,7 +28,7 @@ ReturnValue_t TcDistributor::performOperation(uint8_t opCode) {
|
|||||||
|
|
||||||
ReturnValue_t TcDistributor::handlePacket() {
|
ReturnValue_t TcDistributor::handlePacket() {
|
||||||
|
|
||||||
TcMessageQueueMapIter queueMapIt = this->selectDestination();
|
TcMqMapIter queueMapIt = this->selectDestination();
|
||||||
ReturnValue_t returnValue = RETURN_FAILED;
|
ReturnValue_t returnValue = RETURN_FAILED;
|
||||||
if (queueMapIt != this->queueMap.end()) {
|
if (queueMapIt != this->queueMap.end()) {
|
||||||
returnValue = this->tcQueue->sendMessage(queueMapIt->second,
|
returnValue = this->tcQueue->sendMessage(queueMapIt->second,
|
||||||
@ -40,7 +40,7 @@ ReturnValue_t TcDistributor::handlePacket() {
|
|||||||
void TcDistributor::print() {
|
void TcDistributor::print() {
|
||||||
sif::debug << "Distributor content is: " << std::endl << "ID\t| message queue id"
|
sif::debug << "Distributor content is: " << std::endl << "ID\t| message queue id"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
for (TcMessageQueueMapIter it = this->queueMap.begin(); it != this->queueMap.end();
|
for (TcMqMapIter it = this->queueMap.begin(); it != this->queueMap.end();
|
||||||
it++) {
|
it++) {
|
||||||
sif::debug << it->first << "\t| 0x" << std::hex << it->second << std::dec
|
sif::debug << it->first << "\t| 0x" << std::hex << it->second << std::dec
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
@ -32,7 +32,7 @@ class TcDistributor : public SystemObject,
|
|||||||
public HasReturnvaluesIF {
|
public HasReturnvaluesIF {
|
||||||
public:
|
public:
|
||||||
using TcMessageQueueMap = std::map<uint32_t, MessageQueueId_t>;
|
using TcMessageQueueMap = std::map<uint32_t, MessageQueueId_t>;
|
||||||
using TcMessageQueueMapIter = std::map<uint32_t, MessageQueueId_t>::iterator;
|
using TcMqMapIter = std::map<uint32_t, MessageQueueId_t>::iterator;
|
||||||
|
|
||||||
static const uint8_t INTERFACE_ID = CLASS_ID::PACKET_DISTRIBUTION;
|
static const uint8_t INTERFACE_ID = CLASS_ID::PACKET_DISTRIBUTION;
|
||||||
static const ReturnValue_t PACKET_LOST = MAKE_RETURN_CODE( 1 );
|
static const ReturnValue_t PACKET_LOST = MAKE_RETURN_CODE( 1 );
|
||||||
@ -90,7 +90,7 @@ protected:
|
|||||||
* packet and select the map entry which represents the packet's target.
|
* packet and select the map entry which represents the packet's target.
|
||||||
* @return An iterator to the map element to forward to or queuMap.end().
|
* @return An iterator to the map element to forward to or queuMap.end().
|
||||||
*/
|
*/
|
||||||
virtual TcMessageQueueMapIter selectDestination() = 0;
|
virtual TcMqMapIter selectDestination() = 0;
|
||||||
/**
|
/**
|
||||||
* The handlePacket method calls the child class's selectDestination method
|
* The handlePacket method calls the child class's selectDestination method
|
||||||
* and forwards the packet to its destination, if found.
|
* and forwards the packet to its destination, if found.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#ifndef ACCEPTSTELECOMMANDSIF_H_
|
#ifndef FRAMEWORK_TMTCSERVICES_ACCEPTSTELECOMMANDSIF_H_
|
||||||
#define ACCEPTSTELECOMMANDSIF_H_
|
#define FRAMEWORK_TMTCSERVICES_ACCEPTSTELECOMMANDSIF_H_
|
||||||
|
|
||||||
#include <framework/ipc/MessageQueueSenderIF.h>
|
#include <framework/ipc/MessageQueueSenderIF.h>
|
||||||
|
|
||||||
@ -26,9 +26,9 @@ public:
|
|||||||
/**
|
/**
|
||||||
* @brief Getter for the service id.
|
* @brief Getter for the service id.
|
||||||
* @details Any receiving service (at least any PUS service) shall have a
|
* @details Any receiving service (at least any PUS service) shall have a
|
||||||
* service id. If the receiver can handle Telecommands, but for
|
* service ID. If the receiver can handle Telecommands, but for
|
||||||
* some reason has no service id, it shall return 0.
|
* some reason has no service id, it shall return 0.
|
||||||
* @return The service id or 0.
|
* @return The service ID or 0.
|
||||||
*/
|
*/
|
||||||
virtual uint16_t getIdentifier() = 0;
|
virtual uint16_t getIdentifier() = 0;
|
||||||
/**
|
/**
|
||||||
@ -40,4 +40,4 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* ACCEPTSTELECOMMANDSIF_H_ */
|
#endif /* FRAMEWORK_TMTCSERVICES_ACCEPTSTELECOMMANDSIF_H_ */
|
||||||
|
@ -9,7 +9,7 @@ TmTcBridge::TmTcBridge(object_id_t objectId,
|
|||||||
object_id_t ccsdsPacketDistributor): SystemObject(objectId),
|
object_id_t ccsdsPacketDistributor): SystemObject(objectId),
|
||||||
ccsdsPacketDistributor(ccsdsPacketDistributor)
|
ccsdsPacketDistributor(ccsdsPacketDistributor)
|
||||||
{
|
{
|
||||||
TmTcReceptionQueue = QueueFactory::instance()->
|
tmTcReceptionQueue = QueueFactory::instance()->
|
||||||
createMessageQueue(TMTC_RECEPTION_QUEUE_DEPTH);
|
createMessageQueue(TMTC_RECEPTION_QUEUE_DEPTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +55,8 @@ ReturnValue_t TmTcBridge::initialize() {
|
|||||||
if (tcDistributor == NULL) {
|
if (tcDistributor == NULL) {
|
||||||
return RETURN_FAILED;
|
return RETURN_FAILED;
|
||||||
}
|
}
|
||||||
TmTcReceptionQueue->setDefaultDestination(tcDistributor->getRequestQueue());
|
|
||||||
|
tmTcReceptionQueue->setDefaultDestination(tcDistributor->getRequestQueue());
|
||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,10 +74,7 @@ ReturnValue_t TmTcBridge::performOperation(uint8_t operationCode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t TmTcBridge::handleTc() {
|
ReturnValue_t TmTcBridge::handleTc() {
|
||||||
uint8_t * recvBuffer = nullptr;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
size_t recvLen = 0;
|
|
||||||
ReturnValue_t result = receiveTc(&recvBuffer, &recvLen);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t TmTcBridge::handleTm() {
|
ReturnValue_t TmTcBridge::handleTm() {
|
||||||
@ -97,8 +95,8 @@ ReturnValue_t TmTcBridge::handleTmQueue() {
|
|||||||
TmTcMessage message;
|
TmTcMessage message;
|
||||||
const uint8_t* data = nullptr;
|
const uint8_t* data = nullptr;
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
for (ReturnValue_t result = TmTcReceptionQueue->receiveMessage(&message);
|
for (ReturnValue_t result = tmTcReceptionQueue->receiveMessage(&message);
|
||||||
result == RETURN_OK; result = TmTcReceptionQueue->receiveMessage(&message))
|
result == RETURN_OK; result = tmTcReceptionQueue->receiveMessage(&message))
|
||||||
{
|
{
|
||||||
if(communicationLinkUp == false) {
|
if(communicationLinkUp == false) {
|
||||||
result = storeDownlinkData(&message);
|
result = storeDownlinkData(&message);
|
||||||
@ -183,10 +181,20 @@ void TmTcBridge::registerCommDisconnect() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MessageQueueId_t TmTcBridge::getReportReceptionQueue(uint8_t virtualChannel) {
|
MessageQueueId_t TmTcBridge::getReportReceptionQueue(uint8_t virtualChannel) {
|
||||||
return TmTcReceptionQueue->getId();
|
return tmTcReceptionQueue->getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TmTcBridge::printData(uint8_t * data, size_t dataLen) {
|
void TmTcBridge::printData(uint8_t * data, size_t dataLen) {
|
||||||
arrayprinter::print(data, dataLen);
|
arrayprinter::print(data, dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t TmTcBridge::getIdentifier() {
|
||||||
|
// This is no PUS service, so we just return 0
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MessageQueueId_t TmTcBridge::getRequestQueue() {
|
||||||
|
// Default implementation: Relay TC messages to TC distributor directly.
|
||||||
|
return tmTcReceptionQueue->getDefaultDestination();
|
||||||
|
}
|
||||||
|
@ -1,16 +1,18 @@
|
|||||||
#ifndef FRAMEWORK_TMTCSERVICES_TMTCBRIDGE_H_
|
#ifndef FRAMEWORK_TMTCSERVICES_TMTCBRIDGE_H_
|
||||||
#define FRAMEWORK_TMTCSERVICES_TMTCBRIDGE_H_
|
#define FRAMEWORK_TMTCSERVICES_TMTCBRIDGE_H_
|
||||||
|
|
||||||
#include <framework/container/FIFO.h>
|
#include <framework/objectmanager/SystemObject.h>
|
||||||
#include <framework/tmtcservices/AcceptsTelemetryIF.h>
|
#include <framework/tmtcservices/AcceptsTelemetryIF.h>
|
||||||
#include <framework/tasks/ExecutableObjectIF.h>
|
#include <framework/tasks/ExecutableObjectIF.h>
|
||||||
#include <framework/ipc/MessageQueueIF.h>
|
#include <framework/ipc/MessageQueueIF.h>
|
||||||
#include <framework/storagemanager/StorageManagerIF.h>
|
#include <framework/storagemanager/StorageManagerIF.h>
|
||||||
#include <framework/objectmanager/SystemObject.h>
|
#include <framework/tmtcservices/AcceptsTelecommandsIF.h>
|
||||||
|
|
||||||
|
#include <framework/container/FIFO.h>
|
||||||
#include <framework/tmtcservices/TmTcMessage.h>
|
#include <framework/tmtcservices/TmTcMessage.h>
|
||||||
|
|
||||||
class TmTcBridge : public AcceptsTelemetryIF,
|
class TmTcBridge : public AcceptsTelemetryIF,
|
||||||
|
public AcceptsTelecommandsIF,
|
||||||
public ExecutableObjectIF,
|
public ExecutableObjectIF,
|
||||||
public HasReturnvaluesIF,
|
public HasReturnvaluesIF,
|
||||||
public SystemObject {
|
public SystemObject {
|
||||||
@ -57,17 +59,19 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual ReturnValue_t performOperation(uint8_t operationCode = 0) override;
|
virtual ReturnValue_t performOperation(uint8_t operationCode = 0) override;
|
||||||
|
|
||||||
/**
|
|
||||||
* Return TMTC Reception Queue
|
/** AcceptsTelemetryIF override */
|
||||||
* @param virtualChannel
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
virtual MessageQueueId_t getReportReceptionQueue(
|
virtual MessageQueueId_t getReportReceptionQueue(
|
||||||
uint8_t virtualChannel = 0) override;
|
uint8_t virtualChannel = 0) override;
|
||||||
|
|
||||||
|
/** AcceptsTelecommandsIF override */
|
||||||
|
virtual uint16_t getIdentifier() override;
|
||||||
|
virtual MessageQueueId_t getRequestQueue() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//! Used to send and receive TMTC messages.
|
//! Used to send and receive TMTC messages.
|
||||||
//! TmTcMessage is used to transport messages between tasks.
|
//! TmTcMessage is used to transport messages between tasks.
|
||||||
MessageQueueIF* TmTcReceptionQueue = nullptr;
|
MessageQueueIF* tmTcReceptionQueue = nullptr;
|
||||||
StorageManagerIF* tcStore = nullptr;
|
StorageManagerIF* tcStore = nullptr;
|
||||||
StorageManagerIF* tmStore = nullptr;
|
StorageManagerIF* tmStore = nullptr;
|
||||||
object_id_t ccsdsPacketDistributor = 0;
|
object_id_t ccsdsPacketDistributor = 0;
|
||||||
@ -79,23 +83,11 @@ protected:
|
|||||||
* @brief Handle TC reception
|
* @brief Handle TC reception
|
||||||
* @details
|
* @details
|
||||||
* Default implementation provided, but is empty.
|
* Default implementation provided, but is empty.
|
||||||
* Child handler should override this in most cases orsend TC to the
|
* In most cases, TC reception will be handled in a separate task anyway.
|
||||||
* TC distributor directly with the address of the reception queue by
|
|
||||||
* calling getReportRecptionQueue()
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
virtual ReturnValue_t handleTc();
|
virtual ReturnValue_t handleTc();
|
||||||
|
|
||||||
/**
|
|
||||||
* Implemented by child class. Perform receiving of Telecommand,
|
|
||||||
* for example by implementing specific drivers or wrappers,
|
|
||||||
* e.g. UART Communication or an ethernet stack
|
|
||||||
* @param recvBuffer [out] Received data
|
|
||||||
* @param size [out] Size of received data
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
virtual ReturnValue_t receiveTc(uint8_t ** recvBuffer, size_t * size) = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle Telemetry. Default implementation provided.
|
* Handle Telemetry. Default implementation provided.
|
||||||
* Calls sendTm()
|
* Calls sendTm()
|
||||||
|
Loading…
Reference in New Issue
Block a user