Skip to content

Commit

Permalink
Use nnvg generated logic for serialisation/deserialisation for Version
Browse files Browse the repository at this point in the history
  • Loading branch information
aentinger committed Sep 15, 2020
1 parent 8107b51 commit 585eb05
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 40 deletions.
16 changes: 8 additions & 8 deletions extras/test/src/test_Version.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,8 @@ static CanardPortID const VERSION_PORT_ID = 12345;
**************************************************************************************/

static util::CanFrame can_frame;
static uint8_t version_major = 0;
static uint8_t version_minor = 0;
static CanardNodeID version_node_id = 0;
uavcan_node_Version_1_0 version;
static CanardNodeID version_node_id = 0;

/**************************************************************************************
* PRIVATE FUNCTION DEFINITION
Expand All @@ -45,11 +44,11 @@ static bool transmitCanFrame(uint32_t const id, uint8_t const * data, uint8_t co

void onVersion_1_0_Received(CanardTransfer const & transfer, ArduinoUAVCAN & /* uavcan */)
{
Version_1_0<VERSION_PORT_ID> const version = Version_1_0<VERSION_PORT_ID>::create(transfer);
Version_1_0<VERSION_PORT_ID> const received_version = Version_1_0<VERSION_PORT_ID>::create(transfer);

version_node_id = transfer.remote_node_id;
version_major = version.get_major();
version_minor = version.get_minor();
version.major = received_version.data.major;
version.minor = received_version.data.minor;
}

/**************************************************************************************
Expand All @@ -72,6 +71,7 @@ TEST_CASE("A 'Version.1.0.uavcan' message is sent", "[version-01]")

TEST_CASE("A 'Version.1.0.uavcan' message is received", "[version-02]")
{
uavcan_node_Version_1_0_init(&version);
ArduinoUAVCAN uavcan(util::LOCAL_NODE_ID, util::micros, transmitCanFrame);

REQUIRE(uavcan.subscribe<Version_1_0<VERSION_PORT_ID>>(onVersion_1_0_Received));
Expand All @@ -82,6 +82,6 @@ TEST_CASE("A 'Version.1.0.uavcan' message is received", "[version-02]")
uavcan.onCanFrameReceived(0x1030391B, data, sizeof(data));

REQUIRE(version_node_id == 27);
REQUIRE(version_major == 0x13);
REQUIRE(version_minor == 0x37);
REQUIRE(version.major == 0x13);
REQUIRE(version.minor == 0x37);
}
23 changes: 5 additions & 18 deletions src/types/uavcan/node/Version.1.0.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@
* INCLUDE
**************************************************************************************/

#include <stdlib.h>

#include <libcanard/canard.h>

#include "Version.1.0.nnvg.h"

/**************************************************************************************
* CLASS DECLARATION
**************************************************************************************/
Expand All @@ -26,30 +26,17 @@ class Version_1_0

public:

uavcan_node_Version_1_0 data;

static constexpr CanardPortID PORT_ID = ID;
static constexpr size_t MAX_PAYLOAD_SIZE = 2;
static constexpr size_t MAX_PAYLOAD_SIZE = uavcan_node_Version_1_0_MAX_SERIALIZED_REPRESENTATION_SIZE_BYTES;
static constexpr CanardTransferKind TRANSFER_KIND = CanardTransferKindMessage;


Version_1_0(uint8_t const major, uint8_t const minor);

static Version_1_0 create(CanardTransfer const & transfer);


size_t encode(uint8_t * payload) const;


inline uint8_t get_major() const { return _major; }
inline uint8_t get_minor() const { return _minor; }

inline void set_major(uint8_t const major) { _major = major; }
inline void set_minor(uint8_t const minor) { _minor = minor; }


private:

uint8_t _major, _minor;

};

/**************************************************************************************
Expand Down
21 changes: 7 additions & 14 deletions src/types/uavcan/node/Version.1.0.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,6 @@
* Contributors: https://github.com/107-systems/107-Arduino-UAVCAN/graphs/contributors.
*/

/**************************************************************************************
* INCLUDE
**************************************************************************************/

#include <libcanard/canard_dsdl.h>

/**************************************************************************************
* STATIC CONSTEXPR DEFINITION
**************************************************************************************/
Expand All @@ -25,8 +19,7 @@ template <CanardPortID ID> constexpr CanardTransferKind Version_1_0<ID>::TRANSFE

