#include "modules/my_altimeter/Altimeter.h" #include "modules/my_task_creator/TaskCreator.h" #define INVALID_FRAME 0x61A8 uint8_t Altimiter::address = 0x66; // Initializing the default I2C address double Altimiter::distance = 0.0; // Initializing the distance variable void Altimiter::AltimiterRxTask(void *pvParameters) { log_v("Task Started"); // Logging task start Wire.begin(SDA_PIN, SCL_PIN); // Initializing Wire library Wire.setBufferSize(32); // Setting buffer size for Wire communication TaskCreator *mCreator = (TaskCreator *)pvParameters; // Getting TaskCreator object Altimiter *obj = &(mCreator->mAltimiter); // Getting Altimiter object from TaskCreator MavlinkTransmitter* transmitter = &(mCreator->mTransmitter); if(!obj->scan(obj->address)) { vTaskDelete(NULL); } vTaskDelay(50); // Delay to allow initialization uint32_t mCurrentTick=xTaskGetTickCount(); for (;;) { bool isValid = false; Wire.requestFrom(static_cast(obj->address), static_cast(2), true); while (Wire.available() >= 2) { byte byteH = Wire.read(); byte byteL = Wire.read(); uint16_t raw = (byteH << 8) | byteL; if (raw == INVALID_FRAME) { isValid = false; continue; } obj->distance = raw / 100.0f; isValid = true; } uint32_t t = xTaskGetTickCount(); if (isValid && (t - mCurrentTick >= 100)) { transmitter->SendDistanceSensor(obj->distance, isValid, (float)RANGEFINDER_SF30_MAX_DISTANCE); mCurrentTick = t; } vTaskDelay(10); } } bool Altimiter::scan(byte adress) { Wire.beginTransmission(adress); byte error = Wire.endTransmission(); if (error == 0) { log_i("Altimiter found"); return true; } else { log_i("Altimiter not found"); return false; } }