I2CSensor.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "I2CSensor.h"
  2. #include "../sensors/SensorsDriver.h"
  3. uint8_t readReg(I2CSensor* i2c_sensor, uint8_t reg) {
  4. //Блокировка шины
  5. furi_hal_i2c_acquire(i2c_sensor->i2c);
  6. uint8_t buff[1];
  7. furi_hal_i2c_read_mem(i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, reg, buff, 1, 0xFF);
  8. furi_hal_i2c_release(i2c_sensor->i2c);
  9. return buff[0];
  10. }
  11. bool readRegArray(I2CSensor* i2c_sensor, uint8_t startReg, uint8_t len, uint8_t* data) {
  12. furi_hal_i2c_acquire(i2c_sensor->i2c);
  13. bool status = furi_hal_i2c_read_mem(
  14. i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, startReg, data, len, 0xFF);
  15. furi_hal_i2c_release(i2c_sensor->i2c);
  16. return status;
  17. }
  18. void writeReg(I2CSensor* i2c_sensor, uint8_t reg, uint8_t value) {
  19. //Блокировка шины
  20. furi_hal_i2c_acquire(i2c_sensor->i2c);
  21. uint8_t buff[1] = {value};
  22. furi_hal_i2c_write_mem(i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, reg, buff, 1, 0xFF);
  23. furi_hal_i2c_release(i2c_sensor->i2c);
  24. }
  25. bool unitemp_I2C_sensorInit(void* s) {
  26. Sensor* sensor = (Sensor*)s;
  27. I2CSensor* i2c_sensor = (I2CSensor*)sensor->instance;
  28. //BMP280
  29. if(sensor->type == BMP280) {
  30. if(BMP280_init(i2c_sensor)) {
  31. sensor->status = UT_OK;
  32. return true;
  33. }
  34. }
  35. return false;
  36. }
  37. bool unitemp_I2C_sensorDeInit(void* sensor) {
  38. //TODO датчик в спячку, очистить память
  39. UNUSED(sensor);
  40. return true;
  41. }
  42. UnitempStatus unitemp_I2C_updateData(void* sensor) {
  43. if(((Sensor*)sensor)->status == UT_ERROR || ((Sensor*)sensor)->status == UT_TIMEOUT) {
  44. if(((Sensor*)sensor)->initializer(sensor) != true) return UT_ERROR;
  45. }
  46. BMP280_updateData(sensor);
  47. return UT_OK;
  48. }
  49. bool unitemp_I2C_sensorAlloc(Sensor* sensor, SensorType st, uint16_t* anotherValues) {
  50. I2CSensor* instance = malloc(sizeof(I2CSensor));
  51. instance->interface = I2C;
  52. instance->i2c = &furi_hal_i2c_handle_external;
  53. instance->lastPollingTime = 0xFFFFFFFF;
  54. sensor->initializer = unitemp_I2C_sensorInit;
  55. sensor->deinitializer = unitemp_I2C_sensorDeInit;
  56. sensor->updater = unitemp_I2C_updateData;
  57. sensor->instance = instance;
  58. sensor->type = st;
  59. //Настройки для BMP280
  60. if(st == BMP280) {
  61. instance->minI2CAdr = 0x76;
  62. instance->maxI2CAdr = 0x77;
  63. }
  64. if(anotherValues[0] >= instance->minI2CAdr && anotherValues[0] <= instance->maxI2CAdr) {
  65. instance->currentI2CAdr = anotherValues[0];
  66. } else {
  67. instance->currentI2CAdr = instance->minI2CAdr;
  68. }
  69. return true;
  70. }