SmartSnippets DA1459x SDK
cts.h
Go to the documentation of this file.
1 
43 #ifndef CTS_H_
44 #define CTS_H_
45 
46 #include <stdint.h>
47 #include <ble_service.h>
48 #include <svc_types.h>
49 
51 #define CTS_ADJUST_REASON_VALID_VALUES_MASK (CTS_AR_NO_CHANGE | \
52  CTS_AR_CHANGE_OF_DST | \
53  CTS_AR_MANUAL_TIME_UPDATE | \
54  CTS_AR_EXTERNAL_REFERENCE_TIME_UPDATE | \
55  CTS_AR_CHANGE_OF_TIME_ZONE)
56 
58 enum cts_error {
59  CTS_ERROR_DATA_FIELD_IGNORED = ATT_ERROR_APPLICATION_ERROR,
60 };
61 
63 typedef enum {
64  CTS_AR_NO_CHANGE = 0,
65  CTS_AR_MANUAL_TIME_UPDATE = 1,
66  CTS_AR_EXTERNAL_REFERENCE_TIME_UPDATE = 2,
67  CTS_AR_CHANGE_OF_TIME_ZONE = 4,
68  CTS_AR_CHANGE_OF_DST = 8
70 
72 typedef enum {
73  CTS_DST_STANDARD_TIME = 0,
74  CTS_DST_HALF_AN_HOUR_DAYLIGH_TIME = 2,
75  CTS_DST_DAYLIGHT_TIME = 4,
76  CTS_DST_DOUBLE_DAYLIGHT_TIME = 8,
77  CTS_DST_UNKNOWN = 255
78 } cts_dst_t;
79 
81 typedef enum {
82  CTS_RTS_UNKNOWN = 0,
83  CTS_RTS_NTP = 1,
84  CTS_RTS_GPS = 2,
85  CTS_RTS_RADIO_TIME_SIGNAL = 3,
86  CTS_RTS_MANUAL = 4,
87  CTS_RTS_ATOMIC_CLOCK = 5,
88  CTS_RTS_CELULAR_NETOWRK = 6,
90 
92 typedef struct {
93  svc_date_time_t date_time;
94  uint8_t day_of_week;
95  uint8_t fractions_256;
96  cts_adjust_reason_t adjust_reason;
98 
100 typedef struct {
101  /*
102  * values for \p time_zone as definied by specification
103  * helper function cts_get_time_zone() can be used to calculate value
104  */
105  int8_t time_zone;
106  cts_dst_t dst;
108 
110 typedef struct {
117  uint8_t accuracy;
121  uint8_t hours_since_update;
123 
124 typedef void (* cts_get_time_cb_t) (ble_service_t *svc, uint16_t conn_idx);
125 
126 typedef void (* cts_set_time_cb_t) (ble_service_t *svc, uint16_t conn_idx,
127  const cts_current_time_t *time);
128 
129 typedef void (* cts_set_local_time_info_cb_t) (ble_service_t *svc, uint16_t conn_idx,
130  const cts_local_time_info_t *info);
131 
132 typedef void (* cts_get_ref_time_info_cb_t) (ble_service_t *svc, uint16_t conn_idx);
133 
135 typedef struct {
137  cts_get_time_cb_t get_time;
138 
140  cts_set_time_cb_t set_time;
141 
145  cts_set_local_time_info_cb_t set_local_time_info;
146 
149  cts_get_ref_time_info_cb_t get_ref_time_info;
151 
165 
174 void cts_notify_time(ble_service_t *svc, uint16_t conn_idx, const cts_current_time_t *time);
175 
184 
193 
203 void cts_get_time_cfm(ble_service_t *svc, uint16_t conn_idx, att_error_t status,
204  const cts_current_time_t *time);
205 
214 void cts_set_time_cfm(ble_service_t *svc, uint16_t conn_idx, att_error_t status);
215 
224 void cts_set_local_time_info_cfm(ble_service_t *svc, uint16_t conn_idx, att_error_t status);
225 
235 void cts_get_ref_time_info_cfm(ble_service_t *svc, uint16_t conn_idx, att_error_t status,
236  const cts_ref_time_info_t *info);
237 
251 __STATIC_INLINE int8_t cts_get_time_zone(int8_t h, uint8_t m)
252 {
253  return h * 4 + (m / 15) * (h < 0 ? -1 : 1);
254 }
255 
265 __STATIC_INLINE bool cts_get_time_zone_offset(int8_t tz, int8_t *h, int8_t *m)
266 {
267  if (tz == -128) {
268  return false;
269  }
270 
271  if (h) {
272  *h = tz / 4;
273  }
274 
275  if (m) {
276  *m = (tz % 4) * 15;
277  }
278 
279  return true;
280 }
281 
290 __STATIC_INLINE bool cts_is_current_time_valid(const cts_current_time_t *time)
291 {
292  return (((time->date_time.year >= 1582) && (time->date_time.year <= 9999))
293  || (time->date_time.year == 0)) &&
294  (time->date_time.month <= 12) && (time->date_time.day <= 31) &&
295  (time->date_time.hours <= 23) && (time->date_time.minutes <= 59) &&
296  (time->date_time.seconds <= 59) && (time->day_of_week <= 7);
297 }
298 
307 __STATIC_INLINE bool cts_is_local_time_info_valid(const cts_local_time_info_t *info)
308 {
309  return (((info->time_zone >= -48) && (info->time_zone <= 56)) || (info->time_zone == -128)) &&
310  (info->dst >= 0) && (info->dst <= 8);
311 }
312 
313 #endif /* CTS_H_ */
314 
cts_ref_time_info_t::days_since_update
uint8_t days_since_update
Definition: cts.h:119
svc_date_time_t::seconds
uint8_t seconds
Definition: svc_types.h:68
cts_error
cts_error
Definition: cts.h:58
cts_current_time_t::fractions_256
uint8_t fractions_256
Definition: cts.h:95
cts_set_time_cfm
void cts_set_time_cfm(ble_service_t *svc, uint16_t conn_idx, att_error_t status)
cts_get_time_cfm
void cts_get_time_cfm(ble_service_t *svc, uint16_t conn_idx, att_error_t status, const cts_current_time_t *time)
svc_types.h
Characteristics common types.
svc_date_time_t::minutes
uint8_t minutes
Definition: svc_types.h:67
cts_set_local_time_info_cfm
void cts_set_local_time_info_cfm(ble_service_t *svc, uint16_t conn_idx, att_error_t status)
cts_ref_time_source_t
cts_ref_time_source_t
Definition: cts.h:81
att_error_t
att_error_t
Definition: ble_att.h:64
cts_notify_time_all
void cts_notify_time_all(ble_service_t *svc, const cts_current_time_t *time)
cts_ref_time_info_t
Definition: cts.h:110
cts_is_local_time_info_valid
__STATIC_INLINE bool cts_is_local_time_info_valid(const cts_local_time_info_t *info)
Definition: cts.h:307
cts_local_time_info_t
Definition: cts.h:100
svc_date_time_t
Definition: svc_types.h:62
svc_date_time_t::day
uint8_t day
Definition: svc_types.h:65
ble_service.h
Services handling routines API.
cts_callbacks_t
Definition: cts.h:135
cts_current_time_t::day_of_week
uint8_t day_of_week
Definition: cts.h:94
cts_get_time_zone
__STATIC_INLINE int8_t cts_get_time_zone(int8_t h, uint8_t m)
Definition: cts.h:251
cts_get_ref_time_info_cfm
void cts_get_ref_time_info_cfm(ble_service_t *svc, uint16_t conn_idx, att_error_t status, const cts_ref_time_info_t *info)
cts_get_time_zone_offset
__STATIC_INLINE bool cts_get_time_zone_offset(int8_t tz, int8_t *h, int8_t *m)
Definition: cts.h:265
cts_notify_time
void cts_notify_time(ble_service_t *svc, uint16_t conn_idx, const cts_current_time_t *time)
svc_date_time_t::month
uint8_t month
Definition: svc_types.h:64
cts_init
ble_service_t * cts_init(const cts_local_time_info_t *info, const cts_callbacks_t *cb)
cts_adjust_reason_t
cts_adjust_reason_t
Definition: cts.h:63
cts_current_time_t
Definition: cts.h:92
cts_is_current_time_valid
__STATIC_INLINE bool cts_is_current_time_valid(const cts_current_time_t *time)
Definition: cts.h:290
svc_date_time_t::year
uint16_t year
Definition: svc_types.h:63
cts_ref_time_info_t::source
cts_ref_time_source_t source
Definition: cts.h:111
svc_date_time_t::hours
uint8_t hours
Definition: svc_types.h:66
cts_set_local_time_info
void cts_set_local_time_info(ble_service_t *svc, const cts_local_time_info_t *info)
cts_ref_time_info_t::accuracy
uint8_t accuracy
Definition: cts.h:117
cts_dst_t
cts_dst_t
Definition: cts.h:72
ble_service
Definition: ble_service.h:132