rad_sens_i2c.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "rad_sens_i2c.h"
  2. #include "rad_sens.h"
  3. bool rad_sens_read_data(RadSensModel* model) {
  4. furi_hal_i2c_acquire(I2C_BUS);
  5. uint32_t timeout = furi_ms_to_ticks(100);
  6. model->connected = false;
  7. model->verified = false;
  8. if(furi_hal_i2c_is_device_ready(I2C_BUS, RAD_SENS_ADDRESS, timeout) > 0) {
  9. model->connected = true;
  10. uint8_t buffer[4];
  11. uint8_t device_id = 0;
  12. buffer[0] = RAD_SENS_ID_RG;
  13. if(furi_hal_i2c_tx(I2C_BUS, RAD_SENS_ADDRESS, buffer, 1, timeout)) {
  14. if(furi_hal_i2c_rx(I2C_BUS, (uint8_t)RAD_SENS_ADDRESS, buffer, 1, timeout)) {
  15. device_id = buffer[0];
  16. }
  17. }
  18. if(device_id == RAD_SENS_ID) {
  19. model->verified = true;
  20. // Read dynamic intensity
  21. buffer[0] = RAD_SENS_DYN_INTENSITY_RG;
  22. if(furi_hal_i2c_tx(I2C_BUS, RAD_SENS_ADDRESS, buffer, 1, timeout)) {
  23. if(furi_hal_i2c_rx(I2C_BUS, (uint8_t)RAD_SENS_ADDRESS, buffer, 3, timeout)) {
  24. model->dyn_intensity =
  25. (((uint32_t)buffer[0] << 16) | ((uint32_t)buffer[1] << 8) |
  26. (uint32_t)buffer[2]);
  27. }
  28. }
  29. // Read static intensity
  30. buffer[0] = RAD_SENS_STAT_INTENSITY_RG;
  31. if(furi_hal_i2c_tx(I2C_BUS, RAD_SENS_ADDRESS, buffer, 1, timeout)) {
  32. if(furi_hal_i2c_rx(I2C_BUS, (uint8_t)RAD_SENS_ADDRESS, buffer, 3, timeout)) {
  33. model->stat_intensity =
  34. (((uint32_t)buffer[0] << 16) | ((uint32_t)buffer[1] << 8) |
  35. (uint32_t)buffer[2]);
  36. }
  37. }
  38. // Read impulses
  39. buffer[0] = RAD_SENS_IMP_CNT_RG;
  40. if(furi_hal_i2c_tx(I2C_BUS, RAD_SENS_ADDRESS, buffer, 1, timeout)) {
  41. if(furi_hal_i2c_rx(I2C_BUS, (uint8_t)RAD_SENS_ADDRESS, buffer, 2, timeout)) {
  42. model->new_impulse_count = (((uint16_t)buffer[0] << 8) | (uint16_t)buffer[1]);
  43. model->impulse_count += model->new_impulse_count;
  44. }
  45. }
  46. }
  47. }
  48. furi_hal_i2c_release(I2C_BUS);
  49. return model->verified;
  50. }