dis.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /** @file
  2. * @brief GATT Device Information Service
  3. */
  4. /*
  5. * Copyright (c) 2019 Demant
  6. * Copyright (c) 2018 Nordic Semiconductor ASA
  7. * Copyright (c) 2016 Intel Corporation
  8. *
  9. * SPDX-License-Identifier: Apache-2.0
  10. */
  11. #include <zephyr/types.h>
  12. #include <stddef.h>
  13. #include <string.h>
  14. #include <errno.h>
  15. #include <zephyr.h>
  16. #include <init.h>
  17. #include <settings/settings.h>
  18. #include <acts_bluetooth/bluetooth.h>
  19. #include <acts_bluetooth/hci.h>
  20. #include <acts_bluetooth/conn.h>
  21. #include <acts_bluetooth/uuid.h>
  22. #include <acts_bluetooth/gatt.h>
  23. #define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_SERVICE)
  24. #define LOG_MODULE_NAME bt_dis
  25. #include "common/log.h"
  26. #if CONFIG_BT_DIS_PNP
  27. struct dis_pnp {
  28. uint8_t pnp_vid_src;
  29. uint16_t pnp_vid;
  30. uint16_t pnp_pid;
  31. uint16_t pnp_ver;
  32. } __packed;
  33. static struct dis_pnp dis_pnp_id = {
  34. .pnp_vid_src = CONFIG_BT_DIS_PNP_VID_SRC,
  35. .pnp_vid = CONFIG_BT_DIS_PNP_VID,
  36. .pnp_pid = CONFIG_BT_DIS_PNP_PID,
  37. .pnp_ver = CONFIG_BT_DIS_PNP_VER,
  38. };
  39. #endif
  40. #if defined(CONFIG_BT_DIS_SETTINGS)
  41. static uint8_t dis_model[CONFIG_BT_DIS_STR_MAX] = CONFIG_BT_DIS_MODEL;
  42. static uint8_t dis_manuf[CONFIG_BT_DIS_STR_MAX] = CONFIG_BT_DIS_MANUF;
  43. #if defined(CONFIG_BT_DIS_SERIAL_NUMBER)
  44. static uint8_t dis_serial_number[CONFIG_BT_DIS_STR_MAX] =
  45. CONFIG_BT_DIS_SERIAL_NUMBER_STR;
  46. #endif
  47. #if defined(CONFIG_BT_DIS_FW_REV)
  48. static uint8_t dis_fw_rev[CONFIG_BT_DIS_STR_MAX] =
  49. CONFIG_BT_DIS_FW_REV_STR;
  50. #endif
  51. #if defined(CONFIG_BT_DIS_HW_REV)
  52. static uint8_t dis_hw_rev[CONFIG_BT_DIS_STR_MAX] =
  53. CONFIG_BT_DIS_HW_REV_STR;
  54. #endif
  55. #if defined(CONFIG_BT_DIS_SW_REV)
  56. static uint8_t dis_sw_rev[CONFIG_BT_DIS_STR_MAX] =
  57. CONFIG_BT_DIS_SW_REV_STR;
  58. #endif
  59. #define BT_DIS_MODEL_REF dis_model
  60. #define BT_DIS_MANUF_REF dis_manuf
  61. #define BT_DIS_SERIAL_NUMBER_STR_REF dis_serial_number
  62. #define BT_DIS_FW_REV_STR_REF dis_fw_rev
  63. #define BT_DIS_HW_REV_STR_REF dis_hw_rev
  64. #define BT_DIS_SW_REV_STR_REF dis_sw_rev
  65. #else /* CONFIG_BT_DIS_SETTINGS */
  66. #define BT_DIS_MODEL_REF CONFIG_BT_DIS_MODEL
  67. #define BT_DIS_MANUF_REF CONFIG_BT_DIS_MANUF
  68. #define BT_DIS_SERIAL_NUMBER_STR_REF CONFIG_BT_DIS_SERIAL_NUMBER_STR
  69. #define BT_DIS_FW_REV_STR_REF CONFIG_BT_DIS_FW_REV_STR
  70. #define BT_DIS_HW_REV_STR_REF CONFIG_BT_DIS_HW_REV_STR
  71. #define BT_DIS_SW_REV_STR_REF CONFIG_BT_DIS_SW_REV_STR
  72. #endif /* CONFIG_BT_DIS_SETTINGS */
  73. static ssize_t read_str(struct bt_conn *conn,
  74. const struct bt_gatt_attr *attr, void *buf,
  75. uint16_t len, uint16_t offset)
  76. {
  77. return bt_gatt_attr_read(conn, attr, buf, len, offset, attr->user_data,
  78. strlen(attr->user_data));
  79. }
  80. #if CONFIG_BT_DIS_PNP
  81. static ssize_t read_pnp_id(struct bt_conn *conn,
  82. const struct bt_gatt_attr *attr, void *buf,
  83. uint16_t len, uint16_t offset)
  84. {
  85. return bt_gatt_attr_read(conn, attr, buf, len, offset, &dis_pnp_id,
  86. sizeof(dis_pnp_id));
  87. }
  88. #endif
  89. /* Device Information Service Declaration */
  90. BT_GATT_SERVICE_DEFINE(dis_svc,
  91. BT_GATT_PRIMARY_SERVICE(BT_UUID_DIS),
  92. BT_GATT_CHARACTERISTIC(BT_UUID_DIS_MODEL_NUMBER,
  93. BT_GATT_CHRC_READ, BT_GATT_PERM_READ,
  94. read_str, NULL, BT_DIS_MODEL_REF),
  95. BT_GATT_CHARACTERISTIC(BT_UUID_DIS_MANUFACTURER_NAME,
  96. BT_GATT_CHRC_READ, BT_GATT_PERM_READ,
  97. read_str, NULL, BT_DIS_MANUF_REF),
  98. #if CONFIG_BT_DIS_PNP
  99. BT_GATT_CHARACTERISTIC(BT_UUID_DIS_PNP_ID,
  100. BT_GATT_CHRC_READ, BT_GATT_PERM_READ,
  101. read_pnp_id, NULL, &dis_pnp_id),
  102. #endif
  103. #if defined(CONFIG_BT_DIS_SERIAL_NUMBER)
  104. BT_GATT_CHARACTERISTIC(BT_UUID_DIS_SERIAL_NUMBER,
  105. BT_GATT_CHRC_READ, BT_GATT_PERM_READ,
  106. read_str, NULL,
  107. BT_DIS_SERIAL_NUMBER_STR_REF),
  108. #endif
  109. #if defined(CONFIG_BT_DIS_FW_REV)
  110. BT_GATT_CHARACTERISTIC(BT_UUID_DIS_FIRMWARE_REVISION,
  111. BT_GATT_CHRC_READ, BT_GATT_PERM_READ,
  112. read_str, NULL, BT_DIS_FW_REV_STR_REF),
  113. #endif
  114. #if defined(CONFIG_BT_DIS_HW_REV)
  115. BT_GATT_CHARACTERISTIC(BT_UUID_DIS_HARDWARE_REVISION,
  116. BT_GATT_CHRC_READ, BT_GATT_PERM_READ,
  117. read_str, NULL, BT_DIS_HW_REV_STR_REF),
  118. #endif
  119. #if defined(CONFIG_BT_DIS_SW_REV)
  120. BT_GATT_CHARACTERISTIC(BT_UUID_DIS_SOFTWARE_REVISION,
  121. BT_GATT_CHRC_READ, BT_GATT_PERM_READ,
  122. read_str, NULL, BT_DIS_SW_REV_STR_REF),
  123. #endif
  124. );
  125. #if defined(CONFIG_BT_DIS_SETTINGS)
  126. static int dis_set(const char *name, size_t len_rd,
  127. settings_read_cb read_cb, void *store)
  128. {
  129. ssize_t len;
  130. int nlen;
  131. const char *next;
  132. nlen = settings_name_next(name, &next);
  133. if (!strncmp(name, "manuf", nlen)) {
  134. len = read_cb(store, &dis_manuf, sizeof(dis_manuf) - 1);
  135. if (len < 0) {
  136. BT_ERR("Failed to read manufacturer from storage"
  137. " (err %zd)", len);
  138. } else {
  139. dis_manuf[len] = '\0';
  140. BT_DBG("Manufacturer set to %s", dis_manuf);
  141. }
  142. return 0;
  143. }
  144. if (!strncmp(name, "model", nlen)) {
  145. len = read_cb(store, &dis_model, sizeof(dis_model) - 1);
  146. if (len < 0) {
  147. BT_ERR("Failed to read model from storage"
  148. " (err %zd)", len);
  149. } else {
  150. dis_model[len] = '\0';
  151. BT_DBG("Model set to %s", dis_model);
  152. }
  153. return 0;
  154. }
  155. #if defined(CONFIG_BT_DIS_SERIAL_NUMBER)
  156. if (!strncmp(name, "serial", nlen)) {
  157. len = read_cb(store, &dis_serial_number,
  158. sizeof(dis_serial_number) - 1);
  159. if (len < 0) {
  160. BT_ERR("Failed to read serial number from storage"
  161. " (err %zd)", len);
  162. } else {
  163. dis_serial_number[len] = '\0';
  164. BT_DBG("Serial number set to %s", dis_serial_number);
  165. }
  166. return 0;
  167. }
  168. #endif
  169. #if defined(CONFIG_BT_DIS_FW_REV)
  170. if (!strncmp(name, "fw", nlen)) {
  171. len = read_cb(store, &dis_fw_rev, sizeof(dis_fw_rev) - 1);
  172. if (len < 0) {
  173. BT_ERR("Failed to read firmware revision from storage"
  174. " (err %zd)", len);
  175. } else {
  176. dis_fw_rev[len] = '\0';
  177. BT_DBG("Firmware revision set to %s", dis_fw_rev);
  178. }
  179. return 0;
  180. }
  181. #endif
  182. #if defined(CONFIG_BT_DIS_HW_REV)
  183. if (!strncmp(name, "hw", nlen)) {
  184. len = read_cb(store, &dis_hw_rev, sizeof(dis_hw_rev) - 1);
  185. if (len < 0) {
  186. BT_ERR("Failed to read hardware revision from storage"
  187. " (err %zd)", len);
  188. } else {
  189. dis_hw_rev[len] = '\0';
  190. BT_DBG("Hardware revision set to %s", dis_hw_rev);
  191. }
  192. return 0;
  193. }
  194. #endif
  195. #if defined(CONFIG_BT_DIS_SW_REV)
  196. if (!strncmp(name, "sw", nlen)) {
  197. len = read_cb(store, &dis_sw_rev, sizeof(dis_sw_rev) - 1);
  198. if (len < 0) {
  199. BT_ERR("Failed to read software revision from storage"
  200. " (err %zd)", len);
  201. } else {
  202. dis_sw_rev[len] = '\0';
  203. BT_DBG("Software revision set to %s", dis_sw_rev);
  204. }
  205. return 0;
  206. }
  207. #endif
  208. return 0;
  209. }
  210. SETTINGS_STATIC_HANDLER_DEFINE(bt_dis, "bt/dis", NULL, dis_set, NULL, NULL);
  211. #endif /* CONFIG_BT_DIS_SETTINGS*/