From 64b8c2e8031a25d486a1cf6def6d41ebb6b8fa3a Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Feb 2025 15:22:18 -0700 Subject: [PATCH 01/32] iniital port/move to sparkfun_toolkit v1.0 done - basic readings compile, but no further tests yet --- .../Example01_PresenceBasicReadings.ino | 2 +- .../Example02_PresenceGPIO0Usage.ino | 2 +- .../Example03_PresenceSerialPlotter.ino | 2 +- .../Example04_PresenceAdvancedReadings.ino | 2 +- .../Example05_PresenceAdvancedSettings.ino | 2 +- .../Example06_DistanceBasicReadings.ino | 2 +- .../Example07_DistanceThresholdSettings.ino | 2 +- .../Example08_DistanceSerialPlotter.ino | 2 +- .../Example09_DistanceAdvancedSettings.ino | 2 +- keywords.txt | 1 - library.properties | 6 +- src/SparkFun_Qwiic_XM125_Arduino_Library.h | 39 +- .../sfDevXM125.cpp} | 705 +++++++++--------- src/{sfeQwiicXM125.h => sfTk/sfDevXM125.h} | 583 ++++++++------- src/{sfeXM125Regs.h => sfTk/sfXM125Regs.h} | 0 15 files changed, 671 insertions(+), 681 deletions(-) rename src/{sfeQwiicXM125.cpp => sfTk/sfDevXM125.cpp} (53%) rename src/{sfeQwiicXM125.h => sfTk/sfDevXM125.h} (57%) rename src/{sfeXM125Regs.h => sfTk/sfXM125Regs.h} (100%) diff --git a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino index a6846c8..42ad91a 100644 --- a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino +++ b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino @@ -24,7 +24,7 @@ #include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" -SfeXM125 radarSensor; +SparkFunXM125 radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; diff --git a/examples/Example02_PresenceGPIO0Usage/Example02_PresenceGPIO0Usage.ino b/examples/Example02_PresenceGPIO0Usage/Example02_PresenceGPIO0Usage.ino index fb9d347..ec52b87 100644 --- a/examples/Example02_PresenceGPIO0Usage/Example02_PresenceGPIO0Usage.ino +++ b/examples/Example02_PresenceGPIO0Usage/Example02_PresenceGPIO0Usage.ino @@ -24,7 +24,7 @@ #include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" -SfeXM125 radarSensor; +SparkFunXM125 radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; diff --git a/examples/Example03_PresenceSerialPlotter/Example03_PresenceSerialPlotter.ino b/examples/Example03_PresenceSerialPlotter/Example03_PresenceSerialPlotter.ino index 21d15b1..e91bc55 100644 --- a/examples/Example03_PresenceSerialPlotter/Example03_PresenceSerialPlotter.ino +++ b/examples/Example03_PresenceSerialPlotter/Example03_PresenceSerialPlotter.ino @@ -24,7 +24,7 @@ #include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" -SfeXM125 radarSensor; +SparkFunXM125 radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; diff --git a/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino b/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino index 4d72c56..923e981 100644 --- a/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino +++ b/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino @@ -24,7 +24,7 @@ #include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" -SfeXM125 radarSensor; +SparkFunXM125 radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; diff --git a/examples/Example05_PresenceAdvancedSettings/Example05_PresenceAdvancedSettings.ino b/examples/Example05_PresenceAdvancedSettings/Example05_PresenceAdvancedSettings.ino index 2292a6a..2c07b21 100644 --- a/examples/Example05_PresenceAdvancedSettings/Example05_PresenceAdvancedSettings.ino +++ b/examples/Example05_PresenceAdvancedSettings/Example05_PresenceAdvancedSettings.ino @@ -25,7 +25,7 @@ #include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" -SfeXM125 radarSensor; +SparkFunXM125 radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; diff --git a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino index 288764d..6008490 100644 --- a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino +++ b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino @@ -24,7 +24,7 @@ #include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" -SfeXM125 radarSensor; +SparkFunXM125 radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; diff --git a/examples/Example07_DistanceThresholdSettings/Example07_DistanceThresholdSettings.ino b/examples/Example07_DistanceThresholdSettings/Example07_DistanceThresholdSettings.ino index d215f2b..4ed2b26 100644 --- a/examples/Example07_DistanceThresholdSettings/Example07_DistanceThresholdSettings.ino +++ b/examples/Example07_DistanceThresholdSettings/Example07_DistanceThresholdSettings.ino @@ -24,7 +24,7 @@ #include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" -SfeXM125 radarSensor; +SparkFunXM125 radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; diff --git a/examples/Example08_DistanceSerialPlotter/Example08_DistanceSerialPlotter.ino b/examples/Example08_DistanceSerialPlotter/Example08_DistanceSerialPlotter.ino index f64d52d..e539d77 100644 --- a/examples/Example08_DistanceSerialPlotter/Example08_DistanceSerialPlotter.ino +++ b/examples/Example08_DistanceSerialPlotter/Example08_DistanceSerialPlotter.ino @@ -23,7 +23,7 @@ #include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" -SfeXM125 radarSensor; +SparkFunXM125 radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; diff --git a/examples/Example09_DistanceAdvancedSettings/Example09_DistanceAdvancedSettings.ino b/examples/Example09_DistanceAdvancedSettings/Example09_DistanceAdvancedSettings.ino index ffc19de..00a159c 100644 --- a/examples/Example09_DistanceAdvancedSettings/Example09_DistanceAdvancedSettings.ino +++ b/examples/Example09_DistanceAdvancedSettings/Example09_DistanceAdvancedSettings.ino @@ -24,7 +24,7 @@ #include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" -SfeXM125 radarSensor; +SparkFunXM125 radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; diff --git a/keywords.txt b/keywords.txt index 22dbb7c..8668a5a 100644 --- a/keywords.txt +++ b/keywords.txt @@ -17,7 +17,6 @@ sfe_xm125_presence_command_t KEYWORD1 ######################################################### begin KEYWORD2 -returnRegister KEYWORD2 distanceBegin KEYWORD2 distanceDetectorReadingSetup KEYWORD2 getDistanceDetectorVersion KEYWORD2 diff --git a/library.properties b/library.properties index 5f53259..13bace7 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=SparkFun XM125 Arduino Library -version=1.0.4 +version=1.1.0 author=SparkFun Electronics maintainer=SparkFun Electronics sentence=An Arduino library to make use of the Qwiic XM125 A121 Pulsed Radar Module from Acconeer. @@ -7,5 +7,5 @@ paragraph=This is the SparkFun library for the Acconeer Entry+ Module XM125 with category=Sensors url=https://github.com/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library architectures=* -depends=SparkFun Toolkit (<1.0.0) -includes=SparkFun_Qwiic_XM125_Arduino_Library.h, sfeQwiicXM125.h, sfeXM125Regs.h +depends=SparkFun Toolkit (>=1.0.0) +includes=SparkFun_Qwiic_XM125_Arduino_Library.h diff --git a/src/SparkFun_Qwiic_XM125_Arduino_Library.h b/src/SparkFun_Qwiic_XM125_Arduino_Library.h index 2bd7cd9..396d516 100644 --- a/src/SparkFun_Qwiic_XM125_Arduino_Library.h +++ b/src/SparkFun_Qwiic_XM125_Arduino_Library.h @@ -1,12 +1,33 @@ -#include "sfeQwiicXM125.h" + +/*! + * @file SparkFun_Qwiic_XM125_Arduino_Library.h + * @brief Arduino header file for the SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (Qwiic) + * + * This file contains the class definitions for the SparkFun Pulsed Coherent Radar Sensor Arduino library, + * including methods for initialization, distance and presence detection, and configuration. + * It uses I2C to communicate with the device. + * + * @author SparkFun Electronics + * @date 2024 + * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. + * + * SPDX-License-Identifier: MIT + */ +#pragma once + + +// To make the Arduino machine happy, include the toolkit header before the core implementation for this device +#include +#include "sfTk/sfDevXM125.h" + #include #include -class SfeXM125 : public QwDevXM125 +class SparkFunXM125 : public sfDevXM125 { public: - SfeXM125() + SparkFunXM125() { } @@ -20,12 +41,16 @@ class SfeXM125 : public QwDevXM125 _i2cBus.init(wirePort, deviceAddress); // Initialize the system - return results - return this->QwDevXM125::begin(&_i2cBus) == 0; + return this->sfDevXM125::begin(&_i2cBus) == 0; } private: // I2C bus class - sfeTkArdI2C _i2cBus; - //QwDevXM125::QwI2C _i2cBus; // original code -}; \ No newline at end of file + sfTkArdI2C _i2cBus; + +}; + +// for backward compatibility - +class SfeXM125 : public SparkFunXM125 +{ }; diff --git a/src/sfeQwiicXM125.cpp b/src/sfTk/sfDevXM125.cpp similarity index 53% rename from src/sfeQwiicXM125.cpp rename to src/sfTk/sfDevXM125.cpp index a62eeb0..580aebc 100644 --- a/src/sfeQwiicXM125.cpp +++ b/src/sfTk/sfDevXM125.cpp @@ -1,22 +1,18 @@ -#include "SparkFun_Qwiic_XM125_Arduino_Library.h" -#include "sfeQwiicXM125.h" -QwDevXM125::QwDevXM125() -{ - // -} +#include "sfDevXM125.h" + -bool QwDevXM125::begin(sfeTkII2C *theBus) +bool sfDevXM125::begin(sfTkII2C *theBus) { if(theBus == nullptr) { - return kSTkErrFail; + return ksfTkErrFail; } // Check if the provided address is valid if(theBus->address() != SFE_XM125_I2C_ADDRESS) { - return kSTkErrFail; + return ksfTkErrFail; } // Sets communication bus @@ -48,14 +44,14 @@ bool QwDevXM125::begin(sfeTkII2C *theBus) } // --------------------- I2C Disance Detector Functions --------------------- -int32_t QwDevXM125::distanceBegin() +int32_t sfDevXM125::distanceBegin() { uint32_t errorStatus = 0; // *** Distance Sensor Setup *** // Reset sensor configuration to reapply configuration registers setDistanceCommand(SFE_XM125_DISTANCE_RESET_MODULE); - delay(100); + sftk_delay_ms(100); distanceBusyWait(); @@ -75,14 +71,14 @@ int32_t QwDevXM125::distanceBegin() { return 3; } - delay(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set // Set End register if(setDistanceEnd(sfe_xm125_distance_end_default) != 0) { return 4; } - delay(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set // Apply configuration if(setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION) != 0) @@ -114,7 +110,7 @@ int32_t QwDevXM125::distanceBegin() return 0; } -int32_t QwDevXM125::distanceDetectorReadingSetup() +int32_t sfDevXM125::distanceDetectorReadingSetup() { uint32_t errorStatus = 0; uint32_t calibrateNeeded = 0; @@ -132,7 +128,7 @@ int32_t QwDevXM125::distanceDetectorReadingSetup() { return 2; } - delay(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set // Poll detector status until busy bit is cleared - CHECK ON THIS! if(distanceBusyWait() != 0) @@ -146,7 +142,7 @@ int32_t QwDevXM125::distanceDetectorReadingSetup() { return 4; } - delay(100); + sftk_delay_ms(100); // Check MEASURE_DISTANCE_ERROR for measurement failed getDistanceMeasureDistanceError(measDistErr); @@ -154,7 +150,7 @@ int32_t QwDevXM125::distanceDetectorReadingSetup() { return 5; } - delay(100); + sftk_delay_ms(100); // Recalibrate device if calibration error is triggered getDistanceCalibrationNeeded(calibrateNeeded); @@ -163,20 +159,20 @@ int32_t QwDevXM125::distanceDetectorReadingSetup() setDistanceCommand(SFE_XM125_DISTANCE_RECALIBRATE); return 6; } - delay(100); + sftk_delay_ms(100); return 0; } -int32_t QwDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) +sfTkError_t sfDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) { - int32_t retVal; + sfTkError_t retVal; uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_VERSION, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register major = (regVal & SFE_XM125_DISTANCE_MAJOR_VERSION_MASK) >> SFE_XM125_DISTANCE_MAJOR_VERSION_MASK_SHIFT; @@ -186,118 +182,83 @@ int32_t QwDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, return retVal; } -int32_t QwDevXM125::getDistanceDetectorError(uint32_t &error) +sfTkError_t sfDevXM125::getDistanceDetectorError(uint32_t &error) { // Read from 16-Bit Register size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PROTOCOL_STATUS, (uint8_t*)&error, 4, readBytes); - error = __builtin_bswap32(error); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PROTOCOL_STATUS, (uint8_t*)&error, 4, readBytes); + error = sftk_byte_swap(error); return retVal; } -int32_t QwDevXM125::getDistanceDetectorErrorStatus(uint32_t &status) +sfTkError_t sfDevXM125::getDistanceDetectorErrorStatus(uint32_t &status) { - int32_t retVal; + sfTkError_t retVal; uint32_t regVal = 0; size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); - if(retVal != 0) - { - return -1; - } + // No error + status = 0; + + if(retVal != ksfTkErrOk) + return retVal; if(((regVal & SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK) >> SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK_SHIFT) != 0) - { status = 1; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK) >> SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK_SHIFT) != 0) - { status = 2; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK) >> SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK_SHIFT) != 0) - { status = 3; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK) >> SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK_SHIFT) != 0) - { status = 5; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK) >> SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK_SHIFT) != 0) - { status = 6; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK) >> SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK_SHIFT) != 0) - { status = 7; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK) >> SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK_SHIFT) != 0) - { status = 8; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK) >> SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK_SHIFT) != 0) - { status = 9; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK) >> SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK_SHIFT) != 0) - { status = 10; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK) >> SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK_SHIFT) != 0) - { status = 11; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK) >> SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK_SHIFT) != 0) - { status = 12; - return 0; - } else if(((regVal & SFE_XM125_DISTANCE_BUSY_MASK) >> SFE_XM125_DISTANCE_BUSY_MASK_SHIFT) != 0) - { status = 13; - return 0; - } return 0; // return 0 with no errors } -int32_t QwDevXM125::getDistanceMeasureCounter(uint32_t &counter) +sfTkError_t sfDevXM125::getDistanceMeasureCounter(uint32_t &counter) { // Read from 16-Bit Register size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_COUNTER, (uint8_t*)&counter, 4, readBytes); - counter = __builtin_bswap32(counter); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_COUNTER, (uint8_t*)&counter, 4, readBytes); + counter = sftk_byte_swap(counter); return retVal; } -int32_t QwDevXM125::getDistanceDetectorStatus(uint32_t &status) +sfTkError_t sfDevXM125::getDistanceDetectorStatus(uint32_t &status) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t*)&status, 4, readBytes); - status = __builtin_bswap32(status); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t*)&status, 4, readBytes); + status = sftk_byte_swap(status); return retVal; } -int32_t QwDevXM125::getDistanceNumberDistances(uint32_t &distance) +sfTkError_t sfDevXM125::getDistanceNumberDistances(uint32_t &distance) { - int32_t retVal; + sfTkError_t retVal; uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register distance = (regVal & SFE_XM125_DISTANCE_NUMBER_DISTANCES_MASK); @@ -305,15 +266,15 @@ int32_t QwDevXM125::getDistanceNumberDistances(uint32_t &distance) return retVal; } -int32_t QwDevXM125::getDistanceNearStartEdge(uint32_t &edge) +sfTkError_t sfDevXM125::getDistanceNearStartEdge(uint32_t &edge) { - int32_t retVal; + sfTkError_t retVal; uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register edge = (regVal & SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK) >> SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK_SHIFT; @@ -321,15 +282,15 @@ int32_t QwDevXM125::getDistanceNearStartEdge(uint32_t &edge) return retVal; } -int32_t QwDevXM125::getDistanceCalibrationNeeded(uint32_t &calibrate) +sfTkError_t sfDevXM125::getDistanceCalibrationNeeded(uint32_t &calibrate) { - int32_t retVal; + sfTkError_t retVal; uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register calibrate = (regVal & SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK) >> SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK_SHIFT; @@ -337,15 +298,15 @@ int32_t QwDevXM125::getDistanceCalibrationNeeded(uint32_t &calibrate) return retVal; } -int32_t QwDevXM125::getDistanceMeasureDistanceError(uint32_t &error) +sfTkError_t sfDevXM125::getDistanceMeasureDistanceError(uint32_t &error) { - int32_t retVal; + sfTkError_t retVal; uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register error = (regVal & SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK) >> SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK_SHIFT; @@ -353,15 +314,15 @@ int32_t QwDevXM125::getDistanceMeasureDistanceError(uint32_t &error) return retVal; } -int32_t QwDevXM125::getDistanceTemperature(uint32_t &temperature) +sfTkError_t sfDevXM125::getDistanceTemperature(uint32_t &temperature) { - int32_t retVal; + sfTkError_t retVal; uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register temperature = (regVal & SFE_XM125_DISTANCE_TEMPERATURE_MASK) >> SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT; @@ -369,431 +330,431 @@ int32_t QwDevXM125::getDistanceTemperature(uint32_t &temperature) return retVal; } -int32_t QwDevXM125::getDistancePeak0Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak0Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak1Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak1Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak2Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak2Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak3Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak3Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak4Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak4Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak5Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak5Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak6Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak6Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak7Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak7Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak8Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak8Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak9Distance(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak9Distance(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_DISTANCE, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_DISTANCE, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::getDistancePeak0Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak0Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistancePeak1Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak1Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistancePeak2Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak2Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistancePeak3Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak3Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistancePeak4Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak4Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistancePeak5Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak5Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistancePeak6Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak6Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistancePeak7Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak7Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistancePeak8Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak8Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistancePeak9Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak9Strength(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_STRENGTH, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_STRENGTH, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); peak = peak/1000; return retVal; } -int32_t QwDevXM125::getDistanceStart(uint32_t &startVal) +sfTkError_t sfDevXM125::getDistanceStart(uint32_t &startVal) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t*)&startVal, 4, readBytes); - startVal = __builtin_bswap32(startVal); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t*)&startVal, 4, readBytes); + startVal = sftk_byte_swap(startVal); return retVal; } -int32_t QwDevXM125::setDistanceStart(uint32_t start) +sfTkError_t sfDevXM125::setDistanceStart(uint32_t start) { - start = __builtin_bswap32(start); + start = sftk_byte_swap(start); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t*)&start, 4); } -int32_t QwDevXM125::getDistanceEnd(uint32_t &end) +sfTkError_t sfDevXM125::getDistanceEnd(uint32_t &end) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t*)&end, 4, readBytes); - end = __builtin_bswap32(end); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t*)&end, 4, readBytes); + end = sftk_byte_swap(end); return retVal; } -int32_t QwDevXM125::setDistanceEnd(uint32_t end) +sfTkError_t sfDevXM125::setDistanceEnd(uint32_t end) { - end = __builtin_bswap32(end); + end = sftk_byte_swap(end); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t*)&end, 4); } -int32_t QwDevXM125::getDistanceMaxStepLength(uint32_t &length) +sfTkError_t sfDevXM125::getDistanceMaxStepLength(uint32_t &length) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t*)&length, 4, readBytes); - length = __builtin_bswap32(length); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t*)&length, 4, readBytes); + length = sftk_byte_swap(length); return retVal; } -int32_t QwDevXM125::setDistanceMaxStepLength(uint32_t length) +sfTkError_t sfDevXM125::setDistanceMaxStepLength(uint32_t length) { - length = __builtin_bswap32(length); + length = sftk_byte_swap(length); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t*)&length, 4); } -int32_t QwDevXM125::getDistanceCloseRangeLeakageCancellation(bool &range) +sfTkError_t sfDevXM125::getDistanceCloseRangeLeakageCancellation(bool &range) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t*)&range, 4, readBytes); } -int32_t QwDevXM125::setDistanceCloseRangeLeakageCancellation(bool range) +sfTkError_t sfDevXM125::setDistanceCloseRangeLeakageCancellation(bool range) { return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t*)&range, 4); } -int32_t QwDevXM125::getDistanceSignalQuality(uint32_t &signal) +sfTkError_t sfDevXM125::getDistanceSignalQuality(uint32_t &signal) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t*)&signal, 4, readBytes); - signal = __builtin_bswap32(signal); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t*)&signal, 4, readBytes); + signal = sftk_byte_swap(signal); return retVal; } -int32_t QwDevXM125::setDistanceSignalQuality(uint32_t signal) +sfTkError_t sfDevXM125::setDistanceSignalQuality(uint32_t signal) { - signal = __builtin_bswap32(signal); + signal = sftk_byte_swap(signal); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t*)&signal, 4); } -int32_t QwDevXM125::getDistanceMaxProfile(uint32_t &profile) +sfTkError_t sfDevXM125::getDistanceMaxProfile(uint32_t &profile) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t*)&profile, 4, readBytes); - profile = __builtin_bswap32(profile); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t*)&profile, 4, readBytes); + profile = sftk_byte_swap(profile); return retVal; } -int32_t QwDevXM125::setDistanceMaxProfile(uint32_t profile) +sfTkError_t sfDevXM125::setDistanceMaxProfile(uint32_t profile) { - profile = __builtin_bswap32(profile); + profile = sftk_byte_swap(profile); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t*)&profile, 4); } -int32_t QwDevXM125::getDistanceThresholdMethod(uint32_t &method) +sfTkError_t sfDevXM125::getDistanceThresholdMethod(uint32_t &method) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t*)&method, 4, readBytes); - method = __builtin_bswap32(method); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t*)&method, 4, readBytes); + method = sftk_byte_swap(method); return retVal; } -int32_t QwDevXM125::setDistanceThresholdMethod(uint32_t method) +sfTkError_t sfDevXM125::setDistanceThresholdMethod(uint32_t method) { - method = __builtin_bswap32(method); + method = sftk_byte_swap(method); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t*)&method, 4); } -int32_t QwDevXM125::getDistancePeakSorting(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeakSorting(uint32_t &peak) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t*)&peak, 4, readBytes); - peak = __builtin_bswap32(peak); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t*)&peak, 4, readBytes); + peak = sftk_byte_swap(peak); return retVal; } -int32_t QwDevXM125::setDistancePeakSorting(uint32_t peak) +sfTkError_t sfDevXM125::setDistancePeakSorting(uint32_t peak) { - peak = __builtin_bswap32(peak); + peak = sftk_byte_swap(peak); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t*)&peak, 4); } -int32_t QwDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) +sfTkError_t sfDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t*)&thresh, 4, readBytes); - thresh = __builtin_bswap32(thresh); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t*)&thresh, 4, readBytes); + thresh = sftk_byte_swap(thresh); return retVal; } -int32_t QwDevXM125::setDistanceNumFramesRecordedThreshold(uint32_t thresh) +sfTkError_t sfDevXM125::setDistanceNumFramesRecordedThreshold(uint32_t thresh) { - thresh = __builtin_bswap32(thresh); + thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t*)&thresh, 4); } -int32_t QwDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) +sfTkError_t sfDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t*)&thresh, 4, readBytes); - thresh = __builtin_bswap32(thresh); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t*)&thresh, 4, readBytes); + thresh = sftk_byte_swap(thresh); return retVal; } -int32_t QwDevXM125::setDistanceFixedAmpThreshold(uint32_t thresh) +sfTkError_t sfDevXM125::setDistanceFixedAmpThreshold(uint32_t thresh) { - thresh = __builtin_bswap32(thresh); + thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t*)&thresh, 4); } -int32_t QwDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) +sfTkError_t sfDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t*)&thresh, 4, readBytes); - thresh = __builtin_bswap32(thresh); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t*)&thresh, 4, readBytes); + thresh = sftk_byte_swap(thresh); return retVal; } -int32_t QwDevXM125::setDistanceThresholdSensitivity(uint32_t thresh) +sfTkError_t sfDevXM125::setDistanceThresholdSensitivity(uint32_t thresh) { - thresh = __builtin_bswap32(thresh); + thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t*)&thresh, 4); } -int32_t QwDevXM125::getDistanceReflectorShape(uint32_t &shape) +sfTkError_t sfDevXM125::getDistanceReflectorShape(uint32_t &shape) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t*)&shape, 4, readBytes); - shape = __builtin_bswap32(shape); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t*)&shape, 4, readBytes); + shape = sftk_byte_swap(shape); return retVal; } -int32_t QwDevXM125::setDistanceReflectorShape(uint32_t shape) +sfTkError_t sfDevXM125::setDistanceReflectorShape(uint32_t shape) { - shape = __builtin_bswap32(shape); + shape = sftk_byte_swap(shape); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t*)&shape, 4); } -int32_t QwDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) +sfTkError_t sfDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t*)&thresh, 4, readBytes); - thresh = __builtin_bswap32(thresh); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t*)&thresh, 4, readBytes); + thresh = sftk_byte_swap(thresh); return retVal; } -int32_t QwDevXM125::setDistanceFixedStrengthThresholdValue(int32_t thresh) +sfTkError_t sfDevXM125::setDistanceFixedStrengthThresholdValue(int32_t thresh) { - thresh = __builtin_bswap32(thresh); + thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t*)&thresh, 4); } -int32_t QwDevXM125::getDistanceMeasureOneWakeup(bool &measure) +sfTkError_t sfDevXM125::getDistanceMeasureOneWakeup(bool &measure) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t*)&measure, 4, readBytes); } -int32_t QwDevXM125::setDistanceMeasureOneWakeup(bool measure) +sfTkError_t sfDevXM125::setDistanceMeasureOneWakeup(bool measure) { return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t*)&measure, 4); } -int32_t QwDevXM125::setDistanceCommand(uint32_t command) +sfTkError_t sfDevXM125::setDistanceCommand(uint32_t command) { - command = __builtin_bswap32(command); + command = sftk_byte_swap(command); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_COMMAND, (uint8_t*)&command, 4); } -int32_t QwDevXM125::distanceApplyConfiguration() +sfTkError_t sfDevXM125::distanceApplyConfiguration() { return setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION); } -int32_t QwDevXM125::distanceStart() +sfTkError_t sfDevXM125::distanceStart() { return setDistanceCommand(SFE_XM125_DISTANCE_START_DETECTOR); } -int32_t QwDevXM125::distanceStop() +sfTkError_t sfDevXM125::distanceStop() { return setDistanceCommand(SFE_XM125_DISTANCE_STOP_DETECTOR); } -int32_t QwDevXM125::distanceCalibrate() +sfTkError_t sfDevXM125::distanceCalibrate() { return setDistanceCommand(SFE_XM125_DISTANCE_CALIBRATE); } -int32_t QwDevXM125::distanceRecalibrate() +sfTkError_t sfDevXM125::distanceRecalibrate() { return setDistanceCommand(SFE_XM125_DISTANCE_RECALIBRATE); } -int32_t QwDevXM125::distanceEnableUartLogs() +sfTkError_t sfDevXM125::distanceEnableUartLogs() { return setDistanceCommand(SFE_XM125_DISTANCE_ENABLE_UART_LOGS); } -int32_t QwDevXM125::distanceDisableUartLogs() +sfTkError_t sfDevXM125::distanceDisableUartLogs() { return setDistanceCommand(SFE_XM125_DISTANCE_DISABLE_UART_LOGS); } -int32_t QwDevXM125::distanceLogConfiguration() +sfTkError_t sfDevXM125::distanceLogConfiguration() { return setDistanceCommand(SFE_XM125_DISTANCE_LOG_CONFIGURATION); } -int32_t QwDevXM125::distanceReset() +sfTkError_t sfDevXM125::distanceReset() { return setDistanceCommand(SFE_XM125_DISTANCE_RESET_MODULE); } -int32_t QwDevXM125::distanceBusyWait() +sfTkError_t sfDevXM125::distanceBusyWait() { - int32_t retVal = 0; + sfTkError_t retVal = 0; uint32_t regVal = 0; size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Poll Detector Status until Busy bit is cleared while(((regVal & SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK) >> SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK_SHIFT) != 0) { retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); } // Return error code if non-zero @@ -801,12 +762,12 @@ int32_t QwDevXM125::distanceBusyWait() { return retVal; } - return 0; // 0 on success + return ksfTkErrOk; // 0 on success } // --------------------- I2C Presence Detector Functions --------------------- -int32_t QwDevXM125::presenceDetectorStart() +sfTkError_t sfDevXM125::presenceDetectorStart() { // *** Presence Sensor Setup *** uint32_t errorStatus = 0; @@ -816,7 +777,7 @@ int32_t QwDevXM125::presenceDetectorStart() { return 1; } - delay(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set // Check detector status error and busy bits if(getPresenceDetectorErrorStatus(errorStatus) != 0) @@ -833,14 +794,14 @@ int32_t QwDevXM125::presenceDetectorStart() { return 4; } - delay(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set // Set End register if(setPresenceEnd(2500) != 0) { return 5; } - delay(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set // Apply configuration if(setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != 0) @@ -854,7 +815,7 @@ int32_t QwDevXM125::presenceDetectorStart() return 7; } - delay(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set // Poll detector status until busy bit is cleared if(presenceBusyWait() != 0) @@ -870,10 +831,10 @@ int32_t QwDevXM125::presenceDetectorStart() } // If no errors, return 0 - return 0; + return ksfTkErrOk; } -int32_t QwDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) +sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) { // Check error bits uint32_t errorStatus = 0; @@ -891,7 +852,7 @@ int32_t QwDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) { return 2; } - delay(100); + sftk_delay_ms(100); // Poll detector status until busy bit is cleared - CHECK ON THIS! if(presenceBusyWait() != 0) @@ -914,12 +875,12 @@ int32_t QwDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) { getPresenceDistance(presenceVal); } - return 0; + return ksfTkErrOk; } -int32_t QwDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) +sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) { - int32_t retVal; + sfTkError_t retVal; uint32_t regVal = 0; // Read from 16-Bit Register @@ -934,31 +895,31 @@ int32_t QwDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, return retVal; } -int32_t QwDevXM125::getPresenceDetectorError(uint32_t &error) +sfTkError_t sfDevXM125::getPresenceDetectorError(uint32_t &error) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t*)&error, 4, readBytes); } -int32_t QwDevXM125::getPresenceMeasureCounter(uint32_t &counter) +sfTkError_t sfDevXM125::getPresenceMeasureCounter(uint32_t &counter) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t*)&counter, 4, readBytes); } -int32_t QwDevXM125::getPresenceDetectorStatus(uint32_t &status) +sfTkError_t sfDevXM125::getPresenceDetectorStatus(uint32_t &status) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)&status, 4, readBytes); } -int32_t QwDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) +sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) { - int32_t retVal = 0; + sfTkError_t retVal = 0; uint32_t regVal = 0; size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); if(retVal != 0) { @@ -1012,19 +973,19 @@ int32_t QwDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) } // return 0 with no errors - return 0; + return ksfTkErrOk; } -int32_t QwDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) +sfTkError_t sfDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) { uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t*)®Val, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register detected = (regVal & SFE_XM125_PRESENCE_DETECTED_MASK); @@ -1032,15 +993,15 @@ int32_t QwDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) return retVal; } -int32_t QwDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &sticky) +sfTkError_t sfDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &sticky) { uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t*)®Val, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register sticky = (regVal & SFE_XM125_PRESENCE_DETECTED_STICKY_MASK) >> 1; @@ -1048,15 +1009,15 @@ int32_t QwDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &sticky) return retVal; } -int32_t QwDevXM125::getPresenceDetectorRegError(uint32_t &error) +sfTkError_t sfDevXM125::getPresenceDetectorRegError(uint32_t &error) { uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t*)®Val, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register error = (regVal & SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK) >> SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK_SHIFT; @@ -1064,13 +1025,13 @@ int32_t QwDevXM125::getPresenceDetectorRegError(uint32_t &error) return retVal; } -int32_t QwDevXM125::getPresenceTemperature(uint32_t &temp) +sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) { uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t*)®Val, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t*)®Val, 4, readBytes); // Mask unused bits from register temp = (regVal & SFE_XM125_PRESENCE_TEMPERATURE_MASK) >> SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT; @@ -1078,389 +1039,389 @@ int32_t QwDevXM125::getPresenceTemperature(uint32_t &temp) return retVal; } -int32_t QwDevXM125::getPresenceDistance(uint32_t &distance) +sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t*)&distance, 4, readBytes); - distance = __builtin_bswap32(distance); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t*)&distance, 4, readBytes); + distance = sftk_byte_swap(distance); return retVal; } -int32_t QwDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) +sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t*)&intra, 4, readBytes); - intra = __builtin_bswap32(intra); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t*)&intra, 4, readBytes); + intra = sftk_byte_swap(intra); return retVal; } -int32_t QwDevXM125::getPresenceInterPresenceScore(uint32_t &inter) +sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_INTER_PRESENCE, (uint8_t*)&inter, 4, readBytes); - inter = __builtin_bswap32(inter); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTER_PRESENCE, (uint8_t*)&inter, 4, readBytes); + inter = sftk_byte_swap(inter); return retVal; } -int32_t QwDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) +sfTkError_t sfDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t*)&sweeps, 4, readBytes); - sweeps = __builtin_bswap32(sweeps); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t*)&sweeps, 4, readBytes); + sweeps = sftk_byte_swap(sweeps); return retVal; } -int32_t QwDevXM125::setPresenceSweepsPerFrame(uint32_t sweeps) +sfTkError_t sfDevXM125::setPresenceSweepsPerFrame(uint32_t sweeps) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t*)&sweeps, 4); } -int32_t QwDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) +sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t*)&time, 4, readBytes); - time = __builtin_bswap32(time); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t*)&time, 4, readBytes); + time = sftk_byte_swap(time); return retVal; } -int32_t QwDevXM125::setPresenceInterFramePresenceTimeout(uint32_t time) +sfTkError_t sfDevXM125::setPresenceInterFramePresenceTimeout(uint32_t time) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t*)&time, 4); } -int32_t QwDevXM125::getPresenceInterPhaseBoostEnabled(bool &en) +sfTkError_t sfDevXM125::getPresenceInterPhaseBoostEnabled(bool &en) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t*)&en, 4, readBytes); } -int32_t QwDevXM125::setPresenceInterPhaseBoostEnabled(bool en) +sfTkError_t sfDevXM125::setPresenceInterPhaseBoostEnabled(bool en) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t*)&en, 4); } -int32_t QwDevXM125::getPresenceIntraDetectionEnabled(bool &en) +sfTkError_t sfDevXM125::getPresenceIntraDetectionEnabled(bool &en) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t*)&en, 4, readBytes); } -int32_t QwDevXM125::setPresenceInterDetectionEnabled(bool en) +sfTkError_t sfDevXM125::setPresenceInterDetectionEnabled(bool en) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t*)&en, 4); } -int32_t QwDevXM125::getPresenceFrameRate(uint32_t &rate) +sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t*)&rate, 4, readBytes); - rate = __builtin_bswap32(rate); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t*)&rate, 4, readBytes); + rate = sftk_byte_swap(rate); return retVal; } -int32_t QwDevXM125::setPresenceFrameRate(uint32_t rate) +sfTkError_t sfDevXM125::setPresenceFrameRate(uint32_t rate) { - rate = __builtin_bswap32(rate); + rate = sftk_byte_swap(rate); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t*)&rate, 4); } -int32_t QwDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) +sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4, readBytes); - thresh = __builtin_bswap32(thresh); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4, readBytes); + thresh = sftk_byte_swap(thresh); return retVal; } -int32_t QwDevXM125::setPresenceIntraDetectionThreshold(uint32_t thresh) +sfTkError_t sfDevXM125::setPresenceIntraDetectionThreshold(uint32_t thresh) { - thresh = __builtin_bswap32(thresh); + thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4); } -int32_t QwDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) +sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4, readBytes); - thresh = __builtin_bswap32(thresh); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4, readBytes); + thresh = sftk_byte_swap(thresh); return retVal; } -int32_t QwDevXM125::setPresenceInterDetectionThreshold(uint32_t thresh) +sfTkError_t sfDevXM125::setPresenceInterDetectionThreshold(uint32_t thresh) { - thresh = __builtin_bswap32(thresh); + thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4); } -int32_t QwDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) +sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t*)&time, 4, readBytes); - time = __builtin_bswap32(time); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t*)&time, 4, readBytes); + time = sftk_byte_swap(time); return retVal; } -int32_t QwDevXM125::setPresenceInterFrameDeviationTime(uint32_t time) +sfTkError_t sfDevXM125::setPresenceInterFrameDeviationTime(uint32_t time) { - time = __builtin_bswap32(time); + time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t*)&time, 4); } -int32_t QwDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) +sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t*)&cut, 4, readBytes); - cut = __builtin_bswap32(cut); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t*)&cut, 4, readBytes); + cut = sftk_byte_swap(cut); return retVal; } -int32_t QwDevXM125::setPresenceInterFrameFastCutoff(uint32_t cut) +sfTkError_t sfDevXM125::setPresenceInterFrameFastCutoff(uint32_t cut) { - cut = __builtin_bswap32(cut); + cut = sftk_byte_swap(cut); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t*)&cut, 4); } -int32_t QwDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) +sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t*)&cut, 4, readBytes); - cut = __builtin_bswap32(cut); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t*)&cut, 4, readBytes); + cut = sftk_byte_swap(cut); return retVal; } -int32_t QwDevXM125::setPresenceInterFrameSlowCutoff(uint32_t cut) +sfTkError_t sfDevXM125::setPresenceInterFrameSlowCutoff(uint32_t cut) { - cut = __builtin_bswap32(cut); + cut = sftk_byte_swap(cut); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t*)&cut, 4); } -int32_t QwDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) +sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t*)&time, 4, readBytes); - time = __builtin_bswap32(time); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t*)&time, 4, readBytes); + time = sftk_byte_swap(time); return retVal; } -int32_t QwDevXM125::setPresenceIntraFrameTimeConst(uint32_t time) +sfTkError_t sfDevXM125::setPresenceIntraFrameTimeConst(uint32_t time) { - time = __builtin_bswap32(time); + time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t*)&time, 4); } -int32_t QwDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) +sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t*)&time, 4, readBytes); - time = __builtin_bswap32(time); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t*)&time, 4, readBytes); + time = sftk_byte_swap(time); return retVal; } -int32_t QwDevXM125::setPresenceIntraOutputTimeConst(uint32_t time) +sfTkError_t sfDevXM125::setPresenceIntraOutputTimeConst(uint32_t time) { - time = __builtin_bswap32(time); + time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t*)&time, 4); } -int32_t QwDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) +sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t*)&time, 4, readBytes); - time = __builtin_bswap32(time); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t*)&time, 4, readBytes); + time = sftk_byte_swap(time); return retVal; } -int32_t QwDevXM125::setPresenceInterOutputTimeConst(uint32_t time) +sfTkError_t sfDevXM125::setPresenceInterOutputTimeConst(uint32_t time) { - time = __builtin_bswap32(time); + time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t*)&time, 4); } -int32_t QwDevXM125::getPresenceAutoProfileEn(bool &en) +sfTkError_t sfDevXM125::getPresenceAutoProfileEn(bool &en) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t*)&en, 4, readBytes); } -int32_t QwDevXM125::setPresenceAutoProfileEn(bool en) +sfTkError_t sfDevXM125::setPresenceAutoProfileEn(bool en) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t*)&en, 4); } -int32_t QwDevXM125::getPresenceAutoStepLengthEn(bool &en) +sfTkError_t sfDevXM125::getPresenceAutoStepLengthEn(bool &en) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t*)&en, 4, readBytes); } -int32_t QwDevXM125::setPresenceAutoStepLengthEn(bool en) +sfTkError_t sfDevXM125::setPresenceAutoStepLengthEn(bool en) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t*)&en, 4); } -int32_t QwDevXM125::getPresenceManualProfile(uint32_t &prof) +sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t*)&prof, 4, readBytes); - prof = __builtin_bswap32(prof); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t*)&prof, 4, readBytes); + prof = sftk_byte_swap(prof); return retVal; } -int32_t QwDevXM125::setPresenceManualProfile(uint32_t prof) +sfTkError_t sfDevXM125::setPresenceManualProfile(uint32_t prof) { - prof = __builtin_bswap32(prof); + prof = sftk_byte_swap(prof); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t*)&prof, 4); } -int32_t QwDevXM125::getPresenceManualStepLength(uint32_t &length) +sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t*)&length, 4, readBytes); - length = __builtin_bswap32(length); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t*)&length, 4, readBytes); + length = sftk_byte_swap(length); return retVal; } -int32_t QwDevXM125::setPresenceManualStepLength(uint32_t length) +sfTkError_t sfDevXM125::setPresenceManualStepLength(uint32_t length) { - length = __builtin_bswap32(length); + length = sftk_byte_swap(length); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t*)&length, 4); } -int32_t QwDevXM125::getPresenceStart(uint32_t &start) +sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t*)&start, 4, readBytes); - start = __builtin_bswap32(start); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t*)&start, 4, readBytes); + start = sftk_byte_swap(start); return retVal; } -int32_t QwDevXM125::setPresenceStart(uint32_t start) +sfTkError_t sfDevXM125::setPresenceStart(uint32_t start) { - start = __builtin_bswap32(start); + start = sftk_byte_swap(start); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t*)&start, 4); } -int32_t QwDevXM125::getPresenceEnd(uint32_t &end) +sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t*)&end, 4, readBytes); - end = __builtin_bswap32(end); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t*)&end, 4, readBytes); + end = sftk_byte_swap(end); return retVal; } -int32_t QwDevXM125::setPresenceEnd(uint32_t end) +sfTkError_t sfDevXM125::setPresenceEnd(uint32_t end) { - end = __builtin_bswap32(end); + end = sftk_byte_swap(end); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t*)&end, 4); } -int32_t QwDevXM125::getPresenceResetFilters(bool &reset) +sfTkError_t sfDevXM125::getPresenceResetFilters(bool &reset) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t*)&reset, 4, readBytes); } -int32_t QwDevXM125::setPresenceResetFilters(bool reset) +sfTkError_t sfDevXM125::setPresenceResetFilters(bool reset) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t*)&reset, 4); } -int32_t QwDevXM125::getPresenceHWAAS(uint32_t &avg) +sfTkError_t sfDevXM125::getPresenceHWAAS(uint32_t &avg) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t*)&avg, 4, readBytes); } -int32_t QwDevXM125::setPresenceHWAAS(uint32_t avg) +sfTkError_t sfDevXM125::setPresenceHWAAS(uint32_t avg) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t*)&avg, 4); } -int32_t QwDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) +sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) { size_t readBytes = 0; - int32_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t*)&detected, 4, readBytes); - detected = __builtin_bswap32(detected); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t*)&detected, 4, readBytes); + detected = sftk_byte_swap(detected); return retVal; } -int32_t QwDevXM125::setPresenceDetectionOnGPIO(uint32_t detected) +sfTkError_t sfDevXM125::setPresenceDetectionOnGPIO(uint32_t detected) { - detected = __builtin_bswap32(detected); + detected = sftk_byte_swap(detected); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t*)&detected, 4); } -int32_t QwDevXM125::setPresenceCommand(uint32_t cmd) +sfTkError_t sfDevXM125::setPresenceCommand(uint32_t cmd) { - cmd = __builtin_bswap32(cmd); + cmd = sftk_byte_swap(cmd); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t*)&cmd, 4); } -int32_t QwDevXM125::presenceApplyConfiguration() +sfTkError_t sfDevXM125::presenceApplyConfiguration() { return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); } -int32_t QwDevXM125::presenceStart() +sfTkError_t sfDevXM125::presenceStart() { return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); } -int32_t QwDevXM125::presencestop() +sfTkError_t sfDevXM125::presencestop() { return setPresenceCommand(SFE_XM125_PRESENCE_STOP_DETECTOR); } -int32_t QwDevXM125::presenceEnableUartLogs() +sfTkError_t sfDevXM125::presenceEnableUartLogs() { return setPresenceCommand(SFE_XM125_PRESENCE_ENABLE_UART_LOGS); } -int32_t QwDevXM125::presenceDisableUartLogs() +sfTkError_t sfDevXM125::presenceDisableUartLogs() { return setPresenceCommand(SFE_XM125_PRESENCE_DISABLE_UART_LOGS); } -int32_t QwDevXM125::presenceLogConfiguration() +sfTkError_t sfDevXM125::presenceLogConfiguration() { return setPresenceCommand(SFE_XM125_PRESENCE_LOG_CONFIGURATION); } -int32_t QwDevXM125::getPresenceBusy(uint32_t &busy) +sfTkError_t sfDevXM125::getPresenceBusy(uint32_t &busy) { - int32_t retVal; + sfTkError_t retVal; uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); - busy = __builtin_bswap32(busy); + busy = sftk_byte_swap(busy); // Mask unused bits from register busy = (regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> SFE_XM125_PRESENCE_BUSY_MASK_SHIFT; return retVal; } -int32_t QwDevXM125::presenceBusyWait() +sfTkError_t sfDevXM125::presenceBusyWait() { - int32_t retVal = 0; + sfTkError_t retVal = 0; uint32_t regVal = 0; size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); // Poll Detector Status until Busy bit is cleared while(((regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> 30) != 0) { retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); - regVal = __builtin_bswap32(regVal); + regVal = sftk_byte_swap(regVal); } if(retVal != 0) { return retVal; } - return 0; // 0 on success + return ksfTkErrOk; // 0 on success } diff --git a/src/sfeQwiicXM125.h b/src/sfTk/sfDevXM125.h similarity index 57% rename from src/sfeQwiicXM125.h rename to src/sfTk/sfDevXM125.h index 6e29431..4d21485 100644 --- a/src/sfeQwiicXM125.h +++ b/src/sfTk/sfDevXM125.h @@ -1,436 +1,441 @@ #pragma once -#include "SparkFun_Toolkit.h" -#include "sfeXM125Regs.h" -class QwDevXM125 + +#include +// Bus interfaces +#include + +#include "sfXM125Regs.h" + +class sfDevXM125 { public: /// @brief Initializer - QwDevXM125(); + sfDevXM125() : _theBus{nullptr} {}; /// @brief This function begins the examples/communication. - /// @return Error code (0 no error) - bool begin(sfeTkII2C *theBus = nullptr); + /// @return ksfTkErrOk on success, or error code (value < -1) + bool begin(sfTkII2C *theBus = nullptr); - int32_t returnRegister(uint32_t ®Val); + // sfTkError_t returnRegister(uint32_t ®Val); // --------------------- I2C Disance Detector Functions --------------------- /// @brief This function sets all the beginning values for a basic I2C /// example to be run on the device for presence sensing. - /// @return Error code (0 no error) - int32_t distanceBegin(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceBegin(); /// @brief This function does all the required checks and busy waits to /// make sure the device is ready for distance readings. - /// @return Error code (0 no error) - int32_t distanceDetectorReadingSetup(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceDetectorReadingSetup(); /// @brief This function returns the version number of the device /// structure: major.minor.patch - /// @return Error code (0 no error) - int32_t getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch); /// @brief This function returns if there was an error from the /// protocol status register - /// @return Error code (0 no error) - int32_t getDistanceDetectorError(uint32_t &error); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceDetectorError(uint32_t &error); /// @brief This function returns the error status according to the bit /// mask value for the distance devices errors and busy bit /// @param status Error status of device (see function for exact error) - /// @return Error code (0 no error) - int32_t getDistanceDetectorErrorStatus(uint32_t &status); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceDetectorErrorStatus(uint32_t &status); /// @brief This function returns the measure counter, the number of measurements /// performed since restart. - /// @return Error code (0 no error) - int32_t getDistanceMeasureCounter(uint32_t &counter); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMeasureCounter(uint32_t &counter); /// @brief This function returns the status of the device if there are any issues /// with any of the status's listed defined. - /// @return Error code (0 no error) - int32_t getDistanceDetectorStatus(uint32_t &status); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceDetectorStatus(uint32_t &status); /// @brief This function returns the number of detected distances. /// @param distance Number of detected distances - /// @return Error code (0 no error) - int32_t getDistanceNumberDistances(uint32_t &distance); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceNumberDistances(uint32_t &distance); /// @brief This function returns the indication that there might be an object /// near the start point of the measured range. /// @param edge Flag to determine object in range - /// @return Error code (0 no error) - int32_t getDistanceNearStartEdge(uint32_t &edge); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceNearStartEdge(uint32_t &edge); /// @brief This function returns the indication of a sensor calibration needed. /// @param calibrate Flag to indicate calibration required - /// @return Error code (0 no error) - int32_t getDistanceCalibrationNeeded(uint32_t &calibrate); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceCalibrationNeeded(uint32_t &calibrate); /// @brief This function returns if the measure command failed. /// @param error Flag to indicate measure command error - /// @return Error code (0 no error) - int32_t getDistanceMeasureDistanceError(uint32_t &error); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMeasureDistanceError(uint32_t &error); /// @brief This function returns the temperature in sensor during measurements /// (in degree Celsius). Note that it has poor absolute accuracy and should /// only be used for relative temperature measurements. /// @param temperature Relative tempertaure of device - /// @return Error code (0 no error) - int32_t getDistanceTemperature(uint32_t &temperature); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceTemperature(uint32_t &temperature); /// @brief This function returns the distance to peak 0 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak0Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak0Distance(uint32_t &peak); /// @brief This function returns the distance to peak 1 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak1Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak1Distance(uint32_t &peak); /// @brief This function returns the distance to peak 2 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak2Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak2Distance(uint32_t &peak); /// @brief This function returns the distance to peak 3 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak3Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak3Distance(uint32_t &peak); /// @brief This function returns the distance to peak 4 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak4Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak4Distance(uint32_t &peak); /// @brief This function returns the distance to peak 5 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak5Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak5Distance(uint32_t &peak); /// @brief This function returns the distance to peak 6 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak6Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak6Distance(uint32_t &peak); /// @brief This function returns the distance to peak 7 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak7Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak7Distance(uint32_t &peak); /// @brief This function returns the distance to peak 8 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak8Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak8Distance(uint32_t &peak); /// @brief This function returns the distance to peak 9 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak9Distance(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak9Distance(uint32_t &peak); /// @brief This function returns the strength of peak 0 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak0Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak0Strength(uint32_t &peak); /// @brief This function returns the strength of peak 1 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak1Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak1Strength(uint32_t &peak); /// @brief This function returns the strength of peak 2 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak2Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak2Strength(uint32_t &peak); /// @brief This function returns the strength of peak 3 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak3Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak3Strength(uint32_t &peak); /// @brief This function returns the strength of peak 4 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak4Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak4Strength(uint32_t &peak); /// @brief This function returns the strength of peak 5 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak5Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak5Strength(uint32_t &peak); /// @brief This function returns the strength of peak 6 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak6Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak6Strength(uint32_t &peak); /// @brief This function returns the strength of peak 7 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak7Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak7Strength(uint32_t &peak); /// @brief This function returns the strength of peak 8 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak8Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak8Strength(uint32_t &peak); /// @brief This function returns the strength of peak 9 /// Note: This value is a factor 1000 larger than the RSS value - /// @return Error code (0 no error) - int32_t getDistancePeak9Strength(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak9Strength(uint32_t &peak); /// @brief This function returns the start of measured interval /// in millimeters. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 250 - /// @return Error code (0 no error) - int32_t getDistanceStart(uint32_t &startVal); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceStart(uint32_t &startVal); /// @brief This function sets the start of measured interval in /// millimeters. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 250 - /// @return Error code (0 no error) - int32_t setDistanceStart(uint32_t start); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceStart(uint32_t start); /// @brief This function returns the end of measured interval /// in millimeters. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 3000 - /// @return Error code (0 no error) - int32_t getDistanceEnd(uint32_t &end); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceEnd(uint32_t &end); /// @brief This function sets the end of measured interval /// in millimeters. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 3000 - /// @return Error code (0 no error) - int32_t setDistanceEnd(uint32_t end); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceEnd(uint32_t end); /// @brief This function returns the used to limit step length. /// If set to 0 (default), the step length is calculated /// based on profile. /// Default Value: 0 - /// @return Error code (0 no error) - int32_t getDistanceMaxStepLength(uint32_t &length); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMaxStepLength(uint32_t &length); /// @brief This function sets the used to limit step length. /// If set to 0 (default), the step length is calculated /// based on profile. /// Default Value: 0 - /// @return Error code (0 no error) - int32_t setDistanceMaxStepLength(uint32_t length); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceMaxStepLength(uint32_t length); /// @brief This function reads if the close range leakage /// cancellation logic is enabled. /// Default Value: true - /// @return Error code (0 no error) - int32_t getDistanceCloseRangeLeakageCancellation(bool &range); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceCloseRangeLeakageCancellation(bool &range); /// @brief This function sets the close range leakage /// cancellation logic. /// Default Value: true - /// @return Error code (0 no error) - int32_t setDistanceCloseRangeLeakageCancellation(bool range); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceCloseRangeLeakageCancellation(bool range); /// @brief This function returns the high signal quality in a /// better SNR (because of higher HWAAS) and higher power consumption. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 15000 - /// @return Error code (0 no error) - int32_t getDistanceSignalQuality(uint32_t &signal); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceSignalQuality(uint32_t &signal); /// @brief This function sets the high signal quality in a /// better SNR (because of higher HWAAS) and higher power consumption. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 15000 - /// @return Error code (0 no error) - int32_t setDistanceSignalQuality(uint32_t signal); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceSignalQuality(uint32_t signal); /// @brief This function returns the max profile of the device. /// Default value = PROFILE5 - /// @return Error code (0 no error) - int32_t getDistanceMaxProfile(uint32_t &profile); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMaxProfile(uint32_t &profile); /// @brief This function sets the max profile of the device /// Default value = PROFILE5 - /// @return Error code (0 no error) - int32_t setDistanceMaxProfile(uint32_t profile); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceMaxProfile(uint32_t profile); /// @brief This function returns the threshold method - /// @return Error code (0 no error) - int32_t getDistanceThresholdMethod(uint32_t &method); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceThresholdMethod(uint32_t &method); /// @brief This function sets the threshold method /// @param method Threshold method (enum) - /// @return Error code (0 no error) - int32_t setDistanceThresholdMethod(uint32_t method); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceThresholdMethod(uint32_t method); /// @brief This function returns the peak sorting method /// @param peak Peak sorting method - /// @return Error code (0 no error) - int32_t getDistancePeakSorting(uint32_t &peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeakSorting(uint32_t &peak); /// @brief This function sets the peak sorting method /// @param peak Peak sorting method - /// @return Error code (0 no error) - int32_t setDistancePeakSorting(uint32_t peak); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistancePeakSorting(uint32_t peak); /// @brief This function returns the number frames to use for recorded threshold. /// Default Value: 100 /// @param thresh Number of frames - /// @return Error code (0 no error) - int32_t getDistanceNumFramesRecordedThreshold(uint32_t &thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceNumFramesRecordedThreshold(uint32_t &thresh); /// @brief This function sets the number frames to use for recorded threshold. /// Default Value: 100 /// @param thresh Number of frames - /// @return Error code (0 no error) - int32_t setDistanceNumFramesRecordedThreshold(uint32_t thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceNumFramesRecordedThreshold(uint32_t thresh); /// @brief This function returns the fixed amplitude threshold value. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 100000 /// @param thresh Fixed amplitude threshold value - /// @return Error code (0 no error) - int32_t getDistanceFixedAmpThreshold(uint32_t &thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceFixedAmpThreshold(uint32_t &thresh); /// @brief This function sets the fixed amplitude threshold value. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 100000 /// @param thresh Fixed amplitude threshold value - /// @return Error code (0 no error) - int32_t setDistanceFixedAmpThreshold(uint32_t thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceFixedAmpThreshold(uint32_t thresh); /// @brief This function returns the threshold sensitivity /// (0 <= sensitivity <= 1000) /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 500 /// @param thresh& Threshold sensitivity - /// @return Error code (0 no error) - int32_t getDistanceThresholdSensitivity(uint32_t &thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceThresholdSensitivity(uint32_t &thresh); /// @brief This function sets the threshold sensitivity /// (0 <= sensitivity <= 1000) /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 500 /// @param thresh Threshold sensitivity - /// @return Error code (0 no error) - int32_t setDistanceThresholdSensitivity(uint32_t thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceThresholdSensitivity(uint32_t thresh); /// @brief This function returns the reflector shape /// Default Value: GENERIC /// @param shape Generic or planar reflection - /// @return Error code (0 no error) - int32_t getDistanceReflectorShape(uint32_t &shape); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceReflectorShape(uint32_t &shape); /// @brief This function sets the reflector shape /// Default Value: GENERIC /// @param shape Generic or planar reflection - /// @return Error code (0 no error) - int32_t setDistanceReflectorShape(uint32_t shape); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceReflectorShape(uint32_t shape); /// @brief This function returns the fixed strength threshold value. /// Default Value: 0 /// Note: This value is a factor 1000 larger than the RSS value /// @param thresh fixed threshold strength value - /// @return Error code (0 no error) - int32_t getDistanceFixedStrengthThresholdValue(int32_t &thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceFixedStrengthThresholdValue(int32_t &thresh); /// @brief This function sets the fixed strength threshold value. /// Default Value: 0 /// Note: This value is a factor 1000 larger than the RSS value /// @param thresh fixed threshold strength value - /// @return Error code (0 no error) - int32_t setDistanceFixedStrengthThresholdValue(int32_t thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceFixedStrengthThresholdValue(int32_t thresh); /// @brief This function returns the measure on wakeup status. /// Default Value: false - /// @param measure Measure on wakeup occurance - /// @return Error code (0 no error) - int32_t getDistanceMeasureOneWakeup(bool &measure); + /// @param measure Measure on wakeup occurrence + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMeasureOneWakeup(bool &measure); /// @brief This function sets the measure on wakeup status. /// Default Value: false - /// @param measure Measure on wakeup occurance - /// @return Error code (0 no error) - int32_t setDistanceMeasureOneWakeup(bool measure); + /// @param measure Measure on wakeup occurrence + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceMeasureOneWakeup(bool measure); /// @brief This function sets the specific execute command as defined in the /// datasheet on Page 25, Section 6.2.40 Command. /// @param apply Enable configuration and calibrate - /// @return Error code (0 no error) - int32_t setDistanceCommand(uint32_t command); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceCommand(uint32_t command); /// @brief This function applies the configuration to the device by /// writing the defined value to the distance command register - /// @return Error code (0 no error) - int32_t distanceApplyConfiguration(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceApplyConfiguration(); /// @brief This function starts the device by writing the defined /// start value to the distance command register - /// @return Error code (0 no error) - int32_t distanceStart(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceStart(); /// @brief This function stops the device by writing the defined /// stop value to the distance command register - /// @return Error code (0 no error) - int32_t distanceStop(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceStop(); /// @brief This function calibrates the device by writing the defined /// calibration value to the distance command register - /// @return Error code (0 no error) - int32_t distanceCalibrate(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceCalibrate(); /// @brief This function recalibrates the device by writing the defined /// recalibrate value to the distance command register - /// @return Error code (0 no error) - int32_t distanceRecalibrate(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceRecalibrate(); /// @brief This function enables the uart logs of the device by /// writing the defined value to the distance command register - /// @return Error code (0 no error) - int32_t distanceEnableUartLogs(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceEnableUartLogs(); /// @brief This function disables the uart logs of the device by /// writing the defined value to the distance command register - /// @return Error code (0 no error) - int32_t distanceDisableUartLogs(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceDisableUartLogs(); /// @brief This function enables the configuration log of the device /// by writing the defined value to the distance command register - /// @return Error code (0 no error) - int32_t distanceLogConfiguration(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceLogConfiguration(); /// @brief This function resets the distance detector settings /// of the device - /// @return Error code (0 no error) - int32_t distanceReset(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceReset(); /// @brief Completes a busy wait loop while the device is uploading /// information by waiting for the status - /// @return Error code (0 no error) - int32_t distanceBusyWait(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceBusyWait(); // --------------------- I2C Presence Detector Functions --------------------- /// @brief This function sets all the beginning values for a basic I2C /// example to be run on the device for presence sensing. - /// @return Error code (0 no error) - int32_t presenceDetectorStart(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t presenceDetectorStart(); /// @brief This function returns the presence value of the register /// with all the checks in place as per the I2C Datasheet. - /// @return Error code (0 no error) - int32_t getPresenceDistanceValuemm(uint32_t &presenceVal); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDistanceValuemm(uint32_t &presenceVal); /// @brief This function returns the RSS version number /// @param version Version number /// @param patch Patch version number - /// @return Error code (0 no error) - int32_t getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch); /// @brief This function returns the protocol state erorr /// @param state Error code for device @@ -439,442 +444,442 @@ class QwDevXM125 /// 2 = Address error /// 3 = Write failed /// 4 = Write to read only - /// @return Error code (0 no error) - int32_t getPresenceDetectorError(uint32_t &error); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDetectorError(uint32_t &error); /// @brief This function returns the measure counter; the number of /// measurements performed since restart. /// @param counter number of measurements - /// @return Error code (0 no error) - int32_t getPresenceMeasureCounter(uint32_t &counter); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceMeasureCounter(uint32_t &counter); /// @brief This function returns the detector status flags. See page 17, section /// 6.2.4 Detector Status /// @param status Status detector flag - /// @return Error code (0 no error) - int32_t getPresenceDetectorStatus(uint32_t &status); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDetectorStatus(uint32_t &status); /// @brief This function returns the error status according to the bit /// mask value for the presence devices errors and busy bit /// @param status Error status of device (see function for exact error) - /// @return Error code (0 no error) - int32_t getPresenceDetectorErrorStatus(uint32_t &status); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDetectorErrorStatus(uint32_t &status); /// @brief This function returns if there was presence detected /// @param detected Presence Detected - /// @return Error code (0 no error) - int32_t getPresenceDetectorPresenceDetected(uint32_t &detected); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDetectorPresenceDetected(uint32_t &detected); /// @brief This function returns if there was presence detected, sticky bit with /// clear on read. /// @param sticky Sticky Presence Detected - /// @return Error code (0 no error) - int32_t getPresenceDetectorPresenceStickyDetected(uint32_t &sticky); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDetectorPresenceStickyDetected(uint32_t &sticky); /// @brief This function returns the indication that the presence detector /// failed. /// @param calibrate Indication of sensor calibration - /// @return Error code (0 no error) - int32_t getPresenceDetectorRegError(uint32_t &error); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDetectorRegError(uint32_t &error); /// @brief This function returns the temperature in sensor during measurement (in /// degree Celsius). Note that it has poor absolute accuracy and should only - /// be used for relavtive temperature measurements. + /// be used for relative temperature measurements. /// @param temp Relative temperature - /// @return Error code (0 no error) - int32_t getPresenceTemperature(uint32_t &temp); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceTemperature(uint32_t &temp); /// @brief This function returns the distance, in millimeters, for the detected /// presence. /// @param distance distance in mm - /// @return Error code (0 no error) - int32_t getPresenceDistance(uint32_t &distance); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDistance(uint32_t &distance); /// @brief This function returns the measure of amount of fast motion detected. /// @param intra Measure of fast motion - /// @return Error code (0 no error) - int32_t getPresenceIntraPresenceScore(uint32_t &intra); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceIntraPresenceScore(uint32_t &intra); /// @brief This function returns the measure of amount of slow motion detected. /// @param inter Measure of slow motion - /// @return Error code (0 no error) - int32_t getPresenceInterPresenceScore(uint32_t &inter); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceInterPresenceScore(uint32_t &inter); /// @brief This function returns the number of sweeps that will be /// captured in each frame (measurement). /// Default Value: 16 seconds /// @param sweeps Number of sweeps - /// @return Error code (0 no error) - int32_t getPresenceSweepsPerFrame(uint32_t &sweeps); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceSweepsPerFrame(uint32_t &sweeps); /// @brief This function sets the number of sweeps that will be /// captured in each frame (measurement). /// Default Value: 16 seconds /// @param sweeps Number of sweeps - /// @return Error code (0 no error) - int32_t setPresenceSweepsPerFrame(uint32_t sweeps); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceSweepsPerFrame(uint32_t sweeps); /// @brief Returns the number of seconds the inter-frame presence score needs to decrease before /// exponential scaling starts for faster decline. Should be between 0 and 30 where 0 /// means no timeout. /// Default Value: 3 seconds /// @param time Number of seconds - /// @return Error code (0 no error) - int32_t getPresenceInterFramePresenceTimeout(uint32_t &time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceInterFramePresenceTimeout(uint32_t &time); /// @brief Sets the number of seconds the inter-frame presence score needs to decrease before /// exponential scaling starts for faster decline. Should be between 0 and 30 where 0 /// means no timeout. /// Default Value: 3 seconds /// @param time Number of seconds - /// @return Error code (0 no error) - int32_t setPresenceInterFramePresenceTimeout(uint32_t time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceInterFramePresenceTimeout(uint32_t time); /// @brief This function returns the enable to increase detection of slow /// motions by utilizing the phase information in the Sparse IQ data /// @param en Enables increased detection /// Default Value: false - /// @return Error code (0 no error) - int32_t getPresenceInterPhaseBoostEnabled(bool &en); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceInterPhaseBoostEnabled(bool &en); /// @brief This function sets the enable to increase detection of slow /// motions by utilizing the phase information in the Sparse IQ data /// @param en Enables increased detection /// Default Value: false - /// @return Error code (0 no error) - int32_t setPresenceInterPhaseBoostEnabled(bool en); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceInterPhaseBoostEnabled(bool en); /// @brief This function returns the bit to enable to detect faster /// movements inside frames. /// Default Value: true /// @param en Enables faster detection - /// @return Error code (0 no error) - int32_t getPresenceIntraDetectionEnabled(bool &en); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceIntraDetectionEnabled(bool &en); /// @brief This function returns the bit to enable to detect slower /// movements between frames. /// Default Value: true /// @param en Enables faster detection - /// @return Error code (0 no error) - int32_t setPresenceInterDetectionEnabled(bool en); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceInterDetectionEnabled(bool en); /// @brief This function returns the presence detector frame rate. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 12000 mHz /// @param rate Frame rate, in mHz - /// @return Error code (0 no error) - int32_t getPresenceFrameRate(uint32_t &rate); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceFrameRate(uint32_t &rate); /// @brief This function sets the presence detector frame rate. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 12000 mHz /// @param rate Frame rate, in mHz - /// @return Error code (0 no error) - int32_t setPresenceFrameRate(uint32_t rate); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceFrameRate(uint32_t rate); /// @brief This function returns the threshold for detecting faster /// movements inside frames. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 1300 /// @param thresh threshold for faster movements - /// @return Error code (0 no error) - int32_t getPresenceIntraDetectionThreshold(uint32_t &thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceIntraDetectionThreshold(uint32_t &thresh); /// @brief This function sets the threshold for detecting faster /// movements inside frames. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 1300 /// @param thresh threshold for faster movements - /// @return Error code (0 no error) - int32_t setPresenceIntraDetectionThreshold(uint32_t thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceIntraDetectionThreshold(uint32_t thresh); /// @brief This function returns the threshold for detecting slower /// movements inside frames. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 1000 /// @param thresh threshold for faster movements - /// @return Error code (0 no error) - int32_t getPresenceInterDetectionThreshold(uint32_t &thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceInterDetectionThreshold(uint32_t &thresh); /// @brief This function sets the threshold for detecting slower /// movements inside frames. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 1000 /// @param thresh threshold for faster movements - /// @return Error code (0 no error) - int32_t setPresenceInterDetectionThreshold(uint32_t thresh); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceInterDetectionThreshold(uint32_t thresh); /// @brief This function returns the time constant of the low pass /// filter for the inter-frame deviation between fast and slow. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 500 ms /// @param time time in ms - /// @return Error code (0 no error) - int32_t getPresenceInterFrameDeviationTime(uint32_t &time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceInterFrameDeviationTime(uint32_t &time); /// @brief This function sets the time constant of the low pass /// filter for the inter-frame deviation between fast and slow. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 500 ms /// @param time time in ms - /// @return Error code (0 no error) - int32_t setPresenceInterFrameDeviationTime(uint32_t time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceInterFrameDeviationTime(uint32_t time); /// @brief This function returns the cutoff frequency of the low pass /// filter for the fast filtered absolute sweep mean. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 6000 mHz /// @param cut cutoff frequency in mHz - /// @return Error code (0 no error) - int32_t getPresenceInterFrameFastCutoff(uint32_t &cut); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceInterFrameFastCutoff(uint32_t &cut); /// @brief This function sets the cutoff frequency of the low pass /// filter for the fast filtered absolute sweep mean. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 6000 mHz /// @param cut cutoff frequency in mHz - /// @return Error code (0 no error) - int32_t setPresenceInterFrameFastCutoff(uint32_t cut); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceInterFrameFastCutoff(uint32_t cut); /// @brief This function returns the cutoff frequency of the low pass /// filter for the slow filtered absolute sweep mean. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 200 mHz /// @param cut cutoff frequency in mHz - /// @return Error code (0 no error) - int32_t getPresenceInterFrameSlowCutoff(uint32_t &cut); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceInterFrameSlowCutoff(uint32_t &cut); /// @brief This function sets the cutoff frequency of the low pass /// filter for the slow filtered absolute sweep mean. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 200 mHz /// @param cut cutoff frequency in mHz - /// @return Error code (0 no error) - int32_t setPresenceInterFrameSlowCutoff(uint32_t cut); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceInterFrameSlowCutoff(uint32_t cut); /// @brief This functions returns time constant for the depthwise /// filtering in the intra-frame part /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 150ms /// @param time time const in ms - /// @return Error code (0 no error) - int32_t getPresenceIntraFrameTimeConst(uint32_t &time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceIntraFrameTimeConst(uint32_t &time); /// @brief This functions sets time constant for the depthwise /// filtering in the intra-frame part /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 150ms /// @param time time const in ms - /// @return Error code (0 no error) - int32_t setPresenceIntraFrameTimeConst(uint32_t time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceIntraFrameTimeConst(uint32_t time); /// @brief This function returns time constant for the output in /// the intra-frame part /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 300ms /// @param time time const in ms - /// @return Error code (0 no error) - int32_t getPresenceIntraOutputTimeConst(uint32_t &time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceIntraOutputTimeConst(uint32_t &time); /// @brief This function sets the time constant for the output in /// the intra-frame part /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 300ms /// @param time time const in ms - /// @return Error code (0 no error) - int32_t setPresenceIntraOutputTimeConst(uint32_t time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceIntraOutputTimeConst(uint32_t time); /// @brief This function returns time constant for the output in /// the inter-frame part /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 2000ms /// @param time time const in ms - /// @return Error code (0 no error) - int32_t getPresenceInterOutputTimeConst(uint32_t &time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceInterOutputTimeConst(uint32_t &time); /// @brief This function sets the time constant for the output in /// the inter-frame part /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 2000ms /// @param time time const in ms - /// @return Error code (0 no error) - int32_t setPresenceInterOutputTimeConst(uint32_t time); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceInterOutputTimeConst(uint32_t time); /// @brief This function returns if enable/disable for the automatic /// selection of profile based on start point of measurement. /// Default Value: true /// @param en enable/disable selection - /// @return Error code (0 no error) - int32_t getPresenceAutoProfileEn(bool &en); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceAutoProfileEn(bool &en); /// @brief This function enables/disables the automatic selection /// of profile based on start point of measurement. /// Default Value: true /// @param en enable/disable selection - /// @return Error code (0 no error) - int32_t setPresenceAutoProfileEn(bool en); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceAutoProfileEn(bool en); /// @brief This function returns the Enable/Disable /// automatic selection of step length based on the profile. /// @param en Enable/disable selection - /// @return Error code (0 no error) - int32_t getPresenceAutoStepLengthEn(bool &en); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceAutoStepLengthEn(bool &en); /// @brief This function Enables/Disables automatic selection /// of step length based on the profile. /// @param en Enable/disable selection - /// @return Error code (0 no error) - int32_t setPresenceAutoStepLengthEn(bool en); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceAutoStepLengthEn(bool en); /// @brief This function returns the profile in use. The profile will only /// be used if profile auto selection was disabled. /// @param prof Profile to use (enum) - /// @return Error code (0 no error) - int32_t getPresenceManualProfile(uint32_t &prof); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceManualProfile(uint32_t &prof); /// @brief This function sets the profile to use. The profile will only /// be used if profile auto selection was disabled. /// @param prof Profile to use (enum) - /// @return Error code (0 no error) - int32_t setPresenceManualProfile(uint32_t prof); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceManualProfile(uint32_t prof); /// @brief THis function returns the number of steps between each data point. /// NOTE: The manual step length will only be used if step length auto selection /// was disabled /// Default Value: 72 /// @param length number of steps - /// @return Error code (0 no error) - int32_t getPresenceManualStepLength(uint32_t &length); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceManualStepLength(uint32_t &length); /// @brief THis function returns the number of steps between each data point. /// NOTE: The manual step length will only be used if step length auto selection /// was disabled /// Default Value: 72 /// @param length number of steps - /// @return Error code (0 no error) - int32_t setPresenceManualStepLength(uint32_t length); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceManualStepLength(uint32_t length); /// @brief This function returns the start of measured interval in mm. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 300mm /// @param start measured start interval in mm - /// @return Error code (0 no error) - int32_t getPresenceStart(uint32_t &start); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceStart(uint32_t &start); /// @brief This function sets the start of measured interval in mm. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 300mm /// @param start measured start interval in mm - /// @return Error code (0 no error) - int32_t setPresenceStart(uint32_t start); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceStart(uint32_t start); /// @brief This function returns the end point of measurement /// interval in millimeters. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 2500 /// @param end End point of measurement in mm - /// @return Error code (0 no error) - int32_t getPresenceEnd(uint32_t &end); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceEnd(uint32_t &end); /// @brief This function returns the end point of measurement /// interval in millimeters. /// Note: This value is a factor 1000 larger than the RSS value /// Default Value: 2500 /// @param end End point of measurement in mm - /// @return Error code (0 no error) - int32_t setPresenceEnd(uint32_t end); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceEnd(uint32_t end); /// @brief This function returns if the device is enabled/disabled /// for the reset of the presence filters during start/restart. /// Default Value: true /// @param reset enabled/disabled - /// @return Error code (0 no error) - int32_t getPresenceResetFilters(bool &reset); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceResetFilters(bool &reset); /// @brief This function sets if the device is enabled/disabled /// for the reset of the presence filters during start/restart . /// Default Value: true /// @param reset enabled/disabled - /// @return Error code (0 no error) - int32_t setPresenceResetFilters(bool reset); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceResetFilters(bool reset); /// @brief This function returns the hardware accelerated average /// sampled (HWAAS). /// Default Value: 32 /// @param avg average samples - /// @return Error code (0 no error) - int32_t getPresenceHWAAS(uint32_t &avg); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceHWAAS(uint32_t &avg); /// @brief This function sets the hardware accelerated average /// sampled (HWAAS). /// Default Value: 32 /// @param avg average samples - /// @return Error code (0 no error) - int32_t setPresenceHWAAS(uint32_t avg); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceHWAAS(uint32_t avg); /// @brief This function returns the output presence detection on /// generic GPIO. /// @param detected Output presence detected - /// @return Error code (0 no error) - int32_t getPresenceDetectionOnGPIO(uint32_t &detected); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceDetectionOnGPIO(uint32_t &detected); /// @brief This function returns the output presence detection on /// generic GPIO. /// @param detected Output presence detected - /// @return Error code (0 no error) - int32_t setPresenceDetectionOnGPIO(uint32_t detected); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceDetectionOnGPIO(uint32_t detected); /// @brief This function sets the execute command /// @param cmd command to send to device - /// @return Error code (0 no error) - int32_t setPresenceCommand(uint32_t cmd); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setPresenceCommand(uint32_t cmd); /// @brief This function applies the configuration to the device by /// writing the defined value to the presence command register - /// @return Error code (0 no error) - int32_t presenceApplyConfiguration(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t presenceApplyConfiguration(); /// @brief This function starts the device by writing the defined /// start value to the presence command register - /// @return Error code (0 no error) - int32_t presenceStart(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t presenceStart(); /// @brief This function stops the device by writing the defined /// stop value to the presence command register - /// @return Error code (0 no error) - int32_t presencestop(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t presencestop(); /// @brief This function enables the uart logs of the device by /// writing the defined value to the presence command register - /// @return Error code (0 no error) - int32_t presenceEnableUartLogs(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t presenceEnableUartLogs(); /// @brief This function disables the uart logs of the device by /// writing the defined value to the presence command register - /// @return Error code (0 no error) - int32_t presenceDisableUartLogs(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t presenceDisableUartLogs(); /// @brief This function enables the configuration log of the device /// by writing the defined value to the presence command register - /// @return Error code (0 no error) - int32_t presenceLogConfiguration(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t presenceLogConfiguration(); /// @brief This function resets the presence detector settings /// of the device - /// @return Error code (0 no error) - int32_t presenceReset(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t presenceReset(); /// @brief This function returns the busy bit of the presence status register /// @param busy Device busy or not - /// @return Error code (0 no error) - int32_t getPresenceBusy(uint32_t &busy); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getPresenceBusy(uint32_t &busy); /// @brief Completes a busy wait loop while the device is uploading /// information by waiting for the status. Checks the error status register /// to wait until errors are completed/gone - /// @return Error code (0 no error) - int32_t presenceBusyWait(); + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t presenceBusyWait(); protected: - sfeTkII2C *_theBus; + sfTkII2C *_theBus; }; diff --git a/src/sfeXM125Regs.h b/src/sfTk/sfXM125Regs.h similarity index 100% rename from src/sfeXM125Regs.h rename to src/sfTk/sfXM125Regs.h From 04f749e39ca326c0e74d2c7790e9c03070c29d35 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Feb 2025 15:23:49 -0700 Subject: [PATCH 02/32] fix issue in example 1 - mm to cm conversion bug --- .../Example01_PresenceBasicReadings.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino index a6846c8..587f09b 100644 --- a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino +++ b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino @@ -88,7 +88,7 @@ void loop() Serial.print("Presence Detected: "); Serial.print(distance); Serial.println("mm"); - //Serial.print(distance * .01); + //Serial.print(distance * .1); //Serial.println("cm"); //Serial.print(distance * .001); //Serial.println("m"); From 5fda0b229aa48b18d27dd3f29352df6a25ccb4e3 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Feb 2025 17:28:35 -0700 Subject: [PATCH 03/32] cleanup and big mask fun --- src/sfTk/sfDevXM125.cpp | 650 ++++++++++++++++++++++------------------ src/sfTk/sfXM125Regs.h | 53 ++-- 2 files changed, 388 insertions(+), 315 deletions(-) diff --git a/src/sfTk/sfDevXM125.cpp b/src/sfTk/sfDevXM125.cpp index 580aebc..49dc599 100644 --- a/src/sfTk/sfDevXM125.cpp +++ b/src/sfTk/sfDevXM125.cpp @@ -1,24 +1,27 @@ #include "sfDevXM125.h" +// Handy helper - check if a bit(s) is set... + +#define SF_CHECK_BITS_SET(__value__, __bitmask__) (((__value__) & (__bitmask__)) == __bitmask__) bool sfDevXM125::begin(sfTkII2C *theBus) { - if(theBus == nullptr) + if (theBus == nullptr) { return ksfTkErrFail; } // Check if the provided address is valid - if(theBus->address() != SFE_XM125_I2C_ADDRESS) + if (theBus->address() != SFE_XM125_I2C_ADDRESS) { return ksfTkErrFail; } - // Sets communication bus + // Sets communication bus _theBus = theBus; - // Check errors from device + // Check errors from device uint32_t distanceError = 0; uint32_t presenceError = 0; int32_t distFuncErr = 0; @@ -26,15 +29,15 @@ bool sfDevXM125::begin(sfTkII2C *theBus) distFuncErr = getDistanceDetectorError(distanceError); presFuncErr = getDistanceDetectorError(presenceError); - if(distanceError != 0 ) + if (distanceError != 0) { return -1; } - if(presenceError != 0) + if (presenceError != 0) { return -2; } - if((distFuncErr != 0)|| (presFuncErr != 0)) + if ((distFuncErr != 0) || (presFuncErr != 0)) { return -3; } @@ -55,53 +58,53 @@ int32_t sfDevXM125::distanceBegin() distanceBusyWait(); - // Check error and busy bits - if(getDistanceDetectorErrorStatus(errorStatus) != 0) + // Check error and busy bits + if (getDistanceDetectorErrorStatus(errorStatus) != 0) { return 1; } - if(errorStatus != 0) + if (errorStatus != 0) { return 2; } - - // Set Start register - if(setDistanceStart(sfe_xm125_distance_start_default) != 0) + + // Set Start register + if (setDistanceStart(sfe_xm125_distance_start_default) != 0) { return 3; } - sftk_delay_ms(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set - // Set End register - if(setDistanceEnd(sfe_xm125_distance_end_default) != 0) + // Set End register + if (setDistanceEnd(sfe_xm125_distance_end_default) != 0) { return 4; } - sftk_delay_ms(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set - // Apply configuration - if(setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION) != 0) + // Apply configuration + if (setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION) != 0) { - // Check for errors - getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) - { - return 5; - } - - return 6; + // Check for errors + getDistanceDetectorErrorStatus(errorStatus); + if (errorStatus != 0) + { + return 5; + } + + return 6; } // Poll detector status until busy bit is cleared - if(distanceBusyWait() != 0) + if (distanceBusyWait() != 0) { - return 7; + return 7; } - // Check detector status + // Check detector status getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { return 7; } @@ -116,29 +119,29 @@ int32_t sfDevXM125::distanceDetectorReadingSetup() uint32_t calibrateNeeded = 0; uint32_t measDistErr = 0; - // Check error bits + // Check error bits getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { return 1; } - - // Start detector - if(setDistanceCommand(SFE_XM125_DISTANCE_START_DETECTOR) != 0) + + // Start detector + if (setDistanceCommand(SFE_XM125_DISTANCE_START_DETECTOR) != 0) { return 2; } - sftk_delay_ms(100); // give time for command to set - + sftk_delay_ms(100); // give time for command to set + // Poll detector status until busy bit is cleared - CHECK ON THIS! - if(distanceBusyWait() != 0) + if (distanceBusyWait() != 0) { return 3; } - - // Verify that no error bits are set in the detector status register + + // Verify that no error bits are set in the detector status register getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { return 4; } @@ -146,15 +149,15 @@ int32_t sfDevXM125::distanceDetectorReadingSetup() // Check MEASURE_DISTANCE_ERROR for measurement failed getDistanceMeasureDistanceError(measDistErr); - if(measDistErr == 1) + if (measDistErr == 1) { return 5; } sftk_delay_ms(100); - // Recalibrate device if calibration error is triggered + // Recalibrate device if calibration error is triggered getDistanceCalibrationNeeded(calibrateNeeded); - if(calibrateNeeded == 1) + if (calibrateNeeded == 1) { setDistanceCommand(SFE_XM125_DISTANCE_RECALIBRATE); return 6; @@ -171,10 +174,10 @@ sfTkError_t sfDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &mi // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_VERSION, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_VERSION, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Mask unused bits from register + // Mask unused bits from register major = (regVal & SFE_XM125_DISTANCE_MAJOR_VERSION_MASK) >> SFE_XM125_DISTANCE_MAJOR_VERSION_MASK_SHIFT; minor = (regVal & SFE_XM125_DISTANCE_MINOR_VERSION_MASK) >> SFE_XM125_DISTANCE_MINOR_VERSION_MASK_SHIFT; patch = regVal & SFE_XM125_DISTANCE_PATCH_VERSION_MASK; @@ -184,9 +187,10 @@ sfTkError_t sfDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &mi sfTkError_t sfDevXM125::getDistanceDetectorError(uint32_t &error) { - // Read from 16-Bit Register + // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PROTOCOL_STATUS, (uint8_t*)&error, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PROTOCOL_STATUS, (uint8_t *)&error, 4, readBytes); error = sftk_byte_swap(error); return retVal; } @@ -196,48 +200,65 @@ sfTkError_t sfDevXM125::getDistanceDetectorErrorStatus(uint32_t &status) sfTkError_t retVal; uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); // No error status = 0; - if(retVal != ksfTkErrOk) + if (retVal != ksfTkErrOk) return retVal; - if(((regVal & SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK) >> SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK_SHIFT) != 0) + // Any errors - if not, skip the big bit check pachinko if-else below + if ((regVal & SFE_XM125_DISTANCE_ALL_ERROR_MASK) == 0) + return ksfTkErrOk; + // okay some bit is set... + + if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK)) status = 1; - else if(((regVal & SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK) >> SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK)) status = 2; - else if(((regVal & SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK) >> SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK)) status = 3; - else if(((regVal & SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK) >> SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK)) status = 5; - else if(((regVal & SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK) >> SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK)) status = 6; - else if(((regVal & SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK) >> SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK)) status = 7; - else if(((regVal & SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK) >> SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK)) status = 8; - else if(((regVal & SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK) >> SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK)) status = 9; - else if(((regVal & SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK) >> SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK)) status = 10; - else if(((regVal & SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK) >> SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK)) status = 11; - else if(((regVal & SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK) >> SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK)) status = 12; - else if(((regVal & SFE_XM125_DISTANCE_BUSY_MASK) >> SFE_XM125_DISTANCE_BUSY_MASK_SHIFT) != 0) + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_BUSY_MASK)) status = 13; - return 0; // return 0 with no errors + return ksfTkErrOk; // return 0 with no errors } sfTkError_t sfDevXM125::getDistanceMeasureCounter(uint32_t &counter) { // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_COUNTER, (uint8_t*)&counter, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_COUNTER, (uint8_t *)&counter, 4, readBytes); counter = sftk_byte_swap(counter); return retVal; } @@ -245,7 +266,8 @@ sfTkError_t sfDevXM125::getDistanceMeasureCounter(uint32_t &counter) sfTkError_t sfDevXM125::getDistanceDetectorStatus(uint32_t &status) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t*)&status, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)&status, 4, readBytes); status = sftk_byte_swap(status); return retVal; } @@ -257,10 +279,10 @@ sfTkError_t sfDevXM125::getDistanceNumberDistances(uint32_t &distance) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Mask unused bits from register + // Mask unused bits from register distance = (regVal & SFE_XM125_DISTANCE_NUMBER_DISTANCES_MASK); return retVal; @@ -273,11 +295,11 @@ sfTkError_t sfDevXM125::getDistanceNearStartEdge(uint32_t &edge) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Mask unused bits from register - edge = (regVal & SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK) >> SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK_SHIFT; + // Mask unused bits from register + edge = (regVal & SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK) >> SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK_SHIFT; return retVal; } @@ -289,11 +311,12 @@ sfTkError_t sfDevXM125::getDistanceCalibrationNeeded(uint32_t &calibrate) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Mask unused bits from register - calibrate = (regVal & SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK) >> SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK_SHIFT; + // Mask unused bits from register + calibrate = + (regVal & SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK) >> SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK_SHIFT; return retVal; } @@ -305,11 +328,12 @@ sfTkError_t sfDevXM125::getDistanceMeasureDistanceError(uint32_t &error) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Mask unused bits from register - error = (regVal & SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK) >> SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK_SHIFT; + // Mask unused bits from register + error = (regVal & SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK) >> + SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK_SHIFT; return retVal; } @@ -321,11 +345,11 @@ sfTkError_t sfDevXM125::getDistanceTemperature(uint32_t &temperature) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Mask unused bits from register - temperature = (regVal & SFE_XM125_DISTANCE_TEMPERATURE_MASK) >> SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT; + // Mask unused bits from register + temperature = (regVal & SFE_XM125_DISTANCE_TEMPERATURE_MASK) >> SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT; return retVal; } @@ -333,7 +357,8 @@ sfTkError_t sfDevXM125::getDistanceTemperature(uint32_t &temperature) sfTkError_t sfDevXM125::getDistancePeak0Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -341,7 +366,8 @@ sfTkError_t sfDevXM125::getDistancePeak0Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak1Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -349,7 +375,8 @@ sfTkError_t sfDevXM125::getDistancePeak1Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak2Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -357,7 +384,8 @@ sfTkError_t sfDevXM125::getDistancePeak2Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak3Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -365,7 +393,8 @@ sfTkError_t sfDevXM125::getDistancePeak3Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak4Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -373,7 +402,8 @@ sfTkError_t sfDevXM125::getDistancePeak4Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak5Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -381,7 +411,8 @@ sfTkError_t sfDevXM125::getDistancePeak5Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak6Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -389,7 +420,8 @@ sfTkError_t sfDevXM125::getDistancePeak6Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak7Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -397,7 +429,8 @@ sfTkError_t sfDevXM125::getDistancePeak7Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak8Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -405,7 +438,8 @@ sfTkError_t sfDevXM125::getDistancePeak8Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak9Distance(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_DISTANCE, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_DISTANCE, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -413,97 +447,107 @@ sfTkError_t sfDevXM125::getDistancePeak9Distance(uint32_t &peak) sfTkError_t sfDevXM125::getDistancePeak0Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistancePeak1Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistancePeak2Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistancePeak3Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistancePeak4Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistancePeak5Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistancePeak6Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistancePeak7Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistancePeak8Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistancePeak9Strength(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_STRENGTH, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_STRENGTH, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); - peak = peak/1000; + peak = peak / 1000; return retVal; } sfTkError_t sfDevXM125::getDistanceStart(uint32_t &startVal) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t*)&startVal, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&startVal, 4, readBytes); startVal = sftk_byte_swap(startVal); return retVal; } @@ -511,13 +555,13 @@ sfTkError_t sfDevXM125::getDistanceStart(uint32_t &startVal) sfTkError_t sfDevXM125::setDistanceStart(uint32_t start) { start = sftk_byte_swap(start); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t*)&start, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&start, 4); } sfTkError_t sfDevXM125::getDistanceEnd(uint32_t &end) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t*)&end, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, 4, readBytes); end = sftk_byte_swap(end); return retVal; } @@ -525,13 +569,14 @@ sfTkError_t sfDevXM125::getDistanceEnd(uint32_t &end) sfTkError_t sfDevXM125::setDistanceEnd(uint32_t end) { end = sftk_byte_swap(end); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t*)&end, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, 4); } sfTkError_t sfDevXM125::getDistanceMaxStepLength(uint32_t &length) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t*)&length, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, 4, readBytes); length = sftk_byte_swap(length); return retVal; } @@ -539,24 +584,25 @@ sfTkError_t sfDevXM125::getDistanceMaxStepLength(uint32_t &length) sfTkError_t sfDevXM125::setDistanceMaxStepLength(uint32_t length) { length = sftk_byte_swap(length); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t*)&length, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, 4); } sfTkError_t sfDevXM125::getDistanceCloseRangeLeakageCancellation(bool &range) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t*)&range, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t *)&range, 4, readBytes); } sfTkError_t sfDevXM125::setDistanceCloseRangeLeakageCancellation(bool range) { - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t*)&range, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t *)&range, 4); } sfTkError_t sfDevXM125::getDistanceSignalQuality(uint32_t &signal) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t*)&signal, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, 4, readBytes); signal = sftk_byte_swap(signal); return retVal; } @@ -564,13 +610,14 @@ sfTkError_t sfDevXM125::getDistanceSignalQuality(uint32_t &signal) sfTkError_t sfDevXM125::setDistanceSignalQuality(uint32_t signal) { signal = sftk_byte_swap(signal); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t*)&signal, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, 4); } sfTkError_t sfDevXM125::getDistanceMaxProfile(uint32_t &profile) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t*)&profile, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, 4, readBytes); profile = sftk_byte_swap(profile); return retVal; } @@ -578,13 +625,14 @@ sfTkError_t sfDevXM125::getDistanceMaxProfile(uint32_t &profile) sfTkError_t sfDevXM125::setDistanceMaxProfile(uint32_t profile) { profile = sftk_byte_swap(profile); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t*)&profile, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, 4); } sfTkError_t sfDevXM125::getDistanceThresholdMethod(uint32_t &method) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t*)&method, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, 4, readBytes); method = sftk_byte_swap(method); return retVal; } @@ -592,13 +640,13 @@ sfTkError_t sfDevXM125::getDistanceThresholdMethod(uint32_t &method) sfTkError_t sfDevXM125::setDistanceThresholdMethod(uint32_t method) { method = sftk_byte_swap(method); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t*)&method, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, 4); } sfTkError_t sfDevXM125::getDistancePeakSorting(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t*)&peak, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, 4, readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -606,13 +654,14 @@ sfTkError_t sfDevXM125::getDistancePeakSorting(uint32_t &peak) sfTkError_t sfDevXM125::setDistancePeakSorting(uint32_t peak) { peak = sftk_byte_swap(peak); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t*)&peak, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, 4); } sfTkError_t sfDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t*)&thresh, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, 4, readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -620,13 +669,14 @@ sfTkError_t sfDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) sfTkError_t sfDevXM125::setDistanceNumFramesRecordedThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t*)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, 4); } sfTkError_t sfDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t*)&thresh, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, + (uint8_t *)&thresh, 4, readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -634,13 +684,14 @@ sfTkError_t sfDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) sfTkError_t sfDevXM125::setDistanceFixedAmpThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t*)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t *)&thresh, 4); } sfTkError_t sfDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t*)&thresh, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, 4, readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -648,13 +699,14 @@ sfTkError_t sfDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) sfTkError_t sfDevXM125::setDistanceThresholdSensitivity(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t*)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, 4); } sfTkError_t sfDevXM125::getDistanceReflectorShape(uint32_t &shape) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t*)&shape, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, 4, readBytes); shape = sftk_byte_swap(shape); return retVal; } @@ -662,13 +714,14 @@ sfTkError_t sfDevXM125::getDistanceReflectorShape(uint32_t &shape) sfTkError_t sfDevXM125::setDistanceReflectorShape(uint32_t shape) { shape = sftk_byte_swap(shape); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t*)&shape, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, 4); } sfTkError_t sfDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t*)&thresh, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, + (uint8_t *)&thresh, 4, readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -676,24 +729,24 @@ sfTkError_t sfDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) sfTkError_t sfDevXM125::setDistanceFixedStrengthThresholdValue(int32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t*)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t *)&thresh, 4); } sfTkError_t sfDevXM125::getDistanceMeasureOneWakeup(bool &measure) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t*)&measure, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&measure, 4, readBytes); } sfTkError_t sfDevXM125::setDistanceMeasureOneWakeup(bool measure) { - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t*)&measure, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&measure, 4); } sfTkError_t sfDevXM125::setDistanceCommand(uint32_t command) { command = sftk_byte_swap(command); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_COMMAND, (uint8_t*)&command, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_COMMAND, (uint8_t *)&command, 4); } sfTkError_t sfDevXM125::distanceApplyConfiguration() @@ -747,18 +800,18 @@ sfTkError_t sfDevXM125::distanceBusyWait() uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Poll Detector Status until Busy bit is cleared - while(((regVal & SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK) >> SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK_SHIFT) != 0) + // Poll Detector Status until Busy bit is cleared + while (((regVal & SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK) >> SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK_SHIFT) != 0) { - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); } // Return error code if non-zero - if(retVal != 0) + if (retVal != 0) { return retVal; } @@ -773,61 +826,61 @@ sfTkError_t sfDevXM125::presenceDetectorStart() uint32_t errorStatus = 0; // Reset sensor configuration to reapply configuration registers - if(setPresenceCommand(SFE_XM125_PRESENCE_RESET_MODULE) != 0) + if (setPresenceCommand(SFE_XM125_PRESENCE_RESET_MODULE) != 0) { return 1; } - sftk_delay_ms(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set - // Check detector status error and busy bits - if(getPresenceDetectorErrorStatus(errorStatus) != 0) + // Check detector status error and busy bits + if (getPresenceDetectorErrorStatus(errorStatus) != 0) { return 2; } - if(errorStatus != 0) + if (errorStatus != 0) { return 3; } - - // Set Presence Start register - if(setPresenceStart(300) != 0) + + // Set Presence Start register + if (setPresenceStart(300) != 0) { return 4; } - sftk_delay_ms(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set - // Set End register - if(setPresenceEnd(2500) != 0) + // Set End register + if (setPresenceEnd(2500) != 0) { return 5; } - sftk_delay_ms(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set - // Apply configuration - if(setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != 0) + // Apply configuration + if (setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != 0) { - // Check for errors - getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) - { - return 6; - } - - return 7; + // Check for errors + getPresenceDetectorErrorStatus(errorStatus); + if (errorStatus != 0) + { + return 6; + } + + return 7; } - sftk_delay_ms(100); // give time for command to set + sftk_delay_ms(100); // give time for command to set // Poll detector status until busy bit is cleared - if(presenceBusyWait() != 0) + if (presenceBusyWait() != 0) { - return 8; + return 8; } - // Check detector error status + // Check detector error status getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - return 9; + return 9; } // If no errors, return 0 @@ -836,33 +889,33 @@ sfTkError_t sfDevXM125::presenceDetectorStart() sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) { - // Check error bits + // Check error bits uint32_t errorStatus = 0; uint32_t presenceDetected = 0; - uint32_t presenceDetectedSticky = 0; + uint32_t presenceDetectedSticky = 0; getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { return 1; } - - // Start detector - if(setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != 0) + + // Start detector + if (setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != 0) { return 2; } sftk_delay_ms(100); - + // Poll detector status until busy bit is cleared - CHECK ON THIS! - if(presenceBusyWait() != 0) + if (presenceBusyWait() != 0) { return 3; } - - // Verify that no error bits are set in the detector status register + + // Verify that no error bits are set in the detector status register getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { return 4; } @@ -870,8 +923,8 @@ sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) // Read detector result register and determine detection status getPresenceDetectorPresenceDetected(presenceDetected); getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky); - - if((presenceDetected == 1) | (presenceDetectedSticky == 1)) + + if ((presenceDetected == 1) | (presenceDetectedSticky == 1)) { getPresenceDistance(presenceVal); } @@ -885,9 +938,9 @@ sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &mi // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_VERSION, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_VERSION, (uint8_t *)®Val, 4, readBytes); - // Mask unused bits from register + // Mask unused bits from register major = (regVal & SFE_XM125_PRESENCE_MAJOR_VERSION_MASK) >> SFE_XM125_PRESENCE_MAJOR_VERSION_MASK_SHIFT; minor = (regVal & SFE_XM125_PRESENCE_MINOR_VERSION_MASK) >> SFE_XM125_PRESENCE_MINOR_VERSION_MASK_SHIFT; patch = regVal & SFE_XM125_PRESENCE_PATCH_VERSION_MASK; @@ -898,19 +951,19 @@ sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &mi sfTkError_t sfDevXM125::getPresenceDetectorError(uint32_t &error) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t*)&error, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t *)&error, 4, readBytes); } sfTkError_t sfDevXM125::getPresenceMeasureCounter(uint32_t &counter) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t*)&counter, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t *)&counter, 4, readBytes); } sfTkError_t sfDevXM125::getPresenceDetectorStatus(uint32_t &status) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)&status, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)&status, 4, readBytes); } sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) @@ -918,76 +971,68 @@ sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) sfTkError_t retVal = 0; uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - if(retVal != 0) - { - return -1; - } + // clear out status + status = 0; - if(((regVal & SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK) >> SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK_SHIFT) != 0) - { + if (retVal != ksfTkErrOk) + return retVal; + // Any errors - if not, skip the big bit check pachinko if-else below + if ((regVal & SFE_XM125_PRESENCE_ALL_ERROR_MASK) == 0) + return ksfTkErrOk; + + // if (((regVal & SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK) >> SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK_SHIFT) != + // 0) + if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK)) status = 1; - return 0; - } - else if(((regVal & SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK) >> SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK_SHIFT) != 0) - { + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK)) status = 2; - return 0; - } - else if(((regVal & SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK) >> SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK_SHIFT) != 0) - { + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK)) status = 3; - return 0; - } - else if(((regVal & SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK) >> SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK_SHIFT) != 0) - { + + else if(SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK)) status = 4; - return 0; - } - else if(((regVal & SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK) >> SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK_SHIFT) != 0) - { + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK)) status = 5; - return 0; - } - else if(((regVal & SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK) >> SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK_SHIFT) != 0) - { + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK)) status = 6; - return 0; - } - else if(((regVal & SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK) >> SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK_SHIFT) != 0) - { + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK)) status = 7; - return 0; - } - else if(((regVal & SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK) >> SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK_SHIFT) != 0) - { + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK)) status = 8; - return 0; - } - else if(((regVal & SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK) >> SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK_SHIFT) != 0) - { + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK)) status = 9; - return 0; - } + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK)) + status = 10; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_BUSY_MASK)) + status = 11; // return 0 with no errors - return ksfTkErrOk; + return ksfTkErrOk; } - sfTkError_t sfDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) { uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t*)®Val, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Mask unused bits from register + // Mask unused bits from register detected = (regVal & SFE_XM125_PRESENCE_DETECTED_MASK); return retVal; @@ -999,11 +1044,11 @@ sfTkError_t sfDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &stic // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t*)®Val, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Mask unused bits from register + // Mask unused bits from register sticky = (regVal & SFE_XM125_PRESENCE_DETECTED_STICKY_MASK) >> 1; return retVal; @@ -1015,11 +1060,11 @@ sfTkError_t sfDevXM125::getPresenceDetectorRegError(uint32_t &error) // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t*)®Val, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Mask unused bits from register + // Mask unused bits from register error = (regVal & SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK) >> SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK_SHIFT; return retVal; @@ -1031,9 +1076,9 @@ sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t*)®Val, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)®Val, 4, readBytes); - // Mask unused bits from register + // Mask unused bits from register temp = (regVal & SFE_XM125_PRESENCE_TEMPERATURE_MASK) >> SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT; return retVal; @@ -1042,7 +1087,7 @@ sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t*)&distance, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)&distance, 4, readBytes); distance = sftk_byte_swap(distance); return retVal; } @@ -1050,7 +1095,7 @@ sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t*)&intra, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&intra, 4, readBytes); intra = sftk_byte_swap(intra); return retVal; } @@ -1058,7 +1103,7 @@ sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTER_PRESENCE, (uint8_t*)&inter, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTER_PRESENCE, (uint8_t *)&inter, 4, readBytes); inter = sftk_byte_swap(inter); return retVal; } @@ -1066,55 +1111,57 @@ sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) sfTkError_t sfDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t*)&sweeps, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&sweeps, 4, readBytes); sweeps = sftk_byte_swap(sweeps); return retVal; } sfTkError_t sfDevXM125::setPresenceSweepsPerFrame(uint32_t sweeps) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t*)&sweeps, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t *)&sweeps, 4); } sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t*)&time, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, 4, readBytes); time = sftk_byte_swap(time); return retVal; } sfTkError_t sfDevXM125::setPresenceInterFramePresenceTimeout(uint32_t time) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t*)&time, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, 4); } sfTkError_t sfDevXM125::getPresenceInterPhaseBoostEnabled(bool &en) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t*)&en, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&en, 4, readBytes); } sfTkError_t sfDevXM125::setPresenceInterPhaseBoostEnabled(bool en) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t*)&en, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&en, 4); } sfTkError_t sfDevXM125::getPresenceIntraDetectionEnabled(bool &en) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t*)&en, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&en, 4, readBytes); } sfTkError_t sfDevXM125::setPresenceInterDetectionEnabled(bool en) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t*)&en, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&en, 4); } sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t*)&rate, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, 4, readBytes); rate = sftk_byte_swap(rate); return retVal; } @@ -1122,13 +1169,14 @@ sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) sfTkError_t sfDevXM125::setPresenceFrameRate(uint32_t rate) { rate = sftk_byte_swap(rate); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t*)&rate, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, 4); } sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4, readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -1136,13 +1184,14 @@ sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) sfTkError_t sfDevXM125::setPresenceIntraDetectionThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4); } sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4, readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -1150,13 +1199,14 @@ sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) sfTkError_t sfDevXM125::setPresenceInterDetectionThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t*)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4); } sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t*)&time, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, 4, readBytes); time = sftk_byte_swap(time); return retVal; } @@ -1164,13 +1214,14 @@ sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) sfTkError_t sfDevXM125::setPresenceInterFrameDeviationTime(uint32_t time) { time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t*)&time, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, 4); } sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t*)&cut, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, 4, readBytes); cut = sftk_byte_swap(cut); return retVal; } @@ -1178,13 +1229,14 @@ sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) sfTkError_t sfDevXM125::setPresenceInterFrameFastCutoff(uint32_t cut) { cut = sftk_byte_swap(cut); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t*)&cut, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, 4); } sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t*)&cut, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, 4, readBytes); cut = sftk_byte_swap(cut); return retVal; } @@ -1192,13 +1244,14 @@ sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) sfTkError_t sfDevXM125::setPresenceInterFrameSlowCutoff(uint32_t cut) { cut = sftk_byte_swap(cut); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t*)&cut, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, 4); } sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t*)&time, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, 4, readBytes); time = sftk_byte_swap(time); return retVal; } @@ -1206,13 +1259,14 @@ sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) sfTkError_t sfDevXM125::setPresenceIntraFrameTimeConst(uint32_t time) { time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t*)&time, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, 4); } sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t*)&time, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, 4, readBytes); time = sftk_byte_swap(time); return retVal; } @@ -1220,13 +1274,14 @@ sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) sfTkError_t sfDevXM125::setPresenceIntraOutputTimeConst(uint32_t time) { time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t*)&time, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, 4); } sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t*)&time, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, 4, readBytes); time = sftk_byte_swap(time); return retVal; } @@ -1234,35 +1289,36 @@ sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) sfTkError_t sfDevXM125::setPresenceInterOutputTimeConst(uint32_t time) { time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t*)&time, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, 4); } sfTkError_t sfDevXM125::getPresenceAutoProfileEn(bool &en) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t*)&en, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&en, 4, readBytes); } sfTkError_t sfDevXM125::setPresenceAutoProfileEn(bool en) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t*)&en, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&en, 4); } sfTkError_t sfDevXM125::getPresenceAutoStepLengthEn(bool &en) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t*)&en, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&en, 4, readBytes); } sfTkError_t sfDevXM125::setPresenceAutoStepLengthEn(bool en) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t*)&en, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&en, 4); } sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t*)&prof, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, 4, readBytes); prof = sftk_byte_swap(prof); return retVal; } @@ -1270,13 +1326,14 @@ sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) sfTkError_t sfDevXM125::setPresenceManualProfile(uint32_t prof) { prof = sftk_byte_swap(prof); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t*)&prof, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, 4); } sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t*)&length, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, 4, readBytes); length = sftk_byte_swap(length); return retVal; } @@ -1284,13 +1341,13 @@ sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) sfTkError_t sfDevXM125::setPresenceManualStepLength(uint32_t length) { length = sftk_byte_swap(length); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t*)&length, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, 4); } sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t*)&start, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, 4, readBytes); start = sftk_byte_swap(start); return retVal; } @@ -1298,13 +1355,13 @@ sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) sfTkError_t sfDevXM125::setPresenceStart(uint32_t start) { start = sftk_byte_swap(start); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t*)&start, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, 4); } sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t*)&end, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, 4, readBytes); end = sftk_byte_swap(end); return retVal; } @@ -1312,35 +1369,36 @@ sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) sfTkError_t sfDevXM125::setPresenceEnd(uint32_t end) { end = sftk_byte_swap(end); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t*)&end, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, 4); } sfTkError_t sfDevXM125::getPresenceResetFilters(bool &reset) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t*)&reset, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t *)&reset, 4, readBytes); } sfTkError_t sfDevXM125::setPresenceResetFilters(bool reset) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t*)&reset, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t *)&reset, 4); } sfTkError_t sfDevXM125::getPresenceHWAAS(uint32_t &avg) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t*)&avg, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, 4, readBytes); } sfTkError_t sfDevXM125::setPresenceHWAAS(uint32_t avg) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t*)&avg, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, 4); } sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t*)&detected, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, 4, readBytes); detected = sftk_byte_swap(detected); return retVal; } @@ -1348,13 +1406,13 @@ sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) sfTkError_t sfDevXM125::setPresenceDetectionOnGPIO(uint32_t detected) { detected = sftk_byte_swap(detected); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t*)&detected, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, 4); } sfTkError_t sfDevXM125::setPresenceCommand(uint32_t cmd) { cmd = sftk_byte_swap(cmd); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t*)&cmd, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t *)&cmd, 4); } sfTkError_t sfDevXM125::presenceApplyConfiguration() @@ -1394,10 +1452,10 @@ sfTkError_t sfDevXM125::getPresenceBusy(uint32_t &busy) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); busy = sftk_byte_swap(busy); - // Mask unused bits from register + // Mask unused bits from register busy = (regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> SFE_XM125_PRESENCE_BUSY_MASK_SHIFT; return retVal; @@ -1409,17 +1467,17 @@ sfTkError_t sfDevXM125::presenceBusyWait() uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); - // Poll Detector Status until Busy bit is cleared - while(((regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> 30) != 0) + // Poll Detector Status until Busy bit is cleared + while (((regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> 30) != 0) { - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t*)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); regVal = sftk_byte_swap(regVal); } - if(retVal != 0) + if (retVal != 0) { return retVal; } diff --git a/src/sfTk/sfXM125Regs.h b/src/sfTk/sfXM125Regs.h index 4cea61b..051961f 100644 --- a/src/sfTk/sfXM125Regs.h +++ b/src/sfTk/sfXM125Regs.h @@ -1,10 +1,10 @@ // sfe_xm125_regs.h // -// This is a library written for SparkFun Pulsed Coherent Radar Sensor - XM125 +// This is a library written for SparkFun Pulsed Coherent Radar Sensor - XM125 // // SparkFun sells these boards at its website: www.sparkfun.com // -// Do you like this library? Help support SparkFun. Buy a board! +// Do you like this library? Help support SparkFun. Buy a board! // // SparkFun Indoor Air Quality Sensor - XM125 (Qwiic) https://www.sparkfun.com/products/ // @@ -75,6 +75,14 @@ const uint32_t SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK = 0x10000000; const uint32_t SFE_XM125_DISTANCE_BUSY_MASK = 0x80000000; const uint32_t SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK = 0x00000200; +const uint32_t SFE_XM125_DISTANCE_ALL_ERROR_MASK = + (SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK | SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK | + SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK | SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK | + SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK | SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK | + SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK | SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK | + SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK | SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK | + SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK | SFE_XM125_DISTANCE_BUSY_MASK); + const uint32_t SFE_XM125_DISTANCE_MAJOR_VERSION_MASK_SHIFT = 16; const uint32_t SFE_XM125_DISTANCE_MINOR_VERSION_MASK_SHIFT = 8; const uint32_t SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK_SHIFT = 15; @@ -91,14 +99,14 @@ const uint32_t SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK_SHIFT = 27; const uint32_t SFE_XM125_DISTANCE_BUSY_MASK_SHIFT = 30; const uint32_t SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK_SHIFT = 8; const uint32_t SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK_SHIFT = 9; -const uint32_t SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK_SHIFT = 10; +const uint32_t SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK_SHIFT = 10; const uint32_t SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT = 16; const uint32_t SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK_SHIFT = 30; const uint32_t SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK = 0b10010000111111110000000011111111; const uint16_t SFE_XM125_DISTANCE_VERSION = 0x00; -typedef struct +typedef struct { uint32_t distance_major : 16; uint32_t distance_minor : 8; @@ -106,7 +114,7 @@ typedef struct } sfe_xm125_distance_version_t; const uint16_t SFE_XM125_DISTANCE_PROTOCOL_STATUS = 0x01; -typedef struct +typedef struct { uint32_t distance_protocol_state_error : 1; uint32_t distance_packet_length_error : 1; @@ -119,7 +127,7 @@ typedef struct const uint16_t SFE_XM125_DISTANCE_MEASURE_COUNTER = 0x02; const uint16_t SFE_XM125_DISTANCE_DETECTOR_STATUS = 0x03; -typedef struct +typedef struct { uint32_t distance_rss_register_ok : 1; uint32_t distance_config_create_ok : 1; @@ -149,7 +157,7 @@ typedef struct } sfe_xm125_distance_detector_status_t; const uint16_t SFE_XM125_DISTANCE_RESULT = 0x10; -typedef struct +typedef struct { uint32_t distance_num_distances : 4; uint32_t rsvd1 : 4; // skips "reserved" bits @@ -203,7 +211,7 @@ const uint16_t sfe_xm125_distance_signal_quality_default = 15000; // Default: PROFILE5 (enum) const uint16_t SFE_XM125_DISTANCE_MAX_PROFILE = 0x45; -typedef enum +typedef enum { XM125_DISTANCE_PROFILE1 = 1, XM125_DISTANCE_PROFILE2 = 2, @@ -214,7 +222,7 @@ typedef enum // Default Value: CFAR (enum) const uint16_t SFE_XM125_DISTANCE_THRESHOLD_METHOD = 0x46; -typedef enum +typedef enum { XM125_DISTANCE_FIXED_AMPLITUDE = 1, XM125_DISTANCE_RECORDED = 2, @@ -242,7 +250,7 @@ const uint32_t sfe_xm125_distance_fixed_amp_thresh_val_default = 100000; const uint16_t SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY = 0x4a; const uint16_t sfe_xm125_distance_threshold_sensitivity_default = 500; -// Default Value: GENERIC +// Default Value: GENERIC const uint16_t SFE_XM125_DISTANCE_REFLECTOR_SHAPE = 0x4b; typedef enum { @@ -284,11 +292,10 @@ const uint32_t SFE_XM125_DISTANCE_RESET_MODULE = 1381192737; /* ****************************** Presence Values ****************************** */ - const uint32_t SFE_XM125_PRESENCE_DETECTOR_STATUS_MASK = 0b10010000111111110000000011111111; const uint32_t SFE_XM125_PRESENCE_DETECTED_MASK = 0x00000001; -const uint32_t SFE_XM125_PRESENCE_DETECTED_STICKY_MASK = 0x00000002; +const uint32_t SFE_XM125_PRESENCE_DETECTED_STICKY_MASK = 0x00000002; const uint32_t SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK = 0x00008000; const uint32_t SFE_XM125_PRESENCE_TEMPERATURE_MASK = 0xffff0000; const uint32_t SFE_XM125_PRESENCE_MAJOR_VERSION_MASK = 0xffff0000; @@ -306,7 +313,7 @@ const uint32_t SFE_XM125_PRESENCE_CONFIG_APPLY_OK_MASK = 0x00000080; const uint32_t SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK = 0x00010000; const uint32_t SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK = 0x00020000; const uint32_t SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK = 0x00040000; -const uint32_t SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK = 0x00080000; +const uint32_t SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK = 0x00080000; const uint32_t SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK = 0x00100000; const uint32_t SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK = 0x00200000; const uint32_t SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK = 0x00400000; @@ -314,6 +321,14 @@ const uint32_t SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK = 0x00800000; const uint32_t SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK = 0x10000000; const uint32_t SFE_XM125_PRESENCE_BUSY_MASK = 0x80000000; +const uint32_t SFE_XM125_PRESENCE_ALL_ERROR_MASK = + (SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK | SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK | + SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK | SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK | + SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK | SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK | + SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK | SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK | + SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK | SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK | + SFE_XM125_PRESENCE_BUSY_MASK); + const uint32_t SFE_XM125_PRESENCE_MAJOR_VERSION_MASK_SHIFT = 16; const uint32_t SFE_XM125_PRESENCE_MINOR_VERSION_MASK_SHIFT = 8; const uint32_t SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK_SHIFT = 15; @@ -330,7 +345,7 @@ const uint32_t SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT = 16; const uint32_t SFE_XM125_PRESENCE_BUSY_MASK_SHIFT = 30; const uint16_t SFE_XM125_PRESENCE_VERSION = 0x00; -typedef struct +typedef struct { uint32_t presence_major : 16; uint32_t presence_minor : 8; @@ -338,7 +353,7 @@ typedef struct } sfe_xm125_presence_version_t; const uint16_t SFE_XM125_PRESENCE_PROTOCOL_STATUS = 0x01; -typedef struct +typedef struct { uint32_t presence_protocol_state_error : 1; uint32_t presence_packet_length_error : 1; @@ -351,7 +366,7 @@ typedef struct const uint16_t SFE_XM125_PRESENCE_MEASURE_COUNTER = 0x02; const uint16_t SFE_XM125_PRESENCE_DETECTOR_STATUS = 0x03; -typedef struct +typedef struct { uint32_t presence_rss_register_ok : 1; uint32_t presence_config_create_ok : 1; @@ -404,7 +419,7 @@ const uint16_t SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED = 0x43; const bool sfe_xm125_presence_intra_detection_enabled_default = true; const uint16_t SFE_XM125_PRESENCE_INTER_DETECTION_ENABLED = 0x44; -const bool sfe_xm125_presence_inter_detection_enabled_default = true; +const bool sfe_xm125_presence_inter_detection_enabled_default = true; const uint16_t SFE_XM125_PRESENCE_FRAME_RATE = 0x45; const uint16_t sfe_xm125_presence_frame_rate_default = 12000; @@ -450,7 +465,7 @@ typedef enum } sfe_xm125_presence_manual_profile_t; const uint16_t SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH = 0x51; -const uint16_t sfe_xm125_presence_manual_step_length_default = 72; +const uint16_t sfe_xm125_presence_manual_step_length_default = 72; const uint16_t SFE_XM125_PRESENCE_START = 0x52; const uint16_t sfe_xm125_presence_start_default = 250; @@ -465,7 +480,7 @@ const uint16_t SFE_XM125_PRESENCE_HWAAS = 0x55; const uint16_t sfe_xm125_presence_hwaas_default = 32; const uint16_t SFE_XM125_PRESENCE_DETECTION_ON_GPIO = 0x80; -const bool sfe_xm125_presence_detection_on_gpio_default = false; +const bool sfe_xm125_presence_detection_on_gpio_default = false; const uint16_t SFE_XM125_PRESENCE_COMMAND = 0x100; typedef enum From 25903898e7ce29ade7c9ee2625091741cc318345 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 06:13:18 -0700 Subject: [PATCH 04/32] code cleanup, file header comments; logic clean-up and error checking added to some routines --- src/sfTk/sfDevXM125.cpp | 263 ++++++++++++++++++++++++++++------------ src/sfTk/sfDevXM125.h | 17 ++- src/sfTk/sfXM125Regs.h | 52 ++------ 3 files changed, 213 insertions(+), 119 deletions(-) diff --git a/src/sfTk/sfDevXM125.cpp b/src/sfTk/sfDevXM125.cpp index 49dc599..f69903a 100644 --- a/src/sfTk/sfDevXM125.cpp +++ b/src/sfTk/sfDevXM125.cpp @@ -1,10 +1,23 @@ - +/** + * @file sfDevXM125.cpp + * @brief Implementation of the SparkFun Qwiic XM125 Library. + * + * This file contains the implementation of the functions for interfacing with + * the SparkFun Qwiic XM125 distance and presence detector using I2C communication. + * + * @author SparkFun Electronics + * @date 2024-2025 + * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. + * + * SPDX-License-Identifier: MIT + */ #include "sfDevXM125.h" // Handy helper - check if a bit(s) is set... #define SF_CHECK_BITS_SET(__value__, __bitmask__) (((__value__) & (__bitmask__)) == __bitmask__) +//-------------------------------------------------------------------------------- bool sfDevXM125::begin(sfTkII2C *theBus) { if (theBus == nullptr) @@ -113,6 +126,7 @@ int32_t sfDevXM125::distanceBegin() return 0; } +//-------------------------------------------------------------------------------- int32_t sfDevXM125::distanceDetectorReadingSetup() { uint32_t errorStatus = 0; @@ -167,6 +181,7 @@ int32_t sfDevXM125::distanceDetectorReadingSetup() return 0; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) { sfTkError_t retVal; @@ -185,6 +200,7 @@ sfTkError_t sfDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &mi return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceDetectorError(uint32_t &error) { // Read from 16-Bit Register @@ -195,6 +211,7 @@ sfTkError_t sfDevXM125::getDistanceDetectorError(uint32_t &error) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceDetectorErrorStatus(uint32_t &status) { sfTkError_t retVal; @@ -253,6 +270,7 @@ sfTkError_t sfDevXM125::getDistanceDetectorErrorStatus(uint32_t &status) return ksfTkErrOk; // return 0 with no errors } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceMeasureCounter(uint32_t &counter) { // Read from 16-Bit Register @@ -263,6 +281,7 @@ sfTkError_t sfDevXM125::getDistanceMeasureCounter(uint32_t &counter) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceDetectorStatus(uint32_t &status) { size_t readBytes = 0; @@ -272,6 +291,7 @@ sfTkError_t sfDevXM125::getDistanceDetectorStatus(uint32_t &status) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceNumberDistances(uint32_t &distance) { sfTkError_t retVal; @@ -288,6 +308,7 @@ sfTkError_t sfDevXM125::getDistanceNumberDistances(uint32_t &distance) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceNearStartEdge(uint32_t &edge) { sfTkError_t retVal; @@ -304,6 +325,7 @@ sfTkError_t sfDevXM125::getDistanceNearStartEdge(uint32_t &edge) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceCalibrationNeeded(uint32_t &calibrate) { sfTkError_t retVal; @@ -321,6 +343,7 @@ sfTkError_t sfDevXM125::getDistanceCalibrationNeeded(uint32_t &calibrate) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceMeasureDistanceError(uint32_t &error) { sfTkError_t retVal; @@ -338,6 +361,7 @@ sfTkError_t sfDevXM125::getDistanceMeasureDistanceError(uint32_t &error) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceTemperature(uint32_t &temperature) { sfTkError_t retVal; @@ -354,6 +378,7 @@ sfTkError_t sfDevXM125::getDistanceTemperature(uint32_t &temperature) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak0Distance(uint32_t &peak) { size_t readBytes = 0; @@ -363,6 +388,7 @@ sfTkError_t sfDevXM125::getDistancePeak0Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak1Distance(uint32_t &peak) { size_t readBytes = 0; @@ -372,6 +398,7 @@ sfTkError_t sfDevXM125::getDistancePeak1Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak2Distance(uint32_t &peak) { size_t readBytes = 0; @@ -381,6 +408,7 @@ sfTkError_t sfDevXM125::getDistancePeak2Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak3Distance(uint32_t &peak) { size_t readBytes = 0; @@ -390,6 +418,7 @@ sfTkError_t sfDevXM125::getDistancePeak3Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak4Distance(uint32_t &peak) { size_t readBytes = 0; @@ -399,6 +428,7 @@ sfTkError_t sfDevXM125::getDistancePeak4Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak5Distance(uint32_t &peak) { size_t readBytes = 0; @@ -408,6 +438,7 @@ sfTkError_t sfDevXM125::getDistancePeak5Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak6Distance(uint32_t &peak) { size_t readBytes = 0; @@ -417,6 +448,7 @@ sfTkError_t sfDevXM125::getDistancePeak6Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak7Distance(uint32_t &peak) { size_t readBytes = 0; @@ -426,6 +458,7 @@ sfTkError_t sfDevXM125::getDistancePeak7Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak8Distance(uint32_t &peak) { size_t readBytes = 0; @@ -435,6 +468,7 @@ sfTkError_t sfDevXM125::getDistancePeak8Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak9Distance(uint32_t &peak) { size_t readBytes = 0; @@ -444,6 +478,7 @@ sfTkError_t sfDevXM125::getDistancePeak9Distance(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak0Strength(uint32_t &peak) { size_t readBytes = 0; @@ -454,6 +489,7 @@ sfTkError_t sfDevXM125::getDistancePeak0Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak1Strength(uint32_t &peak) { size_t readBytes = 0; @@ -464,6 +500,7 @@ sfTkError_t sfDevXM125::getDistancePeak1Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak2Strength(uint32_t &peak) { size_t readBytes = 0; @@ -474,6 +511,7 @@ sfTkError_t sfDevXM125::getDistancePeak2Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak3Strength(uint32_t &peak) { size_t readBytes = 0; @@ -484,6 +522,7 @@ sfTkError_t sfDevXM125::getDistancePeak3Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak4Strength(uint32_t &peak) { size_t readBytes = 0; @@ -494,6 +533,7 @@ sfTkError_t sfDevXM125::getDistancePeak4Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak5Strength(uint32_t &peak) { size_t readBytes = 0; @@ -504,6 +544,7 @@ sfTkError_t sfDevXM125::getDistancePeak5Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak6Strength(uint32_t &peak) { size_t readBytes = 0; @@ -514,6 +555,7 @@ sfTkError_t sfDevXM125::getDistancePeak6Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak7Strength(uint32_t &peak) { size_t readBytes = 0; @@ -524,6 +566,7 @@ sfTkError_t sfDevXM125::getDistancePeak7Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak8Strength(uint32_t &peak) { size_t readBytes = 0; @@ -534,6 +577,7 @@ sfTkError_t sfDevXM125::getDistancePeak8Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeak9Strength(uint32_t &peak) { size_t readBytes = 0; @@ -544,6 +588,7 @@ sfTkError_t sfDevXM125::getDistancePeak9Strength(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceStart(uint32_t &startVal) { size_t readBytes = 0; @@ -552,12 +597,14 @@ sfTkError_t sfDevXM125::getDistanceStart(uint32_t &startVal) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceStart(uint32_t start) { start = sftk_byte_swap(start); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&start, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceEnd(uint32_t &end) { size_t readBytes = 0; @@ -566,12 +613,14 @@ sfTkError_t sfDevXM125::getDistanceEnd(uint32_t &end) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceEnd(uint32_t end) { end = sftk_byte_swap(end); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceMaxStepLength(uint32_t &length) { size_t readBytes = 0; @@ -581,23 +630,27 @@ sfTkError_t sfDevXM125::getDistanceMaxStepLength(uint32_t &length) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceMaxStepLength(uint32_t length) { length = sftk_byte_swap(length); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceCloseRangeLeakageCancellation(bool &range) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t *)&range, 4, readBytes); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceCloseRangeLeakageCancellation(bool range) { return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t *)&range, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceSignalQuality(uint32_t &signal) { size_t readBytes = 0; @@ -607,12 +660,14 @@ sfTkError_t sfDevXM125::getDistanceSignalQuality(uint32_t &signal) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceSignalQuality(uint32_t signal) { signal = sftk_byte_swap(signal); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceMaxProfile(uint32_t &profile) { size_t readBytes = 0; @@ -622,12 +677,14 @@ sfTkError_t sfDevXM125::getDistanceMaxProfile(uint32_t &profile) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceMaxProfile(uint32_t profile) { profile = sftk_byte_swap(profile); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceThresholdMethod(uint32_t &method) { size_t readBytes = 0; @@ -637,12 +694,14 @@ sfTkError_t sfDevXM125::getDistanceThresholdMethod(uint32_t &method) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceThresholdMethod(uint32_t method) { method = sftk_byte_swap(method); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeakSorting(uint32_t &peak) { size_t readBytes = 0; @@ -651,12 +710,14 @@ sfTkError_t sfDevXM125::getDistancePeakSorting(uint32_t &peak) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistancePeakSorting(uint32_t peak) { peak = sftk_byte_swap(peak); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) { size_t readBytes = 0; @@ -666,12 +727,14 @@ sfTkError_t sfDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceNumFramesRecordedThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) { size_t readBytes = 0; @@ -681,12 +744,14 @@ sfTkError_t sfDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceFixedAmpThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t *)&thresh, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) { size_t readBytes = 0; @@ -696,12 +761,14 @@ sfTkError_t sfDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceThresholdSensitivity(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceReflectorShape(uint32_t &shape) { size_t readBytes = 0; @@ -711,12 +778,14 @@ sfTkError_t sfDevXM125::getDistanceReflectorShape(uint32_t &shape) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceReflectorShape(uint32_t shape) { shape = sftk_byte_swap(shape); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) { size_t readBytes = 0; @@ -726,74 +795,88 @@ sfTkError_t sfDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceFixedStrengthThresholdValue(int32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t *)&thresh, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceMeasureOneWakeup(bool &measure) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&measure, 4, readBytes); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceMeasureOneWakeup(bool measure) { return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&measure, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceCommand(uint32_t command) { command = sftk_byte_swap(command); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_COMMAND, (uint8_t *)&command, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceApplyConfiguration() { return setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceStart() { return setDistanceCommand(SFE_XM125_DISTANCE_START_DETECTOR); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceStop() { return setDistanceCommand(SFE_XM125_DISTANCE_STOP_DETECTOR); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceCalibrate() { return setDistanceCommand(SFE_XM125_DISTANCE_CALIBRATE); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceRecalibrate() { return setDistanceCommand(SFE_XM125_DISTANCE_RECALIBRATE); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceEnableUartLogs() { return setDistanceCommand(SFE_XM125_DISTANCE_ENABLE_UART_LOGS); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceDisableUartLogs() { return setDistanceCommand(SFE_XM125_DISTANCE_DISABLE_UART_LOGS); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceLogConfiguration() { return setDistanceCommand(SFE_XM125_DISTANCE_LOG_CONFIGURATION); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceReset() { return setDistanceCommand(SFE_XM125_DISTANCE_RESET_MODULE); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::distanceBusyWait() { sfTkError_t retVal = 0; @@ -810,12 +893,8 @@ sfTkError_t sfDevXM125::distanceBusyWait() regVal = sftk_byte_swap(regVal); } - // Return error code if non-zero - if (retVal != 0) - { - return retVal; - } - return ksfTkErrOk; // 0 on success + return retVal; + } // --------------------- I2C Presence Detector Functions --------------------- @@ -826,67 +905,54 @@ sfTkError_t sfDevXM125::presenceDetectorStart() uint32_t errorStatus = 0; // Reset sensor configuration to reapply configuration registers - if (setPresenceCommand(SFE_XM125_PRESENCE_RESET_MODULE) != 0) - { + if (setPresenceCommand(SFE_XM125_PRESENCE_RESET_MODULE) != ksfTkErrOk) return 1; - } + sftk_delay_ms(100); // give time for command to set // Check detector status error and busy bits - if (getPresenceDetectorErrorStatus(errorStatus) != 0) - { + if (getPresenceDetectorErrorStatus(errorStatus) != ksfTkErrOk) return 2; - } + if (errorStatus != 0) - { return 3; - } // Set Presence Start register - if (setPresenceStart(300) != 0) - { + if (setPresenceStart(300) != ksfTkErrOk) return 4; - } + sftk_delay_ms(100); // give time for command to set // Set End register - if (setPresenceEnd(2500) != 0) - { + if (setPresenceEnd(2500) != ksfTkErrOk) return 5; - } + sftk_delay_ms(100); // give time for command to set // Apply configuration - if (setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != 0) + if (setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != ksfTkErrOk) { // Check for errors getPresenceDetectorErrorStatus(errorStatus); - if (errorStatus != 0) - { - return 6; - } - - return 7; + return errorStatus != 0 ? 6 : 7; } + sftk_delay_ms(100); // give time for command to set // Poll detector status until busy bit is cleared - if (presenceBusyWait() != 0) - { + if (presenceBusyWait() != ksfTkErrOk) return 8; - } // Check detector error status - getPresenceDetectorErrorStatus(errorStatus); - if (errorStatus != 0) - { + sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); + if (retVal != ksfTkErrOk || errorStatus != 0) return 9; - } // If no errors, return 0 return ksfTkErrOk; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) { // Check error bits @@ -894,43 +960,39 @@ sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) uint32_t presenceDetected = 0; uint32_t presenceDetectedSticky = 0; - getPresenceDetectorErrorStatus(errorStatus); - if (errorStatus != 0) - { + sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); + if (retVal != ksfTkErrOk || errorStatus != 0) return 1; - } // Start detector - if (setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != 0) - { + if (setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != ksfTkErrOk) return 2; - } + sftk_delay_ms(100); // Poll detector status until busy bit is cleared - CHECK ON THIS! - if (presenceBusyWait() != 0) - { + if (presenceBusyWait() != ksfTkErrOk) return 3; - } // Verify that no error bits are set in the detector status register - getPresenceDetectorErrorStatus(errorStatus); - if (errorStatus != 0) - { + retVal = getPresenceDetectorErrorStatus(errorStatus); + if (retVal != ksfTkErrOk || errorStatus != 0) return 4; - } // Read detector result register and determine detection status - getPresenceDetectorPresenceDetected(presenceDetected); - getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky); + if (getPresenceDetectorPresenceDetected(presenceDetected) != ksfTkErrOk) + return 5; + + if ( getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky) != ksfTkErrOk) + return 6; + + if (presenceDetected == 1 || presenceDetectedSticky == 1) + return getPresenceDistance(presenceVal); - if ((presenceDetected == 1) | (presenceDetectedSticky == 1)) - { - getPresenceDistance(presenceVal); - } return ksfTkErrOk; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) { sfTkError_t retVal; @@ -947,25 +1009,25 @@ sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &mi return retVal; } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectorError(uint32_t &error) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t *)&error, 4, readBytes); } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceMeasureCounter(uint32_t &counter) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t *)&counter, 4, readBytes); } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectorStatus(uint32_t &status) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)&status, 4, readBytes); } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) { sfTkError_t retVal = 0; @@ -983,8 +1045,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) if ((regVal & SFE_XM125_PRESENCE_ALL_ERROR_MASK) == 0) return ksfTkErrOk; - // if (((regVal & SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK) >> SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK_SHIFT) != - // 0) + // Check for errors if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK)) status = 1; @@ -994,7 +1055,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK)) status = 3; - else if(SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK)) + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK)) status = 4; else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK)) @@ -1022,6 +1083,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) return ksfTkErrOk; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) { uint32_t regVal = 0; @@ -1037,7 +1099,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) return retVal; } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &sticky) { uint32_t regVal = 0; @@ -1053,7 +1115,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &stic return retVal; } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectorRegError(uint32_t &error) { uint32_t regVal = 0; @@ -1069,7 +1131,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorRegError(uint32_t &error) return retVal; } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) { uint32_t regVal = 0; @@ -1083,7 +1145,7 @@ sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) return retVal; } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) { size_t readBytes = 0; @@ -1091,7 +1153,7 @@ sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) distance = sftk_byte_swap(distance); return retVal; } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) { size_t readBytes = 0; @@ -1099,7 +1161,7 @@ sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) intra = sftk_byte_swap(intra); return retVal; } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) { size_t readBytes = 0; @@ -1107,7 +1169,7 @@ sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) inter = sftk_byte_swap(inter); return retVal; } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) { size_t readBytes = 0; @@ -1116,12 +1178,13 @@ sfTkError_t sfDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) sweeps = sftk_byte_swap(sweeps); return retVal; } - +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceSweepsPerFrame(uint32_t sweeps) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t *)&sweeps, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) { size_t readBytes = 0; @@ -1131,33 +1194,39 @@ sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterFramePresenceTimeout(uint32_t time) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterPhaseBoostEnabled(bool &en) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&en, 4, readBytes); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterPhaseBoostEnabled(bool en) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&en, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceIntraDetectionEnabled(bool &en) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&en, 4, readBytes); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterDetectionEnabled(bool en) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&en, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) { size_t readBytes = 0; @@ -1166,12 +1235,14 @@ sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceFrameRate(uint32_t rate) { rate = sftk_byte_swap(rate); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; @@ -1181,12 +1252,14 @@ sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceIntraDetectionThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; @@ -1196,12 +1269,14 @@ sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterDetectionThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) { size_t readBytes = 0; @@ -1211,12 +1286,14 @@ sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterFrameDeviationTime(uint32_t time) { time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) { size_t readBytes = 0; @@ -1226,12 +1303,14 @@ sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterFrameFastCutoff(uint32_t cut) { cut = sftk_byte_swap(cut); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) { size_t readBytes = 0; @@ -1241,12 +1320,14 @@ sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterFrameSlowCutoff(uint32_t cut) { cut = sftk_byte_swap(cut); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) { size_t readBytes = 0; @@ -1256,12 +1337,14 @@ sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceIntraFrameTimeConst(uint32_t time) { time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) { size_t readBytes = 0; @@ -1271,12 +1354,14 @@ sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceIntraOutputTimeConst(uint32_t time) { time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) { size_t readBytes = 0; @@ -1286,34 +1371,40 @@ sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterOutputTimeConst(uint32_t time) { time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceAutoProfileEn(bool &en) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&en, 4, readBytes); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceAutoProfileEn(bool en) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&en, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceAutoStepLengthEn(bool &en) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&en, 4, readBytes); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceAutoStepLengthEn(bool en) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&en, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) { size_t readBytes = 0; @@ -1323,12 +1414,14 @@ sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceManualProfile(uint32_t prof) { prof = sftk_byte_swap(prof); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) { size_t readBytes = 0; @@ -1338,12 +1431,14 @@ sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceManualStepLength(uint32_t length) { length = sftk_byte_swap(length); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) { size_t readBytes = 0; @@ -1352,12 +1447,14 @@ sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceStart(uint32_t start) { start = sftk_byte_swap(start); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) { size_t readBytes = 0; @@ -1366,34 +1463,40 @@ sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceEnd(uint32_t end) { end = sftk_byte_swap(end); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceResetFilters(bool &reset) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t *)&reset, 4, readBytes); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceResetFilters(bool reset) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t *)&reset, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceHWAAS(uint32_t &avg) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, 4, readBytes); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceHWAAS(uint32_t avg) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) { size_t readBytes = 0; @@ -1403,6 +1506,7 @@ sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceDetectionOnGPIO(uint32_t detected) { detected = sftk_byte_swap(detected); @@ -1415,36 +1519,43 @@ sfTkError_t sfDevXM125::setPresenceCommand(uint32_t cmd) return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t *)&cmd, 4); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::presenceApplyConfiguration() { return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::presenceStart() { return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); } -sfTkError_t sfDevXM125::presencestop() +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::presenceStop() { return setPresenceCommand(SFE_XM125_PRESENCE_STOP_DETECTOR); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::presenceEnableUartLogs() { return setPresenceCommand(SFE_XM125_PRESENCE_ENABLE_UART_LOGS); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::presenceDisableUartLogs() { return setPresenceCommand(SFE_XM125_PRESENCE_DISABLE_UART_LOGS); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::presenceLogConfiguration() { return setPresenceCommand(SFE_XM125_PRESENCE_LOG_CONFIGURATION); } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceBusy(uint32_t &busy) { sfTkError_t retVal; @@ -1454,13 +1565,14 @@ sfTkError_t sfDevXM125::getPresenceBusy(uint32_t &busy) size_t readBytes = 0; retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); - busy = sftk_byte_swap(busy); + regVal = sftk_byte_swap(regVal); // Mask unused bits from register busy = (regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> SFE_XM125_PRESENCE_BUSY_MASK_SHIFT; return retVal; } +//-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::presenceBusyWait() { sfTkError_t retVal = 0; @@ -1477,9 +1589,6 @@ sfTkError_t sfDevXM125::presenceBusyWait() regVal = sftk_byte_swap(regVal); } - if (retVal != 0) - { - return retVal; - } - return ksfTkErrOk; // 0 on success + return retVal; + } diff --git a/src/sfTk/sfDevXM125.h b/src/sfTk/sfDevXM125.h index 4d21485..bd8b7ce 100644 --- a/src/sfTk/sfDevXM125.h +++ b/src/sfTk/sfDevXM125.h @@ -1,7 +1,18 @@ +/** + * @file sfDevXM125.h + * @brief Header of the SparkFun Qwiic XM125 Library. + * + * This file contains the header declares of the functions for interfacing with + * the SparkFun Qwiic XM125 distance and presence detector using I2C communication. + * + * @author SparkFun Electronics + * @date 2024-2025 + * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. + * + * SPDX-License-Identifier: MIT + */ #pragma once - - #include // Bus interfaces #include @@ -847,7 +858,7 @@ class sfDevXM125 /// @brief This function stops the device by writing the defined /// stop value to the presence command register /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t presencestop(); + sfTkError_t presenceStop(); /// @brief This function enables the uart logs of the device by /// writing the defined value to the presence command register diff --git a/src/sfTk/sfXM125Regs.h b/src/sfTk/sfXM125Regs.h index 051961f..7d91929 100644 --- a/src/sfTk/sfXM125Regs.h +++ b/src/sfTk/sfXM125Regs.h @@ -1,42 +1,16 @@ -// sfe_xm125_regs.h -// -// This is a library written for SparkFun Pulsed Coherent Radar Sensor - XM125 -// -// SparkFun sells these boards at its website: www.sparkfun.com -// -// Do you like this library? Help support SparkFun. Buy a board! -// -// SparkFun Indoor Air Quality Sensor - XM125 (Qwiic) https://www.sparkfun.com/products/ -// -// Written by Madison Chodikov @ SparkFun Electronics, January 2023 -// -// Repository: -// https://github.com/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library/ -// -// SparkFun code, firmware, and software is released under the MIT -// License(http://opensource.org/licenses/MIT). -// -// SPDX-License-Identifier: MIT -// -// The MIT License (MIT) -// -// Copyright (c) 2022 SparkFun Electronics -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: The -// above copyright notice and this permission notice shall be included in all -// copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED -// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT -// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR -// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN -// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -// The following defines the bits and registers of the ENS160. +/** + * @file sfXM125Regs.h + * @brief Header with register defines for the SparkFun Qwiic XM125 Library. + * + * This file contains the definitions and masks used for operating the + * SparkFun Qwiic XM125 distance and presence detector using I2C communication. + * + * @author SparkFun Electronics + * @date 2024-2025 + * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. + * + * SPDX-License-Identifier: MIT + */ #include From af769f44ec125097c44ddf0168488effb7b1b649 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 06:17:08 -0700 Subject: [PATCH 05/32] fix or - need boolean op, not bit op --- .../Example04_PresenceAdvancedReadings.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino b/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino index 923e981..f255c11 100644 --- a/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino +++ b/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino @@ -114,7 +114,7 @@ void loop() radarSensor.getPresenceDetectorPresenceDetected(presenceDetected); radarSensor.getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky); - if((presenceDetected == 1) | (presenceDetectedSticky == 1)) + if((presenceDetected == 1) || (presenceDetectedSticky == 1)) { radarSensor.getPresenceDistance(distance); Serial.print("Presence Detected: "); From 4a5cb52eece46644482ee33a8de09057c92ec6e7 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 08:13:31 -0700 Subject: [PATCH 06/32] remove template leftover --- documents/add_documents_here.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 documents/add_documents_here.md diff --git a/documents/add_documents_here.md b/documents/add_documents_here.md deleted file mode 100644 index 2010408..0000000 --- a/documents/add_documents_here.md +++ /dev/null @@ -1 +0,0 @@ -Add any relevant documents to this director (eg. datasheet), and delete this file. From 6c7b0d71e25738b7790e8c10ec549f83e7b98bdc Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 08:16:13 -0700 Subject: [PATCH 07/32] add contextual naming to the *html* sub-dir --- documents/rss_api.html | 2 +- documents/{html => rss_api_html}/AcconeerLogo.png | Bin .../acc__alg__basic__utils_8h.html | 0 .../acc__alg__basic__utils_8h_source.html | 0 .../{html => rss_api_html}/acc__algorithm_8c.html | 0 .../acc__algorithm_8c_source.html | 0 .../{html => rss_api_html}/acc__algorithm_8h.html | 0 .../acc__algorithm_8h_source.html | 0 .../{html => rss_api_html}/acc__config_8h.html | 0 .../acc__config_8h_source.html | 0 .../acc__config__subsweep_8h.html | 0 .../acc__config__subsweep_8h_source.html | 0 .../acc__control__helper_8c.html | 0 .../acc__control__helper_8c_source.html | 0 .../acc__control__helper_8h.html | 0 .../acc__control__helper_8h_source.html | 0 .../acc__definitions__a121_8h.html | 0 .../acc__definitions__a121_8h_source.html | 0 .../acc__definitions__common_8h.html | 0 .../acc__definitions__common_8h_source.html | 0 .../acc__detector__distance_8h.html | 0 .../acc__detector__distance_8h_source.html | 0 .../acc__detector__distance__definitions_8h.html | 0 ...__detector__distance__definitions_8h_source.html | 0 .../acc__detector__presence_8h.html | 0 .../acc__detector__presence_8h_source.html | 0 .../acc__exploration__server__base_8h.html | 0 .../acc__exploration__server__base_8h_source.html | 0 .../acc__exploration__server__stm32_8c.html | 0 .../acc__exploration__server__stm32_8c_source.html | 0 .../acc__exploration__server__stm32_8h.html | 0 .../acc__exploration__server__stm32_8h_source.html | 0 .../acc__hal__definitions__a121_8h.html | 0 .../acc__hal__definitions__a121_8h_source.html | 0 .../acc__hal__integration__a121_8h.html | 0 .../acc__hal__integration__a121_8h_source.html | 0 .../acc__hal__integration__stm32cube__xm_8c.html | 0 ...__hal__integration__stm32cube__xm_8c_source.html | 0 .../{html => rss_api_html}/acc__integration_8h.html | 0 .../acc__integration_8h_source.html | 0 .../acc__integration__cortex_8c.html | 0 .../acc__integration__cortex_8c_source.html | 0 .../acc__integration__log_8c.html | 0 .../acc__integration__log_8c_source.html | 0 .../acc__integration__log_8h.html | 0 .../acc__integration__log_8h_source.html | 0 .../acc__integration__stm32_8c.html | 0 .../acc__integration__stm32_8c_source.html | 0 .../{html => rss_api_html}/acc__processing_8h.html | 0 .../acc__processing_8h_source.html | 0 .../acc__processing__helpers_8c.html | 0 .../acc__processing__helpers_8c_source.html | 0 .../acc__processing__helpers_8h.html | 0 .../acc__processing__helpers_8h_source.html | 0 .../acc__reg__protocol_8c.html | 0 .../acc__reg__protocol_8c_source.html | 0 .../acc__reg__protocol_8h.html | 0 .../acc__reg__protocol_8h_source.html | 0 .../{html => rss_api_html}/acc__rss__a121_8h.html | 0 .../acc__rss__a121_8h_source.html | 0 .../{html => rss_api_html}/acc__sensor_8h.html | 0 .../acc__sensor_8h_source.html | 0 .../{html => rss_api_html}/acc__version_8h.html | 0 .../acc__version_8h_source.html | 0 .../acc__wrap__printf_8c.html | 0 .../acc__wrap__printf_8c_source.html | 0 .../acc_control_helper_8c-example.html | 0 .../acc_processing_helpers_8c-example.html | 0 documents/{html => rss_api_html}/annotated.html | 0 documents/{html => rss_api_html}/bc_s.png | Bin documents/{html => rss_api_html}/bdwn.png | Bin documents/{html => rss_api_html}/classes.html | 0 documents/{html => rss_api_html}/closed.png | Bin .../dir_04f2ecc425faf0d475a3caf484e551f3.html | 0 .../dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html | 0 .../dir_073ccfab4bf11db73a8ee8eb161030da.html | 0 .../dir_08f02f6646c4dd9624ef093774b0b7f7.html | 0 .../dir_15c29f069e8c0144bc89b47ad62a396e.html | 0 .../dir_29751087315bdd66fec7ae73f3a3b3df.html | 0 .../dir_437c280191dc31797ff1fffcdbf26d60.html | 0 .../dir_5f3b126a0daad2440047e3d157f0734d.html | 0 .../dir_763f9730c6de1b6696aabb67bc8f2cb8.html | 0 .../dir_885ce7a5dfec3e0117d586c25f876c85.html | 0 .../dir_9037ad2fcf0acf58199e91c83d01aa83.html | 0 .../dir_90c50c4300347a3add62d58adc5f49d2.html | 0 .../dir_a90b80e01b24c51566f20c737761e66b.html | 0 .../dir_ab4160dc9345f344f1e5455bc8a8c5b6.html | 0 .../dir_b3a0981508daed4f615eb509e7de909b.html | 0 .../dir_bc91f92db1b66e0df5b21c879d8024f8.html | 0 .../dir_e68e8157741866f444e17edd764ebbae.html | 0 .../dir_eabfdd4d73a10cf1a95f85f69b256a94.html | 0 .../distance__reg__protocol_8c.html | 0 .../distance__reg__protocol_8c_source.html | 0 .../distance__reg__protocol_8h.html | 0 .../distance__reg__protocol_8h_source.html | 0 .../distance__reg__protocol__access_8c.html | 0 .../distance__reg__protocol__access_8c_source.html | 0 documents/{html => rss_api_html}/doc.png | Bin documents/{html => rss_api_html}/doxygen.css | 0 documents/{html => rss_api_html}/doxygen.png | Bin documents/{html => rss_api_html}/dynsections.js | 0 .../example__bring__up_8c.html | 0 .../example__bring__up_8c_source.html | 0 .../example__bring__up_8h.html | 0 .../example__bring__up_8h_source.html | 0 .../example__control__helper_8c.html | 0 .../example__control__helper_8c_source.html | 0 .../example__control__helper_8h.html | 0 .../example__control__helper_8h_source.html | 0 .../example__detector__distance_8c.html | 0 .../example__detector__distance_8c_source.html | 0 .../example__detector__distance_8h.html | 0 .../example__detector__distance_8h_source.html | 0 ...etector__distance__low__power__hibernate_8c.html | 0 ...__distance__low__power__hibernate_8c_source.html | 0 ...etector__distance__low__power__hibernate_8h.html | 0 ...__distance__low__power__hibernate_8h_source.html | 0 ...ple__detector__distance__low__power__off_8c.html | 0 ...tector__distance__low__power__off_8c_source.html | 0 ...ple__detector__distance__low__power__off_8h.html | 0 ...tector__distance__low__power__off_8h_source.html | 0 ...etector__distance__with__iq__data__print_8c.html | 0 ...__distance__with__iq__data__print_8c_source.html | 0 .../example__detector__presence_8c.html | 0 .../example__detector__presence_8c_source.html | 0 .../example__detector__presence_8h.html | 0 .../example__detector__presence_8h_source.html | 0 ...etector__presence__low__power__hibernate_8c.html | 0 ...__presence__low__power__hibernate_8c_source.html | 0 ...etector__presence__low__power__hibernate_8h.html | 0 ...__presence__low__power__hibernate_8h_source.html | 0 ...ple__detector__presence__low__power__off_8c.html | 0 ...tector__presence__low__power__off_8c_source.html | 0 ...ple__detector__presence__low__power__off_8h.html | 0 ...tector__presence__low__power__off_8h_source.html | 0 ...ctor__presence__multiple__configurations_8c.html | 0 ...resence__multiple__configurations_8c_source.html | 0 ...ctor__presence__multiple__configurations_8h.html | 0 ...resence__multiple__configurations_8h_source.html | 0 .../example__diagnostic__test_8c.html | 0 .../example__diagnostic__test_8c_source.html | 0 .../example__diagnostic__test_8h.html | 0 .../example__diagnostic__test_8h_source.html | 0 .../example__processing__amplitude_8c.html | 0 .../example__processing__amplitude_8c_source.html | 0 .../example__processing__amplitude_8h.html | 0 .../example__processing__amplitude_8h_source.html | 0 .../example__processing__coherent__mean_8c.html | 0 ...ample__processing__coherent__mean_8c_source.html | 0 .../example__processing__coherent__mean_8h.html | 0 ...ample__processing__coherent__mean_8h_source.html | 0 .../example__processing__noncoherent__mean_8c.html | 0 ...le__processing__noncoherent__mean_8c_source.html | 0 .../example__processing__noncoherent__mean_8h.html | 0 ...le__processing__noncoherent__mean_8h_source.html | 0 ...example__processing__peak__interpolation_8c.html | 0 ...__processing__peak__interpolation_8c_source.html | 0 ...example__processing__peak__interpolation_8h.html | 0 ...__processing__peak__interpolation_8h_source.html | 0 .../example__processing__static__presence_8c.html | 0 ...ple__processing__static__presence_8c_source.html | 0 .../example__processing__static__presence_8h.html | 0 ...ple__processing__static__presence_8h_source.html | 0 ...mple__processing__subtract__adaptive__bg_8c.html | 0 ...rocessing__subtract__adaptive__bg_8c_source.html | 0 ...mple__processing__subtract__adaptive__bg_8h.html | 0 ...rocessing__subtract__adaptive__bg_8h_source.html | 0 .../{html => rss_api_html}/example__service_8c.html | 0 .../example__service_8c_source.html | 0 .../{html => rss_api_html}/example__service_8h.html | 0 .../example__service_8h_source.html | 0 ...le__service__low__power__sensor__disable_8c.html | 0 ...vice__low__power__sensor__disable_8c_source.html | 0 ...le__service__low__power__sensor__disable_8h.html | 0 ...vice__low__power__sensor__disable_8h_source.html | 0 ...__service__low__power__sensor__hibernate_8c.html | 0 ...ce__low__power__sensor__hibernate_8c_source.html | 0 ...__service__low__power__sensor__hibernate_8h.html | 0 ...ce__low__power__sensor__hibernate_8h_source.html | 0 ...ample__service__multiple__configurations_8c.html | 0 ...service__multiple__configurations_8c_source.html | 0 ...ample__service__multiple__configurations_8h.html | 0 ...service__multiple__configurations_8h_source.html | 0 .../example__service__sensor__disable_8c.html | 0 ...example__service__sensor__disable_8c_source.html | 0 .../example__service__sensor__disable_8h.html | 0 ...example__service__sensor__disable_8h_source.html | 0 .../example__service__sensor__hibernate_8c.html | 0 ...ample__service__sensor__hibernate_8c_source.html | 0 .../example__service__sensor__hibernate_8h.html | 0 ...ample__service__sensor__hibernate_8h_source.html | 0 .../example__service__sensor__off_8c.html | 0 .../example__service__sensor__off_8c_source.html | 0 .../example__service__sensor__off_8h.html | 0 .../example__service__sensor__off_8h_source.html | 0 .../example__service__subsweeps_8c.html | 0 .../example__service__subsweeps_8c_source.html | 0 .../example__service__subsweeps_8h.html | 0 .../example__service__subsweeps_8h_source.html | 0 .../example__surface__velocity_8c.html | 0 .../example__surface__velocity_8c_source.html | 0 .../example__surface__velocity_8h.html | 0 .../example__surface__velocity_8h_source.html | 0 .../example_bring_up_8c-example.html | 0 .../example_control_helper_8c-example.html | 0 .../example_detector_distance_8c-example.html | 0 ...tor_distance_low_power_hibernate_8c-example.html | 0 ..._detector_distance_low_power_off_8c-example.html | 0 ...ctor_distance_with_iq_data_print_8c-example.html | 0 .../example_detector_presence_8c-example.html | 0 ...tor_presence_low_power_hibernate_8c-example.html | 0 ..._detector_presence_low_power_off_8c-example.html | 0 ...presence_multiple_configurations_8c-example.html | 0 .../example_diagnostic_test_8c-example.html | 0 .../example_processing_amplitude_8c-example.html | 0 ...example_processing_coherent_mean_8c-example.html | 0 ...mple_processing_noncoherent_mean_8c-example.html | 0 ...le_processing_peak_interpolation_8c-example.html | 0 ...ample_processing_static_presence_8c-example.html | 0 ..._processing_subtract_adaptive_bg_8c-example.html | 0 .../example_service_8c-example.html | 0 ...service_low_power_sensor_disable_8c-example.html | 0 ...rvice_low_power_sensor_hibernate_8c-example.html | 0 ..._service_multiple_configurations_8c-example.html | 0 .../example_service_sensor_disable_8c-example.html | 0 ...example_service_sensor_hibernate_8c-example.html | 0 .../example_service_sensor_off_8c-example.html | 0 .../example_service_subsweeps_8c-example.html | 0 documents/{html => rss_api_html}/examples.html | 0 documents/{html => rss_api_html}/examples.js | 0 documents/{html => rss_api_html}/files.html | 0 documents/{html => rss_api_html}/folderclosed.png | Bin documents/{html => rss_api_html}/folderopen.png | Bin documents/{html => rss_api_html}/functions.html | 0 documents/{html => rss_api_html}/functions_b.html | 0 documents/{html => rss_api_html}/functions_c.html | 0 documents/{html => rss_api_html}/functions_d.html | 0 documents/{html => rss_api_html}/functions_e.html | 0 documents/{html => rss_api_html}/functions_f.html | 0 documents/{html => rss_api_html}/functions_g.html | 0 documents/{html => rss_api_html}/functions_h.html | 0 documents/{html => rss_api_html}/functions_i.html | 0 documents/{html => rss_api_html}/functions_l.html | 0 documents/{html => rss_api_html}/functions_m.html | 0 documents/{html => rss_api_html}/functions_n.html | 0 documents/{html => rss_api_html}/functions_o.html | 0 documents/{html => rss_api_html}/functions_p.html | 0 documents/{html => rss_api_html}/functions_r.html | 0 documents/{html => rss_api_html}/functions_s.html | 0 documents/{html => rss_api_html}/functions_t.html | 0 documents/{html => rss_api_html}/functions_u.html | 0 documents/{html => rss_api_html}/functions_v.html | 0 .../{html => rss_api_html}/functions_vars.html | 0 .../{html => rss_api_html}/functions_vars_b.html | 0 .../{html => rss_api_html}/functions_vars_c.html | 0 .../{html => rss_api_html}/functions_vars_d.html | 0 .../{html => rss_api_html}/functions_vars_e.html | 0 .../{html => rss_api_html}/functions_vars_f.html | 0 .../{html => rss_api_html}/functions_vars_g.html | 0 .../{html => rss_api_html}/functions_vars_h.html | 0 .../{html => rss_api_html}/functions_vars_i.html | 0 .../{html => rss_api_html}/functions_vars_l.html | 0 .../{html => rss_api_html}/functions_vars_m.html | 0 .../{html => rss_api_html}/functions_vars_n.html | 0 .../{html => rss_api_html}/functions_vars_o.html | 0 .../{html => rss_api_html}/functions_vars_p.html | 0 .../{html => rss_api_html}/functions_vars_r.html | 0 .../{html => rss_api_html}/functions_vars_s.html | 0 .../{html => rss_api_html}/functions_vars_t.html | 0 .../{html => rss_api_html}/functions_vars_u.html | 0 .../{html => rss_api_html}/functions_vars_v.html | 0 .../{html => rss_api_html}/functions_vars_w.html | 0 .../{html => rss_api_html}/functions_vars_z.html | 0 documents/{html => rss_api_html}/functions_w.html | 0 documents/{html => rss_api_html}/functions_z.html | 0 documents/{html => rss_api_html}/globals.html | 0 documents/{html => rss_api_html}/globals_a.html | 0 documents/{html => rss_api_html}/globals_b.html | 0 documents/{html => rss_api_html}/globals_c.html | 0 documents/{html => rss_api_html}/globals_d.html | 0 documents/{html => rss_api_html}/globals_defs.html | 0 .../{html => rss_api_html}/globals_defs_b.html | 0 .../{html => rss_api_html}/globals_defs_c.html | 0 .../{html => rss_api_html}/globals_defs_d.html | 0 .../{html => rss_api_html}/globals_defs_e.html | 0 .../{html => rss_api_html}/globals_defs_f.html | 0 .../{html => rss_api_html}/globals_defs_g.html | 0 .../{html => rss_api_html}/globals_defs_h.html | 0 .../{html => rss_api_html}/globals_defs_i.html | 0 .../{html => rss_api_html}/globals_defs_l.html | 0 .../{html => rss_api_html}/globals_defs_m.html | 0 .../{html => rss_api_html}/globals_defs_n.html | 0 .../{html => rss_api_html}/globals_defs_p.html | 0 .../{html => rss_api_html}/globals_defs_r.html | 0 .../{html => rss_api_html}/globals_defs_s.html | 0 .../{html => rss_api_html}/globals_defs_t.html | 0 .../{html => rss_api_html}/globals_defs_u.html | 0 .../{html => rss_api_html}/globals_defs_v.html | 0 .../{html => rss_api_html}/globals_defs_w.html | 0 documents/{html => rss_api_html}/globals_e.html | 0 documents/{html => rss_api_html}/globals_enum.html | 0 documents/{html => rss_api_html}/globals_eval.html | 0 documents/{html => rss_api_html}/globals_f.html | 0 documents/{html => rss_api_html}/globals_func.html | 0 .../{html => rss_api_html}/globals_func_a.html | 0 .../{html => rss_api_html}/globals_func_b.html | 0 .../{html => rss_api_html}/globals_func_c.html | 0 .../{html => rss_api_html}/globals_func_d.html | 0 .../{html => rss_api_html}/globals_func_e.html | 0 .../{html => rss_api_html}/globals_func_f.html | 0 .../{html => rss_api_html}/globals_func_g.html | 0 .../{html => rss_api_html}/globals_func_h.html | 0 .../{html => rss_api_html}/globals_func_i.html | 0 .../{html => rss_api_html}/globals_func_m.html | 0 .../{html => rss_api_html}/globals_func_n.html | 0 .../{html => rss_api_html}/globals_func_o.html | 0 .../{html => rss_api_html}/globals_func_p.html | 0 .../{html => rss_api_html}/globals_func_r.html | 0 .../{html => rss_api_html}/globals_func_s.html | 0 .../{html => rss_api_html}/globals_func_u.html | 0 .../{html => rss_api_html}/globals_func_v.html | 0 .../{html => rss_api_html}/globals_func_w.html | 0 documents/{html => rss_api_html}/globals_g.html | 0 documents/{html => rss_api_html}/globals_h.html | 0 documents/{html => rss_api_html}/globals_i.html | 0 documents/{html => rss_api_html}/globals_l.html | 0 documents/{html => rss_api_html}/globals_m.html | 0 documents/{html => rss_api_html}/globals_n.html | 0 documents/{html => rss_api_html}/globals_o.html | 0 documents/{html => rss_api_html}/globals_p.html | 0 documents/{html => rss_api_html}/globals_r.html | 0 documents/{html => rss_api_html}/globals_s.html | 0 documents/{html => rss_api_html}/globals_t.html | 0 documents/{html => rss_api_html}/globals_type.html | 0 documents/{html => rss_api_html}/globals_u.html | 0 documents/{html => rss_api_html}/globals_v.html | 0 documents/{html => rss_api_html}/globals_vars.html | 0 documents/{html => rss_api_html}/globals_w.html | 0 .../{html => rss_api_html}/group__Distance.html | 0 documents/{html => rss_api_html}/group__Distance.js | 0 .../{html => rss_api_html}/group__Presence.html | 0 documents/{html => rss_api_html}/group__Presence.js | 0 documents/{html => rss_api_html}/group__config.html | 0 documents/{html => rss_api_html}/group__config.js | 0 .../{html => rss_api_html}/group__processing.html | 0 .../{html => rss_api_html}/group__processing.js | 0 documents/{html => rss_api_html}/group__rss.html | 0 documents/{html => rss_api_html}/group__rss.js | 0 documents/{html => rss_api_html}/group__sensor.html | 0 documents/{html => rss_api_html}/group__sensor.js | 0 .../{html => rss_api_html}/group__service.html | 0 documents/{html => rss_api_html}/group__service.js | 0 .../{html => rss_api_html}/group__subsweep.html | 0 documents/{html => rss_api_html}/group__subsweep.js | 0 .../i2c__application__system_8h.html | 0 .../i2c__application__system_8h_source.html | 0 .../i2c__application__system__stm32_8c.html | 0 .../i2c__application__system__stm32_8c_source.html | 0 .../i2c__distance__detector_8c.html | 0 .../i2c__distance__detector_8c_source.html | 0 .../i2c__distance__detector_8h.html | 0 .../i2c__distance__detector_8h_source.html | 0 .../i2c__presence__detector_8c.html | 0 .../i2c__presence__detector_8c_source.html | 0 .../i2c__presence__detector_8h.html | 0 .../i2c__presence__detector_8h_source.html | 0 documents/{html => rss_api_html}/index.html | 0 documents/{html => rss_api_html}/intro_8md.html | 0 documents/{html => rss_api_html}/jquery.js | 0 documents/{html => rss_api_html}/main_8h.html | 0 .../{html => rss_api_html}/main_8h_source.html | 0 documents/{html => rss_api_html}/menu.js | 0 documents/{html => rss_api_html}/menudata.js | 0 documents/{html => rss_api_html}/modules.html | 0 documents/{html => rss_api_html}/modules.js | 0 documents/{html => rss_api_html}/nav_f.png | Bin documents/{html => rss_api_html}/nav_g.png | Bin documents/{html => rss_api_html}/nav_h.png | Bin documents/{html => rss_api_html}/navtree.css | 0 documents/{html => rss_api_html}/navtree.js | 0 documents/{html => rss_api_html}/navtreedata.js | 0 documents/{html => rss_api_html}/navtreeindex0.js | 0 documents/{html => rss_api_html}/navtreeindex1.js | 0 documents/{html => rss_api_html}/open.png | Bin .../presence__reg__protocol_8c.html | 0 .../presence__reg__protocol_8c_source.html | 0 .../presence__reg__protocol_8h.html | 0 .../presence__reg__protocol_8h_source.html | 0 .../presence__reg__protocol__access_8c.html | 0 .../presence__reg__protocol__access_8c_source.html | 0 documents/{html => rss_api_html}/printf_8c.html | 0 .../{html => rss_api_html}/printf_8c_source.html | 0 documents/{html => rss_api_html}/printf_8h.html | 0 .../{html => rss_api_html}/printf_8h_source.html | 0 .../ref__app__breathing_8c.html | 0 .../ref__app__breathing_8c_source.html | 0 .../ref__app__breathing_8h.html | 0 .../ref__app__breathing_8h_source.html | 0 .../ref__app__smart__presence_8c.html | 0 .../ref__app__smart__presence_8c_source.html | 0 .../ref__app__smart__presence_8h.html | 0 .../ref__app__smart__presence_8h_source.html | 0 .../ref__app__tank__level_8c.html | 0 .../ref__app__tank__level_8c_source.html | 0 .../ref__app__tank__level_8h.html | 0 .../ref__app__tank__level_8h_source.html | 0 .../ref_app_tank_level_8c-example.html | 0 documents/{html => rss_api_html}/resize.js | 0 documents/{html => rss_api_html}/search/all_0.html | 0 documents/{html => rss_api_html}/search/all_0.js | 0 documents/{html => rss_api_html}/search/all_1.html | 0 documents/{html => rss_api_html}/search/all_1.js | 0 documents/{html => rss_api_html}/search/all_10.html | 0 documents/{html => rss_api_html}/search/all_10.js | 0 documents/{html => rss_api_html}/search/all_11.html | 0 documents/{html => rss_api_html}/search/all_11.js | 0 documents/{html => rss_api_html}/search/all_12.html | 0 documents/{html => rss_api_html}/search/all_12.js | 0 documents/{html => rss_api_html}/search/all_13.html | 0 documents/{html => rss_api_html}/search/all_13.js | 0 documents/{html => rss_api_html}/search/all_14.html | 0 documents/{html => rss_api_html}/search/all_14.js | 0 documents/{html => rss_api_html}/search/all_15.html | 0 documents/{html => rss_api_html}/search/all_15.js | 0 documents/{html => rss_api_html}/search/all_2.html | 0 documents/{html => rss_api_html}/search/all_2.js | 0 documents/{html => rss_api_html}/search/all_3.html | 0 documents/{html => rss_api_html}/search/all_3.js | 0 documents/{html => rss_api_html}/search/all_4.html | 0 documents/{html => rss_api_html}/search/all_4.js | 0 documents/{html => rss_api_html}/search/all_5.html | 0 documents/{html => rss_api_html}/search/all_5.js | 0 documents/{html => rss_api_html}/search/all_6.html | 0 documents/{html => rss_api_html}/search/all_6.js | 0 documents/{html => rss_api_html}/search/all_7.html | 0 documents/{html => rss_api_html}/search/all_7.js | 0 documents/{html => rss_api_html}/search/all_8.html | 0 documents/{html => rss_api_html}/search/all_8.js | 0 documents/{html => rss_api_html}/search/all_9.html | 0 documents/{html => rss_api_html}/search/all_9.js | 0 documents/{html => rss_api_html}/search/all_a.html | 0 documents/{html => rss_api_html}/search/all_a.js | 0 documents/{html => rss_api_html}/search/all_b.html | 0 documents/{html => rss_api_html}/search/all_b.js | 0 documents/{html => rss_api_html}/search/all_c.html | 0 documents/{html => rss_api_html}/search/all_c.js | 0 documents/{html => rss_api_html}/search/all_d.html | 0 documents/{html => rss_api_html}/search/all_d.js | 0 documents/{html => rss_api_html}/search/all_e.html | 0 documents/{html => rss_api_html}/search/all_e.js | 0 documents/{html => rss_api_html}/search/all_f.html | 0 documents/{html => rss_api_html}/search/all_f.js | 0 .../{html => rss_api_html}/search/classes_0.html | 0 .../{html => rss_api_html}/search/classes_0.js | 0 .../{html => rss_api_html}/search/classes_1.html | 0 .../{html => rss_api_html}/search/classes_1.js | 0 .../{html => rss_api_html}/search/classes_2.html | 0 .../{html => rss_api_html}/search/classes_2.js | 0 .../{html => rss_api_html}/search/classes_3.html | 0 .../{html => rss_api_html}/search/classes_3.js | 0 .../{html => rss_api_html}/search/classes_4.html | 0 .../{html => rss_api_html}/search/classes_4.js | 0 .../{html => rss_api_html}/search/classes_5.html | 0 .../{html => rss_api_html}/search/classes_5.js | 0 documents/{html => rss_api_html}/search/close.png | Bin .../{html => rss_api_html}/search/defines_0.html | 0 .../{html => rss_api_html}/search/defines_0.js | 0 .../{html => rss_api_html}/search/defines_1.html | 0 .../{html => rss_api_html}/search/defines_1.js | 0 .../{html => rss_api_html}/search/defines_10.html | 0 .../{html => rss_api_html}/search/defines_10.js | 0 .../{html => rss_api_html}/search/defines_11.html | 0 .../{html => rss_api_html}/search/defines_11.js | 0 .../{html => rss_api_html}/search/defines_12.html | 0 .../{html => rss_api_html}/search/defines_12.js | 0 .../{html => rss_api_html}/search/defines_2.html | 0 .../{html => rss_api_html}/search/defines_2.js | 0 .../{html => rss_api_html}/search/defines_3.html | 0 .../{html => rss_api_html}/search/defines_3.js | 0 .../{html => rss_api_html}/search/defines_4.html | 0 .../{html => rss_api_html}/search/defines_4.js | 0 .../{html => rss_api_html}/search/defines_5.html | 0 .../{html => rss_api_html}/search/defines_5.js | 0 .../{html => rss_api_html}/search/defines_6.html | 0 .../{html => rss_api_html}/search/defines_6.js | 0 .../{html => rss_api_html}/search/defines_7.html | 0 .../{html => rss_api_html}/search/defines_7.js | 0 .../{html => rss_api_html}/search/defines_8.html | 0 .../{html => rss_api_html}/search/defines_8.js | 0 .../{html => rss_api_html}/search/defines_9.html | 0 .../{html => rss_api_html}/search/defines_9.js | 0 .../{html => rss_api_html}/search/defines_a.html | 0 .../{html => rss_api_html}/search/defines_a.js | 0 .../{html => rss_api_html}/search/defines_b.html | 0 .../{html => rss_api_html}/search/defines_b.js | 0 .../{html => rss_api_html}/search/defines_c.html | 0 .../{html => rss_api_html}/search/defines_c.js | 0 .../{html => rss_api_html}/search/defines_d.html | 0 .../{html => rss_api_html}/search/defines_d.js | 0 .../{html => rss_api_html}/search/defines_e.html | 0 .../{html => rss_api_html}/search/defines_e.js | 0 .../{html => rss_api_html}/search/defines_f.html | 0 .../{html => rss_api_html}/search/defines_f.js | 0 .../{html => rss_api_html}/search/enums_0.html | 0 documents/{html => rss_api_html}/search/enums_0.js | 0 .../{html => rss_api_html}/search/enums_1.html | 0 documents/{html => rss_api_html}/search/enums_1.js | 0 .../{html => rss_api_html}/search/enums_2.html | 0 documents/{html => rss_api_html}/search/enums_2.js | 0 .../{html => rss_api_html}/search/enums_3.html | 0 documents/{html => rss_api_html}/search/enums_3.js | 0 .../{html => rss_api_html}/search/enums_4.html | 0 documents/{html => rss_api_html}/search/enums_4.js | 0 .../{html => rss_api_html}/search/enums_5.html | 0 documents/{html => rss_api_html}/search/enums_5.js | 0 .../{html => rss_api_html}/search/enumvalues_0.html | 0 .../{html => rss_api_html}/search/enumvalues_0.js | 0 .../{html => rss_api_html}/search/enumvalues_1.html | 0 .../{html => rss_api_html}/search/enumvalues_1.js | 0 .../{html => rss_api_html}/search/enumvalues_2.html | 0 .../{html => rss_api_html}/search/enumvalues_2.js | 0 .../{html => rss_api_html}/search/enumvalues_3.html | 0 .../{html => rss_api_html}/search/enumvalues_3.js | 0 .../{html => rss_api_html}/search/enumvalues_4.html | 0 .../{html => rss_api_html}/search/enumvalues_4.js | 0 .../{html => rss_api_html}/search/enumvalues_5.html | 0 .../{html => rss_api_html}/search/enumvalues_5.js | 0 .../{html => rss_api_html}/search/enumvalues_6.html | 0 .../{html => rss_api_html}/search/enumvalues_6.js | 0 .../{html => rss_api_html}/search/files_0.html | 0 documents/{html => rss_api_html}/search/files_0.js | 0 .../{html => rss_api_html}/search/files_1.html | 0 documents/{html => rss_api_html}/search/files_1.js | 0 .../{html => rss_api_html}/search/files_2.html | 0 documents/{html => rss_api_html}/search/files_2.js | 0 .../{html => rss_api_html}/search/files_3.html | 0 documents/{html => rss_api_html}/search/files_3.js | 0 .../{html => rss_api_html}/search/files_4.html | 0 documents/{html => rss_api_html}/search/files_4.js | 0 .../{html => rss_api_html}/search/files_5.html | 0 documents/{html => rss_api_html}/search/files_5.js | 0 .../{html => rss_api_html}/search/files_6.html | 0 documents/{html => rss_api_html}/search/files_6.js | 0 .../{html => rss_api_html}/search/files_7.html | 0 documents/{html => rss_api_html}/search/files_7.js | 0 .../{html => rss_api_html}/search/functions_0.html | 0 .../{html => rss_api_html}/search/functions_0.js | 0 .../{html => rss_api_html}/search/functions_1.html | 0 .../{html => rss_api_html}/search/functions_1.js | 0 .../{html => rss_api_html}/search/functions_10.html | 0 .../{html => rss_api_html}/search/functions_10.js | 0 .../{html => rss_api_html}/search/functions_11.html | 0 .../{html => rss_api_html}/search/functions_11.js | 0 .../{html => rss_api_html}/search/functions_12.html | 0 .../{html => rss_api_html}/search/functions_12.js | 0 .../{html => rss_api_html}/search/functions_2.html | 0 .../{html => rss_api_html}/search/functions_2.js | 0 .../{html => rss_api_html}/search/functions_3.html | 0 .../{html => rss_api_html}/search/functions_3.js | 0 .../{html => rss_api_html}/search/functions_4.html | 0 .../{html => rss_api_html}/search/functions_4.js | 0 .../{html => rss_api_html}/search/functions_5.html | 0 .../{html => rss_api_html}/search/functions_5.js | 0 .../{html => rss_api_html}/search/functions_6.html | 0 .../{html => rss_api_html}/search/functions_6.js | 0 .../{html => rss_api_html}/search/functions_7.html | 0 .../{html => rss_api_html}/search/functions_7.js | 0 .../{html => rss_api_html}/search/functions_8.html | 0 .../{html => rss_api_html}/search/functions_8.js | 0 .../{html => rss_api_html}/search/functions_9.html | 0 .../{html => rss_api_html}/search/functions_9.js | 0 .../{html => rss_api_html}/search/functions_a.html | 0 .../{html => rss_api_html}/search/functions_a.js | 0 .../{html => rss_api_html}/search/functions_b.html | 0 .../{html => rss_api_html}/search/functions_b.js | 0 .../{html => rss_api_html}/search/functions_c.html | 0 .../{html => rss_api_html}/search/functions_c.js | 0 .../{html => rss_api_html}/search/functions_d.html | 0 .../{html => rss_api_html}/search/functions_d.js | 0 .../{html => rss_api_html}/search/functions_e.html | 0 .../{html => rss_api_html}/search/functions_e.js | 0 .../{html => rss_api_html}/search/functions_f.html | 0 .../{html => rss_api_html}/search/functions_f.js | 0 .../{html => rss_api_html}/search/groups_0.html | 0 documents/{html => rss_api_html}/search/groups_0.js | 0 .../{html => rss_api_html}/search/groups_1.html | 0 documents/{html => rss_api_html}/search/groups_1.js | 0 .../{html => rss_api_html}/search/groups_2.html | 0 documents/{html => rss_api_html}/search/groups_2.js | 0 .../{html => rss_api_html}/search/groups_3.html | 0 documents/{html => rss_api_html}/search/groups_3.js | 0 .../{html => rss_api_html}/search/groups_4.html | 0 documents/{html => rss_api_html}/search/groups_4.js | 0 documents/{html => rss_api_html}/search/mag_sel.png | Bin .../{html => rss_api_html}/search/nomatches.html | 0 documents/{html => rss_api_html}/search/search.css | 0 documents/{html => rss_api_html}/search/search.js | 0 .../{html => rss_api_html}/search/search_l.png | Bin .../{html => rss_api_html}/search/search_m.png | Bin .../{html => rss_api_html}/search/search_r.png | Bin .../{html => rss_api_html}/search/searchdata.js | 0 .../{html => rss_api_html}/search/typedefs_0.html | 0 .../{html => rss_api_html}/search/typedefs_0.js | 0 .../{html => rss_api_html}/search/typedefs_1.html | 0 .../{html => rss_api_html}/search/typedefs_1.js | 0 .../{html => rss_api_html}/search/typedefs_2.html | 0 .../{html => rss_api_html}/search/typedefs_2.js | 0 .../{html => rss_api_html}/search/typedefs_3.html | 0 .../{html => rss_api_html}/search/typedefs_3.js | 0 .../{html => rss_api_html}/search/typedefs_4.html | 0 .../{html => rss_api_html}/search/typedefs_4.js | 0 .../{html => rss_api_html}/search/typedefs_5.html | 0 .../{html => rss_api_html}/search/typedefs_5.js | 0 .../{html => rss_api_html}/search/typedefs_6.html | 0 .../{html => rss_api_html}/search/typedefs_6.js | 0 .../{html => rss_api_html}/search/variables_0.html | 0 .../{html => rss_api_html}/search/variables_0.js | 0 .../{html => rss_api_html}/search/variables_1.html | 0 .../{html => rss_api_html}/search/variables_1.js | 0 .../{html => rss_api_html}/search/variables_10.html | 0 .../{html => rss_api_html}/search/variables_10.js | 0 .../{html => rss_api_html}/search/variables_11.html | 0 .../{html => rss_api_html}/search/variables_11.js | 0 .../{html => rss_api_html}/search/variables_12.html | 0 .../{html => rss_api_html}/search/variables_12.js | 0 .../{html => rss_api_html}/search/variables_13.html | 0 .../{html => rss_api_html}/search/variables_13.js | 0 .../{html => rss_api_html}/search/variables_14.html | 0 .../{html => rss_api_html}/search/variables_14.js | 0 .../{html => rss_api_html}/search/variables_15.html | 0 .../{html => rss_api_html}/search/variables_15.js | 0 .../{html => rss_api_html}/search/variables_2.html | 0 .../{html => rss_api_html}/search/variables_2.js | 0 .../{html => rss_api_html}/search/variables_3.html | 0 .../{html => rss_api_html}/search/variables_3.js | 0 .../{html => rss_api_html}/search/variables_4.html | 0 .../{html => rss_api_html}/search/variables_4.js | 0 .../{html => rss_api_html}/search/variables_5.html | 0 .../{html => rss_api_html}/search/variables_5.js | 0 .../{html => rss_api_html}/search/variables_6.html | 0 .../{html => rss_api_html}/search/variables_6.js | 0 .../{html => rss_api_html}/search/variables_7.html | 0 .../{html => rss_api_html}/search/variables_7.js | 0 .../{html => rss_api_html}/search/variables_8.html | 0 .../{html => rss_api_html}/search/variables_8.js | 0 .../{html => rss_api_html}/search/variables_9.html | 0 .../{html => rss_api_html}/search/variables_9.js | 0 .../{html => rss_api_html}/search/variables_a.html | 0 .../{html => rss_api_html}/search/variables_a.js | 0 .../{html => rss_api_html}/search/variables_b.html | 0 .../{html => rss_api_html}/search/variables_b.js | 0 .../{html => rss_api_html}/search/variables_c.html | 0 .../{html => rss_api_html}/search/variables_c.js | 0 .../{html => rss_api_html}/search/variables_d.html | 0 .../{html => rss_api_html}/search/variables_d.js | 0 .../{html => rss_api_html}/search/variables_e.html | 0 .../{html => rss_api_html}/search/variables_e.js | 0 .../{html => rss_api_html}/search/variables_f.html | 0 .../{html => rss_api_html}/search/variables_f.js | 0 .../spinnaker-v11-latin-regular.eot | Bin .../spinnaker-v11-latin-regular.svg | 0 .../spinnaker-v11-latin-regular.ttf | Bin .../spinnaker-v11-latin-regular.woff | Bin .../spinnaker-v11-latin-regular.woff2 | Bin documents/{html => rss_api_html}/splitbar.png | Bin .../stm32l4xx__hal__conf_8h.html | 0 .../stm32l4xx__hal__conf_8h_source.html | 0 .../stm32l4xx__hal__msp_8c.html | 0 .../stm32l4xx__hal__msp_8c_source.html | 0 .../{html => rss_api_html}/stm32l4xx__it_8c.html | 0 .../stm32l4xx__it_8c_source.html | 0 .../{html => rss_api_html}/stm32l4xx__it_8h.html | 0 .../stm32l4xx__it_8h_source.html | 0 .../structacc__breathing__config__t.html | 0 .../structacc__breathing__handle__t.html | 0 .../structacc__breathing__result__t.html | 0 .../structacc__cal__info__t.html | 0 .../structacc__cal__result__t.html | 0 .../structacc__control__helper__t.html | 0 .../structacc__detector__distance__result__t.html | 0 .../structacc__detector__presence__metadata__t.html | 0 .../structacc__detector__presence__result__t.html | 0 .../structacc__hal__a121__t.html | 0 .../structacc__hal__optimization__t.html | 0 .../structacc__int16__complex__t.html | 0 .../structacc__processing__metadata__t.html | 0 .../structacc__processing__result__t.html | 0 ...ctacc__ref__app__smart__presence__config__t.html | 0 ...ef__app__smart__presence__wakeup__config__t.html | 0 ..._ref__app__smart__presence__zone__config__t.html | 0 ...structacc__ref__app__tank__level__config__t.html | 0 .../structacc__reg__protocol__t.html | 0 .../structacc__rss__assembly__test__result__t.html | 0 .../structacc__smart__presence__result__t.html | 0 ...structacc__smart__presence__zone__result__t.html | 0 .../structacc__surface__velocity__config__t.html | 0 .../structacc__surface__velocity__handle__t.html | 0 .../structacc__surface__velocity__result__t.html | 0 .../structacc__vector__float__t.html | 0 .../structacc__vector__iq__t.html | 0 .../structapp__context__t.html | 0 .../structapp__result__t.html | 0 .../structdistance__detector__resources__t.html | 0 .../structexample__config.html | 0 .../structexploration__server__interface__t.html | 0 .../structgpio__config__t.html | 0 .../structout__fct__wrap__type.html | 0 .../structpresence__detector__context__t.html | 0 .../structpresence__detector__resources__t.html | 0 .../structprint__buffer__t.html | 0 documents/{html => rss_api_html}/style.css | 0 documents/{html => rss_api_html}/sync_off.png | Bin documents/{html => rss_api_html}/sync_on.png | Bin documents/{html => rss_api_html}/syscalls_8c.html | 0 .../{html => rss_api_html}/syscalls_8c_source.html | 0 documents/{html => rss_api_html}/sysmem_8c.html | 0 .../{html => rss_api_html}/sysmem_8c_source.html | 0 documents/{html => rss_api_html}/tab_a.png | Bin documents/{html => rss_api_html}/tab_b.png | Bin documents/{html => rss_api_html}/tab_h.png | Bin documents/{html => rss_api_html}/tab_s.png | Bin documents/{html => rss_api_html}/tabs.css | 0 722 files changed, 1 insertion(+), 1 deletion(-) rename documents/{html => rss_api_html}/AcconeerLogo.png (100%) rename documents/{html => rss_api_html}/acc__alg__basic__utils_8h.html (100%) rename documents/{html => rss_api_html}/acc__alg__basic__utils_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__algorithm_8c.html (100%) rename documents/{html => rss_api_html}/acc__algorithm_8c_source.html (100%) rename documents/{html => rss_api_html}/acc__algorithm_8h.html (100%) rename documents/{html => rss_api_html}/acc__algorithm_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__config_8h.html (100%) rename documents/{html => rss_api_html}/acc__config_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__config__subsweep_8h.html (100%) rename documents/{html => rss_api_html}/acc__config__subsweep_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__control__helper_8c.html (100%) rename documents/{html => rss_api_html}/acc__control__helper_8c_source.html (100%) rename documents/{html => rss_api_html}/acc__control__helper_8h.html (100%) rename documents/{html => rss_api_html}/acc__control__helper_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__definitions__a121_8h.html (100%) rename documents/{html => rss_api_html}/acc__definitions__a121_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__definitions__common_8h.html (100%) rename documents/{html => rss_api_html}/acc__definitions__common_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__detector__distance_8h.html (100%) rename documents/{html => rss_api_html}/acc__detector__distance_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__detector__distance__definitions_8h.html (100%) rename documents/{html => rss_api_html}/acc__detector__distance__definitions_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__detector__presence_8h.html (100%) rename documents/{html => rss_api_html}/acc__detector__presence_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__exploration__server__base_8h.html (100%) rename documents/{html => rss_api_html}/acc__exploration__server__base_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__exploration__server__stm32_8c.html (100%) rename documents/{html => rss_api_html}/acc__exploration__server__stm32_8c_source.html (100%) rename documents/{html => rss_api_html}/acc__exploration__server__stm32_8h.html (100%) rename documents/{html => rss_api_html}/acc__exploration__server__stm32_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__hal__definitions__a121_8h.html (100%) rename documents/{html => rss_api_html}/acc__hal__definitions__a121_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__hal__integration__a121_8h.html (100%) rename documents/{html => rss_api_html}/acc__hal__integration__a121_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__hal__integration__stm32cube__xm_8c.html (100%) rename documents/{html => rss_api_html}/acc__hal__integration__stm32cube__xm_8c_source.html (100%) rename documents/{html => rss_api_html}/acc__integration_8h.html (100%) rename documents/{html => rss_api_html}/acc__integration_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__integration__cortex_8c.html (100%) rename documents/{html => rss_api_html}/acc__integration__cortex_8c_source.html (100%) rename documents/{html => rss_api_html}/acc__integration__log_8c.html (100%) rename documents/{html => rss_api_html}/acc__integration__log_8c_source.html (100%) rename documents/{html => rss_api_html}/acc__integration__log_8h.html (100%) rename documents/{html => rss_api_html}/acc__integration__log_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__integration__stm32_8c.html (100%) rename documents/{html => rss_api_html}/acc__integration__stm32_8c_source.html (100%) rename documents/{html => rss_api_html}/acc__processing_8h.html (100%) rename documents/{html => rss_api_html}/acc__processing_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__processing__helpers_8c.html (100%) rename documents/{html => rss_api_html}/acc__processing__helpers_8c_source.html (100%) rename documents/{html => rss_api_html}/acc__processing__helpers_8h.html (100%) rename documents/{html => rss_api_html}/acc__processing__helpers_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__reg__protocol_8c.html (100%) rename documents/{html => rss_api_html}/acc__reg__protocol_8c_source.html (100%) rename documents/{html => rss_api_html}/acc__reg__protocol_8h.html (100%) rename documents/{html => rss_api_html}/acc__reg__protocol_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__rss__a121_8h.html (100%) rename documents/{html => rss_api_html}/acc__rss__a121_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__sensor_8h.html (100%) rename documents/{html => rss_api_html}/acc__sensor_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__version_8h.html (100%) rename documents/{html => rss_api_html}/acc__version_8h_source.html (100%) rename documents/{html => rss_api_html}/acc__wrap__printf_8c.html (100%) rename documents/{html => rss_api_html}/acc__wrap__printf_8c_source.html (100%) rename documents/{html => rss_api_html}/acc_control_helper_8c-example.html (100%) rename documents/{html => rss_api_html}/acc_processing_helpers_8c-example.html (100%) rename documents/{html => rss_api_html}/annotated.html (100%) rename documents/{html => rss_api_html}/bc_s.png (100%) rename documents/{html => rss_api_html}/bdwn.png (100%) rename documents/{html => rss_api_html}/classes.html (100%) rename documents/{html => rss_api_html}/closed.png (100%) rename documents/{html => rss_api_html}/dir_04f2ecc425faf0d475a3caf484e551f3.html (100%) rename documents/{html => rss_api_html}/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html (100%) rename documents/{html => rss_api_html}/dir_073ccfab4bf11db73a8ee8eb161030da.html (100%) rename documents/{html => rss_api_html}/dir_08f02f6646c4dd9624ef093774b0b7f7.html (100%) rename documents/{html => rss_api_html}/dir_15c29f069e8c0144bc89b47ad62a396e.html (100%) rename documents/{html => rss_api_html}/dir_29751087315bdd66fec7ae73f3a3b3df.html (100%) rename documents/{html => rss_api_html}/dir_437c280191dc31797ff1fffcdbf26d60.html (100%) rename documents/{html => rss_api_html}/dir_5f3b126a0daad2440047e3d157f0734d.html (100%) rename documents/{html => rss_api_html}/dir_763f9730c6de1b6696aabb67bc8f2cb8.html (100%) rename documents/{html => rss_api_html}/dir_885ce7a5dfec3e0117d586c25f876c85.html (100%) rename documents/{html => rss_api_html}/dir_9037ad2fcf0acf58199e91c83d01aa83.html (100%) rename documents/{html => rss_api_html}/dir_90c50c4300347a3add62d58adc5f49d2.html (100%) rename documents/{html => rss_api_html}/dir_a90b80e01b24c51566f20c737761e66b.html (100%) rename documents/{html => rss_api_html}/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html (100%) rename documents/{html => rss_api_html}/dir_b3a0981508daed4f615eb509e7de909b.html (100%) rename documents/{html => rss_api_html}/dir_bc91f92db1b66e0df5b21c879d8024f8.html (100%) rename documents/{html => rss_api_html}/dir_e68e8157741866f444e17edd764ebbae.html (100%) rename documents/{html => rss_api_html}/dir_eabfdd4d73a10cf1a95f85f69b256a94.html (100%) rename documents/{html => rss_api_html}/distance__reg__protocol_8c.html (100%) rename documents/{html => rss_api_html}/distance__reg__protocol_8c_source.html (100%) rename documents/{html => rss_api_html}/distance__reg__protocol_8h.html (100%) rename documents/{html => rss_api_html}/distance__reg__protocol_8h_source.html (100%) rename documents/{html => rss_api_html}/distance__reg__protocol__access_8c.html (100%) rename documents/{html => rss_api_html}/distance__reg__protocol__access_8c_source.html (100%) rename documents/{html => rss_api_html}/doc.png (100%) rename documents/{html => rss_api_html}/doxygen.css (100%) rename documents/{html => rss_api_html}/doxygen.png (100%) rename documents/{html => rss_api_html}/dynsections.js (100%) rename documents/{html => rss_api_html}/example__bring__up_8c.html (100%) rename documents/{html => rss_api_html}/example__bring__up_8c_source.html (100%) rename documents/{html => rss_api_html}/example__bring__up_8h.html (100%) rename documents/{html => rss_api_html}/example__bring__up_8h_source.html (100%) rename documents/{html => rss_api_html}/example__control__helper_8c.html (100%) rename documents/{html => rss_api_html}/example__control__helper_8c_source.html (100%) rename documents/{html => rss_api_html}/example__control__helper_8h.html (100%) rename documents/{html => rss_api_html}/example__control__helper_8h_source.html (100%) rename documents/{html => rss_api_html}/example__detector__distance_8c.html (100%) rename documents/{html => rss_api_html}/example__detector__distance_8c_source.html (100%) rename documents/{html => rss_api_html}/example__detector__distance_8h.html (100%) rename documents/{html => rss_api_html}/example__detector__distance_8h_source.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__low__power__hibernate_8c.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__low__power__hibernate_8c_source.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__low__power__hibernate_8h.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__low__power__hibernate_8h_source.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__low__power__off_8c.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__low__power__off_8c_source.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__low__power__off_8h.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__low__power__off_8h_source.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__with__iq__data__print_8c.html (100%) rename documents/{html => rss_api_html}/example__detector__distance__with__iq__data__print_8c_source.html (100%) rename documents/{html => rss_api_html}/example__detector__presence_8c.html (100%) rename documents/{html => rss_api_html}/example__detector__presence_8c_source.html (100%) rename documents/{html => rss_api_html}/example__detector__presence_8h.html (100%) rename documents/{html => rss_api_html}/example__detector__presence_8h_source.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__low__power__hibernate_8c.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__low__power__hibernate_8c_source.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__low__power__hibernate_8h.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__low__power__hibernate_8h_source.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__low__power__off_8c.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__low__power__off_8c_source.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__low__power__off_8h.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__low__power__off_8h_source.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__multiple__configurations_8c.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__multiple__configurations_8c_source.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__multiple__configurations_8h.html (100%) rename documents/{html => rss_api_html}/example__detector__presence__multiple__configurations_8h_source.html (100%) rename documents/{html => rss_api_html}/example__diagnostic__test_8c.html (100%) rename documents/{html => rss_api_html}/example__diagnostic__test_8c_source.html (100%) rename documents/{html => rss_api_html}/example__diagnostic__test_8h.html (100%) rename documents/{html => rss_api_html}/example__diagnostic__test_8h_source.html (100%) rename documents/{html => rss_api_html}/example__processing__amplitude_8c.html (100%) rename documents/{html => rss_api_html}/example__processing__amplitude_8c_source.html (100%) rename documents/{html => rss_api_html}/example__processing__amplitude_8h.html (100%) rename documents/{html => rss_api_html}/example__processing__amplitude_8h_source.html (100%) rename documents/{html => rss_api_html}/example__processing__coherent__mean_8c.html (100%) rename documents/{html => rss_api_html}/example__processing__coherent__mean_8c_source.html (100%) rename documents/{html => rss_api_html}/example__processing__coherent__mean_8h.html (100%) rename documents/{html => rss_api_html}/example__processing__coherent__mean_8h_source.html (100%) rename documents/{html => rss_api_html}/example__processing__noncoherent__mean_8c.html (100%) rename documents/{html => rss_api_html}/example__processing__noncoherent__mean_8c_source.html (100%) rename documents/{html => rss_api_html}/example__processing__noncoherent__mean_8h.html (100%) rename documents/{html => rss_api_html}/example__processing__noncoherent__mean_8h_source.html (100%) rename documents/{html => rss_api_html}/example__processing__peak__interpolation_8c.html (100%) rename documents/{html => rss_api_html}/example__processing__peak__interpolation_8c_source.html (100%) rename documents/{html => rss_api_html}/example__processing__peak__interpolation_8h.html (100%) rename documents/{html => rss_api_html}/example__processing__peak__interpolation_8h_source.html (100%) rename documents/{html => rss_api_html}/example__processing__static__presence_8c.html (100%) rename documents/{html => rss_api_html}/example__processing__static__presence_8c_source.html (100%) rename documents/{html => rss_api_html}/example__processing__static__presence_8h.html (100%) rename documents/{html => rss_api_html}/example__processing__static__presence_8h_source.html (100%) rename documents/{html => rss_api_html}/example__processing__subtract__adaptive__bg_8c.html (100%) rename documents/{html => rss_api_html}/example__processing__subtract__adaptive__bg_8c_source.html (100%) rename documents/{html => rss_api_html}/example__processing__subtract__adaptive__bg_8h.html (100%) rename documents/{html => rss_api_html}/example__processing__subtract__adaptive__bg_8h_source.html (100%) rename documents/{html => rss_api_html}/example__service_8c.html (100%) rename documents/{html => rss_api_html}/example__service_8c_source.html (100%) rename documents/{html => rss_api_html}/example__service_8h.html (100%) rename documents/{html => rss_api_html}/example__service_8h_source.html (100%) rename documents/{html => rss_api_html}/example__service__low__power__sensor__disable_8c.html (100%) rename documents/{html => rss_api_html}/example__service__low__power__sensor__disable_8c_source.html (100%) rename documents/{html => rss_api_html}/example__service__low__power__sensor__disable_8h.html (100%) rename documents/{html => rss_api_html}/example__service__low__power__sensor__disable_8h_source.html (100%) rename documents/{html => rss_api_html}/example__service__low__power__sensor__hibernate_8c.html (100%) rename documents/{html => rss_api_html}/example__service__low__power__sensor__hibernate_8c_source.html (100%) rename documents/{html => rss_api_html}/example__service__low__power__sensor__hibernate_8h.html (100%) rename documents/{html => rss_api_html}/example__service__low__power__sensor__hibernate_8h_source.html (100%) rename documents/{html => rss_api_html}/example__service__multiple__configurations_8c.html (100%) rename documents/{html => rss_api_html}/example__service__multiple__configurations_8c_source.html (100%) rename documents/{html => rss_api_html}/example__service__multiple__configurations_8h.html (100%) rename documents/{html => rss_api_html}/example__service__multiple__configurations_8h_source.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__disable_8c.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__disable_8c_source.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__disable_8h.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__disable_8h_source.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__hibernate_8c.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__hibernate_8c_source.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__hibernate_8h.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__hibernate_8h_source.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__off_8c.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__off_8c_source.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__off_8h.html (100%) rename documents/{html => rss_api_html}/example__service__sensor__off_8h_source.html (100%) rename documents/{html => rss_api_html}/example__service__subsweeps_8c.html (100%) rename documents/{html => rss_api_html}/example__service__subsweeps_8c_source.html (100%) rename documents/{html => rss_api_html}/example__service__subsweeps_8h.html (100%) rename documents/{html => rss_api_html}/example__service__subsweeps_8h_source.html (100%) rename documents/{html => rss_api_html}/example__surface__velocity_8c.html (100%) rename documents/{html => rss_api_html}/example__surface__velocity_8c_source.html (100%) rename documents/{html => rss_api_html}/example__surface__velocity_8h.html (100%) rename documents/{html => rss_api_html}/example__surface__velocity_8h_source.html (100%) rename documents/{html => rss_api_html}/example_bring_up_8c-example.html (100%) rename documents/{html => rss_api_html}/example_control_helper_8c-example.html (100%) rename documents/{html => rss_api_html}/example_detector_distance_8c-example.html (100%) rename documents/{html => rss_api_html}/example_detector_distance_low_power_hibernate_8c-example.html (100%) rename documents/{html => rss_api_html}/example_detector_distance_low_power_off_8c-example.html (100%) rename documents/{html => rss_api_html}/example_detector_distance_with_iq_data_print_8c-example.html (100%) rename documents/{html => rss_api_html}/example_detector_presence_8c-example.html (100%) rename documents/{html => rss_api_html}/example_detector_presence_low_power_hibernate_8c-example.html (100%) rename documents/{html => rss_api_html}/example_detector_presence_low_power_off_8c-example.html (100%) rename documents/{html => rss_api_html}/example_detector_presence_multiple_configurations_8c-example.html (100%) rename documents/{html => rss_api_html}/example_diagnostic_test_8c-example.html (100%) rename documents/{html => rss_api_html}/example_processing_amplitude_8c-example.html (100%) rename documents/{html => rss_api_html}/example_processing_coherent_mean_8c-example.html (100%) rename documents/{html => rss_api_html}/example_processing_noncoherent_mean_8c-example.html (100%) rename documents/{html => rss_api_html}/example_processing_peak_interpolation_8c-example.html (100%) rename documents/{html => rss_api_html}/example_processing_static_presence_8c-example.html (100%) rename documents/{html => rss_api_html}/example_processing_subtract_adaptive_bg_8c-example.html (100%) rename documents/{html => rss_api_html}/example_service_8c-example.html (100%) rename documents/{html => rss_api_html}/example_service_low_power_sensor_disable_8c-example.html (100%) rename documents/{html => rss_api_html}/example_service_low_power_sensor_hibernate_8c-example.html (100%) rename documents/{html => rss_api_html}/example_service_multiple_configurations_8c-example.html (100%) rename documents/{html => rss_api_html}/example_service_sensor_disable_8c-example.html (100%) rename documents/{html => rss_api_html}/example_service_sensor_hibernate_8c-example.html (100%) rename documents/{html => rss_api_html}/example_service_sensor_off_8c-example.html (100%) rename documents/{html => rss_api_html}/example_service_subsweeps_8c-example.html (100%) rename documents/{html => rss_api_html}/examples.html (100%) rename documents/{html => rss_api_html}/examples.js (100%) rename documents/{html => rss_api_html}/files.html (100%) rename documents/{html => rss_api_html}/folderclosed.png (100%) rename documents/{html => rss_api_html}/folderopen.png (100%) rename documents/{html => rss_api_html}/functions.html (100%) rename documents/{html => rss_api_html}/functions_b.html (100%) rename documents/{html => rss_api_html}/functions_c.html (100%) rename documents/{html => rss_api_html}/functions_d.html (100%) rename documents/{html => rss_api_html}/functions_e.html (100%) rename documents/{html => rss_api_html}/functions_f.html (100%) rename documents/{html => rss_api_html}/functions_g.html (100%) rename documents/{html => rss_api_html}/functions_h.html (100%) rename documents/{html => rss_api_html}/functions_i.html (100%) rename documents/{html => rss_api_html}/functions_l.html (100%) rename documents/{html => rss_api_html}/functions_m.html (100%) rename documents/{html => rss_api_html}/functions_n.html (100%) rename documents/{html => rss_api_html}/functions_o.html (100%) rename documents/{html => rss_api_html}/functions_p.html (100%) rename documents/{html => rss_api_html}/functions_r.html (100%) rename documents/{html => rss_api_html}/functions_s.html (100%) rename documents/{html => rss_api_html}/functions_t.html (100%) rename documents/{html => rss_api_html}/functions_u.html (100%) rename documents/{html => rss_api_html}/functions_v.html (100%) rename documents/{html => rss_api_html}/functions_vars.html (100%) rename documents/{html => rss_api_html}/functions_vars_b.html (100%) rename documents/{html => rss_api_html}/functions_vars_c.html (100%) rename documents/{html => rss_api_html}/functions_vars_d.html (100%) rename documents/{html => rss_api_html}/functions_vars_e.html (100%) rename documents/{html => rss_api_html}/functions_vars_f.html (100%) rename documents/{html => rss_api_html}/functions_vars_g.html (100%) rename documents/{html => rss_api_html}/functions_vars_h.html (100%) rename documents/{html => rss_api_html}/functions_vars_i.html (100%) rename documents/{html => rss_api_html}/functions_vars_l.html (100%) rename documents/{html => rss_api_html}/functions_vars_m.html (100%) rename documents/{html => rss_api_html}/functions_vars_n.html (100%) rename documents/{html => rss_api_html}/functions_vars_o.html (100%) rename documents/{html => rss_api_html}/functions_vars_p.html (100%) rename documents/{html => rss_api_html}/functions_vars_r.html (100%) rename documents/{html => rss_api_html}/functions_vars_s.html (100%) rename documents/{html => rss_api_html}/functions_vars_t.html (100%) rename documents/{html => rss_api_html}/functions_vars_u.html (100%) rename documents/{html => rss_api_html}/functions_vars_v.html (100%) rename documents/{html => rss_api_html}/functions_vars_w.html (100%) rename documents/{html => rss_api_html}/functions_vars_z.html (100%) rename documents/{html => rss_api_html}/functions_w.html (100%) rename documents/{html => rss_api_html}/functions_z.html (100%) rename documents/{html => rss_api_html}/globals.html (100%) rename documents/{html => rss_api_html}/globals_a.html (100%) rename documents/{html => rss_api_html}/globals_b.html (100%) rename documents/{html => rss_api_html}/globals_c.html (100%) rename documents/{html => rss_api_html}/globals_d.html (100%) rename documents/{html => rss_api_html}/globals_defs.html (100%) rename documents/{html => rss_api_html}/globals_defs_b.html (100%) rename documents/{html => rss_api_html}/globals_defs_c.html (100%) rename documents/{html => rss_api_html}/globals_defs_d.html (100%) rename documents/{html => rss_api_html}/globals_defs_e.html (100%) rename documents/{html => rss_api_html}/globals_defs_f.html (100%) rename documents/{html => rss_api_html}/globals_defs_g.html (100%) rename documents/{html => rss_api_html}/globals_defs_h.html (100%) rename documents/{html => rss_api_html}/globals_defs_i.html (100%) rename documents/{html => rss_api_html}/globals_defs_l.html (100%) rename documents/{html => rss_api_html}/globals_defs_m.html (100%) rename documents/{html => rss_api_html}/globals_defs_n.html (100%) rename documents/{html => rss_api_html}/globals_defs_p.html (100%) rename documents/{html => rss_api_html}/globals_defs_r.html (100%) rename documents/{html => rss_api_html}/globals_defs_s.html (100%) rename documents/{html => rss_api_html}/globals_defs_t.html (100%) rename documents/{html => rss_api_html}/globals_defs_u.html (100%) rename documents/{html => rss_api_html}/globals_defs_v.html (100%) rename documents/{html => rss_api_html}/globals_defs_w.html (100%) rename documents/{html => rss_api_html}/globals_e.html (100%) rename documents/{html => rss_api_html}/globals_enum.html (100%) rename documents/{html => rss_api_html}/globals_eval.html (100%) rename documents/{html => rss_api_html}/globals_f.html (100%) rename documents/{html => rss_api_html}/globals_func.html (100%) rename documents/{html => rss_api_html}/globals_func_a.html (100%) rename documents/{html => rss_api_html}/globals_func_b.html (100%) rename documents/{html => rss_api_html}/globals_func_c.html (100%) rename documents/{html => rss_api_html}/globals_func_d.html (100%) rename documents/{html => rss_api_html}/globals_func_e.html (100%) rename documents/{html => rss_api_html}/globals_func_f.html (100%) rename documents/{html => rss_api_html}/globals_func_g.html (100%) rename documents/{html => rss_api_html}/globals_func_h.html (100%) rename documents/{html => rss_api_html}/globals_func_i.html (100%) rename documents/{html => rss_api_html}/globals_func_m.html (100%) rename documents/{html => rss_api_html}/globals_func_n.html (100%) rename documents/{html => rss_api_html}/globals_func_o.html (100%) rename documents/{html => rss_api_html}/globals_func_p.html (100%) rename documents/{html => rss_api_html}/globals_func_r.html (100%) rename documents/{html => rss_api_html}/globals_func_s.html (100%) rename documents/{html => rss_api_html}/globals_func_u.html (100%) rename documents/{html => rss_api_html}/globals_func_v.html (100%) rename documents/{html => rss_api_html}/globals_func_w.html (100%) rename documents/{html => rss_api_html}/globals_g.html (100%) rename documents/{html => rss_api_html}/globals_h.html (100%) rename documents/{html => rss_api_html}/globals_i.html (100%) rename documents/{html => rss_api_html}/globals_l.html (100%) rename documents/{html => rss_api_html}/globals_m.html (100%) rename documents/{html => rss_api_html}/globals_n.html (100%) rename documents/{html => rss_api_html}/globals_o.html (100%) rename documents/{html => rss_api_html}/globals_p.html (100%) rename documents/{html => rss_api_html}/globals_r.html (100%) rename documents/{html => rss_api_html}/globals_s.html (100%) rename documents/{html => rss_api_html}/globals_t.html (100%) rename documents/{html => rss_api_html}/globals_type.html (100%) rename documents/{html => rss_api_html}/globals_u.html (100%) rename documents/{html => rss_api_html}/globals_v.html (100%) rename documents/{html => rss_api_html}/globals_vars.html (100%) rename documents/{html => rss_api_html}/globals_w.html (100%) rename documents/{html => rss_api_html}/group__Distance.html (100%) rename documents/{html => rss_api_html}/group__Distance.js (100%) rename documents/{html => rss_api_html}/group__Presence.html (100%) rename documents/{html => rss_api_html}/group__Presence.js (100%) rename documents/{html => rss_api_html}/group__config.html (100%) rename documents/{html => rss_api_html}/group__config.js (100%) rename documents/{html => rss_api_html}/group__processing.html (100%) rename documents/{html => rss_api_html}/group__processing.js (100%) rename documents/{html => rss_api_html}/group__rss.html (100%) rename documents/{html => rss_api_html}/group__rss.js (100%) rename documents/{html => rss_api_html}/group__sensor.html (100%) rename documents/{html => rss_api_html}/group__sensor.js (100%) rename documents/{html => rss_api_html}/group__service.html (100%) rename documents/{html => rss_api_html}/group__service.js (100%) rename documents/{html => rss_api_html}/group__subsweep.html (100%) rename documents/{html => rss_api_html}/group__subsweep.js (100%) rename documents/{html => rss_api_html}/i2c__application__system_8h.html (100%) rename documents/{html => rss_api_html}/i2c__application__system_8h_source.html (100%) rename documents/{html => rss_api_html}/i2c__application__system__stm32_8c.html (100%) rename documents/{html => rss_api_html}/i2c__application__system__stm32_8c_source.html (100%) rename documents/{html => rss_api_html}/i2c__distance__detector_8c.html (100%) rename documents/{html => rss_api_html}/i2c__distance__detector_8c_source.html (100%) rename documents/{html => rss_api_html}/i2c__distance__detector_8h.html (100%) rename documents/{html => rss_api_html}/i2c__distance__detector_8h_source.html (100%) rename documents/{html => rss_api_html}/i2c__presence__detector_8c.html (100%) rename documents/{html => rss_api_html}/i2c__presence__detector_8c_source.html (100%) rename documents/{html => rss_api_html}/i2c__presence__detector_8h.html (100%) rename documents/{html => rss_api_html}/i2c__presence__detector_8h_source.html (100%) rename documents/{html => rss_api_html}/index.html (100%) rename documents/{html => rss_api_html}/intro_8md.html (100%) rename documents/{html => rss_api_html}/jquery.js (100%) rename documents/{html => rss_api_html}/main_8h.html (100%) rename documents/{html => rss_api_html}/main_8h_source.html (100%) rename documents/{html => rss_api_html}/menu.js (100%) rename documents/{html => rss_api_html}/menudata.js (100%) rename documents/{html => rss_api_html}/modules.html (100%) rename documents/{html => rss_api_html}/modules.js (100%) rename documents/{html => rss_api_html}/nav_f.png (100%) rename documents/{html => rss_api_html}/nav_g.png (100%) rename documents/{html => rss_api_html}/nav_h.png (100%) rename documents/{html => rss_api_html}/navtree.css (100%) rename documents/{html => rss_api_html}/navtree.js (100%) rename documents/{html => rss_api_html}/navtreedata.js (100%) rename documents/{html => rss_api_html}/navtreeindex0.js (100%) rename documents/{html => rss_api_html}/navtreeindex1.js (100%) rename documents/{html => rss_api_html}/open.png (100%) rename documents/{html => rss_api_html}/presence__reg__protocol_8c.html (100%) rename documents/{html => rss_api_html}/presence__reg__protocol_8c_source.html (100%) rename documents/{html => rss_api_html}/presence__reg__protocol_8h.html (100%) rename documents/{html => rss_api_html}/presence__reg__protocol_8h_source.html (100%) rename documents/{html => rss_api_html}/presence__reg__protocol__access_8c.html (100%) rename documents/{html => rss_api_html}/presence__reg__protocol__access_8c_source.html (100%) rename documents/{html => rss_api_html}/printf_8c.html (100%) rename documents/{html => rss_api_html}/printf_8c_source.html (100%) rename documents/{html => rss_api_html}/printf_8h.html (100%) rename documents/{html => rss_api_html}/printf_8h_source.html (100%) rename documents/{html => rss_api_html}/ref__app__breathing_8c.html (100%) rename documents/{html => rss_api_html}/ref__app__breathing_8c_source.html (100%) rename documents/{html => rss_api_html}/ref__app__breathing_8h.html (100%) rename documents/{html => rss_api_html}/ref__app__breathing_8h_source.html (100%) rename documents/{html => rss_api_html}/ref__app__smart__presence_8c.html (100%) rename documents/{html => rss_api_html}/ref__app__smart__presence_8c_source.html (100%) rename documents/{html => rss_api_html}/ref__app__smart__presence_8h.html (100%) rename documents/{html => rss_api_html}/ref__app__smart__presence_8h_source.html (100%) rename documents/{html => rss_api_html}/ref__app__tank__level_8c.html (100%) rename documents/{html => rss_api_html}/ref__app__tank__level_8c_source.html (100%) rename documents/{html => rss_api_html}/ref__app__tank__level_8h.html (100%) rename documents/{html => rss_api_html}/ref__app__tank__level_8h_source.html (100%) rename documents/{html => rss_api_html}/ref_app_tank_level_8c-example.html (100%) rename documents/{html => rss_api_html}/resize.js (100%) rename documents/{html => rss_api_html}/search/all_0.html (100%) rename documents/{html => rss_api_html}/search/all_0.js (100%) rename documents/{html => rss_api_html}/search/all_1.html (100%) rename documents/{html => rss_api_html}/search/all_1.js (100%) rename documents/{html => rss_api_html}/search/all_10.html (100%) rename documents/{html => rss_api_html}/search/all_10.js (100%) rename documents/{html => rss_api_html}/search/all_11.html (100%) rename documents/{html => rss_api_html}/search/all_11.js (100%) rename documents/{html => rss_api_html}/search/all_12.html (100%) rename documents/{html => rss_api_html}/search/all_12.js (100%) rename documents/{html => rss_api_html}/search/all_13.html (100%) rename documents/{html => rss_api_html}/search/all_13.js (100%) rename documents/{html => rss_api_html}/search/all_14.html (100%) rename documents/{html => rss_api_html}/search/all_14.js (100%) rename documents/{html => rss_api_html}/search/all_15.html (100%) rename documents/{html => rss_api_html}/search/all_15.js (100%) rename documents/{html => rss_api_html}/search/all_2.html (100%) rename documents/{html => rss_api_html}/search/all_2.js (100%) rename documents/{html => rss_api_html}/search/all_3.html (100%) rename documents/{html => rss_api_html}/search/all_3.js (100%) rename documents/{html => rss_api_html}/search/all_4.html (100%) rename documents/{html => rss_api_html}/search/all_4.js (100%) rename documents/{html => rss_api_html}/search/all_5.html (100%) rename documents/{html => rss_api_html}/search/all_5.js (100%) rename documents/{html => rss_api_html}/search/all_6.html (100%) rename documents/{html => rss_api_html}/search/all_6.js (100%) rename documents/{html => rss_api_html}/search/all_7.html (100%) rename documents/{html => rss_api_html}/search/all_7.js (100%) rename documents/{html => rss_api_html}/search/all_8.html (100%) rename documents/{html => rss_api_html}/search/all_8.js (100%) rename documents/{html => rss_api_html}/search/all_9.html (100%) rename documents/{html => rss_api_html}/search/all_9.js (100%) rename documents/{html => rss_api_html}/search/all_a.html (100%) rename documents/{html => rss_api_html}/search/all_a.js (100%) rename documents/{html => rss_api_html}/search/all_b.html (100%) rename documents/{html => rss_api_html}/search/all_b.js (100%) rename documents/{html => rss_api_html}/search/all_c.html (100%) rename documents/{html => rss_api_html}/search/all_c.js (100%) rename documents/{html => rss_api_html}/search/all_d.html (100%) rename documents/{html => rss_api_html}/search/all_d.js (100%) rename documents/{html => rss_api_html}/search/all_e.html (100%) rename documents/{html => rss_api_html}/search/all_e.js (100%) rename documents/{html => rss_api_html}/search/all_f.html (100%) rename documents/{html => rss_api_html}/search/all_f.js (100%) rename documents/{html => rss_api_html}/search/classes_0.html (100%) rename documents/{html => rss_api_html}/search/classes_0.js (100%) rename documents/{html => rss_api_html}/search/classes_1.html (100%) rename documents/{html => rss_api_html}/search/classes_1.js (100%) rename documents/{html => rss_api_html}/search/classes_2.html (100%) rename documents/{html => rss_api_html}/search/classes_2.js (100%) rename documents/{html => rss_api_html}/search/classes_3.html (100%) rename documents/{html => rss_api_html}/search/classes_3.js (100%) rename documents/{html => rss_api_html}/search/classes_4.html (100%) rename documents/{html => rss_api_html}/search/classes_4.js (100%) rename documents/{html => rss_api_html}/search/classes_5.html (100%) rename documents/{html => rss_api_html}/search/classes_5.js (100%) rename documents/{html => rss_api_html}/search/close.png (100%) rename documents/{html => rss_api_html}/search/defines_0.html (100%) rename documents/{html => rss_api_html}/search/defines_0.js (100%) rename documents/{html => rss_api_html}/search/defines_1.html (100%) rename documents/{html => rss_api_html}/search/defines_1.js (100%) rename documents/{html => rss_api_html}/search/defines_10.html (100%) rename documents/{html => rss_api_html}/search/defines_10.js (100%) rename documents/{html => rss_api_html}/search/defines_11.html (100%) rename documents/{html => rss_api_html}/search/defines_11.js (100%) rename documents/{html => rss_api_html}/search/defines_12.html (100%) rename documents/{html => rss_api_html}/search/defines_12.js (100%) rename documents/{html => rss_api_html}/search/defines_2.html (100%) rename documents/{html => rss_api_html}/search/defines_2.js (100%) rename documents/{html => rss_api_html}/search/defines_3.html (100%) rename documents/{html => rss_api_html}/search/defines_3.js (100%) rename documents/{html => rss_api_html}/search/defines_4.html (100%) rename documents/{html => rss_api_html}/search/defines_4.js (100%) rename documents/{html => rss_api_html}/search/defines_5.html (100%) rename documents/{html => rss_api_html}/search/defines_5.js (100%) rename documents/{html => rss_api_html}/search/defines_6.html (100%) rename documents/{html => rss_api_html}/search/defines_6.js (100%) rename documents/{html => rss_api_html}/search/defines_7.html (100%) rename documents/{html => rss_api_html}/search/defines_7.js (100%) rename documents/{html => rss_api_html}/search/defines_8.html (100%) rename documents/{html => rss_api_html}/search/defines_8.js (100%) rename documents/{html => rss_api_html}/search/defines_9.html (100%) rename documents/{html => rss_api_html}/search/defines_9.js (100%) rename documents/{html => rss_api_html}/search/defines_a.html (100%) rename documents/{html => rss_api_html}/search/defines_a.js (100%) rename documents/{html => rss_api_html}/search/defines_b.html (100%) rename documents/{html => rss_api_html}/search/defines_b.js (100%) rename documents/{html => rss_api_html}/search/defines_c.html (100%) rename documents/{html => rss_api_html}/search/defines_c.js (100%) rename documents/{html => rss_api_html}/search/defines_d.html (100%) rename documents/{html => rss_api_html}/search/defines_d.js (100%) rename documents/{html => rss_api_html}/search/defines_e.html (100%) rename documents/{html => rss_api_html}/search/defines_e.js (100%) rename documents/{html => rss_api_html}/search/defines_f.html (100%) rename documents/{html => rss_api_html}/search/defines_f.js (100%) rename documents/{html => rss_api_html}/search/enums_0.html (100%) rename documents/{html => rss_api_html}/search/enums_0.js (100%) rename documents/{html => rss_api_html}/search/enums_1.html (100%) rename documents/{html => rss_api_html}/search/enums_1.js (100%) rename documents/{html => rss_api_html}/search/enums_2.html (100%) rename documents/{html => rss_api_html}/search/enums_2.js (100%) rename documents/{html => rss_api_html}/search/enums_3.html (100%) rename documents/{html => rss_api_html}/search/enums_3.js (100%) rename documents/{html => rss_api_html}/search/enums_4.html (100%) rename documents/{html => rss_api_html}/search/enums_4.js (100%) rename documents/{html => rss_api_html}/search/enums_5.html (100%) rename documents/{html => rss_api_html}/search/enums_5.js (100%) rename documents/{html => rss_api_html}/search/enumvalues_0.html (100%) rename documents/{html => rss_api_html}/search/enumvalues_0.js (100%) rename documents/{html => rss_api_html}/search/enumvalues_1.html (100%) rename documents/{html => rss_api_html}/search/enumvalues_1.js (100%) rename documents/{html => rss_api_html}/search/enumvalues_2.html (100%) rename documents/{html => rss_api_html}/search/enumvalues_2.js (100%) rename documents/{html => rss_api_html}/search/enumvalues_3.html (100%) rename documents/{html => rss_api_html}/search/enumvalues_3.js (100%) rename documents/{html => rss_api_html}/search/enumvalues_4.html (100%) rename documents/{html => rss_api_html}/search/enumvalues_4.js (100%) rename documents/{html => rss_api_html}/search/enumvalues_5.html (100%) rename documents/{html => rss_api_html}/search/enumvalues_5.js (100%) rename documents/{html => rss_api_html}/search/enumvalues_6.html (100%) rename documents/{html => rss_api_html}/search/enumvalues_6.js (100%) rename documents/{html => rss_api_html}/search/files_0.html (100%) rename documents/{html => rss_api_html}/search/files_0.js (100%) rename documents/{html => rss_api_html}/search/files_1.html (100%) rename documents/{html => rss_api_html}/search/files_1.js (100%) rename documents/{html => rss_api_html}/search/files_2.html (100%) rename documents/{html => rss_api_html}/search/files_2.js (100%) rename documents/{html => rss_api_html}/search/files_3.html (100%) rename documents/{html => rss_api_html}/search/files_3.js (100%) rename documents/{html => rss_api_html}/search/files_4.html (100%) rename documents/{html => rss_api_html}/search/files_4.js (100%) rename documents/{html => rss_api_html}/search/files_5.html (100%) rename documents/{html => rss_api_html}/search/files_5.js (100%) rename documents/{html => rss_api_html}/search/files_6.html (100%) rename documents/{html => rss_api_html}/search/files_6.js (100%) rename documents/{html => rss_api_html}/search/files_7.html (100%) rename documents/{html => rss_api_html}/search/files_7.js (100%) rename documents/{html => rss_api_html}/search/functions_0.html (100%) rename documents/{html => rss_api_html}/search/functions_0.js (100%) rename documents/{html => rss_api_html}/search/functions_1.html (100%) rename documents/{html => rss_api_html}/search/functions_1.js (100%) rename documents/{html => rss_api_html}/search/functions_10.html (100%) rename documents/{html => rss_api_html}/search/functions_10.js (100%) rename documents/{html => rss_api_html}/search/functions_11.html (100%) rename documents/{html => rss_api_html}/search/functions_11.js (100%) rename documents/{html => rss_api_html}/search/functions_12.html (100%) rename documents/{html => rss_api_html}/search/functions_12.js (100%) rename documents/{html => rss_api_html}/search/functions_2.html (100%) rename documents/{html => rss_api_html}/search/functions_2.js (100%) rename documents/{html => rss_api_html}/search/functions_3.html (100%) rename documents/{html => rss_api_html}/search/functions_3.js (100%) rename documents/{html => rss_api_html}/search/functions_4.html (100%) rename documents/{html => rss_api_html}/search/functions_4.js (100%) rename documents/{html => rss_api_html}/search/functions_5.html (100%) rename documents/{html => rss_api_html}/search/functions_5.js (100%) rename documents/{html => rss_api_html}/search/functions_6.html (100%) rename documents/{html => rss_api_html}/search/functions_6.js (100%) rename documents/{html => rss_api_html}/search/functions_7.html (100%) rename documents/{html => rss_api_html}/search/functions_7.js (100%) rename documents/{html => rss_api_html}/search/functions_8.html (100%) rename documents/{html => rss_api_html}/search/functions_8.js (100%) rename documents/{html => rss_api_html}/search/functions_9.html (100%) rename documents/{html => rss_api_html}/search/functions_9.js (100%) rename documents/{html => rss_api_html}/search/functions_a.html (100%) rename documents/{html => rss_api_html}/search/functions_a.js (100%) rename documents/{html => rss_api_html}/search/functions_b.html (100%) rename documents/{html => rss_api_html}/search/functions_b.js (100%) rename documents/{html => rss_api_html}/search/functions_c.html (100%) rename documents/{html => rss_api_html}/search/functions_c.js (100%) rename documents/{html => rss_api_html}/search/functions_d.html (100%) rename documents/{html => rss_api_html}/search/functions_d.js (100%) rename documents/{html => rss_api_html}/search/functions_e.html (100%) rename documents/{html => rss_api_html}/search/functions_e.js (100%) rename documents/{html => rss_api_html}/search/functions_f.html (100%) rename documents/{html => rss_api_html}/search/functions_f.js (100%) rename documents/{html => rss_api_html}/search/groups_0.html (100%) rename documents/{html => rss_api_html}/search/groups_0.js (100%) rename documents/{html => rss_api_html}/search/groups_1.html (100%) rename documents/{html => rss_api_html}/search/groups_1.js (100%) rename documents/{html => rss_api_html}/search/groups_2.html (100%) rename documents/{html => rss_api_html}/search/groups_2.js (100%) rename documents/{html => rss_api_html}/search/groups_3.html (100%) rename documents/{html => rss_api_html}/search/groups_3.js (100%) rename documents/{html => rss_api_html}/search/groups_4.html (100%) rename documents/{html => rss_api_html}/search/groups_4.js (100%) rename documents/{html => rss_api_html}/search/mag_sel.png (100%) rename documents/{html => rss_api_html}/search/nomatches.html (100%) rename documents/{html => rss_api_html}/search/search.css (100%) rename documents/{html => rss_api_html}/search/search.js (100%) rename documents/{html => rss_api_html}/search/search_l.png (100%) rename documents/{html => rss_api_html}/search/search_m.png (100%) rename documents/{html => rss_api_html}/search/search_r.png (100%) rename documents/{html => rss_api_html}/search/searchdata.js (100%) rename documents/{html => rss_api_html}/search/typedefs_0.html (100%) rename documents/{html => rss_api_html}/search/typedefs_0.js (100%) rename documents/{html => rss_api_html}/search/typedefs_1.html (100%) rename documents/{html => rss_api_html}/search/typedefs_1.js (100%) rename documents/{html => rss_api_html}/search/typedefs_2.html (100%) rename documents/{html => rss_api_html}/search/typedefs_2.js (100%) rename documents/{html => rss_api_html}/search/typedefs_3.html (100%) rename documents/{html => rss_api_html}/search/typedefs_3.js (100%) rename documents/{html => rss_api_html}/search/typedefs_4.html (100%) rename documents/{html => rss_api_html}/search/typedefs_4.js (100%) rename documents/{html => rss_api_html}/search/typedefs_5.html (100%) rename documents/{html => rss_api_html}/search/typedefs_5.js (100%) rename documents/{html => rss_api_html}/search/typedefs_6.html (100%) rename documents/{html => rss_api_html}/search/typedefs_6.js (100%) rename documents/{html => rss_api_html}/search/variables_0.html (100%) rename documents/{html => rss_api_html}/search/variables_0.js (100%) rename documents/{html => rss_api_html}/search/variables_1.html (100%) rename documents/{html => rss_api_html}/search/variables_1.js (100%) rename documents/{html => rss_api_html}/search/variables_10.html (100%) rename documents/{html => rss_api_html}/search/variables_10.js (100%) rename documents/{html => rss_api_html}/search/variables_11.html (100%) rename documents/{html => rss_api_html}/search/variables_11.js (100%) rename documents/{html => rss_api_html}/search/variables_12.html (100%) rename documents/{html => rss_api_html}/search/variables_12.js (100%) rename documents/{html => rss_api_html}/search/variables_13.html (100%) rename documents/{html => rss_api_html}/search/variables_13.js (100%) rename documents/{html => rss_api_html}/search/variables_14.html (100%) rename documents/{html => rss_api_html}/search/variables_14.js (100%) rename documents/{html => rss_api_html}/search/variables_15.html (100%) rename documents/{html => rss_api_html}/search/variables_15.js (100%) rename documents/{html => rss_api_html}/search/variables_2.html (100%) rename documents/{html => rss_api_html}/search/variables_2.js (100%) rename documents/{html => rss_api_html}/search/variables_3.html (100%) rename documents/{html => rss_api_html}/search/variables_3.js (100%) rename documents/{html => rss_api_html}/search/variables_4.html (100%) rename documents/{html => rss_api_html}/search/variables_4.js (100%) rename documents/{html => rss_api_html}/search/variables_5.html (100%) rename documents/{html => rss_api_html}/search/variables_5.js (100%) rename documents/{html => rss_api_html}/search/variables_6.html (100%) rename documents/{html => rss_api_html}/search/variables_6.js (100%) rename documents/{html => rss_api_html}/search/variables_7.html (100%) rename documents/{html => rss_api_html}/search/variables_7.js (100%) rename documents/{html => rss_api_html}/search/variables_8.html (100%) rename documents/{html => rss_api_html}/search/variables_8.js (100%) rename documents/{html => rss_api_html}/search/variables_9.html (100%) rename documents/{html => rss_api_html}/search/variables_9.js (100%) rename documents/{html => rss_api_html}/search/variables_a.html (100%) rename documents/{html => rss_api_html}/search/variables_a.js (100%) rename documents/{html => rss_api_html}/search/variables_b.html (100%) rename documents/{html => rss_api_html}/search/variables_b.js (100%) rename documents/{html => rss_api_html}/search/variables_c.html (100%) rename documents/{html => rss_api_html}/search/variables_c.js (100%) rename documents/{html => rss_api_html}/search/variables_d.html (100%) rename documents/{html => rss_api_html}/search/variables_d.js (100%) rename documents/{html => rss_api_html}/search/variables_e.html (100%) rename documents/{html => rss_api_html}/search/variables_e.js (100%) rename documents/{html => rss_api_html}/search/variables_f.html (100%) rename documents/{html => rss_api_html}/search/variables_f.js (100%) rename documents/{html => rss_api_html}/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot (100%) rename documents/{html => rss_api_html}/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg (100%) rename documents/{html => rss_api_html}/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf (100%) rename documents/{html => rss_api_html}/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff (100%) rename documents/{html => rss_api_html}/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 (100%) rename documents/{html => rss_api_html}/splitbar.png (100%) rename documents/{html => rss_api_html}/stm32l4xx__hal__conf_8h.html (100%) rename documents/{html => rss_api_html}/stm32l4xx__hal__conf_8h_source.html (100%) rename documents/{html => rss_api_html}/stm32l4xx__hal__msp_8c.html (100%) rename documents/{html => rss_api_html}/stm32l4xx__hal__msp_8c_source.html (100%) rename documents/{html => rss_api_html}/stm32l4xx__it_8c.html (100%) rename documents/{html => rss_api_html}/stm32l4xx__it_8c_source.html (100%) rename documents/{html => rss_api_html}/stm32l4xx__it_8h.html (100%) rename documents/{html => rss_api_html}/stm32l4xx__it_8h_source.html (100%) rename documents/{html => rss_api_html}/structacc__breathing__config__t.html (100%) rename documents/{html => rss_api_html}/structacc__breathing__handle__t.html (100%) rename documents/{html => rss_api_html}/structacc__breathing__result__t.html (100%) rename documents/{html => rss_api_html}/structacc__cal__info__t.html (100%) rename documents/{html => rss_api_html}/structacc__cal__result__t.html (100%) rename documents/{html => rss_api_html}/structacc__control__helper__t.html (100%) rename documents/{html => rss_api_html}/structacc__detector__distance__result__t.html (100%) rename documents/{html => rss_api_html}/structacc__detector__presence__metadata__t.html (100%) rename documents/{html => rss_api_html}/structacc__detector__presence__result__t.html (100%) rename documents/{html => rss_api_html}/structacc__hal__a121__t.html (100%) rename documents/{html => rss_api_html}/structacc__hal__optimization__t.html (100%) rename documents/{html => rss_api_html}/structacc__int16__complex__t.html (100%) rename documents/{html => rss_api_html}/structacc__processing__metadata__t.html (100%) rename documents/{html => rss_api_html}/structacc__processing__result__t.html (100%) rename documents/{html => rss_api_html}/structacc__ref__app__smart__presence__config__t.html (100%) rename documents/{html => rss_api_html}/structacc__ref__app__smart__presence__wakeup__config__t.html (100%) rename documents/{html => rss_api_html}/structacc__ref__app__smart__presence__zone__config__t.html (100%) rename documents/{html => rss_api_html}/structacc__ref__app__tank__level__config__t.html (100%) rename documents/{html => rss_api_html}/structacc__reg__protocol__t.html (100%) rename documents/{html => rss_api_html}/structacc__rss__assembly__test__result__t.html (100%) rename documents/{html => rss_api_html}/structacc__smart__presence__result__t.html (100%) rename documents/{html => rss_api_html}/structacc__smart__presence__zone__result__t.html (100%) rename documents/{html => rss_api_html}/structacc__surface__velocity__config__t.html (100%) rename documents/{html => rss_api_html}/structacc__surface__velocity__handle__t.html (100%) rename documents/{html => rss_api_html}/structacc__surface__velocity__result__t.html (100%) rename documents/{html => rss_api_html}/structacc__vector__float__t.html (100%) rename documents/{html => rss_api_html}/structacc__vector__iq__t.html (100%) rename documents/{html => rss_api_html}/structapp__context__t.html (100%) rename documents/{html => rss_api_html}/structapp__result__t.html (100%) rename documents/{html => rss_api_html}/structdistance__detector__resources__t.html (100%) rename documents/{html => rss_api_html}/structexample__config.html (100%) rename documents/{html => rss_api_html}/structexploration__server__interface__t.html (100%) rename documents/{html => rss_api_html}/structgpio__config__t.html (100%) rename documents/{html => rss_api_html}/structout__fct__wrap__type.html (100%) rename documents/{html => rss_api_html}/structpresence__detector__context__t.html (100%) rename documents/{html => rss_api_html}/structpresence__detector__resources__t.html (100%) rename documents/{html => rss_api_html}/structprint__buffer__t.html (100%) rename documents/{html => rss_api_html}/style.css (100%) rename documents/{html => rss_api_html}/sync_off.png (100%) rename documents/{html => rss_api_html}/sync_on.png (100%) rename documents/{html => rss_api_html}/syscalls_8c.html (100%) rename documents/{html => rss_api_html}/syscalls_8c_source.html (100%) rename documents/{html => rss_api_html}/sysmem_8c.html (100%) rename documents/{html => rss_api_html}/sysmem_8c_source.html (100%) rename documents/{html => rss_api_html}/tab_a.png (100%) rename documents/{html => rss_api_html}/tab_b.png (100%) rename documents/{html => rss_api_html}/tab_h.png (100%) rename documents/{html => rss_api_html}/tab_s.png (100%) rename documents/{html => rss_api_html}/tabs.css (100%) diff --git a/documents/rss_api.html b/documents/rss_api.html index 6a80c39..89e74fa 100644 --- a/documents/rss_api.html +++ b/documents/rss_api.html @@ -1 +1 @@ - + diff --git a/documents/html/AcconeerLogo.png b/documents/rss_api_html/AcconeerLogo.png similarity index 100% rename from documents/html/AcconeerLogo.png rename to documents/rss_api_html/AcconeerLogo.png diff --git a/documents/html/acc__alg__basic__utils_8h.html b/documents/rss_api_html/acc__alg__basic__utils_8h.html similarity index 100% rename from documents/html/acc__alg__basic__utils_8h.html rename to documents/rss_api_html/acc__alg__basic__utils_8h.html diff --git a/documents/html/acc__alg__basic__utils_8h_source.html b/documents/rss_api_html/acc__alg__basic__utils_8h_source.html similarity index 100% rename from documents/html/acc__alg__basic__utils_8h_source.html rename to documents/rss_api_html/acc__alg__basic__utils_8h_source.html diff --git a/documents/html/acc__algorithm_8c.html b/documents/rss_api_html/acc__algorithm_8c.html similarity index 100% rename from documents/html/acc__algorithm_8c.html rename to documents/rss_api_html/acc__algorithm_8c.html diff --git a/documents/html/acc__algorithm_8c_source.html b/documents/rss_api_html/acc__algorithm_8c_source.html similarity index 100% rename from documents/html/acc__algorithm_8c_source.html rename to documents/rss_api_html/acc__algorithm_8c_source.html diff --git a/documents/html/acc__algorithm_8h.html b/documents/rss_api_html/acc__algorithm_8h.html similarity index 100% rename from documents/html/acc__algorithm_8h.html rename to documents/rss_api_html/acc__algorithm_8h.html diff --git a/documents/html/acc__algorithm_8h_source.html b/documents/rss_api_html/acc__algorithm_8h_source.html similarity index 100% rename from documents/html/acc__algorithm_8h_source.html rename to documents/rss_api_html/acc__algorithm_8h_source.html diff --git a/documents/html/acc__config_8h.html b/documents/rss_api_html/acc__config_8h.html similarity index 100% rename from documents/html/acc__config_8h.html rename to documents/rss_api_html/acc__config_8h.html diff --git a/documents/html/acc__config_8h_source.html b/documents/rss_api_html/acc__config_8h_source.html similarity index 100% rename from documents/html/acc__config_8h_source.html rename to documents/rss_api_html/acc__config_8h_source.html diff --git a/documents/html/acc__config__subsweep_8h.html b/documents/rss_api_html/acc__config__subsweep_8h.html similarity index 100% rename from documents/html/acc__config__subsweep_8h.html rename to documents/rss_api_html/acc__config__subsweep_8h.html diff --git a/documents/html/acc__config__subsweep_8h_source.html b/documents/rss_api_html/acc__config__subsweep_8h_source.html similarity index 100% rename from documents/html/acc__config__subsweep_8h_source.html rename to documents/rss_api_html/acc__config__subsweep_8h_source.html diff --git a/documents/html/acc__control__helper_8c.html b/documents/rss_api_html/acc__control__helper_8c.html similarity index 100% rename from documents/html/acc__control__helper_8c.html rename to documents/rss_api_html/acc__control__helper_8c.html diff --git a/documents/html/acc__control__helper_8c_source.html b/documents/rss_api_html/acc__control__helper_8c_source.html similarity index 100% rename from documents/html/acc__control__helper_8c_source.html rename to documents/rss_api_html/acc__control__helper_8c_source.html diff --git a/documents/html/acc__control__helper_8h.html b/documents/rss_api_html/acc__control__helper_8h.html similarity index 100% rename from documents/html/acc__control__helper_8h.html rename to documents/rss_api_html/acc__control__helper_8h.html diff --git a/documents/html/acc__control__helper_8h_source.html b/documents/rss_api_html/acc__control__helper_8h_source.html similarity index 100% rename from documents/html/acc__control__helper_8h_source.html rename to documents/rss_api_html/acc__control__helper_8h_source.html diff --git a/documents/html/acc__definitions__a121_8h.html b/documents/rss_api_html/acc__definitions__a121_8h.html similarity index 100% rename from documents/html/acc__definitions__a121_8h.html rename to documents/rss_api_html/acc__definitions__a121_8h.html diff --git a/documents/html/acc__definitions__a121_8h_source.html b/documents/rss_api_html/acc__definitions__a121_8h_source.html similarity index 100% rename from documents/html/acc__definitions__a121_8h_source.html rename to documents/rss_api_html/acc__definitions__a121_8h_source.html diff --git a/documents/html/acc__definitions__common_8h.html b/documents/rss_api_html/acc__definitions__common_8h.html similarity index 100% rename from documents/html/acc__definitions__common_8h.html rename to documents/rss_api_html/acc__definitions__common_8h.html diff --git a/documents/html/acc__definitions__common_8h_source.html b/documents/rss_api_html/acc__definitions__common_8h_source.html similarity index 100% rename from documents/html/acc__definitions__common_8h_source.html rename to documents/rss_api_html/acc__definitions__common_8h_source.html diff --git a/documents/html/acc__detector__distance_8h.html b/documents/rss_api_html/acc__detector__distance_8h.html similarity index 100% rename from documents/html/acc__detector__distance_8h.html rename to documents/rss_api_html/acc__detector__distance_8h.html diff --git a/documents/html/acc__detector__distance_8h_source.html b/documents/rss_api_html/acc__detector__distance_8h_source.html similarity index 100% rename from documents/html/acc__detector__distance_8h_source.html rename to documents/rss_api_html/acc__detector__distance_8h_source.html diff --git a/documents/html/acc__detector__distance__definitions_8h.html b/documents/rss_api_html/acc__detector__distance__definitions_8h.html similarity index 100% rename from documents/html/acc__detector__distance__definitions_8h.html rename to documents/rss_api_html/acc__detector__distance__definitions_8h.html diff --git a/documents/html/acc__detector__distance__definitions_8h_source.html b/documents/rss_api_html/acc__detector__distance__definitions_8h_source.html similarity index 100% rename from documents/html/acc__detector__distance__definitions_8h_source.html rename to documents/rss_api_html/acc__detector__distance__definitions_8h_source.html diff --git a/documents/html/acc__detector__presence_8h.html b/documents/rss_api_html/acc__detector__presence_8h.html similarity index 100% rename from documents/html/acc__detector__presence_8h.html rename to documents/rss_api_html/acc__detector__presence_8h.html diff --git a/documents/html/acc__detector__presence_8h_source.html b/documents/rss_api_html/acc__detector__presence_8h_source.html similarity index 100% rename from documents/html/acc__detector__presence_8h_source.html rename to documents/rss_api_html/acc__detector__presence_8h_source.html diff --git a/documents/html/acc__exploration__server__base_8h.html b/documents/rss_api_html/acc__exploration__server__base_8h.html similarity index 100% rename from documents/html/acc__exploration__server__base_8h.html rename to documents/rss_api_html/acc__exploration__server__base_8h.html diff --git a/documents/html/acc__exploration__server__base_8h_source.html b/documents/rss_api_html/acc__exploration__server__base_8h_source.html similarity index 100% rename from documents/html/acc__exploration__server__base_8h_source.html rename to documents/rss_api_html/acc__exploration__server__base_8h_source.html diff --git a/documents/html/acc__exploration__server__stm32_8c.html b/documents/rss_api_html/acc__exploration__server__stm32_8c.html similarity index 100% rename from documents/html/acc__exploration__server__stm32_8c.html rename to documents/rss_api_html/acc__exploration__server__stm32_8c.html diff --git a/documents/html/acc__exploration__server__stm32_8c_source.html b/documents/rss_api_html/acc__exploration__server__stm32_8c_source.html similarity index 100% rename from documents/html/acc__exploration__server__stm32_8c_source.html rename to documents/rss_api_html/acc__exploration__server__stm32_8c_source.html diff --git a/documents/html/acc__exploration__server__stm32_8h.html b/documents/rss_api_html/acc__exploration__server__stm32_8h.html similarity index 100% rename from documents/html/acc__exploration__server__stm32_8h.html rename to documents/rss_api_html/acc__exploration__server__stm32_8h.html diff --git a/documents/html/acc__exploration__server__stm32_8h_source.html b/documents/rss_api_html/acc__exploration__server__stm32_8h_source.html similarity index 100% rename from documents/html/acc__exploration__server__stm32_8h_source.html rename to documents/rss_api_html/acc__exploration__server__stm32_8h_source.html diff --git a/documents/html/acc__hal__definitions__a121_8h.html b/documents/rss_api_html/acc__hal__definitions__a121_8h.html similarity index 100% rename from documents/html/acc__hal__definitions__a121_8h.html rename to documents/rss_api_html/acc__hal__definitions__a121_8h.html diff --git a/documents/html/acc__hal__definitions__a121_8h_source.html b/documents/rss_api_html/acc__hal__definitions__a121_8h_source.html similarity index 100% rename from documents/html/acc__hal__definitions__a121_8h_source.html rename to documents/rss_api_html/acc__hal__definitions__a121_8h_source.html diff --git a/documents/html/acc__hal__integration__a121_8h.html b/documents/rss_api_html/acc__hal__integration__a121_8h.html similarity index 100% rename from documents/html/acc__hal__integration__a121_8h.html rename to documents/rss_api_html/acc__hal__integration__a121_8h.html diff --git a/documents/html/acc__hal__integration__a121_8h_source.html b/documents/rss_api_html/acc__hal__integration__a121_8h_source.html similarity index 100% rename from documents/html/acc__hal__integration__a121_8h_source.html rename to documents/rss_api_html/acc__hal__integration__a121_8h_source.html diff --git a/documents/html/acc__hal__integration__stm32cube__xm_8c.html b/documents/rss_api_html/acc__hal__integration__stm32cube__xm_8c.html similarity index 100% rename from documents/html/acc__hal__integration__stm32cube__xm_8c.html rename to documents/rss_api_html/acc__hal__integration__stm32cube__xm_8c.html diff --git a/documents/html/acc__hal__integration__stm32cube__xm_8c_source.html b/documents/rss_api_html/acc__hal__integration__stm32cube__xm_8c_source.html similarity index 100% rename from documents/html/acc__hal__integration__stm32cube__xm_8c_source.html rename to documents/rss_api_html/acc__hal__integration__stm32cube__xm_8c_source.html diff --git a/documents/html/acc__integration_8h.html b/documents/rss_api_html/acc__integration_8h.html similarity index 100% rename from documents/html/acc__integration_8h.html rename to documents/rss_api_html/acc__integration_8h.html diff --git a/documents/html/acc__integration_8h_source.html b/documents/rss_api_html/acc__integration_8h_source.html similarity index 100% rename from documents/html/acc__integration_8h_source.html rename to documents/rss_api_html/acc__integration_8h_source.html diff --git a/documents/html/acc__integration__cortex_8c.html b/documents/rss_api_html/acc__integration__cortex_8c.html similarity index 100% rename from documents/html/acc__integration__cortex_8c.html rename to documents/rss_api_html/acc__integration__cortex_8c.html diff --git a/documents/html/acc__integration__cortex_8c_source.html b/documents/rss_api_html/acc__integration__cortex_8c_source.html similarity index 100% rename from documents/html/acc__integration__cortex_8c_source.html rename to documents/rss_api_html/acc__integration__cortex_8c_source.html diff --git a/documents/html/acc__integration__log_8c.html b/documents/rss_api_html/acc__integration__log_8c.html similarity index 100% rename from documents/html/acc__integration__log_8c.html rename to documents/rss_api_html/acc__integration__log_8c.html diff --git a/documents/html/acc__integration__log_8c_source.html b/documents/rss_api_html/acc__integration__log_8c_source.html similarity index 100% rename from documents/html/acc__integration__log_8c_source.html rename to documents/rss_api_html/acc__integration__log_8c_source.html diff --git a/documents/html/acc__integration__log_8h.html b/documents/rss_api_html/acc__integration__log_8h.html similarity index 100% rename from documents/html/acc__integration__log_8h.html rename to documents/rss_api_html/acc__integration__log_8h.html diff --git a/documents/html/acc__integration__log_8h_source.html b/documents/rss_api_html/acc__integration__log_8h_source.html similarity index 100% rename from documents/html/acc__integration__log_8h_source.html rename to documents/rss_api_html/acc__integration__log_8h_source.html diff --git a/documents/html/acc__integration__stm32_8c.html b/documents/rss_api_html/acc__integration__stm32_8c.html similarity index 100% rename from documents/html/acc__integration__stm32_8c.html rename to documents/rss_api_html/acc__integration__stm32_8c.html diff --git a/documents/html/acc__integration__stm32_8c_source.html b/documents/rss_api_html/acc__integration__stm32_8c_source.html similarity index 100% rename from documents/html/acc__integration__stm32_8c_source.html rename to documents/rss_api_html/acc__integration__stm32_8c_source.html diff --git a/documents/html/acc__processing_8h.html b/documents/rss_api_html/acc__processing_8h.html similarity index 100% rename from documents/html/acc__processing_8h.html rename to documents/rss_api_html/acc__processing_8h.html diff --git a/documents/html/acc__processing_8h_source.html b/documents/rss_api_html/acc__processing_8h_source.html similarity index 100% rename from documents/html/acc__processing_8h_source.html rename to documents/rss_api_html/acc__processing_8h_source.html diff --git a/documents/html/acc__processing__helpers_8c.html b/documents/rss_api_html/acc__processing__helpers_8c.html similarity index 100% rename from documents/html/acc__processing__helpers_8c.html rename to documents/rss_api_html/acc__processing__helpers_8c.html diff --git a/documents/html/acc__processing__helpers_8c_source.html b/documents/rss_api_html/acc__processing__helpers_8c_source.html similarity index 100% rename from documents/html/acc__processing__helpers_8c_source.html rename to documents/rss_api_html/acc__processing__helpers_8c_source.html diff --git a/documents/html/acc__processing__helpers_8h.html b/documents/rss_api_html/acc__processing__helpers_8h.html similarity index 100% rename from documents/html/acc__processing__helpers_8h.html rename to documents/rss_api_html/acc__processing__helpers_8h.html diff --git a/documents/html/acc__processing__helpers_8h_source.html b/documents/rss_api_html/acc__processing__helpers_8h_source.html similarity index 100% rename from documents/html/acc__processing__helpers_8h_source.html rename to documents/rss_api_html/acc__processing__helpers_8h_source.html diff --git a/documents/html/acc__reg__protocol_8c.html b/documents/rss_api_html/acc__reg__protocol_8c.html similarity index 100% rename from documents/html/acc__reg__protocol_8c.html rename to documents/rss_api_html/acc__reg__protocol_8c.html diff --git a/documents/html/acc__reg__protocol_8c_source.html b/documents/rss_api_html/acc__reg__protocol_8c_source.html similarity index 100% rename from documents/html/acc__reg__protocol_8c_source.html rename to documents/rss_api_html/acc__reg__protocol_8c_source.html diff --git a/documents/html/acc__reg__protocol_8h.html b/documents/rss_api_html/acc__reg__protocol_8h.html similarity index 100% rename from documents/html/acc__reg__protocol_8h.html rename to documents/rss_api_html/acc__reg__protocol_8h.html diff --git a/documents/html/acc__reg__protocol_8h_source.html b/documents/rss_api_html/acc__reg__protocol_8h_source.html similarity index 100% rename from documents/html/acc__reg__protocol_8h_source.html rename to documents/rss_api_html/acc__reg__protocol_8h_source.html diff --git a/documents/html/acc__rss__a121_8h.html b/documents/rss_api_html/acc__rss__a121_8h.html similarity index 100% rename from documents/html/acc__rss__a121_8h.html rename to documents/rss_api_html/acc__rss__a121_8h.html diff --git a/documents/html/acc__rss__a121_8h_source.html b/documents/rss_api_html/acc__rss__a121_8h_source.html similarity index 100% rename from documents/html/acc__rss__a121_8h_source.html rename to documents/rss_api_html/acc__rss__a121_8h_source.html diff --git a/documents/html/acc__sensor_8h.html b/documents/rss_api_html/acc__sensor_8h.html similarity index 100% rename from documents/html/acc__sensor_8h.html rename to documents/rss_api_html/acc__sensor_8h.html diff --git a/documents/html/acc__sensor_8h_source.html b/documents/rss_api_html/acc__sensor_8h_source.html similarity index 100% rename from documents/html/acc__sensor_8h_source.html rename to documents/rss_api_html/acc__sensor_8h_source.html diff --git a/documents/html/acc__version_8h.html b/documents/rss_api_html/acc__version_8h.html similarity index 100% rename from documents/html/acc__version_8h.html rename to documents/rss_api_html/acc__version_8h.html diff --git a/documents/html/acc__version_8h_source.html b/documents/rss_api_html/acc__version_8h_source.html similarity index 100% rename from documents/html/acc__version_8h_source.html rename to documents/rss_api_html/acc__version_8h_source.html diff --git a/documents/html/acc__wrap__printf_8c.html b/documents/rss_api_html/acc__wrap__printf_8c.html similarity index 100% rename from documents/html/acc__wrap__printf_8c.html rename to documents/rss_api_html/acc__wrap__printf_8c.html diff --git a/documents/html/acc__wrap__printf_8c_source.html b/documents/rss_api_html/acc__wrap__printf_8c_source.html similarity index 100% rename from documents/html/acc__wrap__printf_8c_source.html rename to documents/rss_api_html/acc__wrap__printf_8c_source.html diff --git a/documents/html/acc_control_helper_8c-example.html b/documents/rss_api_html/acc_control_helper_8c-example.html similarity index 100% rename from documents/html/acc_control_helper_8c-example.html rename to documents/rss_api_html/acc_control_helper_8c-example.html diff --git a/documents/html/acc_processing_helpers_8c-example.html b/documents/rss_api_html/acc_processing_helpers_8c-example.html similarity index 100% rename from documents/html/acc_processing_helpers_8c-example.html rename to documents/rss_api_html/acc_processing_helpers_8c-example.html diff --git a/documents/html/annotated.html b/documents/rss_api_html/annotated.html similarity index 100% rename from documents/html/annotated.html rename to documents/rss_api_html/annotated.html diff --git a/documents/html/bc_s.png b/documents/rss_api_html/bc_s.png similarity index 100% rename from documents/html/bc_s.png rename to documents/rss_api_html/bc_s.png diff --git a/documents/html/bdwn.png b/documents/rss_api_html/bdwn.png similarity index 100% rename from documents/html/bdwn.png rename to documents/rss_api_html/bdwn.png diff --git a/documents/html/classes.html b/documents/rss_api_html/classes.html similarity index 100% rename from documents/html/classes.html rename to documents/rss_api_html/classes.html diff --git a/documents/html/closed.png b/documents/rss_api_html/closed.png similarity index 100% rename from documents/html/closed.png rename to documents/rss_api_html/closed.png diff --git a/documents/html/dir_04f2ecc425faf0d475a3caf484e551f3.html b/documents/rss_api_html/dir_04f2ecc425faf0d475a3caf484e551f3.html similarity index 100% rename from documents/html/dir_04f2ecc425faf0d475a3caf484e551f3.html rename to documents/rss_api_html/dir_04f2ecc425faf0d475a3caf484e551f3.html diff --git a/documents/html/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html b/documents/rss_api_html/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html similarity index 100% rename from documents/html/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html rename to documents/rss_api_html/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html diff --git a/documents/html/dir_073ccfab4bf11db73a8ee8eb161030da.html b/documents/rss_api_html/dir_073ccfab4bf11db73a8ee8eb161030da.html similarity index 100% rename from documents/html/dir_073ccfab4bf11db73a8ee8eb161030da.html rename to documents/rss_api_html/dir_073ccfab4bf11db73a8ee8eb161030da.html diff --git a/documents/html/dir_08f02f6646c4dd9624ef093774b0b7f7.html b/documents/rss_api_html/dir_08f02f6646c4dd9624ef093774b0b7f7.html similarity index 100% rename from documents/html/dir_08f02f6646c4dd9624ef093774b0b7f7.html rename to documents/rss_api_html/dir_08f02f6646c4dd9624ef093774b0b7f7.html diff --git a/documents/html/dir_15c29f069e8c0144bc89b47ad62a396e.html b/documents/rss_api_html/dir_15c29f069e8c0144bc89b47ad62a396e.html similarity index 100% rename from documents/html/dir_15c29f069e8c0144bc89b47ad62a396e.html rename to documents/rss_api_html/dir_15c29f069e8c0144bc89b47ad62a396e.html diff --git a/documents/html/dir_29751087315bdd66fec7ae73f3a3b3df.html b/documents/rss_api_html/dir_29751087315bdd66fec7ae73f3a3b3df.html similarity index 100% rename from documents/html/dir_29751087315bdd66fec7ae73f3a3b3df.html rename to documents/rss_api_html/dir_29751087315bdd66fec7ae73f3a3b3df.html diff --git a/documents/html/dir_437c280191dc31797ff1fffcdbf26d60.html b/documents/rss_api_html/dir_437c280191dc31797ff1fffcdbf26d60.html similarity index 100% rename from documents/html/dir_437c280191dc31797ff1fffcdbf26d60.html rename to documents/rss_api_html/dir_437c280191dc31797ff1fffcdbf26d60.html diff --git a/documents/html/dir_5f3b126a0daad2440047e3d157f0734d.html b/documents/rss_api_html/dir_5f3b126a0daad2440047e3d157f0734d.html similarity index 100% rename from documents/html/dir_5f3b126a0daad2440047e3d157f0734d.html rename to documents/rss_api_html/dir_5f3b126a0daad2440047e3d157f0734d.html diff --git a/documents/html/dir_763f9730c6de1b6696aabb67bc8f2cb8.html b/documents/rss_api_html/dir_763f9730c6de1b6696aabb67bc8f2cb8.html similarity index 100% rename from documents/html/dir_763f9730c6de1b6696aabb67bc8f2cb8.html rename to documents/rss_api_html/dir_763f9730c6de1b6696aabb67bc8f2cb8.html diff --git a/documents/html/dir_885ce7a5dfec3e0117d586c25f876c85.html b/documents/rss_api_html/dir_885ce7a5dfec3e0117d586c25f876c85.html similarity index 100% rename from documents/html/dir_885ce7a5dfec3e0117d586c25f876c85.html rename to documents/rss_api_html/dir_885ce7a5dfec3e0117d586c25f876c85.html diff --git a/documents/html/dir_9037ad2fcf0acf58199e91c83d01aa83.html b/documents/rss_api_html/dir_9037ad2fcf0acf58199e91c83d01aa83.html similarity index 100% rename from documents/html/dir_9037ad2fcf0acf58199e91c83d01aa83.html rename to documents/rss_api_html/dir_9037ad2fcf0acf58199e91c83d01aa83.html diff --git a/documents/html/dir_90c50c4300347a3add62d58adc5f49d2.html b/documents/rss_api_html/dir_90c50c4300347a3add62d58adc5f49d2.html similarity index 100% rename from documents/html/dir_90c50c4300347a3add62d58adc5f49d2.html rename to documents/rss_api_html/dir_90c50c4300347a3add62d58adc5f49d2.html diff --git a/documents/html/dir_a90b80e01b24c51566f20c737761e66b.html b/documents/rss_api_html/dir_a90b80e01b24c51566f20c737761e66b.html similarity index 100% rename from documents/html/dir_a90b80e01b24c51566f20c737761e66b.html rename to documents/rss_api_html/dir_a90b80e01b24c51566f20c737761e66b.html diff --git a/documents/html/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html b/documents/rss_api_html/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html similarity index 100% rename from documents/html/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html rename to documents/rss_api_html/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html diff --git a/documents/html/dir_b3a0981508daed4f615eb509e7de909b.html b/documents/rss_api_html/dir_b3a0981508daed4f615eb509e7de909b.html similarity index 100% rename from documents/html/dir_b3a0981508daed4f615eb509e7de909b.html rename to documents/rss_api_html/dir_b3a0981508daed4f615eb509e7de909b.html diff --git a/documents/html/dir_bc91f92db1b66e0df5b21c879d8024f8.html b/documents/rss_api_html/dir_bc91f92db1b66e0df5b21c879d8024f8.html similarity index 100% rename from documents/html/dir_bc91f92db1b66e0df5b21c879d8024f8.html rename to documents/rss_api_html/dir_bc91f92db1b66e0df5b21c879d8024f8.html diff --git a/documents/html/dir_e68e8157741866f444e17edd764ebbae.html b/documents/rss_api_html/dir_e68e8157741866f444e17edd764ebbae.html similarity index 100% rename from documents/html/dir_e68e8157741866f444e17edd764ebbae.html rename to documents/rss_api_html/dir_e68e8157741866f444e17edd764ebbae.html diff --git a/documents/html/dir_eabfdd4d73a10cf1a95f85f69b256a94.html b/documents/rss_api_html/dir_eabfdd4d73a10cf1a95f85f69b256a94.html similarity index 100% rename from documents/html/dir_eabfdd4d73a10cf1a95f85f69b256a94.html rename to documents/rss_api_html/dir_eabfdd4d73a10cf1a95f85f69b256a94.html diff --git a/documents/html/distance__reg__protocol_8c.html b/documents/rss_api_html/distance__reg__protocol_8c.html similarity index 100% rename from documents/html/distance__reg__protocol_8c.html rename to documents/rss_api_html/distance__reg__protocol_8c.html diff --git a/documents/html/distance__reg__protocol_8c_source.html b/documents/rss_api_html/distance__reg__protocol_8c_source.html similarity index 100% rename from documents/html/distance__reg__protocol_8c_source.html rename to documents/rss_api_html/distance__reg__protocol_8c_source.html diff --git a/documents/html/distance__reg__protocol_8h.html b/documents/rss_api_html/distance__reg__protocol_8h.html similarity index 100% rename from documents/html/distance__reg__protocol_8h.html rename to documents/rss_api_html/distance__reg__protocol_8h.html diff --git a/documents/html/distance__reg__protocol_8h_source.html b/documents/rss_api_html/distance__reg__protocol_8h_source.html similarity index 100% rename from documents/html/distance__reg__protocol_8h_source.html rename to documents/rss_api_html/distance__reg__protocol_8h_source.html diff --git a/documents/html/distance__reg__protocol__access_8c.html b/documents/rss_api_html/distance__reg__protocol__access_8c.html similarity index 100% rename from documents/html/distance__reg__protocol__access_8c.html rename to documents/rss_api_html/distance__reg__protocol__access_8c.html diff --git a/documents/html/distance__reg__protocol__access_8c_source.html b/documents/rss_api_html/distance__reg__protocol__access_8c_source.html similarity index 100% rename from documents/html/distance__reg__protocol__access_8c_source.html rename to documents/rss_api_html/distance__reg__protocol__access_8c_source.html diff --git a/documents/html/doc.png b/documents/rss_api_html/doc.png similarity index 100% rename from documents/html/doc.png rename to documents/rss_api_html/doc.png diff --git a/documents/html/doxygen.css b/documents/rss_api_html/doxygen.css similarity index 100% rename from documents/html/doxygen.css rename to documents/rss_api_html/doxygen.css diff --git a/documents/html/doxygen.png b/documents/rss_api_html/doxygen.png similarity index 100% rename from documents/html/doxygen.png rename to documents/rss_api_html/doxygen.png diff --git a/documents/html/dynsections.js b/documents/rss_api_html/dynsections.js similarity index 100% rename from documents/html/dynsections.js rename to documents/rss_api_html/dynsections.js diff --git a/documents/html/example__bring__up_8c.html b/documents/rss_api_html/example__bring__up_8c.html similarity index 100% rename from documents/html/example__bring__up_8c.html rename to documents/rss_api_html/example__bring__up_8c.html diff --git a/documents/html/example__bring__up_8c_source.html b/documents/rss_api_html/example__bring__up_8c_source.html similarity index 100% rename from documents/html/example__bring__up_8c_source.html rename to documents/rss_api_html/example__bring__up_8c_source.html diff --git a/documents/html/example__bring__up_8h.html b/documents/rss_api_html/example__bring__up_8h.html similarity index 100% rename from documents/html/example__bring__up_8h.html rename to documents/rss_api_html/example__bring__up_8h.html diff --git a/documents/html/example__bring__up_8h_source.html b/documents/rss_api_html/example__bring__up_8h_source.html similarity index 100% rename from documents/html/example__bring__up_8h_source.html rename to documents/rss_api_html/example__bring__up_8h_source.html diff --git a/documents/html/example__control__helper_8c.html b/documents/rss_api_html/example__control__helper_8c.html similarity index 100% rename from documents/html/example__control__helper_8c.html rename to documents/rss_api_html/example__control__helper_8c.html diff --git a/documents/html/example__control__helper_8c_source.html b/documents/rss_api_html/example__control__helper_8c_source.html similarity index 100% rename from documents/html/example__control__helper_8c_source.html rename to documents/rss_api_html/example__control__helper_8c_source.html diff --git a/documents/html/example__control__helper_8h.html b/documents/rss_api_html/example__control__helper_8h.html similarity index 100% rename from documents/html/example__control__helper_8h.html rename to documents/rss_api_html/example__control__helper_8h.html diff --git a/documents/html/example__control__helper_8h_source.html b/documents/rss_api_html/example__control__helper_8h_source.html similarity index 100% rename from documents/html/example__control__helper_8h_source.html rename to documents/rss_api_html/example__control__helper_8h_source.html diff --git a/documents/html/example__detector__distance_8c.html b/documents/rss_api_html/example__detector__distance_8c.html similarity index 100% rename from documents/html/example__detector__distance_8c.html rename to documents/rss_api_html/example__detector__distance_8c.html diff --git a/documents/html/example__detector__distance_8c_source.html b/documents/rss_api_html/example__detector__distance_8c_source.html similarity index 100% rename from documents/html/example__detector__distance_8c_source.html rename to documents/rss_api_html/example__detector__distance_8c_source.html diff --git a/documents/html/example__detector__distance_8h.html b/documents/rss_api_html/example__detector__distance_8h.html similarity index 100% rename from documents/html/example__detector__distance_8h.html rename to documents/rss_api_html/example__detector__distance_8h.html diff --git a/documents/html/example__detector__distance_8h_source.html b/documents/rss_api_html/example__detector__distance_8h_source.html similarity index 100% rename from documents/html/example__detector__distance_8h_source.html rename to documents/rss_api_html/example__detector__distance_8h_source.html diff --git a/documents/html/example__detector__distance__low__power__hibernate_8c.html b/documents/rss_api_html/example__detector__distance__low__power__hibernate_8c.html similarity index 100% rename from documents/html/example__detector__distance__low__power__hibernate_8c.html rename to documents/rss_api_html/example__detector__distance__low__power__hibernate_8c.html diff --git a/documents/html/example__detector__distance__low__power__hibernate_8c_source.html b/documents/rss_api_html/example__detector__distance__low__power__hibernate_8c_source.html similarity index 100% rename from documents/html/example__detector__distance__low__power__hibernate_8c_source.html rename to documents/rss_api_html/example__detector__distance__low__power__hibernate_8c_source.html diff --git a/documents/html/example__detector__distance__low__power__hibernate_8h.html b/documents/rss_api_html/example__detector__distance__low__power__hibernate_8h.html similarity index 100% rename from documents/html/example__detector__distance__low__power__hibernate_8h.html rename to documents/rss_api_html/example__detector__distance__low__power__hibernate_8h.html diff --git a/documents/html/example__detector__distance__low__power__hibernate_8h_source.html b/documents/rss_api_html/example__detector__distance__low__power__hibernate_8h_source.html similarity index 100% rename from documents/html/example__detector__distance__low__power__hibernate_8h_source.html rename to documents/rss_api_html/example__detector__distance__low__power__hibernate_8h_source.html diff --git a/documents/html/example__detector__distance__low__power__off_8c.html b/documents/rss_api_html/example__detector__distance__low__power__off_8c.html similarity index 100% rename from documents/html/example__detector__distance__low__power__off_8c.html rename to documents/rss_api_html/example__detector__distance__low__power__off_8c.html diff --git a/documents/html/example__detector__distance__low__power__off_8c_source.html b/documents/rss_api_html/example__detector__distance__low__power__off_8c_source.html similarity index 100% rename from documents/html/example__detector__distance__low__power__off_8c_source.html rename to documents/rss_api_html/example__detector__distance__low__power__off_8c_source.html diff --git a/documents/html/example__detector__distance__low__power__off_8h.html b/documents/rss_api_html/example__detector__distance__low__power__off_8h.html similarity index 100% rename from documents/html/example__detector__distance__low__power__off_8h.html rename to documents/rss_api_html/example__detector__distance__low__power__off_8h.html diff --git a/documents/html/example__detector__distance__low__power__off_8h_source.html b/documents/rss_api_html/example__detector__distance__low__power__off_8h_source.html similarity index 100% rename from documents/html/example__detector__distance__low__power__off_8h_source.html rename to documents/rss_api_html/example__detector__distance__low__power__off_8h_source.html diff --git a/documents/html/example__detector__distance__with__iq__data__print_8c.html b/documents/rss_api_html/example__detector__distance__with__iq__data__print_8c.html similarity index 100% rename from documents/html/example__detector__distance__with__iq__data__print_8c.html rename to documents/rss_api_html/example__detector__distance__with__iq__data__print_8c.html diff --git a/documents/html/example__detector__distance__with__iq__data__print_8c_source.html b/documents/rss_api_html/example__detector__distance__with__iq__data__print_8c_source.html similarity index 100% rename from documents/html/example__detector__distance__with__iq__data__print_8c_source.html rename to documents/rss_api_html/example__detector__distance__with__iq__data__print_8c_source.html diff --git a/documents/html/example__detector__presence_8c.html b/documents/rss_api_html/example__detector__presence_8c.html similarity index 100% rename from documents/html/example__detector__presence_8c.html rename to documents/rss_api_html/example__detector__presence_8c.html diff --git a/documents/html/example__detector__presence_8c_source.html b/documents/rss_api_html/example__detector__presence_8c_source.html similarity index 100% rename from documents/html/example__detector__presence_8c_source.html rename to documents/rss_api_html/example__detector__presence_8c_source.html diff --git a/documents/html/example__detector__presence_8h.html b/documents/rss_api_html/example__detector__presence_8h.html similarity index 100% rename from documents/html/example__detector__presence_8h.html rename to documents/rss_api_html/example__detector__presence_8h.html diff --git a/documents/html/example__detector__presence_8h_source.html b/documents/rss_api_html/example__detector__presence_8h_source.html similarity index 100% rename from documents/html/example__detector__presence_8h_source.html rename to documents/rss_api_html/example__detector__presence_8h_source.html diff --git a/documents/html/example__detector__presence__low__power__hibernate_8c.html b/documents/rss_api_html/example__detector__presence__low__power__hibernate_8c.html similarity index 100% rename from documents/html/example__detector__presence__low__power__hibernate_8c.html rename to documents/rss_api_html/example__detector__presence__low__power__hibernate_8c.html diff --git a/documents/html/example__detector__presence__low__power__hibernate_8c_source.html b/documents/rss_api_html/example__detector__presence__low__power__hibernate_8c_source.html similarity index 100% rename from documents/html/example__detector__presence__low__power__hibernate_8c_source.html rename to documents/rss_api_html/example__detector__presence__low__power__hibernate_8c_source.html diff --git a/documents/html/example__detector__presence__low__power__hibernate_8h.html b/documents/rss_api_html/example__detector__presence__low__power__hibernate_8h.html similarity index 100% rename from documents/html/example__detector__presence__low__power__hibernate_8h.html rename to documents/rss_api_html/example__detector__presence__low__power__hibernate_8h.html diff --git a/documents/html/example__detector__presence__low__power__hibernate_8h_source.html b/documents/rss_api_html/example__detector__presence__low__power__hibernate_8h_source.html similarity index 100% rename from documents/html/example__detector__presence__low__power__hibernate_8h_source.html rename to documents/rss_api_html/example__detector__presence__low__power__hibernate_8h_source.html diff --git a/documents/html/example__detector__presence__low__power__off_8c.html b/documents/rss_api_html/example__detector__presence__low__power__off_8c.html similarity index 100% rename from documents/html/example__detector__presence__low__power__off_8c.html rename to documents/rss_api_html/example__detector__presence__low__power__off_8c.html diff --git a/documents/html/example__detector__presence__low__power__off_8c_source.html b/documents/rss_api_html/example__detector__presence__low__power__off_8c_source.html similarity index 100% rename from documents/html/example__detector__presence__low__power__off_8c_source.html rename to documents/rss_api_html/example__detector__presence__low__power__off_8c_source.html diff --git a/documents/html/example__detector__presence__low__power__off_8h.html b/documents/rss_api_html/example__detector__presence__low__power__off_8h.html similarity index 100% rename from documents/html/example__detector__presence__low__power__off_8h.html rename to documents/rss_api_html/example__detector__presence__low__power__off_8h.html diff --git a/documents/html/example__detector__presence__low__power__off_8h_source.html b/documents/rss_api_html/example__detector__presence__low__power__off_8h_source.html similarity index 100% rename from documents/html/example__detector__presence__low__power__off_8h_source.html rename to documents/rss_api_html/example__detector__presence__low__power__off_8h_source.html diff --git a/documents/html/example__detector__presence__multiple__configurations_8c.html b/documents/rss_api_html/example__detector__presence__multiple__configurations_8c.html similarity index 100% rename from documents/html/example__detector__presence__multiple__configurations_8c.html rename to documents/rss_api_html/example__detector__presence__multiple__configurations_8c.html diff --git a/documents/html/example__detector__presence__multiple__configurations_8c_source.html b/documents/rss_api_html/example__detector__presence__multiple__configurations_8c_source.html similarity index 100% rename from documents/html/example__detector__presence__multiple__configurations_8c_source.html rename to documents/rss_api_html/example__detector__presence__multiple__configurations_8c_source.html diff --git a/documents/html/example__detector__presence__multiple__configurations_8h.html b/documents/rss_api_html/example__detector__presence__multiple__configurations_8h.html similarity index 100% rename from documents/html/example__detector__presence__multiple__configurations_8h.html rename to documents/rss_api_html/example__detector__presence__multiple__configurations_8h.html diff --git a/documents/html/example__detector__presence__multiple__configurations_8h_source.html b/documents/rss_api_html/example__detector__presence__multiple__configurations_8h_source.html similarity index 100% rename from documents/html/example__detector__presence__multiple__configurations_8h_source.html rename to documents/rss_api_html/example__detector__presence__multiple__configurations_8h_source.html diff --git a/documents/html/example__diagnostic__test_8c.html b/documents/rss_api_html/example__diagnostic__test_8c.html similarity index 100% rename from documents/html/example__diagnostic__test_8c.html rename to documents/rss_api_html/example__diagnostic__test_8c.html diff --git a/documents/html/example__diagnostic__test_8c_source.html b/documents/rss_api_html/example__diagnostic__test_8c_source.html similarity index 100% rename from documents/html/example__diagnostic__test_8c_source.html rename to documents/rss_api_html/example__diagnostic__test_8c_source.html diff --git a/documents/html/example__diagnostic__test_8h.html b/documents/rss_api_html/example__diagnostic__test_8h.html similarity index 100% rename from documents/html/example__diagnostic__test_8h.html rename to documents/rss_api_html/example__diagnostic__test_8h.html diff --git a/documents/html/example__diagnostic__test_8h_source.html b/documents/rss_api_html/example__diagnostic__test_8h_source.html similarity index 100% rename from documents/html/example__diagnostic__test_8h_source.html rename to documents/rss_api_html/example__diagnostic__test_8h_source.html diff --git a/documents/html/example__processing__amplitude_8c.html b/documents/rss_api_html/example__processing__amplitude_8c.html similarity index 100% rename from documents/html/example__processing__amplitude_8c.html rename to documents/rss_api_html/example__processing__amplitude_8c.html diff --git a/documents/html/example__processing__amplitude_8c_source.html b/documents/rss_api_html/example__processing__amplitude_8c_source.html similarity index 100% rename from documents/html/example__processing__amplitude_8c_source.html rename to documents/rss_api_html/example__processing__amplitude_8c_source.html diff --git a/documents/html/example__processing__amplitude_8h.html b/documents/rss_api_html/example__processing__amplitude_8h.html similarity index 100% rename from documents/html/example__processing__amplitude_8h.html rename to documents/rss_api_html/example__processing__amplitude_8h.html diff --git a/documents/html/example__processing__amplitude_8h_source.html b/documents/rss_api_html/example__processing__amplitude_8h_source.html similarity index 100% rename from documents/html/example__processing__amplitude_8h_source.html rename to documents/rss_api_html/example__processing__amplitude_8h_source.html diff --git a/documents/html/example__processing__coherent__mean_8c.html b/documents/rss_api_html/example__processing__coherent__mean_8c.html similarity index 100% rename from documents/html/example__processing__coherent__mean_8c.html rename to documents/rss_api_html/example__processing__coherent__mean_8c.html diff --git a/documents/html/example__processing__coherent__mean_8c_source.html b/documents/rss_api_html/example__processing__coherent__mean_8c_source.html similarity index 100% rename from documents/html/example__processing__coherent__mean_8c_source.html rename to documents/rss_api_html/example__processing__coherent__mean_8c_source.html diff --git a/documents/html/example__processing__coherent__mean_8h.html b/documents/rss_api_html/example__processing__coherent__mean_8h.html similarity index 100% rename from documents/html/example__processing__coherent__mean_8h.html rename to documents/rss_api_html/example__processing__coherent__mean_8h.html diff --git a/documents/html/example__processing__coherent__mean_8h_source.html b/documents/rss_api_html/example__processing__coherent__mean_8h_source.html similarity index 100% rename from documents/html/example__processing__coherent__mean_8h_source.html rename to documents/rss_api_html/example__processing__coherent__mean_8h_source.html diff --git a/documents/html/example__processing__noncoherent__mean_8c.html b/documents/rss_api_html/example__processing__noncoherent__mean_8c.html similarity index 100% rename from documents/html/example__processing__noncoherent__mean_8c.html rename to documents/rss_api_html/example__processing__noncoherent__mean_8c.html diff --git a/documents/html/example__processing__noncoherent__mean_8c_source.html b/documents/rss_api_html/example__processing__noncoherent__mean_8c_source.html similarity index 100% rename from documents/html/example__processing__noncoherent__mean_8c_source.html rename to documents/rss_api_html/example__processing__noncoherent__mean_8c_source.html diff --git a/documents/html/example__processing__noncoherent__mean_8h.html b/documents/rss_api_html/example__processing__noncoherent__mean_8h.html similarity index 100% rename from documents/html/example__processing__noncoherent__mean_8h.html rename to documents/rss_api_html/example__processing__noncoherent__mean_8h.html diff --git a/documents/html/example__processing__noncoherent__mean_8h_source.html b/documents/rss_api_html/example__processing__noncoherent__mean_8h_source.html similarity index 100% rename from documents/html/example__processing__noncoherent__mean_8h_source.html rename to documents/rss_api_html/example__processing__noncoherent__mean_8h_source.html diff --git a/documents/html/example__processing__peak__interpolation_8c.html b/documents/rss_api_html/example__processing__peak__interpolation_8c.html similarity index 100% rename from documents/html/example__processing__peak__interpolation_8c.html rename to documents/rss_api_html/example__processing__peak__interpolation_8c.html diff --git a/documents/html/example__processing__peak__interpolation_8c_source.html b/documents/rss_api_html/example__processing__peak__interpolation_8c_source.html similarity index 100% rename from documents/html/example__processing__peak__interpolation_8c_source.html rename to documents/rss_api_html/example__processing__peak__interpolation_8c_source.html diff --git a/documents/html/example__processing__peak__interpolation_8h.html b/documents/rss_api_html/example__processing__peak__interpolation_8h.html similarity index 100% rename from documents/html/example__processing__peak__interpolation_8h.html rename to documents/rss_api_html/example__processing__peak__interpolation_8h.html diff --git a/documents/html/example__processing__peak__interpolation_8h_source.html b/documents/rss_api_html/example__processing__peak__interpolation_8h_source.html similarity index 100% rename from documents/html/example__processing__peak__interpolation_8h_source.html rename to documents/rss_api_html/example__processing__peak__interpolation_8h_source.html diff --git a/documents/html/example__processing__static__presence_8c.html b/documents/rss_api_html/example__processing__static__presence_8c.html similarity index 100% rename from documents/html/example__processing__static__presence_8c.html rename to documents/rss_api_html/example__processing__static__presence_8c.html diff --git a/documents/html/example__processing__static__presence_8c_source.html b/documents/rss_api_html/example__processing__static__presence_8c_source.html similarity index 100% rename from documents/html/example__processing__static__presence_8c_source.html rename to documents/rss_api_html/example__processing__static__presence_8c_source.html diff --git a/documents/html/example__processing__static__presence_8h.html b/documents/rss_api_html/example__processing__static__presence_8h.html similarity index 100% rename from documents/html/example__processing__static__presence_8h.html rename to documents/rss_api_html/example__processing__static__presence_8h.html diff --git a/documents/html/example__processing__static__presence_8h_source.html b/documents/rss_api_html/example__processing__static__presence_8h_source.html similarity index 100% rename from documents/html/example__processing__static__presence_8h_source.html rename to documents/rss_api_html/example__processing__static__presence_8h_source.html diff --git a/documents/html/example__processing__subtract__adaptive__bg_8c.html b/documents/rss_api_html/example__processing__subtract__adaptive__bg_8c.html similarity index 100% rename from documents/html/example__processing__subtract__adaptive__bg_8c.html rename to documents/rss_api_html/example__processing__subtract__adaptive__bg_8c.html diff --git a/documents/html/example__processing__subtract__adaptive__bg_8c_source.html b/documents/rss_api_html/example__processing__subtract__adaptive__bg_8c_source.html similarity index 100% rename from documents/html/example__processing__subtract__adaptive__bg_8c_source.html rename to documents/rss_api_html/example__processing__subtract__adaptive__bg_8c_source.html diff --git a/documents/html/example__processing__subtract__adaptive__bg_8h.html b/documents/rss_api_html/example__processing__subtract__adaptive__bg_8h.html similarity index 100% rename from documents/html/example__processing__subtract__adaptive__bg_8h.html rename to documents/rss_api_html/example__processing__subtract__adaptive__bg_8h.html diff --git a/documents/html/example__processing__subtract__adaptive__bg_8h_source.html b/documents/rss_api_html/example__processing__subtract__adaptive__bg_8h_source.html similarity index 100% rename from documents/html/example__processing__subtract__adaptive__bg_8h_source.html rename to documents/rss_api_html/example__processing__subtract__adaptive__bg_8h_source.html diff --git a/documents/html/example__service_8c.html b/documents/rss_api_html/example__service_8c.html similarity index 100% rename from documents/html/example__service_8c.html rename to documents/rss_api_html/example__service_8c.html diff --git a/documents/html/example__service_8c_source.html b/documents/rss_api_html/example__service_8c_source.html similarity index 100% rename from documents/html/example__service_8c_source.html rename to documents/rss_api_html/example__service_8c_source.html diff --git a/documents/html/example__service_8h.html b/documents/rss_api_html/example__service_8h.html similarity index 100% rename from documents/html/example__service_8h.html rename to documents/rss_api_html/example__service_8h.html diff --git a/documents/html/example__service_8h_source.html b/documents/rss_api_html/example__service_8h_source.html similarity index 100% rename from documents/html/example__service_8h_source.html rename to documents/rss_api_html/example__service_8h_source.html diff --git a/documents/html/example__service__low__power__sensor__disable_8c.html b/documents/rss_api_html/example__service__low__power__sensor__disable_8c.html similarity index 100% rename from documents/html/example__service__low__power__sensor__disable_8c.html rename to documents/rss_api_html/example__service__low__power__sensor__disable_8c.html diff --git a/documents/html/example__service__low__power__sensor__disable_8c_source.html b/documents/rss_api_html/example__service__low__power__sensor__disable_8c_source.html similarity index 100% rename from documents/html/example__service__low__power__sensor__disable_8c_source.html rename to documents/rss_api_html/example__service__low__power__sensor__disable_8c_source.html diff --git a/documents/html/example__service__low__power__sensor__disable_8h.html b/documents/rss_api_html/example__service__low__power__sensor__disable_8h.html similarity index 100% rename from documents/html/example__service__low__power__sensor__disable_8h.html rename to documents/rss_api_html/example__service__low__power__sensor__disable_8h.html diff --git a/documents/html/example__service__low__power__sensor__disable_8h_source.html b/documents/rss_api_html/example__service__low__power__sensor__disable_8h_source.html similarity index 100% rename from documents/html/example__service__low__power__sensor__disable_8h_source.html rename to documents/rss_api_html/example__service__low__power__sensor__disable_8h_source.html diff --git a/documents/html/example__service__low__power__sensor__hibernate_8c.html b/documents/rss_api_html/example__service__low__power__sensor__hibernate_8c.html similarity index 100% rename from documents/html/example__service__low__power__sensor__hibernate_8c.html rename to documents/rss_api_html/example__service__low__power__sensor__hibernate_8c.html diff --git a/documents/html/example__service__low__power__sensor__hibernate_8c_source.html b/documents/rss_api_html/example__service__low__power__sensor__hibernate_8c_source.html similarity index 100% rename from documents/html/example__service__low__power__sensor__hibernate_8c_source.html rename to documents/rss_api_html/example__service__low__power__sensor__hibernate_8c_source.html diff --git a/documents/html/example__service__low__power__sensor__hibernate_8h.html b/documents/rss_api_html/example__service__low__power__sensor__hibernate_8h.html similarity index 100% rename from documents/html/example__service__low__power__sensor__hibernate_8h.html rename to documents/rss_api_html/example__service__low__power__sensor__hibernate_8h.html diff --git a/documents/html/example__service__low__power__sensor__hibernate_8h_source.html b/documents/rss_api_html/example__service__low__power__sensor__hibernate_8h_source.html similarity index 100% rename from documents/html/example__service__low__power__sensor__hibernate_8h_source.html rename to documents/rss_api_html/example__service__low__power__sensor__hibernate_8h_source.html diff --git a/documents/html/example__service__multiple__configurations_8c.html b/documents/rss_api_html/example__service__multiple__configurations_8c.html similarity index 100% rename from documents/html/example__service__multiple__configurations_8c.html rename to documents/rss_api_html/example__service__multiple__configurations_8c.html diff --git a/documents/html/example__service__multiple__configurations_8c_source.html b/documents/rss_api_html/example__service__multiple__configurations_8c_source.html similarity index 100% rename from documents/html/example__service__multiple__configurations_8c_source.html rename to documents/rss_api_html/example__service__multiple__configurations_8c_source.html diff --git a/documents/html/example__service__multiple__configurations_8h.html b/documents/rss_api_html/example__service__multiple__configurations_8h.html similarity index 100% rename from documents/html/example__service__multiple__configurations_8h.html rename to documents/rss_api_html/example__service__multiple__configurations_8h.html diff --git a/documents/html/example__service__multiple__configurations_8h_source.html b/documents/rss_api_html/example__service__multiple__configurations_8h_source.html similarity index 100% rename from documents/html/example__service__multiple__configurations_8h_source.html rename to documents/rss_api_html/example__service__multiple__configurations_8h_source.html diff --git a/documents/html/example__service__sensor__disable_8c.html b/documents/rss_api_html/example__service__sensor__disable_8c.html similarity index 100% rename from documents/html/example__service__sensor__disable_8c.html rename to documents/rss_api_html/example__service__sensor__disable_8c.html diff --git a/documents/html/example__service__sensor__disable_8c_source.html b/documents/rss_api_html/example__service__sensor__disable_8c_source.html similarity index 100% rename from documents/html/example__service__sensor__disable_8c_source.html rename to documents/rss_api_html/example__service__sensor__disable_8c_source.html diff --git a/documents/html/example__service__sensor__disable_8h.html b/documents/rss_api_html/example__service__sensor__disable_8h.html similarity index 100% rename from documents/html/example__service__sensor__disable_8h.html rename to documents/rss_api_html/example__service__sensor__disable_8h.html diff --git a/documents/html/example__service__sensor__disable_8h_source.html b/documents/rss_api_html/example__service__sensor__disable_8h_source.html similarity index 100% rename from documents/html/example__service__sensor__disable_8h_source.html rename to documents/rss_api_html/example__service__sensor__disable_8h_source.html diff --git a/documents/html/example__service__sensor__hibernate_8c.html b/documents/rss_api_html/example__service__sensor__hibernate_8c.html similarity index 100% rename from documents/html/example__service__sensor__hibernate_8c.html rename to documents/rss_api_html/example__service__sensor__hibernate_8c.html diff --git a/documents/html/example__service__sensor__hibernate_8c_source.html b/documents/rss_api_html/example__service__sensor__hibernate_8c_source.html similarity index 100% rename from documents/html/example__service__sensor__hibernate_8c_source.html rename to documents/rss_api_html/example__service__sensor__hibernate_8c_source.html diff --git a/documents/html/example__service__sensor__hibernate_8h.html b/documents/rss_api_html/example__service__sensor__hibernate_8h.html similarity index 100% rename from documents/html/example__service__sensor__hibernate_8h.html rename to documents/rss_api_html/example__service__sensor__hibernate_8h.html diff --git a/documents/html/example__service__sensor__hibernate_8h_source.html b/documents/rss_api_html/example__service__sensor__hibernate_8h_source.html similarity index 100% rename from documents/html/example__service__sensor__hibernate_8h_source.html rename to documents/rss_api_html/example__service__sensor__hibernate_8h_source.html diff --git a/documents/html/example__service__sensor__off_8c.html b/documents/rss_api_html/example__service__sensor__off_8c.html similarity index 100% rename from documents/html/example__service__sensor__off_8c.html rename to documents/rss_api_html/example__service__sensor__off_8c.html diff --git a/documents/html/example__service__sensor__off_8c_source.html b/documents/rss_api_html/example__service__sensor__off_8c_source.html similarity index 100% rename from documents/html/example__service__sensor__off_8c_source.html rename to documents/rss_api_html/example__service__sensor__off_8c_source.html diff --git a/documents/html/example__service__sensor__off_8h.html b/documents/rss_api_html/example__service__sensor__off_8h.html similarity index 100% rename from documents/html/example__service__sensor__off_8h.html rename to documents/rss_api_html/example__service__sensor__off_8h.html diff --git a/documents/html/example__service__sensor__off_8h_source.html b/documents/rss_api_html/example__service__sensor__off_8h_source.html similarity index 100% rename from documents/html/example__service__sensor__off_8h_source.html rename to documents/rss_api_html/example__service__sensor__off_8h_source.html diff --git a/documents/html/example__service__subsweeps_8c.html b/documents/rss_api_html/example__service__subsweeps_8c.html similarity index 100% rename from documents/html/example__service__subsweeps_8c.html rename to documents/rss_api_html/example__service__subsweeps_8c.html diff --git a/documents/html/example__service__subsweeps_8c_source.html b/documents/rss_api_html/example__service__subsweeps_8c_source.html similarity index 100% rename from documents/html/example__service__subsweeps_8c_source.html rename to documents/rss_api_html/example__service__subsweeps_8c_source.html diff --git a/documents/html/example__service__subsweeps_8h.html b/documents/rss_api_html/example__service__subsweeps_8h.html similarity index 100% rename from documents/html/example__service__subsweeps_8h.html rename to documents/rss_api_html/example__service__subsweeps_8h.html diff --git a/documents/html/example__service__subsweeps_8h_source.html b/documents/rss_api_html/example__service__subsweeps_8h_source.html similarity index 100% rename from documents/html/example__service__subsweeps_8h_source.html rename to documents/rss_api_html/example__service__subsweeps_8h_source.html diff --git a/documents/html/example__surface__velocity_8c.html b/documents/rss_api_html/example__surface__velocity_8c.html similarity index 100% rename from documents/html/example__surface__velocity_8c.html rename to documents/rss_api_html/example__surface__velocity_8c.html diff --git a/documents/html/example__surface__velocity_8c_source.html b/documents/rss_api_html/example__surface__velocity_8c_source.html similarity index 100% rename from documents/html/example__surface__velocity_8c_source.html rename to documents/rss_api_html/example__surface__velocity_8c_source.html diff --git a/documents/html/example__surface__velocity_8h.html b/documents/rss_api_html/example__surface__velocity_8h.html similarity index 100% rename from documents/html/example__surface__velocity_8h.html rename to documents/rss_api_html/example__surface__velocity_8h.html diff --git a/documents/html/example__surface__velocity_8h_source.html b/documents/rss_api_html/example__surface__velocity_8h_source.html similarity index 100% rename from documents/html/example__surface__velocity_8h_source.html rename to documents/rss_api_html/example__surface__velocity_8h_source.html diff --git a/documents/html/example_bring_up_8c-example.html b/documents/rss_api_html/example_bring_up_8c-example.html similarity index 100% rename from documents/html/example_bring_up_8c-example.html rename to documents/rss_api_html/example_bring_up_8c-example.html diff --git a/documents/html/example_control_helper_8c-example.html b/documents/rss_api_html/example_control_helper_8c-example.html similarity index 100% rename from documents/html/example_control_helper_8c-example.html rename to documents/rss_api_html/example_control_helper_8c-example.html diff --git a/documents/html/example_detector_distance_8c-example.html b/documents/rss_api_html/example_detector_distance_8c-example.html similarity index 100% rename from documents/html/example_detector_distance_8c-example.html rename to documents/rss_api_html/example_detector_distance_8c-example.html diff --git a/documents/html/example_detector_distance_low_power_hibernate_8c-example.html b/documents/rss_api_html/example_detector_distance_low_power_hibernate_8c-example.html similarity index 100% rename from documents/html/example_detector_distance_low_power_hibernate_8c-example.html rename to documents/rss_api_html/example_detector_distance_low_power_hibernate_8c-example.html diff --git a/documents/html/example_detector_distance_low_power_off_8c-example.html b/documents/rss_api_html/example_detector_distance_low_power_off_8c-example.html similarity index 100% rename from documents/html/example_detector_distance_low_power_off_8c-example.html rename to documents/rss_api_html/example_detector_distance_low_power_off_8c-example.html diff --git a/documents/html/example_detector_distance_with_iq_data_print_8c-example.html b/documents/rss_api_html/example_detector_distance_with_iq_data_print_8c-example.html similarity index 100% rename from documents/html/example_detector_distance_with_iq_data_print_8c-example.html rename to documents/rss_api_html/example_detector_distance_with_iq_data_print_8c-example.html diff --git a/documents/html/example_detector_presence_8c-example.html b/documents/rss_api_html/example_detector_presence_8c-example.html similarity index 100% rename from documents/html/example_detector_presence_8c-example.html rename to documents/rss_api_html/example_detector_presence_8c-example.html diff --git a/documents/html/example_detector_presence_low_power_hibernate_8c-example.html b/documents/rss_api_html/example_detector_presence_low_power_hibernate_8c-example.html similarity index 100% rename from documents/html/example_detector_presence_low_power_hibernate_8c-example.html rename to documents/rss_api_html/example_detector_presence_low_power_hibernate_8c-example.html diff --git a/documents/html/example_detector_presence_low_power_off_8c-example.html b/documents/rss_api_html/example_detector_presence_low_power_off_8c-example.html similarity index 100% rename from documents/html/example_detector_presence_low_power_off_8c-example.html rename to documents/rss_api_html/example_detector_presence_low_power_off_8c-example.html diff --git a/documents/html/example_detector_presence_multiple_configurations_8c-example.html b/documents/rss_api_html/example_detector_presence_multiple_configurations_8c-example.html similarity index 100% rename from documents/html/example_detector_presence_multiple_configurations_8c-example.html rename to documents/rss_api_html/example_detector_presence_multiple_configurations_8c-example.html diff --git a/documents/html/example_diagnostic_test_8c-example.html b/documents/rss_api_html/example_diagnostic_test_8c-example.html similarity index 100% rename from documents/html/example_diagnostic_test_8c-example.html rename to documents/rss_api_html/example_diagnostic_test_8c-example.html diff --git a/documents/html/example_processing_amplitude_8c-example.html b/documents/rss_api_html/example_processing_amplitude_8c-example.html similarity index 100% rename from documents/html/example_processing_amplitude_8c-example.html rename to documents/rss_api_html/example_processing_amplitude_8c-example.html diff --git a/documents/html/example_processing_coherent_mean_8c-example.html b/documents/rss_api_html/example_processing_coherent_mean_8c-example.html similarity index 100% rename from documents/html/example_processing_coherent_mean_8c-example.html rename to documents/rss_api_html/example_processing_coherent_mean_8c-example.html diff --git a/documents/html/example_processing_noncoherent_mean_8c-example.html b/documents/rss_api_html/example_processing_noncoherent_mean_8c-example.html similarity index 100% rename from documents/html/example_processing_noncoherent_mean_8c-example.html rename to documents/rss_api_html/example_processing_noncoherent_mean_8c-example.html diff --git a/documents/html/example_processing_peak_interpolation_8c-example.html b/documents/rss_api_html/example_processing_peak_interpolation_8c-example.html similarity index 100% rename from documents/html/example_processing_peak_interpolation_8c-example.html rename to documents/rss_api_html/example_processing_peak_interpolation_8c-example.html diff --git a/documents/html/example_processing_static_presence_8c-example.html b/documents/rss_api_html/example_processing_static_presence_8c-example.html similarity index 100% rename from documents/html/example_processing_static_presence_8c-example.html rename to documents/rss_api_html/example_processing_static_presence_8c-example.html diff --git a/documents/html/example_processing_subtract_adaptive_bg_8c-example.html b/documents/rss_api_html/example_processing_subtract_adaptive_bg_8c-example.html similarity index 100% rename from documents/html/example_processing_subtract_adaptive_bg_8c-example.html rename to documents/rss_api_html/example_processing_subtract_adaptive_bg_8c-example.html diff --git a/documents/html/example_service_8c-example.html b/documents/rss_api_html/example_service_8c-example.html similarity index 100% rename from documents/html/example_service_8c-example.html rename to documents/rss_api_html/example_service_8c-example.html diff --git a/documents/html/example_service_low_power_sensor_disable_8c-example.html b/documents/rss_api_html/example_service_low_power_sensor_disable_8c-example.html similarity index 100% rename from documents/html/example_service_low_power_sensor_disable_8c-example.html rename to documents/rss_api_html/example_service_low_power_sensor_disable_8c-example.html diff --git a/documents/html/example_service_low_power_sensor_hibernate_8c-example.html b/documents/rss_api_html/example_service_low_power_sensor_hibernate_8c-example.html similarity index 100% rename from documents/html/example_service_low_power_sensor_hibernate_8c-example.html rename to documents/rss_api_html/example_service_low_power_sensor_hibernate_8c-example.html diff --git a/documents/html/example_service_multiple_configurations_8c-example.html b/documents/rss_api_html/example_service_multiple_configurations_8c-example.html similarity index 100% rename from documents/html/example_service_multiple_configurations_8c-example.html rename to documents/rss_api_html/example_service_multiple_configurations_8c-example.html diff --git a/documents/html/example_service_sensor_disable_8c-example.html b/documents/rss_api_html/example_service_sensor_disable_8c-example.html similarity index 100% rename from documents/html/example_service_sensor_disable_8c-example.html rename to documents/rss_api_html/example_service_sensor_disable_8c-example.html diff --git a/documents/html/example_service_sensor_hibernate_8c-example.html b/documents/rss_api_html/example_service_sensor_hibernate_8c-example.html similarity index 100% rename from documents/html/example_service_sensor_hibernate_8c-example.html rename to documents/rss_api_html/example_service_sensor_hibernate_8c-example.html diff --git a/documents/html/example_service_sensor_off_8c-example.html b/documents/rss_api_html/example_service_sensor_off_8c-example.html similarity index 100% rename from documents/html/example_service_sensor_off_8c-example.html rename to documents/rss_api_html/example_service_sensor_off_8c-example.html diff --git a/documents/html/example_service_subsweeps_8c-example.html b/documents/rss_api_html/example_service_subsweeps_8c-example.html similarity index 100% rename from documents/html/example_service_subsweeps_8c-example.html rename to documents/rss_api_html/example_service_subsweeps_8c-example.html diff --git a/documents/html/examples.html b/documents/rss_api_html/examples.html similarity index 100% rename from documents/html/examples.html rename to documents/rss_api_html/examples.html diff --git a/documents/html/examples.js b/documents/rss_api_html/examples.js similarity index 100% rename from documents/html/examples.js rename to documents/rss_api_html/examples.js diff --git a/documents/html/files.html b/documents/rss_api_html/files.html similarity index 100% rename from documents/html/files.html rename to documents/rss_api_html/files.html diff --git a/documents/html/folderclosed.png b/documents/rss_api_html/folderclosed.png similarity index 100% rename from documents/html/folderclosed.png rename to documents/rss_api_html/folderclosed.png diff --git a/documents/html/folderopen.png b/documents/rss_api_html/folderopen.png similarity index 100% rename from documents/html/folderopen.png rename to documents/rss_api_html/folderopen.png diff --git a/documents/html/functions.html b/documents/rss_api_html/functions.html similarity index 100% rename from documents/html/functions.html rename to documents/rss_api_html/functions.html diff --git a/documents/html/functions_b.html b/documents/rss_api_html/functions_b.html similarity index 100% rename from documents/html/functions_b.html rename to documents/rss_api_html/functions_b.html diff --git a/documents/html/functions_c.html b/documents/rss_api_html/functions_c.html similarity index 100% rename from documents/html/functions_c.html rename to documents/rss_api_html/functions_c.html diff --git a/documents/html/functions_d.html b/documents/rss_api_html/functions_d.html similarity index 100% rename from documents/html/functions_d.html rename to documents/rss_api_html/functions_d.html diff --git a/documents/html/functions_e.html b/documents/rss_api_html/functions_e.html similarity index 100% rename from documents/html/functions_e.html rename to documents/rss_api_html/functions_e.html diff --git a/documents/html/functions_f.html b/documents/rss_api_html/functions_f.html similarity index 100% rename from documents/html/functions_f.html rename to documents/rss_api_html/functions_f.html diff --git a/documents/html/functions_g.html b/documents/rss_api_html/functions_g.html similarity index 100% rename from documents/html/functions_g.html rename to documents/rss_api_html/functions_g.html diff --git a/documents/html/functions_h.html b/documents/rss_api_html/functions_h.html similarity index 100% rename from documents/html/functions_h.html rename to documents/rss_api_html/functions_h.html diff --git a/documents/html/functions_i.html b/documents/rss_api_html/functions_i.html similarity index 100% rename from documents/html/functions_i.html rename to documents/rss_api_html/functions_i.html diff --git a/documents/html/functions_l.html b/documents/rss_api_html/functions_l.html similarity index 100% rename from documents/html/functions_l.html rename to documents/rss_api_html/functions_l.html diff --git a/documents/html/functions_m.html b/documents/rss_api_html/functions_m.html similarity index 100% rename from documents/html/functions_m.html rename to documents/rss_api_html/functions_m.html diff --git a/documents/html/functions_n.html b/documents/rss_api_html/functions_n.html similarity index 100% rename from documents/html/functions_n.html rename to documents/rss_api_html/functions_n.html diff --git a/documents/html/functions_o.html b/documents/rss_api_html/functions_o.html similarity index 100% rename from documents/html/functions_o.html rename to documents/rss_api_html/functions_o.html diff --git a/documents/html/functions_p.html b/documents/rss_api_html/functions_p.html similarity index 100% rename from documents/html/functions_p.html rename to documents/rss_api_html/functions_p.html diff --git a/documents/html/functions_r.html b/documents/rss_api_html/functions_r.html similarity index 100% rename from documents/html/functions_r.html rename to documents/rss_api_html/functions_r.html diff --git a/documents/html/functions_s.html b/documents/rss_api_html/functions_s.html similarity index 100% rename from documents/html/functions_s.html rename to documents/rss_api_html/functions_s.html diff --git a/documents/html/functions_t.html b/documents/rss_api_html/functions_t.html similarity index 100% rename from documents/html/functions_t.html rename to documents/rss_api_html/functions_t.html diff --git a/documents/html/functions_u.html b/documents/rss_api_html/functions_u.html similarity index 100% rename from documents/html/functions_u.html rename to documents/rss_api_html/functions_u.html diff --git a/documents/html/functions_v.html b/documents/rss_api_html/functions_v.html similarity index 100% rename from documents/html/functions_v.html rename to documents/rss_api_html/functions_v.html diff --git a/documents/html/functions_vars.html b/documents/rss_api_html/functions_vars.html similarity index 100% rename from documents/html/functions_vars.html rename to documents/rss_api_html/functions_vars.html diff --git a/documents/html/functions_vars_b.html b/documents/rss_api_html/functions_vars_b.html similarity index 100% rename from documents/html/functions_vars_b.html rename to documents/rss_api_html/functions_vars_b.html diff --git a/documents/html/functions_vars_c.html b/documents/rss_api_html/functions_vars_c.html similarity index 100% rename from documents/html/functions_vars_c.html rename to documents/rss_api_html/functions_vars_c.html diff --git a/documents/html/functions_vars_d.html b/documents/rss_api_html/functions_vars_d.html similarity index 100% rename from documents/html/functions_vars_d.html rename to documents/rss_api_html/functions_vars_d.html diff --git a/documents/html/functions_vars_e.html b/documents/rss_api_html/functions_vars_e.html similarity index 100% rename from documents/html/functions_vars_e.html rename to documents/rss_api_html/functions_vars_e.html diff --git a/documents/html/functions_vars_f.html b/documents/rss_api_html/functions_vars_f.html similarity index 100% rename from documents/html/functions_vars_f.html rename to documents/rss_api_html/functions_vars_f.html diff --git a/documents/html/functions_vars_g.html b/documents/rss_api_html/functions_vars_g.html similarity index 100% rename from documents/html/functions_vars_g.html rename to documents/rss_api_html/functions_vars_g.html diff --git a/documents/html/functions_vars_h.html b/documents/rss_api_html/functions_vars_h.html similarity index 100% rename from documents/html/functions_vars_h.html rename to documents/rss_api_html/functions_vars_h.html diff --git a/documents/html/functions_vars_i.html b/documents/rss_api_html/functions_vars_i.html similarity index 100% rename from documents/html/functions_vars_i.html rename to documents/rss_api_html/functions_vars_i.html diff --git a/documents/html/functions_vars_l.html b/documents/rss_api_html/functions_vars_l.html similarity index 100% rename from documents/html/functions_vars_l.html rename to documents/rss_api_html/functions_vars_l.html diff --git a/documents/html/functions_vars_m.html b/documents/rss_api_html/functions_vars_m.html similarity index 100% rename from documents/html/functions_vars_m.html rename to documents/rss_api_html/functions_vars_m.html diff --git a/documents/html/functions_vars_n.html b/documents/rss_api_html/functions_vars_n.html similarity index 100% rename from documents/html/functions_vars_n.html rename to documents/rss_api_html/functions_vars_n.html diff --git a/documents/html/functions_vars_o.html b/documents/rss_api_html/functions_vars_o.html similarity index 100% rename from documents/html/functions_vars_o.html rename to documents/rss_api_html/functions_vars_o.html diff --git a/documents/html/functions_vars_p.html b/documents/rss_api_html/functions_vars_p.html similarity index 100% rename from documents/html/functions_vars_p.html rename to documents/rss_api_html/functions_vars_p.html diff --git a/documents/html/functions_vars_r.html b/documents/rss_api_html/functions_vars_r.html similarity index 100% rename from documents/html/functions_vars_r.html rename to documents/rss_api_html/functions_vars_r.html diff --git a/documents/html/functions_vars_s.html b/documents/rss_api_html/functions_vars_s.html similarity index 100% rename from documents/html/functions_vars_s.html rename to documents/rss_api_html/functions_vars_s.html diff --git a/documents/html/functions_vars_t.html b/documents/rss_api_html/functions_vars_t.html similarity index 100% rename from documents/html/functions_vars_t.html rename to documents/rss_api_html/functions_vars_t.html diff --git a/documents/html/functions_vars_u.html b/documents/rss_api_html/functions_vars_u.html similarity index 100% rename from documents/html/functions_vars_u.html rename to documents/rss_api_html/functions_vars_u.html diff --git a/documents/html/functions_vars_v.html b/documents/rss_api_html/functions_vars_v.html similarity index 100% rename from documents/html/functions_vars_v.html rename to documents/rss_api_html/functions_vars_v.html diff --git a/documents/html/functions_vars_w.html b/documents/rss_api_html/functions_vars_w.html similarity index 100% rename from documents/html/functions_vars_w.html rename to documents/rss_api_html/functions_vars_w.html diff --git a/documents/html/functions_vars_z.html b/documents/rss_api_html/functions_vars_z.html similarity index 100% rename from documents/html/functions_vars_z.html rename to documents/rss_api_html/functions_vars_z.html diff --git a/documents/html/functions_w.html b/documents/rss_api_html/functions_w.html similarity index 100% rename from documents/html/functions_w.html rename to documents/rss_api_html/functions_w.html diff --git a/documents/html/functions_z.html b/documents/rss_api_html/functions_z.html similarity index 100% rename from documents/html/functions_z.html rename to documents/rss_api_html/functions_z.html diff --git a/documents/html/globals.html b/documents/rss_api_html/globals.html similarity index 100% rename from documents/html/globals.html rename to documents/rss_api_html/globals.html diff --git a/documents/html/globals_a.html b/documents/rss_api_html/globals_a.html similarity index 100% rename from documents/html/globals_a.html rename to documents/rss_api_html/globals_a.html diff --git a/documents/html/globals_b.html b/documents/rss_api_html/globals_b.html similarity index 100% rename from documents/html/globals_b.html rename to documents/rss_api_html/globals_b.html diff --git a/documents/html/globals_c.html b/documents/rss_api_html/globals_c.html similarity index 100% rename from documents/html/globals_c.html rename to documents/rss_api_html/globals_c.html diff --git a/documents/html/globals_d.html b/documents/rss_api_html/globals_d.html similarity index 100% rename from documents/html/globals_d.html rename to documents/rss_api_html/globals_d.html diff --git a/documents/html/globals_defs.html b/documents/rss_api_html/globals_defs.html similarity index 100% rename from documents/html/globals_defs.html rename to documents/rss_api_html/globals_defs.html diff --git a/documents/html/globals_defs_b.html b/documents/rss_api_html/globals_defs_b.html similarity index 100% rename from documents/html/globals_defs_b.html rename to documents/rss_api_html/globals_defs_b.html diff --git a/documents/html/globals_defs_c.html b/documents/rss_api_html/globals_defs_c.html similarity index 100% rename from documents/html/globals_defs_c.html rename to documents/rss_api_html/globals_defs_c.html diff --git a/documents/html/globals_defs_d.html b/documents/rss_api_html/globals_defs_d.html similarity index 100% rename from documents/html/globals_defs_d.html rename to documents/rss_api_html/globals_defs_d.html diff --git a/documents/html/globals_defs_e.html b/documents/rss_api_html/globals_defs_e.html similarity index 100% rename from documents/html/globals_defs_e.html rename to documents/rss_api_html/globals_defs_e.html diff --git a/documents/html/globals_defs_f.html b/documents/rss_api_html/globals_defs_f.html similarity index 100% rename from documents/html/globals_defs_f.html rename to documents/rss_api_html/globals_defs_f.html diff --git a/documents/html/globals_defs_g.html b/documents/rss_api_html/globals_defs_g.html similarity index 100% rename from documents/html/globals_defs_g.html rename to documents/rss_api_html/globals_defs_g.html diff --git a/documents/html/globals_defs_h.html b/documents/rss_api_html/globals_defs_h.html similarity index 100% rename from documents/html/globals_defs_h.html rename to documents/rss_api_html/globals_defs_h.html diff --git a/documents/html/globals_defs_i.html b/documents/rss_api_html/globals_defs_i.html similarity index 100% rename from documents/html/globals_defs_i.html rename to documents/rss_api_html/globals_defs_i.html diff --git a/documents/html/globals_defs_l.html b/documents/rss_api_html/globals_defs_l.html similarity index 100% rename from documents/html/globals_defs_l.html rename to documents/rss_api_html/globals_defs_l.html diff --git a/documents/html/globals_defs_m.html b/documents/rss_api_html/globals_defs_m.html similarity index 100% rename from documents/html/globals_defs_m.html rename to documents/rss_api_html/globals_defs_m.html diff --git a/documents/html/globals_defs_n.html b/documents/rss_api_html/globals_defs_n.html similarity index 100% rename from documents/html/globals_defs_n.html rename to documents/rss_api_html/globals_defs_n.html diff --git a/documents/html/globals_defs_p.html b/documents/rss_api_html/globals_defs_p.html similarity index 100% rename from documents/html/globals_defs_p.html rename to documents/rss_api_html/globals_defs_p.html diff --git a/documents/html/globals_defs_r.html b/documents/rss_api_html/globals_defs_r.html similarity index 100% rename from documents/html/globals_defs_r.html rename to documents/rss_api_html/globals_defs_r.html diff --git a/documents/html/globals_defs_s.html b/documents/rss_api_html/globals_defs_s.html similarity index 100% rename from documents/html/globals_defs_s.html rename to documents/rss_api_html/globals_defs_s.html diff --git a/documents/html/globals_defs_t.html b/documents/rss_api_html/globals_defs_t.html similarity index 100% rename from documents/html/globals_defs_t.html rename to documents/rss_api_html/globals_defs_t.html diff --git a/documents/html/globals_defs_u.html b/documents/rss_api_html/globals_defs_u.html similarity index 100% rename from documents/html/globals_defs_u.html rename to documents/rss_api_html/globals_defs_u.html diff --git a/documents/html/globals_defs_v.html b/documents/rss_api_html/globals_defs_v.html similarity index 100% rename from documents/html/globals_defs_v.html rename to documents/rss_api_html/globals_defs_v.html diff --git a/documents/html/globals_defs_w.html b/documents/rss_api_html/globals_defs_w.html similarity index 100% rename from documents/html/globals_defs_w.html rename to documents/rss_api_html/globals_defs_w.html diff --git a/documents/html/globals_e.html b/documents/rss_api_html/globals_e.html similarity index 100% rename from documents/html/globals_e.html rename to documents/rss_api_html/globals_e.html diff --git a/documents/html/globals_enum.html b/documents/rss_api_html/globals_enum.html similarity index 100% rename from documents/html/globals_enum.html rename to documents/rss_api_html/globals_enum.html diff --git a/documents/html/globals_eval.html b/documents/rss_api_html/globals_eval.html similarity index 100% rename from documents/html/globals_eval.html rename to documents/rss_api_html/globals_eval.html diff --git a/documents/html/globals_f.html b/documents/rss_api_html/globals_f.html similarity index 100% rename from documents/html/globals_f.html rename to documents/rss_api_html/globals_f.html diff --git a/documents/html/globals_func.html b/documents/rss_api_html/globals_func.html similarity index 100% rename from documents/html/globals_func.html rename to documents/rss_api_html/globals_func.html diff --git a/documents/html/globals_func_a.html b/documents/rss_api_html/globals_func_a.html similarity index 100% rename from documents/html/globals_func_a.html rename to documents/rss_api_html/globals_func_a.html diff --git a/documents/html/globals_func_b.html b/documents/rss_api_html/globals_func_b.html similarity index 100% rename from documents/html/globals_func_b.html rename to documents/rss_api_html/globals_func_b.html diff --git a/documents/html/globals_func_c.html b/documents/rss_api_html/globals_func_c.html similarity index 100% rename from documents/html/globals_func_c.html rename to documents/rss_api_html/globals_func_c.html diff --git a/documents/html/globals_func_d.html b/documents/rss_api_html/globals_func_d.html similarity index 100% rename from documents/html/globals_func_d.html rename to documents/rss_api_html/globals_func_d.html diff --git a/documents/html/globals_func_e.html b/documents/rss_api_html/globals_func_e.html similarity index 100% rename from documents/html/globals_func_e.html rename to documents/rss_api_html/globals_func_e.html diff --git a/documents/html/globals_func_f.html b/documents/rss_api_html/globals_func_f.html similarity index 100% rename from documents/html/globals_func_f.html rename to documents/rss_api_html/globals_func_f.html diff --git a/documents/html/globals_func_g.html b/documents/rss_api_html/globals_func_g.html similarity index 100% rename from documents/html/globals_func_g.html rename to documents/rss_api_html/globals_func_g.html diff --git a/documents/html/globals_func_h.html b/documents/rss_api_html/globals_func_h.html similarity index 100% rename from documents/html/globals_func_h.html rename to documents/rss_api_html/globals_func_h.html diff --git a/documents/html/globals_func_i.html b/documents/rss_api_html/globals_func_i.html similarity index 100% rename from documents/html/globals_func_i.html rename to documents/rss_api_html/globals_func_i.html diff --git a/documents/html/globals_func_m.html b/documents/rss_api_html/globals_func_m.html similarity index 100% rename from documents/html/globals_func_m.html rename to documents/rss_api_html/globals_func_m.html diff --git a/documents/html/globals_func_n.html b/documents/rss_api_html/globals_func_n.html similarity index 100% rename from documents/html/globals_func_n.html rename to documents/rss_api_html/globals_func_n.html diff --git a/documents/html/globals_func_o.html b/documents/rss_api_html/globals_func_o.html similarity index 100% rename from documents/html/globals_func_o.html rename to documents/rss_api_html/globals_func_o.html diff --git a/documents/html/globals_func_p.html b/documents/rss_api_html/globals_func_p.html similarity index 100% rename from documents/html/globals_func_p.html rename to documents/rss_api_html/globals_func_p.html diff --git a/documents/html/globals_func_r.html b/documents/rss_api_html/globals_func_r.html similarity index 100% rename from documents/html/globals_func_r.html rename to documents/rss_api_html/globals_func_r.html diff --git a/documents/html/globals_func_s.html b/documents/rss_api_html/globals_func_s.html similarity index 100% rename from documents/html/globals_func_s.html rename to documents/rss_api_html/globals_func_s.html diff --git a/documents/html/globals_func_u.html b/documents/rss_api_html/globals_func_u.html similarity index 100% rename from documents/html/globals_func_u.html rename to documents/rss_api_html/globals_func_u.html diff --git a/documents/html/globals_func_v.html b/documents/rss_api_html/globals_func_v.html similarity index 100% rename from documents/html/globals_func_v.html rename to documents/rss_api_html/globals_func_v.html diff --git a/documents/html/globals_func_w.html b/documents/rss_api_html/globals_func_w.html similarity index 100% rename from documents/html/globals_func_w.html rename to documents/rss_api_html/globals_func_w.html diff --git a/documents/html/globals_g.html b/documents/rss_api_html/globals_g.html similarity index 100% rename from documents/html/globals_g.html rename to documents/rss_api_html/globals_g.html diff --git a/documents/html/globals_h.html b/documents/rss_api_html/globals_h.html similarity index 100% rename from documents/html/globals_h.html rename to documents/rss_api_html/globals_h.html diff --git a/documents/html/globals_i.html b/documents/rss_api_html/globals_i.html similarity index 100% rename from documents/html/globals_i.html rename to documents/rss_api_html/globals_i.html diff --git a/documents/html/globals_l.html b/documents/rss_api_html/globals_l.html similarity index 100% rename from documents/html/globals_l.html rename to documents/rss_api_html/globals_l.html diff --git a/documents/html/globals_m.html b/documents/rss_api_html/globals_m.html similarity index 100% rename from documents/html/globals_m.html rename to documents/rss_api_html/globals_m.html diff --git a/documents/html/globals_n.html b/documents/rss_api_html/globals_n.html similarity index 100% rename from documents/html/globals_n.html rename to documents/rss_api_html/globals_n.html diff --git a/documents/html/globals_o.html b/documents/rss_api_html/globals_o.html similarity index 100% rename from documents/html/globals_o.html rename to documents/rss_api_html/globals_o.html diff --git a/documents/html/globals_p.html b/documents/rss_api_html/globals_p.html similarity index 100% rename from documents/html/globals_p.html rename to documents/rss_api_html/globals_p.html diff --git a/documents/html/globals_r.html b/documents/rss_api_html/globals_r.html similarity index 100% rename from documents/html/globals_r.html rename to documents/rss_api_html/globals_r.html diff --git a/documents/html/globals_s.html b/documents/rss_api_html/globals_s.html similarity index 100% rename from documents/html/globals_s.html rename to documents/rss_api_html/globals_s.html diff --git a/documents/html/globals_t.html b/documents/rss_api_html/globals_t.html similarity index 100% rename from documents/html/globals_t.html rename to documents/rss_api_html/globals_t.html diff --git a/documents/html/globals_type.html b/documents/rss_api_html/globals_type.html similarity index 100% rename from documents/html/globals_type.html rename to documents/rss_api_html/globals_type.html diff --git a/documents/html/globals_u.html b/documents/rss_api_html/globals_u.html similarity index 100% rename from documents/html/globals_u.html rename to documents/rss_api_html/globals_u.html diff --git a/documents/html/globals_v.html b/documents/rss_api_html/globals_v.html similarity index 100% rename from documents/html/globals_v.html rename to documents/rss_api_html/globals_v.html diff --git a/documents/html/globals_vars.html b/documents/rss_api_html/globals_vars.html similarity index 100% rename from documents/html/globals_vars.html rename to documents/rss_api_html/globals_vars.html diff --git a/documents/html/globals_w.html b/documents/rss_api_html/globals_w.html similarity index 100% rename from documents/html/globals_w.html rename to documents/rss_api_html/globals_w.html diff --git a/documents/html/group__Distance.html b/documents/rss_api_html/group__Distance.html similarity index 100% rename from documents/html/group__Distance.html rename to documents/rss_api_html/group__Distance.html diff --git a/documents/html/group__Distance.js b/documents/rss_api_html/group__Distance.js similarity index 100% rename from documents/html/group__Distance.js rename to documents/rss_api_html/group__Distance.js diff --git a/documents/html/group__Presence.html b/documents/rss_api_html/group__Presence.html similarity index 100% rename from documents/html/group__Presence.html rename to documents/rss_api_html/group__Presence.html diff --git a/documents/html/group__Presence.js b/documents/rss_api_html/group__Presence.js similarity index 100% rename from documents/html/group__Presence.js rename to documents/rss_api_html/group__Presence.js diff --git a/documents/html/group__config.html b/documents/rss_api_html/group__config.html similarity index 100% rename from documents/html/group__config.html rename to documents/rss_api_html/group__config.html diff --git a/documents/html/group__config.js b/documents/rss_api_html/group__config.js similarity index 100% rename from documents/html/group__config.js rename to documents/rss_api_html/group__config.js diff --git a/documents/html/group__processing.html b/documents/rss_api_html/group__processing.html similarity index 100% rename from documents/html/group__processing.html rename to documents/rss_api_html/group__processing.html diff --git a/documents/html/group__processing.js b/documents/rss_api_html/group__processing.js similarity index 100% rename from documents/html/group__processing.js rename to documents/rss_api_html/group__processing.js diff --git a/documents/html/group__rss.html b/documents/rss_api_html/group__rss.html similarity index 100% rename from documents/html/group__rss.html rename to documents/rss_api_html/group__rss.html diff --git a/documents/html/group__rss.js b/documents/rss_api_html/group__rss.js similarity index 100% rename from documents/html/group__rss.js rename to documents/rss_api_html/group__rss.js diff --git a/documents/html/group__sensor.html b/documents/rss_api_html/group__sensor.html similarity index 100% rename from documents/html/group__sensor.html rename to documents/rss_api_html/group__sensor.html diff --git a/documents/html/group__sensor.js b/documents/rss_api_html/group__sensor.js similarity index 100% rename from documents/html/group__sensor.js rename to documents/rss_api_html/group__sensor.js diff --git a/documents/html/group__service.html b/documents/rss_api_html/group__service.html similarity index 100% rename from documents/html/group__service.html rename to documents/rss_api_html/group__service.html diff --git a/documents/html/group__service.js b/documents/rss_api_html/group__service.js similarity index 100% rename from documents/html/group__service.js rename to documents/rss_api_html/group__service.js diff --git a/documents/html/group__subsweep.html b/documents/rss_api_html/group__subsweep.html similarity index 100% rename from documents/html/group__subsweep.html rename to documents/rss_api_html/group__subsweep.html diff --git a/documents/html/group__subsweep.js b/documents/rss_api_html/group__subsweep.js similarity index 100% rename from documents/html/group__subsweep.js rename to documents/rss_api_html/group__subsweep.js diff --git a/documents/html/i2c__application__system_8h.html b/documents/rss_api_html/i2c__application__system_8h.html similarity index 100% rename from documents/html/i2c__application__system_8h.html rename to documents/rss_api_html/i2c__application__system_8h.html diff --git a/documents/html/i2c__application__system_8h_source.html b/documents/rss_api_html/i2c__application__system_8h_source.html similarity index 100% rename from documents/html/i2c__application__system_8h_source.html rename to documents/rss_api_html/i2c__application__system_8h_source.html diff --git a/documents/html/i2c__application__system__stm32_8c.html b/documents/rss_api_html/i2c__application__system__stm32_8c.html similarity index 100% rename from documents/html/i2c__application__system__stm32_8c.html rename to documents/rss_api_html/i2c__application__system__stm32_8c.html diff --git a/documents/html/i2c__application__system__stm32_8c_source.html b/documents/rss_api_html/i2c__application__system__stm32_8c_source.html similarity index 100% rename from documents/html/i2c__application__system__stm32_8c_source.html rename to documents/rss_api_html/i2c__application__system__stm32_8c_source.html diff --git a/documents/html/i2c__distance__detector_8c.html b/documents/rss_api_html/i2c__distance__detector_8c.html similarity index 100% rename from documents/html/i2c__distance__detector_8c.html rename to documents/rss_api_html/i2c__distance__detector_8c.html diff --git a/documents/html/i2c__distance__detector_8c_source.html b/documents/rss_api_html/i2c__distance__detector_8c_source.html similarity index 100% rename from documents/html/i2c__distance__detector_8c_source.html rename to documents/rss_api_html/i2c__distance__detector_8c_source.html diff --git a/documents/html/i2c__distance__detector_8h.html b/documents/rss_api_html/i2c__distance__detector_8h.html similarity index 100% rename from documents/html/i2c__distance__detector_8h.html rename to documents/rss_api_html/i2c__distance__detector_8h.html diff --git a/documents/html/i2c__distance__detector_8h_source.html b/documents/rss_api_html/i2c__distance__detector_8h_source.html similarity index 100% rename from documents/html/i2c__distance__detector_8h_source.html rename to documents/rss_api_html/i2c__distance__detector_8h_source.html diff --git a/documents/html/i2c__presence__detector_8c.html b/documents/rss_api_html/i2c__presence__detector_8c.html similarity index 100% rename from documents/html/i2c__presence__detector_8c.html rename to documents/rss_api_html/i2c__presence__detector_8c.html diff --git a/documents/html/i2c__presence__detector_8c_source.html b/documents/rss_api_html/i2c__presence__detector_8c_source.html similarity index 100% rename from documents/html/i2c__presence__detector_8c_source.html rename to documents/rss_api_html/i2c__presence__detector_8c_source.html diff --git a/documents/html/i2c__presence__detector_8h.html b/documents/rss_api_html/i2c__presence__detector_8h.html similarity index 100% rename from documents/html/i2c__presence__detector_8h.html rename to documents/rss_api_html/i2c__presence__detector_8h.html diff --git a/documents/html/i2c__presence__detector_8h_source.html b/documents/rss_api_html/i2c__presence__detector_8h_source.html similarity index 100% rename from documents/html/i2c__presence__detector_8h_source.html rename to documents/rss_api_html/i2c__presence__detector_8h_source.html diff --git a/documents/html/index.html b/documents/rss_api_html/index.html similarity index 100% rename from documents/html/index.html rename to documents/rss_api_html/index.html diff --git a/documents/html/intro_8md.html b/documents/rss_api_html/intro_8md.html similarity index 100% rename from documents/html/intro_8md.html rename to documents/rss_api_html/intro_8md.html diff --git a/documents/html/jquery.js b/documents/rss_api_html/jquery.js similarity index 100% rename from documents/html/jquery.js rename to documents/rss_api_html/jquery.js diff --git a/documents/html/main_8h.html b/documents/rss_api_html/main_8h.html similarity index 100% rename from documents/html/main_8h.html rename to documents/rss_api_html/main_8h.html diff --git a/documents/html/main_8h_source.html b/documents/rss_api_html/main_8h_source.html similarity index 100% rename from documents/html/main_8h_source.html rename to documents/rss_api_html/main_8h_source.html diff --git a/documents/html/menu.js b/documents/rss_api_html/menu.js similarity index 100% rename from documents/html/menu.js rename to documents/rss_api_html/menu.js diff --git a/documents/html/menudata.js b/documents/rss_api_html/menudata.js similarity index 100% rename from documents/html/menudata.js rename to documents/rss_api_html/menudata.js diff --git a/documents/html/modules.html b/documents/rss_api_html/modules.html similarity index 100% rename from documents/html/modules.html rename to documents/rss_api_html/modules.html diff --git a/documents/html/modules.js b/documents/rss_api_html/modules.js similarity index 100% rename from documents/html/modules.js rename to documents/rss_api_html/modules.js diff --git a/documents/html/nav_f.png b/documents/rss_api_html/nav_f.png similarity index 100% rename from documents/html/nav_f.png rename to documents/rss_api_html/nav_f.png diff --git a/documents/html/nav_g.png b/documents/rss_api_html/nav_g.png similarity index 100% rename from documents/html/nav_g.png rename to documents/rss_api_html/nav_g.png diff --git a/documents/html/nav_h.png b/documents/rss_api_html/nav_h.png similarity index 100% rename from documents/html/nav_h.png rename to documents/rss_api_html/nav_h.png diff --git a/documents/html/navtree.css b/documents/rss_api_html/navtree.css similarity index 100% rename from documents/html/navtree.css rename to documents/rss_api_html/navtree.css diff --git a/documents/html/navtree.js b/documents/rss_api_html/navtree.js similarity index 100% rename from documents/html/navtree.js rename to documents/rss_api_html/navtree.js diff --git a/documents/html/navtreedata.js b/documents/rss_api_html/navtreedata.js similarity index 100% rename from documents/html/navtreedata.js rename to documents/rss_api_html/navtreedata.js diff --git a/documents/html/navtreeindex0.js b/documents/rss_api_html/navtreeindex0.js similarity index 100% rename from documents/html/navtreeindex0.js rename to documents/rss_api_html/navtreeindex0.js diff --git a/documents/html/navtreeindex1.js b/documents/rss_api_html/navtreeindex1.js similarity index 100% rename from documents/html/navtreeindex1.js rename to documents/rss_api_html/navtreeindex1.js diff --git a/documents/html/open.png b/documents/rss_api_html/open.png similarity index 100% rename from documents/html/open.png rename to documents/rss_api_html/open.png diff --git a/documents/html/presence__reg__protocol_8c.html b/documents/rss_api_html/presence__reg__protocol_8c.html similarity index 100% rename from documents/html/presence__reg__protocol_8c.html rename to documents/rss_api_html/presence__reg__protocol_8c.html diff --git a/documents/html/presence__reg__protocol_8c_source.html b/documents/rss_api_html/presence__reg__protocol_8c_source.html similarity index 100% rename from documents/html/presence__reg__protocol_8c_source.html rename to documents/rss_api_html/presence__reg__protocol_8c_source.html diff --git a/documents/html/presence__reg__protocol_8h.html b/documents/rss_api_html/presence__reg__protocol_8h.html similarity index 100% rename from documents/html/presence__reg__protocol_8h.html rename to documents/rss_api_html/presence__reg__protocol_8h.html diff --git a/documents/html/presence__reg__protocol_8h_source.html b/documents/rss_api_html/presence__reg__protocol_8h_source.html similarity index 100% rename from documents/html/presence__reg__protocol_8h_source.html rename to documents/rss_api_html/presence__reg__protocol_8h_source.html diff --git a/documents/html/presence__reg__protocol__access_8c.html b/documents/rss_api_html/presence__reg__protocol__access_8c.html similarity index 100% rename from documents/html/presence__reg__protocol__access_8c.html rename to documents/rss_api_html/presence__reg__protocol__access_8c.html diff --git a/documents/html/presence__reg__protocol__access_8c_source.html b/documents/rss_api_html/presence__reg__protocol__access_8c_source.html similarity index 100% rename from documents/html/presence__reg__protocol__access_8c_source.html rename to documents/rss_api_html/presence__reg__protocol__access_8c_source.html diff --git a/documents/html/printf_8c.html b/documents/rss_api_html/printf_8c.html similarity index 100% rename from documents/html/printf_8c.html rename to documents/rss_api_html/printf_8c.html diff --git a/documents/html/printf_8c_source.html b/documents/rss_api_html/printf_8c_source.html similarity index 100% rename from documents/html/printf_8c_source.html rename to documents/rss_api_html/printf_8c_source.html diff --git a/documents/html/printf_8h.html b/documents/rss_api_html/printf_8h.html similarity index 100% rename from documents/html/printf_8h.html rename to documents/rss_api_html/printf_8h.html diff --git a/documents/html/printf_8h_source.html b/documents/rss_api_html/printf_8h_source.html similarity index 100% rename from documents/html/printf_8h_source.html rename to documents/rss_api_html/printf_8h_source.html diff --git a/documents/html/ref__app__breathing_8c.html b/documents/rss_api_html/ref__app__breathing_8c.html similarity index 100% rename from documents/html/ref__app__breathing_8c.html rename to documents/rss_api_html/ref__app__breathing_8c.html diff --git a/documents/html/ref__app__breathing_8c_source.html b/documents/rss_api_html/ref__app__breathing_8c_source.html similarity index 100% rename from documents/html/ref__app__breathing_8c_source.html rename to documents/rss_api_html/ref__app__breathing_8c_source.html diff --git a/documents/html/ref__app__breathing_8h.html b/documents/rss_api_html/ref__app__breathing_8h.html similarity index 100% rename from documents/html/ref__app__breathing_8h.html rename to documents/rss_api_html/ref__app__breathing_8h.html diff --git a/documents/html/ref__app__breathing_8h_source.html b/documents/rss_api_html/ref__app__breathing_8h_source.html similarity index 100% rename from documents/html/ref__app__breathing_8h_source.html rename to documents/rss_api_html/ref__app__breathing_8h_source.html diff --git a/documents/html/ref__app__smart__presence_8c.html b/documents/rss_api_html/ref__app__smart__presence_8c.html similarity index 100% rename from documents/html/ref__app__smart__presence_8c.html rename to documents/rss_api_html/ref__app__smart__presence_8c.html diff --git a/documents/html/ref__app__smart__presence_8c_source.html b/documents/rss_api_html/ref__app__smart__presence_8c_source.html similarity index 100% rename from documents/html/ref__app__smart__presence_8c_source.html rename to documents/rss_api_html/ref__app__smart__presence_8c_source.html diff --git a/documents/html/ref__app__smart__presence_8h.html b/documents/rss_api_html/ref__app__smart__presence_8h.html similarity index 100% rename from documents/html/ref__app__smart__presence_8h.html rename to documents/rss_api_html/ref__app__smart__presence_8h.html diff --git a/documents/html/ref__app__smart__presence_8h_source.html b/documents/rss_api_html/ref__app__smart__presence_8h_source.html similarity index 100% rename from documents/html/ref__app__smart__presence_8h_source.html rename to documents/rss_api_html/ref__app__smart__presence_8h_source.html diff --git a/documents/html/ref__app__tank__level_8c.html b/documents/rss_api_html/ref__app__tank__level_8c.html similarity index 100% rename from documents/html/ref__app__tank__level_8c.html rename to documents/rss_api_html/ref__app__tank__level_8c.html diff --git a/documents/html/ref__app__tank__level_8c_source.html b/documents/rss_api_html/ref__app__tank__level_8c_source.html similarity index 100% rename from documents/html/ref__app__tank__level_8c_source.html rename to documents/rss_api_html/ref__app__tank__level_8c_source.html diff --git a/documents/html/ref__app__tank__level_8h.html b/documents/rss_api_html/ref__app__tank__level_8h.html similarity index 100% rename from documents/html/ref__app__tank__level_8h.html rename to documents/rss_api_html/ref__app__tank__level_8h.html diff --git a/documents/html/ref__app__tank__level_8h_source.html b/documents/rss_api_html/ref__app__tank__level_8h_source.html similarity index 100% rename from documents/html/ref__app__tank__level_8h_source.html rename to documents/rss_api_html/ref__app__tank__level_8h_source.html diff --git a/documents/html/ref_app_tank_level_8c-example.html b/documents/rss_api_html/ref_app_tank_level_8c-example.html similarity index 100% rename from documents/html/ref_app_tank_level_8c-example.html rename to documents/rss_api_html/ref_app_tank_level_8c-example.html diff --git a/documents/html/resize.js b/documents/rss_api_html/resize.js similarity index 100% rename from documents/html/resize.js rename to documents/rss_api_html/resize.js diff --git a/documents/html/search/all_0.html b/documents/rss_api_html/search/all_0.html similarity index 100% rename from documents/html/search/all_0.html rename to documents/rss_api_html/search/all_0.html diff --git a/documents/html/search/all_0.js b/documents/rss_api_html/search/all_0.js similarity index 100% rename from documents/html/search/all_0.js rename to documents/rss_api_html/search/all_0.js diff --git a/documents/html/search/all_1.html b/documents/rss_api_html/search/all_1.html similarity index 100% rename from documents/html/search/all_1.html rename to documents/rss_api_html/search/all_1.html diff --git a/documents/html/search/all_1.js b/documents/rss_api_html/search/all_1.js similarity index 100% rename from documents/html/search/all_1.js rename to documents/rss_api_html/search/all_1.js diff --git a/documents/html/search/all_10.html b/documents/rss_api_html/search/all_10.html similarity index 100% rename from documents/html/search/all_10.html rename to documents/rss_api_html/search/all_10.html diff --git a/documents/html/search/all_10.js b/documents/rss_api_html/search/all_10.js similarity index 100% rename from documents/html/search/all_10.js rename to documents/rss_api_html/search/all_10.js diff --git a/documents/html/search/all_11.html b/documents/rss_api_html/search/all_11.html similarity index 100% rename from documents/html/search/all_11.html rename to documents/rss_api_html/search/all_11.html diff --git a/documents/html/search/all_11.js b/documents/rss_api_html/search/all_11.js similarity index 100% rename from documents/html/search/all_11.js rename to documents/rss_api_html/search/all_11.js diff --git a/documents/html/search/all_12.html b/documents/rss_api_html/search/all_12.html similarity index 100% rename from documents/html/search/all_12.html rename to documents/rss_api_html/search/all_12.html diff --git a/documents/html/search/all_12.js b/documents/rss_api_html/search/all_12.js similarity index 100% rename from documents/html/search/all_12.js rename to documents/rss_api_html/search/all_12.js diff --git a/documents/html/search/all_13.html b/documents/rss_api_html/search/all_13.html similarity index 100% rename from documents/html/search/all_13.html rename to documents/rss_api_html/search/all_13.html diff --git a/documents/html/search/all_13.js b/documents/rss_api_html/search/all_13.js similarity index 100% rename from documents/html/search/all_13.js rename to documents/rss_api_html/search/all_13.js diff --git a/documents/html/search/all_14.html b/documents/rss_api_html/search/all_14.html similarity index 100% rename from documents/html/search/all_14.html rename to documents/rss_api_html/search/all_14.html diff --git a/documents/html/search/all_14.js b/documents/rss_api_html/search/all_14.js similarity index 100% rename from documents/html/search/all_14.js rename to documents/rss_api_html/search/all_14.js diff --git a/documents/html/search/all_15.html b/documents/rss_api_html/search/all_15.html similarity index 100% rename from documents/html/search/all_15.html rename to documents/rss_api_html/search/all_15.html diff --git a/documents/html/search/all_15.js b/documents/rss_api_html/search/all_15.js similarity index 100% rename from documents/html/search/all_15.js rename to documents/rss_api_html/search/all_15.js diff --git a/documents/html/search/all_2.html b/documents/rss_api_html/search/all_2.html similarity index 100% rename from documents/html/search/all_2.html rename to documents/rss_api_html/search/all_2.html diff --git a/documents/html/search/all_2.js b/documents/rss_api_html/search/all_2.js similarity index 100% rename from documents/html/search/all_2.js rename to documents/rss_api_html/search/all_2.js diff --git a/documents/html/search/all_3.html b/documents/rss_api_html/search/all_3.html similarity index 100% rename from documents/html/search/all_3.html rename to documents/rss_api_html/search/all_3.html diff --git a/documents/html/search/all_3.js b/documents/rss_api_html/search/all_3.js similarity index 100% rename from documents/html/search/all_3.js rename to documents/rss_api_html/search/all_3.js diff --git a/documents/html/search/all_4.html b/documents/rss_api_html/search/all_4.html similarity index 100% rename from documents/html/search/all_4.html rename to documents/rss_api_html/search/all_4.html diff --git a/documents/html/search/all_4.js b/documents/rss_api_html/search/all_4.js similarity index 100% rename from documents/html/search/all_4.js rename to documents/rss_api_html/search/all_4.js diff --git a/documents/html/search/all_5.html b/documents/rss_api_html/search/all_5.html similarity index 100% rename from documents/html/search/all_5.html rename to documents/rss_api_html/search/all_5.html diff --git a/documents/html/search/all_5.js b/documents/rss_api_html/search/all_5.js similarity index 100% rename from documents/html/search/all_5.js rename to documents/rss_api_html/search/all_5.js diff --git a/documents/html/search/all_6.html b/documents/rss_api_html/search/all_6.html similarity index 100% rename from documents/html/search/all_6.html rename to documents/rss_api_html/search/all_6.html diff --git a/documents/html/search/all_6.js b/documents/rss_api_html/search/all_6.js similarity index 100% rename from documents/html/search/all_6.js rename to documents/rss_api_html/search/all_6.js diff --git a/documents/html/search/all_7.html b/documents/rss_api_html/search/all_7.html similarity index 100% rename from documents/html/search/all_7.html rename to documents/rss_api_html/search/all_7.html diff --git a/documents/html/search/all_7.js b/documents/rss_api_html/search/all_7.js similarity index 100% rename from documents/html/search/all_7.js rename to documents/rss_api_html/search/all_7.js diff --git a/documents/html/search/all_8.html b/documents/rss_api_html/search/all_8.html similarity index 100% rename from documents/html/search/all_8.html rename to documents/rss_api_html/search/all_8.html diff --git a/documents/html/search/all_8.js b/documents/rss_api_html/search/all_8.js similarity index 100% rename from documents/html/search/all_8.js rename to documents/rss_api_html/search/all_8.js diff --git a/documents/html/search/all_9.html b/documents/rss_api_html/search/all_9.html similarity index 100% rename from documents/html/search/all_9.html rename to documents/rss_api_html/search/all_9.html diff --git a/documents/html/search/all_9.js b/documents/rss_api_html/search/all_9.js similarity index 100% rename from documents/html/search/all_9.js rename to documents/rss_api_html/search/all_9.js diff --git a/documents/html/search/all_a.html b/documents/rss_api_html/search/all_a.html similarity index 100% rename from documents/html/search/all_a.html rename to documents/rss_api_html/search/all_a.html diff --git a/documents/html/search/all_a.js b/documents/rss_api_html/search/all_a.js similarity index 100% rename from documents/html/search/all_a.js rename to documents/rss_api_html/search/all_a.js diff --git a/documents/html/search/all_b.html b/documents/rss_api_html/search/all_b.html similarity index 100% rename from documents/html/search/all_b.html rename to documents/rss_api_html/search/all_b.html diff --git a/documents/html/search/all_b.js b/documents/rss_api_html/search/all_b.js similarity index 100% rename from documents/html/search/all_b.js rename to documents/rss_api_html/search/all_b.js diff --git a/documents/html/search/all_c.html b/documents/rss_api_html/search/all_c.html similarity index 100% rename from documents/html/search/all_c.html rename to documents/rss_api_html/search/all_c.html diff --git a/documents/html/search/all_c.js b/documents/rss_api_html/search/all_c.js similarity index 100% rename from documents/html/search/all_c.js rename to documents/rss_api_html/search/all_c.js diff --git a/documents/html/search/all_d.html b/documents/rss_api_html/search/all_d.html similarity index 100% rename from documents/html/search/all_d.html rename to documents/rss_api_html/search/all_d.html diff --git a/documents/html/search/all_d.js b/documents/rss_api_html/search/all_d.js similarity index 100% rename from documents/html/search/all_d.js rename to documents/rss_api_html/search/all_d.js diff --git a/documents/html/search/all_e.html b/documents/rss_api_html/search/all_e.html similarity index 100% rename from documents/html/search/all_e.html rename to documents/rss_api_html/search/all_e.html diff --git a/documents/html/search/all_e.js b/documents/rss_api_html/search/all_e.js similarity index 100% rename from documents/html/search/all_e.js rename to documents/rss_api_html/search/all_e.js diff --git a/documents/html/search/all_f.html b/documents/rss_api_html/search/all_f.html similarity index 100% rename from documents/html/search/all_f.html rename to documents/rss_api_html/search/all_f.html diff --git a/documents/html/search/all_f.js b/documents/rss_api_html/search/all_f.js similarity index 100% rename from documents/html/search/all_f.js rename to documents/rss_api_html/search/all_f.js diff --git a/documents/html/search/classes_0.html b/documents/rss_api_html/search/classes_0.html similarity index 100% rename from documents/html/search/classes_0.html rename to documents/rss_api_html/search/classes_0.html diff --git a/documents/html/search/classes_0.js b/documents/rss_api_html/search/classes_0.js similarity index 100% rename from documents/html/search/classes_0.js rename to documents/rss_api_html/search/classes_0.js diff --git a/documents/html/search/classes_1.html b/documents/rss_api_html/search/classes_1.html similarity index 100% rename from documents/html/search/classes_1.html rename to documents/rss_api_html/search/classes_1.html diff --git a/documents/html/search/classes_1.js b/documents/rss_api_html/search/classes_1.js similarity index 100% rename from documents/html/search/classes_1.js rename to documents/rss_api_html/search/classes_1.js diff --git a/documents/html/search/classes_2.html b/documents/rss_api_html/search/classes_2.html similarity index 100% rename from documents/html/search/classes_2.html rename to documents/rss_api_html/search/classes_2.html diff --git a/documents/html/search/classes_2.js b/documents/rss_api_html/search/classes_2.js similarity index 100% rename from documents/html/search/classes_2.js rename to documents/rss_api_html/search/classes_2.js diff --git a/documents/html/search/classes_3.html b/documents/rss_api_html/search/classes_3.html similarity index 100% rename from documents/html/search/classes_3.html rename to documents/rss_api_html/search/classes_3.html diff --git a/documents/html/search/classes_3.js b/documents/rss_api_html/search/classes_3.js similarity index 100% rename from documents/html/search/classes_3.js rename to documents/rss_api_html/search/classes_3.js diff --git a/documents/html/search/classes_4.html b/documents/rss_api_html/search/classes_4.html similarity index 100% rename from documents/html/search/classes_4.html rename to documents/rss_api_html/search/classes_4.html diff --git a/documents/html/search/classes_4.js b/documents/rss_api_html/search/classes_4.js similarity index 100% rename from documents/html/search/classes_4.js rename to documents/rss_api_html/search/classes_4.js diff --git a/documents/html/search/classes_5.html b/documents/rss_api_html/search/classes_5.html similarity index 100% rename from documents/html/search/classes_5.html rename to documents/rss_api_html/search/classes_5.html diff --git a/documents/html/search/classes_5.js b/documents/rss_api_html/search/classes_5.js similarity index 100% rename from documents/html/search/classes_5.js rename to documents/rss_api_html/search/classes_5.js diff --git a/documents/html/search/close.png b/documents/rss_api_html/search/close.png similarity index 100% rename from documents/html/search/close.png rename to documents/rss_api_html/search/close.png diff --git a/documents/html/search/defines_0.html b/documents/rss_api_html/search/defines_0.html similarity index 100% rename from documents/html/search/defines_0.html rename to documents/rss_api_html/search/defines_0.html diff --git a/documents/html/search/defines_0.js b/documents/rss_api_html/search/defines_0.js similarity index 100% rename from documents/html/search/defines_0.js rename to documents/rss_api_html/search/defines_0.js diff --git a/documents/html/search/defines_1.html b/documents/rss_api_html/search/defines_1.html similarity index 100% rename from documents/html/search/defines_1.html rename to documents/rss_api_html/search/defines_1.html diff --git a/documents/html/search/defines_1.js b/documents/rss_api_html/search/defines_1.js similarity index 100% rename from documents/html/search/defines_1.js rename to documents/rss_api_html/search/defines_1.js diff --git a/documents/html/search/defines_10.html b/documents/rss_api_html/search/defines_10.html similarity index 100% rename from documents/html/search/defines_10.html rename to documents/rss_api_html/search/defines_10.html diff --git a/documents/html/search/defines_10.js b/documents/rss_api_html/search/defines_10.js similarity index 100% rename from documents/html/search/defines_10.js rename to documents/rss_api_html/search/defines_10.js diff --git a/documents/html/search/defines_11.html b/documents/rss_api_html/search/defines_11.html similarity index 100% rename from documents/html/search/defines_11.html rename to documents/rss_api_html/search/defines_11.html diff --git a/documents/html/search/defines_11.js b/documents/rss_api_html/search/defines_11.js similarity index 100% rename from documents/html/search/defines_11.js rename to documents/rss_api_html/search/defines_11.js diff --git a/documents/html/search/defines_12.html b/documents/rss_api_html/search/defines_12.html similarity index 100% rename from documents/html/search/defines_12.html rename to documents/rss_api_html/search/defines_12.html diff --git a/documents/html/search/defines_12.js b/documents/rss_api_html/search/defines_12.js similarity index 100% rename from documents/html/search/defines_12.js rename to documents/rss_api_html/search/defines_12.js diff --git a/documents/html/search/defines_2.html b/documents/rss_api_html/search/defines_2.html similarity index 100% rename from documents/html/search/defines_2.html rename to documents/rss_api_html/search/defines_2.html diff --git a/documents/html/search/defines_2.js b/documents/rss_api_html/search/defines_2.js similarity index 100% rename from documents/html/search/defines_2.js rename to documents/rss_api_html/search/defines_2.js diff --git a/documents/html/search/defines_3.html b/documents/rss_api_html/search/defines_3.html similarity index 100% rename from documents/html/search/defines_3.html rename to documents/rss_api_html/search/defines_3.html diff --git a/documents/html/search/defines_3.js b/documents/rss_api_html/search/defines_3.js similarity index 100% rename from documents/html/search/defines_3.js rename to documents/rss_api_html/search/defines_3.js diff --git a/documents/html/search/defines_4.html b/documents/rss_api_html/search/defines_4.html similarity index 100% rename from documents/html/search/defines_4.html rename to documents/rss_api_html/search/defines_4.html diff --git a/documents/html/search/defines_4.js b/documents/rss_api_html/search/defines_4.js similarity index 100% rename from documents/html/search/defines_4.js rename to documents/rss_api_html/search/defines_4.js diff --git a/documents/html/search/defines_5.html b/documents/rss_api_html/search/defines_5.html similarity index 100% rename from documents/html/search/defines_5.html rename to documents/rss_api_html/search/defines_5.html diff --git a/documents/html/search/defines_5.js b/documents/rss_api_html/search/defines_5.js similarity index 100% rename from documents/html/search/defines_5.js rename to documents/rss_api_html/search/defines_5.js diff --git a/documents/html/search/defines_6.html b/documents/rss_api_html/search/defines_6.html similarity index 100% rename from documents/html/search/defines_6.html rename to documents/rss_api_html/search/defines_6.html diff --git a/documents/html/search/defines_6.js b/documents/rss_api_html/search/defines_6.js similarity index 100% rename from documents/html/search/defines_6.js rename to documents/rss_api_html/search/defines_6.js diff --git a/documents/html/search/defines_7.html b/documents/rss_api_html/search/defines_7.html similarity index 100% rename from documents/html/search/defines_7.html rename to documents/rss_api_html/search/defines_7.html diff --git a/documents/html/search/defines_7.js b/documents/rss_api_html/search/defines_7.js similarity index 100% rename from documents/html/search/defines_7.js rename to documents/rss_api_html/search/defines_7.js diff --git a/documents/html/search/defines_8.html b/documents/rss_api_html/search/defines_8.html similarity index 100% rename from documents/html/search/defines_8.html rename to documents/rss_api_html/search/defines_8.html diff --git a/documents/html/search/defines_8.js b/documents/rss_api_html/search/defines_8.js similarity index 100% rename from documents/html/search/defines_8.js rename to documents/rss_api_html/search/defines_8.js diff --git a/documents/html/search/defines_9.html b/documents/rss_api_html/search/defines_9.html similarity index 100% rename from documents/html/search/defines_9.html rename to documents/rss_api_html/search/defines_9.html diff --git a/documents/html/search/defines_9.js b/documents/rss_api_html/search/defines_9.js similarity index 100% rename from documents/html/search/defines_9.js rename to documents/rss_api_html/search/defines_9.js diff --git a/documents/html/search/defines_a.html b/documents/rss_api_html/search/defines_a.html similarity index 100% rename from documents/html/search/defines_a.html rename to documents/rss_api_html/search/defines_a.html diff --git a/documents/html/search/defines_a.js b/documents/rss_api_html/search/defines_a.js similarity index 100% rename from documents/html/search/defines_a.js rename to documents/rss_api_html/search/defines_a.js diff --git a/documents/html/search/defines_b.html b/documents/rss_api_html/search/defines_b.html similarity index 100% rename from documents/html/search/defines_b.html rename to documents/rss_api_html/search/defines_b.html diff --git a/documents/html/search/defines_b.js b/documents/rss_api_html/search/defines_b.js similarity index 100% rename from documents/html/search/defines_b.js rename to documents/rss_api_html/search/defines_b.js diff --git a/documents/html/search/defines_c.html b/documents/rss_api_html/search/defines_c.html similarity index 100% rename from documents/html/search/defines_c.html rename to documents/rss_api_html/search/defines_c.html diff --git a/documents/html/search/defines_c.js b/documents/rss_api_html/search/defines_c.js similarity index 100% rename from documents/html/search/defines_c.js rename to documents/rss_api_html/search/defines_c.js diff --git a/documents/html/search/defines_d.html b/documents/rss_api_html/search/defines_d.html similarity index 100% rename from documents/html/search/defines_d.html rename to documents/rss_api_html/search/defines_d.html diff --git a/documents/html/search/defines_d.js b/documents/rss_api_html/search/defines_d.js similarity index 100% rename from documents/html/search/defines_d.js rename to documents/rss_api_html/search/defines_d.js diff --git a/documents/html/search/defines_e.html b/documents/rss_api_html/search/defines_e.html similarity index 100% rename from documents/html/search/defines_e.html rename to documents/rss_api_html/search/defines_e.html diff --git a/documents/html/search/defines_e.js b/documents/rss_api_html/search/defines_e.js similarity index 100% rename from documents/html/search/defines_e.js rename to documents/rss_api_html/search/defines_e.js diff --git a/documents/html/search/defines_f.html b/documents/rss_api_html/search/defines_f.html similarity index 100% rename from documents/html/search/defines_f.html rename to documents/rss_api_html/search/defines_f.html diff --git a/documents/html/search/defines_f.js b/documents/rss_api_html/search/defines_f.js similarity index 100% rename from documents/html/search/defines_f.js rename to documents/rss_api_html/search/defines_f.js diff --git a/documents/html/search/enums_0.html b/documents/rss_api_html/search/enums_0.html similarity index 100% rename from documents/html/search/enums_0.html rename to documents/rss_api_html/search/enums_0.html diff --git a/documents/html/search/enums_0.js b/documents/rss_api_html/search/enums_0.js similarity index 100% rename from documents/html/search/enums_0.js rename to documents/rss_api_html/search/enums_0.js diff --git a/documents/html/search/enums_1.html b/documents/rss_api_html/search/enums_1.html similarity index 100% rename from documents/html/search/enums_1.html rename to documents/rss_api_html/search/enums_1.html diff --git a/documents/html/search/enums_1.js b/documents/rss_api_html/search/enums_1.js similarity index 100% rename from documents/html/search/enums_1.js rename to documents/rss_api_html/search/enums_1.js diff --git a/documents/html/search/enums_2.html b/documents/rss_api_html/search/enums_2.html similarity index 100% rename from documents/html/search/enums_2.html rename to documents/rss_api_html/search/enums_2.html diff --git a/documents/html/search/enums_2.js b/documents/rss_api_html/search/enums_2.js similarity index 100% rename from documents/html/search/enums_2.js rename to documents/rss_api_html/search/enums_2.js diff --git a/documents/html/search/enums_3.html b/documents/rss_api_html/search/enums_3.html similarity index 100% rename from documents/html/search/enums_3.html rename to documents/rss_api_html/search/enums_3.html diff --git a/documents/html/search/enums_3.js b/documents/rss_api_html/search/enums_3.js similarity index 100% rename from documents/html/search/enums_3.js rename to documents/rss_api_html/search/enums_3.js diff --git a/documents/html/search/enums_4.html b/documents/rss_api_html/search/enums_4.html similarity index 100% rename from documents/html/search/enums_4.html rename to documents/rss_api_html/search/enums_4.html diff --git a/documents/html/search/enums_4.js b/documents/rss_api_html/search/enums_4.js similarity index 100% rename from documents/html/search/enums_4.js rename to documents/rss_api_html/search/enums_4.js diff --git a/documents/html/search/enums_5.html b/documents/rss_api_html/search/enums_5.html similarity index 100% rename from documents/html/search/enums_5.html rename to documents/rss_api_html/search/enums_5.html diff --git a/documents/html/search/enums_5.js b/documents/rss_api_html/search/enums_5.js similarity index 100% rename from documents/html/search/enums_5.js rename to documents/rss_api_html/search/enums_5.js diff --git a/documents/html/search/enumvalues_0.html b/documents/rss_api_html/search/enumvalues_0.html similarity index 100% rename from documents/html/search/enumvalues_0.html rename to documents/rss_api_html/search/enumvalues_0.html diff --git a/documents/html/search/enumvalues_0.js b/documents/rss_api_html/search/enumvalues_0.js similarity index 100% rename from documents/html/search/enumvalues_0.js rename to documents/rss_api_html/search/enumvalues_0.js diff --git a/documents/html/search/enumvalues_1.html b/documents/rss_api_html/search/enumvalues_1.html similarity index 100% rename from documents/html/search/enumvalues_1.html rename to documents/rss_api_html/search/enumvalues_1.html diff --git a/documents/html/search/enumvalues_1.js b/documents/rss_api_html/search/enumvalues_1.js similarity index 100% rename from documents/html/search/enumvalues_1.js rename to documents/rss_api_html/search/enumvalues_1.js diff --git a/documents/html/search/enumvalues_2.html b/documents/rss_api_html/search/enumvalues_2.html similarity index 100% rename from documents/html/search/enumvalues_2.html rename to documents/rss_api_html/search/enumvalues_2.html diff --git a/documents/html/search/enumvalues_2.js b/documents/rss_api_html/search/enumvalues_2.js similarity index 100% rename from documents/html/search/enumvalues_2.js rename to documents/rss_api_html/search/enumvalues_2.js diff --git a/documents/html/search/enumvalues_3.html b/documents/rss_api_html/search/enumvalues_3.html similarity index 100% rename from documents/html/search/enumvalues_3.html rename to documents/rss_api_html/search/enumvalues_3.html diff --git a/documents/html/search/enumvalues_3.js b/documents/rss_api_html/search/enumvalues_3.js similarity index 100% rename from documents/html/search/enumvalues_3.js rename to documents/rss_api_html/search/enumvalues_3.js diff --git a/documents/html/search/enumvalues_4.html b/documents/rss_api_html/search/enumvalues_4.html similarity index 100% rename from documents/html/search/enumvalues_4.html rename to documents/rss_api_html/search/enumvalues_4.html diff --git a/documents/html/search/enumvalues_4.js b/documents/rss_api_html/search/enumvalues_4.js similarity index 100% rename from documents/html/search/enumvalues_4.js rename to documents/rss_api_html/search/enumvalues_4.js diff --git a/documents/html/search/enumvalues_5.html b/documents/rss_api_html/search/enumvalues_5.html similarity index 100% rename from documents/html/search/enumvalues_5.html rename to documents/rss_api_html/search/enumvalues_5.html diff --git a/documents/html/search/enumvalues_5.js b/documents/rss_api_html/search/enumvalues_5.js similarity index 100% rename from documents/html/search/enumvalues_5.js rename to documents/rss_api_html/search/enumvalues_5.js diff --git a/documents/html/search/enumvalues_6.html b/documents/rss_api_html/search/enumvalues_6.html similarity index 100% rename from documents/html/search/enumvalues_6.html rename to documents/rss_api_html/search/enumvalues_6.html diff --git a/documents/html/search/enumvalues_6.js b/documents/rss_api_html/search/enumvalues_6.js similarity index 100% rename from documents/html/search/enumvalues_6.js rename to documents/rss_api_html/search/enumvalues_6.js diff --git a/documents/html/search/files_0.html b/documents/rss_api_html/search/files_0.html similarity index 100% rename from documents/html/search/files_0.html rename to documents/rss_api_html/search/files_0.html diff --git a/documents/html/search/files_0.js b/documents/rss_api_html/search/files_0.js similarity index 100% rename from documents/html/search/files_0.js rename to documents/rss_api_html/search/files_0.js diff --git a/documents/html/search/files_1.html b/documents/rss_api_html/search/files_1.html similarity index 100% rename from documents/html/search/files_1.html rename to documents/rss_api_html/search/files_1.html diff --git a/documents/html/search/files_1.js b/documents/rss_api_html/search/files_1.js similarity index 100% rename from documents/html/search/files_1.js rename to documents/rss_api_html/search/files_1.js diff --git a/documents/html/search/files_2.html b/documents/rss_api_html/search/files_2.html similarity index 100% rename from documents/html/search/files_2.html rename to documents/rss_api_html/search/files_2.html diff --git a/documents/html/search/files_2.js b/documents/rss_api_html/search/files_2.js similarity index 100% rename from documents/html/search/files_2.js rename to documents/rss_api_html/search/files_2.js diff --git a/documents/html/search/files_3.html b/documents/rss_api_html/search/files_3.html similarity index 100% rename from documents/html/search/files_3.html rename to documents/rss_api_html/search/files_3.html diff --git a/documents/html/search/files_3.js b/documents/rss_api_html/search/files_3.js similarity index 100% rename from documents/html/search/files_3.js rename to documents/rss_api_html/search/files_3.js diff --git a/documents/html/search/files_4.html b/documents/rss_api_html/search/files_4.html similarity index 100% rename from documents/html/search/files_4.html rename to documents/rss_api_html/search/files_4.html diff --git a/documents/html/search/files_4.js b/documents/rss_api_html/search/files_4.js similarity index 100% rename from documents/html/search/files_4.js rename to documents/rss_api_html/search/files_4.js diff --git a/documents/html/search/files_5.html b/documents/rss_api_html/search/files_5.html similarity index 100% rename from documents/html/search/files_5.html rename to documents/rss_api_html/search/files_5.html diff --git a/documents/html/search/files_5.js b/documents/rss_api_html/search/files_5.js similarity index 100% rename from documents/html/search/files_5.js rename to documents/rss_api_html/search/files_5.js diff --git a/documents/html/search/files_6.html b/documents/rss_api_html/search/files_6.html similarity index 100% rename from documents/html/search/files_6.html rename to documents/rss_api_html/search/files_6.html diff --git a/documents/html/search/files_6.js b/documents/rss_api_html/search/files_6.js similarity index 100% rename from documents/html/search/files_6.js rename to documents/rss_api_html/search/files_6.js diff --git a/documents/html/search/files_7.html b/documents/rss_api_html/search/files_7.html similarity index 100% rename from documents/html/search/files_7.html rename to documents/rss_api_html/search/files_7.html diff --git a/documents/html/search/files_7.js b/documents/rss_api_html/search/files_7.js similarity index 100% rename from documents/html/search/files_7.js rename to documents/rss_api_html/search/files_7.js diff --git a/documents/html/search/functions_0.html b/documents/rss_api_html/search/functions_0.html similarity index 100% rename from documents/html/search/functions_0.html rename to documents/rss_api_html/search/functions_0.html diff --git a/documents/html/search/functions_0.js b/documents/rss_api_html/search/functions_0.js similarity index 100% rename from documents/html/search/functions_0.js rename to documents/rss_api_html/search/functions_0.js diff --git a/documents/html/search/functions_1.html b/documents/rss_api_html/search/functions_1.html similarity index 100% rename from documents/html/search/functions_1.html rename to documents/rss_api_html/search/functions_1.html diff --git a/documents/html/search/functions_1.js b/documents/rss_api_html/search/functions_1.js similarity index 100% rename from documents/html/search/functions_1.js rename to documents/rss_api_html/search/functions_1.js diff --git a/documents/html/search/functions_10.html b/documents/rss_api_html/search/functions_10.html similarity index 100% rename from documents/html/search/functions_10.html rename to documents/rss_api_html/search/functions_10.html diff --git a/documents/html/search/functions_10.js b/documents/rss_api_html/search/functions_10.js similarity index 100% rename from documents/html/search/functions_10.js rename to documents/rss_api_html/search/functions_10.js diff --git a/documents/html/search/functions_11.html b/documents/rss_api_html/search/functions_11.html similarity index 100% rename from documents/html/search/functions_11.html rename to documents/rss_api_html/search/functions_11.html diff --git a/documents/html/search/functions_11.js b/documents/rss_api_html/search/functions_11.js similarity index 100% rename from documents/html/search/functions_11.js rename to documents/rss_api_html/search/functions_11.js diff --git a/documents/html/search/functions_12.html b/documents/rss_api_html/search/functions_12.html similarity index 100% rename from documents/html/search/functions_12.html rename to documents/rss_api_html/search/functions_12.html diff --git a/documents/html/search/functions_12.js b/documents/rss_api_html/search/functions_12.js similarity index 100% rename from documents/html/search/functions_12.js rename to documents/rss_api_html/search/functions_12.js diff --git a/documents/html/search/functions_2.html b/documents/rss_api_html/search/functions_2.html similarity index 100% rename from documents/html/search/functions_2.html rename to documents/rss_api_html/search/functions_2.html diff --git a/documents/html/search/functions_2.js b/documents/rss_api_html/search/functions_2.js similarity index 100% rename from documents/html/search/functions_2.js rename to documents/rss_api_html/search/functions_2.js diff --git a/documents/html/search/functions_3.html b/documents/rss_api_html/search/functions_3.html similarity index 100% rename from documents/html/search/functions_3.html rename to documents/rss_api_html/search/functions_3.html diff --git a/documents/html/search/functions_3.js b/documents/rss_api_html/search/functions_3.js similarity index 100% rename from documents/html/search/functions_3.js rename to documents/rss_api_html/search/functions_3.js diff --git a/documents/html/search/functions_4.html b/documents/rss_api_html/search/functions_4.html similarity index 100% rename from documents/html/search/functions_4.html rename to documents/rss_api_html/search/functions_4.html diff --git a/documents/html/search/functions_4.js b/documents/rss_api_html/search/functions_4.js similarity index 100% rename from documents/html/search/functions_4.js rename to documents/rss_api_html/search/functions_4.js diff --git a/documents/html/search/functions_5.html b/documents/rss_api_html/search/functions_5.html similarity index 100% rename from documents/html/search/functions_5.html rename to documents/rss_api_html/search/functions_5.html diff --git a/documents/html/search/functions_5.js b/documents/rss_api_html/search/functions_5.js similarity index 100% rename from documents/html/search/functions_5.js rename to documents/rss_api_html/search/functions_5.js diff --git a/documents/html/search/functions_6.html b/documents/rss_api_html/search/functions_6.html similarity index 100% rename from documents/html/search/functions_6.html rename to documents/rss_api_html/search/functions_6.html diff --git a/documents/html/search/functions_6.js b/documents/rss_api_html/search/functions_6.js similarity index 100% rename from documents/html/search/functions_6.js rename to documents/rss_api_html/search/functions_6.js diff --git a/documents/html/search/functions_7.html b/documents/rss_api_html/search/functions_7.html similarity index 100% rename from documents/html/search/functions_7.html rename to documents/rss_api_html/search/functions_7.html diff --git a/documents/html/search/functions_7.js b/documents/rss_api_html/search/functions_7.js similarity index 100% rename from documents/html/search/functions_7.js rename to documents/rss_api_html/search/functions_7.js diff --git a/documents/html/search/functions_8.html b/documents/rss_api_html/search/functions_8.html similarity index 100% rename from documents/html/search/functions_8.html rename to documents/rss_api_html/search/functions_8.html diff --git a/documents/html/search/functions_8.js b/documents/rss_api_html/search/functions_8.js similarity index 100% rename from documents/html/search/functions_8.js rename to documents/rss_api_html/search/functions_8.js diff --git a/documents/html/search/functions_9.html b/documents/rss_api_html/search/functions_9.html similarity index 100% rename from documents/html/search/functions_9.html rename to documents/rss_api_html/search/functions_9.html diff --git a/documents/html/search/functions_9.js b/documents/rss_api_html/search/functions_9.js similarity index 100% rename from documents/html/search/functions_9.js rename to documents/rss_api_html/search/functions_9.js diff --git a/documents/html/search/functions_a.html b/documents/rss_api_html/search/functions_a.html similarity index 100% rename from documents/html/search/functions_a.html rename to documents/rss_api_html/search/functions_a.html diff --git a/documents/html/search/functions_a.js b/documents/rss_api_html/search/functions_a.js similarity index 100% rename from documents/html/search/functions_a.js rename to documents/rss_api_html/search/functions_a.js diff --git a/documents/html/search/functions_b.html b/documents/rss_api_html/search/functions_b.html similarity index 100% rename from documents/html/search/functions_b.html rename to documents/rss_api_html/search/functions_b.html diff --git a/documents/html/search/functions_b.js b/documents/rss_api_html/search/functions_b.js similarity index 100% rename from documents/html/search/functions_b.js rename to documents/rss_api_html/search/functions_b.js diff --git a/documents/html/search/functions_c.html b/documents/rss_api_html/search/functions_c.html similarity index 100% rename from documents/html/search/functions_c.html rename to documents/rss_api_html/search/functions_c.html diff --git a/documents/html/search/functions_c.js b/documents/rss_api_html/search/functions_c.js similarity index 100% rename from documents/html/search/functions_c.js rename to documents/rss_api_html/search/functions_c.js diff --git a/documents/html/search/functions_d.html b/documents/rss_api_html/search/functions_d.html similarity index 100% rename from documents/html/search/functions_d.html rename to documents/rss_api_html/search/functions_d.html diff --git a/documents/html/search/functions_d.js b/documents/rss_api_html/search/functions_d.js similarity index 100% rename from documents/html/search/functions_d.js rename to documents/rss_api_html/search/functions_d.js diff --git a/documents/html/search/functions_e.html b/documents/rss_api_html/search/functions_e.html similarity index 100% rename from documents/html/search/functions_e.html rename to documents/rss_api_html/search/functions_e.html diff --git a/documents/html/search/functions_e.js b/documents/rss_api_html/search/functions_e.js similarity index 100% rename from documents/html/search/functions_e.js rename to documents/rss_api_html/search/functions_e.js diff --git a/documents/html/search/functions_f.html b/documents/rss_api_html/search/functions_f.html similarity index 100% rename from documents/html/search/functions_f.html rename to documents/rss_api_html/search/functions_f.html diff --git a/documents/html/search/functions_f.js b/documents/rss_api_html/search/functions_f.js similarity index 100% rename from documents/html/search/functions_f.js rename to documents/rss_api_html/search/functions_f.js diff --git a/documents/html/search/groups_0.html b/documents/rss_api_html/search/groups_0.html similarity index 100% rename from documents/html/search/groups_0.html rename to documents/rss_api_html/search/groups_0.html diff --git a/documents/html/search/groups_0.js b/documents/rss_api_html/search/groups_0.js similarity index 100% rename from documents/html/search/groups_0.js rename to documents/rss_api_html/search/groups_0.js diff --git a/documents/html/search/groups_1.html b/documents/rss_api_html/search/groups_1.html similarity index 100% rename from documents/html/search/groups_1.html rename to documents/rss_api_html/search/groups_1.html diff --git a/documents/html/search/groups_1.js b/documents/rss_api_html/search/groups_1.js similarity index 100% rename from documents/html/search/groups_1.js rename to documents/rss_api_html/search/groups_1.js diff --git a/documents/html/search/groups_2.html b/documents/rss_api_html/search/groups_2.html similarity index 100% rename from documents/html/search/groups_2.html rename to documents/rss_api_html/search/groups_2.html diff --git a/documents/html/search/groups_2.js b/documents/rss_api_html/search/groups_2.js similarity index 100% rename from documents/html/search/groups_2.js rename to documents/rss_api_html/search/groups_2.js diff --git a/documents/html/search/groups_3.html b/documents/rss_api_html/search/groups_3.html similarity index 100% rename from documents/html/search/groups_3.html rename to documents/rss_api_html/search/groups_3.html diff --git a/documents/html/search/groups_3.js b/documents/rss_api_html/search/groups_3.js similarity index 100% rename from documents/html/search/groups_3.js rename to documents/rss_api_html/search/groups_3.js diff --git a/documents/html/search/groups_4.html b/documents/rss_api_html/search/groups_4.html similarity index 100% rename from documents/html/search/groups_4.html rename to documents/rss_api_html/search/groups_4.html diff --git a/documents/html/search/groups_4.js b/documents/rss_api_html/search/groups_4.js similarity index 100% rename from documents/html/search/groups_4.js rename to documents/rss_api_html/search/groups_4.js diff --git a/documents/html/search/mag_sel.png b/documents/rss_api_html/search/mag_sel.png similarity index 100% rename from documents/html/search/mag_sel.png rename to documents/rss_api_html/search/mag_sel.png diff --git a/documents/html/search/nomatches.html b/documents/rss_api_html/search/nomatches.html similarity index 100% rename from documents/html/search/nomatches.html rename to documents/rss_api_html/search/nomatches.html diff --git a/documents/html/search/search.css b/documents/rss_api_html/search/search.css similarity index 100% rename from documents/html/search/search.css rename to documents/rss_api_html/search/search.css diff --git a/documents/html/search/search.js b/documents/rss_api_html/search/search.js similarity index 100% rename from documents/html/search/search.js rename to documents/rss_api_html/search/search.js diff --git a/documents/html/search/search_l.png b/documents/rss_api_html/search/search_l.png similarity index 100% rename from documents/html/search/search_l.png rename to documents/rss_api_html/search/search_l.png diff --git a/documents/html/search/search_m.png b/documents/rss_api_html/search/search_m.png similarity index 100% rename from documents/html/search/search_m.png rename to documents/rss_api_html/search/search_m.png diff --git a/documents/html/search/search_r.png b/documents/rss_api_html/search/search_r.png similarity index 100% rename from documents/html/search/search_r.png rename to documents/rss_api_html/search/search_r.png diff --git a/documents/html/search/searchdata.js b/documents/rss_api_html/search/searchdata.js similarity index 100% rename from documents/html/search/searchdata.js rename to documents/rss_api_html/search/searchdata.js diff --git a/documents/html/search/typedefs_0.html b/documents/rss_api_html/search/typedefs_0.html similarity index 100% rename from documents/html/search/typedefs_0.html rename to documents/rss_api_html/search/typedefs_0.html diff --git a/documents/html/search/typedefs_0.js b/documents/rss_api_html/search/typedefs_0.js similarity index 100% rename from documents/html/search/typedefs_0.js rename to documents/rss_api_html/search/typedefs_0.js diff --git a/documents/html/search/typedefs_1.html b/documents/rss_api_html/search/typedefs_1.html similarity index 100% rename from documents/html/search/typedefs_1.html rename to documents/rss_api_html/search/typedefs_1.html diff --git a/documents/html/search/typedefs_1.js b/documents/rss_api_html/search/typedefs_1.js similarity index 100% rename from documents/html/search/typedefs_1.js rename to documents/rss_api_html/search/typedefs_1.js diff --git a/documents/html/search/typedefs_2.html b/documents/rss_api_html/search/typedefs_2.html similarity index 100% rename from documents/html/search/typedefs_2.html rename to documents/rss_api_html/search/typedefs_2.html diff --git a/documents/html/search/typedefs_2.js b/documents/rss_api_html/search/typedefs_2.js similarity index 100% rename from documents/html/search/typedefs_2.js rename to documents/rss_api_html/search/typedefs_2.js diff --git a/documents/html/search/typedefs_3.html b/documents/rss_api_html/search/typedefs_3.html similarity index 100% rename from documents/html/search/typedefs_3.html rename to documents/rss_api_html/search/typedefs_3.html diff --git a/documents/html/search/typedefs_3.js b/documents/rss_api_html/search/typedefs_3.js similarity index 100% rename from documents/html/search/typedefs_3.js rename to documents/rss_api_html/search/typedefs_3.js diff --git a/documents/html/search/typedefs_4.html b/documents/rss_api_html/search/typedefs_4.html similarity index 100% rename from documents/html/search/typedefs_4.html rename to documents/rss_api_html/search/typedefs_4.html diff --git a/documents/html/search/typedefs_4.js b/documents/rss_api_html/search/typedefs_4.js similarity index 100% rename from documents/html/search/typedefs_4.js rename to documents/rss_api_html/search/typedefs_4.js diff --git a/documents/html/search/typedefs_5.html b/documents/rss_api_html/search/typedefs_5.html similarity index 100% rename from documents/html/search/typedefs_5.html rename to documents/rss_api_html/search/typedefs_5.html diff --git a/documents/html/search/typedefs_5.js b/documents/rss_api_html/search/typedefs_5.js similarity index 100% rename from documents/html/search/typedefs_5.js rename to documents/rss_api_html/search/typedefs_5.js diff --git a/documents/html/search/typedefs_6.html b/documents/rss_api_html/search/typedefs_6.html similarity index 100% rename from documents/html/search/typedefs_6.html rename to documents/rss_api_html/search/typedefs_6.html diff --git a/documents/html/search/typedefs_6.js b/documents/rss_api_html/search/typedefs_6.js similarity index 100% rename from documents/html/search/typedefs_6.js rename to documents/rss_api_html/search/typedefs_6.js diff --git a/documents/html/search/variables_0.html b/documents/rss_api_html/search/variables_0.html similarity index 100% rename from documents/html/search/variables_0.html rename to documents/rss_api_html/search/variables_0.html diff --git a/documents/html/search/variables_0.js b/documents/rss_api_html/search/variables_0.js similarity index 100% rename from documents/html/search/variables_0.js rename to documents/rss_api_html/search/variables_0.js diff --git a/documents/html/search/variables_1.html b/documents/rss_api_html/search/variables_1.html similarity index 100% rename from documents/html/search/variables_1.html rename to documents/rss_api_html/search/variables_1.html diff --git a/documents/html/search/variables_1.js b/documents/rss_api_html/search/variables_1.js similarity index 100% rename from documents/html/search/variables_1.js rename to documents/rss_api_html/search/variables_1.js diff --git a/documents/html/search/variables_10.html b/documents/rss_api_html/search/variables_10.html similarity index 100% rename from documents/html/search/variables_10.html rename to documents/rss_api_html/search/variables_10.html diff --git a/documents/html/search/variables_10.js b/documents/rss_api_html/search/variables_10.js similarity index 100% rename from documents/html/search/variables_10.js rename to documents/rss_api_html/search/variables_10.js diff --git a/documents/html/search/variables_11.html b/documents/rss_api_html/search/variables_11.html similarity index 100% rename from documents/html/search/variables_11.html rename to documents/rss_api_html/search/variables_11.html diff --git a/documents/html/search/variables_11.js b/documents/rss_api_html/search/variables_11.js similarity index 100% rename from documents/html/search/variables_11.js rename to documents/rss_api_html/search/variables_11.js diff --git a/documents/html/search/variables_12.html b/documents/rss_api_html/search/variables_12.html similarity index 100% rename from documents/html/search/variables_12.html rename to documents/rss_api_html/search/variables_12.html diff --git a/documents/html/search/variables_12.js b/documents/rss_api_html/search/variables_12.js similarity index 100% rename from documents/html/search/variables_12.js rename to documents/rss_api_html/search/variables_12.js diff --git a/documents/html/search/variables_13.html b/documents/rss_api_html/search/variables_13.html similarity index 100% rename from documents/html/search/variables_13.html rename to documents/rss_api_html/search/variables_13.html diff --git a/documents/html/search/variables_13.js b/documents/rss_api_html/search/variables_13.js similarity index 100% rename from documents/html/search/variables_13.js rename to documents/rss_api_html/search/variables_13.js diff --git a/documents/html/search/variables_14.html b/documents/rss_api_html/search/variables_14.html similarity index 100% rename from documents/html/search/variables_14.html rename to documents/rss_api_html/search/variables_14.html diff --git a/documents/html/search/variables_14.js b/documents/rss_api_html/search/variables_14.js similarity index 100% rename from documents/html/search/variables_14.js rename to documents/rss_api_html/search/variables_14.js diff --git a/documents/html/search/variables_15.html b/documents/rss_api_html/search/variables_15.html similarity index 100% rename from documents/html/search/variables_15.html rename to documents/rss_api_html/search/variables_15.html diff --git a/documents/html/search/variables_15.js b/documents/rss_api_html/search/variables_15.js similarity index 100% rename from documents/html/search/variables_15.js rename to documents/rss_api_html/search/variables_15.js diff --git a/documents/html/search/variables_2.html b/documents/rss_api_html/search/variables_2.html similarity index 100% rename from documents/html/search/variables_2.html rename to documents/rss_api_html/search/variables_2.html diff --git a/documents/html/search/variables_2.js b/documents/rss_api_html/search/variables_2.js similarity index 100% rename from documents/html/search/variables_2.js rename to documents/rss_api_html/search/variables_2.js diff --git a/documents/html/search/variables_3.html b/documents/rss_api_html/search/variables_3.html similarity index 100% rename from documents/html/search/variables_3.html rename to documents/rss_api_html/search/variables_3.html diff --git a/documents/html/search/variables_3.js b/documents/rss_api_html/search/variables_3.js similarity index 100% rename from documents/html/search/variables_3.js rename to documents/rss_api_html/search/variables_3.js diff --git a/documents/html/search/variables_4.html b/documents/rss_api_html/search/variables_4.html similarity index 100% rename from documents/html/search/variables_4.html rename to documents/rss_api_html/search/variables_4.html diff --git a/documents/html/search/variables_4.js b/documents/rss_api_html/search/variables_4.js similarity index 100% rename from documents/html/search/variables_4.js rename to documents/rss_api_html/search/variables_4.js diff --git a/documents/html/search/variables_5.html b/documents/rss_api_html/search/variables_5.html similarity index 100% rename from documents/html/search/variables_5.html rename to documents/rss_api_html/search/variables_5.html diff --git a/documents/html/search/variables_5.js b/documents/rss_api_html/search/variables_5.js similarity index 100% rename from documents/html/search/variables_5.js rename to documents/rss_api_html/search/variables_5.js diff --git a/documents/html/search/variables_6.html b/documents/rss_api_html/search/variables_6.html similarity index 100% rename from documents/html/search/variables_6.html rename to documents/rss_api_html/search/variables_6.html diff --git a/documents/html/search/variables_6.js b/documents/rss_api_html/search/variables_6.js similarity index 100% rename from documents/html/search/variables_6.js rename to documents/rss_api_html/search/variables_6.js diff --git a/documents/html/search/variables_7.html b/documents/rss_api_html/search/variables_7.html similarity index 100% rename from documents/html/search/variables_7.html rename to documents/rss_api_html/search/variables_7.html diff --git a/documents/html/search/variables_7.js b/documents/rss_api_html/search/variables_7.js similarity index 100% rename from documents/html/search/variables_7.js rename to documents/rss_api_html/search/variables_7.js diff --git a/documents/html/search/variables_8.html b/documents/rss_api_html/search/variables_8.html similarity index 100% rename from documents/html/search/variables_8.html rename to documents/rss_api_html/search/variables_8.html diff --git a/documents/html/search/variables_8.js b/documents/rss_api_html/search/variables_8.js similarity index 100% rename from documents/html/search/variables_8.js rename to documents/rss_api_html/search/variables_8.js diff --git a/documents/html/search/variables_9.html b/documents/rss_api_html/search/variables_9.html similarity index 100% rename from documents/html/search/variables_9.html rename to documents/rss_api_html/search/variables_9.html diff --git a/documents/html/search/variables_9.js b/documents/rss_api_html/search/variables_9.js similarity index 100% rename from documents/html/search/variables_9.js rename to documents/rss_api_html/search/variables_9.js diff --git a/documents/html/search/variables_a.html b/documents/rss_api_html/search/variables_a.html similarity index 100% rename from documents/html/search/variables_a.html rename to documents/rss_api_html/search/variables_a.html diff --git a/documents/html/search/variables_a.js b/documents/rss_api_html/search/variables_a.js similarity index 100% rename from documents/html/search/variables_a.js rename to documents/rss_api_html/search/variables_a.js diff --git a/documents/html/search/variables_b.html b/documents/rss_api_html/search/variables_b.html similarity index 100% rename from documents/html/search/variables_b.html rename to documents/rss_api_html/search/variables_b.html diff --git a/documents/html/search/variables_b.js b/documents/rss_api_html/search/variables_b.js similarity index 100% rename from documents/html/search/variables_b.js rename to documents/rss_api_html/search/variables_b.js diff --git a/documents/html/search/variables_c.html b/documents/rss_api_html/search/variables_c.html similarity index 100% rename from documents/html/search/variables_c.html rename to documents/rss_api_html/search/variables_c.html diff --git a/documents/html/search/variables_c.js b/documents/rss_api_html/search/variables_c.js similarity index 100% rename from documents/html/search/variables_c.js rename to documents/rss_api_html/search/variables_c.js diff --git a/documents/html/search/variables_d.html b/documents/rss_api_html/search/variables_d.html similarity index 100% rename from documents/html/search/variables_d.html rename to documents/rss_api_html/search/variables_d.html diff --git a/documents/html/search/variables_d.js b/documents/rss_api_html/search/variables_d.js similarity index 100% rename from documents/html/search/variables_d.js rename to documents/rss_api_html/search/variables_d.js diff --git a/documents/html/search/variables_e.html b/documents/rss_api_html/search/variables_e.html similarity index 100% rename from documents/html/search/variables_e.html rename to documents/rss_api_html/search/variables_e.html diff --git a/documents/html/search/variables_e.js b/documents/rss_api_html/search/variables_e.js similarity index 100% rename from documents/html/search/variables_e.js rename to documents/rss_api_html/search/variables_e.js diff --git a/documents/html/search/variables_f.html b/documents/rss_api_html/search/variables_f.html similarity index 100% rename from documents/html/search/variables_f.html rename to documents/rss_api_html/search/variables_f.html diff --git a/documents/html/search/variables_f.js b/documents/rss_api_html/search/variables_f.js similarity index 100% rename from documents/html/search/variables_f.js rename to documents/rss_api_html/search/variables_f.js diff --git a/documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot b/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot similarity index 100% rename from documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot rename to documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot diff --git a/documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg b/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg similarity index 100% rename from documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg rename to documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg diff --git a/documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf b/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf similarity index 100% rename from documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf rename to documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf diff --git a/documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff b/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff similarity index 100% rename from documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff rename to documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff diff --git a/documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 b/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 similarity index 100% rename from documents/html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 rename to documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 diff --git a/documents/html/splitbar.png b/documents/rss_api_html/splitbar.png similarity index 100% rename from documents/html/splitbar.png rename to documents/rss_api_html/splitbar.png diff --git a/documents/html/stm32l4xx__hal__conf_8h.html b/documents/rss_api_html/stm32l4xx__hal__conf_8h.html similarity index 100% rename from documents/html/stm32l4xx__hal__conf_8h.html rename to documents/rss_api_html/stm32l4xx__hal__conf_8h.html diff --git a/documents/html/stm32l4xx__hal__conf_8h_source.html b/documents/rss_api_html/stm32l4xx__hal__conf_8h_source.html similarity index 100% rename from documents/html/stm32l4xx__hal__conf_8h_source.html rename to documents/rss_api_html/stm32l4xx__hal__conf_8h_source.html diff --git a/documents/html/stm32l4xx__hal__msp_8c.html b/documents/rss_api_html/stm32l4xx__hal__msp_8c.html similarity index 100% rename from documents/html/stm32l4xx__hal__msp_8c.html rename to documents/rss_api_html/stm32l4xx__hal__msp_8c.html diff --git a/documents/html/stm32l4xx__hal__msp_8c_source.html b/documents/rss_api_html/stm32l4xx__hal__msp_8c_source.html similarity index 100% rename from documents/html/stm32l4xx__hal__msp_8c_source.html rename to documents/rss_api_html/stm32l4xx__hal__msp_8c_source.html diff --git a/documents/html/stm32l4xx__it_8c.html b/documents/rss_api_html/stm32l4xx__it_8c.html similarity index 100% rename from documents/html/stm32l4xx__it_8c.html rename to documents/rss_api_html/stm32l4xx__it_8c.html diff --git a/documents/html/stm32l4xx__it_8c_source.html b/documents/rss_api_html/stm32l4xx__it_8c_source.html similarity index 100% rename from documents/html/stm32l4xx__it_8c_source.html rename to documents/rss_api_html/stm32l4xx__it_8c_source.html diff --git a/documents/html/stm32l4xx__it_8h.html b/documents/rss_api_html/stm32l4xx__it_8h.html similarity index 100% rename from documents/html/stm32l4xx__it_8h.html rename to documents/rss_api_html/stm32l4xx__it_8h.html diff --git a/documents/html/stm32l4xx__it_8h_source.html b/documents/rss_api_html/stm32l4xx__it_8h_source.html similarity index 100% rename from documents/html/stm32l4xx__it_8h_source.html rename to documents/rss_api_html/stm32l4xx__it_8h_source.html diff --git a/documents/html/structacc__breathing__config__t.html b/documents/rss_api_html/structacc__breathing__config__t.html similarity index 100% rename from documents/html/structacc__breathing__config__t.html rename to documents/rss_api_html/structacc__breathing__config__t.html diff --git a/documents/html/structacc__breathing__handle__t.html b/documents/rss_api_html/structacc__breathing__handle__t.html similarity index 100% rename from documents/html/structacc__breathing__handle__t.html rename to documents/rss_api_html/structacc__breathing__handle__t.html diff --git a/documents/html/structacc__breathing__result__t.html b/documents/rss_api_html/structacc__breathing__result__t.html similarity index 100% rename from documents/html/structacc__breathing__result__t.html rename to documents/rss_api_html/structacc__breathing__result__t.html diff --git a/documents/html/structacc__cal__info__t.html b/documents/rss_api_html/structacc__cal__info__t.html similarity index 100% rename from documents/html/structacc__cal__info__t.html rename to documents/rss_api_html/structacc__cal__info__t.html diff --git a/documents/html/structacc__cal__result__t.html b/documents/rss_api_html/structacc__cal__result__t.html similarity index 100% rename from documents/html/structacc__cal__result__t.html rename to documents/rss_api_html/structacc__cal__result__t.html diff --git a/documents/html/structacc__control__helper__t.html b/documents/rss_api_html/structacc__control__helper__t.html similarity index 100% rename from documents/html/structacc__control__helper__t.html rename to documents/rss_api_html/structacc__control__helper__t.html diff --git a/documents/html/structacc__detector__distance__result__t.html b/documents/rss_api_html/structacc__detector__distance__result__t.html similarity index 100% rename from documents/html/structacc__detector__distance__result__t.html rename to documents/rss_api_html/structacc__detector__distance__result__t.html diff --git a/documents/html/structacc__detector__presence__metadata__t.html b/documents/rss_api_html/structacc__detector__presence__metadata__t.html similarity index 100% rename from documents/html/structacc__detector__presence__metadata__t.html rename to documents/rss_api_html/structacc__detector__presence__metadata__t.html diff --git a/documents/html/structacc__detector__presence__result__t.html b/documents/rss_api_html/structacc__detector__presence__result__t.html similarity index 100% rename from documents/html/structacc__detector__presence__result__t.html rename to documents/rss_api_html/structacc__detector__presence__result__t.html diff --git a/documents/html/structacc__hal__a121__t.html b/documents/rss_api_html/structacc__hal__a121__t.html similarity index 100% rename from documents/html/structacc__hal__a121__t.html rename to documents/rss_api_html/structacc__hal__a121__t.html diff --git a/documents/html/structacc__hal__optimization__t.html b/documents/rss_api_html/structacc__hal__optimization__t.html similarity index 100% rename from documents/html/structacc__hal__optimization__t.html rename to documents/rss_api_html/structacc__hal__optimization__t.html diff --git a/documents/html/structacc__int16__complex__t.html b/documents/rss_api_html/structacc__int16__complex__t.html similarity index 100% rename from documents/html/structacc__int16__complex__t.html rename to documents/rss_api_html/structacc__int16__complex__t.html diff --git a/documents/html/structacc__processing__metadata__t.html b/documents/rss_api_html/structacc__processing__metadata__t.html similarity index 100% rename from documents/html/structacc__processing__metadata__t.html rename to documents/rss_api_html/structacc__processing__metadata__t.html diff --git a/documents/html/structacc__processing__result__t.html b/documents/rss_api_html/structacc__processing__result__t.html similarity index 100% rename from documents/html/structacc__processing__result__t.html rename to documents/rss_api_html/structacc__processing__result__t.html diff --git a/documents/html/structacc__ref__app__smart__presence__config__t.html b/documents/rss_api_html/structacc__ref__app__smart__presence__config__t.html similarity index 100% rename from documents/html/structacc__ref__app__smart__presence__config__t.html rename to documents/rss_api_html/structacc__ref__app__smart__presence__config__t.html diff --git a/documents/html/structacc__ref__app__smart__presence__wakeup__config__t.html b/documents/rss_api_html/structacc__ref__app__smart__presence__wakeup__config__t.html similarity index 100% rename from documents/html/structacc__ref__app__smart__presence__wakeup__config__t.html rename to documents/rss_api_html/structacc__ref__app__smart__presence__wakeup__config__t.html diff --git a/documents/html/structacc__ref__app__smart__presence__zone__config__t.html b/documents/rss_api_html/structacc__ref__app__smart__presence__zone__config__t.html similarity index 100% rename from documents/html/structacc__ref__app__smart__presence__zone__config__t.html rename to documents/rss_api_html/structacc__ref__app__smart__presence__zone__config__t.html diff --git a/documents/html/structacc__ref__app__tank__level__config__t.html b/documents/rss_api_html/structacc__ref__app__tank__level__config__t.html similarity index 100% rename from documents/html/structacc__ref__app__tank__level__config__t.html rename to documents/rss_api_html/structacc__ref__app__tank__level__config__t.html diff --git a/documents/html/structacc__reg__protocol__t.html b/documents/rss_api_html/structacc__reg__protocol__t.html similarity index 100% rename from documents/html/structacc__reg__protocol__t.html rename to documents/rss_api_html/structacc__reg__protocol__t.html diff --git a/documents/html/structacc__rss__assembly__test__result__t.html b/documents/rss_api_html/structacc__rss__assembly__test__result__t.html similarity index 100% rename from documents/html/structacc__rss__assembly__test__result__t.html rename to documents/rss_api_html/structacc__rss__assembly__test__result__t.html diff --git a/documents/html/structacc__smart__presence__result__t.html b/documents/rss_api_html/structacc__smart__presence__result__t.html similarity index 100% rename from documents/html/structacc__smart__presence__result__t.html rename to documents/rss_api_html/structacc__smart__presence__result__t.html diff --git a/documents/html/structacc__smart__presence__zone__result__t.html b/documents/rss_api_html/structacc__smart__presence__zone__result__t.html similarity index 100% rename from documents/html/structacc__smart__presence__zone__result__t.html rename to documents/rss_api_html/structacc__smart__presence__zone__result__t.html diff --git a/documents/html/structacc__surface__velocity__config__t.html b/documents/rss_api_html/structacc__surface__velocity__config__t.html similarity index 100% rename from documents/html/structacc__surface__velocity__config__t.html rename to documents/rss_api_html/structacc__surface__velocity__config__t.html diff --git a/documents/html/structacc__surface__velocity__handle__t.html b/documents/rss_api_html/structacc__surface__velocity__handle__t.html similarity index 100% rename from documents/html/structacc__surface__velocity__handle__t.html rename to documents/rss_api_html/structacc__surface__velocity__handle__t.html diff --git a/documents/html/structacc__surface__velocity__result__t.html b/documents/rss_api_html/structacc__surface__velocity__result__t.html similarity index 100% rename from documents/html/structacc__surface__velocity__result__t.html rename to documents/rss_api_html/structacc__surface__velocity__result__t.html diff --git a/documents/html/structacc__vector__float__t.html b/documents/rss_api_html/structacc__vector__float__t.html similarity index 100% rename from documents/html/structacc__vector__float__t.html rename to documents/rss_api_html/structacc__vector__float__t.html diff --git a/documents/html/structacc__vector__iq__t.html b/documents/rss_api_html/structacc__vector__iq__t.html similarity index 100% rename from documents/html/structacc__vector__iq__t.html rename to documents/rss_api_html/structacc__vector__iq__t.html diff --git a/documents/html/structapp__context__t.html b/documents/rss_api_html/structapp__context__t.html similarity index 100% rename from documents/html/structapp__context__t.html rename to documents/rss_api_html/structapp__context__t.html diff --git a/documents/html/structapp__result__t.html b/documents/rss_api_html/structapp__result__t.html similarity index 100% rename from documents/html/structapp__result__t.html rename to documents/rss_api_html/structapp__result__t.html diff --git a/documents/html/structdistance__detector__resources__t.html b/documents/rss_api_html/structdistance__detector__resources__t.html similarity index 100% rename from documents/html/structdistance__detector__resources__t.html rename to documents/rss_api_html/structdistance__detector__resources__t.html diff --git a/documents/html/structexample__config.html b/documents/rss_api_html/structexample__config.html similarity index 100% rename from documents/html/structexample__config.html rename to documents/rss_api_html/structexample__config.html diff --git a/documents/html/structexploration__server__interface__t.html b/documents/rss_api_html/structexploration__server__interface__t.html similarity index 100% rename from documents/html/structexploration__server__interface__t.html rename to documents/rss_api_html/structexploration__server__interface__t.html diff --git a/documents/html/structgpio__config__t.html b/documents/rss_api_html/structgpio__config__t.html similarity index 100% rename from documents/html/structgpio__config__t.html rename to documents/rss_api_html/structgpio__config__t.html diff --git a/documents/html/structout__fct__wrap__type.html b/documents/rss_api_html/structout__fct__wrap__type.html similarity index 100% rename from documents/html/structout__fct__wrap__type.html rename to documents/rss_api_html/structout__fct__wrap__type.html diff --git a/documents/html/structpresence__detector__context__t.html b/documents/rss_api_html/structpresence__detector__context__t.html similarity index 100% rename from documents/html/structpresence__detector__context__t.html rename to documents/rss_api_html/structpresence__detector__context__t.html diff --git a/documents/html/structpresence__detector__resources__t.html b/documents/rss_api_html/structpresence__detector__resources__t.html similarity index 100% rename from documents/html/structpresence__detector__resources__t.html rename to documents/rss_api_html/structpresence__detector__resources__t.html diff --git a/documents/html/structprint__buffer__t.html b/documents/rss_api_html/structprint__buffer__t.html similarity index 100% rename from documents/html/structprint__buffer__t.html rename to documents/rss_api_html/structprint__buffer__t.html diff --git a/documents/html/style.css b/documents/rss_api_html/style.css similarity index 100% rename from documents/html/style.css rename to documents/rss_api_html/style.css diff --git a/documents/html/sync_off.png b/documents/rss_api_html/sync_off.png similarity index 100% rename from documents/html/sync_off.png rename to documents/rss_api_html/sync_off.png diff --git a/documents/html/sync_on.png b/documents/rss_api_html/sync_on.png similarity index 100% rename from documents/html/sync_on.png rename to documents/rss_api_html/sync_on.png diff --git a/documents/html/syscalls_8c.html b/documents/rss_api_html/syscalls_8c.html similarity index 100% rename from documents/html/syscalls_8c.html rename to documents/rss_api_html/syscalls_8c.html diff --git a/documents/html/syscalls_8c_source.html b/documents/rss_api_html/syscalls_8c_source.html similarity index 100% rename from documents/html/syscalls_8c_source.html rename to documents/rss_api_html/syscalls_8c_source.html diff --git a/documents/html/sysmem_8c.html b/documents/rss_api_html/sysmem_8c.html similarity index 100% rename from documents/html/sysmem_8c.html rename to documents/rss_api_html/sysmem_8c.html diff --git a/documents/html/sysmem_8c_source.html b/documents/rss_api_html/sysmem_8c_source.html similarity index 100% rename from documents/html/sysmem_8c_source.html rename to documents/rss_api_html/sysmem_8c_source.html diff --git a/documents/html/tab_a.png b/documents/rss_api_html/tab_a.png similarity index 100% rename from documents/html/tab_a.png rename to documents/rss_api_html/tab_a.png diff --git a/documents/html/tab_b.png b/documents/rss_api_html/tab_b.png similarity index 100% rename from documents/html/tab_b.png rename to documents/rss_api_html/tab_b.png diff --git a/documents/html/tab_h.png b/documents/rss_api_html/tab_h.png similarity index 100% rename from documents/html/tab_h.png rename to documents/rss_api_html/tab_h.png diff --git a/documents/html/tab_s.png b/documents/rss_api_html/tab_s.png similarity index 100% rename from documents/html/tab_s.png rename to documents/rss_api_html/tab_s.png diff --git a/documents/html/tabs.css b/documents/rss_api_html/tabs.css similarity index 100% rename from documents/html/tabs.css rename to documents/rss_api_html/tabs.css From fdb1ab291505fe2682469af1440f538890118382 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 08:18:06 -0700 Subject: [PATCH 08/32] moved documents folder to docs, the correct and common name used --- .../A121 Assembly Test User Guide.pdf | Bin ...1 Breathing Reference Application User Guide.pdf | Bin .../A121 Distance Detector User Guide.pdf | Bin .../A121 Presence Detector User Guide.pdf | Bin .../A121 STM32CubeIDE User Guide.pdf | Bin .../A121 SW Integration User Guide.pdf | Bin ...rt Presence Reference Application User Guide.pdf | Bin .../A121 Sparse IQ Service User Guide.pdf | Bin ... Tank Level Reference Application User Guide.pdf | Bin {documents => docs}/BUILDINFO.txt | 0 {documents => docs}/Handbook.pdf | Bin .../I2C Distance Detector User Guide.pdf | Bin .../I2C Presence Detector User Guide.pdf | Bin {documents => docs}/XM125 Software User Guide.pdf | Bin {documents => docs}/rss_api.html | 0 {documents => docs}/rss_api_html/AcconeerLogo.png | Bin .../rss_api_html/acc__alg__basic__utils_8h.html | 0 .../acc__alg__basic__utils_8h_source.html | 0 .../rss_api_html/acc__algorithm_8c.html | 0 .../rss_api_html/acc__algorithm_8c_source.html | 0 .../rss_api_html/acc__algorithm_8h.html | 0 .../rss_api_html/acc__algorithm_8h_source.html | 0 .../rss_api_html/acc__config_8h.html | 0 .../rss_api_html/acc__config_8h_source.html | 0 .../rss_api_html/acc__config__subsweep_8h.html | 0 .../acc__config__subsweep_8h_source.html | 0 .../rss_api_html/acc__control__helper_8c.html | 0 .../acc__control__helper_8c_source.html | 0 .../rss_api_html/acc__control__helper_8h.html | 0 .../acc__control__helper_8h_source.html | 0 .../rss_api_html/acc__definitions__a121_8h.html | 0 .../acc__definitions__a121_8h_source.html | 0 .../rss_api_html/acc__definitions__common_8h.html | 0 .../acc__definitions__common_8h_source.html | 0 .../rss_api_html/acc__detector__distance_8h.html | 0 .../acc__detector__distance_8h_source.html | 0 .../acc__detector__distance__definitions_8h.html | 0 ...__detector__distance__definitions_8h_source.html | 0 .../rss_api_html/acc__detector__presence_8h.html | 0 .../acc__detector__presence_8h_source.html | 0 .../acc__exploration__server__base_8h.html | 0 .../acc__exploration__server__base_8h_source.html | 0 .../acc__exploration__server__stm32_8c.html | 0 .../acc__exploration__server__stm32_8c_source.html | 0 .../acc__exploration__server__stm32_8h.html | 0 .../acc__exploration__server__stm32_8h_source.html | 0 .../acc__hal__definitions__a121_8h.html | 0 .../acc__hal__definitions__a121_8h_source.html | 0 .../acc__hal__integration__a121_8h.html | 0 .../acc__hal__integration__a121_8h_source.html | 0 .../acc__hal__integration__stm32cube__xm_8c.html | 0 ...__hal__integration__stm32cube__xm_8c_source.html | 0 .../rss_api_html/acc__integration_8h.html | 0 .../rss_api_html/acc__integration_8h_source.html | 0 .../rss_api_html/acc__integration__cortex_8c.html | 0 .../acc__integration__cortex_8c_source.html | 0 .../rss_api_html/acc__integration__log_8c.html | 0 .../acc__integration__log_8c_source.html | 0 .../rss_api_html/acc__integration__log_8h.html | 0 .../acc__integration__log_8h_source.html | 0 .../rss_api_html/acc__integration__stm32_8c.html | 0 .../acc__integration__stm32_8c_source.html | 0 .../rss_api_html/acc__processing_8h.html | 0 .../rss_api_html/acc__processing_8h_source.html | 0 .../rss_api_html/acc__processing__helpers_8c.html | 0 .../acc__processing__helpers_8c_source.html | 0 .../rss_api_html/acc__processing__helpers_8h.html | 0 .../acc__processing__helpers_8h_source.html | 0 .../rss_api_html/acc__reg__protocol_8c.html | 0 .../rss_api_html/acc__reg__protocol_8c_source.html | 0 .../rss_api_html/acc__reg__protocol_8h.html | 0 .../rss_api_html/acc__reg__protocol_8h_source.html | 0 .../rss_api_html/acc__rss__a121_8h.html | 0 .../rss_api_html/acc__rss__a121_8h_source.html | 0 .../rss_api_html/acc__sensor_8h.html | 0 .../rss_api_html/acc__sensor_8h_source.html | 0 .../rss_api_html/acc__version_8h.html | 0 .../rss_api_html/acc__version_8h_source.html | 0 .../rss_api_html/acc__wrap__printf_8c.html | 0 .../rss_api_html/acc__wrap__printf_8c_source.html | 0 .../rss_api_html/acc_control_helper_8c-example.html | 0 .../acc_processing_helpers_8c-example.html | 0 {documents => docs}/rss_api_html/annotated.html | 0 {documents => docs}/rss_api_html/bc_s.png | Bin {documents => docs}/rss_api_html/bdwn.png | Bin {documents => docs}/rss_api_html/classes.html | 0 {documents => docs}/rss_api_html/closed.png | Bin .../dir_04f2ecc425faf0d475a3caf484e551f3.html | 0 .../dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html | 0 .../dir_073ccfab4bf11db73a8ee8eb161030da.html | 0 .../dir_08f02f6646c4dd9624ef093774b0b7f7.html | 0 .../dir_15c29f069e8c0144bc89b47ad62a396e.html | 0 .../dir_29751087315bdd66fec7ae73f3a3b3df.html | 0 .../dir_437c280191dc31797ff1fffcdbf26d60.html | 0 .../dir_5f3b126a0daad2440047e3d157f0734d.html | 0 .../dir_763f9730c6de1b6696aabb67bc8f2cb8.html | 0 .../dir_885ce7a5dfec3e0117d586c25f876c85.html | 0 .../dir_9037ad2fcf0acf58199e91c83d01aa83.html | 0 .../dir_90c50c4300347a3add62d58adc5f49d2.html | 0 .../dir_a90b80e01b24c51566f20c737761e66b.html | 0 .../dir_ab4160dc9345f344f1e5455bc8a8c5b6.html | 0 .../dir_b3a0981508daed4f615eb509e7de909b.html | 0 .../dir_bc91f92db1b66e0df5b21c879d8024f8.html | 0 .../dir_e68e8157741866f444e17edd764ebbae.html | 0 .../dir_eabfdd4d73a10cf1a95f85f69b256a94.html | 0 .../rss_api_html/distance__reg__protocol_8c.html | 0 .../distance__reg__protocol_8c_source.html | 0 .../rss_api_html/distance__reg__protocol_8h.html | 0 .../distance__reg__protocol_8h_source.html | 0 .../distance__reg__protocol__access_8c.html | 0 .../distance__reg__protocol__access_8c_source.html | 0 {documents => docs}/rss_api_html/doc.png | Bin {documents => docs}/rss_api_html/doxygen.css | 0 {documents => docs}/rss_api_html/doxygen.png | Bin {documents => docs}/rss_api_html/dynsections.js | 0 .../rss_api_html/example__bring__up_8c.html | 0 .../rss_api_html/example__bring__up_8c_source.html | 0 .../rss_api_html/example__bring__up_8h.html | 0 .../rss_api_html/example__bring__up_8h_source.html | 0 .../rss_api_html/example__control__helper_8c.html | 0 .../example__control__helper_8c_source.html | 0 .../rss_api_html/example__control__helper_8h.html | 0 .../example__control__helper_8h_source.html | 0 .../example__detector__distance_8c.html | 0 .../example__detector__distance_8c_source.html | 0 .../example__detector__distance_8h.html | 0 .../example__detector__distance_8h_source.html | 0 ...etector__distance__low__power__hibernate_8c.html | 0 ...__distance__low__power__hibernate_8c_source.html | 0 ...etector__distance__low__power__hibernate_8h.html | 0 ...__distance__low__power__hibernate_8h_source.html | 0 ...ple__detector__distance__low__power__off_8c.html | 0 ...tector__distance__low__power__off_8c_source.html | 0 ...ple__detector__distance__low__power__off_8h.html | 0 ...tector__distance__low__power__off_8h_source.html | 0 ...etector__distance__with__iq__data__print_8c.html | 0 ...__distance__with__iq__data__print_8c_source.html | 0 .../example__detector__presence_8c.html | 0 .../example__detector__presence_8c_source.html | 0 .../example__detector__presence_8h.html | 0 .../example__detector__presence_8h_source.html | 0 ...etector__presence__low__power__hibernate_8c.html | 0 ...__presence__low__power__hibernate_8c_source.html | 0 ...etector__presence__low__power__hibernate_8h.html | 0 ...__presence__low__power__hibernate_8h_source.html | 0 ...ple__detector__presence__low__power__off_8c.html | 0 ...tector__presence__low__power__off_8c_source.html | 0 ...ple__detector__presence__low__power__off_8h.html | 0 ...tector__presence__low__power__off_8h_source.html | 0 ...ctor__presence__multiple__configurations_8c.html | 0 ...resence__multiple__configurations_8c_source.html | 0 ...ctor__presence__multiple__configurations_8h.html | 0 ...resence__multiple__configurations_8h_source.html | 0 .../rss_api_html/example__diagnostic__test_8c.html | 0 .../example__diagnostic__test_8c_source.html | 0 .../rss_api_html/example__diagnostic__test_8h.html | 0 .../example__diagnostic__test_8h_source.html | 0 .../example__processing__amplitude_8c.html | 0 .../example__processing__amplitude_8c_source.html | 0 .../example__processing__amplitude_8h.html | 0 .../example__processing__amplitude_8h_source.html | 0 .../example__processing__coherent__mean_8c.html | 0 ...ample__processing__coherent__mean_8c_source.html | 0 .../example__processing__coherent__mean_8h.html | 0 ...ample__processing__coherent__mean_8h_source.html | 0 .../example__processing__noncoherent__mean_8c.html | 0 ...le__processing__noncoherent__mean_8c_source.html | 0 .../example__processing__noncoherent__mean_8h.html | 0 ...le__processing__noncoherent__mean_8h_source.html | 0 ...example__processing__peak__interpolation_8c.html | 0 ...__processing__peak__interpolation_8c_source.html | 0 ...example__processing__peak__interpolation_8h.html | 0 ...__processing__peak__interpolation_8h_source.html | 0 .../example__processing__static__presence_8c.html | 0 ...ple__processing__static__presence_8c_source.html | 0 .../example__processing__static__presence_8h.html | 0 ...ple__processing__static__presence_8h_source.html | 0 ...mple__processing__subtract__adaptive__bg_8c.html | 0 ...rocessing__subtract__adaptive__bg_8c_source.html | 0 ...mple__processing__subtract__adaptive__bg_8h.html | 0 ...rocessing__subtract__adaptive__bg_8h_source.html | 0 .../rss_api_html/example__service_8c.html | 0 .../rss_api_html/example__service_8c_source.html | 0 .../rss_api_html/example__service_8h.html | 0 .../rss_api_html/example__service_8h_source.html | 0 ...le__service__low__power__sensor__disable_8c.html | 0 ...vice__low__power__sensor__disable_8c_source.html | 0 ...le__service__low__power__sensor__disable_8h.html | 0 ...vice__low__power__sensor__disable_8h_source.html | 0 ...__service__low__power__sensor__hibernate_8c.html | 0 ...ce__low__power__sensor__hibernate_8c_source.html | 0 ...__service__low__power__sensor__hibernate_8h.html | 0 ...ce__low__power__sensor__hibernate_8h_source.html | 0 ...ample__service__multiple__configurations_8c.html | 0 ...service__multiple__configurations_8c_source.html | 0 ...ample__service__multiple__configurations_8h.html | 0 ...service__multiple__configurations_8h_source.html | 0 .../example__service__sensor__disable_8c.html | 0 ...example__service__sensor__disable_8c_source.html | 0 .../example__service__sensor__disable_8h.html | 0 ...example__service__sensor__disable_8h_source.html | 0 .../example__service__sensor__hibernate_8c.html | 0 ...ample__service__sensor__hibernate_8c_source.html | 0 .../example__service__sensor__hibernate_8h.html | 0 ...ample__service__sensor__hibernate_8h_source.html | 0 .../example__service__sensor__off_8c.html | 0 .../example__service__sensor__off_8c_source.html | 0 .../example__service__sensor__off_8h.html | 0 .../example__service__sensor__off_8h_source.html | 0 .../example__service__subsweeps_8c.html | 0 .../example__service__subsweeps_8c_source.html | 0 .../example__service__subsweeps_8h.html | 0 .../example__service__subsweeps_8h_source.html | 0 .../rss_api_html/example__surface__velocity_8c.html | 0 .../example__surface__velocity_8c_source.html | 0 .../rss_api_html/example__surface__velocity_8h.html | 0 .../example__surface__velocity_8h_source.html | 0 .../rss_api_html/example_bring_up_8c-example.html | 0 .../example_control_helper_8c-example.html | 0 .../example_detector_distance_8c-example.html | 0 ...tor_distance_low_power_hibernate_8c-example.html | 0 ..._detector_distance_low_power_off_8c-example.html | 0 ...ctor_distance_with_iq_data_print_8c-example.html | 0 .../example_detector_presence_8c-example.html | 0 ...tor_presence_low_power_hibernate_8c-example.html | 0 ..._detector_presence_low_power_off_8c-example.html | 0 ...presence_multiple_configurations_8c-example.html | 0 .../example_diagnostic_test_8c-example.html | 0 .../example_processing_amplitude_8c-example.html | 0 ...example_processing_coherent_mean_8c-example.html | 0 ...mple_processing_noncoherent_mean_8c-example.html | 0 ...le_processing_peak_interpolation_8c-example.html | 0 ...ample_processing_static_presence_8c-example.html | 0 ..._processing_subtract_adaptive_bg_8c-example.html | 0 .../rss_api_html/example_service_8c-example.html | 0 ...service_low_power_sensor_disable_8c-example.html | 0 ...rvice_low_power_sensor_hibernate_8c-example.html | 0 ..._service_multiple_configurations_8c-example.html | 0 .../example_service_sensor_disable_8c-example.html | 0 ...example_service_sensor_hibernate_8c-example.html | 0 .../example_service_sensor_off_8c-example.html | 0 .../example_service_subsweeps_8c-example.html | 0 {documents => docs}/rss_api_html/examples.html | 0 {documents => docs}/rss_api_html/examples.js | 0 {documents => docs}/rss_api_html/files.html | 0 {documents => docs}/rss_api_html/folderclosed.png | Bin {documents => docs}/rss_api_html/folderopen.png | Bin {documents => docs}/rss_api_html/functions.html | 0 {documents => docs}/rss_api_html/functions_b.html | 0 {documents => docs}/rss_api_html/functions_c.html | 0 {documents => docs}/rss_api_html/functions_d.html | 0 {documents => docs}/rss_api_html/functions_e.html | 0 {documents => docs}/rss_api_html/functions_f.html | 0 {documents => docs}/rss_api_html/functions_g.html | 0 {documents => docs}/rss_api_html/functions_h.html | 0 {documents => docs}/rss_api_html/functions_i.html | 0 {documents => docs}/rss_api_html/functions_l.html | 0 {documents => docs}/rss_api_html/functions_m.html | 0 {documents => docs}/rss_api_html/functions_n.html | 0 {documents => docs}/rss_api_html/functions_o.html | 0 {documents => docs}/rss_api_html/functions_p.html | 0 {documents => docs}/rss_api_html/functions_r.html | 0 {documents => docs}/rss_api_html/functions_s.html | 0 {documents => docs}/rss_api_html/functions_t.html | 0 {documents => docs}/rss_api_html/functions_u.html | 0 {documents => docs}/rss_api_html/functions_v.html | 0 .../rss_api_html/functions_vars.html | 0 .../rss_api_html/functions_vars_b.html | 0 .../rss_api_html/functions_vars_c.html | 0 .../rss_api_html/functions_vars_d.html | 0 .../rss_api_html/functions_vars_e.html | 0 .../rss_api_html/functions_vars_f.html | 0 .../rss_api_html/functions_vars_g.html | 0 .../rss_api_html/functions_vars_h.html | 0 .../rss_api_html/functions_vars_i.html | 0 .../rss_api_html/functions_vars_l.html | 0 .../rss_api_html/functions_vars_m.html | 0 .../rss_api_html/functions_vars_n.html | 0 .../rss_api_html/functions_vars_o.html | 0 .../rss_api_html/functions_vars_p.html | 0 .../rss_api_html/functions_vars_r.html | 0 .../rss_api_html/functions_vars_s.html | 0 .../rss_api_html/functions_vars_t.html | 0 .../rss_api_html/functions_vars_u.html | 0 .../rss_api_html/functions_vars_v.html | 0 .../rss_api_html/functions_vars_w.html | 0 .../rss_api_html/functions_vars_z.html | 0 {documents => docs}/rss_api_html/functions_w.html | 0 {documents => docs}/rss_api_html/functions_z.html | 0 {documents => docs}/rss_api_html/globals.html | 0 {documents => docs}/rss_api_html/globals_a.html | 0 {documents => docs}/rss_api_html/globals_b.html | 0 {documents => docs}/rss_api_html/globals_c.html | 0 {documents => docs}/rss_api_html/globals_d.html | 0 {documents => docs}/rss_api_html/globals_defs.html | 0 .../rss_api_html/globals_defs_b.html | 0 .../rss_api_html/globals_defs_c.html | 0 .../rss_api_html/globals_defs_d.html | 0 .../rss_api_html/globals_defs_e.html | 0 .../rss_api_html/globals_defs_f.html | 0 .../rss_api_html/globals_defs_g.html | 0 .../rss_api_html/globals_defs_h.html | 0 .../rss_api_html/globals_defs_i.html | 0 .../rss_api_html/globals_defs_l.html | 0 .../rss_api_html/globals_defs_m.html | 0 .../rss_api_html/globals_defs_n.html | 0 .../rss_api_html/globals_defs_p.html | 0 .../rss_api_html/globals_defs_r.html | 0 .../rss_api_html/globals_defs_s.html | 0 .../rss_api_html/globals_defs_t.html | 0 .../rss_api_html/globals_defs_u.html | 0 .../rss_api_html/globals_defs_v.html | 0 .../rss_api_html/globals_defs_w.html | 0 {documents => docs}/rss_api_html/globals_e.html | 0 {documents => docs}/rss_api_html/globals_enum.html | 0 {documents => docs}/rss_api_html/globals_eval.html | 0 {documents => docs}/rss_api_html/globals_f.html | 0 {documents => docs}/rss_api_html/globals_func.html | 0 .../rss_api_html/globals_func_a.html | 0 .../rss_api_html/globals_func_b.html | 0 .../rss_api_html/globals_func_c.html | 0 .../rss_api_html/globals_func_d.html | 0 .../rss_api_html/globals_func_e.html | 0 .../rss_api_html/globals_func_f.html | 0 .../rss_api_html/globals_func_g.html | 0 .../rss_api_html/globals_func_h.html | 0 .../rss_api_html/globals_func_i.html | 0 .../rss_api_html/globals_func_m.html | 0 .../rss_api_html/globals_func_n.html | 0 .../rss_api_html/globals_func_o.html | 0 .../rss_api_html/globals_func_p.html | 0 .../rss_api_html/globals_func_r.html | 0 .../rss_api_html/globals_func_s.html | 0 .../rss_api_html/globals_func_u.html | 0 .../rss_api_html/globals_func_v.html | 0 .../rss_api_html/globals_func_w.html | 0 {documents => docs}/rss_api_html/globals_g.html | 0 {documents => docs}/rss_api_html/globals_h.html | 0 {documents => docs}/rss_api_html/globals_i.html | 0 {documents => docs}/rss_api_html/globals_l.html | 0 {documents => docs}/rss_api_html/globals_m.html | 0 {documents => docs}/rss_api_html/globals_n.html | 0 {documents => docs}/rss_api_html/globals_o.html | 0 {documents => docs}/rss_api_html/globals_p.html | 0 {documents => docs}/rss_api_html/globals_r.html | 0 {documents => docs}/rss_api_html/globals_s.html | 0 {documents => docs}/rss_api_html/globals_t.html | 0 {documents => docs}/rss_api_html/globals_type.html | 0 {documents => docs}/rss_api_html/globals_u.html | 0 {documents => docs}/rss_api_html/globals_v.html | 0 {documents => docs}/rss_api_html/globals_vars.html | 0 {documents => docs}/rss_api_html/globals_w.html | 0 .../rss_api_html/group__Distance.html | 0 {documents => docs}/rss_api_html/group__Distance.js | 0 .../rss_api_html/group__Presence.html | 0 {documents => docs}/rss_api_html/group__Presence.js | 0 {documents => docs}/rss_api_html/group__config.html | 0 {documents => docs}/rss_api_html/group__config.js | 0 .../rss_api_html/group__processing.html | 0 .../rss_api_html/group__processing.js | 0 {documents => docs}/rss_api_html/group__rss.html | 0 {documents => docs}/rss_api_html/group__rss.js | 0 {documents => docs}/rss_api_html/group__sensor.html | 0 {documents => docs}/rss_api_html/group__sensor.js | 0 .../rss_api_html/group__service.html | 0 {documents => docs}/rss_api_html/group__service.js | 0 .../rss_api_html/group__subsweep.html | 0 {documents => docs}/rss_api_html/group__subsweep.js | 0 .../rss_api_html/i2c__application__system_8h.html | 0 .../i2c__application__system_8h_source.html | 0 .../i2c__application__system__stm32_8c.html | 0 .../i2c__application__system__stm32_8c_source.html | 0 .../rss_api_html/i2c__distance__detector_8c.html | 0 .../i2c__distance__detector_8c_source.html | 0 .../rss_api_html/i2c__distance__detector_8h.html | 0 .../i2c__distance__detector_8h_source.html | 0 .../rss_api_html/i2c__presence__detector_8c.html | 0 .../i2c__presence__detector_8c_source.html | 0 .../rss_api_html/i2c__presence__detector_8h.html | 0 .../i2c__presence__detector_8h_source.html | 0 {documents => docs}/rss_api_html/index.html | 0 {documents => docs}/rss_api_html/intro_8md.html | 0 {documents => docs}/rss_api_html/jquery.js | 0 {documents => docs}/rss_api_html/main_8h.html | 0 .../rss_api_html/main_8h_source.html | 0 {documents => docs}/rss_api_html/menu.js | 0 {documents => docs}/rss_api_html/menudata.js | 0 {documents => docs}/rss_api_html/modules.html | 0 {documents => docs}/rss_api_html/modules.js | 0 {documents => docs}/rss_api_html/nav_f.png | Bin {documents => docs}/rss_api_html/nav_g.png | Bin {documents => docs}/rss_api_html/nav_h.png | Bin {documents => docs}/rss_api_html/navtree.css | 0 {documents => docs}/rss_api_html/navtree.js | 0 {documents => docs}/rss_api_html/navtreedata.js | 0 {documents => docs}/rss_api_html/navtreeindex0.js | 0 {documents => docs}/rss_api_html/navtreeindex1.js | 0 {documents => docs}/rss_api_html/open.png | Bin .../rss_api_html/presence__reg__protocol_8c.html | 0 .../presence__reg__protocol_8c_source.html | 0 .../rss_api_html/presence__reg__protocol_8h.html | 0 .../presence__reg__protocol_8h_source.html | 0 .../presence__reg__protocol__access_8c.html | 0 .../presence__reg__protocol__access_8c_source.html | 0 {documents => docs}/rss_api_html/printf_8c.html | 0 .../rss_api_html/printf_8c_source.html | 0 {documents => docs}/rss_api_html/printf_8h.html | 0 .../rss_api_html/printf_8h_source.html | 0 .../rss_api_html/ref__app__breathing_8c.html | 0 .../rss_api_html/ref__app__breathing_8c_source.html | 0 .../rss_api_html/ref__app__breathing_8h.html | 0 .../rss_api_html/ref__app__breathing_8h_source.html | 0 .../rss_api_html/ref__app__smart__presence_8c.html | 0 .../ref__app__smart__presence_8c_source.html | 0 .../rss_api_html/ref__app__smart__presence_8h.html | 0 .../ref__app__smart__presence_8h_source.html | 0 .../rss_api_html/ref__app__tank__level_8c.html | 0 .../ref__app__tank__level_8c_source.html | 0 .../rss_api_html/ref__app__tank__level_8h.html | 0 .../ref__app__tank__level_8h_source.html | 0 .../rss_api_html/ref_app_tank_level_8c-example.html | 0 {documents => docs}/rss_api_html/resize.js | 0 {documents => docs}/rss_api_html/search/all_0.html | 0 {documents => docs}/rss_api_html/search/all_0.js | 0 {documents => docs}/rss_api_html/search/all_1.html | 0 {documents => docs}/rss_api_html/search/all_1.js | 0 {documents => docs}/rss_api_html/search/all_10.html | 0 {documents => docs}/rss_api_html/search/all_10.js | 0 {documents => docs}/rss_api_html/search/all_11.html | 0 {documents => docs}/rss_api_html/search/all_11.js | 0 {documents => docs}/rss_api_html/search/all_12.html | 0 {documents => docs}/rss_api_html/search/all_12.js | 0 {documents => docs}/rss_api_html/search/all_13.html | 0 {documents => docs}/rss_api_html/search/all_13.js | 0 {documents => docs}/rss_api_html/search/all_14.html | 0 {documents => docs}/rss_api_html/search/all_14.js | 0 {documents => docs}/rss_api_html/search/all_15.html | 0 {documents => docs}/rss_api_html/search/all_15.js | 0 {documents => docs}/rss_api_html/search/all_2.html | 0 {documents => docs}/rss_api_html/search/all_2.js | 0 {documents => docs}/rss_api_html/search/all_3.html | 0 {documents => docs}/rss_api_html/search/all_3.js | 0 {documents => docs}/rss_api_html/search/all_4.html | 0 {documents => docs}/rss_api_html/search/all_4.js | 0 {documents => docs}/rss_api_html/search/all_5.html | 0 {documents => docs}/rss_api_html/search/all_5.js | 0 {documents => docs}/rss_api_html/search/all_6.html | 0 {documents => docs}/rss_api_html/search/all_6.js | 0 {documents => docs}/rss_api_html/search/all_7.html | 0 {documents => docs}/rss_api_html/search/all_7.js | 0 {documents => docs}/rss_api_html/search/all_8.html | 0 {documents => docs}/rss_api_html/search/all_8.js | 0 {documents => docs}/rss_api_html/search/all_9.html | 0 {documents => docs}/rss_api_html/search/all_9.js | 0 {documents => docs}/rss_api_html/search/all_a.html | 0 {documents => docs}/rss_api_html/search/all_a.js | 0 {documents => docs}/rss_api_html/search/all_b.html | 0 {documents => docs}/rss_api_html/search/all_b.js | 0 {documents => docs}/rss_api_html/search/all_c.html | 0 {documents => docs}/rss_api_html/search/all_c.js | 0 {documents => docs}/rss_api_html/search/all_d.html | 0 {documents => docs}/rss_api_html/search/all_d.js | 0 {documents => docs}/rss_api_html/search/all_e.html | 0 {documents => docs}/rss_api_html/search/all_e.js | 0 {documents => docs}/rss_api_html/search/all_f.html | 0 {documents => docs}/rss_api_html/search/all_f.js | 0 .../rss_api_html/search/classes_0.html | 0 .../rss_api_html/search/classes_0.js | 0 .../rss_api_html/search/classes_1.html | 0 .../rss_api_html/search/classes_1.js | 0 .../rss_api_html/search/classes_2.html | 0 .../rss_api_html/search/classes_2.js | 0 .../rss_api_html/search/classes_3.html | 0 .../rss_api_html/search/classes_3.js | 0 .../rss_api_html/search/classes_4.html | 0 .../rss_api_html/search/classes_4.js | 0 .../rss_api_html/search/classes_5.html | 0 .../rss_api_html/search/classes_5.js | 0 {documents => docs}/rss_api_html/search/close.png | Bin .../rss_api_html/search/defines_0.html | 0 .../rss_api_html/search/defines_0.js | 0 .../rss_api_html/search/defines_1.html | 0 .../rss_api_html/search/defines_1.js | 0 .../rss_api_html/search/defines_10.html | 0 .../rss_api_html/search/defines_10.js | 0 .../rss_api_html/search/defines_11.html | 0 .../rss_api_html/search/defines_11.js | 0 .../rss_api_html/search/defines_12.html | 0 .../rss_api_html/search/defines_12.js | 0 .../rss_api_html/search/defines_2.html | 0 .../rss_api_html/search/defines_2.js | 0 .../rss_api_html/search/defines_3.html | 0 .../rss_api_html/search/defines_3.js | 0 .../rss_api_html/search/defines_4.html | 0 .../rss_api_html/search/defines_4.js | 0 .../rss_api_html/search/defines_5.html | 0 .../rss_api_html/search/defines_5.js | 0 .../rss_api_html/search/defines_6.html | 0 .../rss_api_html/search/defines_6.js | 0 .../rss_api_html/search/defines_7.html | 0 .../rss_api_html/search/defines_7.js | 0 .../rss_api_html/search/defines_8.html | 0 .../rss_api_html/search/defines_8.js | 0 .../rss_api_html/search/defines_9.html | 0 .../rss_api_html/search/defines_9.js | 0 .../rss_api_html/search/defines_a.html | 0 .../rss_api_html/search/defines_a.js | 0 .../rss_api_html/search/defines_b.html | 0 .../rss_api_html/search/defines_b.js | 0 .../rss_api_html/search/defines_c.html | 0 .../rss_api_html/search/defines_c.js | 0 .../rss_api_html/search/defines_d.html | 0 .../rss_api_html/search/defines_d.js | 0 .../rss_api_html/search/defines_e.html | 0 .../rss_api_html/search/defines_e.js | 0 .../rss_api_html/search/defines_f.html | 0 .../rss_api_html/search/defines_f.js | 0 .../rss_api_html/search/enums_0.html | 0 {documents => docs}/rss_api_html/search/enums_0.js | 0 .../rss_api_html/search/enums_1.html | 0 {documents => docs}/rss_api_html/search/enums_1.js | 0 .../rss_api_html/search/enums_2.html | 0 {documents => docs}/rss_api_html/search/enums_2.js | 0 .../rss_api_html/search/enums_3.html | 0 {documents => docs}/rss_api_html/search/enums_3.js | 0 .../rss_api_html/search/enums_4.html | 0 {documents => docs}/rss_api_html/search/enums_4.js | 0 .../rss_api_html/search/enums_5.html | 0 {documents => docs}/rss_api_html/search/enums_5.js | 0 .../rss_api_html/search/enumvalues_0.html | 0 .../rss_api_html/search/enumvalues_0.js | 0 .../rss_api_html/search/enumvalues_1.html | 0 .../rss_api_html/search/enumvalues_1.js | 0 .../rss_api_html/search/enumvalues_2.html | 0 .../rss_api_html/search/enumvalues_2.js | 0 .../rss_api_html/search/enumvalues_3.html | 0 .../rss_api_html/search/enumvalues_3.js | 0 .../rss_api_html/search/enumvalues_4.html | 0 .../rss_api_html/search/enumvalues_4.js | 0 .../rss_api_html/search/enumvalues_5.html | 0 .../rss_api_html/search/enumvalues_5.js | 0 .../rss_api_html/search/enumvalues_6.html | 0 .../rss_api_html/search/enumvalues_6.js | 0 .../rss_api_html/search/files_0.html | 0 {documents => docs}/rss_api_html/search/files_0.js | 0 .../rss_api_html/search/files_1.html | 0 {documents => docs}/rss_api_html/search/files_1.js | 0 .../rss_api_html/search/files_2.html | 0 {documents => docs}/rss_api_html/search/files_2.js | 0 .../rss_api_html/search/files_3.html | 0 {documents => docs}/rss_api_html/search/files_3.js | 0 .../rss_api_html/search/files_4.html | 0 {documents => docs}/rss_api_html/search/files_4.js | 0 .../rss_api_html/search/files_5.html | 0 {documents => docs}/rss_api_html/search/files_5.js | 0 .../rss_api_html/search/files_6.html | 0 {documents => docs}/rss_api_html/search/files_6.js | 0 .../rss_api_html/search/files_7.html | 0 {documents => docs}/rss_api_html/search/files_7.js | 0 .../rss_api_html/search/functions_0.html | 0 .../rss_api_html/search/functions_0.js | 0 .../rss_api_html/search/functions_1.html | 0 .../rss_api_html/search/functions_1.js | 0 .../rss_api_html/search/functions_10.html | 0 .../rss_api_html/search/functions_10.js | 0 .../rss_api_html/search/functions_11.html | 0 .../rss_api_html/search/functions_11.js | 0 .../rss_api_html/search/functions_12.html | 0 .../rss_api_html/search/functions_12.js | 0 .../rss_api_html/search/functions_2.html | 0 .../rss_api_html/search/functions_2.js | 0 .../rss_api_html/search/functions_3.html | 0 .../rss_api_html/search/functions_3.js | 0 .../rss_api_html/search/functions_4.html | 0 .../rss_api_html/search/functions_4.js | 0 .../rss_api_html/search/functions_5.html | 0 .../rss_api_html/search/functions_5.js | 0 .../rss_api_html/search/functions_6.html | 0 .../rss_api_html/search/functions_6.js | 0 .../rss_api_html/search/functions_7.html | 0 .../rss_api_html/search/functions_7.js | 0 .../rss_api_html/search/functions_8.html | 0 .../rss_api_html/search/functions_8.js | 0 .../rss_api_html/search/functions_9.html | 0 .../rss_api_html/search/functions_9.js | 0 .../rss_api_html/search/functions_a.html | 0 .../rss_api_html/search/functions_a.js | 0 .../rss_api_html/search/functions_b.html | 0 .../rss_api_html/search/functions_b.js | 0 .../rss_api_html/search/functions_c.html | 0 .../rss_api_html/search/functions_c.js | 0 .../rss_api_html/search/functions_d.html | 0 .../rss_api_html/search/functions_d.js | 0 .../rss_api_html/search/functions_e.html | 0 .../rss_api_html/search/functions_e.js | 0 .../rss_api_html/search/functions_f.html | 0 .../rss_api_html/search/functions_f.js | 0 .../rss_api_html/search/groups_0.html | 0 {documents => docs}/rss_api_html/search/groups_0.js | 0 .../rss_api_html/search/groups_1.html | 0 {documents => docs}/rss_api_html/search/groups_1.js | 0 .../rss_api_html/search/groups_2.html | 0 {documents => docs}/rss_api_html/search/groups_2.js | 0 .../rss_api_html/search/groups_3.html | 0 {documents => docs}/rss_api_html/search/groups_3.js | 0 .../rss_api_html/search/groups_4.html | 0 {documents => docs}/rss_api_html/search/groups_4.js | 0 {documents => docs}/rss_api_html/search/mag_sel.png | Bin .../rss_api_html/search/nomatches.html | 0 {documents => docs}/rss_api_html/search/search.css | 0 {documents => docs}/rss_api_html/search/search.js | 0 .../rss_api_html/search/search_l.png | Bin .../rss_api_html/search/search_m.png | Bin .../rss_api_html/search/search_r.png | Bin .../rss_api_html/search/searchdata.js | 0 .../rss_api_html/search/typedefs_0.html | 0 .../rss_api_html/search/typedefs_0.js | 0 .../rss_api_html/search/typedefs_1.html | 0 .../rss_api_html/search/typedefs_1.js | 0 .../rss_api_html/search/typedefs_2.html | 0 .../rss_api_html/search/typedefs_2.js | 0 .../rss_api_html/search/typedefs_3.html | 0 .../rss_api_html/search/typedefs_3.js | 0 .../rss_api_html/search/typedefs_4.html | 0 .../rss_api_html/search/typedefs_4.js | 0 .../rss_api_html/search/typedefs_5.html | 0 .../rss_api_html/search/typedefs_5.js | 0 .../rss_api_html/search/typedefs_6.html | 0 .../rss_api_html/search/typedefs_6.js | 0 .../rss_api_html/search/variables_0.html | 0 .../rss_api_html/search/variables_0.js | 0 .../rss_api_html/search/variables_1.html | 0 .../rss_api_html/search/variables_1.js | 0 .../rss_api_html/search/variables_10.html | 0 .../rss_api_html/search/variables_10.js | 0 .../rss_api_html/search/variables_11.html | 0 .../rss_api_html/search/variables_11.js | 0 .../rss_api_html/search/variables_12.html | 0 .../rss_api_html/search/variables_12.js | 0 .../rss_api_html/search/variables_13.html | 0 .../rss_api_html/search/variables_13.js | 0 .../rss_api_html/search/variables_14.html | 0 .../rss_api_html/search/variables_14.js | 0 .../rss_api_html/search/variables_15.html | 0 .../rss_api_html/search/variables_15.js | 0 .../rss_api_html/search/variables_2.html | 0 .../rss_api_html/search/variables_2.js | 0 .../rss_api_html/search/variables_3.html | 0 .../rss_api_html/search/variables_3.js | 0 .../rss_api_html/search/variables_4.html | 0 .../rss_api_html/search/variables_4.js | 0 .../rss_api_html/search/variables_5.html | 0 .../rss_api_html/search/variables_5.js | 0 .../rss_api_html/search/variables_6.html | 0 .../rss_api_html/search/variables_6.js | 0 .../rss_api_html/search/variables_7.html | 0 .../rss_api_html/search/variables_7.js | 0 .../rss_api_html/search/variables_8.html | 0 .../rss_api_html/search/variables_8.js | 0 .../rss_api_html/search/variables_9.html | 0 .../rss_api_html/search/variables_9.js | 0 .../rss_api_html/search/variables_a.html | 0 .../rss_api_html/search/variables_a.js | 0 .../rss_api_html/search/variables_b.html | 0 .../rss_api_html/search/variables_b.js | 0 .../rss_api_html/search/variables_c.html | 0 .../rss_api_html/search/variables_c.js | 0 .../rss_api_html/search/variables_d.html | 0 .../rss_api_html/search/variables_d.js | 0 .../rss_api_html/search/variables_e.html | 0 .../rss_api_html/search/variables_e.js | 0 .../rss_api_html/search/variables_f.html | 0 .../rss_api_html/search/variables_f.js | 0 .../spinnaker-v11-latin-regular.eot | Bin .../spinnaker-v11-latin-regular.svg | 0 .../spinnaker-v11-latin-regular.ttf | Bin .../spinnaker-v11-latin-regular.woff | Bin .../spinnaker-v11-latin-regular.woff2 | Bin {documents => docs}/rss_api_html/splitbar.png | Bin .../rss_api_html/stm32l4xx__hal__conf_8h.html | 0 .../stm32l4xx__hal__conf_8h_source.html | 0 .../rss_api_html/stm32l4xx__hal__msp_8c.html | 0 .../rss_api_html/stm32l4xx__hal__msp_8c_source.html | 0 .../rss_api_html/stm32l4xx__it_8c.html | 0 .../rss_api_html/stm32l4xx__it_8c_source.html | 0 .../rss_api_html/stm32l4xx__it_8h.html | 0 .../rss_api_html/stm32l4xx__it_8h_source.html | 0 .../structacc__breathing__config__t.html | 0 .../structacc__breathing__handle__t.html | 0 .../structacc__breathing__result__t.html | 0 .../rss_api_html/structacc__cal__info__t.html | 0 .../rss_api_html/structacc__cal__result__t.html | 0 .../rss_api_html/structacc__control__helper__t.html | 0 .../structacc__detector__distance__result__t.html | 0 .../structacc__detector__presence__metadata__t.html | 0 .../structacc__detector__presence__result__t.html | 0 .../rss_api_html/structacc__hal__a121__t.html | 0 .../structacc__hal__optimization__t.html | 0 .../rss_api_html/structacc__int16__complex__t.html | 0 .../structacc__processing__metadata__t.html | 0 .../structacc__processing__result__t.html | 0 ...ctacc__ref__app__smart__presence__config__t.html | 0 ...ef__app__smart__presence__wakeup__config__t.html | 0 ..._ref__app__smart__presence__zone__config__t.html | 0 ...structacc__ref__app__tank__level__config__t.html | 0 .../rss_api_html/structacc__reg__protocol__t.html | 0 .../structacc__rss__assembly__test__result__t.html | 0 .../structacc__smart__presence__result__t.html | 0 ...structacc__smart__presence__zone__result__t.html | 0 .../structacc__surface__velocity__config__t.html | 0 .../structacc__surface__velocity__handle__t.html | 0 .../structacc__surface__velocity__result__t.html | 0 .../rss_api_html/structacc__vector__float__t.html | 0 .../rss_api_html/structacc__vector__iq__t.html | 0 .../rss_api_html/structapp__context__t.html | 0 .../rss_api_html/structapp__result__t.html | 0 .../structdistance__detector__resources__t.html | 0 .../rss_api_html/structexample__config.html | 0 .../structexploration__server__interface__t.html | 0 .../rss_api_html/structgpio__config__t.html | 0 .../rss_api_html/structout__fct__wrap__type.html | 0 .../structpresence__detector__context__t.html | 0 .../structpresence__detector__resources__t.html | 0 .../rss_api_html/structprint__buffer__t.html | 0 {documents => docs}/rss_api_html/style.css | 0 {documents => docs}/rss_api_html/sync_off.png | Bin {documents => docs}/rss_api_html/sync_on.png | Bin {documents => docs}/rss_api_html/syscalls_8c.html | 0 .../rss_api_html/syscalls_8c_source.html | 0 {documents => docs}/rss_api_html/sysmem_8c.html | 0 .../rss_api_html/sysmem_8c_source.html | 0 {documents => docs}/rss_api_html/tab_a.png | Bin {documents => docs}/rss_api_html/tab_b.png | Bin {documents => docs}/rss_api_html/tab_h.png | Bin {documents => docs}/rss_api_html/tab_s.png | Bin {documents => docs}/rss_api_html/tabs.css | 0 736 files changed, 0 insertions(+), 0 deletions(-) rename {documents => docs}/A121 Assembly Test User Guide.pdf (100%) rename {documents => docs}/A121 Breathing Reference Application User Guide.pdf (100%) rename {documents => docs}/A121 Distance Detector User Guide.pdf (100%) rename {documents => docs}/A121 Presence Detector User Guide.pdf (100%) rename {documents => docs}/A121 STM32CubeIDE User Guide.pdf (100%) rename {documents => docs}/A121 SW Integration User Guide.pdf (100%) rename {documents => docs}/A121 Smart Presence Reference Application User Guide.pdf (100%) rename {documents => docs}/A121 Sparse IQ Service User Guide.pdf (100%) rename {documents => docs}/A121 Tank Level Reference Application User Guide.pdf (100%) rename {documents => docs}/BUILDINFO.txt (100%) rename {documents => docs}/Handbook.pdf (100%) rename {documents => docs}/I2C Distance Detector User Guide.pdf (100%) rename {documents => docs}/I2C Presence Detector User Guide.pdf (100%) rename {documents => docs}/XM125 Software User Guide.pdf (100%) rename {documents => docs}/rss_api.html (100%) rename {documents => docs}/rss_api_html/AcconeerLogo.png (100%) rename {documents => docs}/rss_api_html/acc__alg__basic__utils_8h.html (100%) rename {documents => docs}/rss_api_html/acc__alg__basic__utils_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__algorithm_8c.html (100%) rename {documents => docs}/rss_api_html/acc__algorithm_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc__algorithm_8h.html (100%) rename {documents => docs}/rss_api_html/acc__algorithm_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__config_8h.html (100%) rename {documents => docs}/rss_api_html/acc__config_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__config__subsweep_8h.html (100%) rename {documents => docs}/rss_api_html/acc__config__subsweep_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__control__helper_8c.html (100%) rename {documents => docs}/rss_api_html/acc__control__helper_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc__control__helper_8h.html (100%) rename {documents => docs}/rss_api_html/acc__control__helper_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__definitions__a121_8h.html (100%) rename {documents => docs}/rss_api_html/acc__definitions__a121_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__definitions__common_8h.html (100%) rename {documents => docs}/rss_api_html/acc__definitions__common_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__detector__distance_8h.html (100%) rename {documents => docs}/rss_api_html/acc__detector__distance_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__detector__distance__definitions_8h.html (100%) rename {documents => docs}/rss_api_html/acc__detector__distance__definitions_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__detector__presence_8h.html (100%) rename {documents => docs}/rss_api_html/acc__detector__presence_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__exploration__server__base_8h.html (100%) rename {documents => docs}/rss_api_html/acc__exploration__server__base_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__exploration__server__stm32_8c.html (100%) rename {documents => docs}/rss_api_html/acc__exploration__server__stm32_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc__exploration__server__stm32_8h.html (100%) rename {documents => docs}/rss_api_html/acc__exploration__server__stm32_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__hal__definitions__a121_8h.html (100%) rename {documents => docs}/rss_api_html/acc__hal__definitions__a121_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__hal__integration__a121_8h.html (100%) rename {documents => docs}/rss_api_html/acc__hal__integration__a121_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__hal__integration__stm32cube__xm_8c.html (100%) rename {documents => docs}/rss_api_html/acc__hal__integration__stm32cube__xm_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc__integration_8h.html (100%) rename {documents => docs}/rss_api_html/acc__integration_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__integration__cortex_8c.html (100%) rename {documents => docs}/rss_api_html/acc__integration__cortex_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc__integration__log_8c.html (100%) rename {documents => docs}/rss_api_html/acc__integration__log_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc__integration__log_8h.html (100%) rename {documents => docs}/rss_api_html/acc__integration__log_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__integration__stm32_8c.html (100%) rename {documents => docs}/rss_api_html/acc__integration__stm32_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc__processing_8h.html (100%) rename {documents => docs}/rss_api_html/acc__processing_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__processing__helpers_8c.html (100%) rename {documents => docs}/rss_api_html/acc__processing__helpers_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc__processing__helpers_8h.html (100%) rename {documents => docs}/rss_api_html/acc__processing__helpers_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__reg__protocol_8c.html (100%) rename {documents => docs}/rss_api_html/acc__reg__protocol_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc__reg__protocol_8h.html (100%) rename {documents => docs}/rss_api_html/acc__reg__protocol_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__rss__a121_8h.html (100%) rename {documents => docs}/rss_api_html/acc__rss__a121_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__sensor_8h.html (100%) rename {documents => docs}/rss_api_html/acc__sensor_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__version_8h.html (100%) rename {documents => docs}/rss_api_html/acc__version_8h_source.html (100%) rename {documents => docs}/rss_api_html/acc__wrap__printf_8c.html (100%) rename {documents => docs}/rss_api_html/acc__wrap__printf_8c_source.html (100%) rename {documents => docs}/rss_api_html/acc_control_helper_8c-example.html (100%) rename {documents => docs}/rss_api_html/acc_processing_helpers_8c-example.html (100%) rename {documents => docs}/rss_api_html/annotated.html (100%) rename {documents => docs}/rss_api_html/bc_s.png (100%) rename {documents => docs}/rss_api_html/bdwn.png (100%) rename {documents => docs}/rss_api_html/classes.html (100%) rename {documents => docs}/rss_api_html/closed.png (100%) rename {documents => docs}/rss_api_html/dir_04f2ecc425faf0d475a3caf484e551f3.html (100%) rename {documents => docs}/rss_api_html/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html (100%) rename {documents => docs}/rss_api_html/dir_073ccfab4bf11db73a8ee8eb161030da.html (100%) rename {documents => docs}/rss_api_html/dir_08f02f6646c4dd9624ef093774b0b7f7.html (100%) rename {documents => docs}/rss_api_html/dir_15c29f069e8c0144bc89b47ad62a396e.html (100%) rename {documents => docs}/rss_api_html/dir_29751087315bdd66fec7ae73f3a3b3df.html (100%) rename {documents => docs}/rss_api_html/dir_437c280191dc31797ff1fffcdbf26d60.html (100%) rename {documents => docs}/rss_api_html/dir_5f3b126a0daad2440047e3d157f0734d.html (100%) rename {documents => docs}/rss_api_html/dir_763f9730c6de1b6696aabb67bc8f2cb8.html (100%) rename {documents => docs}/rss_api_html/dir_885ce7a5dfec3e0117d586c25f876c85.html (100%) rename {documents => docs}/rss_api_html/dir_9037ad2fcf0acf58199e91c83d01aa83.html (100%) rename {documents => docs}/rss_api_html/dir_90c50c4300347a3add62d58adc5f49d2.html (100%) rename {documents => docs}/rss_api_html/dir_a90b80e01b24c51566f20c737761e66b.html (100%) rename {documents => docs}/rss_api_html/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html (100%) rename {documents => docs}/rss_api_html/dir_b3a0981508daed4f615eb509e7de909b.html (100%) rename {documents => docs}/rss_api_html/dir_bc91f92db1b66e0df5b21c879d8024f8.html (100%) rename {documents => docs}/rss_api_html/dir_e68e8157741866f444e17edd764ebbae.html (100%) rename {documents => docs}/rss_api_html/dir_eabfdd4d73a10cf1a95f85f69b256a94.html (100%) rename {documents => docs}/rss_api_html/distance__reg__protocol_8c.html (100%) rename {documents => docs}/rss_api_html/distance__reg__protocol_8c_source.html (100%) rename {documents => docs}/rss_api_html/distance__reg__protocol_8h.html (100%) rename {documents => docs}/rss_api_html/distance__reg__protocol_8h_source.html (100%) rename {documents => docs}/rss_api_html/distance__reg__protocol__access_8c.html (100%) rename {documents => docs}/rss_api_html/distance__reg__protocol__access_8c_source.html (100%) rename {documents => docs}/rss_api_html/doc.png (100%) rename {documents => docs}/rss_api_html/doxygen.css (100%) rename {documents => docs}/rss_api_html/doxygen.png (100%) rename {documents => docs}/rss_api_html/dynsections.js (100%) rename {documents => docs}/rss_api_html/example__bring__up_8c.html (100%) rename {documents => docs}/rss_api_html/example__bring__up_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__bring__up_8h.html (100%) rename {documents => docs}/rss_api_html/example__bring__up_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__control__helper_8c.html (100%) rename {documents => docs}/rss_api_html/example__control__helper_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__control__helper_8h.html (100%) rename {documents => docs}/rss_api_html/example__control__helper_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance_8c.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance_8h.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__low__power__hibernate_8c.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__low__power__hibernate_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__low__power__hibernate_8h.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__low__power__hibernate_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__low__power__off_8c.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__low__power__off_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__low__power__off_8h.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__low__power__off_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__with__iq__data__print_8c.html (100%) rename {documents => docs}/rss_api_html/example__detector__distance__with__iq__data__print_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence_8c.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence_8h.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__low__power__hibernate_8c.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__low__power__hibernate_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__low__power__hibernate_8h.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__low__power__hibernate_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__low__power__off_8c.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__low__power__off_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__low__power__off_8h.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__low__power__off_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__multiple__configurations_8c.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__multiple__configurations_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__multiple__configurations_8h.html (100%) rename {documents => docs}/rss_api_html/example__detector__presence__multiple__configurations_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__diagnostic__test_8c.html (100%) rename {documents => docs}/rss_api_html/example__diagnostic__test_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__diagnostic__test_8h.html (100%) rename {documents => docs}/rss_api_html/example__diagnostic__test_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__amplitude_8c.html (100%) rename {documents => docs}/rss_api_html/example__processing__amplitude_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__amplitude_8h.html (100%) rename {documents => docs}/rss_api_html/example__processing__amplitude_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__coherent__mean_8c.html (100%) rename {documents => docs}/rss_api_html/example__processing__coherent__mean_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__coherent__mean_8h.html (100%) rename {documents => docs}/rss_api_html/example__processing__coherent__mean_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__noncoherent__mean_8c.html (100%) rename {documents => docs}/rss_api_html/example__processing__noncoherent__mean_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__noncoherent__mean_8h.html (100%) rename {documents => docs}/rss_api_html/example__processing__noncoherent__mean_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__peak__interpolation_8c.html (100%) rename {documents => docs}/rss_api_html/example__processing__peak__interpolation_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__peak__interpolation_8h.html (100%) rename {documents => docs}/rss_api_html/example__processing__peak__interpolation_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__static__presence_8c.html (100%) rename {documents => docs}/rss_api_html/example__processing__static__presence_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__static__presence_8h.html (100%) rename {documents => docs}/rss_api_html/example__processing__static__presence_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__subtract__adaptive__bg_8c.html (100%) rename {documents => docs}/rss_api_html/example__processing__subtract__adaptive__bg_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__processing__subtract__adaptive__bg_8h.html (100%) rename {documents => docs}/rss_api_html/example__processing__subtract__adaptive__bg_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__service_8c.html (100%) rename {documents => docs}/rss_api_html/example__service_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__service_8h.html (100%) rename {documents => docs}/rss_api_html/example__service_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__service__low__power__sensor__disable_8c.html (100%) rename {documents => docs}/rss_api_html/example__service__low__power__sensor__disable_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__service__low__power__sensor__disable_8h.html (100%) rename {documents => docs}/rss_api_html/example__service__low__power__sensor__disable_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__service__low__power__sensor__hibernate_8c.html (100%) rename {documents => docs}/rss_api_html/example__service__low__power__sensor__hibernate_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__service__low__power__sensor__hibernate_8h.html (100%) rename {documents => docs}/rss_api_html/example__service__low__power__sensor__hibernate_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__service__multiple__configurations_8c.html (100%) rename {documents => docs}/rss_api_html/example__service__multiple__configurations_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__service__multiple__configurations_8h.html (100%) rename {documents => docs}/rss_api_html/example__service__multiple__configurations_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__disable_8c.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__disable_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__disable_8h.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__disable_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__hibernate_8c.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__hibernate_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__hibernate_8h.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__hibernate_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__off_8c.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__off_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__off_8h.html (100%) rename {documents => docs}/rss_api_html/example__service__sensor__off_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__service__subsweeps_8c.html (100%) rename {documents => docs}/rss_api_html/example__service__subsweeps_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__service__subsweeps_8h.html (100%) rename {documents => docs}/rss_api_html/example__service__subsweeps_8h_source.html (100%) rename {documents => docs}/rss_api_html/example__surface__velocity_8c.html (100%) rename {documents => docs}/rss_api_html/example__surface__velocity_8c_source.html (100%) rename {documents => docs}/rss_api_html/example__surface__velocity_8h.html (100%) rename {documents => docs}/rss_api_html/example__surface__velocity_8h_source.html (100%) rename {documents => docs}/rss_api_html/example_bring_up_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_control_helper_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_detector_distance_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_detector_distance_low_power_hibernate_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_detector_distance_low_power_off_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_detector_distance_with_iq_data_print_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_detector_presence_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_detector_presence_low_power_hibernate_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_detector_presence_low_power_off_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_detector_presence_multiple_configurations_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_diagnostic_test_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_processing_amplitude_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_processing_coherent_mean_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_processing_noncoherent_mean_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_processing_peak_interpolation_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_processing_static_presence_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_processing_subtract_adaptive_bg_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_service_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_service_low_power_sensor_disable_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_service_low_power_sensor_hibernate_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_service_multiple_configurations_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_service_sensor_disable_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_service_sensor_hibernate_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_service_sensor_off_8c-example.html (100%) rename {documents => docs}/rss_api_html/example_service_subsweeps_8c-example.html (100%) rename {documents => docs}/rss_api_html/examples.html (100%) rename {documents => docs}/rss_api_html/examples.js (100%) rename {documents => docs}/rss_api_html/files.html (100%) rename {documents => docs}/rss_api_html/folderclosed.png (100%) rename {documents => docs}/rss_api_html/folderopen.png (100%) rename {documents => docs}/rss_api_html/functions.html (100%) rename {documents => docs}/rss_api_html/functions_b.html (100%) rename {documents => docs}/rss_api_html/functions_c.html (100%) rename {documents => docs}/rss_api_html/functions_d.html (100%) rename {documents => docs}/rss_api_html/functions_e.html (100%) rename {documents => docs}/rss_api_html/functions_f.html (100%) rename {documents => docs}/rss_api_html/functions_g.html (100%) rename {documents => docs}/rss_api_html/functions_h.html (100%) rename {documents => docs}/rss_api_html/functions_i.html (100%) rename {documents => docs}/rss_api_html/functions_l.html (100%) rename {documents => docs}/rss_api_html/functions_m.html (100%) rename {documents => docs}/rss_api_html/functions_n.html (100%) rename {documents => docs}/rss_api_html/functions_o.html (100%) rename {documents => docs}/rss_api_html/functions_p.html (100%) rename {documents => docs}/rss_api_html/functions_r.html (100%) rename {documents => docs}/rss_api_html/functions_s.html (100%) rename {documents => docs}/rss_api_html/functions_t.html (100%) rename {documents => docs}/rss_api_html/functions_u.html (100%) rename {documents => docs}/rss_api_html/functions_v.html (100%) rename {documents => docs}/rss_api_html/functions_vars.html (100%) rename {documents => docs}/rss_api_html/functions_vars_b.html (100%) rename {documents => docs}/rss_api_html/functions_vars_c.html (100%) rename {documents => docs}/rss_api_html/functions_vars_d.html (100%) rename {documents => docs}/rss_api_html/functions_vars_e.html (100%) rename {documents => docs}/rss_api_html/functions_vars_f.html (100%) rename {documents => docs}/rss_api_html/functions_vars_g.html (100%) rename {documents => docs}/rss_api_html/functions_vars_h.html (100%) rename {documents => docs}/rss_api_html/functions_vars_i.html (100%) rename {documents => docs}/rss_api_html/functions_vars_l.html (100%) rename {documents => docs}/rss_api_html/functions_vars_m.html (100%) rename {documents => docs}/rss_api_html/functions_vars_n.html (100%) rename {documents => docs}/rss_api_html/functions_vars_o.html (100%) rename {documents => docs}/rss_api_html/functions_vars_p.html (100%) rename {documents => docs}/rss_api_html/functions_vars_r.html (100%) rename {documents => docs}/rss_api_html/functions_vars_s.html (100%) rename {documents => docs}/rss_api_html/functions_vars_t.html (100%) rename {documents => docs}/rss_api_html/functions_vars_u.html (100%) rename {documents => docs}/rss_api_html/functions_vars_v.html (100%) rename {documents => docs}/rss_api_html/functions_vars_w.html (100%) rename {documents => docs}/rss_api_html/functions_vars_z.html (100%) rename {documents => docs}/rss_api_html/functions_w.html (100%) rename {documents => docs}/rss_api_html/functions_z.html (100%) rename {documents => docs}/rss_api_html/globals.html (100%) rename {documents => docs}/rss_api_html/globals_a.html (100%) rename {documents => docs}/rss_api_html/globals_b.html (100%) rename {documents => docs}/rss_api_html/globals_c.html (100%) rename {documents => docs}/rss_api_html/globals_d.html (100%) rename {documents => docs}/rss_api_html/globals_defs.html (100%) rename {documents => docs}/rss_api_html/globals_defs_b.html (100%) rename {documents => docs}/rss_api_html/globals_defs_c.html (100%) rename {documents => docs}/rss_api_html/globals_defs_d.html (100%) rename {documents => docs}/rss_api_html/globals_defs_e.html (100%) rename {documents => docs}/rss_api_html/globals_defs_f.html (100%) rename {documents => docs}/rss_api_html/globals_defs_g.html (100%) rename {documents => docs}/rss_api_html/globals_defs_h.html (100%) rename {documents => docs}/rss_api_html/globals_defs_i.html (100%) rename {documents => docs}/rss_api_html/globals_defs_l.html (100%) rename {documents => docs}/rss_api_html/globals_defs_m.html (100%) rename {documents => docs}/rss_api_html/globals_defs_n.html (100%) rename {documents => docs}/rss_api_html/globals_defs_p.html (100%) rename {documents => docs}/rss_api_html/globals_defs_r.html (100%) rename {documents => docs}/rss_api_html/globals_defs_s.html (100%) rename {documents => docs}/rss_api_html/globals_defs_t.html (100%) rename {documents => docs}/rss_api_html/globals_defs_u.html (100%) rename {documents => docs}/rss_api_html/globals_defs_v.html (100%) rename {documents => docs}/rss_api_html/globals_defs_w.html (100%) rename {documents => docs}/rss_api_html/globals_e.html (100%) rename {documents => docs}/rss_api_html/globals_enum.html (100%) rename {documents => docs}/rss_api_html/globals_eval.html (100%) rename {documents => docs}/rss_api_html/globals_f.html (100%) rename {documents => docs}/rss_api_html/globals_func.html (100%) rename {documents => docs}/rss_api_html/globals_func_a.html (100%) rename {documents => docs}/rss_api_html/globals_func_b.html (100%) rename {documents => docs}/rss_api_html/globals_func_c.html (100%) rename {documents => docs}/rss_api_html/globals_func_d.html (100%) rename {documents => docs}/rss_api_html/globals_func_e.html (100%) rename {documents => docs}/rss_api_html/globals_func_f.html (100%) rename {documents => docs}/rss_api_html/globals_func_g.html (100%) rename {documents => docs}/rss_api_html/globals_func_h.html (100%) rename {documents => docs}/rss_api_html/globals_func_i.html (100%) rename {documents => docs}/rss_api_html/globals_func_m.html (100%) rename {documents => docs}/rss_api_html/globals_func_n.html (100%) rename {documents => docs}/rss_api_html/globals_func_o.html (100%) rename {documents => docs}/rss_api_html/globals_func_p.html (100%) rename {documents => docs}/rss_api_html/globals_func_r.html (100%) rename {documents => docs}/rss_api_html/globals_func_s.html (100%) rename {documents => docs}/rss_api_html/globals_func_u.html (100%) rename {documents => docs}/rss_api_html/globals_func_v.html (100%) rename {documents => docs}/rss_api_html/globals_func_w.html (100%) rename {documents => docs}/rss_api_html/globals_g.html (100%) rename {documents => docs}/rss_api_html/globals_h.html (100%) rename {documents => docs}/rss_api_html/globals_i.html (100%) rename {documents => docs}/rss_api_html/globals_l.html (100%) rename {documents => docs}/rss_api_html/globals_m.html (100%) rename {documents => docs}/rss_api_html/globals_n.html (100%) rename {documents => docs}/rss_api_html/globals_o.html (100%) rename {documents => docs}/rss_api_html/globals_p.html (100%) rename {documents => docs}/rss_api_html/globals_r.html (100%) rename {documents => docs}/rss_api_html/globals_s.html (100%) rename {documents => docs}/rss_api_html/globals_t.html (100%) rename {documents => docs}/rss_api_html/globals_type.html (100%) rename {documents => docs}/rss_api_html/globals_u.html (100%) rename {documents => docs}/rss_api_html/globals_v.html (100%) rename {documents => docs}/rss_api_html/globals_vars.html (100%) rename {documents => docs}/rss_api_html/globals_w.html (100%) rename {documents => docs}/rss_api_html/group__Distance.html (100%) rename {documents => docs}/rss_api_html/group__Distance.js (100%) rename {documents => docs}/rss_api_html/group__Presence.html (100%) rename {documents => docs}/rss_api_html/group__Presence.js (100%) rename {documents => docs}/rss_api_html/group__config.html (100%) rename {documents => docs}/rss_api_html/group__config.js (100%) rename {documents => docs}/rss_api_html/group__processing.html (100%) rename {documents => docs}/rss_api_html/group__processing.js (100%) rename {documents => docs}/rss_api_html/group__rss.html (100%) rename {documents => docs}/rss_api_html/group__rss.js (100%) rename {documents => docs}/rss_api_html/group__sensor.html (100%) rename {documents => docs}/rss_api_html/group__sensor.js (100%) rename {documents => docs}/rss_api_html/group__service.html (100%) rename {documents => docs}/rss_api_html/group__service.js (100%) rename {documents => docs}/rss_api_html/group__subsweep.html (100%) rename {documents => docs}/rss_api_html/group__subsweep.js (100%) rename {documents => docs}/rss_api_html/i2c__application__system_8h.html (100%) rename {documents => docs}/rss_api_html/i2c__application__system_8h_source.html (100%) rename {documents => docs}/rss_api_html/i2c__application__system__stm32_8c.html (100%) rename {documents => docs}/rss_api_html/i2c__application__system__stm32_8c_source.html (100%) rename {documents => docs}/rss_api_html/i2c__distance__detector_8c.html (100%) rename {documents => docs}/rss_api_html/i2c__distance__detector_8c_source.html (100%) rename {documents => docs}/rss_api_html/i2c__distance__detector_8h.html (100%) rename {documents => docs}/rss_api_html/i2c__distance__detector_8h_source.html (100%) rename {documents => docs}/rss_api_html/i2c__presence__detector_8c.html (100%) rename {documents => docs}/rss_api_html/i2c__presence__detector_8c_source.html (100%) rename {documents => docs}/rss_api_html/i2c__presence__detector_8h.html (100%) rename {documents => docs}/rss_api_html/i2c__presence__detector_8h_source.html (100%) rename {documents => docs}/rss_api_html/index.html (100%) rename {documents => docs}/rss_api_html/intro_8md.html (100%) rename {documents => docs}/rss_api_html/jquery.js (100%) rename {documents => docs}/rss_api_html/main_8h.html (100%) rename {documents => docs}/rss_api_html/main_8h_source.html (100%) rename {documents => docs}/rss_api_html/menu.js (100%) rename {documents => docs}/rss_api_html/menudata.js (100%) rename {documents => docs}/rss_api_html/modules.html (100%) rename {documents => docs}/rss_api_html/modules.js (100%) rename {documents => docs}/rss_api_html/nav_f.png (100%) rename {documents => docs}/rss_api_html/nav_g.png (100%) rename {documents => docs}/rss_api_html/nav_h.png (100%) rename {documents => docs}/rss_api_html/navtree.css (100%) rename {documents => docs}/rss_api_html/navtree.js (100%) rename {documents => docs}/rss_api_html/navtreedata.js (100%) rename {documents => docs}/rss_api_html/navtreeindex0.js (100%) rename {documents => docs}/rss_api_html/navtreeindex1.js (100%) rename {documents => docs}/rss_api_html/open.png (100%) rename {documents => docs}/rss_api_html/presence__reg__protocol_8c.html (100%) rename {documents => docs}/rss_api_html/presence__reg__protocol_8c_source.html (100%) rename {documents => docs}/rss_api_html/presence__reg__protocol_8h.html (100%) rename {documents => docs}/rss_api_html/presence__reg__protocol_8h_source.html (100%) rename {documents => docs}/rss_api_html/presence__reg__protocol__access_8c.html (100%) rename {documents => docs}/rss_api_html/presence__reg__protocol__access_8c_source.html (100%) rename {documents => docs}/rss_api_html/printf_8c.html (100%) rename {documents => docs}/rss_api_html/printf_8c_source.html (100%) rename {documents => docs}/rss_api_html/printf_8h.html (100%) rename {documents => docs}/rss_api_html/printf_8h_source.html (100%) rename {documents => docs}/rss_api_html/ref__app__breathing_8c.html (100%) rename {documents => docs}/rss_api_html/ref__app__breathing_8c_source.html (100%) rename {documents => docs}/rss_api_html/ref__app__breathing_8h.html (100%) rename {documents => docs}/rss_api_html/ref__app__breathing_8h_source.html (100%) rename {documents => docs}/rss_api_html/ref__app__smart__presence_8c.html (100%) rename {documents => docs}/rss_api_html/ref__app__smart__presence_8c_source.html (100%) rename {documents => docs}/rss_api_html/ref__app__smart__presence_8h.html (100%) rename {documents => docs}/rss_api_html/ref__app__smart__presence_8h_source.html (100%) rename {documents => docs}/rss_api_html/ref__app__tank__level_8c.html (100%) rename {documents => docs}/rss_api_html/ref__app__tank__level_8c_source.html (100%) rename {documents => docs}/rss_api_html/ref__app__tank__level_8h.html (100%) rename {documents => docs}/rss_api_html/ref__app__tank__level_8h_source.html (100%) rename {documents => docs}/rss_api_html/ref_app_tank_level_8c-example.html (100%) rename {documents => docs}/rss_api_html/resize.js (100%) rename {documents => docs}/rss_api_html/search/all_0.html (100%) rename {documents => docs}/rss_api_html/search/all_0.js (100%) rename {documents => docs}/rss_api_html/search/all_1.html (100%) rename {documents => docs}/rss_api_html/search/all_1.js (100%) rename {documents => docs}/rss_api_html/search/all_10.html (100%) rename {documents => docs}/rss_api_html/search/all_10.js (100%) rename {documents => docs}/rss_api_html/search/all_11.html (100%) rename {documents => docs}/rss_api_html/search/all_11.js (100%) rename {documents => docs}/rss_api_html/search/all_12.html (100%) rename {documents => docs}/rss_api_html/search/all_12.js (100%) rename {documents => docs}/rss_api_html/search/all_13.html (100%) rename {documents => docs}/rss_api_html/search/all_13.js (100%) rename {documents => docs}/rss_api_html/search/all_14.html (100%) rename {documents => docs}/rss_api_html/search/all_14.js (100%) rename {documents => docs}/rss_api_html/search/all_15.html (100%) rename {documents => docs}/rss_api_html/search/all_15.js (100%) rename {documents => docs}/rss_api_html/search/all_2.html (100%) rename {documents => docs}/rss_api_html/search/all_2.js (100%) rename {documents => docs}/rss_api_html/search/all_3.html (100%) rename {documents => docs}/rss_api_html/search/all_3.js (100%) rename {documents => docs}/rss_api_html/search/all_4.html (100%) rename {documents => docs}/rss_api_html/search/all_4.js (100%) rename {documents => docs}/rss_api_html/search/all_5.html (100%) rename {documents => docs}/rss_api_html/search/all_5.js (100%) rename {documents => docs}/rss_api_html/search/all_6.html (100%) rename {documents => docs}/rss_api_html/search/all_6.js (100%) rename {documents => docs}/rss_api_html/search/all_7.html (100%) rename {documents => docs}/rss_api_html/search/all_7.js (100%) rename {documents => docs}/rss_api_html/search/all_8.html (100%) rename {documents => docs}/rss_api_html/search/all_8.js (100%) rename {documents => docs}/rss_api_html/search/all_9.html (100%) rename {documents => docs}/rss_api_html/search/all_9.js (100%) rename {documents => docs}/rss_api_html/search/all_a.html (100%) rename {documents => docs}/rss_api_html/search/all_a.js (100%) rename {documents => docs}/rss_api_html/search/all_b.html (100%) rename {documents => docs}/rss_api_html/search/all_b.js (100%) rename {documents => docs}/rss_api_html/search/all_c.html (100%) rename {documents => docs}/rss_api_html/search/all_c.js (100%) rename {documents => docs}/rss_api_html/search/all_d.html (100%) rename {documents => docs}/rss_api_html/search/all_d.js (100%) rename {documents => docs}/rss_api_html/search/all_e.html (100%) rename {documents => docs}/rss_api_html/search/all_e.js (100%) rename {documents => docs}/rss_api_html/search/all_f.html (100%) rename {documents => docs}/rss_api_html/search/all_f.js (100%) rename {documents => docs}/rss_api_html/search/classes_0.html (100%) rename {documents => docs}/rss_api_html/search/classes_0.js (100%) rename {documents => docs}/rss_api_html/search/classes_1.html (100%) rename {documents => docs}/rss_api_html/search/classes_1.js (100%) rename {documents => docs}/rss_api_html/search/classes_2.html (100%) rename {documents => docs}/rss_api_html/search/classes_2.js (100%) rename {documents => docs}/rss_api_html/search/classes_3.html (100%) rename {documents => docs}/rss_api_html/search/classes_3.js (100%) rename {documents => docs}/rss_api_html/search/classes_4.html (100%) rename {documents => docs}/rss_api_html/search/classes_4.js (100%) rename {documents => docs}/rss_api_html/search/classes_5.html (100%) rename {documents => docs}/rss_api_html/search/classes_5.js (100%) rename {documents => docs}/rss_api_html/search/close.png (100%) rename {documents => docs}/rss_api_html/search/defines_0.html (100%) rename {documents => docs}/rss_api_html/search/defines_0.js (100%) rename {documents => docs}/rss_api_html/search/defines_1.html (100%) rename {documents => docs}/rss_api_html/search/defines_1.js (100%) rename {documents => docs}/rss_api_html/search/defines_10.html (100%) rename {documents => docs}/rss_api_html/search/defines_10.js (100%) rename {documents => docs}/rss_api_html/search/defines_11.html (100%) rename {documents => docs}/rss_api_html/search/defines_11.js (100%) rename {documents => docs}/rss_api_html/search/defines_12.html (100%) rename {documents => docs}/rss_api_html/search/defines_12.js (100%) rename {documents => docs}/rss_api_html/search/defines_2.html (100%) rename {documents => docs}/rss_api_html/search/defines_2.js (100%) rename {documents => docs}/rss_api_html/search/defines_3.html (100%) rename {documents => docs}/rss_api_html/search/defines_3.js (100%) rename {documents => docs}/rss_api_html/search/defines_4.html (100%) rename {documents => docs}/rss_api_html/search/defines_4.js (100%) rename {documents => docs}/rss_api_html/search/defines_5.html (100%) rename {documents => docs}/rss_api_html/search/defines_5.js (100%) rename {documents => docs}/rss_api_html/search/defines_6.html (100%) rename {documents => docs}/rss_api_html/search/defines_6.js (100%) rename {documents => docs}/rss_api_html/search/defines_7.html (100%) rename {documents => docs}/rss_api_html/search/defines_7.js (100%) rename {documents => docs}/rss_api_html/search/defines_8.html (100%) rename {documents => docs}/rss_api_html/search/defines_8.js (100%) rename {documents => docs}/rss_api_html/search/defines_9.html (100%) rename {documents => docs}/rss_api_html/search/defines_9.js (100%) rename {documents => docs}/rss_api_html/search/defines_a.html (100%) rename {documents => docs}/rss_api_html/search/defines_a.js (100%) rename {documents => docs}/rss_api_html/search/defines_b.html (100%) rename {documents => docs}/rss_api_html/search/defines_b.js (100%) rename {documents => docs}/rss_api_html/search/defines_c.html (100%) rename {documents => docs}/rss_api_html/search/defines_c.js (100%) rename {documents => docs}/rss_api_html/search/defines_d.html (100%) rename {documents => docs}/rss_api_html/search/defines_d.js (100%) rename {documents => docs}/rss_api_html/search/defines_e.html (100%) rename {documents => docs}/rss_api_html/search/defines_e.js (100%) rename {documents => docs}/rss_api_html/search/defines_f.html (100%) rename {documents => docs}/rss_api_html/search/defines_f.js (100%) rename {documents => docs}/rss_api_html/search/enums_0.html (100%) rename {documents => docs}/rss_api_html/search/enums_0.js (100%) rename {documents => docs}/rss_api_html/search/enums_1.html (100%) rename {documents => docs}/rss_api_html/search/enums_1.js (100%) rename {documents => docs}/rss_api_html/search/enums_2.html (100%) rename {documents => docs}/rss_api_html/search/enums_2.js (100%) rename {documents => docs}/rss_api_html/search/enums_3.html (100%) rename {documents => docs}/rss_api_html/search/enums_3.js (100%) rename {documents => docs}/rss_api_html/search/enums_4.html (100%) rename {documents => docs}/rss_api_html/search/enums_4.js (100%) rename {documents => docs}/rss_api_html/search/enums_5.html (100%) rename {documents => docs}/rss_api_html/search/enums_5.js (100%) rename {documents => docs}/rss_api_html/search/enumvalues_0.html (100%) rename {documents => docs}/rss_api_html/search/enumvalues_0.js (100%) rename {documents => docs}/rss_api_html/search/enumvalues_1.html (100%) rename {documents => docs}/rss_api_html/search/enumvalues_1.js (100%) rename {documents => docs}/rss_api_html/search/enumvalues_2.html (100%) rename {documents => docs}/rss_api_html/search/enumvalues_2.js (100%) rename {documents => docs}/rss_api_html/search/enumvalues_3.html (100%) rename {documents => docs}/rss_api_html/search/enumvalues_3.js (100%) rename {documents => docs}/rss_api_html/search/enumvalues_4.html (100%) rename {documents => docs}/rss_api_html/search/enumvalues_4.js (100%) rename {documents => docs}/rss_api_html/search/enumvalues_5.html (100%) rename {documents => docs}/rss_api_html/search/enumvalues_5.js (100%) rename {documents => docs}/rss_api_html/search/enumvalues_6.html (100%) rename {documents => docs}/rss_api_html/search/enumvalues_6.js (100%) rename {documents => docs}/rss_api_html/search/files_0.html (100%) rename {documents => docs}/rss_api_html/search/files_0.js (100%) rename {documents => docs}/rss_api_html/search/files_1.html (100%) rename {documents => docs}/rss_api_html/search/files_1.js (100%) rename {documents => docs}/rss_api_html/search/files_2.html (100%) rename {documents => docs}/rss_api_html/search/files_2.js (100%) rename {documents => docs}/rss_api_html/search/files_3.html (100%) rename {documents => docs}/rss_api_html/search/files_3.js (100%) rename {documents => docs}/rss_api_html/search/files_4.html (100%) rename {documents => docs}/rss_api_html/search/files_4.js (100%) rename {documents => docs}/rss_api_html/search/files_5.html (100%) rename {documents => docs}/rss_api_html/search/files_5.js (100%) rename {documents => docs}/rss_api_html/search/files_6.html (100%) rename {documents => docs}/rss_api_html/search/files_6.js (100%) rename {documents => docs}/rss_api_html/search/files_7.html (100%) rename {documents => docs}/rss_api_html/search/files_7.js (100%) rename {documents => docs}/rss_api_html/search/functions_0.html (100%) rename {documents => docs}/rss_api_html/search/functions_0.js (100%) rename {documents => docs}/rss_api_html/search/functions_1.html (100%) rename {documents => docs}/rss_api_html/search/functions_1.js (100%) rename {documents => docs}/rss_api_html/search/functions_10.html (100%) rename {documents => docs}/rss_api_html/search/functions_10.js (100%) rename {documents => docs}/rss_api_html/search/functions_11.html (100%) rename {documents => docs}/rss_api_html/search/functions_11.js (100%) rename {documents => docs}/rss_api_html/search/functions_12.html (100%) rename {documents => docs}/rss_api_html/search/functions_12.js (100%) rename {documents => docs}/rss_api_html/search/functions_2.html (100%) rename {documents => docs}/rss_api_html/search/functions_2.js (100%) rename {documents => docs}/rss_api_html/search/functions_3.html (100%) rename {documents => docs}/rss_api_html/search/functions_3.js (100%) rename {documents => docs}/rss_api_html/search/functions_4.html (100%) rename {documents => docs}/rss_api_html/search/functions_4.js (100%) rename {documents => docs}/rss_api_html/search/functions_5.html (100%) rename {documents => docs}/rss_api_html/search/functions_5.js (100%) rename {documents => docs}/rss_api_html/search/functions_6.html (100%) rename {documents => docs}/rss_api_html/search/functions_6.js (100%) rename {documents => docs}/rss_api_html/search/functions_7.html (100%) rename {documents => docs}/rss_api_html/search/functions_7.js (100%) rename {documents => docs}/rss_api_html/search/functions_8.html (100%) rename {documents => docs}/rss_api_html/search/functions_8.js (100%) rename {documents => docs}/rss_api_html/search/functions_9.html (100%) rename {documents => docs}/rss_api_html/search/functions_9.js (100%) rename {documents => docs}/rss_api_html/search/functions_a.html (100%) rename {documents => docs}/rss_api_html/search/functions_a.js (100%) rename {documents => docs}/rss_api_html/search/functions_b.html (100%) rename {documents => docs}/rss_api_html/search/functions_b.js (100%) rename {documents => docs}/rss_api_html/search/functions_c.html (100%) rename {documents => docs}/rss_api_html/search/functions_c.js (100%) rename {documents => docs}/rss_api_html/search/functions_d.html (100%) rename {documents => docs}/rss_api_html/search/functions_d.js (100%) rename {documents => docs}/rss_api_html/search/functions_e.html (100%) rename {documents => docs}/rss_api_html/search/functions_e.js (100%) rename {documents => docs}/rss_api_html/search/functions_f.html (100%) rename {documents => docs}/rss_api_html/search/functions_f.js (100%) rename {documents => docs}/rss_api_html/search/groups_0.html (100%) rename {documents => docs}/rss_api_html/search/groups_0.js (100%) rename {documents => docs}/rss_api_html/search/groups_1.html (100%) rename {documents => docs}/rss_api_html/search/groups_1.js (100%) rename {documents => docs}/rss_api_html/search/groups_2.html (100%) rename {documents => docs}/rss_api_html/search/groups_2.js (100%) rename {documents => docs}/rss_api_html/search/groups_3.html (100%) rename {documents => docs}/rss_api_html/search/groups_3.js (100%) rename {documents => docs}/rss_api_html/search/groups_4.html (100%) rename {documents => docs}/rss_api_html/search/groups_4.js (100%) rename {documents => docs}/rss_api_html/search/mag_sel.png (100%) rename {documents => docs}/rss_api_html/search/nomatches.html (100%) rename {documents => docs}/rss_api_html/search/search.css (100%) rename {documents => docs}/rss_api_html/search/search.js (100%) rename {documents => docs}/rss_api_html/search/search_l.png (100%) rename {documents => docs}/rss_api_html/search/search_m.png (100%) rename {documents => docs}/rss_api_html/search/search_r.png (100%) rename {documents => docs}/rss_api_html/search/searchdata.js (100%) rename {documents => docs}/rss_api_html/search/typedefs_0.html (100%) rename {documents => docs}/rss_api_html/search/typedefs_0.js (100%) rename {documents => docs}/rss_api_html/search/typedefs_1.html (100%) rename {documents => docs}/rss_api_html/search/typedefs_1.js (100%) rename {documents => docs}/rss_api_html/search/typedefs_2.html (100%) rename {documents => docs}/rss_api_html/search/typedefs_2.js (100%) rename {documents => docs}/rss_api_html/search/typedefs_3.html (100%) rename {documents => docs}/rss_api_html/search/typedefs_3.js (100%) rename {documents => docs}/rss_api_html/search/typedefs_4.html (100%) rename {documents => docs}/rss_api_html/search/typedefs_4.js (100%) rename {documents => docs}/rss_api_html/search/typedefs_5.html (100%) rename {documents => docs}/rss_api_html/search/typedefs_5.js (100%) rename {documents => docs}/rss_api_html/search/typedefs_6.html (100%) rename {documents => docs}/rss_api_html/search/typedefs_6.js (100%) rename {documents => docs}/rss_api_html/search/variables_0.html (100%) rename {documents => docs}/rss_api_html/search/variables_0.js (100%) rename {documents => docs}/rss_api_html/search/variables_1.html (100%) rename {documents => docs}/rss_api_html/search/variables_1.js (100%) rename {documents => docs}/rss_api_html/search/variables_10.html (100%) rename {documents => docs}/rss_api_html/search/variables_10.js (100%) rename {documents => docs}/rss_api_html/search/variables_11.html (100%) rename {documents => docs}/rss_api_html/search/variables_11.js (100%) rename {documents => docs}/rss_api_html/search/variables_12.html (100%) rename {documents => docs}/rss_api_html/search/variables_12.js (100%) rename {documents => docs}/rss_api_html/search/variables_13.html (100%) rename {documents => docs}/rss_api_html/search/variables_13.js (100%) rename {documents => docs}/rss_api_html/search/variables_14.html (100%) rename {documents => docs}/rss_api_html/search/variables_14.js (100%) rename {documents => docs}/rss_api_html/search/variables_15.html (100%) rename {documents => docs}/rss_api_html/search/variables_15.js (100%) rename {documents => docs}/rss_api_html/search/variables_2.html (100%) rename {documents => docs}/rss_api_html/search/variables_2.js (100%) rename {documents => docs}/rss_api_html/search/variables_3.html (100%) rename {documents => docs}/rss_api_html/search/variables_3.js (100%) rename {documents => docs}/rss_api_html/search/variables_4.html (100%) rename {documents => docs}/rss_api_html/search/variables_4.js (100%) rename {documents => docs}/rss_api_html/search/variables_5.html (100%) rename {documents => docs}/rss_api_html/search/variables_5.js (100%) rename {documents => docs}/rss_api_html/search/variables_6.html (100%) rename {documents => docs}/rss_api_html/search/variables_6.js (100%) rename {documents => docs}/rss_api_html/search/variables_7.html (100%) rename {documents => docs}/rss_api_html/search/variables_7.js (100%) rename {documents => docs}/rss_api_html/search/variables_8.html (100%) rename {documents => docs}/rss_api_html/search/variables_8.js (100%) rename {documents => docs}/rss_api_html/search/variables_9.html (100%) rename {documents => docs}/rss_api_html/search/variables_9.js (100%) rename {documents => docs}/rss_api_html/search/variables_a.html (100%) rename {documents => docs}/rss_api_html/search/variables_a.js (100%) rename {documents => docs}/rss_api_html/search/variables_b.html (100%) rename {documents => docs}/rss_api_html/search/variables_b.js (100%) rename {documents => docs}/rss_api_html/search/variables_c.html (100%) rename {documents => docs}/rss_api_html/search/variables_c.js (100%) rename {documents => docs}/rss_api_html/search/variables_d.html (100%) rename {documents => docs}/rss_api_html/search/variables_d.js (100%) rename {documents => docs}/rss_api_html/search/variables_e.html (100%) rename {documents => docs}/rss_api_html/search/variables_e.js (100%) rename {documents => docs}/rss_api_html/search/variables_f.html (100%) rename {documents => docs}/rss_api_html/search/variables_f.js (100%) rename {documents => docs}/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot (100%) rename {documents => docs}/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg (100%) rename {documents => docs}/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf (100%) rename {documents => docs}/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff (100%) rename {documents => docs}/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 (100%) rename {documents => docs}/rss_api_html/splitbar.png (100%) rename {documents => docs}/rss_api_html/stm32l4xx__hal__conf_8h.html (100%) rename {documents => docs}/rss_api_html/stm32l4xx__hal__conf_8h_source.html (100%) rename {documents => docs}/rss_api_html/stm32l4xx__hal__msp_8c.html (100%) rename {documents => docs}/rss_api_html/stm32l4xx__hal__msp_8c_source.html (100%) rename {documents => docs}/rss_api_html/stm32l4xx__it_8c.html (100%) rename {documents => docs}/rss_api_html/stm32l4xx__it_8c_source.html (100%) rename {documents => docs}/rss_api_html/stm32l4xx__it_8h.html (100%) rename {documents => docs}/rss_api_html/stm32l4xx__it_8h_source.html (100%) rename {documents => docs}/rss_api_html/structacc__breathing__config__t.html (100%) rename {documents => docs}/rss_api_html/structacc__breathing__handle__t.html (100%) rename {documents => docs}/rss_api_html/structacc__breathing__result__t.html (100%) rename {documents => docs}/rss_api_html/structacc__cal__info__t.html (100%) rename {documents => docs}/rss_api_html/structacc__cal__result__t.html (100%) rename {documents => docs}/rss_api_html/structacc__control__helper__t.html (100%) rename {documents => docs}/rss_api_html/structacc__detector__distance__result__t.html (100%) rename {documents => docs}/rss_api_html/structacc__detector__presence__metadata__t.html (100%) rename {documents => docs}/rss_api_html/structacc__detector__presence__result__t.html (100%) rename {documents => docs}/rss_api_html/structacc__hal__a121__t.html (100%) rename {documents => docs}/rss_api_html/structacc__hal__optimization__t.html (100%) rename {documents => docs}/rss_api_html/structacc__int16__complex__t.html (100%) rename {documents => docs}/rss_api_html/structacc__processing__metadata__t.html (100%) rename {documents => docs}/rss_api_html/structacc__processing__result__t.html (100%) rename {documents => docs}/rss_api_html/structacc__ref__app__smart__presence__config__t.html (100%) rename {documents => docs}/rss_api_html/structacc__ref__app__smart__presence__wakeup__config__t.html (100%) rename {documents => docs}/rss_api_html/structacc__ref__app__smart__presence__zone__config__t.html (100%) rename {documents => docs}/rss_api_html/structacc__ref__app__tank__level__config__t.html (100%) rename {documents => docs}/rss_api_html/structacc__reg__protocol__t.html (100%) rename {documents => docs}/rss_api_html/structacc__rss__assembly__test__result__t.html (100%) rename {documents => docs}/rss_api_html/structacc__smart__presence__result__t.html (100%) rename {documents => docs}/rss_api_html/structacc__smart__presence__zone__result__t.html (100%) rename {documents => docs}/rss_api_html/structacc__surface__velocity__config__t.html (100%) rename {documents => docs}/rss_api_html/structacc__surface__velocity__handle__t.html (100%) rename {documents => docs}/rss_api_html/structacc__surface__velocity__result__t.html (100%) rename {documents => docs}/rss_api_html/structacc__vector__float__t.html (100%) rename {documents => docs}/rss_api_html/structacc__vector__iq__t.html (100%) rename {documents => docs}/rss_api_html/structapp__context__t.html (100%) rename {documents => docs}/rss_api_html/structapp__result__t.html (100%) rename {documents => docs}/rss_api_html/structdistance__detector__resources__t.html (100%) rename {documents => docs}/rss_api_html/structexample__config.html (100%) rename {documents => docs}/rss_api_html/structexploration__server__interface__t.html (100%) rename {documents => docs}/rss_api_html/structgpio__config__t.html (100%) rename {documents => docs}/rss_api_html/structout__fct__wrap__type.html (100%) rename {documents => docs}/rss_api_html/structpresence__detector__context__t.html (100%) rename {documents => docs}/rss_api_html/structpresence__detector__resources__t.html (100%) rename {documents => docs}/rss_api_html/structprint__buffer__t.html (100%) rename {documents => docs}/rss_api_html/style.css (100%) rename {documents => docs}/rss_api_html/sync_off.png (100%) rename {documents => docs}/rss_api_html/sync_on.png (100%) rename {documents => docs}/rss_api_html/syscalls_8c.html (100%) rename {documents => docs}/rss_api_html/syscalls_8c_source.html (100%) rename {documents => docs}/rss_api_html/sysmem_8c.html (100%) rename {documents => docs}/rss_api_html/sysmem_8c_source.html (100%) rename {documents => docs}/rss_api_html/tab_a.png (100%) rename {documents => docs}/rss_api_html/tab_b.png (100%) rename {documents => docs}/rss_api_html/tab_h.png (100%) rename {documents => docs}/rss_api_html/tab_s.png (100%) rename {documents => docs}/rss_api_html/tabs.css (100%) diff --git a/documents/A121 Assembly Test User Guide.pdf b/docs/A121 Assembly Test User Guide.pdf similarity index 100% rename from documents/A121 Assembly Test User Guide.pdf rename to docs/A121 Assembly Test User Guide.pdf diff --git a/documents/A121 Breathing Reference Application User Guide.pdf b/docs/A121 Breathing Reference Application User Guide.pdf similarity index 100% rename from documents/A121 Breathing Reference Application User Guide.pdf rename to docs/A121 Breathing Reference Application User Guide.pdf diff --git a/documents/A121 Distance Detector User Guide.pdf b/docs/A121 Distance Detector User Guide.pdf similarity index 100% rename from documents/A121 Distance Detector User Guide.pdf rename to docs/A121 Distance Detector User Guide.pdf diff --git a/documents/A121 Presence Detector User Guide.pdf b/docs/A121 Presence Detector User Guide.pdf similarity index 100% rename from documents/A121 Presence Detector User Guide.pdf rename to docs/A121 Presence Detector User Guide.pdf diff --git a/documents/A121 STM32CubeIDE User Guide.pdf b/docs/A121 STM32CubeIDE User Guide.pdf similarity index 100% rename from documents/A121 STM32CubeIDE User Guide.pdf rename to docs/A121 STM32CubeIDE User Guide.pdf diff --git a/documents/A121 SW Integration User Guide.pdf b/docs/A121 SW Integration User Guide.pdf similarity index 100% rename from documents/A121 SW Integration User Guide.pdf rename to docs/A121 SW Integration User Guide.pdf diff --git a/documents/A121 Smart Presence Reference Application User Guide.pdf b/docs/A121 Smart Presence Reference Application User Guide.pdf similarity index 100% rename from documents/A121 Smart Presence Reference Application User Guide.pdf rename to docs/A121 Smart Presence Reference Application User Guide.pdf diff --git a/documents/A121 Sparse IQ Service User Guide.pdf b/docs/A121 Sparse IQ Service User Guide.pdf similarity index 100% rename from documents/A121 Sparse IQ Service User Guide.pdf rename to docs/A121 Sparse IQ Service User Guide.pdf diff --git a/documents/A121 Tank Level Reference Application User Guide.pdf b/docs/A121 Tank Level Reference Application User Guide.pdf similarity index 100% rename from documents/A121 Tank Level Reference Application User Guide.pdf rename to docs/A121 Tank Level Reference Application User Guide.pdf diff --git a/documents/BUILDINFO.txt b/docs/BUILDINFO.txt similarity index 100% rename from documents/BUILDINFO.txt rename to docs/BUILDINFO.txt diff --git a/documents/Handbook.pdf b/docs/Handbook.pdf similarity index 100% rename from documents/Handbook.pdf rename to docs/Handbook.pdf diff --git a/documents/I2C Distance Detector User Guide.pdf b/docs/I2C Distance Detector User Guide.pdf similarity index 100% rename from documents/I2C Distance Detector User Guide.pdf rename to docs/I2C Distance Detector User Guide.pdf diff --git a/documents/I2C Presence Detector User Guide.pdf b/docs/I2C Presence Detector User Guide.pdf similarity index 100% rename from documents/I2C Presence Detector User Guide.pdf rename to docs/I2C Presence Detector User Guide.pdf diff --git a/documents/XM125 Software User Guide.pdf b/docs/XM125 Software User Guide.pdf similarity index 100% rename from documents/XM125 Software User Guide.pdf rename to docs/XM125 Software User Guide.pdf diff --git a/documents/rss_api.html b/docs/rss_api.html similarity index 100% rename from documents/rss_api.html rename to docs/rss_api.html diff --git a/documents/rss_api_html/AcconeerLogo.png b/docs/rss_api_html/AcconeerLogo.png similarity index 100% rename from documents/rss_api_html/AcconeerLogo.png rename to docs/rss_api_html/AcconeerLogo.png diff --git a/documents/rss_api_html/acc__alg__basic__utils_8h.html b/docs/rss_api_html/acc__alg__basic__utils_8h.html similarity index 100% rename from documents/rss_api_html/acc__alg__basic__utils_8h.html rename to docs/rss_api_html/acc__alg__basic__utils_8h.html diff --git a/documents/rss_api_html/acc__alg__basic__utils_8h_source.html b/docs/rss_api_html/acc__alg__basic__utils_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__alg__basic__utils_8h_source.html rename to docs/rss_api_html/acc__alg__basic__utils_8h_source.html diff --git a/documents/rss_api_html/acc__algorithm_8c.html b/docs/rss_api_html/acc__algorithm_8c.html similarity index 100% rename from documents/rss_api_html/acc__algorithm_8c.html rename to docs/rss_api_html/acc__algorithm_8c.html diff --git a/documents/rss_api_html/acc__algorithm_8c_source.html b/docs/rss_api_html/acc__algorithm_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__algorithm_8c_source.html rename to docs/rss_api_html/acc__algorithm_8c_source.html diff --git a/documents/rss_api_html/acc__algorithm_8h.html b/docs/rss_api_html/acc__algorithm_8h.html similarity index 100% rename from documents/rss_api_html/acc__algorithm_8h.html rename to docs/rss_api_html/acc__algorithm_8h.html diff --git a/documents/rss_api_html/acc__algorithm_8h_source.html b/docs/rss_api_html/acc__algorithm_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__algorithm_8h_source.html rename to docs/rss_api_html/acc__algorithm_8h_source.html diff --git a/documents/rss_api_html/acc__config_8h.html b/docs/rss_api_html/acc__config_8h.html similarity index 100% rename from documents/rss_api_html/acc__config_8h.html rename to docs/rss_api_html/acc__config_8h.html diff --git a/documents/rss_api_html/acc__config_8h_source.html b/docs/rss_api_html/acc__config_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__config_8h_source.html rename to docs/rss_api_html/acc__config_8h_source.html diff --git a/documents/rss_api_html/acc__config__subsweep_8h.html b/docs/rss_api_html/acc__config__subsweep_8h.html similarity index 100% rename from documents/rss_api_html/acc__config__subsweep_8h.html rename to docs/rss_api_html/acc__config__subsweep_8h.html diff --git a/documents/rss_api_html/acc__config__subsweep_8h_source.html b/docs/rss_api_html/acc__config__subsweep_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__config__subsweep_8h_source.html rename to docs/rss_api_html/acc__config__subsweep_8h_source.html diff --git a/documents/rss_api_html/acc__control__helper_8c.html b/docs/rss_api_html/acc__control__helper_8c.html similarity index 100% rename from documents/rss_api_html/acc__control__helper_8c.html rename to docs/rss_api_html/acc__control__helper_8c.html diff --git a/documents/rss_api_html/acc__control__helper_8c_source.html b/docs/rss_api_html/acc__control__helper_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__control__helper_8c_source.html rename to docs/rss_api_html/acc__control__helper_8c_source.html diff --git a/documents/rss_api_html/acc__control__helper_8h.html b/docs/rss_api_html/acc__control__helper_8h.html similarity index 100% rename from documents/rss_api_html/acc__control__helper_8h.html rename to docs/rss_api_html/acc__control__helper_8h.html diff --git a/documents/rss_api_html/acc__control__helper_8h_source.html b/docs/rss_api_html/acc__control__helper_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__control__helper_8h_source.html rename to docs/rss_api_html/acc__control__helper_8h_source.html diff --git a/documents/rss_api_html/acc__definitions__a121_8h.html b/docs/rss_api_html/acc__definitions__a121_8h.html similarity index 100% rename from documents/rss_api_html/acc__definitions__a121_8h.html rename to docs/rss_api_html/acc__definitions__a121_8h.html diff --git a/documents/rss_api_html/acc__definitions__a121_8h_source.html b/docs/rss_api_html/acc__definitions__a121_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__definitions__a121_8h_source.html rename to docs/rss_api_html/acc__definitions__a121_8h_source.html diff --git a/documents/rss_api_html/acc__definitions__common_8h.html b/docs/rss_api_html/acc__definitions__common_8h.html similarity index 100% rename from documents/rss_api_html/acc__definitions__common_8h.html rename to docs/rss_api_html/acc__definitions__common_8h.html diff --git a/documents/rss_api_html/acc__definitions__common_8h_source.html b/docs/rss_api_html/acc__definitions__common_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__definitions__common_8h_source.html rename to docs/rss_api_html/acc__definitions__common_8h_source.html diff --git a/documents/rss_api_html/acc__detector__distance_8h.html b/docs/rss_api_html/acc__detector__distance_8h.html similarity index 100% rename from documents/rss_api_html/acc__detector__distance_8h.html rename to docs/rss_api_html/acc__detector__distance_8h.html diff --git a/documents/rss_api_html/acc__detector__distance_8h_source.html b/docs/rss_api_html/acc__detector__distance_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__detector__distance_8h_source.html rename to docs/rss_api_html/acc__detector__distance_8h_source.html diff --git a/documents/rss_api_html/acc__detector__distance__definitions_8h.html b/docs/rss_api_html/acc__detector__distance__definitions_8h.html similarity index 100% rename from documents/rss_api_html/acc__detector__distance__definitions_8h.html rename to docs/rss_api_html/acc__detector__distance__definitions_8h.html diff --git a/documents/rss_api_html/acc__detector__distance__definitions_8h_source.html b/docs/rss_api_html/acc__detector__distance__definitions_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__detector__distance__definitions_8h_source.html rename to docs/rss_api_html/acc__detector__distance__definitions_8h_source.html diff --git a/documents/rss_api_html/acc__detector__presence_8h.html b/docs/rss_api_html/acc__detector__presence_8h.html similarity index 100% rename from documents/rss_api_html/acc__detector__presence_8h.html rename to docs/rss_api_html/acc__detector__presence_8h.html diff --git a/documents/rss_api_html/acc__detector__presence_8h_source.html b/docs/rss_api_html/acc__detector__presence_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__detector__presence_8h_source.html rename to docs/rss_api_html/acc__detector__presence_8h_source.html diff --git a/documents/rss_api_html/acc__exploration__server__base_8h.html b/docs/rss_api_html/acc__exploration__server__base_8h.html similarity index 100% rename from documents/rss_api_html/acc__exploration__server__base_8h.html rename to docs/rss_api_html/acc__exploration__server__base_8h.html diff --git a/documents/rss_api_html/acc__exploration__server__base_8h_source.html b/docs/rss_api_html/acc__exploration__server__base_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__exploration__server__base_8h_source.html rename to docs/rss_api_html/acc__exploration__server__base_8h_source.html diff --git a/documents/rss_api_html/acc__exploration__server__stm32_8c.html b/docs/rss_api_html/acc__exploration__server__stm32_8c.html similarity index 100% rename from documents/rss_api_html/acc__exploration__server__stm32_8c.html rename to docs/rss_api_html/acc__exploration__server__stm32_8c.html diff --git a/documents/rss_api_html/acc__exploration__server__stm32_8c_source.html b/docs/rss_api_html/acc__exploration__server__stm32_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__exploration__server__stm32_8c_source.html rename to docs/rss_api_html/acc__exploration__server__stm32_8c_source.html diff --git a/documents/rss_api_html/acc__exploration__server__stm32_8h.html b/docs/rss_api_html/acc__exploration__server__stm32_8h.html similarity index 100% rename from documents/rss_api_html/acc__exploration__server__stm32_8h.html rename to docs/rss_api_html/acc__exploration__server__stm32_8h.html diff --git a/documents/rss_api_html/acc__exploration__server__stm32_8h_source.html b/docs/rss_api_html/acc__exploration__server__stm32_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__exploration__server__stm32_8h_source.html rename to docs/rss_api_html/acc__exploration__server__stm32_8h_source.html diff --git a/documents/rss_api_html/acc__hal__definitions__a121_8h.html b/docs/rss_api_html/acc__hal__definitions__a121_8h.html similarity index 100% rename from documents/rss_api_html/acc__hal__definitions__a121_8h.html rename to docs/rss_api_html/acc__hal__definitions__a121_8h.html diff --git a/documents/rss_api_html/acc__hal__definitions__a121_8h_source.html b/docs/rss_api_html/acc__hal__definitions__a121_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__hal__definitions__a121_8h_source.html rename to docs/rss_api_html/acc__hal__definitions__a121_8h_source.html diff --git a/documents/rss_api_html/acc__hal__integration__a121_8h.html b/docs/rss_api_html/acc__hal__integration__a121_8h.html similarity index 100% rename from documents/rss_api_html/acc__hal__integration__a121_8h.html rename to docs/rss_api_html/acc__hal__integration__a121_8h.html diff --git a/documents/rss_api_html/acc__hal__integration__a121_8h_source.html b/docs/rss_api_html/acc__hal__integration__a121_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__hal__integration__a121_8h_source.html rename to docs/rss_api_html/acc__hal__integration__a121_8h_source.html diff --git a/documents/rss_api_html/acc__hal__integration__stm32cube__xm_8c.html b/docs/rss_api_html/acc__hal__integration__stm32cube__xm_8c.html similarity index 100% rename from documents/rss_api_html/acc__hal__integration__stm32cube__xm_8c.html rename to docs/rss_api_html/acc__hal__integration__stm32cube__xm_8c.html diff --git a/documents/rss_api_html/acc__hal__integration__stm32cube__xm_8c_source.html b/docs/rss_api_html/acc__hal__integration__stm32cube__xm_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__hal__integration__stm32cube__xm_8c_source.html rename to docs/rss_api_html/acc__hal__integration__stm32cube__xm_8c_source.html diff --git a/documents/rss_api_html/acc__integration_8h.html b/docs/rss_api_html/acc__integration_8h.html similarity index 100% rename from documents/rss_api_html/acc__integration_8h.html rename to docs/rss_api_html/acc__integration_8h.html diff --git a/documents/rss_api_html/acc__integration_8h_source.html b/docs/rss_api_html/acc__integration_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__integration_8h_source.html rename to docs/rss_api_html/acc__integration_8h_source.html diff --git a/documents/rss_api_html/acc__integration__cortex_8c.html b/docs/rss_api_html/acc__integration__cortex_8c.html similarity index 100% rename from documents/rss_api_html/acc__integration__cortex_8c.html rename to docs/rss_api_html/acc__integration__cortex_8c.html diff --git a/documents/rss_api_html/acc__integration__cortex_8c_source.html b/docs/rss_api_html/acc__integration__cortex_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__integration__cortex_8c_source.html rename to docs/rss_api_html/acc__integration__cortex_8c_source.html diff --git a/documents/rss_api_html/acc__integration__log_8c.html b/docs/rss_api_html/acc__integration__log_8c.html similarity index 100% rename from documents/rss_api_html/acc__integration__log_8c.html rename to docs/rss_api_html/acc__integration__log_8c.html diff --git a/documents/rss_api_html/acc__integration__log_8c_source.html b/docs/rss_api_html/acc__integration__log_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__integration__log_8c_source.html rename to docs/rss_api_html/acc__integration__log_8c_source.html diff --git a/documents/rss_api_html/acc__integration__log_8h.html b/docs/rss_api_html/acc__integration__log_8h.html similarity index 100% rename from documents/rss_api_html/acc__integration__log_8h.html rename to docs/rss_api_html/acc__integration__log_8h.html diff --git a/documents/rss_api_html/acc__integration__log_8h_source.html b/docs/rss_api_html/acc__integration__log_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__integration__log_8h_source.html rename to docs/rss_api_html/acc__integration__log_8h_source.html diff --git a/documents/rss_api_html/acc__integration__stm32_8c.html b/docs/rss_api_html/acc__integration__stm32_8c.html similarity index 100% rename from documents/rss_api_html/acc__integration__stm32_8c.html rename to docs/rss_api_html/acc__integration__stm32_8c.html diff --git a/documents/rss_api_html/acc__integration__stm32_8c_source.html b/docs/rss_api_html/acc__integration__stm32_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__integration__stm32_8c_source.html rename to docs/rss_api_html/acc__integration__stm32_8c_source.html diff --git a/documents/rss_api_html/acc__processing_8h.html b/docs/rss_api_html/acc__processing_8h.html similarity index 100% rename from documents/rss_api_html/acc__processing_8h.html rename to docs/rss_api_html/acc__processing_8h.html diff --git a/documents/rss_api_html/acc__processing_8h_source.html b/docs/rss_api_html/acc__processing_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__processing_8h_source.html rename to docs/rss_api_html/acc__processing_8h_source.html diff --git a/documents/rss_api_html/acc__processing__helpers_8c.html b/docs/rss_api_html/acc__processing__helpers_8c.html similarity index 100% rename from documents/rss_api_html/acc__processing__helpers_8c.html rename to docs/rss_api_html/acc__processing__helpers_8c.html diff --git a/documents/rss_api_html/acc__processing__helpers_8c_source.html b/docs/rss_api_html/acc__processing__helpers_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__processing__helpers_8c_source.html rename to docs/rss_api_html/acc__processing__helpers_8c_source.html diff --git a/documents/rss_api_html/acc__processing__helpers_8h.html b/docs/rss_api_html/acc__processing__helpers_8h.html similarity index 100% rename from documents/rss_api_html/acc__processing__helpers_8h.html rename to docs/rss_api_html/acc__processing__helpers_8h.html diff --git a/documents/rss_api_html/acc__processing__helpers_8h_source.html b/docs/rss_api_html/acc__processing__helpers_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__processing__helpers_8h_source.html rename to docs/rss_api_html/acc__processing__helpers_8h_source.html diff --git a/documents/rss_api_html/acc__reg__protocol_8c.html b/docs/rss_api_html/acc__reg__protocol_8c.html similarity index 100% rename from documents/rss_api_html/acc__reg__protocol_8c.html rename to docs/rss_api_html/acc__reg__protocol_8c.html diff --git a/documents/rss_api_html/acc__reg__protocol_8c_source.html b/docs/rss_api_html/acc__reg__protocol_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__reg__protocol_8c_source.html rename to docs/rss_api_html/acc__reg__protocol_8c_source.html diff --git a/documents/rss_api_html/acc__reg__protocol_8h.html b/docs/rss_api_html/acc__reg__protocol_8h.html similarity index 100% rename from documents/rss_api_html/acc__reg__protocol_8h.html rename to docs/rss_api_html/acc__reg__protocol_8h.html diff --git a/documents/rss_api_html/acc__reg__protocol_8h_source.html b/docs/rss_api_html/acc__reg__protocol_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__reg__protocol_8h_source.html rename to docs/rss_api_html/acc__reg__protocol_8h_source.html diff --git a/documents/rss_api_html/acc__rss__a121_8h.html b/docs/rss_api_html/acc__rss__a121_8h.html similarity index 100% rename from documents/rss_api_html/acc__rss__a121_8h.html rename to docs/rss_api_html/acc__rss__a121_8h.html diff --git a/documents/rss_api_html/acc__rss__a121_8h_source.html b/docs/rss_api_html/acc__rss__a121_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__rss__a121_8h_source.html rename to docs/rss_api_html/acc__rss__a121_8h_source.html diff --git a/documents/rss_api_html/acc__sensor_8h.html b/docs/rss_api_html/acc__sensor_8h.html similarity index 100% rename from documents/rss_api_html/acc__sensor_8h.html rename to docs/rss_api_html/acc__sensor_8h.html diff --git a/documents/rss_api_html/acc__sensor_8h_source.html b/docs/rss_api_html/acc__sensor_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__sensor_8h_source.html rename to docs/rss_api_html/acc__sensor_8h_source.html diff --git a/documents/rss_api_html/acc__version_8h.html b/docs/rss_api_html/acc__version_8h.html similarity index 100% rename from documents/rss_api_html/acc__version_8h.html rename to docs/rss_api_html/acc__version_8h.html diff --git a/documents/rss_api_html/acc__version_8h_source.html b/docs/rss_api_html/acc__version_8h_source.html similarity index 100% rename from documents/rss_api_html/acc__version_8h_source.html rename to docs/rss_api_html/acc__version_8h_source.html diff --git a/documents/rss_api_html/acc__wrap__printf_8c.html b/docs/rss_api_html/acc__wrap__printf_8c.html similarity index 100% rename from documents/rss_api_html/acc__wrap__printf_8c.html rename to docs/rss_api_html/acc__wrap__printf_8c.html diff --git a/documents/rss_api_html/acc__wrap__printf_8c_source.html b/docs/rss_api_html/acc__wrap__printf_8c_source.html similarity index 100% rename from documents/rss_api_html/acc__wrap__printf_8c_source.html rename to docs/rss_api_html/acc__wrap__printf_8c_source.html diff --git a/documents/rss_api_html/acc_control_helper_8c-example.html b/docs/rss_api_html/acc_control_helper_8c-example.html similarity index 100% rename from documents/rss_api_html/acc_control_helper_8c-example.html rename to docs/rss_api_html/acc_control_helper_8c-example.html diff --git a/documents/rss_api_html/acc_processing_helpers_8c-example.html b/docs/rss_api_html/acc_processing_helpers_8c-example.html similarity index 100% rename from documents/rss_api_html/acc_processing_helpers_8c-example.html rename to docs/rss_api_html/acc_processing_helpers_8c-example.html diff --git a/documents/rss_api_html/annotated.html b/docs/rss_api_html/annotated.html similarity index 100% rename from documents/rss_api_html/annotated.html rename to docs/rss_api_html/annotated.html diff --git a/documents/rss_api_html/bc_s.png b/docs/rss_api_html/bc_s.png similarity index 100% rename from documents/rss_api_html/bc_s.png rename to docs/rss_api_html/bc_s.png diff --git a/documents/rss_api_html/bdwn.png b/docs/rss_api_html/bdwn.png similarity index 100% rename from documents/rss_api_html/bdwn.png rename to docs/rss_api_html/bdwn.png diff --git a/documents/rss_api_html/classes.html b/docs/rss_api_html/classes.html similarity index 100% rename from documents/rss_api_html/classes.html rename to docs/rss_api_html/classes.html diff --git a/documents/rss_api_html/closed.png b/docs/rss_api_html/closed.png similarity index 100% rename from documents/rss_api_html/closed.png rename to docs/rss_api_html/closed.png diff --git a/documents/rss_api_html/dir_04f2ecc425faf0d475a3caf484e551f3.html b/docs/rss_api_html/dir_04f2ecc425faf0d475a3caf484e551f3.html similarity index 100% rename from documents/rss_api_html/dir_04f2ecc425faf0d475a3caf484e551f3.html rename to docs/rss_api_html/dir_04f2ecc425faf0d475a3caf484e551f3.html diff --git a/documents/rss_api_html/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html b/docs/rss_api_html/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html similarity index 100% rename from documents/rss_api_html/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html rename to docs/rss_api_html/dir_0700b2a4a4f8545d3044ba7d40ffd2e1.html diff --git a/documents/rss_api_html/dir_073ccfab4bf11db73a8ee8eb161030da.html b/docs/rss_api_html/dir_073ccfab4bf11db73a8ee8eb161030da.html similarity index 100% rename from documents/rss_api_html/dir_073ccfab4bf11db73a8ee8eb161030da.html rename to docs/rss_api_html/dir_073ccfab4bf11db73a8ee8eb161030da.html diff --git a/documents/rss_api_html/dir_08f02f6646c4dd9624ef093774b0b7f7.html b/docs/rss_api_html/dir_08f02f6646c4dd9624ef093774b0b7f7.html similarity index 100% rename from documents/rss_api_html/dir_08f02f6646c4dd9624ef093774b0b7f7.html rename to docs/rss_api_html/dir_08f02f6646c4dd9624ef093774b0b7f7.html diff --git a/documents/rss_api_html/dir_15c29f069e8c0144bc89b47ad62a396e.html b/docs/rss_api_html/dir_15c29f069e8c0144bc89b47ad62a396e.html similarity index 100% rename from documents/rss_api_html/dir_15c29f069e8c0144bc89b47ad62a396e.html rename to docs/rss_api_html/dir_15c29f069e8c0144bc89b47ad62a396e.html diff --git a/documents/rss_api_html/dir_29751087315bdd66fec7ae73f3a3b3df.html b/docs/rss_api_html/dir_29751087315bdd66fec7ae73f3a3b3df.html similarity index 100% rename from documents/rss_api_html/dir_29751087315bdd66fec7ae73f3a3b3df.html rename to docs/rss_api_html/dir_29751087315bdd66fec7ae73f3a3b3df.html diff --git a/documents/rss_api_html/dir_437c280191dc31797ff1fffcdbf26d60.html b/docs/rss_api_html/dir_437c280191dc31797ff1fffcdbf26d60.html similarity index 100% rename from documents/rss_api_html/dir_437c280191dc31797ff1fffcdbf26d60.html rename to docs/rss_api_html/dir_437c280191dc31797ff1fffcdbf26d60.html diff --git a/documents/rss_api_html/dir_5f3b126a0daad2440047e3d157f0734d.html b/docs/rss_api_html/dir_5f3b126a0daad2440047e3d157f0734d.html similarity index 100% rename from documents/rss_api_html/dir_5f3b126a0daad2440047e3d157f0734d.html rename to docs/rss_api_html/dir_5f3b126a0daad2440047e3d157f0734d.html diff --git a/documents/rss_api_html/dir_763f9730c6de1b6696aabb67bc8f2cb8.html b/docs/rss_api_html/dir_763f9730c6de1b6696aabb67bc8f2cb8.html similarity index 100% rename from documents/rss_api_html/dir_763f9730c6de1b6696aabb67bc8f2cb8.html rename to docs/rss_api_html/dir_763f9730c6de1b6696aabb67bc8f2cb8.html diff --git a/documents/rss_api_html/dir_885ce7a5dfec3e0117d586c25f876c85.html b/docs/rss_api_html/dir_885ce7a5dfec3e0117d586c25f876c85.html similarity index 100% rename from documents/rss_api_html/dir_885ce7a5dfec3e0117d586c25f876c85.html rename to docs/rss_api_html/dir_885ce7a5dfec3e0117d586c25f876c85.html diff --git a/documents/rss_api_html/dir_9037ad2fcf0acf58199e91c83d01aa83.html b/docs/rss_api_html/dir_9037ad2fcf0acf58199e91c83d01aa83.html similarity index 100% rename from documents/rss_api_html/dir_9037ad2fcf0acf58199e91c83d01aa83.html rename to docs/rss_api_html/dir_9037ad2fcf0acf58199e91c83d01aa83.html diff --git a/documents/rss_api_html/dir_90c50c4300347a3add62d58adc5f49d2.html b/docs/rss_api_html/dir_90c50c4300347a3add62d58adc5f49d2.html similarity index 100% rename from documents/rss_api_html/dir_90c50c4300347a3add62d58adc5f49d2.html rename to docs/rss_api_html/dir_90c50c4300347a3add62d58adc5f49d2.html diff --git a/documents/rss_api_html/dir_a90b80e01b24c51566f20c737761e66b.html b/docs/rss_api_html/dir_a90b80e01b24c51566f20c737761e66b.html similarity index 100% rename from documents/rss_api_html/dir_a90b80e01b24c51566f20c737761e66b.html rename to docs/rss_api_html/dir_a90b80e01b24c51566f20c737761e66b.html diff --git a/documents/rss_api_html/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html b/docs/rss_api_html/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html similarity index 100% rename from documents/rss_api_html/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html rename to docs/rss_api_html/dir_ab4160dc9345f344f1e5455bc8a8c5b6.html diff --git a/documents/rss_api_html/dir_b3a0981508daed4f615eb509e7de909b.html b/docs/rss_api_html/dir_b3a0981508daed4f615eb509e7de909b.html similarity index 100% rename from documents/rss_api_html/dir_b3a0981508daed4f615eb509e7de909b.html rename to docs/rss_api_html/dir_b3a0981508daed4f615eb509e7de909b.html diff --git a/documents/rss_api_html/dir_bc91f92db1b66e0df5b21c879d8024f8.html b/docs/rss_api_html/dir_bc91f92db1b66e0df5b21c879d8024f8.html similarity index 100% rename from documents/rss_api_html/dir_bc91f92db1b66e0df5b21c879d8024f8.html rename to docs/rss_api_html/dir_bc91f92db1b66e0df5b21c879d8024f8.html diff --git a/documents/rss_api_html/dir_e68e8157741866f444e17edd764ebbae.html b/docs/rss_api_html/dir_e68e8157741866f444e17edd764ebbae.html similarity index 100% rename from documents/rss_api_html/dir_e68e8157741866f444e17edd764ebbae.html rename to docs/rss_api_html/dir_e68e8157741866f444e17edd764ebbae.html diff --git a/documents/rss_api_html/dir_eabfdd4d73a10cf1a95f85f69b256a94.html b/docs/rss_api_html/dir_eabfdd4d73a10cf1a95f85f69b256a94.html similarity index 100% rename from documents/rss_api_html/dir_eabfdd4d73a10cf1a95f85f69b256a94.html rename to docs/rss_api_html/dir_eabfdd4d73a10cf1a95f85f69b256a94.html diff --git a/documents/rss_api_html/distance__reg__protocol_8c.html b/docs/rss_api_html/distance__reg__protocol_8c.html similarity index 100% rename from documents/rss_api_html/distance__reg__protocol_8c.html rename to docs/rss_api_html/distance__reg__protocol_8c.html diff --git a/documents/rss_api_html/distance__reg__protocol_8c_source.html b/docs/rss_api_html/distance__reg__protocol_8c_source.html similarity index 100% rename from documents/rss_api_html/distance__reg__protocol_8c_source.html rename to docs/rss_api_html/distance__reg__protocol_8c_source.html diff --git a/documents/rss_api_html/distance__reg__protocol_8h.html b/docs/rss_api_html/distance__reg__protocol_8h.html similarity index 100% rename from documents/rss_api_html/distance__reg__protocol_8h.html rename to docs/rss_api_html/distance__reg__protocol_8h.html diff --git a/documents/rss_api_html/distance__reg__protocol_8h_source.html b/docs/rss_api_html/distance__reg__protocol_8h_source.html similarity index 100% rename from documents/rss_api_html/distance__reg__protocol_8h_source.html rename to docs/rss_api_html/distance__reg__protocol_8h_source.html diff --git a/documents/rss_api_html/distance__reg__protocol__access_8c.html b/docs/rss_api_html/distance__reg__protocol__access_8c.html similarity index 100% rename from documents/rss_api_html/distance__reg__protocol__access_8c.html rename to docs/rss_api_html/distance__reg__protocol__access_8c.html diff --git a/documents/rss_api_html/distance__reg__protocol__access_8c_source.html b/docs/rss_api_html/distance__reg__protocol__access_8c_source.html similarity index 100% rename from documents/rss_api_html/distance__reg__protocol__access_8c_source.html rename to docs/rss_api_html/distance__reg__protocol__access_8c_source.html diff --git a/documents/rss_api_html/doc.png b/docs/rss_api_html/doc.png similarity index 100% rename from documents/rss_api_html/doc.png rename to docs/rss_api_html/doc.png diff --git a/documents/rss_api_html/doxygen.css b/docs/rss_api_html/doxygen.css similarity index 100% rename from documents/rss_api_html/doxygen.css rename to docs/rss_api_html/doxygen.css diff --git a/documents/rss_api_html/doxygen.png b/docs/rss_api_html/doxygen.png similarity index 100% rename from documents/rss_api_html/doxygen.png rename to docs/rss_api_html/doxygen.png diff --git a/documents/rss_api_html/dynsections.js b/docs/rss_api_html/dynsections.js similarity index 100% rename from documents/rss_api_html/dynsections.js rename to docs/rss_api_html/dynsections.js diff --git a/documents/rss_api_html/example__bring__up_8c.html b/docs/rss_api_html/example__bring__up_8c.html similarity index 100% rename from documents/rss_api_html/example__bring__up_8c.html rename to docs/rss_api_html/example__bring__up_8c.html diff --git a/documents/rss_api_html/example__bring__up_8c_source.html b/docs/rss_api_html/example__bring__up_8c_source.html similarity index 100% rename from documents/rss_api_html/example__bring__up_8c_source.html rename to docs/rss_api_html/example__bring__up_8c_source.html diff --git a/documents/rss_api_html/example__bring__up_8h.html b/docs/rss_api_html/example__bring__up_8h.html similarity index 100% rename from documents/rss_api_html/example__bring__up_8h.html rename to docs/rss_api_html/example__bring__up_8h.html diff --git a/documents/rss_api_html/example__bring__up_8h_source.html b/docs/rss_api_html/example__bring__up_8h_source.html similarity index 100% rename from documents/rss_api_html/example__bring__up_8h_source.html rename to docs/rss_api_html/example__bring__up_8h_source.html diff --git a/documents/rss_api_html/example__control__helper_8c.html b/docs/rss_api_html/example__control__helper_8c.html similarity index 100% rename from documents/rss_api_html/example__control__helper_8c.html rename to docs/rss_api_html/example__control__helper_8c.html diff --git a/documents/rss_api_html/example__control__helper_8c_source.html b/docs/rss_api_html/example__control__helper_8c_source.html similarity index 100% rename from documents/rss_api_html/example__control__helper_8c_source.html rename to docs/rss_api_html/example__control__helper_8c_source.html diff --git a/documents/rss_api_html/example__control__helper_8h.html b/docs/rss_api_html/example__control__helper_8h.html similarity index 100% rename from documents/rss_api_html/example__control__helper_8h.html rename to docs/rss_api_html/example__control__helper_8h.html diff --git a/documents/rss_api_html/example__control__helper_8h_source.html b/docs/rss_api_html/example__control__helper_8h_source.html similarity index 100% rename from documents/rss_api_html/example__control__helper_8h_source.html rename to docs/rss_api_html/example__control__helper_8h_source.html diff --git a/documents/rss_api_html/example__detector__distance_8c.html b/docs/rss_api_html/example__detector__distance_8c.html similarity index 100% rename from documents/rss_api_html/example__detector__distance_8c.html rename to docs/rss_api_html/example__detector__distance_8c.html diff --git a/documents/rss_api_html/example__detector__distance_8c_source.html b/docs/rss_api_html/example__detector__distance_8c_source.html similarity index 100% rename from documents/rss_api_html/example__detector__distance_8c_source.html rename to docs/rss_api_html/example__detector__distance_8c_source.html diff --git a/documents/rss_api_html/example__detector__distance_8h.html b/docs/rss_api_html/example__detector__distance_8h.html similarity index 100% rename from documents/rss_api_html/example__detector__distance_8h.html rename to docs/rss_api_html/example__detector__distance_8h.html diff --git a/documents/rss_api_html/example__detector__distance_8h_source.html b/docs/rss_api_html/example__detector__distance_8h_source.html similarity index 100% rename from documents/rss_api_html/example__detector__distance_8h_source.html rename to docs/rss_api_html/example__detector__distance_8h_source.html diff --git a/documents/rss_api_html/example__detector__distance__low__power__hibernate_8c.html b/docs/rss_api_html/example__detector__distance__low__power__hibernate_8c.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__low__power__hibernate_8c.html rename to docs/rss_api_html/example__detector__distance__low__power__hibernate_8c.html diff --git a/documents/rss_api_html/example__detector__distance__low__power__hibernate_8c_source.html b/docs/rss_api_html/example__detector__distance__low__power__hibernate_8c_source.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__low__power__hibernate_8c_source.html rename to docs/rss_api_html/example__detector__distance__low__power__hibernate_8c_source.html diff --git a/documents/rss_api_html/example__detector__distance__low__power__hibernate_8h.html b/docs/rss_api_html/example__detector__distance__low__power__hibernate_8h.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__low__power__hibernate_8h.html rename to docs/rss_api_html/example__detector__distance__low__power__hibernate_8h.html diff --git a/documents/rss_api_html/example__detector__distance__low__power__hibernate_8h_source.html b/docs/rss_api_html/example__detector__distance__low__power__hibernate_8h_source.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__low__power__hibernate_8h_source.html rename to docs/rss_api_html/example__detector__distance__low__power__hibernate_8h_source.html diff --git a/documents/rss_api_html/example__detector__distance__low__power__off_8c.html b/docs/rss_api_html/example__detector__distance__low__power__off_8c.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__low__power__off_8c.html rename to docs/rss_api_html/example__detector__distance__low__power__off_8c.html diff --git a/documents/rss_api_html/example__detector__distance__low__power__off_8c_source.html b/docs/rss_api_html/example__detector__distance__low__power__off_8c_source.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__low__power__off_8c_source.html rename to docs/rss_api_html/example__detector__distance__low__power__off_8c_source.html diff --git a/documents/rss_api_html/example__detector__distance__low__power__off_8h.html b/docs/rss_api_html/example__detector__distance__low__power__off_8h.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__low__power__off_8h.html rename to docs/rss_api_html/example__detector__distance__low__power__off_8h.html diff --git a/documents/rss_api_html/example__detector__distance__low__power__off_8h_source.html b/docs/rss_api_html/example__detector__distance__low__power__off_8h_source.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__low__power__off_8h_source.html rename to docs/rss_api_html/example__detector__distance__low__power__off_8h_source.html diff --git a/documents/rss_api_html/example__detector__distance__with__iq__data__print_8c.html b/docs/rss_api_html/example__detector__distance__with__iq__data__print_8c.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__with__iq__data__print_8c.html rename to docs/rss_api_html/example__detector__distance__with__iq__data__print_8c.html diff --git a/documents/rss_api_html/example__detector__distance__with__iq__data__print_8c_source.html b/docs/rss_api_html/example__detector__distance__with__iq__data__print_8c_source.html similarity index 100% rename from documents/rss_api_html/example__detector__distance__with__iq__data__print_8c_source.html rename to docs/rss_api_html/example__detector__distance__with__iq__data__print_8c_source.html diff --git a/documents/rss_api_html/example__detector__presence_8c.html b/docs/rss_api_html/example__detector__presence_8c.html similarity index 100% rename from documents/rss_api_html/example__detector__presence_8c.html rename to docs/rss_api_html/example__detector__presence_8c.html diff --git a/documents/rss_api_html/example__detector__presence_8c_source.html b/docs/rss_api_html/example__detector__presence_8c_source.html similarity index 100% rename from documents/rss_api_html/example__detector__presence_8c_source.html rename to docs/rss_api_html/example__detector__presence_8c_source.html diff --git a/documents/rss_api_html/example__detector__presence_8h.html b/docs/rss_api_html/example__detector__presence_8h.html similarity index 100% rename from documents/rss_api_html/example__detector__presence_8h.html rename to docs/rss_api_html/example__detector__presence_8h.html diff --git a/documents/rss_api_html/example__detector__presence_8h_source.html b/docs/rss_api_html/example__detector__presence_8h_source.html similarity index 100% rename from documents/rss_api_html/example__detector__presence_8h_source.html rename to docs/rss_api_html/example__detector__presence_8h_source.html diff --git a/documents/rss_api_html/example__detector__presence__low__power__hibernate_8c.html b/docs/rss_api_html/example__detector__presence__low__power__hibernate_8c.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__low__power__hibernate_8c.html rename to docs/rss_api_html/example__detector__presence__low__power__hibernate_8c.html diff --git a/documents/rss_api_html/example__detector__presence__low__power__hibernate_8c_source.html b/docs/rss_api_html/example__detector__presence__low__power__hibernate_8c_source.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__low__power__hibernate_8c_source.html rename to docs/rss_api_html/example__detector__presence__low__power__hibernate_8c_source.html diff --git a/documents/rss_api_html/example__detector__presence__low__power__hibernate_8h.html b/docs/rss_api_html/example__detector__presence__low__power__hibernate_8h.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__low__power__hibernate_8h.html rename to docs/rss_api_html/example__detector__presence__low__power__hibernate_8h.html diff --git a/documents/rss_api_html/example__detector__presence__low__power__hibernate_8h_source.html b/docs/rss_api_html/example__detector__presence__low__power__hibernate_8h_source.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__low__power__hibernate_8h_source.html rename to docs/rss_api_html/example__detector__presence__low__power__hibernate_8h_source.html diff --git a/documents/rss_api_html/example__detector__presence__low__power__off_8c.html b/docs/rss_api_html/example__detector__presence__low__power__off_8c.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__low__power__off_8c.html rename to docs/rss_api_html/example__detector__presence__low__power__off_8c.html diff --git a/documents/rss_api_html/example__detector__presence__low__power__off_8c_source.html b/docs/rss_api_html/example__detector__presence__low__power__off_8c_source.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__low__power__off_8c_source.html rename to docs/rss_api_html/example__detector__presence__low__power__off_8c_source.html diff --git a/documents/rss_api_html/example__detector__presence__low__power__off_8h.html b/docs/rss_api_html/example__detector__presence__low__power__off_8h.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__low__power__off_8h.html rename to docs/rss_api_html/example__detector__presence__low__power__off_8h.html diff --git a/documents/rss_api_html/example__detector__presence__low__power__off_8h_source.html b/docs/rss_api_html/example__detector__presence__low__power__off_8h_source.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__low__power__off_8h_source.html rename to docs/rss_api_html/example__detector__presence__low__power__off_8h_source.html diff --git a/documents/rss_api_html/example__detector__presence__multiple__configurations_8c.html b/docs/rss_api_html/example__detector__presence__multiple__configurations_8c.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__multiple__configurations_8c.html rename to docs/rss_api_html/example__detector__presence__multiple__configurations_8c.html diff --git a/documents/rss_api_html/example__detector__presence__multiple__configurations_8c_source.html b/docs/rss_api_html/example__detector__presence__multiple__configurations_8c_source.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__multiple__configurations_8c_source.html rename to docs/rss_api_html/example__detector__presence__multiple__configurations_8c_source.html diff --git a/documents/rss_api_html/example__detector__presence__multiple__configurations_8h.html b/docs/rss_api_html/example__detector__presence__multiple__configurations_8h.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__multiple__configurations_8h.html rename to docs/rss_api_html/example__detector__presence__multiple__configurations_8h.html diff --git a/documents/rss_api_html/example__detector__presence__multiple__configurations_8h_source.html b/docs/rss_api_html/example__detector__presence__multiple__configurations_8h_source.html similarity index 100% rename from documents/rss_api_html/example__detector__presence__multiple__configurations_8h_source.html rename to docs/rss_api_html/example__detector__presence__multiple__configurations_8h_source.html diff --git a/documents/rss_api_html/example__diagnostic__test_8c.html b/docs/rss_api_html/example__diagnostic__test_8c.html similarity index 100% rename from documents/rss_api_html/example__diagnostic__test_8c.html rename to docs/rss_api_html/example__diagnostic__test_8c.html diff --git a/documents/rss_api_html/example__diagnostic__test_8c_source.html b/docs/rss_api_html/example__diagnostic__test_8c_source.html similarity index 100% rename from documents/rss_api_html/example__diagnostic__test_8c_source.html rename to docs/rss_api_html/example__diagnostic__test_8c_source.html diff --git a/documents/rss_api_html/example__diagnostic__test_8h.html b/docs/rss_api_html/example__diagnostic__test_8h.html similarity index 100% rename from documents/rss_api_html/example__diagnostic__test_8h.html rename to docs/rss_api_html/example__diagnostic__test_8h.html diff --git a/documents/rss_api_html/example__diagnostic__test_8h_source.html b/docs/rss_api_html/example__diagnostic__test_8h_source.html similarity index 100% rename from documents/rss_api_html/example__diagnostic__test_8h_source.html rename to docs/rss_api_html/example__diagnostic__test_8h_source.html diff --git a/documents/rss_api_html/example__processing__amplitude_8c.html b/docs/rss_api_html/example__processing__amplitude_8c.html similarity index 100% rename from documents/rss_api_html/example__processing__amplitude_8c.html rename to docs/rss_api_html/example__processing__amplitude_8c.html diff --git a/documents/rss_api_html/example__processing__amplitude_8c_source.html b/docs/rss_api_html/example__processing__amplitude_8c_source.html similarity index 100% rename from documents/rss_api_html/example__processing__amplitude_8c_source.html rename to docs/rss_api_html/example__processing__amplitude_8c_source.html diff --git a/documents/rss_api_html/example__processing__amplitude_8h.html b/docs/rss_api_html/example__processing__amplitude_8h.html similarity index 100% rename from documents/rss_api_html/example__processing__amplitude_8h.html rename to docs/rss_api_html/example__processing__amplitude_8h.html diff --git a/documents/rss_api_html/example__processing__amplitude_8h_source.html b/docs/rss_api_html/example__processing__amplitude_8h_source.html similarity index 100% rename from documents/rss_api_html/example__processing__amplitude_8h_source.html rename to docs/rss_api_html/example__processing__amplitude_8h_source.html diff --git a/documents/rss_api_html/example__processing__coherent__mean_8c.html b/docs/rss_api_html/example__processing__coherent__mean_8c.html similarity index 100% rename from documents/rss_api_html/example__processing__coherent__mean_8c.html rename to docs/rss_api_html/example__processing__coherent__mean_8c.html diff --git a/documents/rss_api_html/example__processing__coherent__mean_8c_source.html b/docs/rss_api_html/example__processing__coherent__mean_8c_source.html similarity index 100% rename from documents/rss_api_html/example__processing__coherent__mean_8c_source.html rename to docs/rss_api_html/example__processing__coherent__mean_8c_source.html diff --git a/documents/rss_api_html/example__processing__coherent__mean_8h.html b/docs/rss_api_html/example__processing__coherent__mean_8h.html similarity index 100% rename from documents/rss_api_html/example__processing__coherent__mean_8h.html rename to docs/rss_api_html/example__processing__coherent__mean_8h.html diff --git a/documents/rss_api_html/example__processing__coherent__mean_8h_source.html b/docs/rss_api_html/example__processing__coherent__mean_8h_source.html similarity index 100% rename from documents/rss_api_html/example__processing__coherent__mean_8h_source.html rename to docs/rss_api_html/example__processing__coherent__mean_8h_source.html diff --git a/documents/rss_api_html/example__processing__noncoherent__mean_8c.html b/docs/rss_api_html/example__processing__noncoherent__mean_8c.html similarity index 100% rename from documents/rss_api_html/example__processing__noncoherent__mean_8c.html rename to docs/rss_api_html/example__processing__noncoherent__mean_8c.html diff --git a/documents/rss_api_html/example__processing__noncoherent__mean_8c_source.html b/docs/rss_api_html/example__processing__noncoherent__mean_8c_source.html similarity index 100% rename from documents/rss_api_html/example__processing__noncoherent__mean_8c_source.html rename to docs/rss_api_html/example__processing__noncoherent__mean_8c_source.html diff --git a/documents/rss_api_html/example__processing__noncoherent__mean_8h.html b/docs/rss_api_html/example__processing__noncoherent__mean_8h.html similarity index 100% rename from documents/rss_api_html/example__processing__noncoherent__mean_8h.html rename to docs/rss_api_html/example__processing__noncoherent__mean_8h.html diff --git a/documents/rss_api_html/example__processing__noncoherent__mean_8h_source.html b/docs/rss_api_html/example__processing__noncoherent__mean_8h_source.html similarity index 100% rename from documents/rss_api_html/example__processing__noncoherent__mean_8h_source.html rename to docs/rss_api_html/example__processing__noncoherent__mean_8h_source.html diff --git a/documents/rss_api_html/example__processing__peak__interpolation_8c.html b/docs/rss_api_html/example__processing__peak__interpolation_8c.html similarity index 100% rename from documents/rss_api_html/example__processing__peak__interpolation_8c.html rename to docs/rss_api_html/example__processing__peak__interpolation_8c.html diff --git a/documents/rss_api_html/example__processing__peak__interpolation_8c_source.html b/docs/rss_api_html/example__processing__peak__interpolation_8c_source.html similarity index 100% rename from documents/rss_api_html/example__processing__peak__interpolation_8c_source.html rename to docs/rss_api_html/example__processing__peak__interpolation_8c_source.html diff --git a/documents/rss_api_html/example__processing__peak__interpolation_8h.html b/docs/rss_api_html/example__processing__peak__interpolation_8h.html similarity index 100% rename from documents/rss_api_html/example__processing__peak__interpolation_8h.html rename to docs/rss_api_html/example__processing__peak__interpolation_8h.html diff --git a/documents/rss_api_html/example__processing__peak__interpolation_8h_source.html b/docs/rss_api_html/example__processing__peak__interpolation_8h_source.html similarity index 100% rename from documents/rss_api_html/example__processing__peak__interpolation_8h_source.html rename to docs/rss_api_html/example__processing__peak__interpolation_8h_source.html diff --git a/documents/rss_api_html/example__processing__static__presence_8c.html b/docs/rss_api_html/example__processing__static__presence_8c.html similarity index 100% rename from documents/rss_api_html/example__processing__static__presence_8c.html rename to docs/rss_api_html/example__processing__static__presence_8c.html diff --git a/documents/rss_api_html/example__processing__static__presence_8c_source.html b/docs/rss_api_html/example__processing__static__presence_8c_source.html similarity index 100% rename from documents/rss_api_html/example__processing__static__presence_8c_source.html rename to docs/rss_api_html/example__processing__static__presence_8c_source.html diff --git a/documents/rss_api_html/example__processing__static__presence_8h.html b/docs/rss_api_html/example__processing__static__presence_8h.html similarity index 100% rename from documents/rss_api_html/example__processing__static__presence_8h.html rename to docs/rss_api_html/example__processing__static__presence_8h.html diff --git a/documents/rss_api_html/example__processing__static__presence_8h_source.html b/docs/rss_api_html/example__processing__static__presence_8h_source.html similarity index 100% rename from documents/rss_api_html/example__processing__static__presence_8h_source.html rename to docs/rss_api_html/example__processing__static__presence_8h_source.html diff --git a/documents/rss_api_html/example__processing__subtract__adaptive__bg_8c.html b/docs/rss_api_html/example__processing__subtract__adaptive__bg_8c.html similarity index 100% rename from documents/rss_api_html/example__processing__subtract__adaptive__bg_8c.html rename to docs/rss_api_html/example__processing__subtract__adaptive__bg_8c.html diff --git a/documents/rss_api_html/example__processing__subtract__adaptive__bg_8c_source.html b/docs/rss_api_html/example__processing__subtract__adaptive__bg_8c_source.html similarity index 100% rename from documents/rss_api_html/example__processing__subtract__adaptive__bg_8c_source.html rename to docs/rss_api_html/example__processing__subtract__adaptive__bg_8c_source.html diff --git a/documents/rss_api_html/example__processing__subtract__adaptive__bg_8h.html b/docs/rss_api_html/example__processing__subtract__adaptive__bg_8h.html similarity index 100% rename from documents/rss_api_html/example__processing__subtract__adaptive__bg_8h.html rename to docs/rss_api_html/example__processing__subtract__adaptive__bg_8h.html diff --git a/documents/rss_api_html/example__processing__subtract__adaptive__bg_8h_source.html b/docs/rss_api_html/example__processing__subtract__adaptive__bg_8h_source.html similarity index 100% rename from documents/rss_api_html/example__processing__subtract__adaptive__bg_8h_source.html rename to docs/rss_api_html/example__processing__subtract__adaptive__bg_8h_source.html diff --git a/documents/rss_api_html/example__service_8c.html b/docs/rss_api_html/example__service_8c.html similarity index 100% rename from documents/rss_api_html/example__service_8c.html rename to docs/rss_api_html/example__service_8c.html diff --git a/documents/rss_api_html/example__service_8c_source.html b/docs/rss_api_html/example__service_8c_source.html similarity index 100% rename from documents/rss_api_html/example__service_8c_source.html rename to docs/rss_api_html/example__service_8c_source.html diff --git a/documents/rss_api_html/example__service_8h.html b/docs/rss_api_html/example__service_8h.html similarity index 100% rename from documents/rss_api_html/example__service_8h.html rename to docs/rss_api_html/example__service_8h.html diff --git a/documents/rss_api_html/example__service_8h_source.html b/docs/rss_api_html/example__service_8h_source.html similarity index 100% rename from documents/rss_api_html/example__service_8h_source.html rename to docs/rss_api_html/example__service_8h_source.html diff --git a/documents/rss_api_html/example__service__low__power__sensor__disable_8c.html b/docs/rss_api_html/example__service__low__power__sensor__disable_8c.html similarity index 100% rename from documents/rss_api_html/example__service__low__power__sensor__disable_8c.html rename to docs/rss_api_html/example__service__low__power__sensor__disable_8c.html diff --git a/documents/rss_api_html/example__service__low__power__sensor__disable_8c_source.html b/docs/rss_api_html/example__service__low__power__sensor__disable_8c_source.html similarity index 100% rename from documents/rss_api_html/example__service__low__power__sensor__disable_8c_source.html rename to docs/rss_api_html/example__service__low__power__sensor__disable_8c_source.html diff --git a/documents/rss_api_html/example__service__low__power__sensor__disable_8h.html b/docs/rss_api_html/example__service__low__power__sensor__disable_8h.html similarity index 100% rename from documents/rss_api_html/example__service__low__power__sensor__disable_8h.html rename to docs/rss_api_html/example__service__low__power__sensor__disable_8h.html diff --git a/documents/rss_api_html/example__service__low__power__sensor__disable_8h_source.html b/docs/rss_api_html/example__service__low__power__sensor__disable_8h_source.html similarity index 100% rename from documents/rss_api_html/example__service__low__power__sensor__disable_8h_source.html rename to docs/rss_api_html/example__service__low__power__sensor__disable_8h_source.html diff --git a/documents/rss_api_html/example__service__low__power__sensor__hibernate_8c.html b/docs/rss_api_html/example__service__low__power__sensor__hibernate_8c.html similarity index 100% rename from documents/rss_api_html/example__service__low__power__sensor__hibernate_8c.html rename to docs/rss_api_html/example__service__low__power__sensor__hibernate_8c.html diff --git a/documents/rss_api_html/example__service__low__power__sensor__hibernate_8c_source.html b/docs/rss_api_html/example__service__low__power__sensor__hibernate_8c_source.html similarity index 100% rename from documents/rss_api_html/example__service__low__power__sensor__hibernate_8c_source.html rename to docs/rss_api_html/example__service__low__power__sensor__hibernate_8c_source.html diff --git a/documents/rss_api_html/example__service__low__power__sensor__hibernate_8h.html b/docs/rss_api_html/example__service__low__power__sensor__hibernate_8h.html similarity index 100% rename from documents/rss_api_html/example__service__low__power__sensor__hibernate_8h.html rename to docs/rss_api_html/example__service__low__power__sensor__hibernate_8h.html diff --git a/documents/rss_api_html/example__service__low__power__sensor__hibernate_8h_source.html b/docs/rss_api_html/example__service__low__power__sensor__hibernate_8h_source.html similarity index 100% rename from documents/rss_api_html/example__service__low__power__sensor__hibernate_8h_source.html rename to docs/rss_api_html/example__service__low__power__sensor__hibernate_8h_source.html diff --git a/documents/rss_api_html/example__service__multiple__configurations_8c.html b/docs/rss_api_html/example__service__multiple__configurations_8c.html similarity index 100% rename from documents/rss_api_html/example__service__multiple__configurations_8c.html rename to docs/rss_api_html/example__service__multiple__configurations_8c.html diff --git a/documents/rss_api_html/example__service__multiple__configurations_8c_source.html b/docs/rss_api_html/example__service__multiple__configurations_8c_source.html similarity index 100% rename from documents/rss_api_html/example__service__multiple__configurations_8c_source.html rename to docs/rss_api_html/example__service__multiple__configurations_8c_source.html diff --git a/documents/rss_api_html/example__service__multiple__configurations_8h.html b/docs/rss_api_html/example__service__multiple__configurations_8h.html similarity index 100% rename from documents/rss_api_html/example__service__multiple__configurations_8h.html rename to docs/rss_api_html/example__service__multiple__configurations_8h.html diff --git a/documents/rss_api_html/example__service__multiple__configurations_8h_source.html b/docs/rss_api_html/example__service__multiple__configurations_8h_source.html similarity index 100% rename from documents/rss_api_html/example__service__multiple__configurations_8h_source.html rename to docs/rss_api_html/example__service__multiple__configurations_8h_source.html diff --git a/documents/rss_api_html/example__service__sensor__disable_8c.html b/docs/rss_api_html/example__service__sensor__disable_8c.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__disable_8c.html rename to docs/rss_api_html/example__service__sensor__disable_8c.html diff --git a/documents/rss_api_html/example__service__sensor__disable_8c_source.html b/docs/rss_api_html/example__service__sensor__disable_8c_source.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__disable_8c_source.html rename to docs/rss_api_html/example__service__sensor__disable_8c_source.html diff --git a/documents/rss_api_html/example__service__sensor__disable_8h.html b/docs/rss_api_html/example__service__sensor__disable_8h.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__disable_8h.html rename to docs/rss_api_html/example__service__sensor__disable_8h.html diff --git a/documents/rss_api_html/example__service__sensor__disable_8h_source.html b/docs/rss_api_html/example__service__sensor__disable_8h_source.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__disable_8h_source.html rename to docs/rss_api_html/example__service__sensor__disable_8h_source.html diff --git a/documents/rss_api_html/example__service__sensor__hibernate_8c.html b/docs/rss_api_html/example__service__sensor__hibernate_8c.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__hibernate_8c.html rename to docs/rss_api_html/example__service__sensor__hibernate_8c.html diff --git a/documents/rss_api_html/example__service__sensor__hibernate_8c_source.html b/docs/rss_api_html/example__service__sensor__hibernate_8c_source.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__hibernate_8c_source.html rename to docs/rss_api_html/example__service__sensor__hibernate_8c_source.html diff --git a/documents/rss_api_html/example__service__sensor__hibernate_8h.html b/docs/rss_api_html/example__service__sensor__hibernate_8h.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__hibernate_8h.html rename to docs/rss_api_html/example__service__sensor__hibernate_8h.html diff --git a/documents/rss_api_html/example__service__sensor__hibernate_8h_source.html b/docs/rss_api_html/example__service__sensor__hibernate_8h_source.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__hibernate_8h_source.html rename to docs/rss_api_html/example__service__sensor__hibernate_8h_source.html diff --git a/documents/rss_api_html/example__service__sensor__off_8c.html b/docs/rss_api_html/example__service__sensor__off_8c.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__off_8c.html rename to docs/rss_api_html/example__service__sensor__off_8c.html diff --git a/documents/rss_api_html/example__service__sensor__off_8c_source.html b/docs/rss_api_html/example__service__sensor__off_8c_source.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__off_8c_source.html rename to docs/rss_api_html/example__service__sensor__off_8c_source.html diff --git a/documents/rss_api_html/example__service__sensor__off_8h.html b/docs/rss_api_html/example__service__sensor__off_8h.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__off_8h.html rename to docs/rss_api_html/example__service__sensor__off_8h.html diff --git a/documents/rss_api_html/example__service__sensor__off_8h_source.html b/docs/rss_api_html/example__service__sensor__off_8h_source.html similarity index 100% rename from documents/rss_api_html/example__service__sensor__off_8h_source.html rename to docs/rss_api_html/example__service__sensor__off_8h_source.html diff --git a/documents/rss_api_html/example__service__subsweeps_8c.html b/docs/rss_api_html/example__service__subsweeps_8c.html similarity index 100% rename from documents/rss_api_html/example__service__subsweeps_8c.html rename to docs/rss_api_html/example__service__subsweeps_8c.html diff --git a/documents/rss_api_html/example__service__subsweeps_8c_source.html b/docs/rss_api_html/example__service__subsweeps_8c_source.html similarity index 100% rename from documents/rss_api_html/example__service__subsweeps_8c_source.html rename to docs/rss_api_html/example__service__subsweeps_8c_source.html diff --git a/documents/rss_api_html/example__service__subsweeps_8h.html b/docs/rss_api_html/example__service__subsweeps_8h.html similarity index 100% rename from documents/rss_api_html/example__service__subsweeps_8h.html rename to docs/rss_api_html/example__service__subsweeps_8h.html diff --git a/documents/rss_api_html/example__service__subsweeps_8h_source.html b/docs/rss_api_html/example__service__subsweeps_8h_source.html similarity index 100% rename from documents/rss_api_html/example__service__subsweeps_8h_source.html rename to docs/rss_api_html/example__service__subsweeps_8h_source.html diff --git a/documents/rss_api_html/example__surface__velocity_8c.html b/docs/rss_api_html/example__surface__velocity_8c.html similarity index 100% rename from documents/rss_api_html/example__surface__velocity_8c.html rename to docs/rss_api_html/example__surface__velocity_8c.html diff --git a/documents/rss_api_html/example__surface__velocity_8c_source.html b/docs/rss_api_html/example__surface__velocity_8c_source.html similarity index 100% rename from documents/rss_api_html/example__surface__velocity_8c_source.html rename to docs/rss_api_html/example__surface__velocity_8c_source.html diff --git a/documents/rss_api_html/example__surface__velocity_8h.html b/docs/rss_api_html/example__surface__velocity_8h.html similarity index 100% rename from documents/rss_api_html/example__surface__velocity_8h.html rename to docs/rss_api_html/example__surface__velocity_8h.html diff --git a/documents/rss_api_html/example__surface__velocity_8h_source.html b/docs/rss_api_html/example__surface__velocity_8h_source.html similarity index 100% rename from documents/rss_api_html/example__surface__velocity_8h_source.html rename to docs/rss_api_html/example__surface__velocity_8h_source.html diff --git a/documents/rss_api_html/example_bring_up_8c-example.html b/docs/rss_api_html/example_bring_up_8c-example.html similarity index 100% rename from documents/rss_api_html/example_bring_up_8c-example.html rename to docs/rss_api_html/example_bring_up_8c-example.html diff --git a/documents/rss_api_html/example_control_helper_8c-example.html b/docs/rss_api_html/example_control_helper_8c-example.html similarity index 100% rename from documents/rss_api_html/example_control_helper_8c-example.html rename to docs/rss_api_html/example_control_helper_8c-example.html diff --git a/documents/rss_api_html/example_detector_distance_8c-example.html b/docs/rss_api_html/example_detector_distance_8c-example.html similarity index 100% rename from documents/rss_api_html/example_detector_distance_8c-example.html rename to docs/rss_api_html/example_detector_distance_8c-example.html diff --git a/documents/rss_api_html/example_detector_distance_low_power_hibernate_8c-example.html b/docs/rss_api_html/example_detector_distance_low_power_hibernate_8c-example.html similarity index 100% rename from documents/rss_api_html/example_detector_distance_low_power_hibernate_8c-example.html rename to docs/rss_api_html/example_detector_distance_low_power_hibernate_8c-example.html diff --git a/documents/rss_api_html/example_detector_distance_low_power_off_8c-example.html b/docs/rss_api_html/example_detector_distance_low_power_off_8c-example.html similarity index 100% rename from documents/rss_api_html/example_detector_distance_low_power_off_8c-example.html rename to docs/rss_api_html/example_detector_distance_low_power_off_8c-example.html diff --git a/documents/rss_api_html/example_detector_distance_with_iq_data_print_8c-example.html b/docs/rss_api_html/example_detector_distance_with_iq_data_print_8c-example.html similarity index 100% rename from documents/rss_api_html/example_detector_distance_with_iq_data_print_8c-example.html rename to docs/rss_api_html/example_detector_distance_with_iq_data_print_8c-example.html diff --git a/documents/rss_api_html/example_detector_presence_8c-example.html b/docs/rss_api_html/example_detector_presence_8c-example.html similarity index 100% rename from documents/rss_api_html/example_detector_presence_8c-example.html rename to docs/rss_api_html/example_detector_presence_8c-example.html diff --git a/documents/rss_api_html/example_detector_presence_low_power_hibernate_8c-example.html b/docs/rss_api_html/example_detector_presence_low_power_hibernate_8c-example.html similarity index 100% rename from documents/rss_api_html/example_detector_presence_low_power_hibernate_8c-example.html rename to docs/rss_api_html/example_detector_presence_low_power_hibernate_8c-example.html diff --git a/documents/rss_api_html/example_detector_presence_low_power_off_8c-example.html b/docs/rss_api_html/example_detector_presence_low_power_off_8c-example.html similarity index 100% rename from documents/rss_api_html/example_detector_presence_low_power_off_8c-example.html rename to docs/rss_api_html/example_detector_presence_low_power_off_8c-example.html diff --git a/documents/rss_api_html/example_detector_presence_multiple_configurations_8c-example.html b/docs/rss_api_html/example_detector_presence_multiple_configurations_8c-example.html similarity index 100% rename from documents/rss_api_html/example_detector_presence_multiple_configurations_8c-example.html rename to docs/rss_api_html/example_detector_presence_multiple_configurations_8c-example.html diff --git a/documents/rss_api_html/example_diagnostic_test_8c-example.html b/docs/rss_api_html/example_diagnostic_test_8c-example.html similarity index 100% rename from documents/rss_api_html/example_diagnostic_test_8c-example.html rename to docs/rss_api_html/example_diagnostic_test_8c-example.html diff --git a/documents/rss_api_html/example_processing_amplitude_8c-example.html b/docs/rss_api_html/example_processing_amplitude_8c-example.html similarity index 100% rename from documents/rss_api_html/example_processing_amplitude_8c-example.html rename to docs/rss_api_html/example_processing_amplitude_8c-example.html diff --git a/documents/rss_api_html/example_processing_coherent_mean_8c-example.html b/docs/rss_api_html/example_processing_coherent_mean_8c-example.html similarity index 100% rename from documents/rss_api_html/example_processing_coherent_mean_8c-example.html rename to docs/rss_api_html/example_processing_coherent_mean_8c-example.html diff --git a/documents/rss_api_html/example_processing_noncoherent_mean_8c-example.html b/docs/rss_api_html/example_processing_noncoherent_mean_8c-example.html similarity index 100% rename from documents/rss_api_html/example_processing_noncoherent_mean_8c-example.html rename to docs/rss_api_html/example_processing_noncoherent_mean_8c-example.html diff --git a/documents/rss_api_html/example_processing_peak_interpolation_8c-example.html b/docs/rss_api_html/example_processing_peak_interpolation_8c-example.html similarity index 100% rename from documents/rss_api_html/example_processing_peak_interpolation_8c-example.html rename to docs/rss_api_html/example_processing_peak_interpolation_8c-example.html diff --git a/documents/rss_api_html/example_processing_static_presence_8c-example.html b/docs/rss_api_html/example_processing_static_presence_8c-example.html similarity index 100% rename from documents/rss_api_html/example_processing_static_presence_8c-example.html rename to docs/rss_api_html/example_processing_static_presence_8c-example.html diff --git a/documents/rss_api_html/example_processing_subtract_adaptive_bg_8c-example.html b/docs/rss_api_html/example_processing_subtract_adaptive_bg_8c-example.html similarity index 100% rename from documents/rss_api_html/example_processing_subtract_adaptive_bg_8c-example.html rename to docs/rss_api_html/example_processing_subtract_adaptive_bg_8c-example.html diff --git a/documents/rss_api_html/example_service_8c-example.html b/docs/rss_api_html/example_service_8c-example.html similarity index 100% rename from documents/rss_api_html/example_service_8c-example.html rename to docs/rss_api_html/example_service_8c-example.html diff --git a/documents/rss_api_html/example_service_low_power_sensor_disable_8c-example.html b/docs/rss_api_html/example_service_low_power_sensor_disable_8c-example.html similarity index 100% rename from documents/rss_api_html/example_service_low_power_sensor_disable_8c-example.html rename to docs/rss_api_html/example_service_low_power_sensor_disable_8c-example.html diff --git a/documents/rss_api_html/example_service_low_power_sensor_hibernate_8c-example.html b/docs/rss_api_html/example_service_low_power_sensor_hibernate_8c-example.html similarity index 100% rename from documents/rss_api_html/example_service_low_power_sensor_hibernate_8c-example.html rename to docs/rss_api_html/example_service_low_power_sensor_hibernate_8c-example.html diff --git a/documents/rss_api_html/example_service_multiple_configurations_8c-example.html b/docs/rss_api_html/example_service_multiple_configurations_8c-example.html similarity index 100% rename from documents/rss_api_html/example_service_multiple_configurations_8c-example.html rename to docs/rss_api_html/example_service_multiple_configurations_8c-example.html diff --git a/documents/rss_api_html/example_service_sensor_disable_8c-example.html b/docs/rss_api_html/example_service_sensor_disable_8c-example.html similarity index 100% rename from documents/rss_api_html/example_service_sensor_disable_8c-example.html rename to docs/rss_api_html/example_service_sensor_disable_8c-example.html diff --git a/documents/rss_api_html/example_service_sensor_hibernate_8c-example.html b/docs/rss_api_html/example_service_sensor_hibernate_8c-example.html similarity index 100% rename from documents/rss_api_html/example_service_sensor_hibernate_8c-example.html rename to docs/rss_api_html/example_service_sensor_hibernate_8c-example.html diff --git a/documents/rss_api_html/example_service_sensor_off_8c-example.html b/docs/rss_api_html/example_service_sensor_off_8c-example.html similarity index 100% rename from documents/rss_api_html/example_service_sensor_off_8c-example.html rename to docs/rss_api_html/example_service_sensor_off_8c-example.html diff --git a/documents/rss_api_html/example_service_subsweeps_8c-example.html b/docs/rss_api_html/example_service_subsweeps_8c-example.html similarity index 100% rename from documents/rss_api_html/example_service_subsweeps_8c-example.html rename to docs/rss_api_html/example_service_subsweeps_8c-example.html diff --git a/documents/rss_api_html/examples.html b/docs/rss_api_html/examples.html similarity index 100% rename from documents/rss_api_html/examples.html rename to docs/rss_api_html/examples.html diff --git a/documents/rss_api_html/examples.js b/docs/rss_api_html/examples.js similarity index 100% rename from documents/rss_api_html/examples.js rename to docs/rss_api_html/examples.js diff --git a/documents/rss_api_html/files.html b/docs/rss_api_html/files.html similarity index 100% rename from documents/rss_api_html/files.html rename to docs/rss_api_html/files.html diff --git a/documents/rss_api_html/folderclosed.png b/docs/rss_api_html/folderclosed.png similarity index 100% rename from documents/rss_api_html/folderclosed.png rename to docs/rss_api_html/folderclosed.png diff --git a/documents/rss_api_html/folderopen.png b/docs/rss_api_html/folderopen.png similarity index 100% rename from documents/rss_api_html/folderopen.png rename to docs/rss_api_html/folderopen.png diff --git a/documents/rss_api_html/functions.html b/docs/rss_api_html/functions.html similarity index 100% rename from documents/rss_api_html/functions.html rename to docs/rss_api_html/functions.html diff --git a/documents/rss_api_html/functions_b.html b/docs/rss_api_html/functions_b.html similarity index 100% rename from documents/rss_api_html/functions_b.html rename to docs/rss_api_html/functions_b.html diff --git a/documents/rss_api_html/functions_c.html b/docs/rss_api_html/functions_c.html similarity index 100% rename from documents/rss_api_html/functions_c.html rename to docs/rss_api_html/functions_c.html diff --git a/documents/rss_api_html/functions_d.html b/docs/rss_api_html/functions_d.html similarity index 100% rename from documents/rss_api_html/functions_d.html rename to docs/rss_api_html/functions_d.html diff --git a/documents/rss_api_html/functions_e.html b/docs/rss_api_html/functions_e.html similarity index 100% rename from documents/rss_api_html/functions_e.html rename to docs/rss_api_html/functions_e.html diff --git a/documents/rss_api_html/functions_f.html b/docs/rss_api_html/functions_f.html similarity index 100% rename from documents/rss_api_html/functions_f.html rename to docs/rss_api_html/functions_f.html diff --git a/documents/rss_api_html/functions_g.html b/docs/rss_api_html/functions_g.html similarity index 100% rename from documents/rss_api_html/functions_g.html rename to docs/rss_api_html/functions_g.html diff --git a/documents/rss_api_html/functions_h.html b/docs/rss_api_html/functions_h.html similarity index 100% rename from documents/rss_api_html/functions_h.html rename to docs/rss_api_html/functions_h.html diff --git a/documents/rss_api_html/functions_i.html b/docs/rss_api_html/functions_i.html similarity index 100% rename from documents/rss_api_html/functions_i.html rename to docs/rss_api_html/functions_i.html diff --git a/documents/rss_api_html/functions_l.html b/docs/rss_api_html/functions_l.html similarity index 100% rename from documents/rss_api_html/functions_l.html rename to docs/rss_api_html/functions_l.html diff --git a/documents/rss_api_html/functions_m.html b/docs/rss_api_html/functions_m.html similarity index 100% rename from documents/rss_api_html/functions_m.html rename to docs/rss_api_html/functions_m.html diff --git a/documents/rss_api_html/functions_n.html b/docs/rss_api_html/functions_n.html similarity index 100% rename from documents/rss_api_html/functions_n.html rename to docs/rss_api_html/functions_n.html diff --git a/documents/rss_api_html/functions_o.html b/docs/rss_api_html/functions_o.html similarity index 100% rename from documents/rss_api_html/functions_o.html rename to docs/rss_api_html/functions_o.html diff --git a/documents/rss_api_html/functions_p.html b/docs/rss_api_html/functions_p.html similarity index 100% rename from documents/rss_api_html/functions_p.html rename to docs/rss_api_html/functions_p.html diff --git a/documents/rss_api_html/functions_r.html b/docs/rss_api_html/functions_r.html similarity index 100% rename from documents/rss_api_html/functions_r.html rename to docs/rss_api_html/functions_r.html diff --git a/documents/rss_api_html/functions_s.html b/docs/rss_api_html/functions_s.html similarity index 100% rename from documents/rss_api_html/functions_s.html rename to docs/rss_api_html/functions_s.html diff --git a/documents/rss_api_html/functions_t.html b/docs/rss_api_html/functions_t.html similarity index 100% rename from documents/rss_api_html/functions_t.html rename to docs/rss_api_html/functions_t.html diff --git a/documents/rss_api_html/functions_u.html b/docs/rss_api_html/functions_u.html similarity index 100% rename from documents/rss_api_html/functions_u.html rename to docs/rss_api_html/functions_u.html diff --git a/documents/rss_api_html/functions_v.html b/docs/rss_api_html/functions_v.html similarity index 100% rename from documents/rss_api_html/functions_v.html rename to docs/rss_api_html/functions_v.html diff --git a/documents/rss_api_html/functions_vars.html b/docs/rss_api_html/functions_vars.html similarity index 100% rename from documents/rss_api_html/functions_vars.html rename to docs/rss_api_html/functions_vars.html diff --git a/documents/rss_api_html/functions_vars_b.html b/docs/rss_api_html/functions_vars_b.html similarity index 100% rename from documents/rss_api_html/functions_vars_b.html rename to docs/rss_api_html/functions_vars_b.html diff --git a/documents/rss_api_html/functions_vars_c.html b/docs/rss_api_html/functions_vars_c.html similarity index 100% rename from documents/rss_api_html/functions_vars_c.html rename to docs/rss_api_html/functions_vars_c.html diff --git a/documents/rss_api_html/functions_vars_d.html b/docs/rss_api_html/functions_vars_d.html similarity index 100% rename from documents/rss_api_html/functions_vars_d.html rename to docs/rss_api_html/functions_vars_d.html diff --git a/documents/rss_api_html/functions_vars_e.html b/docs/rss_api_html/functions_vars_e.html similarity index 100% rename from documents/rss_api_html/functions_vars_e.html rename to docs/rss_api_html/functions_vars_e.html diff --git a/documents/rss_api_html/functions_vars_f.html b/docs/rss_api_html/functions_vars_f.html similarity index 100% rename from documents/rss_api_html/functions_vars_f.html rename to docs/rss_api_html/functions_vars_f.html diff --git a/documents/rss_api_html/functions_vars_g.html b/docs/rss_api_html/functions_vars_g.html similarity index 100% rename from documents/rss_api_html/functions_vars_g.html rename to docs/rss_api_html/functions_vars_g.html diff --git a/documents/rss_api_html/functions_vars_h.html b/docs/rss_api_html/functions_vars_h.html similarity index 100% rename from documents/rss_api_html/functions_vars_h.html rename to docs/rss_api_html/functions_vars_h.html diff --git a/documents/rss_api_html/functions_vars_i.html b/docs/rss_api_html/functions_vars_i.html similarity index 100% rename from documents/rss_api_html/functions_vars_i.html rename to docs/rss_api_html/functions_vars_i.html diff --git a/documents/rss_api_html/functions_vars_l.html b/docs/rss_api_html/functions_vars_l.html similarity index 100% rename from documents/rss_api_html/functions_vars_l.html rename to docs/rss_api_html/functions_vars_l.html diff --git a/documents/rss_api_html/functions_vars_m.html b/docs/rss_api_html/functions_vars_m.html similarity index 100% rename from documents/rss_api_html/functions_vars_m.html rename to docs/rss_api_html/functions_vars_m.html diff --git a/documents/rss_api_html/functions_vars_n.html b/docs/rss_api_html/functions_vars_n.html similarity index 100% rename from documents/rss_api_html/functions_vars_n.html rename to docs/rss_api_html/functions_vars_n.html diff --git a/documents/rss_api_html/functions_vars_o.html b/docs/rss_api_html/functions_vars_o.html similarity index 100% rename from documents/rss_api_html/functions_vars_o.html rename to docs/rss_api_html/functions_vars_o.html diff --git a/documents/rss_api_html/functions_vars_p.html b/docs/rss_api_html/functions_vars_p.html similarity index 100% rename from documents/rss_api_html/functions_vars_p.html rename to docs/rss_api_html/functions_vars_p.html diff --git a/documents/rss_api_html/functions_vars_r.html b/docs/rss_api_html/functions_vars_r.html similarity index 100% rename from documents/rss_api_html/functions_vars_r.html rename to docs/rss_api_html/functions_vars_r.html diff --git a/documents/rss_api_html/functions_vars_s.html b/docs/rss_api_html/functions_vars_s.html similarity index 100% rename from documents/rss_api_html/functions_vars_s.html rename to docs/rss_api_html/functions_vars_s.html diff --git a/documents/rss_api_html/functions_vars_t.html b/docs/rss_api_html/functions_vars_t.html similarity index 100% rename from documents/rss_api_html/functions_vars_t.html rename to docs/rss_api_html/functions_vars_t.html diff --git a/documents/rss_api_html/functions_vars_u.html b/docs/rss_api_html/functions_vars_u.html similarity index 100% rename from documents/rss_api_html/functions_vars_u.html rename to docs/rss_api_html/functions_vars_u.html diff --git a/documents/rss_api_html/functions_vars_v.html b/docs/rss_api_html/functions_vars_v.html similarity index 100% rename from documents/rss_api_html/functions_vars_v.html rename to docs/rss_api_html/functions_vars_v.html diff --git a/documents/rss_api_html/functions_vars_w.html b/docs/rss_api_html/functions_vars_w.html similarity index 100% rename from documents/rss_api_html/functions_vars_w.html rename to docs/rss_api_html/functions_vars_w.html diff --git a/documents/rss_api_html/functions_vars_z.html b/docs/rss_api_html/functions_vars_z.html similarity index 100% rename from documents/rss_api_html/functions_vars_z.html rename to docs/rss_api_html/functions_vars_z.html diff --git a/documents/rss_api_html/functions_w.html b/docs/rss_api_html/functions_w.html similarity index 100% rename from documents/rss_api_html/functions_w.html rename to docs/rss_api_html/functions_w.html diff --git a/documents/rss_api_html/functions_z.html b/docs/rss_api_html/functions_z.html similarity index 100% rename from documents/rss_api_html/functions_z.html rename to docs/rss_api_html/functions_z.html diff --git a/documents/rss_api_html/globals.html b/docs/rss_api_html/globals.html similarity index 100% rename from documents/rss_api_html/globals.html rename to docs/rss_api_html/globals.html diff --git a/documents/rss_api_html/globals_a.html b/docs/rss_api_html/globals_a.html similarity index 100% rename from documents/rss_api_html/globals_a.html rename to docs/rss_api_html/globals_a.html diff --git a/documents/rss_api_html/globals_b.html b/docs/rss_api_html/globals_b.html similarity index 100% rename from documents/rss_api_html/globals_b.html rename to docs/rss_api_html/globals_b.html diff --git a/documents/rss_api_html/globals_c.html b/docs/rss_api_html/globals_c.html similarity index 100% rename from documents/rss_api_html/globals_c.html rename to docs/rss_api_html/globals_c.html diff --git a/documents/rss_api_html/globals_d.html b/docs/rss_api_html/globals_d.html similarity index 100% rename from documents/rss_api_html/globals_d.html rename to docs/rss_api_html/globals_d.html diff --git a/documents/rss_api_html/globals_defs.html b/docs/rss_api_html/globals_defs.html similarity index 100% rename from documents/rss_api_html/globals_defs.html rename to docs/rss_api_html/globals_defs.html diff --git a/documents/rss_api_html/globals_defs_b.html b/docs/rss_api_html/globals_defs_b.html similarity index 100% rename from documents/rss_api_html/globals_defs_b.html rename to docs/rss_api_html/globals_defs_b.html diff --git a/documents/rss_api_html/globals_defs_c.html b/docs/rss_api_html/globals_defs_c.html similarity index 100% rename from documents/rss_api_html/globals_defs_c.html rename to docs/rss_api_html/globals_defs_c.html diff --git a/documents/rss_api_html/globals_defs_d.html b/docs/rss_api_html/globals_defs_d.html similarity index 100% rename from documents/rss_api_html/globals_defs_d.html rename to docs/rss_api_html/globals_defs_d.html diff --git a/documents/rss_api_html/globals_defs_e.html b/docs/rss_api_html/globals_defs_e.html similarity index 100% rename from documents/rss_api_html/globals_defs_e.html rename to docs/rss_api_html/globals_defs_e.html diff --git a/documents/rss_api_html/globals_defs_f.html b/docs/rss_api_html/globals_defs_f.html similarity index 100% rename from documents/rss_api_html/globals_defs_f.html rename to docs/rss_api_html/globals_defs_f.html diff --git a/documents/rss_api_html/globals_defs_g.html b/docs/rss_api_html/globals_defs_g.html similarity index 100% rename from documents/rss_api_html/globals_defs_g.html rename to docs/rss_api_html/globals_defs_g.html diff --git a/documents/rss_api_html/globals_defs_h.html b/docs/rss_api_html/globals_defs_h.html similarity index 100% rename from documents/rss_api_html/globals_defs_h.html rename to docs/rss_api_html/globals_defs_h.html diff --git a/documents/rss_api_html/globals_defs_i.html b/docs/rss_api_html/globals_defs_i.html similarity index 100% rename from documents/rss_api_html/globals_defs_i.html rename to docs/rss_api_html/globals_defs_i.html diff --git a/documents/rss_api_html/globals_defs_l.html b/docs/rss_api_html/globals_defs_l.html similarity index 100% rename from documents/rss_api_html/globals_defs_l.html rename to docs/rss_api_html/globals_defs_l.html diff --git a/documents/rss_api_html/globals_defs_m.html b/docs/rss_api_html/globals_defs_m.html similarity index 100% rename from documents/rss_api_html/globals_defs_m.html rename to docs/rss_api_html/globals_defs_m.html diff --git a/documents/rss_api_html/globals_defs_n.html b/docs/rss_api_html/globals_defs_n.html similarity index 100% rename from documents/rss_api_html/globals_defs_n.html rename to docs/rss_api_html/globals_defs_n.html diff --git a/documents/rss_api_html/globals_defs_p.html b/docs/rss_api_html/globals_defs_p.html similarity index 100% rename from documents/rss_api_html/globals_defs_p.html rename to docs/rss_api_html/globals_defs_p.html diff --git a/documents/rss_api_html/globals_defs_r.html b/docs/rss_api_html/globals_defs_r.html similarity index 100% rename from documents/rss_api_html/globals_defs_r.html rename to docs/rss_api_html/globals_defs_r.html diff --git a/documents/rss_api_html/globals_defs_s.html b/docs/rss_api_html/globals_defs_s.html similarity index 100% rename from documents/rss_api_html/globals_defs_s.html rename to docs/rss_api_html/globals_defs_s.html diff --git a/documents/rss_api_html/globals_defs_t.html b/docs/rss_api_html/globals_defs_t.html similarity index 100% rename from documents/rss_api_html/globals_defs_t.html rename to docs/rss_api_html/globals_defs_t.html diff --git a/documents/rss_api_html/globals_defs_u.html b/docs/rss_api_html/globals_defs_u.html similarity index 100% rename from documents/rss_api_html/globals_defs_u.html rename to docs/rss_api_html/globals_defs_u.html diff --git a/documents/rss_api_html/globals_defs_v.html b/docs/rss_api_html/globals_defs_v.html similarity index 100% rename from documents/rss_api_html/globals_defs_v.html rename to docs/rss_api_html/globals_defs_v.html diff --git a/documents/rss_api_html/globals_defs_w.html b/docs/rss_api_html/globals_defs_w.html similarity index 100% rename from documents/rss_api_html/globals_defs_w.html rename to docs/rss_api_html/globals_defs_w.html diff --git a/documents/rss_api_html/globals_e.html b/docs/rss_api_html/globals_e.html similarity index 100% rename from documents/rss_api_html/globals_e.html rename to docs/rss_api_html/globals_e.html diff --git a/documents/rss_api_html/globals_enum.html b/docs/rss_api_html/globals_enum.html similarity index 100% rename from documents/rss_api_html/globals_enum.html rename to docs/rss_api_html/globals_enum.html diff --git a/documents/rss_api_html/globals_eval.html b/docs/rss_api_html/globals_eval.html similarity index 100% rename from documents/rss_api_html/globals_eval.html rename to docs/rss_api_html/globals_eval.html diff --git a/documents/rss_api_html/globals_f.html b/docs/rss_api_html/globals_f.html similarity index 100% rename from documents/rss_api_html/globals_f.html rename to docs/rss_api_html/globals_f.html diff --git a/documents/rss_api_html/globals_func.html b/docs/rss_api_html/globals_func.html similarity index 100% rename from documents/rss_api_html/globals_func.html rename to docs/rss_api_html/globals_func.html diff --git a/documents/rss_api_html/globals_func_a.html b/docs/rss_api_html/globals_func_a.html similarity index 100% rename from documents/rss_api_html/globals_func_a.html rename to docs/rss_api_html/globals_func_a.html diff --git a/documents/rss_api_html/globals_func_b.html b/docs/rss_api_html/globals_func_b.html similarity index 100% rename from documents/rss_api_html/globals_func_b.html rename to docs/rss_api_html/globals_func_b.html diff --git a/documents/rss_api_html/globals_func_c.html b/docs/rss_api_html/globals_func_c.html similarity index 100% rename from documents/rss_api_html/globals_func_c.html rename to docs/rss_api_html/globals_func_c.html diff --git a/documents/rss_api_html/globals_func_d.html b/docs/rss_api_html/globals_func_d.html similarity index 100% rename from documents/rss_api_html/globals_func_d.html rename to docs/rss_api_html/globals_func_d.html diff --git a/documents/rss_api_html/globals_func_e.html b/docs/rss_api_html/globals_func_e.html similarity index 100% rename from documents/rss_api_html/globals_func_e.html rename to docs/rss_api_html/globals_func_e.html diff --git a/documents/rss_api_html/globals_func_f.html b/docs/rss_api_html/globals_func_f.html similarity index 100% rename from documents/rss_api_html/globals_func_f.html rename to docs/rss_api_html/globals_func_f.html diff --git a/documents/rss_api_html/globals_func_g.html b/docs/rss_api_html/globals_func_g.html similarity index 100% rename from documents/rss_api_html/globals_func_g.html rename to docs/rss_api_html/globals_func_g.html diff --git a/documents/rss_api_html/globals_func_h.html b/docs/rss_api_html/globals_func_h.html similarity index 100% rename from documents/rss_api_html/globals_func_h.html rename to docs/rss_api_html/globals_func_h.html diff --git a/documents/rss_api_html/globals_func_i.html b/docs/rss_api_html/globals_func_i.html similarity index 100% rename from documents/rss_api_html/globals_func_i.html rename to docs/rss_api_html/globals_func_i.html diff --git a/documents/rss_api_html/globals_func_m.html b/docs/rss_api_html/globals_func_m.html similarity index 100% rename from documents/rss_api_html/globals_func_m.html rename to docs/rss_api_html/globals_func_m.html diff --git a/documents/rss_api_html/globals_func_n.html b/docs/rss_api_html/globals_func_n.html similarity index 100% rename from documents/rss_api_html/globals_func_n.html rename to docs/rss_api_html/globals_func_n.html diff --git a/documents/rss_api_html/globals_func_o.html b/docs/rss_api_html/globals_func_o.html similarity index 100% rename from documents/rss_api_html/globals_func_o.html rename to docs/rss_api_html/globals_func_o.html diff --git a/documents/rss_api_html/globals_func_p.html b/docs/rss_api_html/globals_func_p.html similarity index 100% rename from documents/rss_api_html/globals_func_p.html rename to docs/rss_api_html/globals_func_p.html diff --git a/documents/rss_api_html/globals_func_r.html b/docs/rss_api_html/globals_func_r.html similarity index 100% rename from documents/rss_api_html/globals_func_r.html rename to docs/rss_api_html/globals_func_r.html diff --git a/documents/rss_api_html/globals_func_s.html b/docs/rss_api_html/globals_func_s.html similarity index 100% rename from documents/rss_api_html/globals_func_s.html rename to docs/rss_api_html/globals_func_s.html diff --git a/documents/rss_api_html/globals_func_u.html b/docs/rss_api_html/globals_func_u.html similarity index 100% rename from documents/rss_api_html/globals_func_u.html rename to docs/rss_api_html/globals_func_u.html diff --git a/documents/rss_api_html/globals_func_v.html b/docs/rss_api_html/globals_func_v.html similarity index 100% rename from documents/rss_api_html/globals_func_v.html rename to docs/rss_api_html/globals_func_v.html diff --git a/documents/rss_api_html/globals_func_w.html b/docs/rss_api_html/globals_func_w.html similarity index 100% rename from documents/rss_api_html/globals_func_w.html rename to docs/rss_api_html/globals_func_w.html diff --git a/documents/rss_api_html/globals_g.html b/docs/rss_api_html/globals_g.html similarity index 100% rename from documents/rss_api_html/globals_g.html rename to docs/rss_api_html/globals_g.html diff --git a/documents/rss_api_html/globals_h.html b/docs/rss_api_html/globals_h.html similarity index 100% rename from documents/rss_api_html/globals_h.html rename to docs/rss_api_html/globals_h.html diff --git a/documents/rss_api_html/globals_i.html b/docs/rss_api_html/globals_i.html similarity index 100% rename from documents/rss_api_html/globals_i.html rename to docs/rss_api_html/globals_i.html diff --git a/documents/rss_api_html/globals_l.html b/docs/rss_api_html/globals_l.html similarity index 100% rename from documents/rss_api_html/globals_l.html rename to docs/rss_api_html/globals_l.html diff --git a/documents/rss_api_html/globals_m.html b/docs/rss_api_html/globals_m.html similarity index 100% rename from documents/rss_api_html/globals_m.html rename to docs/rss_api_html/globals_m.html diff --git a/documents/rss_api_html/globals_n.html b/docs/rss_api_html/globals_n.html similarity index 100% rename from documents/rss_api_html/globals_n.html rename to docs/rss_api_html/globals_n.html diff --git a/documents/rss_api_html/globals_o.html b/docs/rss_api_html/globals_o.html similarity index 100% rename from documents/rss_api_html/globals_o.html rename to docs/rss_api_html/globals_o.html diff --git a/documents/rss_api_html/globals_p.html b/docs/rss_api_html/globals_p.html similarity index 100% rename from documents/rss_api_html/globals_p.html rename to docs/rss_api_html/globals_p.html diff --git a/documents/rss_api_html/globals_r.html b/docs/rss_api_html/globals_r.html similarity index 100% rename from documents/rss_api_html/globals_r.html rename to docs/rss_api_html/globals_r.html diff --git a/documents/rss_api_html/globals_s.html b/docs/rss_api_html/globals_s.html similarity index 100% rename from documents/rss_api_html/globals_s.html rename to docs/rss_api_html/globals_s.html diff --git a/documents/rss_api_html/globals_t.html b/docs/rss_api_html/globals_t.html similarity index 100% rename from documents/rss_api_html/globals_t.html rename to docs/rss_api_html/globals_t.html diff --git a/documents/rss_api_html/globals_type.html b/docs/rss_api_html/globals_type.html similarity index 100% rename from documents/rss_api_html/globals_type.html rename to docs/rss_api_html/globals_type.html diff --git a/documents/rss_api_html/globals_u.html b/docs/rss_api_html/globals_u.html similarity index 100% rename from documents/rss_api_html/globals_u.html rename to docs/rss_api_html/globals_u.html diff --git a/documents/rss_api_html/globals_v.html b/docs/rss_api_html/globals_v.html similarity index 100% rename from documents/rss_api_html/globals_v.html rename to docs/rss_api_html/globals_v.html diff --git a/documents/rss_api_html/globals_vars.html b/docs/rss_api_html/globals_vars.html similarity index 100% rename from documents/rss_api_html/globals_vars.html rename to docs/rss_api_html/globals_vars.html diff --git a/documents/rss_api_html/globals_w.html b/docs/rss_api_html/globals_w.html similarity index 100% rename from documents/rss_api_html/globals_w.html rename to docs/rss_api_html/globals_w.html diff --git a/documents/rss_api_html/group__Distance.html b/docs/rss_api_html/group__Distance.html similarity index 100% rename from documents/rss_api_html/group__Distance.html rename to docs/rss_api_html/group__Distance.html diff --git a/documents/rss_api_html/group__Distance.js b/docs/rss_api_html/group__Distance.js similarity index 100% rename from documents/rss_api_html/group__Distance.js rename to docs/rss_api_html/group__Distance.js diff --git a/documents/rss_api_html/group__Presence.html b/docs/rss_api_html/group__Presence.html similarity index 100% rename from documents/rss_api_html/group__Presence.html rename to docs/rss_api_html/group__Presence.html diff --git a/documents/rss_api_html/group__Presence.js b/docs/rss_api_html/group__Presence.js similarity index 100% rename from documents/rss_api_html/group__Presence.js rename to docs/rss_api_html/group__Presence.js diff --git a/documents/rss_api_html/group__config.html b/docs/rss_api_html/group__config.html similarity index 100% rename from documents/rss_api_html/group__config.html rename to docs/rss_api_html/group__config.html diff --git a/documents/rss_api_html/group__config.js b/docs/rss_api_html/group__config.js similarity index 100% rename from documents/rss_api_html/group__config.js rename to docs/rss_api_html/group__config.js diff --git a/documents/rss_api_html/group__processing.html b/docs/rss_api_html/group__processing.html similarity index 100% rename from documents/rss_api_html/group__processing.html rename to docs/rss_api_html/group__processing.html diff --git a/documents/rss_api_html/group__processing.js b/docs/rss_api_html/group__processing.js similarity index 100% rename from documents/rss_api_html/group__processing.js rename to docs/rss_api_html/group__processing.js diff --git a/documents/rss_api_html/group__rss.html b/docs/rss_api_html/group__rss.html similarity index 100% rename from documents/rss_api_html/group__rss.html rename to docs/rss_api_html/group__rss.html diff --git a/documents/rss_api_html/group__rss.js b/docs/rss_api_html/group__rss.js similarity index 100% rename from documents/rss_api_html/group__rss.js rename to docs/rss_api_html/group__rss.js diff --git a/documents/rss_api_html/group__sensor.html b/docs/rss_api_html/group__sensor.html similarity index 100% rename from documents/rss_api_html/group__sensor.html rename to docs/rss_api_html/group__sensor.html diff --git a/documents/rss_api_html/group__sensor.js b/docs/rss_api_html/group__sensor.js similarity index 100% rename from documents/rss_api_html/group__sensor.js rename to docs/rss_api_html/group__sensor.js diff --git a/documents/rss_api_html/group__service.html b/docs/rss_api_html/group__service.html similarity index 100% rename from documents/rss_api_html/group__service.html rename to docs/rss_api_html/group__service.html diff --git a/documents/rss_api_html/group__service.js b/docs/rss_api_html/group__service.js similarity index 100% rename from documents/rss_api_html/group__service.js rename to docs/rss_api_html/group__service.js diff --git a/documents/rss_api_html/group__subsweep.html b/docs/rss_api_html/group__subsweep.html similarity index 100% rename from documents/rss_api_html/group__subsweep.html rename to docs/rss_api_html/group__subsweep.html diff --git a/documents/rss_api_html/group__subsweep.js b/docs/rss_api_html/group__subsweep.js similarity index 100% rename from documents/rss_api_html/group__subsweep.js rename to docs/rss_api_html/group__subsweep.js diff --git a/documents/rss_api_html/i2c__application__system_8h.html b/docs/rss_api_html/i2c__application__system_8h.html similarity index 100% rename from documents/rss_api_html/i2c__application__system_8h.html rename to docs/rss_api_html/i2c__application__system_8h.html diff --git a/documents/rss_api_html/i2c__application__system_8h_source.html b/docs/rss_api_html/i2c__application__system_8h_source.html similarity index 100% rename from documents/rss_api_html/i2c__application__system_8h_source.html rename to docs/rss_api_html/i2c__application__system_8h_source.html diff --git a/documents/rss_api_html/i2c__application__system__stm32_8c.html b/docs/rss_api_html/i2c__application__system__stm32_8c.html similarity index 100% rename from documents/rss_api_html/i2c__application__system__stm32_8c.html rename to docs/rss_api_html/i2c__application__system__stm32_8c.html diff --git a/documents/rss_api_html/i2c__application__system__stm32_8c_source.html b/docs/rss_api_html/i2c__application__system__stm32_8c_source.html similarity index 100% rename from documents/rss_api_html/i2c__application__system__stm32_8c_source.html rename to docs/rss_api_html/i2c__application__system__stm32_8c_source.html diff --git a/documents/rss_api_html/i2c__distance__detector_8c.html b/docs/rss_api_html/i2c__distance__detector_8c.html similarity index 100% rename from documents/rss_api_html/i2c__distance__detector_8c.html rename to docs/rss_api_html/i2c__distance__detector_8c.html diff --git a/documents/rss_api_html/i2c__distance__detector_8c_source.html b/docs/rss_api_html/i2c__distance__detector_8c_source.html similarity index 100% rename from documents/rss_api_html/i2c__distance__detector_8c_source.html rename to docs/rss_api_html/i2c__distance__detector_8c_source.html diff --git a/documents/rss_api_html/i2c__distance__detector_8h.html b/docs/rss_api_html/i2c__distance__detector_8h.html similarity index 100% rename from documents/rss_api_html/i2c__distance__detector_8h.html rename to docs/rss_api_html/i2c__distance__detector_8h.html diff --git a/documents/rss_api_html/i2c__distance__detector_8h_source.html b/docs/rss_api_html/i2c__distance__detector_8h_source.html similarity index 100% rename from documents/rss_api_html/i2c__distance__detector_8h_source.html rename to docs/rss_api_html/i2c__distance__detector_8h_source.html diff --git a/documents/rss_api_html/i2c__presence__detector_8c.html b/docs/rss_api_html/i2c__presence__detector_8c.html similarity index 100% rename from documents/rss_api_html/i2c__presence__detector_8c.html rename to docs/rss_api_html/i2c__presence__detector_8c.html diff --git a/documents/rss_api_html/i2c__presence__detector_8c_source.html b/docs/rss_api_html/i2c__presence__detector_8c_source.html similarity index 100% rename from documents/rss_api_html/i2c__presence__detector_8c_source.html rename to docs/rss_api_html/i2c__presence__detector_8c_source.html diff --git a/documents/rss_api_html/i2c__presence__detector_8h.html b/docs/rss_api_html/i2c__presence__detector_8h.html similarity index 100% rename from documents/rss_api_html/i2c__presence__detector_8h.html rename to docs/rss_api_html/i2c__presence__detector_8h.html diff --git a/documents/rss_api_html/i2c__presence__detector_8h_source.html b/docs/rss_api_html/i2c__presence__detector_8h_source.html similarity index 100% rename from documents/rss_api_html/i2c__presence__detector_8h_source.html rename to docs/rss_api_html/i2c__presence__detector_8h_source.html diff --git a/documents/rss_api_html/index.html b/docs/rss_api_html/index.html similarity index 100% rename from documents/rss_api_html/index.html rename to docs/rss_api_html/index.html diff --git a/documents/rss_api_html/intro_8md.html b/docs/rss_api_html/intro_8md.html similarity index 100% rename from documents/rss_api_html/intro_8md.html rename to docs/rss_api_html/intro_8md.html diff --git a/documents/rss_api_html/jquery.js b/docs/rss_api_html/jquery.js similarity index 100% rename from documents/rss_api_html/jquery.js rename to docs/rss_api_html/jquery.js diff --git a/documents/rss_api_html/main_8h.html b/docs/rss_api_html/main_8h.html similarity index 100% rename from documents/rss_api_html/main_8h.html rename to docs/rss_api_html/main_8h.html diff --git a/documents/rss_api_html/main_8h_source.html b/docs/rss_api_html/main_8h_source.html similarity index 100% rename from documents/rss_api_html/main_8h_source.html rename to docs/rss_api_html/main_8h_source.html diff --git a/documents/rss_api_html/menu.js b/docs/rss_api_html/menu.js similarity index 100% rename from documents/rss_api_html/menu.js rename to docs/rss_api_html/menu.js diff --git a/documents/rss_api_html/menudata.js b/docs/rss_api_html/menudata.js similarity index 100% rename from documents/rss_api_html/menudata.js rename to docs/rss_api_html/menudata.js diff --git a/documents/rss_api_html/modules.html b/docs/rss_api_html/modules.html similarity index 100% rename from documents/rss_api_html/modules.html rename to docs/rss_api_html/modules.html diff --git a/documents/rss_api_html/modules.js b/docs/rss_api_html/modules.js similarity index 100% rename from documents/rss_api_html/modules.js rename to docs/rss_api_html/modules.js diff --git a/documents/rss_api_html/nav_f.png b/docs/rss_api_html/nav_f.png similarity index 100% rename from documents/rss_api_html/nav_f.png rename to docs/rss_api_html/nav_f.png diff --git a/documents/rss_api_html/nav_g.png b/docs/rss_api_html/nav_g.png similarity index 100% rename from documents/rss_api_html/nav_g.png rename to docs/rss_api_html/nav_g.png diff --git a/documents/rss_api_html/nav_h.png b/docs/rss_api_html/nav_h.png similarity index 100% rename from documents/rss_api_html/nav_h.png rename to docs/rss_api_html/nav_h.png diff --git a/documents/rss_api_html/navtree.css b/docs/rss_api_html/navtree.css similarity index 100% rename from documents/rss_api_html/navtree.css rename to docs/rss_api_html/navtree.css diff --git a/documents/rss_api_html/navtree.js b/docs/rss_api_html/navtree.js similarity index 100% rename from documents/rss_api_html/navtree.js rename to docs/rss_api_html/navtree.js diff --git a/documents/rss_api_html/navtreedata.js b/docs/rss_api_html/navtreedata.js similarity index 100% rename from documents/rss_api_html/navtreedata.js rename to docs/rss_api_html/navtreedata.js diff --git a/documents/rss_api_html/navtreeindex0.js b/docs/rss_api_html/navtreeindex0.js similarity index 100% rename from documents/rss_api_html/navtreeindex0.js rename to docs/rss_api_html/navtreeindex0.js diff --git a/documents/rss_api_html/navtreeindex1.js b/docs/rss_api_html/navtreeindex1.js similarity index 100% rename from documents/rss_api_html/navtreeindex1.js rename to docs/rss_api_html/navtreeindex1.js diff --git a/documents/rss_api_html/open.png b/docs/rss_api_html/open.png similarity index 100% rename from documents/rss_api_html/open.png rename to docs/rss_api_html/open.png diff --git a/documents/rss_api_html/presence__reg__protocol_8c.html b/docs/rss_api_html/presence__reg__protocol_8c.html similarity index 100% rename from documents/rss_api_html/presence__reg__protocol_8c.html rename to docs/rss_api_html/presence__reg__protocol_8c.html diff --git a/documents/rss_api_html/presence__reg__protocol_8c_source.html b/docs/rss_api_html/presence__reg__protocol_8c_source.html similarity index 100% rename from documents/rss_api_html/presence__reg__protocol_8c_source.html rename to docs/rss_api_html/presence__reg__protocol_8c_source.html diff --git a/documents/rss_api_html/presence__reg__protocol_8h.html b/docs/rss_api_html/presence__reg__protocol_8h.html similarity index 100% rename from documents/rss_api_html/presence__reg__protocol_8h.html rename to docs/rss_api_html/presence__reg__protocol_8h.html diff --git a/documents/rss_api_html/presence__reg__protocol_8h_source.html b/docs/rss_api_html/presence__reg__protocol_8h_source.html similarity index 100% rename from documents/rss_api_html/presence__reg__protocol_8h_source.html rename to docs/rss_api_html/presence__reg__protocol_8h_source.html diff --git a/documents/rss_api_html/presence__reg__protocol__access_8c.html b/docs/rss_api_html/presence__reg__protocol__access_8c.html similarity index 100% rename from documents/rss_api_html/presence__reg__protocol__access_8c.html rename to docs/rss_api_html/presence__reg__protocol__access_8c.html diff --git a/documents/rss_api_html/presence__reg__protocol__access_8c_source.html b/docs/rss_api_html/presence__reg__protocol__access_8c_source.html similarity index 100% rename from documents/rss_api_html/presence__reg__protocol__access_8c_source.html rename to docs/rss_api_html/presence__reg__protocol__access_8c_source.html diff --git a/documents/rss_api_html/printf_8c.html b/docs/rss_api_html/printf_8c.html similarity index 100% rename from documents/rss_api_html/printf_8c.html rename to docs/rss_api_html/printf_8c.html diff --git a/documents/rss_api_html/printf_8c_source.html b/docs/rss_api_html/printf_8c_source.html similarity index 100% rename from documents/rss_api_html/printf_8c_source.html rename to docs/rss_api_html/printf_8c_source.html diff --git a/documents/rss_api_html/printf_8h.html b/docs/rss_api_html/printf_8h.html similarity index 100% rename from documents/rss_api_html/printf_8h.html rename to docs/rss_api_html/printf_8h.html diff --git a/documents/rss_api_html/printf_8h_source.html b/docs/rss_api_html/printf_8h_source.html similarity index 100% rename from documents/rss_api_html/printf_8h_source.html rename to docs/rss_api_html/printf_8h_source.html diff --git a/documents/rss_api_html/ref__app__breathing_8c.html b/docs/rss_api_html/ref__app__breathing_8c.html similarity index 100% rename from documents/rss_api_html/ref__app__breathing_8c.html rename to docs/rss_api_html/ref__app__breathing_8c.html diff --git a/documents/rss_api_html/ref__app__breathing_8c_source.html b/docs/rss_api_html/ref__app__breathing_8c_source.html similarity index 100% rename from documents/rss_api_html/ref__app__breathing_8c_source.html rename to docs/rss_api_html/ref__app__breathing_8c_source.html diff --git a/documents/rss_api_html/ref__app__breathing_8h.html b/docs/rss_api_html/ref__app__breathing_8h.html similarity index 100% rename from documents/rss_api_html/ref__app__breathing_8h.html rename to docs/rss_api_html/ref__app__breathing_8h.html diff --git a/documents/rss_api_html/ref__app__breathing_8h_source.html b/docs/rss_api_html/ref__app__breathing_8h_source.html similarity index 100% rename from documents/rss_api_html/ref__app__breathing_8h_source.html rename to docs/rss_api_html/ref__app__breathing_8h_source.html diff --git a/documents/rss_api_html/ref__app__smart__presence_8c.html b/docs/rss_api_html/ref__app__smart__presence_8c.html similarity index 100% rename from documents/rss_api_html/ref__app__smart__presence_8c.html rename to docs/rss_api_html/ref__app__smart__presence_8c.html diff --git a/documents/rss_api_html/ref__app__smart__presence_8c_source.html b/docs/rss_api_html/ref__app__smart__presence_8c_source.html similarity index 100% rename from documents/rss_api_html/ref__app__smart__presence_8c_source.html rename to docs/rss_api_html/ref__app__smart__presence_8c_source.html diff --git a/documents/rss_api_html/ref__app__smart__presence_8h.html b/docs/rss_api_html/ref__app__smart__presence_8h.html similarity index 100% rename from documents/rss_api_html/ref__app__smart__presence_8h.html rename to docs/rss_api_html/ref__app__smart__presence_8h.html diff --git a/documents/rss_api_html/ref__app__smart__presence_8h_source.html b/docs/rss_api_html/ref__app__smart__presence_8h_source.html similarity index 100% rename from documents/rss_api_html/ref__app__smart__presence_8h_source.html rename to docs/rss_api_html/ref__app__smart__presence_8h_source.html diff --git a/documents/rss_api_html/ref__app__tank__level_8c.html b/docs/rss_api_html/ref__app__tank__level_8c.html similarity index 100% rename from documents/rss_api_html/ref__app__tank__level_8c.html rename to docs/rss_api_html/ref__app__tank__level_8c.html diff --git a/documents/rss_api_html/ref__app__tank__level_8c_source.html b/docs/rss_api_html/ref__app__tank__level_8c_source.html similarity index 100% rename from documents/rss_api_html/ref__app__tank__level_8c_source.html rename to docs/rss_api_html/ref__app__tank__level_8c_source.html diff --git a/documents/rss_api_html/ref__app__tank__level_8h.html b/docs/rss_api_html/ref__app__tank__level_8h.html similarity index 100% rename from documents/rss_api_html/ref__app__tank__level_8h.html rename to docs/rss_api_html/ref__app__tank__level_8h.html diff --git a/documents/rss_api_html/ref__app__tank__level_8h_source.html b/docs/rss_api_html/ref__app__tank__level_8h_source.html similarity index 100% rename from documents/rss_api_html/ref__app__tank__level_8h_source.html rename to docs/rss_api_html/ref__app__tank__level_8h_source.html diff --git a/documents/rss_api_html/ref_app_tank_level_8c-example.html b/docs/rss_api_html/ref_app_tank_level_8c-example.html similarity index 100% rename from documents/rss_api_html/ref_app_tank_level_8c-example.html rename to docs/rss_api_html/ref_app_tank_level_8c-example.html diff --git a/documents/rss_api_html/resize.js b/docs/rss_api_html/resize.js similarity index 100% rename from documents/rss_api_html/resize.js rename to docs/rss_api_html/resize.js diff --git a/documents/rss_api_html/search/all_0.html b/docs/rss_api_html/search/all_0.html similarity index 100% rename from documents/rss_api_html/search/all_0.html rename to docs/rss_api_html/search/all_0.html diff --git a/documents/rss_api_html/search/all_0.js b/docs/rss_api_html/search/all_0.js similarity index 100% rename from documents/rss_api_html/search/all_0.js rename to docs/rss_api_html/search/all_0.js diff --git a/documents/rss_api_html/search/all_1.html b/docs/rss_api_html/search/all_1.html similarity index 100% rename from documents/rss_api_html/search/all_1.html rename to docs/rss_api_html/search/all_1.html diff --git a/documents/rss_api_html/search/all_1.js b/docs/rss_api_html/search/all_1.js similarity index 100% rename from documents/rss_api_html/search/all_1.js rename to docs/rss_api_html/search/all_1.js diff --git a/documents/rss_api_html/search/all_10.html b/docs/rss_api_html/search/all_10.html similarity index 100% rename from documents/rss_api_html/search/all_10.html rename to docs/rss_api_html/search/all_10.html diff --git a/documents/rss_api_html/search/all_10.js b/docs/rss_api_html/search/all_10.js similarity index 100% rename from documents/rss_api_html/search/all_10.js rename to docs/rss_api_html/search/all_10.js diff --git a/documents/rss_api_html/search/all_11.html b/docs/rss_api_html/search/all_11.html similarity index 100% rename from documents/rss_api_html/search/all_11.html rename to docs/rss_api_html/search/all_11.html diff --git a/documents/rss_api_html/search/all_11.js b/docs/rss_api_html/search/all_11.js similarity index 100% rename from documents/rss_api_html/search/all_11.js rename to docs/rss_api_html/search/all_11.js diff --git a/documents/rss_api_html/search/all_12.html b/docs/rss_api_html/search/all_12.html similarity index 100% rename from documents/rss_api_html/search/all_12.html rename to docs/rss_api_html/search/all_12.html diff --git a/documents/rss_api_html/search/all_12.js b/docs/rss_api_html/search/all_12.js similarity index 100% rename from documents/rss_api_html/search/all_12.js rename to docs/rss_api_html/search/all_12.js diff --git a/documents/rss_api_html/search/all_13.html b/docs/rss_api_html/search/all_13.html similarity index 100% rename from documents/rss_api_html/search/all_13.html rename to docs/rss_api_html/search/all_13.html diff --git a/documents/rss_api_html/search/all_13.js b/docs/rss_api_html/search/all_13.js similarity index 100% rename from documents/rss_api_html/search/all_13.js rename to docs/rss_api_html/search/all_13.js diff --git a/documents/rss_api_html/search/all_14.html b/docs/rss_api_html/search/all_14.html similarity index 100% rename from documents/rss_api_html/search/all_14.html rename to docs/rss_api_html/search/all_14.html diff --git a/documents/rss_api_html/search/all_14.js b/docs/rss_api_html/search/all_14.js similarity index 100% rename from documents/rss_api_html/search/all_14.js rename to docs/rss_api_html/search/all_14.js diff --git a/documents/rss_api_html/search/all_15.html b/docs/rss_api_html/search/all_15.html similarity index 100% rename from documents/rss_api_html/search/all_15.html rename to docs/rss_api_html/search/all_15.html diff --git a/documents/rss_api_html/search/all_15.js b/docs/rss_api_html/search/all_15.js similarity index 100% rename from documents/rss_api_html/search/all_15.js rename to docs/rss_api_html/search/all_15.js diff --git a/documents/rss_api_html/search/all_2.html b/docs/rss_api_html/search/all_2.html similarity index 100% rename from documents/rss_api_html/search/all_2.html rename to docs/rss_api_html/search/all_2.html diff --git a/documents/rss_api_html/search/all_2.js b/docs/rss_api_html/search/all_2.js similarity index 100% rename from documents/rss_api_html/search/all_2.js rename to docs/rss_api_html/search/all_2.js diff --git a/documents/rss_api_html/search/all_3.html b/docs/rss_api_html/search/all_3.html similarity index 100% rename from documents/rss_api_html/search/all_3.html rename to docs/rss_api_html/search/all_3.html diff --git a/documents/rss_api_html/search/all_3.js b/docs/rss_api_html/search/all_3.js similarity index 100% rename from documents/rss_api_html/search/all_3.js rename to docs/rss_api_html/search/all_3.js diff --git a/documents/rss_api_html/search/all_4.html b/docs/rss_api_html/search/all_4.html similarity index 100% rename from documents/rss_api_html/search/all_4.html rename to docs/rss_api_html/search/all_4.html diff --git a/documents/rss_api_html/search/all_4.js b/docs/rss_api_html/search/all_4.js similarity index 100% rename from documents/rss_api_html/search/all_4.js rename to docs/rss_api_html/search/all_4.js diff --git a/documents/rss_api_html/search/all_5.html b/docs/rss_api_html/search/all_5.html similarity index 100% rename from documents/rss_api_html/search/all_5.html rename to docs/rss_api_html/search/all_5.html diff --git a/documents/rss_api_html/search/all_5.js b/docs/rss_api_html/search/all_5.js similarity index 100% rename from documents/rss_api_html/search/all_5.js rename to docs/rss_api_html/search/all_5.js diff --git a/documents/rss_api_html/search/all_6.html b/docs/rss_api_html/search/all_6.html similarity index 100% rename from documents/rss_api_html/search/all_6.html rename to docs/rss_api_html/search/all_6.html diff --git a/documents/rss_api_html/search/all_6.js b/docs/rss_api_html/search/all_6.js similarity index 100% rename from documents/rss_api_html/search/all_6.js rename to docs/rss_api_html/search/all_6.js diff --git a/documents/rss_api_html/search/all_7.html b/docs/rss_api_html/search/all_7.html similarity index 100% rename from documents/rss_api_html/search/all_7.html rename to docs/rss_api_html/search/all_7.html diff --git a/documents/rss_api_html/search/all_7.js b/docs/rss_api_html/search/all_7.js similarity index 100% rename from documents/rss_api_html/search/all_7.js rename to docs/rss_api_html/search/all_7.js diff --git a/documents/rss_api_html/search/all_8.html b/docs/rss_api_html/search/all_8.html similarity index 100% rename from documents/rss_api_html/search/all_8.html rename to docs/rss_api_html/search/all_8.html diff --git a/documents/rss_api_html/search/all_8.js b/docs/rss_api_html/search/all_8.js similarity index 100% rename from documents/rss_api_html/search/all_8.js rename to docs/rss_api_html/search/all_8.js diff --git a/documents/rss_api_html/search/all_9.html b/docs/rss_api_html/search/all_9.html similarity index 100% rename from documents/rss_api_html/search/all_9.html rename to docs/rss_api_html/search/all_9.html diff --git a/documents/rss_api_html/search/all_9.js b/docs/rss_api_html/search/all_9.js similarity index 100% rename from documents/rss_api_html/search/all_9.js rename to docs/rss_api_html/search/all_9.js diff --git a/documents/rss_api_html/search/all_a.html b/docs/rss_api_html/search/all_a.html similarity index 100% rename from documents/rss_api_html/search/all_a.html rename to docs/rss_api_html/search/all_a.html diff --git a/documents/rss_api_html/search/all_a.js b/docs/rss_api_html/search/all_a.js similarity index 100% rename from documents/rss_api_html/search/all_a.js rename to docs/rss_api_html/search/all_a.js diff --git a/documents/rss_api_html/search/all_b.html b/docs/rss_api_html/search/all_b.html similarity index 100% rename from documents/rss_api_html/search/all_b.html rename to docs/rss_api_html/search/all_b.html diff --git a/documents/rss_api_html/search/all_b.js b/docs/rss_api_html/search/all_b.js similarity index 100% rename from documents/rss_api_html/search/all_b.js rename to docs/rss_api_html/search/all_b.js diff --git a/documents/rss_api_html/search/all_c.html b/docs/rss_api_html/search/all_c.html similarity index 100% rename from documents/rss_api_html/search/all_c.html rename to docs/rss_api_html/search/all_c.html diff --git a/documents/rss_api_html/search/all_c.js b/docs/rss_api_html/search/all_c.js similarity index 100% rename from documents/rss_api_html/search/all_c.js rename to docs/rss_api_html/search/all_c.js diff --git a/documents/rss_api_html/search/all_d.html b/docs/rss_api_html/search/all_d.html similarity index 100% rename from documents/rss_api_html/search/all_d.html rename to docs/rss_api_html/search/all_d.html diff --git a/documents/rss_api_html/search/all_d.js b/docs/rss_api_html/search/all_d.js similarity index 100% rename from documents/rss_api_html/search/all_d.js rename to docs/rss_api_html/search/all_d.js diff --git a/documents/rss_api_html/search/all_e.html b/docs/rss_api_html/search/all_e.html similarity index 100% rename from documents/rss_api_html/search/all_e.html rename to docs/rss_api_html/search/all_e.html diff --git a/documents/rss_api_html/search/all_e.js b/docs/rss_api_html/search/all_e.js similarity index 100% rename from documents/rss_api_html/search/all_e.js rename to docs/rss_api_html/search/all_e.js diff --git a/documents/rss_api_html/search/all_f.html b/docs/rss_api_html/search/all_f.html similarity index 100% rename from documents/rss_api_html/search/all_f.html rename to docs/rss_api_html/search/all_f.html diff --git a/documents/rss_api_html/search/all_f.js b/docs/rss_api_html/search/all_f.js similarity index 100% rename from documents/rss_api_html/search/all_f.js rename to docs/rss_api_html/search/all_f.js diff --git a/documents/rss_api_html/search/classes_0.html b/docs/rss_api_html/search/classes_0.html similarity index 100% rename from documents/rss_api_html/search/classes_0.html rename to docs/rss_api_html/search/classes_0.html diff --git a/documents/rss_api_html/search/classes_0.js b/docs/rss_api_html/search/classes_0.js similarity index 100% rename from documents/rss_api_html/search/classes_0.js rename to docs/rss_api_html/search/classes_0.js diff --git a/documents/rss_api_html/search/classes_1.html b/docs/rss_api_html/search/classes_1.html similarity index 100% rename from documents/rss_api_html/search/classes_1.html rename to docs/rss_api_html/search/classes_1.html diff --git a/documents/rss_api_html/search/classes_1.js b/docs/rss_api_html/search/classes_1.js similarity index 100% rename from documents/rss_api_html/search/classes_1.js rename to docs/rss_api_html/search/classes_1.js diff --git a/documents/rss_api_html/search/classes_2.html b/docs/rss_api_html/search/classes_2.html similarity index 100% rename from documents/rss_api_html/search/classes_2.html rename to docs/rss_api_html/search/classes_2.html diff --git a/documents/rss_api_html/search/classes_2.js b/docs/rss_api_html/search/classes_2.js similarity index 100% rename from documents/rss_api_html/search/classes_2.js rename to docs/rss_api_html/search/classes_2.js diff --git a/documents/rss_api_html/search/classes_3.html b/docs/rss_api_html/search/classes_3.html similarity index 100% rename from documents/rss_api_html/search/classes_3.html rename to docs/rss_api_html/search/classes_3.html diff --git a/documents/rss_api_html/search/classes_3.js b/docs/rss_api_html/search/classes_3.js similarity index 100% rename from documents/rss_api_html/search/classes_3.js rename to docs/rss_api_html/search/classes_3.js diff --git a/documents/rss_api_html/search/classes_4.html b/docs/rss_api_html/search/classes_4.html similarity index 100% rename from documents/rss_api_html/search/classes_4.html rename to docs/rss_api_html/search/classes_4.html diff --git a/documents/rss_api_html/search/classes_4.js b/docs/rss_api_html/search/classes_4.js similarity index 100% rename from documents/rss_api_html/search/classes_4.js rename to docs/rss_api_html/search/classes_4.js diff --git a/documents/rss_api_html/search/classes_5.html b/docs/rss_api_html/search/classes_5.html similarity index 100% rename from documents/rss_api_html/search/classes_5.html rename to docs/rss_api_html/search/classes_5.html diff --git a/documents/rss_api_html/search/classes_5.js b/docs/rss_api_html/search/classes_5.js similarity index 100% rename from documents/rss_api_html/search/classes_5.js rename to docs/rss_api_html/search/classes_5.js diff --git a/documents/rss_api_html/search/close.png b/docs/rss_api_html/search/close.png similarity index 100% rename from documents/rss_api_html/search/close.png rename to docs/rss_api_html/search/close.png diff --git a/documents/rss_api_html/search/defines_0.html b/docs/rss_api_html/search/defines_0.html similarity index 100% rename from documents/rss_api_html/search/defines_0.html rename to docs/rss_api_html/search/defines_0.html diff --git a/documents/rss_api_html/search/defines_0.js b/docs/rss_api_html/search/defines_0.js similarity index 100% rename from documents/rss_api_html/search/defines_0.js rename to docs/rss_api_html/search/defines_0.js diff --git a/documents/rss_api_html/search/defines_1.html b/docs/rss_api_html/search/defines_1.html similarity index 100% rename from documents/rss_api_html/search/defines_1.html rename to docs/rss_api_html/search/defines_1.html diff --git a/documents/rss_api_html/search/defines_1.js b/docs/rss_api_html/search/defines_1.js similarity index 100% rename from documents/rss_api_html/search/defines_1.js rename to docs/rss_api_html/search/defines_1.js diff --git a/documents/rss_api_html/search/defines_10.html b/docs/rss_api_html/search/defines_10.html similarity index 100% rename from documents/rss_api_html/search/defines_10.html rename to docs/rss_api_html/search/defines_10.html diff --git a/documents/rss_api_html/search/defines_10.js b/docs/rss_api_html/search/defines_10.js similarity index 100% rename from documents/rss_api_html/search/defines_10.js rename to docs/rss_api_html/search/defines_10.js diff --git a/documents/rss_api_html/search/defines_11.html b/docs/rss_api_html/search/defines_11.html similarity index 100% rename from documents/rss_api_html/search/defines_11.html rename to docs/rss_api_html/search/defines_11.html diff --git a/documents/rss_api_html/search/defines_11.js b/docs/rss_api_html/search/defines_11.js similarity index 100% rename from documents/rss_api_html/search/defines_11.js rename to docs/rss_api_html/search/defines_11.js diff --git a/documents/rss_api_html/search/defines_12.html b/docs/rss_api_html/search/defines_12.html similarity index 100% rename from documents/rss_api_html/search/defines_12.html rename to docs/rss_api_html/search/defines_12.html diff --git a/documents/rss_api_html/search/defines_12.js b/docs/rss_api_html/search/defines_12.js similarity index 100% rename from documents/rss_api_html/search/defines_12.js rename to docs/rss_api_html/search/defines_12.js diff --git a/documents/rss_api_html/search/defines_2.html b/docs/rss_api_html/search/defines_2.html similarity index 100% rename from documents/rss_api_html/search/defines_2.html rename to docs/rss_api_html/search/defines_2.html diff --git a/documents/rss_api_html/search/defines_2.js b/docs/rss_api_html/search/defines_2.js similarity index 100% rename from documents/rss_api_html/search/defines_2.js rename to docs/rss_api_html/search/defines_2.js diff --git a/documents/rss_api_html/search/defines_3.html b/docs/rss_api_html/search/defines_3.html similarity index 100% rename from documents/rss_api_html/search/defines_3.html rename to docs/rss_api_html/search/defines_3.html diff --git a/documents/rss_api_html/search/defines_3.js b/docs/rss_api_html/search/defines_3.js similarity index 100% rename from documents/rss_api_html/search/defines_3.js rename to docs/rss_api_html/search/defines_3.js diff --git a/documents/rss_api_html/search/defines_4.html b/docs/rss_api_html/search/defines_4.html similarity index 100% rename from documents/rss_api_html/search/defines_4.html rename to docs/rss_api_html/search/defines_4.html diff --git a/documents/rss_api_html/search/defines_4.js b/docs/rss_api_html/search/defines_4.js similarity index 100% rename from documents/rss_api_html/search/defines_4.js rename to docs/rss_api_html/search/defines_4.js diff --git a/documents/rss_api_html/search/defines_5.html b/docs/rss_api_html/search/defines_5.html similarity index 100% rename from documents/rss_api_html/search/defines_5.html rename to docs/rss_api_html/search/defines_5.html diff --git a/documents/rss_api_html/search/defines_5.js b/docs/rss_api_html/search/defines_5.js similarity index 100% rename from documents/rss_api_html/search/defines_5.js rename to docs/rss_api_html/search/defines_5.js diff --git a/documents/rss_api_html/search/defines_6.html b/docs/rss_api_html/search/defines_6.html similarity index 100% rename from documents/rss_api_html/search/defines_6.html rename to docs/rss_api_html/search/defines_6.html diff --git a/documents/rss_api_html/search/defines_6.js b/docs/rss_api_html/search/defines_6.js similarity index 100% rename from documents/rss_api_html/search/defines_6.js rename to docs/rss_api_html/search/defines_6.js diff --git a/documents/rss_api_html/search/defines_7.html b/docs/rss_api_html/search/defines_7.html similarity index 100% rename from documents/rss_api_html/search/defines_7.html rename to docs/rss_api_html/search/defines_7.html diff --git a/documents/rss_api_html/search/defines_7.js b/docs/rss_api_html/search/defines_7.js similarity index 100% rename from documents/rss_api_html/search/defines_7.js rename to docs/rss_api_html/search/defines_7.js diff --git a/documents/rss_api_html/search/defines_8.html b/docs/rss_api_html/search/defines_8.html similarity index 100% rename from documents/rss_api_html/search/defines_8.html rename to docs/rss_api_html/search/defines_8.html diff --git a/documents/rss_api_html/search/defines_8.js b/docs/rss_api_html/search/defines_8.js similarity index 100% rename from documents/rss_api_html/search/defines_8.js rename to docs/rss_api_html/search/defines_8.js diff --git a/documents/rss_api_html/search/defines_9.html b/docs/rss_api_html/search/defines_9.html similarity index 100% rename from documents/rss_api_html/search/defines_9.html rename to docs/rss_api_html/search/defines_9.html diff --git a/documents/rss_api_html/search/defines_9.js b/docs/rss_api_html/search/defines_9.js similarity index 100% rename from documents/rss_api_html/search/defines_9.js rename to docs/rss_api_html/search/defines_9.js diff --git a/documents/rss_api_html/search/defines_a.html b/docs/rss_api_html/search/defines_a.html similarity index 100% rename from documents/rss_api_html/search/defines_a.html rename to docs/rss_api_html/search/defines_a.html diff --git a/documents/rss_api_html/search/defines_a.js b/docs/rss_api_html/search/defines_a.js similarity index 100% rename from documents/rss_api_html/search/defines_a.js rename to docs/rss_api_html/search/defines_a.js diff --git a/documents/rss_api_html/search/defines_b.html b/docs/rss_api_html/search/defines_b.html similarity index 100% rename from documents/rss_api_html/search/defines_b.html rename to docs/rss_api_html/search/defines_b.html diff --git a/documents/rss_api_html/search/defines_b.js b/docs/rss_api_html/search/defines_b.js similarity index 100% rename from documents/rss_api_html/search/defines_b.js rename to docs/rss_api_html/search/defines_b.js diff --git a/documents/rss_api_html/search/defines_c.html b/docs/rss_api_html/search/defines_c.html similarity index 100% rename from documents/rss_api_html/search/defines_c.html rename to docs/rss_api_html/search/defines_c.html diff --git a/documents/rss_api_html/search/defines_c.js b/docs/rss_api_html/search/defines_c.js similarity index 100% rename from documents/rss_api_html/search/defines_c.js rename to docs/rss_api_html/search/defines_c.js diff --git a/documents/rss_api_html/search/defines_d.html b/docs/rss_api_html/search/defines_d.html similarity index 100% rename from documents/rss_api_html/search/defines_d.html rename to docs/rss_api_html/search/defines_d.html diff --git a/documents/rss_api_html/search/defines_d.js b/docs/rss_api_html/search/defines_d.js similarity index 100% rename from documents/rss_api_html/search/defines_d.js rename to docs/rss_api_html/search/defines_d.js diff --git a/documents/rss_api_html/search/defines_e.html b/docs/rss_api_html/search/defines_e.html similarity index 100% rename from documents/rss_api_html/search/defines_e.html rename to docs/rss_api_html/search/defines_e.html diff --git a/documents/rss_api_html/search/defines_e.js b/docs/rss_api_html/search/defines_e.js similarity index 100% rename from documents/rss_api_html/search/defines_e.js rename to docs/rss_api_html/search/defines_e.js diff --git a/documents/rss_api_html/search/defines_f.html b/docs/rss_api_html/search/defines_f.html similarity index 100% rename from documents/rss_api_html/search/defines_f.html rename to docs/rss_api_html/search/defines_f.html diff --git a/documents/rss_api_html/search/defines_f.js b/docs/rss_api_html/search/defines_f.js similarity index 100% rename from documents/rss_api_html/search/defines_f.js rename to docs/rss_api_html/search/defines_f.js diff --git a/documents/rss_api_html/search/enums_0.html b/docs/rss_api_html/search/enums_0.html similarity index 100% rename from documents/rss_api_html/search/enums_0.html rename to docs/rss_api_html/search/enums_0.html diff --git a/documents/rss_api_html/search/enums_0.js b/docs/rss_api_html/search/enums_0.js similarity index 100% rename from documents/rss_api_html/search/enums_0.js rename to docs/rss_api_html/search/enums_0.js diff --git a/documents/rss_api_html/search/enums_1.html b/docs/rss_api_html/search/enums_1.html similarity index 100% rename from documents/rss_api_html/search/enums_1.html rename to docs/rss_api_html/search/enums_1.html diff --git a/documents/rss_api_html/search/enums_1.js b/docs/rss_api_html/search/enums_1.js similarity index 100% rename from documents/rss_api_html/search/enums_1.js rename to docs/rss_api_html/search/enums_1.js diff --git a/documents/rss_api_html/search/enums_2.html b/docs/rss_api_html/search/enums_2.html similarity index 100% rename from documents/rss_api_html/search/enums_2.html rename to docs/rss_api_html/search/enums_2.html diff --git a/documents/rss_api_html/search/enums_2.js b/docs/rss_api_html/search/enums_2.js similarity index 100% rename from documents/rss_api_html/search/enums_2.js rename to docs/rss_api_html/search/enums_2.js diff --git a/documents/rss_api_html/search/enums_3.html b/docs/rss_api_html/search/enums_3.html similarity index 100% rename from documents/rss_api_html/search/enums_3.html rename to docs/rss_api_html/search/enums_3.html diff --git a/documents/rss_api_html/search/enums_3.js b/docs/rss_api_html/search/enums_3.js similarity index 100% rename from documents/rss_api_html/search/enums_3.js rename to docs/rss_api_html/search/enums_3.js diff --git a/documents/rss_api_html/search/enums_4.html b/docs/rss_api_html/search/enums_4.html similarity index 100% rename from documents/rss_api_html/search/enums_4.html rename to docs/rss_api_html/search/enums_4.html diff --git a/documents/rss_api_html/search/enums_4.js b/docs/rss_api_html/search/enums_4.js similarity index 100% rename from documents/rss_api_html/search/enums_4.js rename to docs/rss_api_html/search/enums_4.js diff --git a/documents/rss_api_html/search/enums_5.html b/docs/rss_api_html/search/enums_5.html similarity index 100% rename from documents/rss_api_html/search/enums_5.html rename to docs/rss_api_html/search/enums_5.html diff --git a/documents/rss_api_html/search/enums_5.js b/docs/rss_api_html/search/enums_5.js similarity index 100% rename from documents/rss_api_html/search/enums_5.js rename to docs/rss_api_html/search/enums_5.js diff --git a/documents/rss_api_html/search/enumvalues_0.html b/docs/rss_api_html/search/enumvalues_0.html similarity index 100% rename from documents/rss_api_html/search/enumvalues_0.html rename to docs/rss_api_html/search/enumvalues_0.html diff --git a/documents/rss_api_html/search/enumvalues_0.js b/docs/rss_api_html/search/enumvalues_0.js similarity index 100% rename from documents/rss_api_html/search/enumvalues_0.js rename to docs/rss_api_html/search/enumvalues_0.js diff --git a/documents/rss_api_html/search/enumvalues_1.html b/docs/rss_api_html/search/enumvalues_1.html similarity index 100% rename from documents/rss_api_html/search/enumvalues_1.html rename to docs/rss_api_html/search/enumvalues_1.html diff --git a/documents/rss_api_html/search/enumvalues_1.js b/docs/rss_api_html/search/enumvalues_1.js similarity index 100% rename from documents/rss_api_html/search/enumvalues_1.js rename to docs/rss_api_html/search/enumvalues_1.js diff --git a/documents/rss_api_html/search/enumvalues_2.html b/docs/rss_api_html/search/enumvalues_2.html similarity index 100% rename from documents/rss_api_html/search/enumvalues_2.html rename to docs/rss_api_html/search/enumvalues_2.html diff --git a/documents/rss_api_html/search/enumvalues_2.js b/docs/rss_api_html/search/enumvalues_2.js similarity index 100% rename from documents/rss_api_html/search/enumvalues_2.js rename to docs/rss_api_html/search/enumvalues_2.js diff --git a/documents/rss_api_html/search/enumvalues_3.html b/docs/rss_api_html/search/enumvalues_3.html similarity index 100% rename from documents/rss_api_html/search/enumvalues_3.html rename to docs/rss_api_html/search/enumvalues_3.html diff --git a/documents/rss_api_html/search/enumvalues_3.js b/docs/rss_api_html/search/enumvalues_3.js similarity index 100% rename from documents/rss_api_html/search/enumvalues_3.js rename to docs/rss_api_html/search/enumvalues_3.js diff --git a/documents/rss_api_html/search/enumvalues_4.html b/docs/rss_api_html/search/enumvalues_4.html similarity index 100% rename from documents/rss_api_html/search/enumvalues_4.html rename to docs/rss_api_html/search/enumvalues_4.html diff --git a/documents/rss_api_html/search/enumvalues_4.js b/docs/rss_api_html/search/enumvalues_4.js similarity index 100% rename from documents/rss_api_html/search/enumvalues_4.js rename to docs/rss_api_html/search/enumvalues_4.js diff --git a/documents/rss_api_html/search/enumvalues_5.html b/docs/rss_api_html/search/enumvalues_5.html similarity index 100% rename from documents/rss_api_html/search/enumvalues_5.html rename to docs/rss_api_html/search/enumvalues_5.html diff --git a/documents/rss_api_html/search/enumvalues_5.js b/docs/rss_api_html/search/enumvalues_5.js similarity index 100% rename from documents/rss_api_html/search/enumvalues_5.js rename to docs/rss_api_html/search/enumvalues_5.js diff --git a/documents/rss_api_html/search/enumvalues_6.html b/docs/rss_api_html/search/enumvalues_6.html similarity index 100% rename from documents/rss_api_html/search/enumvalues_6.html rename to docs/rss_api_html/search/enumvalues_6.html diff --git a/documents/rss_api_html/search/enumvalues_6.js b/docs/rss_api_html/search/enumvalues_6.js similarity index 100% rename from documents/rss_api_html/search/enumvalues_6.js rename to docs/rss_api_html/search/enumvalues_6.js diff --git a/documents/rss_api_html/search/files_0.html b/docs/rss_api_html/search/files_0.html similarity index 100% rename from documents/rss_api_html/search/files_0.html rename to docs/rss_api_html/search/files_0.html diff --git a/documents/rss_api_html/search/files_0.js b/docs/rss_api_html/search/files_0.js similarity index 100% rename from documents/rss_api_html/search/files_0.js rename to docs/rss_api_html/search/files_0.js diff --git a/documents/rss_api_html/search/files_1.html b/docs/rss_api_html/search/files_1.html similarity index 100% rename from documents/rss_api_html/search/files_1.html rename to docs/rss_api_html/search/files_1.html diff --git a/documents/rss_api_html/search/files_1.js b/docs/rss_api_html/search/files_1.js similarity index 100% rename from documents/rss_api_html/search/files_1.js rename to docs/rss_api_html/search/files_1.js diff --git a/documents/rss_api_html/search/files_2.html b/docs/rss_api_html/search/files_2.html similarity index 100% rename from documents/rss_api_html/search/files_2.html rename to docs/rss_api_html/search/files_2.html diff --git a/documents/rss_api_html/search/files_2.js b/docs/rss_api_html/search/files_2.js similarity index 100% rename from documents/rss_api_html/search/files_2.js rename to docs/rss_api_html/search/files_2.js diff --git a/documents/rss_api_html/search/files_3.html b/docs/rss_api_html/search/files_3.html similarity index 100% rename from documents/rss_api_html/search/files_3.html rename to docs/rss_api_html/search/files_3.html diff --git a/documents/rss_api_html/search/files_3.js b/docs/rss_api_html/search/files_3.js similarity index 100% rename from documents/rss_api_html/search/files_3.js rename to docs/rss_api_html/search/files_3.js diff --git a/documents/rss_api_html/search/files_4.html b/docs/rss_api_html/search/files_4.html similarity index 100% rename from documents/rss_api_html/search/files_4.html rename to docs/rss_api_html/search/files_4.html diff --git a/documents/rss_api_html/search/files_4.js b/docs/rss_api_html/search/files_4.js similarity index 100% rename from documents/rss_api_html/search/files_4.js rename to docs/rss_api_html/search/files_4.js diff --git a/documents/rss_api_html/search/files_5.html b/docs/rss_api_html/search/files_5.html similarity index 100% rename from documents/rss_api_html/search/files_5.html rename to docs/rss_api_html/search/files_5.html diff --git a/documents/rss_api_html/search/files_5.js b/docs/rss_api_html/search/files_5.js similarity index 100% rename from documents/rss_api_html/search/files_5.js rename to docs/rss_api_html/search/files_5.js diff --git a/documents/rss_api_html/search/files_6.html b/docs/rss_api_html/search/files_6.html similarity index 100% rename from documents/rss_api_html/search/files_6.html rename to docs/rss_api_html/search/files_6.html diff --git a/documents/rss_api_html/search/files_6.js b/docs/rss_api_html/search/files_6.js similarity index 100% rename from documents/rss_api_html/search/files_6.js rename to docs/rss_api_html/search/files_6.js diff --git a/documents/rss_api_html/search/files_7.html b/docs/rss_api_html/search/files_7.html similarity index 100% rename from documents/rss_api_html/search/files_7.html rename to docs/rss_api_html/search/files_7.html diff --git a/documents/rss_api_html/search/files_7.js b/docs/rss_api_html/search/files_7.js similarity index 100% rename from documents/rss_api_html/search/files_7.js rename to docs/rss_api_html/search/files_7.js diff --git a/documents/rss_api_html/search/functions_0.html b/docs/rss_api_html/search/functions_0.html similarity index 100% rename from documents/rss_api_html/search/functions_0.html rename to docs/rss_api_html/search/functions_0.html diff --git a/documents/rss_api_html/search/functions_0.js b/docs/rss_api_html/search/functions_0.js similarity index 100% rename from documents/rss_api_html/search/functions_0.js rename to docs/rss_api_html/search/functions_0.js diff --git a/documents/rss_api_html/search/functions_1.html b/docs/rss_api_html/search/functions_1.html similarity index 100% rename from documents/rss_api_html/search/functions_1.html rename to docs/rss_api_html/search/functions_1.html diff --git a/documents/rss_api_html/search/functions_1.js b/docs/rss_api_html/search/functions_1.js similarity index 100% rename from documents/rss_api_html/search/functions_1.js rename to docs/rss_api_html/search/functions_1.js diff --git a/documents/rss_api_html/search/functions_10.html b/docs/rss_api_html/search/functions_10.html similarity index 100% rename from documents/rss_api_html/search/functions_10.html rename to docs/rss_api_html/search/functions_10.html diff --git a/documents/rss_api_html/search/functions_10.js b/docs/rss_api_html/search/functions_10.js similarity index 100% rename from documents/rss_api_html/search/functions_10.js rename to docs/rss_api_html/search/functions_10.js diff --git a/documents/rss_api_html/search/functions_11.html b/docs/rss_api_html/search/functions_11.html similarity index 100% rename from documents/rss_api_html/search/functions_11.html rename to docs/rss_api_html/search/functions_11.html diff --git a/documents/rss_api_html/search/functions_11.js b/docs/rss_api_html/search/functions_11.js similarity index 100% rename from documents/rss_api_html/search/functions_11.js rename to docs/rss_api_html/search/functions_11.js diff --git a/documents/rss_api_html/search/functions_12.html b/docs/rss_api_html/search/functions_12.html similarity index 100% rename from documents/rss_api_html/search/functions_12.html rename to docs/rss_api_html/search/functions_12.html diff --git a/documents/rss_api_html/search/functions_12.js b/docs/rss_api_html/search/functions_12.js similarity index 100% rename from documents/rss_api_html/search/functions_12.js rename to docs/rss_api_html/search/functions_12.js diff --git a/documents/rss_api_html/search/functions_2.html b/docs/rss_api_html/search/functions_2.html similarity index 100% rename from documents/rss_api_html/search/functions_2.html rename to docs/rss_api_html/search/functions_2.html diff --git a/documents/rss_api_html/search/functions_2.js b/docs/rss_api_html/search/functions_2.js similarity index 100% rename from documents/rss_api_html/search/functions_2.js rename to docs/rss_api_html/search/functions_2.js diff --git a/documents/rss_api_html/search/functions_3.html b/docs/rss_api_html/search/functions_3.html similarity index 100% rename from documents/rss_api_html/search/functions_3.html rename to docs/rss_api_html/search/functions_3.html diff --git a/documents/rss_api_html/search/functions_3.js b/docs/rss_api_html/search/functions_3.js similarity index 100% rename from documents/rss_api_html/search/functions_3.js rename to docs/rss_api_html/search/functions_3.js diff --git a/documents/rss_api_html/search/functions_4.html b/docs/rss_api_html/search/functions_4.html similarity index 100% rename from documents/rss_api_html/search/functions_4.html rename to docs/rss_api_html/search/functions_4.html diff --git a/documents/rss_api_html/search/functions_4.js b/docs/rss_api_html/search/functions_4.js similarity index 100% rename from documents/rss_api_html/search/functions_4.js rename to docs/rss_api_html/search/functions_4.js diff --git a/documents/rss_api_html/search/functions_5.html b/docs/rss_api_html/search/functions_5.html similarity index 100% rename from documents/rss_api_html/search/functions_5.html rename to docs/rss_api_html/search/functions_5.html diff --git a/documents/rss_api_html/search/functions_5.js b/docs/rss_api_html/search/functions_5.js similarity index 100% rename from documents/rss_api_html/search/functions_5.js rename to docs/rss_api_html/search/functions_5.js diff --git a/documents/rss_api_html/search/functions_6.html b/docs/rss_api_html/search/functions_6.html similarity index 100% rename from documents/rss_api_html/search/functions_6.html rename to docs/rss_api_html/search/functions_6.html diff --git a/documents/rss_api_html/search/functions_6.js b/docs/rss_api_html/search/functions_6.js similarity index 100% rename from documents/rss_api_html/search/functions_6.js rename to docs/rss_api_html/search/functions_6.js diff --git a/documents/rss_api_html/search/functions_7.html b/docs/rss_api_html/search/functions_7.html similarity index 100% rename from documents/rss_api_html/search/functions_7.html rename to docs/rss_api_html/search/functions_7.html diff --git a/documents/rss_api_html/search/functions_7.js b/docs/rss_api_html/search/functions_7.js similarity index 100% rename from documents/rss_api_html/search/functions_7.js rename to docs/rss_api_html/search/functions_7.js diff --git a/documents/rss_api_html/search/functions_8.html b/docs/rss_api_html/search/functions_8.html similarity index 100% rename from documents/rss_api_html/search/functions_8.html rename to docs/rss_api_html/search/functions_8.html diff --git a/documents/rss_api_html/search/functions_8.js b/docs/rss_api_html/search/functions_8.js similarity index 100% rename from documents/rss_api_html/search/functions_8.js rename to docs/rss_api_html/search/functions_8.js diff --git a/documents/rss_api_html/search/functions_9.html b/docs/rss_api_html/search/functions_9.html similarity index 100% rename from documents/rss_api_html/search/functions_9.html rename to docs/rss_api_html/search/functions_9.html diff --git a/documents/rss_api_html/search/functions_9.js b/docs/rss_api_html/search/functions_9.js similarity index 100% rename from documents/rss_api_html/search/functions_9.js rename to docs/rss_api_html/search/functions_9.js diff --git a/documents/rss_api_html/search/functions_a.html b/docs/rss_api_html/search/functions_a.html similarity index 100% rename from documents/rss_api_html/search/functions_a.html rename to docs/rss_api_html/search/functions_a.html diff --git a/documents/rss_api_html/search/functions_a.js b/docs/rss_api_html/search/functions_a.js similarity index 100% rename from documents/rss_api_html/search/functions_a.js rename to docs/rss_api_html/search/functions_a.js diff --git a/documents/rss_api_html/search/functions_b.html b/docs/rss_api_html/search/functions_b.html similarity index 100% rename from documents/rss_api_html/search/functions_b.html rename to docs/rss_api_html/search/functions_b.html diff --git a/documents/rss_api_html/search/functions_b.js b/docs/rss_api_html/search/functions_b.js similarity index 100% rename from documents/rss_api_html/search/functions_b.js rename to docs/rss_api_html/search/functions_b.js diff --git a/documents/rss_api_html/search/functions_c.html b/docs/rss_api_html/search/functions_c.html similarity index 100% rename from documents/rss_api_html/search/functions_c.html rename to docs/rss_api_html/search/functions_c.html diff --git a/documents/rss_api_html/search/functions_c.js b/docs/rss_api_html/search/functions_c.js similarity index 100% rename from documents/rss_api_html/search/functions_c.js rename to docs/rss_api_html/search/functions_c.js diff --git a/documents/rss_api_html/search/functions_d.html b/docs/rss_api_html/search/functions_d.html similarity index 100% rename from documents/rss_api_html/search/functions_d.html rename to docs/rss_api_html/search/functions_d.html diff --git a/documents/rss_api_html/search/functions_d.js b/docs/rss_api_html/search/functions_d.js similarity index 100% rename from documents/rss_api_html/search/functions_d.js rename to docs/rss_api_html/search/functions_d.js diff --git a/documents/rss_api_html/search/functions_e.html b/docs/rss_api_html/search/functions_e.html similarity index 100% rename from documents/rss_api_html/search/functions_e.html rename to docs/rss_api_html/search/functions_e.html diff --git a/documents/rss_api_html/search/functions_e.js b/docs/rss_api_html/search/functions_e.js similarity index 100% rename from documents/rss_api_html/search/functions_e.js rename to docs/rss_api_html/search/functions_e.js diff --git a/documents/rss_api_html/search/functions_f.html b/docs/rss_api_html/search/functions_f.html similarity index 100% rename from documents/rss_api_html/search/functions_f.html rename to docs/rss_api_html/search/functions_f.html diff --git a/documents/rss_api_html/search/functions_f.js b/docs/rss_api_html/search/functions_f.js similarity index 100% rename from documents/rss_api_html/search/functions_f.js rename to docs/rss_api_html/search/functions_f.js diff --git a/documents/rss_api_html/search/groups_0.html b/docs/rss_api_html/search/groups_0.html similarity index 100% rename from documents/rss_api_html/search/groups_0.html rename to docs/rss_api_html/search/groups_0.html diff --git a/documents/rss_api_html/search/groups_0.js b/docs/rss_api_html/search/groups_0.js similarity index 100% rename from documents/rss_api_html/search/groups_0.js rename to docs/rss_api_html/search/groups_0.js diff --git a/documents/rss_api_html/search/groups_1.html b/docs/rss_api_html/search/groups_1.html similarity index 100% rename from documents/rss_api_html/search/groups_1.html rename to docs/rss_api_html/search/groups_1.html diff --git a/documents/rss_api_html/search/groups_1.js b/docs/rss_api_html/search/groups_1.js similarity index 100% rename from documents/rss_api_html/search/groups_1.js rename to docs/rss_api_html/search/groups_1.js diff --git a/documents/rss_api_html/search/groups_2.html b/docs/rss_api_html/search/groups_2.html similarity index 100% rename from documents/rss_api_html/search/groups_2.html rename to docs/rss_api_html/search/groups_2.html diff --git a/documents/rss_api_html/search/groups_2.js b/docs/rss_api_html/search/groups_2.js similarity index 100% rename from documents/rss_api_html/search/groups_2.js rename to docs/rss_api_html/search/groups_2.js diff --git a/documents/rss_api_html/search/groups_3.html b/docs/rss_api_html/search/groups_3.html similarity index 100% rename from documents/rss_api_html/search/groups_3.html rename to docs/rss_api_html/search/groups_3.html diff --git a/documents/rss_api_html/search/groups_3.js b/docs/rss_api_html/search/groups_3.js similarity index 100% rename from documents/rss_api_html/search/groups_3.js rename to docs/rss_api_html/search/groups_3.js diff --git a/documents/rss_api_html/search/groups_4.html b/docs/rss_api_html/search/groups_4.html similarity index 100% rename from documents/rss_api_html/search/groups_4.html rename to docs/rss_api_html/search/groups_4.html diff --git a/documents/rss_api_html/search/groups_4.js b/docs/rss_api_html/search/groups_4.js similarity index 100% rename from documents/rss_api_html/search/groups_4.js rename to docs/rss_api_html/search/groups_4.js diff --git a/documents/rss_api_html/search/mag_sel.png b/docs/rss_api_html/search/mag_sel.png similarity index 100% rename from documents/rss_api_html/search/mag_sel.png rename to docs/rss_api_html/search/mag_sel.png diff --git a/documents/rss_api_html/search/nomatches.html b/docs/rss_api_html/search/nomatches.html similarity index 100% rename from documents/rss_api_html/search/nomatches.html rename to docs/rss_api_html/search/nomatches.html diff --git a/documents/rss_api_html/search/search.css b/docs/rss_api_html/search/search.css similarity index 100% rename from documents/rss_api_html/search/search.css rename to docs/rss_api_html/search/search.css diff --git a/documents/rss_api_html/search/search.js b/docs/rss_api_html/search/search.js similarity index 100% rename from documents/rss_api_html/search/search.js rename to docs/rss_api_html/search/search.js diff --git a/documents/rss_api_html/search/search_l.png b/docs/rss_api_html/search/search_l.png similarity index 100% rename from documents/rss_api_html/search/search_l.png rename to docs/rss_api_html/search/search_l.png diff --git a/documents/rss_api_html/search/search_m.png b/docs/rss_api_html/search/search_m.png similarity index 100% rename from documents/rss_api_html/search/search_m.png rename to docs/rss_api_html/search/search_m.png diff --git a/documents/rss_api_html/search/search_r.png b/docs/rss_api_html/search/search_r.png similarity index 100% rename from documents/rss_api_html/search/search_r.png rename to docs/rss_api_html/search/search_r.png diff --git a/documents/rss_api_html/search/searchdata.js b/docs/rss_api_html/search/searchdata.js similarity index 100% rename from documents/rss_api_html/search/searchdata.js rename to docs/rss_api_html/search/searchdata.js diff --git a/documents/rss_api_html/search/typedefs_0.html b/docs/rss_api_html/search/typedefs_0.html similarity index 100% rename from documents/rss_api_html/search/typedefs_0.html rename to docs/rss_api_html/search/typedefs_0.html diff --git a/documents/rss_api_html/search/typedefs_0.js b/docs/rss_api_html/search/typedefs_0.js similarity index 100% rename from documents/rss_api_html/search/typedefs_0.js rename to docs/rss_api_html/search/typedefs_0.js diff --git a/documents/rss_api_html/search/typedefs_1.html b/docs/rss_api_html/search/typedefs_1.html similarity index 100% rename from documents/rss_api_html/search/typedefs_1.html rename to docs/rss_api_html/search/typedefs_1.html diff --git a/documents/rss_api_html/search/typedefs_1.js b/docs/rss_api_html/search/typedefs_1.js similarity index 100% rename from documents/rss_api_html/search/typedefs_1.js rename to docs/rss_api_html/search/typedefs_1.js diff --git a/documents/rss_api_html/search/typedefs_2.html b/docs/rss_api_html/search/typedefs_2.html similarity index 100% rename from documents/rss_api_html/search/typedefs_2.html rename to docs/rss_api_html/search/typedefs_2.html diff --git a/documents/rss_api_html/search/typedefs_2.js b/docs/rss_api_html/search/typedefs_2.js similarity index 100% rename from documents/rss_api_html/search/typedefs_2.js rename to docs/rss_api_html/search/typedefs_2.js diff --git a/documents/rss_api_html/search/typedefs_3.html b/docs/rss_api_html/search/typedefs_3.html similarity index 100% rename from documents/rss_api_html/search/typedefs_3.html rename to docs/rss_api_html/search/typedefs_3.html diff --git a/documents/rss_api_html/search/typedefs_3.js b/docs/rss_api_html/search/typedefs_3.js similarity index 100% rename from documents/rss_api_html/search/typedefs_3.js rename to docs/rss_api_html/search/typedefs_3.js diff --git a/documents/rss_api_html/search/typedefs_4.html b/docs/rss_api_html/search/typedefs_4.html similarity index 100% rename from documents/rss_api_html/search/typedefs_4.html rename to docs/rss_api_html/search/typedefs_4.html diff --git a/documents/rss_api_html/search/typedefs_4.js b/docs/rss_api_html/search/typedefs_4.js similarity index 100% rename from documents/rss_api_html/search/typedefs_4.js rename to docs/rss_api_html/search/typedefs_4.js diff --git a/documents/rss_api_html/search/typedefs_5.html b/docs/rss_api_html/search/typedefs_5.html similarity index 100% rename from documents/rss_api_html/search/typedefs_5.html rename to docs/rss_api_html/search/typedefs_5.html diff --git a/documents/rss_api_html/search/typedefs_5.js b/docs/rss_api_html/search/typedefs_5.js similarity index 100% rename from documents/rss_api_html/search/typedefs_5.js rename to docs/rss_api_html/search/typedefs_5.js diff --git a/documents/rss_api_html/search/typedefs_6.html b/docs/rss_api_html/search/typedefs_6.html similarity index 100% rename from documents/rss_api_html/search/typedefs_6.html rename to docs/rss_api_html/search/typedefs_6.html diff --git a/documents/rss_api_html/search/typedefs_6.js b/docs/rss_api_html/search/typedefs_6.js similarity index 100% rename from documents/rss_api_html/search/typedefs_6.js rename to docs/rss_api_html/search/typedefs_6.js diff --git a/documents/rss_api_html/search/variables_0.html b/docs/rss_api_html/search/variables_0.html similarity index 100% rename from documents/rss_api_html/search/variables_0.html rename to docs/rss_api_html/search/variables_0.html diff --git a/documents/rss_api_html/search/variables_0.js b/docs/rss_api_html/search/variables_0.js similarity index 100% rename from documents/rss_api_html/search/variables_0.js rename to docs/rss_api_html/search/variables_0.js diff --git a/documents/rss_api_html/search/variables_1.html b/docs/rss_api_html/search/variables_1.html similarity index 100% rename from documents/rss_api_html/search/variables_1.html rename to docs/rss_api_html/search/variables_1.html diff --git a/documents/rss_api_html/search/variables_1.js b/docs/rss_api_html/search/variables_1.js similarity index 100% rename from documents/rss_api_html/search/variables_1.js rename to docs/rss_api_html/search/variables_1.js diff --git a/documents/rss_api_html/search/variables_10.html b/docs/rss_api_html/search/variables_10.html similarity index 100% rename from documents/rss_api_html/search/variables_10.html rename to docs/rss_api_html/search/variables_10.html diff --git a/documents/rss_api_html/search/variables_10.js b/docs/rss_api_html/search/variables_10.js similarity index 100% rename from documents/rss_api_html/search/variables_10.js rename to docs/rss_api_html/search/variables_10.js diff --git a/documents/rss_api_html/search/variables_11.html b/docs/rss_api_html/search/variables_11.html similarity index 100% rename from documents/rss_api_html/search/variables_11.html rename to docs/rss_api_html/search/variables_11.html diff --git a/documents/rss_api_html/search/variables_11.js b/docs/rss_api_html/search/variables_11.js similarity index 100% rename from documents/rss_api_html/search/variables_11.js rename to docs/rss_api_html/search/variables_11.js diff --git a/documents/rss_api_html/search/variables_12.html b/docs/rss_api_html/search/variables_12.html similarity index 100% rename from documents/rss_api_html/search/variables_12.html rename to docs/rss_api_html/search/variables_12.html diff --git a/documents/rss_api_html/search/variables_12.js b/docs/rss_api_html/search/variables_12.js similarity index 100% rename from documents/rss_api_html/search/variables_12.js rename to docs/rss_api_html/search/variables_12.js diff --git a/documents/rss_api_html/search/variables_13.html b/docs/rss_api_html/search/variables_13.html similarity index 100% rename from documents/rss_api_html/search/variables_13.html rename to docs/rss_api_html/search/variables_13.html diff --git a/documents/rss_api_html/search/variables_13.js b/docs/rss_api_html/search/variables_13.js similarity index 100% rename from documents/rss_api_html/search/variables_13.js rename to docs/rss_api_html/search/variables_13.js diff --git a/documents/rss_api_html/search/variables_14.html b/docs/rss_api_html/search/variables_14.html similarity index 100% rename from documents/rss_api_html/search/variables_14.html rename to docs/rss_api_html/search/variables_14.html diff --git a/documents/rss_api_html/search/variables_14.js b/docs/rss_api_html/search/variables_14.js similarity index 100% rename from documents/rss_api_html/search/variables_14.js rename to docs/rss_api_html/search/variables_14.js diff --git a/documents/rss_api_html/search/variables_15.html b/docs/rss_api_html/search/variables_15.html similarity index 100% rename from documents/rss_api_html/search/variables_15.html rename to docs/rss_api_html/search/variables_15.html diff --git a/documents/rss_api_html/search/variables_15.js b/docs/rss_api_html/search/variables_15.js similarity index 100% rename from documents/rss_api_html/search/variables_15.js rename to docs/rss_api_html/search/variables_15.js diff --git a/documents/rss_api_html/search/variables_2.html b/docs/rss_api_html/search/variables_2.html similarity index 100% rename from documents/rss_api_html/search/variables_2.html rename to docs/rss_api_html/search/variables_2.html diff --git a/documents/rss_api_html/search/variables_2.js b/docs/rss_api_html/search/variables_2.js similarity index 100% rename from documents/rss_api_html/search/variables_2.js rename to docs/rss_api_html/search/variables_2.js diff --git a/documents/rss_api_html/search/variables_3.html b/docs/rss_api_html/search/variables_3.html similarity index 100% rename from documents/rss_api_html/search/variables_3.html rename to docs/rss_api_html/search/variables_3.html diff --git a/documents/rss_api_html/search/variables_3.js b/docs/rss_api_html/search/variables_3.js similarity index 100% rename from documents/rss_api_html/search/variables_3.js rename to docs/rss_api_html/search/variables_3.js diff --git a/documents/rss_api_html/search/variables_4.html b/docs/rss_api_html/search/variables_4.html similarity index 100% rename from documents/rss_api_html/search/variables_4.html rename to docs/rss_api_html/search/variables_4.html diff --git a/documents/rss_api_html/search/variables_4.js b/docs/rss_api_html/search/variables_4.js similarity index 100% rename from documents/rss_api_html/search/variables_4.js rename to docs/rss_api_html/search/variables_4.js diff --git a/documents/rss_api_html/search/variables_5.html b/docs/rss_api_html/search/variables_5.html similarity index 100% rename from documents/rss_api_html/search/variables_5.html rename to docs/rss_api_html/search/variables_5.html diff --git a/documents/rss_api_html/search/variables_5.js b/docs/rss_api_html/search/variables_5.js similarity index 100% rename from documents/rss_api_html/search/variables_5.js rename to docs/rss_api_html/search/variables_5.js diff --git a/documents/rss_api_html/search/variables_6.html b/docs/rss_api_html/search/variables_6.html similarity index 100% rename from documents/rss_api_html/search/variables_6.html rename to docs/rss_api_html/search/variables_6.html diff --git a/documents/rss_api_html/search/variables_6.js b/docs/rss_api_html/search/variables_6.js similarity index 100% rename from documents/rss_api_html/search/variables_6.js rename to docs/rss_api_html/search/variables_6.js diff --git a/documents/rss_api_html/search/variables_7.html b/docs/rss_api_html/search/variables_7.html similarity index 100% rename from documents/rss_api_html/search/variables_7.html rename to docs/rss_api_html/search/variables_7.html diff --git a/documents/rss_api_html/search/variables_7.js b/docs/rss_api_html/search/variables_7.js similarity index 100% rename from documents/rss_api_html/search/variables_7.js rename to docs/rss_api_html/search/variables_7.js diff --git a/documents/rss_api_html/search/variables_8.html b/docs/rss_api_html/search/variables_8.html similarity index 100% rename from documents/rss_api_html/search/variables_8.html rename to docs/rss_api_html/search/variables_8.html diff --git a/documents/rss_api_html/search/variables_8.js b/docs/rss_api_html/search/variables_8.js similarity index 100% rename from documents/rss_api_html/search/variables_8.js rename to docs/rss_api_html/search/variables_8.js diff --git a/documents/rss_api_html/search/variables_9.html b/docs/rss_api_html/search/variables_9.html similarity index 100% rename from documents/rss_api_html/search/variables_9.html rename to docs/rss_api_html/search/variables_9.html diff --git a/documents/rss_api_html/search/variables_9.js b/docs/rss_api_html/search/variables_9.js similarity index 100% rename from documents/rss_api_html/search/variables_9.js rename to docs/rss_api_html/search/variables_9.js diff --git a/documents/rss_api_html/search/variables_a.html b/docs/rss_api_html/search/variables_a.html similarity index 100% rename from documents/rss_api_html/search/variables_a.html rename to docs/rss_api_html/search/variables_a.html diff --git a/documents/rss_api_html/search/variables_a.js b/docs/rss_api_html/search/variables_a.js similarity index 100% rename from documents/rss_api_html/search/variables_a.js rename to docs/rss_api_html/search/variables_a.js diff --git a/documents/rss_api_html/search/variables_b.html b/docs/rss_api_html/search/variables_b.html similarity index 100% rename from documents/rss_api_html/search/variables_b.html rename to docs/rss_api_html/search/variables_b.html diff --git a/documents/rss_api_html/search/variables_b.js b/docs/rss_api_html/search/variables_b.js similarity index 100% rename from documents/rss_api_html/search/variables_b.js rename to docs/rss_api_html/search/variables_b.js diff --git a/documents/rss_api_html/search/variables_c.html b/docs/rss_api_html/search/variables_c.html similarity index 100% rename from documents/rss_api_html/search/variables_c.html rename to docs/rss_api_html/search/variables_c.html diff --git a/documents/rss_api_html/search/variables_c.js b/docs/rss_api_html/search/variables_c.js similarity index 100% rename from documents/rss_api_html/search/variables_c.js rename to docs/rss_api_html/search/variables_c.js diff --git a/documents/rss_api_html/search/variables_d.html b/docs/rss_api_html/search/variables_d.html similarity index 100% rename from documents/rss_api_html/search/variables_d.html rename to docs/rss_api_html/search/variables_d.html diff --git a/documents/rss_api_html/search/variables_d.js b/docs/rss_api_html/search/variables_d.js similarity index 100% rename from documents/rss_api_html/search/variables_d.js rename to docs/rss_api_html/search/variables_d.js diff --git a/documents/rss_api_html/search/variables_e.html b/docs/rss_api_html/search/variables_e.html similarity index 100% rename from documents/rss_api_html/search/variables_e.html rename to docs/rss_api_html/search/variables_e.html diff --git a/documents/rss_api_html/search/variables_e.js b/docs/rss_api_html/search/variables_e.js similarity index 100% rename from documents/rss_api_html/search/variables_e.js rename to docs/rss_api_html/search/variables_e.js diff --git a/documents/rss_api_html/search/variables_f.html b/docs/rss_api_html/search/variables_f.html similarity index 100% rename from documents/rss_api_html/search/variables_f.html rename to docs/rss_api_html/search/variables_f.html diff --git a/documents/rss_api_html/search/variables_f.js b/docs/rss_api_html/search/variables_f.js similarity index 100% rename from documents/rss_api_html/search/variables_f.js rename to docs/rss_api_html/search/variables_f.js diff --git a/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot b/docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot similarity index 100% rename from documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot rename to docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.eot diff --git a/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg b/docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg similarity index 100% rename from documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg rename to docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.svg diff --git a/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf b/docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf similarity index 100% rename from documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf rename to docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.ttf diff --git a/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff b/docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff similarity index 100% rename from documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff rename to docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff diff --git a/documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 b/docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 similarity index 100% rename from documents/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 rename to docs/rss_api_html/spinnaker-v11-latin/spinnaker-v11-latin-regular.woff2 diff --git a/documents/rss_api_html/splitbar.png b/docs/rss_api_html/splitbar.png similarity index 100% rename from documents/rss_api_html/splitbar.png rename to docs/rss_api_html/splitbar.png diff --git a/documents/rss_api_html/stm32l4xx__hal__conf_8h.html b/docs/rss_api_html/stm32l4xx__hal__conf_8h.html similarity index 100% rename from documents/rss_api_html/stm32l4xx__hal__conf_8h.html rename to docs/rss_api_html/stm32l4xx__hal__conf_8h.html diff --git a/documents/rss_api_html/stm32l4xx__hal__conf_8h_source.html b/docs/rss_api_html/stm32l4xx__hal__conf_8h_source.html similarity index 100% rename from documents/rss_api_html/stm32l4xx__hal__conf_8h_source.html rename to docs/rss_api_html/stm32l4xx__hal__conf_8h_source.html diff --git a/documents/rss_api_html/stm32l4xx__hal__msp_8c.html b/docs/rss_api_html/stm32l4xx__hal__msp_8c.html similarity index 100% rename from documents/rss_api_html/stm32l4xx__hal__msp_8c.html rename to docs/rss_api_html/stm32l4xx__hal__msp_8c.html diff --git a/documents/rss_api_html/stm32l4xx__hal__msp_8c_source.html b/docs/rss_api_html/stm32l4xx__hal__msp_8c_source.html similarity index 100% rename from documents/rss_api_html/stm32l4xx__hal__msp_8c_source.html rename to docs/rss_api_html/stm32l4xx__hal__msp_8c_source.html diff --git a/documents/rss_api_html/stm32l4xx__it_8c.html b/docs/rss_api_html/stm32l4xx__it_8c.html similarity index 100% rename from documents/rss_api_html/stm32l4xx__it_8c.html rename to docs/rss_api_html/stm32l4xx__it_8c.html diff --git a/documents/rss_api_html/stm32l4xx__it_8c_source.html b/docs/rss_api_html/stm32l4xx__it_8c_source.html similarity index 100% rename from documents/rss_api_html/stm32l4xx__it_8c_source.html rename to docs/rss_api_html/stm32l4xx__it_8c_source.html diff --git a/documents/rss_api_html/stm32l4xx__it_8h.html b/docs/rss_api_html/stm32l4xx__it_8h.html similarity index 100% rename from documents/rss_api_html/stm32l4xx__it_8h.html rename to docs/rss_api_html/stm32l4xx__it_8h.html diff --git a/documents/rss_api_html/stm32l4xx__it_8h_source.html b/docs/rss_api_html/stm32l4xx__it_8h_source.html similarity index 100% rename from documents/rss_api_html/stm32l4xx__it_8h_source.html rename to docs/rss_api_html/stm32l4xx__it_8h_source.html diff --git a/documents/rss_api_html/structacc__breathing__config__t.html b/docs/rss_api_html/structacc__breathing__config__t.html similarity index 100% rename from documents/rss_api_html/structacc__breathing__config__t.html rename to docs/rss_api_html/structacc__breathing__config__t.html diff --git a/documents/rss_api_html/structacc__breathing__handle__t.html b/docs/rss_api_html/structacc__breathing__handle__t.html similarity index 100% rename from documents/rss_api_html/structacc__breathing__handle__t.html rename to docs/rss_api_html/structacc__breathing__handle__t.html diff --git a/documents/rss_api_html/structacc__breathing__result__t.html b/docs/rss_api_html/structacc__breathing__result__t.html similarity index 100% rename from documents/rss_api_html/structacc__breathing__result__t.html rename to docs/rss_api_html/structacc__breathing__result__t.html diff --git a/documents/rss_api_html/structacc__cal__info__t.html b/docs/rss_api_html/structacc__cal__info__t.html similarity index 100% rename from documents/rss_api_html/structacc__cal__info__t.html rename to docs/rss_api_html/structacc__cal__info__t.html diff --git a/documents/rss_api_html/structacc__cal__result__t.html b/docs/rss_api_html/structacc__cal__result__t.html similarity index 100% rename from documents/rss_api_html/structacc__cal__result__t.html rename to docs/rss_api_html/structacc__cal__result__t.html diff --git a/documents/rss_api_html/structacc__control__helper__t.html b/docs/rss_api_html/structacc__control__helper__t.html similarity index 100% rename from documents/rss_api_html/structacc__control__helper__t.html rename to docs/rss_api_html/structacc__control__helper__t.html diff --git a/documents/rss_api_html/structacc__detector__distance__result__t.html b/docs/rss_api_html/structacc__detector__distance__result__t.html similarity index 100% rename from documents/rss_api_html/structacc__detector__distance__result__t.html rename to docs/rss_api_html/structacc__detector__distance__result__t.html diff --git a/documents/rss_api_html/structacc__detector__presence__metadata__t.html b/docs/rss_api_html/structacc__detector__presence__metadata__t.html similarity index 100% rename from documents/rss_api_html/structacc__detector__presence__metadata__t.html rename to docs/rss_api_html/structacc__detector__presence__metadata__t.html diff --git a/documents/rss_api_html/structacc__detector__presence__result__t.html b/docs/rss_api_html/structacc__detector__presence__result__t.html similarity index 100% rename from documents/rss_api_html/structacc__detector__presence__result__t.html rename to docs/rss_api_html/structacc__detector__presence__result__t.html diff --git a/documents/rss_api_html/structacc__hal__a121__t.html b/docs/rss_api_html/structacc__hal__a121__t.html similarity index 100% rename from documents/rss_api_html/structacc__hal__a121__t.html rename to docs/rss_api_html/structacc__hal__a121__t.html diff --git a/documents/rss_api_html/structacc__hal__optimization__t.html b/docs/rss_api_html/structacc__hal__optimization__t.html similarity index 100% rename from documents/rss_api_html/structacc__hal__optimization__t.html rename to docs/rss_api_html/structacc__hal__optimization__t.html diff --git a/documents/rss_api_html/structacc__int16__complex__t.html b/docs/rss_api_html/structacc__int16__complex__t.html similarity index 100% rename from documents/rss_api_html/structacc__int16__complex__t.html rename to docs/rss_api_html/structacc__int16__complex__t.html diff --git a/documents/rss_api_html/structacc__processing__metadata__t.html b/docs/rss_api_html/structacc__processing__metadata__t.html similarity index 100% rename from documents/rss_api_html/structacc__processing__metadata__t.html rename to docs/rss_api_html/structacc__processing__metadata__t.html diff --git a/documents/rss_api_html/structacc__processing__result__t.html b/docs/rss_api_html/structacc__processing__result__t.html similarity index 100% rename from documents/rss_api_html/structacc__processing__result__t.html rename to docs/rss_api_html/structacc__processing__result__t.html diff --git a/documents/rss_api_html/structacc__ref__app__smart__presence__config__t.html b/docs/rss_api_html/structacc__ref__app__smart__presence__config__t.html similarity index 100% rename from documents/rss_api_html/structacc__ref__app__smart__presence__config__t.html rename to docs/rss_api_html/structacc__ref__app__smart__presence__config__t.html diff --git a/documents/rss_api_html/structacc__ref__app__smart__presence__wakeup__config__t.html b/docs/rss_api_html/structacc__ref__app__smart__presence__wakeup__config__t.html similarity index 100% rename from documents/rss_api_html/structacc__ref__app__smart__presence__wakeup__config__t.html rename to docs/rss_api_html/structacc__ref__app__smart__presence__wakeup__config__t.html diff --git a/documents/rss_api_html/structacc__ref__app__smart__presence__zone__config__t.html b/docs/rss_api_html/structacc__ref__app__smart__presence__zone__config__t.html similarity index 100% rename from documents/rss_api_html/structacc__ref__app__smart__presence__zone__config__t.html rename to docs/rss_api_html/structacc__ref__app__smart__presence__zone__config__t.html diff --git a/documents/rss_api_html/structacc__ref__app__tank__level__config__t.html b/docs/rss_api_html/structacc__ref__app__tank__level__config__t.html similarity index 100% rename from documents/rss_api_html/structacc__ref__app__tank__level__config__t.html rename to docs/rss_api_html/structacc__ref__app__tank__level__config__t.html diff --git a/documents/rss_api_html/structacc__reg__protocol__t.html b/docs/rss_api_html/structacc__reg__protocol__t.html similarity index 100% rename from documents/rss_api_html/structacc__reg__protocol__t.html rename to docs/rss_api_html/structacc__reg__protocol__t.html diff --git a/documents/rss_api_html/structacc__rss__assembly__test__result__t.html b/docs/rss_api_html/structacc__rss__assembly__test__result__t.html similarity index 100% rename from documents/rss_api_html/structacc__rss__assembly__test__result__t.html rename to docs/rss_api_html/structacc__rss__assembly__test__result__t.html diff --git a/documents/rss_api_html/structacc__smart__presence__result__t.html b/docs/rss_api_html/structacc__smart__presence__result__t.html similarity index 100% rename from documents/rss_api_html/structacc__smart__presence__result__t.html rename to docs/rss_api_html/structacc__smart__presence__result__t.html diff --git a/documents/rss_api_html/structacc__smart__presence__zone__result__t.html b/docs/rss_api_html/structacc__smart__presence__zone__result__t.html similarity index 100% rename from documents/rss_api_html/structacc__smart__presence__zone__result__t.html rename to docs/rss_api_html/structacc__smart__presence__zone__result__t.html diff --git a/documents/rss_api_html/structacc__surface__velocity__config__t.html b/docs/rss_api_html/structacc__surface__velocity__config__t.html similarity index 100% rename from documents/rss_api_html/structacc__surface__velocity__config__t.html rename to docs/rss_api_html/structacc__surface__velocity__config__t.html diff --git a/documents/rss_api_html/structacc__surface__velocity__handle__t.html b/docs/rss_api_html/structacc__surface__velocity__handle__t.html similarity index 100% rename from documents/rss_api_html/structacc__surface__velocity__handle__t.html rename to docs/rss_api_html/structacc__surface__velocity__handle__t.html diff --git a/documents/rss_api_html/structacc__surface__velocity__result__t.html b/docs/rss_api_html/structacc__surface__velocity__result__t.html similarity index 100% rename from documents/rss_api_html/structacc__surface__velocity__result__t.html rename to docs/rss_api_html/structacc__surface__velocity__result__t.html diff --git a/documents/rss_api_html/structacc__vector__float__t.html b/docs/rss_api_html/structacc__vector__float__t.html similarity index 100% rename from documents/rss_api_html/structacc__vector__float__t.html rename to docs/rss_api_html/structacc__vector__float__t.html diff --git a/documents/rss_api_html/structacc__vector__iq__t.html b/docs/rss_api_html/structacc__vector__iq__t.html similarity index 100% rename from documents/rss_api_html/structacc__vector__iq__t.html rename to docs/rss_api_html/structacc__vector__iq__t.html diff --git a/documents/rss_api_html/structapp__context__t.html b/docs/rss_api_html/structapp__context__t.html similarity index 100% rename from documents/rss_api_html/structapp__context__t.html rename to docs/rss_api_html/structapp__context__t.html diff --git a/documents/rss_api_html/structapp__result__t.html b/docs/rss_api_html/structapp__result__t.html similarity index 100% rename from documents/rss_api_html/structapp__result__t.html rename to docs/rss_api_html/structapp__result__t.html diff --git a/documents/rss_api_html/structdistance__detector__resources__t.html b/docs/rss_api_html/structdistance__detector__resources__t.html similarity index 100% rename from documents/rss_api_html/structdistance__detector__resources__t.html rename to docs/rss_api_html/structdistance__detector__resources__t.html diff --git a/documents/rss_api_html/structexample__config.html b/docs/rss_api_html/structexample__config.html similarity index 100% rename from documents/rss_api_html/structexample__config.html rename to docs/rss_api_html/structexample__config.html diff --git a/documents/rss_api_html/structexploration__server__interface__t.html b/docs/rss_api_html/structexploration__server__interface__t.html similarity index 100% rename from documents/rss_api_html/structexploration__server__interface__t.html rename to docs/rss_api_html/structexploration__server__interface__t.html diff --git a/documents/rss_api_html/structgpio__config__t.html b/docs/rss_api_html/structgpio__config__t.html similarity index 100% rename from documents/rss_api_html/structgpio__config__t.html rename to docs/rss_api_html/structgpio__config__t.html diff --git a/documents/rss_api_html/structout__fct__wrap__type.html b/docs/rss_api_html/structout__fct__wrap__type.html similarity index 100% rename from documents/rss_api_html/structout__fct__wrap__type.html rename to docs/rss_api_html/structout__fct__wrap__type.html diff --git a/documents/rss_api_html/structpresence__detector__context__t.html b/docs/rss_api_html/structpresence__detector__context__t.html similarity index 100% rename from documents/rss_api_html/structpresence__detector__context__t.html rename to docs/rss_api_html/structpresence__detector__context__t.html diff --git a/documents/rss_api_html/structpresence__detector__resources__t.html b/docs/rss_api_html/structpresence__detector__resources__t.html similarity index 100% rename from documents/rss_api_html/structpresence__detector__resources__t.html rename to docs/rss_api_html/structpresence__detector__resources__t.html diff --git a/documents/rss_api_html/structprint__buffer__t.html b/docs/rss_api_html/structprint__buffer__t.html similarity index 100% rename from documents/rss_api_html/structprint__buffer__t.html rename to docs/rss_api_html/structprint__buffer__t.html diff --git a/documents/rss_api_html/style.css b/docs/rss_api_html/style.css similarity index 100% rename from documents/rss_api_html/style.css rename to docs/rss_api_html/style.css diff --git a/documents/rss_api_html/sync_off.png b/docs/rss_api_html/sync_off.png similarity index 100% rename from documents/rss_api_html/sync_off.png rename to docs/rss_api_html/sync_off.png diff --git a/documents/rss_api_html/sync_on.png b/docs/rss_api_html/sync_on.png similarity index 100% rename from documents/rss_api_html/sync_on.png rename to docs/rss_api_html/sync_on.png diff --git a/documents/rss_api_html/syscalls_8c.html b/docs/rss_api_html/syscalls_8c.html similarity index 100% rename from documents/rss_api_html/syscalls_8c.html rename to docs/rss_api_html/syscalls_8c.html diff --git a/documents/rss_api_html/syscalls_8c_source.html b/docs/rss_api_html/syscalls_8c_source.html similarity index 100% rename from documents/rss_api_html/syscalls_8c_source.html rename to docs/rss_api_html/syscalls_8c_source.html diff --git a/documents/rss_api_html/sysmem_8c.html b/docs/rss_api_html/sysmem_8c.html similarity index 100% rename from documents/rss_api_html/sysmem_8c.html rename to docs/rss_api_html/sysmem_8c.html diff --git a/documents/rss_api_html/sysmem_8c_source.html b/docs/rss_api_html/sysmem_8c_source.html similarity index 100% rename from documents/rss_api_html/sysmem_8c_source.html rename to docs/rss_api_html/sysmem_8c_source.html diff --git a/documents/rss_api_html/tab_a.png b/docs/rss_api_html/tab_a.png similarity index 100% rename from documents/rss_api_html/tab_a.png rename to docs/rss_api_html/tab_a.png diff --git a/documents/rss_api_html/tab_b.png b/docs/rss_api_html/tab_b.png similarity index 100% rename from documents/rss_api_html/tab_b.png rename to docs/rss_api_html/tab_b.png diff --git a/documents/rss_api_html/tab_h.png b/docs/rss_api_html/tab_h.png similarity index 100% rename from documents/rss_api_html/tab_h.png rename to docs/rss_api_html/tab_h.png diff --git a/documents/rss_api_html/tab_s.png b/docs/rss_api_html/tab_s.png similarity index 100% rename from documents/rss_api_html/tab_s.png rename to docs/rss_api_html/tab_s.png diff --git a/documents/rss_api_html/tabs.css b/docs/rss_api_html/tabs.css similarity index 100% rename from documents/rss_api_html/tabs.css rename to docs/rss_api_html/tabs.css From 9c3ca10091c0b86b0e7eb0938bb52170a6e009f7 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 08:23:45 -0700 Subject: [PATCH 09/32] fixed license to something that is an actual software license --- LICENSE.md | 45 +++------------------------------------------ 1 file changed, 3 insertions(+), 42 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index cff88bb..989061b 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,41 +1,6 @@ -SparkFun License Information -============================ +MIT License -SparkFun uses two different licenses for our files — one for hardware and one for code. - -Hardware ---------- - -**SparkFun hardware is released under [Creative Commons Share-alike 4.0 International](http://creativecommons.org/licenses/by-sa/4.0/).** - -Note: This is a human-readable summary of (and not a substitute for) the [license](http://creativecommons.org/licenses/by-sa/4.0/legalcode). - -You are free to: - -Share — copy and redistribute the material in any medium or format -Adapt — remix, transform, and build upon the material -for any purpose, even commercially. -The licensor cannot revoke these freedoms as long as you follow the license terms. -Under the following terms: - -Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. -ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original. -No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits. -Notices: - -You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation. -No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material. - - -Code --------- -Library contains code from multiple sources, see top of each file for specific licensing information. - -**SparkFun code, firmware, and software is released under the MIT License(http://opensource.org/licenses/MIT).** - -The MIT License (MIT) - -Copyright (c) 2020 SparkFun Electronics +Copyright (c) 2024-2025 SparkFun Electronics Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -53,8 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -**Analog Devices, firmware and software is subject to software license agreement. See SLA pdf included with this repo.** -License terms outlines in: -2021-05-20-LWSCADIN1110 Click Thru SLA .pdf +SOFTWARE. \ No newline at end of file From 4c3030b919aba00c2e00ec7865bbfa938680cb66 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 08:28:08 -0700 Subject: [PATCH 10/32] update to readme -- in progress --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 252be77..73dcf16 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,30 @@ + +![SparkFun Pulsed Coherent Radar Sensor – Acconeer XM125 (Qwiic)](docs/images/gh-banner-2025-xm125.png "SparkFun Pulsed Coherent Radar Sensor") + +# SparkFun Pulsed Coherent Radar Sensor – Acconeer XM125 + +Arduino Library for the SparkFun Pulsed Coherent Radar Sensor + +https://github.com/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library +![License](https://img.shields.io/github/license/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library) +![Release](https://img.shields.io/github/v/release/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library) +![Release Date](https://img.shields.io/github/release-date/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library) +![Documentation - build](https://img.shields.io/github/actions/workflow/status/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library/build-deploy-ghpages.yml?label=doc%20build) +![Compile - Test](https://img.shields.io/github/actions/workflow/status/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library/test-compile-sketch.yml?label=compile%20test) +![GitHub issues](https://img.shields.io/github/issues/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library) + + +The [SparkFun Qwiic Soil Moisture Sensor (SEN-17731)](https://www.sparkfun.com/sparkfun-qwiic-soil-moisture-sensor.html) is a simple breakout for measuring the moisture in soil and similar materials. The soil moisture sensor is pretty straightforward to use. The two large, exposed pads function as probes for the sensor, together acting as a variable resistor. The more water that is in the soil means the better the conductivity between the pads will be, resulting in a lower resistance and a higher SIG out. + +Looking for the board that matches this library - pick up a [SparkFun Qwiic Soil Moisture Sensor (SEN-17731)](https://www.sparkfun.com/sparkfun-qwiic-soil-moisture-sensor.html) at www.sparkfun.com. + + + + + + + + SparkFun XM125 A121 Arduino Library ======================================== From 6cbbb981421cc3e1eff0456c9da80000d930686c Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 08:30:11 -0700 Subject: [PATCH 11/32] new banner for a new year --- docs/images/gh-banner-2025-xm125.png | Bin 0 -> 435397 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/gh-banner-2025-xm125.png diff --git a/docs/images/gh-banner-2025-xm125.png b/docs/images/gh-banner-2025-xm125.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7defb2cf4bb7f01eabf851dc34443c0beeaaec GIT binary patch literal 435397 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πsa<;yKXmNT>dN}LbC=k2e67-0 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 D~8C#nbz( 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%0DiKsoO1sWPe-LNnAybnY0dqeqBa)rd}~ z8Bad}6;bM}G6&i|sjP0#jSC4#H%?fFRl4#G7)754@zPQfP1QEil-7b2DFQCyZ7Y(J zM3$gR9&BO7izfpTQB+*{6m3Gg%z2>#gc6p*SOj56gd+sm(5rEo3ss>>!KpnCY2X1M zh(baJ;en%)2}33VAQZ@15?!uHBNh65ZK+&TTsVzISfOh{P(d-7RM?pcDJ2UD@o+^G z%YrCvBB~-Rrl4a_W}=uN0aPqU@=7hzK_qR90Q_SiaW_pE5gGAHAElvUAYqY_5VR*RiW&tF-sFHtk=pHhT^-1cLH-ew zBS%z8sjZ^gMwB=u#61ZWFIOy(Q1m2Lm{NZd!@t}!tCW{(LN?N$O@=<@HBT|u9FeKy3B8)_Q zWiXYbsJU7Zn`FpqduHBtaoLEg} zE3<21IOX-Kk;xwI8VXx_qBpABW~W}>Qm-51x1wbSZ+x&E$ltMoJi@XtvfS2ny@c7@ z{$Meja7MSqAA79x_@n0jJx;BX#(Ly|Xngxty)TZn#PkwoLBCpC&6xPim2XWO{#tSM z;%AW$KDGxtItGU7E32iYWqrD%aCb6QDcJ+tJRKcY_fY2x&#g}1Dczp&HL;dF1d=M& zz#gHx#~;AzResD|#}-GN6vkBaF8K5oW8O*AzZ&WY?At%^_@m*iLxx{3q&BM8u4ixG zUA}qM}msl}$JzcW$3b~#+D zVa5w~ip7FgSO{MCVnbF;XUC3I_{U5baHpN5e&R`|RYT{8^@w}BJ$;=+i61(To!B^c zZtdLJ^2)Ngw&uq-Lzuu+t(wJL3?C0=3f^#Z@c85PnVHPR3ju8EY8pp29M~*bj>@#p+34Myf%(&vv_N)?JQ1vSO<0 ziOR_;LnK~+Cdgtvx){1r z#e(9fg9ei4aj>L7G~pMrObV3{g;vC&s4N0x2p(?z5M>Yv8i*xv=8el@^K#!>K(bR6 zQh48{6^XZ;aGD!(qFHJhrVlF>HtN+zt2+7ayF=f2apc64OBXKOx^&rd=Z@uZ zLc8`1KlQACc)%0Tf`^a#ckL-nFNI5$_Fk=OXrfuDREqV60S6ksyUcb+OVre`(z}K) zCJTdG`=0tr-?Ps|cZ_L4yQMWO-5WZ7yyL?8=?_0#`^}qUFFZf=$jOG@y!7rHr+@MD zuAyD6r=G>ams-6x*4t=+*t0EyFh$ zuBA{Lv9D{RRBAf)O1^+KZ4!?>+&eN9+O;k7&O6$|YNT8;CU56AR*i;Z<+2`M(C!=P zc<~P^rTjHCOg468>Q7#|RJl8y9KV?u8SD+&k*&kFw_cr@&^K0l%0(-aZzb1|6?mKg zU#^9~O!@n&?*CVf{&Kc{p21%Z0Tc91d{W$~+qGH=%PPk^dQLv+fAm;jXuwk~_Z@n8 z@!YwFlW8^ZeXh4?TdCgeRNtUIJi7Pz$*sF~2Erj9_RMNH)p9wrkv#KWbpF;g?0;)+ zlxNOf4}*w5=JQ9rVSF-;cZ}Q)>&qf+-fddo0kHrbcd2*cp`ftEe-6*m0(1jSE za`4ZCmL-gklzTMzh!B&LAeEqsf*`p{90kF%?Dqw70xHIaIHI(&7_gBypeznCr~z5< zg)6oRL!!`8mWCH8vIsk6LBf-wz$)AF%s;AuE=0b8K>1vDbm(+}|(<*F?dL6t5Jzz{E@vyR~o zd5$Qc4I-8bU{s z2qmgYk!8F>BSSLgp&~^N6|s4~e=UH*$Pyvt46Eb%&2X$-&SP61qrX4#^a*EewR-xx zuk7)`(O$|rsZ!K$;KNV7-mq$oNQJZ8v3Lt=oK&dK?SR6H=_-!yE7<;gG+rOw8hrH8 z?x!C&dOG3PRn`|~E}YBVUF-{oGZVM+bZwb|;{4Q%j~ zFtpax)a(bRcE9}9;a9#LSzD=kSn5FP^-EXGYI6kZTHak>{qVv-INA(Hy@R^$AMj|{n)*u`{6nSQ#M`vMe{vR} zDwrj)sOE{^)2onl-bSMNG0lEup>hIBItIu@0GIEH2 zBvEL@NQ+JczwA_$al=G{k_>mP7jK;>#&dL^E(h6?wsHrgmI6k(IABQr z=qd@tSaOvMvBXivz48%-gR(Ny03h-Zj5o9wt%35uQY9v%e@>CQYLZ8AtH)(|$NN*UBuqC`wa@&{IUVJ{Vg(n}1WD32J6A?hYCYsg8;ycAyA1UV~0 zN&>LONIcVVrrd-fB?jSGz!ubrNlXyhJW)cSj3Buvt*D;B2xZZaWGOi1!G)URk2K}k zQVfisxcy8e3>kr)=t1Iqu#!gu;Y6JUNGLNK-F&4Co5%fb0p>b%zy;qsW3wWE)b6a6 zQ)|soz`uV-PyL1ErM2qa^+4Ghz^Hn|akyOoclyL9q%uz$m_mUh@I%?;N+l)3m-hwg zBU{af4kR9ZICSKI-q%%KTh5GMS-gCqkxR$Ikvn%M((%qS3ybG3U0c#T1xy~%nhCRI z6w1|1#q@`C)Am*zZ><)=Saq?Mes_I1ll{S8{P~Gzo)2LAKhwZ>9uS*#u3Bs5^WI$E zcCafDOEjgSKx~t+@Vk#LyOz_u4bulVxr)Uf1EKKK&kTP5PxK=Pv8mMRd%wN=FaJe- za;l0gWgk7h8&|2Lv5|PDU{xbK@N6x}r3?6R18p-Fd#v^9=VELJXt=IZ{JVV3jhO_#{&v*Ov z{^y_b_-&!o>8l~K`{X>2|n*R6>zFX+W40orljd;9a zOg^&N8OWg|ZmaMgDf1@yrUm{Jvw%#MVR3dHSvWVW%D6`-%?6EqwEW>J{wmvD^z!g> zWZaYO9zj&SCKeq4HqUftcx5-vPF@-Z#)|(gWWa~<-~y+FoCpjG!WbQgP-Pb(HP`2@7#jB0(2Z@JWbXg%XBd5!^Sj7WOz3nm&umQTQ`jfhaVPBnv(- zC}^C8s)9li9Z96|PXr)6x>>k&46!wcu`(q^?nEAGd4wT}k*>%`K$S}f z@qo105gqvW_35c!cp#R!Od4g@PL1yv+haw1)9Lk=WI zwzL)Dh%Hi+H%loXzMw1snd>;HvlK?&k`Mkl><`AELqjQ3$GH5AvcQDN-Y( z;(3SaQVNojM+a!cD#1rp#IvMRD=`F6cu){h1)d~I)>0tEGp7*}&J|pOFKGBJBhX>iomK&BJl5^KyF(|A7ILSW3z>+cS@3`{Yn+20EMX{k zs)PU?MHL0K?lmfK%L3tYcaOGvcgJ(j1`g~o6LF8FHTCM;nNyYV2}|?dURYcV7eC!d zO;67)RO*YhS{@4%VoeuAFLH)BoK?&WZ(__^w|tIfdz_l?snr_I=^Nwqzx`#X1K*<_ zqUfmDD8yI;KDA!Hdd0bR6I&hOV^HXW5=#kLsPRuKfL->A zwjHvqfQ{u!%9U)Yxv~_`q-u4~>gmt)ksW)7#{%84{v9Ll{rD%*Ms;ZKKEw3Z=cm#a z&*m!9NS#$&?qguo`&b;N3xGz_N9)D6uT?C*Z%W%G&0i^cNNXWiJx zw52b5(&=Ee2GMM6!?d1mP26p@3duKKi%!f(D`gWKUSU0VG%T7`tker#J*|Da6Hgou z?B3g%-Z=N0UtNCVH&2X>*;}{N*4Oo7InmW!!oy1;ZDt#0LpQNBP@_h#on~OxGLPK$ z4WE$0G<@NJK`)0!LPOF7FSI()g7sR2mooA1Ig#oYKoCY#2tkl1w&BI%?%A8;K~1;4 zM%`oNy;`-iGuRQwX0YXKrquEzlN*y&ZF*+<;YT0F%L9i?VZtO{m=c8xn;2r$KGqqx z0|8hVs+BLzW)c_Up^z4gc)6s zl~#NhYRD##oxQ4wYztX|&`&Ej7f5XWq>WTzAwqE0a$bZ2W83{Z$>NY^fYc#^YDk1V zQi#WN%BEZrLa6qI3HVb0L{kI^EmGX0swfkbWQ7)>T}*1gAXOC^0U}AlREB7=<^Yl< z5!z#1)x{N!IG{`YL~tbo)e|*@1mg%HN+SqL6wswXL8uXKapIZK@?ayro`M&Llc{9H zKd~r@Fd##)LQ+mH14*G=i0I^gtBRQp&NUFFJMF2`a3v|iBPb~dkc6-xKgNnS@^B^Kl13t%$9-b~$=kNH z?oB&Ru2>y1;0t$FT8&DxX+>JGr=BV;Z{)L|>DfBAKjJv2D!5X-6)L8F)Zm%vX4(vv z6W!q>N1~4&3qNwmx3#ZU%uj#zad~m6|KRRczPPx&T(Qh^D{D6|jZZhU4eV)*1>H5h zhSkVx4UYlO)56N`r~pX8rb2uTfEgpfK(&IE*6VsM{o(14dt!-wTegIwATv4)_3kGBy%mNR>bK3>UzCY@;DK{*U@M0PF}lN?Cg%1m~y>RSzYzyb0$1* zY!$@i*fGSeUz-eU^SlB@=E#5*PE9kp}E;urEJyfoO`5uYnU6awF;K5KYY0JPyRE{*r;RL5yRZ& zG_L>bCkt=P)LNG?-e$gHRcJ zPWg;h$gi1ZHJi0+#i*z0uQ^x@2Nj)Y?INMbC`u}flzWLP@MUP=H(+(F=INJ)sHuDM z;DQZhUwWZy_pbEB#M+y0)XRmwQ22JabnV*ZgNOEE+j7&wJQ=<|!AiG4cEGfic z0BQ0Bf&jsYEHoh+&7~;wOj2@i;2HtBw0S5YzLW!mL3zWVSDOYc2Ks_dg51ni5CJL* zKpLnZ2sE+#s7nwj%6zJzA*iGqr=nE8DqE2h$p}eY_|`z;a7J|du?TnMqXZ%bBAD%D zgc}qtAc?e+uz7l*EWn)AFh|7>$0}G;-D%j{ws$`NP0<}8Q$6T-S32+epDaqYQfRR z*shIFN~5J(ZtlI`b?n{U_1Mwy?)}^T?7x_a_03(m6&)PfcJlE+BJA;&8h37mmX<;r zd1rE_ftf^3#je9K#~UmxUGK&2r`WTJ&ZDORS34VwdH3xK@7SqZc4c9D?ee*Ldc${P zJoLz8!B`ltFZ4Y-TRXNU)9cL-PI(Gt!&CF;Q>Alf>OsAugt`E?}-~z zH*fspU;XRF*_o41J#Gj5wT3f0JAeAa(@t{b#I})x9pUEX%f5|bpvGRcIG4$Oc+Ct4 zebH{s7x09K@kuq`X?~#zz9-dYVABHksRh0;$DMsKJAA3q?21vbIC91sj$58l+t_ENY1msW!a;zs}q6^pOx(b`K510V9oFd!i5 zMTw(JDx{5zG(aK>9X2`<6iR+-l?&jJEn^6cv;5d}DWQQv7@&i?xV+R^5f%qd{1AEV z08H`1Km+$6BvOcrM517%2FaPgX)+|E_#vdYQ(l0HX^2j<5L0Xj5kOzXAcF1`51|c1 zFcbK&Lp5knk%dgCA#DI+(vX4&BHNT`RLL;nOC*M)>Fx30JrfmEF`n=PP2nw!D1$(N zusjYSjY0uQYzN1f{wF9=6q*)d2rK9yl*t&dE`L&{yr6)1d1_GH#2S(USj7W?gd-5` zK{MhYI$0S$>Sh3IlNT!(1g`q`@9BEsiPcQLIK2_V^5d*@C=;l= z8r;E>Zl^-g>h`hjr%uMc`jXk*U9aTQGZQyI`3S534fYRc)k-E`82|Xp^>S&c=}CLd z3iijeu^J;+p+rsQ>JEnBQ4yLx3;T^?8A&VygPAfllu6ydmZr@{u~5uZ zran2{d*)23RS7#aqfoVqxqwp%)cO6t94M($s4+>#7wUiIJHhY$Q6pwd-@S43>}S{| zwhumQwV?GUv|8=VTfcp*tE+R@SnT-YyGF)_C+EyqG|=CzH!HPk;}gGpHIm76aF0@N zu;JhfRBY^t&0c-F5o+mNo6w6`Ol{GMeyg%)-`0QpBV*4le4EFTRo8`0&Hk zYga-WYt2-0FdoAvy1r_;S;)jRPi}U`n7Ctk8&Dt5Iv6R(t`2MyrG~bj$k}LMK1@~D zYnrd(59H&Kz(f1{{@|O|f&E%{M=KC);VXh%J~sPQ_BXF(U;UM~uxM6l$OtyZUq0OS z#jXFOOx00Pl({*U@P&icXBu8RG&Ri^4*Md(>*KdNIuhHCpBUY~W$EID%NH*ku&q#| zb@%GE*Oq2y?_M`;U)^yEseFEU?MQFp1Xji$pQzlNiWKo-G0Oy|Z{@BpWrCNw2m71B znC^>Xv3D*;N-59~ZyuW#cn~ZgQ)O7FrN@>pIq3qRkfUbOFJsq_%EzuAUI{!D_U-uH z>!0bc@u3~HkdQD6`+pvEHN{3UCQ2vFbuz?9!jw7GBmfYQV|2=EKm@%M`h-kkI!UU} z2@#?P0oTU$UeT=cmLO!p1pY`;{6fMj3b-msIp0OWvmyhMEfDn~q$JVLLOgV#;~@c> zM3QAPKB8sQ4q%X(8iy2@jBrASSYjiRB?vW;B&du|jXWqB=(D|1%tcauJU|QuEg>=o zAY}nE%|pgChO|XE3qEBgNtF|#91(CYz$ys_6BB_xN#ZA>f)qsrD8&+bz*Iq@%f|r8 zR@X}PqBL_09b!nzrH_n-#VIGisW+`dVmOh42+6au4Os}3 z$~!S6m zv9vOVg-6Uyd3Hs|-co(-r*Ebfa#4JJh|dI3 zzBNz9YZt;@*3-}QfB&2MXkU79CUfrH+4E=p!ASq`@TrgAfA_a4NzmMfIKHBY@#V~sb=Rs+E*idDd}P_Qax%$7Gy)2!9t&e5C4+!5V_Y2$vU z>A9KQFsfzCG@|uN+^O3QtWb{W8I)UcgFO&RGPZtg1^xa#W8Ort-YC`TjqZ`L!7W?5 z`ulx>0JyaaT>bQ^lOIU z!3>rbUJYPb$pF^D^ypZyrW%gcV&RtU+kh+om8XrvhZm-&(u+%5A3hv>=_T)HXHye5 zlmGWWAO8Bw4}a(D*rPUg_S4jjn?a1)w=i`@uX}aOGHSvyrdICn>-gh8ioNvpdN63) zmUo~x{m+(G-+R|ruEm~x1{soj=dI!=r@Ry6Jw@(Og;oLoGB+KnVp}CtN~n)!n^TA! zJPv5yqNNu*6RpAFz@fuio_fN+Z}-Z=qFyT|f4mJBh>DQWrGK#8q!LX!es?0co>1OTPr9;Y6&)pXM7`PW`uJNxO5zx()LEyM8ybIszpnN;tm*iAswL*9YC9xK7Ut#Gil+&nfdaNk?Nb=;)}qAs&*cl}wk zY2vFvMMNnVft8IRfTOQwkIjln?+u+cTmq62NY+%^MnF|Ot1*Dt!HY{me*iQPq0$AJ z^btXC#%&G&g`m(Eq6Ahgf+CMQCUYDbJRv{)OV@WN2XP~W4Z{=>4+J7LeHhhxKrj&& z($QDC=V~D2KFL59N=olWn2UJ8aZP|EVk#dFVbMXzP&&#^7SvN@btR@0A}<{xWhsTp zFnnUMl2RXt6pS%RSWuE1-&hMtnrjkU)kOBuzm%fbSL`+Dimc_=xH_F|Gksl-;42b^$ry?M!M>cV`dY&_%wi4Y;w znMgh9h%gOzgyIkQyrZ+v05POy;Rexe{;@zYjY^9sDq{((1ml_HND)6(H>JEtteBYE zlMq1U8G^?BTo}RKJUu`bKyksSI>tvVf25;XEjU`UY8a8nj+N$@3U7RBmbg|q*7cy{ zt{aW+?&$GjT7TF4xla~vOoT%=+~u2hZcSz~7gkeO=N5Bbt>E`nHKPEsY{9XlOUqLQNvBaQ=i@DZhpt5- zuasgGP|R>wm4c2Wi)m9U=hn}h>O8RB-`~Caz`;hX=G4liOgf*<2fDiK&cxP-cHjJ) zpDq91yCwLtIW$ntS`$U_b z!$>ox@ziy*X#49}$g;0Hn@l!366VOL*3p4|sj7vn*_r4(e0bx{-(fA9=FM9kvr%1N z)>hWz)rP;0*Q=@>p}MpbZOA49M#8+3lCD>LW+fh}jSdHoAB*nW7ud1W7#?m}zLk$Y z+*n*a;CSQv_v?NvZ{x)mzDr=E}(08$fFHeA%ZiQr(I*bAZDk@Mk1SCuhY&jQ*rYIsPZGEzJHio!Tm^tB z>IT=g47j4}rU(i_R8f?RS_sgptD3C;#N^qln^CcTs9)RC_z=){K#98;T5!agG36C zGj4@0Wh89^h@o+n1VnJqO>UU7c|3p?knGh_95gJ;7m7RBA_x=FhlV?!eP(`QE`4j> zTZQlLF*tKt)1pyhu(w#sOn&@cK#Pt&aWX#IH}SKdzkBwx+okdv+;iKkV{98EHk^>m zh1DAvVU_Pj>s2friB%<0kT4s|v}_xTc~>eG02qeB(v3lB%$C7AftcXlXw+FPQ1ZR2 z4X5n!B$L$0AYnCsQNu}497M4~q z*W$?6UL4*%>Ni^U#_H{=S~xvF*ugw`V>$?T>W@wvJ-b4$O>P@R}w+4hAJwbT$j>;MFj(LQc6> zidPc*ph}5sPgeZ{7vx?Bnps- zl>UJyj#Kg;Ez59!Kh2DEHbtzDGQKCICCvKlIOSRuN1;^C6$)t8AvsCnPYDIaobpFU zhKC44QIyK!iHaOjzuPVv^%n|^<(mf19_Ala<M+IA}ujD z*+}M)G)PH~C>7+5qT&wTq^&?H1yt6wf!^*Td-rrFIzqu9-ZNLK)s4oK$ zwT*NG1{bQrQB>gT0qUjVSt>{jBtf1#Pl;;uh=nn2Ch4DRPVMBq1`^x@#Y{?uOIWB0 zMQRDbX*rf2TsRQSDgMkrDGDN)l1Fl~ZEgSyf?O0aJR31UZmJML5TGmMHhpGs+lrzv zfGIKxnc^qe!Dmsv^&xfOg9eMRs4sUcM`Q(BfN9GhL19Ql;R_IwZkOLLNKXJs5Y@?q ze~e*JNK#Pt;=B=aOHHP1lodZ=q4>AuP(*0~m#(0zVSDC?6e=pkFESLT_L+n>j|a#C zY(kjl%x)}|66nAOi}m70)nB%E?1(*eaxL>#ej$l(alKy6g94Ju|-ppu}eQA4+A3|K-@@N^A*mJ~@; zXan9dTf;imrNnG$y6-6FXi89$;hr{Ans=hv9Q9~pmf>sG?Pe2;wCHF9q#eOGzHOwwB@b#xDgEK|#7OINP=W~SlrL;4`x0*9)glS?P2H(_ord@TCqjVamT3%jsj}fwo7h zi&bJUAJeF}YIs|L&7KN|uQj?oeBz1dQfUZMe29<+9qO+3d%lkrxt=Y(gauFR;u(VOgEzNv#X?q7g zPu6{*E|1;i@nRVp?6rm2Q7pTg$EF4DQwzvc8L5PUXw|_hRN$bd(nG~P8crc6uj(Wygcwa+y2bP(7(^;+t_-fr9d6k!AYLlJD;Am2 zsq`K>u=g+j>>mM=q;LqNg60h)iOB&Nyk^A!jN`zYyfr!f>7~mTZ{Dob>f+83kKB0x zM-bILa4}bonf$nY+ z!r}G&v%mhEU%m4_9YVQPej5{{jpJuoAdXbpMcgV$qL_%G>qaSIK%NlflLWmv1UUet z6ycd7a=;aFLXVv<5det{!HKZoLrnYRp2%M>eVt4#Ln)V4IH7 zcf|1(C@vI9CRh_rfioj$Zcw4ZGRp%u1Q%)wQrNI}b@QIW@L5x!$Qh_Gfylx*qKdgG zju1lxr-(3tsVK-0j${zQLQju@z_6*}3{XCTFn3s7L{6jt&>aaUBGL)M#}-hed`PAE zX1(y zFRU(?-uuK(mV8)1&{OxOlFsev;MT1>pLyx@tG~K<^;*}?vCh$LV};^{<@Hz~*wNFI zFITGdOub&MV?dULj|b+g!>h+U865D-vAT@%&f$ovZ=uop;Hw`LQ4D$GPpTPiFsBBi z#6H~&`-0($9lV{-R?4MV!_%#MF;m-YaxoJ$Tb#~K}aOh1%qDX6*y5Rdkp`;NcT6sp>5mZIeq%d>+d#CePGYr>Da%gb8P$m=boQ<^$k6j_2qNk<@u#I zf4BVJ2Zg!WjeKGF(G%Oh|9yMwD3;J^WmZzZeeKpyf2tcAmMX{2uh%|!Pn($<4Tkem zQ!9V_lhp5ji(&ra%v2(sjOEG}Y{1Hn8sEf-I2ug6=s zp#u+fzxcJl;iGy_JiRb;`;FK4KKVq~@ZfyFf8(9^20D8>jvU26^+K~=#M1Tks@cL` zv+44gGx_&UnaLEE?~!&(Wf9L{?R6X*pCKR{@ZJMufejJb3=ZEQ70(YMp2+6qx;EH+ z3c1GTGR|)T0O#0P8>!rfA7;;ANJhhfy}NgP_ZzY9u0|}Jo}ARD=gkJb9gwC71NI)Q zeq-hPdy8AQF?p0@J}XUC?`V3F;H_*E2Yx0a>}hV8Ei4= znkwa`Bc~@p2skx(^ykENAtV*n^&bV5)t;Uso(YH!H-K;q0aUdC;xZ%N;|co%BLgzx zt~mXNou7K-;eYbI?_M6i^*{fg|NO?CNjRGHW0b?e0R$zts~md`u##;u=z>r>_#%*s z0?9x97kWjAp{i6s`D_%2Q+(t?aMxA>O4rcxnf=|}UsNF+3{gvJD~GZYNQyNTb=RwM z%|cU=GnoTOymR_%G#g%<(2kUcd505`gf>Yj$B?&Fh^b;>krU7`g`4Gq-$n&PuV?4z z=zsl#?>+O_F&|$SeCfbFUSNB|ZsgwW+rIn43;*WVul?$s_cqcgaG?~;OE<_&rEQd4 zG^9w1TSQASbOE8K!Xagf>k@(9Gy%$#__NR#qB8qn4k{;BS9yn^@*)KSQ1S<|fP(~5 zL~#Qcc64GEWfTIa2y$UatVQDknmh!KGAS^?(AZ!INQ9J5!bpY-#hStowkLBE{d|5I zO~O(oq(9e#SftOd0^C&Ik}Zk2^#)MHQzn(O%2-4~3`#|50HGdoh)s3a4=Vbso{Uq> zScJe%i6}LIvI1Qa7(fQ7R7wSX)MF71Kvc>n_=2^0dcZA!Srmrf4s@go#fIH7wr}hE z_8-hviph^I)Hf<|Z`Dezq<-^j6sN?=N5A#o{v|zp!n1%)3nK4bsQ8qT{kev28)Daf%$-G z>0V#nYn(3>Z>BRx1Hs+FaH(7vYB~{lRMs4<`pB*cv)-{!YOPYKZEQ5w*1VaFAEOe* zT>bi`^>b&}Kl#`%aDuo!GYRkNnvWhaW%Qnw!7#`ftzAPvfB^eQUh0 z=?z&{$3sW9{pioFhYv5!PNrukx9-~>|IT+p%gfk)$b0tG$O|t#ee%ikAADF@Uexl1 zcqH7Mn=NOv;aV+d;QLNgH@x1^8k$knv0kK(4}9_Ust0TAR4Z5o64!Khq}AOUfB5jo zGf(^W?7+G^rSyuwRral|cR&)2Eg9G3EW~1I%`su%2dE@Q);!2EdE}u&Ph9!DRerscN zEV+Fwvt`&jIIwH~;r`ws?AD8SJL@Y;%QMp#$FFuZyLUzG46%u^@>c_$N13UQ#3^If%ywI7wyo7Y~Ds3Hc8>(2yM3v-^Mi zZ~o$+{vZF>wTU}mkE$!8QZn*oiz0pwjX+lfC}`M~V4^8qOr$8$=>$_=VzFltB9x58 zquutQb#8Da;v1A;eykiLWhSZjnZkcrV3GazAQKj`B*hT3pLn?qm!EIyxU;WDT%0}+mWT4WpYZYhuR`UPZ zC|){i9^C2JcFCiy*D9Efykpyrve(F5zTC(c;Cy3cT)4BEVLIGdiLdgwQxE3AV0m_I z#Kc+eP1D3gc$7apYon64faPFf2xjbH?u%)bDsb94Exy`lV6hpmPb&c!JGx?XqJiE> zJ{#IddP+sRh57fGuz}4%o3&P>?6ivYO6A7Y%GyfjZ%0Fkcs-jbFV1?>sX)C3C$mt; z7(Cj?YHzJ(UAvmSeRmF{@^CwA72VWBJ9mt}^39T0-&k2HuB~E4#g=8SP0!i^-|nwI zYp$*qPoHhxys`Y_A9ug_M6g=w^)!pOZ=;3kZPa~u(r_B(^^M&8e02BDnep-J#@fJ^ z0bf_&-XH$y)ZhMeu7jvO!N7jjg9=wbRm-p?B3RQ;t4F2-ogU#ruX(wf0;UUc4%}*VqhSg&Svl2 z={b2Kwr}?nU7b_sFC`b2`VJfz=qR^@LitoQy{NR(wdK$A?e6Tp@9Ad`Nzf-p{ z#D({x8aBZ~!-CvF|A7T9kyB_5)awz1@yY~o@Y*q9NgmEX3bz_Q4`BO+wLamOV<)Yd z+4a}o-dJ2r-@G0#mi*0DmG3lA3>p~J$F>02(Kb6cRNS)7+O}=?(L>#dE*sfk8@kca z-P65g>(&pP`uN8yemgkaIhejNS-g1JZ$fd~+oj_}Rcw?i4HVku&12I7_n!ssIquTQ zLVothIJup%_z>)wS*hGkm{pOX41^46eCYrmu{gPtGg>quC`1@?b40RKsd#d(($0g5~MJqD*7~Bi6-JomMRA1s#u_@{q_sb z;;n_y_|ge8k&30VX&RX6{-p$uCmITU>$$H?&d$I4=^4ye601T+VFfYRWRd}O6-G)R z-0=xfNlFm>E9r#1JZ{liVs$~KdH563;*c{{?9GfMGT|6-58N{+#5_uMoW;F%<7p5j zsbG-=apX|M5tJ+!A{2n$t>Py9+F_Rp!0(ZCg(8IfBuPjsLy$5#QUt}7s8Tu^O%ZvK z7e&;P_ux-52oV$~K}Mv+xCuzXEwh`%K|+zm6~$EOGJ?2dKnQBbd!dIUg~limO^T_A zMry=!2iGeL6SjW9yC^z7OqjbUPLz{+2Qoi*U70w@?Y_hEVo7B=TB4yhb$qFHRK@ELVqMX%k+6%&c-09H*Y7fY2= z0&^xXlLIsAxkw^gqll)(@oF`_;mKw5kf7oC@cAiT4z!x(riPUju{t|sz=V((zB#Sd z%9?F$8NyyorQ1`wKWJ|q>o|B|!0Q=YTlU3bAUyuTduGdc?CFz3#~xn2cC)-bo&NMx zE45_QDuG7T(mj}12=VEV)~kiNsin7m6WP6e`{qLcg7Cxv4;8!*%Id8`?qWj z96Ofq>7nhTW;C`mek*%sVxXrhQ79D_7IW#MXLY@qDW;d!ikV!bzt`yN-|=i>``UVK zWvM!KCw1|B=E_Cw&UB(s57#kchD`-+jO_lxfp!C{F;+c#D-tQ>GkU#Yvb{nUvHG`L z5;i@W!D2{H)oDa)HPdGlusdx>0$V{^Z zyhPDUwz+0oMW3}}csQKs(EWI3voUXq#9O-U_Y7~}JwG+Mf_3qGM~l<5OP^dHz?TF5 z0H$?m@j%Orv&G*$HZ5>}T7Zr_>J{1}$}gQXiazQR!;Fw9)+h0e6f`*bmM1Jw7{YrHW(pONk!$y}HY6aP z#sHx3CIffWsQv1M97#f*c;+Eg84ZrOuwYAo4><}%Sh`>`js#0GlgNj{3zP&PB!!pP z3xXj12O^a|P={Ga1lLAHB^ex4n3hr8RmL+~lG`u@793uMub?uT;?R1;fLA0;h)!!U zod{x2Mk*{Z7L}!`l>Wk>5Ui0Zo6whwUWipp#LU!zR5p(X+XAYrpkN}y4Z|OfR_e7{ zvx=>6utREdVI{TpKD^&>!|}H&cBveww1Qrb6{#=B6Io5Wm05FQ(cXc9)wT6fWxj#Q zE3CO3O~>H6hRGKgf;Tx#3lAO5EyvvDih5+3SkR^A_0h%Wj2D(i49^n?n+?&=M)QZY zBfXvqz8r0}mg<#!EL661t~2ShurZGT-yggGV3iki4fxmN|CjRO;_A5zgJYv+e@}WM6Qq>8pa$fgfad+KU^!u%m;l%M{@k590 zp}};$JTZCq?v)#@bUx^_wj6qB=L^sK$Hp4vGS+@c%`O%$T^^}BQNtG*9`bG5juEVk z*IO=Cu&$*C6P6a2@>ehAFPyF2xUNs$jpuTK5>~3NVHstI7zgBxi)(N@sZT%?BUhvB0i#KX}?4q|^TKr&Oy70XjY z8(KHD#!$bxcW>uIhw)+R%$skNZr=nj)(@RbrE?35gVj1V&9wr4pJAaHqJVg`(_7VQ zeL0!))^&e>f5U56#@AB8D;)v9W%=s#P~;8ZXfI#yQ$rMZvi^) zD5+|&kex4DP4?sRkE*2JX5q?WO^;AC7DrqP`RA?y`f;ElnKhLiH}8o=2FlZ7#bCFO z<`ooKmxYly5&#oNhr%F99DSrq8c>u&BN62LrQ@~VzyG__p8yEW2oso2PZTYFI28K9 z%P)QH$tS+(O?D>|SP|vag$vny5lw{%NU=F>T6vekmEz-IFTg9(#Wf~^$2k0PH3?SFfVSwPqD9SDi>L(qX5QGm#F#)IqlQZG* z)>5n@O)i3n!#@we;>1Zp3@8n#5hCS8t0)*iJ@(MS{_ZXU$^l{j`nA{p>KCsjH!{^) zjb#O`t zFsx1@2gPAJ1S1};MI}Iwu@Z()%7UfJsZbV52nk_eNvR_^xX4qAG9##n1=Mo^!s>xc zoLeMG7T`j53PkawT+9yvU=A}KF-kI#Ua=IzQWko<;yKd`R)keOP??V?s=!PU6Nvi4 zR*WGG$b>dvj8rRTF(e=u#X*QEoWn^lK0&k-QJcjOl#d$lNrnmln&lN|M&nR629(T= z0UZCRKN5t3h$B{VMI{Nz64C=G?}RRe+B_a$3oxTub;Y1nZy`DPO;vW3^ zi&w_SQxgl`YAx(>u-lG_F_}Q^UG~9Lc~m47h7>w$TW9Y|Dr3nNWZ$ zwKCR`Z(3SsPjB~7&-B`&zg%<-{r_d}y`v;Ok^{f`%KNJJ-n;SMI}8Sx!NOx5mTRy} zw_K7(iR2yiPSo+FlTLi1o}L^0Bf+j@ZJo@d+)oaz4u+-8~q}`>Y5$^@1E`- z-X77})m7h@CNeV8MMg$OTGH84%~)zQy9_xOW+KIk4Vj`jlTT(d(JWf>@axjzb$^D? zw9$;QNN06*++iCF#cVC@j?LR`xnLTOF}yH#{J5#Ew(h}w$?iLo$BuZTQB!xXHxip! znBgWV!}tWt3Oai>7EPM%NpGoV!={qvwu$2(<@E-;n3%+o~hGlu97Qs|bo@1R^BWs#aE@pFvoSuADjepC=(w*B&R4%C<5!vSgKpNcB2KwCXj)@hH+&s}gTfpY*3eWppvb~Fj)@#| zO|}2YCmjzwlybT!&RZfCgxwJSM%K`(ukoxn0i7LTLRW)xVM3;T6DrJ&N=SNnps%V)U7xx2$({h!g9(P! zq_+xmnb_46op!on#wRAzm_MCWi+G8qa4DL(hPU^p^8htxmEDbf)B|d*B6s3F$7fB(bv?#j>`=Z1=X72ApLQjBf z$7ZwfWKwK`0GdKEgDBpUM}?CxK?MxRgPFi&a@w)_$PxTJTcYtenwC0AiFdzKIZ{*z zqsWY$NX67+AyKjd%xtw_DuMY$bUIUf;FuMu0SoSe5_AM@F81_07?VDQN`|OvuKS z27-jN?i&_%N1am`y8C6YI0U?>* zUIe;&2BN59vgeK@&rHQ-@+8+aXm!caB1u&Bkc{T5XDvU{{-ug_T$pmWa1c;(gihm< zb|gS4gn2}yendjglYC?eCS{SHC-8Yz6cR8hK*iDQRtjWGOGARAP^H!D7 zW+?T-q$vRsQvp>^6qI0rsKZtn=vfNhYIA~cnzn>62dV)BB;)!^4pw}`o?8mZUI&IG8E%Ys;DQ47S z@T>-V&QoSxyQbx#{kGMs@=i-^X5!-a|8c5sAYw2qxZR=hl9b15Ol9Nf`cKau`{55f z{?e*F5130z%D3+-?dl9%xHx?InpRtFYHcX9T77+kkq_VPKY23K(`}lX@Wo5{4JDKw5d#C2V&@K9WH5}E2)V2uaLupq;R4>J{q8^}gYS`7RoFmfrbX>M-x%B4h2W8IEzl^a%NrYA?= zd2jym#a6SH)-t`ACyi`|npc?R(dD=C56}&Id|khU7#d z@X<|Xe4oi_@l_f8D-G5XgT`Kq6baOV=^^5+01A_%0)Q)d3lIX8H)DX} z2NZ4+K>8)CewAzCizo_z85jT!NPRSil_CJnt9Ni1U7Gf$#$qau8xvWIk6%Pkr4+sm zA$?n8LsMN%h2LLZR_bxNU|M3aIK~YJ$0tT6CWgkw=b11BAz_LIrd~+ilylgu?TwAA zI@+7-Yti%OwvD-kz?EBfdIpCkXXo@d_kDwAVdzl5!Z8V477rW=1?|>`x)QI~@AY!Y zHN^=2p`FZ(X~_>v8F;opdJab~+&!vo2qx(uKP!2PS3<26k4qwYJvRmiqm$`n`+vs;YcVWdW~uAR4onFvw%5cRKCS z7`*$gRIcu!gT{&yV@+Mjevfyq1M{-$uu{?rQaOBJkj955ynAD~SbGxz&Da2c35fH~P-hqs)yQnj}9aSRE z4s#ikg_Eg9mI1QdvSo7?22>ehWwx-HjJbut@VoCBc7~fbZ41U?lfy%eD>^$Kdu(E$ zzcLa^nJgD?-F|ays{i(_hYlWad0eqrWMp*c`qeAu=)!@n70uCb==ya}Bw^toL)MU- zN-mtdYpbX*)ixVjoyIaV1}w31%&<+nlsZ=REOou?mMQQnOaaBX(@|8jm0udJ{K&6N z;KGW~q7{pPpEPS>zf=_UR!AYNgM<_uN#q#-3W|hDh|b;7LDi#5uRs$>e1WP%7M^A? zlqdRofi=;6CGt3S7Q_xAN` z;oXZe<6=q#=R;#-7jE2q{qT`%ckZUKHXtRFB1kq0_lBC9&+XZLaPO{lot*^^Or?i+ zJbCf*%O8A%EV&49$pfhcZ5<)Lu@Sjv^M?J~w{2Uuw!XS*Nlba9IN@lte|Y5N#Y-=| z@%GHz0@$mf3c**lwf*;h@ViBQmGjqc{O{lU!P?G_=bm|TMQf|tCt!mz+uc9-jX(L< z++70d0+EmW>ZH=^PjG^kV^cH8&)~mxG%#n0Dfg+_x%q_!DZ0v7>Q-%DoWF7N|9Sq$ zNX63ZVrSCWf|%ucsX`0V$*kvRsII7ZXvg-0dvjl~HDZS){YIv)tK zM0x%2(YKBrE0j-%Mhrw^b~~K${_R^Ie_(G_MY&ENJ+1y7iN)Bo`S9eK_fMT3o19kV z)h8iUELHEsgb-yVCHuB)-nnW0?oAsjN=udkfw7pGU%1-cee~R=H$OTOOT+~eRVt_~ zB{OIs@M}*zTEzVOzkKDF?|<+wzV>Sm?cDD7>9@8UShKzG+M9p#lb<1plsr}A6XHul zRO=e?Rge+7zDx2i+Y1+4Y$NT^c^cgLHT-y-ldL6ql?6H+qpt6v1 zqVk-}j1Kl+zk02$qh)+*VsdJd<*u}yToxGt8s;_&->e|n29qsE*kSZ6*n>pa%RVG6 zlPyv9qu}Xb=w&6YX?1n=#GIa<5+)P93+~)R)dU3`n{_a67(y+)p=K^TlZeW`8W*t& zvq%OqaTIEc#>}JoNHfN+qJ3du`qh_17cS=4ZD@b?3svon)4jd!`g&LUirBzlVz4)P z`_}ZxF!xN^-CnuIH6D+EVtIvo?YfrDn@iWM8oGY%>bvg_oIhLA(dP6zJWeaOfx?vQ z9mT>vLpq*MC-i;`1It=O$*M(zP9428YbBM{j~uM}%F_$;6Ql3HIXyHwHa8Oqg`GB! zm0jU*EI2ctwmZ;&&swY#$z&{r@ZDn>AHVSPpIf}%s=d23w}YJzExHiCd@XYFT;lu% z>rj7LEb7EcC(9oU`^b=_6zkxPS&rd4 zLlG?yv?k->`M^YPe@R`9zr5V+a62cb8cfcd)!s8Vck{gu76u1>WnQP#l266UGwFlt zR;)2-u@4U$`-W{O7@^FWH@Z_=cqB4&^oqT?&S182%-P^?HfV0qcSo2Arqs67`LbK4 zz^^m~gmGUSG?<%ZK9~7jp41#oI~I|mv}gGgo}@?;x4`$-q|Nvt177-YuKI{JBFd^>syP z#Nqa&M2ZXSByXXa{zUeoWTAj5w5SnuV=x_41PD|9r9%%_mXw^ndiDIZ8$+YxDU3X* zg%WUP7v|qRagt(4D^hg2Ooi;wKt#b!bgE4`$=mim1dv02;M zxw^Cc&%gVRY z`jbyQbMPUGp!-N1rBK8^Mq%5kkQlm(WLzd6X_0!RGNtM)fqJF1s!~L}L@nr1^v9!;jnT&McaWFu^jgp`?)yWK&}px@xG24Bia|f(V#t^8nkKYub4z0^9vnS)Vf^@s_Wk=-wym5wca``#kmrGm4_#^Ui2g*`nxRJ`B7^*0g1#yV12MnBHO`tIt z4KvC>QkZ>mA{EN+=ba4MGVo^7;h}+W@Tnvy;_s1105rl{cHJ=s==9C6hnwjQGYI8TICJ!I4 zc3U)uRc_C9)WRj?H74c4(58sJ{IyJhUtJ0ar=pKeYOLT<-|3dwo32)v#uX372>N zWo%{=*ON&CY45}rxq$d9PG8g!6u{25h~9rQx#i}g^ywrR0RC>2*lK(^9o?% zCR|8IbawpFx1RgjpZsgdQjeV1yj~B?@na9{Eh^K03=BNts`j?Jsw%kZ`+_7( zb?Lnn1j^-hZCL*Y&wZ`By!^gspY{Ti_xS$(!{d|x?=N4L$|4R7vZ8Y_I^yTbvPZbN z`eQ}=@bo#PBqWlGR>P=N6Qrc3aZ;%|T{SdqQ1+-QFDt@?r#!T0*Y*wT5N3~zPhLTg zeD*xLKnT5rBm$2wfh@QvgakM76)eh1{47hJ*uM{HcM;|%A5d9&>cE4cP=p-==4H|g zEP<>L<9pGel){n;=KEt@`(n8KvI=_c=_jw=?oPoZ@U9x&n$Gs${L<&Cmrn}Xm!{ScK)~d+y6UR`?svbvef>I?5FbnUu~*cezVY-Ev=(m6)z4rt9fILU+CTs9RYb7f7cQ zP7;Zu(uEn9Fg|jeRoA`Ou~GXc_)89emzE{Zz~aOJ%J0(gRYJbis!R<90#eNa0tg$R~w0hlVZ?aNr7`Y1lcIp!JU%_B6j?d@+MPA z)6uNPa-(Rn(c1B+bi?qrLq`n|;P)!d$tnyz*uwTvJw3X}4vJdB4+E zoym9i4F;kiC^nVJIO=L`qhlzGJI}PPPOa;G;d$-i6<;7^jU{Y3Iqk|ug;ax#t{n0# zm5guzBR3L}+B*%@u%+W8i80+*p$hBg`XW!XeB z(P(Fn!)~xrGp)6@=A?yv z!NL@hUhxU?R7fbG zqmxiiYJlswP1Zm7=6zf{%rS884h_#PETD70b?xe=y1JrV*6(%i+O*;IkB-cU;))PX zk?kIIm|8x(GvS3I5vDPKp#JgBu@hpF7rIHM==w`S4pv@@n}a%1HFyk9PW}1c{KI$u z-M{s??j2EOc0^dt2jcACvGtF>^^HI%eEHVxQqTr ztKWY13oLSqD6+jhJ~eZ@zke7dOP_DcnpG@sbon=WBVT;<(8S!_3$MS4YQ8iqfu`C^ zF}=Zn^#J{CXndl3U=VUqL9sx9Z zhla6@gA!379P)WQ1hGD$qIDq1_@93GK@Qr!fAS2XJ!#YcLKo9&`ES4TTPWKUGa?`s zkE0s{!6~)h96>!{wp0;>VQSAB$6uTOZ7n^iY_&m?k1<4b)fhQ zPp?QOX?cK=lEivel3sv_4_F9ji6g;+)3W>LOo5M8vAog-gylj6Yq8lq6&yTFg#)P) zQ`x?Ku;#sQy^nTCX?3-AA%T@fyVvhIVH`_HD7ubb;|A|XQJa%W#MQWhl>)C z{N%VP7-au9-q(wX^h_#=s5_lUMTJ{OF{q+O0s4{>X~~P=BfcttdzMm`&}?pUv~fji zU1QVe^rXXYPeo#VlOwaiXqCset+uWP1(0BHbu3lxFAdbyap+C(4n2ZZDEU3){w0%&yVGc^>Q&uKkG-NoOs)jSp!m=8BsB0mWn;OR|egy)1 zwhmaqnY66K8KS~$Hj~Glaa)rNk8HmHF&@b#0%Iq7IeSoUFxgB_V_lhMvdP*+P!)>H zkXUf4K`g$g-(t{xzRNGm6!<5jK!I_WfkAj!HTy~zW3b{Kbu={)OTQCe89oFxVcDf^ ztB-Wc;;gO`;vo~aB#=2>z)2eE3p~mIBsWgujdYn;<)=nU;VFc}BPq#wmW(AAc@Rwa z*SRHuxahw94MnCw)v>NeYgczJK!6r5m>-cd{4ka%KLK6|K!h zRv2~U4^N%>n;-wIdvHj{m!Quddia0*um8njp7Oi0wGFnO96=K87t|z*oEf2Lcc4`L z{g+LJVW|osceOSvM981MeC=m%zWuc)A4AsuG04SN)+7(^*v5y2%IhB;J9hrU z^*eW?@fcMm#SzRzep6ju`s|~R6jSj4yZ=`|`pMa=*JS6^pm9j_51#w#p3R%s2`AL= z@f_N{^Thc}eIuia*s9S8&L4Mo`Un60cmIycr3T57W!rcE-Jh{NQjCWR)7q|%caEQs zQX3GuIXjjdS!RLs-4}lP&asokSM<++aPrK}yM6!7w||2(qZ}$gznsMh$CuG*i6v8l zoQk-2^X7xQb`*2r0abVoLcDk4B&S*tWvyy&ef)uapWC+wr5!yQ%M#RtE?m3$*0JMg z;;N=C(3S$xpKtf}ow;_sXJCjm%%(M~j-9)}K8Y&4s%w=(W?a1k2%QT~wQiX=3mp&o zQ?+_cNKSUnY#sNhIz44Hj!ZPCm6ta>xNrFSjsC%*y6q2q^U(g%H7mOBTv)$(D3mn}j7-t? z(#iNh|J{o6(wgcz&J#^fPuuNwpU($ho=hY#tmO52r>3T0;!)^BN-P@fj9sD{BMlGE z9(5XYW>Bm_i-w*B3fKmtMG_>kB#k7Q!Lf2n88yRcY;moBB_i?pGag`&!V3RMFs;IfcS%HX0w0-(jtIOR-$#o zHK+*rB^Rkhs!x)V3yTA8*Aj=ciJ=@iAu%fDsIJLS>9yxli9|T$@cI+8)7ikhBa`%? zI+e%pyR0Yx4z#${6!F-mJ-&2ht+}=)XfTdCXZbZOpN z&1W|lk-IOuWeWTkK!G9$sdp~Hn1M=tD{dTbnXzRUlLzT;(mUY*@Dg9?Zt|cyv)=4= zAK}SmAX5J-t%xYaLwU=6^1p+3HK&6=foU4j{X;V08Gb5ITl*c(1^@e&IFxWJ~`+NCjhh6Vyk5r>$6 z`GXhW@K8;`KFNG2^ow`iV~kbE2-$|lCO$lU2K}F+PBttZMjmw#ids^zr4B*MOYeX9 zAAbJQ{6Y}_w~icVXCM@b3QYB{(n@W}n}Cq2mfDgGrH1fCEt@(;7pShXQdQ*A9PWFr zDlh-dFFy0&_N_mE=e^fHJTg0v9X16-!9KWaCnEo10?PYW&;R7qr7M!J!rDufC>cVrqJFZVr=|*t+408ATv6L7ruO z=Fmej$1FP9&tJdr(>ISEOUSN{Q1IfdTLauv7>RuSsV9nuhA|g&aQ9A@E7P-cluMex zCmhSaKmXf*JkKUOdn0-6wZliL6GbOUpi-zhlPX&zv6M~$6OzM^>u)M{fx<+E5vTj9 zg{uOn(9}T?U#eI7o}QBwRVNwv5l8oylIf2Hyh$f*M#>=Z@fEB-QKV&$&j1BfwM#=1 z$*0X_abYzik*GB=8#eE*tte$jbH|>on!^=%{qXF3m{t=C1a95F zv&~o1)Y39JHHES}Jom!4yeHIlvptnW)NeQ0P%fV_8ZbQRVUS5=a%GkNty?ob_tlGMt4m9p+MC;UZXEvk z%cC#8U_MgDHLIrEeXc+N{e3ieIJv^MFmfi$tDq@vl~Gsv^rv+Pks7mQ!RZ3m#-_H)ii*mp+3j&y21gC({zts;xt ztq)C2-8p^=vuNIy7OT~kjV0s3P%04eWO7_Y#pOq+r>8MqKrhBP3|Yz$qLw?-t4&si zgLRP%9XYB4lk!?9hjsZpwv*jc@k&O%pEzB>b~Vp zCG4P+L%=VUN3EsJ#!#7WzP@^@tR~mk=4@=rc^z!Xa28-b9-W<@blWYR_LkK6?a?cD ztX`L=ywPNF7~IWrO7+vp{~74C%SHSzhXTU5(+#DqN^hiRDmkk#=E5l8uR_&uqI=22 zjb}j?&l4UJtS0KhxG3OMa=c|MTFgUcbpfh=L>W#`s&dDZ*n$H;FhO)d6_3=QM3@B1 zkNW55Kglt~bEfbY?|ks$+wY*REjb8KRXmNeszK2k;YtRNhqIm>V;P&CVOUXF@+DndhzY|VDj_=i*5&+g1Ow8YuC`Rh9zCP6(Hr( z|5fSW3%~!;E6g+{UO^_opsp*Y;@nYEp=6u_vLZ_ z3ydr(G{5teFJTVi`Bz`Zj-lWWV`nt%-n?OHT(ncpU%jEKm5inO$sUV`7p~tZGVWzQ zpBR61aPeYHnv`BKOQ9&S{pH);3j1P!hGGdSPi>8jx)&9Jd3R=a5yj;(ub$zeb?$uC zLopxu?XP?Zk^I%$cdqyJVv-VU*y#A>yB{!(o}{Bm&Fg51WL%L@`fkCgsOnh=CvBD_(o(3B#YlQ;!V0t{5<$F?jY=gC zsx1&jG7zp^IaRHKjFeOSWoae(NLG53~md#@Kq?55kHkEN0YWD73 zF|%;tjSp_T{ff(PoE*LrnhS1R(>Xpge&W=nIJz6z%=p;Y^_w^M?%#)bnZQB-W<8lm zB5sd{QSplj11Jqm#wIkau@*y)*lVX>GgKy%2^P6xy#y{%XAcn;tH?xviN|6r117?S zg<045=;&x7Hk?hbT)Sd+w9g6KNZ&xwf(J2Vo_86MU|VfyN2A=5O-DKUi452XyP1P4 zO;}CyHfOw{u6_SryVX2>{7fj8$|R%aT(ZJx@i>j+WVkhW*juGzWZ;UnJ78&+-E8XO<*?i*NJ zQd(V7<}ItNblK{?rDa{sqx}Qqm}R6Unt-|C+b4 z)`oSLP&7R>Jb(DeZXxpChvVIMvuJzH%vh#oN}~}j zVOSy!5a~@~6I}Qg30AW^;CPT{^)LAf5S9c? z{G`HHf)p#E4`UKfqWq`1v8m}JXV0C#e)I0o2t08tmJq1G5O5&FC?ZhhKbu2Y0`n{& zO&ol{A4BZ0Wt&&6+O~eJ&vT!x7t z=SV!pz6wU)b$poDu`GmE3`#7h#9%3(lAgJG{bp~kNc)6cpmC~oq_jxYqBX;Y6axgO67o>PEt~tE{9} zD7)gfC9af`U+E!*HJJE{lS<`BDpf@huzKa7{w42Ke#D;&Pg zeS0I5lXuTu8F(#MUSHOIyEo*jI=FM!^w`X`yZtm~Ogr}V_Ec0?Z`-!x$l(tI^YgS% z%ss|1iEc-r&izUWtUxk8(6s5%@RhLaa$6H-e$m)g69}v!))>)~q0`d3;q2L&RJW^f zmz|c51!3e|4zn|B8R+i5VocSd4=sjM5HlktHnD?=T7})n6ln}(a#5DeCS$^ayg6ga zq_`h6N2JD@#%I3dJM=jxW@M4USJwt#eSQ3mU$*2AwbfP`V&VA9C#PP1**q}hjwN75 zW3cDa`Gj@FIw95&K^zIU!=Pa#n4_5qbii{4o7i;!gkywIy_9Zi%Ovt+Lp`s(zVGr*Q zS~qPjX>2gsG36pWxgnnN?AS5#{7-}LA2tLQFyLd>&xInnfgq|%!Hc^*7%%3+k@0-S zP+sj`(OJD?r+dv>gTEX>d!n~{^6A_XL^T5&_XFI@nNeGtz`!2Vgy$3 zxBCZAUb@T$t02#isaRLZNr6IODOku5rR5Rol>7XZ5ZC|&hzN!j-t_bbp z4}zz#Em&?@8idvMXe_D(p`fi3rohIHPfsH(U&^=(i54jhI7Ua%BrO`)ln4WY+t;mI z*VTcZG-kp-RW2)83;KeLV#b!@f=3=EcrF-JCsBD5_7idwU1!InvcywSU6A2PnD)i0 zmIun9ykxZHJ}IPNcLw_Z;pe|ZQKX}}Vaw`Od$w%Gs(P89bC@nQ))sI;jQ#sx`^pEW zPO))7F061|_iM>>0Q4{a?Vkz}7O~c!VW1a1M{X4ed83={26aVsu zA93h*ejy-c=g3`TbL>bMxasM>vkkF0ivgesgDrHHSx7i;WNW$H-N8ZD9!18T`oh4d zP#SojC=$)}b{~9<)CjPcMv*B=miL@wp$K=+Q!js^;}AxCNy5K0eG~^kZMhVV}9pLGy$!H{KHRoXF(CV;h7PR$dt)`lm)<`In z3xu5MwBKNK$jUYw%B6#v7VwoDn(F*3JDNJ$+1#AFbz|=0`EV%GvSVlUGf#!=jw^k4 z+q*g|A9*OhFfsDN_ivv0$Xixsr1_pZXT#YWwZCbasp|Qo__F$AoMjV@mwMT|A z#b|Q*{7u}~5tvP!IcU~FW3wi>v7~*M3i@GW-q6d8Pp(>8ua96*)3DxSBC;h;;zt96S@oyv{&i0 z{7OGl``-F&j-Sl?IGM7U`*nVUshn8S&1Gbfrmldpe%FNhI8Zz)%1MQo+4_?8Iw_4-1Gqmxh-7;kUky(QY2}V75g6^g<$<;zg(?1RiloY`Qo|ebv+3JpV)KRd%&Z${8c0V5f{&(mirPAqG zB->&ftc{^6jj{(JWFixt1PM1LgcZVx(^+>_CsGaI3iBpat71zm5%v;K+J}Hpbpfw@ zqv!6;p5EtQe+xzb-J3Q%xMTaKRV$WS*I~BQv4s#pd=v`*u`f0EVsK3I z{Zt24;f(ddC^S_ib4*Q+e%^CJ1EI0}u$DM-?m~GXbcqut zo+eV*$XXJh?9#*%fFhxA($a$DMMxmk!lNL;k2GT`5ssx;fu+{pC76HpO>HWBK>|)K zB}lEvp?;+st3s&+g1LHEkX1vcGdr5O%DHYc~Ux;aWu7e?0=Bs9rIUuEJ>|0=bR2+ta$X{otrlYkDpkG#n7@& zMk1$Ao!+-^S7%52&8s&e;TY!`xzWvRX4MHFm|`T6)`w0uGGH2|oMRL{X?S;dV$|K? z*inkhq!P%p(QHh_qH{AdsK|>-ip7!4<`UR`N-QL-*0r0ro3-Q2$mOzOnthdb2P;Xz^RlZ@Psi`H9N?0bwTxN^IhHXl-l+*3f+B>|J z>bbFo@xf9AU)czf3aDdcR|T{2R&&M*#f%n=<%?z!^vz{WTE=7u<&EZ!_Nv|c zhAy28^xlk`tsF(2o*0{-Uuf+xyX=_pgrvX%Q8_Rj;nuCZ#pZFkO3E!}dv0)Q;mCDc zX_?XC=ZX-mtc`OGQYUJBRP}IwvtE8%roewz3KST3#iubENC#9r21A2P?)>S~zKj|& zbkO*5`gAOx)CdIU1(Zk^xw z;xk`-X{P|TK?TlBtr~VCNO3`|Uhl#xOwozV@&H_njEUr*4Jr!nT zMBiG+Q=zM>Lb6kNs`%=w5JeABk*I7KQwZpCI(gtKB9un1-0tR7fIuR>pf1S6AKx7u z>Khuy93zXekvR@t2SEDV2wwYB5Co1+qd$P}BFFB$CigAn1AO5%fF-u=uK!JW1hIT9q4L z5RBd8&br6)_h*v=_f3&bRn|ehYeq7;Q|(WAO+YD>-A9OBrImQft?$=5kNz_|V)N zZ!XM_axD~Fbuoh}X|-0YT~ohh>s&H&?C3`ZljEr;9xL0lY4Yan$$@_B`|nk3-m_OjA!Z2PKy!eO-MKy5H-{|t}HUL&mk2pA z_VNl218cIBf~giArc^kJG9>yxPHt3HLq@`A4jWA~ZpU1GOQ524)LPPGu=i``iD;_P zV$PJBt;r;Jt2*Q9EC)(OqbBckSnUn9X@^Ylou5=%`@Y4Oa$_~i9Vm)n{<{Ea@&tN;2rt&6=;$O&*tCe1S>pc{yAAfLPkqd|G`rN*~=&%39-+xcxD&vR1m(d=3-u`bs z^VHK1A1KBr4rb9Yo`^|rl$%kc^~=dWMBi@`XW{)3g#M8&JGR zy(+2-AgQK8-{MWl<`sPPMROK>^?W2X@#R(3GGV;S7vBO;MNoy~N%xi{JWFX+4M~|* zG(BMX`?F2~5rtdq&XmQ06x!q~t=_(4;o8m76PGlDt849+ez#>T9^bZc-OT*#?fxOm zjAWAW{+>P`HWr&2Ibg$m*GQZ#W-Cf4v_ORE3}{^FL%T#DMzuY%5YvxzOkQE}t-^?5 zuMj(vaT}WJ=)9v7VKGM%F;15{++L#-TY{<4NW#|8)VX!7W8lv8$uq&+Fe=p2+~E#m zk+B=sYj*B5_|elY_f^zbd_GS{N5ificV2(}#*cs8boEAcRYhWAICJNQduGZOOJk6d zn}$eF=c5Bj?|^Gp{e<3^MU>2T9}9zg#wr%ikp$<`xvU+l_8J^CYT)|Bgf6(q*BLG$ zg)p9Q?J^(ASk3N2E|uhN+RR}8)N8K>y1VV2tMjF$L*t_(sFG*%EgdagTQ~S>8|-Bj zY(TKh5u2K-Dakk5Z63R$XL4%#{8@izyUVlA=r9^%;q>TGer(*4PO&6NAtSeHA-g$N zTISiXxoYQb=ejkvwicF3=K2xOy|1~i|o+-=oL zsx+(HV5K%>|3=l`^4Bs2euXGd;5KCbl}Q`Em$l|Ma7aa+OR{??qebULE zq+lx{{J=*4xyY8tYJ2rvt^*vYW^;pdoZs^1dnUGLc;>klri65iy_oAwj zN;w5{DfKf44=m-{8Pi#8oVa)q{xTGe=^|UMK}C_X2!w=klm~(X1`zi<<~4-C53q~=MK@rqC+YKMD>Z?F>VO&)K(y1)l1w*4_ADubl_aKO>T;18RYvTrv0{ia2 zFpFHdAF8&Za&&T9%Btn(!y)!Gii|s_nSCxd{z4p85^@J6IZlw*s>(_~Ce$CF#`KWr z$|&6LE0ov(l@2Lw6hw(2$nq|fRz8H%c~njcf)o@#rJqIfmIu|;Nlds@4GuuSkennb zs7aGio&t*nk0P-W!K>jwlIVvXR95OuvKP>jlIRMUJPHFfkT(f3sZh@Xf#|#I9cklLX-?_DG z)yhj3FNqe6(de?e%`nVns$Nd>1#)h&x}v{EJjXNG7MRe6DQ(x=g#)jG_Ux= zQ@aivLd|C6=5_Dl*r9$~NbzNYse)pfx{7S(9mJ#!y?nC|Oy!`fO50gEkNQR>*d-nVDBd;P|o)p6_m znbLTyZvE!EEjvmZntk)LsGGP(hi@G{mg-v3ymgyM*)vIOc@AE^X2?KGHVNbkRW$N3 zO(SE3kwdSRpw%8LE6=vB8ZE6moi<#In8s2`Oh!aAl7{O}rqZS>TGr+CY323l=z zB`iyta@Ks-!)2(N7}1A13{NobS(a!npKs$f*XAwbJ>3(pyqOLMJtl+4VJ}N(*L(fP zCdXd;(GTuixqjf0$30#r!YwYV9vm8Ia@#i6t!SksT)D+XU^XtcVsS8+44?0{l)6f* z>hiV{t-`LEOJtB-9>taiuwO9>6c~3p7Kp)N%CDOFWhR#vt9S%82P>vd_y?Js88H~u z6yqZ)i7Jde63@j(EJ!r)qB5n8bMpY$v;64@4k1l5?-%-@X-%nepS&)XeD!!k()I5D~Q`AUqM6%pmVL_ zS9AmlTTi%-1ccJ-Oy(9nP+dC>U{uUh|v*xpp9lDCp;_7w9 zyD7XCYCxs1HmhythV{kV^#^RvE4I@x8whaLb7^REL+$K*0J)5af~5k1B75IhX=H_i z3M!X|CQ?bIfg*)aoTcRSNe7KpyOJ7{vZ*2~&h=hg9Z3n+3{DJ9*sL5|!=O6`%b*i` z8gqeg@5t!!^Oyei$3G)@b$jctf8l8q_lpcS0(A~RU$}l9g7Uf5*N>gh;)z@6^Yy16 zzkua+NGjDL4U>}5kV||XY}l8IA^C#i?7@X=HwxW}D1z2K$67^7p!y{ZKpM~@ENKWt zq%guf%OCHm3rhRPS5|dYkA&bPDc-Uz4<_TZ4I3YBUlRMO@OQaP$<{5aV)0WyefP%s zBRe|3vSanSqc^Xt>}ZXq6CWKr6-;ouQEGf_^zs$wp8dPqx`O?8`)OWSj^XNSlPJa5 zY;e8UJh7Og(Fl@tvFeT{i70QtI~sgGw+mevlf`ARVzMw14`(>|Xx3c3#iKCABsL{e z^P@vQ|GU4wW6YJ0jn~Dv%~U!Ejo4!_SLC(i{Pg@gZ%&t$G=K5Q#8Ch1|MCy3W2x1p zCGLfphR7U>7N!W7s>0=GxVBR-XyK<=>cyT7STi~$ToI~iaW3)9=g7+;W>w6v9#mp|7Kf4vqYU9Q)k=ShaYO*x8GG= z6S#8u{eS#kES;`evnCx0AA9rl^_zFBxy$yoUP^9wJ% z5;=R$76{MS9I3`~ZOfL%haYmUTdP%7Giilx-5h)GgSnb+Uv+bNdsnu$KG1!Oox{qZ zzU~vpWAi}>sHNhW$+3mk-!qLg#Ts)hJ8LjcgmK6_uE_3>36PKv7kU3LP@`DwL$YL6(^}k z>X1)i)Lg9D<=oOnY87|ip=L~ZkDNEm} zBImW0Z7oISOb5uupUPC;dIyIQ+$`0!dE&wSS8n%A%!o?8B7%mFHbPwVF_xZX)Imue zG7@Qix7WI8om~$?M9l+*D^Q$GWrw4yxoN2`hwMNz^60guBI{}OZ|X)u)Q`|vB1nZP z!ZN?;m8hx**^dP4am0!V5i#aCF+J1O+M;ShKyr2K?|=2#|9K%eG&Zixi3vbG6Lf?) z8T`oJU3%8~x2V4l4Xc(Stp+pa+c&H$Mp)m~)!Ej3yLUjs3dmr>q2>?2^;}a;&FIur z|LExW)C@;pZ}<0$lB-}`C{q!LJO~PUg-Cf-8Rc6ZKj~yz&L7;nYxAm=HI)@L6&2jX zG&nKw`~Sng*9orXT@8ygmu}v1*zD`LzGR8rdJ)n|s}@8q-?$Bu82>3|^3cxhTh^_; zbo~YbK%qQD%ww~_c4+smjjL8JwfB!v{OP$_oph@DiZJ8>dgzs=iol~Ph}4*>Bt5S1 z^(q5h%wCYj3n?VM%rb@IlMYW=73g%7h?+2M7fVFhJB(>zFQoFH?X{!>U~Dm^eHpgySf_cys03H?@yXU3lZfog;_4 z9(!y&Fy9xP+O~G(nL?C;RTK1SXzeUJy>MxW$){(z zugIH8d$6{StQ{oL>p?G{IO$Y$WMJTxU-(@{m&4E%2>1gb`}i1|DmIQs($M9WCu#EZ z5kAt_q_@!h=t0s6bbq}8uw!VGz9?NO&hkR~si?n`3R@`{t3|1UiHWg8lunTQ07dlL zMfRM)pDqV#R-3V+YBCZrR92Z=T3gp`Y&h_swYgFAm5^k(|896-X!rhyJ0JhN(PFst z;!pa|Us}C+OXDMtC*0m#T|>USG#?Gc`ugV2oE<*;k)?mo!&X9jhqbG{dfzV3&Ykf@ zd}d#P~AJZ}kO*e4og)QhJhXRlsZxO1n}XsFw?W%cTH*^%*N@9o*+M@HUy zuR0ocXSte6hKi`sIBT>mSS^@fOxHBbR5V?6R-YRU4aRc;gE7hh(|ig&Cc8OT;<39d zmV`l@4a7JdFk#4F(X6TF6)oP5KziO13p7<$YnLzCf&mNH0#IA&eA0-qPJbrmCu#*^-aPF&1Ov`qgyGdF9ghogUl5 zf*boeW>cE82GG^0+0ur@M0n=I3uc$ah8Y@*%iwD>Xxy|&4J^B53jC^2Kp1y5uIS?o zFNIM?W?y*|hL{KSqjNWFi z$lfD&`k^s-&$VLAyRL3{avJ449i_(F>fik0=kLW(PX%RV;mZyE!y^}N+*~SY-nD7t zx1asuk6wFyWPFk>TuhN|UALAs!_pmqdjNGpV{jl57X^tWZtL1L;4F7=LSrF?wtMrY zNA~Sm5=AT-iyDtmj3|u%_c^G?A4E}3acS}-wO5#4gjyoO6+TO0qEZy%^d?iTh^|^%skh=N)C$-n==EWqmrSj z`By$T{H@PF#T})3IHmi&uYQH4RPWG`LS1t^9S3%7-?ec)Ckj@!w-ODZ```WaMUJu-fIY9R!Z z;hM!6MmdqP7o#ES<3cN;sX&o46(`PLTB_4ed8i6d3iaFeS&@-Mh^10WMCI_5$UN&m($SQc#1?;98weOluDY7|D7!>N#Y@LRT96J+z!n^Lf z{QcRcfZl|V6(eZCNTcSaeHt-@VlOLe-Mf{egoD>F*LJR4)7UP8Kq&lEONFJ%^0L7Vujsit1K<|y4*a6 z$Hy}$877lv8P8EJQ;i#C4j6vgv0~g&EjPy#)=a{UqD3y_Gnz<fTaAs6X8uMv{@>XZm<(;XhY1+HDdG}6B zb@hBGn!JA7>GgO@eXU&`Q*|{9{R0a<-TsaiyRXFR_GH~&*P68}8=FBc9$FYY{?Xit z6V~yGBF_vkSs-SunMRyv&}7JH22_}LUEX&pYt zrajvO)#W}r28+vM-FHK0PY2JQh~2v3o?CFpElVurwYbd^G&{z;rLpSzXl+xk*>feP zT^kPvvs`7BO=XiTNHDGLc3RpRE4Qy-Q|k531;ZblI5#-95KX2>4GAn)F4$a&;H)d2 zGd9&aR>Y<+U$Mt>m0A{CI7tj^W;L79;AS++8eKIlHIFUIHZhfr|*n*dT|1(oS7NA`9YD5Q71G>i_tQm;UVcey6CSO^Ukes;3@$kUNP6$Hz&D zA_fOfIiFONVI!pZ_LskCx7x1UzKyNl^($69vUm5cP50gR2^<(%!C&nZU_9(cue`Ck zy{&k9748#l_0E>2p26YC+1b|mx;35c9ZgMagz9K7{nj}td;-Dn^!$8LF9n}cC}wtsICE~R*2>*kHCR!q;%aVsk7q?ny4@p@s|mu@={AHx3Z z?RQY%ET$bC9Xopd;-gE}9{aa%!~Q0=_PMMSWOi-dcyRa5A|*)(qkQtx)udQtr%?!Y zpDd%aG}REKT}i7d#Q9`Yi78GyeD>Tk4_m(0i7%kLk4^5F-$ylF9tfmHwMH_IR2KQJ*f1G){hHJ!~(OV=|j z&yJnDc=F=qWK!)R5J{;2NvBH1)U8S+-&6<=BFK_N`AaY1Pm-%z=12KRO!1WdtOrWS zV$BxfNI0G%PS^XRWTY}E5LwZW$U;!*&6RL_SWJ(MrYgEXRX4x%M zV37jSQeZ_*Mu$a=DMr${q_d@I-4h2x6EEI4d358G&unPvI(qGVb!F89yLP;D?n}c(ksf7Tna4H_p zr?F%sCuBH~isJ$OazTSxN3>3ixlDpJgwvq;jpkBx=*8-bhUN_{JIx&}4j1Yk*@X4> zO;lX`nY2BJopMnUD>yZ_O4q=g3bGTlI2<+>C|R`g%VouaLO!9!|%Km zMB$JW>Y9j-ZCh6Ff1vNfk9yvIwX&yuZhEfmz@3~B+uz(23C>SlJa6skF59-Fq^`bs%a)1DSMGlFeh|f;`H8g0n@J`NnT*M1sBWk! z*R%?%8y+ysPTJxTjs&2NAEO+0N4}yWR8=!k*3fTt_vcN6@yu{6Gn=J= zN{NtLu8dZ{+q!;D-ToaL*LAgFwex0A-`*`NlhM@51XEV4JDN$~ji<}~ zWyb32x#1ya)=(m}61s5|7T(=pG(|?n0_QK9*KekF6EhPY>;SA^H#XFloSMLNW;(>J z;q0!!ms5`r80{P_X163UQ{yjBIIyOZXI4bFq2)&kRpCGSt_w^Wyxt9+#-paqxz;hA%vfA~N#Bbd?c>(^~swK9=P zi~VxNvLif(X~VQ)F&YoT1?q+W|JZxaAjz&PJuow0zVtq`D$DyW*A|Vo=xzWFM*<{= z1c$@n7*f=%R@zV~v=ItL?Ecsv8;XfFqfo47N4p!dqDYEv$RP<5ATU6~u+fe7Xjkp3 ztGm3n>Al_WJNH#}lQYz4M#I@3s#len*Bp1xHSfIp?mf3&g|qOd4?MY*3%z1hn{Qc5JMaz9kDG+uS_-$U)HKX{YDaM-*D**J6 z#t%01{PDNGdt~1pxJ=nZA|N+n{^Gj-ty~qr!1}{?-aT{qsxte)0j0#!?eD+!_Wqqi zTdroDb{o8;;}Hc%p8^ryC$ZOSi&QF;IrY)``;(I*5SxnV>XG~kk|mU~i|lBf08|fg zTa>l}#08m&>DfPj``v&1r7x&sXi*}}h=1|rPv9+0E?)#OyeGlpA3XI@cXHtz*6+Xd z&Jxdv0SV}e-C%KTKM8{^Kj4bPCP=7+#jtL;XtOoFgtVe+RfIsCQY-O>v>w> zSS!zU?KQ9436}sq^i?c1ELIAMcqxaIG+{?$$tGKM0W+-VmY8(K0YFv_UTCt}EG%6f zt%?S0v%$FMLT4*hs@GsC;vi3WGeKK+SS$f7nlV+eKT5iDm zmh}4SeeIzm2cn0Mc=zwo{ei^%-1YZP<)>#4{l;%P+oSQZdy{8Bny_2;f95mUQg-_0 zt?K%EXkc*1CttLLyrz7nhL?cj59Y64hnwHMFMJB+aWu8)UgzYs%j>sC{ATmi#D(Vh z^_{=-+Z~6FG*dOos|k-&?`So9oF*t{Wj%fOPVCCH*!7#G2UDK)4L{ZdR!cbG zFmKfo@c9#NvUT*OBGCz5Pehum9i0P_V25TMUsyhSc_f}L;_ZT|f|ta4Uu)=<69?NH zeTn7id!wUw9!y1>n?tsuH)?Hc^!sqcX{o*zPv(oZg6>!;7hC%Vis^K6WyMjiyYW5* zm0!ba7Ym-O(#wmnb8)P2sde|P-x-LtS2e3nnB#ac!gEZZb*U7KCF6AFqv32r zaMi9CeZivBgEPJ0KHqPu+tLYFYSo-uo4Y;f2nWONklEjC_Mxfag)^4DqvoXYHY;=c zcUuF0{~8d(UD$GsGupK*WEHDgP2X~~5rYl}7tD0t~?@42je4~HCnYY z5r~HzL^!JmM^`7jkq9?4)<*w7-}^rHQ({pBmVays z2j`E<|04`mOuhfxZ+_>KCywDjpDh52&Wj}gsc-${jU#*a;2bEJ=_&)%uzE*@@tw^V zuq+2l;bBQD6AP=}cMa@l2!-I~o#kiQf9ayyp-HtO24Se0OD9=Vyg4v~`p1WWNR_7y zE=r9D62r9nB_@wWF~tsZ|F!o%`1ViVh{Z8w!?wcbKDH6_ zm7BNz$3ObF|Kbn6g0q=aF`-rX-QRM(uP8x|WIFvvU;D<7-+2!rN$uiRtxVisE+ha5 zg0@CDmPGW*@;rVSiBi^dKKCDf_+vN;{YSs`dAx^FHH#N7TlM}pB1~|sW&ipQfAZ$( z(>R=k#ejSq$0^!-XU}7c>Oc9?7qG43@!J2(&wKFB{@#U)|Hn7KHNUh%Q7I|ck18i1kGn&Kd@z*hLj>ABm z*6tThre>GMFJH1coClAc$Q27WR_C67<^)XHI}azaIFhN58@YAMYPWUu_DxTW!o_#7 zRCCvDI6bW?60%fE@bR8Yrc3B!xm+b*cG>I&oIQu34*n1;C2Uf~qQWvySj8F{;L=hD zbF^(3%2sRfr-GS|+alJ2o2@y!J0FPXPweYD za=^2DKyQId%8)e@GTAjpBoOUrU6`J;R866-9bSh%apionkk@;9x;wj@UW((CB&Xk7 zD`c~CldB`QaEkcG-P@(5IhVh2@9%%L>1wE_Uv=%nQ0x{VKpuP;hFWf-cDV+USD3a;k?^Q#RH%67Coui*PN~dHUSLp zOEz>&Y2I7OY~JDgCtvFJ1meC~s} z>8Xd<<)1BQ*4GA`Ld}gqkIU|Kxiy<-Y+j!<*IHUygXvUqW;}x@E8S7AlsaY26&&o~ zxNKXk{~^5xQUE|Xhba&H9MOUxcVScM$ri!g3kjzoJ%8&v!O*X>H zB&YyOg0e!u5P8A_Sz;cL8Af)}VY;wU7R9CjgxtEA1!#dKBO)6Hh-GSS{zvb;2ix~? z*D-jL_6J{h_3GWb#Ufsc*0CA{79>_7_q4Y@K0gX;8qJ|M;8VURhg*UEa|GPqGwTU06?Yd+foF-hLO$Gfo~kw3#fw%EE!X zgon`efAjTkB~$6Ap4^93<8rq!z_BNCab@MLGw1NG04r67`+BglT;=WF(bv_|vJs1; zemJ-A%a_y-4L~ZIHW$D7E4t!09TrGISS1jKMPdmAn3_F*;|7+jyz=bv=MEnp?Csu~ zUH&Cjm;hUk$M1}dzy87LkFH(M7mHFXvV>SPF69<=X=LON|L;Hj!Y5xmuzMH0TRy&J zlMr!3FoK&B0NCB6Kw#l>)$+m=E}%z6p(cBCz4P<@F-lZe01g7!pe#& zQGaL0)*^mn;{p^;X~Z(2i#JC8^anr0%J@yOaHFXjUDU&WI&GEEAMIZ?T<*6PmQ=SYA4U?eK z08seUM`WIHf)M^doXFePwg&zx4WMeO(~eF5%Wsuqu@`{~2UrM0;`*Fud= zhX?mer`NNU(!SlhF$*xq*He~!CbP7(+B73c<-(7|9}4+i{Bt2vp_ zs@VWsykn~?dKf0c(Yobsr0!+xktGLVpPe^Cmch2~QPp7Q?r4 z_?9_-cyqT}G_3H!!Q57}wPMxNZg;JJAoT3X=Ffdv^E+dAM#jGXfzK1{IQfEu>(~AL zFTPY;PmZ5{znG5a^U1nq?b^4`~0?e)w?rr#_jTp1L!7-9Fgq+tIB#omd|q@CEbt?yO(F zl)HM(Ix!Q>!ozwg4{!Q#1>>@AX!Z?%IMv#oYVVx&1Y>qzTz4j|)?Iss0~Aq5^-LSh<8rdaa(d*%P7AELJ}@wRAqQzpc054%3_?R;`>Zt}e{qK70E1 z#DiVYZu|VbiSsvhH8tSy0gL9tntN0f=&@Q^w=zk>Fz;&H*R}@!-Zb#Ya2NZ`xakUe z-gS8c<}X_+M=#n#2;yI*&^R_?lFLRdX#7!m^35;f0zKd=0}M&XU;@n&0&qkmDop~| zBeWt^L_i4!_apz;cfPM+nQ1aTn4VHn0T|eZ<$xiTKmhMuB^S}T5ub;TNA4fi6nRO%-gi)PHrr^cp=KZk`KfVf@mqu>?$#=dV zgqLyNJa9-;1q*wC4;{@cEPVY(KZUm(C>B|;7e^zGsL&R@7W z@(euF_4EYbiUM1iyrhiz{v^DKrPFx!d-uXcoV7&eVRREG-ym2#ED9R)~OBuuA?8y{O zaoPyNnOc+vE-^`E{i)?C6as&nhCDD3gH-${KC=}eDFcHN5HtZ$1lT!^=WA6$QlbgN zh6W1KS{YE!07^2F2RU|R);4KB*6T@N``XrkXh511M**>S;M4;SMZB=Nae8Xrjn|kb zk6i!h`(qbBI^5iLV&}ehZ(L~%`1cGApfAKT@Sunl+C|JF_jUItmezF~WQy}RF>78a z!)Z(vljypoh-r4Xc*i64UBbj;F+5&&= zxcf-|rh_s(7h~l;&VY5meY=Gd@bJo#3HTg`4>f+_H$6`s)mo#4^`*J{Ba`pF z_a{O}4r3pHC)(Qg(kIS;?Hl*+jRu;d!!N(e3;;Z*=&E2>%cHwNQlq)5LUge)7T3UJG`$xeh+*XlTqXlw$F;mMbP|b$dgjx3LMOHqFlFZ{CWZ zyO_Cl%``dbNvGW)KSRtFf zbnQ9@y>%SHk;z`XeD&nfL!E6cJ~w=Ln&G~4d1?Oa*_j4cy&>R@_Ot~8flMZ!+=y4I zC7XuV58iSy=djxL_O)HRF&a13oNaAcJjF2pm!{00MzAWN{P{ zY8=^+B3T9pHKwU#-tCFOz9+99IS>+)76iX&0+5<;;eZHm62vb*hx-opB3xY@>Oof-HTAseES2B1lqs7z*< zeVEybFjDI#SfMbu;oJa=M&LgLXRj(0B8iABm(XKOp~|nMlNN+=;gmbfCwbwHs-DSa zHxdc#$|4dW$z8+(C_{qC+lyq0NHQ18C==x)oCFnZ#fo8EOoHfUa9HQ|@*+a7rvnj$>l6Cn1y1!2tye0&?Ig2FF&EaVe%DDkh)t0^V%K8wos$ zpiodWywT&4CYjA*Zd#R@x&Q;!qgVh+k4wZCiA2grZBt}tDV4cHF+`gz0MP^+A?m~^ z5^4!v(n6sKb|%zKcqq-6U@8!vC?WyAg`=dBA}^IIK^5miv}lwRg)h?q3`hzg3{@2T z0VLnd+&4V3ew6l_>0SZ z1BZ71)~A1d_uB1+*_y+C=F;WM*KQSSW@jk+%*p45yW2+2pVi>q9L73s6Fj1`hW+bU zS5vHVETYpG^fzoWvBFabtoFJ?!@&*Cx^63oq3@`hF+StW2y@kPaR0&2edgueVR!te zKghiMZXlVqa`7~KrRom2+3}A(gbUo&i_ooJw^gMWbFk`${Sm7>A9W?7J$}LQ3LHUZ z=#<^;cDvwYr-bSMx~Yu)_wY~*4~`Z~$y7_)^~&zOO@HtQ-j`pjHv~0Zt1K-|{Ku~? z{N!h?zScxMmBen`15b3m{Cw+<9cwpkqc8e9+TGDcoTgDuCN{<=$1h%-zHv3ZIQwgO179#0-Mc5$+igiD z*U$cZ<%u-OJPy_CDT}sjwxqm1YiD1nclW5%bG2Z)lPt_<UOsjD>QCM}lS=36)A1& z>p058F6$&MrJ6ZkERBxcI{oI4{j0OD1RRy0f2f-?ZJ#(0eEvDh&|y<#huIc^PaxXv zY#gd)w`bfRZ{6GBU!w+YkKS5dS=yX&S7s0f8d*@zafenr&1sHRGG3vD($bKLceGbF zRRGaAqltkAY``(bbl$%O1|&BP9vS**j39-aIC8^4B?V<;a;Rev$-u@B%?eN#9LhmT zz$6c(3v(tbQtU-S7FcqDGCggH?M_&XrsRbHP~f|j4-`Zvys)WZI;T`DlrTRE;b4Fu znT3!KfJq&f$RLjh$Rc|o3Ce(%B3SB}=bl-}Q!%7Z15}6z3{r@tWMl~ubpeV*T2`I7#HzFCh$O9cj@xyk38cHTpR1W1KZS6?icFcnWf|@Lc_8*vft+FFkG2m1&NWsr~6`NEoFyl+uipo)) zjZ(MSd{%dZKiJydzI)H!XAkW4Y30J@3+4Ow?ZqP2sRN9Vs!@yJ2tF25ozWML;78WWts@5G&t$T-kV3#Ej zF50-d8mCuzeL>CXsyba*3}f^A*HRhN)O2)ssO7{7Qwh_`=4vsYo|u_>@6_1!>ubq) z#evroJxQGLj5Crv?ux~pvD+6ghDDo#rLuc{WAWTap6-t3m!5aGG!A|KQwQ5U4(x@kKN^5^f;q^eH*!)J07!| z$}TLqg7-{3rD1^+XBV)dy#n{2Xc;-1I~!?m9y$`vlM z2VV1HgEHR{veL0%TE~f3HgCX`N!op0tJQ8OIRttnKBZPqQ{=>;$fdSD zLqbDtdF&urTp}R8#e`>TP_{gBs3tyY2oSze4}wVD$n&FcCKV~Hl9olG5~bt@A60UB z6GVB)lQgJq;);5KO+tc-UlJqWCM9M`l0tu+iipLkQ4beVL<&LDBAC#j?u0S8kuJf6 z;#Ro{z!d3TMjIeoQ2_Hc`=8V)=!yKuU@uiqWRgV2AcU~+UnRY1 z`;S6$!_m`y@Cz@0l==SYAAk3mFaFNa!QCHRA88H*UOaj7jrZP<;fS7cF%?_0V8I<+ z!PIJ4dzMTl(e|(a4|fWjjEBirp6`TB&7U_w`v#<`~Z?bZND~mS8Lne z!JWqr9Nf{|K6Oes;F@ojxmCOOrASenH=}$vkg_8 zfr`?Yvv>pPcBdnaD;+)SO<2nwy||vbdv9)|uBEFu1Q+_{+xq|TjX(R!XI~!P{bZ?_ zo0wkc-?8J&g=_D;^(I{6;sxeAAD)kAt3j{5EoA@7r}uRQtm9+Tc)40Amf^1xCmy9^ ziJ(7#lfki-sDMMD)>gw2xER*pnX{*}F^BVG>-Lgvzn4taLV>o!N0JvV*kT(tli7*& zGh8o&ml-B3fWpB}aSU|LZQf%~cf9a|^XO45nhK5Fxcl|5txP?rZKM_#;v<(n?r!gN z_rj$NHIG`vLaJgud;9ve8<#G>yrb8zdE=RyJ65k`*An%Q(XQ-RA9TQHc47O27Y;h9 zm+c|$S2XhNhw1ZEO>0G(`PkYjK&og{@Z23o+A1&jc6N5zcp?syT5$Q)w< zBx8$0WClN*Tu4LU$(lo^#As&#AA>nlkR&#`l3G$|!@$H*QWAwCFo!V6YlPrb05SNS!l-bd_)0LT9OMCpqVXHmO2LW5xP)nq zN_0~`5JL(nN-}>G5%m6+JY_AH@^S{Nhu&x5FwysGDrOxM93G3 z)V08pj|4WQAtjY2a4aK|*vKgXZ?8xfDh6RCDY>f;-2H*q~G9nJ+q^mx{NUF*xg+eC|H6|)Bn_W(q+9n%MrLYW%8OBAX2$C&+NmTty z0$Vc3icq8|d1S958cTQ28eZo9lrmqVMrF_KFa+B$Z)yuOw7HGd>jC>0Z#++OShraT5!oP=68yEI408|-LlKd^i6tDk)N*xp^iVk&;+qu8mp z^5@UGmY0IXBK*l%Wx7Xtw;?5j<4}QKz_!iCPjO{aX&nw6je$WDxB8TU${*md18rV{ ztHxM9&tpvu4R5m<$NW%Wc@DrZf)TT9cbMBcTtmZJIEdY~U=FuAI5-xY={ue{*!0wq zx($a1VdSosS61dPoO|%mhtnh1cx)<8{tku;flxjaiP@bQtOoH0J#II)0Tj}i`PsRt z*_i^?6O~ILk2_E<*O%7orK+c?rHmtLzy00XJEuHz^T9%qrzx501e9;c@+w}2gu-FShOJy!$ATB& zZkHD?LhCj7bhj+6udgQ3L0{m+@SrP~Dz7eA5(%7N>ktiNB7=h`?hv|`x7qFe!;zO> zwhZrrQ+c!;Yo)Yy|9)(K0h?-*X7gG)Q@}y0m~!{HOEq{QDz0s;-MKyT(YvRbb=xaL z!;br7rQ4(4Oi@RznB1~?TYGgza=NKle@rp#w*CHY=mXH6Cio7Wo!o){Rg+)9@s0gWb zC63@TnfDCj6M(G(cQithsuD{9GEEwdBpZ032N-ZbnK+eAJQ89yfq^8CEPThn0wRSp z4Ioja2+o%`20x+-gd#=i#2^j>io3`nR0t*Fl8zLd_ypuPZ}qHIg+}Jc73qxX*%XGf z$OK|45d2VBA%>7p7AcJKfiC4y%na#N;YfrT29hEna!@Q0j!ILrL@29kxgDq6lq-|=6$?(dT7?r5G;sZmW6f{F#|6mol|l%5GcLT~&WW-C~97dyXZV zt*U8>bUuVfAx9`1TZ#HTE6a;(rA$jlw>K2>SIYUdjrqHGoFlh8gMq@>L^z)ERm#|# zTgDbrt92t7sP_%5Mmq27!CO`PwUyj*sg}UGS=gHZspUSvaRe*M&DMMc+i5n=U%Quu z_AI7LS8q%%$Kb=DZgrTgc5Fl_rr~>_kc~CxBZ1ke+1`$5xl~wO$(mdaZ0N#jnOHnw zb2>u7U@DcyawoWb!?Ht<+fywU0&e?`*2v^i+T(Oj-ybvG9&u+90UP!Nz=Nk5t7;%j zh2vcv{t|q4M|yQ-_T0IU%@Jv7#&(Fc`9(PCY;Wtzt}S;tofC=pwKHdCr>BPxJmCxl za;4(N#!6y&vDI#UdaysdzLvUv-JZ$eMnqqd=}PYQyd`LB?Cq@CJX(v#WNWCK9nkQv ztmf^EZ4LZ-G(f{0H)h_dX{c~y;^+bEfbCHYR!HRR1@6=wtRyCo49NvB$)W`Vd=Qc> z8RHarj7JzlXmc2?9AWk@qtVkM04@_j5I@35G9_77@JKqXh)silL2?5U&}7m^h7j_R zEF@C~y!_+n%b1K~BD07nc9pPGoH?yRL1;6AD2;KIyU7x{gkUCQrcFf&WQh#Zg)(d! zuCP$t1Xv{Ge1ur2}vn3{JNI57xn+40yGz9`U%=JmK01`@SM^Td;k|1H?A*`%+N!XlG-&74b zlbfu1VF=}7D`K*eNa!2tC9Hx+K*ZW?Lu6#+7=}G!+t;=R9@Bs{s>kA+L9|dff3fLy zFI=u*lWEygAA04b!g^}y-t}-(>)wu*nbF&Ium8Ct$IW)Fo>|4>X1mRd6VhOEV_&1q z>2bJSR;*ZdS}=3%(Jb6BzmbGbuBh46VRPNZo$G~}X>)wt1;2rH zIApBlFgnSQ2InJoc#V|R(pU_^0NcB?XQM|+oUhjOhWnD<^D9d)h6+H@P%r(=Os5gQxIRozrJ zFD_;Z#ir(HtX6q2dUtVVrnS9u=-4xJU;lp_5-GdiH=o>?`e-V%wi;+|$rf^cueI4~ z+7)oOFU@DJ-PC61+{H4EgT+ln!$Gra<Dc6dCVOwZE!WKUVA8 z!EFuv9ch4uyJ~SX4QN833-X4o>=pD%G+9KEicyB+51`dBL=dqwXfKG7B^CucGLz+Q zFH{hh9rlWZjLx)V1WW)y3E;F*#5kdq1BOV%H-5!F0feGTg9N6rNXUU6K>QXVnInb+ z2?{mP5IIo}3dDg%V5J=72J!?EEUw|l*b4+8Ll)Zm0N>;Si<5@ED1pf|*l4lJ$`T3y zyNI?tX(=XKya-KOR4$>xyMTg(>Wrn?3Jn7`(B+muktrZ95l9dap-fZ}(^Zv`CIO9S z6zYuRA)-+Pfj5fAQji9XH0lG0VrwdMSyZF!H+lXMsYE}9CC6GJS1F@m-hl+gQG}@! zNK7wl z@@S}T$w5w_3OLBcAmkDL!dT@ZRkaXRv&=EdMM8#tL{fR6kr2p$C3OOD!C;Hv>>Y}r z*a--;MB~&704XV@Adozrp(ROJDV8__rf7;Bs7)4Jc2%=yipm9w>XOE&nmCIl7Xu8E zCIF~2rc+crZZes2Q;QTwo;N+o?zxVq64^QoW;>qAzY;}4$xOd;+ zu055!cV+a3UW-N>qw#ERVLef^`5Yc!I2tOJ?D%MVLxd*xf7C>O-JeJnr5KW%&$xeb5JXm8ccR)i_ z$cw&!rPbwJ5xX$CbRG{K(y{&u!~LV>*zGD8^7e|R=koKD6G?BZ7!J5w!Z`7}3%>9D0n=)%v=Pghs{IF#G(CIL8TPHb z@w0j{2a`Q#bClaUt$Pp8`&)iApS+$dujK16g3C2LRM1El#YoL5l|W+bHsB&cj((Y3 z9S(xI(*WwIT8b6Z?7|vv3Z(*Gk3g@BE6GzIUK#HBoH@M_2o^ir{CF5iR&2hiA3i!m z!BEie$DIR5Xs5IBd?CNGw%ihKbUAJHe7ZU4SXwM6J-)8J`{BkvlT3I#zV-8$eA%KG zb4`_65pM!YB{&InV^i|l%Iur3YoqtVk+7|?sqLw!{cTMJnE30f&E;aF*W2ZGd2DvC z#h$B|f^f@|PIxD#@-y?cwS=!&v+*emCB)2SUC-A_i>0NvZ|Z@F!xJ$%Lz-8|?pBV) z+t;=R{vI_TOJ&Hw&{9r4&Stu+o(T zMKPuv6rFr9!YT|wB1w^7Wg{$X03o(M5F`U&{8h{mp`2g?+g?hjEH8>dCP1OE45}|s z5llrw0E8>>#ZZK4YZQaFKj?}o1s^0x1KKsH5f;o@UdL0uox_%B;t$ML`DIahA;>cnPSmsCN3o-f674+L;-@LQTs@M z;wS??{N@9Il7b0>K?w{1))r7C-N=+mh3P8#G*INpKtYNcfFU9=TVC@>G1+{D7=FlJ zWJQ3L!U8DKk;S&KDFKzmRs$&k08kNHs!iI0@eqo#@r@FsLZbi)fbyoQq!ik~2PJBq zjHruEiyw(nT>h|-6c2B=*&+Z=dP*2lqgv5uKtn>jn~|JQW;yt(Lx7kBwF{&ICg}FH zt%1K@189Y4esK7rnZ0nrjX||+Dud&4^i!pqC8>ub%qqJ3i-J02_O zRf#x^Y=;F_m(}F3Ro$9~h08dd2RmGoDM!An)iBSFE>+FY`6Jw`;}lg3JR!0p$;EL5 zv#=O7%hhJkf$`1z4mz!L4F&Yqesk2vFkrT!^WeaZdKK`}E=a<*LA zRZ8PT&m8)h)m+wfI8ZOUT)v@QoiDu5_8YI*0`7x0^GAR5zvWk!;XN@J4m!=%skymA zIMUG&s^+qLyV`V1wUjNn3gta6Z?A4$x_S-I8{x*r_7`64KJiSgScs2YyZMa|*QaLe z4ySG3{&H{sygzz+F?nl#Het3Wa#*oaqO@3QFQdg);W+qUxa5V~2yERLsW?EfZ)rNoHl zjUkjuQBC9*b+o0d?ZCDM{w_3N818b%=1rV^kT+ypk8B8bOLPTV8TdBt*6PPde+&WPYYu*N0>I3l0zX-E*Th+Oe0sxgESh3h)RM% z8cc$6Q=1OQ3n_NW0G`a~bGBBI=sZ5~LauZgDSb!ocQfJ+f z0_v2);|mv=2SgFIRWg(U_BkYA%( zk-!udhrdcMBB|mj6c{9oFb9Ujgp5cE87VA@tM(?Wz>fMu2Fr{Fif=|pNTjDRPMK6Q z7U{r+Qm8M*Qb2_gH3letC<1F2REa_MXgY?f2!#aFW+p0xQc*sMAsGUzDo3ugZXry` zD5xM4my`j@r#oRP2`q$qcS08OT8N-hp#Y~Klv7Gc1bM_^skg6f4g3u>fToF++&0bb z#tN2lDOs+&8iogZ4oyz2uT_^)rlKXWzHsm2nTo42J2lhU+}GOCleN43{y^6ghj#7W z6Anh2qrt9@-nMAh!}e}(CgYeKFJCx^#mX);&vYCfy92m4nXGxUR(AVp-QCUuJH5O5 zuqq}uF_ye|q55#jl`Z2WPPA=!TZb`?gFN6j5WUvQnFHS9aG|qFC#+kru7pvxed#`u z{nvc4w`_v2-(p=o#!no&q^2gA$-YN|aB{CGH+p$?;sxT-m4`U1DMVtWB)O37jUqyJK35>Y_whr5A-fA&4ysF%K*$F4GgOl7pPykva+_;^vWw;ZpZ4~QBOSPPUV_Qb!)ET zEmTtJX?T|RO#YHDfhdF8xAK*A3x(i(&+X$vlE#HbeH3d|-Z zNkMX2_$(PNTCr3ONhD!*r#3;t-piRole zPtMe^9k`*z+}INHgeOhT*^0&07VYS>Bqk=}vrC+lF=0gyhdvaT1C1&x3cvwK2AIte zA1P29rry(Xk~i`QD;nb%28)9z)|zIkYmT+V+UfJxXU2V4?BjB~2fMpX<++(+qG+mM zkqpir#K}}{k162ug#32D+g!}2#vjbhEN*NRoO^~|zPnn4E`;R=MaZl~VdSic*{ z&!y?zk>ej&^Fa$wJkEF=F77=uGv!O?7v6l!Ik#xVtCd8`4RPBSSn1K1SJKPr^q4^7tw?a zzZoG@{s?_F`%8KP%YuuL6bsiTNrprQq_NbvD{R66l9L+7YXeH42p|bUb9Mng&;W~0 zIgqP{TE-;RV8tRLS7}XXPy%Giorw$?p*bd&809mH3wnSe888ADCQ}`xDAwDS@PZ(K zB8!TWED)3|2$RtkX%PT%1&>SyS%A$1woSGJa78NEb5v$FB{E1ElhJH+in)*>008Bp zZYZ$OK(flfH)$c2w3tkNGOmOKH32lDEWBJQRT?;uls*iS$Y*unM`2QiO|Ft61k@rW zmBn^L7(oH3f?}dXkS$L+%tn@yR|1F%Bcs$pKZY9f;%AWe%ui@=iNE@qB}i$W<^)}t1rN)EW&dzKu2K$KJZS%!I=I9 zkpb^4nBa!JZmz&q)U0?WDFnRU-NTJ1o(lH$maVq6#g){9hZcv+5p4<$3btY!!9$vk?I609| z=iJ^%y}fVQ;~T44R!SCIQ~2qp_Vx|-S#`^m>o@=GwKpf{;w9**cO&? z9O@~iUS(=08Kp50uP5Wx~Vj@|+ay35oz&krrT3vzTc`FW8wW3C?H8{;DJgc&5 z)sun1dRy~)Yg@6Ut)+j!;`4;da7tOqCX(?&QO~FCL8o(ldgZ}_J8-)p+FWyawIGgU z!X9QkFYwL-DO91izqd8;>(GGsabMdQ8Jm!nrta}#g@GG;ql{Y!^PaDoBZo1Dn2U5Y zb+%G8SP5|4K~#FKG+@KNXZKc+BuZHMB_v`P3k`gdROTA!h)hT!G;9haY@sRc!a<28 zOfmL>JDH>RKtd3uG)%!CDGLpziWG>FJHliyP#i)Z3GFB2&TU zkA!G$t4kP=J7Gj;2NKi-!anb=BU_255Wu_pCtTK&RDU^XwWJ-nAZx;sphQ6%k0t;kJ3bykE@?W52_F&z z0L#s0EojU^fQc+5Aw)w)>m(^AhRC)bcd3x=ufLfF z*xt~j_^fK8EB3m{6ZYc>q51JitIOT8Yo{KGV5#>?A{Q%}Bki5OP|)Sn>!o~YV>LTI znz(jt?es^P%U3M-?)#Tk8%m|11*NuWy^3ywo+1MSn?J`b5tPCT7<OEDj%BQPUNO@{ z9ys}2`>r8#A-!<*%H+8Vi<5IDoV~hp|8lhZQn@}-DAikA_dav{g;$>K>}r{TPnc?D z&+tG#U%WLsj`xccU&bq$cVTyzA%KIf8W*J7BNZbazENrp;Iha_*EFo#mpc!(9O2+6 zkMsExPjz;7tgps$xnj9eFBS{U(XiiH?`jXboR(}RrdvzVsJ*At7jWx~v&$nR;~$(IFYJ2;TQ7$^onlxv;`vhvHNRxZ({~tjciyR<1(3WEGwQLO8DTR zs9G`MoZYo`Yd%+~mXa1r%3;q2yeYT6QYd2z6Hs_u$hd4v%}pC!J*D3MuBVRo9C$L) z*%9sPZtLsCx4*4*I+mDE#&nCxRe&4I#ZZIS;&tMzE0Yx-LGg?L#cWl(RQdMTwg&$0 zH1NoeJ31NKIy)MhH(Vc~ztK9N2|*JCL1y8L_h?RYA_$v~_iM(9CMf8bK$k?Ce6&@7 z!A4Ac!yY#Jw9&YUuR6Ix130=nCe{U)oj~vjO)>(F!JOl$pdwir(-2c~NrnIvmlLwY zAZyqqT%aLE5ha2gM3gSZRNxUu@k5XbP}Bc15P=N2BbDT(oC3^bWtK5RsND1l#Xzu&Wo>n zx#^4-bV8Gt+@v&2VgTaMbVP9wWdl&63YY{%c9fIaP@+@yL||KBBY;Tc2>nnh!V5G? zrBaAVu8*1)!SE4a2n`$-3jwKl*`Xo1tVjqa3RJo$jhVYOE4aF)APza$<)|5*s3u(xZtpvzLJwn%XH_c2$S@mpEEDCEyO3UIR zKr;N_s&8~v_F7d}QXwofu*jE~B7#(lQlm$P&dn2ycP z7iMPj4<0U`zZAcIGZ0U-lqxvi(qXY;OJvn-we|Ex4;?OV#3ze|_Mz^8*F5*&)`Pcy zsJHo>KKqH~sqy!|^`nO7L&NANUj*XhYj4~>eJ=C#iQvvblhtmGv~+#uH{p>MG}wrNUaW zsJC?Q9=Uy|uRGEJ7oPRH-)|ZpyF311;r@fzgQ<9?YPCXx!Ucv1GFlNqZuT7i zc>g!ZNpDA(2HGY84i!W~va)t)eNk|X7U<$a#z220G7S|n6GKT*DJX#{F^vo6BZZT( zNM~4tg47Cs?a0HB@W#l}7!JE^c1%ts zlBrlK$)bq#sz@@((zp^aMN-O(ON5Z>geFDjMC6~;EJ0v*)7EAR5%4cM!%YYmD*^#g zpu?`?5Dh%~!FtSOv$8h+;t-oKiZcsM%>joMNE2A;&QPH=Ao3S5VNRh)SD_GqF`-Cl5#kS%pd+xS#-t!h zawLmHcurt7B8M;pCz4Rwgyyf2&s?C%KVZO=ViOZGv*!>S-%L_O2rERBVc8 zT-X-a)Z{1^CT?7~F!wa>TT=ddS|8VDHT06i)M9bfj~Lnj^#`KCl1=b z`rmY6TK?v>g41Dd4x1X?x%kx7txHWu229Hn`CC_)?oTdRG+!nYv}x92-BHDAnHp?Q zr^dZDg<1`JRx9w@2w#mD)w$%|3=$IAS|jqAyH1}gTh7ZUU7 ziZk4j(|xxmm+nkXVqU#&2|!wy(q)srP`5am!X~F{DZdbQIR=LZ%x-6XX4aO?mg|)w zZoxHfQGkR%%a+ZarVh*QeeS_NM?wo?C7KrO$i_IuZp~qe_OJ+wY`JmsHjfN^F)F!0 zl(wzn0B5J-k8mIrA`k|NG%pBEPV9M#3ge0{dGUrfAGHBxK191uHtP%&%_BeCFKiAN(AtPww3L zl~+Fl`cn%F-~P$ZCg4P_HoOxr=JW3#%JbJAH1`UV^hb*t&1y>T*ZS^e9UH>!-FZ2oXr_IbR=->U~XbE z5eULk)I;w6u-E1fWY_J^1AARPolX0ntkiOeNs1|R9BYcFUUneZ@i1N4gQUH~T*Y)N9MsSjXOBPz)>s?!Hn4rMJO)N8 z*000sqS3k~965gL)LReUelyTJG&MipcIiZjbPq9Z?Qdn@UTO7 zuPv|a9qz}0P>J{&d}h*WE#nmd3M&gjFoJNl0?$S@jedqXr|!_LwVIZ%)Jifbz|jkr zrS9@N4j$TnaBsh_UTpB#Tf*UDp?Li0{+|A!t2f3kT)dLc+g4JUumAa*U-_-)@T8Q9 zCzs|Eg`#<2=i$AFp6#DpO#R?z^XrLoH*WiE?w+2m;eERu-pEInM=oBwn<`fFSpSo8 zIz7IfC!T+{KWbl@OTP7XEtgMbve=P~wdXLUAtC>GK`N`fd|6YrI-|FS7 zqt~uloH&2gT`3kbCT$is_`uhBl9c^}t z$FfmPULJRcd>)UZ?(mtLyjWl*D*D^D_iemw4g7T)*fQLW88X20{%+i(*;Z*n$SoRo zWw}H1cC2pgNEQGxG1geX1i=`^+qa+*g*J!W%MCo{^VTlLgW$_NFlQcwgOUK~_~RhK zA(8X5LWl+z)0hfCkjFPi5Ot9kpt;;f=%b@DL9zu(SP+Hw1^$pjm`!}n6R=QvD2?!Pbh*X>jM@;|>4+RR9WfUNpa#viD02m|)MUWHHNNsJ3Voh^2f-|#I zW0R9G+y#aV!AyzIBEc1d#q4rAmCQKUTgeQ#=7#XG{nRrC!q;5y3u{(`A-j~Af{Bz= zC~&9;VZik`aHs}_ARv}0(mCWpTEd8`q#P`*;8HG$;7)7IsUw4F{3sX&$^uXf#7Ii+ z%?wd8B=L)K3JfF^XyP+NAQTzGAZk#ea)ltNGXQEvi0xi2@-Zm0Pk|EB2_ZBE1E{Pl z(nK63Cy;a)#Ym`bN=_(2kW?~&hPFyU!B7+?vH>860E!mdAPG`Nqj&~51SKd{fj>hx zjLJtiZhviS;BTt|G%BohanyBJ-4!TS^uX}0?%BDek1kh7?;UK2cDbF|={eKfvS&T% z=2VJa_4rKY#QmvLvCd&@3rLnQCe;|V;doEihwQ*zHdHB%c&Fk9Q%J8wL zqWwE8iDUxq4o|&Zx;t7=rb`ZIrmNS~)LckzR92VD`CJVvu=hT(;EUePnfbZaZ@1QO-@danH+S;z{#2oI zZ)`f2Ea0hwt3lK3=E-R|yBz)CwAttF*z>Z}rqAEH znOR#aWwT2&cq?2i)cnAvlIk0m8^81DP~=8X+`dz=oETEN0jwM>9hf*^;an1&RS^iII;O%>pq9 zNPu#PMIbCG5p7gv$VK^R&>_hXod%{{G)QSq(8d4_h=Yj&WfCKwB?S`Yq_l>>BxmYu zZP_=FeA;9+KpLVznqsUk=KA*2dnlz|c$3KSBXk0%gADp-lAqyRMvBckJU zDA1NiF^B;@%NrNuvnZ5F2s49E5AyC;_-}qm1(1M9&ISa+0?jh9&?<-7_*ah#A|WXt z8Bz?psT<&^U*zLos4%(B>#k=Pyjs$ z1bKxD^vC@h!i1@SWrTc{KBQftKd5@4YLt~r5XD@*oe?&`A}!|N&u9$>#Z6@y^&pHy zCw%@O3M3MOydSazh*1h=(x|{6O9>Ep_5!{lK{SPFaA#RrVk(JL)T6tUcT;qvf`@9X z)S-GD7WTwL9ttWCa1udKab>qv?UiC}U)vh^FVX-S5$3ubHkZF#%$MN@BvflT`c!FY zeev3jkjJAZGXAxsJ6rK!z|yRRhGzTWXZ$CQId=EeYB|rXYtv`WP5k+vw?F$r@TsF# zr>&STm2;_5IUB&9Mqj@P8zZyvTB#V>HIz2#qnGZ~{NDbZdz)KYQ|oJMv32`OOs~?? z*3qLdpUiO(>n>O%N`?)u=n3drGC*MV9bs%^#qvCb#HJZUrsHpHes8r$L+@vp;yOTx#Y~^w3dxma)}3*&-wb= zI*vcxv}>2<@!Bh<%){}e56={Dk7#pK?tI<>A1S#)JUg;Cr~1zMUdT?1>OmPpYIvyUyUWd^P{)kJ$ogY$8Jv)9j_v|A1>tgJbV1m$!88?&N`P&M?#?|_wV`M z8}Hm3pD$I+Wh`~9S&GH_-0bSg!dy$hSvF}mMn=E;`n$1ss=ucv6bdvqHI^#Xcv3Hx z^EW2fT)~DHPaN34bHE>NxbkrJ%=KHBZrq=rUG+LW&m2GU!pY;NQgMD^=IzsGms4AkB@il zv-a_xqxDL*SGJBVOQa}D6eTeZhcm;8-P1jtGa6_#(2Yh09@2XNUe0NMzgyqyZc^SL za`cz*0q?!+%`FWZx9fAd^x(a8G-4|k%~Va$r|Jth zR8?1Y6pEH;G;`@nY;?+DbFKN(SDYQ~x6VeA8Q{W`SWKOq+5sa(+hH84 zBx@ypsig2p!X$>e0v?%)AWW%L26ke2(2fh`EkcL~;0#7@Ks@ReNRSK{p{Oh<>MBSA z_=R4QOp$rQfg}|WNyYSpmg$Au2pNJ=mmwv55tbx`2_m63Lu!aY#{|^yEb!c8N1N;G z03`VWl>V8chyTMj{$ef^k_5zo1XxH$6xBC{01QYBU=%(fDB=_uk-X@V0!Aj(MR|z8 z5f0f&-bq{XC=7B-B0@k7zg#4rnGgOS|Ltq=hlVwQxnNN6P(CEA6i^_Ni3O7pBYQG_ zC~wIZ=UXf(KH&?vF+~v3fFvNPwh1qI6xkuE$elpIK~9BkYHG3wAbZRL z05m2fxrj$wMrJa>0zj3Rut32Cq)2q+jS^MD6M`CDBoP{jA~a!CyWt~~KHyNzMimwT z2CT+C>B*lERh0nw{Ed+#7l2oV}&me`FV7O!|#aR}^0Y^dOU*hD8F{{_A1peLp|D&zi3$7dj7`w z=C;O;LkBYx6H7ljHFtL+a^q(8<40Y)wjO%=MPs!GR^g>=!UXGbtFd6T>s_9vUB0%G zZE7i=c6fX>b=|Li-dZk%-hRgrSjiMiSaGLKh_o)8;)K(BU=;&xUh7t+yI>^R6IvA8 zBbx!fRfE9TfDK6KuCOAX!~WEADT#AI_w4h(@T_OgE~CRXdF^W7xyx3#x9RF|TZ&ez zY1b1^+$)uH@mSB1qXxgLZYGe+6dWC`22ZsmQwn|XezNygc4V?N7w{J|?lQDjJv=F< zVMX55;^Tg{e24r7oN9RN6E z^To8nP>5$z@nmFESHr$tTi11W&dknTzIL;xtLuxezF5o^-Z^(G3+dgGy;-0NrfBCh~9zU>SVLrGN$>#C4goiOR=UKdKaJq&9i*KL16bMJq zv2EV6{_`(Cw-SxLfA;Ek-}qoDmW=9(*QOJOq4_|bQYrn;8y z4=!Auo14SF({q=5GbMATXv-BWMw<=0NRw&o$esGe_fPi2KhUj16#lH>v?b8=~Jg$I@-GT9j+T5ja@sx)9bzyiw&MV zosKS#+}&if*s(2jJ}^ByIohC0AKSfUXIY=Rc+EN=w82#uszIV0y%ks}U2LtZ)49EP zL8LP`>C0C3l+T|J4Mm68P^+prW{QgohR&BQGFX#o5@H2yGcR2tfrzC&l%2 z+%o~9We^u21&CW&mQ$lUyE4Es3LipKe<3zeI8=JkT@fZG%Y;GC0G&W$zovmBB?*z7 zs1zhB3IxJI8R5GiSsEg}+i3Ha)& zs&;PN;Bq)HS)UIr;XpW;f|yMv7<2#G_g;S_F%dZJ_Qo1+GtCupvx^~*)6vn=1f~P? zi;K(4xjc@8hQ*v=O>0ZF*Jm}GBgxq8d=T`0`l6(4HhW`T4Nk!;7D`JiE6b4xm;!r7 z6Api_uJU?7I+f0iPtO1vMT0G~7!~lJ$?;{Th(p)Y*=aUms4LAb!iF%}SYK0zljvM7 zSo?%l!jpknkuEYTvPAYVk-+{XC(hrful4(kCQ~Anf+s;t1`;XkG-Z)Wi2;%-GX+Uu ziLjXm7J_zBlw5cv1anC3kir&S8E7z!!LSE6U=ODG#LW0gYWal#J6oDP9#^4IT#iJi z(Pd-x2Kb1IwQ=LxE);K}Seji}v{=k*+uLwF^}=#!Zea=ATT#L;r?a)8!RK+SU9dHe2Soe; z5dU~26%|bi5-RCA^J111MqriJ0RRQfhAUV|l{lD48UpyJh?KAlXL$-3(=abmI!q-B z2?rwH;sOAFv~QunvQd;IX7y`T0zbC|q>eE)YP`{mwM^_eEkk|HSlT*Tj~@%J#L5%% zaJX*5DmV19Trs&EHZCtax|;2Fhr{N?)efx-oC{&I*lI1apdCZSa7**$ARWuyKdaLHkr@u+P%Ae|G{EtrMR>l`tZZh zwHvuB=RM(Y6*kOfGiFl(4#*Q0^NP)#Y;M(U+d19Xc42;ba6UC1&&Nw;vrT_^*XGYW zcid+)ow{({Y}6k;w9jaF^$(3t2bMD0uv)-0rmeBz*~j)B-nqHGp%%N9>^Ae6v*%8p zyLxcnp3nc%%g>%Tdb59gE}Vg}J30n9BKCXTR+AwxJ+pujE}mI{@k%seC}o|-QlyYG zmwD(a1V#fQgXR47f&RN=p+KOvx*EPFckkYwEflBcgEI?DSvasaJ0Qp9Z0`K6p`m*t zW`oIS_c-+WY>sEwPA$gX`0!FF6v)G$zTOT9~S1}69ywVH1@L5;CB1qaK@a^=Vt?{u`%;Tuh;IZs`BSbg@Vaw zGa70#xvdapIh(xOKe9M$_f(n9W{ICSI7zRZ{=%DjK zlu`>glJkM;1V??eVSIBCmvn%~uZC8j)IEZU6yQjpl5>n#HCsboNlW@f$uwGO5K*fa zq^%+erTD@P0htA2CN>R3ZiP{*Ai^ef3kGXZOoSxtW5Jqan-79z`}%cVZLL5Ri6`DT z`O*3{oiO9ZiDY2|F>M?rdrK(km}PQ(Oow{p8HYM|bbuzkRFGXuRCl z|MlsK<^~sQAfL`t=V^zWecc z;ZoI*zx^)k>dX3)W7*p{}nfwUHtkhFRxqE0mby~(;xrvgOg;*p!?k~f6?!8 zL+kzHzy1!U4PW^5iyh6)HGUt|@#*=6zj^B?7jN~U`vS0tPH#4vVcK}&;NBe@Hy{_7 zpTJrjJ8}B&4*%^t?;%r4yc8d62rGfq5#CVTKXoyHAIOLD6~VKnNEwv%^;P~~f90ih z7(|8V*WVYOD_DT9y{YNM{(VRG?nE!2%jISlg6D7C{M(EcaHDhw{z15Sl;&z4&hzw#%}ICxO}VskG}QSk`Ly@ zX|p|l?8x(v9~0{F-~PA1hjE=bWCfH80qO8{3flu2WnH4EL~?v4VNHON8$r$FtVlAA zB>-itfyt8=#$_BL6akZjMjFs)A;^@d_!13560i7T91#KzngmNm0(d9EA`iYf!ZW$W zA1BD6-@3mRBBXdv;ZzYpk3?X zUj$n)l}{B8kW}dDJCZ<3xmR4HQDChX!Pp;(Hfx5aiIK%Ys!}2Dx0pu;2V;5Lu`j;1rKtgGD>7e%59f0i!xt~b`ucRCpeL1Z6w9`f zxn!`Wb(R&YGgaRdX>OaXZ5lGVuip>OrSqX=I$7YF@WFNKUwh^Gb)BurNMzrx9S05` zG1^?=cv6>tHyD_w)xHUKKn1_Y^`+Nd`qYs+VYyvZD#9Ix(Z zuC0E0vA5q6n5oOeGERFYpKf;AikSjlOt{jC>d<^{I$(lzR;GXhv#>aXB1R#b^Ll%{ zv~+1m?{|2xq19+LR%6}0jtUft|Iv#4^EZdpl&cb;1T@7R^-5i=UF>D3T~%rtIw`4l z55J@XlVKVQ;YzW11ptkf;Of!(`Qtbs86wD+1^tkyZ<>)OUGQ z>$-#jM`}Hs;i3s*g%GQ&DjD?)P{BkOYoKyzovt(#5Ae9nkMp%@UVg$M! z4yds8)m6X)?}TrCbOsIz5AWLPu-iJCn)Ytp_~FINOhXE6pjfNkxMmH!yF}vgTE8E@ zXz1iorwhm9SY5VR?4N((`7gZm0#|C~!umJ#!u4y`V8vI3fCtgZsG#Er=*>Od(M00h z^_$e2z$E>n8QU8h@e%;=qE}G}a5dZ0(T+e+xjrxmSjmrmYtLFZZ-L_e%F|DxOG921 z70{Jce=n5gt9`fClDoxhIl6b(Z+!k$Oiu7(K|xmeyqLG_-n^-;so^hPfAjY6eT1VZ zq!=sZ37M&j0hL?+N&!g#OO@rqq5%;8Z8mF9XGewSJEBiY0)cO=tNkBd{R}+qU=OPV zU@53^^V)9AeE#@vzK0hYgg5Aw9HQ}r-|NM4J7NJ0V?>kD2qT>T<)3^N6DQm&4EV0{ zc(9~|*+NZ~{|~x6x2(f!3b;oom#607K45wKhV`gzD97); z^Zr6Gq=fGG`kp>=NKuCypB&sf0|-2EgjcW6S<`XJqBhOGk$VV)L6aOJSzDQ!A2c@J2{f1fa0g_JVx&BRLB0!Na{9?Pfh};lJI@#@W8k(Q_Py0 znyZc;N(W}c@c~o5h#bJ=vFbboC2_18z2~Iqfde1c;BOIa12!#Wc&~VTQRJMViE=|y!$~>M2i}Xe~4#!eGHfFZ8>-`?A za_fsGdtIHsrD1-s*XuFWHq|HdMU%Ky}8)~i3yu5N?&$juc;LPFzjNNhWY)vhkxm$0{Ouu{Tqm@{~YB9X};Uw`M!(?|Di*|;g2Eqv>5zkMs8^t%omJFtJ}#w`=S z|Fwl!7W11TWWZOWeCKTQROQXCw?Dpe`s~%onIIOw*%jh-L@94E>9%j^`P@s-Hr4v4 zr>8f!H*VXozTW3MePb||F2-Vb@d0Bz9F&9=f6S85>zL@Evyid5&0bUfrQx_A8uHsCJ@bLBA;4F2{5kyCs(6 zH%DTAq1EwLDk7KVIBFv;W7sn>fT)xrtH1~@Mzp+vP9uP-p)xgrsH{+1)zA|y? zA$g=>pUE|FE=Vdv9x?&S{1G5Nl5b8NK#6PfxI`;boZ*Rf8cItg2+}G9U`M!6EaF!3 z09CxLxoOA7^;pD3+M9zzGYbpQTmuUW&^V#dVnO}vwHr|7DGH&kvW$C}qijb)qcN69 zIBd2X{R7M4$ibaEKK;aTrM1KE;-kw~m%@=fTQ(iov5g|ET%?YB$r!`57$t7$haW^~ zM47*zx{x~xPYcD8|C5IfpwEMw$hpPPz8%}Pu3HP&5@j*x0FyS89Adyx+hp2l8WY68+q9#%VSbEJiQ-~+-8;yk^uli8ZJQ!R-z-6DE5!kXtKY0txDh*mH=utPQ)?dkV;)ToiZn#UEQ_E9}g~u zV}sM?ybiN%C-l{Y>CoG6IO{xxxv|V*D1|Ao*H>P*w(05PEl)pocVT99Vq|T1huz_Y zriCSNxOai2NiM!TKRJ+HjxGfj^r@^VlUq7@+B3Ik%a*O2L~~85@*)hio$bYF!|qTV zFj^43oUH*`JO0_eDp@rFzl=CAs)0o~{(;6&F1qdXPcNQM3wD`ZEp3j^UWk$jzbYQy)bxU2#v%H)aYRhofkNoni?`3$2ujNw2@u)D^61 zx@q_JC5jWd{Bo&~D&aM14t*KeW8E5RLrNNv1Brx%_15r@x|iKEgL`o z+KY95=hXb-L}32p*$aR5o$ojMztYvyy>rLbk1t#r9=UHcJYQQ~J2o9SbLqy17p~05 zqXirl#m%>T^#E^-7jE7e9T`1wc=uB$j@`U@xwf{ZrLnP;&vdToad{oZc#6Av*}?I= zIQW(98@M+zF`Z1tGa1;NV?wP>;U0_QJ)pKAUab#w{&t z`{I)mRVy*`N)j6Z;IIg^jHQAFuUhoRl*Npr0I-j_=y4X!sFWsSHg8O(%IR=oB51sN zr@5-8WcOHHbvkP;oD#7=UAM?{7+gcg+m zXvDBkQjv3{R%#Lz28}}oA`j{<6(C7azGOj=?8zUns+k1hRo)dT+`|*F#k_mdrmgGN zfhkxpfB)V0K^aJl@jv+bH-Gs4NeonQRr$H+p8m~Wc@1jxQ-=@0vHG9?@JBEoCrNN4 zB?7UqY&f}kgfrYCoa#6w&wD9m0#^Xx zQ|QXrCH%SPpSgW+7>7)$nh0p9+UZR8-~E?AfeU;{8~et>v3M?Dc<=1F=KA{6SFiu| zkKc}`QkZ~^Oiusr|MPF6>@Wv_wbIy3fc#as2A<)G$$$4Je}=aZ%}w?3cnYSCuw}wx zJmzV~_Ut}+@k*9P_T}e}9>#nOq+w2Tdw4`@7sZV>B6U&ezgi)1I{@k>S`gX*r6Afn zxyPT<)horuTFAP`8pWy&v7t&M4Q0ZWZd`z2k;){Pp$HK`2H}a>Apqr!ST-C~5t#!J zSYRZAxD;YG0_;W=R0_4CuZok|QcREz%L_OVND9IxpOKa%Rj@n~j^L};ssuhE37|f) zW*gz7-R-MSW^wvX(Yg0vZ7j7Ae?t$)BSnLySoUU8ru+A1{_sD?owkC>s@u_N-ng~t z#EFi5yKS|;jw<*4kvqYaV6ES2w>ZqHY%Z`6y?rlw{mx|nP&yLBZXt6PYcb|pTD0h} zFA4S)d3ZgfQ$U!oV}TX@BHNr5uTY)Nm0(EuS3)3K8DdoRXB)%7!4}7c2=^*Xt}EO0 z2AiR5PefB!uDA~#GHqO|v%^%}SNr&}>P_o51eeR%g3aPA**D&K@6Gp4#&g9)p=7bz;1#D>C}N4(;&i7{nN(3XAJ6EWu9oJSEo<95JG&1Z zJTN&u^TT&Pm|a=U>x*!rLt)^ZLkTKJDV4}!cNSQLgGFO0U+;za==P@$@2&OO$EPMh z?mF!HdvDJ#N0!3L#+r}6{DoIHbhn?ra7}NtiA57u-T5W~{wu}eGo*H*Rt^3%t< z>U>Z#>U<8Xskju2#SM#6p z*fOQE-a^J74Oo_DrtdH1?AMx1dQ(-sp>ey;3eOgJ@s6^n^o(o}QZ%1X%UDJ8k4gem z+;MS)RYN_s2KGtpZFtWfiu##!M*@ULQ3Vjf8`eZz=#nbqHq{E;t7@q!l~nK)7~z2# z&rB$wLQhuHH6W-7q)xQ>A~wM<36!cld!uLPEr-78n&i z!HF2aGPk6~EO2gu^xzkSut0lc&rYnoB6cD$dv9V2;Msic%B}v#_U?g#2rKZN8#ms# zGl-3hBmxCVWdWU2snkC_3=dQM2*!e ztCM&7i-)(~J}=;WoV%h4#G%esO4qqpu3<3$H-c(5z9 zuBLi97E?J@33`X_p1*z*Bf;X*5;b1E?k69g!$07mFk{R`VKvv*V7VP{NT9eQ6^wAe z0bn2C!6FpQ==+E76?LWQ*?D9K0DVLE_HNw_BODkP;r+v%`=chKLCFebcd55;Il_bd z$c7Xh3rcD43?nP}m9_%U3TR8rPKBsc0f2)C0p=PR;v^aMb=7bb0#;!F5|R~{NGX2+ zlLBvKQUL7WfQq`zlrfG;{z#V>LZy+gx>qiSAwmKwr9eUwPv%HX2+1$PE9I^7CHxBq znTMw>D~Z-*65VkT zXJY4yFq*fR?PaUEfDQTvUB+R~n~YfhaHo^5Od9L-7%Fn{6gEggJ4Q2A?MZclT$q<} z$80c|xZuTp0gPg;77YmSwxZ6NNC(fHjd!neSw3xQuGcxun8F*dNwTa? zgw#08rigZEfTMIaV(^Ip&F6#Hg!--PyLWHh*xgcpy?5|(@12V``|r&JGDX9UJHy}j z-j7cl+PkK`Wg(i1XM(l0wND*8lE!9&Ol~EUO&1I4Tp=9KPQmF5ydfG)u!gyLdw6|E z^Zo+|VZ`#`h2D2RI(v6)ERn%LinR$C!*h9_qEZFOp|%Xs;Iwd9-hcY($BU`x*^kfK z9JZxM?Ed%+wDK)IJ=n|Ji4A6u9(@U5VkG`H^(CBv#Y`bP=-Ul?r`h<-(Y?Dj^`Kji z=JMBX58b;z7ETtg-5P52`-_`8Eq5oA^DCLMIctQ8d&!t*4{9tHxOD(Vo2620W@hS* zAGIaZTe`Z6`TYFkgr%#qzNgbV7YKa+O-B$eLDk}hA?kInv^K}PyAsV!`i5plRV}7T z808b;NH!6RyG>Z)affDSCZ$JFAj7>V?FeB@B{n<@2O2d3l7>LM45BbMphEa5!MuvuTs$83=UP=n15-EXOWJm~dccKKVg}hCl~Z9-1F4 zH-tDNT@E`o;PX+Z8=jnG=T5qef<+2koix=^tw#XEv^dEWK_nB*24yD61QEZqOsHo` zPH>T`j3W{Oe>gB_XQ*Tw8(yKLLUG3;FxID$s-e2d@7CDsyLUeQqokqI=^L@l+C6q((_lS?6%rH?QsLZf}QOdrM=(+V<9#hK2{` z`^db&J^X@LVArlTzcObc$n!UEzVh@FP~4&VZ|d&CSy8YZ0zxDUuB<>Z>2zAa*^AHbuMaCyvJkh7!HwHf%P*@kqrIJZ~GVj_UQBGKQk9 z%5QVKP$3K1{KDem{ox6}MQ=^#qqlC)y#5pOz*s{L$~5YH0o^jZl*eGcY&0hv4$qqQ zqRkS^WU^jI$zsx{lBJnR{e0S+qX9~}P)vto^wG}tB8@T#MV9n0wQWu2v{vzH51k>$isev(QgESuL`o9oOjOD-HrjE{wS`_lvWjB~-dSjtr@ z+p#AXmfXft!sUoo*Dcky%vUwvv$$_2a+Ap%oM$CVdK`et_Rj_Aels!R3No~NHYuy^O?=KAV*BzES)l?zw;$7e#zaqRjx77d1YrgZVvy@}ZnOax1X z?5oc|b?o3isL^xNvyi$E zY2W?>MqSb8cJ|%5-+${ijDDDsd5~^Lx-h&W#p?U|_Ldip?)5t?=sRZ@mag>P!SPS< zAhWO#{@`41WMaDU?hWhcL{&lOtMZql(Q+|mEEchBL)XoC4N@w*vxVgS(TV8mrnOz3 zeY>3-HrH?20%!ZS+;(gKaCZ5cjT;kmS)(OfSC{Bsn_Jt{uys?znjVMCYq1$~rCcH& zhweV!*FQcs+|^?8>T{FVhdpa26z|0pFu#T}O@ z1-wB^mqD0~otsBl#c(H;jp_tijOe!r=U6W_5S;^hBpIsNOQ2n`PCl%c>`XAYYlPOaAq5{S$Q$Ayxal>K>aK;ksmUW{&F_ zYK|ZgFinBAhT>DyrZQelVoR$^l}gbUp+?F8t+arH>r@oJH9=IK!7bfrBd=ITWdUI$ z%){N5$`}P{h)}yk1`Ohjx}fr+$AqmRk^>JGl^_5WC17PZT~UwdS>uTWd}mQ8qO5_@ z6}9pW+kGdta@i<&BIh@fQ}%)d4-YT7=OPQBB)1g~Nf>D!y$}MNs!piz94uYHLxmC| z;Ry%oJ7QtNWVhIm73EY}!AD~;j1I(#0Tb+CbhKE0>sMbpvU?Y-WuWUra`2eBxV!>u zb$ECLAXlZpiApcu=}ab`OesDQsWJ)IJvh!5hj4j4ZtNuXx?RWi?%{Z$(_!@;4(0%f z?647VM4?2Ol$mCQQ2My!uOce~kt_izVTg$3OKzA5;v`o9VNH-Qi4iJ9h)JdjCk?HP z2#1U#Tv{klSEeOWMuI?_BM3?ot6aYiC&mj%qRj9irY$~Bm$Pdz^ETG%cSaJ zGU*{6gj8Zye^({&3rV0-qtF1&7Kh7S1y8ccXvy2qUiZWki;F*sjn1RlI7&K4CKH*S z)vv^xwrt2mW4a7_k8EIa^4j$)xqN2Z;r-^B@tF(PjKh;n$&x3JrCVLmY{nEkV>Sj$ z#mTZhWHD~rwxz1QH5UnE9o6c#>Y}0K4O1+Yw1!ho+Ip}_NE>{ZC$u4iqdh=VMOPFn zVHv#WhjIt2^gMhXLUAuctAs}HLRUL}KNMWdo~}04U}|B@hL;LBkb7y#lT3ScMhlGZ zby)H@N37P2+mY>R5BPk;X2-p<{%$fknkdI$nh)0~=+xd8WoCFU!-nYaDhiF% zY}9S&Uh@K0xbxYw7p~su8yK6MSq`TQC2OHHQm%p-xh;M`mu{?T!CEPEqEDqXxgHakAEP%NP*&KSzsmTK4TE!*Ha zW^5)H$>lI`W$N7LDXJ9p=17rZWK zQ3sa+rTJj6Kb?f}c@?%acj!#;A}+1 z!HX)bWJ^F`w`P3y=n;wG7aYqd-!czE)D4`r?%TE%z5?Mlh9QapV8g)~u#Ob$JZ%V% zIIs^Z8gju%gINV-a)hM^Bdky)MlnM{D6SBQ++%5+Ip8gFq*In23SJNh9_#FC^=$ynS=De|V0MFdy=QL@^Fw;2|A8)n&KDB%!fw_EXA6ww^2 zGim6$!np>I?N*XON)Bld`jyXq`d40j0h1+cPW|}WjY~IsX>8Nc{ySg#0&La+fVbil z^CL_{N-!;Dp;7wOQ}Kf{4nMqb2}f>W7>44G<@Uq7wj&%SH&|}Rs|;Y4gi8doOdl2lAO$~52pbs$?WR2DuI6( z2^b9~gUwZT!B=b{nM-*N9Lh}3#bT#&!I&*qwik+tU?_66uco0ntS=9J^g(O)n#9zE zVJ@(L(`L`;EGJQ^OHn|d^tvs_ynuC0mGI*lz(kJsH& zFvga1BX^hc&|^UetxdXM=^Q|T!-rgzU+D}OfitSg<@-~CZ-3{l`T5zYxw!~lCSYPw zz)BF8z1a5IuVP&u9g`u;owkN+HwR9()&A0RPaHqG-)yzc1VbNPzI^d!ADpizb2=YR z1u4RY2%4{v8(z~nr?FUN)V26Mtu^kK5A9gmzUhsR&R@7ah?#}MYd1O!hEyrNlF^kc zu)@c9FdK?|@9k6l{R8WpYBzSb)zsJes%z(h;eoSP(P?ho*z?l!&tl~znZhv}I0q@4 z%R=#|v5c&qlxwPd$M^4a!DwBF18`xqAMv@Zo%QYpUn!L>r}E`UIvaA;)vjquq!y-z z?`~>nZ1z-V1_#oy2FEWO3-%M| z;pf1p3tDY6*<4F?tB z;zX1(P9bn&J2L37lU%)4CGc}gfR#-u5x@A>h$AgJ7U==-gw8{{1q{gO3`7Z#C|TAM z#YTD}n6aVqLP@}v)@!imB5ou?GBu8KphuW!G`Od|8&wP{E~F!jFp|Myk1l;2b$m5J zV2>w&cm|kK6}Y5Jo`8ibuz&?B62d<_AS6-GKqkjWA)a|wq3A(*Pc|Nq7j)%kjvQ9* zU$F8EN9HN4h!aE-%NI<&F&hW)v&W9S_0j2@LwAV_QF1|v#KwN+Qn9JWqICkEWT5#W z9tJkwedj$a2oSzphC3I$lvD{RM&=ubyupV!7ntGx1zssZT$PT?;cSs(TopWcmsbet ziQmW>^N363Np3}MKmk}SQiAyZbnQeq(_>$$LnduCrKXldku zsByzAGbgN8(i=z}WvEbNG6l}N)oWD(pO6HkViT89Z?@a~78s$Vqd{ABo&Sl)aD3pfuU(yd^9O#5$v!=wx_W(NV%)y8)R4`=7Y(em!!}FE zYz~+#*m3CHzc1r;x)I|4yL^3Pro#0*uO#^n-W}b~gw=BhS9_I3H*wdh!XDdQHnx-*n zbEaIL1&1rs+OtyMb~Bn9Oe`PS*5$J<#Dcd?WmCP$2S>kmrefGF%C&usY=sdHkm@4N z2N&q)%lfH>aA4u0&8qjftsa|o8LPzD7XZ(W=yXaYi&^h+n0Qu^yx#=&j_%G4+qYQV z4!6f~?PlM9{L?>4?AzaaYp_)C+N&1LmcGHkRBhw)n>H@?-f-qK=3+s{1HL~&O|nE2nfoKIk^70+ zz)Js}$jC(T?qFR$5AXYFZh}RD8DKQC6pv<#d7sI|wIrA_p_jz@sb)i}PzvV@NxiA) zZ?t)u49j=2mq%hIIFjcyL%-HrHrJGOHp2f@R#qQYCGhua807(Ud=nI03n1Pz3I}?KpU_}>a--hIfBaA5P3LQXX zX_zT0G?_-8feq+Lm8sZ65{PJo69nUzWDu`F@SyM_kP0M1MZ0HuLf`{_G-%-!lVY>= zX*p#H@uO4I|NhUuIW#)P1RBr0d-CwG=vGr3>ftYq7XBDP6H-Q%v z>~KAl&%?%g=cbKM9NK^WdM{S5;lce^Uwq-wMRaOfdR-!uPUo;0pC%vBS>a+F^9Q@l zer)e9EE`vdaKc1=mzm_H@`@WOVL zH&36&>Uy=`|I+ctl(!jZ_VB1fvl$YEEJ%c@DOS0uki%r7wZ38d`t=f72~`hz{X`%D z<(owTJR*7UfMO(TQW}} zQgft~RN+wCM4{ngDuNR`m1eD0f(+X*o{=f)@FXgH@L9{KRADx4wk?e+;b|$xXT_^( zQp;IqduPp)C+3!-(d)yeEEG_)GZjk=3`DAZ+txMpoj;o#9<9PLq6T9XjNmbG zFB#%GW3H|$-rR6C7#c2?>wCJBg^ahVerhg#;`yiT26KOJ|KOcFJ>6?t>U`ZDUAFq> zj&x}{|F_UIOW8b?bnqeLpW^h1Z9iY<9YSv6HN_O-~9HQ!xIZoKIM?p{MxQHPaWD7 zT%5<@(@W9Vd?>tY@79d2@Xq;*PP1ikVSdZzO}lpOT)%DulzW_fXSG=m@7nPCJ0E{= zzBd|=p&+WN?Avy2C`7A5%i|ySU5O4{(%YT-LOdIeo3bgL$y(5t?fynxzL*WCbS1OC zgwtlB)>^Lg56}I<*B3)e`H~@#Gv&&8EJln>&Hm;0e(bPW_igTmp8@1Z$r*XYD1+0Q z&=Vo3ST;XX+PTo4AD=p(HW}9)JfiRDnz=nVZZbMt zwn8f6MK3JfDNw`Xx-+M<%+AOE;#=@5gm=5{Tw0$`nar^3;o-cP9$3@qQe#NBnijIQ8vXo0)AGi8lxXd-}`dT}xtk^ZNrl=xQ zbw+*vY>}-#uS($WNI(>K)ECxVrI}+eS6VZB8Fn_Jy&$2e9~h|tD7}M>*$RkFiP3C7 zYAly3NxZC?qC-Fpq5>sNL~!sy<3}j5M^T88Lg_kuL@4PAE@}g$h!6s!qpC0=3CSs< z*m*J`z9lKLp-?}>{~%H!M-n99MNY`ox~|UkU29ap?cw2}(NP$zlMV7u%)k$KB5HCr0J8?V{*4KaM*S-LcH1P6{$Nk&4 zC?78XCl#jFEv-bBR>D}hht&$sKl*21{xw)yV~zjC$B#jkC!}0tg(6{+2N&s5HvD~f zv2--19t09dB`lZUJo7PJmE)WvkJI^^zxrBtM_VkOXl`uSyJeHlgVPENSNd*$bm>aA zfI~E-ny3OJ2Sh^T6((Q@|HAR3hs2~rp?{PWID@}*tN#HHxM8dkzJf;KmP&Xp@w>nN zMVKMsb>zVv+u?!}P+0kX@B9V$B4*)NfQd?k08tAU`lWCflOhDeD(RUchp<<8B|?|^ zPaHn@U{5N%zf)?!^C)u+k&H;`5ihap&s@9ynWs-+$zM7DiA18;2ku~EgILy9mUZQq z@KB(MRj_Nds)CQ$_+d1oh(R9s!$}*{OSRE{$N}XmH29-1S76kmV9_8EFGz@0{WF9? zl@GbCY0w=XA+MYA0)2+=%C1*|>C z^u{@}rS0&+mP5O|1O54lfP3o(*d-RM7Pqf@W^$?+OGW1A&H4OXE?Ha3wqcn(9*y)3 zCMIUe$qaklpW;O0j4evWQ{2G#f-RN}gufVZtyr4n;KfO{oJ@p8cvIS73Kh#aXLY%@ zDN2dslK?dJf4a#JCd;Gx8S3moibiQ<@ccAz7;8JjLLs!R3&pms1=QeniiA0vMwqSNT#uw+O zNBeID#v++yMpw*4!|*+0%HeocJ$AchA`1qbqviBxV>xVVh1tE!VypJJqv`O#?Y^Sk zS^{sJ5gDN?V?NVAJn@YmynSzKr|eCFUAxZ8c~7CUv2N$4bzTPz)I-t4osr2DjA#r{ z?{PRToQ7h-2b*aP*!k+K^?3aLWHQ;bev7BI+hX@wBO$}$Y;tAEirE`qnsNiNMMrm{ zrDW2OOgQwgT{mV5c^uQ7v0DsoC-w)J3?^Su@5GCP(TOuBPs7e=)8-9Mx7%d0q?75X zsj0ymH)^ex1MAnimx3!(0Y^!1Dd>}dRP^$QrP^<4>nYp3dY7rJcf&saLFrI65`X(z zS*`x8O5p!h0#w{p?O|Vojzx42CQ%9yRR#6Hjz=xHF+e~uYIBuQ9=P}}E4-QpNllnR zL=Fou=qI#kM;AjpM1YHTfDwJZqC^lGV-T)>!2ofQH3^~yBk}x^FtG(t*zha}6)ebc zg;{Wc5)y)xFs32on?Z#I0i=P<5MHl8wr3Z-JtAx+8iSYaNIU_&z^Y~n!lP~>w0xoW z)@#o_1F-g{rfnN~uJzw}m^(pO!AZt|x$oY+AANZ0e|+tiZ~#zeOEZoI1r*3#zkLT> z?%A>#kG!aSaxdoFAAO8-g<5f7kk|9liN|4PjlKx(Q-BASJQ^&8D3Z_wBnX%-5SM%@ zI6#TG8TtsM7AeJW>(0=heedu<~k7l9irvM?z< z0l{)NR%E%ruc5}^hc)j9?k^w3gL{v7c&NZW_(cpWgSzgFjAE-OPA%QOaRaN5=!h_7 zdHsWv*B~xtO`}ywfnN*@=!W@z1N!}`3zu;OEJ8P}?S@Mkn54sxB#ys@cTQylwYIJ8 zVsD=yegp@E&y{dW3!>s$mPl-TW@cdc{{HRT6e#@3VD3Tr5>z;0lM!eY0w$FBQG*2? zasgDBS2A46M$(BOQ3?1fC8Ur5GvJXBt&Zt|nVb*?zX(t$gaH65VNjD6Ai|KIT*M^7 z53@>mgb@u>vK=#ksf3P(L}HmQq9Aca29Rh+!i1KX=#_OFu@JGAL7~8etJkUoenAQR z_v@0>HykkUa8=dj<10E}P1XLr87vmRchVM3n@R;oE@um`#KMa@Sdc?$#v-?_6xSQ0 zCUe;7S*fe*dh9Xx;q7Z`o%b$Y4J9L04Nbvdu-@j#1m@t-eOrB9TSEiRiAde-9l{~g z(=)m2*DSL$KG=Lnd;OVQflE=Pd0;A<0aQI z0OPhF=~2*xEBvT&iUF$CvSDk|llD#DE}^BBAHH?U>2d}a7cfHWjYW&8?Dx5* zim^hy+q$*0V|!26wc9r@-M*WFeGIuZ$=gmNjOU}7(z%=W`i28Mp9yD58FZF%-eW0! z`oxhf>$;Fjtd4(l?e<^)@F%ce(HY@{69+wEZ!eclamy6j%{khcS$xkZ`JPDdn_TH?H?@-RgBaP4UFiT+kC* zNyQW6y|;paz`*+M#+DX;Rdq6vnjRU|g_ia;)o;-0<2Pg{c1gB=Gsfhe*Hn$r7g-RsZPsMW_+3H*!%sJP3hj33k-b~Mtsr~t{Z z{-8QDq4sv1{SkoGp%Vy}aa|JgbvuWCQ8{o!Z9p@AW`9AH(mbeAphe(WO90}CVVv|Y zxDm5xC<99QkQk=sqrebOJt?k%o_~UXKe%YHrwj(fcmM%ND%`OLAugbWx`cFmK%QVF zfs8fQ)j(fV$LnDG&cOWHh`nuG~&X5 z2D53!Q*FMs2!wSGUulgebUqWs5y^W9&0;WW;s5gj z0$Fd;0Fe;?L`4)DV>9y$fAz-OFFbzqvrj)^7t?kuqJQg+xBm7g?_qxuscEJ1fEp4? zZ4qR!JpZdV->#{y`qYWXP?TO5T{z${tna<^?(>fw!x2s(cVzdD@BHK)IIm%f2bZ)5 zgCTOQCV#B3Y%Iuv$fTmgSJIPV!19ljSQVL5 zNS?D=!723-;gBT@L_VZUq=aWurQJ(Pd;yAKiX);CaG@eZ$T53JTkq! zZDy7=U@1wc^S5>9j+FKqw<~w@a z+~jS^CwHbZ*Zc3zO^xT4mT^@527hgxzZSdlU3lFZjYsZ}1ZQS!k*F`8@aFT_Z39cY z$^iLOIYYHaYv6PneY5lk3Jf6}cxbk#%fWq(!4NeXR!rt}Rei2wUASeM26mY z`-9u}CNK`*EIinJKK0b&ONrR|n^!}LAa-}cea^zlTxc;-NGu!5X*gwsl;Fl)`Y&`= zG$sU3rDQ5&TyoU6(riYb?DQF3+2wXuaoTO1j%7*)BW5+2lrR}ml+3xDKDd;`>N)x< zgAr@wne8358+y8ZE+=}WXtwzJ`)9A;n*^VDe*uNP2r=VGRvIGZ;mQV+D461S{nfK` zfy>MB*1750g$rlruUV1_N}1EH80gP{xr=-5qtGd)2spQ#b&l zKwQ5btFu`)-yM#fJmbsdLS@}Nme^+ki>)p7&CPa`rA}Ag+1T8i&+0B*%k|#&;aC9h z56hU6-Wu1%ZqJ3!Uh>1ekkMjjwdt&l*bU3k0&DG5DYTCE@0QeR$f^W>MgsZ|&%A$a zaQH8O{DCwqj=EG+P}gwBHV=4hH+KJuP+B z)iBkVSy(_1#zk1>Q1YRnLXbkBhr8Q4f0f7WoLvagn+ivT2h@R2u|T$vLgc!pH*{YdUH8W0FcnTxW`YHM$9bXcu$*}fExV$Dam({dn41YF}*m?b0l z2Y;la#72~qoMc;q5RZQWm3JvvY8G(GhL|Xl2f>RkZ1%^y?4|}B(hWtKr}YV9lsOVH z9^WcYWQV*%AV{Ur)$3h$dvjwwC{NEVz(G5q$%bT-A`o5_7D$6mB8YX=HP-O6%3xsm(=hJ=Y%t5||pG66nF43U-U z4E_*}B#;djewZ_ILu3L&U}2Bx5ij|sILNI$vJf$X)mCA2^5J1T5J+d?gcLBurCQO0 z?30Az0CBt_9Pe-eBkPHZ>;A*P_-8P_BA(T2RRaG2 z57lWo`%AATj3OPry zY%ih9qGdGx*x)J`?(mPsj8Oz00--FTJzyhamWnHYb?~AB+Z3z?V~HK^--C8*pr$U> zzHX&y-C)r?9M6nJ(~*1u<|8_N+G;5n&AM#1ScGv5T%I5dS}7VY4s|k{=>7_wAxV<~ z89xBP{vVGJ$Io1ku&Kqcol3jKVRZX<^?dr-$2YC*fL?s##?Xf!UA;Rs6Hce0JxhB> zOE=VdY`^}QCqMQ0uIo2?XM>^EwvP7pc8|w-yFx1SxDx;8YK zG1$u{J3AW88DPUA*%a2%rDm;$+`szLFMaiMFZx}!WWMm@k8k|*|MP2!Tp2Sn0K)So zB!hk$Yw;Fi(c?5DYfl{5w`tR+-g{&3ym!f$$?vbXw>nFSsr#v| zu$|+QmljH`5}A=tkqTLmTnPd`09xgdH%KY)3Rq)II9GrGf%V?-__)RjMm%N+m4o~M zo600KP^l0giEuS7&v#>zG09o$y|d8m_p@B!%3`CGs>k{Djgr2KmbM#LV}1wg-4PSL1D9&h)0T8{NzyBCNty; zyfBCtQt_5m4qvzvsqhXVCGT{UUh997)lw+ykiU;1R zJFtR(5|SZ>eS*L-6&y0+5Fe|3rMf2A+&bI5X3XTe70yp*^O1BWk%xzsGJFhfUcc_Z zj&6&obo180z~EFI$K@Gt+$wT_rib1JYq)5|T*t1^1n$aJp(Sm-68PX3vBITfg135; zdBbM-NUXndW8nPdzM;EQ2^}7{dzhg^J_r?vWZ2sQF z_^rXdD|h;0SP`(6^x0%G953Y)Fycoyg)D@iPI%r%63Pd)Rjx3PVEF@9_CekR9G5~nlaU5a8AIUp+ZFZxn_jqjyrk9!(=IztyfUOe-5)!cM- zGKP(zn{OIzXU2QO7j#sn7nVQFs!Hq2oPg>Y`};(eUO zSOtg6R=2*%SvGjE91oe0-s-g~f&YIJpyIAw>|0QG?D--z##HP0DK5TphtLB!9*j$m1sUn8g{+t!n7`kScGkj6ni59 z6@jpiR{5yN2RWfKr_pDe!a%C*#t5!*1FY2Xk&vnpi4cxSpmE;1*S<6U)wFNLxH&MG#ZUDtI8OBEyqzFcs1XBJALNZ5kloOIF;UF0c zix3hE7{Mki@1s@;6@LtORLm^$V!#~P_afB6Ya?2=%jVUFH(Un{ZC<=v~BXuPy zL5YJUp<$C}EnEsnhG)d8Fhb)}kGzopCg=PN0m7f+29FwDsjotYvP39VdoTwGNsqAA zYgGcDumn)mSi?{UrMjZU8B93f$K%W5cp*>Dy>G8?CXo2}LUIZIOxPn}`4`ZZd_fhQhsD{h^7;HTCuNMnhtD(L5EfWJ|UzdknW>CsG zQ3quqPK;2zga_OM2rN-?hno?4JK^dD*i(FF&8DQUI@;Pj*RpoN;XfP8Pp5N{Vlk7? zlyPX05$C=d+d9{L`SUM7xqF?VoWH!b`|IC+{pQeY4*Oi8?y~#I!&dOY@oN8%5=9G@ z<|_SQ1qw{4K1ccp@&r@+V)6Xd-dh8Mf$7;;yab~Z4h&$Mei5)*oO2q=HXKis(cPPv z``UNk?7m))O`?%#e0FgzmJQoI*t;9gCKBar&Y**5&Wzq{g;_t|2!I6<7qgH4017e2 zP)LT@AxV9~497CblEv#aHdGJI&tDxHUthN2Xzp6C)1kBa>RMs!9$JpYlUc|`^&~ia z)?za3+qJ#Du?omz>HN*RWB0}a=#Q}p6_XhQrWyKtgU{L7T(^Jc)?){DZ0K&SvfEJd z$XK(}{^~PF2kwoJM^fDzx31s6zR{S@uLKrX=9WgMtT}9ffH^*W?!ubhj8`S_?Ra;1 z;jOo8($FfNEEQxcnnLPVkwKmrLsn2%4$wnY&nO+ z6%GkEt4lZ}w*b#6C_nQ35fUQr+Z7 zbsQ=^yF?}fdQCH6@1lah4{ivJ#JFRV2UdiV4)IHSCNQbui*sGUhA+{z5vCzgs+Oby zB=JcMvx9pDrZ_+dFbO{-rMMToj3G6}g@yvl%X}7A_#=D@2v8{AB$^KbSm9k5V-$tO z>}Xs3B%EkS4#A2y{^BDmnq*4xN6zJ+aO7Fj!vTt5s8Eywy9LgyaI2+PM<_9&B<8Oy zq*5djNNyyK@xURvHDbvdwed<$1d2g&3A2PCAXDL1_>^e^!330GB6NUB=ExRh&moaX z5s$npG|VzD?lwlW3dP7m0Lhs`O11@%p+ti(et5_7M4ZIP4Fw`O5%Q8{Ny{)M5OBS& zxuO1-KlMDUIfVg!-MD?{qs!OGsvt*5g_sbOfhQ`4HxdgAF=Uw`b} zjoNt5SJYvZ9aS1H-FP6Nz6{$Gv|t^!XU-t(5-1|eE#wM2X}4jZg2HEaMocVS1iDFCZvY^w>Q`9+Oh51ufIJO45us} zUrXz*7eBjbw9fqChw+hVTM-3y!DucS^2MTgc{zLT%)-bZ+-@f3XMNFxQ^%uu zae5#8*EnIo1pk^a34)oC$+BEFtr(06pFdGsm8$lK;Rn+S#ogfizu9}QC%LjaO)TwA zpOxh;s!#dHXvc0g-H=1g&T4mOwGoY&Ss)RLR~`JW1PXhOvK^|7VIqmS9qoR26P~)B7&0*#~1q#aMRQU z2YZP%(T;M!iM%L@DfT%$q?d`oj9~EAJqER)J|reD^G{_F-$7LaMHY3YK#HekWMiQC z1rh)nCB@FWNQ34su?K|VC21E2x0$d_z{AUg6R3xJK`&rA^j z$okfJ2WlBX<`l@vppV=LAbAtO$yTVUnuBW!#Y~48B1p?W8fz$kia`PZsD&@4$wl5_ zRigs{0K^c&3KPDoSa4IqQZp=x#z+@DV6}mPrAbjset-elltPb?H>Dwgvq7dZ@-hmk z>A-%S#d1k_4m?Tx>8;!U*WdqOWnyuaroIuKFQ9 z(vlj|k-(-_EIcNJfRmg-jzHl63-Lm*(PX8}Lq3s2%kpirVNzFATw35{q}gIfB5Y_N ze<0T+q>Rc%SvGgzw($Wmav+z7)ZRJmc;G*i2Ux*=vyveO@_76qS2&8TPJ#yy_FPP? zuE%qqFJL+w3yK-IJDh!`^5(t!Ywy0hIk9`qZN2@%g*;vlap}|T>3Q$!W-Ob>!|dE; z5S^#$F={&^MMUvU=Gu`hkh8^W3h9 zmF+U0wM1J|XGkID_)WVBV^6?CId)nA+-0y= z2X;6vnwt$u=uxMgmU>&=R~yv{)$MWhI>xBc-DC>B9#{4;TP;S_Y?-u#icvnLA!;O! zG^9ZKh5$uEG}jgm$B-NcDcXMIB^W^?$~CzB2Fy?zt=Y!|kA(t6q$B`TYR=-!4j5F- zL`p0`f|NKJwd7S`f!>%ZeQ1EW>7cFBk8nC!`cpFL8SVpa+{r#xickV@c`rn9rpS;c zFX2-Mu^<{QkR~xcK$09G(j&Yi1KK58IU8&lu1k4}fWGYFNhJo1)Wwn7(sd|A)=Q%_ zQGlp|hj=M#q`GK;F;Q-#1?KjE_9BB^Z4q>b?mk_PYxf`i(SQFx_IG#T1-cjja)knf zQUc5rn&k0riiRTxjL1c4C`jh8z&HnDc)>dlCh%|gNU+hBd})L%!z~*5=@KVGC4hDj zi*=I5>e|o<4ovc4hI|B|uK8^oC2GnbSNemD?Sv{UXj$8sHqs13BbQl3rv%}VP5WO7 z)u@|_LE6&ld5y4_VboGAdQq&yLu|TJC(^1CUZ?o3xC>%JpZ@(+J zczXrg#9(Arf9(T1_SMRYsEN7TMtbza83O z4Xu@3C+wnLc>A>*%R8Dq(ZKoVj_w)TjW)foymdfZr;V zN>7(oA51-5-`JQK9UB`OhUIJN%)8g_{MirQy+6CzZ2Feg)8G5WmBqQG;iq>TcdvFP zHv6KT%~GXR$>I6qhLd}}R2_J6U&B>zc^fS*0CKqs4rjrIx2STPct<$Wz{|68d0(Xh z4{w)>E5kjx0~6K#6P*VRoY_C=>+16O175eUTC8SM=|{J&yuZ0L8HyYUPcGe^wn9Ja zemQ9!E_nuzH{3mLmtQ@uDPhz*cBwnZjtBm!2Nbvyj3&(hfg`=*Qw_~%Wg5_Vn~P?~ zo{V+L^c_Oi?>p$8Oss+oRyDC`FPP(@{}#AcA7jWmS^D745moI&V)G%-q}3^00jU64pT7N7D5t1s2&fg$?fTp zQkX*$@s?Mp5$EP9L4hZ=WUK~RBsO6Wkfc0ts0$Z+i;jvCjhEy}Rmh3j5YYsx%p(<; z!HYmLH(Y?4LvgVf$tdy!DP@zFK@(GSoQ$0bF~*ooO2R?6pvM!rLSN~M6SL_n!_Lqc z63LfP6RcA=vVWEf0KEma{6Hh#Q6ZN!yelzULmzh0R14Wc77_E2k-90wBo7mShMaIx7w<24#{;XG+CC ziF6I8G9{hx#ae|+Y9$*$j&I&g$$0R%#ZPYf(sfLgVo?J&9*R( z3)_DCurL}=$Z`&wU05AkHexy&YoJ|N(ShjCS#&vzmcMI!tQqw71RT#F7+y)0Z_N~f zR$%wgK%ccy$NuJ-QY_f*@90~Z%RQW#$1xR6R!ebLVTk!-op!ZP_txNmTh(tt zKacqR7hgDk^5|i2C@{Ys|H+4+{otdkPvb?mKh`QWYt_a^JaxTNoh(&{dPaRceOrZG zC7bqdx;qLL?C}g!vC;{u@{L^($q|XaMwBs?9>N-!K+g*=M|SVcU;d=_`9u70kaM@v z(MYzt$KTuEzwbcL@UR27cX%Mc!lpo;Xsp}ox7L#JJC{Bh8tfej^={ml4s}GVP`HJk zGrD{ZFSf2XAsJ-iV7V%>bK3F1Z+O5C+|3A&O2SbX{R2mR9H!Ekp`4fO4VYyHX!ee1 zLI#N)1_8(?5-T~XdYc8Ak+TlsAcKw1uwz0ou*4d;FxfyQRq+7nY!V1F2!;){V5lKsHnv)vtpGKo7)5o^K}>CGh8;F%;fRlkQOH=z;4J~@xIBpE{)cj0Br!AuF%>oJ2{k5( zDYKAo`cve!sSJN{Xcsg%8l7xWlp)485AmZt1j?Xih_svvFrue)+cL4IBn(^%^}$dI zQ>0C7v^Q!2WV1&u$!rtaMj~4((mvr*kRa03zF-a!rHXvhMkbib*nVc9B67gn78%v4 z+|IG%f#0qNROvAnj7ZXoI)asYz3S=f?Ry!oQ(Z4UeBvtO0YnTq&QPo6!z+1~mg`H) zu}TdKwiyy))wQ#Q-M>-o+pV2DF?ymMy)Qf;c>C={D6kyg^!9gSop&mc>pc0~_Ttm( z)~c^s=Pr(1QG=+xg?DHpUN1WxIS*d0go%DvuHlI88sGcc+iQ(Xe);L-?t?EJ8F{*~ zWjQ=n%%!U=O!=x2|2hKu zGjpKLvhzTr#Zr*guKuoLhxhH>J)GQJfBWSNiyQ0T`@xT~RQsKaFTefrxx3dsdAjrj z?zlTMb@$0^1rrl4SG`)q6R27f#CY2g@HITxlHBFAuxpB!ua$B&>*Wgd_4}GwZbC=$ zxn9#JU_gU*xEDhIkGl|b8R%K?22q^R?}NHkuN9Kp8Owif>htGMzwqsEeKE?Tj~`Po@m|xe2{pgRcl1c$=<#GS>we*d$eD9k@4vaa z(x?`(&wS4ECtcQHw8P)o>GlV#AePGGJ`q0?JMk8-XspMIb}!}1t3A%i!QGjwkGHQp zv^t_bE9UieIy%Cd#M+74f4vItr2i8hP~eWv27!o~oaCS_JT@qe>-HHydvI5O#vxgw zya^T9VW86z57C2EOOc6%OfV6;n6P(a6xa?YglpJSDqA+%I=+FUnLY@{o6x9@9U-6< zC^Dc>9Hgaoz#vbiDUu1EG?gkawFHnP=v0J5;WEsQGRaE+v`0*h>LlgNunrk5yU2}* zxJv;WUD;=JRAOWnf>1SR!-)ne$KzQNmu7w*3Gkp=;)ye_MM{rQ8%{lAo)jG^u9f?1 zj6iDBgNunD1tKZ0C74=Li1CpG2}0&@w>)NWNF{YtSPZMdMe4|bQt6q;VLfLQN+9x)!D?7_e2S1e84JHu9K3VJkH@!LYnf2Vf#(ak2?$<0+H7LW6bv~P_8lZb_+0}v_VUJSK2eFWs@j3Q zR;rbyrRJ^M&Rx6vkL-^P#^SS&ZvEYl_r?Z>UVkP2t9R@1q^FLR%-8@NTYw|ZbKos; zMUT@xHafUx-`3{#>XRkxNa^y1*XO2I%Zc%D`258FN0TGB9zD7JB)jG*y9;5TFR&hO zPOYtCL&mdbP8Acm+1Yu_H)Bd0)4p6B{+~K97PRob5lTg6;v`DE{zX3@@KOaMg>&-1heL%v2_o9UmM$vFE@a|LZ?!lq*%- zdU-whYV-Z8cYgWd)l{y8PKTT6YZ&bA3itMO6dJ8N(~p1p{s%Yj-ov`~Z@u}-ciw#S z@c0A>pKPT5{r7(K@%0<=Y{BUbw@UR6uXAu9cJRRN@jbiq#pVZ}USBNNPMtXO=J9>C z`3I#(4@(~J+T2q-b?Va(>kT}*OBdo>{5mhiS2Fwmr*!v-Af*Ceh1)pfNJiu4$*3rW-I*=F>B=VXZ@O&oN zQTZ=UQj!`opr8u+AfNLNP=N=)Ak!7~L(gTF6&Sr>A0a@24CrA*e?f|;Xe1nrU<#?} z5l8^Ov5_v2bV|{O)U=Lh!Z8R;a;}svQ5L^x8pQ%Y@5mF(1amEeM%FVRdtP9&;}!+I zM%x&O83411z%LNm(H|AGg-}5hG0E_6gfpllYbrtw$xQA5OkpxLphCFDi7bo}NU?~> z94F?(JRwpFS&0N+hU*u3%u%V@gs5v~_eZHD8I&Y0+{;0ovy>xy<0i7@6?BsXC_tw( zA44{EWhULLd}&GJ2(eW&D{@E&O7a3OoMYd)$V13v@fb<8&~^a9DhcSw8j6$MWavf; zp*|X8nS%=)1T%x$!G|!+*r?2B7(kG}Z23S(^OHr?f?68&O}_ZyL}R6dO~x-E%fVtT z6^(S>FYusvLPV^TxHHQb3{Rq3ijq8tYkC3_f`II0t;EwLajE?dG3Ys>Spp+pLkkjZwX%-fUDu^yI zx9zI9okfqk&ZQkqcirLD&Wp8Lw(#iQ;I8q$voBfEF06}5C$qkuu9Dm3iS3FWJDvRa z(@MEuA;d$Nip@>5!1NXoY6}l zYG>z;@SZ~yZd)*dV2c;@9e7(TJmPaUvEBxR4a@-_Kk?k|vAxA&C1`n`Jbm)%wY!Bn z_F5UnFAckf2k_dqLbK!yIv+1Qauo9pJV0Bms5>D8ug6{EBTf#t1)q6p#bUKw#)3k~ za9|fm%ZE2ZVeTA@=dr;IBX|YbSPX+DH0U1i#3$33e&)_NTzrY8Ot1l?iPzEWvYeZ_ zWClMz)N2o>r=}k~{2%`0PkQ<~GMV&Vyf7(1@>KfbcIwu*;rUp;^J-~9e}#;_Hb(>=Gi_Gf?l!%siGg0)K%y^)FW@#9C1?j0HH z?TqyGcLhS>GBzM86fRx86&u-i{P~OJf$nSb)84LV)9vhW;a&y%;Gjr3B=hyFu(HuA zEG%^=6W!yJ_>E=yZ~uPl?ya8Pd&?ewGO=E(R+90=+N0^i=eLH(CtxL3%A-s;JbJv< znrmrcH5$O;sD6Jg6Rf&}#d7Y-TrkpM4Uanp_Bz6NJ_4J&BdTG^qATUs&avZx-}Hd{ zU;Q`#a&;?lXLg?T1OKdF9PrT@sMeUptPB?rKH!Td77G>%p%S26BOP2g#z`xq261EoS=)-zeYlXhNUGp$ zTMUv2Y{TSgNvHPoGI02Z6As&bhBsZqJX1)@l_=T4y9wpWk($*Ld19tPcYaq++Qzc(i{Zw{JNdNklt}K0JAez^_``N^H(ANUShT&qzLv`txbVdI zk8Soh4l~rE6LE7hM9)A^2jutmgunLsOV6J;f(_LRg)9PlZW@7IahlHg$4~CuxHd61 zT&iT>{l&YnSkHy?=f3f+ue|fl#ex3ldmsG#7w`S7T+B4`SuZwquT~LOWAP6*kjELj zZSnyDM8y7p%ks56o>sN$2?X4JA9lXsJPYWoD346B9E9TW4=2|WfV*+(KMuUDHj+#g_{nR2Z@Il1rf;Y0pF_y@mu|9|>l z{@s-ucZ*dltnpy=3w|yEL8aPyH1qUF@BZq_^;?-tcAzu*&%gfGfA=r`V0V8HCPy|l zs?}CHmHWvLemZme)>lp*f4;x3{@HcU z>|(Ui@)YaI)irmk9Ow_U{2qr7&kT5V6UHIq6)07DAq%p(-f!YpR@I|hiqb6^uNYz9FrO^5roQa?qPYBr*X<+e%t(2YX;8 z!R?tsTu_E=MUs&SePQl`8J6Gz6E=cU2_Xv)aLyt~OBz9BT0~TF1c*~2V9o_7)Rp#7 zO(Nr;03(|HpdupzDHPd^i-;kc=vN~`Uv|NXTCRb`l#kYLdx0Dj=}}iQAun1(1u)}G z{!)V$0RViABRD9TIuacy%;Fa{0WneK5>X>b0;8dFqy<5w$BD&aO6d!6Qi8HU0ThTM zV+tw~R^|bL zP6Ui*8zlLjnleO|Yj|QFIYWvn0Tm$!(mgxC+JLExd_^|oYvBAv94Q=72*VGx7E4Y{ z0ShE#A#Dtv(sCKqCN}l5g^;%nV=vJNVMT%Pi>Xv=dkdDjfI`N!)i1#j~+f+dWy|SYQ+Lpei!|%jJx3( z-5ou!ujG&T0={FDgRh+5mni0!>Sce!ck=Mw^QR8)9UXSJnm2FW9_r~jx^H4@J5w*# z*cY-zQDM7n%b9GncpBI30P=|gyC-%HVJY}_a{J7oiBtRcpPn53{?Fd~@Xl-rk-Nj) zXt+wnTCLj^=!i94rSXZ0*Is)4$$h?CY=9TBha$pnPt6y^>TS;OWA0pAui%wcu5!IqsWi$ZZ>8>QVrxajpmemy z<@R7Eo@?@$(r_suUG0}pLchE?;n2Sjc>jF{BUOkk1JqS9{b>Y_4QZ%p-?D{ z?LF(*?q+){gSGKqr?L zjeFhStfDw*0($ahGg>P<<{xL5*Gs|B_}AVZJbx~|wU%w>gScBN#2J252inC8+wYmo@j}X_V8<|UYe7k#mt-5Qn z)#}C)E8f#+-1+S`m>p^VfAE0)aH=8%4euOr8K0nkz{dm<7<)Bjqj%tkT?ac3LYYDm zUm|RqEHL0E2tc?2qGuOCA~H^dk&R&pBC0?M25xgRvVg@hwA6dqKXs*@M5c~+#M8vtHNDNxwVh-K?ZUi6YUGCHGTRGW4hj%2HFj!GK# z3{*u$M)Vdrkd;Ibiws2$E_l`+93+#I5sbDC9|B)g(s>18-)* zI&@PM%ERWseDX8I=3YUpm?T)I{$+B6gcjx+uuDfkekY85w4hOLVzLa9at3L$36w zxso7RW_$>!_>lqrje1mz3R5{IjhUn(9}2ebS%qUDBC&BLQE9Av*X<#OICIcV}N2CBr{xnLo&kjE6YBO^-SHH8u?Vn8Gi2vh(jQVVKIxc+e_ z3_xa(QZ%eB;2{UMRc6M{vEzX+#RI6cZkI3Y3&yI5-P~^fkz@UDY;7$i3M&a`74xZB zP2x;=8k^mnbDbS4(eB{nfuVzkJa}R-gm?P1YME?$CYo4VuBH->TyZGZ%6#<8>br7n9bqo^g2CYG!>aL0Iftowzq=Oe@C*%whKG{@ zU$eV6>-OHAneQAK8XW4oaCB@fo-Aexy9P&Id+qs7zx&?Q+@nX2ESK|*m+ z%|}m~_{j{5*tx?D{?uIC9z~1mj7Glx+Vfw(csh#5MjiEA_wFw~eBjS#&z?FJ_|{uD zAI+AqAO;N+fv3}v$Yk$MO}}vF$c2|KVyJrZAX4YSo)T8( zSZ-HOSI41!#)=XV;r@D!I0aN&gEy9 zrZ*DX$<#I$@bq?dP7III6HaHP*-95H50_S_A3sSYGfz@$rS0sl8_@yf7iGp zm2Sqjduw&9RpJ8!UT?ir^*LJszQMNU@%j3W9d&nixbpE`FFbD@KjpvrX?1mRKeofP zuvyXe%qJh$HWLAVB%Mt9oz6o+&t9Le=gEBK>Q&#ywx4$e9Ne9Fj$tX6{^U+~#P1D- zT!EM)h|MQ)TcIAiUCKM(J036|cow*`f@u8aaLn;m*X?O?4axQxZE6zQ8mgO_!XzsW z)o3kjh8oA)-^c1OXy5m{!<^Bqiej%;v!q01Qew z@y@hFG9M|}!oWioQ7hyt3*BFP-8gC z2M1B*D(Wp^&<+L9G<740PC;6Jqaru}5;3GHTU7*gfs}?!-y{?#12eKzvWCes6_`)8 zSd3zTGpm*?QWox-$lEA{FQ$1I2P04F3WXZAuc@Cw+&S-f;LGy>>ZI2b>c%c6wPK>_ zadccbUz(Xu|LU?QQ3@jBcDl>aSaNV^E7s8%9-Daar6bRsboscz8PRI1T-n^S`|;fy zshJtqdZMeG+Pr?bido<8{(YxT^}XaMW&#Umq|>&aBfbM@|2eED%E zu{}C8`0|Cb`}Xb$V?{?K9MAv#qbD0!BvP-TZ6a{z!Cpn30Q&#Y;lY>Bo*M4%{P4Z^ zotEp&b0=Db-2B|kp}pg$jvR=F1MyZ%Q3cKbw8AVL$Lq_3wz3V3>9}iRd3M8 zRqS}XX{GM2VRsz-AdS6n@Wv}VBmi|y_s1vF(AD6CzdBwN%dK$O!=Xb#*T-#UfY@{* z@~#&1#nfiQ8_i~_^<2~A_H;x8CypF?{_Jy;6XURbe&KSnhUW-s4X}5+!77gp8B4{g zqXXkswp3Z)O0KN0FD$JrE-kNZZ1{Z6z2m!196mfbzI&jv8;^~qs*Ty@txxYxeQ@>m z?EG>nox>WR`Bv8L>)188H(pNF9p!=EPM_tdClfBdEX&jKS@lZ6!fyyPpyj|V%ED4T zc->bk!+h*~2`>dJmA*o$BO0lPJF%L`mxw!^siAs3ihG7?*&p95K7Qg~Uyqc^+^I2#v6VZb!-n(1FP zFa|T`upg5fh`bV_7kq5z0!B;nc;%{CfpGkM8%E648M>%^q`Tzhx07*naR8gdHCLII~SqeDu{)yOp($|(rhp}XUMjPcJ z5h?nDB<2|2x?qGzT`57CDrKq8vIjP^hyi|dhlptsphQ5nLDMP?!C3DMPv!}Qq`+2f zq`8XJP3+5Zkk5%KEr~2b8cqJT)+%x%&z8x!mZpVCbX> z5Djmj(N2>|av<^x3X*>3*zv%Z>H$_kv>aam8=N#S$6ly8dwaWHJyYLUuU?;WWbs&M z!`0uH>FI0q_V0P_+^KWtyZU1;iw}^aCSwopSj1{I3-8X%CK`@zXTw*``z&kV)Ty4g z-g1Nj_y6y|K}g#b3gQiI(O^f`V>K&SS%DsdW(Qi%G8U9XJ6avlEA#XB)7kLg;9yrL z9@AWTy70?H0)g|PqkDIcjJPwlhPr}pfBl^okME!CADEh&o_(}-==kAp ze(kO4Km9XIxnog`nx>RPKdN`4V!1floXhJjRjV^|kEdp*dV69oTsXH8pXeUw!(tb# zO7Xa~<0V(XG_b;CVP#`=X%!D&1_IW(bEjRkOd*x+jK&6s2IDIWcySWq0X&$CUWN1g zd^8hV#9-M-y@7}xE9DW9V|fe~ySSb8GG0+s!%}X{(tDZ?tL5-$4Gi)zqwK*DY{pRb z7wA|SPjH<~tBD;mu@(o5LdYCF8F$5De1Kn^ef3%?lXUg^!rh@vIT!GGzxI_^zy9W{ zc((QGt-IInJeZn$g4mvc1bIS|^Woh5-~If(S6_O*SS($?|M}C!rR}Ztd^%Mv6<<7e z_Kla$9huzIi#HJI+q@ zc69sPH{ISvtGcw3FI5Xg%(U|-4=>KRGs$GiKlyp-QZVmv;U1z~YlKEej=%is*7W1; z#f8>(%DWkN_yd^#3Lv1b*1gG;Gn4Wcal42In4R2(2E!Zd)+A^nQBB=h^!7dshr?EA zz-9Gg<9yttVVpumQZJ7}XL{%O9ru6&chn#Z;|eiMP=qu-CPY+_$816vGGP$smEt{A zBXdVcFvn=sEAmsb0T0Ujg+W5s>oWb}Ws$kj5s0EN`2f>WI*78RsRAn6 zq8k+US!8Z<$&`YS1@1Ux0=|?FtBEaN$bPUj-nV0LsX&cLLB1pdjpWNl@+C9d9(fgM zelz%|7f6l|urQp64|Bl+XGV6UX1&6gCQdw=^5fkE4};5uQHUC=m~7RdgW`B0urQ=A zIUBj;B2E-ZKcG6ObeM!8TN178|T9SWtM%oVNCf?lK%%r&)+KH-(P(EzGRN&u*gDFx#bq~TF% z4m2D#B|%i15EYAUo17w%lwe9zOzAQffw2P_q{oFcB_FzpUq&y$c_G#&kHUA39S?kI z9zb2h4k5Ukc6qVZy$jDimP;A`3{%9HJ_P_^YB8LBL;1hR$tty_uZg~g>OwXGByLmay$*6M+J!(Az( z1t6eyH=UTU4mKS@Zo%STNTi0N(a6E0tLc=hTy_vf=Ibv${}+Gt{mpm=o3db&cr`MP zNN9Ixl-yrsVe#jeum9`cd-dP`@xOU+=Vrw1-qqI^>+Ze(c;Scd{y&>ZER^vyvFRn( zztq?hHn^s|+Nc#X=}#|xeCp`lY6T%~>hO`nx2vU%#Z~h}DW*jSc*>@4PcNHTxIe`;Rk=%UEJF z7!99)`E>vAuIu+7J(yd>?+_cQ@_+dLFaP>SA7HtBt%-NvR(m48mrou4`o)XSpFAG% zTlfJ5%a*1VH~#(?zxv?vjYQ5_s(K3LlI3$@y~qS0ajtFB5a6>340ejkKZp`&YaJx_=3fdh5h86K5T@8SA10+g-mm^ zSpDGch{xO2G34mLgRLViCu4Ut9+Wvo8T9yc^3L(Q>;VPtXv3%ytPvcR*$?oFBRLw8 z0b_LLADR@u%t?_MtB}x1K}z-rBm$P031CKg!xv~A_la)e2O@Li7l^^IA-Ay^kf4bm z`T~MN6i&GknU_4w6}3aK1u6tEv_qOvhN2c3%Xt`u&dgJA?DD`XR> zK%g5KfN4GZAu^Q1Aj~$;KtV%6Py-tAi$T8BG3rufK>1JI$cM{e2oh6*Xs|i(E$;M& za7=Q^YI7x8sf^4i2d&s3c=}YsVDD`IHYqlLoDo4R(F4U3=pkob_9Ag61)QyVarVJ_| z+gW^|5Kt8pgo5clOBr^qafETbv@;%~I}kS0lX}3L+`xh5Yxt16DGuIQ+6N&hW&(^V z%prur3_3HP@eqIF8kfTnl0yh7aRCr+X3RB4Y*R|i!(p)71{0e#gk&~?uy#&69{6%R zfO^Opj4$kE;t$~^ptVSsb@W(xb$dIXcjXIJZ#|xl=R)0^>0GvkO;J3UNkE8<_JA7f z_V}@}dcI!k>FVm~>_*gx=)5pH-JENLniYQy3qYC;1o&(+pkt%MtTO^GbUm0^M~s|X zTWs(&5dIPd~S-w*vxm<;vp5_LaL+KmFj+&FQ%^uw3DQFSxtEV`6t-DW6-Yrqh*54KGx! zHrA5OsrAmy#>w4*Xn5}d|IrimYj<;rT%f@pBA`0orOHsCh3A{CM!jdCyX&=!-O-L} zw9D1m?Tp9q;#F^@7H#k+i#p!Z3y-;-*@nC5_2#3Ye5|Y1H&l#;^R7m?GZqbmD(Ors zvE|Rk%f+qc?I~+;Alwmi?ru0kBMw(sLl3>i4teMJo%a9(clI_s6i}ctDjMKe+#aMg z1h)a~C=_8Zawk4GifdRV13Xkd#l8C=BWv1;K^#$bcD!xgb0NC@IgRwT+-EQV}>R zpJ$Gd7Niq1vgDl_(ZpO}Y9J0alvubnvc!%_7Q9VEU4S8Usc5GNH={ig;s_?Dtw?ur z5Ut5Hg<{G95P8kWmOA1Opb5u~iqxM6*~qsPMBW7PZb%0Z3tiP2p>(co}jP$2^wJ>|&*r8xJ;%>V4?VYfK*4_K}^M%r` z{+_eP4qm%Io#j@MF5HUv-L7|Dd+}d>m$hpM_g;xsGu3irLWxE=JW%fG%f{l{Pu-th-Paw#ZIXA?)xFLq<5ey!gg9(Fw^9^*6F%khQHZO5R zra2f*@kcvZf_{RXjd~B$g#b?oLe^3iGiQry86%Zx6wquHDV7FGEKjrz(Gz7*17zZ$ zp3;?+;$kdPk{AR6;aPl2fq>IWd^lxKRI!5K0O7dyv}2fkzvpbBF%6E-2X6|CU!TfweItzLIo zfw4UUuf3ew#@5L3(ZRm;Y<7Kp{`Sqwk%$M2p?!GUkkeVrXYXDA?7@xO2fBNYg(Kzp zYk^t~`#fS7KfI!k@w3}g4f?B*P}bq+VFZdv&meg5Dr?Q1N*(beQ~^kbYNh+R0?M{4~}$PJTZ~Z73S)Va;>tkl`Pg; z2Sx|qy!hgt@t*6qW-{qtmR+>83-&aJjEP5ma}vQ zt*(f_D;&i1cDas;?Rv3Nu4D6cboZDL#}4aOpu-cwK8X(=%)R*1sm-<3)urude`l<_ zKaQ7{mdlu)Zy+R=`ydnZ&DF!!iQ&1v1|sL<)h=kmv%&};SpLaUa4bR-&J>G zNsOcH!W*evbv%uWS@wDpi{PO#1ABz7SR~WJY9`z$d9a8Fe9?)ai-bMsP_UxERLE^? zt^WM-`zH^a8tcKMyaBxD_0qL#g+lSni4&)e9y@pXj4$xZfB59Hve`_&&IxX>-;b}2 zc=Gn=b3gv*%AJ|T^+c*%sXK8;fIBVt%W}rT!QuX{-Mz8>L%pXDPOh(Qt*vh?;xXZJ zbuC@Ke*J!Sd1H5S*?0GbXJx$uadglZF4gcz172r^r9}8(b-l0Q@~&=XzW-zA2DbQj zXCK@wPe1f$v)COohm}UW+kv$X+^(gAq15PL>A;@a?yFlk;&lf4G11R~<4bN#JL3O~@BjmMc4(Yd;2BK` zZ3ZAl%V>uRM(n!6FIH3q_^7W64iGAGZ3$4B#nGMofJkO07Ge_I5Q3QXCTy6(Gbdr9 z5wmMG5ag4eA~8bHgpn(GsN;MZg>ezsP#%O5gXBa)1L32AfB{AFDHnf|3R$?oi8|^D zcZNX11vOJr6JIz?jAuG1cE2QoDabK~iWgO zh+H$me7c1uK_Mf7f=R$Ed_kVrP%ELg$r;NdTdF9=5*veLijHLmCL*L;#EJneg<>So zOag?_b5w(Z!PPiYtfc}+3Q1weNHt{*lrvWI3fZhyvew9ymhh!IAZDl-D3^vnE&ci` zT#`#R)uOhBvyzgFOp*XV0jL%-MHc`;Jw5Bd+Q8B?;WJSTCs}24whNcqh$orKMZCQt zFOo=EIg>Te)__WqXZzYnGSv{2vVerrlm$mC0Hy>vhB?GCmeAkCrZ_uc01^%`5hYTw zw5>kj#_w%0Mu>_Ko)#zC-M-JW#Yi#34P|L8q&~ps5X^_2Rje=yAlj4}3WuP@OfRQMWM(?!ctGClo8yu~eiQ*mq>&wfNole%Vpl zJ{0V(<~HuU|HE>8ZFF?E7jNMySGHDHHlI!pxxBCJnFv0bsXuud!X&g}N{p3QA5y`B z_@l>y$ByPU62bFldoG@H#X^a>*+#jFmQ!uE$_U@xb$_|oS*{e)nSvkh>kRq_2YOE& zNr(Jb9y}~~oJYffbiKO1wLCE5IJd8VJC{or3LBMb#2-3w{Lr~$``v-?_4^B--I>F_ zHCQl>-vaPlXuEyEM06k+ah=$Mac*|SiziSUrGVEt(%sP)i=Yp{mMN(MUUOP6*RU%l z7I0u0ICgAAY>mBN(3stLk?Pd_sc^tkD?8`rmPZ;*Kcd>MuH4oJ#suyNY3A73?h&c; z)vOqXk-#|ZRXE;cxQwSxo46;!)-{aA9qyXTRl>$RSnKZfVu21`2!|qQl&bY&8Oz_% zZ-JbX>=@J4$>>%DuW&*SD1*55JANFfl(LDLr&BAdndrGxhvC(+Eo&AfSUdARrE1AuK?c7ML)7>3$my6yf ziy>z#h_(5&kbNkWiIy6L*~j^fB;4UHri0aD6`NfS^?Cb;a$D=(MBELF9j#QQP)A31AlwXwTmzw& zC%|5rCB1X}u6sa%J6ecFW}Hzg7(^(pkZ%}I@F0S{(t=2+J_<2xOn}(x5WnDy#AIP^ z(HW~S2N)*SU>2($r+3MUa1Qqrp__H$3Is0V%NcT@GqOOhfrn(!A*jm&kpe)HD$=50 zBTyU_O%au$1oScZ~bupwt|6^pOz^DA*FD4#bv>Tq??NiF`rAFdAe;6tS$LNSRMf4QKHs60(?9 z5@$M!3J49?)RebDhLHH8k%`hrB%OC&%RCxjR%q>g^O09U1JtR{{W212C zQ%D0CAED{Om_>=A#i<oyLYrhr+cYp{(NGRPX7ZY1ZR3GUo#;a-?U;O1!j%&=@i>f{E5mb?;k-%^v&CapofiKeosEfaTu;yFdU?3FleRRuwo>2q2i&%k0iyW5HB`jW>{_qkmGpTp8P5Z-zd+Z*l0rwrKcvu;p)cXQJ$l}9tD4R9?CKsK?t10L z)5j(ct!<{(H@C`_sxRn|cEz?IJ;hcxoKj)u>snY&{_lVO6D-)l9+B7~9#i}%EB0IH z=NOt`@Wf97jYPJ1>)uv5yU{4-@DM^Q6!PG0QeLm4TDQDqym@LRQ>u76%Om^ZnWY|g zVQ;v*BO1ly2fjoyR;u9bupH^Qkf?tj!uJGGJsk5sv&^Pj(-;10$S(uqk{q$$W zd-sd2S~?Oa?i#9ecJ)n6dZQ74G>RV}_+tg0c6ECP2F8Xa58c0gZ?Wk+bL7m^2cIWC zxb1T|!+xJ5+~tg6cSyVg+mtvxrVg29zjOSqc|d_XjaDbb_Q>kM3ZW>7V>kzKHCdq$ z!C|NU_hpTiJDykqi}{BGFMpa{5YH6wu{JQs7!q6+VEfp$&?LJ zcSA*G1=Xblv@xD20dU$N72pdR3}K9rm7315ML2WA1Xnsg^Z*GFnW|4$e}5m zHD~X{FM&uP-Hkeu@atZdR7nDVsU+DDuV|LWNo5HHvUr)>Azq;WBM72Qut+7@t%w=W zX>q$?RI7|qB?%!is033n z*n*S^B+{DFAqBY;pBYS20U|J^dmv_$IUp)prKpL-h@U8cB?ppL0J=hq3e$49#_T- z;Ky9T6_XRw*a6*ae-T0)!-u&>8ozO|bL@EFOZLFCddTW)>O1aveU?9lZ4OJ-O08At zJ9auV^SCfG-`AOYqpvfISyR4Z$KghtTdY_ctIqADdov!)l>+#s7PT5nzSRKHLRz(E zZhkfPcr!LRTHIWl{^;Gt=H{MPU#s4{o&9{qTg6flH#Q-0gU;#bLR5#XMM`+aGPSt2 zoUdWSb9bbpYuE5t%x`5E)}F2}_`}xN*>f))8d};YEpM#;)%RCYo16JmHdn0k=}mUK znC!*Vo<5F!YT|a!i2k98ed#N~NaN7tK*;46mJ4O}QB)JXF__|33!^*OV-}|7b~pT%Yosss-2Sm| zzWV&p{d@bmd+>%TtdpNvS-bgg{^RQpuHT=}q{_``#1#(j>L2af9X-5vcz>Z%{OF^t zYuB2!R;*d`^XXeWN{c_-yR_;^_jGr@`I@`G*LUK0H5e^-}o*}3^*Iag>pi`W8F ztM|Q@-@+Sb5r42(hg#6nQ*&4ar)R5BaUPfqIHS#_eCpaGcVBm~f6y7~b9%ZRPTc1F z`kEP7i$9JEJIC*i2kgL|)f#`OI%f1W;Ra(ZMP#PGgIC&tj4;{40BVoTfN`!FL}Y~4 z!uCS~euJ%eGHHhd6lr6rsd1P$2UP(BPI(KRJ(HBPF{rB=BssUk1DZgN=uK@l6fVPz zR^rcK$+rf8uWa|o99=9>T!*e*aeKRo0RdCho-RK|3Ew^@;%w%yB6%5s-O%9+uKsiUEjUYv_|O`b#TN$!+aP>VBXO45ZEE?4(%J<>wRpXA?0DeI_5fQT zba+-FQ7^F#p||A=xxyXQMmaPxKKjDT%Nsw>Kb-b^yrF0;5(r@NH3G^;q1;O5-Q^ng zLdUb1ShAAJ7w{IR1_EG2Tnsg9h5L7A{*OP69o)Nx_41kRQ}4XdJ+^Cgd9^e>>vp(& z4!p_<6xau`)uGbfSe*e>(Paoa2g6@FVGk*S+*H7*H z;Rg@q7B&#_IV)BD7>4!In9(j{%XGxvcn@r|h1Vsa!6I}+D@EI@d0h2Bs$p4?LlckFVceTHSVegY~)tKaXIac?|!IgsJAU4oqDcJ0ci{ zpCnLVRm)xP>-3*Le&nrJF5tmdytN9C(^j~-d-lrhsUN+6>EX5t1 zcmMrgMe?~yFqp4ZomK$1d8zI6%JSyu#D18|fJFz)hTpciu}wA7)otNf;=0eDFVtqY zlAqjl_jFs4E?4hChc&>(tgOm(JWnR6)XwR5!~=HVt}&V;GAg$QZ8Ra(d=1vj#TDy^ z8MRGPA%G~6uP#GKgpd=vN`#ginsjDD8u6NW(oT$@ zMPejS7(zbECoU2q0Ba@q1zwVgTzqqi60`)8F%{GlsU4e>ka|-;ax)AW)iY(7J+lum z##87nKqH>)I*2LO2Je~1yrftvE=Q5S5)_Jq8OCmEsUJKvf6hFEM`bzPPkVS!63JvA z6(F85k2w-xyax<=4B41=Fge7qIe@S34>XTtyiIcD%0n`VbYw|X1EoHcVwa}$H(aF| zlZ5FPMf<}1s31*^9y*gF6$e`+R6a6=vm}%uw-80V?CZ9MVg_A7OBM_1;GV({7x$1ZMWeQIBg0_2wL`Ncvv9wr`LxaN zDrOjWx0%Tffk>l&yY0w3pb`)kFsUz?)23FT^X86NG*d(p&XX+-SRlq=CkPb*Juo?; z2oM4MqB~hAG*jOch>SLw{Y^O}r}O`@z-N+o5<4FF5oW!xl+U3730ltxH`bHvz?Lmr7M8Q)X9yU9?gY^` zCib`;yNTN25QMOJDUlOzw89KD=AqFmu;-%#U3{1pkEH@cry_=TVQU>caOt&tc-fMp zQU^l_W#@}!NSG4GhLw1VI1uo={Vr@)Y;h$yY{E)eE#t!11P`+UmE1uUNn>| zb|8Bm_*o7qvSmNO9z)Z)z##)hI*jIk$hH7!6iEK!sjxs%1H)e{3PGfc@NIn{ha_?a*QS6KH3l9-7hX|Wr1&Hw zbTAzfXs8O2h(UBa_7i~gI7mnWxj;mc8KA z2ah*X4wa^S-j$FsnHpb-AsH({<(Tt@ky=Uv3Zt_851YwAB|=-k8)?lZNgZ1NiqBS; z>c|eUHoU+BvAqP*c{W2rC5&nlMzQ>Ph>j5t8YL~nTsek0WywgR899?!2NPt+(jqo# zafatO!2*srq=j6?3&TmeP&AQLU8#`pfo`ix%_xhGGYS)fmDex^6RD48C|N*NA%I3a zjO#=RfNmv0NIeB36JAqoQ;ZZtX_Ud_&avZxFV6$*I{%L~0NjIjE#a+9^?Jn}8;G7e zQ(9TiCq4`2^MM*30OdG@*}caFmyJorn8aCMKX#0T5X`| z#NwKP;la_1FFShso84#r5mh|C<_kosIyuV0<)V<+AVW-Ba)A zO5cCX!`n+9X zED}L1?JnR~1Gg`W$6%Y75hujy^kO0(kBuS>b~&tkzLwf9MZ22){Ud9bfKF$<4o?jM zI}o^%h&x4ajv3)QB4_p)2++B4J39mJUsG=QJgxxVeB|bgbQLQ>u$CL|Uu7r4Rq<7L z8N05#fPm+C5%FVx_Zk-D1gtUfe>ZsN2!8RASl8O3U6T^LPym02*Uwd<;r_+x$_l?$8zIf^0 z%r7rpz4KstV>?qSW1Aan772rD*uN30S?~liws)UfUijISYq6+jyp-L3I9)83n;uUF z+ch@oo@O17mj*2hi{tCqO}N2*`TgIE4vwH_433Yl|K(qGWDCti zV!BxJdVGa^acFc`FdD&nt;OYqYnMNC<`NeV>^&3-$KU_RTd7*yn!eRoFJ&%I2gkbu zet*jocE$EMJe^!9WjbA0yL0@Gd7vG*D@;H=;IkbVH>JR?J<(w8DA*|<^SFgvYc^TR_9piIx%zwo=RC2$~FzE&`cOiZz6%iFaa?k zEOA0?KNyRtv8I?=!sJO`iA)K}2Se6d6Zq4;69 zl`2Tug`mbo7E+uEMbQ#$Q$hj_q5k|boXka=pH!9}ENo$tB~)es%Z`Fatnc;LYVmC8quW-giIpMPM-n@x=l#C*-p+kPAygz~s zMx6ChCbKm?J2jOIr)&GY!Tk)Z>Xio%oolOD5)laZx0+V1ucwlXTls>cfOXd`XUOk~ zMEvzexL6Ee=b44Ygu|Q0-Xf7;&%mH}q~99o={&e6?+rg)+1}-_j{U#vz1Nc@N17*= znURrNS5{?d)umc%g>E!}#sC8h<}kanf_re5=I))}ez`+XkSGi%(ldpffLSW%S`9`2ux@Xx>S@Nn;n zRnLr6jnd<1wQ@Sw-{lz$*8-)4%U()X%Pwzkt=pF_rt*~vMyXpGhTmsx3wvtiS~80X zUG(1eaI7u7y1cZom32Cu1D%0^?uc%~%B|>Ww~TePU%2q<`s&tS|LEt5A{QIQpdQRJ z!(rd?au1Jdolm~aO;(4>gy#St)$ zzyk|Dy)-Zm1)p$YWC%L?tyYZeFB^7rme-q=d=8_4tOnxxhTVmwuAE-XHLq#aic!qx z_{nBl*Wlpj(C9u_uygXo+RYz+w7j|n0=|Gd8VRngZo={5kFJScOt~|7CNgIh#ezJR zp`Nxse)qL+zjk({4=a*tMJ%DZyngT5{H5DZKfgVh%H+|!i4HRPzSfKeeM4RTj-c1+ zbY)7_GFFIA2<|k>j=fSqv7`F^~T!un;*QG?;hy)wuR8$p35d97UNuZ z=Rw_3`{YyO&b_c<;Qa=?wg)TaE@Za;_Esn6?`hiX6AfE70ssjMiH>uLK`1cN3`YoueDw^$6i>-l(G;PDg-ApdgmOy= zK&yumz^l;@l$AQG9#@(`sU{dqGERaTN@>yDEE3WZ+i|o3OC+wN6)3JrM$*IwA!^UQ zQpFlMrlAx;xhg~>B@`m5gh2-BFeVhZJoCr!gNOIp`S zBve@_RiUb&U`Ig+47L=98B!!n$W#nY=E5Jc2_c+{B*XwaRW9hH!cF9X0R#*?Sb~3| zwp?tICNEkA36%3HP!jx*CH4`fpa!F=5*ZQ$K*6Gl%ojuvP@Pj7Qo)}p6dlQ(8K5jr zJ@OccM?4Y(6-7v;R1RsA3N{dsM-E9biyF(r0wGKgGNj-the>rISWXa#3GWR}kdPM_ zEg=C3RJKekF%3c<3JV8PMu{mAsvya*9630U0AO3JDX#Ftt;z(?S+4S>@gqGLf(6JH zk&3VZ9Pxz|$?a~t7WkdB0E0|?J85%yEl$L{Wk>%|^tH1~GxNoz1lAaZ zBdXf9e9*t%7F-Fn)w%``oIbPv#8FScg&`q@TsnDT?eW#vMCwibgE^Enf*|g3^qlBJUTQ%6J} zNZ;pQT+S@=165R6)?XcAJHK;9^~DH~)Mg6i33Y{nZS7f1Gnvb4=xrBQfQpWB|J>*T z=%g^hMBE2^a2TrFwHijWV>CCTb__4Caag=j!{`^TDTjT-%|gC}u|0@jF&8D@3($qp0V${c(%V2D%n8GZ zZYU~!RU{HRe0bkLUl*E%#f_Z@FJ`~EIeB|>dU-QdtlOJ)Oml;gKlrp4lo}4LdFa5z zpZt^8$GXD--I30hA1^F^F*!9ezc!yP#X{Y+P#|vP8s!4U(_qT>V6{=IRnl1NO2elU zc%^{vRvYD=c;@MhHrO9^d;RS(%=XjB=c;oH5r_S7DBK(LRSd(IPB`ji3<<)5t$0z= zxfQRzm}@+K>P=@gypmwkj>ZcYq}g1~C9gk@gnU{cVsVEp9!xTWrJv~If9Gn|u0a2p zEno)jY`S^p;|`E`3U{y>zoI5e-9R?$gle04!rKK0RZCF zXtE(6;YT<^3np@yrc9y^v>*@(0~-2JSRo}@0>mPMs2|~=nYb|`Qx2gjNu){Yw|M`C z7*Ya?9a16!63iq=(VA2R1_7yvLHWQ~nNZ3g1@pj-tjq$Xl+sO6l5$3rfX9y*a?NZrCd#Lf$%23spBqnH~bN(f1+Y@mS>pegTfXh~9mF_Sb1#;tX= zm^3jYe|NWQf!`?$u)ffrU@#m8WneKR40bo_e#3M4K-;-vsq__BqKM|B>~^FhfkY%) z?;k$#_In499g9XIm?8#CqGIHAe_vm3PrJ?QeR}nF%CJ-m)$;5D)O7DZ>>eH8*;osm zdp)v$Px1b(1Saz?6!m-oYXDW6nga_#H7$N?y=1rgIzqX&@QbM@o0_H9>n>rom90&u zZrNH~z%cf%Jp+gP{OkL>@a1bFmt8?Wx6AFskPN54Q03f?fAH-KvrF4Q`}kU=q2&$h z>}I}L#PU)ugvW_wC09zPiumSJW4LeE;+f1wGM%sBVTJ3P;$Z`i7?{4D9pUH=XUvI- z)A0%%pO?ama6)wq6xm)$>bk3~J7SAjwo0?Q(QvRIgB#*X%f+QA@ zH898<%Mdln7%yJKx~6!AVXa~`4gz?5Qi`E8n%nF4`~4j0QZy>Xat$lfV(p@)9_u?W zdgx3lTe^Db(emo%b}G$b^)`H2V8Imo7)ZqKb`G1TpQd-?22aEU#K#o%;?Lx?VOd#A zT)Xqs=k=G%m0x~(<<_IAmCXb`{=`6gj_{@DLyCS3@dvIg2=?~(jSt3LXuj&rk)gi* z`zC(z`Hjy%zlY16N-ozEo5M~^XrRxT%T<=wi)8~V)M6H*I_B*u8rWjmJR zg$u>U5%_WdOIBIZkJp<1N3l@U7KmDVJDS!Ymd|2mjBKU>%(LCY*VzIL+;PX^U$wDF zFev1S3fz!p_{;l8LIs9kyv3!QO*GnbsWrfnK!gDSHsbI|R3zA{<2ja{&d6`oGeJjH z1e_2hS^StLL%|1s&=qn>f*wN>QWO9{GLSP_m_@>tgoG6n#3I?3VG4$%QzGs~M3XSiU%CyFB(fp^Vy1AQVs12<0Eix-4`7xGjv#Z~5U+vi>!-a% z55iCZMMp7G2B+H*;|mu`tQg3_RE}NPR30TJ1we@;qDUhTrn5A$S{Rb2jUTm>_r5DHB)403e2H66jG5QWfl;d za*Dk~X=K7abm&S8+@~lk_o=^yJC|n1sqtlL&9garLXdl|M`Nj1%wo;HV%(AO&^zz?;+vtP`z;== z>2|{1VBn1n)2|x_>Jxgi8+F5vA&k1+V%K+2!!VNz#@ySSAx~(ir@JlSn!0)8&c~nb z86O-zbMn=Rp81uX*%!^JcrM{``fYx+rrC0SV5I--@k2)rHKyj5o-J-#b#JDk8Fk&F z>zJQpZ98ML7mD=;hF|yg^}qJU`Fv`}ee3S#Rw5ROynX6ePbe_AI$tg(eR#isp(~h9 z5mUUQV;=)q@VzI3X?~_|FXpQ0&1^8}_XR?!K)}ePFmoX)I$9n$PRI_w#QHDO+tX!W zNhh=saL9#%X7#x6Jb*rYgNwmpJUme9nBCrHar>QZUSBL6wbd-!YuiTNC}X~MJpZ7< z(i|)CO8n}>t#~S#%2n|ttA=m|Jjk)FqXW~>mnvlp#i3s^9i1?4IUL6B*u?#y-#U>k zeel_>r!!00Ty|!0Ia9*;c69oq7;qSqxUXOFK@k=Ux~*0PM$t=tld3c%KBf-Zlymhm*N2%W|ORzv8Gk6fjNitM!od# z;e2ANG}vz)=!3cTzVo(E*X&#I$9{VBbGyt6p|LaKyn z%_Rgtu34!_PwEZ%s%HbU)hAax`%2|vS}{kJWDQeNihLq9#bYhx!-rr{T*f=9_6iqa zqoN+bfCARn1TkSRp*a*2vCJbWfdX-b6xo6X&dE!7D>;}iB@~kc0U@j@HN8ACC>yE4 zLkdFz!0qvYUy>vM+2}b08kv+=pahN5V3W6JR135vR6;&vq#l%uoMA`NO862^5Gf!D z($SI?xNr!Q$VGvL3d&K|l9$pFUHuV_0?3{QAzhZ5rVz3c^CQI#Wl|)|n2KIRQ5q=- zGEh_q+WKAry0A&5XaFD~*~vAatw@8$L#}yBUZxZj78_J!u~3%-o=tErS+tg@L2-yi z<}F?XB55+`y@WH|C7@3^2~GrlwMtTCfj?YA#=7`Zqn?l@pggKuhv&qU<_@X}c}1U^ z2s{Nxxl}qpi@C{+Xyjuu#DQsIi3}ncs@O}5kTzfh0R+tx(Ms6^CCHSgAkY?kxnUGx zF)(}BO^pd_j*6p5B#Z4Od9VdCpat%?09ud=es{lXf!|pR*qfTy=G8SUCu*@e2lvF@ z`Nl>%m7SVvdhCW*E9(}&UE@dPs4YVu0X@;Dk8#lJ1}$`J;?~kZK;CO z;fbAnMKdzlYge{E`dHiC)bQP-Rl~YJM%92J^rj`E+kzK`PYoofese2s57ou;SI+)H|=9V_MlNndt=nDAHzjF4ScitQt8bV!s z=dJUpzrB*Y$rW_Q}X@PD~lHHVoUAvCHjCVw0m9UtpGck$dSsYE&!3hwFYER^zB zuU$R3ch4KI4_>|X_`%d7M%6Si?Ro(=T{#~?<{cWqS-4CCSQ zv2dvLP4Iaz3_^E0Y{cj|ZD4c9)BcRsAaa->!1T@yF*$@cpbEPO`kus zy0S{oNFRxRk%R8%AKfTb$!ILD$CuW(AR4X}LUXndf@1nJP+^xDbq9~lWafuI|M0`l zZdmG-o{r!je(U1Kp8d|77lu0{`DE(m_4%pkay*Im3AQSy z#KdEY1A~Yfb$_W)TUzu-{IT(Gc#j-+cf|0)K>fuFn_;B4)_jE`M3)UNlyMgnEozNY zz*UX}3n72Q?Q;gh82#_SAe>@B%OrBSozm?odz+^%+F=`XS;G#C)n&Cf}Gy_EWp5>SDWoJLm5WI2qo0*jCzQMSK<>ha=@vI6>x_kDnJ!g5d}jA{Hba~BJ7`| zUz0rU0LVH)UicB2*w_S71Q2uz0ssml#OVnnx;wtl%NKb z#AZ~4!q!|R6%!yB~W|q>7>=Yvg z^laLM6}6*4yzwPLAoF?(0gw?qB_^f9si?^#3`zoWd!T?eq-{*4R0dC_%p^gTg$^=# zn~(-+p&=C0a7P71eX`=IDj}4#Tp$UyN*`w61uJQogjGH;#hfH3X(c6}k$}qkowpJ} z0N>)FWW<^B3zAK8+#m=Z&}qn4B?TJqY}2-;pbB_*ziWZtAq$ux6K{8Hj8oA|>~Q)u z%y5oc;5ey!i@BZhPn+dZEaK~MxHs087Z(=Vqity5&}ED<(Wo;B(=z$W(DG-YHf4VdUD^1|Ms8# zvES!;v9R#J{>5MVz0Ol-&mI^Xx;43At76g@Ow8hL+I93^Q#p+Fs5Ku?&Hcq+{^*@I z&mEfR>+b8uW5e@>m7UG4vnS5~tML)^vUm8y#cY0VEnb2<$9n*)i$m5eMiUP+a7E?% z=4uk2p>3oi+})ShSgGgBK6I?}X@ss4Q_P6hz=SU7yqAwqOEovXL^bf4X@Twt8wSld z^?*0n?hglS_N|$va;|8%yUPaVVrl4Zf2ga=&@c;)vs|@iGk870Yhl6EHQ3-+U~@~; z;lRs;S}9+#VAzaBVi;sw0mFm*o8F69Du>^}Vu4aRK28^-Yks%Q@5C(gPOsZttwP3X zxoTjM)rQ?&Dr1}rCWbfCCG>G8HET7V-UxV`r^W{ljg7oA-v3d5|AU#O+fSE$7Z z4+}gs(R**T2Kp@4ARhx^VriA7JrLD*cVANrw0hi88zg2|UW_$`p#=VzVqIYzBQYJH ztvNJRyHjO~WrXeUA zlFX2JMfJPVP(l$UWG>=~A$WqIPe_u6LPq?I%$COTl%oh!ZmKAa3Wa7I3)=&Y0+21~ zE7Oa_I7K%B1pqJrsG96(F5xC6Bn$&FM+pd0G%&v+_br(K{GR&kR0UVjGA%-FrXB5Igt_( zS^+=|oB=`sA(N`8G9q*1-N2-n&7`a@fItfmK$vXB6ac3*_yb)r7kBva!YEplS&D@R z^LDpg3;fPofOj@-T}-m)wA6i-QrhAR;$z0x*4oPL8)4lx!iSZa#jpzPZshIGEl{JdY=`@onAO^!N97jt=?;x|&fR;G!<= z^k`=ynS11Pj~+PmWNG=~y@yjz9yzRygX4SbHRIjaPS)-$A?;p-@S~))> zg@bf9&Cx95og<>#aypU2=oU}A*B^}(j4ezfiLuvWIQS>}T~vQ`)HBHm+%X3x-64A5 z88c{@R6c^0tuS7wydGc9+q3$lP*NwKysoC&FKw@X-)2nweJ#=H07$wq5dJmtbbIE6_RZ; zjtqFX=iR|9skXRL2(NA!RYT}8UgoeyqZBy;NOvXVh{Zlq-e^Kt#q&TEUMyBLnIRA) zLTGG^k;p-9JP~qX=w*PBqPhFrnF%KrBDipHF5sr)#1%)I<7!qcJz^y$+c`38dG{uv!j?7gE52{3lGRnFl z1LXvS#Hz~tq7Ol7HDL?@Woan_Tgj(wU`e4#3-ClqN#~7}dbFS-6hRmPT(~QGVphPC zB7QFZ}SnCy3I83a_KJj|hTdn%ns)omZNDLofv=h#GwP@!?|qE z?Q(zT?N<_sm1JlYlYK>|&eXW(o(rtSXf^BRk=D;D@5lvdJRiwXRJ_iJ2sQfLK)8nE*CyA#qv;1 zx66YWf_#;V6YmHf+(|urSbO$3R4lmaXqfR)0Yqd!7-og9M+d_mU4^|Me=E0Pe6n^VREM)~ggt3TMi!j2JWEF(cm3+t^6p5cX!*h!0)^Tc#Y`!+E`cpCTuKt1E(#P?Ki!RWOv+O>+`-xweFed}An zi?3ByUhJfj^{p+vmb76x)Ow@RK(DhcVzuJ)Rm_vf2Z!!X=l;D3kL$+FGjFNbKROum z1S%CvKAvfJ=>tLgvGMke)MBa8eC^_!uOAtYdF;Vp=>CIywQA$y#f#^T4o%O_mNBs* z{0r(X-wkpZ(AJtnnpOAg6zd<}oSc04_{H4HMy6n?RhAZP1F`7o0~6=Z9QXg=r-f|A ziUIDZ&$W6L3$3D|zy$A@+N5F0?i8?ek=qpvMB5VhGIuMB2NkUHK|XLfnDhpN$g$W| z6T?7kO{ebkI2{hmd1x5<0;aR6R}cs|>P-yZ4n=wfeZk03U(cBnM|-LZ}{1A-u(P#|K(JPO&nK;x3(^}FS z!7l*;Z9WpVQnmSLdJ!XqdfNgX%(cS~54`?B@3_O|&|~`}$M!a5{EUH*lQFv^B5#+| z*|6ER^Q8|j-q7^0hu{wCLf5+48bIbqR9w_j39&Z2||wqS!dho|G5G^lIKkooP!AR=4`fa25e>+IW1i?QIxclfK9;gT?E2Lt1WdXB9wUA^Timc9|| zJsxeF&16coOubRiwPwiY3TF)e)UGf|di_pOF(Cy_5_iscV3T`MPcE}S`b@bD2Ey6rt~j017lDwygK zLp3TSKbzP9~W-~V~JQpn}7>JXi#S8MinL zgI!36nNlhUAL*B5KyBTqrMA*;zb!c6kHn(rn6_3bI)>HPE$Ab!YF0eC)NJ;;&1rY~ zoo)@WePJh6%izmY4fCcLRm|w<3`g6?4;`p9Etnm%yQgRW{{5G~ymI;ajbr=wzx~>U z?|$>*PBMFMZd2y-j4php3Uv_{Ne_dR>fEz zTm^|e%*zXO%qBlIyZE=CT#beOrzZw67Cm1me0=rB^zypP9~$f*815hFj7Bl(jaS2T z=@zKARWxQ-H?G`!@HfBwG+RWUx)q^)xsXfRHQndW=|;!s;9yrIFumY-wpe`p%#ums zi&1<5P%alL<*L0@!n0Xpdd4kJ8frwlcIZ&x;2|v9lz8wUw~Z;>Yct#Nl-u2R<`gE? z(Y-;eV+(1)OUA=C+}@BU(q74A^A7hwAeMT#lDhiX+ZnSuJ=(a>;^?&5ocOq4*Xy?K zl&|g44BS}-c>m*V8ry!}=g7gVFo?G#Bt)x@3}mzIXRRTa8NmUz6<4sFwgN2RVK~y_ zX&!L^H!!8t+_!=ba$qm42uBD8D995n#ReoyDnym&1!XDq@RkggS%}NQ*K!l!(DP+iqsFYe{gp{O%Y*kJr z2%!WKP7saADntbsi|{Yk0Y&D62vTxGlDYs84rW)xg#@%$4_A~HLbqaAkx4iRXCba| z#qg8{c%Uank~=_DARy&N88+%es{8?-O`NE~9NxbmB0$U*mDHVNUT&I+w0O#Umk%&h z6e%JoN|J;5Jx zaw$DfS&nNbGAe9SYg|&YSM=mQ<5Mq*nD$X>2pNJ=EgVQlF{fC&+pYz^au&ci5trBH z@2J!*)i!76#W(A@!p5a*u9;bUE!r6fS{$w_CK1GljYO`ok#v{p?po81?sJ=^fWhff z5fO9Q(YjzwpH!-T`&Rtsjrq0pp3|rLF20_-eJ%Ciu3c+7YZkZF;=&k|Mon*6do%}@ z4N4Wt@qE!;GQ$2yU+3W7;eBl`dvbQ}?kAV#=O-O)-sA7SbG&_N_!b)i5fP zFXp~;@yu{n*W%*l=-B@M<$oIb#YbN}csf_Nxtms(VKliAQ3C_VEAT7jl7Z16sH&P~ z@wu%1?V)eI{>q!Lo{hEz?mT+*{U7}V&@LNBk5u6wFoXjSABYC&3(%um!`$Lpu~=ST zj$=BLaEII88?~jj+pP_IwYrtBZKF5c;dP*^*yc3KjjiRiTE3vwFp;|pZIvh7?hkko zH+S{)jg61rymxP7dwV0Ec<_Ag<1063<`y>Bx5FO)>*vqz+cSKBew$-I&~XmdzrDfx zCGpK>=0goV8R>i%8mO!{PEwd#|upun4XCK30nhm+}rKBeEGBM z4|L7q`P1(l9qGXmNx@LtjlcVNYGn-{mqsI|jqaA|-y_j}?ad~-RWpxFUXr|NE zA|?*1Ixv%qUGsaKx}%l>-dS6-CsSST{7u^vK_!jQ0F$%T}V7rs-7 z(Z)(~Jees_0@Fc2XT?exjD@s=L}N6fsi-h$DN8${#AHgrlz8L?0%EZiXB>rrTo9Bh ziUbj%S~nfp@BxkZCIT6}yspB8<*<@(yK+`I8fj7&|TmhE5h32Jz_ycj67i4I0 z3HjCQ1~3#Db4QB{sK_j`kkRh8Yk{wp1>l(-4sR4bpqjP1+j=@roi*lHtM{g?Tg7H` zn-c;cbZc7N7~zdcKRBI-R`56qc6-KdMSm)aF)_Nc+H{o-`{Jyzx=?U9Bg4Zd-uY&^ zlwDe0w4iUiBUIZ+dAMLHzi332@mXyh82DW*ba~wG9Xa$-D&2<3yc5aAjiu=;*QT$1 zkmZyesUoi0oowPMj`SQ=Na-uR+a?(6ElaQ^JslgB&SBLC*Ee=@g~ z&zI5K)-hNbPN;^t%WHTU#;L;bT_ircJazowpTGa+fw95O`1Y?p`smT4r#@fky*Gz4 z`NE5Z<(2iFJXQp?!TDjKA4K}}A`JxeR>)Y)Y-M~dTdbqY;<93S*O0w&^XW>u=(0Nk z7-m%1+^XctSa%7-Sn%+mVSy``=fc_3kx1;$l;yng-0y-BC; zI=1hi&*ALq?XNVN*%Eg2WbiC>E~Zy%-9^k+8@wDp!F4;d^CynJ_4@fccOG21aqG;v zGq0RGIk&v=;V0LM81GLX)^bNs2VIgDOWvqnz5irnpl75n=5^|4jviUw$!vW8Z6~1mPjOVL!rg^+SzjSkHYjbKded?eS z5xnPMPTO}Yx4ekiYMMsH-PABUkE>b3SG@3_Snam%vIkC{@O|^WM#n&ABbB&)HL$%? zW8+ox+bwIw!tGmkV}pC%=<2~38w50X(E&4*jOz5$rztz83?yLd0r{(^ardg_siXf25hFOKSgp>AI zY5>p($k2c-xmhtth!{Mwhz&WC#566(b{@H8i@mTR4lop70OK|#M?nLkaFT$4KuicR z;Vj&Mh<`*B!jfVVn*;$U7%0Z3A|O2W5<&^23IN3%1ehQ%5tYfIMGC|yA!!IDAs}o- zI4T4^0l)(akxSMJmXwu*!UWkgk-!o}0V?$cpJ>WvqAwtj!?;;dq4q=*ZTYZ8V?jKX z30Ns45`=0Iq<$?ai7)yPl2j-b_spbNLO~A7+=5IfZq$bT{3r(;v4M=VV6lvRg&t1$ zPl7^L3`>C+Y%2l^T&Q9v*aVhBq9Vm-6-Y+;NSBlpHJl?;O`xhC;t&q2#CZ*Z?9CX-jbOLXKj_V#*@s5edW|)T*@!F+xxt3U8vbT&^`? zdC7qZAfc_G1V@n(=0pV#{3w#Z3teW4T>&dxsmDRRbft>o#lN;fT9EtGazdv!z{nu~~Pxok9Fc zwOFwnEtmY&TEO8PI)2LC(_7CZx-Pz>A3fE0KDqwWpL(+utj!5Wj%s7aSE^P^IhEYG zce{Of;KIO=Et`4xi=Qt&eUMsNveb(0-7$YR`sFeGqicUOaN)?FWXZ^sJl}lf`1w7( z*?0=mt?X=VCKKDiP}CO+Rn{_?J`yv_d%PY@QCPF(3VFIL&tj)srUO56yzo9%{q zBXK@`Kyc1T2v{o=a;a42{^aB9ckZueaubBD$PF6TE+pO~3n{p$}tDODSZoPjTNYgRW_X~nacZm&f=u2|4_Y-04t-tp0) zfu8QpaKML;S)CsJ|N7aluibmHr@I?7@E2FN3{1r7@uV$r55_BTQXWi>1CL1OD~oV7 z%3BFPj2P)iF0bs&&u;E)G=eUzTnyQoop$^5((=!K@)NAUIySM_?eQX{FBXeW9zT3C z`Cu^QySQ({m(HZ-7eciL-lsJ3jr8PddhhL!-_!I5tx=c7fl1^s56|xQwY7luXMg_B z*LM;Rr{}4n^slk;rAK0nVOAKaH9S#mI4cXY&_L69v7JVt8CptPu3|Tpt&o9=Cw4*; zl(fi@dsQvjn}WL4PEK9i}$MSNv|QXjsLtOEfbr;v%rH5z`0*;S17WBqi#uCuweq z1@KMTgp|?^c}gr(aDWJcobn=plIS6%$l4^yd!v<9MwN5XTS2w%0g6O2A_t35Ub{E-PXqf??^|eE$BE$4?(U-Z!%6JMX@IVDFgMk%m8hGDG??CA|d!g3oAMCyO>Z^@XC7VjSF>0gMOy_Fp43d=N)7hUlgUXJSco}sp&&*jF#Re|ddpCz+}8oPb$ z77gzztZiY}>!%KU_s#Qv`1XbOFP=YoXriON4L1fX>(cF!NB~bqlT)+H>+$@`*0W2O zmnQEQQ%P_^CpxB(M87yb79dZ&?LcnbQp^?cscx;-NUyCpyn5GxeO;r&?)El3FjUG$ ztyaSekS8Y9pB0q^5z(Kxw>*`RRE#-q^TzFcxku^!uycE ziUp`eDv*>w6g>}WKntsx01^hiL4_G0js67Hsfirk!+dlWNCGl~kr(kGCY1{QkT56_ zE)qH5MBRhRxe<-|;yk5Hdi&ZA*zHoFy(rkx~NTghNRvG)~yPj$SMd;Ni6+1FEbd zVI;Z9MWkr*<4PZ)0HXFFJgF#-S$~^&3#{vom5oil9Z*J-15QX0TxD-+MD0w0SVU>K z?toZZ&~OSFXaE$lltXcp5pY5bbK{99$5sWo_~(TZAfEAsD5wY}q9{YCr&>8@{7q=3 zKU2z7gatk>%|D^K%p|rJrk_2(a$|jVEm60e z^*UE>U1>gkSa3KBUXQ(_!`l}f_~-w^J-1N1^rf-5%CRh{!~D*&5wd6_HM?bc9>Y|$ zjyC)F{>c7e48-}+J+tqLm6xmf)Sf(<(QU?SM@C;ecLu%X_Z~eR9UHCJYrp#V zlkIr?pS<_26Gz6c+vb-nih2$Agb8P=OLGge1APY=cirKV$JHz7Mh=2zCAKB>h%W_ znewCOiw|ek5lQ1^Dc%uay(IWAx<_~(aZD5*8$>YU6ZEq;+d}^L-##0Qgns;kQov(( zIJBY8q0YX+ndNwVJKjJ~xdX2jtW`{}F6(NEhohs!#>qIXwyLdh>E8X$p4dPAy>Fs_ zd~Q3AuNUxG`P!Au*}3MC zBYl7P`&OqbIX~Y!anQBCVSMy!SEbOQyEanU()9DS<$26UiLRFk-E}+|9m*98cdu3- zJ&e|>Gy}eluvmPCH9MEfeDTx~irAyw7Ei>&&Kh*O!!Jt+$42O-!=~=L+gI8G61dYv zu}Nm@%RQUt3kffPNB+cs2uP3|?qHmXg3Ka8r7;}? zPozF8z6{w!L&23i(jzg^ROksQ00NTy6iGnAzcGSjCh~v;$|4}MSd1giaa0-L4cSbA zT9y@wNCgRHZs@BngP5yDU2+-CDFWtE$uAPM3?hJ_AQ}O<#fXGdbge7}ej+sUA(LoA zHK+&V7HRklMmpH|NP%lc0BQiE(MRxHF+e^z!_ds+_24OU5S?RhW&j9(e0~5t$eEEm z%CQM^!BJr^Ns==qK%vv+!b@Isx}#;tyk>CDB7%!0l!d`ph9Myf2I=l-$0QRVYgDk#I`1*^ zB)FJPiZ6jDwbvS6_{_&j!P#!I7gUPai&cs=KGl z?Zk|d7z$o27jt(`UjCc^`+E;3XGa6>u0r0nJa6kBnE2+q9j}~q@9DGow8r#Qa(%nL zyv{M4sDy5(p;?Wb5%D-j5kMjY92zU_9iJ+u{hi&tLwnplZ^swr1 z`QDHI!?|bay*ln10<>#|$ZO%XO>Y=L%vGrAGDk?Hia4=j565 z^Uo)>N_}MTPEcQnF#M)SKnaM5)`% zFt_H%U)(?^wHHq{ZGl6F4v*}ec>ZGjgI`^*OYlmaiKv_s92YL4HJK^?@E0Fqo*DG8 zKb?7zh-Z7-e5Vf|#CHzYCui28kDt%>bwu>GAl6$=rqjRt^wSS6U3EAe|MP$S zU%qzy$Z$0D=kI@`(a^76dteCd z&5_GA?HJ4B_V~hcUtF8|@YjQf$Gb*`hb&hA`sSGKuZKf*j83ZQdIgiTTfOC~@7Yvx zWzCU@`zmEP*@_L1P@H`epCD-2dil}%j()A(?sC72I`dI%X%7g7>0 zF#1r>fh-eL*iHgI+K^mGLpBL!P{hh?7J;G?L}aE|42prHav9E<5pps(BDx?7FUrJn1V`OL!0&IW&%-aVP{}RT`NB#Eu}Uj7{)GD8`lwNeU>3GO>`Nb|fqp ziBu>nGq@AuF&@JiSSv`09Vr`1P0|z#vJegl?i2^5uGxcb2CEWW()J`kHbR3btTKmJ z#>B=yElwp!h$#_8jrZZ|U8&y2L zRMCD@4wREGB?W@0O2NrZ9V7t>gev6|W<0Qj1i+jX5;p-T;7GOh{}pjLZw4TDlMy`I8fG8R(Eql<;1|3om75(JKclDUx$ZoT>EmQukWq5 z-ok(lOojepX0~A%8b3}&-LE@bwll|%zJBZ=Ru8>;_uiu?Pxk!&`xn0P?Pj%tQT6$n z_44gUQ!~rk+gZ#!15KK4f6=B*&aD`wJUUitS}>6N6(x( zHab3%$Q7oh*XUjGEJHsIJK$egM%o0FG;PUD;p(mXuo;F|Mm+9!Upw<(y!V#d>+AjK z+Q0sH|IgM={3joLJU6%S>ahdgy?8Df4!?5pFUlnYUOoDghpEU#&aIOd~iIx+7)o|&4qvSBTi9Yz@|sp9M43T^|$mm6fOd!D3PGhAOhhD zB;wI7A_GNyNm@}vnIZ;I30R3ibm0d)^PCbhUov<}$pn8`e_Umw!@gFl0u600ddkuL zL}u93K@=bk?Jr6I87Yub0jXG2F%zDOA2X8mOd+S#AwSxfVp27cR0O0x zl(?mVP%??IK&}Q7)Br%TDSIhQg^fa#%8wAD0Z*;EU5{dAcCQZtV8CP|lPQ$Tqy>t! ztI(8Fq?8uQB-|5-Ph(;m#YjZuMN@(Rgh?UT%EURf74c|2ib2_V6n28TyW6$ESH}Xp z$32bG6Z^)M}XK!*}#Zad|nJ&NWjRJ?N^q9c5kjyM0!Vzu|CLbsZ1yb>9An z_#Jk4P!EPJ0e{2mEOTm+h9i+Oo=jQ0+iX64)O;%A zu;5b`L~@9O`H+qZ|56c2(ygd^%8JQx^)~y`diwIU`+xlH*MIN*-+M55|N6a2-Rtwa z-FF{O#@E+R92nb7=2zm0T%{HX1>XPmx4v=mkVmuk50CzD|K=}mJ$do=n{V2!+TEGO z$IoUTy;!W)>~&0T2_Mp^U`qLt)iSlXX-8kP+l6O=V$F%c>sX-)o~VZTZZI&C-4+lP z@<3YnYHp^G%AZQkZ|&%#FykW-a7^bapWl3V_t8wfR<&vM{o_NgpE^7~GM37hKD+kd z&gA14i)#Q4x*Z6A3q=Fm*`|tr0=^;wVii26;ORlrhI_iddG5^qfnLm)dG^%dzxwen zQn}*dMq)djd_FVX7YScDb@b5a*!h#Eo-M9Dc)sxWU)*f(Xpi`Pm`Wb9Y)7x^L{V4y7q%s9){+|%cY4?eVaw(9|>-qRL6el+9@ z<7=ei=DI)2^=b|HY#0YKcj6JNj)^^MSU#ZSbe94FBj9cNF>!mtR<1e~fV=Vn^ z#3h6T0E9xlleV9LJZIfdn5>N`Q<(k6aOc5Y3p;ZhbM}aqE4?-!SO&tIYp+JrHU>WiSM6qv?QA7#c zG9i+1=93DUE1{4C1b5ubXcH-d^G{_f zQUW2INuT)qqisl9oe3ZE6*(1viro|}v1Et`I0~LzM8FXPW#*1YP-rn@f)uF;6LKbn za{bl02rrOIZbbmMgwQ2BVhE}dQ0M>(cP7gq3BEzag4Mbmi^sXNtcJ;C?3miX;Zz!6 z9Jfh>mXXT`aj3qGAtGhrNgjMvA{LZ9@P+KOrqW-jCSWvQYois!v?eJ9Ei_GBl*&Di zJb{&KM@i&qjMh6$UW!{LmYlHy~q^L|wWke0(E|-K_kUoH0r2@qJi>z=IU?wSph^$Cc5Sl~~ zk-xj`THvc^0jVVr8@D@>7?`X%d?CCK#6% zB{TF<ElNiN(CLCqn680uYB?N(x>T1Gj^kxZmw-i z&m11zd-_1vYATnj6jNBpr^0W}=vGX(VcK6+UGs$es2?05x}|@4`6eFj-+k-+z~Qrh zfAwF#Soz`E!w37LUH{^bzw7e47q^m^ZruIs%JmwmS?bn}hjU&93fb=0&)MOH;yYP(1#@yJO;iM?9Xn@_9BE?YVF^^7b28y0voau4QpH zP%C?}#w-?eg?1Pn57C^i?P@9K(Nb-pWGGsU#+s3k9tqTJO{@S=kH-V$a(kuNjIZWy zJ`Im{+uaTeW~2#@T5Lhy#mcBHuiU!5|1s@$t}$nt*#3SC-XTLK6;b zrQech0hNX43?8YMiYZvv7~U|7Bru?fDhI%rw?`}dV73&~NlBXZ8wBWISeF1VcNhV| zNQ96GLiISK7Y(PXJS7;8BS~F_0z~%E9bb5xEf@84}D1A;6Hm1nXo44E_j3q2ydt zAS&!4UFYOU67ml~&_Mq(DFIC`3XqWt*92yyuLz4e0>hn{Sn6X3M2v zE{#fYsgziQ3Na$YIoXL_OzB&X79s`!gsdqZZX9B?R3%di3wA;Ru%a1QND#<7kFWq? z5v2w)aV$-vUM*Gd=1_MzTs^V&N~MY=wmmMi8CZ-$!}Ky3^$uc`oh$^K#ul~6k3a6H zEN>8+UUUO_;ma(tL%xYE!jM13R3)TA2$Eqh245EWkUT)e1)@?YhhD z3smYwqvX;@hr+L&Or$q+(*-9(27E4IY3m`j!?}cGfpXIy*Wv ztE*JVDavv*e(=O-UjQ;C4b8|&`&4MxM!n8$7z@LNw#L^tB`La~TZF5;5ejo+&8 zV)y@VZN#W`$XRc$rHViMG0KC$!8xnrkKoZQphW0cBE%S&T}J(&NnD;oaU z2fzN&&;E9Kb5pljZ{C`mUERh!@wv5(O?Nc#jAF5K@lFh!hqt1$F?$Bl#f+~_;Xl}X zTR4XRyb}ci80Hp$8$m=*@4@Io{G15da%}W3s^zA~0vP_$g)9_=lYCSI_oh{=wFi?= z=BB5fPtRI4=Wu^_Hk;p0B%PY2wL$=F4Zq7V(B0|K_(dM(t9NLwx?x>ejsLqJ{>pB1!t(g6p{ZLd zw#Mx{Qy+HrSNHbq+PN{0p07Q;%oJMgS#(=qK#K3#CzBjaOQpl#_F zA5=g6G`za##P_)kixbn)(DPgH1X$1-d547;B4E=N`TI;^w&5ZTI>$d%)_)`cwE;Rou6jQjCimZFl>sT0l()8J~PU&z2a@ zLxthESJZ}Dh6b2binledJa2Nj?ks}Z$Ut3W0S=5mBp_h*RPbiq!-=FMn{^McCWThJ zufh|RiHb>1B81dc;I;TsA~IpIbnW55QY8#x1%ylrksd()2!VufAeKq&rEJW@zer6~ z1ub*9kSsPSH!*oex5PYZA+AQyph^oys3;(SKp)sf91aT@@(>W1LYOMD5If}IhrQG* zMNOq!b`TZ{$fWv`E9tT)fuJOaJ#584o+#Snj6(S%6gZogf*7PIA|SXFu_+8U;3#OG z3I&!Gc0pJG06+jqL_t(YXeKyvRRoaCRYJ){D8*47z?oWuJ_#wUg`kS_pe#+r90i2~ z;gH8z*nCV>#mq+l$(E<7+u__ar|$H+otRLDlelxxh#iw5V%Du%y#|JS@>FvwP&*_k z2@*6HpmA=>BkU<4HcCN5GEKq7qR190nTa&9<)3NE;Z3McNLGQ+wnC0l6JDW8F_B{A+}XJ2(J{-I%4T&(gASJ^zB1nt^5K?$Hb4LL#e6!G3;IK>4%J#ZzVrO? z!w-M@6L&Fxp{t{PVc9pg95$-%X46@>IE=c-sL6V(tU)E+k@NZ*T~Pz`k5sD&ezEW> zzB|MhrcSK%WT~e&wl|(lZ#=k{SzOXJt!s4b;J4lzI)8rn{AoQJ$(ITk3K9uh-~X#W4LS8xGE*v7 zzW0M4efs5%zTVzbCk}6Ck{@5cb8T|^%iB{6o2gO_0}<^I7Gr}z1k>-4Mmef!V;;5%=>_4={H`>eJ4;=*FRP(HkObY!IO;nU~I zTnS3u>iW*d;a9TZ~n=<-_Y##v{AkB z_{C>8?(SrA^{Ta0tQW9C62Bv=TCm2I(Jba|Pp3EWg}~D*pKmD51v;u@jx3M2*OrRplL_! zj>|x&&)bT|g!ak+wDRuuRk6TtPY22C$o?_h!U%1o#g%?tURVBb&6#3VQ8kbW-U0xX zo>M|eg0}^ziEB_5kJSuFtZ76d6CBNN6_ErKa+n}RvXV?8&ot2mj|UQ`lmg0RD`?=6 z<@5>^Q%)FLQ4bM{xu}GM1CYvM%)vm2q#*{gW&8z&#HM5xY9a@`w$P^t@`^&_Hj#xd zy9K~naVIk-NsV74Qa(VTD+WE|Qb@MKU1BhB1bya_BvNut6N_ZXW?wBZ0Rd{XBN5;Q z*uy~>p^hWG0*1sfvg5l*WD7SrQYLPS0J)P35G7L%Nb*{ek=Ou7I7|Wp*A$$xC=}!| z8-)-Flt@aEMK(aNClZeo0P@p@l8J7Tno)%UNHF@Q2AH!8I}M%@@1_aGYsiac;(#=B zgfwKt<&|*0P%76OiGbIqW33GM&T1`REcra{aKMk=_x5lYr1BUsB2FJ^(GEulBxV71 zF+OnBIaz`)HZnF9;3+i`kzgcRgpvVNN&qU?1vID(uPRGknwO`5rvA$Cq>W9~AsM8E zz2Jz^0ZSUl<&MOd7CgZcY+hoA-QE^N(9WI}qiV#{>0$|kONoM?AjoAAZnA5!6VgH# zITTU2Nv#yi^VH;PUOG{z#hwOZ*CM4-l9~4ih>;)_+}(C9@O7{NYKPtG^x1q--tRVR z`>9t->D1co`vYD5XQSHP%+`~Sf03Gf-aXjw@jBxh8-+w7QYue4J+T)n_UE(ya>aqp zX9S-ZZz7WsqIw{HtY}&eYaJZeA2@q3fA@Cb&Lh2Ax5HVWKN?d9TAMKpdux=j)Ti6y zHv0PQ|1W#*8D-aXrHS2_bAFW*3I!B^LL?GFfD{8nDpKlJOLF(Pdu%Uv+g|Rq#`Dwv z{n!3$kEhr2tkqJhMLz;2P0dyTp&PTf~^ z!#Vrxz0W>r-*flbXa9($ud5P|bnf48b6aw&v$bN;?=1wv?GuB6e5qfrXbTlukGET# zu#n~}1ps>T{Grldhs0(te;BG-u~^vab=|yj>*nqIU-VC>cf5?1c*hSO>Z2HaSblPzVj zTocP+Hi;mVVd0r=L9c!o|;hMUH?D}EVHj9OK@7^0ZI5;}c z{p^LaJ};a!Cg2Evc&LBh@Q}mpDjUs*OY6V6avhT+m^62Iym)ni6->JUi*zhZW&ziY zTB%-{N>)2+qJ-D%&l2Umzdu2t?zfM@~k%hWSC+hPf%YoUwU45r4RAGgG|x z=EA=Hd-?|sWgpzhL~eKcV(9K3}ux4?|SO(dP>_lw4r$0mqm|wC)B|w`nwHD+= z?o_KoqrnKQMt$BhQu4}{BCVb9XaQ`SxDY@t+tCVoNA(~KAOWW$wjY2MZHI}J8YqYu zskl;irjUtDsNk6`4zQ#xTG;lJpjYggoG=Aq5us@BC~d?l4+1U_f>AhPUPLs~U&xa% z&XWKzHIq|Bid$iUu_~N5WKIH9F!&%rlMleFc+xi+0W}5_uMm)QM2s$>UM(9{e6g)y zBWAc4z&kuY-9hW+YY6mStIgrC!r?3?q1|4m&*y+oKq*9&s5%r@pjNEPnY=R#j8ift zm*kPr3Y5{nU|txCDCv(CkOUwJ(z8-YD&|Q+;-=L$D&=~q*r-(v{OPq8)+=$E2GcEy zbys&TGan?a#3CR70vGsKVvoRT*Y zDRjH%T?zc*N&tFF6`WBF8fUvFn{sj8)ui_Pj*0d>Dr z9kjdlG_`1A)w#IhOJy+Qik5@5^7Nd-_9G41YAw6mmBFFtm%d>1MKTY@`Q;EZ`qCCL zi46xcK~3vvH*4soY_?`+yb$w0Os@~_+2e}DY+A$P4wo~)1o_ zu9n?)WBmRrzxmDh^z664{_@LTei2G;vQT*M$_?zDbnxhrciz33NEe&joE3bUBEbzX z=j!#hZjVR0V=q5|Ve4W+(u8PI(t_8!1MlEer+|gj9H(rEA{o=B{R>#Izu5z&s$MF1Aq1lQh zz5d zt+TrWc3)_{Tw5wvP9Hv=y?;M@ZO#+$hvCZJ9k9d>U|^+kwYyN2mF5roFco(;J{;yi ztC|5@jW|_hd*q<~sIiM0APrH0n)(0-c9~^ln-#er3H2FZCTb!eGC?F)36aJOl+Xk? z+!IFKKx>dDMOBDE+Z<3?QD_i`*3TJfi8Of>{DO&$vb$hB&U_T*MMx?zlMg&#){qR! zKRX>HBE0!y++#d2_lOs!L}g0d3nS7|Q zU?M2YhWn z$r?=~ozLNGgG_;wwjxW~fZa|j8DLr^J`f`NR4PcFu)s||crVEmO?l!8K#Dl;6|71E zgluq3inQCpK*;W~D}g^`381>85u?Y0I~1GKi?)U?&1f6WJqJcEK0Ej0R~qBf!_m&c zP_*Xv8*SaFH!Lu9Nabv6Nl!KxELYqHEZ4OPTRxfx`ba8J_&x|7xDt+g&t338bs;@* zx9th}4jpVPF6-&MvjIyKSiQp%r5&}~ifv22R?BD8UBP|Dpu^*K2fRTzjCXVo*sJ=+ z%uI4?-ro_~bNbxbvH0X_YOdL?(rg1ZGiZtGqc3ie73m111)F8U9zg8QrNvLptxwFZ z9y)aRD@ObNgNNg@3+GNBhcbWZ>eXANM7 zn@2B*mxkr7^nZHw&AH|EQ-=?pJ3iJCjX>|uCUc2g;k{e;Z;wwum|4sestudl?ex?4 zi;ny`UHBf-u=)a8hrbnaHpBjAtTRw4w+)Z|#Q76XpBV8L6RUm)J}RV_*6ej72=%;z zExcf#gV!K90Bym#9$Hs}?{aqEg(o9l|I^Z1Vk=#!W^*M+v!pc_x02;#7W-FOQ3>G$ z8A_TA7pze>2R^T$lGPk-M}IGT#5Y%SxhoUSpvM=DSY2K%2qFQDJCNHSa$DTxU9BBK zA)?ut8W5{L4z>yzo25aptkE{m;V30pNlqydRBs4m4)W9msTW`XXRDH79Z!4$Pmvo1`&NnNP!$x7V^%7e0^qe5=1D2 z+1_zOroo-`zXFPS&t}WdTujJBoEYGP@S@O2j0$2LVuTo|vNI-bhTwv3U1Wx5rNSsA z@(6&PC(4Cr0Q@1PjYxonpvZ0$DsN$JrJB!Tq8hX8r2Vl6Qeh4oYJH<#*GmO32mQ{5 z)m5QzxPQ>!(S?_9DH0MVCFGJhz&$%KxmPbDDn}s35~AFMF+4*~U=KGEh%`XM12`m0 zlr|A#2MJwI%}tjRTYT9-52uzTG4|sQP8L z!LO*CWDy3UwF)e7;2I3Pw1VOFazX3v35UaOCw2EkCJVpj0OJA6BPnFzRb@`fkhOy% zk-{Y?OH9nWq=e00UcI0Y73wRiyA-R`CiT83G!R8e%UPr(!e!;cPth=I1;HguZj}6l z5h)kOQJ!Xf0xF`#X0fqQFy!~MwY6J`bhccnGEQ-=icQ#;lu}rdlr#V)0XRc&l7_7r zVUl~69nkQfjZSh+w8DgHU&O&@rZ>x*!!>V3BvPB0WcS#Wz#p^(P^D!uf*mzFW^APc zO-R?hu*-{_Jm0sRUi;Cn>J#%0#~OTFK^N4pxD?K5YfWpp3jN#JZq}_@!3q-y7p%dd zuG^b!M^l59LmN)w`v!tfoON{chYwjWTkOnbs;|AGUwY4xEx{gzb4u_j(z3=Z)_k*3 z-rVRkT8Az^H&w9)Ty8iyY^D>n^~CtE-%YMA#0NWiqMe71oO$MnJ*DdOdcCScZ8YuG zgZ+Q?!t=>&@o#_l^9NHKusWgH4Db>)lwPdw1O+JOO&j`FOVfahMsbp;hJUf!Z&+*% z%-CaJIG;B#x_>0z8F}kBm)^U2YhJ-@e-4-xZ37qXFLw&s{it zc>mI7;`;rGa=r54-u>jp=1ZS{`r-U$`sM`FJvvlY;26lVwwX`o?|g7?7L)7oZ~$*2 z`BEiQD6c2e<+7pUy$qX{TI_JNiz38UO87>M{gv<{6ZRTIf#P7G67d$>wwin2=*m{J z>%gAF=PtzB#z^l#rh6p&>g%?dNq40JuR|CwVJC|56hzVWBG=`Xtv}z9sN2$1akkoAeup2s-e}IqV9&EJ+S29RuikYeOP*BC0;35ud9*I8 z75aMBVa+<-DTgEH_2u0GxHgB8h}|%}M$-@b7DIDqliC}v`X($ege*M2#5?OH9D4F%kKzP38M zeD2`Ui${7eY4e6rUu!gB$ibEgrs2cU?X}pPI`(&?klcO*G(Ab;kf3aUs zz~hX^qQ{Pn9X)a6?|<-%htn(gx=Is9j{6up8+~2z|N77V2u71X{NYa?PEOVe+4~P3 zz%#vdv6$G}>hA9J2K=o|3Fh0!j~{#f!nw&?*Z;5Yd~YpRc#AFr*;l~ej`t1GC8Nx@T4Yp2Nsa)PnRIn>IhicA~IO_E}*PwE+BtZ;I7CSg~ zYuHt)q&rk{^kVbq(E{}HpKrQab}u&my7%BsyREOUYjhu0 zPXzfzMr&6Jh1)l-&fL8*=yM;7b>v=o%bhI->+loVD&JhI^xOzwTHo!r4th1aLu+$m zK640oJpa4*e;^VNQM~q@yrXhiVBqY7!O&C;pMyNDoDl-aDrKOG| z#HqnZ1{grxBuUCbhnNsR3DXgz#mKO9?x3KbJh18SwBUdTCo0nFW}3wf{*2?t%UcaKIidN;2D zO6Jiid?^;mfw0O#V$aN?U@d?VqGSv~lJlJel9n(cDb^6)3qs!G7PW`3GZd8>%sQiB zwnNNlgo^IWNTgP>7XjlIKPt`&t9(JhYSaMMMd2eu!@z1(<_Hf25NIF)A|b&Gg2@d7 z%vQi*iU?VP63)g*HVH^x)kz`5z2pEV+>i~E2&wUPnwmVqw%-*PYa$_{-D6h*fAA9E zCs1h?($1_7o860zO)-h?>gXoeg?&<+;g~i$5QYUyEMQ zVaNjaGEppIX68#90Vz0IY}rf%H3b3MPcjs=(TzTV(aj}{BsJG*Qi_h88W)V|Ji z8s2f&l3Te(RmVqI8y013`sTyg1%R@z zli3leo|1QTfIuTL(7S=Y(FBMM@`2#+dLmz4NEmP}4GwB5japu#3T|K)TsN#RW8x|Z zL*KWzKif`sIV{0Q)YZ%_-o85dtKV$BeL1?e(veDHD_-o7< zy-w@Xecj=$bmHo@XtnIY1QR~{G_=g61&ccn4EAfmUM-5xJSbs!)90L>)MuP1hTZ;J zgzyJ&Qtlwrcc|2HRTA;F#cqSr!pb84A>sI6{H|AA#qQwgILTE>F+r5 zv$~trMRWy1n4pMKD#4==-mz_Nhw$D!m`=4V+z=yy6k&3>Lz*ulWQ9K=jP#;QvvVRO zgP9Wl0zq&&Buptfh*TH|hC4ps7Wu)AoKyfG3BvT-cf4Y%R>BxZW;u2H2qEB~CN^7myZ`+hu%)SH)0mJ3GhDrDqw%{iAQF*kpd>3&XMRkD4NxZYN^)S@ zEK-$qcv?tIPh^)DvHbM+!#hQU8K!D3jsDT;@xcoXB}?|@^#gs9(+T%mm|=1SL)c>+ zELQ7W2;_2L-76gMI^iIaJFPNHl1fTbZW&<7Q_}fmQ>JY;5 zW2`{(NdSdQU^k%^Ayxd6L}61{i9n@Nc=$~HA6H}nT03m_G1|iOV;ati%N2e;ViNfy zDCi5TlANrlNYdb8mZ#h?L{&qCG9EyZ%k8wnh+>CW6b`~ELd>l~%NSK35I}d3XHW0C zgQWC!kI#ezR5eFdqz&N96TJU%%T2r2fmv}F1hx}-d!r4V2-h?UDqT1eStm0f&Kdujdsyy>lz-i!*6+`;&nSL zPIt1PXDdw|CLQol4kH$>engLBb-CPJPuakdS2`t=o(0_rU%WZ-0UGq7V}0Rs7ryn4 zuUMQ8*mi&a7q9>H^>^RB^>ov^ROZVZjwT}$<{!f4L%_q+s!xpob zKDhOZ*MBoRJBODFr_&1eD9@fhec|Ncd?uAnCDVz-P;b}y(c% z{ou~8FWp?v3>hE85&(4P%4Sb5l z#;VwDx1k%ATFnu0IieoT>$SK7D1Qu+W+st|9l0TB_xKb`;4ycQGB$%%Q!8Ly#4U;v z6&B5ypK_?bvp!3mMFgXyiL=EbDIcZmRrxEmMBtHBQUM8+2q9vkre>i~3N>}FG!4>} zWYk1R9Vzk07hTaV@P^JF5KinKfdT&_ zg~xD`eS}LMga*w>sOhpP6N%)X8X11uj|?R@+nh37kcfDZ1;X<6fqZiM7cxalhHVTC zT42^fyuZ%_wD4|#)uQEeD!O;SClFwnFgx4!7!Vh-DOpmol^g>=1gl_0iXsCI)8TmK z$Sp4b;qQ}i;zq5g6$)Du%=F*M`XB}(QuNF)4ho28sZ0cr@&ueLw?G^bC}Hp( zppYP{GY`fRy9f^_RqGf^B={5Lyl04j3Tr9}(@X8bciAZH+Ofkn28vb#t5J*4+G)u{ zK!u!F^+T;?0kQRvZ4;s55P`tSB&f+IlT5{|Gr4&vO!7dc0IzToLQ*qC>hR7pqJ+{8 zj%{4K*IfyGHY9-hjY$KWH%Kdo7QCj{edo^9Gr9EAmNivzH#Eayt++jjP<%1inG43c zpExpl;>d8{5G+ZWExl4L74w<*wDwFP@4>_grfC}`tHj?bmw_ZMRc>kMkzx~>~S7z2W z%es!8CHC#zTW_={XXfET@`a~P`fTmXAKc7jvOoIitN-S&|LW|SlT(Z9zj^n{+gI;` zZYEzW=}o)C>$ltXbq2@!J1o`0%`5MvYW4M{xmqF96$!lj(na((-}(6)o9VaeWvK3$ zo0pD8dOB6R(7VF*!L0|AKYRW1*{4o*_V1lrzjbe7etKaI87&q|uq($7S7xuiQzH?E zAICA@>{w9`AU}L=#421%19Sb=h9!|VMq{z=f$q+jHHfvLff)37 z%i5fN>uT@TdS9azwOM?iPTO{5nt$v_X)}Yuz($u}6`qnvk7pHd0XR7UCy2WnOwl$Yql zd}77q+%S3PiIp0_W?g59K=C4BQsM{#F0)P(0b>O&Mb29Ge1Q);u|0v1ybp^BksfT-eB(GxZq!zQhiATj|U0+L605YEV=a43*s$g7f* zeTJ#lOjS+R6iTo#AV@^FMe|dcm9y|qIs!nMK@n!4`cWIilVVS$14rb)SvL~X525%% zJ4ZMlwdBp?8uTflo4v9)|`t$Ri7j#nr6q zu)xVI%)!ay@1Jjz0vzm+`9iMq;Nf6r59Xu56V6h=ZO%@qQeaV9F~y$An z@k~Q>L?)GkQ~)pYbWB5fpup6`g#)N@hc(8LP%sRwU0xNEnVihEOQ8WyY_*sUiGhIZ z3SuJXt^62_AF)dyNilP*;moGgbfh=as=CW&z#l#c5q3K@vLs^SY(E1f5pnQc06`*3 zlG#0WCGgpiz;^YA&g!zdLt0(0H+4t68GZVx!p-~Tn-f;}&4PpWkT)F)XCocnJ)_4j zJh%VANW|;6X;Ag+ji%n{>A`&K%JRzM+?p@w3s!Y|Cao_l_z#Z^pE}ivPlouYxVZ*A zG@@Xiz=n;rJ3$!^ixx`_>SxfKu{3W@J)B(K=-a#Z$qN_y`vx$fkxyoAdduMp9vg^m zq@(G4F@uR+1FQCHFkZ1(oJ|AMy|CrMgfW{g%ZB{`TQ{Fc4Y_OIy*D{IIg4$WU=$C> zB{18;M0~voKPp@VFED81n1|LpE;qcq!xioOm)@V9o`EBTCyt$X>Ddc=hxblSudFR@ z+_`@D{E0))Kl9|#L;G&ro&4d?fAxc3ygoeCJv%d7EfwnR5*E_dVIt%9`<+g|raygn zw#yB*+L#MxhswD^ z>5#!O{mF1AD@?>=N~XEKn)&%p@-AnwBNV@QVetG(N4Z^D-S9V>mPEEAo5NxPE#PZo z?~+E#TdjGkWm_TZDHKC`Gk}7D!4UEXw5X#^&0lGy9;|1>ce?!Ub~t7k^l4Zj1{+Yg z-IQ+nv7Q*t}+h&o7Ug%1eWH!z{9zo1S69PxRxeNqABLMW*;Dw-^S3KFV+ zi6a~!RaS5{o3j8ayaK>mrUgNOs3)?<5d2AX#~o2B(gKQG{5UnP@F^*vAHeo+N+h_F zB4-zlsu({S#e`M~1UTD7pb0p~3)pO5y+l5JHO zkFqZ8i%iI$NLTURt``ei5AJ0aX2qS$KQH%SzFIA8ticM=9g5Il4yzFOLm^Q9Jn?G{ zS;m-I(RFa{cEH}#iEUP~)JUdP043_aDh(+SCLscx<&Ju|dc;71g50hhgkrs5@d5yd zBqf4T*n)SvYEhs9LsD|b3c*$<3Dpg&A461!Zr*|c*iYKJ2NNz#$F8M9xnTi-rH5GPYjI<_w3m+7X-x zgp!>-!{^Q)JaNL0Ej8f64;!Jvz}(@o!?4-f`ry{hg~g?Qf4DPW3}@5L#l=9e8mqUU zoF;zu6XV{vw^)D!csu;Yvt8pri^qVYIWRwgm7z{&#pQaqnJU^nPn>`1o8SIcZ#1^C zurP7y^6d3nxvlk{uF%N7!L?#DU)1Y0tW@Q$s@y$;R`}3CVbacSjjdUA66_jq4=;~U z+_CFu3!f!vI*x{qg^-}!LKG6f_n`PeQOV#%QLjcrku#?bheE;8{lj1X$``--;zjJm zasBq4x8Hw%0qeDjg^jJ$z~In&Uhr5P8BOK z1d>q9E4G!1W%C`?YNXlna@q}51!EK(&&%cmGL*p2Wigp= z=s9xQu4VJc9f^5iKT+K$U zs;i9ktN@7Ozs$U;7B5YnaDb<_gnA(Fz)C$}X8Bgh&OvHDQIn)O>f?14_oNQ;0>Xbv#Qrs%b%&!s*>jiVpkb0@K@!&4pxiI_xe-8>0D}Nw8 z%;MAL@1KGMwXxBFou9?(hz zd+bW!Gb#bBymb38g6i;m+i18CACA40Sjc4>nYl-EXVD+l6QgGLGH}>>F5;@RDr6Z>L8KMIi zSH5h7?e6(#N4}zW#o~qat;M9^n6ym_}$%I6Z%cyIS;|KPp`Z{NO=(SgzZxm@w>D|g?y{2unuc;fijP)}@iJvp_!^>;se{npIt`0bl*y>#k8 z|B1a_oiSf964EvI`r=w?BazE)>bXqXsxNgmyCaU_{+_YpC+ptGcYgWy&GCmY5e)iV z*3NileSNsM?+ed9wY;&lmAGA@cSz}P$PWJ4p|QII?~piqBytXYo1GmF!tP|sd}cTg z1tC{_wdK1F#Q=mNE@;Ehmayuxg{=bZPCNDq>V1@IYd|jlobJ977~1W}YPfn0F84 zjq0t{(w;khZ_w)Pwt50sb_=hh?k+GaI2ISuu{h+c z9?6S{LBeF#++>dlnVMCAB~4M`C&^Tl#1M!`Rkb37{0Jd+g@hFbYFBHpF46#TJgd~UyYcK*-wiW9{Oc*31q3t^b1pGn{Ibx*bTA&3`kRioR zGP4R3hxso!RWjzuB*wg%Xv{E)*gfq^;4>xxX=75=G3gFBi|vSR=uo%=Pdyn=Y_7cX zp3|juhrO#tJ-4x5%H*tF9Zl@GYLmBN$O6XViQMK^W~igH7sh)H!)MfeZQWLfHH)%J z!K63mz1iZ-eu0e(4IcIl9_-qK?lG0EEv%j%9Pkc=_So#VfA)*{>sK;UlQyFsiAQ_; zNBX+DqdwcIKsa?`5X$5ltXvHEf#CvGU}DFhwE}+U@IY6!TwdQw)(j})ZnbhzEN9r^ zNs}iZ02Z5W+{@qqM%xW2pnyalj;Zbc$YTe`aeft|54-xMV`;1XAnlUkw2EQ`-|JFm{1_i9yae!wBt|Ut2Lhg6#pZSSsLi_Qe86 zy8S1*JtJ|)UW{p#T6ubL>CR+va!y}db!aVDz!w}DjvYIRj|o^B?129mnH7TtFbjbH zQW|7P2n!FOhdTQ*12 z?$q1$vev9}V#Y!Lq6Xa8uu#4Ac6+m)zcS;DN9^$)Yba#(4O!Y)9!6!vl!xNwAIOH$ zyT_+R0;b|FWyCtVU4b}U^VlvtTvfjT5NZh$&nl-XHz2725E@w6I^;7uF$fB&6zUew z3b|QfRT_bm6VzDLT3|C<4lX7Up-d$5yrUSIXyw9$WE415BAMeR6Dn&=YlUvht9r%U zG3ndMh}@7B0s$Y|th6lhrLu_G2cko~Vvdc?jFCXLL#D^KJI-c+ByuA`#0W?wIE9r| ztf|@Q!usm(XxEO-MExC|{&=S|5O84AW0wb>RXEMcHq4$%slRX{*{s)~`&M$^gLm`IJ17bHzPKsB9wuE{b!xt%vuq!u1o;Dgfjj{?|i&1D;R> z`?+#kB^PGLO-po^IbPIYh-v6X4KE%QxQ@whtYZ1B>PbJ53e4-1vs3VT78w}g%Z$=( zmBdwnF+0o&ba%K=MB&1a1G;->B)Z;A>DZfTr-&rW0xR=f@`!>)63&RTp72u-`c{er z!a&u<%b19a&A`mCXw!jB1q11fr3(aB1!y^5S-)PL)t201QUVL_^e8R4a#bFVHzcZ&yVg%XV)`N7xL-s;?j`Y zk!-ZqmS;Y=^rqME*fZ3R$xyD@YBZC{#Ots83QE@T-oD^g(pfIUd;*?8Y_M}~%Dy@x zE@^sfN9;eOQK8jJZ_%)0uA)-jn4GGuZ@7B8=f>|tp~YSuZkw&+z*zk7fuZ9^!u?&P zN;w=3oITXPmZ=o=m2|yg)nR#qX&$)MYGCR9U`O!Jzy5iA4ET>fdS!Bco%^k_ErSk5 zOX>aC!|_nv18+EjHsQPmUkY3f?AhEZ)!-JfwYs^nk-)}Gb!V#)_Il5pJa*yiNte@} z$d>QVEW@u0=9C*o3wzIg^`#e&9z1aUtzW(Q>o?}tR+rXO=}cR%)?4+e9VRH2_U8KL zZL4*0GZ9=%4IDh_>FC=^CDIk6uP>6E*(h4P#f(02%_E@{x^)9?kt!LNo z+)vzoSYO_-m1_QI#5Xk1b^Jtp?*V(up84UA^gFj*8|xmvm?;hvKaUvME@XzF8+T(n zl(miA|NGTJ0^kWq4S)|+CCs(~T!I?_Dom#FB?(WA zBQeIAm4sZFQ9>IOl?I`}6*EYIpD;nKN$hNZiYUM{)fK@;AacgnW5pUlggqjlB1jx! z`%D0nu%J;|4>L?SpkOo~fPlEDo`Eh|XNXWHj6_OaO&|q9HW)={V&Q{8;Q=e$lbcvx z`MYTCNaKxnbRHOU`2uzqR);eKR3nj7>R{5DW1<<~???*E%G=&pXRx;p2Q{U{W^Q>2 zyQnILKmH6m$n^ZI%jb^_?WJgysF+5iL=zfjsa`IpW+#hV8^5DbzB?F-?iulSc02t( zOq7sqqEy1+z0@LXpy7l&cBeO>Mcb{ep76k6Ig^4*_-ZC&jv^n+Jzh~#(~~{jJzYb? zV6#}M6ia1vxFCak@C65%kP^mPRk&oqJ0|Ac-7aTWGyy=|NFKaWW4?t46|i472tj3WNwlii)OsmP87Qv4UJK zgjW2~fsQ;0fFJ;CATN0a6v?R`gJ}fg?rB#7pFIgYs@rIfXsIsE8@2?hdaLdl+SC8+ zGsS$?TQ8l8hMT$6?Kgg&SYLYK;upHRy3m6r5}S8ExR!V@dA?_8%<8l*F1xBV7{6oo z8e^#-HoFHlRUT|;oF!lbQ%x6*uH|kwyPC~xCY#RYbf-N4pEc2ty|c69^b?Nmjzn84 zrSq<;eZUnN2!+lb=-J5VH9cb#@nIGVRZG@(!)?`iV}bpB@sXkaQZAoL{cN>RmmUDN z?Cfa%@c~Zo?%}qzhkN2LKL2Da7AaM#H}6eeAD_zCo8S_YCc{I0FFkYa`Df1IU;7`{J=q*(_dTINMFCzesI@WNc-vr90Z}e-=_YNS9qAQwT)n1 zbF8jZHrK&`z18p=b(ieL%N%VVDsNyCc=P!391AC-p~lc2EgrYEE&1enZz*D1T()hb zy>-n~XqWD9=EJvOn-3R5w*3Lkj!Ad8Vgmw>ImD_&vWxnTRmjf9gZqRF?gqc}i_M2q?*9002@%a;h%zJZg0!l+rKn)+sU;2=1^mbYm->fz>-qCw(4oZ-+gJ4-^%8 z#bIdyRMi-%J}NIvZdL--7|cq`OsPsHud)2FgY>MgY)nFxDOoX;Bngics_IFQ5(iQ+ z6*ql?SDdaWHtmK5E&R1Nli3U$wxb{ftE4A;z)hyaELF|Jv*<;DTzSEaO52cH$i~5J zQT)8c!8<;hA%c+Emzsn?@=h=!m9#1i5ep)~v0AHa0Yq@`&>-^NV^;#7RS8JzQJKS} zyW6Klx?sqzJ2n65v-@hb>7TtCHEI{bonC8o{K{KDzd!Eq__6J%QLjerw)1xHNV%%r zyzX9E47HkA>w~!oHaRv%G(kDol-Qc#o&!{ccm z+BffU%v5W^P#Aj;ZDo?BwPFi?8~0cCAJ}sw=BS+>gvrPKnM^frxIC^yBmHNN?tkj& zh|}Xt<+ES>;^$Tpn}7G}TQHqQucZbUc3J9RH^KwsHC&aSdt&Ur{nIap{GR2NmEk>o z=gy!0&i8-%qhG$$f@PoAJ2rOg$g$(^B0XtB002M$Nkl%^25H8^j*V<9er4zv#yR3h4~0Hi<|1h}L-DdB z+s>teWC-m~fRW9C4resni#zl3ye3G7=Cs?jlOL{P{(b0L^=LzlIYm0WmPyAYH%Q z1j10e*`$=tFZ4-DQjs5~SB+8K5)qkK%qj@plaQQne#9EFO9TR`@!}v5{?XzYfj_~7 zB#dRZg+QFpe40zgv3SXbpBKMaw= zV%^+EsH!oZO+d*KDhqj6DRE{SW3>^X;F-Yk_()_@WE^tDB#8JFIN2e+?Gj}$nCy;5 zpFeXl=<^AU-P5iFK4TI<<9XD6*fh}~I9FmZT5u!Y4EVkJ>S|$nE?ClsyuOiOpx@){ z)|!1o(V+)p-53cP%z2ri@AzePU+e?aQ|o){=VL-mqcH z2F}%M?P}3l%CvHumSSpcZfa$5xq=g#+?z2FVU zD)UR(*WRdqaKp2@8mbk%4H~!DC1)Uo{60?nLsaDfQg7L<_`{QYhry79Flz5+wjN;- zRASLnx3-HO`)!|n9s~EjgJqjHS;o57YAoPCJ9?n8vZ|#su*d=%mU^RFE;>UFTP$D+ z`Yd?o0j$52E`~mB0-u8>$OyjWh-UM7?7L zVif++(vVi5%~;;E;UKXJXO15QD3ycAMbqKP&jSRAki0NN(h677vZaAi{h?}arr>)i zZ%J0pausC40@+}nzywm^6#>Ny&m_sjs+|iGfG8FOjY3V)2qB~)TY`&-RsIN1%tS^o z+)JKBY79b@Bqsqrx7sjYDJK)3U}s{nMEC5Cjf}dyKB8h;Gb^OVdz^$QpZTZ47==SJ zB{6(Pm*tH_oxWr4U>LLSuz(k!k37NbBt1WasRm!HlX!(91XWmHOU=)G0_PxSvjw_) zVcX-4#zZ*66zj>OoJgri32e(0@+;{Sprgi zB#L{;lN?B>;?)F{azF~0;P|{AryXvCv2S*>RI8OL*enUMlq?HIg@f#=Lo$o))SK2H}JRaz!G=I>IQm?RZ|v0JFLsEJ*;) zY^fT=cnOeXJJ}VCh~W=`+X)nPGh0Nqd+bW!Gb;gU63iWM*c)J?#qD!7!bZKKg**Ds zpKm5|rSUmed$TJTi1|VdtBv-^=w1rtRwC=F&>S4CrEIen(WB78U=wx#dq9N0gfN@I zJO_3U#V$L##h%4Z$-TvmBmG;6XSYb7=r3SkrOo##0ie*S#OWM*Km0UZ$>UR1p&QKi=RPf25iB225Ksy(eo%%bZ zkL^n_-41t^bmA^OHCOgZsi@A4J8-Z&c(}t6LRY?-N!^)D+#J^zRy?qcf@Nw~Z|~T#?lb4GEmwVcJ#&A; zzz(U2gtu04w+y&{5kgoKOV6SFMEQva)@XTPln(Ehb)Wd=R5>y08L}!E_apPh1d4OMFOo>&~N<-HDP*@`X3nQ2_CHA{W1ntXqvf8R(W9JaYUwh)%E zId)egK2hv)icSr@N|EBkz8WU)aJlGmV2++X-mALK@%1sT74yQjWP?l#XUqsu zN~q$7Lj&g9@DAYjV4qe8el90IO+$v7awLzG+euJ9#9+#Wo*(UMmnH1^3O_q|sVG3* z7d>5ZETY;Wt>|t`(=2QRk`tm9?vO=3DH>w5#;*@#f_MaOyQjyIHqc%WhB3>rV#)rEnJl`yr8-^b22=osRc*3#GY-we6^TGXxE32zdojLKXuYTd;g>#y& zFU`#!KXjm2EHAFFSE(IC!{v-GRAO}0GWLBSb@qu9 z!y`i#y_!lFU=o4}5jbD*I2^4?(OO8iv+K>R#YTFoRmxiGC2Ipqu5!&*!|8JPeO~w# zgSeo+yIkmf`H>P!PGO0UwKK?J3m-)tF1Tc9TU~H^)-q}UmZf*-*5Em%?XvCaevP(BcpI?UHO#X6y|&@*;Ijw& zo*E24JrXu8}}AoyOg^+Zo#{g(T>DpJtv;%yZBGtiQR48-m1ld-MyShtbmcD z?JB1_?(HXL5^;DxfRkV>AaG*S0Jkd^3WV*Ju}JVtPq#KcQMz&4Q?0r2q6D)nPS&)l zm0H8v^u@iFpxf#XX?7pXpit0CUO>2ee5xeyXvSSih&7u=;VgRAcAPLWV|8 zHpRnSAS*CAfNdUt`7h}KNPL{Ag2g$E&#BV@>C3wHNdET`dry@sjlk3Nu}Qetas z^1q5~FTALF9U9_;Fcv-ag1*RW@*VEXN+N;aL_SncSDWAX-M1V~jrQ&WbRC_MgI zbgos+LnDPvyvOD2j71XZ943UwAc%4?5%`fZXNsMwAn74jWI*zu$^&ChI1qro4oIYB zHn`QeJr)Y%Euw|5!vL0A17xZm0TR-Hoh#AXFi=s02zPC1zp-dn6$V zC0vLgTY$n3c~Kn-@$MeG68MZufGy3;BKFaAVM$`ORB#>Xz6KUs!V zceOUZuu;)5eGWHR)p|PH$R(QDO(UOzr+ckw*tMq1+Rmqv==U(aYqwb(@=X-Jd9kmY z_|AfAi$$$gOl`~jw1GYLjQmzT7i&5~7(LkoqKBcu3&%WY#z*$`J^Q&c`}gg^p0p3A z7k=^Uw>C4SIyae88ZY`^beG%Z!+s0J#U7nKGj^5YAd0UW7#dsH0yW^acLZ(wyMiZ% zqlY>jhX-Q4epfq@FHJ1pfB#D2-h?$<@i*-70UAGZvj6GlJmF}2Wi9*bx3V{Gxijft zql%qrZOtau;F4303>L#-adgKTxk3Y8^J&Td2?xJ8RI2bC2`~QK3TvlwZKpGPbm`?) z&d>=%#SiP2flSqJ_gZ@$O`}$6wf2^+uJ^B|-@oR}7xB)8WfaIYvTJW>u1dRdYqk_| zhC;q}pwrSB(rkVd+%}Qj>!(oy{3fC*1jTOk5I19Z2C7#SN`cH7p><9TAFhAUrTibUAVYl8Pe) z;uabZNRw|8dOR7G5n{o=C=z^PCaK{_6kocDOmU2R(MN<&B@Dufx}rEmS}4i^5td1=uw?4-11=AjxrFmaG9_;N;&P-yD zQd5s4^51gct)TnxvCjPmAuG<8P-f(GCnGZ5KBiiAbW^r_o9?c5r8US zb}5X8#sBbA&&<91CVka^!~sk9)yavDz5z_#P!3jf`A8~?C50-zKFc4WAf;it3XWyq z2On!y10IjP6K;jEv5AgYlYbF1(jfr?RZ85kJxGws6P}^^dtLCHOT?K%5z0EI^CN*E zjAwe|aeRyxaY!Mt=CV!_SZia#$?tJPDj2j<`FyTWkQOF!2&EWVCxu^@H0!LCID+L7 z`M^)!GC1ggM}c4|$Q@#tU%3cT5N76?Tv0(1VFo9;BG_zW0>&p*IAnvMKw~yflNhAU zV4xM0M7w+JO5nc?383cFGTIr8LOpBQoVGz%?;n3%s~Y9ku2{CJu4W60FpNy<7F*UA zTGGyGxBQ{j z#lwBgw(YeKW|r2s{`dd$?-I)k$42-5$(O(ISAYF)1M%2Ke!eFXNCw={eyaxj4%*r0 zSekZgvpeJ(+dKUEXP!KD{KV4w+TVQd?}zv8`^F#t@jzF{=H}L~-*}^x%AOq?o?BeU z64Fv)qmyFZ*=+-RUI*k75Q-j29%1Ct~UpKzhb-m--$e^`t7y^g_vcYjal#NN*Raqn=* zIqbJLQkyI9O|D+QUzk|(Wb;0c&(qb{(Kpn4{G@yDsIiesy!rFo?Hk@~sz-0Qv0+lX zf$@O7B)eLU9k})Q{4M0RP=rTnd`DHr?vL~H5AN~N#;(_3_Jj0T!$4FxJ$7&?;HZP% zn%yiHz2fVL&E|KyE4i|*j3sngEgB5_z4=sHPnW{jtJN^LiHTwe(~Vf|ThkmX)!ge3 zv3FqruS+M|mR_&L3aw+;VCFGdf68uE*`Pk4B&AZwh%8J(6_E-@oteri2WBnTW(a_#{94 zDIG;6+5z5HVGwWXccRiTCE72ODk6$u&=VF#F%kg)5eYFDaw2oWi`+0)Pzf)RZQ%yk zsCh9i5NfylHG@?G(&>e z$g3R80ELYL05{--nNe79rzSxaJbIH*q-*SG`+mEe{se3LDKWx?YFjBSl52sDBZPno3tB(fwgl(n22Wg#$r1_GXG$lKC7) z6ADc7fRx~t5|^@&d@yUw4+{%DHez5XM4y~U0SonHHjBQJbqF&e&Zyt(^TSssBBfl3 zSs@U3!9*+3OrZcrmaLqVmRW#&qh-}r1cju~RP-f6@Fbqqy^KnW2nN&o_Bl9Bt})2;+Q+Y(^AL8K@#6FPW}ihv4lH!W%kl7@&d%ZehlWQ-JbqWB zt>?4l)M|3|-uPCfhAo}o2*&m9yQ9HQPc)=2Y#6s6IA$kZn9^2#hlmv|a@5%5Q98^XQ(YCD`RYwKtl`_q=<3dTC}!tLwQ` zv8`)Qojfo(H4UZu#m`+B86JN9{p-^!X-;uqg4V7L5A}Ze`O{CII5;-YyR@)4)D{22 z^B1#~>UttQH8mY^Iri;6aOQjmdfIp2zI6A_-MOtozLIP=YEVOg17~)E==V7>(Q;dD zUXK?xirBfMTCbto#IyzM6C0RdX*BE(2d$3qeqz7?q@fw*RuL+1iwi5g5f`j!tSz_G z77zKpc;T$pGQRu$pS*qby4U0WSKs*hlTV)9Kit2(x`mylAa9wokx3+!4f<^!U;}Gg z+g42W!_r1;``y-#Xkc%5;ADU3$WVMJ>Wg7wJey5TEG=EXwS0G?wvmk5T+!Zv=>7w- z0|(*ety$8uue@R0pJ;8abm#?7qYmzs{SEP(9V6?4&0=j9%31;T?q=u7u9zLC>TQLi z51&|vFyAEc3RZ4$Qv4GdS%WaJb{PwmVLcB|%9_)G(G)wax(&lxF!XXkb6EXN&0EFm z1P38}c&CbwDIEx=g&BGcpLewNTJ`F@Bk08|lg$^m1omnUIGKTd_=whrx!ZmEmz01g z?rLyHgW4%0b*mJB9rmQcFor`kRScX(-9q6?s6a9p6@obNyp54hW`$D`)STEANLA#6 z1dBew+6>gxbcmmdn#8Izp4jT8&J(*-KOsqSLQ|zjDk2xm0!UyY=F$wZhd=RFp2^5IL#mWaqJ)9KnKvXQQi9>%7mIg~9a+OZbsuYRkCm*c znW>L=#R#l0@98>t6dy4KyU8usW_hbaF{?PXSg^lRer;96BAK&VhtEB&k})@`tjRMo z2^pKZBA%HEEz&<&Nhh<*3&@y>|HBtdy63hw`|%+O5=AJ9<&NSb6?CTP`S8FR zz^U$B9;WVoj4Ez-Tnne$xpED@9FUlN2pqv#HFo5vcophs z8Dn6QbZU)~+?v869K6M0DQclq0yJpKkMKl74hfHcFfBI{18&TN{85yE5tewR+z2g+ znGHnCnfDSdH+Ya|fT`C7JS!^1Avgsapwy2D5kl;gg}RqkgD@mf*oDOIX;%XOrAUCy zoo@9ku#WI+IxMucru)$0&M&;MI=@<5NTPA+HcKh$Tl71YJg(sI@Kc|E;o!kBe5R|{ zi!IH-W){ZL=G}<@X0@JKPs9vk{lRVT%33rUvn4kI%k$oH6|S;A)V$a;wxKwNESj!a zi@`qc5EfGH?e9SMjZ}p=v06I z{ma>0>iP5MPaZk)#PK6rncVa;OghoDp}0E+hKBn32e6q$wWHc>=r*l6(%<`?AHGu1 zs~66lJbn7q)Wg}?g{6ZB502~`o|(Ac84c7^R$a&HO!g0I#OKl>s}=JowR#hC7#J#G z5Q7agJZ=x>J75w|O`f*>FofX@2<|m*HUzuHQmd>rY<8F3=J$99dgIvL$Z6Li9!oJ- zSX*Ak3{I(GEHAH|IC?PRbNO91c+urvwY2h;{^?N_gvC$Wg5Ce@&7jBH6ZGtf`VRC( z#s(r|-TuK?z^&_>T-O#7!YwMdvq2zY^yAF&UxbUp6v!himm+sxG-Ji0|uX&3V zPaBJM4Tw)h5lm&9Wbl3_`NpSDOmCx)WEaWWfesUQAA10d!_s4rA5Ox;hv6-a)g7?! zakT$G_TKYJjwH(ujL6K$h}5Dov$RG5C}=d$K3k+ za9{5`&3JeGa9ms4o#k>kqILIlPYa;Y(6UfKX_=K;>&*N8o<{;bJ3w=G$=RVxaP$Te)HLd4gs@Svz@^BQWdNp=FIaq#L*R)-a1krh zGX?%xlLd#3moUNyLC6=o1cg~~BuE&HgEZ8a0ECiRsM-L=p(Yhc2>()>87WPjX~+!7 zip2*RL4f4Y&KXlNgbXTfMUPRjd_Q40lJSJr*l3p1N!~x@;B@=sG&Uh388S*10ILLI z_dgT@MUA2op$lCyrT7>2C=Zo?b(UBPp7~TVm#k^Ncw+eIiPejre2rd?>|u?~Q&_fx z;XP*X&`~oOptu-ji-~+N7a~z|$VgR=*n2g1RUjSv^1m@Ob1usemaFKEdtAMJOgzjN5qdAb?CFAKdJc!}I>JFM)521X%6a zZqSvv+*-$r)s*d)za2RHY~))DnaVHpbgAibRKuR6$1HdP2M!#b#x^~s(dxk4A=-Yc z)hJso*MWo6cdy>u+1Lzs+ktvf-`aw+8MD)LcN(xG;U3^3Q4mA>!x?0qTF>h0Ax(>R zJEcaWT*0)ycWQ2WeEJ|9yUh36=n+AF7fE-a*sADNgtcXqB)DW-NG4o^+| z=^uS>X?^p{E7wZ-bgy20<=K-#U*O}5HVyS5`b>Jq!D3#+1BVNasO3C4 z9-SWz&m?>Y$KvB5ZvwOX>D2m{*RQ|(+1|Y+e^VP78J<3UJ~(|~Fh1s}*Hd3!>8vif zSJ$mf&Qt9eFgfBxBVH|3fv^u1U!CYSF+xLo#)}8cT_oQKksImx8KOE>Ny?IhWYCAQ z=e3bBOda-Hff^6k!NO2T(=5{!^p@+DI-GyDxrU(0eQWvJhR+$g;i5E=5_%K-?Ldof zG}^U#yMk{Vnyaa~u|!wQ=&e$_wvZ}@Z$(Dqnio4f1~t>{!A(9@B)g+m<3*pH{p)W{ z0;0I1a)AMqiPRN7p=P1#po;T>)kgvuEUEzEP$fA;V|<1_A&r7njVh#6)V|>e;R(*7 z=ZRO=Tfs|8L{1XwmVyxC((e&3Ng=YYBOwUjNT`B2d5L-{p$sH{yr9G6`z6&6NlyGs z$Twbz=MyU=LIjmc*yluLS4EIl>4TYG8Wa!^2M7TN?i?N_U_-2@+8;)&;y=c5(nq;4gkr5Cy}&WO~{KdO^LC`;-iQTv~lxGhXhCp zmOjf1ANs_A?Yg%54pW4ROI2qx^IjRS)eHY*w7z@lP_IPtIY*~5NMc zB0KW#OuGBWz68FZ5xgJ%@|is_7W*( zkTp!43_5z%daby+HhSjl>6c$g*J@tBH8*>>Udk69Z0uaWw+&nQoxSJ7(Gw%nYx9$} zy5gEv38b8itVY0=4m5-f0%dr4QfKK}jh=4!Pc|MVwo zn;XN!V=ujYzEG&GtZaL%!0Bh7+uGUr;O)2XT)Wz7G-}1N-?W0kP$iS)heqiqaKhXK zdYCR;ztnYjk-=hpDh@gwWwLX|;o#y-WD=|VP0L%+O6Yr$4vBirN;9`zG)kFGZ~Z_d z5(#W)Qg6Ta=F!v7o;rF685|mjjKw2ftvB=CvFWkNfA|0W=)q2g)euJQ(n%X`m)q;K zJo;ojaC~Us0S49%G4+7Q5rAK_9wyQ~W>f2AYxQKcTkaWHq6%9q>@J>fRp8(o&<&rGV3x_ zK)16A0|XK5{t$;OJ1}`+dC0%~Btr}*=MGom&|%D}r* z5V9`VA`;|W7K);Trpe|nDmVayizlH2i)51dw)0AknSc@OLSTM~Czc1i?u5rDOQ|G1 zyFclGJIj^D2f?AS2$p{hMB(o-Q!L8Y10VxO6efOBmjpfaSdwY9TggnW6X}M$zJL$g zYdBNcJl#Ypv5L4^1k#CO+#z>hi2~pRQwp1qH(TL=4^j^Wv9U$3-RWgZr5ryFh|rlI z5kI9R8Iw$cIEBU-$+ldXGjfG&GoCqD??*NuF)17rG7b#nfFVDCM~DiQTSZsVV%GV7 z2QyFv@J|gFiaOHr5Kt*SvLI08MA$?$uL7xxOk^NrnRfr!m%uku0@6~jArp2tHN8#C zU+K1dFgO2$H}K6hx47znzdpm^(zVsq?Zd~OiB64RdK7&xY)1@l&=nirSj*%q4WB=l za9e(T+fDOs^oVT8XmK)c0Kszh0T&srH0qH(ZeAbNoUNW-PVMcy{f@)yD;}IVa{O4m zkiGojdzapQH@Cj(c6JK)7n3)yJ~Nv5{qwWfGV1z+t9}d=G?jC$B%~wKGrtjb{Xp}-7d@Ud7OhG$9U8{ zF%_Rn_@|?uLt%5k(3+`a?u+ZUe|}-gWFwv_fXk+RKGh8t?tyyZoM4w>T}ca=U%ret@67cv>q%=T z7M+5SN+m!_Iat{k1{gUIPDQe>I!K*l1hfv&A+`RAnuyeBazPwO$T~*|J3`U7(NTv% z1hhNotRzXo3M-RHTE-Fzbl6@10SZ*n@W4J$GQ%`DM8hW}(I`0(4)^k;Fspp21cI1= zD713MiIhl2 za>pbLQlwR^MB=2u-P6$6>9c&6%pfIUMQpgo77Wpu*;*-IO70TbKja7vkHfqNWPw?d zN{LW%3_|Yt{nKWQ40A4+WhavRdxYdw4tQ8peK`V-Sz;6~Ow1=mOS8gJ(;s}A;*JEB zLOz*FSsu8zbw`3h+D}gI5J7ff*NAV#_#7O7Phbqm+;pW;t<@+H=0{42z~lm0gcqrxq7>uNZjQ>l zi-@@=vFhxRh|H2#Re}iMBcX7@MdA>^YzU_mDIx>}qXH;PArXKt9ZW=YQYMlH_mVxegfMay#QUdx34B8(0EN-(3pyQI8P*A=*K_1Z{M)Hg zqtbJCM=eLCUE5lIc>C@>c&&AYLYQcV(-Dk(m1^zI;u7{jZp^M8(X_E{yRx>i`r|jvmtVSad-37TYby&knvJp#TQZLf2FDTs zKkUQxiJU8U%h^3 zIWRa;>IKKA4y^B8#TI?OV7O8&&P>n5#wN>+_D_F)VSP90^g#P}dfd*S$2B@&otz9D z9giL!3QvXozE-1n=gz|Fdg{SaZh5<~x##V<6BA>{o;^2m=B&f?!E5{ad+*hkmSXKz zxZSK{PuxxitQZ{eby$j{RN!?|ecP@Xj#AWDKQQ4t^UUDuZ#YM1>c99xGcU@bFI#b! zzLov6DCqEMgSE;!X6UO}UFG1`NM=VzS<4otFu&onkUFT`vj*_%N*B&R!-1Nkneh<7H6HcG zjzj~&MrE-0fjk zjkv5=9F=9z6}>{nZ1fsvW&KvCMszR^us)0$`z1hiFc`QQM`V&#p_JS*l;}9RQ+<&7 zNOYub!$F^rHcswvs0*o4Q6P5+Q8TiPWwbP+{vA~yArDXz5?0aJ_`q!m^`0%6yCM%K?B@$ul z5hX$g)g#feNt{IQde%*$lwiJX^q8 zRj1FxwW?ZJOXUi6O#H}eCOd3oMp!`tNh8&U+!7D0)w6}7R4U02f+T^eN|MvB5|n)R z(SbFo43c#sQ+1m#EHtJgEp-Txf>0%jq@rUB3gJfK6GVt3dnz$2x4|)CF{ZhpOH6mMoPk=;%)!DFM)5Q1kfVTDlkf65;@=r#A@w^E9?lKJ2#L{ zZeF`_G~&zUbN5%)-Y#Za)#CZ{&xJ!lY^_eVs^1V0TP8jZaug|x*>Mzw`F3b;@jxnUyf!09#gSFE&pWdg!yT8+b~FkV%l!O6drwM2OiZq!{%^dmR&StSir;3h1xE1%8#9v*X0kT z%AHF$S8DD=bablTyY=Z8H+|v3(c!_Rz3j@?&ga+eT>Ro%sagv7&7jX14towHf+wb; z$HxMb1O7p;51t%XFI|7|?#HE-RioMR`>?yoUGvCk*YI>Bolf4n-`(58 z4z%cR*^vtOxWO0+MINC|-BEEmGw_RVSZzbMI^A#sD~uifZU^dnzq}Fy`k{9&@eJ&SAgATBlg5Vev7%ZtBi<6U$Sz4&J!WB@TrQ66W21lbIOwn&SNcBC1pF~NRET5l<3xv)oRg1`UQ_GklO=1 zKN3Bf?^CIPP!t4((MCxQaqt38Xjn#tf*qHH*|@;~8Bt9{xFIpc4&aHn&n0^~ViRjI z>i>!+k`jh-wkl`CAt`>$zC4Oz0qo7`w=Wf1v`>NYA17#Ot1nlP$~rI0JRVk zO1NVsvgwl`g8_j=s+#eh8D)iHEd~M`in#H>Ajz(MX1x)qGd&k#Nljv8AC4~&LQ145 zX@x`Hk+R}J&PXO`X*z=`9(hz5P#B~ngeT@h!kB^uLrk0=#JddAmBJj>K2tMrJ$IXt{v{qm^n>(ziys?`G$;hyIbS$`WWD>eN_CyW1w5Zt*I?4eTri6QXz&+^= zJ8E%gSU*=tGstR*&J0FU7Or=+=RXC8r42+}gY&09y3Lo*hgLxCI7Xknd z^fnZv+dyyc4ac0O&*AY^bpM0xd}He-G|}wU+dH|+)Z}=nQeE5HfuSQz%m>20@u)R3 z9GJ(}r=y{{q3}e|@2E7BSMT2c_~P>A>-Z?)cN)==klGYY*4;~aJk9ZOE99+YbIr}PR%yWK+(ifW z{qjXZ2n`AG=XPPUj{>&6YSbN3zvs}zR=`|sb~Y=G3N-dgty#$G&6?@#I=!y0(}6(| zuUyS0-0*8Y11qNS&cMm|a!qSz%CNc_8;+W-V6)opq}%S6*2{OQH&f-%VlV)Ao1>0V zpXTyt8vYaus?he&zcmTiin~3kW4x99jFieDqpu9e(!@9-Q~yxyje3c#Tp)lw2S#bT z1Hrv?Afg0_W|n~Y3M6BVThq?mp{2@x5IsFyNTW|&Z^*I;(p zs@I;1xz{W0?R+&BuLOA20eV&J395s$$t0r|l4;C1V5?N^Iw>G7Lq4T~ll*vO^U3lLA*S z8PFkE6ZVgN3G7QiHC{9k*t2^){#d=@XlY&V#O%xqFWvs(-vnCC?~lZ${MKr*QoMCx z<+dBM&W?I(FqMht3xoIW1!|3WrRc{7J7QlbZIDeIEsjl@gBaC$D1tDwKoI7DolOnv z5%FQu)#(MHy*V9Nzvyszd!s{lP5t`PlCRMonVH41*>t&3x}AOS&~@_Eso3b$xw-iE zPVVNy23|7!(U@L?_ixO27%<>;m3*ys0ff-bL9t$MuW#)1IxVQN-433bjauDw#c&%B z`=%yFvxU+xE?zlwS}SYN>j%2cQnlR+_%WN@X_d=5Jh5=Xjvr?gO03AmtrNX8?C6~^ zrpInY*u?@1jj*Q$w@6|S=Q1EdPdE~Y4YhPn3;WahqnWz4`(U#Qk32xo!WV<3#q~{2 zmgo+z0dsb9cF2EzE_P@rG&?dd2E!0d%P+6r`tb96pI*u?Z@8N6#L&>(v6Hi>&P0MS zXEvYy;1`Yii{5P3hmA`y{^C0^km*{r(`#Z8r&D)BuYlvlUbhJIC!gt=81qa|VfUs^ zzLZaHmu}xS*OFMRtH%?k{*QkfKmS~6eKTLFw(0t{0s-c$?`Nd#%#tEhFOc4UWNMv=$F&F!rL`cV57Q)WH4L{o9cM6&;ScEC!sY zCE|%AFfQyE(D>QBaERu?8wCy!fQm{XZG_cZ)J=9N00IuBvWc@o0OP9{sj%j85&{9r zo`Q;)T`46c9u)~*5JTmIIyMjrW$Fj&h71cKViiq6bRVh~Qr$&s;gigOlPge0KL=$> zIy~}EWC|N_z?BxBg+n{{$Oi3s@#A}nV4x-^gvp%T;6hTkxAiESEh16}Y1%4VtNL{_ z?rwh&ULcj;2Xs`sIInBt0lz@~-*||8$r+iVnTHe;3qgvW*mcVvm^gF({)g{;y;ToD zeFO2qL-VH33m#cRL`akd#H8fPaN^_$^GG11^6MWcA;?-Gf>2m^s?~W8$8^C$DG-}r5u$7mcAl^-xY4Los<3p2gJDb> zVTV6}nugmlJ+W|TFPBrPg(I{jL`sG^vO)%AmH@1z3MVC|J|3xJB_X)%l0+09fSEx` zm25FmzzIMmDRWdSB9XG=hjb-(0?0pk09F9mY49kuUz#&ev!o=ukHO^`kLpmdOh)85 zc;O>bl40o`z=*_=6G6zr7AEcFeQf*JeF=O6B_OQ_Edq-py-{bUgUyE8*qrI?nYo?y z<)6K8ZSK7ui+3a8qRUw>FB{6+sNe-sohYgZNd|y)~&Klu_YVWHAvG8y@R=V zH0L_hXxN#I4tE0BwX>lW@}5*FP;JBGB0QB_*bGT)k742*GwH?ZK-iC|i@jPKyVspQ zbNc9^=?fpdx%kE9?7hX4&z_n+bN)|WnJCsuTj^bA$%^WOMx)~O28&7U>hc;U<2!Jp z2or1US%h`4@cM$!%d+OBQg6Nc!G+}N;Q#c${O`_o-tTk1|MO2S-&%6#x?3ez)fwq} zP3*E%H+tT<)$Q%J%VnALLf1qC81yTa2gdeV2|G-~9Nlm=VNxR-^RXX=v7{e5e_XRX zO~b5rjda!B!OqnFK&|O&;O(MK^P8U2#km_NR54tz*1j_By+UE8D z^poM2Uap-wmnqkpOAmW{Ngwt@)mZ^BsumtQH?ExB|Od+ts!S3MY-8<`v) zpPmjTMqIwIZhCug%2O#fbJ^VX*6zyv((Y;_yHlxSi>4lC*xS7t+?`EMdpns%qfm!q zBCDx)*6W22SKQ$*un<=}?$rk7d(J3gpiw<_p#26m?%zh1WrngpMsq;th-{zOn(%KA z%xD&BYE7vhYUl_FyX-9O2RIi1zUS4$TX%t6w3bGAIe=`n1LQ@&6>h0d2qv326OoJlBT2D63VQ-ebi^g^ zDP)(SqSV+bmSkUYp`ug*l2m*VHS;ZxxUeT8tAeX9EXHCY0fHp@Cmr-FD{_?A9)Js@ zw#NI2-6y5|wZnu*mMkSFl8}7kjxpqoIdPy{Hv>WVNBK4AG z3j08(WCK93Dw-z|3q7T?qQk@-1!f$2+Fmwau2rE^M*@LJFaQf0SFyyIAt5h_n3#_W zE7HO@g2E>-Buh&4Hp9%QD#T)t2bB#e4H29m!W}-H5{ooEP#^}ur1C&CA|(=4ghf!2 znnEK})Vz6p1Op^0oKZwTmTVeChiAsK1l1$c6GWAQ05jxK0ErNQm6_b_ANvychDzX< zYd>tFU54A+c3RjMv>gb>pL?OUmCk&0sj>agf&qvdE(#r-dak!z&5jrQ6G3m&^s37! zxExrdN$=ntI5UB>_MT6xd*Ir<=d5@P{n+97pZ~dYAku5po9k<>_dl#&x#7h`YM1tW z?oKC)Zotv0!8T$bG4G2!aCGL!$Il)*Ivfr?Xj{pAEx*3KSS^Ko#>}@~f9c%xPd_eR z-^qD2!>tFgscE59hHW5Rf;+n%&Edi{9Ok*2I_IO|ja}9(IrG)V#T)lueEGS6v+5P-T?pettz@)PcT-78GED7)Eq>6PKR@7Xb9VOK6v;5S~&kO zPO`_*oo+J_9gL4o>h9n!*3Z^-BM{T5NW;+s+~Y%$Mn{8pBEx|x6wCCP&UnB&J{3JQ z>OT-O;WuU?;y22b?aO!We0+KB_EJ4v@@U;)9@i3b6`GSHy9i+4Hx|AH0mA0<(-=vIdjr`?1&b?q`0Nk zn$eNLR;3ge93jRXVDCXD_qcgN=|>Mnc@Fug`F z#OArZ7l|xZVm@&c%G!Q8C z0?`i;DR% z6q&~xcDlh%qXP%zk%eyn}$kT z>tHhquxK{%$F-OPJ~~;pi+7jfD~;Ew?`hHz_@j5spTO zrz^F3F}nkWvkPgt(8s_(x#9B~gAvbxxPLb0J2O8rGaMZDI0NnG&b3>MpI%=jKkINeqrUviZV?7pqsUntQ1r{5F%?()Tbu^8O^z@t#3)JY8WmUfD8{@#&VAU!@9l3|-y zNUK?|LHEa)(Zt(>*Gg4uJ;P=CTnA3fpL^}wBhv>Q!Fb2zZebZK%m^?7$%w)kQ0VZU zo)wCZ4NVRoJvDax?80a7u3Y)7+pf3km1MPbAmZ(KviP{*LbYk@jfd=CQxtc4+mgs|M;f>m_TR0m4GPjR24*5ut!^#2Lf1Cp}*k2KTIQn$~9-+ zRiW91Ct84l1T53CvPp70OHET(Ijf3DC~6{hJi(qY0ri5bBKkl|#@GHGh&sI1+NU$;^KTHOS5qgds&h$%`x`|I8p( z&?Xn|JZ+)pBd*cM7Irp6W8Vw(}pu~&>J>Bp1#Nfys z8vyb^B1THIT@{2RL4`PzsI-IvtW;`=wC{<=M?8InWue4oK`s?mMTLYOr;-%dbymKFJPzK!+n2yMTLSoKX1IMJxO=Hq zw5r+i9Xb?y`CM{yyZbQhX>_rHC^AcuUoGH^#A5-!zg4Vi z*?cbJ9;_5%y9FT6N+{FuXKjRnnDPR^#%)r%D@M`}l~xHIG%b`@fd z2G%-arGCpDewgmA=8ZzrDQi_RH36@Nde0qP-Yah9t4?e`)Pm;{Y<&SE`IhB^BLLWH z0M^y+ne|pDJTMH^vzEs)DryUe-rcpARP~@2I$ds$FFHI?Z*^NPW3PW)rF5ftE_D6 zjdmyy8b3IF@WmI$j-GOt+t>!HdgXd=WjRpETb-7x+i`WV@{==b_*Z{;;eZUW61Cyh zYvF)*W;%Fy4&82fZ7a8#ZF{^eEY|gD9hmsT$)**B1^MNNyPs4VyOF4KAe@7@8SF#b zYUAYwytXWF)#XS#^-4p-o>SHB)I#HO+3kDgh$FwAX(zX%MmN&#?tXl!b>Yj2b{CEq zVUVOcU-q^<_-50t!Ey>K7&LfDz+JYIb@_eApMB=#H@-hOeYj%=ns5h-w8#v1&q6)m zDhL_hsFh$HE&SO#-GQOdP+(}frMow7e1Rg!)>>^JRt7jaMa<`6CokGFw=>=P)$MBh zrq_+m-07GN;d2MRx+re;&%YH3^ra6CMcOwiD^+uQKo`A$O&>Gk9P}B1GnHE^JOCxr zR5oxD{gjG?0z!nSu4+tI`o3fl0YJr6LP#N1>Nn9LkY?qAnsi8!Dl_Npa3KUQB!mD_ zlAs~;6&+Y*2H#e}$tb6{d1g8SC8n3!DN5tvrukcbMq)NsiP)iOydD!eF)}X+m-G8bZPnRZxKqWg-$$`zXOw#&Ejou*k%kW1v7frdOzV zfft&1G=io4L?pqg&Iy>^-c*!|mQ@u(^(*;gLcuC^0#dLE5stTV*mYOZ_S>Oihp8E? z1cy6ela)(_;7pWcfKUopa4OJ8#fW%{hF}0v@>D6mnuy>MDu@K9jcot2FM)5m1lX~= zESEoOy0jX4l%5uR_SwezPAU6oXQ$}KL_4fuu*s*>wd-{+`&^r$K+f;;PmPa^4#DXP z)_^){b-mWeY;QGksV;OltgzqM8F==&*u=E9xUlutf8DxwH(YOcL5VX(Y^G@NW~Ucw zb_N^eVzIK4&K9x4(d7#G;CFq(J3ZEnM3WtN0{%)0Ev=E9iwu72)KoH8ZMHSH-VM3x zqrUopUNZFt)WD9{@PCMAJ@Hy#aUv$=c)3u~QKI4{8hQ-=xHG9JC?H=2V% zf2Zx)O}C2l{p)UGhFCL$ks)kp(vz>0m}JKqSad4*cG1F^xL+v5o(N@;9(hiQGo z;rF}4F@A!8>yug@Q|&PGcf;z)YeoX*Sj2n&z~I4A|FMba6n4Dp>CN5b-78lw{Op6w z;<{0;Cj5bsqw|Mee0lWfNlcbEKE1qk<+5XU$1IjSt+oXpo#@rMxL3vmsi6=Wr+K(b zZLfinN(=FRb1j#@ z;ecOeTVXF-Ke(&~fD~ zFVtcdpp4TpxU<|*s-l&lY*E>jAq*;olr>IN164dP_){7c>kkiL5N%tKJXQi&RS06& zEfD6wk56svdV~SQ5f>M%3M=H9yzpHDc*ws}8dyd9>q>=L62*Hb6)*vnEcD?Cfq%Zd z&?tw}05bI`nh(N}UaK25X=ra*WfuV5frWLTOG`NN+yI_Mv8OwKY<8D|2KfJ$j+k%2-+pmFDoM45)dlL&?b7wAcz zDWqP0V=cY32m=^N`CmDKlib>JATby}a9GMh@PY!B!u}y>`OK*#eA|n zfkaYgnV9(z+De|P#3&JYd3)5N1V2yA850NrksO7>l2&0-rG$SaScV3DKDvI}KlUZC zFM-DrK#OtdhR1M(uwJwbUn@fsu{VCFQ)rgn{6(->gA4PfLoWr*wMbxdWLTd&c<$`k z`IE=ug9)tLgo~|Gp_oeUT>kvS8y}~Z%B5F)R{Nc|4&?KZM56a#!E@=7cX!v{ZlNWE zCi+OsIY0-6Ly%BQGj*2})*zMYuBDd;6P>xKZAW*l*|j>Zh!xH>oUJ?-usVWf`P4+9 z^xPcmJ5pOo6Ps>&G(Rj`+F2|La+tw}3l8G5A-^v%5Dx^*-}}Mu>~5|9-A~@#&SMUm zLzvHUj70s1BG!=+-~8kd%y=$duPvwAet)dp46QA%R4YZpV>auYtHRi8T0YF`cmiQ7 zGypFsJDI{xrtI`ZjIf933}+KA-s^Shp$^S$>cN12IO3UzTC;=RW8O#y?KHl;k-BnCTUZD;tCkC|H87`d@@s)T zV%eQs3;xfYE@;^B$kT;G9FNhNpZERX4_q^c7yj<;O1?P$!nuK$UZ0H)zxD6`{k?Wm z9~-^7vT}cA6|Y-393DrZkj)o!&05Rt^0>W0_^^arx*cSq*=g5cJ%o3Zpk)q+0$^fq zcgx#u!NAC~yb;~nJP1oFuP7&ZTkdC zgCd499}JpSYPok7q6qN#-A6S&eoE7$cn7n&>9a=c`^Rry0{t0xh@ayw70|w-gwYq{ zG^>h4am+@+vtHv5wGLVVl}~C2RFaw2hT$wXVp&ZXi%NnU0*DSFArgcH2*L>of|VB-euyFalhtB4HAg>!&zuUL znZUjHS0tkd#?tR|&r{q=HIv*cxq}Oeoj^zhek27@^hL)QDpmvoQoaKTuoRNwU2B$0 znU$q~(C$mfX!72j@Ysag;{`%t8D)q;gBrDDUY%`DSYP0Br62JX?f@-^WScobdWc_` z7Q9Tv+M%*9g@;(qDRn!wd=4v>`Y8VX6};h{haB_^Sn0$hK$JY$5+e=XvflLN45_h- zVXy6W2V1T}h8_%MB5t@oC{!?|0_%3+6c?lfgp(FB1HmA^7DE=;uqmA{V&I^lg#e*Y zPRxa5m<%vNPAnNB1l>m(KA#ziEZA*CpqSV`Sh~0+m`IN&l|(4oRaQxWady1q6!$oU z7bLN9+Ev5GflxbKK&60HGND7-%p0*%2)M^W0(lJ(-210}3G7P%66iM~xZX9qA#4=d zXm@=h6R~fF*NOa_Y8>g|PvW~JnJX%iCz!NGx(qeFZ1!|!I(<*wGUBGpRTaMdiYrTc^FBzm*r zk)yMJ^8Hso`s~wuYW=y>^My?6>cZw;v6f6{<00Piw7qfh` z^9Q=R`F1;dAuueBR%{-c!)YtvVd;u+xNuI2?*;Q4fC2%ci>lTbH3h7q+R|+bvXb zSoqoV1gpu+y*Gc-s@6)?^3lX-#q_VWyBilTrA;cIp}Wf!xL(YcD@E9~2mC>o z%Y;t@*x`&pcfp}eGv_{M2Bll zHSezUA4Q1t_K)AF1Z>5f1<8VG^(rx z1&}g5|DiR@RpOam#Yjy8QpA$B;8Aor@T)MA6wHL8G9!S3jS)yCd=i*65FittDiH%n zn&=)g%m8Vy429w%*&-zIDOll15>v5}L-><=kFS*B#~1ay?C+ciwrOcvLgs>x$s#~^O+RMw6JgIOOaN=V1XRpGXx|oDqN6M*K5UmyLKi(d16x86bCZVvHP;R^9HO_a(3|fyWX+r)an^@9qt@ z8|{YGH4YvMzj!8{&-J!5uwm#0yhYR9@`VN_XFaimMhj!Obzw_KOM`>Hp^1s`;9z!X z10KQQRMA^5Tb+ux+je(bP|(r-_^%qV5XEE(CgIDyF5DWzYA}eM<4UED>C7hg@}-J9 z7{H3s(ZPYCpn2t^_t&m=ClAlgzxc{?M@N@-l4}pQ?j#*i%@^}I=SL^Ab;rZ4C0OFm zjKy9!d#qU8ySs4z#QeeE`~BaIPcMD?#SLyXjj54l)#t92winy^C0Dl=bNfw0_xE;P z-o)vn6MK7G57$$kXnbsH64sEg#oo#n3&oP|G%SBe_XfL`zfx_~sx2pG=KUrtWPD~X z5i&;yyyFAr+1c2k(eMAi>VUAX;=YY(s7>J}@0w=sM4)YS3QlgEyE@Tv3R zO7`lN-s*}wll3&3bf!*Emgu{iFzGSrnFpe>|6t@^^&0KDY2*Ak-}GeF@W(yaEX56Z<055timM{Gzl{hAvJBy@Mg6RZ4T-KvfG zD+u;)|2s?ItEMuXC#O!qLX~p0hk2?G5KTu$d6{uU4Pm(0pr~7>SCf%4<4Sxy zs5VOD;2po-Q7w?_Lz@%=v0m{f+5^ZCozO(Aq_M$8BVk&p)C5zVnE^G5ai)91+SCf+Wa`U}vt0n%y53J;q7nL8PCR>bWs9fy_1R@#}yWj*t zczA?ak_j#)g-SM^US8}xW%JP|@%uO|y}Im+#Uo>rKuWeC3@|S7tQ#Uh5rh(SKZ?>; zPy#9^nzgGZ;myttvq**s&ddM|NJ4M`it+-h z!U8cW%tD7agc@%Uj(@4pKmj}V684Z%frucaVhJfIW%!VZg@f>JhA8OuseHBut)1v3 zOH3eXq((|0ap9060%9R2fvWXmL?hT9IG?NiozGBT?WUmCJsqLMp`(U=?@7vVZJLU|#~iA^~(K zE{D_W_4aDmz6d^A{L#pZ&$YAZ%!e2BR?8LiKqIepyYS1>(2bs9NymuhiAJWww|85| z!cfe*>{p-R0#>sn|&;7njzz zowrl-qeIW1e`aZEX>M-T^oLr8uUIUvt}ShE+;5jtb=|XYt2!{=o$zChyVdE{^mfl@ z`dj5)Y$f&l`O~eQbM1#eb6LK`#B8=u-rd==y#CR##PerPncnc1_g5D8Fwt*x+VEQL zbQ{`$VZw_2@JL`fVNOPj!()ljfe3aXTD^2@;iFHszPwT1$r)WeF*ZRoc6j4r(#){VAl3{J1)=)ZVi-0Gm)9GeLL(H|QxztRdv z8csbhJDczYmOuP>HQ2g-k{ovZA&+ja6Equ6HOf~k?QEkdM*C|7vT#5*5W8{-A6(JAj{bIWVt24=-MCIFBY3{N@` zia*u$%f$vl<~zCzK01enW^&~V&Ps=d^&Axlpa`QXaYKMow|ryIHFDb@_d86tBVlST zFSL3=1T^^TkES;6{mXAe0+cw5QjG5^ z)(RQA`%&y=m_C%hiv zL@4}GHbjA*LjrJzCx!rmlIeDKZeMT8RzwK@haRm;IkmWeiEU3P0(=ysXnoWq!32s2 z7A+J8BEf>9NxJX^FX4z_B$RBjB^D&)0n9R-_;AZi!1jXG6VD7lEOtdIC3mnlD&e1W zU~eWf5W)mGN$`+DQD^3yn1F~lRdRgCMCWdYvlJO4b%DYn6thJvOaOLhTE+B&#ByU_ zr-<7?T&7*4pc#GHd^j^y6&|!r$IT)Xtm~^JIpMUY$?t}Y*B6fmunjO7UDqF46 zsp+}=x6b|NcQ4kv?ZNrym$U8FWcloKFHTO(OdgooUSAyuhASJpKl;nR+T7auxBuo} zmvejTcdum&t+aD!L+=hA2*gHaR@WB8@zL|I|3TZ~zrL^;iiBTy`Gt4Byp=4sGKKQk zyI*0vk zuhW-)uy*mMAKd@!a%(r~?R3WDgYzfOOrC!+G&WVcd3)!J%dX{BcP2ehue!T+gC8Q$ ztFa$b{hAC==szDV!a*d$TusC08J}|w&wTmCMeIoX+-u(&eD$?v*LCNe5B9Qu+dDb? z&f>#dt&wkc2ggS>({+FOL8V-S=?!dKFg?_$Rtl9uysNl<=PB zsZ<*4+evH#QqA@j7aaJEG6k!rdTaUN(y=qoF5kL-ztwP#j%cN-vr!LrvG!p)seyI5#j+RJCI-W>VXigEB*SBFbtd*tm`vtPQh4`blcgrKep=RpdUXb3DqL@*9F z)PZrqqoTwTmJyyAgyI9@wo0iq5k;FoSZE=-3F@l^DpiHJ8Hp$0;YoB5f{$(4MOw(8^hkqi_Yb}ClnfE1Vq+5=JBQF$b_J}${3i74I>&Vyt2TX75a9zr>aJoAobXi=6@cQiWsQ5l62Rg2m~c3Q zy_S#%*v3$6r^8)fBT3?7#UZfd6-qjtb~)j6j0{M5C>Dhcwh%iztOII>oPgxpt{mis z|AHPKF9o-7rhtH6xMQKysV}RkN^eUW6F3BchhK=4mpc;S!EoV4!~y_>t9niG z2tFYvs3;E+H9Rac;r_8Nfqe-)SpsO`uyhY%LZa^K)r^kknKQ9gBUi`%5QW)zJk!W; zFWkQJ`H273mtv8KG<9~@x$NFge)Q8$rEzTfU}!7pD`Al$rfIMeoQ5B&Prx%a|7@8? z%WF0;D_m{0YAvhRGeJ`8RT|}Xz1k}lJzKuS-1Nrgb|#srSE~aa%QYGqIe92{bk;i@ ztF&5CXZht5@pS&+FRm^;*h!xG{&%1sdp+(Ou!!H-Dpgx={phD!w>2|4wEp1U-un6* zufCk!c(8Em#^%mWuw!Bk=*gpV;X|`y(}%jDgL|3c&6QiVg-`z3@BQH$-+$xbX6k#t z|7Vjkb8u6TFJz9x-(o0;75t&ZU?d(6G`k6(^W@Y3+{GLn@y-keVqRA-2lpq{TOWV= z`H$Yst!{-(PdG7j^yL?hJo~a`1e&lN`j0;>T=>K)7tD4GrZNWlKMp!@?1&o(2R%5t zdK!Y`f+!^~2H_Ulqi$>_fAX`z*wEDE^nJt?#Vd?{%iLrnz0r zP0q|>zpOh82q7|u+YN`r$>ff+Q+M{tBN1(ODmEN<1^nmi5txG!`jXh!PQ%5p7zFBm-B(SjJkus0Vm z%0MAE`={Ta1gN<82V~Z08GAW=D-D8?G5{k4<;OwT9=rh|P=pW_gsO?CF}&FI##TBI z!U{rAOuDj}FalKzBR-LUFtv7x5*2{K0Fc&(bcAFhV~u6FQW$Jj5CR;EVbaGzj6y?L zk`SJd5Cn;W4BHpQ5_wW-p^GT)_$*mx2$N9nMHrtX7otQ;fbdKvB~lVfxTIsg0RRl- zhPlxKgF~EGeu`rm0A<%#LZjo}ffzHU=;7}1%S}HkRDhWw$%~z5>7!H#EZ0cT&NOq+ z)=K4-2QovIpTAB!v-BXhu`1zDJsFneFx-t&@u?87^V!@mz5bD7r(G6$8vz7eP^P>= zncssfP+MDvhfqGUpHfrF&v7Wq_n3RVjT{Pcmgf9y+O zUjk2;02FDL6~Z>86|8ZBU-n}srhn)4`|rOK?-nLCcY5v4TYtHh-dsBS!g-GuzD7E^ zRQk@9E17%uUmP4g(sR1jx4gBQg(aSBm28Wcb!|JaJC9azyINx-?$bw|A;06na_9P8 ztyII@FM1`+*J2(w)b0&dDwR8TyKWe&1U&JWXE+f&IO!Y=wnLG+%Sz@-T~{(PV!n7{ zd^eN7bp1YDqrG_M$joT`-h&4}d-L5=xu|!W-+lGvAH4B;)Z>2h%^&~Spa1zE{OO;~ z%ue6FcJ0o>P0O+ZLp`@Qa`%f>&+WV~6j@2uoTj;%uN*ph^2D=#E9C#XAOEexW&WGL z_}9r~c4289cI{Vg-5&OK56(r8kB6t@*7$&LG7@a;CRe^#-Maa3`|i@_t$UV^PZS3x z=MEh_acm%wXs#zS*WRz*xnt}l2e6wG{MK{Aid~lKyrjQEU&t;Iy&ewLf2lj%V|LPo z)dJN@>e8j`=y>9v|4H}Av1~5etTa2h624J%LZQF?*<0)N!pQhYVrXb%V+$g0HZ`|5 z-0t?W>Ag}R11~tk32S03I5ipVcFNrjTrcXOfT!K4ZmumKKX&TG(POg*4jnxB;Ky%$ zxw5(CHY~5t8ybqI(%XTse_(84V``J#d)wa6A$ z5n$`w2v$z*W>fEfVgv@_uQ|=}DTn20xtv&a3cAd@R6Oe6%r(}$%2m7}>)nn?tvz4A zb$##s_v&}<2C7x8m%#g;8aR-?<2NpTGTni4In}PF9HtL1 zi+Ja8@C(voi3-8}({DrqRNQSzqj*&*^UQxVe`=^yPSnt@syc^jM5>cOGF(~Gu*b0D zfmXB?z=~c&9K^b1fWQIlwtf2glMXm_NiRPb^#@!Q9L$h0GDyryYDB|uK~LN&XCz6joSX?4 z4CW012#w?-b(=qlz}pC{>h~Vp{~A*h0n`TPk7Kust((`ef>wq6>KU%e(n}8vk9Xwg z3FaRMc~CN-(7*81}iD6QS!qtYyvb)*H%!ki6Je6+nlf0k3x;L^B@5Fk2EsnnD+882D9ofK6(vdKqRavPUuks?eaz zMmoG|s&cnQOgI8DPH~_f1;2ccdBmUMS^@PLV@f8(0XX7dzVRUF7$;#8NLU1TP3w`A zm~Q{rm%zRRenkRkr|`~USOF^#ZIydXZ#Z)Px#;eC`tIGM10xMbwU*qz_fCHO)+M*s zYB%BTyX3An&jkYqI$iVj9na2AsE6HnVC=@e728R`^?1#6brR7=Jf@#M8U5ow!q%eA z>o>O2rS{?qtSRbk>|lgG79PKQk#1)K&Rv|2?&N5BFt+D%)^&Zr6R-^L+Qx1vmz|mz zdM4l>v;xl^nM~!X?|pm;-r9F3V|&S+(L~UJm6eutV*W53O@8a;S01eG6l(3su|Z!X z0#D;DmuIim-K%y>>D0o~=J@R4xyV?y?Scz-Phxx|91I777p`3?)k~p>r&MZOxP0x} zjT>IK;dL~>dt&7DOdJO0Q4>Zx#ifsLJpBB|#?^)5X3Ej*j!ppC{Pdyufk@olY~|nk zv~l~cV|zPXEts8_(S-#7`c3I9A#l5s!X3NhN5|u?5Fio?UEkAc1ykwDM;{dvvB7V@ z9`lDw4_CME-Uo2jaNk*3?|7W&o*NJN!+I~NbMD(&Z}#@m=~A)a(whgShi1kCp#X-Q z4z>@$#zxrL73&!=EnO&-mmaPp;-fRuQ;~2~cl!V8Z$HfDQnw%6pPrrxdE8rD+vDSt z{-NP}%S*ngX$$Ujc6NK^Qny)E-)(_KW?NBsn5x%2U>l24>#e=pi`)9oTIE{ol~>H! zL+(hZ>BM^(Cg|xJQuc5{wwZUpBQ3tnARLzXMyXi+@{9C4KdpZ9iG^hbbOViL1pws- zTDYxj1s%>I%X1*&I}$QxBl_Tw77EgW2}@X;omQ#fG5Nko>}q^_B;5U*-ctD+=HwlY31vo6lm{yCR3NA!@W<9b3t;sRN`gsH zlK_B4BPCrabwaB|s9Zcq%nndj1`02PL@eeO6z?R07+NK8Hk3-9q!*^C$OuBJflv{kv|kCSyPfCn~WmU7*YY(~I7zZ`XkHGr0*2K!O zKG(pC1VoI3H^7R%Jm~dBLIHSr$EHs3Il%8yz)pHLV%*4`P*u02PKmJy2u%=SSvbZM z-<{F%k~rTKRc4q-zhCEYdae+1*69gk7jh= zQhu+TZgkt7fNl&L)>J;@-rhB~_k6X67Ybst+rm^EHVlGR=5SOzmgmGV|Jk#Rk#T)w zX5;pqpl-Dyp{`{Z^-hi3gsgWF&V@+Fg?w^`Iv` z@-NW49%OpbYGu^5%N>#$;vfMGW(L!9^z?mHU)5Dz_mP$NosmcA_xn7nXFy^wz~ETP ztfIRjBiuj#F86T%!sGMLi}UlxCsN7W?$&Otm5dF=M(nO++B1}~g`N~z&AR3qix2q> zBbG>CxPXB zz`t>IrTBM$*D2O81-*Xv9yUNtzHo7KXQR>WhrOY6dITLdjB-uK;(|u8R4V57u?OwR zx%jE$Qx03r>#-2|xmL$~IKHQF3sh`Z+A$l5+ldhGKA#(FpkBCi`r*>%J0IQM-r8~+ z-r$ibdtXQV_pwZ7YkmE3trb3grUhKseqZiJ4lF6PEGxG4SVfW2%F_5zd#~6I@?K{v&>W$vkcJWR+SjiK zv)N#)>q3N1n0D~(!M3a(yB>G>7NY(+EC-I;;+}rU-*-nW&BsVQ*rvpRElTk2Fqmi; z6%TZ*ba{CG9cf@Nwk*$SBM~o9&*BAGxUdfu$w$HPsr&L^`I4 zN(UQYsR{r#(h`!2dBxO$LgXvMpnSVh+PZbUwx1>TFFp`BH+}pRmfheYF>|z8EHsLR zF9x?^n{4cd3Xx-zGm0CqMC~4YGa0B&#NsOixCKWz$m&3Ow9@6(h#9~oZGkmO-l^Yu zF~4>5+ArC33FQ#JJvKh&;5tzvK??;1(dRRHfsrpp(swH+NP!6hnou)~vb9KI(LV9v zKpOsG2f|b|;&9^ArG-H6d&LsGNm>7tK*U1^u%Q4MhY)E08s^$zwYzjjx7W*;s|@i@ z_SmLa#lZWyQtR6{)APOBWG-oRF?<}l-O1l5qK2b;rUPlhZ^_=8c}||H!G##h2E<{{!3Or)ghoERvkD9BsP;-KbS-+Dch>sp6>Bo$U?=!Ybxa;e3g{ z1HDJj!nT%Gbhx@FF@4fIGouB=%QvpKRv*O;n{PN#-Ol&1cTXSl@|bvKAZ{NlLbI)x zt6trKP~ruf_GD!h@ew9RMiXB5-OC?dd;7;jlOv~If8*Tb_|nnQ8;h%Zg=Qo%HZ>A` z^5`LU9 ziH&koz?IE`10!7>cWwcufO(&y=Uh4_Rl>3+WmVsoZ;ATbaXji>ul|A z*IN78+*?2V$$$Uf{kLudF>S27_a23f)uf|8?K9J{@JPfp?01eid;8aJEMC63cKcyv zb<--hqk-7OiTNXE&yG%vIT0%Tqig1aNA~qKcRBAhu{RU!QO2rAuZAv^s-{+dtpj}< zI#LUh$bn{~{b*^cP}}SGip{EPe4<+^E^Y7GbUmF)N5j#rtu3>S*kT9@)XeAi+pVfo z>y8b_f5Q0odJG=qjTl1~%Nn2nu$s zPN`gZ_z2rRm6n!Ej~_-(o(POjdZH=2*KZk!Ap}r_yyN6|SbcY~b?1KP z_M*33^7p&=Xw%jD2xQZ7*}4g*dphVpmhzn#*OM{3+tYX1O15rhsWjaCBP}$1c9XH z)WD8Z0J0n(1Hg%i!$K@@u-;Tq$iqcbn@BkHvkVJ~`L0MHi8KI(Ndhr%h=yhgG2kbTJpI9b6B?MEp~TTK}*EDvmaWndmz5l;jKNYRwQh{A-@@~p_G1vXZ> zm8Xd$6lP3~3mRct$SZ4`_rzwweQB{K?blPg4NRd?|=%kzxZ&tjL}nPBEw_y9%2g( zjieV&ZQi`vuGhY}kPX2Z*FOEYRjDRs=dgD*Ai;~OV|mw-WlnPOHvrtiMnS8RNdcOyLP3vzsF))43Wpj59|UxPvi=f&pSyVNv1JVa*>Q1%7KIWW=YB_ z5NNOJ>BQ}zAO)7kMv?>=NgUsSf)tUB3(`E;8cI^w+JqhEkZU2-=^f6vQ}c(%p$2}5 z2IQH>^95%Lmpc%#IbE$_T(pwH^7kv))hSN2V+3%X&{*8M@_fLnvt~ZJ~_}I*R^UYK&Sig4j>096H)T-E? z8hsXHmDue;-5zsj-AXk)HVzZ5P;19s!HZ{(_p61wAG}w(^RQK_w05@B$>^~+qW|L6 zg?6w1>HVeZU;XXB{b<{t?`q}m-t%aVT7IuoE_#FhBQvw{)bRJd|M#0)`M>yY z{>`NB_|d!XWou^F8`-FBY?s?jQ~%`J{r~ZQ{&$nv{*%HSjI5**aL+6!W`|j3>s2Bl||JQp-o9!QH+6TCJvO*mn^hWBVSj(ZW`_ zo%-t9Izk3d9+`XY^g<^6!OH4ly;R8WY|M|QPMxi}Vs1Y32jJWKdiZPr60}g8c@c12TU|_hbahC|K?O$rO zgLG_aCNeRNtwPu|r~q4ZViI2Xo42q3lJ&J9)@iqP?%&4zL3(b%8;czI8hOMFP3;sWzj=Tpl!=en-d4M*PR-S)V$hTaVYvELA=v$Zm_)lT%SGQKG4re18>}@;UO>FUlXzn%#Uf;ETyVJ^TZ&W*-@Z{`~)bN+`s2&)kff#JvTc(G6olW_&LA)+|*8`b?yG6_Frq5C&p?X?2Z)GyD5JQ z3w?^Fy;06B^P8hfm7uTL@Y?iVaXFre>dib#m^MxxHKY@lUFYcdT9b zvNybK)6Fopn786khXdU*uGn#RB?2$UEYKsY#+q>0v4X!cqxZkdIf?;E3cJ$u;4VdE|kI`#aVBWhO{o!Od znQ(0GX#QXz7!3J*`+K|l73>d)PaJly&mAxj%2DrNmk+4j=kwT@$h=;u| zzHs)~i6i&!KDzYMxhq#M->&5R!H|0>9cs6Y23ERSSiTGqXuIP@kJH_{6CrJEeOapt zznY$}-)dpAS#0^YvQl$6$}R(Y&^inQKA8wz->bK5<%*--2z0wfr{{u;yzcBWXiUEs z(mW&n$e9uE{D>aI-l)N@!-Jiddhp|Sy6v8*+wJXi9UVR1b4HBth|3qVIs6>cK6h|D z_}uN`2+g82aRpx31pt%C4Xu{}r?_Fd!l)?H{#1x0Rk4gRih0RVCn?Dc3Lr?ZL^Ti@ zn`{*FW}_ikfAI-!CmYwVG-r;+rm)FH0I10)5#da<2kK{r;!x;NMv4bHsA44~i@@4O z)bs6ocPiPPUrh2K75#ZIl};T!28VT)Bw?O3hn_k%kJ;|x=K2BbFaAZ?vfPu$u<}Pv zo(Uw9b}p9@{*@+qDLg7QKI5L^!OR6kLW`hsVsbzC^vUjn#YTRg5`OUkhr;3c6E2^h zB`Lqs0riht95_ieK^~GKg!J*`h<{46gW8gLZic+V3RDD*VHtd7w%Gzcp8>yi#E|K< z^RU|aK~xx5KRlBEd3@zM+?-*?MLV6^(ps+5uw0hw z$nlIXREoT7zkbIk*8H$lH65`BVd-jSRc|)C`MhW9=*p9ax#C`>l6N_@@XXBYg$oNW zUL2Yk%{K~mvv7JWwtIZ6QmkITx`-u}K}TcEZ%+BzQN0-o8e8T5_WI&ae`d`boy$y) zV>i@zBz0nb&g>cY{^lQ?*t5rHL_GG1gy-Bu;&?im@w)?N+f^*?JzQR0y!Yhhjq2u> zVfJI;_~^0OBd1P|Pfi(#fd1hprJL7#aJa8kyxoqshrsEGP|towIxNwzbY;||a-l_M z^!cucpg&g)=&SGwB%Ld8*xPn{O|$Ldzf;S39C^1@*9#ZX2^zEsS!R(Gk-u!)?bI@aFPGk00^YO^@3Z3HXQL zO5?QpK4&x@35F14vkQi>zqZzIYMmwm6+|P6bY?OXPPDsvC^qtB_4@dTZ+2qLmfy2C zF~_gBdtF53uc8>7%q@qjYr`NH!h4dfhs|HmJn(@Vo>1MM$#u+lg|QG9sL;cAdA#Ic zB?ByVx~Ow)D|&5cu;uA?LYjTp9h^#pk4?H~$NI6L<={J!+3&Y)4$U2Ohmv+rq|mJHdr#T73H z1HRnjh6aN`a^RPmQy1z9kuyeeWT;tHRkt*fWVW56@Z!L>;Pf@{DPk-P^i0Ap(UTwi zhi%XKNbn*B$pUi*oXU;D$mRqv_+XHtu&xS^`_#&+o%!JUp6l zIIx;X_!gC5>QqD^N<|9fg#Q6k{DvWXfER?0f#C~dx`B-+GDGo5Cumj9AzZ_Evqw>P`(0Ifh$zh*Qu8J|9ah&ten^V^~rDhGemk{k!W z;xog#C+AGW$=+!S4F@_CpOxnwT$mV3>ScWIE3sMG3$hNNQzrFXfjUJp1Lv;c=*e zLk)b12JpzJhX@Z8|J!xL3v0I7vvs_uPRI8OyZa@xzT-vD(zoE%-tahc(eOqjksBFy zPL52Ek0geMoCb!5-tNv;HJ7b#?UXlmY*o`R>q|fUVfW^p$?tqUcx1X&DjVrx1ayJL z*!$#qr*2}CIBe~N2`Zmv8|`#Fweq9IJ1vjl^BaNmkbiQ_IX)gbezFxCDm#5$4>kkc z^Lg}Fj-;~L+RtvSVL6u1XAT*yq_Y@>&rY|VaQRE^?$v8oo@Ptm`S!Q%J+0g7+Gn-b2iG?CG22~fbP5M3+O;}ky2BQ?+YE$>w6LWvoocX%!3%!)ea1p~P^?|X7=yiGMQ;{N`L==g z3A=aF8<>fDrsJN>sFqAO+=z1Kg;ziqY&q?AU%+OBo3>ED?Q?me{zSs*4cVReTBBne zmvKaC^qICl)9-{Yfn?$h)cmWkYkVN##ZWc6D zz zh9^(+ikw-u9Py5~0`cgHj+Nc;%k*Y+xR5zQXdP_solQ97W zQKE0fqajR|Gg0ml3t2UOtR%~pV6`(?FDpbEsR%&)z(q$OX;>%@4;k#J%1F#r?81TV z%vD1X_Jk0%OpcU#s08pz5%{3-#BoO|f!GInq8uU#e&kwyktq-dVpG}R5D;?ar&i)b z0XAT80<YaAKrS~yYt9$W1 z)TZ_NeSg=6Xero-ql3LvkIxq){`^+1I z5xp8ZL)G1=8}voeNlK3V=dewTkGGo5Y<6>JYs+x?5sT94;I5`87S8N!7xKH=R;f_f+bvfb zn$u{R&Ed?D;Wi4Tm0-Y+Z`81#@$Di#6!*C>Yu_6gn@JAMx4T{hGAI^Hu){n~7h=Pw zN7D|cOFpaUb+enV6zjcK-RcCUCiKnqT&aRZrWL2X67ZQLN&D!qVfdQ&mpk{DjcPrr zVXhqkXZRmW;$W9|G5TQdB&>(UK%_fhg`1{{phMUaw}XYKfQ}jdNniBBgnKM)g<_g7 z+R@xt+uZ9qx(=rvjJku-M&IaI2+tYu1QIS^M0W>Z(-YxfG{uO7<1?Mg?cwQns{v)W zV}NDTrhNhZ^M*e(rZ|ABQC!SY){l(qG#O~m(N0&;#39pjQkGmRh{2FjPm4}r6onmNshEJffTB^ zLP;7bimO2zq?IDH39br*Ct~I&Cb4vwj1=*?Q3jqecgQ+e<%fkqNlHgPhzXZ8(TI%4 zfLUI8!r`fxUVZqZAHbcR_g{SA88n-9bNy*)W7QLiM8+qA$sw0Npd%20!-0rX)Cd?A zh9MR{mGNJ@(`nTaHzv38q*2U&=`6dVj{q{5YfnrcA@|^4)J4Q1p9luGeLXrpg{|Y( zZeWpU_DeA%lw@UZ2mjZuew;dTERq>F0zo?7Ik9R-rl?hQ&>p7dK(^cI;L{_DAj~{I zO?)W{GHGiN7N8RY`0jf zHxMhCErNvr#EZcpY)T@N<;4t1(yqZgp9($`>K{o6uTU31R53$60|RsmG)14@djtf!3F*w9)}t@)WENy0X%q! z-Qn;A@U61r?C7K8=|BGyb8o-#@jY9!({;O=(cpd}R!YQAo;o#u{-Vc&Me^ug5V*UC z=(n--NT+9Cy#Hilzn0eFp=<^Ux%%pQcwzeZb0>qrNH*s-K{CJ`L=I9!!VV|n?;m0K&f z?^m{V46~CAg~m^x9+^8meB>ltw<`}HZ2YIUZL6z+b}eA*V#$;Sb5eXfp7ki`6fxjo zzPyLg4<0{=@DZ}xnp%Ie-`mg~dwzE{LX`(ORl|MB?YQqZ?(Ww9CL+i9}mJjcK zFB%xkxN~I2uun6Vb;8m4*;r1ahBfqTa**?o1Q#1ZDi07WBZdP;dEBYuVr~$XG7Xf) zB*=w?WUze!7wC#9lZOq6NQfNrARfL!(^`>}N>(tTf!8yKNtJMp6 zgcSJYF%$m@J?xO0Iyyfzx4`=1!TM*7QYf57n|O=CwcQpNN@t$CfO+?7c2|JE`~+sU z7jN$^J@iFmzBq!c$J{yuL-v|nzp%oeazip+5y|n+Z{cuP(^veXF6PkUR#euoqL*=&#(OO zhbi-w;i06X(kNX1xW4$vfM>ae-8VHi4PrP};36 zoj7@FGBf%3&fUk?uJ5g_c>UgUh!=Tu{^I=D2iG58U$6VR4qxAeC@W2^uvgcbmhSiI z$)IOAD0-d$lHFVq|!oHDTwjNxory=DV`nVp{7(hU=_|;H7gMtB#NbRYk3%cQv8CQ85Q6fNm>Yr*ARZv{8 zkBB$+GZ$7q`QS@q)I6hti=Nr8>~7;fh8ui0fY%Ua->D%?w6|LwtOIH`dR_E)zs7<0 zma$W3(#IBjJ}llxXsiZUrNUKRO4}CAvksNY=%`L1_;*mV(ziD#xnt{?E8Bi^eCCMbv^6gjnP!EI9 ze%6x60sfIgav;^A5`chJB;fod2$2rjF4CWs6;c!r`9y}2QtmT?C`3dQf@cnyyyYEk ziCQk$r33{ z8%>v6_d1=~j#aF*8(m%Z8ePqD;^DM(ex|mZ-JZSG?sx-mX-s&Qp1SLm*3Ikd8>@(k zfbEv_?2bEMu&~K09#Qo1*!)fPW_Wrno3C$;XqK;9^_u3nMCy9KdE&_I%*e>@91#>F0a&A}qS=&|{cb7$h2vE0L_m5;9WpRRUtdvLYKr&zdj zW8J2`g}sjOD#IR0^-`E7`d(ItEUDZ&$*m%axtc7W?y~f)m(PB(LgNqt+(I4 z{3qZ2+L7r|m$A`m^>=rQt!B?*SfL`EOdQpE-!xt8yL&(Q!S_~{?;4)Y!pxC3-}r;M z`R8;ezU#tMU4ygD?b|o7Iyst3%^pAI&x|hDns%?llS(GX#+`wnx6{*XdLojvO4UTG zWj$T%C%nP~rOu>g&zc&pW%(%;7 zuf}E$$$UKM7C~=wHUZ&B5(m!>XY-gWvxU#9j}TIuGUR_|3J4NZJn;yyK(RF-NwtST z4jP=;0MhV;4?(G>y%j4o1qel?(w+pRphW^naIS*f@mBGsa#@UK4NVUzk6gtGKtWb` z5D8dP_z?dXGEQ;|*MJ=JL0?dT6!XMnV!{A=Pz)K+q`(L};(j4~kV7zv*$$Tz3pZgM zZr{Dt{uNeUlGT550E>my=D%!_>pv;+&u?|7Gd^`BJ%7^h`H-tjH2#VrseysIL~Oj& zi6-G-g3y-Z=P&Kty#pU~QOrNb{e>xb$3W0`{Qp9TUo8X7XHJ}+J$v5eb|cbOt#7cAHj8yn1DRg4TmGCEX`-QF<*{bY|8C)U}^+A zT5zsi+@=(EA;I=V>?(!~h94|oEmgT1RS^(SX?}yYLrSVO4jP4OPLj*UhysF`wLuG7 z((ua~K?eTV;Du%3l=+x4#}F=3^Nbt1dkGp~W3>(n0FTr%@laDlqc8$S5~S3iB=Yc| zT{+9~hYFTbM5_{k8f6qQm2!AK)WD$zepLGkT? zhP~H}#DkerN5`k9vDw~O%Kp-6IJ;MGKWtZU7~M?VKQ|gZHWIlsGd$umv~sEZ zV7K#hYxl+tYiHlt>cErU7m26NUK%_1e9#~2=l3_>`u^&*E8bjT2vJsgUAXPg_ok09 zD%hj0?^a(R(7T|k!6qaQy%LW(pFbD;+6%_X1xF}S`|0J}&aMypP~n4v^i=Ga_)4M{ z&A|lK`?`kc?73cl&!z9!`b}MPYff(;p8bwmuGD}lW2w5dw0!nr8b0e+-v40b&fU(_ z&19pi?c{dvJlq}`n>ur1{@97aYq=l&=pR4$;2nf}oSHm}=rJxMaPrhSC~R$YZELIX z-g|dIlS-4Cw5Ao-uc9VYxH8W6)> z##cPCG>^qzK>{0(jOFqq4{kWv<5A$lBmZF($k5C*v19p2;oqPz4PHKGEI?}-83*N& zfIDdyf{(h6|2WJ*$8nc8auq()rBI#0=*}@jY z<(xbkD1BLw$2n^0Ajq`xOCO*XdxXdjcm@HHPmvP3QUIvMok5hRlqDc?DGCt?z7YTp zyo$Os3m?*8G-GR0?8@|;Td`#H*FO;Te0brc)9a%+F!@AAL4)ei=l6QtO5j7m$ca-!^Cz0vgxWL>rwd<~@zFurhqPH#Fq;_J zmjjpbI>;t7NMePup#er38?FT!>F{DltN`?g2nRV7i(!*O?3Riq1AsbW7-PVbBGRm+ zjUns6Y6oPu*DqAz%19rZgZ43ycc4FMX3rX~Qa$M_UWG@phDOKsslKI1rZk@eq13a4 zGHhs!94}8VaR7p{p@?Dt5UOP(Nv`Bx+M|L68B{p*$JaAFAyg%c6BQdR?&Ow9xCb~j zpn!;y`QQ!z5066)9BSa#)qp(G@|598Hk?M#!G)?#-^fJt(xt-wZol6d_G_#4#_E&B zt3Qi}gZ@N1($negV(;0@+1!ub{+?E?pE|wZ-Q0rPq|@p+V8dGQHnDtgsI+xzPOTA+ zxQ4=>puf6XXy;4bdIJ;n;1s?j&R);g>KmJ;wwJ5aYoFY`vzy!Nwpv(WIW%`{`qG)q znT60uGF!^&W_ckK&K^(I%7wjNc_QdOo{1ev2WHcu*<>itXjSe$X{>D)Z$7YAw_Vws zVRtzLq2STU)WwVb`O~&~r*!3d?Z%Dv@?(E38_;ZS%)zjOL6{c{TXk~E7je%y^`&F7 z9K8~HTN7J%UV72>$A7HN&)H&ed$Y0l@h$I8E=W%pIQ>8bEXkz*Eqgw@qh)i#oxNuD zvi9D-q3wix#?jgI)Rb8$*B>rh+t_%uQ`_0Kg?t}I&Ih5z7c5xTPIyBLY$Q1i@A9YArK^X6Ob1B#ohP8nDgs4>_hn9h6V;R?qa(rLsYCBu|33;6)O}*2tQMa zgBWU3Ri;=BNRuZ6Cq8L|fg7!l{RbcqCL;M9ihV#!g4y_yp`Vmt63WU>u}fGA(6l3X z5EPJ#KG~8)oP@lvJfJIZq)Wn*hQhR9cn?H!Nkr@ckU#?nJke@rHcx|B1YQd`Z7eb7 z$&wTT5DEeTVZ`8P3JyskJmJ`P0J-24BE-zE7s4AAK?FjAMFkg9b*CeaC{XF)ryu>S zvb*zZIi?E}U-1MTBi{MQ$>&mY^JJf@0H>Vi8EAsSP)2H0E(MHJx~wPWB18Aa<1;V6 zjzBcK_wP2!MUnF>vh=GLLyzf;$1|tSM#m;_Z6Z<_7wKYMJ#9%G2Q7~4>j$qHgPKuw z3Q5%kUmjVH)Bsc1mhi*sp+>fIg;XpGE8OG4s(*@&bEDNP)$90ZAbP@qw741- zyDVus{Fe5Lg?g(+`aq;sIa5NCQpAEo zunkPo>X1&3C2dK6RD$|LoMMg<7Y1>yf|ObYt@$Sh3joQt#jcU=f=)%}h-E zSN|$>=5(*q)e6PN2bWv_@FUyKo~wu93)2^UY|u01fSXRuda{TqYG*Rh7)$G8V>7S3 z*zr0aRh#?Fy}WYg2R~~**|fHE@VW^) zoxW5$cw{bh;d$TWOas%{|M!2W-@W6h)BE) zP1m}9L{LxaiJ-04s%`GsN@eGJpHzPGk#l+?@wJy`|KRI8>s!SqkGi_uiLHgYcG*kS zg1wH#09jkF=+H};_)ZPCk}>y@qrqbf`VdgnzfFJc<2Z_nG5>ep^$qlle%#3{L8PrGI#2d(;v&0 zYVTcrc=h8COWQjaFP^{f(u;e!;@fZiyJ4?(ac<$<%n7gQDDPxHzW&k1)|2NJj=u5o zxBL!I_LEQUyz{^3uio$!3&~#B*KWFGqN)j-9WfN#_8wf;N8O=me`I08m^{+dy-mEe zxe)%|*6wQ9Mac-pJkgYC!^aFGmKrvKVVfNu@~{aHd+o3Gxc>f14Geb~Ycblg!q7{| z7|wy1qd0HGTEHC#@q&-K7as5 zBZJ&1>L|)2f&vfHKuI_fVv+&^2fzdo(}6~cVv|hr<$-scIFxinMNq-uLMi?e2;he` zjvHA(syLD?Wv~o*007C5pU=wjj$}YWn8l6QwFj8NG5+z6f1($jh)5Nq;#l0}_D#L; zYWDGi{L|%Txs2`B$lCAh!0bjKp2A!;g36-3Pp-l)x%s(aw(%L9N&Rcf52q&W>(10T2t2>+22m_@mHkOIKI)w-cTT8gy_&Puz zc6z}zlGc)=rs22R%?v!`utZFVge zR)ivmBqH>fX4T`?XJ@9cqtvDI7v|;{qRI4rrStIK?dvzMKD>Y3Y42Wo?tCZ~x%%m+ zH*a1ExO;#0UwrH2#6qBH-ThB*=eM(6mvwex;)pL*yYX=6@ssT3_q$J5V%1s*WGw7O zg-DzT0f{#=s~^<$OwczGbx%gz!!a$MC}_c!&1*CKHm3`7Np{QC)jYZ*XxjaVFOPko zT!t6hIbrhv_Hk@qHW0}!G>$X2o#YEQv3{(g&E=`0FA$cblfYNL?+O*V?YJB3K)KF*`@_5rQMpNm+>Plg4)olDq(PjoXew`mrD2z>=VEcN) z5t`l46ha|cW0XY%Q_?BfC5t+t_Nnm$ft0i`TZc#8fgpTlu-Q{Bm-}73dw{Gv7>Z3y z<3oYd;~^uYPF1U#!<-G-gABCaB}0LT1uC+sPcN(}$rtlgyOcaQgC1+&?{TYLmN4qTuU)N1RYb@iu836qNK>E+DFGRxIgcz{5kLe$ zj-&v&v}s~cd4L2wQZ)_nZNL@AJOr$SXATnC?ub>8$q$gSHV=@gnw2zy304TLIFLJX zN_`18!XlFuDA6k*X##8@N-6>fb)+!y@Ho`Kp$5LH1~??}5rnsh;q+jiP7MoH9kJBN z3oq6mJ}56enhr;YGRfV(mF;1Q8ml?&hAR+9WRTUB?$(ZDzu;-X5U2MD4hMP!u65C2 zw>kVNn8%H!wXL7N+uztp&P+FHUmM<*>5x7MCE%G7)NF}TOEyMAwd`|fgWX~ns>AL?oTNHR8iEV6LYpB}cV z)$;v^tw)c$Tbs6e$!miXd#}>(*WrrISc4>to(n#OkQ>X0u)Go*g(7IB!)=Vc__F)W zZ#He6D&9QKo%F!tXMN96ZdP`-9(?ej;nE&fD_OTE42N^m?&u&)c^@Sk=nf-6+r)%5 zI$}&@Y7@ip(M%+f>DnD*K6g5qsI5Nr)!Iu}Z~Dz{2Fqa!1^!V&cFTV0OZ~e{XpS>H4#fLNFngdbI0yDG6Hg|Ja zZq~D5YpE)x+cm8V=gsl4;jg{++L7tG;q+L$V=XSN{q+5J7a!c~_nQ-A$up-@l}zEEG9C=^Rb?zO!%mT;7P`!{+N+qm7yONFXun2`3%i zfaXLX3U=Dkb+g*PYHK|#_j}TS81AeoS_rfnlvS?ATUMVM(P;#T4Iq_DC^dL{l7}=J zW%xdXeEb_&Dxe_P2888~Oo@O3DcmXZL=h7H01v^0Zvfy>1|PT-`b_!UygONv3{vGm z$%s?_A8@S1q^#sm0UlUJN})^xlyHC_<+{UO8iB)yM!exDCc?2@Xk}-cyC(hi4mi_? zu-U`>aeq9Cj*eVYm6T$j4H1c4lXqcFWr!XR7-5C+S_Gg@L`5iLVAs|86QQBu9L@LT z->%m_0#?Fgk4;Vohtk-lM3|$3!3tS`dlRDhVqO7XY9wssfJLw>9~9WQC>LvKP$>rj z^7kMO*}#ZSzxXt0QnIk4LGuEdbRYE&B0gGMbNM0B8J z>J~il^^!2s0FWzeD9X4LxxkoWL6}x-@_Dt{5jZ)Bt@)fz_y|El(8X?0cw6W)D4f*Z zKmtBcAS_iXq$m)n@PXw%By6X|%s+}MU&W{`9P-0UCHUtQqrPe=Me<3eOp0qh(5kec zI6NI{;7|i!NdtT~@huj6-(Y7{4TfaT$V`rY?S;p?JLRSIkl{V*_Z;yWuVRks?(WB`~ z+uY9YSLop32*cSiU-u&tiruPc*yJSOk3}#=T&q?pRzL0W*<5}^9dqC->kxuJUdaCB zgWV6WXWQM?rTb5^+u0T(%Gd3!jr79^AWk_x_cSKKO$_j0D25cDKjGmx?!SmXtV-^B?T)0!Gah!2MctXCYi!K)h5O!c+j4Tt zCB$;~g>+xEi_aLEBb-ipB1t0p8`2Vs7Xt)oCYBpCHb(w@= z7)Asw9~s;MA_FjO6b}9eAabLUSYlA!NJZ=99ojsw;9kmeu*W~7(V}8kgjCfHksQqvl;t0aB9E!^ z!vcWkKe}6}*9<{KET6GN%!4rROyu%b;DR^Ffx)iuh_AJ9L1Ky>%B)z&8UG;>{syA( zf*g?{%8zc)6CNGMh8oRsvAFgW+opc$K25~-OAoAqjbeX@$r*1nYG55INK#x#pzJKt zrKZFxqt2bjeZ8w~{AHLC{9LK2F=3nd5{RDy^+A`-bKDoP=uNI`nN zQ(&Uyv^J`GP&ZT%QX!{^%*7A@3?P`6+8fpC7cts!Z&cXr^dI9VYQ+Vb2^A&vPV9IV z1lfQ+;8QAQqkv!nLdNl*BFPUi;li@JT+U<|A$Xn4;Jlp8<*?i?H}1-{x`6oK1h71`q=5hjSzl_J`NWU%@aEFLS`esv;FthZqcx+a8qPw(}R_W z&F&HFs*7?R-BEWsD~7XxZpPsXV7>;k*Ub(B%+&7QSh5S4acrEB#k+F%{i!Wu)zl7ZZ>x&Qb*KV3?%dUFXW;IQpu4U3guf1jlVs5jm zZ>{wz`AWWImO6f|*x4_#KS?FifAZbv{4u-R9ogM}`pJhYx9)nz7ko2QHb=M@_PNJq z>e=RvyHD2h`$fy#t5s}1H~K!a)4_rwpF^v+TkU4E-ZJaeYWu+hcQ%`8o2Oi!NUFN~ z@KLW&nhFGrLN0ghs_o|W(N25VZjbbAZV98z9ug`**Qa4-1>;N)^B`t+XX~9GojrbR zW@vbCcdz(#BQ-nqwb$O<+s(fB-aA8MlNT<%oZZ|1*-zj5VT4HZ3p|8sHp= zqxiuqH2Eh>z(Ja1M$!iOm5n0kfrb!@Ia0+zwCYDOhBJwBA*42<2qf<@$i$&U0g4{Fq+Avg*tOg~7WiW?Qp}IQk58a}@d>M%5KRl= zCSm5n^*lB)6C4_LdfbYXFhvTg&X6b+MWD|qmB}>h_;gE+K?LwidytZ{jFda52El{! zQp-}!M9}Zo_V@OmJgV+zu?1|e-R^g}0{$2C{kc?Z0j*sO6pjZ`Xq7mFo2S#yY zQFI4{sR3r;4=}LJLtcM06wq{T8=fs-Z`7tx9=uX0?=4~*l;Ra>vNb?aP%JKahkUh} z3K0tw%wblEv>~b$nQ|h=H@cpGSXvz$6e27)LHP zjf#f?h678Hm$Hc*4XfmG>>A#j&sUFztaM8E1$wQvRVvsDgxN~vjga36$6UT(6}x}*dzw@4bWAVy#bYI5R%};_T5-wbZzF>K#27&Cg8*{5H+F`gqsWAlo0D3y?MFc z+t=-Z*WaA~m;Z9#?cA$Y(+l&-6Gxt|KKft&x4(M0ym9)>^XD$SnBU)9e|mp&^J#v6 zzsP~0VPdgY3rnJU-EJQXh|iuq@vZNCePks4kN^0?k3RS?9*@5H#v8A_{Fi%Du^7^vlhH(fbGvqb(GOt}&mJ#jde1~0Ps8Sj=&{Lo;^c&Jdb;6o zm@c2@i`Ck;YDf1+hXRRF#GPpOu%@6LjwQp%QO)hg*JwDh!?{uoMPH>Y9+vsfr-8c< z?(FXEsKu!mVZ~}>zrd+e+6Xeri}5w6U)e{Ih6FNcqsl0)hG|I~oTRLX1srPNhe-ls zfe6KDg5kjdo@NN{#Ykk?gBLzw29}AGMJ~KINKgu(1b%5>;RiMXEg$fxn0jWI$i2`S zB%uJYvmkykDJX^pX(LT6cBJs1m@TxNKnTbQEZ58wNFrssQ^K*tSwrJssdC^475&qLRBdTHz>#I zL#mWOsR4|Lz#E{UOoCk9Q)NU$0l4l+*Wo#X|J_!zyth-&?PK%THohvF=+>Hjv%@yU z1B}~srwjWr;S8^sKoT8L3ZY}*fQfABR>=z01MYDNtD5{%W2_a7U-%IP*t<|Xagqh$ z5!bAfK?9={WK!CPIw{0}k#sSnNd)az38(T^5uq;cS#VZ~1k~QBy<)9agBKwP3U<~U z01sNA(uZh^l}mQ1BeWXzQe<Hw~cDAQQ25rjFg)rU02*4 z=$Kk->FMfQZ`E$z3?RfzGTw6=o&B;sU(kW;a=bA)I#3C+zT)D6T$6U*OKXx*wj%3&aEu1@4SDxbo++8Q`e1tC*ik-yn*?+ zH4@2sy?KYDmD?LhAJII4#MH6G#1uA`(rhk$E4$xqV;N;D6z$oZn@bNib~jF5Jm<|! zdZ#D$?mo1ch5SzM@{`AVl|nihj|75tm!sLWt>??-YE^an=&l`&o)g}K=pD%W$o$i-d>}WZPpWUs~55Nru&^4yOrwn4SbNmsDa6wj&(u+06+jqL_t)DpYOJ? z2`dtHj!o!1HOz6e9zG~syB>Mz<)+J%TVM01!kOX8Z+zohtN;Fged~K~eRA{m)a3Ng zP;~Ch1(#;8R?6jKA-BJi-Q8+b%frLNXU|*nc4Z^a{2Ltev6ZI9jAr4cU!{nWxSrTh<|$A zN)P4X$ZmJ*20}^t?Qk)2dZR;Q4u81T>SF92iKh@a4jb{}-2|HhsNv+d*Cr1!{k}CI zt} zJg7W2Dpe(*%NH6*jc5@+ie}1Flr<3fIIT ze1Vqemi&=TzRi(YB{5SJtE7K;9BSZD1HZWjK6{clv0-R#pV_XrZ8rDVMDS}bHu8Io zs}Fr`L>J-oTg_!JB%-b9@#yj6#yEqnVB*GbdwQLAw_ER+^>@3Ky_IcG%K?w@r|*9} zcVZr4Yn@TQYkbsy@?;vKnZz5qO7s`*N>UfanP@M#&of9wl634(bvEZNr$hmNU`Xat?AYci7= zNhP;dmme)Xii~E))5$=!Y~;(1Hs%MpewWe9RY!JEVdyjwSVq2hvWrD$-re8d{phk5 z2*&1)?KE2X<<<1D`7@`^zWn0S)2*F5_ijCYycCayL*ZaF8bQFBU?`NCPD~w{M;tPL z&|Pm-fBeq(oAuiC#N>Cs`EMsO7o0 zvv(ft-MXh^A939>!4087Nm=_71Rua|5 ziE;RWz>;p@qcBz%iG4|Q>VuJ}9;F2}B%#Vs76(&!Mhepjf`fVZQGzRhL6(ga;-%fREZ>p>~Rm*j#}95Id>wm zFmDZyjT|`|PY-$hemvoLGW(j@Y}Lw*#)ohJ!}di@q%xD z-qxsVm1?J$Yb~!LEQ?Kdnidws+I$Q~PPah>fq~18%ihNXg9GMdsoehLdJzjUCns0$ z-mpJ;WE8RkRe{Q+|;yY#{3^z^Bt-}!dM-uv*=8%vKL-dbGTx7)qZaM0y4LSgjqTf6%R zx7cc%a2u_+YdR$7djvgF(2rs5nahc>k@FNd41{BM`_t*6vEiZXAARz8doLaGC6Y;e zgy^(kjbJ+>_VW(xVa2`+2l{CCU${X(3eOUZrI@nzbjel<0vC1kqI+Wkqb9qAk z%xKgXiNHi2_rj9}UEt2<*2?m-hA0qjx7T9?yqNMvtj>;Z@6Jq(zxmorvtviJw!N^F zD{k!6_p-I^?dsZE-!v0LL(_9}BeTa4yD_);|FZYq&ypQio?m(ItDZOgUVD#j01Xfz zKr|#;zm|I)`HKPth1USZn!N?nQ zjq75~jhrci+nu=qd6|Fy4*z3Ty+VK_&zX*f;V@}kgCQ@X$B|D`8px-3X_Y8-2(P(i zO$YP)YqXCAVucvwsTjr(w>L7xkK;LlA!f-8##cYZP#sCvxrEEEgQR>7o$9Es<+eFO4aPXH)Eu2Q`ho}`?2b!}y zDi5k4#IP99Z+t43e<+ZmsdYAu8l+Eue`68&#Lm?IW2?a;mTki+_(j*GQ9!G$p5=Fx zUVn?ohPh+aivmlX2)nT4wZ8k4&A7#o@Jy9%Y1#=SBkMPAW1*@Yk$W&8eh4~{7<->Z zJ~h=uj@-)hxTaTFr&*0)t8j;rof<&VE1=BDxM;vDwCMIaT>FaRuOB4Tqp`Bt235GO zT-AD(4|FwD_jeMrL~XlQnhX*oV~=lSq7|#TT&56cZlFS5%GzzWn1n_d)hn={fg-Pi z;CNA=TNnNG-R0F0e}5Bc%4$SIUZ)Z6%P9l|ENTBU7hwll&f z9ayIgLRnI*R8Du!yZ$8H{=j$5x@8+{fX(aznTk}CmZsYaVBccuT5>A8+wOS(=;Kta zWh&!u41M@#QjsX%r#(-?hm+;e$n~d}u_Y?+>RO#u_+_0d^-$ z9g-kXvi~E`LVPR8xiC;sOLI-6Ivlnt}W#b8Ah z$->&jd^uoLz}LJhqn+v8iRDSmk$vyMQ$Ph|t6Tf|&7}J)+1JTvZ~1d7#-{Umu0~BM zJqJ_Pc;1h{l!aHLM#c5nMY3rB>dS)|2}T-Sr`_$gKM0y!HWTi7fJ=6TDgt|JOTpRM z(bnDA*RUXV2FDjLRB%FfGT%0>q3ynIi2~f`VMUvkIumT_m>s7@$2LzP z^>UDw%r<`o`upM=1=97i&xIavODdR0vqSXpOK^{v@u;?YRRh1P(MGAzG_0rD#a-;Q zrRbMwYem_*U1hVylGNpyph_j|3#X-8vxaJtCSx*U@INV}fqI54nug^_vVpcc5Z_rj zVFUJ4O~&VB^M=sjmC>+&_CedRH4g5oy$--59~V(QMsiT%TBQiU8#0}{G#h{Absxg` z=Mtoh;)4jc>*X&d;YDC}XD|tnb|gsD7*2Fjcf%{+u_sSBJ^pFhOH)QC_6}}Bojn-& zW8oT-A-;@~*Z*_qFKx(A_aeZfP{>C7m#R;yO#zXc^mks(4toR!VeC(lnei!q2pMpG ztGYrcv>p_%f(0i(LT#YhMmFzVB`cOc^Xml{7R^uo5jQh`8`#g{oty9t`Vl zjazQYH&-m2W(rEO=p;IgY4;{9CQyidHFi)5IsPJvdO3b5xLx^HPb$&X%iKdM2^6`G z0$L#sN7s#)^c*#R%eKxuKbL@*StcItFJq4hF_6*doM-I26i6*(zVn2IU^OPBGKdyo zp56Zr7T;x9vkj+k=S&}8a@_G}%HbVLHq;C}d`~65&FdFRH99497vx0Ox;=_~nBIFA zVsx2+kOlV6(w^K1X14?1Pu=+_ z3ol!~`V|APcEyUlg6U0eM~4r^Ry%{SgCe2BTHd_r4w}0B``+8QrW=8rkY9RCv(O}h z*>x8Wn!3222TeNMQDwR`EedM~pN|Iad)vngBbJt$(2`3{Q!4E7<`*g_4u*hB>W-Bf z-VeU7e$V$WHTHRH+wa$$?-_V3=jEfqhP01S5NdApmM0fAU2Fmmw7kh@iJ?pWT)d~H zn8MEm#aAoVjY>8T>*a-~^C*>~J#`(rD^<_HFdAixFT2x2K!GLK(Cb181iRyNKt-Gr zJ-ch-P2A;HRUlfpbJ)Q|J>eS%r;dmU+%S7Pt53j#MHjDT;e1SU#n2Qs{tEZj!uMH^ z`quhe#+i zL%XtfyWHBQ)kTVfp<&G@AV(UP3*W?bvm_$I_kCi0K4AGcVR~9*R26y(q@KKlT(@g> zs^qM$lsx$%7ztK(@j40=5(QZj5jQ$kfY%?61bR-G7sVlB&8XO`dk$xlPtxVj+0AoK z$`7=Mi@2&14R!#l=CJ@7o|DW!eyc_jh2q(S7iQR$NqBJ_9BrrpS|FWLPZ(UNBfgL# z4J39?{9i^Idgh;YqTqj%U@1qfae4}v^l8&B^g`keV=DA(S*?O6w@lUJ*a|6^RlqRR zejstP?I-a0?RLo5L?u?w#O6WgNI{_FUF%|_zknx{!}DNCP>CiVsBEE7&wiO#*M4xe z;#9MQd&W;j%VkzOQz4je6c_G~2tPP+R#k<-d$40^m?xn_jA!BM!g|9+4mzr9ZNP3O zPQDFVw6(TxR@B*=zYC8IXOa4oXs)Eu zm~1}1Pf3^`Y-=YKoP?P$5s%2qU)hv&J>KxzMDO!Z6cCEz7lU5C;bpFj$Yep1$1Aw^ z^t|rkF_BY|DIecwd%Y&jX`$Vaed1r?``Eg=S~{ACy`myOkI0PsZk?WjFI`%xvMy6? zU}vkG^FGlk%BN{@r^K8c0k|3SdLntsk?zK;z>J|P%e=?J8jZb zOApq$w*93MPMU{J?Co+32_TtgwZF~=?_$j5>tMhF#-%6dRSSHym@`f0mbJnFE9aH> z$lxksoYN-Bh{8ld=Kpf4$L`?TRj#hDaN$COYXC;RHoZU^V)f=$5tF$O3{QfvL&;qc zz?Hgr|3GfT$sx0g@3RYGoMyeKXVfFwE0rBtUQbWEi2mkhH(p=eb)tkJ&r|Mty-$S$ zukZL6*!d4=j!y#E_nG6&vq=K=zIoY#9&a!@XT1AX!`Zs4p}o&vemO}c0yXl$@X>`4 zyKzoZ2%!Pn+c$UK><1K8OUsiY5#sIB-y$mEIS2my``WuVga7cra!-YL@iHikdq7ye z1X;gbO9*2Jd5Ln=Fi_k#*=HT(!^4V0-kt}bOtxex%dL=@D=^~j0!Jpz4K7hx99>QI&RZjQFIpz|yO-rGPR;0M zDpWAUVLXlw$JDMXst6EHF01EKqP0gZZ;{dAr>%~ToGo^bz5Z9^hN5%q_e&M#B-s-Y zNzWpaqV=k!6<0RqCN!9aE0?A7S9PC@{jr0irl$3E3vcJL_O1jOW4hY7vo`d4;)KVh zswB&mXItN8HD5umiRPYteAuF5(S66D!#cpQS{@R_Ba#(;(y99Zo-R!sCSfgcfI*HJ zTo}!}<1K9nZm#_aK95%4*WATGq%Rs)?A~<1WCI28)Y*gjkj0`h9Og886IX*PbIB+& z4K_G|5GoB_A(#+j!0W$Ul)REGPbLwgScsXcKelc|QM1P8qyCJJ1|0(0q&0Nj8 zl%UsFZzah%9k#TQsmV`GB7_7}#m3HQdqApiGnYOTvso(e(fR{_#{amdQ9q$XP0+W*rEKm( zDGva4E7W^7z+`e4Qq%1m3)|^`AvLN{M%drn;1OC0zx{Ol6Lf#!3ih{!&SIza~VBWRcTxh+yLWGf^^Tp@cuV z>~L*iU7?$nikVGu;fk|in#z2eUwC5cS+i0aIbWiW>%U!ks>iC|d0;}E5<9+k#x#Ef zV4dTaAgVaBzHF{O-{>dWx=6J!<}Hz1PF)OBx+h`P|r-_Eki6qcSNo;jOb8W&(ZG?#?gT>(MQmQ$h|@1Mfl zeEr8&T~(LXE`)z4kvTKzC8t?BF&np zxXo`D0$FX{GM_|vEbJ1)kXr#<-UYXZXB{IYj5R$DKJK=J^D~iId=tWI9di%M*nu`y z7fF0COHENlM{4v^x!aeP`1esxw$@dhU3ic#bUN<0gFz{xqA`st&#XQl_v2X^Nl8J+ zUnUibFeY7qgrLPT!0BNtUB+|a{5w11kYcwRR?3?h_r?X7hPQ7GayY4DoDwa@Q2NPZ zBxA)j9?n@($V$k`4k7HQ-3rhJn0^Kj^FqHDXyvpq@o2n0L9>Yz*Dhc6J}X}hOn@8} zaeG57*h1PYTB(4T=@~t9W`yg!COfYUIS!#Z+Bza3ySJ}}QFI4eGL7>s5N8I`@G zKHiFiqyTk+q;?)+*epCX(gU^ggs@V=`g_fZYi!B_b%LFXX)!>Yut*+qCTX1F9K0dv zJIka%hn8`V=l!l?wN-)2opsCu==H+iJV2#ENNl)kYk!@w`FeAr=9iTk)eMtZbt|fE zd=Yz@NMQ&#RIJwMvwNlf*A7R+TTiU`$(=fVt)e@C9ccGyYzjLFpbpwY3e(1E$XbPm zadZdG_!$=swQ{|!^YH@gF$3)6>K9tt_;`pYa23<_L^elK#tDW25R##@IIaF#G9ztk zGWdiF#h+5P3_R%Z(HrlV7VOS7UUu4#@ZTK`qLhkFHlw)EC{m6(Ro9%&s(Stxm<>lM zZfcWBX3b&|zf`Jr`DsxQ<_rB7m2n6G!`A=~7t%OYOfX*|cETny$`5)z+(1hSX^uhe zmGM=C(R>@B*CZfbqG@==#H1+KFZ)(B|21_NX}J{Jle&vSoMIwYPU|eDpF%mLyU%g{ z5-7GLrr5|Bz3adA&SLQ|B#O>8wIolBdrj}HMJMXeA&50br-V#hDr zKd07%{#{nX8DjOFO--6swAK$9m#rd@`|8eN#z;4NOa}#;dl{56j7}7ndi358FAtWw z;&>g0kS3=j9#z{{fA1=b?3>|5PNIBtDyi2NH ztvS+=V!Kop!o5{Wr>9U~%3p8EV^rBBJFv5hN{Ahi7hpO7Qcn-iC%m551J7)1Uv^(+ zsa5jfLybMSXSGw6?pI%3XZc))5C(@&OtBRHMuxTrV*?r2x-SWQKA-2dv@2L&n-HEQ zM)`ATQiSVIUk{o)VJg^VBE*|kQA9`UZwnTrNU$@wJTAxcM{NhDkY=@?Um-=BuI2F8 z?%~vzCUe;5LnDT_$i!s}_j_ULwiboRGEN@?-G4mQ%`<*9Md);UTaSS_VItAQ8JHSd zsNYkfh%0~bL#=V2`nL9lt|P&$hPQ%sGBgvcbLUhZZ42rui91|j1uuKStfLm-;^o)D zEb%a~55SiLgB?N{+pr zuPwl>tWm`Gr%_M$Be2XJX5=s&Nf^YES<0g&+WS?<4`J0wCH_j~$Nh^ch&9i55Yagv z*FAYM0)wtFsv4X~pw|Z6Ml)A0m`|fgR;DFe)7-I8t`f-39eNqcGes-uU|=uCiJ3~h+KD1@XBqir0%2_`heTWe5s(yPzCn``XwYz1 zk)s`B>S#D3n?c4KQ_>GH-B=*FRz%v4A5Ve!#QjBrobc;+MykPCk%F@+w9bPIz>AQL zfznwIWCU5<IZoPXND-V|Tk`kJ_W1nWqb0Zsmpt)p z6l9QKltEp64>Xaey|wYd4-Jv^1acgEko5^kpaL8bnG!DWB*%H#hLY>W7oh~Ra-BqRu>ovag}|p{9vOKm!A@Dim=a2l3p^r{i=?qi zhXyjUmnd*MmOx~@7;#6fG;+LViwN$U!E}`4ARx|t$A4AHU$74V&ljuk zs+4l2XTVYXz38#ecg1th{h#lrvmiSIec#uH>+hxG{sn4VU*a_JSC7l8qLSwtUHIe( z-E1DlF5U8-&ZL^9{B9fm2}YL4vWc^2&enxNqM|vem(ANa)t?WmhFumcwVn0v2d-U9 z9yqc%WDysy!xe$J?7)F$4-d%QI^`#8l`OxlV3|3Q!wqBKsgpiqd>+4Md~X7xL}Tvv zPS=P5(#dzfq3JxeKr=V-hU6-&2sU4HZHX{)$ZQDlaG)$q)pz9 zV|l~BV=9jyDYUIxDBn}=ETYh69?W5E*@ducJWTo^#Ex87EY)3wd9OXbW_T&KKJ?d# z(ccZ=`*vzm@pL{DWK7~_sc*czJRPK2T`j%7?oNYg;_k&*G;pctR@Zn| zpJ8CCy)W%AP|FDLW*Yjhz24qNl*GrS*lc>&D^|zEL`kEHuwL_h&3(UKZd`wmC{i6S zZFnYpn($_DJA51lq3fona-p65B*$N0ZM{~$?dn*1w<&JH6?u-Wxw&y39663{8Zo8a z7mjqsX)PcpLUZW{I=Fl3OFpvh$krP&?FkQysYZ(mbHIE)*%8+9Di+EyB3b?T5@=rd{2LwpX zKNk3T_x`gwDEGwEn?N+x20A9LuOi>Nms zjbtYY{{F`MFU?UNc%a&EY)6hg?TYn2OCg1Q2Y{~2yJorb`RwaVv-*J_9lg13OH;km zcAp}t*71N-sfhzGN@omR5R;)>DXIrLVd|m{8Uou_f*zI)% zSRlvO{nP`zP3>NNjfzpIRzEjOrhT5pxtI#aEp%OUtr%G<Gb>ZN|?~~Zk0weX>mh&*=UZ3iJK9B&)RcCdwKJo zCGL+bc9u*)x3>echtbFQUH@=MPQAMF?byKxK-jF1K4-?X=j|z_r>*Yuv!jJ5g|^e{ zRj_OeqRM7SvvtmLJaE1)cC4M{@z_d4`T6acXZw$>FUxF=^s!0L?K;5sm9C(KR`?^% z(eH5K{n3LaHVyY2Evm@-EeIsV`_T24s(esg@rC;BnNWJ4;d%L$ZA0Vr_ z^yl~eo6y!_+2W|={al(LF_yUq@~2wfd5p?$5GlC#0Z5ZIp*EUndT(9kglJLZHU3oP z`iF;ABoDv(@6a(8<-Mw8*h-ExQ zo}yG%%Q?v@aNZ{F1w12eB*utu)MS5?!RoBNCmXb!7(GwPI;=azZuH>at*-6 z0n}Wef_nteYC_p|G+`lcU+WI0o)I|7`OTKj2{T4N0gqT{Oll+qPJ0xdd#}m7ueI$R zLQoA~Trv1W0UymF6#l|`X5u>L3MGA(lT5h*G^YnZkWxfQ=7R-P6>g8`Q_C`K}s-=#m-O2_w;-3EdI^M;YOH+78*8DkYa@C9oLsY-*`YjvOp( zQ^`Ixn(dgOV!F=Sy86bB7ZeLGwN+hRX{jl_UJa&VvPEKO#TZscV--9SR@M@U?psVA~DEfw%@GDN7IX>ds@-IAcnTtI3Uxv6zvB`EWoR^Y%i0j z+)f<-pnN%!^83x-*tM33HCigH^B52!=lYBB${;KNa|r&tm8e3^MA_pNj%LNvm-%GC zXafKLz|hNMaOMgDdlZ2{DzZn|)vZSHxPM;Ia&_J5>P({cEn?D$0>yXbish3}`bJ!Z zhez($;mU29QK!H$?W)n!BM7hOO}GHBwzr-{6c;_6^E8$DP&hKt^eIep5jDux`~-Ed zP?kWR0gvyN!LoVocEQl~IjIMWf1kL*G~|$VbR@d-rozq@-{wHNe5;k7{^tNu(K=hY zaU^*e_&rH$B;^|X^p|^D?(^o|gNw%}X^$y2nt4oAFk>4zG<@ok%rR42oK%&T{*t+; zWy{c@N6kn!@>jAew=Tw?La%ObmDQGx*6n9I0dtRz)T!2XCa9lViaiJm;u(|U%aO&; z$a%TAQm6?V`5b;Sp?aKe3-jtu3f1nu>woV4ynIg1j>I3){X)qqY?<$MF}2HAb4sBi zLB51h7VurdU%zu|+0Qee<$Z5rll{2$og0&C^dwY)Pn&3!APPJk^oTvt$gCAIg&N{?dL`j4+HXIH{P#zrX6w~a@o(R`-xMCIk-1-oe2gO z+#zCt{m(ddthUi4S9b+vlf6dNG1U|-W)|cyTm9;Vd{ZEO*vhoffpMZ&10^gI_6kU| z*-zmS7)tQ8Bdd>6pCCv+xyj(pZdl1~nOP9tj1!CO?H|XA$xAHp+onWmUS$3;ToKH7 zWU3h)6nHDf%{`3k=-fQa^kL&ZCc1tCNyl&!`jr3GBo;LeP#509nUo&H^0{ z0PcHJeN$XchG~WT7%9X;SO@P*l5jjJ#$H)8+_GCfg89f`GJOCr``3Bwu(}KWxYSJI z^2*te_wi5|q~hAP#S&HP8pQLiUHa~Fc|YUeBS8*ylD08+Zjk|l0m>Cvux;>f++N9) zVn`$~YiqGkcBV@YTn32wj<*+meG5*UsJ>GU87%{xi8hD`9PZ)`dwo-4SpPHr7&n?u zXA=8~G!6wV-6kI64!3D$YSgETT6H_hiJu#3P%Iy03|L4KOd+eAC*?XLWaUPlPd6Ju zA03#8sdN`qW`(#TRtpH|q)H3uZ}S&lY7dH3^-M8nYKX#zxk(}qhG7T}q9-80*@B%G z5qL(B%eqxbj2v?FoizX%v6sUNU`7m_4Ep>PY)efw7_oJ{j@qs59$;V}pDNaS$3&!E zuj2m;ljTli6j~%gppJ>(zD8ALfT|jG#Ec`{pgg%0{Ui^BY+-NaKP(mO+1}iSBK%oJ zsoFR@M&0X&^eGbp9@eiRy65E)BE_QTZdi)cVOTpEs%zTPih={`59tg^vy?aDMaBeLO7i z`^Cz^$K$NZwos<4ap%tFI!P4`-=>D9-t=s7RIF8jcB}i`vz~GJ(zL@t=+4&G_WJ`p zD#q5Cl~rRSVroB~ZB+_q!YEpC8&Q^UkM8gs#GNFulTV~^M9pMz!%(zLk3b&6bhv*k zk}vb&tsmqUF2(z6!eehW+UDskwwZMZ$v32V?*$c=*7svsr2Pt*Hyfwr%}KUjmhT}( zU=!j5VkyuCN8c=B>RRc568(en&d(pyn|x+rrU-GRsE=4C`g%wLB53|yU=Z3?CeJ>g zLD{y|E0fpQ2#R2;i#_~R54I#8Pz>hC>0ii2uq3sT-N?J>Kxuj0WC3emHpR;z2$sYU ziGv~C`dlQjNta?=A=r>7c211Z3Sp6pQ?Pvv^f|RauY&a9z=RVo0BY`{sYjWDzj9&= zv0*l`1Ng+021v~dmH5ILeS2I8VHmOt?RzaHZ~elwn90 z`MF;qFgFSKRcck!DAaN(dC4oXGS$qP4O){?{gGhj3bY_i5tK5wQbZ>RbyGuxz7RtZ z+11%vGdVW<1RS(EqKg#YN)o=YXO-X@^qOv|lxQsP`yQu6w`^Q*6|3(~ z(4)Z^^vbGY(ex6Z^$bl~2q%nKS15!ng+j%m;!XG(WX70mqPF@;e^J%8cXfcBo{g8U z<|;V#S@e3}RwA0lMx2l!O;+L}m`QRg&2oU)qW$qutxp`e)Cd9K5GwyEgg{9u9m|DQ zSTvNW@>Z!?zrBFq!!bTq*U1UPD%&#a0a2F?CFBGsSR7B0hIK-D|98e`fIa=CC_8`% zGXmZ1liSv^b*4frDjVr@`(s`Dyt)M4Q3-l1AnbMXZ*q=LE`99i_UP4x1C{I(K5;WEvAP_I2&94SvnQ&(C(oC zc((jqi8q9t&NAeY?U2%{mt9^_ffPYr+u~HVmU`@5li>mJEe7}64j<_NoY#Q9U*0O& zc`zr7sV*d3nw4iuGSoz zymweaUnEK_W{L=TE;nW1W>n@%61#c-RM75e!UP#NFWJEw$M{0&N`tVz)Zbx|`-93+ zsNnjx{vveUw=dToS3~d1kB`kw=#-6(BNM}|5hqw)Zg1PE1-eI1XHMoPXn-fRaMg9l z8=y|df-x3HyUX$UDhs=4>S%>do1MkJ^UiK>F2+ax+klq3_N>V(i;b@_dgzp^I&vq$VPQ^An*B`UlL(tz9ma;ucCtLw{X3LML{u&eyy~2oR9Ec_{{bi0MI|zh5i%zs+ zBGk$(Dyo!d9HMq+&?}H|-%gU|kQ!Leo;jtT53z#TB!|{)GYICX`b-rrerhL%=ssRB z6A7-h#;RN#GeNpki5Ehp4}{X*Fn;PEx=Tyt6bg`{h=U3qsI!VrvsJL@81$kPWn}%f zZo03u3*Jw?+bB&`vE8afk4V1IM}1wC`z7+YcDJsocN=F3OkBX3UxZI zTff2Pfb!x@2kJ)Y!3L$4Dw;K0u`$eIiQL}>9*UVmGHZglTAXU;ke>gfE!c_x3!A~b z2nC86;fHv1V2cmZX^+#|S~a|z8*?o;TBlZh57qwh1U?dWqDFMTxU4oYD%_YbKz|}zHAPMA<8;a;b;)$*UtZ#&K;cn{0IV6H1Sw* zAwr6t6d#ul9cjYjp+~rR)(cTN>Q@RA(P*~GSHA;aN_9H^1T=+>0fv-^CX22oi}Kst zoQQI8ad98->l37yJXsi6HtsVTvs{i#MMmhWE>2#%; zKlOL%n433Y#dO_Y+REBkD_IT!tj-3*=#J8}s(QXQn&5e@czlp{C`~G&^jd<3q+7(x z-n%4rbRUlc00+cnhRAhglryVw8YEj$q=0nnE}IPXQYWfx%yW-^t|*&w`ZW9uLbKSB z8D7hd ztTYM2@t6bFX5fEM1CktULQ|%gdlO0ZhT~{Jr5zj?7iNpm|E`IXfJg^&VT(N&qlbnv zorPc;9KVE36a0%TMC^1Qp;ni2LQ9^DeeL6`i#6?rBtYbVRO0GnaBpUI%rRn?_AO^}|Ru0qhz{6`itaTvzDvhuF`e9`x?Sf34c zz=re*{rWmh;Ttf|A~+q4Hu_V1`r>uL!|Z+QK%)vI*>ohqH5jiZGEEtqU%!To&ED$8 zF-f1bN97Q@4^=c@iW4l28t-8z=QaA)={8EghYR(h{?$5i_nqf{2~*S@4dJDI67LolTXSCwK_ozcwpW5lQcmKI(09dNQuVX z$TWswDWckJ{7hVwcIfCmTSm}$^5C1jFUQ$Gcx4MyZQrg4_r?nArY zrMT$H+>j7KD>?5<&q zY&}Ze9b@&R<>2AmD#ZeBA+ns?eVIh?T@jG&fCgHEGiFkmQP6Ti2iO0$Z*^ERF$2Y7 zt?GWkMg9%^+mf%{3J{3uuU*rvAq6>ndv^d_?cXgQ=63F6UHq9pukT4>W)Ck~F|mrP zDY(If+SfMi?dn$7O8!xI>r*j1FF9W$>x;s~={8p_6VLccwtN&xE>J17mrdpGEjAz- z-LX05SZ}azsM|O0cVP*u)9&qK-M;w)=tD9PvdGd7Zsoi)K06J2_qHR%Rda%SQ|Kl; zZ~K#~zI61Ap81=dir*@}hL?w9hHG()(_iCFF&l=&3HSFW^JO@nvyybk0EaH6wd$>M z1_|p*>y(KqVUMq)m2JI^%a9oKjVYh1H8>C=DL_calwE1oG^lJ2mpx!em2;cGb0g^q zyDOP|75>m*?0#fMDpD#J_KBKgk-u(v)fC<0_ljF*f$o<^-L`t^CFsVG2u*E9Xz{V> zE7aDho5sda7CfJH()pSLSM9@M%1q_QDY>aE9tUbPTF>J^$@SOxyA$DZX$e;peV_kr zrzyUAPYLRs%l`JP8MCiGk@uCEokc!gIGguvF!?g9aOaoU#z{;`L!DRi)?<^0pIAP< zj^05cNI<%`caf!X%>T$Mz2^MET-N^I+|Jd`Fu|Tum{9|0bMm#z4q&W(xrpW{DS5k- zAY9NA2dy-~OcpfCXaTVMB;kd`+@men4T=1W#YFlGCHaNS4WN_LY4Ckd4s^uf$kz$6Tq6HOj+i57qD`91F0JW76>t|_Dw_R7%VR!>Se zi^L<5L@p%iq$7e8&xVzyMqWga2w|qg*pVcU9XL%Vk~3Weo(x%#XGzNj4HHTftGZ5T zq^VfC+UvXh;K%nX=Ww{($(S5Luve6-TIx>pGgD_3sEmab{*Zfv8A`l(J|!z-VF;!~ zD;J-P3H}C0t$ZSAAnoFnAt5DIW0G9q02rfpCgvaA!0a%DB zZ5&@Fi;#o97Y%uV^3t(ce4bD~AwQT$3`8nKx;Q%7piHjXRyqPlaxi>Wi4m$Rl0+S6 z5wlcD{s+%V$44WyZ|T=ua6}rodZw~~l;az~$RV8zOS!(y6C5RIlvfom6tBDK7y5C! z-=vBae(wJsR%tL=9%SjGGmqsx23vkt>D9`)-&Df_40*U`cwo&YL?E1+ zC4F)}H%TE-cy^I?uL`5^ze{vmAz+VGZz-eN5R>||y$CHnPOb#c^N6j>rMD;YZjGIl zIoJO19n~}pZQO~=NOY5#>`Y!>E*>US7|@MNmm;mT?QIRWo7@k*rc4^+=ZQ-NcUwnt z&pR*1IO?7Do;TI+?v9pZF84+@)_CtrWogTu_61A&@s|xLDzkGUwlX0J{2d#URp-1i z_@6>avst@&YrbE5t806RK%f3z!+#wX^#F`z)Af}c+f=kPG$nZ)&A&#Vf7jm8(J!p1 ztTekyh8==b2o;R=Q|o#ex_?q)o7Y}1JRL8aw%}!PbMUwteMQl|wpZa-Rb7b&)Wv=^ zRAkX*JmGS1vO2ywv2(O{tZfp5ea^cy$UtNvyw_%Pdb4IrF}8NnEu zUt3h{Wo49WaWiE{Nadtf7#A$X_H3SceQYnOF)}~*uN^mK05qz4>hRn<-H!Jqqn>Ry zeO^?%A1{TQ;s$k|k?2~hV&Zw}1bj5g_838RwKJ()Cg6$P|{m=TjW!+4FUsJAJ?1cyC|Nd*Izu?>cgSW!Sg) zn_VOU^ezW|Sm+amZY;;NsMTHT<*WXh+kp*&*)atQ3m=DYRg8uCW0*Pp5F3F;P4sgX)qcfz}O{R3PJjs$jY6O)DxhQ1wTM)n0}0GzdT9d?!fqeqkvRSmBwk&PVf-J zxr+6dic|1Q$*^Pk5( zt}q5C(MdU7I|bv$iPcZdAY@iyLOtf;`8e5s1TD-I3o6)AW$eraLr;~!=&~NDhJkA$O63O z$OKc)>}m{(;lhev-GJ%8$UwVVQ+Q~J9H;?}lnfKj-Vfbm4d#|=efb7QiV=w>V1vp= zy-Ng(au@yx5N5}Ewn|=8LFQUjsIZIUO%-s@=lm4Ei6|4L8K<#9Z(aFo%yzUOi{i1^ zMkHFwwW(82`3?*tU+k^4@p?__0}QS6tH;XusSppgfOr&>#I_X|!BLU+ui99fsj5B0 zl0lFLU(yxyuA#`+E@Y8#|5xy`)d0Q%JR`BuV1*ZHIMdy#5RJ@4e)e6{ZEBbDZAK#* zQ_oV5biD^1(r!KepsDD3ID9YENN`l(#{|o4TIQ^b$W3cpeB__15uWLryBcn?t{+%k z5)2obegJ?m*Uk;MA4e12uN=07DMnbv&QqGzuc0eCw!3*z*TnZ%SlUZH2r}|ne&@J$ z%aq6nkpxht)6cY7WiwKNF**A8of2L6XUup$Piq}J?>`Wh)sOuQLfMO>30=3Fx2bcs zYu`J-QvazDQ8LtvpdoUD?$`KA3!95()UztvG9Ir-XS)Mg!o%Nwdjlq=^Ycrzjq%&4 zWg!qr`0SLp$QJyg4%;Toc5h#Eeeahc-n~*({RmU&p{*OT)`=pWv?E+1rzc zFLA_*5lfdowI^+N3T7q-hns04tv$6(jA@~riQ(Q41FrQ2Sn;wj$v+N#=w}~=J^NbeVqq4_z=^Fd zBJ6&1ZRd$xmi!+J09!0*-*8W@AH6pvYxaq?pvWir>M_^w6C69X;?bA>oc`8T5g7bu ztE~(BfVIidk>?i6F2#sS5t64PTYx9tpkbxOXQuUg!73Zf)6!cIXj+O~pK)|Ta3!%u zen11+^pmrFyq*McZnAJS)m%>`(2$O(wl)RA{-6ILOJ8MCMk=lJGlHGm??s;P$of5i z3^V&V!|abolhT21mO7ZYRCH{c4Mw;S2KkmGZ;-w~AvGF_ky;+)Uy{Ow-gK)v6{~tD z-A`&2z=gSrr75{DOBLojjBK}qO(cTf9Zwa_fM@%wE7 zdvM1C^%|H54kOE3q6Q;7q`YKJ)f6?3vS4g&4tQ~OlF2BfTEhBxxq~?B%pCIub5H?j z4zxs4IOZ&{HcsrW;JEWsLz%!IL3|e@!44rX!yV)q6UPQoyEXDSP@rQLql?#3eh@UJ zvE=2Mp$h#;{c7+Z=)(OOJ#KwirRFX);{Gx<45_o(n;eT8vJ#|{e*A>Q(8)f;MlNf* zHMkVsYa(2?;E^n4A!L-M2-k&qIX`uGp`9_ry!QC(;EXCnh9!Bj(3VO;y&;>?B8o5^ z42uvUyZz$wKY}SNDb8#?7Amb-SQRc|ob6l&aWV>fwnMt~&9K#fg#{Ider`qp$Ofw- z36w4rMAi_Xd#~kO6Sc62C7H}LokVSIO<@s7_{=d%*mig=gBmtI!;@3u&{lW__WvvB zpXR&zQlJYPRA6o}+E`I#!;IecVR1~IbEV{SwpH%z)$Kvk8YHVl#Nqn%F*(NMr{-^} zNk%g&U`rB@lW~0#W4)=n5r(XjvLpeIe`$NciZq6GbrGg_JRY%ke*(o(OJ$qKw zb=14wcL8y0_RGf?my0T@&CkynxIqSxQjwq)OJNtIP6i}6(I+-ruNNuT+SEx;!y^j9 z@vq|>x|C8f2OG93Vz%byVQb#~$9Oq8T+YWN6*0{lEV@LEIpWHx!ji)Y**dd3T~0?5 zt!q;>$@`)|!SmjUr%DA|#XVg^F3PM40>A7VNfUi)5TBfw@@A#T9ADM;2P<1*ZAA|* z?HW}~)fL!r#D^4!B(9R9|;_FX+c^~1T#7bTmkOvPNacP6-LoXDLZ)wYQ%r_wzN1j0221wS9zg|KAEF5nCXAIn0EgN>1tM6VhyxPTC|@Ynr)sP0^0GEAHtgcE zNn=osE&s)+W&OBT22Ir7*nIzi!<1EBU8{ZsA5J!tLsZVizpiroqp`VXWCF->sqAOt zx5=QYI8DJyh?89C+U{`F`(aUgZjlfMk1Gc~w2y+9uvi4+11qaM#^6ALb*CyBS$jxieV}=BIbxv)m*+lOKSEz{D>t4T(F^_%xvX(HI zEn+zqE{0MQ?D$;N3Dflq-id3T8Z~$88{}7 z%2^+&EnmFxL^3ZP=fB-p5*VuL>N$h~moe|_RZffyk;kC zs6TB^hhXhK=<(&Q1aB<+MlXNyj>hUT>TiLc8u#|)$Wx1VQrG0B)Wh?ROy}n#KQ};o z3(9#7D?fqLzOKF&u;Ys~)Fspvo$bAn<=x#G$n<>F+1=%GKKBXUP0Vy;_i_flV%R-P z-t%(Q1tgfKweN)=rjwK#)9Fyh#URC4!-r@UxHRF>xb7)#}avEtEc5#%V zYrQ-HpUtbav-z?{$7^t~I)NTTw!mI+k!-2S{tntjb4O!z-w-zGRgu!=^7!?W%q5y( znIURIuKV48uIqLwiC&|1D-ya?d}#o9y4vYh{e$Gs$j!l#K33E+zNAOQ%aM*ZMe6Fp z=8AubY~j`!J2mKdLMFTY4Pcvay$V_1D&&iOnCNKGu&s-sG1S3M;90#c{Jpp4 zuNa!m3Bb>~2t=xcCCfEpyMQEJNSh1mrt4g}`HS49MTSo%;z?0W*AYJb<(`GR{exk} zpZ{50X$P0%vGX`QQCIv+HsftCbr!i=ycr_7wcpB|3Wt5^1KJWyC6 zEJQ3wiri3Ff_1X~=N|+2ujYvsj_j;vS6?ss2@y&dnVM)zQltTWCco$XljWRzJ zAs;>tE0`z+ihg}2OUmEZrVL2PT7NL#F9ZevHtg=N-|9iik@SYVv2vR3zxST&xY_u) zLd3;cWm(1P(@t{Q1gH}qKv0!UXNZyWNW*#sAz^~QtZ0#KncCA75h)zb!mFkul z`?DCEuUxM3g#N-TBwCAaQ$7QQef~bgub(|75;OQ zr~u6usz5_lhg$Hhz=$J`f$3nxE4EomzbW+Y-4ZGQ-`tbW`!XUCTuevEiFwW5K0~QM z^{2mK?OzG>qJoq*kWj#lZnxanH(7j;n1BuZlL5_@=-h`fn_*{H(Tv%Kq z6yn&(NOEB*(5}Zw^#>!P)4`FW&G$ZAzWQNvZG9}4?o})O{bF=y+uNzJJd4R2>m^-B zub#$wr@<-c>1BMLIghWgxq170e>?GKf3o!Md(GWqe|;_X+0EGcI%_i{iNyGBCD!QF z*7qXe$(LXH;(oFE-S7Q?V734Hzx_ASSd!iS5}ENYzx447rLXQcCIXR6rNb;wFFie)NU@lW*BPQ9Xk?)8RM-4lZ!3ok|JiB440qZLrjv$T zd%$Es3`_zUwjAUzV9P+46S+ofHLszOpay5A926Y9H9yx1%}6x>5(iCE#K4A#%m)1! z1M>CM4@k)j5XivJkmYNPt$kx2IXMOtMOp6(G8u*V%)ruvV0b2_h-tbLepve=E=m%{ zuq@9>sT?E|S(oRg@Rh)y+4DltVarX$lq{9Rv4gF_!b31pj1!%7Tglicm)RIqng4G` zhutpLR`7b4G6qZyNA@lWUZ&nNQ%81}7OS?IXnA9Oe|eE5o|Mv=c+Vj@5?~=IpZI$F zYfC$ePn}l@K7pz6$$%_iN`a$f$i+c#v)rBqi>65!Th)1Md%FjM$8*^|{MxI75RJsq z8MFk`)(}i8(SJ{$g-~?F1Rt!oAgkq%Ll{|ph#ii_*+FS{=_wm0wVMqWFvr25N_>Q3 zSr+o*Pe{0!Ht#=;axoYlMKBQ}SY)Gt23SJC9bg0mz}Cm_UvHk)L{Z4FV$2qHb)(?r z3K^D8B!d2c=AL=22nLDN&aNJU*B@2v!Axf^ywNIK`Q+|HG#kaW!NtF$?UX1T9x`~{ z(AJo1-_hQvD!!Blj^epUoo20@UR}Gf(qjTMjIw4Rn}{=M-|lpFE38H(hKw4d)T3Wf z6B2)->L{yab4{uq9ZLsFAo>%KYoUT8TTiskI2xtnTB5)$6;Ea;7Knrb+eO0S^J%2R zE>Yz2XjPjH`|zM*h?h}>=75Fq7`_cVrVi%t_fP|e8u+bgK+m!32m;Y~pcNc`hxi))QaB~UJ9x&$5X`k2qa&9dJK5Fp*UU)SwehvUjS=q5y);99+2&exgk zc=k5e*Z;$}3un()79Q7^7RKwfeBYDxhxyp-eX`KGzYqg3i zA1hqE@Y36F{lS^@m%QP`!>8--fB3!IH$Qpd?3u~&(Lm69?W6Y>p59AFeP@r&oE)DH zRog4K@Bi%GA3a{UeeTr!%cswtojH|XEtcQCzVf5L?OnS%*Jx!tzNjyNFF&rXj8C0N zub1`v#-q8DvwJvE#48tu^w}oZXLR~%CPT4c}tr^;Y+jm z=)uwah?p5JTfOcsJaJeU+2L%yT&hiKx`o}ZZ9OlL|K?VgaDYj!HW|G>$#Qkbwd@;NqC>RtdXCp!EZewSG;XCW>or(!8xk%_if- zeP;?Ew|F*KHFa9c6EmR+eo!5bj4Wy+2YGRDP_D9-0BMP8<<*^vPcHY-P%xd)4z)Bk z#fG=<43v>K2b}wH8f614zNN567Vv6aVJN{G{ODw|Thbuas6)rd3-s_f)WD$ze!Cjr z>GS#6^&*k%@a3#g>98U8r56k93rinZA$d*Ow6g55BD^+xT{ zy*oep<~NBYe0ii0-`@1??c%WQ$2Gg>3GeT=%Eb(~y^cPa;vT|Q&^`IK)7$eoUL7vO zyrw49L)qW6LX*PQrXg=P@AaJa_+u+8d&|oco=!I4O$Au9$y%XirPnDfJbCzopPb7U zYV|nIi|Og~n_ql=XS?+7yFW>#^G8pd^auH#9h{jv@#Ww9TDd~7_RseAi9D=bq_Exj zOc)O1^64pLa#vou^y;gxojvz*E`MZcZR7o`Klt#&U+wIz%}f_2rxK;|*3FyO-}&LU zCPz~*oqOeti!asgFI;=)lLwz%^M|{aCnsJ!cB&A{tp4b|^4gAXWzDm)Fx9Tb{K0;= zQ)USCb#RPnr@evEWa?Nhc5*B{KV8p_HhlQKq`ZL$`@8blG@VRG(j)#vz8A{+LUDrA z`v_R+3z)B>dTDi>>X{EZ%VAIYOml}jIkF>K>%i#DvnFg z*@%JR1T_dvY%9SyC`0ZTb{g=1_E;)a|GTYrZEw3>A9$NgUwAP&K5k-3ZuyIJyXS=UnzNQQQc&Yd~;pQ|c7$15VF(1$DK5J@s79Ll3 z+3-Rd&P-1GlPOrJCOYlS2luMH2}qg!^42E1asbAJHS^+6e)UVB3ZHN!I2>Pc$S2 zdSi_gkso=zVd`iP4;jt1E7w|-19HFi`3vC?KykWSceyCk>feE<;(E zlCXIQ`OrS=RA5W4#$`7ST9-4(mlJ8C@0p^b^Y-f9j+`a?-XN>{yWM)f@AnZ&e!qC_ z>T*6m_WNJjYt*B$(~}d^Z@%%$U;NwuaP{ghQn~cV=orNcgcC=PpSkqn1|JA(mHO_^ z9y3nOR%35}Cln4GKQVRs%&99^Ue6b%clKM~dFQ=Pu3cStbSoa}y>a=>F>1?{@zF^d^8(7G9I6u3QtaWQu%r((DH=vUJu3+@pw9x8)x-t#~0}b zlOBKC7l_F+;s2o5cAcl|Fx@XYJGl7V<*?;Empe>4JpbpWf#Hlhje${Ewu@SgjkgTn zEPCU~w82=7O)bXEVRy}~8>dZa7=sv$mH@hjbGz5zZnlFtn>+JJkGTFs3+vth)Q)8b zXpyP}&tTflwR)E6x5(9pXfS9NSGAQgnd<%{;fhm_jKQ>HL~Vt;kDVw3L7FD!og5k4w7 zoDg^(UlfNP&lQMl6N)Ez!JHNlNieC`Ph{sMx& zix)=6&zz@pntZYvpguGuq{gX=QSCVGXaZ!=I&i>gwL45Ow|l&Gs8+2lsCKM1cw3s5 z_OPK6p==02gVmm9a$2i7`?!N+!K2y1YE)vti@s}2BBnO(T8goDB9I|Ao_;(Mg#r$x z-JYy=!o1kBCAekqJ_HQk_&vIet@OB}}0|^|I0UNhLsU(qj z;}N7azGjlM%sCN@;<3Z}T9w`&Ib54yla902wqL8;8w=For&cQ|AfuN~C&3^AriaI& z1`ajw|BnXf9teCDj;3OXO1oZ@6W`47xi`Oh=imL?)cW!lCT1pZv0mBOeDBBmu@r+y z(9=B9YrT*jnO|S?J$w{?@+8w}MzE*NRnQ*ygM!fIFs!LdW^#Iq2nNg5%Gku{YhQXjnuu4b&0qcK z7uP=ecw=dq$&goGxp?W~*^zwa_Wiq0-oG03N3UGDd~$w%BAe+JE9EDv$(8lw?v}q* zZQQSQo-TKrtz@$|((}f(dFh z&r3!jlI{SEi0m54#9;nQXLK*O-5q* zH4-%do%p6qfMnKwZ1VSG@LYGNG+-@oO)a%fv-iwu!Dsf(rz2jmin4$5Uk?3&DUfM)7bYpGpKn1UqB> z0MCxSeXCd!X2=$)om>ikZ7|LzIQ9Iwv#AUQmuCEb6w#-D!la<%GHGpbLy-PQit6ineDQpPOzGT_%xl`J?O-8)853XtL>x z)OwL*D3{Dl2SRZcTB+xzT-H-cO^3&!2L2N?AcMv|+&0F_3>Z+8dCav9ygDmc#*AGG zNJfGTVnJxA9t_z^u`!%f#(G&w_Ap~saMlmBNHXK!<$xe(IW=odrwNmButb60dX3Vl0734?HFlsYi3C!W zs6q>bjtG6IsJfFGEoT{nF-Vy+T&U1SsoQSSlRD_p6Q@MlB;cjROnq{2gbU|p=D5OD z1^~UUx7#pGO-^AzlM-fXHpJ={B$F6Kn87Cm6n6dO7MrbEE>a|{^W^AwfHgfTf~zVv zW@XK0l&zX@j%VX1c(GbvQdm)?D-Z(#?EXkBvHkSX{^~Mw|GX%nGG@H-%*oEoWoC~= zQW>v5DE?Mh9AVhH6}uS$T#59nh>AogvncFV%n(ba>?J{3_w+LpQ*E2gP31=msWg+= z+I1B)uV?hc>79iqTu1|ce>|Hbrnq7|s)D>Y<)8lQ+Zzw>^J-!7AG?^;l$V9PM1tpy zh^?#$=ICUz>ZEx|R-rqgRZtiqhI^|LBe9l7In-?J-r%|8yKKOpiN{%{St~U$(ufcP6BsN3RdxdOYlTz2TuM;;f^6c~v0&7^1E@jJB1X%}OG~ti&sZHwWM$ z#x}Ho5Lbuy6E$2g)o}E@bUGc@+A^Kb>i~W=$|Oe$rKFjn($OyXn#KovlhSv{5)V{^hTHwe+3ueCK%fd|3MD_V0n`*(z2wWNQx#E zG*=PCLhLh`eWrVQef_q(FaCTo>-G#tNfb?qoMGJRes!zP$&;BUtLoJEoXV4jMNkbI z!z7@CX6rhOPu=d_y0I7x`A%J`_fO|^JnD^dquv~}+k4c5&$ViyH@$fEztNxX4M%{Omm*a(;q52^2dP=x;?f%iALvG-LT zPj2LyA9y3~Ukk`0==Ht>LGc}13 z5@JWXmUXSRtPuSrx}u?syU-JE=oUOU6gR8A2?bmA_L9W^4Q0M{0K|iEpCx#q?>pGZW5b7o;O7-^QyYZ%%he!OI-LO)J^~FB2>)z6g-jM| z6@Dsdh8(;QDX-;fMoF;kN^Ma{K13!{W#x| zPu^x#!xv_6KRSKo&C#20FUF^r_J_AW`|0bqKh)_A$G`QP=ihyKvOZsy*W>bP+F@*| z(YUeGd1k+TW50Rx)>*5!X!hrXz%StyxdN-}yx!>7y8G?kZmZj`wR`1ygD_*Rd`*36 zYB$Yjnqs@(THr5Zfz61!Z}u1|PdMsLmJeGT#EvJ?59*QbdphpN;&u#l67TCciub!D z`PPmfiVDZ`9+nCJNpsv&(FHfoE#t^Etqmj!dY z1x^Wle3p`#5=ly>IRNOS$WYdFPqV&-0zQTg(8j23azeOFvcE2>W|OIzoTToi@*xC@aNlQ=YR}oFk;%^ST^D{9 zYDaHKZo%1dZb=#Z*kL9C9*JT6_&|UQN43=+4u{OSWMG(f_V{dcI+=j%lGIWu(qBe) zy4Fi$STFp)jhx8Rn`IWJZdo&`6O~Ts5Vm)A7@B3JAwnM(W9=4=cSfbs8SFA@4go&a zjV2#ggLB+HcIap``2tYi>kM|N-YkoFj8kIKyG+^942B?W4vsy9M4r-?sQJ8XJ0#4+wT!PjZ3CBNhf6V!?=GC6728~a1X+VP}ZpNz&& z&gee?ub)0he$C<}>jx*EKNhN}=|LeK4PYk{o={%S1{ZHUd8k9w8Wi-y(3c(h(k zOUvG~AGrM0ue|a0YpuJL@jjIj12gkoP-#95Hp( zjD~?mQqc~mx%oMi|A1Ls#(iaxv!u1^kxI9LFW|nUAhgY3(4~BSK6~NC@x^ZpcQ5Qb zd-M42!<}2qZ2H8Pzxd`q`k(*FFa6_x%)+RL*RS4u?)ueBJI{aWb07H>iwT|(YV7FY zgBv$)99%qn^yJC^_Dla1x1bN)zV=`L!p}eZ+y_Rdi&uZ}#`ujpqc`6;ef5pAH|}&B z^-q5G)3<)|Gdl;@R*$ETzV*X<|K_`svkBVF>#Ie-QoYf~F{X>d{pG{z&iGBu~;hK!&pDoKq4as>xUhKl6TXsQXaHI3>=9aN(* zlC@G(Goo6ljz!HeL!X_fa7qj+Q|LqJVedr>CN#2|EjDT_zvwEF5FHXV)DBvbs3U}| z88VK`D9q}V@!%PYXv!$rhc22=y^1}B5yz6E##$Lq1#nNZ8YX+sYp9o?2+dMfNVFA@FSWqpWoI-_2PAhvza&e2PGpK!UIAE-u zx8~^>)Xplcyf3|o)FEWXE^S`aFse`KRhh-49-f>4$N5hY2Gj|y!~1u0^TmPy(dobx z-FB0yw=5PY--5Y1REZbVXwdzb;9=v-n}1L0Pjl(GyKO~oPY*T;{_<4Y;!9@Zglpz(U0&!V zzs48bV}b+-pX92U#@ z;_Z9q-~5vqpHYd9^WodG$LF03gHL|=(_eq?dq)qx_VV}t_*>un-B!QbY4;8-B?wq{+WP0z>>5D&{+`Cg- ztgc+W`V&9->DwRvWNB7<^#6YI?LYe3$%`*89=t}_+cIu1hmF>=`@QFH^e$hoU${~l z94u=s)+@ntrqdqw_72;Fz2otc#R?A&ulIKMD-EJ}C2GJn8cAEl+x*{Z#xTrwx3$1u z*a89EDaG^WW9S3q6X|2?6C`Sn$Bqop2f2ZHqJR)cy0{|+F+7=p5oE*TpY*b!DTt>$ zg-9BWHb^gYZdJo*MOfeQ~oGjQ7m1A=LQH5P^kV^PMKm+ zt85KWu3o8M820gNKV}$Pl_X*3F$+{ws`y?TNjYt8K34W1bg~3$HXHu zUb`9ch`nmWg_2)!wNiVj7-s4-gSO9*PT5tKB3`?27pZZnkk4B$Cr?mJuI$VU#H^Yo z1MZm+#R5r$up~~|@!2_{=r^xRXxugz2#y==<>gaHZfKkiF!nk^mW8yeMU~?f=ZKN8 zYK1WT_n({;`N5}NBQ_F&-G~EC|0?=^siYR%Zd(g%E%4WF0Um7p-EnUm@(Gir<0j`v zrQOEv-~Q_S(fyG9YgnQpSkE`Wb zr97|t-lT1e7DRF&duLr@4JKyI1J=<7M^F4jnS>OtF`FA3DBC*UWX%$e?z5v8Ubuhv z!TRMlKJ(xIcZ+qEMNhx>^*?&$2QPg7r#^M%((A;B88hAJ;k}pNdYg!n4CynirdnMQ zsr_?5{fWQx-~PjoeBk-TWcBK|UpRT|-t5uQ@tb#;5H+Y(uV20K!RJ45<=V5A#romD z{x@%b^BWIe_`&-8alO7MU0Btx412ftn%DMg*ACY^2eamI(cCT9hBMwsL&9}+Tm2nC z{HW6HUq0yei3-`x8U7m0*58d<#Fp>dZA(~~WBc=$w?F~h<4*HE9iTSOp1yH8i(~IX z-`?DRyzwCxwmrQ`$pEDAu=$b~wPzk@K8Xw_gK0uQKmc~}H2b8=&09P%MBMUmo=17N zli-MfBtd2>e;kuiFo_>_=BZ#%$QY>SlN0ITuHtw?A@ZFn$SAis3O4Mau*Lg@>k%^8jjL1X{Xcw({lsQ zQ?WEJX0^YP;Ic4yYK^}{9Yi~t%~;SUR8x9v-W?$SOk`>&G0V@VGlsFzH5G%*BT##_ z0%9g=c(i=>chYFqTg@YQm{qp_)Wp-gQlSH|sfN~ziiQm|jk-lWEt6*Oh9}8PZ5AhC zn>Zu^MH$8>t~mqhpmtf9$f8BDHmV*nYscD|jT+_BGM1LtJAyp4F#n=*<&vnK5M>0Y zNz@+k+G9vw{uYNdwnBrz=&D$hj}E0&K69NG!3%o05^*!|so@DLVUa_9DGhye6YU6R zKN4KJ=#Zo?Nx?s0^lf(d0&hr$-H+Gy(dvMf3RN@pr!S(y#y4wZHx4*B`w8BSzC7 z+^aO}J3Bki+`P^buB-8!R|ruV8jWU;K(?Ls&;8<8KKii_^&0KBzW>(Aowtu(d3}2K z{^;Su(sFj=5_88se)a0@)~fa7yRRO9|9cO=^GDO;drVNO?y#Ctd*{Q~I?o)g_j>Do zuhiR_Ra>h{r@{Py-aZioa9}M}n}%p;_gcMSvrAwx9b?22+orC#fZLz{v=(@0#66&b zZ(Z)acW%EpidS?zQoizo#PoQRhk8X3Ns7b31`@?vJ74}34OqgX51E;pT#hV@9Nml7PV9K)?tCkwEk%tNTA zkH5`XAlj^%6>&hxumli=D&qTs)Qje!wap~u1(>z|o9sB+l##A!td$NG!T%&wM3;53 zHfqy&i_B6j#@dsuDk8!+Tq;X)d}2_z?3EjlAF*vs+cJgJRhFzL>RCu*gfLj-y=eXLaVe<*+-aFk(SN+Y&xq0`j@L1o^$vHcf@I_bXs1Y zRo3U#(pj}S2D0xA7yaJ2S|w!f*ssO5A-v4H?M}B+nLl|lIc6Tud1pN7EZ0@n&bFhY5&UBYKEX0RlpL8;5g zO{LcF5AYRSPS-p2z17j`t+&2^{??o44<4L7cvPD#4lf*BdG47T*KXo4boTPy$3J-S z)~+GXxG}^RijyL;0w9a9vt>|F0HHWIk3G& z3L(VWyy|!*S^>?l)g5juFs2uF13>Bh) z?W$~|2L2+1J@WLv81{{IxWo@+g!e^ctGv?Ktb=ka;2#;X0d6xJmDPNhyl6))$b*Js z4Wz09;u;f4iK2+_4KlNa>ShVtNQhZeVH#-ELFN=O&n>Jho#*Nj<)@7JE|(01cj^s> zgiU6qtYLT=dS;Q27^SvAa#59J6zU)#EaO`wn1&k7W`o|#bUq_i%!W+Ac6^5z=Z2Iq z_$R0MwPVI8p9V?$V35?0izQb$#*MQs^?Qu9GaI$$Y*b^&_#Gnz@>^8ad#$M7#$;gx zDU*MxLS^xgK_3RLh#>>3;yo!h86wtku~0+)p@rq+OAV4VEV;3n9Xdy;yf2j2Zq#>r zUHqL`5{q(^`MlL+p+h2X${!~m`W{SX;DWk-OSwc3XSwv7yS7$jp>82&`?Iyc)&hTB z7Vsfwv|`1mNUPPIR8AM=^|V#$e&*AI`)?f`A6H*HY8Z_xUl`dm&`MNreK}i|y0r?S zQV5_<%QP>ohy^>YluxVc(^}=U)0pk;&W8Ob&E})U>e1=={>kadV!oi2F_NziCWnKa z%R2`rPc}-W4)?d@Y&L(fZ{KoJ6#?@c^ z*;^NOZ(P3Ey>@#^4}{OR(*{fB)yM1CUwiYl*WNS$a=rDv-}=MljjOYJub8N>iv8EF1-eKjejAwTD505}`87%zzmP(4#;Oruu!L$W>8O z3z5Z-rD2=Zwb2RR@6ZrxGCWLf>JIl{?vd)4!%>Qlgs@MtRHu}R3QzTcS`;WJuLKnD zAjYgAEVMI*O1*-mW(scRs&r@_3ZzP*hf{(=rE-~3RS=;bGRrlCxZyJ$#Soopht}$q z^$PxIKoJmsM1G7pnuQ=G$~u&Qmj1x7+XZKX+L`F7wxmA&8XG}N$R#TcN2bPe2eDNM zd%@3JPQB4%wPs=~&Hesxcs3aWC{YG46edbWadsBYyBiA;A%{(`5@lO2evl9~lq*US zqH#18wL_npkVusDUW?hNddNIJJx5RPjDkzrBbC(2MK3YXv~0bc>@&_fBh}ztrjW*B zrCwC)plsBF9%}!E6Hp9gn->Hs=^vj0MD2{VuOf!b`I(bRC5sPRxq6z0LU9V16Za=Y z?e+oQ)>UJL=<3pQ#qgHCL-L@9kTHvqW0@2v|#53Ez+Zjw2M@%QJA70u0&%QKy^R4rv zKW;sqx1uSqk#OU)A|V?W_`b8Eh|v#XHY#&{CQjijJ+4*8!}j{x)!D&?N0ssm_aEFp z9UmW$Xar8}>+4BL6y5gu?A1qSmwNrH2ZLuX>|NL!R_@(9dinLzITLeyTLIi%rpQ;E zExm(O`oXX2EceRt5#?2Pefs3l%hU4@f9NxxIc`>0z5O@t-r4IlpS^tHW^efQfA!n1 zeEnOChfmrirbV^Rzw_p_vrrb{K4aIee3-7A1r4l z>++<&Q|evqH9vH@|NPCy^=q@lsa>0P$M0DZ{m$xoS9J~W(#1fpl>Wicl5D1Bxc)Z00 z8!#DIN{WCwKKnd_zQ%)PHU>(F3`;9JP>RR$g_aRJ;RXNA6#~UkNC~afS)pv?!@%E- z*-~0+C9I2zBs>%fvcV8Gvh|M8Y*I-DxTz&O;8={g>*HVwl!@(N6-KZ@p~BE2 zh+-)gVi*W`LohV3EUIozgIvRSd0oG=Cu+xu<>>76B%>3;EHsgmM{1u5p^AxsHpZbx z#(yFBw`L$QBw1yjX^Vt#Z~}QU1Y|39pAcJM#9egyj;ZN^3SlL={)eBQhfk zEt#O^mf9Z<80UtZwT&L1FdH?-vqN!9dhyw~Na|~XCA|n76A6v5kt{pP2c_9^iHD5t zH{ld!Nek+jo)0a91sSuuXKBw!&ko%^4!jeqI zOj%Uog)Gyo8H~5v)&g4#{B>J^#)#2v8ksf0Z4X+tX8Y{%+o!Wu@3{|O_y>RgjnVAU z?|rv*wC*s`lh`o6Day6wvcD>`q%&<50c2?0XDgz|lqa>ydAC`*eYJM|^5gFCmC@?e z`w#9unT}4+mLvN0%Q8+Z4A8IE6F$GLSj&wu`sK-L`fxUR=J4Rw2cI7f2ls#UGQNg8 z%xPb)YA&8i;B%Xdd^s*kE5ggns+A{|<@B)o6My$}&-{bGQ-9_o?T>!)YhU~0YgayY z_3+a1n-Bl*|M4Gv>(_p*J70dJv>sHL{5lzq?sO~tkAC?JAO6(mdpj4#-+$@;ul&<{ zfBd!4y*EqqV^&$MU2S%r-S6MNSiNvixpH&V+ZlHc7M1R7U0Jr)%?`oB_Li0I$&7VD zE_8c?22q$r0W`=oX^yREnrz%i&-cc=E^bueUFX}wtp)z$Ss+K;#TeX$n*q0Yg>&C| zGxC#o%A3=NG^fucl`hPsl+sg>t~Ni#8axpy>KN?6E1@SZ2O38q38%0{_JASnxE?Kfm08U}?X zAv+YLa$&}(x;rIrs_X!)8^tn9p&94I7&7U5eF|!qpIgcO$DtO&6 zvO_=>t|Lwz6NIKH1poj*07*naR3oWVFvq+(*w{AiafXZc2Lk|Uj8%`o_uiaA8`X&q z0-etB=-e!m?9#Rxc*ykIjV5sRe9TxoSXPz2zG$J4w1;YPNl1;1$VbmAwrw$I052c{ z%oFb2sjj5wQqWWPQt5&>DT=UKp!U6fml!gD^`rB%W8(ZMDYOxbt5u;`agi{c zg(HWNw)$?LSo zv}5qxR|Q}0YW(6~1BNd@IIE4;kB*khkMHkaWOdRXy)t@u(p;{HYEz|&w#D!>CG(ud zrS;?W>QSwHa%p$>t3P$|D_^bMxV>(71{bQ=FCP*>1}D8Ij~@}G_-4IzX*E44ulucL z=hETzzw-+>Kl@XI!G-Dl#}9t@S0DcF@1MQ?%5r*CZcIxTDxGI99{j|O`pv_6zrSh@ zPHTf{sa;vMDl9|S=?}VX-asn`?mNTbg{z(Z9(1!JHJ| z{8Csxg=LOIV z%p%1Tng#g)&B-&glfWXvZE3-pw23UNO@F|Sm=`aYrfK9|_Oq!qNd{g6Iq(zR98V*` z->4%Kl9=HNn~2>m*PxF4P%}7!{+o(5sttMmj=aZR9 zUO!fKCD!Dy#cb5lnu(;3PtU@jdEr8qlvW+fSW14LS(p`z$|d62gW4JDX2d#XqcW{4 znWG5Rb?={r;^I>f3eV)CLE@Z{2{9Wr{MtvveIGmMA6do4mp0@kt6&?P)Q?NB)9)gP zDllH2>0!wzMZYJt+VJwqHk-IV&CbqK1+E$2RS5pbQcZkspDmVrJb@vP!&8-k?7eoI z|9o8u5!>C?0$U5b=PW=Y#)90v!Cq-Hnx7p_Tbmc^JZ;*xKp}u_?GT5PwpI#PiN!RY}5mQvzC%0Fb$)Exh}*44|N&{ z26Yw$8>ljqemPl|?w!wHZp?=luhu8?$@r!DV$2vl(4IC3TtX8zua(Zq<%c-rTsye% z)h|Bt-~4@s#%Gl-;Qr+N_|g4441`~~bnW?PZq7dR{98YGad-0I5?zr>W9RVtjgNh9 zzV1By-ESWK(I1?@_`TBc{YrgWzECb7c4{|wcR&1W>+&_0QkvGgt6FEmY^++h)!Azg z59*!XY`JPRS#bQI)8ECr-539M+gjkgWPx;*iFdWIK?IzR33(Q8;(!xz>-uibmvh24 z`o%UXs!%gQ9Mq%s`9_8bi*3(&qvOLmeMTYf~N zgs4d|h~_}f7>t8=k($8R1?>}TAX6sU^goJXq$*i1$=)BKpiI;wb0Wo25Xy!j3KB(A zm^}=lP{AoW9@>O+MSH}>DRjecn^5H-Eymgzx&{ZQ@Z=PBm1E#%3X)l9#Fz)bZp7lK z3&vv585JS$PC^OQV{@Kpb%0;Hs69uBy)el_RaGi959%xg0}sOVR4#Q;b7_>1It(5& z=&P^1z%lNDf|tBg`QoRvCi>(7L3o=W&JxRlJ~=<56qnJ<7wqx-WLzB7&SH3owjM6M zXv)IsSwiX(%wX@!It%U!UZRVKTM1y2#GcI17z3LDixrDBxIoX?=8dE^0T? z9R9f>1Ikz&7pe48Sk#Frr=+pD5-L$3>G?ES#kNkJoqSv^<35B{VTfGI=hI$Z<6=Z# zg^-}(TPOSNwza_40`DCQ@KA>`% zP0mh_AJ1o##}6OB@$#MHC-c#ifqXFh>d|C%cTj)k%GJt~Kn;ct3X0p4#nQsXtEfu8i&B)&l=2EFf^tH+R6nc>nWq z_Er@u^JqJqCm!IB!~#kQp)BTR_Qo|Jo^dEihI#|HZ6G)kPna4b)uIcxAQrpBN0cJ+ z2wG8D!T==%cnQ9R3IY!41ua5eiUl|IDXOHr)Fo16DD&j29$7$Wr5aKhk9v!DlT@(fAzKIx{o~M-5QC~Ax5%=#g;k3(g*0WTUx-!ErcTK~9i!G+gQB7# zH**xCB$85D=~XX~G*BxvwMA5~kR~ct3>a&F*dvxAvybpj)@K?bISCwNEH!XsU_?vU zVUS&-cGgCnF*Q=IQDdwpUX5dF4VaACsK8d>a;T9|SBt4}Ud`aEOjySq6_$X&K2GsZ z(bB71xlH_W$c=%BMdd{r^0L0k&NRi4TCQB&9pbbN2O}q*op~7)$Dbvs%b?q0^5tku zpU8o4rNl=A z5+9$P@nOVsElY9aAVy{QhyOj3u(%)iI!q8u{AB3M8H|6mZZOXa1ixfal+l3TZmkxd zEGEatV$3V9>h#+|5sX z_LF;8F6|y3ba#fej>{6Q=F{bDvY1WJj~>7N;tMZ*_e8y8V=WD|tQ*_Tif!Ar%@y0W zZ96NrZQHhO+sVn^?>YB=nE#+>_ZT&*o(jJ4Jps4f;mM|z8>v{%V&M5aJ{q7(3>`_l z)2OP?u7cUAc7)vuk!<6`zT9bDd*34=vp@8ab0b7E_42}Fn6<`+vd?#K@%@+ z%FN38{vOh-;LAwK$P#e<@k>rVpW>AjZa&LIyV{ux`{GL2DM0tASl+>g9t`7hEzuic z>oOb2RAEMJsqzcz)5p7>`b$ZV*cN7$cfcGrbv#S#{#GjV$h>3-7{CZbEGz*@qpu@S zp^iLh0Il#Z7`}eM{~i`hApaatUQpqzK>4%uJw!393cEudj}mnqf*$sqdQ!q@U=qrm zdfc7~8dn|&E*U48(gHOdhyWswjSJs&G*5h=$dMdZyRhM%06Y(F=!AJJP89|?Q7W5g zKz|)26KL1)3U#a|A2^js+47IztJp1_NJXoviPR#_?Q#T6_{z2^s|DzYaR65Pc!D>> z=-N@K?Yfk3xbSGi@Sha z6cXtRnn(GZ1;R^fL^>5a%_%2EuNWU55vANT6PSN0o4926BSQ4?^=OatO1q{5@LEUw z*w4%ci~JUKz4#zP`_^S50-~*|+8y`*c>j{<^KIU?TmOLKuUO@!BCc6aCt6l^A`Iq1yW6+};0{`30JH=@9 z4iqYo^@^2sCa3Lzbz`1=&Kpu=W$~tcpDu&BmhRdIxK%cocg`l+UUF5cv@f$4scgA< zF=&kZyi`Auq^{~bM^>nex`FyQ}?0jF}UOLqh-%fgTYtrxdY91ZzmTuNO z)i`6dxJapiJzcE)_GbK+SsJ(T8CbyItw2gOw5*)p&@4|`eDwG2@lIa__4L*85suo1 zpj9=(UjFY)WeDisG1`m8^s_I5CyuYvliuSm6TIIY9-NKFLgB(YEj;Jy` ztpS2sv4uT4{~o3gFagS|z?v`~#&H)ZBUE}pT)#xsihw>zh~PHyJxF#GQCfkr3N5Ug z9^>fnB35(~nTmKs4=hrC`;Up@ZG99R<}AqV1HR-06*Zv`Qa30T>g_=obKll|pep#{ z@7>!j$zIz;x*Ukuc)!E1E!e)4BvrCZgJ~4Pn+$BvKEK!3{*q9NBUQNdcCsY@EK~vTlDm87faIuwlM^sR7v*LDL1Y4k4%2y?|Eab@EO3SIMD*^ zM*@LWS#5Aa7|RrH?N7?I3&kdqvX0<==8nd|XkiYWhS7Nymx7{I$D3 zZ9X*QYu~ZSaAyc(5a-ejGlh!hnbqRk4-Ie53v7W~*0wF|v=| z2pmeXd3)zA=Q92G0BaiS#E%3TOPvvw+$@+2O!_h!*8vh-A_kl`Y=wDGkC zuWPx*{ty0R!NqeEdzx}!DZg){W4)KdL|tEE#l*7DKr%3J3tG)G8n;4GVXPOES=YDu z=)K{W5<=eib9c2P@qS>m(eSG~{b=BeZn}GakUo23`?R@FL=d({v&mHiPD4Tx9cailT#BD!bTuqB-aTWStRB&9+xPPqb|_{at_-I zT(u$1off<0Kgi4Tj)~*+tLi9AjSEH2j`a!PEy}hU{|)Q}!$#-2!3dlLXifLLO=B5w+|(In zuVI?73RaStn$gCfgfhn(JUbWB0ODn(@|qe3_K`@f*|A>uNuM%(e7W3UnAfcdX8!;F z2%3JT%=@?XNM{!A?`|xa*-LcV8*k}!lRDmxUZ2s+2bdRzhk?>c4TJDq3V)j_M!W>H z>3F{vbU*KXpI)lHPZNudV|dS*(dVA$MNe;keHAhdGW6ZjReiG)Vm)rPnoB+xsXu33 zH(zG;>~u}#M;=AYj-}J_?*MqzE1QP07gROMrVE*PZq3RyIh}9IhfOV<1!s2-YeYI% z4yygord?@E%M+UB+Z9Q)%o!^k19INEAD34mEqtWp#%&B5m1l_b8qHjr7w~k=?d4E* zH`muJ9f1zf=n+&x8@JX@-f}u+Rf<~BX1}}iUfq$v-5F};?I>~STGZnE;PDssj7?|% z4g+4JKcYC|5O^TKgh7;3Wa2LJn7<2l+cU%6VE!>FIRQ(2z^4O!+b9fAK40dH zT7o@xIcgD`X+FkLAKM{FEIZVvzn)`0rGoKoSWh2Gql8gONO=k+ei^x%cyM+>2^9Nu z3<-6P!-7*r3XPjlU(!FwJPOF!K~C{m^FQOc0ok7daWF}!oE{dCYYNKZs7|bD>mvRP ztyyaQ3#+4oT=`Jv=ey?|mY?f0cf6(yIM^cOVdJdX_f_;=aR>mVy{jA;Clf@CHLlZ&8ve`nf9Mo4 z%317vZ)b3C73Jtir4pnVZx}?9&vuJN@JN3pMp}~U#sJ!Ty?)490}{3hDT)shJ>dCt z&!Fiy3wXke9eD`xPFlbI-wPj)C16IBMcI0#tLys1+uCVoeR)gu_MhK`PVukp;^$7P ziK2Ho1R6cXxQV$Y6|HGW!`4U6yR<$G`Fgty%S1|2SbVb$p3V0)Ot;-7UgB-}tM zTG6_oTHi7_-xJfrLLwhG*M)3xl|x|Z4a^ZcU$Q9YM*UNJo%V~UX`-4AXP0B>(LWco z$mjNPN~tH3Z1#&c2iBpXk~&ep=)MO z@aSoqq7JQ{wng&|MTWO=xiOM}sJm-{r^Oc@&-CU9Ynoh8sNLy?eXR9N)|~b!0XI%Z z!g7S9!)8D*!dQSpv=qu*@WC@;q)RW9fb9MKq)j*FQB>&Kg-rI_@>vqFG>Oy%KIe!V z0Jy1R$02!KBix=3iGm=rQ8|E=`c_JGV|E3q6AewpWeP!@17@E~N%2$`Kt^-`?TFgA z@lnd%MiuC9Nu`;jNO?FOH3E*@r0snHL}&4*e0t)%nFU4$FdPTwG_O}BX;!N8su+!! z2LA3oPVE(r{*1hMFAj0myp~RVA%mG$;#X-kh{357*^qpV3FI_XlQ=Aq3gduO;Hz@$ z)Oyps!aqLSg}-M>X^TO8FrkT;#?0S^ryIqI^F?C)l_U20Yk3=xXEFZNPYC z^*XG~a}{I%M%mLVDnRWpb)fRWO0h5&{!M5I5G`~SHD5_p16GS)u3Cy>1i{Ix36>hF zb0$lF^u;h!c0C+E+PwIldVnP-Tnb4$c9H`s*?n$UCK)HLWSBU!(9GL@}!P04e=MG_I)Z$1t*1s*Gv>nbf;vh%qJ2lX8u+s)AJO#9<5#qsyN=U6rlQAMkNIy;<>IR?F49Ht_GHo)q z)-B$^OmbbJ_oHX*Bx8YL&Na*ubERyb(u7;@qyh4q(S=otgp_rVynFxu8ly_65n`Kd z)6F{FbS#Cdtzqe8Wn;)r$dXMOz7li(@Vb5MUAS7hit%9a<9drS-5TgSb*^t>dOe?X zJG_zcHk-kmB!dxgHk*95I6vH(3W0#z|ATBK6AfUi(6)qwOqKfZyttlT zYv7ro^U^-Qy?lHfc|Ha&SmQlI0oeEshg4VPvOt=yqTmA*6vIKN#hwk(3y~=YuFI zrX#-_eu@t|s^aho*L$6ppy&^B34AeRJ}Nn#hsG~^r2=(}U;VTx2zbYOSXRhODOuZA zhZ39*MG<Pv8LlPWWT`{uOudQ&5Hv-C;qgI1P8bh$2x7;9`=#TLyW?J;PI{Ede7?~+qHAtg@ z2L&R)2Tq8TY2(!HG+f|S^7t2#+EgL!p4~i15WI&AICE&=PhJ_ra!g!iHr zY#y^3=swVc3Zn;5)Wp7oqA8;JV2zYpZLMwt5H;w08E~ZLpNqY?yc+H?csbdEkix_~ z2Js+<9kWPiGublL8k}pGGq<=4tHlM!Bx&2M;C~}G#J+u|Z zY7ZSYOOaGybRt!a{_h}Ou=>DnilmpgdqnEdmGOEND#@bsCcZ>82rr3YZ_@%%Vv{vb zSd=NJMoHryJ`6dNlEkp(8V?_-;*~zmqcoCHa-=O}(RqXvHq$l`SSlSv$m}=R^=+&f zA1s1f(+W^oG5ZMo74zSi(tqly2K1^=>kxDVc$ezcr4B~2i4t1<>e|{*a1HIvHrCfT z-XdPCh0;hrW>&U;x@m=+*D-Vp@6W@8hp&zWwG`qF516(YWxfj4Yj?+fv-WohX8oRe z$_7s77T-@xb}hg|h3&2(ZS_wbS|C_yzaF2?!*2t{^Rg70A`J~$@_lEW<|F0Ofb7S4 zt@B6iTc6evGnl19bC*#WlF)pblo)w7MI=}la3XR>DKS&0vO@l@kk z<6WbI%7tL7_2K`ntQNm3D||w1LMw4L+qK?}R-S+QIqs-v|EY~5E{G9-{}ruKy&IC2 z-#<4HaYmf(wl{Un<&r^DQjmdafE-4I#US}-UbW)R0)v!fjb^57+tUIJYy~FdC0gYv zF{U^ibAm<1K6W`{jCl@-?R{bhk{yHuq?342kHt0nPgg_@z!8rE0SFyIYghop%yr`` zD6LRN1@8z-diEd*;1m&={xFk-i&9!Q8j1z^G0qn#$qq`1jjo39d+ol^^cV)*&(}j~ zI=H3&*mU)1WWm%%EWK%x+<#}u)B`An{ft0G3UTIHa0M1L>u!x@yOa%@d%$D;*uB18 zCixVP30g`Qg_55KC`10c82at_Zjrq<)92WlQGI`lq2q`7SwvXy`J(pwQH^g;cO!0% z@u{_x89`8zmuv|9fwe25SKusklhdNl*QJL^9%JGuPge>0WyK%6#DlV-_E%!?1&`=Y z7_R}-G{ub~)GrW7cwl6S9ZrOEa%WD|P2E+~cO+URmJyo7^3z%60$t?yxYcl4$Iw)< zwt$+DUwFFGaC8Wc@qQqnbu86_;SR#F|;i9}tU!ykDjLRe_u!O4~f#+SbJ5@>q_^ zlbGE9uiQBe#9MV^Wq(Zc*TU&zVu}BfH*?X&#kJ>gXb3BIrswl$i9KCqB&LC-?%J> zv&&DkY&!?3tcwvtyL0mz#?o1^0eNA$Mdfb1DPDfx>V;3g2Io=O=bK({OY-VL+X#3y?jUbpbHjnP=afh7-Y`h-^t1NeX z7gtNfG;2B<%!?S^#t1#;utzKpz=#sxFY|1UC{zZ)5pXYWN)&9xC}Nx-ZX8W*D~d)) zHUmn5LdH_x@M}Gj;l%~xk~56Vvz4q+8-=eHpu&O!Iv3Y75Xi4q)~bvkikVa@*hTbW zQ%U+;8sR7Jtz@pDRV2974>qqESu&KQ7ZFr$C>kDiD6C-g56cf0f>b@i-AI^M!MOJ* zs$_o%$Ymthgb`gw>w^)PK_wSA5l2IGQQbco>Us*My#5cl2KmI4a2gFASHp*WybB19 zbgD%#Mt{DL25G(;ZS9}&F>RVt+8}&e=#x&-XtM^ysZ~B$*H?WZ!)Rqn=@U>SX0dWU z=`i9DmVURTEu#>}Nh%WB-sCZ`zxw^XJ#jf^RD5)+-;L!m`AJ;U}zR*{v^HTvGh0koVuWPT!}MCCJhmHICpA*7|RKi4NDARa7a1SSl09 zsxuok3}1~e;aF80E0P_7?p0k@Fr>-XP8w7#T2))#``nD7mQLNo^0KZcgn`%5({PT} z`B-{b<)5oV@Mo-@q&A8N?5?0&9g5$NdpUA7N`O!ycgA}<4H4Rr;!a>_B)~GjvBNU4T0dQ4&|!tp!|X8u+nB;Jbx>oyr6t^` zDgPrQWS3nspZJ(#0pW->N!WWkLx?YC2?sW+){umoQ<3KNP!++YLy9JiJoRsNb#_}35MGMPuM=B7>;>js0LAUz=hyf?r|B(A*O9M>q!Jb={l!Db282o=#&B0%{F}5&!;M#($-t`a5DJ;&hM{ zi^3p?V**!n!2FbYqFGwS5)U6jCP@@OXt;=dE*)!d8KG~AOd)v1fAz>CkLBflxL&H$ zR|~xfwV`NRQ#JgMy6!k%iL{u@tU-PIMk)*V#b-;SVHbjq+@Nr!p`xC1+Zskd6fZ{r^E&aNkVjd} z;^n~|3YF;S46y08g78IVJJUaov}zC3w2-(b$fTS-zTj`fT5fnn-6)LI*{beQx7_`mv>?q0#enue)P`Si*{N9=U>SJv@}Z+W|CdLL58gq2KwQ$0t%x!e0; zCWf^P@w@lmSnU@oFf~%T?#IK8oeEx#L}(Ff9Q#iFq7tMBIs46j3?A}YIV@5QTNYQE zzOS1CKhH(uRazxe(;Rl4+te$ZjwWPH;9t;c>mBGT(c2b7{q9|=wk5yTUn-b=lsjv| zcq^J6?^opo>CNkwUm;ZM*Kp>pjsyq+4Kxo@h@fz2I2z9{xy%3O$G!Ddk6uI#AcrLf zv=mwVwLXRU;`epqT{kCm|OIDRhL$ zAJdqnP?IrTaBg=H({RF>dy4D;`^&Qa1L6)Wg_GWX;(%3>B@kTA)j!~g2w5?>b2eiP zaQ)map1n4AS+a0@n>YqgxT@flQi>QtR|OGyu?A}fp?Wek8$pei{cfir{n{cZ(pVyB zmIbU@Znog{POOyvE&gW?YJ1Vec8I0}?34uo780ANMhJGKyeJsXS;}Ce0{#HZwuyF) zWU0c;O(+Lg%zUR#@+f#%5d8u=&7YB$#xsG5^gBvfRjB5hMjpHLyFe_J&_DXjMq)<} zH=voc$lpr_+MDnKwN@>6bOE~XadMor=H0hoid~AW1L5ID-o^Q1#3QWRut_w4pKfMG3K~QrEC}^*Ve1x zx*jSYN*(9+k@%e?8 zX8h{G-I=xeDLj{Jvw~$~(8}~Up62#{=3(2o-w3?{LLadfVJ*lni}DTQxYUF@G72q# z5o9nQ5jqkBiOoKnel}EAIvqlY5HNKUIE6yKIZkV~%maw*H!cjE`AXnxWI=g|kd_z$ zicXL|ISEag1nYDYUYI!;*HjkPtCfZHASz%SIdE8>e~B%J2I!g4$qF&LEhB(Bzl855 zKzgu?8y4TMz)cxRTOTcxO&~0N;?KRwJ<+%;sH(0uy+>u+&2bkPY+P<#--yoOP}
Ep$}DfgDMQ19aVZid*iytV|IMwl5%dT!5Bz+Z}$nTgfsv8H5lT z6DBtoL!!Hi< zwhLlDIE#qDhN+Q4EyVf+<~Gk?-gs!e6s0y!gy4>?M(m!Ar5ltB5xO3NLs=7^(}Q8D z!mCT2KAH7%eQwrQ-x+G8ZZp7q(*Z?|h1a!~+qx%KLc5TRsj zA3G%~?8%h;?YD0I-+OlFH$9KZhMDu}VadMQ@f@U*jz(6s(L(o?s_RXUoAdJw?~yof z*U0&E9lQO__cK~rso@|r_3 zdOag~y#jpb#Q6F&$W5C_BHrBe!rLJj)^Zq}(8ZSh?BZ{jL6hg_2825t#KQ%V26~;- z;Ny{mk%>7iUiOOG*wNrKbap3#unb3UJh4Da9Y(whq1>2*hz8 zVP{mR$qS*f^d0>x3v#m`TrZs%Dan2Q7yai`$>Sb|hP)C`Ippc4oZUOnL9CL@!gt(9 zz$VND8(XWPn{;3xzLZpTuS_$05Eej)d=f4dzP3Yyf+E69+LCMoWHLPC%8l3@gN;KR z!?%xcvc6hnpr)&uiW`+!r-SGNm0M2p1Q~$5u+OW@%H8T_u2JlRpNT%JbO-#&yU#4ca82k&J0)1 zm*B;HlX1sTCz=80Jq72VY`hBB!ddDniwX0qPpiA(EbyPt9GtHS-Kws84@<_Hv!s^% zyZpOdrt3xpovRhi70xb8t|zR}C#;nd^crc84!6dc)F>t{dP?T0s$X9{r$ z{CTv_;pa#9TKV{M=nX|em_2f=wsbR1V#qqf$d`^mNjk}h-W;gIGbTC!IkSTTayegM z4)%Jgb5Tb~187;hyj&v@On9hU%zo;YJTJ{T@+7+;535Ht0|#GCQ&8){c=0w@<%z`6 zCFXgNHhEE<8?z*<$RPO>3Tu4_sr%ISLwl5x$q*&_6XFDX2{faI*0S!EL2GTg^x`oq zWsagV;)Rg!!T^1%M8sy=C(gkKu%-(FAw-DoiDb{`Z}tv%wY+$r`7assmwb#=#w|%pIzTNlaX5 zIB9&jF&4OmagY}kZfyv|3l%d%5#Y(6E)8(wY=wqqkaVI)U(^L}rwkG!QA^nk3gK83 zt#Z!WLtU+L=ThY<`~0xVy-e=^|0H^{Y086Z^8P}TUlnU2r(Re+fAz~o4)2reVgFv) zDd$OBG%0$%dwqQAVdYJKx#8XZ`9#lbv8klHq?1}IlBM&pOO7~?(vQQy`^Nj zH0TI>QDW;UW&gXXdAx2yxB!7es0GDEG(~M*S>I}BfVf{iu*pix1)rsk(kJUOkr+aIJdth5&{-b^Ma3CgBn7IK|KW_w z7z+4f-A0c^1wwTsGG|bui58!!LSDx_4;POYPEc^e;&W9uJuOPw!=Q~Lge_lUM;9O3 z{ zW$zkgAlM4Sp zkS-(gu!Cpxb+tGgnX*#0nWUsr+;bYw<#QZlmhUiz!Q9_OexH-0^&ky)aaymW%sjcn z+G##8=a<|Lmq7UV41KyC+3gaNRrxvh50fyjpot%km!X+&6tHG-p6ivkE_m^^u(5X6NfRJ zRm08(ml+J*l4odiO5!Eel1JBC+0r_U{4BP}jUQT~XdEkdo^(c+S?#vzieAO_@AsVb zHz6t)gwiTHh;(BDDAf5zfyPdR57;KrXBf9-&i7@ja{!7rcED+a=of8UVAL$ATMfs}-p-gO4$g}j^0?t+i(}VztbRNpDj&Q_@ z;{WCkK+U1g?)T}52X{@-pd`ZsAuZHxi{8*Zy}^_ADaKD}d)gp~;-1*(2SFCkSPG`|ak2EE~^-!}ChmN4BTg?I!> z56Pufn0i6cPXuR0i2XK@G^QtL=lM>=b_VZq)PErg-eCP2jAc@GqF^O^!1SQWe^NzZ z7YKEj;Y8N;DOC{EJ&=Rc9j@d|iX>D)exAN$rzF9>aEl;gJ%O ziI=9pP?R7vvZ?KqiSy&CJgCBPdH>w1RGi*4Hpv}rQ z+AxizuEw4o!p7xS!B4tpNF1dZ;nue{RZ<1Kp}TT~Z2d=|;cfPdwQF0ie4*P%<#3lq zsB``p!29EKH#g7{LsrnS^?T3KWzFH{$cdV{+3~!8;`4g6^|5{J`=uG}Sp02O-r*yE z@uZ&9&Ym`fj}^7;w0|Vi#q0X)e_TqXdckX)8MfXZtO>WR)meNptI;8Ev2od$!C|e@ zrPby92SXRNJT=tbRo%Q2?b6Y*(P3BA;M-abe{uC?(bRX!=|746tkuN?{4`_fR8KM` zb$>F~9ZR>V`qVRq2C+N61fu5bPFtv@o^`SxSz;B1%wt=y$DS?rCm+G)cz8tg2CgXQ8!FPrIJ`jA6;v zN>IIbT7xFanXe9c<5C>0v$u_0##|3hr&P!OP7%bRdE#P-?wjs9Aw@0cPvWZIoYfkgTtclj9t+ z1bLenL@$P!q7y(3qd(M!r=AzSR{BdGfGRH(b&syng<>jdwYrOPgsN%*-RS~-KCk;v zcJ;RL_h@TZx>`Di?tiC63siiO(lr`71Mm5)NN&M}BfXd|7v@gg^Wx;;<@7jO@{HbT zUBOEV<+}K`TdwSYVyi2Tk(G?SX_3QgIcdPD<&{CIDLHr0(URjj8q%rykhc9PNTphV zw^XZ1=JY&JxiG57rdw7C7>1$!%|tAQrfz(sT5SDI0jE~m2ujrN;v0Zjr8Fh_;AMMI z{rdHw4NxQWX1!4T1Y_d&a__4;wUfw5;Ky+=Y9`{O~bS zKmmb^9o2n65&0eVuo&I1!(dr5pCNLbZ;di<6v0R~7=kzL!(h>8V|sk)KN`6#VEny4mZ;ZJI=hj3Vs zh|Dd)Sq0{E*c!}!IP+?+%rj_+Deog*XQF^Uk%-C4>ff;fHP5lX-FuUBgOO{!pM)hu zy5FRQLyOVa*M1Ay!081T)9UbEBPH-=M ze@3V%FVo{vy)uAoFd9}cCfMyXw^Fub=>!u-Ak-7U-F82gi684+{p2wGq1J+41&zFE z4zaDP&D&{q4vXgBUuY;eB~RUS3_yE&bX8zrQIxVS)3?ef-e^-ACGq+H-m5KsF&R!L zTpf{fiFZbeTRUrS<1<)YM1bty$Y{ z)4tKsN#VLUwkc}rsiw~X2b0Yy!fC#8H~pwfbWLax`$eTp)&Jh9J~(68I&O9VVDCs} zdv`nBA0nnFOH4aUhG2jIplq7G-1d`gEbQ*2Yg5YRAJD~#be=&+V8N5aXm&pO-M|$< z5rbt7f)A5Lgmfc_9d1kFh))sB6lu+qUShE24m&CE+(i`joD`_-VjJ@`7TF$SE(iJO z37G0D9rLb56-&{Q9ngIVisTbfSmHW*!u=If*+&%bDiEqnG$tunOj95n3uUB%G&Crn z{AUysNbq6NOiHO>@nd!;xr{goHTe0_aDg@$Xgjp!<&UAB~GYW(g{?uxsr z7DXwpz>t5c5aLi)to^vIF~PaKIU#eGiYE3HqG6>hNe-fm^DGF+g~6SDfCZ3iNrld~ zSbeVEc=oXABWhcD*Pf!zlP7i+C{qtceshKDxZ+hu|IU>J)3+lCHVi9Jmtw{RsmhWm z765x2f_Z_ziFemefz@a8k=jUf&zQ8FBC%e~dsj)eZQj;bG8cmBy~V6j|G&?wkjE6Z~=C^R)=?HKW2 z74l=x-{qVC$`*Rxw{%boui3%vwHfFY^n~T(5mr5{xqz8or`QPtwh;{f_pj%c9h}pgCEN=j_MR8ko-~JacYr!sl2%X*I zQ>3G3kgZrn=SpS0#j|UJs|pK!d6FLo20ePZ@)yPc6TQ^FeewLhkU(?Ooaer?{adf_vyZm=+KPVj?S?l&qSNh<=Y{V@KxT7`Uj(8YX|D!o zgCY@@xTwI22;mkZ)(l{ta+0HM7&o7gi?$a607Cgz(mNXvfHY7ztDp*rEgkY-|#DRM*)2D^VnS%)?}} z)vQsIF|mZa7z;v4D_HnbtTHYfowIHyewRFC}A0>_JGYeqLW0S z`Ztu9ad&H#Dv`~ks9NnuyY>il5$8@6suq9Sm@G|zoVMd4@n7&WY^E1d1ySX>PG@r{ z(nCv=vD@uIXj?XQ$;9(Ld)Tt`f$YCYP&Cp}yndM5af{s>R{NQ_EYAz%aV;Aby`bP2 z`%TCZbNhD66sUd)l=92YVYff}D!FKLr;!|~7RW|s2>Aq)z?PyZ^qe=Doz>(}H=4mL z0{(52k376=)9nk=4TTmFDhkQtAfsE4c)RGOo9*`ePO>IVq6iq9cY6m`i z)he@MpmPhv@R*f!$ckAv#IJ)36buaHRW8B~rArlI_@ZQhE(uJYoBU_&cM3r8m==jo zh2Zn0D`Auagc9TVrt=6*2L?{OfK4Sv7uOG#1Ur2a=S8qUL&H7X(3JJ9NCq$e`BQw6 zspF;;n&wVnD^3FE-Z-F{n|SZ{z7ok?eO@(>q8r8w2V1zYfOVDbiefC75&*WzrmSTa z8cJ)_o}8UqG`kkfcD6CS9xcA?TF>_tm_X`dA*qzEk}JAA981==|2Dl}sJ6^+*}l*< za(+QU=e|Qp+pJxWv8Mf`Z-t!C7+E3zdf<1oa_y24-ENH>YQVR5{a)%1n!8JRD0H59 zQ>+B*$pz|#_5?0BJc0QJXeAOz@Ar_(KsOCXIE;l#!L9zKi;A|AlCvi4*MX!4zz_*U z3(}n#I`ZrI#3LLsiduTU#^bW=%Abw#%!8uOLn1pWp)M&Sr-e-Vkr0EJdP{$*o$e#T z+)rwz2f_fxV7Y%b)aD1ux{dkcKBbSug5A*}VOv2gQ9vA&iaR`<2Xz~jnte*>NiebB zzX$)DD$2L1eOs=>{C_Nf<`fYP5-qG`Qe=oz0fip<^>(oxfh{3Dd2nz#HpWGi{K*+Z z5i!n7$;xU5>pxxRT z4&w%tN`b4`7=f#B&M|yTm5L=yCep~U)GE=Yh0A|Y(F^;i@m-~w6u275Gy9~hOR#tE zGeHsY=qA&iFrf~mdtT>_Tl9{zp!g--nyg8x5Y&Rjt!ixPt&HqzH_si9fT#FbVe2E) z7@`bZyk-bo*IXzB0w1M_WUBZ!%KUt0A7gKreq5yqizf(-A$#Ejz!oKZ{JxMWo8S

v(0}SW$zC)EQIt40D(aIyphXN$fwLM>Qag~-UXT3Gx6Be+GnFphK*Qx zA}h;`g%?EQ2}O{QBoF}DsDsNnKQc}xA3AeRDCF}O3*}K{iozzNAY6Z3Vx@hz76yO` zDhV7d9WQ8xcmE#U-k-X;^R}tyOr}AjSi%abSYxK=`Kl-8q+J9GeL^C`S)}9ndnu+( z^LK2)yUd?SHij-!^+Tl2Mj({G5ppPYtM6oY>~eNRcy?5Oz+s}R@pq(FRsJ^Z;Hw8T za-SpvC(eP3r#--rWp;G@n$R52q4qeJIIox6yVb#G8$zVdWlhx)6Zxpppoa`g1fv&d z3CHposNo}^YOVoYD`V1o2P(bE=9A=fd{38Ps>-uN)dK0bpbq07fe6Y2waezm(F4ho zJ2%=PoDkiF2?0E^r=vrbEPhZ%@A1UdT$&rS)A8M6*BX z@9B#V`i9;bS9boy=KQhtIedTo%N8QHdA-%@Uf1nDi+2mN7}+;$=V9o5@$6=Jacbqo zu?|!thrTk5werb=>!99IgyMfNfTk zr8o{nz6u89R*PUTtWc%9EiQqq2}+{Iu7TU4k(;#~DV+iOTsT)aM6KM+zDC_wMiICB zbVXc)Vpb4J()qV6Mi{6jntxIOIy{3wXVFPj8Tr_OGAe$IR(1VOLB37fL?p+dsl1FW zzDlD2!Mjpg_40UH!A2ZZhSq(*SZ)C%z){HDgqv(taTsVK7 zc1Y`)>|n?#q;1#yhb|h06KoP?=XcBtLqfnDjPRS%xoO+VitTzIFVXQn8@utgy?R3A*1T0hh&a5I~NKxLH9lt z1f();0Ei3YI0y%<3_}$!R^;kT4U<@b>!K7k9loIH7S4_JJS`bdgW%*`Upk`(f(l#T zqkPipto_xxIY-k3e^?X7TqcuIo4BJYk{{h)j0DIl5Agc4RHoQcOB$1#)AQ@|-s=9b zL96F8{Yc9;`}1f;w4-D|DK&QYBzp(=xE`1{k@>=&4G`-H3y!a=V};YU7J zL`jH`JU9+-od@+yiHz!|XDZN8;xtkjfaX? zCzImvlB>)}z8V~MIOC|)o`$Sn8^t7eA@x3c@VSt<^}I;$iiYD}#2u9MIZt#A z)uQ4wVT0DcbO_)&}Mw3S?y8skm{7{xc@FiSOR zs9iVszH}8Sg$4s$qH0!GCmLu!S}pf4VIEra1J$Vg)iFhK7sev8ir^x0L1q5;;X=jM z8d9xk#TM=5qw1xH27R5r>Y23M;X`3&)A&ch|Ah@pL{k4z&ggYyqGT|VkQ&pJYH(_R zpAr>nsJbfP7QKHFZ2-PWD1G=>sJO76+_Z{dpwO3-c@@ke=RJwUWR%^ISGH_rhLZcP z&xw24O2yLdRF9D8+enPiMq2|tz-C1xH?p_q9pX02R3z0r$8&u}EH!lVt9v15k`(W~ zcmL_8>uLR>gszMCxoje8|B;rgt3kx}{c`=VE&8lsMXaUyLrW`Ft3{R!i>zR1Zs^u) z7R&Y?W-&AHEPA3ztLtrQ?0wm+9Yf~$lkqNd9A4&Y9*NcWq5XfKb7B5nolIaes#UdK zy(OrYlnm)^aX{?1KjD3N%r}5|=3RNEDStIdK$(cCvQA*=Bc1MxQ2IPHM+KGo2~qa1 z{7MW!VDk`SlXy&qa!K()hj4L^AZQC`sP~bSPau$0lFcb;vAOS^`n+i$drC&jrc-jkk={%Zys!c8^=kB62q_XlAXlA7Jyj) zQcxn|V}&QgfG>+W2xa<;u|wxEPcF0?Wy7@C8VJ)+lk1BROok=&W%cnVuC13)z8u*Q zinPgwoL)MNz25;ig}4o^OdNTgKZK-3IT|`5iz=8HJoO!|`F@|L^1ik4>FjJo&bHjV zkHr3_oE>kzjvH=xye{veu~u%30I`Mg4fp8o7ctt?W~K-q|LlPz1LA<26pc`Hk@yWl z7c@1z#U;6SzF`c^4sMLYI1?$Tk~$?;%ad-3wrvAe4@&@Diy9w|IDbz82sOY>;<^?X z1m*>8{@G2m6LofTFsa(dWikTzdX#X1gLjXT*vhNWUKgu2K-0i@6uCmrbx{pic@-8E z_Gvfja_;`&6+i976b@r26X0j?+eyx7LjCdtnRtZ zH%q26Oar*6v_IeflFdr)phg7r!23*DgL%KPOmR8zy7+!x7<+qvjKvXkz0H4YZtf24 zo=C=VnoGsS9L`KF3;TFKE#7Z6pGTb>4mrL9+T4WFn4$3tagkMZ@0PJj888HTc(?sb z!GdxpZ<27d)r8GI4zDT~>SvAU99qndR##%mq>K04&5_P1L%ua6+w8W#&h<5{Jf68-Rlt zdVi?%NvSnm)SKBR3a^F<*wEt8l&bE_D5T}&oY)uS0`#WY=NXjK?FeC@d>4-`v&lgu z&p#F;!id+UI}62fG4(HlD(6$=U&ZDwO7hDJ9PA8GfeS-EN=8EmoT;v6 z+EItS>HMdmhEg?;`b8{~Dkt!w41eue#4XsMuJ_m!oDYL>GF4PweWppUyGZC!;d;WW z^v5>KrfnTSokOFOHv5j%<;pW+EJ^%ux&}z6X^g15ehJ7Ez(i<)u`cO4JH_MCcuyR* z>0)boGzUAcpk~T)+ciOe*qIC)tV1(!RB+^$Quv%KlYQt*lD6lhGhB^yj|$fu;L1 zUh=A@3VZk_=24z`wqK!F5o&|-M?SKr3MQ>Nm#2&+dJTXeNqn^u2k!KDVHqPhZ0ZC= zv4rk&8X!Ewf{50K>2lT>m8+lFB24d|9?bYa+h+`g0TUSQ`XfG0?^F`ayG*cQ2r2ehNziSvdFHWZR_C9x&Kc9|1|9*O#AFL~17+W#Ivmtw+WkqNbK;a0 z^;7JGQXzl##A?hk+4)^k@01nW9}Zm#!X+KG9jce!8E4$)ugiC8!uzlh%Z->{?(rJ? zF{BNMvQd_ruXr9$_!G77Nv$;(u%kgN2rkWHD z^-VBSqpU2EKkhnO1b&OZVXf{^~ALQ_yeXSi2u#`sB>=QTRYJ zCRY%q*3cPA;V}nC-XoP1)LAD}wFd;n6uUd)5Gi;y&4PO}gsCsKD}bLLC3)NkY@ddA z9H>fNuegli0mL7O&Iv+{srnJXc-pLVJ&J8pJey63p2*5Gq(+le9i6JYHv#Ply(4gF z;#g`~J2QE-P^^3ufjCE`gD2*MV3L*Ux#tS1{uj#x?@xH8XDEa`JBV#G=Mw74BC&ax zH1#7iG>PtF_mT5+V{La;ntz=^>`1M^?U|9!j<~~CM^9JZuXBYvN0{6MH;YUbB|8i@ zq-Yn`P__D3Q~O~A6e{2)A;AUUAsi800yHxMLbK^31m>G`7f+e7Sxs?(>5WSW;Br<# z88|;Gq0*W;gtXpzTEll+i>ejiWcbRL^!LPKW7|yi$6@nC7o552c#TainLPVj&ZoL| zh=t1++Pb>Z`p}!D82nqh#uDVum?ky=z_A!Lma7UiWyyRY(8sb&U6J3mv_tI-F5LT7 zgo@k{_PEt2x(sA!Y+G~Lr6V@r%RF(Rf}geJ{bO@!{iRSn(v6QCUc5^tx0YNc?D(fQ z{Ylo_x{=%8XVuU)%vf>MQOb1mlz&9snoi#C(kK4#G-vcMJrkO`@H}K?%hKh^+c9S( zz_n_eFk<_Dz3kYsbNJj8_z~WA&|0k2;fo!}1oo*7K?L$>jK!*{q9CFX;!(J31~&Rcre3`P%khV{>*}Z8&TbV-5PARGXIcYG~>E zrntjSm48~IniN2Xj4$_+&{YFQLxShUkJ`wXH%j&VS;Az^+8oL1$<>f0wO zi|6T5%A)+p$76+4jnKqyP2p#P z;T6Neh2dfO;-)FhYgzVk6%GBSf$|rG6bg3Kq}LyJLTvR%zTu&?X_f=6Op-j2!xuNt zOBU&jZf5C@9uLK=|osg~IIyb2Ru1=--Td?zV2I3gA{&;9$jqRy}bIRvqm1J9wf zMp-#ZhiS2&=&}75ZCZs1K{o7rbTc_aAZoLV*5A1?+&cYNsA*eEG1P^W205zE;m6U3;P`FbK0KdOK?M={E}f0itYKDQfNgBDgjL>SKXnAgVfQRJtfq99ol1p8It4g@t6AXewL_ zjEMoQHkssOFnEi&ayzD8;V!Cq;-Py9+SrTz9)&k~3lGluKW*aKGO_3KGn~mYFv*aV z$e_HjJkcun%uNg1iqO8IR^d-?14W2M{v3ucvMd2TEvrgjJT63uv_sV`Q1L=paLPU# z^7C$H8NTweb?8fmZ>8LnLMI^$%O~=Rr{C3U5hC{-2~4VdQ5G)*!A*jCKOsFX z%H=(CPz?@d^-Nb4QtnKC2}ix{&j&~?`Z@YIi>xGPc_nI7KmVL-%BRS87H+Q@ywZA( zC^R?s{bfNh1#1)+3!VMbHJiR?-5vFq?5a$nm)JxK^$8O9HlS#1?d{FgaT@V%#9P2K z_i1Mnjvv?qG2e8D8&ByP~gzt9*{@hJj%hhFAl|yc(_% zQ%#M;)R(5UTgnaKWI;ixB5OB64uwsBNRO3iBMC*7<6crBFj&LA&AhK~zH*c!v6n6d zrEh_{8H-aOB*({VfmyN&8rU+^Ntiz#+8P99il7MZ*;QQ$P!fgWBb8=&pmbz|6tS+t zqC{<;k{!0mPJxh<579QD3rG_WLPH;mv<8uovTwh>-Z_Tod>V}TYnIE!Cuk9X^^Pf! z=F94tA1rz^0JuCEp+|zXyo}KDCP*BkWQf_fou15ff8!>Bv0f3MEY%E>@>rZ zY)6t3pS>R)3XW1{)|G}mada$-u1|MKo5Dc1I3Aaua!*7F)y!ANeU*)!BGtQRM1+50 z?3<5YJw;vB+c9T_X^%8d0P9#i*OyTTx9;_+w{3V!^WM{gM$8|KEG?n$T8!m)4%Ex8!AfM z0#sDbhJ<%hU&}_zB!P83qfDj3U#5qv4d)*3AU;~qsFtJoNHP)m@uu`vj#2T$eT?>g za@|!(coe*3I+E5RCo(2x)KT$*+c?lxx;fMMut?Kr1yy|lxJ5%n%!lKQJRQhli9!Z; zYd<)8`7`{Cj>N$&0UI4_8J?1#E?S;x8(Le+NfXo&zT`0Y13}w`6^eg%0`6VetHVz^m01Am@ zizSacn+2mk9JO1`T-)8l>A8C0_Wc?t&HO%lzUvcvyTdF!>GSnzg(byVOt47N#Qw6U&z8i{_aZcO`2m_%w~_LG(MGvK=^ zgDBGpTNPbuWRr6-YS74LWQ7(M(|oJRN~R}+!0mB$HX&3CroCc?w95(yqnv`5XbK6M z{!!HP%NoGT(jm_LQasAXz}Rdg5ngX2#;blqSg7Ie-oa0f7v1P)=9%f~idIRg!p)7C zafWQ30+7KMyF~$WSo~-mQ{X5nF1`uo^x zPK8FzuR#*KkW*eNiHiQ+m)7qC^m&qbrU0xmbrTT#n}tjjnOX5BI@Ohmn=9*NH}zN@ zQxsQe2akBep?YZqBPPgo?nhcWZg5^R*+JV3tQ6+)8aBxykf#Dqn_KGgc93*I(sD$L zykyg&CCJ#fmxIfINKl`{VHFFoSZZ!AY!Q(QQME1^tL3t!P??+!P&H$kdQ9A-=2m`FFE|K3ZX|7ge)p^_7j6^0Kb`peilyD=+}BC@ zOWzMWGjNuvj5DF=%eOahqxW(2T3>&EuGc?iam0wyp?Zo3%-)MGqC8Ynp3a#U7UkXb zl(BR}66JR_8_O#clY^KCI{Fx=1E*@(kmGQaf48z2kz=#Nd(c!mu6|s+!Zr5H){`A8o4oEe%(c-MVlB1IyjyJLNv_CInwhI*B9B8=A*+Csd_3l3 z6t=J&K@r-lwV1!)a^)U;rWM$-xzwoVj)iMbSV>Ku6w4D35V~c=oMEB~^M++C(Uy1WFZ(Jh_GlD>nnV{Z(z# zeFVBJP0N_3X*L~iDSa=lUwG0Ss5o$FG>o-!YNDjmL z{SpR1!zd`fL0EiJf~!uNx~nvhf6D5RjyA*#2e<(gzEV0xgLR;+m<3KRhF*96%tXl8 z(yn^Fn!Emzc9?oH5UTAjcslP+Y``~yj6NV}28n4r6f*@(YZM7_L51RGY-Y`*?@b4A zJ&Kc|+l^#7YbPKf&c+7<8c=LiP)NAF`yti{L}qT~#4j|+utzki<%oEPta-=8d{a{$ zrhb3EtsV*AAN1s$pK%m^_U*p=KmNI2NUF`r@i_>2>}l!ltIn7qA{6ldytq5ND|hI5 z$^AHU@$PxM>~Y&$_OyuOe=e*jwzF%Y1D+i?Q7W0SmWu??OghQ{ef~0pB+K!NLN(V;c{H3&e}J;@$=BrX*Mbi{w)X*#G7X)% z=_(g!#MxoKHq4xbndJGf;0^X^xeJj(8K!bd8E_GX_jWf0Z_3+P#WPVRdU)inbz5z# zAJa0fJXPzh>A}=m^|fVn)i-zB%2IX7F)vRX2Xk2_D})=EsU7|kDrHh6MprK>%3d4Z zUiKc&Y`BUg420|uBabDqnc7?LXaW_fB1gZKNx|rMF1Vw(Uf~o5F)}xMMWlX9!Y)aa zN;;gk+dTt}tiYJ?Z~LM4Z;{rleYifFL!@IQi)2g;#`H{R;zS}4s-x(OG|=QcpxM&& z$SA@EM%?9DQXJ=pA=w)95Ug4%GL;V?eLa~t@=4I@WKKx+&y(_+)PaJaER?dVa9>+B zA+soC&@N|KG+>NG>~C_;A#LBJ9$fjlTeMkjenJ~aCQWkp3xwV6NoD|0j zfcUegl%+}`R1uRVYw6}YYp;ugx7VDY{OK|KI)0D8?Q;oF{5Fq$OaP4SX(i6d-TqjX zUw^#lx_a*Ebh$lTU4E$6GV=SAxs3yl=zaP5K;QF}t+l0Z*C|AFBxmAb3E}}c5u|U{ z0@eD$f#gI&odFb+OE&?WTYIqWE~0abDb%1vRw8+2Pc#p*TiAQD(hr{54Q<@f(a%+; z;hK?cxWi720a9U4ERnK0`cR0D%Y9Qm`tUzIbT&0ij?g5Oma_DRV%(hBEJ~1E)Sr65 zwN#QjR4uD8n!Lu<&LVwf>bP`6KTiB_I0C?K&V=!Bt7x&&SZ&q-_EzQe=}Uip|6W#7 zRz4vEo+oq_{EhvWV~#`}y`=f{tU+vRJXm&RA-E6a&_n+qsm_g(o;&$BZ#2Vj>?q;q zK6F5B)g8iBK6Mo$)=2TSbF7enS*~QzUdfRDRSos?>0Fxj~#cT2(=Xl5}QKMqmKwNyRtZ zP~ZYcyKqtD$1zxO_C?F;3nWFqY;_XnAmg9t=#cx@I%5bcSr!B6(0na_V>r6Z09<|R z`@GgMva@qoqlQXjn3h>xkF12dag^UNm?mmd8BzCWp}P?C*=Q9j@+`2&R(tky)GvYo zd~A7yaKqD=U%sU&A*$g1{x?@7RLU;UR+^^jasuLJn`XUDPf1gdV8dA$R?qsYXRJp=(WvD*KG*J!{=ZU2x7g=$f^S&pv%8{wA=v3_6<{x}Y{6DzqFy?Z*snsHU za@YNJVnPj5Bt_>JvCFcPiR02=8WM-A=%~id2-)6!BY0sf?K48$3yInlP~iSz&95AD z5-S;mga7D(da%~7V(*!(U#PigFp~1zZF($`eP9f0>&p`oglJ3t6&V5LruPrm66Xx@ zRE@{<9FaG5lbXE^=TH8Gc+$cIW&lC-9RjZHl@r}}c5Q9z)qX<95!k+@z)m)yvqKsn z)5fTT2|8*{ujuxg!zbl8v?3zUxo>KnjnWySSkg<#o)84#)?60yv&aS77?&)iTp#&H zj=%#|Y6vS()1F~GGZ@P zEgi`_ZI&2a-t-|}!h$zWY-M9KYzSlacK8rVytKDDcp&MwyIUHgi;GL}Ga7dbcKEg+ zAA&+ErD;=a-1OfTsblju^_Ij5SA%)AtyICw{Ec<97%VB9%Zu|yxJWBZrC0v(r*)OAu)QOLs zs8)v=q33d=?w(toN^!#&;;@s;bAsegQLta}aoZiQms=k1_;JGb?Bf`Rsfz%54IyR{LuMbkqtIzph8Moe-b*4GXs}5ub|& z>B$y`mlPAWu@J2NJ!SUI2Se)GTZZ+^THPL>!bJKo^JoHt{YIOg-(0^26eHs*nsJ{Z zX^j`!{O*MDnsbg^IkT(ltJ_InE@o)l_*YNbSkLur<4m}nLacuqw%rdkM`o5A$A0<}xia~(o>wP0uF>WN}AIwL*r68xFFPp8kXc57LgNLPva`@h5_jFJh z_mqP0)CSE=(DyAq1I7+T0R{&`!TMgjCLqZ01ErU_CQy!&ic`Zcd1!0?B@e?+J&(SK zr&#Y=y<0{lE0H0uXe;BA<`<0wp-7b@C9%!$@4lb;HKvMS*TBbJvUDTn>y*wZ?V+@G`=xU&gsRO z7>y^Ym{kkdfq_egJhpZ47QE4&F5_hf92aexBjS3K!=<3jok+*M2!xLL!H6F&M?*5{ zv)>BGP?mM|%Q5_R=06qMY-gLAbw0oMko=-y4LjoKXi!=lwgJ+Q-L^$bI(TvuynFai+J`C3{<>v z2o0vj66GDLX{$w$eN|85hUS!XR;6b)Dbi94%LFl}^JhYdo7P|FJ$ti~@bTeC)|i<< z^B&tY60DIU@Yqo4Cv(9<`Zgn z@^XHEa}CxrBURlw*mZpv`qE@Per{TJ->&R!DP5a=Z@t)l?ZvM}{;JrgRvD_ZbOz|+YT-r$RlVUrbxKmBA&>$$8!O;I&S4Cx zO$p|C-8?)>XFW!3ii>jH?HY6HUC1KZlA{wi>$lX{bv!oLz`<*UZ~5EJ07Un5Ybg`h z&%iSxf*VV)i8&TkBF0m<)ViVuG5h%N02A9xR~&P7-EM}6P(0JbBK^v@i9R*4jqNPC zFnL-u8LX&`$&1;4UYi^j)L$5ftg>}LzkAAuqU${ClEjK&ctW@;0^+u8!XRjC_8 zt1LZw58+R3t+BthBizAbUrbF^xMvFEpa);gI9BPgu(9_v;*!PdVwFzERMn@cjGruY z5!ua%N=5k_=T0cn>qSYRBT2YL@9I z*c?o7o_<8~L8gDU$hm@=Wij>zd2=LbJ)G&<0pz!P$#a3ZWzX|b8o%6_p_NX0VX-Vc zT^3&(4zOl+D5JwwFS=o5{*NG#4wujC<(HSPF5k2^Jut-|N8fox5=DO?xV1!U9(zR8 zUBoCf3jdBUZ>Q4fqjE3I$qrn5kF2aC{2L^y{hzkPff;O5>vP*M+nwlBUXr9Y8%oR7 zI7#u9F;vFekkL^k_~4H;{yoQZj^1Zids#q+(?I{9H zePkGhMhe`Rjie-An_dM4Mo`FBn?}%BxxK&uEkD?OOm!kaL$su~e9VfWKSuJx`@O3W zy+qmZFDZf&^Y3IdUnh_8rdyXfApjJak_R5MtVscl_D#W#Oo_MA7GFH#w zQ(ynvgP}}^$uwLxBLDXj%kHkOcQ1z>-9$XAN%zu)97IuRCXUd;6~5 zEFSD$wFm0I`+h6a!I{c}}n; z*rgub6n+uTCTb)}=n6D)xy>>!e-~gidfZ({qpy;2aGQ}lgLjAV=!KpCe&q{uDJ1P& zPC&{L@`cpFi;3;{lZ4YYXdq{*DOV@7TNdSz zmCsiF`6J=FcS^z} z)rH2aBkRnX%On+ibg}h3wf(xC^YmsU1#9za^n5(>`P=9%IrZ>wTh0X$6sisApRf2x zJ&Z!;o+sX`dq3B5@Y%yR^4|@vq=BJgg{A(P2$cYbyexDFWsgI8^vtYt6_ys6_H2NTAlP&KY$(Ef;#CGtNEwbA;N%0(I>`w3D#&U8Mo^yj_*?5jjg zSlCVbL_9nDUy;E=7SF{=GYF-#LD~XdIQtaLJxQvV9$qjDSI)6Tk>8x3s^B3`M;^Na z#0!Ks4%C|44P+_pUk~TT#)k^*ypb-J?Cuwj#lx#hRRox%Q-WmDkD{rvs%atyDZOs= zYFtwsXjkqI;aU}n9D><~4LawK2XJWA%Z6ek;A0l|vCS7V_XV>60pv=-;IX?JHXfd9 z(`n`V*w|IzPcQF;p)0=8NXVo6*SwQiv`yqr0F$)dcp97+49|ViG%VJ+Se+nE zFXd(;KJ;tPRoLe}sLe>o{k?qXiE~WYXkc2h*m;k#bE~#M%>)q@=pG<$Ib9L)4 zu)8o%6@iP$WFL1Sa{KOYFDvG(;nZyi8lSi>oAGY&^En%*9<+|2AC!yhZIVSAG*OQzC@)qvj02f20hB7?cKt=N zc4XO`>xxP8spM*Vl!v_(HXwY(kB<-AonIyVWBO}W-%I(;CM^S5gQx1fVJYC5i&s$C z`{Tf&>oLlRX0PUsM`sl5rL8*-*GPNF`?&Fa?trwL+0r%`VETpzQ{f*D-l*P}HWjVE-0y)feARcQ?CO zS~j}Oa3Mv=WFcU6mBlK(5Tvle=jlcqpnlM$=PR($zq{z zK!)=F{N345l1l5=`xe;NRb}~ZoB1j1_#%YnrNqo>s&SZLNlBm^v5$>s^9H@mID1uh zkYq)4KUXJoSDlGujd8Jb%}CK?HR3M78U=%bWvj3*W-5qmM@3)?4>=XrI4*0$ugvZi zH9>qQ>efhswWvyAsm|>Dd$?`_9@|A+M}=k7R%BX;^Af#9xC2?VH$+#*qDX?9othL% znP+ipjOnRXm6}`nN%|rs58i=X{l$wc$!tr7B|D%{A|^GK5c*PM!<66Jvp7)(tjtR= zH1M6g>r^nVWbbUEW*vteCEj}aybCX{kl!W!wl2R=WK|3P*`@GpGPAJ%;{^&m zf({_h!jbp#QRr?t8{6=6YyHH3(4{NFlYX7|5A>=h`(DwIa)<>!IJYf^*e5ud8mAZ` zGnxP`g7hGTT@JOZUyy{y4?;H?#Q1}Y@kaWWeJM6oPBDGRgsDbV==YeDp9ee!&#K;C zXl>TmPZJsJ8_Ov07*^(oyINZYYZXZXm<0_LAmko@3)XmE+>!fCI*kf=kjCPPKxF4b zhoh#2^=}>wp^D0xoHwnV^W79o6Qh3u@z@8o6AnrGq5Gy!D5@;xMmPSQM*UNz|AqSe zaUzFp^utu0Tp2dHXCgsO6I`493C8HK#lX-QO+I^J7%2udJF3xASZSmyCYjy^meo;c z1PF8t@zV2>PUD3FaJ zhO~Yu3qT3SmuN4^V6U$TOdBOJR4`=FSd|mmP}Q`6>N^%NRpaS(JB;*Ww-6vE$|1_h zjfN(-=)zy{+a3b+R|Ueti=oPwODkn@S3{?v742`>19YXnNAafIGl}|RY7+M0kPUCq zBFiQ9=av2}Y#{@c<;?)7Kbnr+yfVsyd|4!7V2hb8sxNx;+TL~x=?!#UVq{&7Bk z@_6;$CL|;-+&y3SHvCxjZ}Y7DOi=D_Xz?3VIPWtazuBiAx%~Wa_rISJa({3By`}U< zp3}%Pfvai5N8pB3U%WABRKr9#Fb|<5&B@LyMWXTDQ4F^ES~eht4wiYZ?wH8TaJ@_T+|r7c7RWc(}r+MZhXuH z&%LB$lg13=l+-WxWa@%6!zryIef0&+sX+TW~ zJV)gP286og7E~<501$!&covMJCb#S=QFkG2keu+&mm_G6_Qs>E6aox}G#9ga>L(nZh8LAipXTbADXyPWBE##NtjQ zvD^}K+LRiMaTxz~o=!U~R5d^a2scPwL9_fcfOvPD5>xItgZ_nl(lX1C zz-{aehlq3RES&ngK0hx%kXe4EH8BLW%(hemoet)65FwvLa0!ZowQy?WOB_+jWHsi#+VR;Wr~6Ah$%K5x^6O4uw*Z7AGuPsAAw+9@ga{KnC{5xRd9&0g6UAS ztK3BjbaSiw^IA*&+x7jED*lZUWO}elRQEucjP>Y@xwlAWJKuF$#b%VD!*sVzP~kb4 zgAjNyMF~U=Lz-NzeVPo%Qe_88fQJXon^f`O(d2hc%ZdGQvI~QgCaNz6W&soctU2@)$ zjEo_iUd@fzmR$)9Rx6AM*MXwvw3v-XCElYM!0` zS1YFE2ng{fC=F~@YAZ);Maz+xeS80{`dx1Qf7ON9Ubr^$vgUdcc>JxVqb0g^ktj0} zI9z$mDHSrs0QnsQr=rc4!4v|d>HY8gNR+L8q^Oo_KIO%-x6Fb;h5V7bVy(`JI^;Ki z;Xh!q{mE!1E#^ax=Ey^0EKMXKjJ@KL=beC38MvsJkz`V2yM>~Lp?;~tN{~K0YhdHE z606>=;t#K~fWgbezz2TsiPa|nA0B$r!a?H6o=%APyXVj_-ZZ1hneU!5MJlfiDdD3l zC;0`Y5=A>@mRngKyF5sFx>Fwn1Zxb9WWyh4FxsdQqcek=8H+c@fLvEzo?VkH1~KFr zrj_h3Lr(ow;MNCupV`pIVCz72^>2p_fyM9!kr<6#%yPJlSF&&iSxp80YmWso z_;*+#XLJ0i5aI)MyfytsB_?m()Tl}Rxg{di8p+LZyXxv)FGO_fQHy#{S^u(%F|dUf z#T#xDlG^3UpvX#pwAI&le$9pM@bF5_sNOza$d}@w36{z7t$sG?zjOGO)7K~mS}Fk6 zs@KJ4&j9hIViz+wb6})I8%XYVh1t?HTR;%TAzF>g?tlW~wNj~3Dw36et;S|WTf16P zXv9fZZoq&h$~#>vwHir*kynZL>~^NJ3zL-IuU$SxOIGS=!y!smUEGZIxGtdN79uu* zp)Oz!UmpEDf(}QilKW83Rf=bnIc-70vn(#zLNaNVn?4>kkyJ<&*R0i+xP2%ggIS@@ zJ;kDWnV76Uu5u~UmWWu-p|LMZtAG`OMq-XA3Y~A7rXEA3QBsXGW9TSevB1?}7xh;x z2u`)vC5Y?yk<9iku1JI&0DoaIQ99;n%)!C_d(X`idTEuj*;JK}NUhSr5N|5wA%$N% zo5IuhkAU14475qNeFBTvpA@b^r&#XUxWuxKO`56=%h6M-_J;-31QW-YL&LI;w;r@_jih8b-dl?cRKHSK=}DBc(nN5clMdi za1dkkk_4;07>r_atqoFx44+1Is9HygD-jHI(~+opQpwpd*#tHqHl)%#q%cHtfZ-r~ zytU*ZGRF=;RwA{1vMO$E&79;Lstf~pfgz`^&ap)E`1g558FP=jpN#->YH2nz-9ai9 zz&Dj7E+Dp0ES&)^9tt30E)Ogok}nF8fF}jf>bGGOrZtSfy*QOa1v&y`a9}Fe4H^R` z8WK6qWlf}nDV$tF#l4F3SOVyVWmvf2vAt*CAdW;m&U9Co;BvYN((r?6J*$y>fk%1? zsGJj@T0f?za33K%ui^TN#}E7WNtQk7&e@oUh~R@n(WqdlWW|}J(p+q4eCoUCAIld@0d5D;D221QCh3~2oWAwPQdW4R= z)H!&SJ?3f?D|;o5)*=fj0|XAS!+jVAXjs7IEySq zUY;!W%zVF=i{c)$CW7nM9!YLLNc^OSKR>?>DlD(WPaXB+>YC(-#o6w!#%>%rr4xtO{j#l;brPUS!x` zg)0Qlh|z}$dcD6lk_~u|EVSiVxz~Vau+q1Jprks((;~$z1Q~_<1a~W+a?wtx34}}t zZR5R;4!9C(Rlp#tiIVnaN|9?#;?*?_8(=D+S_=#=yP+@ojo+L9@d25%tG>Cui`6ne zu>r2fwIvwvft zb}q=~gqFNTiDZ5hrRQ%lazJoMF3kKt@sj;MkE}E7%7PLmUn*H3?h+1_O6Z83Rels0 zo4g$@C!S_ddrq=d(t*!KD#J0ZKCR9mT}Y!dNjhic*A?Emc$m27sftAmJ5-}jJN2}} z?jC`jjWIG7y}ymsLwpyP#Pw&bfFZVFEvu-Cw4OI`zmI6*5K(Vw@xx)md7KmQZa0YnScHWsann# zk?GUhFNQXEia7kaj(_}I2gcW0k&|V<`!%oELJDJxlI1wEJen+9?GbR}^nG=PdDw$Y zKz>ATY@k5j{H=pvC8ph(q|Ha%&Szr(G+=hgdjD#j%BR_n`x^~Bo=+L4t&Do_&jLUo zN4X948HIeWkgs{e(c_SF62=$ThESc>!e#Bh(aS)@mxV{k(sHv%DB}0*VgoGyKy@`k zU>^#7r>NMzO~g+`uW{xTl5YeI8ETO$^N$AR-|-Pih%EvxkL#V%cb#IF6xDi67S z7qsM>;6<#b{%#rvzJ44x5sq(hC{w5L8^Ys+kOyFdbG^P06>v}~M5l`BTI~D+LN&=I zu5#okHQuvNB&A!FaXgR>10FukaEFIj8pHRs_6#JBj1Ma{+B#+?>5b0gpR;U6M5>Pu zkH^SXY8_vY=g9744S)Sh;V%nTdi>v6bITJ#vvPd)&)VtQRmuHPniLMs4o^l~05^ol z`kLJasp5pbXZ17FU}@*l@ekubl0HV$5CkO+nc&(L9}!R#4h(e?YE2HXiT*TL#x=9R zy+R`Lw*1IrP*ss*qJFhl_SwEP<)@}mrxAqGFeEQ|JiBjp=7U#nym|C!UuNaYP+HC5 zDwrvO(n^WbJQ2631XEPxg}g+sd$A1Dy0bPj0}&f#kr>X5Q9U+SaUjpll$%9a1+C%H zT~eC+1vFg0)4^+I=_j+DbRrx?E2g#K74C-I5yRDEC%t<79ec%rShnBl_)XoAW3%9@ z>vGTBgfe|Up0T@qUa!fI0;_7&C-?0q={N`w#1HK#`5{gYf$Mx@B|{OFq~%cwoo~T~ zG(u<*!Q{WQdY6HizU>=9$~+Sg-LQrw&U*N$0N6x0axGk==853Fy${D0UZZV(9>A|C zjJYEvDB+(ewDbrijde5ATcQz6?k==+G3I_EpI^t_5SlYP+l=RAv0OU4>-%mB&zN7m z!>Fm@VvH4Ht)JloXN^<0v50P)1oUp|Kzx@B04C;W4a=C{{0!4^67cF9c#r<04Eg^F zvlJC1WQAmXkV`#JqArAyjknXjHVKzS+lsMp?hK;XI%l}~=#vkUKR#m;$GTjtN$PcfD%+7FGlcb<w3P$zOM!X8u(Rcvfih!&$*^ zWV3KTQ%-~GtG6PbzlV#7T3dNdX%>N*Hpzl$vyC}Mk+AvD(*si}J(tM8u=*D^5BWIxf@+NkgOXL>G`bNoNEuQ_sze>G!G zNhunok(yS0`wSJ%45V40qk5UdBsDp+P~Jg9Wgkc^J|;>AVD_MIM~E42oZXy!94% zk(T93YpX!epVtP0;XVdO5sd|FoTzpD-P17&1qTc#n70NYA~du+h^U{G1tg;_Nz}wM zf?@K0T6lY37v+^+KX6D?6H8i3Vb(2Ms}uJOmF$YMxLU|xPHGfqXg@gzCiKRcEjXnt z)?nCAmKsTs*_2^fX#YAuejx)Mx?NI|NbZKNBlyV~zqpF*TDy>xr`!^`t)7ezk6;m_ zN-EG{sR1w6+;McjYmk>U3ZbaOA+!j>h>l4q+z8Vun2b`RF1B%JXZ1PzmA?v4hybD1 zfiX>&aR9u8{vyo9nJv@zz?b=r`175)$K(7ZaU}SrpF9W8=4wTv*VC-LrgS*F4?PnN zownXc+V@)zpCpt7qE(m}+D&z(8|2dn;x>VqXUJpMk5zhXH^l@}<`C69Z3rtUBkEd| zR<;rP;c4Bb#tuN;+tcwKz}wf}9?p%~$wUft%qJl&cv>Czu)Ra%6$S4#$FWjH_1Dzn z;zAi^Qj9cor>B2v1c!k7{q^7VsFREu?RK0Q%%vtutY$a0u_Be!4cT!$Oxa>|yE=SG zGO-jZndSdm_PX#)<64Hq5Hh{=-n`ODl+!W_R4gdCs-Nj+VmhU8T3upjmYBuBgFGzHCAtKO+H1!x2JNY=$Cfb>Sw9+-BTvFN$fM0SIl6fh9 z@WphtMR3#Y69dq}Kr1s9^Stj@CcKt9WsBtq3bS7k|NqE32PVy;W=ofC+qP}nwq4y_ zwr$(CZCAggF59;4sqfyIiI_V-;lz%;Pv*)e*K$khxNAwKg6U*}YD3z%c*ur>SBE3! z^hA~m{REcTi0HbMNiNM7P?!kEICR7@0Z==|qe<3XEU3Vs8-Uq}S&#~aGgy#*No1u< zSG&VRazD`koBX*STg4_RUIvUBh!E_3xpR2kt{#6+=Y57?ZhuyPSBjxJ6!BEtQ7O>D zIaVyDXiS(`Fu?QXtyy)Wro7lf!ATdXs|`z*7LrWk^Ht3ujrE#LDaVuq6jolqlnZf& zYR^CE%YtuY6YF&R%i!kb6If55F5|mX%Uh8KFa&Zd?~nZyo3*UlK5TfN;+(F1jJK6s zQc`smx%V!;-Cb_|+ob!uCvT%BJ{%S8#PAFpjA-pewbr%WXraOXB;Q6mYo`pP%=H;Y z0QExBn@j&kO8YN_w-_p1&sxV`AM`Juc0gEuY$!@(wCl>$6BZt3cY+h^yj>QwJTV{2 z2+#u5ICLUYmA|kti8zTI@*1)n>5Q_0f1_4WznnCzJ~VW?Sdph$a=}0LtmMHgtL8&= zawT?0Y7-ScP4r0FB~V^b)PZqLl#PTM8*>(8Np}frxUS$z{nKGi<0nY za+G3)${u&I!uvS+i#u=;AQ;TkB90=%8S@Tks@g}X zA^42Oc<>t!O=(P7mljR~sMi67@=lvb1aRB8~4plLNU}MWr z1({3=2xip$U>#_YqTxwtxdw>_fJ-RkP^k>Vix~4>!R+Zlp%R8l#$GM3HHoHD*(p+11KcJlChWqyW!3zbaDP^T1oh71DA=R{yVMg64Zo*#H5U9*j?EIStC zIhA)qR1;I!Kb^@ktdc#|pX0Y-O8S@xDl+|YG3n)%Wp;dw4h6j;;S#VEmLjmtgn67M zOw-Jhr^LNq-I~3%<1>H2x7guJ?>z&Dr@5f(ohjhBkONYUP!fQ1(oGh)&Adsp8=nX62}p^XFci!fS8#L zJ+eNF>VBL(YVOne?L1#<2OWy8QHo^dOExR5TIW(qtmP=s8c!aP(|3;!_jIkY-*JGV zIpDRi1VxoFz`!%(OZY}@T+`%1x#py#J~CO>!hUU@<1Asr^v0hUZk`P9Mw1{Q71h%QAv&ngB`B{rA+U++ zhy!v7XhCfBMo1rO4=Phr0iLDCMAB!(>|A=ru(Yfub`1+MLfXCTxw!t5o~@P<2(9m% z>_Za1Q&FpihlEB;+f>r7U2Iw9zwz~_ znoBXzxJ{KzV(Wc0g`?+l5X1gep#VK48J3kplR}-IT|Z_e#!WTbgg1^-A(O^+Ex8T> zni{@qA9t7?=2d79rS&(VXk^qa*W-zIefj&UqU?(Ab8@!DHf%yife#`%w6w2wK9#Ya zQz_JohX6H0Bp+OGjL-@5^3NYfN3w!aPA6I>cjWE%h3xHV^z}|1G*$l~=m2UiLHTY0REtXP@) zE>|7qi?I`CrfGW!n$zbDQa`7L6}_xW0{p-DE%yy1>(5J%n}&jY)8Rjj?9*_|CGSS7 zr=v;nPTdvl6BYd?{$)g_7+B=WF9#QY=ka7b2x3Z#|DnlXA(tb&WqEVXYJ*}TK!a#X zMT*(Q5u>OF6H!@$^A2MQBj)ENqEt4o0|Q}55F{(3iC8*^>zqm0K`8UIV~l zb@%?RDBJ4vu(fRH=xSZ^`*f*)Uwvx%#N~8lWVlu=+xB?NST42g>e-5Ed4&Hppr=7N zZJROsm3Yd#`$wQ zV{5f!vLRTz<80L!WAV|*NP3h-CtadcCyYW~S#9H04BY=$1TBPj?Uds9=^WVnv){8X zv5&60ZK=TsdO`SN0#Dc}O$g@#%y9%DCb}m;p;_B|!u|fJ$>A(1SE>~g538JHEH4#@ zhY;48n{tHu$)j9VC^V>8mGPy@!2woZl`=k%M)LyZB|&wD6^f*r#8UZLex3yE3YS-E zO;!^LN-5FsjImkMXy+;kLHu@9F>7ds=E*n;gWFp4I82|DS-}wmV}Z%fv~=+YBE9Gp zx)Fl1T#{ij(9A8bk!-$HuKUDNmQ4kVK8oBWH=cWY=no9w6$gIJI`SJ z7_aMbxF6keej0rpInDab((TpT%eA$^Wd@zxAb%LTG^cfEAaHLAJ_(PVzYtc+i(p4iwG# z>_ATE>u4%`r%7lR7G9nS5%=W49Cw%F0~o{A)g}CUP|K=&R>OxuT$aiF?=T@moUXUQ zV!tC>frVsAaEII&%E>e1t&f%|f}vN?@7w?0C;GpY)b5YL-W5fwR8lU*8lGb1C4vAm z`XJAo!h}haJgkAeo5Z0%m_2C|%3f%^>;+fj14$t54G82bdoC_HR4P*=8yuVJlQk-# zu(sTh+G7KW6&a7T4T|o9I~9#`bOjdCoVrFzsBqi@x=jY2d@~;$v&crWHkidyc~8m8 zAzW7a8AE*ow(4XEvME+E?X|jzN3o;E5mo)dXew0rW_AHY)}9!ET%IY|`)o?@f`T~v z#AY_hzfAx`IJ<0vc>d?d$8T|BSh|9_#x;KsKj91`WGI5I+9cXF&h)P-GVAFx9{wt5 zYKqbCgtYH_RIRK-qa?i8bP^&z zIx{?4VMmojjm0JzYoZ6tIX03sMe5x_zMGhSc=qcu&&9Nf6@@DZYV-Dik^sMt$?1QAnlMTEJw^9@o0%>3a*h=HU#H67W!NxGJjPNK?k`78pLCA$C#DNvK z*oO5|L{Oa3t(9X}QpzcaMa081_!|RjW+T87VthI6fi3^I&zq2B_Cc6bUUB|9k#!#o zrV3}p6+V&3Am$7vSHFH49t&m^Skwm{Q_s8Vw~?2|DRTjk$Y}7B(X(qlix$ywu~8A< z4THE=k~7AuWDI^lTqQ*GB8jKMDV_9)3wobFBXV-~z3j$)Zc+L@ooDIBJ%;V^4&p%H zAmhn~KwTB4NRX+@Za*qyKtALcRbk+wobjaH@{RDnDY^_m5iR43NtG9<;8&I< zEk}7ZsYek$z?7wU`lDTM_HM_v^|Qj(h8R2Ty#VBrCleCCu2M&j0q4kS@bBjJ$Qysw zYceiwROPHCc*gFGsdOz8f1_#~C&8>bri_z=GhN%+*;R&xKSoY_nM*H8%lgrNG-4x# z8DH_(w&}CTRHMP{4gML?ZgSb3ixx*#zwP?J*s=eO4Q&~NvFtJQf*6JedjE;K?6Bv~ zmjGxx=}alW(p$k7qvhxK_-lb--6U(XhX2~fV6wyXd;2q`iVpx(r3wPPi8Yw z+UDiR*wea6UkmJY;bd#1#-!C6p#{-v7M?D z(?K{*RWY)c3o{F)o;06P9Waek37mwxi^Bfi>L?`Ul>y7;&~U*1~VT({KQ&KkP~N?eJC-IDp$ z`N`4mwQ5;0o;2U2(~83Li`W7i?^pTb`TyVvhr)&Yy>QHMcG<2&sIAiMH|-a#Q>?@E z-Ibf=EvW1+Kgo!Xr3^{gYv85N>ZU0Bnr4Nw_!@8_4yj? z$x69e8qkTmoV=y^w4~lL%BsU7{&g)H%$o5tp6hZq0wQ;ndVkEm=05x{JA|V#-=LZwT^n z34mMGa-fk}VA-|F#6W5A_t(()2j{9vAxj`_`*YAIG0CBgm21@;Z>Tg4N-7j42abmc z@i!2RYW#}*I(MH`D$I;dxBNEZ#f|BGnDqL}JKp|2a~{npoeAX&C6V?snlF8U5umWA zi|ENz>EBZ2dOavtc?Y`l+&Yhe7#cJ4c5}lNDa~YBVz3dktkwr1rh9LW%>%x0hQOHiqi%ZfI$pZcEzR7~caS8UC~ zz``hd@W8P4zjt+IsuJpa(2IL8SsIujFyX4A&Bl5~&|CMK_l03{nLBfZxwuBE@kn5p z$4Mk>NQ%(hl>)Fe7cj(~W{Z`AO6ZBr>%ns~jv=u7QH8Q zf8}HWD|1)5lu&!C0P^%BP5Lm>ej>O58K@)G>nq#2b@WTeP!_$w%*OO+5{eDC?{3$U zDXn2x84fMk!@ce)J{U>SBQQU3{k#CS(UP3cE~++8?vx!oS%wOBGsnI3WW~v{0WBJx zG6Hguu6%R1w9Ng}r5&H|X@%RjA>rE#=P~S;LVOR~L>1R|wyA!nYi2QNM>o~N7m7Xf zX?Nr@m3zX9@ENmu&?&j4-SP28Bu}0KcDY5Vm-PZi&WwMgXj5?pGIIlE@|n4+!v@VZ z=>QaN^NNOuX%Tnlz%Ozg9?{6n3K#xE(gau0wGC>AT{F49&d9{{=>ja3>ZcDMb7?kl z4mD|Y0`q#JtPWb!+^L1@Jo;(GIK|<`8!L$|88xmrHV*{) z?bv!v$~B|zZY`Vatq##UGp@ivzyANP%R<64M-^USTgIps9#=kPTXy+V@Vnf;PneJ6 z-Xzv$BBRPAgW8clOr$WJNn86MgEr#(^4VP`T2>M51zBw7q)BrP-TWpX9z-J4z$x17 zkc!@)@_TF_33N4pYXk{Yz5L?h94d*jaS!dd80*lCF|6)^fh=OrQGF35v&vgonl6T| zeZ1A8icRUBLya5O-|>(3vszFE_hGDPDb#$)Dlb=eSC`w5*$?zzzK=w39w4E!D1tJ& zmuzpfQ|EvvenaB)tc03%Z$e;9@ zZ%@|SpPjuFjD6GTxHlIV5VgE)8k)!AWWSm8fX8EL4I2R{;tosBy2Nun{(kEZ zIJNTbw|9jx7nR7D*@TAHqpGfiLk6LqL2Et}EmVcnGQ@W^M$g=()csi%mWg8M7cJHo zLjkercNm}DSlQF_&_<6zc~K=(9zIhZW({~fqtIkUg&pIP6oIZ1tJb&PBhWANw>PPOnR7D37ptoXh{L(AQ~3Q#!nbft{ zEZg0O2e=NkVLvH}+R1#>lw^$ipq}*&fgLP!qYn>3LM=pe8eKDIA?z+uj61^21m3_vFH8gCVT0=+CNaUDPmU%Wfu28peBkQm7In{A6=Y;7^L3u1j;U8CD2Ui6oH9kIpj)snWFIC!hTS+IaPZpHICRUz! zGVQGdN;cqUL`8*?BBoEQI;#+5)Dp**+ncg6D?lEuo~Rm1TU#dz0?4<$onB&H@7tMX z?_CO`_bx1B&jU(<=UGKruJ7CF_FK*N+Sb-r#owJ6&aIct?axh?{bj$;2-MQ;6L1BNlysw8c!N&^4PgFL+g2MOb>+fB{uifXq@6Wc0V@+e8oPWpn>utaN zPDBYieLp+X&IH}wFSoxge@L))!P^MMkICteNi&w$W0|+(8+<}Szo(`=pTiW*Kf58A z1}}?-pNoXzFovDHZdcy7QHCFD%e_yFb-pQ8x39-}lxTwA_kw=+M^l92gMt$GuhV{C zj9+_Y4yOjEH{0x$DTF3%TT5=AwZWHGK|OEw;&2|+>jc0u<-P{ClR zB3jwOK+wVUs3?s{iAdq1CQQcns5?Q!uy-J?Hx%oM=JZPfq}uN+Q5M@}ecRs)>uy^f zU6u49uZ(`L6FHEbOiFE6t-Y65|*{9h;1KQ$IqdH||za z?TPm+mbjj=;&U8&PA1pv{Zh0cN%xu9epwOX=l-4|e@n5&Kw%qGya|x16oBH^3$|m{ zs3F$uIgVH$5bIGbrjZOGiZ8R)Gm-Qt-bsZ+ji>rijxS^wpwaxD8|k*@?&o-P&pav8 znm^ErRf>@%9_^-B?8z=G7o^2-h|v-hvgw>_4fZo^^FNXgCobDia|(1cJVl4qk{}k* zne61>+e-(Tm^wF_`zHeoIZ|{BI@7r%nZ8$-3es}0SpkRJCkbX0|I<+r)eZHU4 zjo%@LFW@);X%ct#&yDHN4NdTN!PkSN?_0sIzkMGQeSFAXH-~M$=WRbX?Q8FBu}Tr` z_+VG?$M5}hCkQd}e){`Wux}?2wigd@K?XO2?fd!jbnst$AQFG~^gTc4qPL%i>$d&+ zoZ9}F`o1Cj8k$!WUGs|JXm4KmIFN6tJAhY zdELGr`|})a^S@s-`RzdZ?vUB>ecTKQzBdVa{XFQoWU(AiKHJYe-#dgKpgp`n{b?sJ zg5SsAA3vV-zmeYG>b^bMU(n+_em(wt&G!rA_hFyhFA>>PI*-vYJUdAIUZ0Nupw+B>A*l}B87DRgF+y* zSR0_CG>M{Ce!Th3fuWQcYby*Y!<&Vn{xq?v?+B8yl6*yexmI@v7+Q30q*-KzGfks- zF@F^jOe|}qCK%);N)=53@W-LXm(b?Iq-63$vlP2Ktj85!SfZs0vG{a!+7ZMArrAi{ zNZC!;%3zPVFG?;Y24LnyjJlNhi-N-_%u0wuZ6+QbzGb0z1HY6Wd(w?ixIG|BMBsNUh(P!afR8c@t{j^E7E+N$s8}<=Ijp7!xG#j z!^T}YLzcCN6I3t67e33Rq+#6HQ2eFWZYmKImG{k`ouTIaG0w>lH zMYGtMwmhWn=H3GzuMV43>cy2Bl@1E5{PDR@SPG60?NA2@ObVr6Bv8_sFGJp2q zV-{2MnKh{S5gTZ>qP`x6Q5F3o{9eNRpay8^R5u1gVD+yzI_8@}*Khj1pTB*#dwm4o ziUh||J_^%DHGBN!iirS);!*hw>HAgxrqi;3c}D%delCcn-=k)h21Qpw0`e51h)a*h z{So0?0b$^1|8pIgM`b1uq7-H)7{PFAr0iEhbJnzWflt#Hor zu*)$mp{n1_)tl@L0ClBY??}qs&$N(Qe`UF45_Nq;p^EBiXyaUxO)uaG@(r|snm)O1 z4ak9eL;pJu@*a`y(EAC3+EF(@Tn-P_Y%Ea3XA&iWiHFU3{%=@dy>~52QWA0H1T=(C zu`p2F_l!`5SSk20ThEKbh&c!+nC)f{4@>tWr0dVFb#(lQ!IjhM9l#|ZZW!j1DgONJ znkKoc2t{3i-!n0MB}!ErqorQuVOI8yrmgy0_Ke1kvM-dWkn{YW|P@LTF%`2N?8WJ>&f}ow&1dTM3E>$IVEl%)+Xey zfkUpz@D#kk)UX}j8=fAAEk2>jWZY&EB!L`8frrdZbX3ZX;$h{t;Q=)+JC#aHNA9Ib zoQza;vrKpEerf~tKUcI>X!-9^^{54oa;Yqr&?L=?W&UJ#tf=COnUSRCxh+~fe5A^| zo)u)|TYEhqLIQDz}n7DDKJ*m>&w$Gz5kK7+OKVaA}$w_zjUaxNf z96gc{=&&q3%?MrQN^O!wQI@*y%O+$X9mz2Ik>A_3MUZ(S_&8{hw z4d3_6{7@uMG~FNPy_eBCK25_hJnCS(O9T`n5LUtdCKEfmXr%DLZZJPY`2>og_1*Q} z%k|#GZhpl3K&9`?zRxzYd%dn*bxnPjDfZ>~dJ&IR6`+@-8=^hM!rhF)xt8xY!|(Iy zl#6>YG4HDG3LKlhi^hrWftMF*x};#tv{Ny0j@vsI!)KS|{$uEA!wI|OksgTqL=i+B zG$ASfg7(qld}>baX59uoFlx2&{#Y?U65LAzKx4xb@7@APn2%vk*Bh{mr%A63qBHV< z-6;C*Ekhw$?TR|=L`Wix3!e;zLC$s})Tq@L5PPtwBr$pT$c9wtfWL!;rY1#i7aBs6 zSPs7+mrMujvEr-S9kD_cj#pHC3}2aCz>X)sQTi~V4?=@S?#JJVuJItt!N2ba%+|Oo zy0L_?Hbcs=(bEQ+>}9lm#UE0esQRv{CWEC;hP}{45#pL;m*jx;d)b)5Pd(U#jy)A? zvg}ehDU(VF*h!5aXmwxo#=>aSgNnH zy7&?Z?w0E}KxyDO(kmYI_xU0vqtBp2v{^l9r6LhP8$xKv_LHjZf!nuRIk8-)Pnu?c zP4P(;%Pd_qjvCPdoClkeHyuJC;JK31<0*Id@=F%?}?C2Nz@_E)?$dU}*AB{T(PtR6vE7L*V27s!>|FBpiU zuVKXxFsfAp4LbEvLDfluTQy)zgU>U~rqEu0v3}k_>IBAXv)sNx1hOP-B$KP$#|4Q_ zBU-45&JWwZC)@9Lzwh7ek<<^<-yhS45B)i;58t1C-)R<7P~HiCAAkL_RlC^H!AwR* zc(-n2zrVJ>c`yDUgR}?J8MbTeQseeJ!Lu1OM}!||-gKVVzNdZP8KN`>8)TgzF~UAv zfBd_KVm=+9*1JB6dDWx#Timy$;X&Xpb{JH=!0o%mUAL8C<~{>D&x{v%{Ce*5gJ}0# zJck9f4#9S|h2tp1ZMUVuR3hb3i)X?r%n!4&FIS`yb!3G+qEHSF$L&`}eZXEimsSa2 zBtC^@Tz|gM?{G)n*jc~eb-e`167n##ul|WKKCJ*^p*aC@9nMet2xLyG`Zh;^chPkC zgfFGn+Sil(Oubg@%GzC}&bYEFw)^ zmWdo+>F>K+eSq|anp|%fOCs`OO=s9`G#hBF6JB?AvC)L608W4Fv=e{m|8!PQ$Nq8X zH>~xbU#KMvJVk)+Pc(P7Z-jJFwgWYiJ7d2;a`^D@=7S8;X|VR5NT12YcTbY6rBnj>z({) z;Ey51Jip~8bzSd4U{cZ3A05dt4)mSaDE2>NjsF6|$n+8lHW6DWv|n4xq2XB}yq+$3 zogYq4Hay17o!pMmqwc4a?SLu{*%od6ewq`yUqhzS)gCG26MG$*eq!m4ishNclp}Jq zHW+7W(Jl)S$$`(AhU^7wCp4f2iI#XS=R!Z#$6+Fdw}Z@1q2oH)KazzC+{N9S^n!p=cZ%#;yapnI?=MvE*%N3kHz-qd}W z;Gdl}nekS4W#O%dQcjnz_C|{mQarSqAb4oOr-nG6J=DBE102=GAK?Nw0f^o|{XIE0 z#qNJ@L$-=E7NDVPgg}`MIvr!@kDNf>#{ng${o3%s$BJp3@cj}p2>DEnnqEq|x;_TR z#kfA3`cSUtWy`W_GNoa;o_FLlko2!cRRdJI$PIPjG#D%rRCNmIy-Ia?Z4@SL`zE}b z|HuIVG5Q%%qw`ZQQY)z)_aHsnrRrU~sjKz$S>L5P!|AYfNA;FJKhj67ewPO9DdZK- z++V>j2m8==B85A@Q(42xQg>_@@Ce%C;v!$xu(a5F2I)SUW zb|0&GpQ|e?=`bWz_M!cc$d{@H3rsA{1esWnA5&7(JPO>AH*d>*2A4=(78X1j4pzSw zPP=1b3DmW?NyvX@91RTOPKN~o{oe<=3!SM;xpT2!|F&Ow;oGz9O|zGzd3OYI5Y|tu zUa^|C*1Qu^rN7Yp$Kae3T4)11zrWsB!KI|9R2F*=b$h|X=wlP-sPs&={w@RiowxbQ zO3r8)zOOAu3JPUYt>80l4EAt#YE;sn7H_d)P)$^wui=B6^>jgHucYXYc(@^Zu?n&2(Pz|eXpgvDPo@Sl-Bv$6DiuH2PDVwvF`QqCShCUQ7oEzG zSdDrH)Gmns35eCK9aCJ!=$E?tPqVqF>#5-Urr>vQ{O!^)j`bV%2pFPaf!$40)GY`O zJNR7iU~MNAFaQNk%{TsM6Sq8i>Cw()ClUzc2m1-+1~oLI2sPtEQcOhiwL0@(p{EWq)qX@)kSb@p zn5{*{ptS--VTtM8&Rs@{{0ZOF&`z#ok$xr37&TOhj181}6wC-_0EuZ1W3S?#kVv0M zqtlxtygjMT@p2Pvvb|2YE!vs6>hT(~kV0qVFW2o3)ml^{I4*Z=rJ)*7-vUXg3Jwv& zr=jS&NbVAwm1_A^MJD=9NwLze<0ib;pgWu@-lKeg){2a^sfIhjA|xQ^6v41c(Y5NE-u* z0cZNxo|yIPAzd&3ks<;TzaRU)G!Y=^86QgkU~@n5>wBVee&@eG>7^1z7nOmQvAA|Q zw4oN@Ua+fF)#pdJ$3mVU>ev9{w?IE@Cau3VdGPN136&rgxS*=UI5(YDCpss@3)^iKGq3; zW?ZRcEn|>Hal~F% zv3FRNypV*>8L#t2kUFMS>)DomHFw=Dwwj92gsyR zIrI7CjI=WS)yzeRfQ z7%m8j&`uF!;{N3wcU49XS$F+uv64D+fCe%(W;CxM!D{A57W4+Y(TrHD(ZaGVv>wDJ z4D<{OJ7&^6) zN!nsZ7(^QdZijKLu3)D1YQHNL11Q5&QAl}Jc{eehDWVd_AzAWsbr>-oTT5b z7H-f;qWAI8c)B_aewZMH=_$rQcDV5ydn_PG0Mm<#EKzZ*fy5>N^-^*?92yjzK!PuF zpqFY-VlEYQm#@jI?F9p-POIC@%IcYc5Y}|0ZY^pJv=z7e|9AnYbcF91vX7h4P4=WC z&crOn=aq}xg;`seS`k2)d;#ypM1h7^qJ{xSjJVm^!R@gX0(JRU8?VGe%ish6VS=*$ z#w*{HvZE?=#|g_94Uf5mPX?Zcl<*`iREB?2$)W1|8UEn`eO~-&#DLcsT-W^(b_rh- z2(9DW_NTy8i7EpE;DwZH$Dr~Bcbg1Y@fuT9?DFBuL-3bF`Gjzjg`9UDn^dsE^H-ay z0;uIY37C-*)j3BI#e5aoR`!86lz7iso~T6ntH5IqhW4b~8u2BQP#QqDy~m;Ts#I;&9S)Hx z*ahe25wL}YU;iVR37}cMnG+RgJgW*msv_lfr|axWF~K5BMV+E4q58dzT!;Tu#>z1n zT5P60q485FH?tsrTa34GaB#=0?vwFEg4!TbwRZ9_iW!t<2pfP=Wf{;Pej7}<1FIGm zjR#NYA3FkV;8Rj|Fm(X`O017wK=`G66tR#f)ON6;mUHT+-}PxP1Zt`@GcdvlEM8A}rZLzk*o}pV1`ZtLTrUF&QC^0H^<2>VV-&N;% zW=yvJhL<$H2P;57#e?3;I>Nf3Om>5oBJu6wL$r;eJP_ z##kke)HOz%0Tem+yKPFHBB)WhlT+axzStpcmj|@L4|@%j-qdUG%wg2}dGJ$JHG;^2 zpp_C_$T97Pgb)j*Jf}Vvmwmj+BbaCc-tD9RrGV5mS@t43(H=zuAO<0IpiCfzj(Y%x zsf=0pL?|kV1syJ>m6FeZs)SW^6-gKAt4plXZy|hfxI&7Rf5OrsPC<;NK*QAcSlli` zD`J~i84it1{4%wj&3&^MC|-2yS~7IQVc{Idq>A*=D8*EaEcJ0fWk_hM(?Lame_OaZ zZIuc2Sd22pcxpoMSQoekjh-E_#WE(6yOVi+RWH4MaGSB&6<@8XF4q%d z6(#rz$IXa?tc z*nXP&PT&(Q3LEQQl2zVN!>cm$Ubvfp@AZ^EN^FiS((71*r^2HxF**{}L~oONyM}}9 zI^}Slk<*31DmKBjH=uH>!&mx1E`(MoE-z+M`pXge60EeiL(1cfWtZTovVw$jbQr0F zswm@V1tnN&wsO5WXixl)L%f`fP0lb%2RSsFV(Vje*yKsK$2%fEM~nJ{C!G3*0d&-? zC)S7sKqM;Rb?Azf1)s+Z+GC9FEf~yNbHB-1@g7U!Z^+Ql#BSWJb}4mXyGdcfxqfK{ z<-l@3uxFq!N2+leIrE&;uK!c?Fc1v6+C7XsoAl{h*;FF7Yc5mH&Mu%Eul zrU?@Fg*YzY#c+e(xN(s^iwX*GA?c#*;GaxG!6~F#3g7PJi5yM{@V`ZY3Z>C<&1kST zXE-sk!J{0XFt`G7{`$|DrcpHzS+3Y*uyNiPUFg)G_kt^jY;OmCFeq3rsK)R8_qY8P z^%^}Ymu#^s2&FQHc43en0z725(+ANExd3H{LPw?x-Xs@gs6sJv@|a(a>)b%>VUb)P`x+o z8OepHUsr==#CDf93X1RF8F{bR=#cf5;Bi06-yq8FQ?>^CCBkJRyFwwZ575V6ea~Ln zGt@xCwb5(pN2CHT!W}1);pvPZnXFig1&=C;`Zgap9<0GxJVxd-n9jh&JMK{%|7dVP z4fHCtPN~$Y9|>l|7pQk?-{+6B_T-5Sl(zE9PZ65g@uy@}@bU?9*$k%8Z6t+byh3aQ zw}Q8TfO=Gn;$o-#M6D}NUngKU3NwV*tU>kT; z%^q&lZts!tcPz&^lrWeC*_>-}3{`^)6U%YTkQ?5gZTQI{bBw-TYeIyZLz2a#r;mhD z%?`~erjXxm(QdFxxI`ePk-lTk9o)s(X6rxxi{mO8MUx7{%oBTMGp$Ng> zoO;sP?)c4E^gd25i*02eg#dGZmT^)q&3B5W!`IpG`*D9%+&Yy*MKOhxSQ0X|1@cdiOJnc3@m?5)IeZibjHOh zWfW*N4HvpU!w?AgoQtW>Ix-k4Wu*U64~zYZEdI5?#mi&7cGDn`z+pCLx;>m$=_#fn zy1(~QTRAw(XDvXmnx^^$mOWQ=#ngiu>-1VE7`@@2<`7b|0E8&iOoEzlJBI~fkA)^L zgc}A?41ASN&Cy@3Hxw7}xAdB+ka+bEczc~;Uv9=YmrXc}D~CS=Iwq!rQjkl3IPgv^ zPUEP;C+Jq-=6e7yq3RMl26cKOX0^{P1?$oa+Y=}WD4&-&z=7zdV{30lOt@_tx*LQI zFmZxFrI>`%4PcJQ?h$EN_`zwi$2j(_6Y;}KyWv}4%UCkrI8Ub&Eg1;%i9Om&8d9^Q0o(ShaY;5|#8|9w_ z`N!D1SG*xkOqF>+JJdvz}Q=bMv8;Wxo&k6LKOR6@XhH1(xN1! zqGrCNA?(3ulBWUX?UL)@|MLYSvLm*@6?uA{We>Se%=ZT-@!AL z2cMhW;F-{YY5~^t41P{;uFOK3%qZujACQfPHk1Qo&8Kx|`V8ac!gT;!d=S;P74lbW$jot7;vAJ?AZZWyQWEYE*8j)&& zB2hVyItiD6xgP-LIV#(<_S9SJBYx-o!=V&MzGQldz8(xefk4aYuQz5JyGPI52`pA{ z9Uw9}Que*8-^qlX#yzUI8MeJK=pJ@~$+U&`8Y|WWdWaYZ651uv*7(aO{g5jA&Ti3O z4oR=aqWw35!lvK>sw0Bvj@33ihlPNpDYX5)sb&3EY%uUlUTAW0L_6;9jkSK(V$zb{ z-OW~~DW_1VQ$}dz@K@3t^FNhZCWFMvumtHw#3Ex>?gJX_l0ljUb8y7hWU8pIIds_e zSgk{ACA>V&Iu!D)V$Q=4|j1oKK>?UGF}SBiIvVYQnV zzQb%AN^G3XRQxV?TQrJnez&V^kES1t!^Ce)jqO&40r~-Qtn4Z{B&fO109yay=HQ}$ z+nKU6{^RM27ple9%eo^*1?#T3SWO+HPvFSh+e1GOUEQGINB3N2gj*p&P;!`Q{74xiF9blRhxdnK#u2- z78V(*wuC#lgyUG$OKkG5PYwHX zfwIZ|XL0w3Y59W)1w=qclkdkFZ#;*LTdX;dv`05{XBU~X|jG#e# z{bLrGI}zjXluCHn2Ve*qXDDnY_7$)3T5B_#KydlyS72h?_sdfYGN*oKP{oY(EY|^= zXnUszP~=WsWTqLx?XY@tus__UIuktM{+X+DQ0^6{OUsZB6xIZdhx}47LjkzEisDCnmbb)OU!!mQ^+Nf4-ST-M?v-iiAMDt7Fu$jZ!G>&wc|P0sY+sE}3BvVNnBe4XCS2C!)i7C%1Z**oFi zwdUzprQKllWjr1&h+!$or+IRon&~BAqr#xM={Ge z6C;~;4!`@QB)jyk@$yzM$)ZMdeAtKzU@g2x-?FO;5bpNvvj@g*h8$O>F9II|y?0+$ z(B?X7bymkuR8JK26+b8(*^Kxv6y42Ph^P?Fh6%ySc5Bw-tjK(G-6jnqkKaNr!XZS5 zoImr#5frMOKl`6V=3E-fwBQkXv3&YlIT-nc`b!f(bdIZSd+b6t-{=DfkW znlI;6g-%-`K+(G4a%>+)=LqJ`A9(zD4QSs`yz0(h<=6m_ElIhy%|a4kAT=UjJGd9DZX>bRnG-R4ne}Wnkee&PV(0YBZ z((zz0nQpG(*D92}mBpgkY}Des$sDE|F>dNfG-4@1sX*(We?-;rkJ_FSQ#u_F{6guC{)5ypZUvuiAA<>QD zrAlf^ghw&#rP!igs!6ykHtYL~%2eT624+RwbryRy0kVg44jyyad8namke=E4#Zfi8 z!F>bw?CjZXP=53eP-HN>+_%+OQQ)JwL*uL5`scB7?S_b40R)aswyg z!-Y070EUq%Aq=zn5*B`#P$bF4UYzi$r17M)T;PR2E`+TwPzg_tX6&|twsY(vM)*s; zRr=j!JoEXW&v7NkshY%M27-C^ne;H3>UH97n66{mE$s7h50X~yly4uvrVT#Q&XgJ+^y(=D4%sVHk8e_ z@w;6x8NPT;Uvo(O@6jpPGCSVy*oIwrb+e=ou!z8YBv(|P(NOfR^!5km!7{M%}M)a`|6e>b`fjS z>Cy?BzPnHt?Y|(r0e>hNXJ#V+XyjCi4P)pef!1IIAu_~Sp!12J8S`k0vhZYK`XpdhXr5JZas4NaZG2cewJkeWj5#+xXsNXtrI>cnl^A z35>U$GUU zuU*K%9KAh^N)^j33NT54p&0!{^K{^?)jyS8ab>SHd5&y%)dExQwKT>i;{T1VMmi4$ z3oT=QIHve_HEA8w%Ep!6Qfd0Zd3IKzV#DrSg@}MJ&u4^GG_(EOdmxJ}PfUvUnCvzO zzg67@7O<|IMja--HJQ!A>1#AqUsO`1rJo?OR;5)>md4SKi1p@Q;&PpcX{FVwmuLrz z%VCl6L*dVry+W(m{j&HK(ODJ32qiH6!uz?p+4d{O(mjV#`B$mdIm^oE8)k;Ie2o2%uP_)`;GUW(G**)n-Al@nIIU45_Y~%8XHOJTl$5;9<8uu6&_VH46%h z%ULRqaX)mYg!-8^nub1E6q)5Q&T+9^t=?^Qt<|oj!dONvvA)3NqM=fuOnzUPH)-?Y zK+S>8=|G+UE$G;*^9CW=kRX8BVu?mFO({lF8CvZj&5E!&d#zNlR7$HXHRfh^pc{@77u0A2|AvI zQ=>_c1hYD5z2&6yFeaKYeW$8e0Dvi_~O@`92P~6c7Ri+^82-ZJul& z8^*&yco%$n;;+U)wmg^yNNp=1b12xFGM#Oh$B8LU)to;tzL=BR9Q7Y=+AlO`Ccj1h zo&*3=+auD_WaXcyN2Zesi)THFNM4dSz`|&K0>xo$@Iw{-JgmvV=@B`|G=CNvSn8ta z$x`}<3SMT-Rtp2g%aH<_Oc@f)Y|S`L#DMb{3Ohf43fn!;(w03wTFA>p;HPS*WopK8 zhiU-b$^qa(E?3p>EjIN7EEMKr2NgfWeX-dvh&;Z3$M>`6dT@eL3AXZPK~k73WVz|g__0~cA~e); zqjoX2kPv&fZ}}S(mwRahaz($%BlhztBsOs5$&hUCOb=-$ITh_3@TtZEA zI!-Z?ZqAt;*hWp}^K<yKR=%}}+B*AFsr1y)a7!ROBIb)NlU(`L)G{%}0qVRk8%&vg^Ipz2rDt-#F2Rkn7I zeUgDUp(8mmiZbQW?-sT!5>BDyA{CPzyGbww752Q>M^tnEXg#1iI9qvK-d%CIGQIWOtyi#B zY7;@N%U`Y2dJNu%`o7)GY_~v!(_9ByUJ(ewW-Am;BEsJ|)3qJe!x-L6LsgBN8Gj9) z-1zL2*c7i4TP;_v^ju2pL_~q2Q%CEaIs*O-{Jh+4T>JKZoMtX8zcVixo7R++!s}Jk zFQbzy)fX`Ewpo8{!SPw>^tXtS$eN0UVluvzDV)rtaam5smZcw_*cYl*aX}Y`{fp95 zZ8<}WrjK{Y%X*MdRclZY<~&Rgk3a4SikcTXD7AnDjAQgJKwjJIDyq1gWMw8rQsW2} zX|-q|t+bK)bTmtB4k<*rFk3=6j*5=FeA2JHeIn$Gq`Ks{E|mj0cKnzs;t%`6!?Z&i zVZetq>_MmtB$W~xE=M)BvXb)pzN@8Jj7ENeOV%z(uL}(|1HN8D0R`Dw!vw3hY?13o z(igFezOSc8(R08U&t$xB06ll5i4J%qa!!wwe-;{hV6AZR%m>%)zojMmd{p&sC%Qc| z3IdWEI39@x?_jD3oQS;U?^JlOc)bnftF-us^KY%wohiMR(RF)_957d3AEg0!t&z8Q zvwBSpjX}LHBVIhjLU{~a;&Stg1?BkXJC(iehjd$y%LC*PtQFXcCYmD%P!ve6Yzo*7 z#SAVX?S_o^O(RRD;q}YB>&iKkHmKB`=nyy(sQ8n_Dd^hVmBAfVtiPJVWlqLvZz$Py z!;z0)|D6L5y1j9@0C09qiCi1A?qpHF!=db-4+w7D*s+E5bbxkxv+L0BgOk5?R198J;n81b`J{iYY4OUQ2xpd`eeJg{bGq&R zqI8KH058AoV$zk_O^KWC-W?$U(nAIG_E~Rye=f;wgV2dnU0_egb#id6*!(OH(w%%t zgZN}X^f>;=`yez09EcEj%*$-)`jD8x5l(crr}##|Rb%$b*Q2Oi1T(XT8%sL&n@L3# z$F^%<1gS&-h*7 z?K-cu{on}HNLD;VHKS{9M|AJJ=L=nrv*88VK&9OCZ>>X_nWTwwk_cJdrv1(ZSxw*Z z^$t9r!!YX^fQVV{O&q+!@v?E`ZE{@GYIWza_qqx?_7yFP+Y@hCo&^LW=%=^J8#?7YD%xSRL+ILcw5TS~e1Y9HxjX?Ek1y|nQ_SqXHl zD4S-xUf*S#V|AC=fv)FRk%a)s^GIL(F#Y*VG=KW$ILgIJ)zT-Q*94C2&1xKPVU}<^ z!!};}&<>7Ej<%$gCRU{*;O!t6>pXKa>2qUP%2My3kS zBhfq(g&nv2!^e7=YPxk`KeZkoo)*;nW3E2X&7UTj)JbkzD(;vF*b3);`r8Mv-S@S> z&>UH|RDQ7P4wyFCG@z7R#EtSL99B+3@0cQV)G%j*VEpD<%(B+g+R=%juAK)s(Ao)} zvtj1gp7T?#R92yU{6-g0SdiSPPZdr}Zv?X>wL)4F@n)S(9#-A3@N;WC31aS|hksz}^S@HD*wufWv03CN-i_pt3czO1~Pd&-_@g zCoB%t+Ykj3cD+Da05>x+0Jy9x-(cM(0OhJSs}ofl00Z_U_pk{t?Me1;Xm^e;^N=Sq zrSVVAmK0$NXs*Jh7pQ%F9onG%BuRCYMa<5jPBOoTMsV%K;qu)04aw9~=VZNh+k1p+ zwJjll?X#bfB@FRUEU-{uRXO9T{(9qMBzw!?sDRnJpWSO9;BVW=UvH*ynk*KOo+Nku zbo6|5WJtM{1AI->tS8?1n_ew4i!5T=fyK3z-Kw7H;4>CIvCNRPF=I;^8exj6v$4$- zq_qgwZ37hJEv1_+pF2&;KJ*&}K=9iV(k5&mT@6%575Naiz zT2(M~UWbI2Ic!mf0uFfG{heN+<9r7~l}yV3m{z*L-bus0RGXVqZ-o)`)h)aAIJ=;! z$t%voY`HalRMUD0M0(q)N;+Df9gugD-F=N!)5VFpp8y-H!8+)&UjF8w|L<#-riJ(Z z5p}e9Jaeu<1fFnGB^7H%?Ik>dw$*81_1swUh&>ANG2iV*9@o!}D_8LSrtOZDmcI&I zh$QIiTRBDR9}*tP)y;5ix)&Y$L*#F)8Z)m@>9+t*Lp=VS5YO!;5>g-x&28O6-Sim+ z*;Jxt&Lr4yJd@$Or(V+YolZr|?Fio_ITW^E?0H>cxcResu$Y&U)pD2qz?M!7G3rAL zrqyQsLd$i99G%H%yvQHw@Q_izk>>(w{b1RmDZ^4Q+LpehG&UfUPUs!<&8QsN*q363 z{*kQOv)`y(Q3|Lyk_K+PQj+-@MMYb()BVGg(}V?{Z?OZOe`++UZ#<|a`ng>IG{Qh~ zs`K{iGi*}*67NAu^x2IoXP_An6v@*7SR;Do&Z_@C7+j{2-XW3*n!>9#8H-W95WpPt)Ot#+PyDbpt7a=LF0`Gqmz*T|^@o3NF4%6om zf(@@#)>^(_Pc!4ahu{lzJ}JvoqjOvByM`f1!uSjoLd>ewYG_@9c~OSW6?(s`kzt6@jD}!YuKBGK-pyYfcI9*zydy4DAJxUKQ)&GoP=_ z-G;4t&WHlUrPea;3tA_(7-o)|fN$bzus>Y4jawFzq!FjMm~iQsWZnwusY^#iX1&b& zgn<)Ng8&zX*~?@BCFywPvzqwk9l!+nMGON8^NAeUAtC!T_{Fu(Mx**Rnph*x}#a+_83b=v$+PF;;;U zJorh~`gXHjLqMcQrD~-)X~kH?6fpnG5cytKWvxQ3^?ID5`?X#{d*Z9*4xRl-Vjf&xJEjJ7 zx)=BPq}rK?_h#F95~BU_tU`daL&Ti7;S+v2v$@vuro7@XnkG{t)-AZUe|sNg+92m( z-+ciUvwBB<^lve*8QpkB-SzyUrh7mB$#f{oq+AeT9p8UFkw%uiCVNH4og@EeN0bj@ zxM=xUNXaTElbm!wqV<lJg>6(;4FW?FXvh>~T9|+xFDO=5t(T>XQDa^_wK6>-b)>Wb?;f!6pz8GuEJ- z(dRI5#^Xi(*`kgH1_sxd!}Kh4y=$L4mb;4i%5Iz}>A;_m`Up(90u6K@VZ8`zTEW${ zis$H$5U9eTw8d91o0c<(@5_(t22Lp48FQ0W0s6RSPi;rBwSsP7nx!e)GU@2*RV5MN zE4vIFl(8$S-R%tFhS~I=;2cm~3~lHxR^eyFQZ(ft+e${*yD7hKe{+!nlSz?3 z%}gqF$1allm`?QPaB@D&n!v0JIFi|bt4>Upt5VG~>2~-5@_4&?EQ`48hPC$rqL@kz z87@TE{N*)=G~)9SyM~A+a*f(JX9A^-L}Ksi^7rpg7yeeGnt*_oN#GLwsCp!&h5PHw zk`0GzIGIWrTL`m<2C$~3HK5+95LMNd$5L2JZ6=2yV}q`xHu#Y)U<7-Vwk4)qN`!^M zFd35RQUI>lUtvxzSE5~wTcA9QG*RjuEnovc-@r8Z|^8O7&W?5Dz^i z>1>K@!gV?QPSqpB!*)O}RA@x)D_QU;Q$YDKyZ&l=_MA+hjiymTXb;y-6Dqzg2Isr% z#HBXP)|}9ta{G^yQ5fgaVGU^y@^q4Tw`ih|nB6dUePc~E!a5{6q)&NLXji%t7yjfd z$7B-t?gO{;f71n!Ku|r1sZ6M!L5Lvnh6G57HO>K`#fMGpQBRtoG<#(oLTD`Rd1ry+ zQT8quWW7lo?}-4ofrKmr{lkSH^&CCAa;-U>zH)C$A;{%I&6cMqVw!? zt~(tLIIw2eqvX8^A6IKwvf%ih9ayt4LH_y>E?9)Axh$XpM+~^cB4Jqq{+MV`J`{UkfU6oBp;{RCWFkxAc zG2t>&C?p6`45r3-cd=JgKqP6^Q$o{alekRc;kuj5Y? zQ-PdupQC%-I7KG2U{Vx60>NHRu2e4`7W(7)lp>@Z zxR`0`)fB2<<7w_>?-em}8USSO>0IjShGw)UYWe8`C7fq9$*LkS@JYVga8c8b~7RS}vTT<7>kGIt@;b}WBadkw==n-X7vX#mR>9Hgg>ZrPc#0gEV$9NwA<$<=mx zz`vQ@Y|Oo30Z@y18dA9!|5id+CW;#^O=f#mM)~{CHa(UA23@A}0-AL;ixi}8z>cl6 zitw;6kc;z_g3hR8v%*1|T1deZ0$;OEWJS-_>4;N;pJQOC&vYBng69uLC4PnorfQvG z5WppLiToQFOZfO2l!u`m|7 zjl6eH{>Y}FBkIT~ghibp&#~t{WV}@E1bF5y_3R@AIQFrWx6<<@Db;$x;bvy$o-Q-o z`OXcJVCfs5eO1PqF_yJ{*}~A*4Dh;)=4vyduV@w9G1OSO03gEiSs}QM*u(y{Zzf|P z?+2@9PsoXqmy3|L5$^k|#oFU`;bjwwXCg64+n)DlcL0v3i$r5>?yd_gZ93)_IS2Y( z{#JR>6VE4+scS6ovd;0aG_J{F)72PWYyfB3_cn= z?|BGH)H``}q9WbV*WV$^+Ih|bhD;;c+CobHl`K}0$BfrKpD6KUk|4i{D%suw@~Bom zQY_hc;_W&KC1>31V`P$BL#7ZnUH4F8nwf+*_B84P2jYepQFgb5A+R9RisNd9{*rOP1~S2+&ei|L(jcNnXA{^h|ei%nakjIKwuJ5xGvgZV$s5nk*K+Bkt|!cfOS@1&ASQAkVAWGVZ9M z0uW%{w#i!jA0xKLf*IhEQ}A#M1emB!u_)8RDvW;xzJS))D42)omwFb^OruMdo+_cN zb~1vqXGT|;W@f;An`6(UuEoYiC5N3*%=3YM)F~#bYxqMW1fAqG^ng0OI`C={GrFUQ znk&Q$H$LOprW3-Xf{UE+o5pj#1WABcIR3GX`!9Svb1V=87}zxY{3I-mQ2u%Put@KW zAkyuP7C{^fS5%f=Wl)HqAiEIFJf!07NOG{VrF3$Jxef$ptoF9Jfil8dgh=zd+PMr) zZLNO8Y8FYs5e<~H=&9OU;gQAdr=o9P5Mb43a9%X*W4Q}P)mndobEP=Uz4FbBj=0ux1aKHC96KyRXxD)tF`5KS+0r*y0INX6pm%mvK6=pc z+!F)dpc1f~-)gut3KiQIq?S}sM};OAL~fp&(a1%kj$2|Ct0RYF#UoOD{Q3=j^0*!! za^EZGz)szR8RiZ7Me%((D8=~F$yTq6=8l#eya=*Gd2jcyuH6kLU|MVmae#ffmrYsl z6Y4rbD>v-639iE7m3D*Ego5XR104|L`~VpF({x2knaig+fK(q6O0UH8L1_=o{!kLf zJOCI9Hh4vPPiL-iv$F59I^fnG^?ZeP|2!^@Y?BHHTK2_Z@j6cA_!?8- zH~WuG{6ZC^S9Gj-EF(6vZafd`cD{Q<`CNaBhfh~@eb!z&_nIQ!6WeHup)Q`;D}UKX zA2wT`y+|9)4@%(Po&nnpWOmY zr?H#*X+y^|&a36`yTeAc=aP{roWgnN3gUfeo+vzK%K)K;?n!AqGqgikIU4H&jFj3 z({ftb?m^7X*RCjU%Nt-vPev2HXdjeuJ_+mEO#S`qM$J#Vs*YFR;ZPZy*ZVQw*J}xT z#bjOF`&b%`#mx97EXv)3t{eNbHm|O;-cGk*=!{0g`}qUwx@k!I9A2At zMvnW*$Iqu=&ex{EHscw`o9a}a$CQ<>JzSjjjV>!sY~Hod7o0*p%?8GcPA1upIa_Zig3!a2;k+^|C!E<@0dRv0Jic`3 zTq>-&TThpXkj2k~C{EbcPG6&QqY&y(uwe9B7@33&54490w>e~hqpJ~RU11+m(<&lI zH8LKD>`y07g7H#RJ zY7l*8^$cWA1Y@H*nCWoR`;;(8b+bcK&Qf0of@h?=g??v9YIC=!pE1nou>{#SC7d&4 z9gpmDUW;?$VCyc#4NQnc-}q=&V;#EO-i@2~t1vRWn4zuQZ2K;iXjCuqNh|6TO?dR( zGIT&-j<@RgBWqSgIE$DGDZRhL9uLP#JZS##VQS>P-t&D>^rm9|fG*q=Z100K^GV{u zu8433r@>?*@`$cGd4UCj4}j5GAJ3!oizZX`WkW`vG_vHk-=eq;Bh69I3Oo9gc6g)u zI6sftFFJO^XOa6~waS#R&=)GSADhMDxc5VeV2U`b!G&0xZYx`BawNLb7?{Vcc6Mf} zfIGoN1;4FCFVJuQWsw&>>J#$@8oZjY0qB_9x~7uVCKCrzm-L^(ELXmI=L!)m5}7ih zxPs-t>$geo7u~wM%duYVXe}EnoP?Pal_r_u&A;yvGc9|+Y_IK)(E?ekooRL&QBR@x z^#NHvX-Jnj42*0bZ&pr=B{EiPiHG)zDo;+&`i$-^RzByIuAI(?>nzV_hJ$OkcAOpG zNBC4)n%8Pv3|I9^eUHq-F=vq<~L9PARPx8120pVMPauSJ(K9JZ4g;PEpJINrO% zKw0h~)f18v?1mR7aqygBgNeDoP%B_voC0RkmG@L1)XAyv?oLx9b%|I@gfGgKv=(^X3+&WEDcj0_!-BccTBEF-hz~aw&aadw|GFrwFFVO z>NRhUeJr{){2uJY9wlaha37{0GyxTiwKwbq@rvc*G6F9Ms+EfLIeX5_CU*Q>!}q%q zJjdU%n`4TOBQzb*?S$RE+c&9XrfC2Z7~?gEMbxP0a2|d1F=F&@Nva7K-slB!%emP* z-TcWSm2CVO)R8<*2XnJYE$c9*1rz#67tmrfOKVg|Ipb~1Gx{ZnN$)ja2r}z|XYiu* z=;N*kfInCmmJ%Sv5Ml~ocO0x!`ACxEe$v3?pIz`ma^wJ+=WSkk#-CDe8L6F?sPp98 zGhUxNGjuVG5E<>JPM5+pO+S$S*fuRen~Q60wr%g28s1xGF;Ha>1gn35I02&1=DqaO z{Yy$8zVU>&TWcfwpj6)sV(? z0Zu1kbX#0JdG_(MPKofeR@n(K_c7O8lngS@V0WQAi}?{oz_ny_7${8|Lvxr&j7%eu ze@uw!iTp7jCdKqbfP9T1knPxj(3VT%+C$8pn5fZ0D)ZRYdUb~n>j%&zMsqX!xB^{@ zf;AHqG9g(Wv96)u-LMzDa3v|_eKZ+OW&e_haF+>EK58AamBlNn(=*t7%FK!Z)mK!TCOKOT%%0A6jkCL{VMpotA2gJ|{bK4UOs^ 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 >S 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 Date: Sat, 15 Feb 2025 09:10:50 -0700 Subject: [PATCH 12/32] most updates completed --- README.md | 63 ++++++++++++++++++++++++------------------------------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 73dcf16..6655c4c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ Arduino Library for the SparkFun Pulsed Coherent Radar Sensor -https://github.com/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library ![License](https://img.shields.io/github/license/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library) ![Release](https://img.shields.io/github/v/release/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library) ![Release Date](https://img.shields.io/github/release-date/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library) @@ -14,63 +13,55 @@ https://github.com/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library ![GitHub issues](https://img.shields.io/github/issues/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library) -The [SparkFun Qwiic Soil Moisture Sensor (SEN-17731)](https://www.sparkfun.com/sparkfun-qwiic-soil-moisture-sensor.html) is a simple breakout for measuring the moisture in soil and similar materials. The soil moisture sensor is pretty straightforward to use. The two large, exposed pads function as probes for the sensor, together acting as a variable resistor. The more water that is in the soil means the better the conductivity between the pads will be, resulting in a lower resistance and a higher SIG out. +The [SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (SEN-24540)](https://www.sparkfun.com/sparkfun-pulsed-coherent-radar-sensor-acconeer-xm125-qwiic.html) brings powerful 60 GHz radar technology to your projects. This sensor isn't limited to surface detection; it can see through walls, cabinets, and even pockets (depending on the material), making it perfect for unique applications. Measure distances with millimeter precision, detect motion, the speed of an object, or even gestures! -Looking for the board that matches this library - pick up a [SparkFun Qwiic Soil Moisture Sensor (SEN-17731)](https://www.sparkfun.com/sparkfun-qwiic-soil-moisture-sensor.html) at www.sparkfun.com. +The XM125 boasts an impressive range of up to 20 meters, allowing you to create long-range sensing projects. The actual measurable distance is dependent on the object size, shape, dielectric properties, and lens (e.g. water level measurements up to 20 meters with lens utilization, human presence detection up to 7 meters with lens-free utilization). Despite its power, the sensor has remarkably low in power consumption, which is ideal for battery-powered applications. The real magic lies in the sensor's ability to do more than measure distance; the XM125 can differentiate between stationary objects and moving targets using pulsed coherent radar. This means you can sense an object's presence and how fast something is moving! +Looking for the board that matches this library - pick up a [SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (Qwiic)](https://www.sparkfun.com/sparkfun-pulsed-coherent-radar-sensor-acconeer-xm125-qwiic.html) at www.sparkfun.com. +## Functionality +The SparkFun Pulsed Coherent Radar sensor can run as an I2C client device, or as a standalone development board. This library is used when the sensor is operating as a standalone I2C device. +When running as a I2C client device, the Acconeer XM125 is loaded with a specific firmware application from Acconeer. +The *SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125* comes with the ***Presence Detector*** firmware loaded, which is accessible using the ***Presence*** focused methods in this library. +This library also supports the ***Distance Detection*** application firmware from Acconeer. To enable this functionally, the ***Distance Detection*** firmware must be loaded onto the *SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125* board. The firmware is available from [Acconeer](https://developer.acconeer.com/home/a121-docs-software/xm125-xe125/) as part of the XM125/A121 SDK. The files are located in the `out/` folder - with naming patter of `i2c_*_detector.bin`. Install instructions are noted in our [Hook Up Guide](https://docs.sparkfun.com/SparkFun_Qwiic_Pulsed_Radar_Sensor_XM125/introduction/) for the product. -SparkFun XM125 A121 Arduino Library -======================================== +This library provides a extensive interface that enables the following functionality/interaction with the SparkFun Pulsed Coherent Radar Sensor when the sensor is operating as an I2C sensor device: -[![SparkFun Pulsed Coherent Radar Sensor – Acconeer XM125 (Qwiic)](https://cdn.sparkfun.com/r/600-600/assets/parts/2/4/8/6/5/SEN-24540-Pulsed-Coherent-Radar-Sensor-Feature.jpg)](https://www.sparkfun.com/products/24540) +|Function|Firmware| +|---|---| +|Distance Detection | `i2c_distance_detector` | +|Presence Detection | `i2c_presence_detector` | -[*SparkFun Pulsed Coherent Radar Sensor – Acconeer XM125 (Qwiic) (SEN-24540)*](https://www.sparkfun.com/products/24540) +## General Use -This is the SparkFun library for the Acconeer Entry+ Module XM125 with the A121 60GHz Pulsed Coherent Radar sensor and I2C interface. +### TO DO -Repository Contents -------------------- +## Examples -* **/examples** - Example sketches for the library (.ino). Run these from the Arduino IDE. -* **/src** - Source files for the library (.cpp, .h). -* **/Documentation** - Datasheet and application note for the XM125 and A121. -* **keywords.txt** - Keywords from this library that will be highlighted in the Arduino IDE. -* **library.properties** - General library properties for the Arduino package manager. -* **[CONTRIBUTING.md](./CONTRIBUTING.md)** - guidance on how to contribute to this library. +The following examples are provided with the library +- [Basic Readings](examples/Example_01_BasicReadings/Example_01_BasicReadings.ino) - Setup and read the soil moisture from the sensor +- [Readings and LED](examples/Example_02_ReadingsAndLED/Example_02_ReadingsAndLED.ino) - Flash the sensor LED when reading the moisture value +- [LED Flash Based on Moisture Percentage](examples/Example_03_LEDFlashMoisture/Example_03_LEDFlashMoisture.ino) - Vary the sensor LED flash rate based on the moisture percent sensed. The flash rate increases the drier the sensed value -Documentation --------------- +## Documentation -* **[Installing an Arduino Library Guide](https://learn.sparkfun.com/tutorials/installing-an-arduino-library)** - Basic information on how to install an Arduino library. -* **[Hookup Guide](https://docs.sparkfun.com/SparkFun_Qwiic_Pulsed_Radar_Sensor_XM125)** - Basic hookup guide for the SparkFUn Qwiic Pulsed Coherent Radar Sensor - XM125. -* **[Product Repository](https://github.com/sparkfun/SparkFun_Qwiic_Pulsed_Radar_Sensor_XM125)** - Main repository for the SparkFun Qwiic XM125 (including hardware files) +The full API and use documentation for this library is provided [here](docs.sparkfun.com/SparkFun_Qwiic_XM125_Arduino_Library/). For a quick reference, the main methods available in the library are listed [here](https://docs.sparkfun.com/SparkFun_Qwiic_XM125_Arduino_Library/functions.html). +Curious about the hardware this board works with - visit the SparkFun Pulsed Coherent Radar Sensor [hardware repository](https://github.com/sparkfun/SparkFun_Qwiic_Pulsed_Radar_Sensor_XM125). -Products that use this Library ---------------------------------- +The Hookup Guide for the SparkFun Qwiic Soil Moisture Sensor is available [here](https://docs.sparkfun.com/SparkFun_Qwiic_Pulsed_Radar_Sensor_XM125/introduction/). -* [*SEN-24540*](https://www.sparkfun.com/products/24540) +## License Information +This product is ***open source***! -License Information -------------------- +This product is licensed using the [MIT Open Source License](https://opensource.org/license/mit). -This product is _**open source**_! -Please review the LICENSE.md file for license information. - -If you have any questions or concerns on licensing, please contact technical support on our [SparkFun forums](https://forum.sparkfun.com/viewforum.php?f=152). - -Distributed as-is; no warranty is given. - -- Your friends at SparkFun. - -__ From 8a88fd724bc005679ccb9b6e0d6347b39738669f Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 09:25:43 -0700 Subject: [PATCH 13/32] added examples --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6655c4c..55a1d80 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,18 @@ This library provides a extensive interface that enables the following functiona The following examples are provided with the library -- [Basic Readings](examples/Example_01_BasicReadings/Example_01_BasicReadings.ino) - Setup and read the soil moisture from the sensor -- [Readings and LED](examples/Example_02_ReadingsAndLED/Example_02_ReadingsAndLED.ino) - Flash the sensor LED when reading the moisture value -- [LED Flash Based on Moisture Percentage](examples/Example_03_LEDFlashMoisture/Example_03_LEDFlashMoisture.ino) - Vary the sensor LED flash rate based on the moisture percent sensed. The flash rate increases the drier the sensed value +| Example | Description | +|---|---| +|[Presence Basic Readings](examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino)| The sensor is initialized, then the presence distance values will print out to the terminal.| +| [Presence GPIO 0 Usage](examples/Example02_PresenceGPIO0Usage/Example02_PresenceGPIO0Usage.ino)|The sensor is initialized, then the presence values will print out to the terminal and trigger the GPIO0 pin high when there is a presence detected. | +|[Presence Serial Plotter](examples/Example03_PresenceSerialPlotter/Example03_PresenceSerialPlotter.ino)|The sensor is initialized, then the presence values will print out to the terminal and the serial monitor.| +|[Presence Advanced Readings](examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino)|The sensor is initialized, then the presence distance, intra-presence, and inter-presence values will be printed to the terminal.| +|[Presence Advanced Settings](examples/Example05_PresenceAdvancedSettings/Example05_PresenceAdvancedSettings.ino)|The sensor is initialized, then the presence distance values will print out to the terminal just as they do in example one. If you wish to change the settings of the device, do so before applying the configuration.| +|[Distance Basic Readings](examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino)|The sensor is initialized, then the distance values will print out to the terminal in mm. | +|[Distance Threshold Settings](examples/Example07_DistanceThresholdSettings/Example07_DistanceThresholdSettings.ino)|The sensor is initialized, then the distance amplitude, and strength , fixed amplitude, and sensitivity thresholds are set. | +|[Distance Serial Plotter](examples/Example08_DistanceSerialPlotter/Example08_DistanceSerialPlotter.ino)|This example prints out the distance values of the 0 distance channels to the serial plotter tool in Arduino.| +|[Distance Advanced Settings](examples/Example09_DistanceAdvancedSettings/Example09_DistanceAdvancedSettings.ino)|The sensor is initialized, then the distance (mm) and advanced values are output to the terminal. | + ## Documentation From 14f6a2a78648fb90b26c7c23d08d3137ecd89fad Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 10:10:13 -0700 Subject: [PATCH 14/32] tweaks for ghpages link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 55a1d80..4b02007 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ The following examples are provided with the library ## Documentation -The full API and use documentation for this library is provided [here](docs.sparkfun.com/SparkFun_Qwiic_XM125_Arduino_Library/). For a quick reference, the main methods available in the library are listed [here](https://docs.sparkfun.com/SparkFun_Qwiic_XM125_Arduino_Library/functions.html). +The full API and use documentation for this library is provided [here](https://docs.sparkfun.com/SparkFun_Qwiic_XM125_Arduino_Library/). For a quick reference, the main methods available in the library are listed [here](https://docs.sparkfun.com/SparkFun_Qwiic_XM125_Arduino_Library/class_qw_dev_x_m125.html). Curious about the hardware this board works with - visit the SparkFun Pulsed Coherent Radar Sensor [hardware repository](https://github.com/sparkfun/SparkFun_Qwiic_Pulsed_Radar_Sensor_XM125). From eed0618407125df36acd42d46e54f35eaa70608f Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 11:14:11 -0700 Subject: [PATCH 15/32] fix issue #5 relating to strength measurements; fix bool bus reads/writes; move hard coded lengths to sizeof() in bus read/writes --- src/sfTk/sfDevXM125.cpp | 414 ++++++++++++++++++++++++---------------- src/sfTk/sfDevXM125.h | 24 +-- 2 files changed, 258 insertions(+), 180 deletions(-) diff --git a/src/sfTk/sfDevXM125.cpp b/src/sfTk/sfDevXM125.cpp index f69903a..0efcc17 100644 --- a/src/sfTk/sfDevXM125.cpp +++ b/src/sfTk/sfDevXM125.cpp @@ -4,9 +4,9 @@ * * This file contains the implementation of the functions for interfacing with * the SparkFun Qwiic XM125 distance and presence detector using I2C communication. - * + * * @author SparkFun Electronics - * @date 2024-2025 + * @date 2024-2025 * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. * * SPDX-License-Identifier: MIT @@ -189,7 +189,7 @@ sfTkError_t sfDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &mi // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_VERSION, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_VERSION, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -205,8 +205,8 @@ sfTkError_t sfDevXM125::getDistanceDetectorError(uint32_t &error) { // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PROTOCOL_STATUS, (uint8_t *)&error, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PROTOCOL_STATUS, (uint8_t *)&error, + sizeof(uint32_t), readBytes); error = sftk_byte_swap(error); return retVal; } @@ -217,7 +217,8 @@ sfTkError_t sfDevXM125::getDistanceDetectorErrorStatus(uint32_t &status) sfTkError_t retVal; uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); regVal = sftk_byte_swap(regVal); // No error @@ -275,8 +276,8 @@ sfTkError_t sfDevXM125::getDistanceMeasureCounter(uint32_t &counter) { // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_COUNTER, (uint8_t *)&counter, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_COUNTER, (uint8_t *)&counter, + sizeof(uint32_t), readBytes); counter = sftk_byte_swap(counter); return retVal; } @@ -285,8 +286,8 @@ sfTkError_t sfDevXM125::getDistanceMeasureCounter(uint32_t &counter) sfTkError_t sfDevXM125::getDistanceDetectorStatus(uint32_t &status) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)&status, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)&status, + sizeof(uint32_t), readBytes); status = sftk_byte_swap(status); return retVal; } @@ -299,7 +300,7 @@ sfTkError_t sfDevXM125::getDistanceNumberDistances(uint32_t &distance) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -316,7 +317,7 @@ sfTkError_t sfDevXM125::getDistanceNearStartEdge(uint32_t &edge) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -333,7 +334,7 @@ sfTkError_t sfDevXM125::getDistanceCalibrationNeeded(uint32_t &calibrate) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -351,7 +352,7 @@ sfTkError_t sfDevXM125::getDistanceMeasureDistanceError(uint32_t &error) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -362,18 +363,21 @@ sfTkError_t sfDevXM125::getDistanceMeasureDistanceError(uint32_t &error) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceTemperature(uint32_t &temperature) +sfTkError_t sfDevXM125::getDistanceTemperature(int16_t &temperature) { sfTkError_t retVal; uint32_t regVal = 0; // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + if (retVal != ksfTkErrOk) + return retVal; + regVal = sftk_byte_swap(regVal); // Mask unused bits from register - temperature = (regVal & SFE_XM125_DISTANCE_TEMPERATURE_MASK) >> SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT; + temperature = static_cast((regVal & SFE_XM125_DISTANCE_TEMPERATURE_MASK) >> SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT); return retVal; } @@ -383,7 +387,7 @@ sfTkError_t sfDevXM125::getDistancePeak0Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -393,7 +397,7 @@ sfTkError_t sfDevXM125::getDistancePeak1Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -403,7 +407,7 @@ sfTkError_t sfDevXM125::getDistancePeak2Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -413,7 +417,7 @@ sfTkError_t sfDevXM125::getDistancePeak3Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -423,7 +427,7 @@ sfTkError_t sfDevXM125::getDistancePeak4Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -433,7 +437,7 @@ sfTkError_t sfDevXM125::getDistancePeak5Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -443,7 +447,7 @@ sfTkError_t sfDevXM125::getDistancePeak6Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -453,7 +457,7 @@ sfTkError_t sfDevXM125::getDistancePeak7Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -463,7 +467,7 @@ sfTkError_t sfDevXM125::getDistancePeak8Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -473,118 +477,118 @@ sfTkError_t sfDevXM125::getDistancePeak9Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_DISTANCE, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak0Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak0Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak1Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak1Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak2Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak2Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak3Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak3Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak4Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak4Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak5Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak5Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak6Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak6Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak7Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak7Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak8Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak8Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak9Strength(uint32_t &peak) +sfTkError_t sfDevXM125::getDistancePeak9Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_STRENGTH, (uint8_t *)&peak, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); - peak = peak / 1000; + return retVal; } @@ -592,7 +596,8 @@ sfTkError_t sfDevXM125::getDistancePeak9Strength(uint32_t &peak) sfTkError_t sfDevXM125::getDistanceStart(uint32_t &startVal) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&startVal, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&startVal, sizeof(uint32_t), readBytes); startVal = sftk_byte_swap(startVal); return retVal; } @@ -601,14 +606,15 @@ sfTkError_t sfDevXM125::getDistanceStart(uint32_t &startVal) sfTkError_t sfDevXM125::setDistanceStart(uint32_t start) { start = sftk_byte_swap(start); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&start, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&start, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceEnd(uint32_t &end) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, sizeof(uint32_t), readBytes); end = sftk_byte_swap(end); return retVal; } @@ -617,15 +623,15 @@ sfTkError_t sfDevXM125::getDistanceEnd(uint32_t &end) sfTkError_t sfDevXM125::setDistanceEnd(uint32_t end) { end = sftk_byte_swap(end); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceMaxStepLength(uint32_t &length) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, + sizeof(uint32_t), readBytes); length = sftk_byte_swap(length); return retVal; } @@ -634,28 +640,36 @@ sfTkError_t sfDevXM125::getDistanceMaxStepLength(uint32_t &length) sfTkError_t sfDevXM125::setDistanceMaxStepLength(uint32_t length) { length = sftk_byte_swap(length); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceCloseRangeLeakageCancellation(bool &range) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t *)&range, 4, readBytes); + uint8_t readVal = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t *)&readVal, + sizeof(uint8_t), readBytes); + if (retVal != ksfTkErrOk) + return retVal; + + range = (readVal == 0) ? false : true; + return ksfTkErrOk; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceCloseRangeLeakageCancellation(bool range) { - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t *)&range, 4); + uint8_t value = range ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, &value, sizeof(value)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceSignalQuality(uint32_t &signal) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, + sizeof(uint32_t), readBytes); signal = sftk_byte_swap(signal); return retVal; } @@ -664,7 +678,7 @@ sfTkError_t sfDevXM125::getDistanceSignalQuality(uint32_t &signal) sfTkError_t sfDevXM125::setDistanceSignalQuality(uint32_t signal) { signal = sftk_byte_swap(signal); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- @@ -672,7 +686,7 @@ sfTkError_t sfDevXM125::getDistanceMaxProfile(uint32_t &profile) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, sizeof(uint32_t), readBytes); profile = sftk_byte_swap(profile); return retVal; } @@ -681,15 +695,15 @@ sfTkError_t sfDevXM125::getDistanceMaxProfile(uint32_t &profile) sfTkError_t sfDevXM125::setDistanceMaxProfile(uint32_t profile) { profile = sftk_byte_swap(profile); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceThresholdMethod(uint32_t &method) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, + sizeof(uint32_t), readBytes); method = sftk_byte_swap(method); return retVal; } @@ -698,14 +712,15 @@ sfTkError_t sfDevXM125::getDistanceThresholdMethod(uint32_t &method) sfTkError_t sfDevXM125::setDistanceThresholdMethod(uint32_t method) { method = sftk_byte_swap(method); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistancePeakSorting(uint32_t &peak) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -714,15 +729,15 @@ sfTkError_t sfDevXM125::getDistancePeakSorting(uint32_t &peak) sfTkError_t sfDevXM125::setDistancePeakSorting(uint32_t peak) { peak = sftk_byte_swap(peak); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, + (uint8_t *)&thresh, sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -731,7 +746,8 @@ sfTkError_t sfDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) sfTkError_t sfDevXM125::setDistanceNumFramesRecordedThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- @@ -739,7 +755,7 @@ sfTkError_t sfDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, - (uint8_t *)&thresh, 4, readBytes); + (uint8_t *)&thresh, sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -748,15 +764,16 @@ sfTkError_t sfDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) sfTkError_t sfDevXM125::setDistanceFixedAmpThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t *)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t *)&thresh, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, + sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -765,15 +782,16 @@ sfTkError_t sfDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) sfTkError_t sfDevXM125::setDistanceThresholdSensitivity(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceReflectorShape(uint32_t &shape) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, + sizeof(uint32_t), readBytes); shape = sftk_byte_swap(shape); return retVal; } @@ -782,7 +800,7 @@ sfTkError_t sfDevXM125::getDistanceReflectorShape(uint32_t &shape) sfTkError_t sfDevXM125::setDistanceReflectorShape(uint32_t shape) { shape = sftk_byte_swap(shape); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- @@ -790,7 +808,7 @@ sfTkError_t sfDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, - (uint8_t *)&thresh, 4, readBytes); + (uint8_t *)&thresh, sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -799,27 +817,33 @@ sfTkError_t sfDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) sfTkError_t sfDevXM125::setDistanceFixedStrengthThresholdValue(int32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t *)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t *)&thresh, + sizeof(int32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getDistanceMeasureOneWakeup(bool &measure) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&measure, 4, readBytes); + uint8_t value; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&value, + sizeof(uint8_t), readBytes); + measure = static_cast(value); + return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceMeasureOneWakeup(bool measure) { - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&measure, 4); + uint8_t value = static_cast(measure); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setDistanceCommand(uint32_t command) { command = sftk_byte_swap(command); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_COMMAND, (uint8_t *)&command, 4); + return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_COMMAND, (uint8_t *)&command, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- @@ -883,18 +907,19 @@ sfTkError_t sfDevXM125::distanceBusyWait() uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); regVal = sftk_byte_swap(regVal); // Poll Detector Status until Busy bit is cleared while (((regVal & SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK) >> SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK_SHIFT) != 0) { - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); regVal = sftk_byte_swap(regVal); } return retVal; - } // --------------------- I2C Presence Detector Functions --------------------- @@ -983,7 +1008,7 @@ sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) if (getPresenceDetectorPresenceDetected(presenceDetected) != ksfTkErrOk) return 5; - if ( getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky) != ksfTkErrOk) + if (getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky) != ksfTkErrOk) return 6; if (presenceDetected == 1 || presenceDetectedSticky == 1) @@ -1000,7 +1025,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &mi // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_VERSION, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_VERSION, (uint8_t *)®Val, sizeof(regVal), readBytes); // Mask unused bits from register major = (regVal & SFE_XM125_PRESENCE_MAJOR_VERSION_MASK) >> SFE_XM125_PRESENCE_MAJOR_VERSION_MASK_SHIFT; @@ -1013,19 +1038,22 @@ sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &mi sfTkError_t sfDevXM125::getPresenceDetectorError(uint32_t &error) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t *)&error, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t *)&error, sizeof(uint32_t), + readBytes); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceMeasureCounter(uint32_t &counter) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t *)&counter, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t *)&counter, sizeof(uint32_t), + readBytes); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectorStatus(uint32_t &status) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)&status, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)&status, sizeof(uint32_t), + readBytes); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) @@ -1033,7 +1061,8 @@ sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) sfTkError_t retVal = 0; uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); regVal = sftk_byte_swap(regVal); // clear out status @@ -1090,7 +1119,8 @@ sfTkError_t sfDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); @@ -1106,7 +1136,8 @@ sfTkError_t sfDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &stic // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); @@ -1122,7 +1153,8 @@ sfTkError_t sfDevXM125::getPresenceDetectorRegError(uint32_t &error) // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); @@ -1138,7 +1170,8 @@ sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)®Val, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)®Val, sizeof(uint32_t), readBytes); // Mask unused bits from register temp = (regVal & SFE_XM125_PRESENCE_TEMPERATURE_MASK) >> SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT; @@ -1149,7 +1182,8 @@ sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)&distance, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)&distance, sizeof(uint32_t), readBytes); distance = sftk_byte_swap(distance); return retVal; } @@ -1157,7 +1191,8 @@ sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&intra, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&intra, sizeof(uint32_t), readBytes); intra = sftk_byte_swap(intra); return retVal; } @@ -1165,7 +1200,8 @@ sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_INTER_PRESENCE, (uint8_t *)&inter, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_INTER_PRESENCE, (uint8_t *)&inter, sizeof(uint32_t), readBytes); inter = sftk_byte_swap(inter); return retVal; } @@ -1174,22 +1210,23 @@ sfTkError_t sfDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&sweeps, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&sweeps, sizeof(uint32_t), readBytes); sweeps = sftk_byte_swap(sweeps); return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceSweepsPerFrame(uint32_t sweeps) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t *)&sweeps, 4); + sweeps = sftk_byte_swap(sweeps); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t *)&sweeps, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, + sizeof(uint32_t), readBytes); time = sftk_byte_swap(time); return retVal; } @@ -1197,40 +1234,54 @@ sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterFramePresenceTimeout(uint32_t time) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, 4); + time = sftk_byte_swap(time); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterPhaseBoostEnabled(bool &en) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&en, 4, readBytes); + uint8_t value; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); + en = (value != 0); + return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterPhaseBoostEnabled(bool en) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&en, 4); + uint8_t value = en ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, + sizeof(uint8_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceIntraDetectionEnabled(bool &en) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&en, 4, readBytes); + uint8_t value; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); + en = (value != 0); + return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceInterDetectionEnabled(bool en) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&en, 4); + uint8_t value = en ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, + sizeof(uint8_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, sizeof(uint32_t), readBytes); rate = sftk_byte_swap(rate); return retVal; } @@ -1239,15 +1290,15 @@ sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) sfTkError_t sfDevXM125::setPresenceFrameRate(uint32_t rate) { rate = sftk_byte_swap(rate); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, + sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -1256,15 +1307,16 @@ sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) sfTkError_t sfDevXM125::setPresenceIntraDetectionThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, + sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -1273,15 +1325,16 @@ sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) sfTkError_t sfDevXM125::setPresenceInterDetectionThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, + sizeof(uint32_t), readBytes); time = sftk_byte_swap(time); return retVal; } @@ -1290,15 +1343,15 @@ sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) sfTkError_t sfDevXM125::setPresenceInterFrameDeviationTime(uint32_t time) { time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, + sizeof(uint32_t), readBytes); cut = sftk_byte_swap(cut); return retVal; } @@ -1307,15 +1360,16 @@ sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) sfTkError_t sfDevXM125::setPresenceInterFrameFastCutoff(uint32_t cut) { cut = sftk_byte_swap(cut); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, + sizeof(uint32_t), readBytes); cut = sftk_byte_swap(cut); return retVal; } @@ -1324,15 +1378,16 @@ sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) sfTkError_t sfDevXM125::setPresenceInterFrameSlowCutoff(uint32_t cut) { cut = sftk_byte_swap(cut); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t), readBytes); time = sftk_byte_swap(time); return retVal; } @@ -1341,15 +1396,16 @@ sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) sfTkError_t sfDevXM125::setPresenceIntraFrameTimeConst(uint32_t time) { time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t), readBytes); time = sftk_byte_swap(time); return retVal; } @@ -1358,15 +1414,16 @@ sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) sfTkError_t sfDevXM125::setPresenceIntraOutputTimeConst(uint32_t time) { time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t), readBytes); time = sftk_byte_swap(time); return retVal; } @@ -1375,33 +1432,45 @@ sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) sfTkError_t sfDevXM125::setPresenceInterOutputTimeConst(uint32_t time) { time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceAutoProfileEn(bool &en) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&en, 4, readBytes); + uint8_t value; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); + en = (value != 0); + return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceAutoProfileEn(bool en) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&en, 4); + uint8_t value = en ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceAutoStepLengthEn(bool &en) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&en, 4, readBytes); + uint8_t value; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); + en = (value != 0); + return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceAutoStepLengthEn(bool en) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&en, 4); + uint8_t value = en ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, + sizeof(uint8_t)); } //-------------------------------------------------------------------------------- @@ -1409,7 +1478,7 @@ sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, 4, readBytes); + _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, sizeof(uint32_t), readBytes); prof = sftk_byte_swap(prof); return retVal; } @@ -1418,15 +1487,15 @@ sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) sfTkError_t sfDevXM125::setPresenceManualProfile(uint32_t prof) { prof = sftk_byte_swap(prof); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, + sizeof(uint32_t), readBytes); length = sftk_byte_swap(length); return retVal; } @@ -1435,14 +1504,15 @@ sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) sfTkError_t sfDevXM125::setPresenceManualStepLength(uint32_t length) { length = sftk_byte_swap(length); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, sizeof(uint32_t), readBytes); start = sftk_byte_swap(start); return retVal; } @@ -1451,14 +1521,15 @@ sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) sfTkError_t sfDevXM125::setPresenceStart(uint32_t start) { start = sftk_byte_swap(start); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, 4, readBytes); + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, sizeof(uint32_t), readBytes); end = sftk_byte_swap(end); return retVal; } @@ -1467,41 +1538,46 @@ sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) sfTkError_t sfDevXM125::setPresenceEnd(uint32_t end) { end = sftk_byte_swap(end); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceResetFilters(bool &reset) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t *)&reset, 4, readBytes); + uint8_t value; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t), readBytes); + reset = (value != 0); + return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceResetFilters(bool reset) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, (uint8_t *)&reset, 4); + uint8_t value = reset ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceHWAAS(uint32_t &avg) { size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, 4, readBytes); + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t), readBytes); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::setPresenceHWAAS(uint32_t avg) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, 4, readBytes); + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, + sizeof(uint32_t), readBytes); detected = sftk_byte_swap(detected); return retVal; } @@ -1510,13 +1586,13 @@ sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) sfTkError_t sfDevXM125::setPresenceDetectionOnGPIO(uint32_t detected) { detected = sftk_byte_swap(detected); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, sizeof(uint32_t)); } sfTkError_t sfDevXM125::setPresenceCommand(uint32_t cmd) { cmd = sftk_byte_swap(cmd); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t *)&cmd, 4); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t *)&cmd, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- @@ -1563,7 +1639,8 @@ sfTkError_t sfDevXM125::getPresenceBusy(uint32_t &busy) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -1579,16 +1656,17 @@ sfTkError_t sfDevXM125::presenceBusyWait() uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); regVal = sftk_byte_swap(regVal); // Poll Detector Status until Busy bit is cleared while (((regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> 30) != 0) { - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, 4, readBytes); + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); regVal = sftk_byte_swap(regVal); } return retVal; - } diff --git a/src/sfTk/sfDevXM125.h b/src/sfTk/sfDevXM125.h index bd8b7ce..74d75b3 100644 --- a/src/sfTk/sfDevXM125.h +++ b/src/sfTk/sfDevXM125.h @@ -93,9 +93,9 @@ class sfDevXM125 /// @brief This function returns the temperature in sensor during measurements /// (in degree Celsius). Note that it has poor absolute accuracy and should /// only be used for relative temperature measurements. - /// @param temperature Relative tempertaure of device + /// @param temperature Relative temperature of device /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceTemperature(uint32_t &temperature); + sfTkError_t getDistanceTemperature(int16_t &temperature); /// @brief This function returns the distance to peak 0 /// Note: This value is a factor 1000 larger than the RSS value @@ -150,52 +150,52 @@ class sfDevXM125 /// @brief This function returns the strength of peak 0 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak0Strength(uint32_t &peak); + sfTkError_t getDistancePeak0Strength(int32_t &peak); /// @brief This function returns the strength of peak 1 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak1Strength(uint32_t &peak); + sfTkError_t getDistancePeak1Strength(int32_t &peak); /// @brief This function returns the strength of peak 2 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak2Strength(uint32_t &peak); + sfTkError_t getDistancePeak2Strength(int32_t &peak); /// @brief This function returns the strength of peak 3 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak3Strength(uint32_t &peak); + sfTkError_t getDistancePeak3Strength(int32_t &peak); /// @brief This function returns the strength of peak 4 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak4Strength(uint32_t &peak); + sfTkError_t getDistancePeak4Strength(int32_t &peak); /// @brief This function returns the strength of peak 5 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak5Strength(uint32_t &peak); + sfTkError_t getDistancePeak5Strength(int32_t &peak); /// @brief This function returns the strength of peak 6 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak6Strength(uint32_t &peak); + sfTkError_t getDistancePeak6Strength(int32_t &peak); /// @brief This function returns the strength of peak 7 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak7Strength(uint32_t &peak); + sfTkError_t getDistancePeak7Strength(int32_t &peak); /// @brief This function returns the strength of peak 8 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak8Strength(uint32_t &peak); + sfTkError_t getDistancePeak8Strength(int32_t &peak); /// @brief This function returns the strength of peak 9 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak9Strength(uint32_t &peak); + sfTkError_t getDistancePeak9Strength(int32_t &peak); /// @brief This function returns the start of measured interval /// in millimeters. From 14e5b0bf8586f22e93d8bf66fe21cdb5374ab9ea Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 11:23:33 -0700 Subject: [PATCH 16/32] broke up the impl file - was freeking massive - now two files --- ...{sfDevXM125.cpp => sfDevXM125Distance.cpp} | 761 +---------------- src/sfTk/sfDevXM125Presence.cpp | 768 ++++++++++++++++++ 2 files changed, 774 insertions(+), 755 deletions(-) rename src/sfTk/{sfDevXM125.cpp => sfDevXM125Distance.cpp} (52%) create mode 100644 src/sfTk/sfDevXM125Presence.cpp diff --git a/src/sfTk/sfDevXM125.cpp b/src/sfTk/sfDevXM125Distance.cpp similarity index 52% rename from src/sfTk/sfDevXM125.cpp rename to src/sfTk/sfDevXM125Distance.cpp index 0efcc17..b1bc089 100644 --- a/src/sfTk/sfDevXM125.cpp +++ b/src/sfTk/sfDevXM125Distance.cpp @@ -1,9 +1,13 @@ /** - * @file sfDevXM125.cpp - * @brief Implementation of the SparkFun Qwiic XM125 Library. + * @file sfDevXM125Distance.cpp + * @brief Implementation of the SparkFun Qwiic XM125 Library. Focusing on Distance methods * + * The implementation of the sfDevXM125 class is spread across two files. + * * This file contains the implementation of the functions for interfacing with * the SparkFun Qwiic XM125 distance and presence detector using I2C communication. + * + * The file includes the object lifecycle methods, and the set of distance methods * * @author SparkFun Electronics * @date 2024-2025 @@ -13,10 +17,6 @@ */ #include "sfDevXM125.h" -// Handy helper - check if a bit(s) is set... - -#define SF_CHECK_BITS_SET(__value__, __bitmask__) (((__value__) & (__bitmask__)) == __bitmask__) - //-------------------------------------------------------------------------------- bool sfDevXM125::begin(sfTkII2C *theBus) { @@ -921,752 +921,3 @@ sfTkError_t sfDevXM125::distanceBusyWait() return retVal; } - -// --------------------- I2C Presence Detector Functions --------------------- - -sfTkError_t sfDevXM125::presenceDetectorStart() -{ - // *** Presence Sensor Setup *** - uint32_t errorStatus = 0; - - // Reset sensor configuration to reapply configuration registers - if (setPresenceCommand(SFE_XM125_PRESENCE_RESET_MODULE) != ksfTkErrOk) - return 1; - - sftk_delay_ms(100); // give time for command to set - - // Check detector status error and busy bits - if (getPresenceDetectorErrorStatus(errorStatus) != ksfTkErrOk) - return 2; - - if (errorStatus != 0) - return 3; - - // Set Presence Start register - if (setPresenceStart(300) != ksfTkErrOk) - return 4; - - sftk_delay_ms(100); // give time for command to set - - // Set End register - if (setPresenceEnd(2500) != ksfTkErrOk) - return 5; - - sftk_delay_ms(100); // give time for command to set - - // Apply configuration - if (setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != ksfTkErrOk) - { - // Check for errors - getPresenceDetectorErrorStatus(errorStatus); - return errorStatus != 0 ? 6 : 7; - } - - sftk_delay_ms(100); // give time for command to set - - // Poll detector status until busy bit is cleared - if (presenceBusyWait() != ksfTkErrOk) - return 8; - - // Check detector error status - sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); - if (retVal != ksfTkErrOk || errorStatus != 0) - return 9; - - // If no errors, return 0 - return ksfTkErrOk; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) -{ - // Check error bits - uint32_t errorStatus = 0; - uint32_t presenceDetected = 0; - uint32_t presenceDetectedSticky = 0; - - sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); - if (retVal != ksfTkErrOk || errorStatus != 0) - return 1; - - // Start detector - if (setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != ksfTkErrOk) - return 2; - - sftk_delay_ms(100); - - // Poll detector status until busy bit is cleared - CHECK ON THIS! - if (presenceBusyWait() != ksfTkErrOk) - return 3; - - // Verify that no error bits are set in the detector status register - retVal = getPresenceDetectorErrorStatus(errorStatus); - if (retVal != ksfTkErrOk || errorStatus != 0) - return 4; - - // Read detector result register and determine detection status - if (getPresenceDetectorPresenceDetected(presenceDetected) != ksfTkErrOk) - return 5; - - if (getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky) != ksfTkErrOk) - return 6; - - if (presenceDetected == 1 || presenceDetectedSticky == 1) - return getPresenceDistance(presenceVal); - - return ksfTkErrOk; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) -{ - sfTkError_t retVal; - uint32_t regVal = 0; - - // Read from 16-Bit Register - size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_VERSION, (uint8_t *)®Val, sizeof(regVal), readBytes); - - // Mask unused bits from register - major = (regVal & SFE_XM125_PRESENCE_MAJOR_VERSION_MASK) >> SFE_XM125_PRESENCE_MAJOR_VERSION_MASK_SHIFT; - minor = (regVal & SFE_XM125_PRESENCE_MINOR_VERSION_MASK) >> SFE_XM125_PRESENCE_MINOR_VERSION_MASK_SHIFT; - patch = regVal & SFE_XM125_PRESENCE_PATCH_VERSION_MASK; - - return retVal; -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorError(uint32_t &error) -{ - size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t *)&error, sizeof(uint32_t), - readBytes); -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceMeasureCounter(uint32_t &counter) -{ - size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t *)&counter, sizeof(uint32_t), - readBytes); -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorStatus(uint32_t &status) -{ - size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)&status, sizeof(uint32_t), - readBytes); -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) -{ - sfTkError_t retVal = 0; - uint32_t regVal = 0; - size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); - regVal = sftk_byte_swap(regVal); - - // clear out status - status = 0; - - if (retVal != ksfTkErrOk) - return retVal; - // Any errors - if not, skip the big bit check pachinko if-else below - if ((regVal & SFE_XM125_PRESENCE_ALL_ERROR_MASK) == 0) - return ksfTkErrOk; - - // Check for errors - if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK)) - status = 1; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK)) - status = 2; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK)) - status = 3; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK)) - status = 4; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK)) - status = 5; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK)) - status = 6; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK)) - status = 7; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK)) - status = 8; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK)) - status = 9; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK)) - status = 10; - - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_BUSY_MASK)) - status = 11; - - // return 0 with no errors - return ksfTkErrOk; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) -{ - uint32_t regVal = 0; - - // Read from 16-Bit Register - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); - - regVal = sftk_byte_swap(regVal); - - // Mask unused bits from register - detected = (regVal & SFE_XM125_PRESENCE_DETECTED_MASK); - - return retVal; -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &sticky) -{ - uint32_t regVal = 0; - - // Read from 16-Bit Register - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); - - regVal = sftk_byte_swap(regVal); - - // Mask unused bits from register - sticky = (regVal & SFE_XM125_PRESENCE_DETECTED_STICKY_MASK) >> 1; - - return retVal; -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorRegError(uint32_t &error) -{ - uint32_t regVal = 0; - - // Read from 16-Bit Register - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); - - regVal = sftk_byte_swap(regVal); - - // Mask unused bits from register - error = (regVal & SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK) >> SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK_SHIFT; - - return retVal; -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) -{ - uint32_t regVal = 0; - - // Read from 16-Bit Register - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)®Val, sizeof(uint32_t), readBytes); - - // Mask unused bits from register - temp = (regVal & SFE_XM125_PRESENCE_TEMPERATURE_MASK) >> SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT; - - return retVal; -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) -{ - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)&distance, sizeof(uint32_t), readBytes); - distance = sftk_byte_swap(distance); - return retVal; -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) -{ - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&intra, sizeof(uint32_t), readBytes); - intra = sftk_byte_swap(intra); - return retVal; -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) -{ - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_INTER_PRESENCE, (uint8_t *)&inter, sizeof(uint32_t), readBytes); - inter = sftk_byte_swap(inter); - return retVal; -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) -{ - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&sweeps, sizeof(uint32_t), readBytes); - sweeps = sftk_byte_swap(sweeps); - return retVal; -} -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceSweepsPerFrame(uint32_t sweeps) -{ - sweeps = sftk_byte_swap(sweeps); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t *)&sweeps, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterFramePresenceTimeout(uint32_t time) -{ - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterPhaseBoostEnabled(bool &en) -{ - size_t readBytes = 0; - uint8_t value; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, - sizeof(uint8_t), readBytes); - en = (value != 0); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterPhaseBoostEnabled(bool en) -{ - uint8_t value = en ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, - sizeof(uint8_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraDetectionEnabled(bool &en) -{ - size_t readBytes = 0; - uint8_t value; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, - sizeof(uint8_t), readBytes); - en = (value != 0); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterDetectionEnabled(bool en) -{ - uint8_t value = en ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, - sizeof(uint8_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) -{ - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, sizeof(uint32_t), readBytes); - rate = sftk_byte_swap(rate); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceFrameRate(uint32_t rate) -{ - rate = sftk_byte_swap(rate); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, - sizeof(uint32_t), readBytes); - thresh = sftk_byte_swap(thresh); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceIntraDetectionThreshold(uint32_t thresh) -{ - thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, - sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, - sizeof(uint32_t), readBytes); - thresh = sftk_byte_swap(thresh); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterDetectionThreshold(uint32_t thresh) -{ - thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, - sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterFrameDeviationTime(uint32_t time) -{ - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, - sizeof(uint32_t), readBytes); - cut = sftk_byte_swap(cut); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterFrameFastCutoff(uint32_t cut) -{ - cut = sftk_byte_swap(cut); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, - sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, - sizeof(uint32_t), readBytes); - cut = sftk_byte_swap(cut); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterFrameSlowCutoff(uint32_t cut) -{ - cut = sftk_byte_swap(cut); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, - sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceIntraFrameTimeConst(uint32_t time) -{ - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceIntraOutputTimeConst(uint32_t time) -{ - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterOutputTimeConst(uint32_t time) -{ - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceAutoProfileEn(bool &en) -{ - size_t readBytes = 0; - uint8_t value; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, - sizeof(uint8_t), readBytes); - en = (value != 0); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceAutoProfileEn(bool en) -{ - uint8_t value = en ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, sizeof(uint8_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceAutoStepLengthEn(bool &en) -{ - size_t readBytes = 0; - uint8_t value; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, - sizeof(uint8_t), readBytes); - en = (value != 0); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceAutoStepLengthEn(bool en) -{ - uint8_t value = en ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, - sizeof(uint8_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) -{ - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, sizeof(uint32_t), readBytes); - prof = sftk_byte_swap(prof); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceManualProfile(uint32_t prof) -{ - prof = sftk_byte_swap(prof); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, - sizeof(uint32_t), readBytes); - length = sftk_byte_swap(length); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceManualStepLength(uint32_t length) -{ - length = sftk_byte_swap(length); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) -{ - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, sizeof(uint32_t), readBytes); - start = sftk_byte_swap(start); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceStart(uint32_t start) -{ - start = sftk_byte_swap(start); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) -{ - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, sizeof(uint32_t), readBytes); - end = sftk_byte_swap(end); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceEnd(uint32_t end) -{ - end = sftk_byte_swap(end); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceResetFilters(bool &reset) -{ - size_t readBytes = 0; - uint8_t value; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t), readBytes); - reset = (value != 0); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceResetFilters(bool reset) -{ - uint8_t value = reset ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceHWAAS(uint32_t &avg) -{ - size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t), readBytes); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceHWAAS(uint32_t avg) -{ - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) -{ - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, - sizeof(uint32_t), readBytes); - detected = sftk_byte_swap(detected); - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceDetectionOnGPIO(uint32_t detected) -{ - detected = sftk_byte_swap(detected); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, sizeof(uint32_t)); -} - -sfTkError_t sfDevXM125::setPresenceCommand(uint32_t cmd) -{ - cmd = sftk_byte_swap(cmd); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t *)&cmd, sizeof(uint32_t)); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceApplyConfiguration() -{ - return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceStart() -{ - return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceStop() -{ - return setPresenceCommand(SFE_XM125_PRESENCE_STOP_DETECTOR); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceEnableUartLogs() -{ - return setPresenceCommand(SFE_XM125_PRESENCE_ENABLE_UART_LOGS); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceDisableUartLogs() -{ - return setPresenceCommand(SFE_XM125_PRESENCE_DISABLE_UART_LOGS); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceLogConfiguration() -{ - return setPresenceCommand(SFE_XM125_PRESENCE_LOG_CONFIGURATION); -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceBusy(uint32_t &busy) -{ - sfTkError_t retVal; - uint32_t regVal = 0; - - // Read from 16-Bit Register - size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); - - regVal = sftk_byte_swap(regVal); - // Mask unused bits from register - busy = (regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> SFE_XM125_PRESENCE_BUSY_MASK_SHIFT; - - return retVal; -} - -//-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceBusyWait() -{ - sfTkError_t retVal = 0; - uint32_t regVal = 0; - - size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); - regVal = sftk_byte_swap(regVal); - - // Poll Detector Status until Busy bit is cleared - while (((regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> 30) != 0) - { - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); - regVal = sftk_byte_swap(regVal); - } - - return retVal; -} diff --git a/src/sfTk/sfDevXM125Presence.cpp b/src/sfTk/sfDevXM125Presence.cpp new file mode 100644 index 0000000..041f573 --- /dev/null +++ b/src/sfTk/sfDevXM125Presence.cpp @@ -0,0 +1,768 @@ +/** + * @file sfDevXM125Presence.cpp + * @brief Implementation of the SparkFun Qwiic XM125 Library. + * + * The implementation of the sfDevXM125 class is spread across two files. + * + * This file contains the implementation of the functions for interfacing with + * the SparkFun Qwiic XM125 distance and presence detector using I2C communication. + * + * The file includes the object presence methods + * + * @author SparkFun Electronics + * @date 2024-2025 + * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. + * + * SPDX-License-Identifier: MIT + */ +#include "sfDevXM125.h" + + +// --------------------- I2C Presence Detector Functions --------------------- + +sfTkError_t sfDevXM125::presenceDetectorStart() +{ + // *** Presence Sensor Setup *** + uint32_t errorStatus = 0; + + // Reset sensor configuration to reapply configuration registers + if (setPresenceCommand(SFE_XM125_PRESENCE_RESET_MODULE) != ksfTkErrOk) + return 1; + + sftk_delay_ms(100); // give time for command to set + + // Check detector status error and busy bits + if (getPresenceDetectorErrorStatus(errorStatus) != ksfTkErrOk) + return 2; + + if (errorStatus != 0) + return 3; + + // Set Presence Start register + if (setPresenceStart(300) != ksfTkErrOk) + return 4; + + sftk_delay_ms(100); // give time for command to set + + // Set End register + if (setPresenceEnd(2500) != ksfTkErrOk) + return 5; + + sftk_delay_ms(100); // give time for command to set + + // Apply configuration + if (setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != ksfTkErrOk) + { + // Check for errors + getPresenceDetectorErrorStatus(errorStatus); + return errorStatus != 0 ? 6 : 7; + } + + sftk_delay_ms(100); // give time for command to set + + // Poll detector status until busy bit is cleared + if (presenceBusyWait() != ksfTkErrOk) + return 8; + + // Check detector error status + sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); + if (retVal != ksfTkErrOk || errorStatus != 0) + return 9; + + // If no errors, return 0 + return ksfTkErrOk; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) +{ + // Check error bits + uint32_t errorStatus = 0; + uint32_t presenceDetected = 0; + uint32_t presenceDetectedSticky = 0; + + sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); + if (retVal != ksfTkErrOk || errorStatus != 0) + return 1; + + // Start detector + if (setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != ksfTkErrOk) + return 2; + + sftk_delay_ms(100); + + // Poll detector status until busy bit is cleared - CHECK ON THIS! + if (presenceBusyWait() != ksfTkErrOk) + return 3; + + // Verify that no error bits are set in the detector status register + retVal = getPresenceDetectorErrorStatus(errorStatus); + if (retVal != ksfTkErrOk || errorStatus != 0) + return 4; + + // Read detector result register and determine detection status + if (getPresenceDetectorPresenceDetected(presenceDetected) != ksfTkErrOk) + return 5; + + if (getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky) != ksfTkErrOk) + return 6; + + if (presenceDetected == 1 || presenceDetectedSticky == 1) + return getPresenceDistance(presenceVal); + + return ksfTkErrOk; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) +{ + sfTkError_t retVal; + uint32_t regVal = 0; + + // Read from 16-Bit Register + size_t readBytes = 0; + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_VERSION, (uint8_t *)®Val, sizeof(regVal), readBytes); + + // Mask unused bits from register + major = (regVal & SFE_XM125_PRESENCE_MAJOR_VERSION_MASK) >> SFE_XM125_PRESENCE_MAJOR_VERSION_MASK_SHIFT; + minor = (regVal & SFE_XM125_PRESENCE_MINOR_VERSION_MASK) >> SFE_XM125_PRESENCE_MINOR_VERSION_MASK_SHIFT; + patch = regVal & SFE_XM125_PRESENCE_PATCH_VERSION_MASK; + + return retVal; +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDetectorError(uint32_t &error) +{ + size_t readBytes = 0; + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t *)&error, sizeof(uint32_t), + readBytes); +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceMeasureCounter(uint32_t &counter) +{ + size_t readBytes = 0; + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t *)&counter, sizeof(uint32_t), + readBytes); +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDetectorStatus(uint32_t &status) +{ + size_t readBytes = 0; + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)&status, sizeof(uint32_t), + readBytes); +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) +{ + sfTkError_t retVal = 0; + uint32_t regVal = 0; + size_t readBytes = 0; + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); + regVal = sftk_byte_swap(regVal); + + // clear out status + status = 0; + + if (retVal != ksfTkErrOk) + return retVal; + // Any errors - if not, skip the big bit check pachinko if-else below + if ((regVal & SFE_XM125_PRESENCE_ALL_ERROR_MASK) == 0) + return ksfTkErrOk; + + // Check for errors + if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK)) + status = 1; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK)) + status = 2; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK)) + status = 3; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK)) + status = 4; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK)) + status = 5; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK)) + status = 6; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK)) + status = 7; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK)) + status = 8; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK)) + status = 9; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK)) + status = 10; + + else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_BUSY_MASK)) + status = 11; + + // return 0 with no errors + return ksfTkErrOk; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) +{ + uint32_t regVal = 0; + + // Read from 16-Bit Register + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + + regVal = sftk_byte_swap(regVal); + + // Mask unused bits from register + detected = (regVal & SFE_XM125_PRESENCE_DETECTED_MASK); + + return retVal; +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &sticky) +{ + uint32_t regVal = 0; + + // Read from 16-Bit Register + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + + regVal = sftk_byte_swap(regVal); + + // Mask unused bits from register + sticky = (regVal & SFE_XM125_PRESENCE_DETECTED_STICKY_MASK) >> 1; + + return retVal; +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDetectorRegError(uint32_t &error) +{ + uint32_t regVal = 0; + + // Read from 16-Bit Register + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + + regVal = sftk_byte_swap(regVal); + + // Mask unused bits from register + error = (regVal & SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK) >> SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK_SHIFT; + + return retVal; +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) +{ + uint32_t regVal = 0; + + // Read from 16-Bit Register + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + + // Mask unused bits from register + temp = (regVal & SFE_XM125_PRESENCE_TEMPERATURE_MASK) >> SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT; + + return retVal; +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) +{ + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)&distance, sizeof(uint32_t), readBytes); + distance = sftk_byte_swap(distance); + return retVal; +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) +{ + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&intra, sizeof(uint32_t), readBytes); + intra = sftk_byte_swap(intra); + return retVal; +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) +{ + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_INTER_PRESENCE, (uint8_t *)&inter, sizeof(uint32_t), readBytes); + inter = sftk_byte_swap(inter); + return retVal; +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) +{ + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&sweeps, sizeof(uint32_t), readBytes); + sweeps = sftk_byte_swap(sweeps); + return retVal; +} +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceSweepsPerFrame(uint32_t sweeps) +{ + sweeps = sftk_byte_swap(sweeps); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t *)&sweeps, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, + sizeof(uint32_t), readBytes); + time = sftk_byte_swap(time); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceInterFramePresenceTimeout(uint32_t time) +{ + time = sftk_byte_swap(time); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceInterPhaseBoostEnabled(bool &en) +{ + size_t readBytes = 0; + uint8_t value; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); + en = (value != 0); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceInterPhaseBoostEnabled(bool en) +{ + uint8_t value = en ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, + sizeof(uint8_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceIntraDetectionEnabled(bool &en) +{ + size_t readBytes = 0; + uint8_t value; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); + en = (value != 0); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceInterDetectionEnabled(bool en) +{ + uint8_t value = en ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, + sizeof(uint8_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) +{ + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, sizeof(uint32_t), readBytes); + rate = sftk_byte_swap(rate); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceFrameRate(uint32_t rate) +{ + rate = sftk_byte_swap(rate); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, + sizeof(uint32_t), readBytes); + thresh = sftk_byte_swap(thresh); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceIntraDetectionThreshold(uint32_t thresh) +{ + thresh = sftk_byte_swap(thresh); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, + sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, + sizeof(uint32_t), readBytes); + thresh = sftk_byte_swap(thresh); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceInterDetectionThreshold(uint32_t thresh) +{ + thresh = sftk_byte_swap(thresh); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, + sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, + sizeof(uint32_t), readBytes); + time = sftk_byte_swap(time); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceInterFrameDeviationTime(uint32_t time) +{ + time = sftk_byte_swap(time); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, + sizeof(uint32_t), readBytes); + cut = sftk_byte_swap(cut); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceInterFrameFastCutoff(uint32_t cut) +{ + cut = sftk_byte_swap(cut); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, + sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, + sizeof(uint32_t), readBytes); + cut = sftk_byte_swap(cut); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceInterFrameSlowCutoff(uint32_t cut) +{ + cut = sftk_byte_swap(cut); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, + sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t), readBytes); + time = sftk_byte_swap(time); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceIntraFrameTimeConst(uint32_t time) +{ + time = sftk_byte_swap(time); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t), readBytes); + time = sftk_byte_swap(time); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceIntraOutputTimeConst(uint32_t time) +{ + time = sftk_byte_swap(time); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t), readBytes); + time = sftk_byte_swap(time); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceInterOutputTimeConst(uint32_t time) +{ + time = sftk_byte_swap(time); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, + sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceAutoProfileEn(bool &en) +{ + size_t readBytes = 0; + uint8_t value; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); + en = (value != 0); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceAutoProfileEn(bool en) +{ + uint8_t value = en ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, sizeof(uint8_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceAutoStepLengthEn(bool &en) +{ + size_t readBytes = 0; + uint8_t value; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); + en = (value != 0); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceAutoStepLengthEn(bool en) +{ + uint8_t value = en ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, + sizeof(uint8_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) +{ + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, sizeof(uint32_t), readBytes); + prof = sftk_byte_swap(prof); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceManualProfile(uint32_t prof) +{ + prof = sftk_byte_swap(prof); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, + sizeof(uint32_t), readBytes); + length = sftk_byte_swap(length); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceManualStepLength(uint32_t length) +{ + length = sftk_byte_swap(length); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) +{ + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, sizeof(uint32_t), readBytes); + start = sftk_byte_swap(start); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceStart(uint32_t start) +{ + start = sftk_byte_swap(start); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) +{ + size_t readBytes = 0; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, sizeof(uint32_t), readBytes); + end = sftk_byte_swap(end); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceEnd(uint32_t end) +{ + end = sftk_byte_swap(end); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceResetFilters(bool &reset) +{ + size_t readBytes = 0; + uint8_t value; + sfTkError_t retVal = + _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t), readBytes); + reset = (value != 0); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceResetFilters(bool reset) +{ + uint8_t value = reset ? 1 : 0; + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceHWAAS(uint32_t &avg) +{ + size_t readBytes = 0; + return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t), readBytes); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceHWAAS(uint32_t avg) +{ + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) +{ + size_t readBytes = 0; + sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, + sizeof(uint32_t), readBytes); + detected = sftk_byte_swap(detected); + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::setPresenceDetectionOnGPIO(uint32_t detected) +{ + detected = sftk_byte_swap(detected); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, sizeof(uint32_t)); +} + +sfTkError_t sfDevXM125::setPresenceCommand(uint32_t cmd) +{ + cmd = sftk_byte_swap(cmd); + return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t *)&cmd, sizeof(uint32_t)); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::presenceApplyConfiguration() +{ + return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::presenceStart() +{ + return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::presenceStop() +{ + return setPresenceCommand(SFE_XM125_PRESENCE_STOP_DETECTOR); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::presenceEnableUartLogs() +{ + return setPresenceCommand(SFE_XM125_PRESENCE_ENABLE_UART_LOGS); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::presenceDisableUartLogs() +{ + return setPresenceCommand(SFE_XM125_PRESENCE_DISABLE_UART_LOGS); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::presenceLogConfiguration() +{ + return setPresenceCommand(SFE_XM125_PRESENCE_LOG_CONFIGURATION); +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::getPresenceBusy(uint32_t &busy) +{ + sfTkError_t retVal; + uint32_t regVal = 0; + + // Read from 16-Bit Register + size_t readBytes = 0; + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); + + regVal = sftk_byte_swap(regVal); + // Mask unused bits from register + busy = (regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> SFE_XM125_PRESENCE_BUSY_MASK_SHIFT; + + return retVal; +} + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125::presenceBusyWait() +{ + sfTkError_t retVal = 0; + uint32_t regVal = 0; + + size_t readBytes = 0; + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); + regVal = sftk_byte_swap(regVal); + + // Poll Detector Status until Busy bit is cleared + while (((regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> 30) != 0) + { + retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), + readBytes); + regVal = sftk_byte_swap(regVal); + } + + return retVal; +} From b2b59ec8dc7d3d9acbc15656c249021a3bf0eb43 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 11:23:59 -0700 Subject: [PATCH 17/32] moved the big mask check macro to header for both impl files to use --- src/sfTk/sfXM125Regs.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sfTk/sfXM125Regs.h b/src/sfTk/sfXM125Regs.h index 7d91929..5985f01 100644 --- a/src/sfTk/sfXM125Regs.h +++ b/src/sfTk/sfXM125Regs.h @@ -14,6 +14,10 @@ #include +// Handy helper - check if a bit(s) is set... + +#define SF_CHECK_BITS_SET(__value__, __bitmask__) (((__value__) & (__bitmask__)) == __bitmask__) + const uint16_t SFE_XM125_I2C_ADDRESS = 0x52; /* ****************************** Distance Values ****************************** */ From 4d591010ea6b4746ee0318f3a3548e309816d2d8 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 16:21:03 -0700 Subject: [PATCH 18/32] BIG refactor of class structure - broke the main class into two classes with a core base. The two main classes now correspond to the application running on the XM125 - v1 of this library had one class that contained everything - nuts. This will break backward compatablity, but the end user just needs to change the name of the class they are using --- .../Example01_PresenceBasicReadings.ino | 47 +- .../Example02_PresenceGPIO0Usage.ino | 81 +-- .../Example03_PresenceSerialPlotter.ino | 25 +- .../Example04_PresenceAdvancedReadings.ino | 81 +-- .../Example05_PresenceAdvancedSettings.ino | 119 +-- .../Example06_DistanceBasicReadings.ino | 177 ++--- .../Example07_DistanceThresholdSettings.ino | 166 ++--- .../Example08_DistanceSerialPlotter.ino | 40 +- .../Example09_DistanceAdvancedSettings.ino | 309 ++++---- library.properties | 4 +- src/SparkFun_Qwiic_XM125_Arduino_Library.h | 124 +++- src/sfTk/sfDevXM125Core.cpp | 36 + src/sfTk/sfDevXM125Core.h | 40 ++ src/sfTk/sfDevXM125Distance.cpp | 242 +++---- src/sfTk/sfDevXM125Distance.h | 679 ++++++++++++++++++ src/sfTk/sfDevXM125Presence.cpp | 187 ++--- .../{sfDevXM125.h => sfDevXM125Presence.h} | 611 ++++++---------- src/sfTk/sfXM125Regs.h | 481 ------------- 18 files changed, 1765 insertions(+), 1684 deletions(-) create mode 100644 src/sfTk/sfDevXM125Core.cpp create mode 100644 src/sfTk/sfDevXM125Core.h create mode 100644 src/sfTk/sfDevXM125Distance.h rename src/sfTk/{sfDevXM125.h => sfDevXM125Presence.h} (52%) delete mode 100644 src/sfTk/sfXM125Regs.h diff --git a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino index 4dd3c56..3dcef24 100644 --- a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino +++ b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino @@ -4,14 +4,14 @@ Using the Acconeer XM125 A121 60GHz Pulsed Coherent Radar Sensor. This example shows how operate the XM125 when the device is in Presence Reading Mode. - The sensor is initialized, then the presence distance values will print out + The sensor is initialized, then the presence distance values will print out to the terminal. By: Madison Chodikov SparkFun Electronics Date: 2024/1/22 SparkFun code, firmware, and software is released under the MIT License. - Please see LICENSE.md for further details. + Please see LICENSE.md for further details. Hardware Connections: QWIIC --> QWIIC @@ -21,15 +21,15 @@ Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/ - Qwiic XM125 Breakout */ -#include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" +#include -SparkFunXM125 radarSensor; +SparkFunXM125Presence radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Presence distance values +// Presence distance values uint32_t distance = 0; // Error statuses @@ -50,7 +50,7 @@ void setup() // If begin is successful (1), then start example int startErr = radarSensor.begin(i2cAddress, Wire); - if(startErr == 1) + if (startErr == 1) { Serial.println("Begin"); } @@ -59,15 +59,16 @@ void setup() Serial.print("Start Error Code: "); Serial.println(startErr); Serial.println("Device failed to setup - Freezing code."); - while(1); // Runs forever + while (1) + ; // Runs forever } // Start the sensor with default register values int32_t setupError = radarSensor.presenceDetectorStart(); - if(setupError != 0) + if (setupError != 0) { - Serial.print("Presence Detection Start Setup Error: "); - Serial.println(setupError); + Serial.print("Presence Detection Start Setup Error: "); + Serial.println(setupError); } // New line and delay for easier reading @@ -83,23 +84,23 @@ void loop() // Get the presence distance value and print out if no errors presValError = radarSensor.getPresenceDistanceValuemm(distance); - if(presValError == 0) + if (presValError == 0) { - Serial.print("Presence Detected: "); - Serial.print(distance); - Serial.println("mm"); - //Serial.print(distance * .1); - //Serial.println("cm"); - //Serial.print(distance * .001); - //Serial.println("m"); - //Serial.print(distance * .001); - //Serial.println("m"); - //Serial.print(distance * .03937008); - //Serial.println("In"); + Serial.print("Presence Detected: "); + Serial.print(distance); + Serial.println("mm"); + // Serial.print(distance * .1); + // Serial.println("cm"); + // Serial.print(distance * .001); + // Serial.println("m"); + // Serial.print(distance * .001); + // Serial.println("m"); + // Serial.print(distance * .03937008); + // Serial.println("In"); } else { - Serial.println("Error returning presence distance value"); + Serial.println("Error returning presence distance value"); } // Delay 0.5 seconds between readings diff --git a/examples/Example02_PresenceGPIO0Usage/Example02_PresenceGPIO0Usage.ino b/examples/Example02_PresenceGPIO0Usage/Example02_PresenceGPIO0Usage.ino index ec52b87..71c993a 100644 --- a/examples/Example02_PresenceGPIO0Usage/Example02_PresenceGPIO0Usage.ino +++ b/examples/Example02_PresenceGPIO0Usage/Example02_PresenceGPIO0Usage.ino @@ -4,14 +4,14 @@ Using the Acconeer XM125 A121 60GHz Pulsed Coherent Radar Sensor. This example shows how operate the XM125 when the device is in Presence Reading Mode. - The sensor is initialized, then the presence values will print out to the terminal - and trigger the GPIO0 pin high when there is a presence detected. + The sensor is initialized, then the presence values will print out to the terminal + and trigger the GPIO0 pin high when there is a presence detected. By: Madison Chodikov SparkFun Electronics Date: 2024/1/22 SparkFun code, firmware, and software is released under the MIT License. - Please see LICENSE.md for further details. + Please see LICENSE.md for further details. Hardware Connections: QWIIC --> QWIIC @@ -21,15 +21,15 @@ Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/ - Qwiic XM125 Breakout */ -#include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" +#include -SparkFunXM125 radarSensor; +SparkFunXM125Presence radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Presence distance values +// Presence distance values uint32_t distance = 0; uint32_t presenceDetected = 0; uint32_t presenceDetectedSticky = 0; @@ -46,14 +46,14 @@ void setup() { // Start serial Serial.begin(115200); - Serial.println("XM125 Example 2: Presence GPIO0 Pin Usage"); + Serial.println("XM125 Example 2: Presence GPIO0 Pin Usage"); Serial.println(""); Wire.begin(); // If begin is successful (0), then start example int startErr = radarSensor.begin(i2cAddress, Wire); - if(startErr == 1) + if (startErr == 1) { Serial.println("Begin"); } @@ -62,64 +62,65 @@ void setup() Serial.print("Start Error Code: "); Serial.println(startErr); Serial.println("Device failed to setup - Freezing code."); - while(1); // Runs forever + while (1) + ; // Runs forever } delay(200); - // Presence Sensor Setup + // Presence Sensor Setup // Reset sensor configuration to reapply configuration registers radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_RESET_MODULE); - // Check error and busy bits + // Check error and busy bits radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } delay(100); - // Turn presence detection on GPIO0 on - if(radarSensor.setPresenceDetectionOnGPIO(1) != 0) + // Turn presence detection on GPIO0 on + if (radarSensor.setPresenceDetectionOnGPIO(1) != 0) { - Serial.println("GPIO0 Pin Setup Error"); + Serial.println("GPIO0 Pin Setup Error"); } radarSensor.getPresenceDetectionOnGPIO(gpioUsage); Serial.print("GPIO0 Detection Status: "); Serial.println(gpioUsage); - // Apply configuration - if(radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != 0) + // Apply configuration + if (radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != 0) { - // Check for errors - radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) - { - Serial.print("Detector status error: "); - Serial.println(errorStatus); - } - - Serial.println("Configuration application error"); + // Check for errors + radarSensor.getPresenceDetectorErrorStatus(errorStatus); + if (errorStatus != 0) + { + Serial.print("Detector status error: "); + Serial.println(errorStatus); + } + + Serial.println("Configuration application error"); } // Poll detector status until busy bit is cleared - if(radarSensor.presenceBusyWait() != 0) + if (radarSensor.presenceBusyWait() != 0) { - Serial.print("Busy wait error"); + Serial.print("Busy wait error"); } - // Check detector status + // Check detector status radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } Serial.println(); - + delay(1000); } @@ -131,15 +132,15 @@ void loop() // Get the presence distance value and print out if no errors presValError = radarSensor.getPresenceDistanceValuemm(distance); - if(presValError == 0) + if (presValError == 0) { - Serial.print("Presence Detected: "); - Serial.print(distance); - Serial.println("mm"); + Serial.print("Presence Detected: "); + Serial.print(distance); + Serial.println("mm"); } else { - Serial.println("Error returning presence distance value"); + Serial.println("Error returning presence distance value"); } // Delay 0.5 seconds between readings diff --git a/examples/Example03_PresenceSerialPlotter/Example03_PresenceSerialPlotter.ino b/examples/Example03_PresenceSerialPlotter/Example03_PresenceSerialPlotter.ino index e91bc55..319ace7 100644 --- a/examples/Example03_PresenceSerialPlotter/Example03_PresenceSerialPlotter.ino +++ b/examples/Example03_PresenceSerialPlotter/Example03_PresenceSerialPlotter.ino @@ -11,7 +11,7 @@ SparkFun Electronics Date: 2024/1/22 SparkFun code, firmware, and software is released under the MIT License. - Please see LICENSE.md for further details. + Please see LICENSE.md for further details. Hardware Connections: QWIIC --> QWIIC @@ -21,15 +21,15 @@ Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/ - Qwiic XM125 Breakout */ -#include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" +#include -SparkFunXM125 radarSensor; +SparkFunXM125Presence radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Presence distance values +// Presence distance values uint32_t distance = 0; uint32_t presenceDetected = 0; uint32_t presenceDetectedSticky = 0; @@ -52,7 +52,7 @@ void setup() // If begin is successful (0), then start example int startErr = radarSensor.begin(i2cAddress, Wire); - if(startErr == 1) + if (startErr == 1) { Serial.println("Begin"); } @@ -61,17 +61,18 @@ void setup() Serial.print("Start Error Code: "); Serial.println(startErr); Serial.println("Device failed to setup - Freezing code."); - while(1); // Runs forever + while (1) + ; // Runs forever } delay(200); // Start the sensor with default register values int32_t setupError = radarSensor.presenceDetectorStart(); - if(setupError != 0) + if (setupError != 0) { - Serial.print("Presence Detection Start Setup Error: "); - Serial.println(setupError); + Serial.print("Presence Detection Start Setup Error: "); + Serial.println(setupError); } // New line and delay for easier reading @@ -87,10 +88,10 @@ void loop() // Get the presence distance value and print out if no errors presValError = radarSensor.getPresenceDistanceValuemm(distance); - if(presValError == 0) + if (presValError == 0) { - radarSensor.getPresenceDistance(distance); - Serial.println(distance); + radarSensor.getPresenceDistance(distance); + Serial.println(distance); } // Delay 0.5 seconds between readings diff --git a/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino b/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino index f255c11..512f80d 100644 --- a/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino +++ b/examples/Example04_PresenceAdvancedReadings/Example04_PresenceAdvancedReadings.ino @@ -4,14 +4,14 @@ Using the Acconeer XM125 A121 60GHz Pulsed Coherent Radar Sensor. This example shows how operate the XM125 when the device is in Presence Reading Mode. - The sensor is initialized, then the presence distance, intra-presence, and + The sensor is initialized, then the presence distance, intra-presence, and inter-presence values will be printed to the terminal. By: Madison Chodikov SparkFun Electronics Date: 2024/1/22 SparkFun code, firmware, and software is released under the MIT License. - Please see LICENSE.md for further details. + Please see LICENSE.md for further details. Hardware Connections: QWIIC --> QWIIC @@ -21,15 +21,15 @@ Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/ - Qwiic XM125 Breakout */ -#include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" +#include -SparkFunXM125 radarSensor; +SparkFunXM125Presence radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Presence distance values +// Presence distance values uint32_t distance = 0; uint32_t presenceDetected = 0; uint32_t presenceDetectedSticky = 0; @@ -53,7 +53,7 @@ void setup() // If begin is successful (1), then start example int startErr = radarSensor.begin(i2cAddress, Wire); - if(startErr == 1) + if (startErr == 1) { Serial.println("Begin"); } @@ -62,17 +62,18 @@ void setup() Serial.print("Start Error Code: "); Serial.println(startErr); Serial.println("Device failed to setup - Freezing code."); - while(1); // Runs forever + while (1) + ; // Runs forever } delay(200); // Start the sensor with default register values int32_t setupError = radarSensor.presenceDetectorStart(); - if(setupError != 0) + if (setupError != 0) { - Serial.print("Presence Detection Start Setup Error: "); - Serial.println(setupError); + Serial.print("Presence Detection Start Setup Error: "); + Serial.println(setupError); } // New line and delay for easier reading @@ -82,52 +83,52 @@ void setup() void loop() { - // Check error bits + // Check error bits radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } - - // Start detector - if(radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != 0) + + // Start detector + if (radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != 0) { - Serial.println("Start detector error"); + Serial.println("Start detector error"); } - + // Poll detector status until busy bit is cleared - CHECK ON THIS! - if(radarSensor.presenceBusyWait() != 0) + if (radarSensor.presenceBusyWait() != 0) { - Serial.println("Busy wait error"); + Serial.println("Busy wait error"); } - - // Verify that no error bits are set in the detector status register + + // Verify that no error bits are set in the detector status register radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } // Read detector result register and determine detection status radarSensor.getPresenceDetectorPresenceDetected(presenceDetected); radarSensor.getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky); - - if((presenceDetected == 1) || (presenceDetectedSticky == 1)) + + if ((presenceDetected == 1) || (presenceDetectedSticky == 1)) { - radarSensor.getPresenceDistance(distance); - Serial.print("Presence Detected: "); - Serial.print(distance); - Serial.println("mm"); - - radarSensor.getPresenceIntraPresenceScore(intraScore); - radarSensor.getPresenceInterPresenceScore(interScore); - - Serial.print("Intra-Presence Score: "); - Serial.println(intraScore); - Serial.print("Inter-Presence Score: "); - Serial.println(interScore); + radarSensor.getPresenceDistance(distance); + Serial.print("Presence Detected: "); + Serial.print(distance); + Serial.println("mm"); + + radarSensor.getPresenceIntraPresenceScore(intraScore); + radarSensor.getPresenceInterPresenceScore(interScore); + + Serial.print("Intra-Presence Score: "); + Serial.println(intraScore); + Serial.print("Inter-Presence Score: "); + Serial.println(interScore); } // Delay 0.5 second between readings diff --git a/examples/Example05_PresenceAdvancedSettings/Example05_PresenceAdvancedSettings.ino b/examples/Example05_PresenceAdvancedSettings/Example05_PresenceAdvancedSettings.ino index 2c07b21..3988041 100644 --- a/examples/Example05_PresenceAdvancedSettings/Example05_PresenceAdvancedSettings.ino +++ b/examples/Example05_PresenceAdvancedSettings/Example05_PresenceAdvancedSettings.ino @@ -4,7 +4,7 @@ Using the Acconeer XM125 A121 60GHz Pulsed Coherent Radar Sensor. This example shows how operate the XM125 when the device is in Presence Reading Mode. - The sensor is initialized, then the presence distance values will print out + The sensor is initialized, then the presence distance values will print out to the terminal just as they do in example one. If you wish to change the settings of the device, do so before applying the configuration. @@ -12,7 +12,7 @@ SparkFun Electronics Date: 2024/1/22 SparkFun code, firmware, and software is released under the MIT License. - Please see LICENSE.md for further details. + Please see LICENSE.md for further details. Hardware Connections: QWIIC --> QWIIC @@ -22,15 +22,15 @@ Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/ - Qwiic XM125 Breakout */ -#include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" +#include -SparkFunXM125 radarSensor; +SparkFunXM125Presence radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Presence distance values +// Presence distance values uint32_t distance = 0; uint32_t presenceDetected = 0; uint32_t presenceDetectedSticky = 0; @@ -55,7 +55,7 @@ void setup() // If begin is successful (1), then start example int startErr = radarSensor.begin(i2cAddress, Wire); - if(startErr == 1) + if (startErr == 1) { Serial.println("Begin"); } @@ -64,7 +64,8 @@ void setup() Serial.print("Start Error Code: "); Serial.println(startErr); Serial.println("Device failed to setup - Freezing code."); - while(1); // Runs forever + while (1) + ; // Runs forever } delay(200); @@ -73,109 +74,109 @@ void setup() // Reset sensor configuration to reapply configuration registers radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_RESET_MODULE); - // Check error and busy bits + // Check error and busy bits radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } delay(100); - - // Set Start register - if(radarSensor.setPresenceStart(beginReading) != 0) + + // Set Start register + if (radarSensor.setPresenceStart(beginReading) != 0) { - Serial.println("Presence Start Error"); + Serial.println("Presence Start Error"); } radarSensor.getPresenceStart(startVal); Serial.print("Start Val: "); Serial.println(startVal); - + delay(100); - // Set End register - if(radarSensor.setPresenceEnd(endReading) != 0) + // Set End register + if (radarSensor.setPresenceEnd(endReading) != 0) { - Serial.println("Presence End Error"); + Serial.println("Presence End Error"); } radarSensor.getPresenceEnd(endVal); Serial.print("End Val: "); Serial.println(endVal); delay(100); - // Apply configuration - if(radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != 0) + // Apply configuration + if (radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_APPLY_CONFIGURATION) != 0) { - // Check for errors - radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) - { - Serial.print("Detector status error: "); - Serial.println(errorStatus); - } - - Serial.println("Configuration application error"); + // Check for errors + radarSensor.getPresenceDetectorErrorStatus(errorStatus); + if (errorStatus != 0) + { + Serial.print("Detector status error: "); + Serial.println(errorStatus); + } + + Serial.println("Configuration application error"); } // Poll detector status until busy bit is cleared - if(radarSensor.presenceBusyWait() != 0) + if (radarSensor.presenceBusyWait() != 0) { - Serial.print("Busy wait error"); + Serial.print("Busy wait error"); } - // Check detector status + // Check detector status radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } Serial.println(); - + delay(1000); } void loop() { - // Check error bits + // Check error bits radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } - - // Start detector - if(radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != 0) + + // Start detector + if (radarSensor.setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != 0) { - Serial.println("Start detector error"); + Serial.println("Start detector error"); } - + // Poll detector status until busy bit is cleared - CHECK ON THIS! - if(radarSensor.presenceBusyWait() != 0) + if (radarSensor.presenceBusyWait() != 0) { - Serial.println("Busy wait error"); + Serial.println("Busy wait error"); } - - // Verify that no error bits are set in the detector status register + + // Verify that no error bits are set in the detector status register radarSensor.getPresenceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } // Read detector result register and determine detection status radarSensor.getPresenceDetectorPresenceDetected(presenceDetected); radarSensor.getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky); - - if((presenceDetected == 1) | (presenceDetectedSticky == 1)) + + if ((presenceDetected == 1) | (presenceDetectedSticky == 1)) { - radarSensor.getPresenceDistance(distance); - Serial.print("Presence Detected: "); - Serial.print(distance); - Serial.println("mm"); + radarSensor.getPresenceDistance(distance); + Serial.print("Presence Detected: "); + Serial.print(distance); + Serial.println("mm"); } // Delay 1 second between readings diff --git a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino index 6008490..c938f4f 100644 --- a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino +++ b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino @@ -4,14 +4,14 @@ Using the Acconeer XM125 A121 60GHz Pulsed Coherent Radar Sensor. This example shows how operate the XM125 when the device is in Distance Reading Mode. - The sensor is initialized, then the distance values will print out to the terminal in - mm. + The sensor is initialized, then the distance values will print out to the terminal in + mm. By: Madison Chodikov SparkFun Electronics Date: 2024/1/22 SparkFun code, firmware, and software is released under the MIT License. - Please see LICENSE.md for further details. + Please see LICENSE.md for further details. Hardware Connections: QWIIC --> QWIIC @@ -21,45 +21,45 @@ Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/ - Qwiic XM125 Breakout */ -#include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" +#include -SparkFunXM125 radarSensor; +SparkFunXM125Distance radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Setup Variables +// Setup Variables uint32_t startVal = 0; uint32_t endVal = 0; uint32_t numDistances = 9; uint32_t calibrateNeeded = 0; uint32_t measDistErr = 0; -// Error statuses +// Error statuses uint32_t errorStatus = 0; uint32_t distanceSetupError = 0; -// Distance Variables -uint32_t distancePeakStrength0 = 0; +// Distance Variables +int32_t distancePeakStrength0 = 0; uint32_t distancePeak0 = 0; -uint32_t distancePeakStrength1 = 0; +int32_t distancePeakStrength1 = 0; uint32_t distancePeak1 = 0; -uint32_t distancePeakStrength2 = 0; +int32_t distancePeakStrength2 = 0; uint32_t distancePeak2 = 0; -uint32_t distancePeakStrength3 = 0; +int32_t distancePeakStrength3 = 0; uint32_t distancePeak3 = 0; -uint32_t distancePeakStrength4 = 0; +int32_t distancePeakStrength4 = 0; uint32_t distancePeak4 = 0; -uint32_t distancePeakStrength5 = 0; +int32_t distancePeakStrength5 = 0; uint32_t distancePeak5 = 0; -uint32_t distancePeakStrength6 = 0; +int32_t distancePeakStrength6 = 0; uint32_t distancePeak6 = 0; -uint32_t distancePeakStrength7 = 0; +int32_t distancePeakStrength7 = 0; uint32_t distancePeak7 = 0; -uint32_t distancePeakStrength8 = 0; +int32_t distancePeakStrength8 = 0; uint32_t distancePeak8 = 0; -uint32_t distancePeakStrength9= 0; +int32_t distancePeakStrength9 = 0; uint32_t distancePeak9 = 0; void setup() @@ -72,21 +72,22 @@ void setup() Wire.begin(); // If begin is successful (0), then start example - if(radarSensor.begin(i2cAddress, Wire) == 1) + if (radarSensor.begin(i2cAddress, Wire) == 1) { Serial.println("Begin"); } else // Otherwise, infinite loop { Serial.println("Device failed to setup - Freezing code."); - while(1); // Runs forever + while (1) + ; // Runs forever } int32_t setupError = radarSensor.distanceBegin(); - if(setupError != 0) + if (setupError != 0) { - Serial.print("Distance Detection Start Setup Error: "); - Serial.println(setupError); + Serial.print("Distance Detection Start Setup Error: "); + Serial.println(setupError); } // New-line and 0.5 second delay for easier reading @@ -97,13 +98,13 @@ void setup() void loop() { distanceSetupError = radarSensor.distanceDetectorReadingSetup(); - if(distanceSetupError != 0) + if (distanceSetupError != 0) { - Serial.print("Distance Reading Setup Error: "); - Serial.println(distanceSetupError); + Serial.print("Distance Reading Setup Error: "); + Serial.println(distanceSetupError); } - // Read PeakX Distance and PeakX Strength registers for the number of distances detected + // Read PeakX Distance and PeakX Strength registers for the number of distances detected radarSensor.getDistancePeak0Distance(distancePeak0); radarSensor.getDistancePeak0Strength(distancePeakStrength0); radarSensor.getDistancePeak1Distance(distancePeak1); @@ -126,87 +127,87 @@ void loop() radarSensor.getDistancePeak9Strength(distancePeakStrength9); // If a peak distance was detected, then read out the distance and strength - if (distancePeak0 != 0) + if (distancePeak0 != 0) { - Serial.print("Peak0 Distance, Strength: "); - Serial.print(distancePeak0); - Serial.print("mm, "); - Serial.println(distancePeakStrength0); - Serial.println(); + Serial.print("Peak0 Distance, Strength: "); + Serial.print(distancePeak0); + Serial.print("mm, "); + Serial.println(distancePeakStrength0); + Serial.println(); } - if (distancePeak1 != 0) + if (distancePeak1 != 0) { - Serial.print("Peak1 Distance, Strength: "); - Serial.print(distancePeak1); - Serial.print("mm, "); - Serial.println(distancePeakStrength1); - Serial.println(); + Serial.print("Peak1 Distance, Strength: "); + Serial.print(distancePeak1); + Serial.print("mm, "); + Serial.println(distancePeakStrength1); + Serial.println(); } - if (distancePeak2 != 0) + if (distancePeak2 != 0) { - Serial.print("Peak2 Distance, Strength: "); - Serial.print(distancePeak2); - Serial.print("mm, "); - Serial.println(distancePeakStrength2); - Serial.println(); + Serial.print("Peak2 Distance, Strength: "); + Serial.print(distancePeak2); + Serial.print("mm, "); + Serial.println(distancePeakStrength2); + Serial.println(); } - if (distancePeak3 != 0) + if (distancePeak3 != 0) { - Serial.print("Peak3 Distance, Strength: "); - Serial.print(distancePeak3); - Serial.print("mm, "); - Serial.println(distancePeakStrength3); - Serial.println(); + Serial.print("Peak3 Distance, Strength: "); + Serial.print(distancePeak3); + Serial.print("mm, "); + Serial.println(distancePeakStrength3); + Serial.println(); } - if (distancePeak4 != 0) + if (distancePeak4 != 0) { - Serial.print("Peak4 Distance, Strength: "); - Serial.print(distancePeak4); - Serial.print("mm, "); - Serial.println(distancePeakStrength4); - Serial.println(); + Serial.print("Peak4 Distance, Strength: "); + Serial.print(distancePeak4); + Serial.print("mm, "); + Serial.println(distancePeakStrength4); + Serial.println(); } - if (distancePeak5 != 0) + if (distancePeak5 != 0) { - Serial.print("Peak5 Distance, Strength: "); - Serial.print(distancePeak5); - Serial.print("mm, "); - Serial.println(distancePeakStrength5); - Serial.println(); + Serial.print("Peak5 Distance, Strength: "); + Serial.print(distancePeak5); + Serial.print("mm, "); + Serial.println(distancePeakStrength5); + Serial.println(); } - if (distancePeak6 != 0) + if (distancePeak6 != 0) { - Serial.print("Peak6 Distance, Strength: "); - Serial.print(distancePeak6); - Serial.print("mm, "); - Serial.println(distancePeakStrength6); - Serial.println(); + Serial.print("Peak6 Distance, Strength: "); + Serial.print(distancePeak6); + Serial.print("mm, "); + Serial.println(distancePeakStrength6); + Serial.println(); } - if (distancePeak7 != 0) + if (distancePeak7 != 0) { - Serial.print("Peak7 Distance, Strength: "); - Serial.print(distancePeak7); - Serial.print("mm, "); - Serial.println(distancePeakStrength7); - Serial.println(); + Serial.print("Peak7 Distance, Strength: "); + Serial.print(distancePeak7); + Serial.print("mm, "); + Serial.println(distancePeakStrength7); + Serial.println(); } - if (distancePeak8 != 0) + if (distancePeak8 != 0) { - Serial.print("Peak8 Distance, Strength: "); - Serial.print(distancePeak8); - Serial.print("mm, "); - Serial.println(distancePeakStrength8); - Serial.println(); + Serial.print("Peak8 Distance, Strength: "); + Serial.print(distancePeak8); + Serial.print("mm, "); + Serial.println(distancePeakStrength8); + Serial.println(); } - if (distancePeak9 != 0) + if (distancePeak9 != 0) { - Serial.print("Peak9 Distance, Strength: "); - Serial.print(distancePeak9); - Serial.print("mm, "); - Serial.println(distancePeakStrength9); - Serial.println(); + Serial.print("Peak9 Distance, Strength: "); + Serial.print(distancePeak9); + Serial.print("mm, "); + Serial.println(distancePeakStrength9); + Serial.println(); } - // Half a second delay for easier readings + // Half a second delay for easier readings delay(500); } diff --git a/examples/Example07_DistanceThresholdSettings/Example07_DistanceThresholdSettings.ino b/examples/Example07_DistanceThresholdSettings/Example07_DistanceThresholdSettings.ino index 4ed2b26..bd4e1ab 100644 --- a/examples/Example07_DistanceThresholdSettings/Example07_DistanceThresholdSettings.ino +++ b/examples/Example07_DistanceThresholdSettings/Example07_DistanceThresholdSettings.ino @@ -1,17 +1,17 @@ /* - Example 7: Distance Threshold Settings - + Example 7: Distance Threshold Settings + Using the Acconeer XM125 A121 60GHz Pulsed Coherent Radar Sensor. This example shows how operate the XM125 when the device is in Distance Reading Mode. - The sensor is initialized, then the distance amplitude, and strength , fixed - amplitude, and sensitivity thresholds are set. + The sensor is initialized, then the distance amplitude, and strength , fixed + amplitude, and sensitivity thresholds are set. By: Madison Chodikov SparkFun Electronics Date: 2024/1/22 SparkFun code, firmware, and software is released under the MIT License. - Please see LICENSE.md for further details. + Please see LICENSE.md for further details. Hardware Connections: QWIIC --> QWIIC @@ -21,28 +21,28 @@ Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/ - Qwiic XM125 Breakout */ -#include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" +#include -SparkFunXM125 radarSensor; +SparkFunXM125Distance radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Setup Variables +// Setup Variables uint32_t startVal = 0; uint32_t endVal = 0; uint32_t numDistances = 9; uint32_t calibrateNeeded = 0; uint32_t measDistErr = 0; -// Error statuses +// Error statuses uint32_t errorStatus = 0; -// Distance Variables -uint32_t distancePeakStrength0 = 0; +// Distance Variables +int32_t distancePeakStrength0 = 0; uint32_t distancePeak0 = 0; -uint32_t distancePeakStrength1 = 0; +int32_t distancePeakStrength1 = 0; uint32_t distancePeak1 = 0; void setup() @@ -55,46 +55,47 @@ void setup() Wire.begin(); // If begin is successful (0), then start example - if(radarSensor.begin(i2cAddress, Wire) == 1) + if (radarSensor.begin(i2cAddress, Wire) == 1) { Serial.println("Begin"); } else // Otherwise, infinite loop { Serial.println("Device failed to setup - Freezing code."); - while(1); // Runs forever + while (1) + ; // Runs forever } - // Distance Sensor Setup + // Distance Sensor Setup // Reset sensor configuration to reapply configuration registers radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_RESET_MODULE); radarSensor.distanceBusyWait(); - // Check error and busy bits + // Check error and busy bits radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } delay(100); - - // Set Start register - if(radarSensor.setDistanceStart(100) != 0) + + // Set Start register + if (radarSensor.setDistanceStart(100) != 0) { - Serial.println("Distance Start Error"); + Serial.println("Distance Start Error"); } radarSensor.getDistanceStart(startVal); Serial.print("Start Val: "); Serial.println(startVal); - + delay(100); - // Set End register - if(radarSensor.setDistanceEnd(4000) != 0) + // Set End register + if (radarSensor.setDistanceEnd(4000) != 0) { - Serial.println("Distance End Error"); + Serial.println("Distance End Error"); } radarSensor.getDistanceEnd(endVal); Serial.print("End Val: "); @@ -104,113 +105,112 @@ void setup() // Set Distance Threshold Settings - Threshold Sensitivity (range: 0 to 1000) radarSensor.setDistanceThresholdSensitivity(100); - // Set Fixed Amplitude Threshold + // Set Fixed Amplitude Threshold radarSensor.setDistanceFixedAmpThreshold(100); - // Apply configuration - if(radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION) != 0) + // Apply configuration + if (radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION) != 0) { - // Check for errors - radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) - { - Serial.print("Detector status error: "); - Serial.println(errorStatus); - } - - Serial.println("Configuration application error"); + // Check for errors + radarSensor.getDistanceDetectorErrorStatus(errorStatus); + if (errorStatus != 0) + { + Serial.print("Detector status error: "); + Serial.println(errorStatus); + } + + Serial.println("Configuration application error"); } // Poll detector status until busy bit is cleared - if(radarSensor.distanceBusyWait() != 0) + if (radarSensor.distanceBusyWait() != 0) { - Serial.print("Busy wait error"); + Serial.print("Busy wait error"); } - // Check detector status + // Check detector status radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } Serial.println(); delay(1000); - } void loop() { - // Check error bits + // Check error bits radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } - - // Start detector - if(radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_START_DETECTOR) != 0) + + // Start detector + if (radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_START_DETECTOR) != 0) { - Serial.println("Start detector error"); + Serial.println("Start detector error"); } - + // Poll detector status until busy bit is cleared - CHECK ON THIS! - if(radarSensor.distanceBusyWait() != 0) + if (radarSensor.distanceBusyWait() != 0) { - Serial.println("Busy wait error"); + Serial.println("Busy wait error"); } - - // Verify that no error bits are set in the detector status register + + // Verify that no error bits are set in the detector status register radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } // Check MEASURE_DISTANCE_ERROR for measurement failed radarSensor.getDistanceMeasureDistanceError(measDistErr); - if(measDistErr == 1) + if (measDistErr == 1) { - Serial.println("Measure Distance Error"); + Serial.println("Measure Distance Error"); } - // Recalibrate device if calibration error is triggered + // Recalibrate device if calibration error is triggered radarSensor.getDistanceCalibrationNeeded(calibrateNeeded); - if(calibrateNeeded == 1) + if (calibrateNeeded == 1) { - Serial.println("Calibration Needed - Recalibrating.. "); - // Calibrate device (write RECALIBRATE command) - radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_RECALIBRATE); + Serial.println("Calibration Needed - Recalibrating.. "); + // Calibrate device (write RECALIBRATE command) + radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_RECALIBRATE); } - // Read PeakX Distance and PeakX Strength registers for the number of distances detected + // Read PeakX Distance and PeakX Strength registers for the number of distances detected radarSensor.getDistancePeak0Distance(distancePeak0); radarSensor.getDistancePeak0Strength(distancePeakStrength0); radarSensor.getDistancePeak1Distance(distancePeak1); radarSensor.getDistancePeak1Strength(distancePeakStrength1); // Read out 2 distances and peaks with threshold settings adjusted - if (distancePeak0 != 0) + if (distancePeak0 != 0) { - Serial.print("Peak0 Distance, Strength: "); - Serial.print(distancePeak0); - Serial.print("mm, "); - Serial.println(distancePeakStrength0); - Serial.println(); + Serial.print("Peak0 Distance, Strength: "); + Serial.print(distancePeak0); + Serial.print("mm, "); + Serial.println(distancePeakStrength0); + Serial.println(); } - if (distancePeak1 != 0) + if (distancePeak1 != 0) { - Serial.print("Peak1 Distance, Strength: "); - Serial.print(distancePeak1); - Serial.print("mm, "); - Serial.println(distancePeakStrength1); - Serial.println(); + Serial.print("Peak1 Distance, Strength: "); + Serial.print(distancePeak1); + Serial.print("mm, "); + Serial.println(distancePeakStrength1); + Serial.println(); } - // Half a second delay for easier readings + // Half a second delay for easier readings delay(500); } diff --git a/examples/Example08_DistanceSerialPlotter/Example08_DistanceSerialPlotter.ino b/examples/Example08_DistanceSerialPlotter/Example08_DistanceSerialPlotter.ino index e539d77..ca7bc3e 100644 --- a/examples/Example08_DistanceSerialPlotter/Example08_DistanceSerialPlotter.ino +++ b/examples/Example08_DistanceSerialPlotter/Example08_DistanceSerialPlotter.ino @@ -3,14 +3,14 @@ Using the Acconeer XM125 A121 60GHz Pulsed Coherent Radar Sensor. - This example prints out the distance values of the 0 distance - channels to the serial plotter tool in Arduino. + This example prints out the distance values of the 0 distance + channels to the serial plotter tool in Arduino. By: Madison Chodikov SparkFun Electronics Date: 2024/1/22 SparkFun code, firmware, and software is released under the MIT License. - Please see LICENSE.md for further details. + Please see LICENSE.md for further details. Hardware Connections: QWIIC --> QWIIC @@ -20,18 +20,18 @@ Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/ - Qwiic XM125 Breakout */ -#include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" +#include -SparkFunXM125 radarSensor; +SparkFunXM125Distance radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Error statuses +// Error statuses uint32_t distanceSetupError = 0; -// Distance Variables +// Distance Variables uint32_t distancePeak0 = 0; void setup() @@ -44,21 +44,22 @@ void setup() Wire.begin(); // If begin is successful (0), then start example - if(radarSensor.begin(i2cAddress, Wire) == 1) + if (radarSensor.begin(i2cAddress, Wire) == 1) { Serial.println("Begin"); } else // Otherwise, infinite loop { Serial.println("Device failed to setup - Freezing code."); - while(1); // Runs forever + while (1) + ; // Runs forever } int32_t setupError = radarSensor.distanceBegin(); - if(setupError != 0) + if (setupError != 0) { - Serial.print("Distance Detection Start Setup Error: "); - Serial.println(setupError); + Serial.print("Distance Detection Start Setup Error: "); + Serial.println(setupError); } // New-line and 0.5 second delay for easier reading @@ -69,22 +70,21 @@ void setup() void loop() { distanceSetupError = radarSensor.distanceDetectorReadingSetup(); - if(distanceSetupError != 0) + if (distanceSetupError != 0) { - Serial.print("Distance Reading Setup Error: "); - Serial.println(distanceSetupError); + Serial.print("Distance Reading Setup Error: "); + Serial.println(distanceSetupError); } - // Read PeakX Distance and PeakX Strength registers for the number of distances detected + // Read PeakX Distance and PeakX Strength registers for the number of distances detected radarSensor.getDistancePeak0Distance(distancePeak0); // If a peak distance was detected, then read out the distance and strength - if (distancePeak0 != 0) + if (distancePeak0 != 0) { - Serial.prinlnt(distancePeak0); + Serial.println(distancePeak0); } - // Half a second delay for easier readings + // Half a second delay for easier readings delay(500); - } diff --git a/examples/Example09_DistanceAdvancedSettings/Example09_DistanceAdvancedSettings.ino b/examples/Example09_DistanceAdvancedSettings/Example09_DistanceAdvancedSettings.ino index 00a159c..4f5b255 100644 --- a/examples/Example09_DistanceAdvancedSettings/Example09_DistanceAdvancedSettings.ino +++ b/examples/Example09_DistanceAdvancedSettings/Example09_DistanceAdvancedSettings.ino @@ -4,14 +4,14 @@ Using the Acconeer XM125 A121 60GHz Pulsed Coherent Radar Sensor. This example shows how operate the XM125 when the device is in Distance Reading Mode. - The sensor is initialized, then the distance values will print out to the terminal in - mm. + The sensor is initialized, then the distance values will print out to the terminal in + mm. By: Madison Chodikov SparkFun Electronics Date: 2024/1/22 SparkFun code, firmware, and software is released under the MIT License. - Please see LICENSE.md for further details. + Please see LICENSE.md for further details. Hardware Connections: QWIIC --> QWIIC @@ -21,15 +21,15 @@ Feel like supporting our work? Buy a board from SparkFun! https://www.sparkfun.com/products/ - Qwiic XM125 Breakout */ -#include #include "SparkFun_Qwiic_XM125_Arduino_Library.h" +#include -SparkFunXM125 radarSensor; +SparkFunXM125Distance radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Setup Variables +// Setup Variables uint32_t startVal = 0; uint32_t endVal = 0; uint32_t numDistances = 9; @@ -38,30 +38,12 @@ uint32_t measDistErr = 0; uint32_t beginReading = 300; uint32_t endReading = 7000; -// Error statuses +// Error statuses uint32_t errorStatus = 0; -// Distance Variables -uint32_t distancePeakStrength0 = 0; -uint32_t distancePeak0 = 0; -uint32_t distancePeakStrength1 = 0; -uint32_t distancePeak1 = 0; -uint32_t distancePeakStrength2 = 0; -uint32_t distancePeak2 = 0; -uint32_t distancePeakStrength3 = 0; -uint32_t distancePeak3 = 0; -uint32_t distancePeakStrength4 = 0; -uint32_t distancePeak4 = 0; -uint32_t distancePeakStrength5 = 0; -uint32_t distancePeak5 = 0; -uint32_t distancePeakStrength6 = 0; -uint32_t distancePeak6 = 0; -uint32_t distancePeakStrength7 = 0; -uint32_t distancePeak7 = 0; -uint32_t distancePeakStrength8 = 0; -uint32_t distancePeak8 = 0; -uint32_t distancePeakStrength9= 0; -uint32_t distancePeak9 = 0; +// Distance Variables +int32_t distancePeakStrength = 0; +uint32_t distancePeak = 0; void setup() { @@ -73,235 +55,188 @@ void setup() Wire.begin(); // If begin is successful (0), then start example - if(radarSensor.begin(i2cAddress, Wire) == 1) + if (radarSensor.begin(i2cAddress, Wire) == 1) { Serial.println("Begin"); } else // Otherwise, infinite loop { Serial.println("Device failed to setup - Freezing code."); - while(1); // Runs forever + while (1) + ; // Runs forever } - // Distance Sensor Setup + // Distance Sensor Setup // Reset sensor configuration to reapply configuration registers radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_RESET_MODULE); radarSensor.distanceBusyWait(); - // Check error and busy bits + // Check error and busy bits radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } delay(100); - - // Set Start register - if(radarSensor.setDistanceStart(beginReading) != 0) + + // Set Start register + if (radarSensor.setDistanceStart(beginReading) != 0) { - Serial.println("Distance Start Error"); + Serial.println("Distance Start Error"); } radarSensor.getDistanceStart(startVal); Serial.print("Start Val: "); Serial.println(startVal); - + delay(100); - // Set End register - if(radarSensor.setDistanceEnd(endReading) != 0) + // Set End register + if (radarSensor.setDistanceEnd(endReading) != 0) { - Serial.println("Distance End Error"); + Serial.println("Distance End Error"); } radarSensor.getDistanceEnd(endVal); Serial.print("End Val: "); Serial.println(endVal); delay(100); - // Apply configuration - if(radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION) != 0) + // Apply configuration + if (radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION) != 0) { - // Check for errors - radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) - { - Serial.print("Detector status error: "); - Serial.println(errorStatus); - } - - Serial.println("Configuration application error"); + // Check for errors + radarSensor.getDistanceDetectorErrorStatus(errorStatus); + if (errorStatus != 0) + { + Serial.print("Detector status error: "); + Serial.println(errorStatus); + } + + Serial.println("Configuration application error"); } // Poll detector status until busy bit is cleared - if(radarSensor.distanceBusyWait() != 0) + if (radarSensor.distanceBusyWait() != 0) { - Serial.print("Busy wait error"); + Serial.print("Busy wait error"); } - // Check detector status + // Check detector status radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } Serial.println(); delay(1000); - } +// Handy helpful output function + +void outputResults(uint sample, uint32_t distance, int32_t strength) +{ + if (distance == 0) + return; + Serial.print("Peak"); + Serial.print(sample); + Serial.print("Distance, Strength: "); + + Serial.print(distance); + Serial.print("mm, "); + Serial.println(strength); + Serial.println(); +} void loop() { - // Check error bits + // Check error bits radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } - - // Start detector - if(radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_START_DETECTOR) != 0) + + // Start detector + if (radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_START_DETECTOR) != 0) { - Serial.println("Start detector error"); + Serial.println("Start detector error"); } - + // Poll detector status until busy bit is cleared - CHECK ON THIS! - if(radarSensor.distanceBusyWait() != 0) + if (radarSensor.distanceBusyWait() != 0) { - Serial.println("Busy wait error"); + Serial.println("Busy wait error"); } - - // Verify that no error bits are set in the detector status register + + // Verify that no error bits are set in the detector status register radarSensor.getDistanceDetectorErrorStatus(errorStatus); - if(errorStatus != 0) + if (errorStatus != 0) { - Serial.print("Detector status error: "); - Serial.println(errorStatus); + Serial.print("Detector status error: "); + Serial.println(errorStatus); } // Check MEASURE_DISTANCE_ERROR for measurement failed radarSensor.getDistanceMeasureDistanceError(measDistErr); - if(measDistErr == 1) + if (measDistErr == 1) { - Serial.println("Measure Distance Error"); + Serial.println("Measure Distance Error"); } - // Recalibrate device if calibration error is triggered + // Recalibrate device if calibration error is triggered radarSensor.getDistanceCalibrationNeeded(calibrateNeeded); - if(calibrateNeeded == 1) + if (calibrateNeeded == 1) { - Serial.println("Calibration Needed - Recalibrating.. "); - // Calibrate device (write RECALIBRATE command) - radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_RECALIBRATE); + Serial.println("Calibration Needed - Recalibrating.. "); + // Calibrate device (write RECALIBRATE command) + radarSensor.setDistanceCommand(SFE_XM125_DISTANCE_RECALIBRATE); } - // Read PeakX Distance and PeakX Strength registers for the number of distances detected - radarSensor.getDistancePeak0Distance(distancePeak0); - radarSensor.getDistancePeak0Strength(distancePeakStrength0); - radarSensor.getDistancePeak1Distance(distancePeak1); - radarSensor.getDistancePeak1Strength(distancePeakStrength1); - radarSensor.getDistancePeak2Distance(distancePeak2); - radarSensor.getDistancePeak2Strength(distancePeakStrength2); - radarSensor.getDistancePeak3Distance(distancePeak3); - radarSensor.getDistancePeak3Strength(distancePeakStrength3); - radarSensor.getDistancePeak4Distance(distancePeak4); - radarSensor.getDistancePeak4Strength(distancePeakStrength4); - radarSensor.getDistancePeak5Distance(distancePeak5); - radarSensor.getDistancePeak5Strength(distancePeakStrength5); - radarSensor.getDistancePeak6Distance(distancePeak6); - radarSensor.getDistancePeak6Strength(distancePeakStrength6); - radarSensor.getDistancePeak7Distance(distancePeak7); - radarSensor.getDistancePeak7Strength(distancePeakStrength7); - radarSensor.getDistancePeak8Distance(distancePeak8); - radarSensor.getDistancePeak8Strength(distancePeakStrength8); - radarSensor.getDistancePeak9Distance(distancePeak9); - radarSensor.getDistancePeak9Strength(distancePeakStrength9); - - if (distancePeak0 != 0) - { - Serial.print("Peak0 Distance, Strength: "); - Serial.print(distancePeak0); - Serial.print("mm, "); - Serial.println(distancePeakStrength0); - Serial.println(); - } - if (distancePeak1 != 0) - { - Serial.print("Peak1 Distance, Strength: "); - Serial.print(distancePeak1); - Serial.print("mm, "); - Serial.println(distancePeakStrength1); - Serial.println(); - } - if (distancePeak2 != 0) - { - Serial.print("Peak2 Distance, Strength: "); - Serial.print(distancePeak2); - Serial.print("mm, "); - Serial.println(distancePeakStrength2); - Serial.println(); - } - if (distancePeak3 != 0) - { - Serial.print("Peak3 Distance, Strength: "); - Serial.print(distancePeak3); - Serial.print("mm, "); - Serial.println(distancePeakStrength3); - Serial.println(); - } - if (distancePeak4 != 0) - { - Serial.print("Peak4 Distance, Strength: "); - Serial.print(distancePeak4); - Serial.print("mm, "); - Serial.println(distancePeakStrength4); - Serial.println(); - } - if (distancePeak5 != 0) - { - Serial.print("Peak5 Distance, Strength: "); - Serial.print(distancePeak5); - Serial.print("mm, "); - Serial.println(distancePeakStrength5); - Serial.println(); - } - if (distancePeak6 != 0) - { - Serial.print("Peak6 Distance, Strength: "); - Serial.print(distancePeak6); - Serial.print("mm, "); - Serial.println(distancePeakStrength6); - Serial.println(); - } - if (distancePeak7 != 0) - { - Serial.print("Peak7 Distance, Strength: "); - Serial.print(distancePeak7); - Serial.print("mm, "); - Serial.println(distancePeakStrength7); - Serial.println(); - } - if (distancePeak8 != 0) - { - Serial.print("Peak8 Distance, Strength: "); - Serial.print(distancePeak8); - Serial.print("mm, "); - Serial.println(distancePeakStrength8); - Serial.println(); - } - if (distancePeak9 != 0) - { - Serial.print("Peak9 Distance, Strength: "); - Serial.print(distancePeak9); - Serial.print("mm, "); - Serial.println(distancePeakStrength9); - Serial.println(); - } + // Read PeakX Distance and PeakX Strength registers for the number of distances detected + radarSensor.getDistancePeak0Distance(distancePeak); + radarSensor.getDistancePeak0Strength(distancePeakStrength); + outputResults(0, distancePeak, distancePeakStrength); + + radarSensor.getDistancePeak1Distance(distancePeak); + radarSensor.getDistancePeak1Strength(distancePeakStrength); + outputResults(1, distancePeak, distancePeakStrength); + + radarSensor.getDistancePeak2Distance(distancePeak); + radarSensor.getDistancePeak2Strength(distancePeakStrength); + outputResults(2, distancePeak, distancePeakStrength); + + radarSensor.getDistancePeak3Distance(distancePeak); + radarSensor.getDistancePeak3Strength(distancePeakStrength); + outputResults(3, distancePeak, distancePeakStrength); + + radarSensor.getDistancePeak4Distance(distancePeak); + radarSensor.getDistancePeak4Strength(distancePeakStrength); + outputResults(4, distancePeak, distancePeakStrength); + + radarSensor.getDistancePeak5Distance(distancePeak); + radarSensor.getDistancePeak5Strength(distancePeakStrength); + outputResults(5, distancePeak, distancePeakStrength); + + radarSensor.getDistancePeak6Distance(distancePeak); + radarSensor.getDistancePeak6Strength(distancePeakStrength); + outputResults(6, distancePeak, distancePeakStrength); + + radarSensor.getDistancePeak7Distance(distancePeak); + radarSensor.getDistancePeak7Strength(distancePeakStrength); + outputResults(7, distancePeak, distancePeakStrength); + + radarSensor.getDistancePeak8Distance(distancePeak); + radarSensor.getDistancePeak8Strength(distancePeakStrength); + outputResults(8, distancePeak, distancePeakStrength); + + radarSensor.getDistancePeak9Distance(distancePeak); + radarSensor.getDistancePeak9Strength(distancePeakStrength); + outputResults(9, distancePeak, distancePeakStrength); - // Half a second delay for easier readings + // Half a second delay for easier readings delay(500); } diff --git a/library.properties b/library.properties index 13bace7..08e5df5 100644 --- a/library.properties +++ b/library.properties @@ -1,9 +1,9 @@ name=SparkFun XM125 Arduino Library -version=1.1.0 +version=2.0.0 author=SparkFun Electronics maintainer=SparkFun Electronics sentence=An Arduino library to make use of the Qwiic XM125 A121 Pulsed Radar Module from Acconeer. -paragraph=This is the SparkFun library for the Acconeer Entry+ Module XM125 with the A121 60GHz Pulsed Coherent Radar sensor and I2C interface. +paragraph=This is the SparkFun library for the Acconeer Entry+ Module XM125 with the A121 60GHz Pulsed Coherent Radar sensor and I2C interface. NOTE: Version 2.0 or greater of this library is not backward compatiable with version 1 - the library object has changed - see examples category=Sensors url=https://github.com/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library architectures=* diff --git a/src/SparkFun_Qwiic_XM125_Arduino_Library.h b/src/SparkFun_Qwiic_XM125_Arduino_Library.h index 396d516..c79588a 100644 --- a/src/SparkFun_Qwiic_XM125_Arduino_Library.h +++ b/src/SparkFun_Qwiic_XM125_Arduino_Library.h @@ -1,7 +1,7 @@ /*! * @file SparkFun_Qwiic_XM125_Arduino_Library.h - * @brief Arduino header file for the SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (Qwiic) + * @brief Arduino header file for the SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (Qwiic) * * This file contains the class definitions for the SparkFun Pulsed Coherent Radar Sensor Arduino library, * including methods for initialization, distance and presence detection, and configuration. @@ -10,47 +10,109 @@ * @author SparkFun Electronics * @date 2024 * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. - * + * * SPDX-License-Identifier: MIT */ #pragma once - // To make the Arduino machine happy, include the toolkit header before the core implementation for this device + +// clang-format off #include -#include "sfTk/sfDevXM125.h" +#include "sfTk/sfDevXM125Core.h" +#include "sfTk/sfDevXM125Distance.h" +#include "sfTk/sfDevXM125Presence.h" +// clang-format on #include #include -class SparkFunXM125 : public sfDevXM125 +/** + * @class SparkFunXM125Distance + * @brief Arduino class for the SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (Qwiic) for distance detection. + * + * This class provides methods for initializing the sensor, checking connection status, and configuring the device + * for distance detection using I2C communication. + */ +class SparkFunXM125Distance : public sfDevXM125Distance { - public: - - SparkFunXM125() - { - } - - /// @brief Sets up Arduino I2C driver using the specified I2C address then calls the super class begin. - /// @param address Address of the I2C device. - /// @param wirePort Wire port of the I2C device. - /// @return True if successful, false otherwise. - bool begin(uint8_t deviceAddress = SFE_XM125_I2C_ADDRESS, TwoWire &wirePort = Wire) - { - // Give the I2C port provided by the user to the I2C bus class. - _i2cBus.init(wirePort, deviceAddress); - - // Initialize the system - return results - return this->sfDevXM125::begin(&_i2cBus) == 0; - } - - private: - - // I2C bus class - sfTkArdI2C _i2cBus; + public: + SparkFunXM125Distance() + { + } + + /** + * @brief Sets up Arduino I2C driver using the specified I2C address then calls the super class begin. + * + * @param deviceAddress Address of the I2C device. Default is SFE_XM125_I2C_ADDRESS. + * @param wirePort Wire port of the I2C device. Default is Wire. + * @return True if successful, false otherwise. + */ + bool begin(uint8_t deviceAddress = SFE_XM125_I2C_ADDRESS, TwoWire &wirePort = Wire) + { + // Give the I2C port provided by the user to the I2C bus class. + _i2cBus.init(wirePort, deviceAddress); + + // Initialize the system - return results + return this->sfDevXM125Distance::begin(&_i2cBus) == ksfTkErrOk; + } + + /** + * @brief Checks if the device is connected. + * + * @return True if the sensor is connected, false otherwise. + */ + bool isConnected() + { + return _i2cBus.ping() == ksfTkErrOk; + } + private: + // I2C bus class + sfTkArdI2C _i2cBus; }; -// for backward compatibility - -class SfeXM125 : public SparkFunXM125 -{ }; +/** + * @class SparkFunXM125Presence + * @brief Arduino class for the SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (Qwiic) for presence detection. + * + * This class provides methods for initializing the sensor, checking connection status, and configuring the device + * for presence detection using I2C communication. + */ +class SparkFunXM125Presence : public sfDevXM125Presence +{ + public: + SparkFunXM125Presence() + { + } + + /** + * @brief Sets up Arduino I2C driver using the specified I2C address then calls the super class begin. + * + * @param deviceAddress Address of the I2C device. Default is SFE_XM125_I2C_ADDRESS. + * @param wirePort Wire port of the I2C device. Default is Wire. + * @return True if successful, false otherwise. + */ + bool begin(uint8_t deviceAddress = SFE_XM125_I2C_ADDRESS, TwoWire &wirePort = Wire) + { + // Give the I2C port provided by the user to the I2C bus class. + _i2cBus.init(wirePort, deviceAddress); + + // Initialize the system - return results + return this->sfDevXM125Presence::begin(&_i2cBus) == ksfTkErrOk; + } + + /** + * @brief Checks if the device is connected. + * + * @return True if the sensor is connected, false otherwise. + */ + bool isConnected() + { + return _i2cBus.ping() == ksfTkErrOk; + } + + private: + // I2C bus class + sfTkArdI2C _i2cBus; +}; diff --git a/src/sfTk/sfDevXM125Core.cpp b/src/sfTk/sfDevXM125Core.cpp new file mode 100644 index 0000000..ea411a4 --- /dev/null +++ b/src/sfTk/sfDevXM125Core.cpp @@ -0,0 +1,36 @@ +/** + * @file sfDevXM125Core.cpp + * @brief Implementation of the SparkFun Qwiic XM125 Library - Core object + * + * This is the core for object that is used to control/setup/connect to the XM125 device. + * Additional functionality - via templates - add added to this core to support the + * various applications supported by the XM125 device. + * + * + * + * The file includes the object lifecycle methods, and Toolkit bus instance data. + * + * @author SparkFun Electronics + * @date 2024-2025 + * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. + * + * SPDX-License-Identifier: MIT + */ +#include "sfDevXM125Core.h" + +//-------------------------------------------------------------------------------- +sfTkError_t sfDevXM125Core::begin(sfTkII2C *theBus) +{ + if (theBus == nullptr) + return ksfTkErrBusNotInit; + + // Check if the provided address is valid + if (theBus->address() != SFE_XM125_I2C_ADDRESS) + return ksfTkErrFail; + + // Sets communication bus + _theBus = theBus; + + // return the value of ping + return theBus->ping(); +} diff --git a/src/sfTk/sfDevXM125Core.h b/src/sfTk/sfDevXM125Core.h new file mode 100644 index 0000000..e370457 --- /dev/null +++ b/src/sfTk/sfDevXM125Core.h @@ -0,0 +1,40 @@ +/** + * @file sfDevXM125.h + * @brief Header of the SparkFun Qwiic XM125 Library. + * + * This file contains the header declares of the functions for interfacing with + * the SparkFun Qwiic XM125 distance and presence detector using I2C communication. + * + * @author SparkFun Electronics + * @date 2024-2025 + * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. + * + * SPDX-License-Identifier: MIT + */ +#pragma once + +#include + +#include +// Bus interfaces +#include + +// The I2C address for the device +const uint16_t SFE_XM125_I2C_ADDRESS = 0x52; + +class sfDevXM125Core +{ + public: + /// @brief Initializer + sfDevXM125Core() : _theBus{nullptr} {}; + + /// @brief This function begins the examples/communication. + /// @return ksfTkErrOk on success, or error code (value < -1) + virtual sfTkError_t begin(sfTkII2C *theBus = nullptr); + + virtual ~sfDevXM125Core() {}; + + protected: + // our toolkit bus + sfTkII2C *_theBus; +}; diff --git a/src/sfTk/sfDevXM125Distance.cpp b/src/sfTk/sfDevXM125Distance.cpp index b1bc089..4cbba66 100644 --- a/src/sfTk/sfDevXM125Distance.cpp +++ b/src/sfTk/sfDevXM125Distance.cpp @@ -1,13 +1,13 @@ /** - * @file sfDevXM125Distance.cpp - * @brief Implementation of the SparkFun Qwiic XM125 Library. Focusing on Distance methods + * @file sfDevXM125Distance.h + * @brief Implementation of the SparkFun Qwiic XM125 Library - Methods for the Distance app * - * The implementation of the sfDevXM125 class is spread across two files. - * - * This file contains the implementation of the functions for interfacing with - * the SparkFun Qwiic XM125 distance and presence detector using I2C communication. - * - * The file includes the object lifecycle methods, and the set of distance methods + * This file contains the implementation methods for the distance detection functionality. This + * is done using a template, which is then paired with the core class to provide the desired + * functionality. + * + * For this paying attention - yes, this is an example of Curiously Recurring Template Pattern (CRTP) + * design pattern - https://www.fluentcpp.com/2017/05/12/curiously-recurring-template-pattern/ * * @author SparkFun Electronics * @date 2024-2025 @@ -15,52 +15,33 @@ * * SPDX-License-Identifier: MIT */ -#include "sfDevXM125.h" - -//-------------------------------------------------------------------------------- -bool sfDevXM125::begin(sfTkII2C *theBus) -{ - if (theBus == nullptr) - { - return ksfTkErrFail; - } - // Check if the provided address is valid - if (theBus->address() != SFE_XM125_I2C_ADDRESS) - { - return ksfTkErrFail; - } +#include "sfDevXM125Distance.h" - // Sets communication bus - _theBus = theBus; +//------------------------------------------------------------------ +// begin method - overrides the super class begin - +// +sfTkError_t sfDevXM125Distance::begin(sfTkII2C *theBus) +{ + // call super to get the device connection working + sfTkError_t retVal = sfDevXM125Core::begin(theBus); + if (retVal != ksfTkErrOk) + return retVal; - // Check errors from device + // Check errors from device application uint32_t distanceError = 0; - uint32_t presenceError = 0; - int32_t distFuncErr = 0; - int32_t presFuncErr = 0; + retVal = getDistanceDetectorError(distanceError); + if (retVal != ksfTkErrOk) + return retVal; - distFuncErr = getDistanceDetectorError(distanceError); - presFuncErr = getDistanceDetectorError(presenceError); + // Additional checks for distance errors if (distanceError != 0) - { - return -1; - } - if (presenceError != 0) - { - return -2; - } - if ((distFuncErr != 0) || (presFuncErr != 0)) - { - return -3; - } + return ksfTkErrFail; // Indicating distance error - // If no errors, return 0 - return 0; + return ksfTkErrOk; } - -// --------------------- I2C Disance Detector Functions --------------------- -int32_t sfDevXM125::distanceBegin() +//------------------------------------------------------------------ +int32_t sfDevXM125Distance::distanceBegin() { uint32_t errorStatus = 0; @@ -127,7 +108,7 @@ int32_t sfDevXM125::distanceBegin() } //-------------------------------------------------------------------------------- -int32_t sfDevXM125::distanceDetectorReadingSetup() +int32_t sfDevXM125Distance::distanceDetectorReadingSetup() { uint32_t errorStatus = 0; uint32_t calibrateNeeded = 0; @@ -182,7 +163,7 @@ int32_t sfDevXM125::distanceDetectorReadingSetup() } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) +sfTkError_t sfDevXM125Distance::getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) { sfTkError_t retVal; uint32_t regVal = 0; @@ -201,7 +182,7 @@ sfTkError_t sfDevXM125::getDistanceDetectorVersion(uint32_t &major, uint32_t &mi } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceDetectorError(uint32_t &error) +sfTkError_t sfDevXM125Distance::getDistanceDetectorError(uint32_t &error) { // Read from 16-Bit Register size_t readBytes = 0; @@ -212,7 +193,7 @@ sfTkError_t sfDevXM125::getDistanceDetectorError(uint32_t &error) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceDetectorErrorStatus(uint32_t &status) +sfTkError_t sfDevXM125Distance::getDistanceDetectorErrorStatus(uint32_t &status) { sfTkError_t retVal; uint32_t regVal = 0; @@ -232,47 +213,47 @@ sfTkError_t sfDevXM125::getDistanceDetectorErrorStatus(uint32_t &status) return ksfTkErrOk; // okay some bit is set... - if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK)) + if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK)) status = 1; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK)) status = 2; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK)) status = 3; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK)) status = 5; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK)) status = 6; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK)) status = 7; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK)) status = 8; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK)) status = 9; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK)) status = 10; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK)) status = 11; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK)) status = 12; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_BUSY_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_DISTANCE_BUSY_MASK)) status = 13; return ksfTkErrOk; // return 0 with no errors } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceMeasureCounter(uint32_t &counter) +sfTkError_t sfDevXM125Distance::getDistanceMeasureCounter(uint32_t &counter) { // Read from 16-Bit Register size_t readBytes = 0; @@ -283,7 +264,7 @@ sfTkError_t sfDevXM125::getDistanceMeasureCounter(uint32_t &counter) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceDetectorStatus(uint32_t &status) +sfTkError_t sfDevXM125Distance::getDistanceDetectorStatus(uint32_t &status) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)&status, @@ -293,7 +274,7 @@ sfTkError_t sfDevXM125::getDistanceDetectorStatus(uint32_t &status) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceNumberDistances(uint32_t &distance) +sfTkError_t sfDevXM125Distance::getDistanceNumberDistances(uint32_t &distance) { sfTkError_t retVal; uint32_t regVal = 0; @@ -310,7 +291,7 @@ sfTkError_t sfDevXM125::getDistanceNumberDistances(uint32_t &distance) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceNearStartEdge(uint32_t &edge) +sfTkError_t sfDevXM125Distance::getDistanceNearStartEdge(uint32_t &edge) { sfTkError_t retVal; uint32_t regVal = 0; @@ -327,7 +308,7 @@ sfTkError_t sfDevXM125::getDistanceNearStartEdge(uint32_t &edge) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceCalibrationNeeded(uint32_t &calibrate) +sfTkError_t sfDevXM125Distance::getDistanceCalibrationNeeded(uint32_t &calibrate) { sfTkError_t retVal; uint32_t regVal = 0; @@ -345,7 +326,7 @@ sfTkError_t sfDevXM125::getDistanceCalibrationNeeded(uint32_t &calibrate) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceMeasureDistanceError(uint32_t &error) +sfTkError_t sfDevXM125Distance::getDistanceMeasureDistanceError(uint32_t &error) { sfTkError_t retVal; uint32_t regVal = 0; @@ -363,7 +344,7 @@ sfTkError_t sfDevXM125::getDistanceMeasureDistanceError(uint32_t &error) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceTemperature(int16_t &temperature) +sfTkError_t sfDevXM125Distance::getDistanceTemperature(int16_t &temperature) { sfTkError_t retVal; uint32_t regVal = 0; @@ -377,13 +358,14 @@ sfTkError_t sfDevXM125::getDistanceTemperature(int16_t &temperature) regVal = sftk_byte_swap(regVal); // Mask unused bits from register - temperature = static_cast((regVal & SFE_XM125_DISTANCE_TEMPERATURE_MASK) >> SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT); + temperature = static_cast((regVal & SFE_XM125_DISTANCE_TEMPERATURE_MASK) >> + SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT); return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak0Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak0Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -393,7 +375,7 @@ sfTkError_t sfDevXM125::getDistancePeak0Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak1Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak1Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -403,7 +385,7 @@ sfTkError_t sfDevXM125::getDistancePeak1Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak2Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak2Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -413,7 +395,7 @@ sfTkError_t sfDevXM125::getDistancePeak2Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak3Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak3Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -423,7 +405,7 @@ sfTkError_t sfDevXM125::getDistancePeak3Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak4Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak4Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -433,7 +415,7 @@ sfTkError_t sfDevXM125::getDistancePeak4Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak5Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak5Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -443,7 +425,7 @@ sfTkError_t sfDevXM125::getDistancePeak5Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak6Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak6Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -453,7 +435,7 @@ sfTkError_t sfDevXM125::getDistancePeak6Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak7Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak7Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -463,7 +445,7 @@ sfTkError_t sfDevXM125::getDistancePeak7Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak8Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak8Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -473,7 +455,7 @@ sfTkError_t sfDevXM125::getDistancePeak8Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak9Distance(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak9Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -483,7 +465,7 @@ sfTkError_t sfDevXM125::getDistancePeak9Distance(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak0Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak0Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -494,7 +476,7 @@ sfTkError_t sfDevXM125::getDistancePeak0Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak1Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak1Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -505,7 +487,7 @@ sfTkError_t sfDevXM125::getDistancePeak1Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak2Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak2Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -516,7 +498,7 @@ sfTkError_t sfDevXM125::getDistancePeak2Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak3Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak3Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -527,7 +509,7 @@ sfTkError_t sfDevXM125::getDistancePeak3Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak4Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak4Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -538,7 +520,7 @@ sfTkError_t sfDevXM125::getDistancePeak4Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak5Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak5Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -549,7 +531,7 @@ sfTkError_t sfDevXM125::getDistancePeak5Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak6Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak6Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -560,7 +542,7 @@ sfTkError_t sfDevXM125::getDistancePeak6Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak7Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak7Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -571,7 +553,7 @@ sfTkError_t sfDevXM125::getDistancePeak7Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak8Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak8Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -582,7 +564,7 @@ sfTkError_t sfDevXM125::getDistancePeak8Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeak9Strength(int32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeak9Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -593,7 +575,7 @@ sfTkError_t sfDevXM125::getDistancePeak9Strength(int32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceStart(uint32_t &startVal) +sfTkError_t sfDevXM125Distance::getDistanceStart(uint32_t &startVal) { size_t readBytes = 0; sfTkError_t retVal = @@ -603,14 +585,14 @@ sfTkError_t sfDevXM125::getDistanceStart(uint32_t &startVal) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceStart(uint32_t start) +sfTkError_t sfDevXM125Distance::setDistanceStart(uint32_t start) { start = sftk_byte_swap(start); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&start, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceEnd(uint32_t &end) +sfTkError_t sfDevXM125Distance::getDistanceEnd(uint32_t &end) { size_t readBytes = 0; sfTkError_t retVal = @@ -620,14 +602,14 @@ sfTkError_t sfDevXM125::getDistanceEnd(uint32_t &end) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceEnd(uint32_t end) +sfTkError_t sfDevXM125Distance::setDistanceEnd(uint32_t end) { end = sftk_byte_swap(end); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceMaxStepLength(uint32_t &length) +sfTkError_t sfDevXM125Distance::getDistanceMaxStepLength(uint32_t &length) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, @@ -637,14 +619,14 @@ sfTkError_t sfDevXM125::getDistanceMaxStepLength(uint32_t &length) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceMaxStepLength(uint32_t length) +sfTkError_t sfDevXM125Distance::setDistanceMaxStepLength(uint32_t length) { length = sftk_byte_swap(length); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceCloseRangeLeakageCancellation(bool &range) +sfTkError_t sfDevXM125Distance::getDistanceCloseRangeLeakageCancellation(bool &range) { size_t readBytes = 0; uint8_t readVal = 0; @@ -658,14 +640,14 @@ sfTkError_t sfDevXM125::getDistanceCloseRangeLeakageCancellation(bool &range) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceCloseRangeLeakageCancellation(bool range) +sfTkError_t sfDevXM125Distance::setDistanceCloseRangeLeakageCancellation(bool range) { uint8_t value = range ? 1 : 0; return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, &value, sizeof(value)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceSignalQuality(uint32_t &signal) +sfTkError_t sfDevXM125Distance::getDistanceSignalQuality(uint32_t &signal) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, @@ -675,14 +657,14 @@ sfTkError_t sfDevXM125::getDistanceSignalQuality(uint32_t &signal) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceSignalQuality(uint32_t signal) +sfTkError_t sfDevXM125Distance::setDistanceSignalQuality(uint32_t signal) { signal = sftk_byte_swap(signal); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceMaxProfile(uint32_t &profile) +sfTkError_t sfDevXM125Distance::getDistanceMaxProfile(uint32_t &profile) { size_t readBytes = 0; sfTkError_t retVal = @@ -692,14 +674,14 @@ sfTkError_t sfDevXM125::getDistanceMaxProfile(uint32_t &profile) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceMaxProfile(uint32_t profile) +sfTkError_t sfDevXM125Distance::setDistanceMaxProfile(uint32_t profile) { profile = sftk_byte_swap(profile); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceThresholdMethod(uint32_t &method) +sfTkError_t sfDevXM125Distance::getDistanceThresholdMethod(uint32_t &method) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, @@ -709,14 +691,14 @@ sfTkError_t sfDevXM125::getDistanceThresholdMethod(uint32_t &method) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceThresholdMethod(uint32_t method) +sfTkError_t sfDevXM125Distance::setDistanceThresholdMethod(uint32_t method) { method = sftk_byte_swap(method); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistancePeakSorting(uint32_t &peak) +sfTkError_t sfDevXM125Distance::getDistancePeakSorting(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = @@ -726,14 +708,14 @@ sfTkError_t sfDevXM125::getDistancePeakSorting(uint32_t &peak) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistancePeakSorting(uint32_t peak) +sfTkError_t sfDevXM125Distance::setDistancePeakSorting(uint32_t peak) { peak = sftk_byte_swap(peak); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) +sfTkError_t sfDevXM125Distance::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, @@ -743,7 +725,7 @@ sfTkError_t sfDevXM125::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceNumFramesRecordedThreshold(uint32_t thresh) +sfTkError_t sfDevXM125Distance::setDistanceNumFramesRecordedThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, @@ -751,7 +733,7 @@ sfTkError_t sfDevXM125::setDistanceNumFramesRecordedThreshold(uint32_t thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) +sfTkError_t sfDevXM125Distance::getDistanceFixedAmpThreshold(uint32_t &thresh) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, @@ -761,7 +743,7 @@ sfTkError_t sfDevXM125::getDistanceFixedAmpThreshold(uint32_t &thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceFixedAmpThreshold(uint32_t thresh) +sfTkError_t sfDevXM125Distance::setDistanceFixedAmpThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t *)&thresh, @@ -769,7 +751,7 @@ sfTkError_t sfDevXM125::setDistanceFixedAmpThreshold(uint32_t thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) +sfTkError_t sfDevXM125Distance::getDistanceThresholdSensitivity(uint32_t &thresh) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, @@ -779,7 +761,7 @@ sfTkError_t sfDevXM125::getDistanceThresholdSensitivity(uint32_t &thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceThresholdSensitivity(uint32_t thresh) +sfTkError_t sfDevXM125Distance::setDistanceThresholdSensitivity(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, @@ -787,7 +769,7 @@ sfTkError_t sfDevXM125::setDistanceThresholdSensitivity(uint32_t thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceReflectorShape(uint32_t &shape) +sfTkError_t sfDevXM125Distance::getDistanceReflectorShape(uint32_t &shape) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, @@ -797,14 +779,14 @@ sfTkError_t sfDevXM125::getDistanceReflectorShape(uint32_t &shape) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceReflectorShape(uint32_t shape) +sfTkError_t sfDevXM125Distance::setDistanceReflectorShape(uint32_t shape) { shape = sftk_byte_swap(shape); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) +sfTkError_t sfDevXM125Distance::getDistanceFixedStrengthThresholdValue(int32_t &thresh) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, @@ -814,7 +796,7 @@ sfTkError_t sfDevXM125::getDistanceFixedStrengthThresholdValue(int32_t &thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceFixedStrengthThresholdValue(int32_t thresh) +sfTkError_t sfDevXM125Distance::setDistanceFixedStrengthThresholdValue(int32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t *)&thresh, @@ -822,7 +804,7 @@ sfTkError_t sfDevXM125::setDistanceFixedStrengthThresholdValue(int32_t thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getDistanceMeasureOneWakeup(bool &measure) +sfTkError_t sfDevXM125Distance::getDistanceMeasureOneWakeup(bool &measure) { size_t readBytes = 0; uint8_t value; @@ -833,75 +815,75 @@ sfTkError_t sfDevXM125::getDistanceMeasureOneWakeup(bool &measure) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceMeasureOneWakeup(bool measure) +sfTkError_t sfDevXM125Distance::setDistanceMeasureOneWakeup(bool measure) { uint8_t value = static_cast(measure); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setDistanceCommand(uint32_t command) +sfTkError_t sfDevXM125Distance::setDistanceCommand(uint32_t command) { command = sftk_byte_swap(command); return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_COMMAND, (uint8_t *)&command, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceApplyConfiguration() +sfTkError_t sfDevXM125Distance::distanceApplyConfiguration() { return setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceStart() +sfTkError_t sfDevXM125Distance::distanceStart() { return setDistanceCommand(SFE_XM125_DISTANCE_START_DETECTOR); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceStop() +sfTkError_t sfDevXM125Distance::distanceStop() { return setDistanceCommand(SFE_XM125_DISTANCE_STOP_DETECTOR); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceCalibrate() +sfTkError_t sfDevXM125Distance::distanceCalibrate() { return setDistanceCommand(SFE_XM125_DISTANCE_CALIBRATE); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceRecalibrate() +sfTkError_t sfDevXM125Distance::distanceRecalibrate() { return setDistanceCommand(SFE_XM125_DISTANCE_RECALIBRATE); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceEnableUartLogs() +sfTkError_t sfDevXM125Distance::distanceEnableUartLogs() { return setDistanceCommand(SFE_XM125_DISTANCE_ENABLE_UART_LOGS); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceDisableUartLogs() +sfTkError_t sfDevXM125Distance::distanceDisableUartLogs() { return setDistanceCommand(SFE_XM125_DISTANCE_DISABLE_UART_LOGS); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceLogConfiguration() +sfTkError_t sfDevXM125Distance::distanceLogConfiguration() { return setDistanceCommand(SFE_XM125_DISTANCE_LOG_CONFIGURATION); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceReset() +sfTkError_t sfDevXM125Distance::distanceReset() { return setDistanceCommand(SFE_XM125_DISTANCE_RESET_MODULE); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::distanceBusyWait() +sfTkError_t sfDevXM125Distance::distanceBusyWait() { sfTkError_t retVal = 0; uint32_t regVal = 0; @@ -920,4 +902,4 @@ sfTkError_t sfDevXM125::distanceBusyWait() } return retVal; -} +} \ No newline at end of file diff --git a/src/sfTk/sfDevXM125Distance.h b/src/sfTk/sfDevXM125Distance.h new file mode 100644 index 0000000..a7e9c7f --- /dev/null +++ b/src/sfTk/sfDevXM125Distance.h @@ -0,0 +1,679 @@ +/** + * @file sfDevXM125Distance.h + * @brief Header of the SparkFun Qwiic XM125 Library. + * + * This file contains the header the Distance Application object + * + * @author SparkFun Electronics + * @date 2024-2025 + * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. + * + * SPDX-License-Identifier: MIT + */ +#pragma once + +#include "sfDevXM125Core.h" + +// Defines + +/* ****************************** Distance Values ****************************** */ + +const uint32_t SFE_XM125_DISTANCE_MAJOR_VERSION_MASK = 0xffff0000; +const uint32_t SFE_XM125_DISTANCE_MINOR_VERSION_MASK = 0x0000ff00; +const uint32_t SFE_XM125_DISTANCE_PATCH_VERSION_MASK = 0x000000ff; +const uint32_t SFE_XM125_DISTANCE_NUMBER_DISTANCES_MASK = 0x0000000f; +const uint32_t SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK = 0x00000100; +const uint32_t SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK = 0x00000400; +const uint32_t SFE_XM125_DISTANCE_TEMPERATURE_MASK = 0xffff0000; +const uint32_t SFE_XM125_DISTANCE_RSS_REGISTER_OK_MASK = 0x00000001; +const uint32_t SFE_XM125_DISTANCE_CONFIG_CREATE_OK_MASK = 0x00000002; +const uint32_t SFE_XM125_DISTANCE_SENSOR_CREATE_OK_MASK = 0x00000004; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_CREATE_OK_MASK = 0x00000008; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_BUFFER_OK_MASK = 0x00000010; +const uint32_t SFE_XM125_DISTANCE_SENSOR_BUFFER_OK_MASK = 0x00000020; +const uint32_t SFE_XM125_DISTANCE_CALIBRATION_BUFFER_OK_MASK = 0x00000040; +const uint32_t SFE_XM125_DISTANCE_CONFIG_APPLY_OK_MASK = 0x00000080; +const uint32_t SFE_XM125_DISTANCE_SENSOR_CALIBRATE_OK_MASK = 0x00000100; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_OK_MASK = 0x00000200; +const uint32_t SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK = 0x00010000; +const uint32_t SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK = 0x00020000; +const uint32_t SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK = 0x00040000; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK = 0x00080000; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK = 0x00100000; +const uint32_t SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK = 0x00200000; +const uint32_t SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK = 0x00400000; +const uint32_t SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK = 0x00800000; +const uint32_t SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK = 0x01000000; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK = 0x02000000; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK = 0x10000000; +const uint32_t SFE_XM125_DISTANCE_BUSY_MASK = 0x80000000; +const uint32_t SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK = 0x00000200; + +const uint32_t SFE_XM125_DISTANCE_ALL_ERROR_MASK = + (SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK | SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK | + SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK | SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK | + SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK | SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK | + SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK | SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK | + SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK | SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK | + SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK | SFE_XM125_DISTANCE_BUSY_MASK); + +const uint32_t SFE_XM125_DISTANCE_MAJOR_VERSION_MASK_SHIFT = 16; +const uint32_t SFE_XM125_DISTANCE_MINOR_VERSION_MASK_SHIFT = 8; +const uint32_t SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK_SHIFT = 15; +const uint32_t SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK_SHIFT = 16; +const uint32_t SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK_SHIFT = 17; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK_SHIFT = 18; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK_SHIFT = 19; +const uint32_t SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK_SHIFT = 20; +const uint32_t SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK_SHIFT = 21; +const uint32_t SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK_SHIFT = 22; +const uint32_t SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK_SHIFT = 23; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK_SHIFT = 24; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK_SHIFT = 27; +const uint32_t SFE_XM125_DISTANCE_BUSY_MASK_SHIFT = 30; +const uint32_t SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK_SHIFT = 8; +const uint32_t SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK_SHIFT = 9; +const uint32_t SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK_SHIFT = 10; +const uint32_t SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT = 16; +const uint32_t SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK_SHIFT = 30; + +const uint32_t SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK = 0b10010000111111110000000011111111; + +const uint16_t SFE_XM125_DISTANCE_VERSION = 0x00; +typedef struct +{ + uint32_t distance_major : 16; + uint32_t distance_minor : 8; + uint32_t distance_patch : 8; +} sfe_xm125_distance_version_t; + +const uint16_t SFE_XM125_DISTANCE_PROTOCOL_STATUS = 0x01; +typedef struct +{ + uint32_t distance_protocol_state_error : 1; + uint32_t distance_packet_length_error : 1; + uint32_t distance_address_error : 1; + uint32_t distance_write_failed : 1; + uint32_t distance_write_to_read_only : 1; + uint32_t reserved1 : 27; +} sfe_xm125_distance_protocol_status_t; + +const uint16_t SFE_XM125_DISTANCE_MEASURE_COUNTER = 0x02; + +const uint16_t SFE_XM125_DISTANCE_DETECTOR_STATUS = 0x03; +typedef struct +{ + uint32_t distance_rss_register_ok : 1; + uint32_t distance_config_create_ok : 1; + uint32_t distance_sensor_create_ok : 1; + uint32_t distance_detector_create_ok : 1; + uint32_t distance_detector_buffer_ok : 1; + uint32_t distance_sensor_buffer_ok : 1; + uint32_t distance_calibration_buffer_ok : 1; + uint32_t distance_config_apply_ok : 1; + uint32_t distance_sensor_calibrate_ok : 1; + uint32_t distance_detector_calibrate_ok : 1; + uint32_t reserved1 : 6; + uint32_t distance_rss_register_error : 1; + uint32_t distance_config_create_error : 1; + uint32_t distance_sensor_create_error : 1; + uint32_t distance_detector_create_error : 1; + uint32_t distance_detector_buffer_error : 1; + uint32_t distance_sensor_buffer_error : 1; + uint32_t distance_calibration_buffer_error : 1; + uint32_t distance_config_apply_error : 1; + uint32_t distance_sensor_calibrate_error : 1; + uint32_t distance_detector_calibrate_error : 1; + uint32_t reserved2 : 2; + uint32_t distance_detector_error : 1; + uint32_t reserved3 : 2; + uint32_t distance_busy : 1; +} sfe_xm125_distance_detector_status_t; + +const uint16_t SFE_XM125_DISTANCE_RESULT = 0x10; +typedef struct +{ + uint32_t distance_num_distances : 4; + uint32_t rsvd1 : 4; // skips "reserved" bits + uint32_t distance_near_start_edge : 1; + uint32_t distance_calibration_needed : 1; + uint32_t distance_measure_distance_error : 1; + uint32_t reserved1 : 5; + uint32_t distance_temperature : 16; +} sfe_xm125_distance_result_t; + +const uint16_t SFE_XM125_DISTANCE_PEAK0_DISTANCE = 0x11; +const uint16_t SFE_XM125_DISTANCE_PEAK1_DISTANCE = 0x12; +const uint16_t SFE_XM125_DISTANCE_PEAK2_DISTANCE = 0x13; +const uint16_t SFE_XM125_DISTANCE_PEAK3_DISTANCE = 0x14; +const uint16_t SFE_XM125_DISTANCE_PEAK4_DISTANCE = 0x15; +const uint16_t SFE_XM125_DISTANCE_PEAK5_DISTANCE = 0x16; +const uint16_t SFE_XM125_DISTANCE_PEAK6_DISTANCE = 0x17; +const uint16_t SFE_XM125_DISTANCE_PEAK7_DISTANCE = 0x18; +const uint16_t SFE_XM125_DISTANCE_PEAK8_DISTANCE = 0x19; +const uint16_t SFE_XM125_DISTANCE_PEAK9_DISTANCE = 0x1a; +const uint16_t SFE_XM125_DISTANCE_PEAK0_STRENGTH = 0x1b; +const uint16_t SFE_XM125_DISTANCE_PEAK1_STRENGTH = 0x1c; +const uint16_t SFE_XM125_DISTANCE_PEAK2_STRENGTH = 0x1d; +const uint16_t SFE_XM125_DISTANCE_PEAK3_STRENGTH = 0x1e; +const uint16_t SFE_XM125_DISTANCE_PEAK4_STRENGTH = 0x1f; +const uint16_t SFE_XM125_DISTANCE_PEAK5_STRENGTH = 0x20; +const uint16_t SFE_XM125_DISTANCE_PEAK6_STRENGTH = 0x21; +const uint16_t SFE_XM125_DISTANCE_PEAK7_STRENGTH = 0x22; +const uint16_t SFE_XM125_DISTANCE_PEAK8_STRENGTH = 0x23; +const uint16_t SFE_XM125_DISTANCE_PEAK9_STRENGTH = 0x24; + +// Default Value: 250 +const uint16_t SFE_XM125_DISTANCE_START = 0x40; +const uint16_t sfe_xm125_distance_start_default = 250; + +// Default Value: 3000 +const uint16_t SFE_XM125_DISTANCE_END = 0x41; +const uint16_t sfe_xm125_distance_end_default = 3000; + +// Default Value: 0 +const uint16_t SFE_XM125_DISTANCE_MAX_STEP_LENGTH = 0x42; +const uint16_t sfe_xm125_distance_max_step_length_default = 0; + +// Default Value: True +const uint16_t SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE = 0x43; +const bool sfe_xm125_distance_close_range_leakage_default = true; + +// Default Value: 15000 +const uint16_t SFE_XM125_DISTANCE_SIGNAL_QUALITY = 0x44; +const uint16_t sfe_xm125_distance_signal_quality_default = 15000; + +// Default: PROFILE5 (enum) +const uint16_t SFE_XM125_DISTANCE_MAX_PROFILE = 0x45; +typedef enum +{ + XM125_DISTANCE_PROFILE1 = 1, + XM125_DISTANCE_PROFILE2 = 2, + XM125_DISTANCE_PROFILE3 = 3, + XM125_DISTANCE_PROFILE4 = 4, + XM125_DISTANCE_PROFILE5 = 5, +} sfe_xm125_distance_profile_t; + +// Default Value: CFAR (enum) +const uint16_t SFE_XM125_DISTANCE_THRESHOLD_METHOD = 0x46; +typedef enum +{ + XM125_DISTANCE_FIXED_AMPLITUDE = 1, + XM125_DISTANCE_RECORDED = 2, + XM125_DISTANCE_CFAR = 3, + XM125_DISTANCE_FIXED_STRENGTH = 4, +} sfe_xm125_distance_threshold_method_t; + +// Default Value: STRONGEST (enum) +const uint16_t SFE_XM125_DISTANCE_PEAK_SORTING = 0x47; +typedef enum +{ + XM125_DISTANCE_CLOSEST = 1, + XM125_DISTANCE_STRONGEST = 2, +} sfe_xm125_distance_peak_sorting_t; + +// Default Value: 100 +const uint16_t SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH = 0x48; +const uint16_t sfe_xm125_distance_num_frames_recorded_thresh_default = 100; + +// Default Value: 100000 +const uint16_t SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL = 0x49; +const uint32_t sfe_xm125_distance_fixed_amp_thresh_val_default = 100000; + +// Default Value: 500 +const uint16_t SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY = 0x4a; +const uint16_t sfe_xm125_distance_threshold_sensitivity_default = 500; + +// Default Value: GENERIC +const uint16_t SFE_XM125_DISTANCE_REFLECTOR_SHAPE = 0x4b; +typedef enum +{ + XM125_DISTANCE_GENERIC = 1, + XM125_DISTANCE_PLANAR = 2, +} sfe_xm125_distance_reflector_shape_t; + +// Default Value: 0 +const uint16_t SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL = 0x4c; +const uint16_t sfe_xm125_distance_fixed_strength_threshold_val_default = 0; + +// Default Value: False +const uint16_t SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP = 0x80; +const bool sfe_xm125_distance_measure_on_wakup = false; + +const uint16_t SFE_XM125_DISTANCE_COMMAND = 0x100; +typedef enum +{ + XM125_DISTANCE_APPLY_CONFIG_AND_CALIBRATE = 1, + XM125_DISTANCE_MEASURE_DISTANCE = 2, + XM125_DISTANCE_APPLY_CONFIGURATION = 3, + XM125_DISTANCE_CALIBRATE = 4, + XM125_DISTANCE_RECALIBRATE = 5, + XM125_DISTANCE_ENABLE_UART_LOGS = 32, + XM125_DISTANCE_DISABLE_UART_LOGS = 33, + XM125_DISTANCE_LOG_CONFIGURATION = 34, + XM125_DISTANCE_RESET_MODULE = 1381192737, +} sfe_xm125_distance_command_t; + +const uint32_t SFE_XM125_DISTANCE_APPLY_CONFIGURATION = 1; +const uint32_t SFE_XM125_DISTANCE_START_DETECTOR = 2; +const uint32_t SFE_XM125_DISTANCE_STOP_DETECTOR = 3; +const uint32_t SFE_XM125_DISTANCE_CALIBRATE = 4; +const uint32_t SFE_XM125_DISTANCE_RECALIBRATE = 5; +const uint32_t SFE_XM125_DISTANCE_ENABLE_UART_LOGS = 32; +const uint32_t SFE_XM125_DISTANCE_DISABLE_UART_LOGS = 33; +const uint32_t SFE_XM125_DISTANCE_LOG_CONFIGURATION = 34; +const uint32_t SFE_XM125_DISTANCE_RESET_MODULE = 1381192737; + +// Distance class definition + +class sfDevXM125Distance : public sfDevXM125Core +{ + public: + /** + * @brief Initializes the distance detector device. + * + * This function sets up the I2C communication and performs initial checks + * to ensure the device is ready for operation. + * + * @param theBus Pointer to the I2C bus object. If nullptr, the default bus is used. + * @return ksfTkErrOk on success, or error code (value < -1) on failure. + */ + sfTkError_t begin(sfTkII2C *theBus = nullptr); + + /// @brief This function sets all the beginning values for a basic I2C + /// example to be run on the device for presence sensing. + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceBegin(); + + /// @brief This function does all the required checks and busy waits to + /// make sure the device is ready for distance readings. + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceDetectorReadingSetup(); + + /// @brief This function returns the version number of the device + /// structure: major.minor.patch + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch); + + /// @brief This function returns if there was an error from the + /// protocol status register + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceDetectorError(uint32_t &error); + + /// @brief This function returns the error status according to the bit + /// mask value for the distance devices errors and busy bit + /// @param status Error status of device (see function for exact error) + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceDetectorErrorStatus(uint32_t &status); + + /// @brief This function returns the measure counter, the number of measurements + /// performed since restart. + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMeasureCounter(uint32_t &counter); + + /// @brief This function returns the status of the device if there are any issues + /// with any of the status's listed defined. + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceDetectorStatus(uint32_t &status); + + /// @brief This function returns the number of detected distances. + /// @param distance Number of detected distances + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceNumberDistances(uint32_t &distance); + + /// @brief This function returns the indication that there might be an object + /// near the start point of the measured range. + /// @param edge Flag to determine object in range + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceNearStartEdge(uint32_t &edge); + + /// @brief This function returns the indication of a sensor calibration needed. + /// @param calibrate Flag to indicate calibration required + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceCalibrationNeeded(uint32_t &calibrate); + + /// @brief This function returns if the measure command failed. + /// @param error Flag to indicate measure command error + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMeasureDistanceError(uint32_t &error); + + /// @brief This function returns the temperature in sensor during measurements + /// (in degree Celsius). Note that it has poor absolute accuracy and should + /// only be used for relative temperature measurements. + /// @param temperature Relative temperature of device + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceTemperature(int16_t &temperature); + + /// @brief This function returns the distance to peak 0 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak0Distance(uint32_t &peak); + + /// @brief This function returns the distance to peak 1 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak1Distance(uint32_t &peak); + + /// @brief This function returns the distance to peak 2 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak2Distance(uint32_t &peak); + + /// @brief This function returns the distance to peak 3 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak3Distance(uint32_t &peak); + + /// @brief This function returns the distance to peak 4 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak4Distance(uint32_t &peak); + + /// @brief This function returns the distance to peak 5 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak5Distance(uint32_t &peak); + + /// @brief This function returns the distance to peak 6 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak6Distance(uint32_t &peak); + + /// @brief This function returns the distance to peak 7 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak7Distance(uint32_t &peak); + + /// @brief This function returns the distance to peak 8 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak8Distance(uint32_t &peak); + + /// @brief This function returns the distance to peak 9 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak9Distance(uint32_t &peak); + + /// @brief This function returns the strength of peak 0 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak0Strength(int32_t &peak); + + /// @brief This function returns the strength of peak 1 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak1Strength(int32_t &peak); + + /// @brief This function returns the strength of peak 2 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak2Strength(int32_t &peak); + + /// @brief This function returns the strength of peak 3 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak3Strength(int32_t &peak); + + /// @brief This function returns the strength of peak 4 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak4Strength(int32_t &peak); + + /// @brief This function returns the strength of peak 5 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak5Strength(int32_t &peak); + + /// @brief This function returns the strength of peak 6 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak6Strength(int32_t &peak); + + /// @brief This function returns the strength of peak 7 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak7Strength(int32_t &peak); + + /// @brief This function returns the strength of peak 8 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak8Strength(int32_t &peak); + + /// @brief This function returns the strength of peak 9 + /// Note: This value is a factor 1000 larger than the RSS value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeak9Strength(int32_t &peak); + + /// @brief This function returns the start of measured interval + /// in millimeters. + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 250 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceStart(uint32_t &startVal); + + /// @brief This function sets the start of measured interval in + /// millimeters. + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 250 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceStart(uint32_t start); + + /// @brief This function returns the end of measured interval + /// in millimeters. + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 3000 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceEnd(uint32_t &end); + + /// @brief This function sets the end of measured interval + /// in millimeters. + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 3000 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceEnd(uint32_t end); + + /// @brief This function returns the used to limit step length. + /// If set to 0 (default), the step length is calculated + /// based on profile. + /// Default Value: 0 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMaxStepLength(uint32_t &length); + + /// @brief This function sets the used to limit step length. + /// If set to 0 (default), the step length is calculated + /// based on profile. + /// Default Value: 0 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceMaxStepLength(uint32_t length); + + /// @brief This function reads if the close range leakage + /// cancellation logic is enabled. + /// Default Value: true + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceCloseRangeLeakageCancellation(bool &range); + + /// @brief This function sets the close range leakage + /// cancellation logic. + /// Default Value: true + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceCloseRangeLeakageCancellation(bool range); + + /// @brief This function returns the high signal quality in a + /// better SNR (because of higher HWAAS) and higher power consumption. + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 15000 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceSignalQuality(uint32_t &signal); + + /// @brief This function sets the high signal quality in a + /// better SNR (because of higher HWAAS) and higher power consumption. + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 15000 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceSignalQuality(uint32_t signal); + + /// @brief This function returns the max profile of the device. + /// Default value = PROFILE5 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMaxProfile(uint32_t &profile); + + /// @brief This function sets the max profile of the device + /// Default value = PROFILE5 + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceMaxProfile(uint32_t profile); + + /// @brief This function returns the threshold method + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceThresholdMethod(uint32_t &method); + + /// @brief This function sets the threshold method + /// @param method Threshold method (enum) + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceThresholdMethod(uint32_t method); + + /// @brief This function returns the peak sorting method + /// @param peak Peak sorting method + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeakSorting(uint32_t &peak); + + /// @brief This function sets the peak sorting method + /// @param peak Peak sorting method + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistancePeakSorting(uint32_t peak); + + /// @brief This function returns the number frames to use for recorded threshold. + /// Default Value: 100 + /// @param thresh Number of frames + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceNumFramesRecordedThreshold(uint32_t &thresh); + + /// @brief This function sets the number frames to use for recorded threshold. + /// Default Value: 100 + /// @param thresh Number of frames + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceNumFramesRecordedThreshold(uint32_t thresh); + + /// @brief This function returns the fixed amplitude threshold value. + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 100000 + /// @param thresh Fixed amplitude threshold value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceFixedAmpThreshold(uint32_t &thresh); + + /// @brief This function sets the fixed amplitude threshold value. + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 100000 + /// @param thresh Fixed amplitude threshold value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceFixedAmpThreshold(uint32_t thresh); + + /// @brief This function returns the threshold sensitivity + /// (0 <= sensitivity <= 1000) + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 500 + /// @param thresh& Threshold sensitivity + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceThresholdSensitivity(uint32_t &thresh); + + /// @brief This function sets the threshold sensitivity + /// (0 <= sensitivity <= 1000) + /// Note: This value is a factor 1000 larger than the RSS value + /// Default Value: 500 + /// @param thresh Threshold sensitivity + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceThresholdSensitivity(uint32_t thresh); + + /// @brief This function returns the reflector shape + /// Default Value: GENERIC + /// @param shape Generic or planar reflection + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceReflectorShape(uint32_t &shape); + + /// @brief This function sets the reflector shape + /// Default Value: GENERIC + /// @param shape Generic or planar reflection + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceReflectorShape(uint32_t shape); + + /// @brief This function returns the fixed strength threshold value. + /// Default Value: 0 + /// Note: This value is a factor 1000 larger than the RSS value + /// @param thresh fixed threshold strength value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceFixedStrengthThresholdValue(int32_t &thresh); + + /// @brief This function sets the fixed strength threshold value. + /// Default Value: 0 + /// Note: This value is a factor 1000 larger than the RSS value + /// @param thresh fixed threshold strength value + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceFixedStrengthThresholdValue(int32_t thresh); + + /// @brief This function returns the measure on wakeup status. + /// Default Value: false + /// @param measure Measure on wakeup occurrence + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistanceMeasureOneWakeup(bool &measure); + + /// @brief This function sets the measure on wakeup status. + /// Default Value: false + /// @param measure Measure on wakeup occurrence + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceMeasureOneWakeup(bool measure); + + /// @brief This function sets the specific execute command as defined in the + /// datasheet on Page 25, Section 6.2.40 Command. + /// @param apply Enable configuration and calibrate + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t setDistanceCommand(uint32_t command); + + /// @brief This function applies the configuration to the device by + /// writing the defined value to the distance command register + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceApplyConfiguration(); + + /// @brief This function starts the device by writing the defined + /// start value to the distance command register + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceStart(); + + /// @brief This function stops the device by writing the defined + /// stop value to the distance command register + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceStop(); + + /// @brief This function calibrates the device by writing the defined + /// calibration value to the distance command register + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceCalibrate(); + + /// @brief This function recalibrates the device by writing the defined + /// recalibrate value to the distance command register + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceRecalibrate(); + + /// @brief This function enables the uart logs of the device by + /// writing the defined value to the distance command register + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceEnableUartLogs(); + + /// @brief This function disables the uart logs of the device by + /// writing the defined value to the distance command register + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceDisableUartLogs(); + + /// @brief This function enables the configuration log of the device + /// by writing the defined value to the distance command register + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceLogConfiguration(); + + /// @brief This function resets the distance detector settings + /// of the device + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceReset(); + + /// @brief Completes a busy wait loop while the device is uploading + /// information by waiting for the status + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t distanceBusyWait(); +}; \ No newline at end of file diff --git a/src/sfTk/sfDevXM125Presence.cpp b/src/sfTk/sfDevXM125Presence.cpp index 041f573..05ce8e1 100644 --- a/src/sfTk/sfDevXM125Presence.cpp +++ b/src/sfTk/sfDevXM125Presence.cpp @@ -2,12 +2,7 @@ * @file sfDevXM125Presence.cpp * @brief Implementation of the SparkFun Qwiic XM125 Library. * - * The implementation of the sfDevXM125 class is spread across two files. - * - * This file contains the implementation of the functions for interfacing with - * the SparkFun Qwiic XM125 distance and presence detector using I2C communication. - * - * The file includes the object presence methods + * This file contains the implementation of the class for the presence detection functionality. * * @author SparkFun Electronics * @date 2024-2025 @@ -15,12 +10,30 @@ * * SPDX-License-Identifier: MIT */ -#include "sfDevXM125.h" +#include "sfDevXM125Presence.h" -// --------------------- I2C Presence Detector Functions --------------------- +sfTkError_t sfDevXM125Presence::begin(sfTkII2C *theBus) +{ + // call super to get the device connection working + sfTkError_t retVal = sfDevXM125Core::begin(theBus); + if (retVal != ksfTkErrOk) + return retVal; + + // Check errors from device application + uint32_t presenceError = 0; + retVal = getPresenceDetectorError(presenceError); + if (retVal != ksfTkErrOk) + return retVal; + + // Additional checks for presence errors + if (presenceError != 0) + return ksfTkErrFail; // Indicating presence error -sfTkError_t sfDevXM125::presenceDetectorStart() + return ksfTkErrOk; +} +//------------------------------------------------------------------------- +sfTkError_t sfDevXM125Presence::presenceDetectorStart() { // *** Presence Sensor Setup *** uint32_t errorStatus = 0; @@ -74,7 +87,7 @@ sfTkError_t sfDevXM125::presenceDetectorStart() } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) +sfTkError_t sfDevXM125Presence::getPresenceDistanceValuemm(uint32_t &presenceVal) { // Check error bits uint32_t errorStatus = 0; @@ -114,7 +127,7 @@ sfTkError_t sfDevXM125::getPresenceDistanceValuemm(uint32_t &presenceVal) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) +sfTkError_t sfDevXM125Presence::getPresenceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch) { sfTkError_t retVal; uint32_t regVal = 0; @@ -131,28 +144,28 @@ sfTkError_t sfDevXM125::getPresenceDetectorVersion(uint32_t &major, uint32_t &mi return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorError(uint32_t &error) +sfTkError_t sfDevXM125Presence::getPresenceDetectorError(uint32_t &error) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t *)&error, sizeof(uint32_t), readBytes); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceMeasureCounter(uint32_t &counter) +sfTkError_t sfDevXM125Presence::getPresenceMeasureCounter(uint32_t &counter) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t *)&counter, sizeof(uint32_t), readBytes); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorStatus(uint32_t &status) +sfTkError_t sfDevXM125Presence::getPresenceDetectorStatus(uint32_t &status) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)&status, sizeof(uint32_t), readBytes); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) +sfTkError_t sfDevXM125Presence::getPresenceDetectorErrorStatus(uint32_t &status) { sfTkError_t retVal = 0; uint32_t regVal = 0; @@ -171,37 +184,37 @@ sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) return ksfTkErrOk; // Check for errors - if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK)) + if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK)) status = 1; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK)) status = 2; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK)) status = 3; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK)) status = 4; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK)) status = 5; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK)) status = 6; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK)) status = 7; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK)) status = 8; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK)) status = 9; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK)) status = 10; - else if (SF_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_BUSY_MASK)) + else if (SFTK_CHECK_BITS_SET(regVal, SFE_XM125_PRESENCE_BUSY_MASK)) status = 11; // return 0 with no errors @@ -209,7 +222,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorErrorStatus(uint32_t &status) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) +sfTkError_t sfDevXM125Presence::getPresenceDetectorPresenceDetected(uint32_t &detected) { uint32_t regVal = 0; @@ -226,7 +239,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorPresenceDetected(uint32_t &detected) return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &sticky) +sfTkError_t sfDevXM125Presence::getPresenceDetectorPresenceStickyDetected(uint32_t &sticky) { uint32_t regVal = 0; @@ -243,7 +256,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorPresenceStickyDetected(uint32_t &stic return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectorRegError(uint32_t &error) +sfTkError_t sfDevXM125Presence::getPresenceDetectorRegError(uint32_t &error) { uint32_t regVal = 0; @@ -260,7 +273,7 @@ sfTkError_t sfDevXM125::getPresenceDetectorRegError(uint32_t &error) return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) +sfTkError_t sfDevXM125Presence::getPresenceTemperature(uint32_t &temp) { uint32_t regVal = 0; @@ -275,7 +288,7 @@ sfTkError_t sfDevXM125::getPresenceTemperature(uint32_t &temp) return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) +sfTkError_t sfDevXM125Presence::getPresenceDistance(uint32_t &distance) { size_t readBytes = 0; sfTkError_t retVal = @@ -284,7 +297,7 @@ sfTkError_t sfDevXM125::getPresenceDistance(uint32_t &distance) return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) +sfTkError_t sfDevXM125Presence::getPresenceIntraPresenceScore(uint32_t &intra) { size_t readBytes = 0; sfTkError_t retVal = @@ -293,7 +306,7 @@ sfTkError_t sfDevXM125::getPresenceIntraPresenceScore(uint32_t &intra) return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) +sfTkError_t sfDevXM125Presence::getPresenceInterPresenceScore(uint32_t &inter) { size_t readBytes = 0; sfTkError_t retVal = @@ -302,7 +315,7 @@ sfTkError_t sfDevXM125::getPresenceInterPresenceScore(uint32_t &inter) return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) +sfTkError_t sfDevXM125Presence::getPresenceSweepsPerFrame(uint32_t &sweeps) { size_t readBytes = 0; sfTkError_t retVal = @@ -311,14 +324,14 @@ sfTkError_t sfDevXM125::getPresenceSweepsPerFrame(uint32_t &sweeps) return retVal; } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceSweepsPerFrame(uint32_t sweeps) +sfTkError_t sfDevXM125Presence::setPresenceSweepsPerFrame(uint32_t sweeps) { sweeps = sftk_byte_swap(sweeps); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t *)&sweeps, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) +sfTkError_t sfDevXM125Presence::getPresenceInterFramePresenceTimeout(uint32_t &time) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, @@ -328,14 +341,14 @@ sfTkError_t sfDevXM125::getPresenceInterFramePresenceTimeout(uint32_t &time) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterFramePresenceTimeout(uint32_t time) +sfTkError_t sfDevXM125Presence::setPresenceInterFramePresenceTimeout(uint32_t time) { time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterPhaseBoostEnabled(bool &en) +sfTkError_t sfDevXM125Presence::getPresenceInterPhaseBoostEnabled(bool &en) { size_t readBytes = 0; uint8_t value; @@ -346,7 +359,7 @@ sfTkError_t sfDevXM125::getPresenceInterPhaseBoostEnabled(bool &en) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterPhaseBoostEnabled(bool en) +sfTkError_t sfDevXM125Presence::setPresenceInterPhaseBoostEnabled(bool en) { uint8_t value = en ? 1 : 0; return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, @@ -354,7 +367,7 @@ sfTkError_t sfDevXM125::setPresenceInterPhaseBoostEnabled(bool en) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraDetectionEnabled(bool &en) +sfTkError_t sfDevXM125Presence::getPresenceIntraDetectionEnabled(bool &en) { size_t readBytes = 0; uint8_t value; @@ -365,7 +378,7 @@ sfTkError_t sfDevXM125::getPresenceIntraDetectionEnabled(bool &en) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterDetectionEnabled(bool en) +sfTkError_t sfDevXM125Presence::setPresenceInterDetectionEnabled(bool en) { uint8_t value = en ? 1 : 0; return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, @@ -373,7 +386,7 @@ sfTkError_t sfDevXM125::setPresenceInterDetectionEnabled(bool en) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) +sfTkError_t sfDevXM125Presence::getPresenceFrameRate(uint32_t &rate) { size_t readBytes = 0; sfTkError_t retVal = @@ -383,14 +396,14 @@ sfTkError_t sfDevXM125::getPresenceFrameRate(uint32_t &rate) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceFrameRate(uint32_t rate) +sfTkError_t sfDevXM125Presence::setPresenceFrameRate(uint32_t rate) { rate = sftk_byte_swap(rate); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) +sfTkError_t sfDevXM125Presence::getPresenceIntraDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, @@ -400,7 +413,7 @@ sfTkError_t sfDevXM125::getPresenceIntraDetectionThreshold(uint32_t &thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceIntraDetectionThreshold(uint32_t thresh) +sfTkError_t sfDevXM125Presence::setPresenceIntraDetectionThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, @@ -408,7 +421,7 @@ sfTkError_t sfDevXM125::setPresenceIntraDetectionThreshold(uint32_t thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) +sfTkError_t sfDevXM125Presence::getPresenceInterDetectionThreshold(uint32_t &thresh) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, @@ -418,7 +431,7 @@ sfTkError_t sfDevXM125::getPresenceInterDetectionThreshold(uint32_t &thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterDetectionThreshold(uint32_t thresh) +sfTkError_t sfDevXM125Presence::setPresenceInterDetectionThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, @@ -426,7 +439,7 @@ sfTkError_t sfDevXM125::setPresenceInterDetectionThreshold(uint32_t thresh) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) +sfTkError_t sfDevXM125Presence::getPresenceInterFrameDeviationTime(uint32_t &time) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, @@ -436,14 +449,14 @@ sfTkError_t sfDevXM125::getPresenceInterFrameDeviationTime(uint32_t &time) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterFrameDeviationTime(uint32_t time) +sfTkError_t sfDevXM125Presence::setPresenceInterFrameDeviationTime(uint32_t time) { time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) +sfTkError_t sfDevXM125Presence::getPresenceInterFrameFastCutoff(uint32_t &cut) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, @@ -453,7 +466,7 @@ sfTkError_t sfDevXM125::getPresenceInterFrameFastCutoff(uint32_t &cut) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterFrameFastCutoff(uint32_t cut) +sfTkError_t sfDevXM125Presence::setPresenceInterFrameFastCutoff(uint32_t cut) { cut = sftk_byte_swap(cut); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, @@ -461,7 +474,7 @@ sfTkError_t sfDevXM125::setPresenceInterFrameFastCutoff(uint32_t cut) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) +sfTkError_t sfDevXM125Presence::getPresenceInterFrameSlowCutoff(uint32_t &cut) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, @@ -471,7 +484,7 @@ sfTkError_t sfDevXM125::getPresenceInterFrameSlowCutoff(uint32_t &cut) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterFrameSlowCutoff(uint32_t cut) +sfTkError_t sfDevXM125Presence::setPresenceInterFrameSlowCutoff(uint32_t cut) { cut = sftk_byte_swap(cut); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, @@ -479,7 +492,7 @@ sfTkError_t sfDevXM125::setPresenceInterFrameSlowCutoff(uint32_t cut) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) +sfTkError_t sfDevXM125Presence::getPresenceIntraFrameTimeConst(uint32_t &time) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, @@ -489,7 +502,7 @@ sfTkError_t sfDevXM125::getPresenceIntraFrameTimeConst(uint32_t &time) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceIntraFrameTimeConst(uint32_t time) +sfTkError_t sfDevXM125Presence::setPresenceIntraFrameTimeConst(uint32_t time) { time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, @@ -497,7 +510,7 @@ sfTkError_t sfDevXM125::setPresenceIntraFrameTimeConst(uint32_t time) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) +sfTkError_t sfDevXM125Presence::getPresenceIntraOutputTimeConst(uint32_t &time) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, @@ -507,7 +520,7 @@ sfTkError_t sfDevXM125::getPresenceIntraOutputTimeConst(uint32_t &time) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceIntraOutputTimeConst(uint32_t time) +sfTkError_t sfDevXM125Presence::setPresenceIntraOutputTimeConst(uint32_t time) { time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, @@ -515,7 +528,7 @@ sfTkError_t sfDevXM125::setPresenceIntraOutputTimeConst(uint32_t time) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) +sfTkError_t sfDevXM125Presence::getPresenceInterOutputTimeConst(uint32_t &time) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, @@ -525,7 +538,7 @@ sfTkError_t sfDevXM125::getPresenceInterOutputTimeConst(uint32_t &time) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceInterOutputTimeConst(uint32_t time) +sfTkError_t sfDevXM125Presence::setPresenceInterOutputTimeConst(uint32_t time) { time = sftk_byte_swap(time); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, @@ -533,7 +546,7 @@ sfTkError_t sfDevXM125::setPresenceInterOutputTimeConst(uint32_t time) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceAutoProfileEn(bool &en) +sfTkError_t sfDevXM125Presence::getPresenceAutoProfileEn(bool &en) { size_t readBytes = 0; uint8_t value; @@ -544,14 +557,14 @@ sfTkError_t sfDevXM125::getPresenceAutoProfileEn(bool &en) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceAutoProfileEn(bool en) +sfTkError_t sfDevXM125Presence::setPresenceAutoProfileEn(bool en) { uint8_t value = en ? 1 : 0; return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceAutoStepLengthEn(bool &en) +sfTkError_t sfDevXM125Presence::getPresenceAutoStepLengthEn(bool &en) { size_t readBytes = 0; uint8_t value; @@ -562,7 +575,7 @@ sfTkError_t sfDevXM125::getPresenceAutoStepLengthEn(bool &en) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceAutoStepLengthEn(bool en) +sfTkError_t sfDevXM125Presence::setPresenceAutoStepLengthEn(bool en) { uint8_t value = en ? 1 : 0; return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, @@ -570,7 +583,7 @@ sfTkError_t sfDevXM125::setPresenceAutoStepLengthEn(bool en) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) +sfTkError_t sfDevXM125Presence::getPresenceManualProfile(uint32_t &prof) { size_t readBytes = 0; sfTkError_t retVal = @@ -580,14 +593,14 @@ sfTkError_t sfDevXM125::getPresenceManualProfile(uint32_t &prof) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceManualProfile(uint32_t prof) +sfTkError_t sfDevXM125Presence::setPresenceManualProfile(uint32_t prof) { prof = sftk_byte_swap(prof); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) +sfTkError_t sfDevXM125Presence::getPresenceManualStepLength(uint32_t &length) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, @@ -597,14 +610,14 @@ sfTkError_t sfDevXM125::getPresenceManualStepLength(uint32_t &length) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceManualStepLength(uint32_t length) +sfTkError_t sfDevXM125Presence::setPresenceManualStepLength(uint32_t length) { length = sftk_byte_swap(length); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) +sfTkError_t sfDevXM125Presence::getPresenceStart(uint32_t &start) { size_t readBytes = 0; sfTkError_t retVal = @@ -614,14 +627,14 @@ sfTkError_t sfDevXM125::getPresenceStart(uint32_t &start) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceStart(uint32_t start) +sfTkError_t sfDevXM125Presence::setPresenceStart(uint32_t start) { start = sftk_byte_swap(start); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) +sfTkError_t sfDevXM125Presence::getPresenceEnd(uint32_t &end) { size_t readBytes = 0; sfTkError_t retVal = @@ -631,14 +644,14 @@ sfTkError_t sfDevXM125::getPresenceEnd(uint32_t &end) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceEnd(uint32_t end) +sfTkError_t sfDevXM125Presence::setPresenceEnd(uint32_t end) { end = sftk_byte_swap(end); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceResetFilters(bool &reset) +sfTkError_t sfDevXM125Presence::getPresenceResetFilters(bool &reset) { size_t readBytes = 0; uint8_t value; @@ -649,27 +662,27 @@ sfTkError_t sfDevXM125::getPresenceResetFilters(bool &reset) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceResetFilters(bool reset) +sfTkError_t sfDevXM125Presence::setPresenceResetFilters(bool reset) { uint8_t value = reset ? 1 : 0; return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceHWAAS(uint32_t &avg) +sfTkError_t sfDevXM125Presence::getPresenceHWAAS(uint32_t &avg) { size_t readBytes = 0; return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t), readBytes); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceHWAAS(uint32_t avg) +sfTkError_t sfDevXM125Presence::setPresenceHWAAS(uint32_t avg) { return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) +sfTkError_t sfDevXM125Presence::getPresenceDetectionOnGPIO(uint32_t &detected) { size_t readBytes = 0; sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, @@ -679,56 +692,56 @@ sfTkError_t sfDevXM125::getPresenceDetectionOnGPIO(uint32_t &detected) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::setPresenceDetectionOnGPIO(uint32_t detected) +sfTkError_t sfDevXM125Presence::setPresenceDetectionOnGPIO(uint32_t detected) { detected = sftk_byte_swap(detected); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, sizeof(uint32_t)); } -sfTkError_t sfDevXM125::setPresenceCommand(uint32_t cmd) +sfTkError_t sfDevXM125Presence::setPresenceCommand(uint32_t cmd) { cmd = sftk_byte_swap(cmd); return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t *)&cmd, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceApplyConfiguration() +sfTkError_t sfDevXM125Presence::presenceApplyConfiguration() { return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceStart() +sfTkError_t sfDevXM125Presence::presenceStart() { return setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceStop() +sfTkError_t sfDevXM125Presence::presenceStop() { return setPresenceCommand(SFE_XM125_PRESENCE_STOP_DETECTOR); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceEnableUartLogs() +sfTkError_t sfDevXM125Presence::presenceEnableUartLogs() { return setPresenceCommand(SFE_XM125_PRESENCE_ENABLE_UART_LOGS); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceDisableUartLogs() +sfTkError_t sfDevXM125Presence::presenceDisableUartLogs() { return setPresenceCommand(SFE_XM125_PRESENCE_DISABLE_UART_LOGS); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceLogConfiguration() +sfTkError_t sfDevXM125Presence::presenceLogConfiguration() { return setPresenceCommand(SFE_XM125_PRESENCE_LOG_CONFIGURATION); } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::getPresenceBusy(uint32_t &busy) +sfTkError_t sfDevXM125Presence::getPresenceBusy(uint32_t &busy) { sfTkError_t retVal; uint32_t regVal = 0; @@ -746,7 +759,7 @@ sfTkError_t sfDevXM125::getPresenceBusy(uint32_t &busy) } //-------------------------------------------------------------------------------- -sfTkError_t sfDevXM125::presenceBusyWait() +sfTkError_t sfDevXM125Presence::presenceBusyWait() { sfTkError_t retVal = 0; uint32_t regVal = 0; @@ -765,4 +778,4 @@ sfTkError_t sfDevXM125::presenceBusyWait() } return retVal; -} +} \ No newline at end of file diff --git a/src/sfTk/sfDevXM125.h b/src/sfTk/sfDevXM125Presence.h similarity index 52% rename from src/sfTk/sfDevXM125.h rename to src/sfTk/sfDevXM125Presence.h index 74d75b3..7a7f1db 100644 --- a/src/sfTk/sfDevXM125.h +++ b/src/sfTk/sfDevXM125Presence.h @@ -1,437 +1,249 @@ /** - * @file sfDevXM125.h + * @file sfDevXM125Presence.h * @brief Header of the SparkFun Qwiic XM125 Library. * - * This file contains the header declares of the functions for interfacing with - * the SparkFun Qwiic XM125 distance and presence detector using I2C communication. - * + * This file contains the header the Presence Application object + * * @author SparkFun Electronics - * @date 2024-2025 + * @date 2024-2025 * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. * * SPDX-License-Identifier: MIT */ #pragma once -#include -// Bus interfaces -#include - -#include "sfXM125Regs.h" - -class sfDevXM125 +#include "sfDevXM125Core.h" + +// Defines + +// defines and data structs +/* ****************************** Presence Values ****************************** */ + +const uint32_t SFE_XM125_PRESENCE_DETECTOR_STATUS_MASK = 0b10010000111111110000000011111111; + +const uint32_t SFE_XM125_PRESENCE_DETECTED_MASK = 0x00000001; +const uint32_t SFE_XM125_PRESENCE_DETECTED_STICKY_MASK = 0x00000002; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK = 0x00008000; +const uint32_t SFE_XM125_PRESENCE_TEMPERATURE_MASK = 0xffff0000; +const uint32_t SFE_XM125_PRESENCE_MAJOR_VERSION_MASK = 0xffff0000; +const uint32_t SFE_XM125_PRESENCE_MINOR_VERSION_MASK = 0x0000ff00; +const uint32_t SFE_XM125_PRESENCE_PATCH_VERSION_MASK = 0x000000ff; + +const uint32_t SFE_XM125_PRESENCE_RSS_REGISTER_OK_MASK = 0x00000001; +const uint32_t SFE_XM125_PRESENCE_CONFIG_CREATE_OK_MASK = 0x00000002; +const uint32_t SFE_XM125_PRESENCE_SENSOR_CREATE_OK_MASK = 0x00000004; +const uint32_t SFE_XM125_PRESENCE_SENSOR_CALIBRATE_OK_MASK = 0x00000008; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_CREATE_OK_MASK = 0x00000010; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_BUFFER_OK_MASK = 0x00000020; +const uint32_t SFE_XM125_PRESENCE_SENSOR_BUFFER_OK_MASK = 0x00000040; +const uint32_t SFE_XM125_PRESENCE_CONFIG_APPLY_OK_MASK = 0x00000080; +const uint32_t SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK = 0x00010000; +const uint32_t SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK = 0x00020000; +const uint32_t SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK = 0x00040000; +const uint32_t SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK = 0x00080000; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK = 0x00100000; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK = 0x00200000; +const uint32_t SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK = 0x00400000; +const uint32_t SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK = 0x00800000; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK = 0x10000000; +const uint32_t SFE_XM125_PRESENCE_BUSY_MASK = 0x80000000; + +const uint32_t SFE_XM125_PRESENCE_ALL_ERROR_MASK = + (SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK | SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK | + SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK | SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK | + SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK | SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK | + SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK | SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK | + SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK | SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK | + SFE_XM125_PRESENCE_BUSY_MASK); + +const uint32_t SFE_XM125_PRESENCE_MAJOR_VERSION_MASK_SHIFT = 16; +const uint32_t SFE_XM125_PRESENCE_MINOR_VERSION_MASK_SHIFT = 8; +const uint32_t SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK_SHIFT = 15; +const uint32_t SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK_SHIFT = 16; +const uint32_t SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK_SHIFT = 17; +const uint32_t SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK_SHIFT = 18; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK_SHIFT = 19; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK_SHIFT = 20; +const uint32_t SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK_SHIFT = 21; +const uint32_t SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK_SHIFT = 22; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK_SHIFT = 27; +const uint32_t SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK_SHIFT = 14; +const uint32_t SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT = 16; +const uint32_t SFE_XM125_PRESENCE_BUSY_MASK_SHIFT = 30; + +const uint16_t SFE_XM125_PRESENCE_VERSION = 0x00; +typedef struct { - public: - /// @brief Initializer - sfDevXM125() : _theBus{nullptr} {}; - - /// @brief This function begins the examples/communication. - /// @return ksfTkErrOk on success, or error code (value < -1) - bool begin(sfTkII2C *theBus = nullptr); - - // sfTkError_t returnRegister(uint32_t ®Val); - - // --------------------- I2C Disance Detector Functions --------------------- - - /// @brief This function sets all the beginning values for a basic I2C - /// example to be run on the device for presence sensing. - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceBegin(); - - /// @brief This function does all the required checks and busy waits to - /// make sure the device is ready for distance readings. - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceDetectorReadingSetup(); - - /// @brief This function returns the version number of the device - /// structure: major.minor.patch - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceDetectorVersion(uint32_t &major, uint32_t &minor, uint32_t &patch); - - /// @brief This function returns if there was an error from the - /// protocol status register - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceDetectorError(uint32_t &error); - - /// @brief This function returns the error status according to the bit - /// mask value for the distance devices errors and busy bit - /// @param status Error status of device (see function for exact error) - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceDetectorErrorStatus(uint32_t &status); - - /// @brief This function returns the measure counter, the number of measurements - /// performed since restart. - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceMeasureCounter(uint32_t &counter); - - /// @brief This function returns the status of the device if there are any issues - /// with any of the status's listed defined. - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceDetectorStatus(uint32_t &status); - - /// @brief This function returns the number of detected distances. - /// @param distance Number of detected distances - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceNumberDistances(uint32_t &distance); - - /// @brief This function returns the indication that there might be an object - /// near the start point of the measured range. - /// @param edge Flag to determine object in range - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceNearStartEdge(uint32_t &edge); - - /// @brief This function returns the indication of a sensor calibration needed. - /// @param calibrate Flag to indicate calibration required - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceCalibrationNeeded(uint32_t &calibrate); - - /// @brief This function returns if the measure command failed. - /// @param error Flag to indicate measure command error - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceMeasureDistanceError(uint32_t &error); - - /// @brief This function returns the temperature in sensor during measurements - /// (in degree Celsius). Note that it has poor absolute accuracy and should - /// only be used for relative temperature measurements. - /// @param temperature Relative temperature of device - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceTemperature(int16_t &temperature); - - /// @brief This function returns the distance to peak 0 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak0Distance(uint32_t &peak); - - /// @brief This function returns the distance to peak 1 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak1Distance(uint32_t &peak); - - /// @brief This function returns the distance to peak 2 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak2Distance(uint32_t &peak); - - /// @brief This function returns the distance to peak 3 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak3Distance(uint32_t &peak); - - /// @brief This function returns the distance to peak 4 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak4Distance(uint32_t &peak); - - /// @brief This function returns the distance to peak 5 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak5Distance(uint32_t &peak); - - /// @brief This function returns the distance to peak 6 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak6Distance(uint32_t &peak); - - /// @brief This function returns the distance to peak 7 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak7Distance(uint32_t &peak); - - /// @brief This function returns the distance to peak 8 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak8Distance(uint32_t &peak); - - /// @brief This function returns the distance to peak 9 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak9Distance(uint32_t &peak); - - /// @brief This function returns the strength of peak 0 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak0Strength(int32_t &peak); - - /// @brief This function returns the strength of peak 1 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak1Strength(int32_t &peak); - - /// @brief This function returns the strength of peak 2 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak2Strength(int32_t &peak); - - /// @brief This function returns the strength of peak 3 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak3Strength(int32_t &peak); - - /// @brief This function returns the strength of peak 4 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak4Strength(int32_t &peak); - - /// @brief This function returns the strength of peak 5 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak5Strength(int32_t &peak); - - /// @brief This function returns the strength of peak 6 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak6Strength(int32_t &peak); - - /// @brief This function returns the strength of peak 7 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak7Strength(int32_t &peak); + uint32_t presence_major : 16; + uint32_t presence_minor : 8; + uint32_t presence_patch : 8; +} sfe_xm125_presence_version_t; - /// @brief This function returns the strength of peak 8 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak8Strength(int32_t &peak); - - /// @brief This function returns the strength of peak 9 - /// Note: This value is a factor 1000 larger than the RSS value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeak9Strength(int32_t &peak); - - /// @brief This function returns the start of measured interval - /// in millimeters. - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 250 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceStart(uint32_t &startVal); - - /// @brief This function sets the start of measured interval in - /// millimeters. - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 250 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceStart(uint32_t start); - - /// @brief This function returns the end of measured interval - /// in millimeters. - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 3000 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceEnd(uint32_t &end); - - /// @brief This function sets the end of measured interval - /// in millimeters. - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 3000 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceEnd(uint32_t end); - - /// @brief This function returns the used to limit step length. - /// If set to 0 (default), the step length is calculated - /// based on profile. - /// Default Value: 0 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceMaxStepLength(uint32_t &length); - - /// @brief This function sets the used to limit step length. - /// If set to 0 (default), the step length is calculated - /// based on profile. - /// Default Value: 0 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceMaxStepLength(uint32_t length); - - /// @brief This function reads if the close range leakage - /// cancellation logic is enabled. - /// Default Value: true - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceCloseRangeLeakageCancellation(bool &range); - - /// @brief This function sets the close range leakage - /// cancellation logic. - /// Default Value: true - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceCloseRangeLeakageCancellation(bool range); - - /// @brief This function returns the high signal quality in a - /// better SNR (because of higher HWAAS) and higher power consumption. - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 15000 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceSignalQuality(uint32_t &signal); - - /// @brief This function sets the high signal quality in a - /// better SNR (because of higher HWAAS) and higher power consumption. - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 15000 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceSignalQuality(uint32_t signal); - - /// @brief This function returns the max profile of the device. - /// Default value = PROFILE5 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceMaxProfile(uint32_t &profile); - - /// @brief This function sets the max profile of the device - /// Default value = PROFILE5 - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceMaxProfile(uint32_t profile); - - /// @brief This function returns the threshold method - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceThresholdMethod(uint32_t &method); - - /// @brief This function sets the threshold method - /// @param method Threshold method (enum) - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceThresholdMethod(uint32_t method); - - /// @brief This function returns the peak sorting method - /// @param peak Peak sorting method - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistancePeakSorting(uint32_t &peak); - - /// @brief This function sets the peak sorting method - /// @param peak Peak sorting method - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistancePeakSorting(uint32_t peak); +const uint16_t SFE_XM125_PRESENCE_PROTOCOL_STATUS = 0x01; +typedef struct +{ + uint32_t presence_protocol_state_error : 1; + uint32_t presence_packet_length_error : 1; + uint32_t presence_address_error : 1; + uint32_t presence_write_failed : 1; + uint32_t presence_write_to_read_only : 1; + uint32_t reserved1 : 27; +} sfe_xm125_presence_protocol_status_t; + +const uint16_t SFE_XM125_PRESENCE_MEASURE_COUNTER = 0x02; + +const uint16_t SFE_XM125_PRESENCE_DETECTOR_STATUS = 0x03; +typedef struct +{ + uint32_t presence_rss_register_ok : 1; + uint32_t presence_config_create_ok : 1; + uint32_t presence_sensor_create_ok : 1; + uint32_t presence_sensor_calibrate_ok : 1; + uint32_t presence_detector_create_ok : 1; + uint32_t presence_detector_buffer_ok : 1; + uint32_t presence_sensor_buffer_ok : 1; + uint32_t presence_config_apply_ok : 1; + uint32_t reserved1 : 8; + uint32_t presence_rss_register_error : 1; + uint32_t presence_config_create_error : 1; + uint32_t presence_sensor_create_error : 1; + uint32_t presence_sensor_calibrate_error : 1; + uint32_t presence_detector_create_error : 1; + uint32_t presence_detector_buffer_error : 1; + uint32_t presence_sensor_buffer_error : 1; + uint32_t presence_config_apply_error : 1; + uint32_t reserved2 : 4; + uint32_t presence_detector_error : 1; + uint32_t reserved3 : 2; + uint32_t presence_busy : 1; + +} sfe_xm125_presence_detector_status_t; + +const uint16_t SFE_XM125_PRESENCE_RESULT = 0x10; +typedef struct +{ + uint32_t presence_detected : 1; + uint32_t presence_detected_sticky : 1; + uint32_t reserved1 : 13; + uint32_t presence_detector_error : 1; + uint32_t presence_temperature : 16; +} sfe_xm125_presence_result_t; - /// @brief This function returns the number frames to use for recorded threshold. - /// Default Value: 100 - /// @param thresh Number of frames - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceNumFramesRecordedThreshold(uint32_t &thresh); +const uint16_t SFE_XM125_PRESENCE_DISTANCE = 0x11; +const uint16_t SFE_XM125_INTRA_PRESENCE_SCORE = 0x12; +const uint16_t SFE_XM125_INTER_PRESENCE = 0x13; - /// @brief This function sets the number frames to use for recorded threshold. - /// Default Value: 100 - /// @param thresh Number of frames - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceNumFramesRecordedThreshold(uint32_t thresh); +const uint16_t SFE_XM125_PRESENCE_SWEEPS_PER_FRAME = 0x40; +const uint16_t sfe_xm125_presence_sweeps_per_frame_default = 16; - /// @brief This function returns the fixed amplitude threshold value. - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 100000 - /// @param thresh Fixed amplitude threshold value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceFixedAmpThreshold(uint32_t &thresh); +const uint16_t SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT = 0x41; +const uint16_t sfe_xm125_presence_inter_frame_timeout_default = 3; - /// @brief This function sets the fixed amplitude threshold value. - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 100000 - /// @param thresh Fixed amplitude threshold value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceFixedAmpThreshold(uint32_t thresh); +const uint16_t SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED = 0x42; +const bool sfe_xm125_presence_inter_phase_boost_enabled_default = false; - /// @brief This function returns the threshold sensitivity - /// (0 <= sensitivity <= 1000) - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 500 - /// @param thresh& Threshold sensitivity - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceThresholdSensitivity(uint32_t &thresh); +const uint16_t SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED = 0x43; +const bool sfe_xm125_presence_intra_detection_enabled_default = true; - /// @brief This function sets the threshold sensitivity - /// (0 <= sensitivity <= 1000) - /// Note: This value is a factor 1000 larger than the RSS value - /// Default Value: 500 - /// @param thresh Threshold sensitivity - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceThresholdSensitivity(uint32_t thresh); +const uint16_t SFE_XM125_PRESENCE_INTER_DETECTION_ENABLED = 0x44; +const bool sfe_xm125_presence_inter_detection_enabled_default = true; - /// @brief This function returns the reflector shape - /// Default Value: GENERIC - /// @param shape Generic or planar reflection - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceReflectorShape(uint32_t &shape); +const uint16_t SFE_XM125_PRESENCE_FRAME_RATE = 0x45; +const uint16_t sfe_xm125_presence_frame_rate_default = 12000; - /// @brief This function sets the reflector shape - /// Default Value: GENERIC - /// @param shape Generic or planar reflection - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceReflectorShape(uint32_t shape); +const uint16_t SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD = 0x46; +const uint16_t sfe_xm125_presence_intra_detection_threshold_default = 1300; - /// @brief This function returns the fixed strength threshold value. - /// Default Value: 0 - /// Note: This value is a factor 1000 larger than the RSS value - /// @param thresh fixed threshold strength value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceFixedStrengthThresholdValue(int32_t &thresh); +const uint16_t SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD = 0x47; +const uint16_t sfe_xm125_presence_inter_detection_threshold_default = 1000; - /// @brief This function sets the fixed strength threshold value. - /// Default Value: 0 - /// Note: This value is a factor 1000 larger than the RSS value - /// @param thresh fixed threshold strength value - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceFixedStrengthThresholdValue(int32_t thresh); +const uint16_t SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION = 0x48; +const uint16_t sfe_xm125_presence_inter_frame_deviation_default = 500; - /// @brief This function returns the measure on wakeup status. - /// Default Value: false - /// @param measure Measure on wakeup occurrence - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t getDistanceMeasureOneWakeup(bool &measure); +const uint16_t SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF = 0x49; +const uint16_t sfe_xm125_presence_inter_frame_fast_cutoff_default = 6000; - /// @brief This function sets the measure on wakeup status. - /// Default Value: false - /// @param measure Measure on wakeup occurrence - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceMeasureOneWakeup(bool measure); +const uint16_t SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF = 0x4a; +const uint16_t sfe_xm125_presence_inter_frame_slow_cutoff_default = 200; - /// @brief This function sets the specific execute command as defined in the - /// datasheet on Page 25, Section 6.2.40 Command. - /// @param apply Enable configuration and calibrate - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t setDistanceCommand(uint32_t command); +const uint16_t SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST = 0x4b; +const uint16_t sfe_xm125_presence_intra_frame_time_const_default = 150; - /// @brief This function applies the configuration to the device by - /// writing the defined value to the distance command register - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceApplyConfiguration(); +const uint16_t SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST = 0x4c; +const uint16_t sfe_xm125_presence_intra_output_time_const_default = 300; - /// @brief This function starts the device by writing the defined - /// start value to the distance command register - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceStart(); +const uint16_t SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST = 0x4d; +const uint16_t sfe_xm125_presence_inter_output_time_const_default = 2000; - /// @brief This function stops the device by writing the defined - /// stop value to the distance command register - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceStop(); +const uint16_t SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED = 0x4e; +const bool sfe_xm125_presence_auto_profile_enabled_default = true; - /// @brief This function calibrates the device by writing the defined - /// calibration value to the distance command register - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceCalibrate(); +const uint16_t SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED = 0x4f; +const bool sfe_xm125_presence_auto_step_length_enabled_default = true; - /// @brief This function recalibrates the device by writing the defined - /// recalibrate value to the distance command register - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceRecalibrate(); +const uint16_t SFE_XM125_PRESENCE_MANUAL_PROFILE = 0x50; +typedef enum +{ + XM125_PRESENCE_PROFILE1 = 1, + XM125_PRESENCE_PROFILE2 = 2, + XM125_PRESENCE_PROFILE3 = 3, + XM125_PRESENCE_PROFILE4 = 4, + XM125_PRESENCE_PROFILE5 = 5, +} sfe_xm125_presence_manual_profile_t; - /// @brief This function enables the uart logs of the device by - /// writing the defined value to the distance command register - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceEnableUartLogs(); +const uint16_t SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH = 0x51; +const uint16_t sfe_xm125_presence_manual_step_length_default = 72; - /// @brief This function disables the uart logs of the device by - /// writing the defined value to the distance command register - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceDisableUartLogs(); +const uint16_t SFE_XM125_PRESENCE_START = 0x52; +const uint16_t sfe_xm125_presence_start_default = 250; - /// @brief This function enables the configuration log of the device - /// by writing the defined value to the distance command register - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceLogConfiguration(); +const uint16_t SFE_XM125_PRESENCE_END = 0x53; +const uint16_t sfe_xm125_presence_end_default = 2500; - /// @brief This function resets the distance detector settings - /// of the device - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceReset(); +const uint16_t SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE = 0x54; +const bool sfe_xm125_presence_reset_filters_on_prepare_default = true; - /// @brief Completes a busy wait loop while the device is uploading - /// information by waiting for the status - /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceBusyWait(); +const uint16_t SFE_XM125_PRESENCE_HWAAS = 0x55; +const uint16_t sfe_xm125_presence_hwaas_default = 32; - // --------------------- I2C Presence Detector Functions --------------------- +const uint16_t SFE_XM125_PRESENCE_DETECTION_ON_GPIO = 0x80; +const bool sfe_xm125_presence_detection_on_gpio_default = false; +const uint16_t SFE_XM125_PRESENCE_COMMAND = 0x100; +typedef enum +{ + XM125_PRESENCE_APPLY_CONFIGURATION = 1, + XM125_PRESENCE_START_DETECTOR = 2, + XM125_PRESENCE_STOP_DETECTOR = 3, + XM125_PRESENCE_ENABLE_UART_LOGS = 32, + XM125_PRESENCE_DISABLE_UART_LOGS = 33, + XM125_PRESENCE_LOG_CONFIGURATION = 34, + XM125_PRESENCE_RESET_MODULE = 138119737, +} sfe_xm125_presence_command_t; + +const uint32_t SFE_XM125_PRESENCE_APPLY_CONFIGURATION = 1; +const uint32_t SFE_XM125_PRESENCE_START_DETECTOR = 2; +const uint32_t SFE_XM125_PRESENCE_STOP_DETECTOR = 3; +const uint32_t SFE_XM125_PRESENCE_ENABLE_UART_LOGS = 32; +const uint32_t SFE_XM125_PRESENCE_DISABLE_UART_LOGS = 33; +const uint32_t SFE_XM125_PRESENCE_LOG_CONFIGURATION = 34; +const uint32_t SFE_XM125_PRESENCE_RESET_MODULE = 1381192737; + +// Presence class definition + +class sfDevXM125Presence : public sfDevXM125Core +{ + public: + /** + * @brief Initializes the Presence detector device. + * + * This function sets up the I2C communication and performs initial checks + * to ensure the device is ready for operation. + * + * @param theBus Pointer to the I2C bus object. If nullptr, the default bus is used. + * @return ksfTkErrOk on success, or error code (value < -1) on failure. + */ + sfTkError_t begin(sfTkII2C *theBus = nullptr); /// @brief This function sets all the beginning values for a basic I2C /// example to be run on the device for presence sensing. /// @return ksfTkErrOk on success, or error code (value < -1) @@ -890,7 +702,4 @@ class sfDevXM125 /// to wait until errors are completed/gone /// @return ksfTkErrOk on success, or error code (value < -1) sfTkError_t presenceBusyWait(); - - protected: - sfTkII2C *_theBus; -}; +}; \ No newline at end of file diff --git a/src/sfTk/sfXM125Regs.h b/src/sfTk/sfXM125Regs.h deleted file mode 100644 index 5985f01..0000000 --- a/src/sfTk/sfXM125Regs.h +++ /dev/null @@ -1,481 +0,0 @@ -/** - * @file sfXM125Regs.h - * @brief Header with register defines for the SparkFun Qwiic XM125 Library. - * - * This file contains the definitions and masks used for operating the - * SparkFun Qwiic XM125 distance and presence detector using I2C communication. - * - * @author SparkFun Electronics - * @date 2024-2025 - * @copyright Copyright (c) 2024-2025, SparkFun Electronics Inc. This project is released under the MIT License. - * - * SPDX-License-Identifier: MIT - */ - -#include - -// Handy helper - check if a bit(s) is set... - -#define SF_CHECK_BITS_SET(__value__, __bitmask__) (((__value__) & (__bitmask__)) == __bitmask__) - -const uint16_t SFE_XM125_I2C_ADDRESS = 0x52; - -/* ****************************** Distance Values ****************************** */ - -const uint32_t SFE_XM125_DISTANCE_MAJOR_VERSION_MASK = 0xffff0000; -const uint32_t SFE_XM125_DISTANCE_MINOR_VERSION_MASK = 0x0000ff00; -const uint32_t SFE_XM125_DISTANCE_PATCH_VERSION_MASK = 0x000000ff; -const uint32_t SFE_XM125_DISTANCE_NUMBER_DISTANCES_MASK = 0x0000000f; -const uint32_t SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK = 0x00000100; -const uint32_t SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK = 0x00000400; -const uint32_t SFE_XM125_DISTANCE_TEMPERATURE_MASK = 0xffff0000; -const uint32_t SFE_XM125_DISTANCE_RSS_REGISTER_OK_MASK = 0x00000001; -const uint32_t SFE_XM125_DISTANCE_CONFIG_CREATE_OK_MASK = 0x00000002; -const uint32_t SFE_XM125_DISTANCE_SENSOR_CREATE_OK_MASK = 0x00000004; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_CREATE_OK_MASK = 0x00000008; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_BUFFER_OK_MASK = 0x00000010; -const uint32_t SFE_XM125_DISTANCE_SENSOR_BUFFER_OK_MASK = 0x00000020; -const uint32_t SFE_XM125_DISTANCE_CALIBRATION_BUFFER_OK_MASK = 0x00000040; -const uint32_t SFE_XM125_DISTANCE_CONFIG_APPLY_OK_MASK = 0x00000080; -const uint32_t SFE_XM125_DISTANCE_SENSOR_CALIBRATE_OK_MASK = 0x00000100; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_OK_MASK = 0x00000200; -const uint32_t SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK = 0x00010000; -const uint32_t SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK = 0x00020000; -const uint32_t SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK = 0x00040000; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK = 0x00080000; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK = 0x00100000; -const uint32_t SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK = 0x00200000; -const uint32_t SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK = 0x00400000; -const uint32_t SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK = 0x00800000; -const uint32_t SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK = 0x01000000; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK = 0x02000000; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK = 0x10000000; -const uint32_t SFE_XM125_DISTANCE_BUSY_MASK = 0x80000000; -const uint32_t SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK = 0x00000200; - -const uint32_t SFE_XM125_DISTANCE_ALL_ERROR_MASK = - (SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK | SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK | - SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK | SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK | - SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK | SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK | - SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK | SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK | - SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK | SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK | - SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK | SFE_XM125_DISTANCE_BUSY_MASK); - -const uint32_t SFE_XM125_DISTANCE_MAJOR_VERSION_MASK_SHIFT = 16; -const uint32_t SFE_XM125_DISTANCE_MINOR_VERSION_MASK_SHIFT = 8; -const uint32_t SFE_XM125_DISTANCE_RSS_REGISTER_ERROR_MASK_SHIFT = 15; -const uint32_t SFE_XM125_DISTANCE_CONFIG_CREATE_ERROR_MASK_SHIFT = 16; -const uint32_t SFE_XM125_DISTANCE_SENSOR_CREATE_ERROR_MASK_SHIFT = 17; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_CREATE_ERROR_MASK_SHIFT = 18; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_BUFFER_ERROR_MASK_SHIFT = 19; -const uint32_t SFE_XM125_DISTANCE_SENSOR_BUFFER_ERROR_MASK_SHIFT = 20; -const uint32_t SFE_XM125_DISTANCE_CALIBRATION_BUFFER_ERROR_MASK_SHIFT = 21; -const uint32_t SFE_XM125_DISTANCE_CONFIG_APPLY_ERROR_MASK_SHIFT = 22; -const uint32_t SFE_XM125_DISTANCE_SENSOR_CALIBRATE_ERROR_MASK_SHIFT = 23; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_CALIBRATE_ERROR_MASK_SHIFT = 24; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_ERROR_MASK_SHIFT = 27; -const uint32_t SFE_XM125_DISTANCE_BUSY_MASK_SHIFT = 30; -const uint32_t SFE_XM125_DISTANCE_NEAR_START_EDGE_MASK_SHIFT = 8; -const uint32_t SFE_XM125_DISTANCE_CALIBRATION_NEEDED_MASK_SHIFT = 9; -const uint32_t SFE_XM125_DISTANCE_MEASURE_DISTANCE_ERROR_MASK_SHIFT = 10; -const uint32_t SFE_XM125_DISTANCE_TEMPERATURE_MASK_SHIFT = 16; -const uint32_t SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK_SHIFT = 30; - -const uint32_t SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK = 0b10010000111111110000000011111111; - -const uint16_t SFE_XM125_DISTANCE_VERSION = 0x00; -typedef struct -{ - uint32_t distance_major : 16; - uint32_t distance_minor : 8; - uint32_t distance_patch : 8; -} sfe_xm125_distance_version_t; - -const uint16_t SFE_XM125_DISTANCE_PROTOCOL_STATUS = 0x01; -typedef struct -{ - uint32_t distance_protocol_state_error : 1; - uint32_t distance_packet_length_error : 1; - uint32_t distance_address_error : 1; - uint32_t distance_write_failed : 1; - uint32_t distance_write_to_read_only : 1; - uint32_t reserved1 : 27; -} sfe_xm125_distance_protocol_status_t; - -const uint16_t SFE_XM125_DISTANCE_MEASURE_COUNTER = 0x02; - -const uint16_t SFE_XM125_DISTANCE_DETECTOR_STATUS = 0x03; -typedef struct -{ - uint32_t distance_rss_register_ok : 1; - uint32_t distance_config_create_ok : 1; - uint32_t distance_sensor_create_ok : 1; - uint32_t distance_detector_create_ok : 1; - uint32_t distance_detector_buffer_ok : 1; - uint32_t distance_sensor_buffer_ok : 1; - uint32_t distance_calibration_buffer_ok : 1; - uint32_t distance_config_apply_ok : 1; - uint32_t distance_sensor_calibrate_ok : 1; - uint32_t distance_detector_calibrate_ok : 1; - uint32_t reserved1 : 6; - uint32_t distance_rss_register_error : 1; - uint32_t distance_config_create_error : 1; - uint32_t distance_sensor_create_error : 1; - uint32_t distance_detector_create_error : 1; - uint32_t distance_detector_buffer_error : 1; - uint32_t distance_sensor_buffer_error : 1; - uint32_t distance_calibration_buffer_error : 1; - uint32_t distance_config_apply_error : 1; - uint32_t distance_sensor_calibrate_error : 1; - uint32_t distance_detector_calibrate_error : 1; - uint32_t reserved2 : 2; - uint32_t distance_detector_error : 1; - uint32_t reserved3 : 2; - uint32_t distance_busy : 1; -} sfe_xm125_distance_detector_status_t; - -const uint16_t SFE_XM125_DISTANCE_RESULT = 0x10; -typedef struct -{ - uint32_t distance_num_distances : 4; - uint32_t rsvd1 : 4; // skips "reserved" bits - uint32_t distance_near_start_edge : 1; - uint32_t distance_calibration_needed : 1; - uint32_t distance_measure_distance_error : 1; - uint32_t reserved1 : 5; - uint32_t distance_temperature : 16; -} sfe_xm125_distance_result_t; - -const uint16_t SFE_XM125_DISTANCE_PEAK0_DISTANCE = 0x11; -const uint16_t SFE_XM125_DISTANCE_PEAK1_DISTANCE = 0x12; -const uint16_t SFE_XM125_DISTANCE_PEAK2_DISTANCE = 0x13; -const uint16_t SFE_XM125_DISTANCE_PEAK3_DISTANCE = 0x14; -const uint16_t SFE_XM125_DISTANCE_PEAK4_DISTANCE = 0x15; -const uint16_t SFE_XM125_DISTANCE_PEAK5_DISTANCE = 0x16; -const uint16_t SFE_XM125_DISTANCE_PEAK6_DISTANCE = 0x17; -const uint16_t SFE_XM125_DISTANCE_PEAK7_DISTANCE = 0x18; -const uint16_t SFE_XM125_DISTANCE_PEAK8_DISTANCE = 0x19; -const uint16_t SFE_XM125_DISTANCE_PEAK9_DISTANCE = 0x1a; -const uint16_t SFE_XM125_DISTANCE_PEAK0_STRENGTH = 0x1b; -const uint16_t SFE_XM125_DISTANCE_PEAK1_STRENGTH = 0x1c; -const uint16_t SFE_XM125_DISTANCE_PEAK2_STRENGTH = 0x1d; -const uint16_t SFE_XM125_DISTANCE_PEAK3_STRENGTH = 0x1e; -const uint16_t SFE_XM125_DISTANCE_PEAK4_STRENGTH = 0x1f; -const uint16_t SFE_XM125_DISTANCE_PEAK5_STRENGTH = 0x20; -const uint16_t SFE_XM125_DISTANCE_PEAK6_STRENGTH = 0x21; -const uint16_t SFE_XM125_DISTANCE_PEAK7_STRENGTH = 0x22; -const uint16_t SFE_XM125_DISTANCE_PEAK8_STRENGTH = 0x23; -const uint16_t SFE_XM125_DISTANCE_PEAK9_STRENGTH = 0x24; - -// Default Value: 250 -const uint16_t SFE_XM125_DISTANCE_START = 0x40; -const uint16_t sfe_xm125_distance_start_default = 250; - -// Default Value: 3000 -const uint16_t SFE_XM125_DISTANCE_END = 0x41; -const uint16_t sfe_xm125_distance_end_default = 3000; - -// Default Value: 0 -const uint16_t SFE_XM125_DISTANCE_MAX_STEP_LENGTH = 0x42; -const uint16_t sfe_xm125_distance_max_step_length_default = 0; - -// Default Value: True -const uint16_t SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE = 0x43; -const bool sfe_xm125_distance_close_range_leakage_default = true; - -// Default Value: 15000 -const uint16_t SFE_XM125_DISTANCE_SIGNAL_QUALITY = 0x44; -const uint16_t sfe_xm125_distance_signal_quality_default = 15000; - -// Default: PROFILE5 (enum) -const uint16_t SFE_XM125_DISTANCE_MAX_PROFILE = 0x45; -typedef enum -{ - XM125_DISTANCE_PROFILE1 = 1, - XM125_DISTANCE_PROFILE2 = 2, - XM125_DISTANCE_PROFILE3 = 3, - XM125_DISTANCE_PROFILE4 = 4, - XM125_DISTANCE_PROFILE5 = 5, -} sfe_xm125_distance_profile_t; - -// Default Value: CFAR (enum) -const uint16_t SFE_XM125_DISTANCE_THRESHOLD_METHOD = 0x46; -typedef enum -{ - XM125_DISTANCE_FIXED_AMPLITUDE = 1, - XM125_DISTANCE_RECORDED = 2, - XM125_DISTANCE_CFAR = 3, - XM125_DISTANCE_FIXED_STRENGTH = 4, -} sfe_xm125_distance_threshold_method_t; - -// Default Value: STRONGEST (enum) -const uint16_t SFE_XM125_DISTANCE_PEAK_SORTING = 0x47; -typedef enum -{ - XM125_DISTANCE_CLOSEST = 1, - XM125_DISTANCE_STRONGEST = 2, -} sfe_xm125_distance_peak_sorting_t; - -// Default Value: 100 -const uint16_t SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH = 0x48; -const uint16_t sfe_xm125_distance_num_frames_recorded_thresh_default = 100; - -// Default Value: 100000 -const uint16_t SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL = 0x49; -const uint32_t sfe_xm125_distance_fixed_amp_thresh_val_default = 100000; - -// Default Value: 500 -const uint16_t SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY = 0x4a; -const uint16_t sfe_xm125_distance_threshold_sensitivity_default = 500; - -// Default Value: GENERIC -const uint16_t SFE_XM125_DISTANCE_REFLECTOR_SHAPE = 0x4b; -typedef enum -{ - XM125_DISTANCE_GENERIC = 1, - XM125_DISTANCE_PLANAR = 2, -} sfe_xm125_distance_reflector_shape_t; - -// Default Value: 0 -const uint16_t SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL = 0x4c; -const uint16_t sfe_xm125_distance_fixed_strength_threshold_val_default = 0; - -// Default Value: False -const uint16_t SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP = 0x80; -const bool sfe_xm125_distance_measure_on_wakup = false; - -const uint16_t SFE_XM125_DISTANCE_COMMAND = 0x100; -typedef enum -{ - XM125_DISTANCE_APPLY_CONFIG_AND_CALIBRATE = 1, - XM125_DISTANCE_MEASURE_DISTANCE = 2, - XM125_DISTANCE_APPLY_CONFIGURATION = 3, - XM125_DISTANCE_CALIBRATE = 4, - XM125_DISTANCE_RECALIBRATE = 5, - XM125_DISTANCE_ENABLE_UART_LOGS = 32, - XM125_DISTANCE_DISABLE_UART_LOGS = 33, - XM125_DISTANCE_LOG_CONFIGURATION = 34, - XM125_DISTANCE_RESET_MODULE = 1381192737, -} sfe_xm125_distance_command_t; - -const uint32_t SFE_XM125_DISTANCE_APPLY_CONFIGURATION = 1; -const uint32_t SFE_XM125_DISTANCE_START_DETECTOR = 2; -const uint32_t SFE_XM125_DISTANCE_STOP_DETECTOR = 3; -const uint32_t SFE_XM125_DISTANCE_CALIBRATE = 4; -const uint32_t SFE_XM125_DISTANCE_RECALIBRATE = 5; -const uint32_t SFE_XM125_DISTANCE_ENABLE_UART_LOGS = 32; -const uint32_t SFE_XM125_DISTANCE_DISABLE_UART_LOGS = 33; -const uint32_t SFE_XM125_DISTANCE_LOG_CONFIGURATION = 34; -const uint32_t SFE_XM125_DISTANCE_RESET_MODULE = 1381192737; - -/* ****************************** Presence Values ****************************** */ - -const uint32_t SFE_XM125_PRESENCE_DETECTOR_STATUS_MASK = 0b10010000111111110000000011111111; - -const uint32_t SFE_XM125_PRESENCE_DETECTED_MASK = 0x00000001; -const uint32_t SFE_XM125_PRESENCE_DETECTED_STICKY_MASK = 0x00000002; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK = 0x00008000; -const uint32_t SFE_XM125_PRESENCE_TEMPERATURE_MASK = 0xffff0000; -const uint32_t SFE_XM125_PRESENCE_MAJOR_VERSION_MASK = 0xffff0000; -const uint32_t SFE_XM125_PRESENCE_MINOR_VERSION_MASK = 0x0000ff00; -const uint32_t SFE_XM125_PRESENCE_PATCH_VERSION_MASK = 0x000000ff; - -const uint32_t SFE_XM125_PRESENCE_RSS_REGISTER_OK_MASK = 0x00000001; -const uint32_t SFE_XM125_PRESENCE_CONFIG_CREATE_OK_MASK = 0x00000002; -const uint32_t SFE_XM125_PRESENCE_SENSOR_CREATE_OK_MASK = 0x00000004; -const uint32_t SFE_XM125_PRESENCE_SENSOR_CALIBRATE_OK_MASK = 0x00000008; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_CREATE_OK_MASK = 0x00000010; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_BUFFER_OK_MASK = 0x00000020; -const uint32_t SFE_XM125_PRESENCE_SENSOR_BUFFER_OK_MASK = 0x00000040; -const uint32_t SFE_XM125_PRESENCE_CONFIG_APPLY_OK_MASK = 0x00000080; -const uint32_t SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK = 0x00010000; -const uint32_t SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK = 0x00020000; -const uint32_t SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK = 0x00040000; -const uint32_t SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK = 0x00080000; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK = 0x00100000; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK = 0x00200000; -const uint32_t SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK = 0x00400000; -const uint32_t SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK = 0x00800000; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK = 0x10000000; -const uint32_t SFE_XM125_PRESENCE_BUSY_MASK = 0x80000000; - -const uint32_t SFE_XM125_PRESENCE_ALL_ERROR_MASK = - (SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK | SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK | - SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK | SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK | - SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK | SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK | - SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK | SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK | - SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK | SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK | - SFE_XM125_PRESENCE_BUSY_MASK); - -const uint32_t SFE_XM125_PRESENCE_MAJOR_VERSION_MASK_SHIFT = 16; -const uint32_t SFE_XM125_PRESENCE_MINOR_VERSION_MASK_SHIFT = 8; -const uint32_t SFE_XM125_PRESENCE_RSS_REGISTER_ERROR_MASK_SHIFT = 15; -const uint32_t SFE_XM125_PRESENCE_CONFIG_CREATE_ERROR_MASK_SHIFT = 16; -const uint32_t SFE_XM125_PRESENCE_SENSOR_CREATE_ERROR_MASK_SHIFT = 17; -const uint32_t SFE_XM125_PRESENCE_SENSOR_CALIBRATE_ERROR_MASK_SHIFT = 18; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_CREATE_ERROR_MASK_SHIFT = 19; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_BUFFER_ERROR_MASK_SHIFT = 20; -const uint32_t SFE_XM125_PRESENCE_SENSOR_BUFFER_ERROR_MASK_SHIFT = 21; -const uint32_t SFE_XM125_PRESENCE_CONFIG_APPLY_ERROR_MASK_SHIFT = 22; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_REG_ERROR_MASK_SHIFT = 27; -const uint32_t SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK_SHIFT = 14; -const uint32_t SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT = 16; -const uint32_t SFE_XM125_PRESENCE_BUSY_MASK_SHIFT = 30; - -const uint16_t SFE_XM125_PRESENCE_VERSION = 0x00; -typedef struct -{ - uint32_t presence_major : 16; - uint32_t presence_minor : 8; - uint32_t presence_patch : 8; -} sfe_xm125_presence_version_t; - -const uint16_t SFE_XM125_PRESENCE_PROTOCOL_STATUS = 0x01; -typedef struct -{ - uint32_t presence_protocol_state_error : 1; - uint32_t presence_packet_length_error : 1; - uint32_t presence_address_error : 1; - uint32_t presence_write_failed : 1; - uint32_t presence_write_to_read_only : 1; - uint32_t reserved1 : 27; -} sfe_xm125_presence_protocol_status_t; - -const uint16_t SFE_XM125_PRESENCE_MEASURE_COUNTER = 0x02; - -const uint16_t SFE_XM125_PRESENCE_DETECTOR_STATUS = 0x03; -typedef struct -{ - uint32_t presence_rss_register_ok : 1; - uint32_t presence_config_create_ok : 1; - uint32_t presence_sensor_create_ok : 1; - uint32_t presence_sensor_calibrate_ok : 1; - uint32_t presence_detector_create_ok : 1; - uint32_t presence_detector_buffer_ok : 1; - uint32_t presence_sensor_buffer_ok : 1; - uint32_t presence_config_apply_ok : 1; - uint32_t reserved1 : 8; - uint32_t presence_rss_register_error : 1; - uint32_t presence_config_create_error : 1; - uint32_t presence_sensor_create_error : 1; - uint32_t presence_sensor_calibrate_error : 1; - uint32_t presence_detector_create_error : 1; - uint32_t presence_detector_buffer_error : 1; - uint32_t presence_sensor_buffer_error : 1; - uint32_t presence_config_apply_error : 1; - uint32_t reserved2 : 4; - uint32_t presence_detector_error : 1; - uint32_t reserved3 : 2; - uint32_t presence_busy : 1; - -} sfe_xm125_presence_detector_status_t; - -const uint16_t SFE_XM125_PRESENCE_RESULT = 0x10; -typedef struct -{ - uint32_t presence_detected : 1; - uint32_t presence_detected_sticky : 1; - uint32_t reserved1 : 13; - uint32_t presence_detector_error : 1; - uint32_t presence_temperature : 16; -} sfe_xm125_presence_result_t; - -const uint16_t SFE_XM125_PRESENCE_DISTANCE = 0x11; -const uint16_t SFE_XM125_INTRA_PRESENCE_SCORE = 0x12; -const uint16_t SFE_XM125_INTER_PRESENCE = 0x13; - -const uint16_t SFE_XM125_PRESENCE_SWEEPS_PER_FRAME = 0x40; -const uint16_t sfe_xm125_presence_sweeps_per_frame_default = 16; - -const uint16_t SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT = 0x41; -const uint16_t sfe_xm125_presence_inter_frame_timeout_default = 3; - -const uint16_t SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED = 0x42; -const bool sfe_xm125_presence_inter_phase_boost_enabled_default = false; - -const uint16_t SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED = 0x43; -const bool sfe_xm125_presence_intra_detection_enabled_default = true; - -const uint16_t SFE_XM125_PRESENCE_INTER_DETECTION_ENABLED = 0x44; -const bool sfe_xm125_presence_inter_detection_enabled_default = true; - -const uint16_t SFE_XM125_PRESENCE_FRAME_RATE = 0x45; -const uint16_t sfe_xm125_presence_frame_rate_default = 12000; - -const uint16_t SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD = 0x46; -const uint16_t sfe_xm125_presence_intra_detection_threshold_default = 1300; - -const uint16_t SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD = 0x47; -const uint16_t sfe_xm125_presence_inter_detection_threshold_default = 1000; - -const uint16_t SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION = 0x48; -const uint16_t sfe_xm125_presence_inter_frame_deviation_default = 500; - -const uint16_t SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF = 0x49; -const uint16_t sfe_xm125_presence_inter_frame_fast_cutoff_default = 6000; - -const uint16_t SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF = 0x4a; -const uint16_t sfe_xm125_presence_inter_frame_slow_cutoff_default = 200; - -const uint16_t SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST = 0x4b; -const uint16_t sfe_xm125_presence_intra_frame_time_const_default = 150; - -const uint16_t SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST = 0x4c; -const uint16_t sfe_xm125_presence_intra_output_time_const_default = 300; - -const uint16_t SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST = 0x4d; -const uint16_t sfe_xm125_presence_inter_output_time_const_default = 2000; - -const uint16_t SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED = 0x4e; -const bool sfe_xm125_presence_auto_profile_enabled_default = true; - -const uint16_t SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED = 0x4f; -const bool sfe_xm125_presence_auto_step_length_enabled_default = true; - -const uint16_t SFE_XM125_PRESENCE_MANUAL_PROFILE = 0x50; -typedef enum -{ - XM125_PRESENCE_PROFILE1 = 1, - XM125_PRESENCE_PROFILE2 = 2, - XM125_PRESENCE_PROFILE3 = 3, - XM125_PRESENCE_PROFILE4 = 4, - XM125_PRESENCE_PROFILE5 = 5, -} sfe_xm125_presence_manual_profile_t; - -const uint16_t SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH = 0x51; -const uint16_t sfe_xm125_presence_manual_step_length_default = 72; - -const uint16_t SFE_XM125_PRESENCE_START = 0x52; -const uint16_t sfe_xm125_presence_start_default = 250; - -const uint16_t SFE_XM125_PRESENCE_END = 0x53; -const uint16_t sfe_xm125_presence_end_default = 2500; - -const uint16_t SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE = 0x54; -const bool sfe_xm125_presence_reset_filters_on_prepare_default = true; - -const uint16_t SFE_XM125_PRESENCE_HWAAS = 0x55; -const uint16_t sfe_xm125_presence_hwaas_default = 32; - -const uint16_t SFE_XM125_PRESENCE_DETECTION_ON_GPIO = 0x80; -const bool sfe_xm125_presence_detection_on_gpio_default = false; - -const uint16_t SFE_XM125_PRESENCE_COMMAND = 0x100; -typedef enum -{ - XM125_PRESENCE_APPLY_CONFIGURATION = 1, - XM125_PRESENCE_START_DETECTOR = 2, - XM125_PRESENCE_STOP_DETECTOR = 3, - XM125_PRESENCE_ENABLE_UART_LOGS = 32, - XM125_PRESENCE_DISABLE_UART_LOGS = 33, - XM125_PRESENCE_LOG_CONFIGURATION = 34, - XM125_PRESENCE_RESET_MODULE = 138119737, -} sfe_xm125_presence_command_t; - -const uint32_t SFE_XM125_PRESENCE_APPLY_CONFIGURATION = 1; -const uint32_t SFE_XM125_PRESENCE_START_DETECTOR = 2; -const uint32_t SFE_XM125_PRESENCE_STOP_DETECTOR = 3; -const uint32_t SFE_XM125_PRESENCE_ENABLE_UART_LOGS = 32; -const uint32_t SFE_XM125_PRESENCE_DISABLE_UART_LOGS = 33; -const uint32_t SFE_XM125_PRESENCE_LOG_CONFIGURATION = 34; -const uint32_t SFE_XM125_PRESENCE_RESET_MODULE = 1381192737; \ No newline at end of file From 577cf0972be9c92601fb46002289c88d2863f0b3 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 16:37:54 -0700 Subject: [PATCH 19/32] added note about class changes and how to port code forward to v2 of the library --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6316395..bdece87 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,20 @@ Arduino Library for the SparkFun Pulsed Coherent Radar Sensor ![GitHub issues](https://img.shields.io/github/issues/sparkfun/SparkFun_Qwiic_XM125_Arduino_Library) - The [SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (SEN-24540)](https://www.sparkfun.com/sparkfun-pulsed-coherent-radar-sensor-acconeer-xm125-qwiic.html) brings powerful 60 GHz radar technology to your projects. This sensor isn't limited to surface detection; it can see through walls, cabinets, and even pockets (depending on the material), making it perfect for unique applications. Measure distances with millimeter precision, detect motion, the speed of an object, or even gestures! The XM125 boasts an impressive range of up to 20 meters, allowing you to create long-range sensing projects. The actual measurable distance is dependent on the object size, shape, dielectric properties, and lens (e.g. water level measurements up to 20 meters with lens utilization, human presence detection up to 7 meters with lens-free utilization). Despite its power, the sensor has remarkably low in power consumption, which is ideal for battery-powered applications. The real magic lies in the sensor's ability to do more than measure distance; the XM125 can differentiate between stationary objects and moving targets using pulsed coherent radar. This means you can sense an object's presence and how fast something is moving! Looking for the board that matches this library - pick up a [SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (Qwiic)](https://www.sparkfun.com/sparkfun-pulsed-coherent-radar-sensor-acconeer-xm125-qwiic.html) at www.sparkfun.com. +> [!NOTE] +> Version 2.0+ of this library is not compatible with Version 1.0 implementations/use. For Version 2.0, the single class defined by the library, `SparkFunXM125`, was divided into two distinct classes: +> +> * SparkFunXM125Distance - Used when the XM125 is running the ***Distance*** application +> * SparkFunXM125Presence - Used when the XM125 is running the ***Presence*** application +> +> Moving to use Version 2.0 of the library just requires changing the class name used in your sketch - from `SparkFunXM125` to either `SparkFunXM125Distance` or `SparkFunXM125Presence` + ## Functionality The SparkFun Pulsed Coherent Radar sensor can run as an I2C client device, or as a standalone development board. This library is used when the sensor is operating as a standalone I2C device. From afdfb1ff0541eec0d8584240b0ea03ea9e5bbd8e Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 16:39:55 -0700 Subject: [PATCH 20/32] use header, not note tag --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bdece87..db217f8 100644 --- a/README.md +++ b/README.md @@ -19,13 +19,14 @@ The XM125 boasts an impressive range of up to 20 meters, allowing you to create Looking for the board that matches this library - pick up a [SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (Qwiic)](https://www.sparkfun.com/sparkfun-pulsed-coherent-radar-sensor-acconeer-xm125-qwiic.html) at www.sparkfun.com. -> [!NOTE] -> Version 2.0+ of this library is not compatible with Version 1.0 implementations/use. For Version 2.0, the single class defined by the library, `SparkFunXM125`, was divided into two distinct classes: -> -> * SparkFunXM125Distance - Used when the XM125 is running the ***Distance*** application -> * SparkFunXM125Presence - Used when the XM125 is running the ***Presence*** application -> -> Moving to use Version 2.0 of the library just requires changing the class name used in your sketch - from `SparkFunXM125` to either `SparkFunXM125Distance` or `SparkFunXM125Presence` +### Upgrading to Version 2.0 + +Version 2.0+ of this library is not compatible with Version 1.* implementations/use. For Version 2.0, the single class defined by the library, `SparkFunXM125`, was divided into two distinct classes: + +* SparkFunXM125Distance - Used when the XM125 is running the ***Distance*** application +* SparkFunXM125Presence - Used when the XM125 is running the ***Presence*** application + +Moving to use Version 2.0 of the library just requires changing the class name used in your sketch - from `SparkFunXM125` to either `SparkFunXM125Distance` or `SparkFunXM125Presence` ## Functionality From 07b99268309657a1678669180cd18030988f7d63 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Sat, 15 Feb 2025 16:41:15 -0700 Subject: [PATCH 21/32] use header, not note tag --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index db217f8..e8f57c1 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ The XM125 boasts an impressive range of up to 20 meters, allowing you to create Looking for the board that matches this library - pick up a [SparkFun Pulsed Coherent Radar Sensor - Acconeer XM125 (Qwiic)](https://www.sparkfun.com/sparkfun-pulsed-coherent-radar-sensor-acconeer-xm125-qwiic.html) at www.sparkfun.com. -### Upgrading to Version 2.0 +### *Upgrading to Version 2.\* from Version 1.\** Version 2.0+ of this library is not compatible with Version 1.* implementations/use. For Version 2.0, the single class defined by the library, `SparkFunXM125`, was divided into two distinct classes: From 8cfa78f755840c4683a96a035946c083da228c43 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Wed, 19 Feb 2025 16:22:33 -0700 Subject: [PATCH 22/32] added endian support; move readReg/writeReg to new methods that manage the endian swaps and are much easlier to use (pretty too); Still need to verify operation and do this do the distance app --- src/sfTk/sfDevXM125Core.cpp | 3 + src/sfTk/sfDevXM125Presence.cpp | 261 ++++++++------------------------ src/sfTk/sfDevXM125Presence.h | 2 +- 3 files changed, 63 insertions(+), 203 deletions(-) diff --git a/src/sfTk/sfDevXM125Core.cpp b/src/sfTk/sfDevXM125Core.cpp index ea411a4..d185d42 100644 --- a/src/sfTk/sfDevXM125Core.cpp +++ b/src/sfTk/sfDevXM125Core.cpp @@ -31,6 +31,9 @@ sfTkError_t sfDevXM125Core::begin(sfTkII2C *theBus) // Sets communication bus _theBus = theBus; + // set the byte order to BIG Endian - the sensor works with Big E + _theBus->setByteOrder(sfTkByteOrder::BigEndian); + // return the value of ping return theBus->ping(); } diff --git a/src/sfTk/sfDevXM125Presence.cpp b/src/sfTk/sfDevXM125Presence.cpp index 05ce8e1..636ab46 100644 --- a/src/sfTk/sfDevXM125Presence.cpp +++ b/src/sfTk/sfDevXM125Presence.cpp @@ -10,7 +10,6 @@ * * SPDX-License-Identifier: MIT */ - #include "sfDevXM125Presence.h" sfTkError_t sfDevXM125Presence::begin(sfTkII2C *theBus) @@ -146,33 +145,24 @@ sfTkError_t sfDevXM125Presence::getPresenceDetectorVersion(uint32_t &major, uint //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceDetectorError(uint32_t &error) { - size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_PROTOCOL_STATUS, (uint8_t *)&error, sizeof(uint32_t), - readBytes); + return _theBus->readRegister(SFE_XM125_PRESENCE_PROTOCOL_STATUS, error); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceMeasureCounter(uint32_t &counter) { - size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_MEASURE_COUNTER, (uint8_t *)&counter, sizeof(uint32_t), - readBytes); + return _theBus->readRegister(SFE_XM125_PRESENCE_MEASURE_COUNTER, counter); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceDetectorStatus(uint32_t &status) { - size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)&status, sizeof(uint32_t), - readBytes); + return _theBus->readRegister(SFE_XM125_PRESENCE_DETECTOR_STATUS, status); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceDetectorErrorStatus(uint32_t &status) { sfTkError_t retVal = 0; uint32_t regVal = 0; - size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); - regVal = sftk_byte_swap(regVal); + retVal = _theBus->readRegister(SFE_XM125_PRESENCE_DETECTOR_STATUS, regVal); // clear out status status = 0; @@ -224,127 +214,85 @@ sfTkError_t sfDevXM125Presence::getPresenceDetectorErrorStatus(uint32_t &status) //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceDetectorPresenceDetected(uint32_t &detected) { - uint32_t regVal = 0; - // Read from 16-Bit Register - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); - - regVal = sftk_byte_swap(regVal); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_PRESENCE_RESULT, detected); // Mask unused bits from register - detected = (regVal & SFE_XM125_PRESENCE_DETECTED_MASK); + if (retVal == ksfTkErrOk) + detected = (detected & SFE_XM125_PRESENCE_DETECTED_MASK); return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceDetectorPresenceStickyDetected(uint32_t &sticky) { - uint32_t regVal = 0; // Read from 16-Bit Register - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); - - regVal = sftk_byte_swap(regVal); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_PRESENCE_RESULT, sticky); // Mask unused bits from register - sticky = (regVal & SFE_XM125_PRESENCE_DETECTED_STICKY_MASK) >> 1; + if (retVal == ksfTkErrOk) + sticky = (sticky & SFE_XM125_PRESENCE_DETECTED_STICKY_MASK) >> 1; return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceDetectorRegError(uint32_t &error) { - uint32_t regVal = 0; - - // Read from 16-Bit Register - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); - - regVal = sftk_byte_swap(regVal); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_PRESENCE_RESULT, error); // Mask unused bits from register - error = (regVal & SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK) >> SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK_SHIFT; + if (retVal == ksfTkErrOk) + error = (error & SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK) >> SFE_XM125_PRESENCE_DETECTOR_ERROR_MASK_SHIFT; return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceTemperature(uint32_t &temp) { - uint32_t regVal = 0; - - // Read from 16-Bit Register - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_PRESENCE_DISTANCE, temp); // Mask unused bits from register - temp = (regVal & SFE_XM125_PRESENCE_TEMPERATURE_MASK) >> SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT; + temp = (temp & SFE_XM125_PRESENCE_TEMPERATURE_MASK) >> SFE_XM125_PRESENCE_TEMPERATURE_MASK_SHIFT; return retVal; } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceDistance(uint32_t &distance) { - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_DISTANCE, (uint8_t *)&distance, sizeof(uint32_t), readBytes); - distance = sftk_byte_swap(distance); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_DISTANCE, distance); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceIntraPresenceScore(uint32_t &intra) { - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&intra, sizeof(uint32_t), readBytes); - intra = sftk_byte_swap(intra); - return retVal; + return _theBus->readRegister(SFE_XM125_INTRA_PRESENCE_SCORE, intra); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceInterPresenceScore(uint32_t &inter) { - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_INTER_PRESENCE, (uint8_t *)&inter, sizeof(uint32_t), readBytes); - inter = sftk_byte_swap(inter); - return retVal; + return _theBus->readRegister(SFE_XM125_INTER_PRESENCE, inter); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceSweepsPerFrame(uint32_t &sweeps) { - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_INTRA_PRESENCE_SCORE, (uint8_t *)&sweeps, sizeof(uint32_t), readBytes); - sweeps = sftk_byte_swap(sweeps); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, sweeps); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceSweepsPerFrame(uint32_t sweeps) { - sweeps = sftk_byte_swap(sweeps); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, (uint8_t *)&sweeps, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_SWEEPS_PER_FRAME, sweeps); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceInterFramePresenceTimeout(uint32_t &time) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, time); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceInterFramePresenceTimeout(uint32_t time) { - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, (uint8_t *)&time, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTER_FRAME_TIMEOUT, time); } //-------------------------------------------------------------------------------- @@ -388,161 +336,109 @@ sfTkError_t sfDevXM125Presence::setPresenceInterDetectionEnabled(bool en) //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceFrameRate(uint32_t &rate) { - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, sizeof(uint32_t), readBytes); - rate = sftk_byte_swap(rate); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_FRAME_RATE, rate); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceFrameRate(uint32_t rate) { - rate = sftk_byte_swap(rate); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_FRAME_RATE, (uint8_t *)&rate, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_FRAME_RATE, rate); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceIntraDetectionThreshold(uint32_t &thresh) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, - sizeof(uint32_t), readBytes); - thresh = sftk_byte_swap(thresh); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, thresh); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceIntraDetectionThreshold(uint32_t thresh) { - thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, (uint8_t *)&thresh, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTRA_DETECTION_THRESHOLD, thresh); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceInterDetectionThreshold(uint32_t &thresh) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, - sizeof(uint32_t), readBytes); - thresh = sftk_byte_swap(thresh); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, thresh); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceInterDetectionThreshold(uint32_t thresh) { - thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, (uint8_t *)&thresh, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTER_DETECTION_THRESHOLD, thresh); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceInterFrameDeviationTime(uint32_t &time) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, time); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceInterFrameDeviationTime(uint32_t time) { - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, (uint8_t *)&time, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTER_FRAME_DEVIATION, time); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceInterFrameFastCutoff(uint32_t &cut) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, - sizeof(uint32_t), readBytes); - cut = sftk_byte_swap(cut); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, cut); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceInterFrameFastCutoff(uint32_t cut) { - cut = sftk_byte_swap(cut); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, (uint8_t *)&cut, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTER_FRAME_FAST_CUTOFF, cut); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceInterFrameSlowCutoff(uint32_t &cut) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, - sizeof(uint32_t), readBytes); - cut = sftk_byte_swap(cut); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, cut); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceInterFrameSlowCutoff(uint32_t cut) { - cut = sftk_byte_swap(cut); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, (uint8_t *)&cut, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTER_FRAME_SLOW_CUTOFF, cut); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceIntraFrameTimeConst(uint32_t &time) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, time); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceIntraFrameTimeConst(uint32_t time) { - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTRA_FRAME_TIME_CONST, time); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceIntraOutputTimeConst(uint32_t &time) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, time); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceIntraOutputTimeConst(uint32_t time) { - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTRA_OUTPUT_TIME_CONST, time); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceInterOutputTimeConst(uint32_t &time) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t), readBytes); - time = sftk_byte_swap(time); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, time); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceInterOutputTimeConst(uint32_t time) { - time = sftk_byte_swap(time); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, (uint8_t *)&time, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTER_OUTPUT_TIME_CONST, time); } //-------------------------------------------------------------------------------- @@ -585,74 +481,55 @@ sfTkError_t sfDevXM125Presence::setPresenceAutoStepLengthEn(bool en) //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceManualProfile(uint32_t &prof) { - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, sizeof(uint32_t), readBytes); - prof = sftk_byte_swap(prof); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_MANUAL_PROFILE, prof); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceManualProfile(uint32_t prof) { - prof = sftk_byte_swap(prof); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_PROFILE, (uint8_t *)&prof, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_MANUAL_PROFILE, prof); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceManualStepLength(uint32_t &length) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, - sizeof(uint32_t), readBytes); - length = sftk_byte_swap(length); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, length); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceManualStepLength(uint32_t length) { - length = sftk_byte_swap(length); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_MANUAL_STEP_LENGTH, length); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceStart(uint32_t &start) { - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, sizeof(uint32_t), readBytes); - start = sftk_byte_swap(start); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_START, start); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceStart(uint32_t start) { - start = sftk_byte_swap(start); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_START, (uint8_t *)&start, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_START, start); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceEnd(uint32_t &end) { - size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, sizeof(uint32_t), readBytes); - end = sftk_byte_swap(end); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_END, end); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceEnd(uint32_t end) { - end = sftk_byte_swap(end); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_END, (uint8_t *)&end, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_END, end); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceResetFilters(bool &reset) { + size_t readBytes = 0; uint8_t value; sfTkError_t retVal = @@ -671,37 +548,30 @@ sfTkError_t sfDevXM125Presence::setPresenceResetFilters(bool reset) //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceHWAAS(uint32_t &avg) { - size_t readBytes = 0; - return _theBus->readRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t), readBytes); + return _theBus->readRegister(SFE_XM125_PRESENCE_HWAAS, avg); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceHWAAS(uint32_t avg) { - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_HWAAS, (uint8_t *)&avg, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_HWAAS, avg); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceDetectionOnGPIO(uint32_t &detected) { - size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, - sizeof(uint32_t), readBytes); - detected = sftk_byte_swap(detected); - return retVal; + return _theBus->readRegister(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, detected); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::setPresenceDetectionOnGPIO(uint32_t detected) { - detected = sftk_byte_swap(detected); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, (uint8_t *)&detected, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_DETECTION_ON_GPIO, detected); } sfTkError_t sfDevXM125Presence::setPresenceCommand(uint32_t cmd) { - cmd = sftk_byte_swap(cmd); - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_COMMAND, (uint8_t *)&cmd, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_COMMAND, cmd); } //-------------------------------------------------------------------------------- @@ -743,17 +613,12 @@ sfTkError_t sfDevXM125Presence::presenceLogConfiguration() //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceBusy(uint32_t &busy) { - sfTkError_t retVal; - uint32_t regVal = 0; - // Read from 16-Bit Register - size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); - regVal = sftk_byte_swap(regVal); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_PRESENCE_DETECTOR_STATUS, busy); + // Mask unused bits from register - busy = (regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> SFE_XM125_PRESENCE_BUSY_MASK_SHIFT; + busy = (busy & SFE_XM125_PRESENCE_BUSY_MASK) >> SFE_XM125_PRESENCE_BUSY_MASK_SHIFT; return retVal; } @@ -761,21 +626,13 @@ sfTkError_t sfDevXM125Presence::getPresenceBusy(uint32_t &busy) //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::presenceBusyWait() { - sfTkError_t retVal = 0; uint32_t regVal = 0; - size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); - regVal = sftk_byte_swap(regVal); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_PRESENCE_DETECTOR_STATUS, regVal); // Poll Detector Status until Busy bit is cleared while (((regVal & SFE_XM125_PRESENCE_BUSY_MASK) >> 30) != 0) - { - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); - regVal = sftk_byte_swap(regVal); - } + retVal = _theBus->readRegister(SFE_XM125_PRESENCE_DETECTOR_STATUS, regVal); return retVal; } \ No newline at end of file diff --git a/src/sfTk/sfDevXM125Presence.h b/src/sfTk/sfDevXM125Presence.h index 7a7f1db..48c814d 100644 --- a/src/sfTk/sfDevXM125Presence.h +++ b/src/sfTk/sfDevXM125Presence.h @@ -243,7 +243,7 @@ class sfDevXM125Presence : public sfDevXM125Core * @param theBus Pointer to the I2C bus object. If nullptr, the default bus is used. * @return ksfTkErrOk on success, or error code (value < -1) on failure. */ - sfTkError_t begin(sfTkII2C *theBus = nullptr); + sfTkError_t begin(sfTkII2C *theBus = nullptr) override; /// @brief This function sets all the beginning values for a basic I2C /// example to be run on the device for presence sensing. /// @return ksfTkErrOk on success, or error code (value < -1) From 461a7eaa5340fb84d6b768be493a5d70ec9410c1 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 21 Feb 2025 16:39:11 -0700 Subject: [PATCH 23/32] changes made to use the new toolkit api ; more work for simplification needed --- src/sfTk/sfDevXM125Distance.cpp | 158 +++++++++++++++----------------- src/sfTk/sfDevXM125Presence.cpp | 33 +++---- 2 files changed, 91 insertions(+), 100 deletions(-) diff --git a/src/sfTk/sfDevXM125Distance.cpp b/src/sfTk/sfDevXM125Distance.cpp index 4cbba66..b804f1b 100644 --- a/src/sfTk/sfDevXM125Distance.cpp +++ b/src/sfTk/sfDevXM125Distance.cpp @@ -170,7 +170,7 @@ sfTkError_t sfDevXM125Distance::getDistanceDetectorVersion(uint32_t &major, uint // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_VERSION, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + retVal = _theBus->readRegister(SFE_XM125_DISTANCE_VERSION, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -186,8 +186,8 @@ sfTkError_t sfDevXM125Distance::getDistanceDetectorError(uint32_t &error) { // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_PROTOCOL_STATUS, (uint8_t *)&error, - sizeof(uint32_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_PROTOCOL_STATUS, (uint8_t *)&error, sizeof(uint32_t), readBytes); error = sftk_byte_swap(error); return retVal; } @@ -198,8 +198,7 @@ sfTkError_t sfDevXM125Distance::getDistanceDetectorErrorStatus(uint32_t &status) sfTkError_t retVal; uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); + retVal = _theBus->readRegister(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // No error @@ -257,8 +256,8 @@ sfTkError_t sfDevXM125Distance::getDistanceMeasureCounter(uint32_t &counter) { // Read from 16-Bit Register size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_COUNTER, (uint8_t *)&counter, - sizeof(uint32_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_MEASURE_COUNTER, (uint8_t *)&counter, sizeof(uint32_t), readBytes); counter = sftk_byte_swap(counter); return retVal; } @@ -267,8 +266,8 @@ sfTkError_t sfDevXM125Distance::getDistanceMeasureCounter(uint32_t &counter) sfTkError_t sfDevXM125Distance::getDistanceDetectorStatus(uint32_t &status) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)&status, - sizeof(uint32_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)&status, sizeof(uint32_t), readBytes); status = sftk_byte_swap(status); return retVal; } @@ -281,7 +280,7 @@ sfTkError_t sfDevXM125Distance::getDistanceNumberDistances(uint32_t &distance) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + retVal = _theBus->readRegister(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -298,7 +297,7 @@ sfTkError_t sfDevXM125Distance::getDistanceNearStartEdge(uint32_t &edge) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + retVal = _theBus->readRegister(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -315,7 +314,7 @@ sfTkError_t sfDevXM125Distance::getDistanceCalibrationNeeded(uint32_t &calibrate // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + retVal = _theBus->readRegister(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -333,7 +332,7 @@ sfTkError_t sfDevXM125Distance::getDistanceMeasureDistanceError(uint32_t &error) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + retVal = _theBus->readRegister(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Mask unused bits from register @@ -351,7 +350,7 @@ sfTkError_t sfDevXM125Distance::getDistanceTemperature(int16_t &temperature) // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); + retVal = _theBus->readRegister(SFE_XM125_DISTANCE_RESULT, (uint8_t *)®Val, sizeof(uint32_t), readBytes); if (retVal != ksfTkErrOk) return retVal; @@ -369,7 +368,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak0Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK0_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -379,7 +378,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak1Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK1_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -389,7 +388,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak2Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK2_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -399,7 +398,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak3Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK3_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -409,7 +408,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak4Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK4_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -419,7 +418,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak5Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK5_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -429,7 +428,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak6Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK6_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -439,7 +438,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak7Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK7_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -449,7 +448,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak8Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK8_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -459,7 +458,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak9Distance(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK9_DISTANCE, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -469,7 +468,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak0Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK0_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK0_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -480,7 +479,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak1Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK1_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK1_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -491,7 +490,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak2Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK2_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK2_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -502,7 +501,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak3Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK3_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK3_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -513,7 +512,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak4Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK4_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK4_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -524,7 +523,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak5Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK5_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK5_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -535,7 +534,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak6Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK6_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK6_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -546,7 +545,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak7Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK7_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK7_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -557,7 +556,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak8Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK8_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK8_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -568,7 +567,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeak9Strength(int32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK9_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK9_STRENGTH, (uint8_t *)&peak, sizeof(int32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; @@ -579,7 +578,7 @@ sfTkError_t sfDevXM125Distance::getDistanceStart(uint32_t &startVal) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&startVal, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_START, (uint8_t *)&startVal, sizeof(uint32_t), readBytes); startVal = sftk_byte_swap(startVal); return retVal; } @@ -588,15 +587,14 @@ sfTkError_t sfDevXM125Distance::getDistanceStart(uint32_t &startVal) sfTkError_t sfDevXM125Distance::setDistanceStart(uint32_t start) { start = sftk_byte_swap(start); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_START, (uint8_t *)&start, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_START, (uint8_t *)&start, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistanceEnd(uint32_t &end) { size_t readBytes = 0; - sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, sizeof(uint32_t), readBytes); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_DISTANCE_END, (uint8_t *)&end, sizeof(uint32_t), readBytes); end = sftk_byte_swap(end); return retVal; } @@ -605,15 +603,15 @@ sfTkError_t sfDevXM125Distance::getDistanceEnd(uint32_t &end) sfTkError_t sfDevXM125Distance::setDistanceEnd(uint32_t end) { end = sftk_byte_swap(end); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_END, (uint8_t *)&end, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_END, (uint8_t *)&end, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistanceMaxStepLength(uint32_t &length) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, - sizeof(uint32_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t), readBytes); length = sftk_byte_swap(length); return retVal; } @@ -622,7 +620,7 @@ sfTkError_t sfDevXM125Distance::getDistanceMaxStepLength(uint32_t &length) sfTkError_t sfDevXM125Distance::setDistanceMaxStepLength(uint32_t length) { length = sftk_byte_swap(length); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_MAX_STEP_LENGTH, (uint8_t *)&length, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- @@ -630,8 +628,8 @@ sfTkError_t sfDevXM125Distance::getDistanceCloseRangeLeakageCancellation(bool &r { size_t readBytes = 0; uint8_t readVal = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t *)&readVal, - sizeof(uint8_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, (uint8_t *)&readVal, sizeof(uint8_t), readBytes); if (retVal != ksfTkErrOk) return retVal; @@ -643,15 +641,15 @@ sfTkError_t sfDevXM125Distance::getDistanceCloseRangeLeakageCancellation(bool &r sfTkError_t sfDevXM125Distance::setDistanceCloseRangeLeakageCancellation(bool range) { uint8_t value = range ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, &value, sizeof(value)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_CLOSE_RANGE_LEAKAGE, &value, sizeof(value)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistanceSignalQuality(uint32_t &signal) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, - sizeof(uint32_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, sizeof(uint32_t), readBytes); signal = sftk_byte_swap(signal); return retVal; } @@ -660,7 +658,7 @@ sfTkError_t sfDevXM125Distance::getDistanceSignalQuality(uint32_t &signal) sfTkError_t sfDevXM125Distance::setDistanceSignalQuality(uint32_t signal) { signal = sftk_byte_swap(signal); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_SIGNAL_QUALITY, (uint8_t *)&signal, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- @@ -668,7 +666,7 @@ sfTkError_t sfDevXM125Distance::getDistanceMaxProfile(uint32_t &profile) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, sizeof(uint32_t), readBytes); profile = sftk_byte_swap(profile); return retVal; } @@ -677,15 +675,15 @@ sfTkError_t sfDevXM125Distance::getDistanceMaxProfile(uint32_t &profile) sfTkError_t sfDevXM125Distance::setDistanceMaxProfile(uint32_t profile) { profile = sftk_byte_swap(profile); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_MAX_PROFILE, (uint8_t *)&profile, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistanceThresholdMethod(uint32_t &method) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, - sizeof(uint32_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, sizeof(uint32_t), readBytes); method = sftk_byte_swap(method); return retVal; } @@ -694,7 +692,7 @@ sfTkError_t sfDevXM125Distance::getDistanceThresholdMethod(uint32_t &method) sfTkError_t sfDevXM125Distance::setDistanceThresholdMethod(uint32_t method) { method = sftk_byte_swap(method); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_THRESHOLD_METHOD, (uint8_t *)&method, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- @@ -702,7 +700,7 @@ sfTkError_t sfDevXM125Distance::getDistancePeakSorting(uint32_t &peak) { size_t readBytes = 0; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, sizeof(uint32_t), readBytes); + _theBus->readRegister(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, sizeof(uint32_t), readBytes); peak = sftk_byte_swap(peak); return retVal; } @@ -711,15 +709,15 @@ sfTkError_t sfDevXM125Distance::getDistancePeakSorting(uint32_t &peak) sfTkError_t sfDevXM125Distance::setDistancePeakSorting(uint32_t peak) { peak = sftk_byte_swap(peak); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_PEAK_SORTING, (uint8_t *)&peak, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistanceNumFramesRecordedThreshold(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, - (uint8_t *)&thresh, sizeof(uint32_t), readBytes); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, + sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -728,16 +726,15 @@ sfTkError_t sfDevXM125Distance::getDistanceNumFramesRecordedThreshold(uint32_t & sfTkError_t sfDevXM125Distance::setDistanceNumFramesRecordedThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_NUM_FRAMES_RECORDED_THRESH, (uint8_t *)&thresh, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistanceFixedAmpThreshold(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, - (uint8_t *)&thresh, sizeof(uint32_t), readBytes); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t *)&thresh, + sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -746,16 +743,16 @@ sfTkError_t sfDevXM125Distance::getDistanceFixedAmpThreshold(uint32_t &thresh) sfTkError_t sfDevXM125Distance::setDistanceFixedAmpThreshold(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t *)&thresh, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_FIXED_AMPLITUDE_THRESHOLD_VAL, (uint8_t *)&thresh, + sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistanceThresholdSensitivity(uint32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, - sizeof(uint32_t), readBytes); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, + sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -764,16 +761,15 @@ sfTkError_t sfDevXM125Distance::getDistanceThresholdSensitivity(uint32_t &thresh sfTkError_t sfDevXM125Distance::setDistanceThresholdSensitivity(uint32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, - sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_THREHSOLD_SENSITIVITY, (uint8_t *)&thresh, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistanceReflectorShape(uint32_t &shape) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, - sizeof(uint32_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, sizeof(uint32_t), readBytes); shape = sftk_byte_swap(shape); return retVal; } @@ -782,15 +778,15 @@ sfTkError_t sfDevXM125Distance::getDistanceReflectorShape(uint32_t &shape) sfTkError_t sfDevXM125Distance::setDistanceReflectorShape(uint32_t shape) { shape = sftk_byte_swap(shape); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_REFLECTOR_SHAPE, (uint8_t *)&shape, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistanceFixedStrengthThresholdValue(int32_t &thresh) { size_t readBytes = 0; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, - (uint8_t *)&thresh, sizeof(uint32_t), readBytes); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t *)&thresh, + sizeof(uint32_t), readBytes); thresh = sftk_byte_swap(thresh); return retVal; } @@ -799,8 +795,7 @@ sfTkError_t sfDevXM125Distance::getDistanceFixedStrengthThresholdValue(int32_t & sfTkError_t sfDevXM125Distance::setDistanceFixedStrengthThresholdValue(int32_t thresh) { thresh = sftk_byte_swap(thresh); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t *)&thresh, - sizeof(int32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_FIXED_STRENGTH_THRESHOLD_VAL, (uint8_t *)&thresh, sizeof(int32_t)); } //-------------------------------------------------------------------------------- @@ -808,8 +803,8 @@ sfTkError_t sfDevXM125Distance::getDistanceMeasureOneWakeup(bool &measure) { size_t readBytes = 0; uint8_t value; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&value, - sizeof(uint8_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&value, sizeof(uint8_t), readBytes); measure = static_cast(value); return retVal; } @@ -818,14 +813,14 @@ sfTkError_t sfDevXM125Distance::getDistanceMeasureOneWakeup(bool &measure) sfTkError_t sfDevXM125Distance::setDistanceMeasureOneWakeup(bool measure) { uint8_t value = static_cast(measure); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&value, sizeof(uint8_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_MEASURE_ON_WAKEUP, (uint8_t *)&value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::setDistanceCommand(uint32_t command) { command = sftk_byte_swap(command); - return _theBus->writeRegister16Region(SFE_XM125_DISTANCE_COMMAND, (uint8_t *)&command, sizeof(uint32_t)); + return _theBus->writeRegister(SFE_XM125_DISTANCE_COMMAND, (uint8_t *)&command, sizeof(uint32_t)); } //-------------------------------------------------------------------------------- @@ -889,15 +884,14 @@ sfTkError_t sfDevXM125Distance::distanceBusyWait() uint32_t regVal = 0; size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); + retVal = _theBus->readRegister(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); // Poll Detector Status until Busy bit is cleared while (((regVal & SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK) >> SFE_XM125_DISTANCE_DETECTOR_STATUS_MASK_SHIFT) != 0) { - retVal = _theBus->readRegister16Region(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), - readBytes); + retVal = + _theBus->readRegister(SFE_XM125_DISTANCE_DETECTOR_STATUS, (uint8_t *)®Val, sizeof(uint32_t), readBytes); regVal = sftk_byte_swap(regVal); } diff --git a/src/sfTk/sfDevXM125Presence.cpp b/src/sfTk/sfDevXM125Presence.cpp index 636ab46..56db165 100644 --- a/src/sfTk/sfDevXM125Presence.cpp +++ b/src/sfTk/sfDevXM125Presence.cpp @@ -133,7 +133,7 @@ sfTkError_t sfDevXM125Presence::getPresenceDetectorVersion(uint32_t &major, uint // Read from 16-Bit Register size_t readBytes = 0; - retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_VERSION, (uint8_t *)®Val, sizeof(regVal), readBytes); + retVal = _theBus->readRegister(SFE_XM125_PRESENCE_VERSION, (uint8_t *)®Val, sizeof(regVal), readBytes); // Mask unused bits from register major = (regVal & SFE_XM125_PRESENCE_MAJOR_VERSION_MASK) >> SFE_XM125_PRESENCE_MAJOR_VERSION_MASK_SHIFT; @@ -300,8 +300,8 @@ sfTkError_t sfDevXM125Presence::getPresenceInterPhaseBoostEnabled(bool &en) { size_t readBytes = 0; uint8_t value; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, - sizeof(uint8_t), readBytes); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); en = (value != 0); return retVal; } @@ -310,8 +310,7 @@ sfTkError_t sfDevXM125Presence::getPresenceInterPhaseBoostEnabled(bool &en) sfTkError_t sfDevXM125Presence::setPresenceInterPhaseBoostEnabled(bool en) { uint8_t value = en ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, (uint8_t *)&value, - sizeof(uint8_t)); + return _theBus->writeRegisterUInt8(SFE_XM125_PRESENCE_INTER_PHASE_BOOST_ENABLED, value); } //-------------------------------------------------------------------------------- @@ -319,8 +318,8 @@ sfTkError_t sfDevXM125Presence::getPresenceIntraDetectionEnabled(bool &en) { size_t readBytes = 0; uint8_t value; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, - sizeof(uint8_t), readBytes); + sfTkError_t retVal = _theBus->readRegisterUInt8(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, value); + en = (value != 0); return retVal; } @@ -329,8 +328,7 @@ sfTkError_t sfDevXM125Presence::getPresenceIntraDetectionEnabled(bool &en) sfTkError_t sfDevXM125Presence::setPresenceInterDetectionEnabled(bool en) { uint8_t value = en ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, - sizeof(uint8_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, (uint8_t *)&value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- @@ -446,8 +444,8 @@ sfTkError_t sfDevXM125Presence::getPresenceAutoProfileEn(bool &en) { size_t readBytes = 0; uint8_t value; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, - sizeof(uint8_t), readBytes); + sfTkError_t retVal = + _theBus->readRegister(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, sizeof(uint8_t), readBytes); en = (value != 0); return retVal; } @@ -456,7 +454,7 @@ sfTkError_t sfDevXM125Presence::getPresenceAutoProfileEn(bool &en) sfTkError_t sfDevXM125Presence::setPresenceAutoProfileEn(bool en) { uint8_t value = en ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, sizeof(uint8_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_AUTO_PROFILE_ENABLED, (uint8_t *)&value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- @@ -464,8 +462,8 @@ sfTkError_t sfDevXM125Presence::getPresenceAutoStepLengthEn(bool &en) { size_t readBytes = 0; uint8_t value; - sfTkError_t retVal = _theBus->readRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, - sizeof(uint8_t), readBytes); + sfTkError_t retVal = _theBus->readRegister(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, + sizeof(uint8_t), readBytes); en = (value != 0); return retVal; } @@ -474,8 +472,7 @@ sfTkError_t sfDevXM125Presence::getPresenceAutoStepLengthEn(bool &en) sfTkError_t sfDevXM125Presence::setPresenceAutoStepLengthEn(bool en) { uint8_t value = en ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, - sizeof(uint8_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_AUTO_STEP_LENGTH_ENABLED, (uint8_t *)&value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- @@ -533,7 +530,7 @@ sfTkError_t sfDevXM125Presence::getPresenceResetFilters(bool &reset) size_t readBytes = 0; uint8_t value; sfTkError_t retVal = - _theBus->readRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t), readBytes); + _theBus->readRegister(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t), readBytes); reset = (value != 0); return retVal; } @@ -542,7 +539,7 @@ sfTkError_t sfDevXM125Presence::getPresenceResetFilters(bool &reset) sfTkError_t sfDevXM125Presence::setPresenceResetFilters(bool reset) { uint8_t value = reset ? 1 : 0; - return _theBus->writeRegister16Region(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t)); + return _theBus->writeRegister(SFE_XM125_PRESENCE_RESET_FILTERS_ON_PREPARE, &value, sizeof(uint8_t)); } //-------------------------------------------------------------------------------- From 4a957231011ad474b38f9122b299c2ad2c5b5b4a Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Thu, 13 Mar 2025 16:19:37 -0600 Subject: [PATCH 24/32] cleanup the getDisatnceValue method logic - to match vendors example. Reduce the *has distance* check to one i2c bus xaction, not two --- src/sfTk/sfDevXM125Presence.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/sfTk/sfDevXM125Presence.cpp b/src/sfTk/sfDevXM125Presence.cpp index 56db165..17a1411 100644 --- a/src/sfTk/sfDevXM125Presence.cpp +++ b/src/sfTk/sfDevXM125Presence.cpp @@ -90,8 +90,7 @@ sfTkError_t sfDevXM125Presence::getPresenceDistanceValuemm(uint32_t &presenceVal { // Check error bits uint32_t errorStatus = 0; - uint32_t presenceDetected = 0; - uint32_t presenceDetectedSticky = 0; + uint32_t presenceStatus = 0; sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); if (retVal != ksfTkErrOk || errorStatus != 0) @@ -112,14 +111,16 @@ sfTkError_t sfDevXM125Presence::getPresenceDistanceValuemm(uint32_t &presenceVal if (retVal != ksfTkErrOk || errorStatus != 0) return 4; - // Read detector result register and determine detection status - if (getPresenceDetectorPresenceDetected(presenceDetected) != ksfTkErrOk) + // Read from 16-Bit Register to get the presence detection status + if (_theBus->readRegister(SFE_XM125_PRESENCE_RESULT, presenceStatus) != ksfTkErrOk) return 5; - if (getPresenceDetectorPresenceStickyDetected(presenceDetectedSticky) != ksfTkErrOk) - return 6; + // Presence detected NOW or since last check (sticky) + bool bPresenceDetected = ((presenceStatus & SFE_XM125_PRESENCE_DETECTED_MASK) != 0) || + ((presenceStatus & SFE_XM125_PRESENCE_DETECTED_STICKY_MASK) != 0); - if (presenceDetected == 1 || presenceDetectedSticky == 1) + // If presence or a sticky presence is detected, get the distance and return + if (bPresenceDetected) return getPresenceDistance(presenceVal); return ksfTkErrOk; From cbdc7c26c8f3daffafa5d7ad9c3a19f41fb04a64 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Thu, 13 Mar 2025 16:25:31 -0600 Subject: [PATCH 25/32] added a start and end value to the detectorStart() method, with default values; This range shouldnt be hard coded --- src/sfTk/sfDevXM125Presence.cpp | 6 +++--- src/sfTk/sfDevXM125Presence.h | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/sfTk/sfDevXM125Presence.cpp b/src/sfTk/sfDevXM125Presence.cpp index 17a1411..2e89a7f 100644 --- a/src/sfTk/sfDevXM125Presence.cpp +++ b/src/sfTk/sfDevXM125Presence.cpp @@ -32,7 +32,7 @@ sfTkError_t sfDevXM125Presence::begin(sfTkII2C *theBus) return ksfTkErrOk; } //------------------------------------------------------------------------- -sfTkError_t sfDevXM125Presence::presenceDetectorStart() +sfTkError_t sfDevXM125Presence::presenceDetectorStart(uint32_t startValue, uint32_t endValue) { // *** Presence Sensor Setup *** uint32_t errorStatus = 0; @@ -51,13 +51,13 @@ sfTkError_t sfDevXM125Presence::presenceDetectorStart() return 3; // Set Presence Start register - if (setPresenceStart(300) != ksfTkErrOk) + if (setPresenceStart(startValue) != ksfTkErrOk) return 4; sftk_delay_ms(100); // give time for command to set // Set End register - if (setPresenceEnd(2500) != ksfTkErrOk) + if (setPresenceEnd(endValue) != ksfTkErrOk) return 5; sftk_delay_ms(100); // give time for command to set diff --git a/src/sfTk/sfDevXM125Presence.h b/src/sfTk/sfDevXM125Presence.h index 48c814d..41fa9a0 100644 --- a/src/sfTk/sfDevXM125Presence.h +++ b/src/sfTk/sfDevXM125Presence.h @@ -246,8 +246,10 @@ class sfDevXM125Presence : public sfDevXM125Core sfTkError_t begin(sfTkII2C *theBus = nullptr) override; /// @brief This function sets all the beginning values for a basic I2C /// example to be run on the device for presence sensing. + /// @param start Start value for presence sensing in mm - default value is 1000 + /// @param end End value for presence sensing in mm - default value is 5000 /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t presenceDetectorStart(); + sfTkError_t presenceDetectorStart(uint32_t start = 1000, uint32_t end = 5000); /// @brief This function returns the presence value of the register /// with all the checks in place as per the I2C Datasheet. From cbbab48051635a5de605d991a88b84282925ad97 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Mar 2025 07:19:42 -0600 Subject: [PATCH 26/32] cleanup on distance method logic --- src/sfTk/sfDevXM125Presence.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/sfTk/sfDevXM125Presence.cpp b/src/sfTk/sfDevXM125Presence.cpp index 2e89a7f..38f9892 100644 --- a/src/sfTk/sfDevXM125Presence.cpp +++ b/src/sfTk/sfDevXM125Presence.cpp @@ -94,26 +94,26 @@ sfTkError_t sfDevXM125Presence::getPresenceDistanceValuemm(uint32_t &presenceVal sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); if (retVal != ksfTkErrOk || errorStatus != 0) - return 1; + return sfTkErrFail; // Start detector if (setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != ksfTkErrOk) - return 2; + return sfTkErrFail; sftk_delay_ms(100); - // Poll detector status until busy bit is cleared - CHECK ON THIS! + // Poll detector status until busy bit is cleared if (presenceBusyWait() != ksfTkErrOk) - return 3; + return sfTkErrFail; // Verify that no error bits are set in the detector status register retVal = getPresenceDetectorErrorStatus(errorStatus); if (retVal != ksfTkErrOk || errorStatus != 0) - return 4; + return sfTkErrFail; // Read from 16-Bit Register to get the presence detection status if (_theBus->readRegister(SFE_XM125_PRESENCE_RESULT, presenceStatus) != ksfTkErrOk) - return 5; + return sfTkErrFail; // Presence detected NOW or since last check (sticky) bool bPresenceDetected = ((presenceStatus & SFE_XM125_PRESENCE_DETECTED_MASK) != 0) || @@ -123,6 +123,8 @@ sfTkError_t sfDevXM125Presence::getPresenceDistanceValuemm(uint32_t &presenceVal if (bPresenceDetected) return getPresenceDistance(presenceVal); + // If no presence detected, return 0 + presenceVal = 0; return ksfTkErrOk; } From 1f56fec3757125830d70ce0f51108c0fd66333bc Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Mar 2025 09:06:49 -0600 Subject: [PATCH 27/32] fix consant name typo, remove ununsed var --- src/sfTk/sfDevXM125Presence.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/sfTk/sfDevXM125Presence.cpp b/src/sfTk/sfDevXM125Presence.cpp index 38f9892..7092457 100644 --- a/src/sfTk/sfDevXM125Presence.cpp +++ b/src/sfTk/sfDevXM125Presence.cpp @@ -94,26 +94,26 @@ sfTkError_t sfDevXM125Presence::getPresenceDistanceValuemm(uint32_t &presenceVal sfTkError_t retVal = getPresenceDetectorErrorStatus(errorStatus); if (retVal != ksfTkErrOk || errorStatus != 0) - return sfTkErrFail; + return ksfTkErrFail; // Start detector if (setPresenceCommand(SFE_XM125_PRESENCE_START_DETECTOR) != ksfTkErrOk) - return sfTkErrFail; + return ksfTkErrFail; sftk_delay_ms(100); // Poll detector status until busy bit is cleared if (presenceBusyWait() != ksfTkErrOk) - return sfTkErrFail; + return ksfTkErrFail; // Verify that no error bits are set in the detector status register retVal = getPresenceDetectorErrorStatus(errorStatus); if (retVal != ksfTkErrOk || errorStatus != 0) - return sfTkErrFail; + return ksfTkErrFail; // Read from 16-Bit Register to get the presence detection status if (_theBus->readRegister(SFE_XM125_PRESENCE_RESULT, presenceStatus) != ksfTkErrOk) - return sfTkErrFail; + return ksfTkErrFail; // Presence detected NOW or since last check (sticky) bool bPresenceDetected = ((presenceStatus & SFE_XM125_PRESENCE_DETECTED_MASK) != 0) || @@ -319,7 +319,6 @@ sfTkError_t sfDevXM125Presence::setPresenceInterPhaseBoostEnabled(bool en) //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Presence::getPresenceIntraDetectionEnabled(bool &en) { - size_t readBytes = 0; uint8_t value; sfTkError_t retVal = _theBus->readRegisterUInt8(SFE_XM125_PRESENCE_INTRA_DETECTION_ENABLED, value); From e7de189cbd36b7a413d5b850e7dfcf8b12b0d7fe Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Mar 2025 09:08:02 -0600 Subject: [PATCH 28/32] cleanup demo - formatting and logic --- .../Example01_PresenceBasicReadings.ino | 58 +++++++++++-------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino index 3dcef24..8e63e4f 100644 --- a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino +++ b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino @@ -39,40 +39,45 @@ int32_t setupError = 0; int32_t presValError = 0; int32_t detectorError = 0; +// Presence range in mm used +#define MY_XM125_RANGE_START 200 +#define MY_XM125_RANGE_END 1000 void setup() { // Start serial Serial.begin(115200); + + Serial.println(""); + Serial.println("-------------------------------------------------------"); Serial.println("XM125 Example 1: Basic Presence Readings"); + Serial.println("-------------------------------------------------------"); Serial.println(""); Wire.begin(); // If begin is successful (1), then start example - int startErr = radarSensor.begin(i2cAddress, Wire); - if (startErr == 1) + bool success = radarSensor.begin(i2cAddress, Wire); + if (success == false) { - Serial.println("Begin"); - } - else // Otherwise, infinite loop - { - Serial.print("Start Error Code: "); - Serial.println(startErr); Serial.println("Device failed to setup - Freezing code."); while (1) ; // Runs forever } // Start the sensor with default register values - int32_t setupError = radarSensor.presenceDetectorStart(); + int32_t setupError = radarSensor.presenceDetectorStart(MY_XM125_RANGE_START, MY_XM125_RANGE_END); if (setupError != 0) { Serial.print("Presence Detection Start Setup Error: "); Serial.println(setupError); } - - // New line and delay for easier reading + Serial.print("Presense Detection Started - range: "); + Serial.print(MY_XM125_RANGE_START); + Serial.print("mm to "); + Serial.print(MY_XM125_RANGE_END); + Serial.println("mm"); Serial.println(); + delay(500); } @@ -87,22 +92,25 @@ void loop() if (presValError == 0) { Serial.print("Presence Detected: "); - Serial.print(distance); - Serial.println("mm"); - // Serial.print(distance * .1); - // Serial.println("cm"); - // Serial.print(distance * .001); - // Serial.println("m"); - // Serial.print(distance * .001); - // Serial.println("m"); - // Serial.print(distance * .03937008); - // Serial.println("In"); + // if distance is > 0, presence is detected, else it is not + if (distance > 0) + { + Serial.print("YES - Distance: "); + Serial.print(distance); + Serial.print("mm, "); + Serial.print(distance * .1); + Serial.print("cm, "); + Serial.print(distance * .001); + Serial.print("m, "); + Serial.print(distance * .03937008); + Serial.println("In"); + } + else + Serial.println("NO"); } else - { Serial.println("Error returning presence distance value"); - } - // Delay 0.5 seconds between readings - delay(500); + // Delay 2.5 seconds between readings + delay(2500); } From d54fde28ba5c2701fe79ff90a7179f27200263f9 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Mar 2025 09:09:17 -0600 Subject: [PATCH 29/32] better comment --- .../Example01_PresenceBasicReadings.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino index 8e63e4f..705e75f 100644 --- a/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino +++ b/examples/Example01_PresenceBasicReadings/Example01_PresenceBasicReadings.ino @@ -86,7 +86,8 @@ void loop() // Busy wait loop until data is ready radarSensor.presenceBusyWait(); - // Get the presence distance value and print out if no errors + // Get the presence distance value and print out if no errors. + // Note - this returns if Presense is detected now, or since last check (sticky) presValError = radarSensor.getPresenceDistanceValuemm(distance); if (presValError == 0) From dde1786bfc84e70365cf63f2d9035dda26f00988 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Mar 2025 15:02:26 -0600 Subject: [PATCH 30/32] added start and end range to begin method; added generic distance and strenght methods --- src/sfTk/sfDevXM125Distance.cpp | 93 +++++++++++++++++++++++++++++++-- src/sfTk/sfDevXM125Distance.h | 25 +++++++-- 2 files changed, 111 insertions(+), 7 deletions(-) diff --git a/src/sfTk/sfDevXM125Distance.cpp b/src/sfTk/sfDevXM125Distance.cpp index b804f1b..17be1d6 100644 --- a/src/sfTk/sfDevXM125Distance.cpp +++ b/src/sfTk/sfDevXM125Distance.cpp @@ -41,7 +41,7 @@ sfTkError_t sfDevXM125Distance::begin(sfTkII2C *theBus) return ksfTkErrOk; } //------------------------------------------------------------------ -int32_t sfDevXM125Distance::distanceBegin() +int32_t sfDevXM125Distance::distanceBegin(uint32_t startRange, uint32_t endRange) { uint32_t errorStatus = 0; @@ -64,20 +64,20 @@ int32_t sfDevXM125Distance::distanceBegin() } // Set Start register - if (setDistanceStart(sfe_xm125_distance_start_default) != 0) + if (setDistanceStart(startRange) != 0) { return 3; } sftk_delay_ms(100); // give time for command to set // Set End register - if (setDistanceEnd(sfe_xm125_distance_end_default) != 0) + if (setDistanceEnd(endRange) != 0) { return 4; } sftk_delay_ms(100); // give time for command to set - // Apply configuration + // Apply configuration and calibrate. if (setDistanceCommand(SFE_XM125_DISTANCE_APPLY_CONFIGURATION) != 0) { // Check for errors @@ -363,6 +363,49 @@ sfTkError_t sfDevXM125Distance::getDistanceTemperature(int16_t &temperature) return retVal; } +//-------------------------------------------------------------------------------- +// Generic distance peak distance method +sfTkError_t sfDevXM125Distance::getDistancePeakDistance(uint8_t num, uint32_t &peak) +{ + + switch (num) + { + case 0: + return getDistancePeak0Distance(peak); + break; + + case 1: + return getDistancePeak1Distance(peak); + break; + case 2: + return getDistancePeak2Distance(peak); + break; + case 3: + return getDistancePeak3Distance(peak); + break; + case 4: + return getDistancePeak4Distance(peak); + break; + case 5: + return getDistancePeak5Distance(peak); + break; + case 6: + return getDistancePeak6Distance(peak); + break; + case 7: + return getDistancePeak7Distance(peak); + break; + case 8: + return getDistancePeak8Distance(peak); + break; + case 9: + return getDistancePeak9Distance(peak); + break; + default: + return ksfTkErrFail; + break; + } +} //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistancePeak0Distance(uint32_t &peak) { @@ -462,7 +505,49 @@ sfTkError_t sfDevXM125Distance::getDistancePeak9Distance(uint32_t &peak) peak = sftk_byte_swap(peak); return retVal; } +//-------------------------------------------------------------------------------- +// Generic distance peak strength method +sfTkError_t sfDevXM125Distance::getDistancePeakStrength(uint8_t num, int32_t &peak) +{ + switch (num) + { + case 0: + return getDistancePeak0Strength(peak); + break; + + case 1: + return getDistancePeak1Strength(peak); + break; + case 2: + return getDistancePeak2Strength(peak); + break; + case 3: + return getDistancePeak3Strength(peak); + break; + case 4: + return getDistancePeak4Strength(peak); + break; + case 5: + return getDistancePeak5Strength(peak); + break; + case 6: + return getDistancePeak6Strength(peak); + break; + case 7: + return getDistancePeak7Strength(peak); + break; + case 8: + return getDistancePeak8Strength(peak); + break; + case 9: + return getDistancePeak9Strength(peak); + break; + default: + return ksfTkErrFail; + break; + } +} //-------------------------------------------------------------------------------- sfTkError_t sfDevXM125Distance::getDistancePeak0Strength(int32_t &peak) { diff --git a/src/sfTk/sfDevXM125Distance.h b/src/sfTk/sfDevXM125Distance.h index a7e9c7f..487888f 100644 --- a/src/sfTk/sfDevXM125Distance.h +++ b/src/sfTk/sfDevXM125Distance.h @@ -163,11 +163,11 @@ const uint16_t SFE_XM125_DISTANCE_PEAK7_STRENGTH = 0x22; const uint16_t SFE_XM125_DISTANCE_PEAK8_STRENGTH = 0x23; const uint16_t SFE_XM125_DISTANCE_PEAK9_STRENGTH = 0x24; -// Default Value: 250 +// Default Value: 250mm const uint16_t SFE_XM125_DISTANCE_START = 0x40; const uint16_t sfe_xm125_distance_start_default = 250; -// Default Value: 3000 +// Default Value: 3000mm const uint16_t SFE_XM125_DISTANCE_END = 0x41; const uint16_t sfe_xm125_distance_end_default = 3000; @@ -283,7 +283,8 @@ class sfDevXM125Distance : public sfDevXM125Core /// @brief This function sets all the beginning values for a basic I2C /// example to be run on the device for presence sensing. /// @return ksfTkErrOk on success, or error code (value < -1) - sfTkError_t distanceBegin(); + sfTkError_t distanceBegin(uint32_t start = sfe_xm125_distance_start_default, + uint32_t end = sfe_xm125_distance_end_default); /// @brief This function does all the required checks and busy waits to /// make sure the device is ready for distance readings. @@ -344,6 +345,15 @@ class sfDevXM125Distance : public sfDevXM125Core /// @return ksfTkErrOk on success, or error code (value < -1) sfTkError_t getDistanceTemperature(int16_t &temperature); + //-------------------------------------------------------------------------------- + // Generic distance peak distance method + /// @brief This function returns the distance to peak num + /// Note: This value is a factor 1000 larger than the RSS value + /// @param num Peak number to get distance (0-9) + /// @param peak Distance to peak num + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeakDistance(uint8_t num, uint32_t &peak); + /// @brief This function returns the distance to peak 0 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) @@ -394,6 +404,15 @@ class sfDevXM125Distance : public sfDevXM125Core /// @return ksfTkErrOk on success, or error code (value < -1) sfTkError_t getDistancePeak9Distance(uint32_t &peak); + //-------------------------------------------------------------------------------- + // Generic distance peak strength method + /// @brief This function returns the strength to peak num + /// Note: This value is a factor 1000 larger than the RSS value + /// @param num Peak number to get strength (0-9) + /// @param peak strength to peak num + /// @return ksfTkErrOk on success, or error code (value < -1) + sfTkError_t getDistancePeakStrength(uint8_t num, int32_t &peak); + /// @brief This function returns the strength of peak 0 /// Note: This value is a factor 1000 larger than the RSS value /// @return ksfTkErrOk on success, or error code (value < -1) From 7909e5a3971fa0acfaa51f9f40cdd1a22ce33e12 Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Mar 2025 15:03:16 -0600 Subject: [PATCH 31/32] cleanup; make use of new methods ; simplify and improve output --- .../Example06_DistanceBasicReadings.ino | 212 ++++++------------ 1 file changed, 71 insertions(+), 141 deletions(-) diff --git a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino index c938f4f..c1c50b5 100644 --- a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino +++ b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino @@ -29,67 +29,46 @@ SparkFunXM125Distance radarSensor; // I2C default address uint8_t i2cAddress = SFE_XM125_I2C_ADDRESS; -// Setup Variables -uint32_t startVal = 0; -uint32_t endVal = 0; -uint32_t numDistances = 9; -uint32_t calibrateNeeded = 0; -uint32_t measDistErr = 0; - -// Error statuses -uint32_t errorStatus = 0; -uint32_t distanceSetupError = 0; - -// Distance Variables -int32_t distancePeakStrength0 = 0; -uint32_t distancePeak0 = 0; -int32_t distancePeakStrength1 = 0; -uint32_t distancePeak1 = 0; -int32_t distancePeakStrength2 = 0; -uint32_t distancePeak2 = 0; -int32_t distancePeakStrength3 = 0; -uint32_t distancePeak3 = 0; -int32_t distancePeakStrength4 = 0; -uint32_t distancePeak4 = 0; -int32_t distancePeakStrength5 = 0; -uint32_t distancePeak5 = 0; -int32_t distancePeakStrength6 = 0; -uint32_t distancePeak6 = 0; -int32_t distancePeakStrength7 = 0; -uint32_t distancePeak7 = 0; -int32_t distancePeakStrength8 = 0; -uint32_t distancePeak8 = 0; -int32_t distancePeakStrength9 = 0; -uint32_t distancePeak9 = 0; +// Presence range in mm used +#define MY_XM125_RANGE_START 200 +#define MY_XM125_RANGE_END 2000 void setup() { // Start serial Serial.begin(115200); + + Serial.println(""); + Serial.println("-------------------------------------------------------"); Serial.println("XM125 Example 6: Basic Distance Readings"); + Serial.println("-------------------------------------------------------"); Serial.println(""); Wire.begin(); // If begin is successful (0), then start example - if (radarSensor.begin(i2cAddress, Wire) == 1) - { - Serial.println("Begin"); - } - else // Otherwise, infinite loop + if (radarSensor.begin(i2cAddress, Wire) == false) { Serial.println("Device failed to setup - Freezing code."); while (1) ; // Runs forever } - - int32_t setupError = radarSensor.distanceBegin(); + Serial.println("Starting Sensor..."); + Serial.println(); + // Start the sensor with the specified range values + int32_t setupError = radarSensor.distanceBegin(MY_XM125_RANGE_START, MY_XM125_RANGE_END); if (setupError != 0) { Serial.print("Distance Detection Start Setup Error: "); Serial.println(setupError); } - + Serial.println(); + Serial.print("Distance Detection Started - range: "); + Serial.print(MY_XM125_RANGE_START); + Serial.print("mm to "); + Serial.print(MY_XM125_RANGE_END); + Serial.println("mm"); + Serial.println(); // New-line and 0.5 second delay for easier reading Serial.println(); delay(500); @@ -97,114 +76,65 @@ void setup() void loop() { - distanceSetupError = radarSensor.distanceDetectorReadingSetup(); - if (distanceSetupError != 0) + uint32_t retCode = radarSensor.distanceDetectorReadingSetup(); + if (retCode != 0) { Serial.print("Distance Reading Setup Error: "); - Serial.println(distanceSetupError); + Serial.println(retCode); } - // Read PeakX Distance and PeakX Strength registers for the number of distances detected - radarSensor.getDistancePeak0Distance(distancePeak0); - radarSensor.getDistancePeak0Strength(distancePeakStrength0); - radarSensor.getDistancePeak1Distance(distancePeak1); - radarSensor.getDistancePeak1Strength(distancePeakStrength1); - radarSensor.getDistancePeak2Distance(distancePeak2); - radarSensor.getDistancePeak2Strength(distancePeakStrength2); - radarSensor.getDistancePeak3Distance(distancePeak3); - radarSensor.getDistancePeak3Strength(distancePeakStrength3); - radarSensor.getDistancePeak4Distance(distancePeak4); - radarSensor.getDistancePeak4Strength(distancePeakStrength4); - radarSensor.getDistancePeak5Distance(distancePeak5); - radarSensor.getDistancePeak5Strength(distancePeakStrength5); - radarSensor.getDistancePeak6Distance(distancePeak6); - radarSensor.getDistancePeak6Strength(distancePeakStrength6); - radarSensor.getDistancePeak7Distance(distancePeak7); - radarSensor.getDistancePeak7Strength(distancePeakStrength7); - radarSensor.getDistancePeak8Distance(distancePeak8); - radarSensor.getDistancePeak8Strength(distancePeakStrength8); - radarSensor.getDistancePeak9Distance(distancePeak9); - radarSensor.getDistancePeak9Strength(distancePeakStrength9); - - // If a peak distance was detected, then read out the distance and strength - if (distancePeak0 != 0) - { - Serial.print("Peak0 Distance, Strength: "); - Serial.print(distancePeak0); - Serial.print("mm, "); - Serial.println(distancePeakStrength0); - Serial.println(); - } - if (distancePeak1 != 0) - { - Serial.print("Peak1 Distance, Strength: "); - Serial.print(distancePeak1); - Serial.print("mm, "); - Serial.println(distancePeakStrength1); - Serial.println(); - } - if (distancePeak2 != 0) - { - Serial.print("Peak2 Distance, Strength: "); - Serial.print(distancePeak2); - Serial.print("mm, "); - Serial.println(distancePeakStrength2); - Serial.println(); - } - if (distancePeak3 != 0) - { - Serial.print("Peak3 Distance, Strength: "); - Serial.print(distancePeak3); - Serial.print("mm, "); - Serial.println(distancePeakStrength3); - Serial.println(); - } - if (distancePeak4 != 0) - { - Serial.print("Peak4 Distance, Strength: "); - Serial.print(distancePeak4); - Serial.print("mm, "); - Serial.println(distancePeakStrength4); - Serial.println(); - } - if (distancePeak5 != 0) - { - Serial.print("Peak5 Distance, Strength: "); - Serial.print(distancePeak5); - Serial.print("mm, "); - Serial.println(distancePeakStrength5); - Serial.println(); - } - if (distancePeak6 != 0) - { - Serial.print("Peak6 Distance, Strength: "); - Serial.print(distancePeak6); - Serial.print("mm, "); - Serial.println(distancePeakStrength6); - Serial.println(); - } - if (distancePeak7 != 0) - { - Serial.print("Peak7 Distance, Strength: "); - Serial.print(distancePeak7); - Serial.print("mm, "); - Serial.println(distancePeakStrength7); - Serial.println(); - } - if (distancePeak8 != 0) + // How many distance values were detected? (0-9) + uint32_t numDistances = 0; + radarSensor.getDistanceNumberDistances(numDistances); + + if (numDistances == 0) + Serial.println("No distance values detected."); + else { - Serial.print("Peak8 Distance, Strength: "); - Serial.print(distancePeak8); - Serial.print("mm, "); - Serial.println(distancePeakStrength8); - Serial.println(); + Serial.print("Number of Distances Values Detected: "); + Serial.println(numDistances); } - if (distancePeak9 != 0) + Serial.println(); + + uint32_t distance = 0; + int32_t distanceStrength = 0; + for (uint32_t i = 0; i < numDistances; i++) { - Serial.print("Peak9 Distance, Strength: "); - Serial.print(distancePeak9); - Serial.print("mm, "); - Serial.println(distancePeakStrength9); + if (radarSensor.getDistancePeakDistance(i, distance) != ksfTkErrOk) + { + Serial.print("Error retrieving Distance Peak "); + Serial.print(i); + Serial.println(); + continue; + } + Serial.print("Distance Peak "); + Serial.print(i); + Serial.print(": "); + if (distance < 100) + { + Serial.print(distance); + Serial.println("mm"); + } + else if (distance < 1000) + { + Serial.print(distance * 0.1); + Serial.println("cm"); + } + else + Serial.print(distance * 0.001); + Serial.println("m"); + + if (radarSensor.getDistancePeakStrength(i, distanceStrength) != ksfTkErrOk) + { + Serial.print("Error retrieving Distance Peak Strength"); + Serial.print(i); + Serial.println(); + continue; + } + Serial.print("Distance Peak Strength"); + Serial.print(i); + Serial.print(": "); + Serial.println(distanceStrength); Serial.println(); } From c53f413bbe1b7ae7a515657307fd9de28941d4be Mon Sep 17 00:00:00 2001 From: Kirk Benell Date: Fri, 14 Mar 2025 15:48:25 -0600 Subject: [PATCH 32/32] cleanup; make use of new methods ; simplify and improve output --- .../Example06_DistanceBasicReadings.ino | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino index c1c50b5..5e217ce 100644 --- a/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino +++ b/examples/Example06_DistanceBasicReadings/Example06_DistanceBasicReadings.ino @@ -88,13 +88,13 @@ void loop() radarSensor.getDistanceNumberDistances(numDistances); if (numDistances == 0) - Serial.println("No distance values detected."); + Serial.print("."); else { - Serial.print("Number of Distances Values Detected: "); + Serial.println(); + Serial.print("Number of Values Detected: "); Serial.println(numDistances); } - Serial.println(); uint32_t distance = 0; int32_t distanceStrength = 0; @@ -107,22 +107,24 @@ void loop() Serial.println(); continue; } - Serial.print("Distance Peak "); + Serial.print(" Distance Peak "); Serial.print(i); Serial.print(": "); if (distance < 100) { Serial.print(distance); - Serial.println("mm"); + Serial.print("mm"); } else if (distance < 1000) { Serial.print(distance * 0.1); - Serial.println("cm"); + Serial.print("cm"); } else + { Serial.print(distance * 0.001); - Serial.println("m"); + Serial.print("m"); + } if (radarSensor.getDistancePeakStrength(i, distanceStrength) != ksfTkErrOk) { @@ -131,13 +133,12 @@ void loop() Serial.println(); continue; } - Serial.print("Distance Peak Strength"); + Serial.print(" Distance Peak Strength "); Serial.print(i); Serial.print(": "); Serial.println(distanceStrength); - Serial.println(); } - // Half a second delay for easier readings - delay(500); + // delay before next reading + delay(2500); }