dev_info_service.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "dev_info_service.h"
  2. #include "app_common.h"
  3. #include "ble.h"
  4. #include <furi.h>
  5. #define TAG "BtDevInfoSvc"
  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. static DevInfoSvc* dev_info_svc = NULL;
  14. static const char dev_info_man_name[] = "Flipper Devices Inc.";
  15. static const char dev_info_serial_num[] = "1.0";
  16. static const char dev_info_firmware_rev_num[] = TOSTRING(TARGET);
  17. static const char dev_info_software_rev_num[] = GIT_COMMIT " " GIT_BRANCH " " GIT_BRANCH_NUM
  18. " " BUILD_DATE;
  19. void dev_info_svc_start() {
  20. dev_info_svc = malloc(sizeof(DevInfoSvc));
  21. tBleStatus status;
  22. // Add Device Information Service
  23. uint16_t uuid = DEVICE_INFORMATION_SERVICE_UUID;
  24. status = aci_gatt_add_service(
  25. UUID_TYPE_16, (Service_UUID_t*)&uuid, PRIMARY_SERVICE, 9, &dev_info_svc->service_handle);
  26. if(status) {
  27. FURI_LOG_E(TAG, "Failed to add Device Information Service: %d", status);
  28. }
  29. // Add characteristics
  30. uuid = MANUFACTURER_NAME_UUID;
  31. status = aci_gatt_add_char(
  32. dev_info_svc->service_handle,
  33. UUID_TYPE_16,
  34. (Char_UUID_t*)&uuid,
  35. strlen(dev_info_man_name),
  36. CHAR_PROP_READ,
  37. ATTR_PERMISSION_AUTHEN_READ,
  38. GATT_DONT_NOTIFY_EVENTS,
  39. 10,
  40. CHAR_VALUE_LEN_CONSTANT,
  41. &dev_info_svc->man_name_char_handle);
  42. if(status) {
  43. FURI_LOG_E(TAG, "Failed to add manufacturer name char: %d", status);
  44. }
  45. uuid = SERIAL_NUMBER_UUID;
  46. status = aci_gatt_add_char(
  47. dev_info_svc->service_handle,
  48. UUID_TYPE_16,
  49. (Char_UUID_t*)&uuid,
  50. strlen(dev_info_serial_num),
  51. CHAR_PROP_READ,
  52. ATTR_PERMISSION_AUTHEN_READ,
  53. GATT_DONT_NOTIFY_EVENTS,
  54. 10,
  55. CHAR_VALUE_LEN_CONSTANT,
  56. &dev_info_svc->serial_num_char_handle);
  57. if(status) {
  58. FURI_LOG_E(TAG, "Failed to add serial number char: %d", status);
  59. }
  60. uuid = FIRMWARE_REVISION_UUID;
  61. status = aci_gatt_add_char(
  62. dev_info_svc->service_handle,
  63. UUID_TYPE_16,
  64. (Char_UUID_t*)&uuid,
  65. strlen(dev_info_firmware_rev_num),
  66. CHAR_PROP_READ,
  67. ATTR_PERMISSION_AUTHEN_READ,
  68. GATT_DONT_NOTIFY_EVENTS,
  69. 10,
  70. CHAR_VALUE_LEN_CONSTANT,
  71. &dev_info_svc->firmware_rev_char_handle);
  72. if(status) {
  73. FURI_LOG_E(TAG, "Failed to add firmware revision char: %d", status);
  74. }
  75. uuid = SOFTWARE_REVISION_UUID;
  76. status = aci_gatt_add_char(
  77. dev_info_svc->service_handle,
  78. UUID_TYPE_16,
  79. (Char_UUID_t*)&uuid,
  80. strlen(dev_info_software_rev_num),
  81. CHAR_PROP_READ,
  82. ATTR_PERMISSION_AUTHEN_READ,
  83. GATT_DONT_NOTIFY_EVENTS,
  84. 10,
  85. CHAR_VALUE_LEN_CONSTANT,
  86. &dev_info_svc->software_rev_char_handle);
  87. if(status) {
  88. FURI_LOG_E(TAG, "Failed to add software revision char: %d", status);
  89. }
  90. // Update characteristics
  91. status = aci_gatt_update_char_value(
  92. dev_info_svc->service_handle,
  93. dev_info_svc->man_name_char_handle,
  94. 0,
  95. strlen(dev_info_man_name),
  96. (uint8_t*)dev_info_man_name);
  97. if(status) {
  98. FURI_LOG_E(TAG, "Failed to update manufacturer name char: %d", status);
  99. }
  100. status = aci_gatt_update_char_value(
  101. dev_info_svc->service_handle,
  102. dev_info_svc->serial_num_char_handle,
  103. 0,
  104. strlen(dev_info_serial_num),
  105. (uint8_t*)dev_info_serial_num);
  106. if(status) {
  107. FURI_LOG_E(TAG, "Failed to update serial number char: %d", status);
  108. }
  109. status = aci_gatt_update_char_value(
  110. dev_info_svc->service_handle,
  111. dev_info_svc->firmware_rev_char_handle,
  112. 0,
  113. strlen(dev_info_firmware_rev_num),
  114. (uint8_t*)dev_info_firmware_rev_num);
  115. if(status) {
  116. FURI_LOG_E(TAG, "Failed to update firmware revision char: %d", status);
  117. }
  118. status = aci_gatt_update_char_value(
  119. dev_info_svc->service_handle,
  120. dev_info_svc->software_rev_char_handle,
  121. 0,
  122. strlen(dev_info_software_rev_num),
  123. (uint8_t*)dev_info_software_rev_num);
  124. if(status) {
  125. FURI_LOG_E(TAG, "Failed to update software revision char: %d", status);
  126. }
  127. }
  128. void dev_info_svc_stop() {
  129. tBleStatus status;
  130. if(dev_info_svc) {
  131. // Delete service characteristics
  132. status =
  133. aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->man_name_char_handle);
  134. if(status) {
  135. FURI_LOG_E(TAG, "Failed to delete manufacturer name char: %d", status);
  136. }
  137. status =
  138. aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->serial_num_char_handle);
  139. if(status) {
  140. FURI_LOG_E(TAG, "Failed to delete serial number char: %d", status);
  141. }
  142. status = aci_gatt_del_char(
  143. dev_info_svc->service_handle, dev_info_svc->firmware_rev_char_handle);
  144. if(status) {
  145. FURI_LOG_E(TAG, "Failed to delete firmware revision char: %d", status);
  146. }
  147. status = aci_gatt_del_char(
  148. dev_info_svc->service_handle, dev_info_svc->software_rev_char_handle);
  149. if(status) {
  150. FURI_LOG_E(TAG, "Failed to delete software revision char: %d", status);
  151. }
  152. // Delete service
  153. status = aci_gatt_del_service(dev_info_svc->service_handle);
  154. if(status) {
  155. FURI_LOG_E(TAG, "Failed to delete device info service: %d", status);
  156. }
  157. free(dev_info_svc);
  158. dev_info_svc = NULL;
  159. }
  160. }
  161. bool dev_info_svc_is_started() {
  162. return dev_info_svc != NULL;
  163. }