#include "modules/my_altimeter/GRF500.h" #include "modules/my_task_creator/TaskCreator.h" #include "modules/my_mavlink_tx/MavlinkTransmitter.h" uint8_t GRF500::address = 0x66; double GRF500::distance = 0.0; GRF500::GRF500(uint8_t addr) : registerModeActivated(false), lastReadMs(0) { address = addr; } bool GRF500::begin() { log_v("GRF500 begin"); Wire.begin(SDA_PIN, SCL_PIN); // SDA, SCL log_v("Scanning I2C bus for devices..."); bool deviceFound = false; for (uint8_t addr = 1; addr < 127; ++addr) { if (scan(addr)) { log_i("I2C device found at 0x%02X", addr); deviceFound = true; } } if (!deviceFound) { log_i("No I2C devices found"); return false; } // Verify GRF500 at configured address log_i("Checking GRF500 at address 0x%02X", address); if (!scan(address)) { log_i("GRF500 not responding at 0x%02X", address); return false; } log_i("GRF500 responsive at 0x%02X", address); vTaskDelay(pdMS_TO_TICKS(50)); enableRegisterMode(); registerModeActivated = checkRegisterMode(); log_i("Register mode %s", registerModeActivated ? "OK" : "FAIL"); if (!registerModeActivated) return false; readDistance(); return true; } void GRF500::Task(void *pvParameters) { log_v("GRF500 Task started"); TaskCreator *creator = static_cast(pvParameters); GRF500 *sensor = &(creator->mGRF500); MavlinkTransmitter *transmitter = &(creator->mTransmitter); if (!sensor->begin()) { log_i("GRF500 initialization failed"); vTaskDelete(NULL); return; } log_i("GRF500 initialized successfully"); uint32_t lastTick = xTaskGetTickCount(); for (;;) { sensor->readMeasurements(); bool valid = (distance > 0); uint32_t now = xTaskGetTickCount(); if (valid && (now - lastTick >= 100)) { transmitter->SendDistanceSensor(distance, valid, (float)RANGEFINDER_GRF500_MAX_DISTANCE); lastTick = now; } vTaskDelay(pdMS_TO_TICKS(10)); } } void GRF500::update() { uint32_t now = millis(); if (now - lastReadMs < 100) return; lastReadMs = now; if (!registerModeActivated) return; readMeasurements(); } bool GRF500::scan(uint8_t addr) { Wire.beginTransmission(addr); return (Wire.endTransmission() == 0); } void GRF500::enableRegisterMode() { Wire.beginTransmission(address); Wire.write((uint8_t)120); Wire.write((uint8_t)0xAA); Wire.write((uint8_t)0xAA); if (Wire.endTransmission() != 0) { log_i("Register-mode write error"); } } bool GRF500::checkRegisterMode() { Wire.beginTransmission(address); Wire.write((uint8_t)120); if (Wire.endTransmission() != 0) return false; if (Wire.requestFrom(address, (uint8_t)2) != 2) return false; uint8_t a = Wire.read(); uint8_t b = Wire.read(); return (a == 0xCC && b == 0); } void GRF500::readDistance() { Wire.beginTransmission(address); Wire.write((uint8_t)27); if (Wire.endTransmission() != 0) { log_i("Distance write error"); return; } if (Wire.requestFrom(address, (uint8_t)4) == 4) { uint32_t raw = 0; raw |= (uint32_t)Wire.read(); raw |= (uint32_t)Wire.read() << 8; raw |= (uint32_t)Wire.read() << 16; raw |= (uint32_t)Wire.read() << 24; distance = raw / 100.0; log_i("Distance: %.2f m", distance); } } void GRF500::readMeasurements() { Wire.beginTransmission(address); Wire.write((uint8_t)44); if (Wire.endTransmission() != 0) { log_i("Measurements write error"); return; } if (Wire.requestFrom(address, (uint8_t)8) == 8) { int16_t first = Wire.read() | (Wire.read() << 8); int16_t strength1 = Wire.read() | (Wire.read() << 8); int16_t last = Wire.read() | (Wire.read() << 8); int16_t strength2 = Wire.read() | (Wire.read() << 8); distance = first / 10.0; // log_i("First=%d Last=%d S1=%d S2=%d", first, last, strength1, strength2); } }