nrfxlib API 0.1.0
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
120#define NRF_RPC_CBOR_ALLOC(_group, _ctx, _len) \
121 do { \
122 nrf_rpc_alloc_tx_buf(_group, &((_ctx).out_packet), (_len) + 1); \
123 _nrf_rpc_cbor_prepare((struct nrf_rpc_cbor_ctx *)(&(_ctx)), (_len) + 1); \
124 } while (0)
125
134#define NRF_RPC_CBOR_DISCARD(_group, _ctx) \
135 nrf_rpc_free_tx_buf(_group, (_ctx).out_packet)
136
144
158int nrf_rpc_cbor_cmd(const struct nrf_rpc_group *group, uint8_t cmd,
159 struct nrf_rpc_cbor_ctx *ctx,
160 nrf_rpc_cbor_handler_t handler, void *handler_data);
161
176int nrf_rpc_cbor_cmd_rsp(const struct nrf_rpc_group *group, uint8_t cmd,
177 struct nrf_rpc_cbor_ctx *ctx);
178
194void nrf_rpc_cbor_cmd_no_err(const struct nrf_rpc_group *group, uint8_t cmd,
195 struct nrf_rpc_cbor_ctx *ctx,
197 void *handler_data);
198
210 uint8_t cmd, struct nrf_rpc_cbor_ctx *ctx);
211
221int nrf_rpc_cbor_evt(const struct nrf_rpc_group *group, uint8_t evt,
222 struct nrf_rpc_cbor_ctx *ctx);
223
234void nrf_rpc_cbor_evt_no_err(const struct nrf_rpc_group *group, uint8_t evt,
235 struct nrf_rpc_cbor_ctx *ctx);
236
245int nrf_rpc_cbor_rsp(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx);
246
256void nrf_rpc_cbor_rsp_no_err(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx);
257
270void nrf_rpc_cbor_decoding_done(const struct nrf_rpc_group *group, struct nrf_rpc_cbor_ctx *ctx);
271
272/* Functions used internally by the macros, not intended to be used directly. */
273void _nrf_rpc_cbor_prepare(struct nrf_rpc_cbor_ctx *ctx, size_t len);
274void _nrf_rpc_cbor_proxy_handler(const struct nrf_rpc_group *group, const uint8_t *packet,
275 size_t len, void *handler_data);
276
281#ifdef __cplusplus
282}
283#endif
284
285#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