storage.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Pavel Kirienko <pavel.kirienko@gmail.com>
3  */
4 
5 #ifndef UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_SERVER_CENTRALIZED_STORAGE_HPP_INCLUDED
6 #define UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_SERVER_CENTRALIZED_STORAGE_HPP_INCLUDED
7 
9 #include <uavcan/debug.hpp>
12 #include <uavcan/util/bitset.hpp>
13 
14 namespace uavcan
15 {
16 namespace dynamic_node_id_server
17 {
18 namespace centralized
19 {
24 class Storage
25 {
30 
33 
34  static IStorageBackend::String getOccupationMaskKey() { return "occupation_mask"; }
35 
37  {
38  OccupationMask mask;
39  for (uint8_t byte = 0; byte < array.size(); byte++)
40  {
41  for (uint8_t bit = 0; bit < 8; bit++)
42  {
43  mask[byte * 8U + bit] = (array[byte] & (1U << bit)) != 0;
44  }
45  }
46  return mask;
47  }
48 
50  {
51  OccupationMaskArray array;
52  for (uint8_t byte = 0; byte < array.size(); byte++)
53  {
54  for (uint8_t bit = 0; bit < 8; bit++)
55  {
56  if (mask[byte * 8U + bit])
57  {
58  array[byte] = static_cast<uint8_t>(array[byte] | (1U << bit));
59  }
60  }
61  }
62  return array;
63  }
64 
65 public:
67  storage_(storage)
68  { }
69 
73  int init()
74  {
76  OccupationMaskArray array;
77  io.get(getOccupationMaskKey(), array);
79  return 0;
80  }
81 
86  int add(const NodeID node_id, const UniqueID& unique_id)
87  {
88  if (!node_id.isUnicast())
89  {
90  return -ErrInvalidParam;
91  }
92 
94 
95  // If next operations fail, we'll get a dangling entry, but it's absolutely OK.
96  {
97  uint32_t node_id_int = node_id.get();
98  int res = io.setAndGetBack(StorageMarshaller::convertUniqueIDToHex(unique_id), node_id_int);
99  if (res < 0)
100  {
101  return res;
102  }
103  if (node_id_int != node_id.get())
104  {
105  return -ErrFailure;
106  }
107  }
108 
109  // Updating the mask in the storage
110  OccupationMask new_occupation_mask = occupation_mask_;
111  new_occupation_mask[node_id.get()] = true;
112  OccupationMaskArray occupation_array = maskToArray(new_occupation_mask);
113 
114  int res = io.setAndGetBack(getOccupationMaskKey(), occupation_array);
115  if (res < 0)
116  {
117  return res;
118  }
119  if (occupation_array != maskToArray(new_occupation_mask))
120  {
121  return -ErrFailure;
122  }
123 
124  // Updating the cached mask only if the storage was updated successfully
125  occupation_mask_ = new_occupation_mask;
126 
127  return 0;
128  }
129 
133  NodeID getNodeIDForUniqueID(const UniqueID& unique_id) const
134  {
136  uint32_t node_id = 0;
137  io.get(StorageMarshaller::convertUniqueIDToHex(unique_id), node_id);
138  return (node_id > 0 && node_id <= NodeID::Max) ? NodeID(static_cast<uint8_t>(node_id)) : NodeID();
139  }
140 
141  bool isNodeIDOccupied(NodeID node_id) const { return occupation_mask_[node_id.get()]; }
142 
143  uint8_t getSize() const { return static_cast<uint8_t>(occupation_mask_.count()); }
144 };
145 
146 }
147 }
148 }
149 
150 #endif // Include guard
uavcan::dynamic_node_id_server::centralized::Storage::occupation_mask_
OccupationMask occupation_mask_
Definition: storage.hpp:32
uavcan::Array::size
EnableIf< sizeof((reinterpret_cast< const R * >0)) -> size()) &&sizeof((*(reinterpret_cast< const R * >(0)))[0])
uavcan::dynamic_node_id_server::centralized::Storage::maskToArray
static OccupationMaskArray maskToArray(const OccupationMask &mask)
Definition: storage.hpp:49
debug.hpp
uavcan::uint32_t
std::uint32_t uint32_t
Definition: std.hpp:26
uavcan::NodeID::get
uint8_t get() const
Definition: transfer.hpp:132
uavcan::dynamic_node_id_server::centralized::Storage::OccupationMask
BitSet< NodeID::Max+1 > OccupationMask
Definition: storage.hpp:26
uavcan::NodeID
Definition: transfer.hpp:112
uavcan::dynamic_node_id_server::StorageMarshaller
Definition: storage_marshaller.hpp:25
uavcan::dynamic_node_id_server::centralized::Storage::maskFromArray
static OccupationMask maskFromArray(const OccupationMaskArray &array)
Definition: storage.hpp:36
uavcan::BitLenToByteLen
Definition: type_util.hpp:42
event.hpp
uavcan::dynamic_node_id_server::StorageMarshaller::setAndGetBack
int setAndGetBack(const IStorageBackend::String &key, uint32_t &inout_value)
Definition: storage_marshaller.hpp:62
uavcan::BitSet::count
std::size_t count() const
Definition: bitset.hpp:124
uavcan::dynamic_node_id_server::StorageMarshaller::get
int get(const IStorageBackend::String &key, uint32_t &out_value) const
Definition: storage_marshaller.hpp:90
uavcan::ArrayModeStatic
@ ArrayModeStatic
Definition: array.hpp:35
uavcan::dynamic_node_id_server::centralized::Storage
Definition: storage.hpp:24
uavcan::dynamic_node_id_server::centralized::Storage::init
int init()
Definition: storage.hpp:73
uavcan::dynamic_node_id_server::centralized::Storage::isNodeIDOccupied
bool isNodeIDOccupied(NodeID node_id) const
Definition: storage.hpp:141
uavcan::Array
Definition: array.hpp:424
uavcan::dynamic_node_id_server::centralized::Storage::storage_
IStorageBackend & storage_
Definition: storage.hpp:31
uavcan::uint8_t
std::uint8_t uint8_t
Definition: std.hpp:24
uavcan::dynamic_node_id_server::StorageMarshaller::convertUniqueIDToHex
static IStorageBackend::String convertUniqueIDToHex(const UniqueID &key)
Definition: storage_marshaller.hpp:44
uavcan::dynamic_node_id_server::IStorageBackend
Definition: storage_backend.hpp:22
bitset.hpp
uavcan::NodeID::isUnicast
bool isUnicast() const
Definition: transfer.hpp:136
uavcan::dynamic_node_id_server::centralized::Storage::getOccupationMaskKey
static IStorageBackend::String getOccupationMaskKey()
Definition: storage.hpp:34
build_config.hpp
uavcan::BitSet< NodeID::Max+1 >
uavcan::dynamic_node_id_server::centralized::Storage::getSize
uint8_t getSize() const
Definition: storage.hpp:143
uavcan::NodeID::Max
static const uint8_t Max
Definition: transfer.hpp:120
uavcan::dynamic_node_id_server::centralized::Storage::Storage
Storage(IStorageBackend &storage)
Definition: storage.hpp:66
uavcan
Definition: libuavcan/libuavcan/include/uavcan/build_config.hpp:204
uavcan::dynamic_node_id_server::centralized::Storage::add
int add(const NodeID node_id, const UniqueID &unique_id)
Definition: storage.hpp:86
storage_marshaller.hpp
uavcan::dynamic_node_id_server::UniqueID
protocol::dynamic_node_id::server::Entry::FieldTypes::unique_id UniqueID
Definition: protocol/dynamic_node_id_server/types.hpp:22
uavcan::dynamic_node_id_server::centralized::Storage::OccupationMaskArray
Array< IntegerSpec< 8, SignednessUnsigned, CastModeSaturate >, ArrayModeStatic, BitLenToByteLen< NodeID::Max+1 >::Result > OccupationMaskArray
Definition: storage.hpp:29
uavcan::dynamic_node_id_server::centralized::Storage::getNodeIDForUniqueID
NodeID getNodeIDForUniqueID(const UniqueID &unique_id) const
Definition: storage.hpp:133


uavcan_communicator
Author(s):
autogenerated on Fri Dec 13 2024 03:10:03