clang-format
This commit is contained in:
parent
32f85f7b47
commit
dc5ff4ae9f
2 changed files with 77 additions and 54 deletions
|
|
@ -550,10 +550,13 @@ bool WipperSnapper_Component_I2C::initI2CDevice(
|
||||||
drivers.push_back(_mlx90632d);
|
drivers.push_back(_mlx90632d);
|
||||||
WS_DEBUG_PRINTLN("MLX90632 Initialized Successfully!");
|
WS_DEBUG_PRINTLN("MLX90632 Initialized Successfully!");
|
||||||
} else if (strcmp("mlx90632d_ext", msgDeviceInitReq->i2c_device_name) == 0) {
|
} else if (strcmp("mlx90632d_ext", msgDeviceInitReq->i2c_device_name) == 0) {
|
||||||
_mlx90632d_ext = new WipperSnapper_I2C_Driver_MLX90632D(this->_i2c, i2cAddress);
|
_mlx90632d_ext =
|
||||||
|
new WipperSnapper_I2C_Driver_MLX90632D(this->_i2c, i2cAddress);
|
||||||
// set extended range
|
// set extended range
|
||||||
if (!_mlx90632d_ext->begin() || !_mlx90632d_ext->ConfigureAndPrintSensorInfo(true)) {
|
if (!_mlx90632d_ext->begin() ||
|
||||||
WS_DEBUG_PRINTLN("ERROR: Failed to initialize MLX90632D with extended range!");
|
!_mlx90632d_ext->ConfigureAndPrintSensorInfo(true)) {
|
||||||
|
WS_DEBUG_PRINTLN(
|
||||||
|
"ERROR: Failed to initialize MLX90632D with extended range!");
|
||||||
_busStatusResponse =
|
_busStatusResponse =
|
||||||
wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL;
|
wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
*/
|
*/
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
|
class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver {
|
||||||
public:
|
public:
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
@brief Constructor for an MLX90632 sensor.
|
@brief Constructor for an MLX90632 sensor.
|
||||||
|
|
@ -71,7 +71,8 @@ public:
|
||||||
/*!
|
/*!
|
||||||
@brief Configures the MLX90632 sensor and prints its information.
|
@brief Configures the MLX90632 sensor and prints its information.
|
||||||
@param extendedInsteadOfMedicalRange
|
@param extendedInsteadOfMedicalRange
|
||||||
If true, configures the sensor for extended temperature range/acc.
|
If true, configures the sensor for extended temperature
|
||||||
|
range/acc.
|
||||||
@returns True if configuration fetching and setting were successful.
|
@returns True if configuration fetching and setting were successful.
|
||||||
*/
|
*/
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
|
@ -79,39 +80,41 @@ public:
|
||||||
// Reset the device
|
// Reset the device
|
||||||
if (!_mlx90632->reset()) {
|
if (!_mlx90632->reset()) {
|
||||||
WS_PRINTER.println(F("Device reset failed"));
|
WS_PRINTER.println(F("Device reset failed"));
|
||||||
while (1) { delay(10); }
|
while (1) {
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
WS_PRINTER.println(F("Device reset: SUCCESS"));
|
WS_PRINTER.println(F("Device reset: SUCCESS"));
|
||||||
|
|
||||||
uint64_t productID = _mlx90632->getProductID();
|
uint64_t productID = _mlx90632->getProductID();
|
||||||
WS_PRINTER.print(F("Product ID: 0x"));
|
WS_PRINTER.print(F("Product ID: 0x"));
|
||||||
WS_PRINTER.print((uint32_t)(productID >> 32), HEX);
|
WS_PRINTER.print((uint32_t)(productID >> 32), HEX);
|
||||||
WS_PRINTER.println((uint32_t)(productID & 0xFFFFFFFF), HEX);
|
WS_PRINTER.println((uint32_t)(productID & 0xFFFFFFFF), HEX);
|
||||||
|
|
||||||
uint16_t productCode = _mlx90632->getProductCode();
|
uint16_t productCode = _mlx90632->getProductCode();
|
||||||
WS_PRINTER.print(F("Product Code: 0x"));
|
WS_PRINTER.print(F("Product Code: 0x"));
|
||||||
WS_PRINTER.println(productCode, HEX);
|
WS_PRINTER.println(productCode, HEX);
|
||||||
|
|
||||||
uint16_t eepromVersion = _mlx90632->getEEPROMVersion();
|
uint16_t eepromVersion = _mlx90632->getEEPROMVersion();
|
||||||
WS_PRINTER.print(F("EEPROM Version: 0x"));
|
WS_PRINTER.print(F("EEPROM Version: 0x"));
|
||||||
WS_PRINTER.println(eepromVersion, HEX);
|
WS_PRINTER.println(eepromVersion, HEX);
|
||||||
|
|
||||||
// Decode product code bits
|
// Decode product code bits
|
||||||
uint8_t fov = (productCode >> 8) & 0x3;
|
uint8_t fov = (productCode >> 8) & 0x3;
|
||||||
uint8_t package = (productCode >> 5) & 0x7;
|
uint8_t package = (productCode >> 5) & 0x7;
|
||||||
uint8_t accuracy = productCode & 0x1F;
|
uint8_t accuracy = productCode & 0x1F;
|
||||||
|
|
||||||
WS_PRINTER.print(F("FOV: "));
|
WS_PRINTER.print(F("FOV: "));
|
||||||
WS_PRINTER.println(fov == 0 ? F("50°") : F("Unknown"));
|
WS_PRINTER.println(fov == 0 ? F("50°") : F("Unknown"));
|
||||||
|
|
||||||
WS_PRINTER.print(F("Package: "));
|
WS_PRINTER.print(F("Package: "));
|
||||||
WS_PRINTER.println(package == 1 ? F("SFN 3x3") : F("Unknown"));
|
WS_PRINTER.println(package == 1 ? F("SFN 3x3") : F("Unknown"));
|
||||||
|
|
||||||
WS_PRINTER.print(F("Accuracy: "));
|
WS_PRINTER.print(F("Accuracy: "));
|
||||||
if (accuracy == 1) {
|
if (accuracy == 1) {
|
||||||
WS_PRINTER.println(F("Medical"));
|
WS_PRINTER.println(F("Medical"));
|
||||||
} else if (accuracy == 2) {
|
} else if (accuracy == 2) {
|
||||||
WS_PRINTER.println(F("Standard"));
|
WS_PRINTER.println(F("Standard"));
|
||||||
} else {
|
} else {
|
||||||
WS_PRINTER.println(F("Unknown"));
|
WS_PRINTER.println(F("Unknown"));
|
||||||
}
|
}
|
||||||
|
|
@ -119,13 +122,17 @@ public:
|
||||||
// Set and get mode - choose one:
|
// Set and get mode - choose one:
|
||||||
WS_PRINTER.println(F("\n--- Mode Settings ---"));
|
WS_PRINTER.println(F("\n--- Mode Settings ---"));
|
||||||
if (!_mlx90632->setMode(MLX90632_MODE_CONTINUOUS)) {
|
if (!_mlx90632->setMode(MLX90632_MODE_CONTINUOUS)) {
|
||||||
// if (!_mlx90632->setMode(MLX90632_MODE_STEP)) { // Uncomment for step mode testing
|
// if (!_mlx90632->setMode(MLX90632_MODE_STEP)) { // Uncomment
|
||||||
// if (!_mlx90632->setMode(MLX90632_MODE_SLEEPING_STEP)) { // Uncomment for sleeping step mode testing
|
// for step mode testing if
|
||||||
|
// (!_mlx90632->setMode(MLX90632_MODE_SLEEPING_STEP)) { // Uncomment for
|
||||||
|
// sleeping step mode testing
|
||||||
WS_PRINTER.println(F("Failed to set mode"));
|
WS_PRINTER.println(F("Failed to set mode"));
|
||||||
while (1) { delay(10); }
|
while (1) {
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: use Step mode?
|
// TODO: use Step mode?
|
||||||
mlx90632_mode_t currentMode = _mlx90632->getMode();
|
mlx90632_mode_t currentMode = _mlx90632->getMode();
|
||||||
WS_PRINTER.print(F("Current mode: "));
|
WS_PRINTER.print(F("Current mode: "));
|
||||||
switch (currentMode) {
|
switch (currentMode) {
|
||||||
|
|
@ -149,15 +156,24 @@ public:
|
||||||
if (accuracy == 1) {
|
if (accuracy == 1) {
|
||||||
// Set and get measurement select (medical)
|
// Set and get measurement select (medical)
|
||||||
WS_PRINTER.println(F("\n--- Measurement Select Settings ---"));
|
WS_PRINTER.println(F("\n--- Measurement Select Settings ---"));
|
||||||
if (!extendedInsteadOfMedicalRange && !_mlx90632->setMeasurementSelect(MLX90632_MEAS_MEDICAL)) {
|
if (!extendedInsteadOfMedicalRange &&
|
||||||
|
!_mlx90632->setMeasurementSelect(MLX90632_MEAS_MEDICAL)) {
|
||||||
WS_PRINTER.println(F("Failed to set measurement select to Medical"));
|
WS_PRINTER.println(F("Failed to set measurement select to Medical"));
|
||||||
while (1) { delay(10); }
|
while (1) {
|
||||||
} else if (extendedInsteadOfMedicalRange && !_mlx90632->setMeasurementSelect(MLX90632_MEAS_EXTENDED_RANGE)) {
|
delay(10);
|
||||||
WS_PRINTER.println(F("Failed to set measurement select to Extended Range"));
|
}
|
||||||
while (1) { delay(10); }
|
} else if (extendedInsteadOfMedicalRange &&
|
||||||
|
!_mlx90632->setMeasurementSelect(
|
||||||
|
MLX90632_MEAS_EXTENDED_RANGE)) {
|
||||||
|
WS_PRINTER.println(
|
||||||
|
F("Failed to set measurement select to Extended Range"));
|
||||||
|
while (1) {
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mlx90632_meas_select_t currentMeasSelect = _mlx90632->getMeasurementSelect();
|
mlx90632_meas_select_t currentMeasSelect =
|
||||||
|
_mlx90632->getMeasurementSelect();
|
||||||
WS_PRINTER.print(F("Current measurement select: "));
|
WS_PRINTER.print(F("Current measurement select: "));
|
||||||
switch (currentMeasSelect) {
|
switch (currentMeasSelect) {
|
||||||
case MLX90632_MEAS_MEDICAL:
|
case MLX90632_MEAS_MEDICAL:
|
||||||
|
|
@ -175,9 +191,11 @@ public:
|
||||||
WS_PRINTER.println(F("\n--- Refresh Rate Settings ---"));
|
WS_PRINTER.println(F("\n--- Refresh Rate Settings ---"));
|
||||||
if (!_mlx90632->setRefreshRate(MLX90632_REFRESH_2HZ)) {
|
if (!_mlx90632->setRefreshRate(MLX90632_REFRESH_2HZ)) {
|
||||||
WS_PRINTER.println(F("Failed to set refresh rate to 2Hz"));
|
WS_PRINTER.println(F("Failed to set refresh rate to 2Hz"));
|
||||||
while (1) { delay(10); }
|
while (1) {
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mlx90632_refresh_rate_t currentRefreshRate = _mlx90632->getRefreshRate();
|
mlx90632_refresh_rate_t currentRefreshRate = _mlx90632->getRefreshRate();
|
||||||
WS_PRINTER.print(F("Current refresh rate: "));
|
WS_PRINTER.print(F("Current refresh rate: "));
|
||||||
switch (currentRefreshRate) {
|
switch (currentRefreshRate) {
|
||||||
|
|
@ -208,12 +226,14 @@ public:
|
||||||
default:
|
default:
|
||||||
WS_PRINTER.println(F("Unknown"));
|
WS_PRINTER.println(F("Unknown"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear new data flag before starting continuous measurements
|
// Clear new data flag before starting continuous measurements
|
||||||
WS_PRINTER.println(F("\\n--- Starting Continuous Measurements ---"));
|
WS_PRINTER.println(F("\\n--- Starting Continuous Measurements ---"));
|
||||||
if (!_mlx90632->resetNewData()) {
|
if (!_mlx90632->resetNewData()) {
|
||||||
WS_PRINTER.println(F("Failed to reset new data flag"));
|
WS_PRINTER.println(F("Failed to reset new data flag"));
|
||||||
while (1) { delay(10); }
|
while (1) {
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -235,19 +255,19 @@ public:
|
||||||
*/
|
*/
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
bool ReadSensorData() {
|
bool ReadSensorData() {
|
||||||
bool result=false;
|
bool result = false;
|
||||||
|
|
||||||
// Only check new data flag - much more efficient for continuous mode
|
// Only check new data flag - much more efficient for continuous mode
|
||||||
if (_mlx90632->isNewData()) {
|
if (_mlx90632->isNewData()) {
|
||||||
WS_PRINTER.print(F("New Data Available - Cycle Position: "));
|
WS_PRINTER.print(F("New Data Available - Cycle Position: "));
|
||||||
WS_PRINTER.println(_mlx90632->readCyclePosition());
|
WS_PRINTER.println(_mlx90632->readCyclePosition());
|
||||||
|
|
||||||
// Read ambient temperature
|
// Read ambient temperature
|
||||||
_deviceTemp = _mlx90632->getAmbientTemperature();
|
_deviceTemp = _mlx90632->getAmbientTemperature();
|
||||||
WS_PRINTER.print(F("Ambient Temperature: "));
|
WS_PRINTER.print(F("Ambient Temperature: "));
|
||||||
WS_PRINTER.print(_deviceTemp, 4);
|
WS_PRINTER.print(_deviceTemp, 4);
|
||||||
WS_PRINTER.println(F(" °C"));
|
WS_PRINTER.println(F(" °C"));
|
||||||
|
|
||||||
// Read object temperature
|
// Read object temperature
|
||||||
_objectTemp = _mlx90632->getObjectTemperature();
|
_objectTemp = _mlx90632->getObjectTemperature();
|
||||||
WS_PRINTER.print(F("Object Temperature: "));
|
WS_PRINTER.print(F("Object Temperature: "));
|
||||||
|
|
@ -257,27 +277,27 @@ public:
|
||||||
WS_PRINTER.print(_objectTemp, 4);
|
WS_PRINTER.print(_objectTemp, 4);
|
||||||
WS_PRINTER.println(F(" °C"));
|
WS_PRINTER.println(F(" °C"));
|
||||||
}
|
}
|
||||||
result=true;
|
result = true;
|
||||||
// Reset new data flag after reading
|
// Reset new data flag after reading
|
||||||
if (!_mlx90632->resetNewData()) {
|
if (!_mlx90632->resetNewData()) {
|
||||||
WS_PRINTER.println(F("Failed to reset new data flag"));
|
WS_PRINTER.println(F("Failed to reset new data flag"));
|
||||||
}
|
}
|
||||||
|
|
||||||
WS_PRINTER.println(); // Add blank line between readings
|
WS_PRINTER.println(); // Add blank line between readings
|
||||||
} else {
|
} else {
|
||||||
WS_PRINTER.println(F("No new data available, skipping read"));
|
WS_PRINTER.println(F("No new data available, skipping read"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we need to trigger a new measurement for step modes
|
// Check if we need to trigger a new measurement for step modes
|
||||||
mlx90632_mode_t currentMode = _mlx90632->getMode();
|
mlx90632_mode_t currentMode = _mlx90632->getMode();
|
||||||
if (currentMode == MLX90632_MODE_STEP || currentMode == MLX90632_MODE_SLEEPING_STEP) {
|
if (currentMode == MLX90632_MODE_STEP ||
|
||||||
|
currentMode == MLX90632_MODE_SLEEPING_STEP) {
|
||||||
// Trigger single measurement (SOC bit) for step modes
|
// Trigger single measurement (SOC bit) for step modes
|
||||||
if (!_mlx90632->startSingleMeasurement()) {
|
if (!_mlx90632->startSingleMeasurement()) {
|
||||||
WS_PRINTER.println(F("Failed to start single measurement"));
|
WS_PRINTER.println(F("Failed to start single measurement"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_lastRead = millis();
|
_lastRead = millis();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -293,16 +313,16 @@ public:
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
bool getEventAmbientTemp(sensors_event_t *tempEvent) {
|
bool getEventAmbientTemp(sensors_event_t *tempEvent) {
|
||||||
if (ReadSensorData() && _deviceTemp != NAN) {
|
if (ReadSensorData() && _deviceTemp != NAN) {
|
||||||
//TODO: check max/min or error values in datasheet
|
// TODO: check max/min or error values in datasheet
|
||||||
// if (_deviceTemp < -40 || _deviceTemp > 125) {
|
// if (_deviceTemp < -40 || _deviceTemp > 125) {
|
||||||
// WS_PRINTER.println(F("Invalid ambient temperature"));
|
// WS_PRINTER.println(F("Invalid ambient temperature"));
|
||||||
// return false;
|
// return false;
|
||||||
// }
|
// }
|
||||||
// if the sensor was read recently, return the cached temperature
|
// if the sensor was read recently, return the cached temperature
|
||||||
tempEvent->temperature = _deviceTemp;
|
tempEvent->temperature = _deviceTemp;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false; // sensor not read recently, return false
|
return false; // sensor not read recently, return false
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
|
@ -320,14 +340,14 @@ public:
|
||||||
tempEvent->temperature = _objectTemp;
|
tempEvent->temperature = _objectTemp;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false; // sensor not read recently, return false
|
return false; // sensor not read recently, return false
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
double _deviceTemp; ///< Device temperature in Celsius
|
double _deviceTemp; ///< Device temperature in Celsius
|
||||||
double _objectTemp; ///< Object temperature in Celsius
|
double _objectTemp; ///< Object temperature in Celsius
|
||||||
uint32_t _lastRead; ///< Last time the sensor was read in milliseconds
|
uint32_t _lastRead; ///< Last time the sensor was read in milliseconds
|
||||||
Adafruit_MLX90632 *_mlx90632 = nullptr; ///< MLX90632 object
|
Adafruit_MLX90632 *_mlx90632 = nullptr; ///< MLX90632 object
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // WipperSnapper_I2C_Driver_MLX90632
|
#endif // WipperSnapper_I2C_Driver_MLX90632
|
||||||
Loading…
Reference in a new issue