Beispiel #1
0
// called after we've received a sample
static void callback_received() {
    const uint8_t *pos = read_buf;
    sample.num++;
    sample.field[0] = pos[0] << 8 | pos[1]; pos += 2;
    sample.field[2] = pos[0] << 8 | pos[1]; pos += 2; // sensor goes X, Z, Y according to documentation
    sample.field[1] = pos[0] << 8 | pos[1];
    signal.notify_all();

    i2c_async_send(addr, read_cmd, sizeof(read_cmd), i2c_shared_done_unlock);
}
Beispiel #2
0
// called when data is received
static void callback_received() {
    int val = (read_buf[0] << 8) | read_buf[1];

    if (state == State::TEMP) {
        temp = val;
        i2c_async_send(addr, cmd_conv_pressure, sizeof(cmd_conv_pressure), i2c_shared_done_unlock);
        state = State::PRESSURE;
    } else {
        sample.ut = temp;
        sample.up = val;
        signal.notify_all();
        i2c_async_send(addr, cmd_conv_temp, sizeof(cmd_conv_temp), i2c_shared_done_unlock);
        state = State::TEMP;
    }
}
Beispiel #3
0
// called when receiver DMA completes its transfer
extern "C" void irq_dma2_stream0() {
    ss(false);

    sample.num++;
    const uint8_t *pos = read_buf+1; // skip over the command byte
    for (int i=0; i<3; i++) // parse all values into sample structure
        sample.accel[i] = next16(pos);
    sample.temp = next16(pos);
    for (int i=0; i<3; i++)
        sample.gyro[i] = next16(pos);

    signal.notify_all(); // notify all tasks waiting
    DMA2->LIFCR = DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTCIF3 | DMA_LIFCR_CHTIF3; // clear status bits
    util_enable_irq(EXTI0_IRQn + PIN_INT); // enable INT interrupt
}