/** * @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 #include #include #include #include #include #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_ */