battery_service.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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_is_started() {
  54. return battery_svc != NULL;
  55. }
  56. bool battery_svc_update_level(uint8_t battery_charge) {
  57. // Check if service was started
  58. if(battery_svc == NULL) {
  59. return false;
  60. }
  61. // Update battery level characteristic
  62. FURI_LOG_I(TAG, "Updating battery level characteristic");
  63. tBleStatus result = aci_gatt_update_char_value(battery_svc->svc_handle,
  64. battery_svc->char_level_handle,
  65. 0,
  66. 1,
  67. &battery_charge);
  68. if(result) {
  69. FURI_LOG_E(TAG, "Failed updating RX characteristic: %d", result);
  70. }
  71. return result != BLE_STATUS_SUCCESS;
  72. }