135 lines
5.6 KiB
C++
135 lines
5.6 KiB
C++
#ifndef TEST_TESTDEVICES_TESTDEVICEHANDLER_H_
|
|
#define TEST_TESTDEVICES_TESTDEVICEHANDLER_H_
|
|
|
|
#include "devicedefinitions/testDeviceDefinitions.h"
|
|
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
|
|
#include "fsfw/globalfunctions/PeriodicOperationDivider.h"
|
|
#include "fsfw/timemanager/Countdown.h"
|
|
|
|
/**
|
|
* @brief Basic dummy device handler to test device commanding without a physical device.
|
|
* @details
|
|
* This test device handler provided a basic demo for the device handler object.
|
|
* It can also be commanded with the following PUS services, using
|
|
* the specified object ID of the test device handler.
|
|
*
|
|
* 1. PUS Service 8 - Functional commanding
|
|
* 2. PUS Service 2 - Device access, raw commanding
|
|
* 3. PUS Service 20 - Parameter Management
|
|
* 4. PUS Service 3 - Housekeeping
|
|
|
|
* @author R. Mueller
|
|
* @ingroup devices
|
|
*/
|
|
class TestDevice : public DeviceHandlerBase {
|
|
public:
|
|
/**
|
|
* Build the test device in the factory.
|
|
* @param objectId This ID will be assigned to the test device handler.
|
|
* @param comIF The ID of the Communication IF used by test device handler.
|
|
* @param cookie Cookie object used by the test device handler. This is
|
|
* also used and passed to the comIF object.
|
|
* @param onImmediately This will start a transition to MODE_ON immediately
|
|
* so the device handler jumps into #doStartUp. Should only be used
|
|
* in development to reduce need of commanding while debugging.
|
|
* @param changingDataset
|
|
* Will be used later to change the local datasets containeds in the device.
|
|
*/
|
|
TestDevice(object_id_t objectId, object_id_t comIF, CookieIF* cookie,
|
|
testdevice::DeviceIndex deviceIdx = testdevice::DeviceIndex::DEVICE_0,
|
|
bool fullInfoPrintout = false, bool changingDataset = true);
|
|
|
|
/**
|
|
* This can be used to enable and disable a lot of demo print output.
|
|
* @param enable
|
|
*/
|
|
void enableFullDebugOutput(bool enable);
|
|
|
|
virtual ~TestDevice();
|
|
|
|
//! Size of internal buffer used for communication.
|
|
static constexpr uint8_t MAX_BUFFER_SIZE = 255;
|
|
|
|
//! Unique index if the device handler is created multiple times.
|
|
testdevice::DeviceIndex deviceIdx = testdevice::DeviceIndex::DEVICE_0;
|
|
|
|
protected:
|
|
testdevice::TestDataSet dataset;
|
|
//! This is used to reset the dataset after a commanded change has been made.
|
|
bool resetAfterChange = false;
|
|
bool commandSent = false;
|
|
|
|
/** DeviceHandlerBase overrides (see DHB documentation) */
|
|
|
|
/**
|
|
* Hook into the DHB #performOperation call which is executed
|
|
* periodically.
|
|
*/
|
|
void performOperationHook() override;
|
|
|
|
virtual void doStartUp() override;
|
|
virtual void doShutDown() override;
|
|
|
|
virtual ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override;
|
|
virtual ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t* id) override;
|
|
virtual ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
|
const uint8_t* commandData,
|
|
size_t commandDataLen) override;
|
|
|
|
virtual void fillCommandAndReplyMap() override;
|
|
|
|
virtual ReturnValue_t scanForReply(const uint8_t* start, size_t len, DeviceCommandId_t* foundId,
|
|
size_t* foundLen) override;
|
|
virtual ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override;
|
|
virtual uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
|
|
|
virtual void doTransition(Mode_t modeFrom, Submode_t subModeFrom) override;
|
|
|
|
virtual ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
|
LocalDataPoolManager& poolManager) override;
|
|
virtual LocalPoolObjectBase* getPoolObjectHandle(lp_id_t localPoolId) override;
|
|
|
|
/* HasParametersIF overrides */
|
|
virtual ReturnValue_t getParameter(uint8_t domainId, uint8_t uniqueId,
|
|
ParameterWrapper* parameterWrapper,
|
|
const ParameterWrapper* newValues,
|
|
uint16_t startAtIndex) override;
|
|
|
|
uint8_t commandBuffer[MAX_BUFFER_SIZE];
|
|
|
|
bool fullInfoPrintout = false;
|
|
bool oneShot = true;
|
|
|
|
/* Variables for parameter service */
|
|
uint32_t testParameter0 = 0;
|
|
int32_t testParameter1 = -2;
|
|
float vectorFloatParams2[3] = {};
|
|
|
|
/* Change device handler functionality, changeable via parameter service */
|
|
uint8_t periodicPrintout = false;
|
|
uint8_t changingDatasets = false;
|
|
|
|
ReturnValue_t buildNormalModeCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData,
|
|
size_t commandDataLen);
|
|
ReturnValue_t buildTestCommand0(DeviceCommandId_t deviceCommand, const uint8_t* commandData,
|
|
size_t commandDataLen);
|
|
ReturnValue_t buildTestCommand1(DeviceCommandId_t deviceCommand, const uint8_t* commandData,
|
|
size_t commandDataLen);
|
|
void passOnCommand(DeviceCommandId_t command, const uint8_t* commandData, size_t commandDataLen);
|
|
|
|
ReturnValue_t interpretingNormalModeReply();
|
|
ReturnValue_t interpretingTestReply0(DeviceCommandId_t id, const uint8_t* packet);
|
|
ReturnValue_t interpretingTestReply1(DeviceCommandId_t id, const uint8_t* packet);
|
|
ReturnValue_t interpretingTestReply2(DeviceCommandId_t id, const uint8_t* packet);
|
|
|
|
/* Some timer utilities */
|
|
uint8_t divider1 = 2;
|
|
PeriodicOperationDivider opDivider1 = PeriodicOperationDivider(divider1);
|
|
uint8_t divider2 = 10;
|
|
PeriodicOperationDivider opDivider2 = PeriodicOperationDivider(divider2);
|
|
static constexpr uint32_t initTimeout = 2000;
|
|
Countdown countdown1 = Countdown(initTimeout);
|
|
};
|
|
|
|
#endif /* TEST_TESTDEVICES_TESTDEVICEHANDLER_H_ */
|