dev_info_service.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "dev_info_service.h"
  2. #include "app_common.h"
  3. #include "ble.h"
  4. #include <furi.h>
  5. #define DEV_INFO_SERVICE_TAG "dev info service"
  6. typedef struct {
  7. uint16_t service_handle;
  8. uint16_t man_name_char_handle;
  9. uint16_t serial_num_char_handle;
  10. uint16_t firmware_rev_char_handle;
  11. uint16_t software_rev_char_handle;
  12. } DevInfoSvc;
  13. bool dev_info_service_init() {
  14. tBleStatus status;
  15. DevInfoSvc dev_info_svc;
  16. // Add Device Information Service
  17. uint16_t uuid = DEVICE_INFORMATION_SERVICE_UUID;
  18. status = aci_gatt_add_service(UUID_TYPE_16, (Service_UUID_t*)&uuid, PRIMARY_SERVICE, 9, &dev_info_svc.service_handle);
  19. if(status) {
  20. FURI_LOG_E(DEV_INFO_SERVICE_TAG, "Failed to add Device Information Service: %d", status);
  21. }
  22. // Add characteristics
  23. uuid = MANUFACTURER_NAME_UUID;
  24. status = aci_gatt_add_char(dev_info_svc.service_handle,
  25. UUID_TYPE_16,
  26. (Char_UUID_t*)&uuid,
  27. strlen(DEV_INFO_MANUFACTURER_NAME),
  28. CHAR_PROP_READ,
  29. ATTR_PERMISSION_NONE,
  30. GATT_DONT_NOTIFY_EVENTS,
  31. 10,
  32. CHAR_VALUE_LEN_CONSTANT,
  33. &dev_info_svc.man_name_char_handle);
  34. if(status) {
  35. FURI_LOG_E(DEV_INFO_SERVICE_TAG, "Failed to add manufacturer name char: %d", status);
  36. }
  37. uuid = SERIAL_NUMBER_UUID;
  38. status = aci_gatt_add_char(dev_info_svc.service_handle,
  39. UUID_TYPE_16,
  40. (Char_UUID_t*)&uuid,
  41. strlen(DEV_INFO_SERIAL_NUMBER),
  42. CHAR_PROP_READ,
  43. ATTR_PERMISSION_NONE,
  44. GATT_DONT_NOTIFY_EVENTS,
  45. 10,
  46. CHAR_VALUE_LEN_CONSTANT,
  47. &dev_info_svc.serial_num_char_handle);
  48. if(status) {
  49. FURI_LOG_E(DEV_INFO_SERVICE_TAG, "Failed to add serial number char: %d", status);
  50. }
  51. uuid = FIRMWARE_REVISION_UUID;
  52. status = aci_gatt_add_char(dev_info_svc.service_handle,
  53. UUID_TYPE_16,
  54. (Char_UUID_t*)&uuid,
  55. strlen(DEV_INFO_FIRMWARE_REVISION_NUMBER),
  56. CHAR_PROP_READ,
  57. ATTR_PERMISSION_NONE,
  58. GATT_DONT_NOTIFY_EVENTS,
  59. 10,
  60. CHAR_VALUE_LEN_CONSTANT,
  61. &dev_info_svc.firmware_rev_char_handle);
  62. if(status) {
  63. FURI_LOG_E(DEV_INFO_SERVICE_TAG, "Failed to add firmware revision char: %d", status);
  64. }
  65. uuid = SOFTWARE_REVISION_UUID;
  66. status = aci_gatt_add_char(dev_info_svc.service_handle,
  67. UUID_TYPE_16,
  68. (Char_UUID_t*)&uuid,
  69. strlen(DEV_INFO_SOFTWARE_REVISION_NUMBER),
  70. CHAR_PROP_READ,
  71. ATTR_PERMISSION_NONE,
  72. GATT_DONT_NOTIFY_EVENTS,
  73. 10,
  74. CHAR_VALUE_LEN_CONSTANT,
  75. &dev_info_svc.software_rev_char_handle);
  76. if(status) {
  77. FURI_LOG_E(DEV_INFO_SERVICE_TAG, "Failed to add software revision char: %d", status);
  78. }
  79. // Update characteristics
  80. status = aci_gatt_update_char_value(dev_info_svc.service_handle,
  81. dev_info_svc.man_name_char_handle,
  82. 0,
  83. strlen(DEV_INFO_MANUFACTURER_NAME),
  84. (uint8_t*)DEV_INFO_MANUFACTURER_NAME);
  85. if(status) {
  86. FURI_LOG_E(DEV_INFO_SERVICE_TAG, "Failed to update manufacturer name char: %d", status);
  87. }
  88. status = aci_gatt_update_char_value(dev_info_svc.service_handle,
  89. dev_info_svc.serial_num_char_handle,
  90. 0,
  91. strlen(DEV_INFO_SERIAL_NUMBER),
  92. (uint8_t*)DEV_INFO_SERIAL_NUMBER);
  93. if(status) {
  94. FURI_LOG_E(DEV_INFO_SERVICE_TAG, "Failed to update serial number char: %d", status);
  95. }
  96. status = aci_gatt_update_char_value(dev_info_svc.service_handle,
  97. dev_info_svc.firmware_rev_char_handle,
  98. 0,
  99. strlen(DEV_INFO_FIRMWARE_REVISION_NUMBER),
  100. (uint8_t*)DEV_INFO_FIRMWARE_REVISION_NUMBER);
  101. if(status) {
  102. FURI_LOG_E(DEV_INFO_SERVICE_TAG, "Failed to update firmware revision char: %d", status);
  103. }
  104. status = aci_gatt_update_char_value(dev_info_svc.service_handle,
  105. dev_info_svc.software_rev_char_handle,
  106. 0,
  107. strlen(DEV_INFO_SOFTWARE_REVISION_NUMBER),
  108. (uint8_t*)DEV_INFO_SOFTWARE_REVISION_NUMBER);
  109. if(status) {
  110. FURI_LOG_E(DEV_INFO_SERVICE_TAG, "Failed to update software revision char: %d", status);
  111. }
  112. return status != BLE_STATUS_SUCCESS;
  113. }