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 <stdint.h>
11 
12 #include <atomic>
13 #include <memory>
14 #include <mutex>
15 #include <string>
16 #include <vector>
17 
18 #include "ErrorBase.h"
19 #include "cscore.h"
20 #include "llvm/DenseMap.h"
21 #include "llvm/StringMap.h"
22 #include "llvm/StringRef.h"
23 #include "networktables/NetworkTable.h"
24 
25 namespace frc {
26 
31 class CameraServer : public ErrorBase {
32  public:
33  static constexpr uint16_t kBasePort = 1181;
34  static constexpr int kSize640x480 = 0;
35  static constexpr int kSize320x240 = 1;
36  static constexpr int kSize160x120 = 2;
37 
41  static CameraServer* GetInstance();
42 
55  cs::UsbCamera StartAutomaticCapture();
56 
65  cs::UsbCamera StartAutomaticCapture(int dev);
66 
73  cs::UsbCamera StartAutomaticCapture(llvm::StringRef name, int dev);
74 
81  cs::UsbCamera StartAutomaticCapture(llvm::StringRef name,
82  llvm::StringRef path);
83 
90  void StartAutomaticCapture(const cs::VideoSource& camera);
91 
100  cs::AxisCamera AddAxisCamera(llvm::StringRef host);
101 
110  cs::AxisCamera AddAxisCamera(const char* host);
111 
120  cs::AxisCamera AddAxisCamera(const std::string& host);
121 
130  cs::AxisCamera AddAxisCamera(llvm::ArrayRef<std::string> hosts);
131 
140  template <typename T>
141  cs::AxisCamera AddAxisCamera(std::initializer_list<T> hosts);
142 
149  cs::AxisCamera AddAxisCamera(llvm::StringRef name, llvm::StringRef host);
150 
157  cs::AxisCamera AddAxisCamera(llvm::StringRef name, const char* host);
158 
165  cs::AxisCamera AddAxisCamera(llvm::StringRef name, const std::string& host);
166 
173  cs::AxisCamera AddAxisCamera(llvm::StringRef name,
174  llvm::ArrayRef<std::string> hosts);
175 
182  template <typename T>
183  cs::AxisCamera AddAxisCamera(llvm::StringRef name,
184  std::initializer_list<T> hosts);
185 
193  cs::CvSink GetVideo();
194 
201  cs::CvSink GetVideo(const cs::VideoSource& camera);
202 
209  cs::CvSink GetVideo(llvm::StringRef name);
210 
219  cs::CvSource PutVideo(llvm::StringRef name, int width, int height);
220 
226  cs::MjpegServer AddServer(llvm::StringRef name);
227 
233  cs::MjpegServer AddServer(llvm::StringRef name, int port);
234 
240  void AddServer(const cs::VideoSink& server);
241 
247  void RemoveServer(llvm::StringRef name);
248 
255  cs::VideoSink GetServer();
256 
262  cs::VideoSink GetServer(llvm::StringRef name);
263 
269  void AddCamera(const cs::VideoSource& camera);
270 
276  void RemoveCamera(llvm::StringRef name);
277 
287  void SetSize(int size);
288 
289  private:
290  CameraServer();
291 
292  std::shared_ptr<ITable> GetSourceTable(CS_Source source);
293  std::vector<std::string> GetSinkStreamValues(CS_Sink sink);
294  std::vector<std::string> GetSourceStreamValues(CS_Source source);
295  void UpdateStreamValues();
296 
297  static constexpr char const* kPublishName = "/CameraPublisher";
298 
299  std::mutex m_mutex;
300  std::atomic<int> m_defaultUsbDevice;
301  std::string m_primarySourceName;
302  llvm::StringMap<cs::VideoSource> m_sources;
303  llvm::StringMap<cs::VideoSink> m_sinks;
304  llvm::DenseMap<CS_Source, std::shared_ptr<ITable>> m_tables;
305  std::shared_ptr<NetworkTable> m_publishTable;
306  cs::VideoListener m_videoListener;
307  int m_tableListener;
308  int m_nextPort;
309  std::vector<std::string> m_addresses;
310 };
311 
312 } // namespace frc
313 
314 #include "CameraServer.inc"
void SetSize(int size)
Sets the size of the image to use.
Definition: CameraServer.cpp:699
cs::AxisCamera AddAxisCamera(llvm::StringRef host)
Adds an Axis IP camera.
Definition: CameraServer.cpp:514
cs::UsbCamera StartAutomaticCapture()
Start automatically capturing images to send to the dashboard.
Definition: CameraServer.cpp:486
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:628
Base class for most objects.
Definition: ErrorBase.h:72
void RemoveCamera(llvm::StringRef name)
Removes a camera by name.
Definition: CameraServer.cpp:694
cs::MjpegServer AddServer(llvm::StringRef name)
Adds a MJPEG server at the next available port.
Definition: CameraServer.cpp:635
void AddCamera(const cs::VideoSource &camera)
Adds an already created camera.
Definition: CameraServer.cpp:687
Singleton class for creating and keeping camera servers.
Definition: CameraServer.h:31
void RemoveServer(llvm::StringRef name)
Removes a server by name.
Definition: CameraServer.cpp:655
cs::CvSink GetVideo()
Get OpenCV access to the primary camera feed.
Definition: CameraServer.cpp:567
cs::VideoSink GetServer()
Get server for the primary camera feed.
Definition: CameraServer.cpp:660