WPILibC++  unspecified
HttpCameraImpl.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) 2016-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 #ifndef CSCORE_HTTPCAMERAIMPL_H_
9 #define CSCORE_HTTPCAMERAIMPL_H_
10 
11 #include <atomic>
12 #include <functional>
13 #include <initializer_list>
14 #include <memory>
15 #include <string>
16 #include <thread>
17 #include <vector>
18 
19 #include <wpi/HttpUtil.h>
20 #include <wpi/SmallString.h>
21 #include <wpi/StringMap.h>
22 #include <wpi/condition_variable.h>
23 #include <wpi/raw_istream.h>
24 
25 #include "SourceImpl.h"
26 #include "cscore_cpp.h"
27 
28 namespace cs {
29 
30 class HttpCameraImpl : public SourceImpl {
31  public:
32  HttpCameraImpl(wpi::StringRef name, CS_HttpCameraKind kind);
33  ~HttpCameraImpl() override;
34 
35  void Start();
36 
37  // Property functions
38  void SetProperty(int property, int value, CS_Status* status) override;
39  void SetStringProperty(int property, wpi::StringRef value,
40  CS_Status* status) override;
41 
42  // Standard common camera properties
43  void SetBrightness(int brightness, CS_Status* status) override;
44  int GetBrightness(CS_Status* status) const override;
45  void SetWhiteBalanceAuto(CS_Status* status) override;
46  void SetWhiteBalanceHoldCurrent(CS_Status* status) override;
47  void SetWhiteBalanceManual(int value, CS_Status* status) override;
48  void SetExposureAuto(CS_Status* status) override;
49  void SetExposureHoldCurrent(CS_Status* status) override;
50  void SetExposureManual(int value, CS_Status* status) override;
51 
52  bool SetVideoMode(const VideoMode& mode, CS_Status* status) override;
53 
54  void NumSinksChanged() override;
55  void NumSinksEnabledChanged() override;
56 
57  CS_HttpCameraKind GetKind() const;
58  bool SetUrls(wpi::ArrayRef<std::string> urls, CS_Status* status);
59  std::vector<std::string> GetUrls() const;
60 
61  // Property data
62  class PropertyData : public PropertyImpl {
63  public:
64  PropertyData() = default;
65  explicit PropertyData(wpi::StringRef name_) : PropertyImpl{name_} {}
66  PropertyData(wpi::StringRef name_, wpi::StringRef httpParam_,
67  bool viaSettings_, CS_PropertyKind kind_, int minimum_,
68  int maximum_, int step_, int defaultValue_, int value_)
69  : PropertyImpl(name_, kind_, step_, defaultValue_, value_),
70  viaSettings(viaSettings_),
71  httpParam(httpParam_) {
72  hasMinimum = true;
73  minimum = minimum_;
74  hasMaximum = true;
75  maximum = maximum_;
76  }
77  ~PropertyData() override = default;
78 
79  bool viaSettings{false};
80  std::string httpParam;
81  };
82 
83  protected:
84  std::unique_ptr<PropertyImpl> CreateEmptyProperty(
85  wpi::StringRef name) const override;
86 
87  bool CacheProperties(CS_Status* status) const override;
88 
89  void CreateProperty(wpi::StringRef name, wpi::StringRef httpParam,
90  bool viaSettings, CS_PropertyKind kind, int minimum,
91  int maximum, int step, int defaultValue, int value) const;
92 
93  template <typename T>
94  void CreateEnumProperty(wpi::StringRef name, wpi::StringRef httpParam,
95  bool viaSettings, int defaultValue, int value,
96  std::initializer_list<T> choices) const;
97 
98  private:
99  // The camera streaming thread
100  void StreamThreadMain();
101 
102  // Functions used by StreamThreadMain()
103  wpi::HttpConnection* DeviceStreamConnect(
104  wpi::SmallVectorImpl<char>& boundary);
105  void DeviceStream(wpi::raw_istream& is, wpi::StringRef boundary);
106  bool DeviceStreamFrame(wpi::raw_istream& is, std::string& imageBuf);
107 
108  // The camera settings thread
109  void SettingsThreadMain();
110  void DeviceSendSettings(wpi::HttpRequest& req);
111 
112  std::atomic_bool m_connected{false};
113  std::atomic_bool m_active{true}; // set to false to terminate thread
114  std::thread m_streamThread;
115  std::thread m_settingsThread;
116 
117  //
118  // Variables protected by m_mutex
119  //
120 
121  // The camera connections
122  std::unique_ptr<wpi::HttpConnection> m_streamConn;
123  std::unique_ptr<wpi::HttpConnection> m_settingsConn;
124 
125  CS_HttpCameraKind m_kind;
126 
127  std::vector<wpi::HttpLocation> m_locations;
128  size_t m_nextLocation{0};
129  int m_prefLocation{-1}; // preferred location
130 
131  wpi::condition_variable m_sinkEnabledCond;
132 
134  wpi::condition_variable m_settingsCond;
135 
136  wpi::StringMap<wpi::SmallString<16>> m_streamSettings;
137  std::atomic_bool m_streamSettingsUpdated{false};
138 };
139 
141  public:
142  explicit AxisCameraImpl(wpi::StringRef name)
143  : HttpCameraImpl{name, CS_HTTP_AXIS} {}
144 #if 0
145  void SetProperty(int property, int value, CS_Status* status) override;
146  void SetStringProperty(int property, wpi::StringRef value,
147  CS_Status* status) override;
148 #endif
149  protected:
150  bool CacheProperties(CS_Status* status) const override;
151 };
152 
153 } // namespace cs
154 
155 #endif // CSCORE_HTTPCAMERAIMPL_H_
Definition: HttpUtil.h:77
Definition: CvSourceImpl.h:19
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: ArrayRef.h:41
Definition: HttpCameraImpl.h:140
Definition: HttpCameraImpl.h:30
Definition: SourceImpl.h:30
Definition: raw_istream.h:26
Definition: PropertyImpl.h:21
Definition: HttpUtil.h:126
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
StringMap - This is an unconventional map that is specialized for handling keys that are "strings"...
Definition: StringMap.h:205
Definition: HttpCameraImpl.h:62
Video mode.
Definition: cscore_cpp.h:46