// 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); }
// 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; } }
// 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 }