I2CSensor.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "I2CSensor.h"
  2. static uint8_t sensors_count = 0;
  3. uint8_t unitemp_i2c_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, 10);
  8. furi_hal_i2c_release(i2c_sensor->i2c);
  9. return buff[0];
  10. }
  11. bool unitemp_i2c_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, 10);
  15. furi_hal_i2c_release(i2c_sensor->i2c);
  16. return status;
  17. }
  18. bool unitemp_i2c_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. bool status =
  23. furi_hal_i2c_write_mem(i2c_sensor->i2c, i2c_sensor->currentI2CAdr << 1, reg, buff, 1, 10);
  24. furi_hal_i2c_release(i2c_sensor->i2c);
  25. return status;
  26. }
  27. bool unitemp_I2C_sensor_alloc(Sensor* sensor, char* args) {
  28. bool status = false;
  29. I2CSensor* instance = malloc(sizeof(I2CSensor));
  30. if(instance == NULL) {
  31. FURI_LOG_E(APP_NAME, "Sensor %s instance allocation error", sensor->name);
  32. return false;
  33. }
  34. instance->i2c = &furi_hal_i2c_handle_external;
  35. sensor->instance = instance;
  36. //Указание функций инициализации, деинициализации и обновления данных, а так же адреса на шине I2C
  37. status = sensor->type->allocator(sensor, args);
  38. int i2c_addr;
  39. sscanf(args, "%X", &i2c_addr);
  40. //Установка адреса шины I2C
  41. if(i2c_addr >= instance->minI2CAdr && i2c_addr <= instance->maxI2CAdr) {
  42. instance->currentI2CAdr = i2c_addr;
  43. } else {
  44. instance->currentI2CAdr = instance->minI2CAdr;
  45. }
  46. //Блокировка портов GPIO
  47. sensors_count++;
  48. unitemp_gpio_lock(unitemp_gpio_getFromInt(15), &I2C);
  49. unitemp_gpio_lock(unitemp_gpio_getFromInt(16), &I2C);
  50. return status;
  51. }
  52. bool unitemp_I2C_sensor_free(Sensor* sensor) {
  53. bool status = sensor->type->mem_releaser(sensor);
  54. free(sensor->instance);
  55. if(--sensors_count == 0) {
  56. unitemp_gpio_unlock(unitemp_gpio_getFromInt(15));
  57. unitemp_gpio_unlock(unitemp_gpio_getFromInt(16));
  58. }
  59. return status;
  60. }
  61. UnitempStatus unitemp_I2C_sensor_update(Sensor* sensor) {
  62. if(sensor->status != UT_OK) {
  63. sensor->type->initializer(sensor);
  64. }
  65. return sensor->type->updater(sensor);
  66. }