meier/master #33

Merged
muellerr merged 24 commits from meier/master into develop 2021-05-17 14:59:47 +02:00
4 changed files with 52 additions and 90 deletions
Showing only changes of commit e1e69539ca - Show all commits

View File

@ -34,18 +34,14 @@ ReturnValue_t SusHandler::buildNormalDeviceCommand(
DeviceCommandId_t * id) { DeviceCommandId_t * id) {
if (communicationStep == CommunicationStep::WRITE_SETUP) { if (communicationStep == CommunicationStep::WRITE_SETUP) {
*id = SUS::WRITE_SETUP; *id = SUS::WRITE_SETUP;
communicationStep = CommunicationStep::REQUEST_TEMPERATURE; communicationStep = CommunicationStep::START_CONVERSIONS;
} }
else if (communicationStep == CommunicationStep::REQUEST_TEMPERATURE) { else if (communicationStep == CommunicationStep::START_CONVERSIONS) {
*id = SUS::REQUEST_TEMPERATURE; *id = SUS::START_CONVERSIONS;
communicationStep = CommunicationStep::READ_TEMPERATURE; communicationStep = CommunicationStep::READ_CONVERSIONS;
} }
else if (communicationStep == CommunicationStep::READ_TEMPERATURE) { else if (communicationStep == CommunicationStep::READ_CONVERSIONS) {
*id = SUS::READ_TEMPERATURE; *id = SUS::READ_CONVERSIONS;
communicationStep = CommunicationStep::READ_CHANNELS;
}
else if (communicationStep == CommunicationStep::READ_CHANNELS) {
*id = SUS::READ_CHANNELS;
communicationStep = CommunicationStep::WRITE_SETUP; communicationStep = CommunicationStep::WRITE_SETUP;
} }
return buildCommandFromCommand(*id, nullptr, 0); return buildCommandFromCommand(*id, nullptr, 0);
@ -69,41 +65,22 @@ ReturnValue_t SusHandler::buildCommandFromCommand(
*/ */
//TODO: Protect spi bus with mutex //TODO: Protect spi bus with mutex
gpioComIF->pullLow(chipSelectId); gpioComIF->pullLow(chipSelectId);
cmdBuffer[0] = SUS::SETUP_DEFINITION; cmdBuffer[0] = SUS::SETUP;
rawPacket = cmdBuffer; rawPacket = cmdBuffer;
rawPacketLen = 1; rawPacketLen = 1;
return RETURN_OK; return RETURN_OK;
} }
case(SUS::READ_CHANNELS): { case(SUS::START_CONVERSIONS): {
std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); std::memset(cmdBuffer, 0, sizeof(cmdBuffer));
cmdBuffer[0] = SUS::CONVERT_DIFF_CHANNEL_0; cmdBuffer[0] = SUS::CONVERSION;
cmdBuffer[1] = SUS::DUMMY_BYTE;
cmdBuffer[2] = SUS::CONVERT_DIFF_CHANNEL_1;
cmdBuffer[3] = SUS::DUMMY_BYTE;
cmdBuffer[4] = SUS::CONVERT_DIFF_CHANNEL_2;
cmdBuffer[5] = SUS::DUMMY_BYTE;
cmdBuffer[6] = SUS::CONVERT_DIFF_CHANNEL_3;
cmdBuffer[7] = SUS::DUMMY_BYTE;
cmdBuffer[8] = SUS::CONVERT_DIFF_CHANNEL_4;
cmdBuffer[9] = SUS::DUMMY_BYTE;
cmdBuffer[10] = SUS::CONVERT_DIFF_CHANNEL_5;
cmdBuffer[11] = SUS::DUMMY_BYTE;
cmdBuffer[12] = SUS::DUMMY_BYTE;
rawPacket = cmdBuffer; rawPacket = cmdBuffer;
rawPacketLen = SUS::SIZE_READ_CHANNELS; rawPacketLen = 1;
return RETURN_OK; return RETURN_OK;
} }
case(SUS::REQUEST_TEMPERATURE): { case(SUS::READ_CONVERSIONS): {
std::memset(cmdBuffer, 0, sizeof(cmdBuffer));
cmdBuffer[0] = SUS::CONVERT_TEMPERATURE;
rawPacket = cmdBuffer;
rawPacketLen = 1;
return RETURN_OK;
}
case(SUS::READ_TEMPERATURE): {
std::memset(cmdBuffer, 0, sizeof(cmdBuffer)); std::memset(cmdBuffer, 0, sizeof(cmdBuffer));
rawPacket = cmdBuffer; rawPacket = cmdBuffer;
rawPacketLen = 24; rawPacketLen = SUS::SIZE_READ_CONVERSIONS;
return RETURN_OK; return RETURN_OK;
} }
default: default:
@ -114,10 +91,8 @@ ReturnValue_t SusHandler::buildCommandFromCommand(
void SusHandler::fillCommandAndReplyMap() { void SusHandler::fillCommandAndReplyMap() {
this->insertInCommandMap(SUS::WRITE_SETUP); this->insertInCommandMap(SUS::WRITE_SETUP);
this->insertInCommandMap(SUS::REQUEST_TEMPERATURE); this->insertInCommandMap(SUS::START_CONVERSIONS);
this->insertInCommandAndReplyMap(SUS::READ_CHANNELS, 1, &dataset, SUS::SIZE_READ_CHANNELS); this->insertInCommandAndReplyMap(SUS::READ_CONVERSIONS, 1, &dataset, SUS::SIZE_READ_CONVERSIONS);
this->insertInCommandAndReplyMap(SUS::READ_TEMPERATURE, 1, nullptr,
SUS::SIZE_READ_TEMPERATURE);
} }
ReturnValue_t SusHandler::scanForReply(const uint8_t *start, ReturnValue_t SusHandler::scanForReply(const uint8_t *start,
@ -130,15 +105,18 @@ ReturnValue_t SusHandler::scanForReply(const uint8_t *start,
ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id, ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id,
const uint8_t *packet) { const uint8_t *packet) {
switch (id) { switch (id) {
case SUS::READ_CHANNELS: { case SUS::READ_CONVERSIONS: {
PoolReadGuard readSet(&dataset); PoolReadGuard readSet(&dataset);
dataset.ain0 = (*(packet + 1) << 8 | *(packet + 2)); dataset.temperatureCelcius = (*(packet) << 8 | *(packet + 1)) * 0.125;
dataset.ain1 = (*(packet + 3) << 8 | *(packet + 4)); dataset.ain0 = (*(packet + 2) << 8 | *(packet + 3));
dataset.ain2 = (*(packet + 5) << 8 | *(packet + 6)); dataset.ain1 = (*(packet + 4) << 8 | *(packet + 5));
dataset.ain3 = (*(packet + 7) << 8 | *(packet + 8)); dataset.ain2 = (*(packet + 6) << 8 | *(packet + 7));
dataset.ain4 = (*(packet + 9) << 8 | *(packet + 10)); dataset.ain3 = (*(packet + 8) << 8 | *(packet + 9));
dataset.ain5 = (*(packet + 11) << 8 | *(packet + 12)); dataset.ain4 = (*(packet + 10) << 8 | *(packet + 11));
dataset.ain5 = (*(packet + 12) << 8 | *(packet + 13));
#if OBSW_VERBOSE_LEVEL >= 1 && DEBUG_SUS #if OBSW_VERBOSE_LEVEL >= 1 && DEBUG_SUS
sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", Temperature: "
<< dataset.temperatureCelcius << " °C" << std::endl;
sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN0: " sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN0: "
<< std::dec << dataset.ain0 << std::endl; << std::dec << dataset.ain0 << std::endl;
sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN1: " sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN1: "
@ -152,22 +130,10 @@ ReturnValue_t SusHandler::interpretDeviceReply(DeviceCommandId_t id,
sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN5: " sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", AIN5: "
<< std::dec << dataset.ain5 << std::endl; << std::dec << dataset.ain5 << std::endl;
#endif #endif
/** /** SUS can now be shutdown and thus the SPI bus released again */
* Reading the channel conversion results is the last communication step in one SUS
* sequence. SPI bus can now be released again.
*/
gpioComIF->pullHigh(chipSelectId); gpioComIF->pullHigh(chipSelectId);
break; break;
} }
case SUS::READ_TEMPERATURE: {
PoolReadGuard readSet(&dataset);
dataset.temperatureCelcius = (*(packet + 22) << 8 | *(packet + 23)) * 0.125;
#if OBSW_VERBOSE_LEVEL >= 1 && DEBUG_SUS
sif::info << "SUS object id 0x" << std::hex << this->getObjectId() << ", temperature: "
<< dataset.temperatureCelcius << " °C" << std::endl;
#endif
break;
}
default: { default: {
sif::debug << "SusHandler::interpretDeviceReply: Unknown reply id" << std::endl; sif::debug << "SusHandler::interpretDeviceReply: Unknown reply id" << std::endl;
return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY; return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY;

View File

@ -42,9 +42,8 @@ private:
enum class CommunicationStep { enum class CommunicationStep {
WRITE_SETUP, WRITE_SETUP,
REQUEST_TEMPERATURE, START_CONVERSIONS,
READ_TEMPERATURE, READ_CONVERSIONS
READ_CHANNELS
}; };
LinuxLibgpioIF* gpioComIF = nullptr; LinuxLibgpioIF* gpioComIF = nullptr;

View File

@ -18,7 +18,7 @@ namespace RAD_SENSOR {
* power on. * power on.
* *
* @note Bit1 (DIFFSEL1) - Bit0 (DIFFSEL0): 0b00, no data follows the setup byte * @note Bit1 (DIFFSEL1) - Bit0 (DIFFSEL0): 0b00, no data follows the setup byte
* Bit3 (REFSEL1) - Bit2 (REFSEL0): 0b01, external reference single ended * Bit3 (REFSEL1) - Bit2 (REFSEL0): 0b10, internal reference, no wake-up delay
* Bit5 (CLKSEL1) - Bit4 (CLKSEL0): 0b10, MAX1227 uses internal oscillator for timing * Bit5 (CLKSEL1) - Bit4 (CLKSEL0): 0b10, MAX1227 uses internal oscillator for timing
* Bit7 - Bit6: 0b01, tells MAX1227 that this is the setup register * Bit7 - Bit6: 0b01, tells MAX1227 that this is the setup register
* *

View File

@ -11,55 +11,52 @@ namespace SUS {
static const DeviceCommandId_t NONE = 0x0; // Set when no command is pending static const DeviceCommandId_t NONE = 0x0; // Set when no command is pending
/**
* This command initiates the ADC conversion for all channels including the internal
* temperature sensor.
*/
static const DeviceCommandId_t WRITE_SETUP = 0x1; static const DeviceCommandId_t WRITE_SETUP = 0x1;
static const DeviceCommandId_t READ_CHANNELS = 0x2; /**
static const DeviceCommandId_t READ_TEMPERATURE = 0x3; * This command initiates the ADC conversion for all channels including the internal
static const DeviceCommandId_t REQUEST_TEMPERATURE = 0x4; * temperature sensor.
*/
static const DeviceCommandId_t START_CONVERSIONS = 0x2;
/**
* This command reads the internal fifo which holds the temperature and the channel
* conversions.
*/
static const DeviceCommandId_t READ_CONVERSIONS = 0x3;
/** /**
* @brief This is the configuration byte which will be written to the setup register after * @brief This is the configuration byte which will be written to the setup register after
* power on. * power on.
* *
* @note Bit1 (DIFFSEL1) - Bit0 (DIFFSEL0): 0b00, No byte is following the setup byte * @note Bit1 (DIFFSEL1) - Bit0 (DIFFSEL0): 0b00, No byte is following the setup byte
* Bit3 (REFSEL1) - Bit2 (REFSEL0): 0b10, internal reference, no wake-up delay * Bit3 (REFSEL1) - Bit2 (REFSEL0): 0b10, Internal reference, no wake-up delay
* Bit5 (CLKSEL1) - Bit4 (CLKSEL0): 0b11, MAX1227 clocked through SPI SCLK * Bit5 (CLKSEL1) - Bit4 (CLKSEL0): 0b10, Internally clocked
* Bit7 - Bit6: 0b01, tells MAX1227 that this is the setup register * Bit7 - Bit6: 0b01, Tells MAX1227 that this byte should be
* written to the setup register
* *
*/ */
static const uint8_t SETUP_DEFINITION = 0b01111000; static const uint8_t SETUP = 0b01101000;
/** /**
* @brief This value will always be written to the ADC conversion register to specify the * @brief This values will always be written to the ADC conversion register to specify the
* conversions to perform. * conversions to perform.
* @details Bit0: 1 - Enables temperature conversion * @details Bit0: 1 - Enables temperature conversion
* Bit2 (SCAN1) and Bit1 (SCAN0): 0b11, No scan, converts channel N once only. * Bit2 (SCAN1) and Bit1 (SCAN0): 0b00, Scans channels 0 through N
* Scanning is not supported in spi clock mode. * Bit6 - Bit3 defines N: 0b0101 (N = 5)
* Bit6 - Bit3 defines N: 0b0001 (N = 4)
* Bit7: Always 1. Tells the ADC that this is the conversion register. * Bit7: Always 1. Tells the ADC that this is the conversion register.
*/ */
static const uint8_t CONVERT_TEMPERATURE = 0b10000001; static const uint8_t CONVERSION = 0b10101001;
static const uint8_t CONVERT_DIFF_CHANNEL_0 = 0b10000110;
static const uint8_t CONVERT_DIFF_CHANNEL_1 = 0b10001110;
static const uint8_t CONVERT_DIFF_CHANNEL_2 = 0b10010110;
static const uint8_t CONVERT_DIFF_CHANNEL_3 = 0b10011110;
static const uint8_t CONVERT_DIFF_CHANNEL_4 = 0b10100110;
static const uint8_t CONVERT_DIFF_CHANNEL_5 = 0b10101110;
/** Writing this value resets the fifo */
static const uint8_t RESET_FIFO = 0b00011000; static const uint8_t RESET_FIFO = 0b00011000;
static const uint8_t DUMMY_BYTE = 0x0; static const uint8_t DUMMY_BYTE = 0x0;
static const uint8_t SUS_DATA_SET_ID = READ_CHANNELS; static const uint8_t SUS_DATA_SET_ID = READ_CONVERSIONS;
/** Size of data replies */ /** Size of data replies. Temperature and 6 channel convesions (AIN0 - AIN5) */
static const uint8_t SIZE_READ_CHANNELS = 13; static const uint8_t SIZE_READ_CONVERSIONS = 14;
static const uint8_t SIZE_READ_TEMPERATURE = 25;
static const uint8_t MAX_CMD_SIZE = SIZE_READ_TEMPERATURE; static const uint8_t MAX_CMD_SIZE = SIZE_READ_CONVERSIONS;
static const uint8_t POOL_ENTRIES = 7; static const uint8_t POOL_ENTRIES = 7;