imu.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include "imu.h"
  2. struct imu_t* imu_types[] = {
  3. &imu_bmi160,
  4. &imu_lsm6ds3trc,
  5. &imu_lsm6dso
  6. };
  7. struct imu_t* imu_found;
  8. bool imu_begin() {
  9. furi_hal_i2c_acquire(&furi_hal_i2c_handle_external);
  10. if (imu_found == NULL) {
  11. imu_found = find_imu();
  12. if (imu_found == NULL) {
  13. furi_hal_i2c_release(&furi_hal_i2c_handle_external);
  14. return false;
  15. }
  16. FURI_LOG_E(IMU_TAG, "Found Device %s", imu_found->name);
  17. }
  18. bool ret = 0;
  19. if (imu_found != NULL) {
  20. ret = imu_found->begin();
  21. }
  22. furi_hal_i2c_release(&furi_hal_i2c_handle_external);
  23. return ret;
  24. }
  25. void imu_end() {
  26. if (imu_found == NULL) return;
  27. furi_hal_i2c_acquire(&furi_hal_i2c_handle_external);
  28. imu_found->end();
  29. furi_hal_i2c_release(&furi_hal_i2c_handle_external);
  30. }
  31. int imu_read(double* vec) {
  32. if (imu_found == NULL) return 0;
  33. furi_hal_i2c_acquire(&furi_hal_i2c_handle_external);
  34. int ret = imu_found->read(vec);
  35. furi_hal_i2c_release(&furi_hal_i2c_handle_external);
  36. return ret;
  37. }
  38. struct imu_t* find_imu() {
  39. unsigned int i;
  40. for(i = 0; i < sizeof(imu_types) / sizeof(struct imu_t*); i++) {
  41. if(furi_hal_i2c_is_device_ready(&furi_hal_i2c_handle_external, imu_types[i]->address, 50)) {
  42. FURI_LOG_E(IMU_TAG, "found i2c device address 0x%X", imu_types[i]->address);
  43. return imu_types[i];
  44. }
  45. }
  46. return NULL;
  47. }