202 lines
8.2 KiB
C
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_ */
|