WPILibC++  unspecified
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Pages
CameraServer.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) FIRST 2014-2017. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in the root directory of */
5 /* the project. */
6 /*----------------------------------------------------------------------------*/
7 
8 #pragma once
9 
10 #include <atomic>
11 #include <memory>
12 #include <mutex>
13 #include <string>
14 #include <vector>
15 
16 #include "ErrorBase.h"
17 #include "cscore.h"
18 #include "llvm/DenseMap.h"
19 #include "llvm/StringMap.h"
20 #include "llvm/StringRef.h"
21 #include "networktables/NetworkTable.h"
22 
23 namespace frc {
24 
29 class CameraServer : public ErrorBase {
30  public:
31  static constexpr uint16_t kBasePort = 1181;
32  static constexpr int kSize640x480 = 0;
33  static constexpr int kSize320x240 = 1;
34  static constexpr int kSize160x120 = 2;
35 
39  static CameraServer* GetInstance();
40 
53  cs::UsbCamera StartAutomaticCapture();
54 
63  cs::UsbCamera StartAutomaticCapture(int dev);
64 
71  cs::UsbCamera StartAutomaticCapture(llvm::StringRef name, int dev);
72 
79  cs::UsbCamera StartAutomaticCapture(llvm::StringRef name,
80  llvm::StringRef path);
81 
88  void StartAutomaticCapture(const cs::VideoSource& camera);
89 
98  cs::AxisCamera AddAxisCamera(llvm::StringRef host);
99 
108  cs::AxisCamera AddAxisCamera(const char* host);
109 
118  cs::AxisCamera AddAxisCamera(const std::string& host);
119 
128  cs::AxisCamera AddAxisCamera(llvm::ArrayRef<std::string> hosts);
129 
138  template <typename T>
139  cs::AxisCamera AddAxisCamera(std::initializer_list<T> hosts);
140 
147  cs::AxisCamera AddAxisCamera(llvm::StringRef name, llvm::StringRef host);
148 
155  cs::AxisCamera AddAxisCamera(llvm::StringRef name, const char* host);
156 
163  cs::AxisCamera AddAxisCamera(llvm::StringRef name, const std::string& host);
164 
171  cs::AxisCamera AddAxisCamera(llvm::StringRef name,
172  llvm::ArrayRef<std::string> hosts);
173 
180  template <typename T>
181  cs::AxisCamera AddAxisCamera(llvm::StringRef name,
182  std::initializer_list<T> hosts);
183 
191  cs::CvSink GetVideo();
192 
199  cs::CvSink GetVideo(const cs::VideoSource& camera);
200 
207  cs::CvSink GetVideo(llvm::StringRef name);
208 
217  cs::CvSource PutVideo(llvm::StringRef name, int width, int height);
218 
224  cs::MjpegServer AddServer(llvm::StringRef name);
225 
231  cs::MjpegServer AddServer(llvm::StringRef name, int port);
232 
238  void AddServer(const cs::VideoSink& server);
239 
245  void RemoveServer(llvm::StringRef name);
246 
253  cs::VideoSink GetServer();
254 
260  cs::VideoSink GetServer(llvm::StringRef name);
261 
267  void AddCamera(const cs::VideoSource& camera);
268 
274  void RemoveCamera(llvm::StringRef name);
275 
285  void SetSize(int size);
286 
287  private:
288  CameraServer();
289 
290  std::shared_ptr<ITable> GetSourceTable(CS_Source source);
291  std::vector<std::string> GetSinkStreamValues(CS_Sink sink);
292  std::vector<std::string> GetSourceStreamValues(CS_Source source);
293  void UpdateStreamValues();
294 
295  static constexpr char const* kPublishName = "/CameraPublisher";
296 
297  std::mutex m_mutex;
298  std::atomic<int> m_defaultUsbDevice;
299  std::string m_primarySourceName;
300  llvm::StringMap<cs::VideoSource> m_sources;
301  llvm::StringMap<cs::VideoSink> m_sinks;
302  llvm::DenseMap<CS_Source, std::shared_ptr<ITable>> m_tables;
303  std::shared_ptr<NetworkTable> m_publishTable;
304  cs::VideoListener m_videoListener;
305  int m_tableListener;
306  int m_nextPort;
307  std::vector<std::string> m_addresses;
308 };
309 
310 } // namespace frc
311 
312 #include "CameraServer.inc"
void SetSize(int size)
Sets the size of the image to use.
Definition: CameraServer.cpp:701
cs::AxisCamera AddAxisCamera(llvm::StringRef host)
Adds an Axis IP camera.
Definition: CameraServer.cpp:516
cs::UsbCamera StartAutomaticCapture()
Start automatically capturing images to send to the dashboard.
Definition: CameraServer.cpp:488
static CameraServer * GetInstance()
Get the CameraServer instance.
Definition: CameraServer.cpp:18
cs::CvSource PutVideo(llvm::StringRef name, int width, int height)
Create a MJPEG stream with OpenCV input.
Definition: CameraServer.cpp:630
Base class for most objects.
Definition: ErrorBase.h:72
void RemoveCamera(llvm::StringRef name)
Removes a camera by name.
Definition: CameraServer.cpp:696
cs::MjpegServer AddServer(llvm::StringRef name)
Adds a MJPEG server at the next available port.
Definition: CameraServer.cpp:637
void AddCamera(const cs::VideoSource &camera)
Adds an already created camera.
Definition: CameraServer.cpp:689
Singleton class for creating and keeping camera servers.
Definition: CameraServer.h:29
void RemoveServer(llvm::StringRef name)
Removes a server by name.
Definition: CameraServer.cpp:657
cs::CvSink GetVideo()
Get OpenCV access to the primary camera feed.
Definition: CameraServer.cpp:569
cs::VideoSink GetServer()
Get server for the primary camera feed.
Definition: CameraServer.cpp:662