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_gdfs.h>
10
11 typedef struct {
12 nrfs_gdfs_evt_handler_t handler;
13 bool is_initialized;
14 } nrfs_gdfs_cb_t;
15 static nrfs_gdfs_cb_t m_cb;
16
nrfs_gdfs_service_notify(void * p_notification,size_t size)17 void nrfs_gdfs_service_notify(void *p_notification, size_t size)
18 {
19 if (!m_cb.handler || !m_cb.is_initialized) {
20 return;
21 }
22
23 nrfs_gdfs_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_GDFS_EVT_REJECT;
27 m_cb.handler(&evt, (void *)p_data->ctx.ctx);
28 return;
29 }
30
31 nrfs_gdfs_rsp_t *p_rsp = (nrfs_gdfs_rsp_t *)p_notification;
32 switch (p_data->hdr.req) {
33 case NRFS_GDFS_REQ_FREQ:
34 evt.type = NRFS_GDFS_EVT_FREQ_CONFIRMED;
35 m_cb.handler(&evt, (void *)p_rsp->ctx.ctx);
36 break;
37
38 default:
39 break;
40 }
41 }
42
nrfs_gdfs_init(nrfs_gdfs_evt_handler_t handler)43 nrfs_err_t nrfs_gdfs_init(nrfs_gdfs_evt_handler_t handler)
44 {
45 if (m_cb.is_initialized) {
46 return NRFS_ERR_INVALID_STATE;
47 }
48
49 m_cb.handler = handler;
50 m_cb.is_initialized = true;
51 return NRFS_SUCCESS;
52 }
53
nrfs_gdfs_uninit(void)54 void nrfs_gdfs_uninit(void)
55 {
56 m_cb.is_initialized = false;
57 }
58
nrfs_gdfs_request_freq(enum gdfs_frequency_setting target_freq,void * p_context)59 nrfs_err_t nrfs_gdfs_request_freq(enum gdfs_frequency_setting target_freq, void *p_context)
60 {
61 if (!m_cb.is_initialized) {
62 return NRFS_ERR_INVALID_STATE;
63 }
64
65 nrfs_gdfs_req_t req;
66
67 NRFS_SERVICE_HDR_FILL(&req, NRFS_GDFS_REQ_FREQ);
68 req.ctx.ctx = (uint32_t)p_context;
69 req.data.target_freq = target_freq;
70
71 return nrfs_backend_send(&req, sizeof(req));
72 }
73
nrfs_gdfs_request_freq_no_rsp(enum gdfs_frequency_setting target_freq,void * p_context)74 nrfs_err_t nrfs_gdfs_request_freq_no_rsp(enum gdfs_frequency_setting target_freq,
75 void *p_context)
76 {
77 if (!m_cb.is_initialized) {
78 return NRFS_ERR_INVALID_STATE;
79 }
80
81 nrfs_gdfs_req_t req;
82
83 NRFS_SERVICE_HDR_FILL(&req, NRFS_GDFS_REQ_FREQ);
84 NRFS_HDR_NO_RSP_SET(&req.hdr);
85 req.ctx.ctx = (uint32_t)p_context;
86 req.data.target_freq = target_freq;
87
88 return nrfs_backend_send(&req, sizeof(req));
89 }
90