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 <memory>
11 #include <mutex>
12 #include <string>
13 #include <vector>
14 
15 #include "ErrorBase.h"
16 #include "cscore.h"
17 #include "llvm/DenseMap.h"
18 #include "llvm/StringMap.h"
19 #include "llvm/StringRef.h"
20 #include "networktables/NetworkTable.h"
21 
22 namespace frc {
23 
28 class CameraServer : public ErrorBase {
29  public:
30  static constexpr uint16_t kBasePort = 1181;
31  static constexpr int kSize640x480 = 0;
32  static constexpr int kSize320x240 = 1;
33  static constexpr int kSize160x120 = 2;
34 
38  static CameraServer* GetInstance();
39 
50  cs::UsbCamera StartAutomaticCapture();
51 
60  cs::UsbCamera StartAutomaticCapture(int dev);
61 
68  cs::UsbCamera StartAutomaticCapture(llvm::StringRef name, int dev);
69 
76  cs::UsbCamera StartAutomaticCapture(llvm::StringRef name,
77  llvm::StringRef path);
78 
85  void StartAutomaticCapture(const cs::VideoSource& camera);
86 
95  cs::AxisCamera AddAxisCamera(llvm::StringRef host);
96 
105  cs::AxisCamera AddAxisCamera(const char* host);
106 
115  cs::AxisCamera AddAxisCamera(const std::string& host);
116 
125  cs::AxisCamera AddAxisCamera(llvm::ArrayRef<std::string> hosts);
126 
135  template <typename T>
136  cs::AxisCamera AddAxisCamera(std::initializer_list<T> hosts);
137 
144  cs::AxisCamera AddAxisCamera(llvm::StringRef name, llvm::StringRef host);
145 
152  cs::AxisCamera AddAxisCamera(llvm::StringRef name, const char* host);
153 
160  cs::AxisCamera AddAxisCamera(llvm::StringRef name, const std::string& host);
161 
168  cs::AxisCamera AddAxisCamera(llvm::StringRef name,
169  llvm::ArrayRef<std::string> hosts);
170 
177  template <typename T>
178  cs::AxisCamera AddAxisCamera(llvm::StringRef name,
179  std::initializer_list<T> hosts);
180 
188  cs::CvSink GetVideo();
189 
196  cs::CvSink GetVideo(const cs::VideoSource& camera);
197 
204  cs::CvSink GetVideo(llvm::StringRef name);
205 
214  cs::CvSource PutVideo(llvm::StringRef name, int width, int height);
215 
221  cs::MjpegServer AddServer(llvm::StringRef name);
222 
228  cs::MjpegServer AddServer(llvm::StringRef name, int port);
229 
235  void AddServer(const cs::VideoSink& server);
236 
242  void RemoveServer(llvm::StringRef name);
243 
249  void AddCamera(const cs::VideoSource& camera);
250 
256  void RemoveCamera(llvm::StringRef name);
257 
267  void SetSize(int size);
268 
269  private:
270  CameraServer();
271 
272  std::shared_ptr<ITable> GetSourceTable(CS_Source source);
273  std::vector<std::string> GetSinkStreamValues(CS_Sink sink);
274  std::vector<std::string> GetSourceStreamValues(CS_Source source);
275  void UpdateStreamValues();
276 
277  static constexpr char const* kPublishName = "/CameraPublisher";
278 
279  std::mutex m_mutex;
280  std::string m_primarySourceName;
281  llvm::StringMap<cs::VideoSource> m_sources;
282  llvm::StringMap<cs::VideoSink> m_sinks;
283  llvm::DenseMap<CS_Source, std::shared_ptr<ITable>> m_tables;
284  std::shared_ptr<NetworkTable> m_publishTable;
285  cs::VideoListener m_videoListener;
286  int m_tableListener;
287  int m_nextPort;
288  std::vector<std::string> m_addresses;
289 };
290 
291 } // namespace frc
292 
293 #include "CameraServer.inc"
void SetSize(int size)
Sets the size of the image to use.
Definition: CameraServer.cpp:682
cs::AxisCamera AddAxisCamera(llvm::StringRef host)
Adds an Axis IP camera.
Definition: CameraServer.cpp:524
cs::UsbCamera StartAutomaticCapture()
Start automatically capturing images to send to the dashboard.
Definition: CameraServer.cpp:496
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:638
Base class for most objects.
Definition: ErrorBase.h:72
void RemoveCamera(llvm::StringRef name)
Removes a camera by name.
Definition: CameraServer.cpp:677
cs::MjpegServer AddServer(llvm::StringRef name)
Adds a MJPEG server at the next available port.
Definition: CameraServer.cpp:645
void AddCamera(const cs::VideoSource &camera)
Adds an already created camera.
Definition: CameraServer.cpp:670
Singleton class for creating and keeping camera servers.
Definition: CameraServer.h:28
void RemoveServer(llvm::StringRef name)
Removes a server by name.
Definition: CameraServer.cpp:665
cs::CvSink GetVideo()
Get OpenCV access to the primary camera feed.
Definition: CameraServer.cpp:577