src.dualinventive.com/fw/dncm/libdi/include/di/rpc/serialize.h

202 lines
8.2 KiB
C

/**
* @file include/di/rpc/serialize.h
* @brief rief
* @date Aug 25, 2015
* @author rheijden
* @copyright 2015 Dual Inventive Technology Centre B.V.
*
* descr
*/
#ifndef INCLUDE_DI_CAN_SERIALIZE_H_
#define INCLUDE_DI_CAN_SERIALIZE_H_
#include <stddef.h>
#include <stdint.h>
#include <mpack/mpack.h>
#include <di/rpc/structures.h>
#include <di/can.h>
#include <di/drv/hl854x.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* Serialize a RPC message with data payload using a initialized mpack writer
* @param writer Initialized messagepack writer
* @param msg RPC message header
* @param data Data payload
* @param len Data payload length
*/
void di_rpc_serialize_msg_data(mpack_writer_t *writer, const struct di_rpc_msg *msg,
const uint8_t *data, const size_t len);
/**
* Serialize a RPC message without a data payload using a initialized mpack writer
* @param writer Initialized messagepack writer
* @param msg RPC message header
* @param data Data payload
* @param len Data payload length
*/
static inline void di_rpc_serialize_msg(mpack_writer_t *writer, const struct di_rpc_msg *msg)
{
di_rpc_serialize_msg_data(writer, msg, NULL, 0);
}
void di_rpc_serialize_msg_start(mpack_writer_t *writer, struct di_rpc_msg *msg);
void di_rpc_serialize_msg_finish(mpack_writer_t *writer);
/** When info->version == NULL, then the software version string is automatically generated
*/
void di_rpc_serialize_item_device_info(mpack_writer_t *writer, const struct di_rpc_device_info *info);
/**
* Write device:data result item
* @param writer Messagepack writer
* @param data Device data to write
* @note When data->error property is false and data->errorn is set then error is written as true
*/
void di_rpc_serialize_item_device_data(mpack_writer_t *writer, const struct di_rpc_device_data *data);
void di_rpc_serialize_item_config_info(mpack_writer_t *writer, const struct di_rpc_config_info *info);
void di_rpc_serialize_item_log(mpack_writer_t *writer, const struct di_rpc_log *log);
void di_rpc_serialize_item_info(mpack_writer_t *writer, const struct di_rpc_info *info);
void di_rpc_serialize_item_data(mpack_writer_t *writer, const struct di_rpc_data *data);
void di_rpc_serialize_item_errno(mpack_writer_t *writer, const di_errno_t err);
void di_rpc_serialize_item_error(mpack_writer_t *writer, const struct di_rpc_error *error);
void di_rpc_serialize_item_connection_info(mpack_writer_t *writer, const struct di_rpc_connection_info *info);
void di_rpc_serialize_result_gps(mpack_writer_t *writer, const struct di_rpc_sensor_data_gps *value);
void di_rpc_serialize_result_can(mpack_writer_t *writer, const struct di_can_ctx *can);
void di_rpc_serialize_result_device_info(mpack_writer_t *writer, const struct di_rpc_device_info *info);
void di_rpc_serialize_result_info(mpack_writer_t *writer, const struct di_rpc_info *info);
void di_rpc_serialize_result_data(mpack_writer_t *writer, const struct di_rpc_data *data);
void di_rpc_serialize_result_connection_info(mpack_writer_t *writer, const struct di_rpc_connection_info *value);
void di_rpc_serialize_result_info_array(mpack_writer_t *writer, const struct di_rpc_info *info, uint32_t count);
void di_rpc_serialize_result_data_array(mpack_writer_t *writer, const struct di_rpc_data *data, uint32_t count);
void di_rpc_serialize_result_string_array(mpack_writer_t *writer, const char **strs, uint32_t count);
void di_rpc_serialize_result_config_info_array(mpack_writer_t *writer, const struct di_rpc_config_info *info,
const uint32_t count);
#define di_rpc_serialize_kv(writer, key, value) do { \
mpack_write_cstr(writer, key); \
mpack_write(writer, value); \
} while (0)
#define di_rpc_serialize_kv_nil(writer, key) do { \
mpack_write_cstr(writer, key); \
mpack_write_nil(writer); \
} while (0)
#ifndef __cplusplus
#define di_rpc_serialize_item(writer, structure) \
_Generic((structure), \
const struct di_rpc_info * : di_rpc_serialize_item_info, \
const struct di_rpc_data * : di_rpc_serialize_item_data, \
struct di_rpc_connection_info * : di_rpc_serialize_item_connection_info, \
const struct di_rpc_connection_info * : di_rpc_serialize_item_connection_info, \
const struct di_rpc_device_info * : di_rpc_serialize_item_device_info, \
struct di_rpc_device_data * : di_rpc_serialize_item_device_data, \
const struct di_rpc_device_data * : di_rpc_serialize_item_device_data, \
const struct di_rpc_config_info * : di_rpc_serialize_item_config_info, \
const struct di_rpc_log * : di_rpc_serialize_item_log, \
const struct di_rpc_error * : di_rpc_serialize_item_error \
)(writer, structure)
#define di_rpc_serialize_result(writer, result) \
_Generic((result), \
const struct di_rpc_info * : di_rpc_serialize_result_info, \
struct di_rpc_data * : di_rpc_serialize_result_data, \
const struct di_rpc_data * : di_rpc_serialize_result_data, \
const struct di_can_ctx * : di_rpc_serialize_result_can, \
struct di_rpc_device_info * : di_rpc_serialize_result_device_info, \
const struct di_rpc_device_info * : di_rpc_serialize_result_device_info, \
struct di_rpc_sensor_data_gps * : di_rpc_serialize_result_gps, \
const struct di_rpc_sensor_data_gps * : di_rpc_serialize_result_gps \
)(writer, result)
#define di_rpc_serialize_result_array(writer, result, count) \
_Generic((result), \
const struct di_rpc_data * : di_rpc_serialize_result_data_array, \
struct di_rpc_data * : di_rpc_serialize_result_data_array, \
const struct di_rpc_info * : di_rpc_serialize_result_info_array, \
struct di_rpc_info * : di_rpc_serialize_result_info_array, \
const struct di_rpc_config_info * : di_rpc_serialize_result_config_info_array, \
struct di_rpc_config_info * : di_rpc_serialize_result_config_info_array \
)(writer, result, count)
#else
} /* extern "C" */
static inline void di_rpc_serialize_item(mpack_writer_t *writer, const struct di_rpc_info *data)
{
di_rpc_serialize_item_info(writer, data);
}
static inline void di_rpc_serialize_item(mpack_writer_t *writer, const struct di_rpc_data *data)
{
di_rpc_serialize_item_data(writer, data);
}
static inline void di_rpc_serialize_item(mpack_writer_t *writer, const struct di_rpc_device_info *data)
{
di_rpc_serialize_item_device_info(writer, data);
}
static inline void di_rpc_serialize_item(mpack_writer_t *writer, const struct di_rpc_device_data *data)
{
di_rpc_serialize_item_device_data(writer, data);
}
static inline void di_rpc_serialize_item(mpack_writer_t *writer, const struct di_rpc_config_info *data)
{
di_rpc_serialize_item_config_info(writer, data);
}
static inline void di_rpc_serialize_item(mpack_writer_t *writer, const struct di_rpc_log *data)
{
di_rpc_serialize_item_log(writer, data);
}
static inline void di_rpc_serialize_item(mpack_writer_t *writer, const struct di_rpc_error *data)
{
di_rpc_serialize_item_error(writer, data);
}
static inline void di_rpc_serialize_result(mpack_writer_t *writer, const struct di_rpc_info *d)
{
di_rpc_serialize_result_info(writer, d);
}
static inline void di_rpc_serialize_result(mpack_writer_t *writer, const struct di_rpc_data *d)
{
di_rpc_serialize_result_data(writer, d);
}
static inline void di_rpc_serialize_result(mpack_writer_t *writer, const struct di_can_ctx *d)
{
di_rpc_serialize_result_can(writer, d);
}
static inline void di_rpc_serialize_result(mpack_writer_t *writer, const struct di_rpc_sensor_data_gps *data)
{
di_rpc_serialize_result_gps(writer, data);
}
static inline void di_rpc_serialize_result_array(mpack_writer_t *w, const struct di_rpc_info *info, uint32_t count)
{
di_rpc_serialize_result_info_array(w, info, count);
}
static inline void di_rpc_serialize_result_array(mpack_writer_t *w, const struct di_rpc_data *data, uint32_t count)
{
di_rpc_serialize_result_data_array(w, data, count);
}
#endif
#endif /* INCLUDE_DI_CAN_SERIALIZE_H_ */