Line data Source code
1 0 : /* 2 : * Copyright (c) 2024 Croxel Inc. 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_CTS_H_ 8 : #define ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_CTS_H_ 9 : 10 : /** 11 : * @brief Current Time Service (CTS) 12 : * @defgroup bt_cts Current Time Service (CTS) 13 : * @ingroup bluetooth 14 : * @{ 15 : * 16 : */ 17 : 18 : #include <stdint.h> 19 : 20 : #ifdef __cplusplus 21 : extern "C" { 22 : #endif 23 : 24 : /** 25 : * @brief CTS time update reason bits as defined in the specification 26 : */ 27 0 : enum bt_cts_update_reason { 28 : /* Unknown reason of update no bit is set */ 29 : BT_CTS_UPDATE_REASON_UNKNOWN = 0, 30 : /* When time is changed manually e.g. through UI */ 31 : BT_CTS_UPDATE_REASON_MANUAL = BIT(0), 32 : /* If time is changed through external reference */ 33 : BT_CTS_UPDATE_REASON_EXTERNAL_REF = BIT(1), 34 : /* time changed due to timezone adjust */ 35 : BT_CTS_UPDATE_REASON_TIME_ZONE_CHANGE = BIT(2), 36 : /* time changed due to dst offset change */ 37 : BT_CTS_UPDATE_REASON_DAYLIGHT_SAVING = BIT(3), 38 : }; 39 : 40 : /** 41 : * @brief Current Time service data format, Please refer to 42 : * specifications for more details 43 : */ 44 1 : struct bt_cts_time_format { 45 0 : uint16_t year; 46 0 : uint8_t mon; 47 0 : uint8_t mday; 48 0 : uint8_t hours; 49 0 : uint8_t min; 50 0 : uint8_t sec; 51 0 : uint8_t wday; 52 0 : uint8_t fractions256; 53 0 : uint8_t reason; 54 : } __packed; 55 : 56 : /** @brief Current Time Service callback structure */ 57 1 : struct bt_cts_cb { 58 : /** @brief Current Time Service notifications changed 59 : * 60 : * @param enabled True if notifications are enabled, false if disabled 61 : */ 62 1 : void (*notification_changed)(bool enabled); 63 : 64 : /** 65 : * @brief The Current Time has been updated by a peer. 66 : * It is the responsibility of the application to store the new time. 67 : * 68 : * @param cts_time [IN] updated time 69 : * 70 : * @return 0 application has decoded it successfully 71 : * @return negative error codes on failure 72 : * 73 : */ 74 1 : int (*cts_time_write)(struct bt_cts_time_format *cts_time); 75 : 76 : /** 77 : * @brief When current time Read request or notification is triggered, CTS uses 78 : * this callback to retrieve current time information from application. Application 79 : * must implement it and provide cts formatted current time information 80 : * 81 : * @note this callback is mandatory 82 : * 83 : * @param cts_time [IN] updated time 84 : * 85 : * @return 0 application has encoded it successfully 86 : * @return negative error codes on failure 87 : */ 88 1 : int (*fill_current_cts_time)(struct bt_cts_time_format *cts_time); 89 : }; 90 : 91 : /** 92 : * @brief This API should be called at application init. 93 : * it is safe to call this API before or after bt_enable API 94 : * 95 : * @param cb pointer to required callback 96 : * 97 : * @return 0 on success 98 : * @return negative error codes on failure 99 : */ 100 1 : int bt_cts_init(const struct bt_cts_cb *cb); 101 : 102 : /** 103 : * @brief Notify all connected clients that have enabled the 104 : * current time update notification 105 : * 106 : * @param reason update reason to be sent to the clients 107 : * 108 : * @return 0 on success 109 : * @return negative error codes on failure 110 : */ 111 1 : int bt_cts_send_notification(enum bt_cts_update_reason reason); 112 : 113 : /** 114 : * @brief Helper API to decode CTS formatted time into milliseconds since epoch 115 : * 116 : * @note @kconfig{CONFIG_BT_CTS_HELPER_API} needs to be enabled to use this API. 117 : * 118 : * @param ct_time [IN] cts time formatted time 119 : * @param unix_ms [OUT] pointer to store parsed millisecond since epoch 120 : * 121 : * @return 0 on success 122 : * @return negative error codes on failure 123 : */ 124 1 : int bt_cts_time_to_unix_ms(const struct bt_cts_time_format *ct_time, int64_t *unix_ms); 125 : 126 : /** 127 : * @brief Helper API to encode milliseconds since epoch to CTS formatted time 128 : * 129 : * @note @kconfig{CONFIG_BT_CTS_HELPER_API} needs to be enabled to use this API. 130 : * 131 : * @param ct_time [OUT] Pointer to store CTS formatted time 132 : * @param unix_ms [IN] milliseconds since epoch to be converted 133 : * 134 : * @return 0 on success 135 : * @return negative error codes on failure 136 : */ 137 1 : int bt_cts_time_from_unix_ms(struct bt_cts_time_format *ct_time, int64_t unix_ms); 138 : 139 : #ifdef __cplusplus 140 : } 141 : #endif 142 : 143 : /** 144 : * @} 145 : */ 146 : 147 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_CTS_H_ */