12 #include <boost/thread/condition_variable.hpp> 13 #include <boost/chrono/system_clocks.hpp> 14 #include <boost/lexical_cast.hpp> 20 inline time_point
get_abs_time(
const time_duration& timeout) {
return boost::chrono::high_resolution_clock::now() + timeout; }
21 inline time_point
get_abs_time() {
return boost::chrono::high_resolution_clock::now(); }
49 void abort(uint32_t reason);
61 : interface_(interface),
63 std::bind(&
SDOClient::read, this, std::placeholders::_1, std::placeholders::_2),
64 std::bind(&
SDOClient::write, this, std::placeholders::_1, std::placeholders::_2))
76 bool read(uint8_t* b,
const size_t len);
77 void write(
const uint8_t* b,
const size_t len);
82 Buffer(
const size_t sz) : size(sz), dirty(false), empty(true), buffer(sz) {}
94 void parse_and_set_mapping(
const ObjectStorageSharedPtr &storage,
const uint16_t &com_index,
const uint16_t &map_index,
const bool &read,
const bool &write);
104 TPDOSharedPtr tpdo(
new TPDO(interface));
105 if(!tpdo->init(storage, com_index, map_index))
120 RPDOSharedPtr rpdo(
new RPDO(interface));
121 if(!rpdo->init(storage, com_index, map_index))
136 std::unordered_set<RPDO::RPDOSharedPtr>
rpdos_;
137 std::unordered_set<TPDO::TPDOSharedPtr>
tpdos_;
183 virtual void addNode(
void *
const ptr) = 0;
184 virtual void removeNode(
void *
const ptr) = 0;
192 Unknown = 255, BootUp = 0, Stopped = 4, Operational = 5 , PreOperational = 127
197 const State getState();
198 void enterState(
const State &s);
215 return state_dispatcher_.createListener(s);
219 return getStorage()->entry<T>(k).
get();
232 template<
typename T>
int wait_for(
const State &s,
const T &timeout);
236 boost::condition_variable
cond;
247 void switchState(
const uint8_t &s);
256 bool checkHeartbeat();
263 void call(
void (T::*func)(
void)){
264 typename std::vector<MemberSharedPtr>::iterator it = elements.begin();
265 while(it != elements.end()){
270 template<
typename V>
void call(
void (T::*func)(
const V&),
const std::vector<V> &vs){
271 typename std::vector<MemberSharedPtr>::iterator it = elements.begin();
272 typename std::vector<V>::const_iterator it_v = vs.begin();
273 while(it_v != vs.end() && it != elements.end()){
274 ((**it).*func)(*it_v);
278 template<
typename V>
void call(
void (T::*func)(V&), std::vector<V> &vs){
279 vs.resize(elements.size());
281 typename std::vector<MemberSharedPtr>::iterator it = elements.begin();
282 typename std::vector<V>::iterator it_v = vs.begin();
283 while(it_v != vs.end() && it != elements.end()){
284 ((**it).*func)(*it_v);
288 void add(MemberSharedPtr t){
289 elements.push_back(t);
298 void start() { this->call(&T::start); }
299 void stop() { this->call(&T::stop); }
300 void reset() { this->call(&T::reset); }
316 virtual SyncLayerSharedPtr getSync(
const SyncProperties &properties) = 0;
static RPDOSharedPtr create(const can::CommInterfaceSharedPtr interface, const ObjectStorageSharedPtr &storage, const uint16_t &com_index, const uint16_t &map_index)
std::array< value_type, 8 > data
const SyncProperties properties
std::shared_ptr< const Listener > ListenerConstSharedPtr
std::atomic< bool > has_error_
ObjectStorage::Entry< ObjectStorage::DataType< ObjectDict::DEFTYPE_UNSIGNED16 >::type > heartbeat_
std::unordered_set< TPDO::TPDOSharedPtr > tpdos_
std::shared_ptr< TPDO > TPDOSharedPtr
const can::CommInterfaceSharedPtr interface_
ObjectStorage::Entry< uint8_t > num_errors_
std::shared_ptr< RPDO > RPDOSharedPtr
SyncCounter(const SyncProperties &p)
const can::Header header_
can::FrameListenerConstSharedPtr listener_
FrameOverlay(const Header &h)
std::shared_ptr< Master > MasterSharedPtr
can::BufferedReader reader_
RPDO(const can::CommInterfaceSharedPtr interface)
StateListener::ListenerConstSharedPtr StateListenerConstSharedPtr
void call(void(T::*func)(V &), std::vector< V > &vs)
std::unordered_set< RPDO::RPDOSharedPtr > rpdos_
const can::CommInterfaceSharedPtr interface_
can::FrameListenerConstSharedPtr emcy_listener_
boost::chrono::high_resolution_clock::time_point time_point
std::shared_ptr< SyncCounter > SyncCounterSharedPtr
const SyncCounterSharedPtr sync_
std::shared_ptr< CommInterface > CommInterfaceSharedPtr
boost::chrono::high_resolution_clock::duration time_duration
SyncLayer(const SyncProperties &p)
const can::CommInterfaceSharedPtr interface_
std::shared_ptr< T > MemberSharedPtr
std::shared_ptr< Buffer > BufferSharedPtr
const std::vector< typename Chain< T >::MemberSharedPtr > & getElements()
ObjectDict::ObjectDictSharedPtr ObjectDictSharedPtr
const ObjectStorageSharedPtr getStorage()
std::vector< BufferSharedPtr > buffers
FrameOverlay(const can::Frame &f)
bool operator==(const SyncProperties &p) const
const canopen::ObjectDict::Entry * current_entry
std::vector< MemberSharedPtr > elements
void call(void(T::*func)(const V &), const std::vector< V > &vs)
const can::CommInterfaceSharedPtr interface_
boost::chrono::high_resolution_clock::time_point heartbeat_timeout_
CommInterface::FrameListenerConstSharedPtr FrameListenerConstSharedPtr
uint8_t transmission_type
uint16_t getHeartbeatInterval()
std::function< void(const State &)> StateFunc
StateListenerConstSharedPtr addStateListener(const StateFunc &s)
std::vector< char > buffer
SyncProperties(const can::Header &h, const uint16_t &p, const uint8_t &o)
const ObjectStorageSharedPtr storage_
const can::CommInterfaceSharedPtr interface_
void call(void(T::*func)(void))
can::FrameListenerConstSharedPtr nmt_listener_
Master::MasterSharedPtr MasterSharedPtr
void setHeartbeatInterval()
ObjectStorage::Entry< uint8_t > error_register_
const ObjectDict::Entry & desc() const
static TPDOSharedPtr create(const can::CommInterfaceSharedPtr interface, const ObjectStorageSharedPtr &storage, const uint16_t &com_index, const uint16_t &map_index)
boost::condition_variable cond
TPDO(const can::CommInterfaceSharedPtr interface)
std::shared_ptr< Node > NodeSharedPtr
std::shared_ptr< SyncLayer > SyncLayerSharedPtr
time_point get_abs_time(const time_duration &timeout)
can::Listener< const StateFunc, const State & > StateListener
const uint16_t period_ms_
void add(MemberSharedPtr t)
ObjectStorage::ObjectStorageSharedPtr ObjectStorageSharedPtr
can::SimpleDispatcher< StateListener > state_dispatcher_
const ObjectStorageSharedPtr storage_
SDOClient(const can::CommInterfaceSharedPtr interface, const ObjectDictSharedPtr dict, uint8_t node_id)