template <CanardPortID ID>
Version_1_0<ID>::Version_1_0(uint8_t const major, uint8_t const minor)
: _major(major)
, _minor(minor)
: data{major, minor}
{

}
Expand All @@ -38,15 +31,15 @@ Version_1_0<ID>::Version_1_0(uint8_t const major, uint8_t const minor)
template <CanardPortID ID>
Version_1_0<ID> Version_1_0<ID>::create(CanardTransfer const & transfer)
{
uint8_t const major = canardDSDLGetU8(reinterpret_cast<uint8_t const *>(transfer.payload), transfer.payload_size, 0, 8);
uint8_t const minor = canardDSDLGetU8(reinterpret_cast<uint8_t const *>(transfer.payload), transfer.payload_size, 8, 8);
return Version_1_0<ID>(major, minor);
uavcan_node_Version_1_0 d;
uavcan_node_Version_1_0_init(&d);
uavcan_node_Version_1_0_deserialize(&d, 0, (uint8_t *)(transfer.payload), transfer.payload_size);
return Version_1_0<ID>(d.major, d.minor);
}

template <CanardPortID ID>
size_t Version_1_0<ID>::encode(uint8_t * payload) const
{
canardDSDLSetUxx(payload, 0, _major, 8);
canardDSDLSetUxx(payload, 8, _minor, 8);
return MAX_PAYLOAD_SIZE;
size_t const offset = uavcan_node_Version_1_0_serialize(&data, 0, payload);
return (offset / 8);
}
121 changes: 121 additions & 0 deletions src/types/uavcan/node/Version.1.0.nnvg.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
// UAVCAN data structure definition. +-+ +-+
// | | | |
// AUTOGENERATED, DO NOT EDIT. \ - /
// ---
// o
// +------------------------------------------------------------------------------------------------------------------+
//
// Generator:
// nunavut-0.3.9 (serialization was enabled)
//
//
// Source File:
// /home/alex/projects/107-systems/public_regulated_data_types/uavcan/node/Version.1.0.uavcan
//
// Template:
// StructureType.j2
//
// Generated at: 2020-09-15 13:51:28.069217 UTC
// Is deprecated: no
// Fixed port ID: None
// Full name: uavcan.node.Version
// Version: 1.0

#ifndef UAVCAN_NODE_VERSION_1_0_INCLUDED
#define UAVCAN_NODE_VERSION_1_0_INCLUDED

#include <nunavut/support/serialization.h>
#include <stdint.h>
#include <stdlib.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


typedef struct
{
uint8_t major;
uint8_t minor;
} uavcan_node_Version_1_0;

/// Initialize an uavcan_node_Version_1_0 instance to default values.
/// No memory is allocated within this method.
/// Does nothing if @ref out_instance is NULL.
///
/// @param out_instance A structure instance to Initialize.
static inline void uavcan_node_Version_1_0_init(uavcan_node_Version_1_0* const out_instance)
{
if (out_instance != NULL)
{
out_instance->major = 0;
out_instance->minor = 0;
}
}

/// Contains the maximum number of bytes needed to serialize a(n) uavcan_node_Version_1_0
/// instance.
#define uavcan_node_Version_1_0_MAX_SERIALIZED_REPRESENTATION_SIZE_BYTES \
(2U)


/// Serialization of uavcan_node_Version_1_0 instance into a byte array.
///
/// @param in_instance A structure instance to serialize.
/// @param offset Offset (in bits) of data type in message.
/// @param out_buffer Output message buffer.
///
/// @returns Size of encoded data (in bits)
static inline int32_t uavcan_node_Version_1_0_serialize(const uavcan_node_Version_1_0* in_instance, uint32_t offset, uint8_t* const out_buffer)
{

if (out_buffer == NULL)
{
return -NUNAVUT_ERR_INVALID_BUF;
}

// Begin Structure: saturated uint8
nunavutSetUxx(out_buffer, offset, in_instance->major, 8);
offset += 8;
// End Structure: saturated uint8
// Begin Structure: saturated uint8
nunavutSetUxx(out_buffer, offset, in_instance->minor, 8);
offset += 8;
// End Structure: saturated uint8

return offset;
}

/// Deserialization of byte-array encoding into uavcan_node_Version_1_0 instance.
///
/// @param out_instance Structure instance to write data to.
/// @param offset Bit offset of structure in data buffer.
/// @param in_buffer Message buffer to deserialize.
/// @param buf_size_bytes Length of input buffer (in bytes) to avoid overflow.
///
/// @returns Size of decoded data (in bits)
static inline int32_t uavcan_node_Version_1_0_deserialize(uavcan_node_Version_1_0* const out_instance, uint32_t offset, uint8_t* const in_buffer, const size_t buf_size_bytes)
{

if (in_buffer == NULL)
{
return -NUNAVUT_ERR_INVALID_BUF;
}

// Begin Structure: saturated uint8
out_instance->major = nunavutGetU8(in_buffer, buf_size_bytes, offset, 8);
offset += 8;
// End Structure: saturated uint8
// Begin Structure: saturated uint8
out_instance->minor = nunavutGetU8(in_buffer, buf_size_bytes, offset, 8);
offset += 8;
// End Structure: saturated uint8

return offset;
}


#ifdef __cplusplus
} /* End extern "C" */
#endif /* __cplusplus */
#endif /* UAVCAN_NODE_VERSION_1_0_INCLUDED */

0 comments on commit 585eb05

Please sign in to comment.