tarask
6 days ago 532005c6573d95199ce0ffbc33df4c7a0a4c3ef9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#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<uint16_t>(obj->address), static_cast<size_t>(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;
    }
}