summaryrefslogtreecommitdiff
path: root/src/adxl375.cpp
blob: 5b18c42c915ed77f3f2f2c68f3b34a53367bf4c0 (plain)
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
#include "adxl375.hpp"

void ADXL375::initialize() {
    //Configure power mode and ODR
    buffer[0] = R_ADXL375_BW_RATE;
    bw_rate.fields.LOW_POWER = B_ADXL375_BW_RATE_NORMAL_POWER_MODE;
    bw_rate.fields.RATE = B_ADXL375_ODR_800_HZ;
    buffer[1] = bw_rate.data;
    i2c_write_blocking(i2c, addr, buffer, 2, false);

    //Configure data output format
    buffer[0] = R_ADXL375_DATA_FORMAT;
    i2c_write_blocking(i2c, addr, buffer, 1, true);
    i2c_read_blocking(i2c, addr, buffer, 1, false);
    //Some reserved fields are set to 1, read byte and *then* set desired bits
    data_format.data = buffer[0];

    buffer[0] = R_ADXL375_DATA_FORMAT;
    data_format.fields.JUSTIFY = B_ADXL375_DATA_FORMAT_JUSTIFY_RIGHT;
    data_format.fields.INT_INVERT = B_ADXL375_DATA_FORMAT_INTERRUPT_ACTIVE_HIGH;
    buffer[1] = data_format.data;
    i2c_write_blocking(i2c, addr, buffer, 2, false);

    //Set to measurement mode
    buffer[0] = R_ADXL375_POWER_CTL;
    power_ctl.fields.MEASURE = true;
    buffer[1] = power_ctl.data;
    i2c_write_blocking(i2c, addr, buffer, 2, false);
}

void ADXL375::sample() {
    //Read DATAX0 - DATAZ1 as a block
    buffer[0] = R_ADXL375_DATAX0;
    i2c_write_blocking(i2c, addr, buffer, 1, true);
    i2c_read_blocking(i2c, addr, buffer, 6, false);

    //Split buffer into individual fields
    ax = ((int16_t) buffer[0]) | ((int16_t) buffer[1] << 8);
    ay = ((int16_t) buffer[2]) | ((int16_t) buffer[3] << 8);
    az = ((int16_t) buffer[4]) | ((int16_t) buffer[5] << 8);
}

#if (USE_FREERTOS == 1)
void ADXL375::update_adxl375_task(void* pvParameters) {
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = pdMS_TO_TICKS(1000 / ADXL375_SAMPLE_RATE_HZ);

    xLastWakeTime = xTaskGetTickCount();
    while (1) {
        vTaskDelayUntil(&xLastWakeTime, xFrequency);
        taskENTER_CRITICAL();
        ADXL375* adxl375 = (ADXL375 *) pvParameters;
        adxl375->sample();
        taskEXIT_CRITICAL();
        if ((xLastWakeTime + xFrequency) < xTaskGetTickCount()) {
            xLastWakeTime = xTaskGetTickCount();
        }
    }
}
#endif