dev_info_service.c 6.9 KB

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