2021-05-03 11:59:33 +02:00
|
|
|
#ifndef MISSION_DEVICES_SUSHANDLER_H_
|
|
|
|
#define MISSION_DEVICES_SUSHANDLER_H_
|
|
|
|
|
2021-05-17 19:39:35 +02:00
|
|
|
#include "devicedefinitions/SusDefinitions.h"
|
2021-05-03 11:59:33 +02:00
|
|
|
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
2021-07-15 19:06:57 +02:00
|
|
|
#include <fsfw/hal/linux/gpio/LinuxLibgpioIF.h>
|
2021-05-03 11:59:33 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief This is the device handler class for the SUS sensor. The sensor is
|
|
|
|
* based on the MAX1227 ADC. Details about the SUS electronic can be found at
|
|
|
|
* https://egit.irs.uni-stuttgart.de/eive/eive_dokumente/src/branch/master/400_Raumsegment/443_SunSensorDocumentation/release
|
|
|
|
*
|
|
|
|
* @details Datasheet of MAX1227: https://datasheets.maximintegrated.com/en/ds/MAX1227-MAX1231.pdf
|
|
|
|
*
|
2021-05-12 16:38:20 +02:00
|
|
|
* @note When adding a SusHandler to the polling sequence table make sure to add a slot with
|
|
|
|
* the executionStep FIRST_WRITE. Otherwise the communication sequence will never be
|
|
|
|
* started.
|
|
|
|
*
|
2021-05-03 11:59:33 +02:00
|
|
|
* @author J. Meier
|
|
|
|
*/
|
|
|
|
class SusHandler: public DeviceHandlerBase {
|
|
|
|
public:
|
|
|
|
|
2021-05-12 16:38:20 +02:00
|
|
|
static const uint8_t FIRST_WRITE = 7;
|
|
|
|
|
2021-05-03 11:59:33 +02:00
|
|
|
SusHandler(object_id_t objectId, object_id_t comIF,
|
2021-05-07 18:48:42 +02:00
|
|
|
CookieIF * comCookie, LinuxLibgpioIF* gpioComIF, gpioId_t chipSelectId);
|
2021-05-03 11:59:33 +02:00
|
|
|
virtual ~SusHandler();
|
|
|
|
|
2021-05-12 16:38:20 +02:00
|
|
|
virtual ReturnValue_t performOperation(uint8_t counter) override;
|
|
|
|
|
|
|
|
virtual ReturnValue_t initialize() override;
|
2021-05-12 13:06:56 +02:00
|
|
|
|
2021-05-03 11:59:33 +02:00
|
|
|
protected:
|
|
|
|
void doStartUp() override;
|
|
|
|
void doShutDown() override;
|
|
|
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t * id) override;
|
|
|
|
ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t * id) override;
|
|
|
|
void fillCommandAndReplyMap() override;
|
|
|
|
ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
|
|
|
const uint8_t * commandData,size_t commandDataLen) override;
|
|
|
|
ReturnValue_t scanForReply(const uint8_t *start, size_t remainingSize,
|
|
|
|
DeviceCommandId_t *foundId, size_t *foundLen) override;
|
|
|
|
ReturnValue_t interpretDeviceReply(DeviceCommandId_t id,
|
|
|
|
const uint8_t *packet) override;
|
|
|
|
void setNormalDatapoolEntriesInvalid() override;
|
|
|
|
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
|
|
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
|
|
|
LocalDataPoolManager& poolManager) override;
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
2021-05-12 13:06:56 +02:00
|
|
|
static const uint8_t INTERFACE_ID = CLASS_ID::SUS_HANDLER;
|
|
|
|
|
|
|
|
static const ReturnValue_t ERROR_UNLOCK_MUTEX = MAKE_RETURN_CODE(0xA0);
|
|
|
|
static const ReturnValue_t ERROR_LOCK_MUTEX = MAKE_RETURN_CODE(0xA1);
|
|
|
|
|
2021-05-03 11:59:33 +02:00
|
|
|
enum class CommunicationStep {
|
2021-05-12 16:38:20 +02:00
|
|
|
IDLE,
|
2021-05-09 16:48:55 +02:00
|
|
|
WRITE_SETUP,
|
2021-05-10 11:13:39 +02:00
|
|
|
START_CONVERSIONS,
|
|
|
|
READ_CONVERSIONS
|
2021-05-03 11:59:33 +02:00
|
|
|
};
|
|
|
|
|
2021-05-07 18:48:42 +02:00
|
|
|
LinuxLibgpioIF* gpioComIF = nullptr;
|
|
|
|
|
|
|
|
gpioId_t chipSelectId = gpio::NO_GPIO;
|
|
|
|
|
2021-05-03 11:59:33 +02:00
|
|
|
SUS::SusDataset dataset;
|
|
|
|
|
2021-05-06 18:00:58 +02:00
|
|
|
uint8_t cmdBuffer[SUS::MAX_CMD_SIZE];
|
2021-05-12 16:38:20 +02:00
|
|
|
CommunicationStep communicationStep = CommunicationStep::IDLE;
|
2021-05-12 13:06:56 +02:00
|
|
|
|
|
|
|
MutexIF::TimeoutType timeoutType = MutexIF::TimeoutType::WAITING;
|
|
|
|
uint32_t timeoutMs = 20;
|
|
|
|
|
|
|
|
MutexIF* spiMutex = nullptr;
|
2021-05-03 11:59:33 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* MISSION_DEVICES_SUSHANDLER_H_ */
|