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