reset, splitting up merge request
This commit is contained in:
parent
ee23a7c0b5
commit
abe7239018
@ -1,33 +0,0 @@
|
|||||||
#ifndef COOKIE_H_
|
|
||||||
#define COOKIE_H_
|
|
||||||
#include <framework/devicehandlers/CookieIF.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Physical address type
|
|
||||||
*/
|
|
||||||
typedef uint32_t address_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This datatype is used to identify different connection over a single interface
|
|
||||||
* (like RMAP or I2C)
|
|
||||||
* @details
|
|
||||||
* To use this class, implement a communication specific child cookie which
|
|
||||||
* inherits Cookie. Cookie instances are created in config/ Factory.cpp by calling
|
|
||||||
* CookieIF* childCookie = new ChildCookie(...).
|
|
||||||
*
|
|
||||||
* This cookie is then passed to the child device handlers, which stores the
|
|
||||||
* pointer and passes it to the communication interface functions.
|
|
||||||
*
|
|
||||||
* The cookie can be used to store all kinds of information
|
|
||||||
* about the communication, like slave addresses, communication status,
|
|
||||||
* communication parameters etc.
|
|
||||||
*
|
|
||||||
* @ingroup comm
|
|
||||||
*/
|
|
||||||
class CookieIF {
|
|
||||||
public:
|
|
||||||
virtual ~CookieIF() {};
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* COOKIE_H_ */
|
|
@ -1,117 +1,63 @@
|
|||||||
#ifndef DEVICECOMMUNICATIONIF_H_
|
#ifndef DEVICECOMMUNICATIONIF_H_
|
||||||
#define DEVICECOMMUNICATIONIF_H_
|
#define DEVICECOMMUNICATIONIF_H_
|
||||||
|
|
||||||
#include <framework/devicehandlers/CookieIF.h>
|
#include <framework/devicehandlers/Cookie.h>
|
||||||
#include <framework/devicehandlers/DeviceHandlerIF.h>
|
|
||||||
#include <framework/returnvalues/HasReturnvaluesIF.h>
|
#include <framework/returnvalues/HasReturnvaluesIF.h>
|
||||||
/**
|
|
||||||
* @defgroup interfaces Interfaces
|
|
||||||
* @brief Interfaces for flight software objects
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup comm Communication
|
|
||||||
* @brief Communication software components.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This is an interface to decouple device communication from
|
|
||||||
* the device handler to allow reuse of these components.
|
|
||||||
* @details
|
|
||||||
* Documentation: Dissertation Baetz p.138.
|
|
||||||
* It works with the assumption that received data
|
|
||||||
* is polled by a component. There are four generic steps of device communication:
|
|
||||||
*
|
|
||||||
* 1. Send data to a device
|
|
||||||
* 2. Get acknowledgement for sending
|
|
||||||
* 3. Request reading data from a device
|
|
||||||
* 4. Read received data
|
|
||||||
*
|
|
||||||
* To identify different connection over a single interface can return
|
|
||||||
* so-called cookies to components.
|
|
||||||
* The CommunicationMessage message type can be used to extend the functionality of the
|
|
||||||
* ComIF if a separate polling task is required.
|
|
||||||
* @ingroup interfaces
|
|
||||||
* @ingroup comm
|
|
||||||
*/
|
|
||||||
class DeviceCommunicationIF: public HasReturnvaluesIF {
|
class DeviceCommunicationIF: public HasReturnvaluesIF {
|
||||||
public:
|
public:
|
||||||
static const uint8_t INTERFACE_ID = CLASS_ID::DEVICE_COMMUNICATION_IF;
|
static const uint8_t INTERFACE_ID = CLASS_ID::DEVICE_COMMUNICATION_IF;
|
||||||
|
|
||||||
//!< This is used if no read request is to be made by the device handler.
|
static const ReturnValue_t INVALID_COOKIE_TYPE = MAKE_RETURN_CODE(0x01);
|
||||||
static const ReturnValue_t NO_READ_REQUEST = MAKE_RETURN_CODE(0x01);
|
static const ReturnValue_t NOT_ACTIVE = MAKE_RETURN_CODE(0x02);
|
||||||
//! General protocol error. Define more concrete errors in child handler
|
static const ReturnValue_t INVALID_ADDRESS = MAKE_RETURN_CODE(0x03);
|
||||||
static const ReturnValue_t PROTOCOL_ERROR = MAKE_RETURN_CODE(0x02);
|
static const ReturnValue_t TOO_MUCH_DATA = MAKE_RETURN_CODE(0x04);
|
||||||
//! If cookie is a null pointer
|
static const ReturnValue_t NULLPOINTER = MAKE_RETURN_CODE(0x05);
|
||||||
static const ReturnValue_t NULLPOINTER = MAKE_RETURN_CODE(0x03);
|
static const ReturnValue_t PROTOCOL_ERROR = MAKE_RETURN_CODE(0x06);
|
||||||
static const ReturnValue_t INVALID_COOKIE_TYPE = MAKE_RETURN_CODE(0x04);
|
static const ReturnValue_t CANT_CHANGE_REPLY_LEN = MAKE_RETURN_CODE(0x07);
|
||||||
// is this needed if there is no open/close call?
|
|
||||||
static const ReturnValue_t NOT_ACTIVE = MAKE_RETURN_CODE(0x05);
|
|
||||||
static const ReturnValue_t TOO_MUCH_DATA = MAKE_RETURN_CODE(0x06);
|
|
||||||
|
|
||||||
virtual ~DeviceCommunicationIF() {}
|
virtual ~DeviceCommunicationIF() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ReturnValue_t open(Cookie **cookie, uint32_t address,
|
||||||
|
uint32_t maxReplyLen) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Device specific initialization, using the cookie.
|
* Use an existing cookie to open a connection to a new DeviceCommunication.
|
||||||
* @details
|
* The previous connection must not be closed.
|
||||||
* The cookie is already prepared in the factory. If the communication
|
* If the returnvalue is not RETURN_OK, the cookie is unchanged and
|
||||||
* interface needs to be set up in some way and requires cookie information,
|
* can be used with the previous connection.
|
||||||
* this can be performed in this function, which is called on device handler
|
|
||||||
* initialization.
|
|
||||||
* @param cookie
|
|
||||||
* @return -@c RETURN_OK if initialization was successfull
|
|
||||||
* - Everything else triggers failure event with returnvalue as parameter 1
|
|
||||||
*/
|
|
||||||
virtual ReturnValue_t initializeInterface(CookieIF * cookie) = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called by DHB in the SEND_WRITE doSendWrite().
|
|
||||||
* This function is used to send data to the physical device
|
|
||||||
* by implementing and calling related drivers or wrapper functions.
|
|
||||||
* @param cookie
|
|
||||||
* @param data
|
|
||||||
* @param len
|
|
||||||
* @return -@c RETURN_OK for successfull send
|
|
||||||
* - Everything else triggers failure event with returnvalue as parameter 1
|
|
||||||
*/
|
|
||||||
virtual ReturnValue_t sendMessage(CookieIF *cookie, const uint8_t * sendData,
|
|
||||||
size_t sendLen) = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called by DHB in the GET_WRITE doGetWrite().
|
|
||||||
* Get send confirmation that the data in sendMessage() was sent successfully.
|
|
||||||
* @param cookie
|
|
||||||
* @return -@c RETURN_OK if data was sent successfull
|
|
||||||
* - Everything else triggers falure event with returnvalue as parameter 1
|
|
||||||
*/
|
|
||||||
virtual ReturnValue_t getSendSuccess(CookieIF *cookie) = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Called by DHB in the SEND_WRITE doSendRead().
|
|
||||||
* It is assumed that it is always possible to request a reply
|
|
||||||
* from a device. If a requestLen of 0 is supplied, no reply was enabled
|
|
||||||
* and communication specific action should be taken (e.g. read nothing
|
|
||||||
* or read everything).
|
|
||||||
*
|
*
|
||||||
* @param cookie
|
* @param cookie
|
||||||
* @param requestLen Size of data to read
|
* @param address
|
||||||
* @return -@c RETURN_OK to confirm the request for data has been sent.
|
* @param maxReplyLen
|
||||||
* - Everything else triggers failure event with returnvalue as parameter 1
|
* @return
|
||||||
*/
|
*/
|
||||||
virtual ReturnValue_t requestReceiveMessage(CookieIF *cookie, size_t requestLen) = 0;
|
virtual ReturnValue_t reOpen(Cookie *cookie, uint32_t address,
|
||||||
|
uint32_t maxReplyLen) = 0;
|
||||||
|
|
||||||
|
virtual void close(Cookie *cookie) = 0;
|
||||||
|
|
||||||
|
//SHOULDDO can data be const?
|
||||||
|
virtual ReturnValue_t sendMessage(Cookie *cookie, uint8_t *data,
|
||||||
|
uint32_t len) = 0;
|
||||||
|
|
||||||
|
virtual ReturnValue_t getSendSuccess(Cookie *cookie) = 0;
|
||||||
|
|
||||||
|
virtual ReturnValue_t requestReceiveMessage(Cookie *cookie) = 0;
|
||||||
|
|
||||||
|
virtual ReturnValue_t readReceivedMessage(Cookie *cookie, uint8_t **buffer,
|
||||||
|
uint32_t *size) = 0;
|
||||||
|
|
||||||
|
virtual ReturnValue_t setAddress(Cookie *cookie, uint32_t address) = 0;
|
||||||
|
|
||||||
|
virtual uint32_t getAddress(Cookie *cookie) = 0;
|
||||||
|
|
||||||
|
virtual ReturnValue_t setParameter(Cookie *cookie, uint32_t parameter) = 0;
|
||||||
|
|
||||||
|
virtual uint32_t getParameter(Cookie *cookie) = 0;
|
||||||
|
|
||||||
/**
|
|
||||||
* Called by DHB in the GET_WRITE doGetRead().
|
|
||||||
* This function is used to receive data from the physical device
|
|
||||||
* by implementing and calling related drivers or wrapper functions.
|
|
||||||
* @param cookie
|
|
||||||
* @param data
|
|
||||||
* @param len
|
|
||||||
* @return @c RETURN_OK for successfull receive
|
|
||||||
* - Everything else triggers failure event with returnvalue as parameter 1
|
|
||||||
*/
|
|
||||||
virtual ReturnValue_t readReceivedMessage(CookieIF *cookie, uint8_t **buffer,
|
|
||||||
size_t *size) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* DEVICECOMMUNICATIONIF_H_ */
|
#endif /* DEVICECOMMUNICATIONIF_H_ */
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include <framework/devicehandlers/AcceptsDeviceResponsesIF.h>
|
#include <framework/devicehandlers/AcceptsDeviceResponsesIF.h>
|
||||||
#include <framework/devicehandlers/DeviceHandlerBase.h>
|
#include <framework/devicehandlers/DeviceHandlerBase.h>
|
||||||
#include <framework/devicehandlers/DeviceTmReportingWrapper.h>
|
#include <framework/devicehandlers/DeviceTmReportingWrapper.h>
|
||||||
#include <framework/globalfunctions/crc_ccitt.h>
|
#include <framework/globalfunctions/CRC.h>
|
||||||
#include <framework/objectmanager/ObjectManager.h>
|
#include <framework/objectmanager/ObjectManager.h>
|
||||||
#include <framework/storagemanager/StorageManagerIF.h>
|
#include <framework/storagemanager/StorageManagerIF.h>
|
||||||
#include <framework/subsystem/SubsystemBase.h>
|
#include <framework/subsystem/SubsystemBase.h>
|
||||||
@ -16,33 +16,37 @@ object_id_t DeviceHandlerBase::powerSwitcherId = 0;
|
|||||||
object_id_t DeviceHandlerBase::rawDataReceiverId = 0;
|
object_id_t DeviceHandlerBase::rawDataReceiverId = 0;
|
||||||
object_id_t DeviceHandlerBase::defaultFDIRParentId = 0;
|
object_id_t DeviceHandlerBase::defaultFDIRParentId = 0;
|
||||||
|
|
||||||
DeviceHandlerBase::DeviceHandlerBase(object_id_t setObjectId, object_id_t deviceCommunication,
|
DeviceHandlerBase::DeviceHandlerBase(uint32_t ioBoardAddress,
|
||||||
CookieIF * comCookie_, uint8_t setDeviceSwitch,
|
object_id_t setObjectId, uint32_t maxDeviceReplyLen,
|
||||||
|
uint8_t setDeviceSwitch, object_id_t deviceCommunication,
|
||||||
uint32_t thermalStatePoolId, uint32_t thermalRequestPoolId,
|
uint32_t thermalStatePoolId, uint32_t thermalRequestPoolId,
|
||||||
FailureIsolationBase* fdirInstance, size_t cmdQueueSize) :
|
FailureIsolationBase* fdirInstance, uint32_t cmdQueueSize) :
|
||||||
SystemObject(setObjectId), mode(MODE_OFF), submode(SUBMODE_NONE),
|
SystemObject(setObjectId), rawPacket(0), rawPacketLen(0), mode(
|
||||||
wiretappingMode(OFF), storedRawData(StorageManagerIF::INVALID_ADDRESS),
|
MODE_OFF), submode(SUBMODE_NONE), pstStep(0), maxDeviceReplyLen(
|
||||||
deviceCommunicationId(deviceCommunication), comCookie(comCookie_),
|
maxDeviceReplyLen), wiretappingMode(OFF), defaultRawReceiver(0), storedRawData(
|
||||||
deviceThermalStatePoolId(thermalStatePoolId), deviceThermalRequestPoolId(thermalRequestPoolId),
|
StorageManagerIF::INVALID_ADDRESS), requestedRawTraffic(0), powerSwitcher(
|
||||||
healthHelper(this, setObjectId), modeHelper(this), parameterHelper(this),
|
NULL), IPCStore(NULL), deviceCommunicationId(deviceCommunication), communicationInterface(
|
||||||
fdirInstance(fdirInstance), hkSwitcher(this),
|
NULL), cookie(
|
||||||
defaultFDIRUsed(fdirInstance == nullptr), switchOffWasReported(false),
|
NULL), commandQueue(NULL), deviceThermalStatePoolId(thermalStatePoolId), deviceThermalRequestPoolId(
|
||||||
executingTask(nullptr), actionHelper(this, nullptr), cookieInfo(),
|
thermalRequestPoolId), healthHelper(this, setObjectId), modeHelper(
|
||||||
childTransitionDelay(5000), transitionSourceMode(_MODE_POWER_DOWN),
|
this), parameterHelper(this), childTransitionFailure(RETURN_OK), ignoreMissedRepliesCount(
|
||||||
transitionSourceSubMode(SUBMODE_NONE), deviceSwitch(setDeviceSwitch)
|
0), fdirInstance(fdirInstance), hkSwitcher(this), defaultFDIRUsed(
|
||||||
{
|
fdirInstance == NULL), switchOffWasReported(false),executingTask(NULL), actionHelper(this, NULL), cookieInfo(), ioBoardAddress(
|
||||||
commandQueue = QueueFactory::instance()->
|
ioBoardAddress), timeoutStart(0), childTransitionDelay(5000), transitionSourceMode(
|
||||||
createMessageQueue(cmdQueueSize, CommandMessage::MAX_MESSAGE_SIZE);
|
_MODE_POWER_DOWN), transitionSourceSubMode(SUBMODE_NONE), deviceSwitch(
|
||||||
|
setDeviceSwitch) {
|
||||||
|
commandQueue = QueueFactory::instance()->createMessageQueue(cmdQueueSize,
|
||||||
|
CommandMessage::MAX_MESSAGE_SIZE);
|
||||||
cookieInfo.state = COOKIE_UNUSED;
|
cookieInfo.state = COOKIE_UNUSED;
|
||||||
insertInCommandMap(RAW_COMMAND_ID);
|
insertInCommandMap(RAW_COMMAND_ID);
|
||||||
if (this->fdirInstance == nullptr) {
|
if (this->fdirInstance == NULL) {
|
||||||
this->fdirInstance =
|
this->fdirInstance = new DeviceHandlerFailureIsolation(setObjectId,
|
||||||
new DeviceHandlerFailureIsolation(setObjectId, defaultFDIRParentId);
|
defaultFDIRParentId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceHandlerBase::~DeviceHandlerBase() {
|
DeviceHandlerBase::~DeviceHandlerBase() {
|
||||||
delete comCookie;
|
communicationInterface->close(cookie);
|
||||||
if (defaultFDIRUsed) {
|
if (defaultFDIRUsed) {
|
||||||
delete fdirInstance;
|
delete fdirInstance;
|
||||||
}
|
}
|
||||||
@ -51,6 +55,7 @@ DeviceHandlerBase::~DeviceHandlerBase() {
|
|||||||
|
|
||||||
ReturnValue_t DeviceHandlerBase::performOperation(uint8_t counter) {
|
ReturnValue_t DeviceHandlerBase::performOperation(uint8_t counter) {
|
||||||
this->pstStep = counter;
|
this->pstStep = counter;
|
||||||
|
|
||||||
if (counter == 0) {
|
if (counter == 0) {
|
||||||
cookieInfo.state = COOKIE_UNUSED;
|
cookieInfo.state = COOKIE_UNUSED;
|
||||||
readCommandQueue();
|
readCommandQueue();
|
||||||
@ -59,13 +64,11 @@ ReturnValue_t DeviceHandlerBase::performOperation(uint8_t counter) {
|
|||||||
decrementDeviceReplyMap();
|
decrementDeviceReplyMap();
|
||||||
fdirInstance->checkForFailures();
|
fdirInstance->checkForFailures();
|
||||||
hkSwitcher.performOperation();
|
hkSwitcher.performOperation();
|
||||||
performOperationHook();
|
|
||||||
}
|
}
|
||||||
if (mode == MODE_OFF) {
|
if (mode == MODE_OFF) {
|
||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
}
|
}
|
||||||
|
switch (getRmapAction()) {
|
||||||
switch (getComAction()) {
|
|
||||||
case SEND_WRITE:
|
case SEND_WRITE:
|
||||||
if ((cookieInfo.state == COOKIE_UNUSED)) {
|
if ((cookieInfo.state == COOKIE_UNUSED)) {
|
||||||
buildInternalCommand();
|
buildInternalCommand();
|
||||||
@ -85,84 +88,6 @@ ReturnValue_t DeviceHandlerBase::performOperation(uint8_t counter) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return RETURN_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
ReturnValue_t DeviceHandlerBase::initialize() {
|
|
||||||
ReturnValue_t result = SystemObject::initialize();
|
|
||||||
if (result != RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
communicationInterface = objectManager->get<DeviceCommunicationIF>(
|
|
||||||
deviceCommunicationId);
|
|
||||||
if (communicationInterface == NULL) {
|
|
||||||
return RETURN_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = communicationInterface->initializeInterface(comCookie);
|
|
||||||
if (result != RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
IPCStore = objectManager->get<StorageManagerIF>(objects::IPC_STORE);
|
|
||||||
if (IPCStore == NULL) {
|
|
||||||
return RETURN_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
AcceptsDeviceResponsesIF *rawReceiver = objectManager->get<
|
|
||||||
AcceptsDeviceResponsesIF>(rawDataReceiverId);
|
|
||||||
|
|
||||||
if (rawReceiver == NULL) {
|
|
||||||
return RETURN_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
defaultRawReceiver = rawReceiver->getDeviceQueue();
|
|
||||||
|
|
||||||
powerSwitcher = objectManager->get<PowerSwitchIF>(powerSwitcherId);
|
|
||||||
if (powerSwitcher == NULL) {
|
|
||||||
return RETURN_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = healthHelper.initialize();
|
|
||||||
if (result != RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = modeHelper.initialize();
|
|
||||||
if (result != RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
result = actionHelper.initialize(commandQueue);
|
|
||||||
if (result != RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
result = fdirInstance->initialize();
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = parameterHelper.initialize();
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
result = hkSwitcher.initialize();
|
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
fillCommandAndReplyMap();
|
|
||||||
|
|
||||||
//Set temperature target state to NON_OP.
|
|
||||||
DataSet mySet;
|
|
||||||
PoolVariable<int8_t> thermalRequest(deviceThermalRequestPoolId, &mySet,
|
|
||||||
PoolVariableIF::VAR_WRITE);
|
|
||||||
mySet.read();
|
|
||||||
thermalRequest = ThermalComponentIF::STATE_REQUEST_NON_OPERATIONAL;
|
|
||||||
mySet.commit(PoolVariableIF::VALID);
|
|
||||||
|
|
||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,49 +256,55 @@ ReturnValue_t DeviceHandlerBase::isModeCombinationValid(Mode_t mode,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t DeviceHandlerBase::insertInCommandAndReplyMap(DeviceCommandId_t deviceCommand,
|
ReturnValue_t DeviceHandlerBase::insertInCommandAndReplyMap(
|
||||||
uint16_t maxDelayCycles, size_t replyLen, uint8_t periodic,
|
DeviceCommandId_t deviceCommand, uint16_t maxDelayCycles,
|
||||||
bool hasDifferentReplyId, DeviceCommandId_t replyId) {
|
uint8_t periodic, bool hasDifferentReplyId, DeviceCommandId_t replyId) {
|
||||||
//No need to check, as we may try to insert multiple times.
|
//No need to check, as we may try to insert multiple times.
|
||||||
insertInCommandMap(deviceCommand);
|
insertInCommandMap(deviceCommand);
|
||||||
if (hasDifferentReplyId) {
|
if (hasDifferentReplyId) {
|
||||||
return insertInReplyMap(replyId, maxDelayCycles, replyLen, periodic);
|
return insertInReplyMap(replyId, maxDelayCycles, periodic);
|
||||||
} else {
|
} else {
|
||||||
return insertInReplyMap(deviceCommand, maxDelayCycles, replyLen, periodic);
|
return insertInReplyMap(deviceCommand, maxDelayCycles, periodic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t DeviceHandlerBase::insertInReplyMap(DeviceCommandId_t replyId,
|
ReturnValue_t DeviceHandlerBase::insertInReplyMap(DeviceCommandId_t replyId,
|
||||||
uint16_t maxDelayCycles, size_t replyLen, uint8_t periodic) {
|
uint16_t maxDelayCycles, uint8_t periodic) {
|
||||||
DeviceReplyInfo info;
|
DeviceReplyInfo info;
|
||||||
info.maxDelayCycles = maxDelayCycles;
|
info.maxDelayCycles = maxDelayCycles;
|
||||||
info.periodic = periodic;
|
info.periodic = periodic;
|
||||||
info.delayCycles = 0;
|
info.delayCycles = 0;
|
||||||
info.replyLen = replyLen;
|
|
||||||
info.command = deviceCommandMap.end();
|
info.command = deviceCommandMap.end();
|
||||||
std::pair<DeviceReplyIter, bool> result = deviceReplyMap.emplace(replyId, info);
|
std::pair<std::map<DeviceCommandId_t, DeviceReplyInfo>::iterator, bool> returnValue;
|
||||||
if (result.second) {
|
returnValue = deviceReplyMap.insert(
|
||||||
|
std::pair<DeviceCommandId_t, DeviceReplyInfo>(replyId, info));
|
||||||
|
if (returnValue.second) {
|
||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
} else {
|
} else {
|
||||||
return RETURN_FAILED;
|
return RETURN_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t DeviceHandlerBase::insertInCommandMap(DeviceCommandId_t deviceCommand) {
|
ReturnValue_t DeviceHandlerBase::insertInCommandMap(
|
||||||
|
DeviceCommandId_t deviceCommand) {
|
||||||
DeviceCommandInfo info;
|
DeviceCommandInfo info;
|
||||||
info.expectedReplies = 0;
|
info.expectedReplies = 0;
|
||||||
info.isExecuting = false;
|
info.isExecuting = false;
|
||||||
info.sendReplyTo = NO_COMMANDER;
|
info.sendReplyTo = NO_COMMANDER;
|
||||||
std::pair<DeviceCommandIter, bool> result = deviceCommandMap.emplace(deviceCommand,info);
|
std::pair<std::map<DeviceCommandId_t, DeviceCommandInfo>::iterator, bool> returnValue;
|
||||||
if (result.second) {
|
returnValue = deviceCommandMap.insert(
|
||||||
|
std::pair<DeviceCommandId_t, DeviceCommandInfo>(deviceCommand,
|
||||||
|
info));
|
||||||
|
if (returnValue.second) {
|
||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
} else {
|
} else {
|
||||||
return RETURN_FAILED;
|
return RETURN_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t DeviceHandlerBase::updateReplyMapEntry(DeviceCommandId_t deviceReply,
|
ReturnValue_t DeviceHandlerBase::updateReplyMapEntry(
|
||||||
uint16_t delayCycles, uint16_t maxDelayCycles, uint8_t periodic) {
|
DeviceCommandId_t deviceReply, uint16_t delayCycles,
|
||||||
|
uint16_t maxDelayCycles, uint8_t periodic) {
|
||||||
std::map<DeviceCommandId_t, DeviceReplyInfo>::iterator iter =
|
std::map<DeviceCommandId_t, DeviceReplyInfo>::iterator iter =
|
||||||
deviceReplyMap.find(deviceReply);
|
deviceReplyMap.find(deviceReply);
|
||||||
if (iter == deviceReplyMap.end()) {
|
if (iter == deviceReplyMap.end()) {
|
||||||
@ -485,7 +416,7 @@ void DeviceHandlerBase::replyToReply(DeviceReplyMap::iterator iter,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//Check if more replies are expected. If so, do nothing.
|
//Check if more replies are expected. If so, do nothing.
|
||||||
DeviceCommandInfo * info = &(iter->second.command->second);
|
DeviceCommandInfo* info = &(iter->second.command->second);
|
||||||
if (--info->expectedReplies == 0) {
|
if (--info->expectedReplies == 0) {
|
||||||
//Check if it was transition or internal command. Don't send any replies in that case.
|
//Check if it was transition or internal command. Don't send any replies in that case.
|
||||||
if (info->sendReplyTo != NO_COMMANDER) {
|
if (info->sendReplyTo != NO_COMMANDER) {
|
||||||
@ -498,7 +429,7 @@ void DeviceHandlerBase::replyToReply(DeviceReplyMap::iterator iter,
|
|||||||
void DeviceHandlerBase::doSendWrite() {
|
void DeviceHandlerBase::doSendWrite() {
|
||||||
if (cookieInfo.state == COOKIE_WRITE_READY) {
|
if (cookieInfo.state == COOKIE_WRITE_READY) {
|
||||||
|
|
||||||
ReturnValue_t result = communicationInterface->sendMessage(comCookie,
|
ReturnValue_t result = communicationInterface->sendMessage(cookie,
|
||||||
rawPacket, rawPacketLen);
|
rawPacket, rawPacketLen);
|
||||||
|
|
||||||
if (result == RETURN_OK) {
|
if (result == RETURN_OK) {
|
||||||
@ -519,13 +450,12 @@ void DeviceHandlerBase::doGetWrite() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cookieInfo.state = COOKIE_UNUSED;
|
cookieInfo.state = COOKIE_UNUSED;
|
||||||
ReturnValue_t result = communicationInterface->getSendSuccess(comCookie);
|
ReturnValue_t result = communicationInterface->getSendSuccess(cookie);
|
||||||
if (result == RETURN_OK) {
|
if (result == RETURN_OK) {
|
||||||
if (wiretappingMode == RAW) {
|
if (wiretappingMode == RAW) {
|
||||||
replyRawData(rawPacket, rawPacketLen, requestedRawTraffic, true);
|
replyRawData(rawPacket, rawPacketLen, requestedRawTraffic, true);
|
||||||
}
|
}
|
||||||
//We need to distinguish here, because a raw command never expects a reply.
|
//We need to distinguish here, because a raw command never expects a reply. (Could be done in eRIRM, but then child implementations need to be careful.
|
||||||
//(Could be done in eRIRM, but then child implementations need to be careful.
|
|
||||||
result = enableReplyInReplyMap(cookieInfo.pendingCommand);
|
result = enableReplyInReplyMap(cookieInfo.pendingCommand);
|
||||||
} else {
|
} else {
|
||||||
//always generate a failure event, so that FDIR knows what's up
|
//always generate a failure event, so that FDIR knows what's up
|
||||||
@ -539,25 +469,12 @@ void DeviceHandlerBase::doGetWrite() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DeviceHandlerBase::doSendRead() {
|
void DeviceHandlerBase::doSendRead() {
|
||||||
ReturnValue_t result = RETURN_FAILED;
|
ReturnValue_t result;
|
||||||
size_t requestLen = 0;
|
|
||||||
// If the device handler can only request replies after a command
|
|
||||||
// has been sent, there should be only one reply enabled and the
|
|
||||||
// correct reply length will be mapped.
|
|
||||||
for(DeviceReplyIter iter = deviceReplyMap.begin();
|
|
||||||
iter != deviceReplyMap.end();iter++)
|
|
||||||
{
|
|
||||||
if(iter->second.delayCycles != 0) {
|
|
||||||
requestLen = iter->second.replyLen;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result = communicationInterface->requestReceiveMessage(comCookie, requestLen);
|
result = communicationInterface->requestReceiveMessage(cookie);
|
||||||
if (result == RETURN_OK) {
|
if (result == RETURN_OK) {
|
||||||
cookieInfo.state = COOKIE_READ_SENT;
|
cookieInfo.state = COOKIE_READ_SENT;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
triggerEvent(DEVICE_REQUESTING_REPLY_FAILED, result);
|
triggerEvent(DEVICE_REQUESTING_REPLY_FAILED, result);
|
||||||
//We can't inform anyone, because we don't know which command was sent last.
|
//We can't inform anyone, because we don't know which command was sent last.
|
||||||
//So, we need to wait for a timeout.
|
//So, we need to wait for a timeout.
|
||||||
@ -568,10 +485,10 @@ void DeviceHandlerBase::doSendRead() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DeviceHandlerBase::doGetRead() {
|
void DeviceHandlerBase::doGetRead() {
|
||||||
size_t receivedDataLen;
|
uint32_t receivedDataLen;
|
||||||
uint8_t *receivedData;
|
uint8_t *receivedData;
|
||||||
DeviceCommandId_t foundId = 0xFFFFFFFF;
|
DeviceCommandId_t foundId = 0xFFFFFFFF;
|
||||||
size_t foundLen = 0;
|
uint32_t foundLen = 0;
|
||||||
ReturnValue_t result;
|
ReturnValue_t result;
|
||||||
|
|
||||||
if (cookieInfo.state != COOKIE_READ_SENT) {
|
if (cookieInfo.state != COOKIE_READ_SENT) {
|
||||||
@ -581,7 +498,7 @@ void DeviceHandlerBase::doGetRead() {
|
|||||||
|
|
||||||
cookieInfo.state = COOKIE_UNUSED;
|
cookieInfo.state = COOKIE_UNUSED;
|
||||||
|
|
||||||
result = communicationInterface->readReceivedMessage(comCookie, &receivedData,
|
result = communicationInterface->readReceivedMessage(cookie, &receivedData,
|
||||||
&receivedDataLen);
|
&receivedDataLen);
|
||||||
|
|
||||||
if (result != RETURN_OK) {
|
if (result != RETURN_OK) {
|
||||||
@ -591,7 +508,7 @@ void DeviceHandlerBase::doGetRead() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (receivedDataLen == 0 or result == DeviceCommunicationIF::NO_REPLY_RECEIVED)
|
if (receivedDataLen == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (wiretappingMode == RAW) {
|
if (wiretappingMode == RAW) {
|
||||||
@ -622,8 +539,6 @@ void DeviceHandlerBase::doGetRead() {
|
|||||||
break;
|
break;
|
||||||
case IGNORE_REPLY_DATA:
|
case IGNORE_REPLY_DATA:
|
||||||
break;
|
break;
|
||||||
case IGNORE_FULL_PACKET:
|
|
||||||
return;
|
|
||||||
default:
|
default:
|
||||||
//We need to wait for timeout.. don't know what command failed and who sent it.
|
//We need to wait for timeout.. don't know what command failed and who sent it.
|
||||||
replyRawReplyIfnotWiretapped(receivedData, foundLen);
|
replyRawReplyIfnotWiretapped(receivedData, foundLen);
|
||||||
@ -642,8 +557,8 @@ void DeviceHandlerBase::doGetRead() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t DeviceHandlerBase::getStorageData(store_address_t storageAddress,
|
ReturnValue_t DeviceHandlerBase::getStorageData(store_address_t storageAddress,
|
||||||
uint8_t ** data, size_t * len) {
|
uint8_t * *data, uint32_t * len) {
|
||||||
size_t lenTmp;
|
uint32_t lenTmp;
|
||||||
|
|
||||||
if (IPCStore == NULL) {
|
if (IPCStore == NULL) {
|
||||||
*data = NULL;
|
*data = NULL;
|
||||||
@ -664,6 +579,84 @@ ReturnValue_t DeviceHandlerBase::getStorageData(store_address_t storageAddress,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReturnValue_t DeviceHandlerBase::initialize() {
|
||||||
|
ReturnValue_t result = SystemObject::initialize();
|
||||||
|
if (result != RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
communicationInterface = objectManager->get<DeviceCommunicationIF>(
|
||||||
|
deviceCommunicationId);
|
||||||
|
if (communicationInterface == NULL) {
|
||||||
|
return RETURN_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = communicationInterface->open(&cookie, ioBoardAddress,
|
||||||
|
maxDeviceReplyLen);
|
||||||
|
if (result != RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPCStore = objectManager->get<StorageManagerIF>(objects::IPC_STORE);
|
||||||
|
if (IPCStore == NULL) {
|
||||||
|
return RETURN_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
AcceptsDeviceResponsesIF *rawReceiver = objectManager->get<
|
||||||
|
AcceptsDeviceResponsesIF>(rawDataReceiverId);
|
||||||
|
|
||||||
|
if (rawReceiver == NULL) {
|
||||||
|
return RETURN_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultRawReceiver = rawReceiver->getDeviceQueue();
|
||||||
|
|
||||||
|
powerSwitcher = objectManager->get<PowerSwitchIF>(powerSwitcherId);
|
||||||
|
if (powerSwitcher == NULL) {
|
||||||
|
return RETURN_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = healthHelper.initialize();
|
||||||
|
if (result != RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = modeHelper.initialize();
|
||||||
|
if (result != RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = actionHelper.initialize(commandQueue);
|
||||||
|
if (result != RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = fdirInstance->initialize();
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = parameterHelper.initialize();
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = hkSwitcher.initialize();
|
||||||
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
fillCommandAndReplyMap();
|
||||||
|
|
||||||
|
//Set temperature target state to NON_OP.
|
||||||
|
DataSet mySet;
|
||||||
|
PoolVariable<int8_t> thermalRequest(deviceThermalRequestPoolId, &mySet,
|
||||||
|
PoolVariableIF::VAR_WRITE);
|
||||||
|
mySet.read();
|
||||||
|
thermalRequest = ThermalComponentIF::STATE_REQUEST_NON_OPERATIONAL;
|
||||||
|
mySet.commit(PoolVariableIF::VALID);
|
||||||
|
|
||||||
|
return RETURN_OK;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void DeviceHandlerBase::replyRawData(const uint8_t *data, size_t len,
|
void DeviceHandlerBase::replyRawData(const uint8_t *data, size_t len,
|
||||||
MessageQueueId_t sendTo, bool isCommand) {
|
MessageQueueId_t sendTo, bool isCommand) {
|
||||||
@ -679,6 +672,7 @@ void DeviceHandlerBase::replyRawData(const uint8_t *data, size_t len,
|
|||||||
}
|
}
|
||||||
|
|
||||||
CommandMessage message;
|
CommandMessage message;
|
||||||
|
|
||||||
DeviceHandlerMessage::setDeviceHandlerRawReplyMessage(&message,
|
DeviceHandlerMessage::setDeviceHandlerRawReplyMessage(&message,
|
||||||
getObjectId(), address, isCommand);
|
getObjectId(), address, isCommand);
|
||||||
|
|
||||||
@ -694,7 +688,7 @@ void DeviceHandlerBase::replyRawData(const uint8_t *data, size_t len,
|
|||||||
|
|
||||||
//Default child implementations
|
//Default child implementations
|
||||||
|
|
||||||
DeviceHandlerBase::CommunicationAction_t DeviceHandlerBase::getComAction() {
|
DeviceHandlerBase::RmapAction_t DeviceHandlerBase::getRmapAction() {
|
||||||
switch (pstStep) {
|
switch (pstStep) {
|
||||||
case 0:
|
case 0:
|
||||||
return SEND_WRITE;
|
return SEND_WRITE;
|
||||||
@ -754,20 +748,20 @@ void DeviceHandlerBase::handleReply(const uint8_t* receivedData,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//ReturnValue_t DeviceHandlerBase::switchCookieChannel(object_id_t newChannelId) {
|
ReturnValue_t DeviceHandlerBase::switchCookieChannel(object_id_t newChannelId) {
|
||||||
// DeviceCommunicationIF *newCommunication = objectManager->get<
|
DeviceCommunicationIF *newCommunication = objectManager->get<
|
||||||
// DeviceCommunicationIF>(newChannelId);
|
DeviceCommunicationIF>(newChannelId);
|
||||||
//
|
|
||||||
// if (newCommunication != NULL) {
|
if (newCommunication != NULL) {
|
||||||
// ReturnValue_t result = newCommunication->reOpen(cookie, logicalAddress,
|
ReturnValue_t result = newCommunication->reOpen(cookie, ioBoardAddress,
|
||||||
// maxDeviceReplyLen, comParameter1, comParameter2);
|
maxDeviceReplyLen);
|
||||||
// if (result != RETURN_OK) {
|
if (result != RETURN_OK) {
|
||||||
// return result;
|
return result;
|
||||||
// }
|
}
|
||||||
// return RETURN_OK;
|
return RETURN_OK;
|
||||||
// }
|
}
|
||||||
// return RETURN_FAILED;
|
return RETURN_FAILED;
|
||||||
//}
|
}
|
||||||
|
|
||||||
void DeviceHandlerBase::buildRawDeviceCommand(CommandMessage* commandMessage) {
|
void DeviceHandlerBase::buildRawDeviceCommand(CommandMessage* commandMessage) {
|
||||||
storedRawData = DeviceHandlerMessage::getStoreAddress(commandMessage);
|
storedRawData = DeviceHandlerMessage::getStoreAddress(commandMessage);
|
||||||
@ -777,8 +771,8 @@ void DeviceHandlerBase::buildRawDeviceCommand(CommandMessage* commandMessage) {
|
|||||||
replyReturnvalueToCommand(result, RAW_COMMAND_ID);
|
replyReturnvalueToCommand(result, RAW_COMMAND_ID);
|
||||||
storedRawData.raw = StorageManagerIF::INVALID_ADDRESS;
|
storedRawData.raw = StorageManagerIF::INVALID_ADDRESS;
|
||||||
} else {
|
} else {
|
||||||
cookieInfo.pendingCommand = deviceCommandMap.
|
cookieInfo.pendingCommand = deviceCommandMap.find(
|
||||||
find((DeviceCommandId_t) RAW_COMMAND_ID);
|
(DeviceCommandId_t) RAW_COMMAND_ID);
|
||||||
cookieInfo.pendingCommand->second.isExecuting = true;
|
cookieInfo.pendingCommand->second.isExecuting = true;
|
||||||
cookieInfo.state = COOKIE_WRITE_READY;
|
cookieInfo.state = COOKIE_WRITE_READY;
|
||||||
}
|
}
|
||||||
@ -817,7 +811,7 @@ ReturnValue_t DeviceHandlerBase::enableReplyInReplyMap(
|
|||||||
iter = deviceReplyMap.find(command->first);
|
iter = deviceReplyMap.find(command->first);
|
||||||
}
|
}
|
||||||
if (iter != deviceReplyMap.end()) {
|
if (iter != deviceReplyMap.end()) {
|
||||||
DeviceReplyInfo * info = &(iter->second);
|
DeviceReplyInfo *info = &(iter->second);
|
||||||
info->delayCycles = info->maxDelayCycles;
|
info->delayCycles = info->maxDelayCycles;
|
||||||
info->command = command;
|
info->command = command;
|
||||||
command->second.expectedReplies = expectedReplies;
|
command->second.expectedReplies = expectedReplies;
|
||||||
@ -843,9 +837,8 @@ ReturnValue_t DeviceHandlerBase::getStateOfSwitches(void) {
|
|||||||
ReturnValue_t result = getSwitches(&switches, &numberOfSwitches);
|
ReturnValue_t result = getSwitches(&switches, &numberOfSwitches);
|
||||||
if ((result == RETURN_OK) && (numberOfSwitches != 0)) {
|
if ((result == RETURN_OK) && (numberOfSwitches != 0)) {
|
||||||
while (numberOfSwitches > 0) {
|
while (numberOfSwitches > 0) {
|
||||||
if (powerSwitcher-> getSwitchState(switches[numberOfSwitches - 1])
|
if (powerSwitcher->getSwitchState(switches[numberOfSwitches - 1])
|
||||||
== PowerSwitchIF::SWITCH_OFF)
|
== PowerSwitchIF::SWITCH_OFF) {
|
||||||
{
|
|
||||||
return PowerSwitchIF::SWITCH_OFF;
|
return PowerSwitchIF::SWITCH_OFF;
|
||||||
}
|
}
|
||||||
numberOfSwitches--;
|
numberOfSwitches--;
|
||||||
@ -1051,18 +1044,16 @@ ReturnValue_t DeviceHandlerBase::handleDeviceHandlerMessage(
|
|||||||
}
|
}
|
||||||
replyReturnvalueToCommand(RETURN_OK);
|
replyReturnvalueToCommand(RETURN_OK);
|
||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
case DeviceHandlerMessage::CMD_SWITCH_ADDRESS:
|
case DeviceHandlerMessage::CMD_SWITCH_IOBOARD:
|
||||||
if (mode != MODE_OFF) {
|
if (mode != MODE_OFF) {
|
||||||
replyReturnvalueToCommand(WRONG_MODE_FOR_COMMAND);
|
replyReturnvalueToCommand(WRONG_MODE_FOR_COMMAND);
|
||||||
} else {
|
} else {
|
||||||
// rework in progress
|
result = switchCookieChannel(
|
||||||
result = RETURN_OK;
|
DeviceHandlerMessage::getIoBoardObjectId(message));
|
||||||
//result = switchCookieChannel(
|
|
||||||
// DeviceHandlerMessage::getIoBoardObjectId(message));
|
|
||||||
if (result == RETURN_OK) {
|
if (result == RETURN_OK) {
|
||||||
replyReturnvalueToCommand(RETURN_OK);
|
replyReturnvalueToCommand(RETURN_OK);
|
||||||
} else {
|
} else {
|
||||||
replyReturnvalueToCommand(CANT_SWITCH_ADDRESS);
|
replyReturnvalueToCommand(CANT_SWITCH_IOBOARD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return RETURN_OK;
|
return RETURN_OK;
|
||||||
@ -1121,7 +1112,8 @@ void DeviceHandlerBase::handleDeviceTM(SerializeIF* data,
|
|||||||
|
|
||||||
// hiding of sender needed so the service will handle it as unexpected Data, no matter what state
|
// hiding of sender needed so the service will handle it as unexpected Data, no matter what state
|
||||||
//(progress or completed) it is in
|
//(progress or completed) it is in
|
||||||
actionHelper.reportData(defaultRawReceiver, replyId, &wrapper, true);
|
actionHelper.reportData(defaultRawReceiver, replyId, &wrapper,
|
||||||
|
true);
|
||||||
|
|
||||||
}
|
}
|
||||||
} else { //unrequested/aperiodic replies
|
} else { //unrequested/aperiodic replies
|
||||||
@ -1144,12 +1136,11 @@ void DeviceHandlerBase::handleDeviceTM(SerializeIF* data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t DeviceHandlerBase::executeAction(ActionId_t actionId,
|
ReturnValue_t DeviceHandlerBase::executeAction(ActionId_t actionId,
|
||||||
MessageQueueId_t commandedBy, const uint8_t* data, size_t size) {
|
MessageQueueId_t commandedBy, const uint8_t* data, uint32_t size) {
|
||||||
ReturnValue_t result = acceptExternalDeviceCommands();
|
ReturnValue_t result = acceptExternalDeviceCommands();
|
||||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
DeviceCommandMap::iterator iter = deviceCommandMap.find(actionId);
|
DeviceCommandMap::iterator iter = deviceCommandMap.find(actionId);
|
||||||
if (iter == deviceCommandMap.end()) {
|
if (iter == deviceCommandMap.end()) {
|
||||||
result = COMMAND_NOT_SUPPORTED;
|
result = COMMAND_NOT_SUPPORTED;
|
||||||
@ -1168,7 +1159,7 @@ ReturnValue_t DeviceHandlerBase::executeAction(ActionId_t actionId,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DeviceHandlerBase::buildInternalCommand(void) {
|
void DeviceHandlerBase::buildInternalCommand(void) {
|
||||||
// Neither Raw nor Direct could build a command
|
//Neither Raw nor Direct could build a command
|
||||||
ReturnValue_t result = NOTHING_TO_SEND;
|
ReturnValue_t result = NOTHING_TO_SEND;
|
||||||
DeviceCommandId_t deviceCommandId = NO_COMMAND_ID;
|
DeviceCommandId_t deviceCommandId = NO_COMMAND_ID;
|
||||||
if (mode == MODE_NORMAL) {
|
if (mode == MODE_NORMAL) {
|
||||||
@ -1186,13 +1177,12 @@ void DeviceHandlerBase::buildInternalCommand(void) {
|
|||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == NOTHING_TO_SEND) {
|
if (result == NOTHING_TO_SEND) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (result == RETURN_OK) {
|
if (result == RETURN_OK) {
|
||||||
DeviceCommandMap::iterator iter =
|
DeviceCommandMap::iterator iter = deviceCommandMap.find(
|
||||||
deviceCommandMap.find(deviceCommandId);
|
deviceCommandId);
|
||||||
if (iter == deviceCommandMap.end()) {
|
if (iter == deviceCommandMap.end()) {
|
||||||
result = COMMAND_NOT_SUPPORTED;
|
result = COMMAND_NOT_SUPPORTED;
|
||||||
} else if (iter->second.isExecuting) {
|
} else if (iter->second.isExecuting) {
|
||||||
@ -1207,7 +1197,6 @@ void DeviceHandlerBase::buildInternalCommand(void) {
|
|||||||
cookieInfo.state = COOKIE_WRITE_READY;
|
cookieInfo.state = COOKIE_WRITE_READY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result != RETURN_OK) {
|
if (result != RETURN_OK) {
|
||||||
triggerEvent(DEVICE_BUILDING_COMMAND_FAILED, result, deviceCommandId);
|
triggerEvent(DEVICE_BUILDING_COMMAND_FAILED, result, deviceCommandId);
|
||||||
}
|
}
|
||||||
@ -1281,9 +1270,3 @@ void DeviceHandlerBase::changeHK(Mode_t mode, Submode_t submode, bool enable) {
|
|||||||
void DeviceHandlerBase::setTaskIF(PeriodicTaskIF* task_){
|
void DeviceHandlerBase::setTaskIF(PeriodicTaskIF* task_){
|
||||||
executingTask = task_;
|
executingTask = task_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeviceHandlerBase::debugInterface(uint8_t positionTracker, object_id_t objectId, uint32_t parameter) {
|
|
||||||
}
|
|
||||||
|
|
||||||
void DeviceHandlerBase::performOperationHook() {
|
|
||||||
}
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -8,8 +8,7 @@
|
|||||||
#include <framework/ipc/MessageQueueSenderIF.h>
|
#include <framework/ipc/MessageQueueSenderIF.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This is the Interface used to communicate with a device handler.
|
* This is the Interface used to communicate with a device handler.
|
||||||
* @details Includes all expected return values, events and modes.
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
class DeviceHandlerIF {
|
class DeviceHandlerIF {
|
||||||
@ -23,17 +22,15 @@ public:
|
|||||||
*
|
*
|
||||||
* @details The mode of the device handler must not be confused with the mode the device is in.
|
* @details The mode of the device handler must not be confused with the mode the device is in.
|
||||||
* The mode of the device itself is transparent to the user but related to the mode of the handler.
|
* The mode of the device itself is transparent to the user but related to the mode of the handler.
|
||||||
* MODE_ON and MODE_OFF are included in hasModesIF.h
|
|
||||||
*/
|
*/
|
||||||
|
// MODE_ON = 0, //!< The device is powered and ready to perform operations. In this mode, no commands are sent by the device handler itself, but direct commands van be commanded and will be interpreted
|
||||||
// MODE_ON = 0, //!< The device is powered and ready to perform operations. In this mode, no commands are sent by the device handler itself, but direct commands van be commanded and will be interpreted
|
// MODE_OFF = 1, //!< The device is powered off. The only command accepted in this mode is a mode change to on.
|
||||||
// MODE_OFF = 1, //!< The device is powered off. The only command accepted in this mode is a mode change to on.
|
|
||||||
static const Mode_t MODE_NORMAL = 2; //!< The device is powered on and the device handler periodically sends commands. The commands to be sent are selected by the handler according to the submode.
|
static const Mode_t MODE_NORMAL = 2; //!< The device is powered on and the device handler periodically sends commands. The commands to be sent are selected by the handler according to the submode.
|
||||||
static const Mode_t MODE_RAW = 3; //!< The device is powered on and ready to perform operations. In this mode, raw commands can be sent. The device handler will send all replies received from the command back to the commanding object.
|
static const Mode_t MODE_RAW = 3; //!< The device is powered on and ready to perform operations. In this mode, raw commands can be sent. The device handler will send all replies received from the command back to the commanding object.
|
||||||
static const Mode_t MODE_ERROR_ON = 4; //!4< The device is shut down but the switch could not be turned off, so the device still is powered. In this mode, only a mode change to @c MODE_OFF can be commanded, which tries to switch off the device again.
|
static const Mode_t MODE_ERROR_ON = 4; //!4< The device is shut down but the switch could not be turned off, so the device still is powered. In this mode, only a mode change to @c MODE_OFF can be commanded, which tries to switch off the device again.
|
||||||
static const Mode_t _MODE_START_UP = TRANSITION_MODE_CHILD_ACTION_MASK | 5; //!< This is a transitional state which can not be commanded. The device handler performs all commands to get the device in a state ready to perform commands. When this is completed, the mode changes to @c MODE_ON.
|
static const Mode_t _MODE_START_UP = TRANSITION_MODE_CHILD_ACTION_MASK | 5; //!< This is a transitional state which can not be commanded. The device handler performs all commands to get the device in a state ready to perform commands. When this is completed, the mode changes to @c MODE_ON.
|
||||||
static const Mode_t _MODE_SHUT_DOWN = TRANSITION_MODE_CHILD_ACTION_MASK | 6; //!< This is a transitional state which can not be commanded. The device handler performs all actions and commands to get the device shut down. When the device is off, the mode changes to @c MODE_OFF.
|
static const Mode_t _MODE_SHUT_DOWN = TRANSITION_MODE_CHILD_ACTION_MASK | 6; //!< This is a transitional state which can not be commanded. The device handler performs all actions and commands to get the device shut down. When the device is off, the mode changes to @c MODE_OFF.
|
||||||
static const Mode_t _MODE_TO_ON = TRANSITION_MODE_CHILD_ACTION_MASK | HasModesIF::MODE_ON; //!< It is possible to set the mode to _MODE_TO_ON to use the to on transition if available.
|
static const Mode_t _MODE_TO_ON = TRANSITION_MODE_CHILD_ACTION_MASK | HasModesIF::MODE_ON;
|
||||||
static const Mode_t _MODE_TO_RAW = TRANSITION_MODE_CHILD_ACTION_MASK | MODE_RAW;
|
static const Mode_t _MODE_TO_RAW = TRANSITION_MODE_CHILD_ACTION_MASK | MODE_RAW;
|
||||||
static const Mode_t _MODE_TO_NORMAL = TRANSITION_MODE_CHILD_ACTION_MASK | MODE_NORMAL;
|
static const Mode_t _MODE_TO_NORMAL = TRANSITION_MODE_CHILD_ACTION_MASK | MODE_NORMAL;
|
||||||
static const Mode_t _MODE_POWER_DOWN = TRANSITION_MODE_BASE_ACTION_MASK | 1; //!< This is a transitional state which can not be commanded. The device is shut down and ready to be switched off. After the command to set the switch off has been sent, the mode changes to @c MODE_WAIT_OFF
|
static const Mode_t _MODE_POWER_DOWN = TRANSITION_MODE_BASE_ACTION_MASK | 1; //!< This is a transitional state which can not be commanded. The device is shut down and ready to be switched off. After the command to set the switch off has been sent, the mode changes to @c MODE_WAIT_OFF
|
||||||
@ -56,62 +53,49 @@ public:
|
|||||||
static const Event MONITORING_AMBIGUOUS = MAKE_EVENT(10, SEVERITY::HIGH);
|
static const Event MONITORING_AMBIGUOUS = MAKE_EVENT(10, SEVERITY::HIGH);
|
||||||
|
|
||||||
static const uint8_t INTERFACE_ID = CLASS_ID::DEVICE_HANDLER_IF;
|
static const uint8_t INTERFACE_ID = CLASS_ID::DEVICE_HANDLER_IF;
|
||||||
|
static const ReturnValue_t NO_COMMAND_DATA = MAKE_RETURN_CODE(0xA0);
|
||||||
|
static const ReturnValue_t COMMAND_NOT_SUPPORTED = MAKE_RETURN_CODE(0xA1);
|
||||||
|
static const ReturnValue_t COMMAND_ALREADY_SENT = MAKE_RETURN_CODE(0xA2);
|
||||||
|
static const ReturnValue_t COMMAND_WAS_NOT_SENT = MAKE_RETURN_CODE(0xA3);
|
||||||
|
static const ReturnValue_t CANT_SWITCH_IOBOARD = MAKE_RETURN_CODE(0xA4);
|
||||||
|
static const ReturnValue_t WRONG_MODE_FOR_COMMAND = MAKE_RETURN_CODE(0xA5);
|
||||||
|
static const ReturnValue_t TIMEOUT = MAKE_RETURN_CODE(0xA6);
|
||||||
|
static const ReturnValue_t BUSY = MAKE_RETURN_CODE(0xA7);
|
||||||
|
static const ReturnValue_t NO_REPLY_EXPECTED = MAKE_RETURN_CODE(0xA8); //!< Used to indicate that this is a command-only command.
|
||||||
|
static const ReturnValue_t NON_OP_TEMPERATURE = MAKE_RETURN_CODE(0xA9);
|
||||||
|
static const ReturnValue_t COMMAND_NOT_IMPLEMENTED = MAKE_RETURN_CODE(0xAA);
|
||||||
|
|
||||||
// Standard codes used when building commands.
|
//standard codes used in scan for reply
|
||||||
static const ReturnValue_t NOTHING_TO_SEND = MAKE_RETURN_CODE(0xA0); //!< Return this if no command sending in required
|
// static const ReturnValue_t TOO_SHORT = MAKE_RETURN_CODE(0xB1);
|
||||||
// Mostly used for internal handling.
|
static const ReturnValue_t CHECKSUM_ERROR = MAKE_RETURN_CODE(0xB2);
|
||||||
static const ReturnValue_t NO_COMMAND_DATA = MAKE_RETURN_CODE(0xA2); //!< If the command size is 0. Checked in DHB
|
static const ReturnValue_t LENGTH_MISSMATCH = MAKE_RETURN_CODE(0xB3);
|
||||||
static const ReturnValue_t NO_REPLY_EXPECTED = MAKE_RETURN_CODE(0xA3); //!< Used to indicate that this is a command-only command.
|
static const ReturnValue_t INVALID_DATA = MAKE_RETURN_CODE(0xB4);
|
||||||
static const ReturnValue_t COMMAND_NOT_SUPPORTED = MAKE_RETURN_CODE(0xA4); //!< Command ID not in commandMap. Checked in DHB
|
static const ReturnValue_t PROTOCOL_ERROR = MAKE_RETURN_CODE(0xB5);
|
||||||
static const ReturnValue_t COMMAND_ALREADY_SENT = MAKE_RETURN_CODE(0xA5); //!< Command was already executed. Checked in DHB
|
|
||||||
static const ReturnValue_t COMMAND_WAS_NOT_SENT = MAKE_RETURN_CODE(0xA6);
|
|
||||||
static const ReturnValue_t CANT_SWITCH_ADDRESS = MAKE_RETURN_CODE(0xA7);
|
|
||||||
static const ReturnValue_t WRONG_MODE_FOR_COMMAND = MAKE_RETURN_CODE(0xA8);
|
|
||||||
static const ReturnValue_t TIMEOUT = MAKE_RETURN_CODE(0xA9);
|
|
||||||
static const ReturnValue_t BUSY = MAKE_RETURN_CODE(0xAA);
|
|
||||||
static const ReturnValue_t NON_OP_TEMPERATURE = MAKE_RETURN_CODE(0xAB);
|
|
||||||
static const ReturnValue_t COMMAND_NOT_IMPLEMENTED = MAKE_RETURN_CODE(0xAC);
|
|
||||||
|
|
||||||
// Standard codes used in scanForReply
|
//standard codes used in interpret device reply
|
||||||
static const ReturnValue_t APERIODIC_REPLY = MAKE_RETURN_CODE(0xB1); //!< This is used to specify for replies from a device which are not replies to requests
|
|
||||||
static const ReturnValue_t LENGTH_MISSMATCH = MAKE_RETURN_CODE(0xB2);
|
|
||||||
static const ReturnValue_t IGNORE_REPLY_DATA = MAKE_RETURN_CODE(0xB3); //!< Ignore parts of the received packet
|
|
||||||
static const ReturnValue_t IGNORE_FULL_PACKET = MAKE_RETURN_CODE(0xB4); //!< Ignore full received packet
|
|
||||||
static const ReturnValue_t CHECKSUM_ERROR = MAKE_RETURN_CODE(0xB5);
|
|
||||||
static const ReturnValue_t INVALID_DATA = MAKE_RETURN_CODE(0xB6);
|
|
||||||
static const ReturnValue_t PROTOCOL_ERROR = MAKE_RETURN_CODE(0xB7);
|
|
||||||
|
|
||||||
// Standard codes used in interpretDeviceReply
|
|
||||||
static const ReturnValue_t DEVICE_DID_NOT_EXECUTE = MAKE_RETURN_CODE(0xC1); //the device reported, that it did not execute the command
|
static const ReturnValue_t DEVICE_DID_NOT_EXECUTE = MAKE_RETURN_CODE(0xC1); //the device reported, that it did not execute the command
|
||||||
static const ReturnValue_t DEVICE_REPORTED_ERROR = MAKE_RETURN_CODE(0xC2);
|
static const ReturnValue_t DEVICE_REPORTED_ERROR = MAKE_RETURN_CODE(0xC2);
|
||||||
static const ReturnValue_t UNKNOW_DEVICE_REPLY = MAKE_RETURN_CODE(0xC3); //the deviceCommandId reported by scanforReply is unknown
|
static const ReturnValue_t UNKNOW_DEVICE_REPLY = MAKE_RETURN_CODE(0xC3); //the deviceCommandId reported by scanforReply is unknown
|
||||||
static const ReturnValue_t DEVICE_REPLY_INVALID = MAKE_RETURN_CODE(0xC4); //syntax etc is correct but still not ok, eg parameters where none are expected
|
static const ReturnValue_t DEVICE_REPLY_INVALID = MAKE_RETURN_CODE(0xC4); //syntax etc is correct but still not ok, eg parameters where none are expected
|
||||||
|
|
||||||
// Standard codes used in buildCommandFromCommand
|
//Standard codes used in buildCommandFromCommand
|
||||||
static const ReturnValue_t INVALID_COMMAND_PARAMETER = MAKE_RETURN_CODE(0xD0);
|
static const ReturnValue_t INVALID_COMMAND_PARAMETER = MAKE_RETURN_CODE(
|
||||||
static const ReturnValue_t INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS = MAKE_RETURN_CODE(0xD1);
|
0xD0);
|
||||||
|
static const ReturnValue_t INVALID_NUMBER_OR_LENGTH_OF_PARAMETERS =
|
||||||
// Standard codes used in getSwitches
|
MAKE_RETURN_CODE(0xD1);
|
||||||
static const ReturnValue_t NO_SWITCH = MAKE_RETURN_CODE(0xE1); //!< Return in getSwitches() to specify there are no switches
|
|
||||||
|
|
||||||
// static const ReturnValue_t ONE_SWITCH = MAKE_RETURN_CODE(8);
|
|
||||||
// static const ReturnValue_t TWO_SWITCHES = MAKE_RETURN_CODE(9);
|
|
||||||
// where is this used?
|
|
||||||
// static const ReturnValue_t COMMAND_MAP_ERROR = MAKE_RETURN_CODE(11);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Communication action that will be executed.
|
* RMAP Action that will be executed.
|
||||||
*
|
*
|
||||||
* This is used by the child class to tell the base class what to do.
|
* This is used by the child class to tell the base class what to do.
|
||||||
*/
|
*/
|
||||||
enum CommunicationAction_t: uint8_t {
|
enum RmapAction_t {
|
||||||
SEND_WRITE,//!< Send write
|
SEND_WRITE,//!< RMAP send write
|
||||||
GET_WRITE, //!< Get write
|
GET_WRITE, //!< RMAP get write
|
||||||
SEND_READ, //!< Send read
|
SEND_READ, //!< RMAP send read
|
||||||
GET_READ, //!< Get read
|
GET_READ, //!< RMAP get read
|
||||||
NOTHING //!< Do nothing.
|
NOTHING //!< Do nothing.
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Destructor
|
* Default Destructor
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user