battery_service.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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 = malloc(sizeof(BatterySvc));
  15. tBleStatus status;
  16. // Add Battery service
  17. status = aci_gatt_add_service(
  18. UUID_TYPE_16, (Service_UUID_t*)&service_uuid, PRIMARY_SERVICE, 4, &battery_svc->svc_handle);
  19. if(status) {
  20. FURI_LOG_E(TAG, "Failed to add Battery service: %d", status);
  21. }
  22. // Add Battery level characteristic
  23. status = aci_gatt_add_char(
  24. battery_svc->svc_handle,
  25. UUID_TYPE_16,
  26. (Char_UUID_t*)&char_battery_level_uuid,
  27. 1,
  28. CHAR_PROP_READ | CHAR_PROP_NOTIFY,
  29. ATTR_PERMISSION_AUTHEN_READ,
  30. GATT_DONT_NOTIFY_EVENTS,
  31. 10,
  32. CHAR_VALUE_LEN_CONSTANT,
  33. &battery_svc->char_level_handle);
  34. if(status) {
  35. FURI_LOG_E(TAG, "Failed to add Battery level characteristic: %d", status);
  36. }
  37. }
  38. void battery_svc_stop() {
  39. tBleStatus status;
  40. if(battery_svc) {
  41. // Delete Battery level characteristic
  42. status = aci_gatt_del_char(battery_svc->svc_handle, battery_svc->char_level_handle);
  43. if(status) {
  44. FURI_LOG_E(TAG, "Failed to delete Battery level characteristic: %d", status);
  45. }
  46. // Delete Battery service
  47. status = aci_gatt_del_service(battery_svc->svc_handle);
  48. if(status) {
  49. FURI_LOG_E(TAG, "Failed to delete Battery service: %d", status);
  50. }
  51. free(battery_svc);
  52. battery_svc = NULL;
  53. }
  54. }
  55. bool battery_svc_is_started() {
  56. return battery_svc != NULL;
  57. }
  58. bool battery_svc_update_level(uint8_t battery_charge) {
  59. // Check if service was started
  60. if(battery_svc == NULL) {
  61. return false;
  62. }
  63. // Update battery level characteristic
  64. FURI_LOG_D(TAG, "Updating battery level characteristic");
  65. tBleStatus result = aci_gatt_update_char_value(
  66. battery_svc->svc_handle, battery_svc->char_level_handle, 0, 1, &battery_charge);
  67. if(result) {
  68. FURI_LOG_E(TAG, "Failed updating RX characteristic: %d", result);
  69. }
  70. return result != BLE_STATUS_SUCCESS;
  71. }