nrfxlib API 2.8.99
Loading...
Searching...
No Matches
nrf_rpc_cbor.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5 */
6
7#ifndef _NRF_RPC_CBOR_H_
8#define _NRF_RPC_CBOR_H_
9
10#include <stdint.h>
11#include <stdbool.h>
12#include <stddef.h>
13
14#include <zcbor_common.h>
15#include <zcbor_decode.h>
16#include <zcbor_encode.h>
17
18#include <nrf_rpc.h>
19
20/* Max ZCBOR states: 2 means that no backups are available but we can use constant state
21 * to enable stop_on_error.
22 */
23#define NRF_RPC_ZCBOR_STATES (2 + CONFIG_NRF_RPC_ZCBOR_BACKUPS)
24
33#ifdef __cplusplus
34extern "C" {
35#endif
36
37struct nrf_rpc_cbor_ctx;
38
45typedef void (*nrf_rpc_cbor_handler_t)(const struct nrf_rpc_group *group,
46 struct nrf_rpc_cbor_ctx *ctx, void *handler_data);
47
48/* Structure used internally to define TinCBOR command or event decoder. */
49struct _nrf_rpc_cbor_decoder {
51 void *handler_data;
52 bool decoding_done_required;
53};
54
61 zcbor_state_t zs[NRF_RPC_ZCBOR_STATES];
62 union {
63 uint8_t *out_packet;
64 const uint8_t *in_packet;
65 };
66};
67
77#define NRF_RPC_CBOR_CMD_DECODER(_group, _name, _cmd, _handler, _data) \
78 static const \
79 struct _nrf_rpc_cbor_decoder NRF_RPC_CONCAT(_name, _cbor_data) = { \
80 .handler = _handler, \
81 .handler_data = _data, \
82 .decoding_done_required = true, \
83 }; \
84 NRF_RPC_CMD_DECODER(_group, _name, _cmd, _nrf_rpc_cbor_proxy_handler, \
85 (void *)&NRF_RPC_CONCAT(_name, _cbor_data))
86
96#define NRF_RPC_CBOR_EVT_DECODER(_group, _name, _evt, _handler, _data) \
97 static const \
98 struct _nrf_rpc_cbor_decoder NRF_RPC_CONCAT(_name, _cbor_data) = { \
99 .handler = _handler, \
100 .handler_data = _data, \
101 .decoding_done_required = true, \
102 }; \
103 NRF_RPC_EVT_DECODER(_group, _name, _evt, _nrf_rpc_cbor_proxy_handler, \
104 (void *)&NRF_RPC_CONCAT(_name, _cbor_data))
105
119#define NRF_RPC_CBOR_ALLOC(_group, _ctx, _len) \
120 do { \
121 nrf_rpc_alloc_tx_buf(_group, &((_ctx).out_packet), (_len) + 1); \
122 _nrf_rpc_cbor_prepare((struct nrf_rpc_cbor_ctx *)(&(_ctx)), (_len) + 1); \
123 } while (0)
124
133#define NRF_RPC_CBOR_DISCARD(_group, _ctx) \
134 nrf_rpc_free_tx_buf(_group, (_ctx).out_packet)
135
143
157int nrf_rpc_cbor_cmd(const struct nrf_rpc_group *group, uint8_t cmd,
158 struct nrf_rpc_cbor_ctx *ctx,
159 nrf_rpc_cbor_handler_t handler, void *handler_data);
160
175int nrf_rpc_cbor_cmd_rsp(const struct nrf_rpc_group *group, uint8_t cmd,
176 struct nrf_rpc_cbor_ctx *ctx);
177
193void nrf_rpc_cbor_cmd_no_err(const struct nrf_rpc_group *group, uint8_t cmd,
194 struct nrf_rpc_cbor_ctx *ctx,
196 void *handler_data);
197
209 uint8_t cmd, struct nrf_rpc_cbor_ctx *ctx);
210
220int nrf_rpc_cbor_evt(const struct nrf_rpc_group *group, uint8_t evt,
221 struct nrf_rpc_cbor_ctx *ctx);
222
233void nrf_rpc_cbor_evt_no_err(const struct nrf_rpc_group *group, uint8_t evt,
234 struct nrf_rpc_cbor_ctx *ctx);
235
244int nrf_rpc_cbor_rsp(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx);
245
255void nrf_rpc_cbor_rsp_no_err(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx);
256
269void nrf_rpc_cbor_decoding_done(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx);
270
271/* Functions used internally by the macros, not intended to be used directly. */
272void _nrf_rpc_cbor_prepare(struct nrf_rpc_cbor_ctx *ctx, size_t len);
273void _nrf_rpc_cbor_proxy_handler(const struct nrf_rpc_group *group, const uint8_t *packet,
274 size_t len, void *handler_data);
275
280#ifdef __cplusplus
281}
282#endif
283
284#endif /* _NRF_RPC_CBOR_H_ */
void nrf_rpc_cbor_decoding_done(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx)
Indicate that decoding of the input packet is done.
int nrf_rpc_cbor_cmd_rsp(const struct nrf_rpc_group *group, uint8_t cmd, struct nrf_rpc_cbor_ctx *ctx)
Send a command and get response as an output parameter.
int nrf_rpc_cbor_rsp(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx)
Send a response.
void nrf_rpc_cbor_evt_no_err(const struct nrf_rpc_group *group, uint8_t evt, struct nrf_rpc_cbor_ctx *ctx)
Send an event and pass any error to an error handler.
bool nrf_rpc_cbor_is_alloc(struct nrf_rpc_cbor_ctx *ctx)
Check that the memory for a packet has been allocated.
int nrf_rpc_cbor_evt(const struct nrf_rpc_group *group, uint8_t evt, struct nrf_rpc_cbor_ctx *ctx)
Send an event.
void(* nrf_rpc_cbor_handler_t)(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx, void *handler_data)
Callback that handles decoding of commands, events and responses.
Definition nrf_rpc_cbor.h:45
void nrf_rpc_cbor_cmd_no_err(const struct nrf_rpc_group *group, uint8_t cmd, struct nrf_rpc_cbor_ctx *ctx, nrf_rpc_cbor_handler_t handler, void *handler_data)
Send a command, provide callback to handle response and pass any error to an error handler.
void nrf_rpc_cbor_cmd_rsp_no_err(const struct nrf_rpc_group *group, uint8_t cmd, struct nrf_rpc_cbor_ctx *ctx)
Send a command, get response as an output parameter and pass any error to an error handler.
void nrf_rpc_cbor_rsp_no_err(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx)
Send a response and pass any error to an error handler.
int nrf_rpc_cbor_cmd(const struct nrf_rpc_group *group, uint8_t cmd, struct nrf_rpc_cbor_ctx *ctx, nrf_rpc_cbor_handler_t handler, void *handler_data)
Send a command and provide callback to handle response.
#define NRF_RPC_ZCBOR_STATES
Definition nrf_rpc_cbor.h:23
const uint8_t * in_packet
Definition nrf_rpc_cbor.h:64
uint8_t * out_packet
Definition nrf_rpc_cbor.h:63
zcbor_state_t zs[(2+CONFIG_NRF_RPC_ZCBOR_BACKUPS)]
Definition nrf_rpc_cbor.h:61
Context for encoding and sending commands, events and responses.
Definition nrf_rpc_cbor.h:60
Defines a group of commands and events.
Definition nrf_rpc.h:139