WPILibC++  unspecified
CameraServer.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) 2014-2018 FIRST. 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 <string>
15 #include <vector>
16 
17 #include <llvm/DenseMap.h>
18 #include <llvm/StringMap.h>
19 #include <llvm/StringRef.h>
20 #include <networktables/NetworkTable.h>
21 #include <support/mutex.h>
22 
23 #include "ErrorBase.h"
24 #include "cscore.h"
25 
26 namespace frc {
27 
33 class CameraServer : public ErrorBase {
34  public:
35  static constexpr uint16_t kBasePort = 1181;
36  static constexpr int kSize640x480 = 0;
37  static constexpr int kSize320x240 = 1;
38  static constexpr int kSize160x120 = 2;
39 
43  static CameraServer* GetInstance();
44 
45 #ifdef __linux__
46  // USBCamera does not work on anything except Linux.
59 
69 
77 
85  llvm::StringRef path);
86 #endif
87 
94  void StartAutomaticCapture(const cs::VideoSource& camera);
95 
104 
112  cs::AxisCamera AddAxisCamera(const char* host);
113 
121  cs::AxisCamera AddAxisCamera(const std::string& host);
122 
131 
139  template <typename T>
140  cs::AxisCamera AddAxisCamera(std::initializer_list<T> hosts);
141 
149 
156  cs::AxisCamera AddAxisCamera(llvm::StringRef name, const char* host);
157 
164  cs::AxisCamera AddAxisCamera(llvm::StringRef name, const std::string& host);
165 
174 
181  template <typename T>
183  std::initializer_list<T> hosts);
184 
193 
200  cs::CvSink GetVideo(const cs::VideoSource& camera);
201 
209 
218  cs::CvSource PutVideo(llvm::StringRef name, int width, int height);
219 
226 
232  cs::MjpegServer AddServer(llvm::StringRef name, int port);
233 
239  void AddServer(const cs::VideoSink& server);
240 
246  void RemoveServer(llvm::StringRef name);
247 
255 
262 
268  void AddCamera(const cs::VideoSource& camera);
269 
275  void RemoveCamera(llvm::StringRef name);
276 
286  void SetSize(int size);
287 
288  private:
289  CameraServer();
290 
291  std::shared_ptr<nt::NetworkTable> GetSourceTable(CS_Source source);
292  std::vector<std::string> GetSinkStreamValues(CS_Sink sink);
293  std::vector<std::string> GetSourceStreamValues(CS_Source source);
294  void UpdateStreamValues();
295 
296  static constexpr char const* kPublishName = "/CameraPublisher";
297 
298  wpi::mutex m_mutex;
299  std::atomic<int> m_defaultUsbDevice;
300  std::string m_primarySourceName;
304  std::shared_ptr<nt::NetworkTable> m_publishTable;
305  cs::VideoListener m_videoListener;
306  int m_tableListener;
307  int m_nextPort;
308  std::vector<std::string> m_addresses;
309 };
310 
311 } // namespace frc
312 
313 #include "CameraServer.inc"
Definition: RobotController.cpp:14
Definition: DenseMap.h:585
void SetSize(int size)
Sets the size of the image to use.
Definition: CameraServer.cpp:666
A source for video that provides a sequence of frames.
Definition: cscore_oo.h:86
A sink for video that accepts a sequence of frames.
Definition: cscore_oo.h:459
cs::AxisCamera AddAxisCamera(llvm::StringRef host)
Adds an Axis IP camera.
Definition: CameraServer.cpp:477
void StartAutomaticCapture(const cs::VideoSource &camera)
Start automatically capturing images to send to the dashboard from an existing camera.
Definition: CameraServer.cpp:525
A source that represents a USB camera.
Definition: cscore_oo.h:241
An event listener.
Definition: cscore_oo.h:620
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: ArrayRef.h:32
static CameraServer * GetInstance()
Get the CameraServer instance.
Definition: CameraServer.cpp:21
cs::CvSource PutVideo(llvm::StringRef name, int width, int height)
Create a MJPEG stream with OpenCV input.
Definition: CameraServer.cpp:595
A source for user code to provide OpenCV images as video frames.
Definition: cscore_oo.h:366
Base class for most objects.
Definition: ErrorBase.h:74
void RemoveCamera(llvm::StringRef name)
Removes a camera by name.
Definition: CameraServer.cpp:661
cs::MjpegServer AddServer(llvm::StringRef name)
Adds a MJPEG server at the next available port.
Definition: CameraServer.cpp:602
void AddCamera(const cs::VideoSource &camera)
Adds an already created camera.
Definition: CameraServer.cpp:654
Singleton class for creating and keeping camera servers.
Definition: CameraServer.h:33
void RemoveServer(llvm::StringRef name)
Removes a server by name.
Definition: CameraServer.cpp:622
A sink that acts as a MJPEG-over-HTTP network server.
Definition: cscore_oo.h:532
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:42
A source that represents an Axis IP camera.
Definition: cscore_oo.h:326
cs::CvSink GetVideo()
Get OpenCV access to the primary camera feed.
Definition: CameraServer.cpp:534
A sink for user code to accept video frames as OpenCV images.
Definition: cscore_oo.h:555
cs::VideoSink GetServer()
Get server for the primary camera feed.
Definition: CameraServer.cpp:627