FrameGrabberBase.cpp
Go to the documentation of this file.
1 //
2 // Copyright (c) 2023 SICK AG, Waldkirch
3 //
4 // SPDX-License-Identifier: Unlicense
5 
6 #include "FrameGrabberBase.h"
7 #include <chrono>
8 #include <iostream>
9 
10 namespace visionary {
11 FrameGrabberBase::FrameGrabberBase(const std::string& hostname, std::uint16_t port, std::uint32_t timeoutMs)
12  : m_isRunning(false)
13  , m_FrameAvailable(false)
14  , m_connected(false)
15  , m_hostname(hostname)
16  , m_port(port)
17  , m_timeoutMs(timeoutMs)
18 {
19 }
20 
21 void FrameGrabberBase::start(std::shared_ptr<VisionaryData> inactiveDataHandler,
22  std::shared_ptr<VisionaryData> activeDataHandler)
23 {
24  if (m_isRunning)
25  {
26  std::cout << "FrameGrabberBase is already running" << std::endl;
27  return;
28  }
29  m_isRunning = true;
30  m_pDataStream = std::unique_ptr<VisionaryDataStream>(new VisionaryDataStream(std::move(activeDataHandler)));
31  m_pDataHandler = std::move(inactiveDataHandler);
33  if (!m_connected)
34  {
35  std::cout << "Failed to connect" << std::endl;
36  }
37  m_grabberThread = std::thread(&FrameGrabberBase::run, this);
38 }
39 
41 {
42  m_isRunning = false;
43  m_grabberThread.join();
44 }
45 
47 {
48  while (m_isRunning)
49  {
50  if (!m_connected)
51  {
53  {
54  std::cout << "Failed to connect" << std::endl;
55  m_connected = false;
56  std::this_thread::sleep_for(std::chrono::seconds(1));
57  continue;
58  }
59  m_connected = true;
60  }
61  if (m_pDataStream->getNextFrame())
62  {
63  {
64  std::lock_guard<std::mutex> guard(m_dataHandler_mutex);
65  m_FrameAvailable = true;
66  auto pOldDataHandler = std::move(m_pDataHandler);
67  m_pDataHandler = std::move(m_pDataStream->getDataHandler());
68  m_pDataStream->setDataHandler(pOldDataHandler);
69  }
70  m_frameAvailableCv.notify_one();
71  }
72  else
73  {
74  if (!m_pDataStream->isConnected())
75  {
76  std::cout << "Connection lost -> Reconnecting" << std::endl;
77  m_pDataStream->close();
79  }
80  }
81  }
82 }
83 
84 bool FrameGrabberBase::getNextFrame(std::shared_ptr<VisionaryData>& pDataHandler, std::uint32_t timeoutMs)
85 {
86  std::unique_lock<std::mutex> guard(m_dataHandler_mutex);
87  m_FrameAvailable = false;
88  m_frameAvailableCv.wait_for(guard, std::chrono::milliseconds(timeoutMs), [this] { return this->m_FrameAvailable; });
89  if (m_FrameAvailable)
90  {
91  m_FrameAvailable = false;
92  const auto tmp = std::move(pDataHandler);
93  pDataHandler = std::move(m_pDataHandler);
94  m_pDataHandler = tmp;
95  return true;
96  }
97  return false;
98 }
99 
100 bool FrameGrabberBase::getCurrentFrame(std::shared_ptr<VisionaryData>& pDataHandler)
101 {
102  if (m_FrameAvailable)
103  {
104  std::lock_guard<std::mutex> guard(m_dataHandler_mutex);
105  m_FrameAvailable = false;
106  const auto tmp = std::move(pDataHandler);
107  pDataHandler = std::move(m_pDataHandler);
108  m_pDataHandler = tmp;
109  return true;
110  }
111  return false;
112 }
113 } // namespace visionary
visionary::FrameGrabberBase::m_hostname
const std::string m_hostname
Definition: FrameGrabberBase.h:29
visionary::FrameGrabberBase::m_connected
bool m_connected
Definition: FrameGrabberBase.h:28
visionary
Definition: MD5.cpp:44
FrameGrabberBase.h
visionary::FrameGrabberBase::m_pDataStream
std::unique_ptr< VisionaryDataStream > m_pDataStream
Definition: FrameGrabberBase.h:32
visionary::FrameGrabberBase::m_grabberThread
std::thread m_grabberThread
Definition: FrameGrabberBase.h:33
visionary::FrameGrabberBase::m_pDataHandler
std::shared_ptr< VisionaryData > m_pDataHandler
Definition: FrameGrabberBase.h:34
visionary::FrameGrabberBase::m_timeoutMs
const std::uint32_t m_timeoutMs
Definition: FrameGrabberBase.h:31
visionary::FrameGrabberBase::m_dataHandler_mutex
std::mutex m_dataHandler_mutex
Definition: FrameGrabberBase.h:35
visionary::FrameGrabberBase::m_isRunning
bool m_isRunning
Definition: FrameGrabberBase.h:26
visionary::FrameGrabberBase::m_frameAvailableCv
std::condition_variable m_frameAvailableCv
Definition: FrameGrabberBase.h:36
visionary::FrameGrabberBase::m_port
const std::uint16_t m_port
Definition: FrameGrabberBase.h:30
visionary::FrameGrabberBase::FrameGrabberBase
FrameGrabberBase(const std::string &hostname, std::uint16_t port, std::uint32_t timeoutMs)
Definition: FrameGrabberBase.cpp:11
visionary::FrameGrabberBase::run
void run()
Definition: FrameGrabberBase.cpp:46
visionary::FrameGrabberBase::getCurrentFrame
bool getCurrentFrame(std::shared_ptr< VisionaryData > &pDataHandler)
Definition: FrameGrabberBase.cpp:100
visionary::FrameGrabberBase::start
void start(std::shared_ptr< VisionaryData > inactiveDataHandler, std::shared_ptr< VisionaryData > activeDataHandler)
Definition: FrameGrabberBase.cpp:21
visionary::FrameGrabberBase::~FrameGrabberBase
~FrameGrabberBase()
Definition: FrameGrabberBase.cpp:40
visionary::FrameGrabberBase::getNextFrame
bool getNextFrame(std::shared_ptr< VisionaryData > &pDataHandler, std::uint32_t timeoutMs=1000)
Definition: FrameGrabberBase.cpp:84
visionary::VisionaryDataStream
Definition: VisionaryDataStream.h:14
boost::move
BOOST_MOVE_FORCEINLINE ::boost::move_detail::remove_reference< T >::type && move(T &&t) BOOST_NOEXCEPT
Definition: utility_core.hpp:212
visionary::FrameGrabberBase::m_FrameAvailable
bool m_FrameAvailable
Definition: FrameGrabberBase.h:27


sick_visionary_ros
Author(s): SICK AG TechSupport 3D Snapshot
autogenerated on Thu Feb 8 2024 03:39:24