diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 7f5b5e7a..54cb8668 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -550,10 +550,13 @@ bool WipperSnapper_Component_I2C::initI2CDevice( drivers.push_back(_mlx90632d); WS_DEBUG_PRINTLN("MLX90632 Initialized Successfully!"); } 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 - if (!_mlx90632d_ext->begin() || !_mlx90632d_ext->ConfigureAndPrintSensorInfo(true)) { - WS_DEBUG_PRINTLN("ERROR: Failed to initialize MLX90632D with extended range!"); + if (!_mlx90632d_ext->begin() || + !_mlx90632d_ext->ConfigureAndPrintSensorInfo(true)) { + WS_DEBUG_PRINTLN( + "ERROR: Failed to initialize MLX90632D with extended range!"); _busStatusResponse = wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL; return false; diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_MLX90632D.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_MLX90632D.h index 1ff06462..959130d3 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_MLX90632D.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_MLX90632D.h @@ -26,7 +26,7 @@ */ /**************************************************************************/ class WipperSnapper_I2C_Driver_MLX90632D : public WipperSnapper_I2C_Driver { -public: + public: /*******************************************************************************/ /*! @brief Constructor for an MLX90632 sensor. @@ -71,7 +71,8 @@ public: /*! @brief Configures the MLX90632 sensor and prints its information. @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. */ /*******************************************************************************/ @@ -79,39 +80,41 @@ public: // Reset the device if (!_mlx90632->reset()) { WS_PRINTER.println(F("Device reset failed")); - while (1) { delay(10); } + while (1) { + delay(10); + } } WS_PRINTER.println(F("Device reset: SUCCESS")); - + uint64_t productID = _mlx90632->getProductID(); WS_PRINTER.print(F("Product ID: 0x")); WS_PRINTER.print((uint32_t)(productID >> 32), HEX); WS_PRINTER.println((uint32_t)(productID & 0xFFFFFFFF), HEX); - + uint16_t productCode = _mlx90632->getProductCode(); WS_PRINTER.print(F("Product Code: 0x")); WS_PRINTER.println(productCode, HEX); - + uint16_t eepromVersion = _mlx90632->getEEPROMVersion(); WS_PRINTER.print(F("EEPROM Version: 0x")); WS_PRINTER.println(eepromVersion, HEX); - + // Decode product code bits uint8_t fov = (productCode >> 8) & 0x3; - uint8_t package = (productCode >> 5) & 0x7; + uint8_t package = (productCode >> 5) & 0x7; uint8_t accuracy = productCode & 0x1F; - + WS_PRINTER.print(F("FOV: ")); WS_PRINTER.println(fov == 0 ? F("50°") : F("Unknown")); - + WS_PRINTER.print(F("Package: ")); WS_PRINTER.println(package == 1 ? F("SFN 3x3") : F("Unknown")); - + WS_PRINTER.print(F("Accuracy: ")); if (accuracy == 1) { WS_PRINTER.println(F("Medical")); } else if (accuracy == 2) { - WS_PRINTER.println(F("Standard")); + WS_PRINTER.println(F("Standard")); } else { WS_PRINTER.println(F("Unknown")); } @@ -119,13 +122,17 @@ public: // Set and get mode - choose one: WS_PRINTER.println(F("\n--- Mode Settings ---")); if (!_mlx90632->setMode(MLX90632_MODE_CONTINUOUS)) { - // if (!_mlx90632->setMode(MLX90632_MODE_STEP)) { // Uncomment for step mode testing - // if (!_mlx90632->setMode(MLX90632_MODE_SLEEPING_STEP)) { // Uncomment for sleeping step mode testing + // if (!_mlx90632->setMode(MLX90632_MODE_STEP)) { // Uncomment + // 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")); - while (1) { delay(10); } + while (1) { + delay(10); + } } - - //TODO: use Step mode? + + // TODO: use Step mode? mlx90632_mode_t currentMode = _mlx90632->getMode(); WS_PRINTER.print(F("Current mode: ")); switch (currentMode) { @@ -149,15 +156,24 @@ public: if (accuracy == 1) { // Set and get measurement select (medical) 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")); - 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); } + 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: ")); switch (currentMeasSelect) { case MLX90632_MEAS_MEDICAL: @@ -175,9 +191,11 @@ public: WS_PRINTER.println(F("\n--- Refresh Rate Settings ---")); if (!_mlx90632->setRefreshRate(MLX90632_REFRESH_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(); WS_PRINTER.print(F("Current refresh rate: ")); switch (currentRefreshRate) { @@ -208,12 +226,14 @@ public: default: WS_PRINTER.println(F("Unknown")); } - + // Clear new data flag before starting continuous measurements WS_PRINTER.println(F("\\n--- Starting Continuous Measurements ---")); if (!_mlx90632->resetNewData()) { WS_PRINTER.println(F("Failed to reset new data flag")); - while (1) { delay(10); } + while (1) { + delay(10); + } } return true; } @@ -235,19 +255,19 @@ public: */ /*******************************************************************************/ bool ReadSensorData() { - bool result=false; + bool result = false; // Only check new data flag - much more efficient for continuous mode if (_mlx90632->isNewData()) { WS_PRINTER.print(F("New Data Available - Cycle Position: ")); WS_PRINTER.println(_mlx90632->readCyclePosition()); - + // Read ambient temperature _deviceTemp = _mlx90632->getAmbientTemperature(); WS_PRINTER.print(F("Ambient Temperature: ")); WS_PRINTER.print(_deviceTemp, 4); WS_PRINTER.println(F(" °C")); - + // Read object temperature _objectTemp = _mlx90632->getObjectTemperature(); WS_PRINTER.print(F("Object Temperature: ")); @@ -257,27 +277,27 @@ public: WS_PRINTER.print(_objectTemp, 4); WS_PRINTER.println(F(" °C")); } - result=true; + result = true; // Reset new data flag after reading if (!_mlx90632->resetNewData()) { 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 { WS_PRINTER.println(F("No new data available, skipping read")); - } - + // Check if we need to trigger a new measurement for step modes 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 if (!_mlx90632->startSingleMeasurement()) { WS_PRINTER.println(F("Failed to start single measurement")); } } - + _lastRead = millis(); return result; } @@ -293,16 +313,16 @@ public: /*******************************************************************************/ bool getEventAmbientTemp(sensors_event_t *tempEvent) { if (ReadSensorData() && _deviceTemp != NAN) { - //TODO: check max/min or error values in datasheet - // if (_deviceTemp < -40 || _deviceTemp > 125) { - // WS_PRINTER.println(F("Invalid ambient temperature")); - // return false; - // } - // if the sensor was read recently, return the cached temperature + // TODO: check max/min or error values in datasheet + // if (_deviceTemp < -40 || _deviceTemp > 125) { + // WS_PRINTER.println(F("Invalid ambient temperature")); + // return false; + // } + // if the sensor was read recently, return the cached temperature tempEvent->temperature = _deviceTemp; 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; return true; } - return false; // sensor not read recently, return false + return false; // sensor not read recently, return false } -protected: - double _deviceTemp; ///< Device temperature in Celsius - double _objectTemp; ///< Object temperature in Celsius - uint32_t _lastRead; ///< Last time the sensor was read in milliseconds - Adafruit_MLX90632 *_mlx90632 = nullptr; ///< MLX90632 object + protected: + double _deviceTemp; ///< Device temperature in Celsius + double _objectTemp; ///< Object temperature in Celsius + uint32_t _lastRead; ///< Last time the sensor was read in milliseconds + Adafruit_MLX90632 *_mlx90632 = nullptr; ///< MLX90632 object }; -#endif // WipperSnapper_I2C_Driver_MLX90632 \ No newline at end of file +#endif // WipperSnapper_I2C_Driver_MLX90632 \ No newline at end of file