battery_service.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "battery_service.h"
  2. #include "app_common.h"
  3. #include "ble.h"
  4. #include <furi.h>
  5. #define TAG "BtBatterySvc"
  6. typedef struct {
  7. uint16_t svc_handle;
  8. uint16_t char_level_handle;
  9. } BatterySvc;
  10. static BatterySvc* battery_svc = NULL;
  11. static const uint16_t service_uuid = BATTERY_SERVICE_UUID;
  12. static const uint16_t char_battery_level_uuid = BATTERY_LEVEL_CHAR_UUID;
  13. void battery_svc_start() {
  14. battery_svc = furi_alloc(sizeof(BatterySvc));
  15. tBleStatus status;
  16. // Add Battery service
  17. status = aci_gatt_add_service(UUID_TYPE_16, (Service_UUID_t*)&service_uuid, PRIMARY_SERVICE, 4, &battery_svc->svc_handle);
  18. if(status) {
  19. FURI_LOG_E(TAG, "Failed to add Battery service: %d", status);
  20. }
  21. // Add Battery level characteristic
  22. status = aci_gatt_add_char(battery_svc->svc_handle,
  23. UUID_TYPE_16,
  24. (Char_UUID_t *) &char_battery_level_uuid,
  25. 1,
  26. CHAR_PROP_READ | CHAR_PROP_NOTIFY,
  27. ATTR_PERMISSION_AUTHEN_READ,
  28. GATT_DONT_NOTIFY_EVENTS,
  29. 10,
  30. CHAR_VALUE_LEN_CONSTANT,
  31. &battery_svc->char_level_handle);
  32. if(status) {
  33. FURI_LOG_E(TAG, "Failed to add Battery level characteristic: %d", status);
  34. }
  35. }
  36. void battery_svc_stop() {
  37. tBleStatus status;
  38. if(battery_svc) {
  39. // Delete Battery level characteristic
  40. status = aci_gatt_del_char(battery_svc->svc_handle, battery_svc->char_level_handle);
  41. if(status) {
  42. FURI_LOG_E(TAG, "Failed to delete Battery level characteristic: %d", status);
  43. }
  44. // Delete Battery service
  45. status = aci_gatt_del_service(battery_svc->svc_handle);
  46. if(status) {
  47. FURI_LOG_E(TAG, "Failed to delete Battery service: %d", status);
  48. }
  49. free(battery_svc);
  50. battery_svc = NULL;
  51. }
  52. }
  53. bool battery_svc_update_level(uint8_t battery_charge) {
  54. // Check if service was started
  55. if(battery_svc == NULL) {
  56. return false;
  57. }
  58. // Update battery level characteristic
  59. FURI_LOG_I(TAG, "Updating battery level characteristic");
  60. tBleStatus result = aci_gatt_update_char_value(battery_svc->svc_handle,
  61. battery_svc->char_level_handle,
  62. 0,
  63. 1,
  64. &battery_charge);
  65. if(result) {
  66. FURI_LOG_E(TAG, "Failed updating RX characteristic: %d", result);
  67. }
  68. return result != BLE_STATUS_SUCCESS;
  69. }