1 /*
2 * Copyright (c) 2024 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <internal/nrfs_backend.h>
8 #include <internal/nrfs_callbacks.h>
9 #include <nrfs_temp.h>
10
11 typedef struct {
12 nrfs_temp_evt_handler_t handler;
13 bool is_initialized;
14 } nrfs_temp_cb_t;
15 static nrfs_temp_cb_t m_cb;
16
nrfs_temp_service_notify(void * p_notification,size_t size)17 void nrfs_temp_service_notify(void *p_notification, size_t size)
18 {
19 if (!m_cb.handler || !m_cb.is_initialized) {
20 return;
21 }
22
23 nrfs_temp_evt_t evt;
24 nrfs_generic_t *p_data = (nrfs_generic_t *)p_notification;
25 if (NRFS_HDR_FILTER_ERR_GET(&p_data->hdr)) {
26 evt.type = NRFS_TEMP_EVT_REJECT;
27 m_cb.handler(&evt, (void *)p_data->ctx.ctx);
28 return;
29 }
30
31 nrfs_temp_rsp_t *p_rsp = (nrfs_temp_rsp_t *)p_notification;
32 evt.raw_temp = p_rsp->data.raw_temp;
33 switch (p_data->hdr.req) {
34 case NRFS_TEMP_REQ_MEASURE:
35 evt.type = NRFS_TEMP_EVT_MEASURE_DONE;
36 m_cb.handler(&evt, (void *)p_rsp->ctx.ctx);
37 break;
38
39 case NRFS_TEMP_REQ_SUBSCRIBE:
40 evt.type = NRFS_TEMP_EVT_CHANGE;
41 m_cb.handler(&evt, (void *)p_rsp->ctx.ctx);
42 break;
43
44 default:
45 break;
46 }
47 }
48
nrfs_temp_init(nrfs_temp_evt_handler_t handler)49 nrfs_err_t nrfs_temp_init(nrfs_temp_evt_handler_t handler)
50 {
51 if (m_cb.is_initialized) {
52 return NRFS_ERR_INVALID_STATE;
53 }
54
55 m_cb.handler = handler;
56 m_cb.is_initialized = true;
57 return NRFS_SUCCESS;
58 }
59
nrfs_temp_uninit(void)60 void nrfs_temp_uninit(void)
61 {
62 m_cb.is_initialized = false;
63 }
64
nrfs_temp_measure_request(void * p_context)65 nrfs_err_t nrfs_temp_measure_request(void *p_context)
66 {
67 if (!m_cb.is_initialized) {
68 return NRFS_ERR_INVALID_STATE;
69 }
70
71 nrfs_temp_measure_t req;
72
73 NRFS_SERVICE_HDR_FILL(&req, NRFS_TEMP_REQ_MEASURE);
74 req.ctx.ctx = (uint32_t)p_context;
75
76 return nrfs_backend_send(&req, sizeof(req));
77 }
78
nrfs_temp_subscribe(uint16_t measure_rate_ms,int32_t lower_threshold,int32_t upper_threshold,void * p_context)79 nrfs_err_t nrfs_temp_subscribe(uint16_t measure_rate_ms,
80 int32_t lower_threshold,
81 int32_t upper_threshold,
82 void * p_context)
83 {
84 if (!m_cb.is_initialized) {
85 return NRFS_ERR_INVALID_STATE;
86 }
87
88 nrfs_temp_subscribe_t req;
89
90 NRFS_SERVICE_HDR_FILL(&req, NRFS_TEMP_REQ_SUBSCRIBE);
91 req.ctx.ctx = (uint32_t)p_context;
92 req.data.measure_rate_ms = measure_rate_ms;
93 req.data.lower_threshold = lower_threshold;
94 req.data.upper_threshold = upper_threshold;
95
96 return nrfs_backend_send(&req, sizeof(req));
97 }
98
nrfs_temp_unsubscribe(void)99 nrfs_err_t nrfs_temp_unsubscribe(void)
100 {
101 if (!m_cb.is_initialized) {
102 return NRFS_ERR_INVALID_STATE;
103 }
104
105 nrfs_temp_subscribe_t req;
106
107 NRFS_SERVICE_HDR_FILL(&req, NRFS_TEMP_REQ_UNSUBSCRIBE);
108
109 return nrfs_backend_send(&req, sizeof(req));
110 }
111