fsfw/osal/rtems/QueueFactory.cpp

61 lines
1.6 KiB
C++
Raw Normal View History

2020-08-28 18:33:29 +02:00
#include "../../ipc/QueueFactory.h"
2020-12-14 21:15:41 +01:00
#include "../../ipc/MessageQueueSenderIF.h"
2020-08-28 18:33:29 +02:00
#include "MessageQueue.h"
#include "RtemsBasic.h"
2020-12-14 21:15:41 +01:00
QueueFactory* QueueFactory::factoryInstance = nullptr;
2020-08-28 18:33:29 +02:00
ReturnValue_t MessageQueueSenderIF::sendMessage(MessageQueueId_t sendTo,
2020-12-14 21:15:41 +01:00
MessageQueueMessageIF* message, MessageQueueId_t sentFrom,bool ignoreFault) {
2020-08-28 18:33:29 +02:00
//TODO add ignoreFault functionality
message->setSender(sentFrom);
rtems_status_code result = rtems_message_queue_send(sendTo, message->getBuffer(),
2020-12-14 21:15:41 +01:00
message->getMessageSize());
2020-08-28 18:33:29 +02:00
switch(result){
case RTEMS_SUCCESSFUL:
//message sent successfully
return HasReturnvaluesIF::RETURN_OK;
case RTEMS_INVALID_ID:
//invalid queue id
return HasReturnvaluesIF::RETURN_FAILED;
case RTEMS_INVALID_SIZE:
// invalid message size
return HasReturnvaluesIF::RETURN_FAILED;
case RTEMS_INVALID_ADDRESS:
//buffer is NULL
return HasReturnvaluesIF::RETURN_FAILED;
case RTEMS_UNSATISFIED:
//out of message buffers
return HasReturnvaluesIF::RETURN_FAILED;
case RTEMS_TOO_MANY:
//queue's limit has been reached
return MessageQueueIF::FULL;
default:
return HasReturnvaluesIF::RETURN_FAILED;
}
}
QueueFactory* QueueFactory::instance() {
2020-12-14 21:15:41 +01:00
if (factoryInstance == nullptr) {
2020-08-28 18:33:29 +02:00
factoryInstance = new QueueFactory;
}
return factoryInstance;
}
QueueFactory::QueueFactory() {
}
QueueFactory::~QueueFactory() {
}
MessageQueueIF* QueueFactory::createMessageQueue(uint32_t messageDepth,
size_t maxMessageSize) {
return new MessageQueue(messageDepth, maxMessageSize);
}
void QueueFactory::deleteMessageQueue(MessageQueueIF* queue) {
delete queue;
}