SCRIPT: wpiformat

This commit is contained in:
PJ Reiniger
2025-11-07 20:01:58 -05:00
committed by Peter Johnson
parent ae6bdc9d25
commit 2109161534
749 changed files with 5504 additions and 3936 deletions

View File

@@ -27,12 +27,12 @@ int main() {
switch (prop.GetKind()) {
case wpi::cs::VideoProperty::kBoolean:
wpi::util::print(" (bool): value={} default={}", prop.Get(),
prop.GetDefault());
prop.GetDefault());
break;
case wpi::cs::VideoProperty::kInteger:
wpi::util::print(" (int): value={} min={} max={} step={} default={}",
prop.Get(), prop.GetMin(), prop.GetMax(), prop.GetStep(),
prop.GetDefault());
prop.Get(), prop.GetMin(), prop.GetMax(),
prop.GetStep(), prop.GetDefault());
break;
case wpi::cs::VideoProperty::kString:
wpi::util::print(" (string): {}", prop.GetString());
@@ -70,8 +70,8 @@ int main() {
pixelFormat = "Unknown";
break;
}
wpi::util::print(" PixelFormat:{} Width:{} Height:{} FPS:{}\n", pixelFormat,
mode.width, mode.height, mode.fps);
wpi::util::print(" PixelFormat:{} Width:{} Height:{} FPS:{}\n",
pixelFormat, mode.width, mode.height, mode.fps);
}
}
}

View File

@@ -15,7 +15,8 @@ int main() {
camera.SetVideoMode(wpi::cs::VideoMode::kMJPEG, 320, 240, 30);
wpi::cs::CvSink cvsink{"cvsink"};
cvsink.SetSource(camera);
wpi::cs::CvSource cvsource{"cvsource", wpi::cs::VideoMode::kMJPEG, 320, 240, 30};
wpi::cs::CvSource cvsource{"cvsource", wpi::cs::VideoMode::kMJPEG, 320, 240,
30};
wpi::cs::MjpegServer cvMjpegServer{"cvhttpserver", 8083};
cvMjpegServer.SetSource(cvsource);
@@ -27,8 +28,8 @@ int main() {
wpi::util::print("error: {}\n", cvsink.GetError());
continue;
}
wpi::util::print("got frame at time {} size ({}, {})\n", time, test.size().width,
test.size().height);
wpi::util::print("got frame at time {} size ({}, {})\n", time,
test.size().width, test.size().height);
cv::flip(test, flip, 0);
cvsource.PutFrame(flip);
}

View File

@@ -76,12 +76,12 @@ int main(int argc, char** argv) {
switch (prop.GetKind()) {
case wpi::cs::VideoProperty::kBoolean:
wpi::util::print(" (bool): value={} default={}", prop.Get(),
prop.GetDefault());
prop.GetDefault());
break;
case wpi::cs::VideoProperty::kInteger:
wpi::util::print(" (int): value={} min={} max={} step={} default={}",
prop.Get(), prop.GetMin(), prop.GetMax(), prop.GetStep(),
prop.GetDefault());
prop.Get(), prop.GetMin(), prop.GetMax(),
prop.GetStep(), prop.GetDefault());
break;
case wpi::cs::VideoProperty::kString:
wpi::util::print(" (string): {}", prop.GetString());

View File

@@ -14,7 +14,8 @@ int main() {
mjpegServer.SetSource(camera);
wpi::cs::CvSink cvsink{"cvsink"};
cvsink.SetSource(camera);
wpi::cs::CvSource cvsource{"cvsource", wpi::cs::VideoMode::kMJPEG, 320, 240, 30};
wpi::cs::CvSource cvsource{"cvsource", wpi::cs::VideoMode::kMJPEG, 320, 240,
30};
wpi::cs::MjpegServer cvMjpegServer{"cvhttpserver", 8082};
cvMjpegServer.SetSource(cvsource);
@@ -26,8 +27,8 @@ int main() {
wpi::util::print("error: {}\n", cvsink.GetError());
continue;
}
wpi::util::print("got frame at time {} size ({}, {})\n", time, test.size().width,
test.size().height);
wpi::util::print("got frame at time {} size ({}, {})\n", time,
test.size().width, test.size().height);
cv::flip(test, flip, 0);
cvsource.PutFrame(flip);
}

View File

@@ -22,7 +22,7 @@ int main() {
wpi::cs::AddListener(
[&](const wpi::cs::RawEvent& event) {
wpi::util::print("FPS={} MBPS={}\n", camera.GetActualFPS(),
(camera.GetActualDataRate() / 1000000.0));
(camera.GetActualDataRate() / 1000000.0));
},
wpi::cs::RawEvent::kTelemetryUpdated, false, &status);
wpi::cs::SetTelemetryPeriod(1.0);

View File

@@ -200,7 +200,8 @@ void SetSourceEnumPropertyChoices(CS_Source source, CS_Property property,
extern "C" {
void CS_NotifySourceError(CS_Source source, const struct WPI_String* msg,
CS_Status* status) {
return wpi::cs::NotifySourceError(source, wpi::util::to_string_view(msg), status);
return wpi::cs::NotifySourceError(source, wpi::util::to_string_view(msg),
status);
}
void CS_SetSourceConnected(CS_Source source, CS_Bool connected,
@@ -211,8 +212,8 @@ void CS_SetSourceConnected(CS_Source source, CS_Bool connected,
void CS_SetSourceDescription(CS_Source source,
const struct WPI_String* description,
CS_Status* status) {
return wpi::cs::SetSourceDescription(source, wpi::util::to_string_view(description),
status);
return wpi::cs::SetSourceDescription(
source, wpi::util::to_string_view(description), status);
}
CS_Property CS_CreateSourceProperty(CS_Source source,
@@ -220,9 +221,9 @@ CS_Property CS_CreateSourceProperty(CS_Source source,
enum CS_PropertyKind kind, int minimum,
int maximum, int step, int defaultValue,
int value, CS_Status* status) {
return wpi::cs::CreateSourceProperty(source, wpi::util::to_string_view(name), kind,
minimum, maximum, step, defaultValue, value,
status);
return wpi::cs::CreateSourceProperty(source, wpi::util::to_string_view(name),
kind, minimum, maximum, step,
defaultValue, value, status);
}
CS_Property CS_CreateSourcePropertyCallback(

View File

@@ -803,9 +803,9 @@ void Frame::ReleaseFrame() {
}
namespace wpi::cs {
std::unique_ptr<Image> CreateImageFromBGRA(wpi::cs::SourceImpl* source, size_t width,
size_t height, size_t stride,
const uint8_t* data) {
std::unique_ptr<Image> CreateImageFromBGRA(wpi::cs::SourceImpl* source,
size_t width, size_t height,
size_t stride, const uint8_t* data) {
cv::Mat finalImage{static_cast<int>(height), static_cast<int>(width), CV_8UC4,
const_cast<uint8_t*>(data), stride};
std::unique_ptr<Image> dest = source->AllocImage(

View File

@@ -21,9 +21,9 @@ namespace wpi::cs {
class SourceImpl;
std::unique_ptr<Image> CreateImageFromBGRA(wpi::cs::SourceImpl* source, size_t width,
size_t height, size_t stride,
const uint8_t* data);
std::unique_ptr<Image> CreateImageFromBGRA(wpi::cs::SourceImpl* source,
size_t width, size_t height,
size_t stride, const uint8_t* data);
class Frame {
friend class SourceImpl;

View File

@@ -164,7 +164,8 @@ wpi::net::HttpConnection* HttpCameraImpl::DeviceStreamConnect(
if (m_nextLocation >= m_locations.size()) {
m_nextLocation = 0;
}
req = wpi::net::HttpRequest{m_locations[m_nextLocation++], m_streamSettings};
req =
wpi::net::HttpRequest{m_locations[m_nextLocation++], m_streamSettings};
m_streamSettingsUpdated = false;
}
@@ -176,7 +177,8 @@ wpi::net::HttpConnection* HttpCameraImpl::DeviceStreamConnect(
return nullptr;
}
auto connPtr = std::make_unique<wpi::net::HttpConnection>(std::move(stream), 1);
auto connPtr =
std::make_unique<wpi::net::HttpConnection>(std::move(stream), 1);
wpi::net::HttpConnection* conn = connPtr.get();
// update m_streamConn
@@ -195,7 +197,8 @@ wpi::net::HttpConnection* HttpCameraImpl::DeviceStreamConnect(
}
// Parse Content-Type header to get the boundary
auto [mediaType, contentType] = wpi::util::split(conn->contentType.str(), ';');
auto [mediaType, contentType] =
wpi::util::split(conn->contentType.str(), ';');
mediaType = wpi::util::trim(mediaType);
if (mediaType != "multipart/x-mixed-replace") {
SWARNING("\"{}\": unrecognized Content-Type \"{}\"", req.host.str(),
@@ -213,7 +216,8 @@ wpi::net::HttpConnection* HttpCameraImpl::DeviceStreamConnect(
contentType = wpi::util::ltrim(contentType);
auto [key, value] = wpi::util::split(keyvalue, '=');
if (wpi::util::trim(key) == "boundary") {
value = wpi::util::trim(wpi::util::trim(value), '"'); // value may be quoted
value =
wpi::util::trim(wpi::util::trim(value), '"'); // value may be quoted
if (wpi::util::starts_with(value, "--")) {
value = wpi::util::substr(value, 2);
}
@@ -369,7 +373,8 @@ void HttpCameraImpl::DeviceSendSettings(wpi::net::HttpRequest& req) {
return;
}
auto connPtr = std::make_unique<wpi::net::HttpConnection>(std::move(stream), 1);
auto connPtr =
std::make_unique<wpi::net::HttpConnection>(std::move(stream), 1);
wpi::net::HttpConnection* conn = connPtr.get();
// update m_settingsConn
@@ -653,7 +658,8 @@ CS_Source CS_CreateHttpCamera(const struct WPI_String* name,
const struct WPI_String* url,
CS_HttpCameraKind kind, CS_Status* status) {
return wpi::cs::CreateHttpCamera(wpi::util::to_string_view(name),
wpi::util::to_string_view(url), kind, status);
wpi::util::to_string_view(url), kind,
status);
}
CS_Source CS_CreateHttpCameraMulti(const struct WPI_String* name,
@@ -664,7 +670,8 @@ CS_Source CS_CreateHttpCameraMulti(const struct WPI_String* name,
for (int i = 0; i < count; ++i) {
vec.emplace_back(wpi::util::to_string_view(&urls[i]));
}
return wpi::cs::CreateHttpCamera(wpi::util::to_string_view(name), vec, kind, status);
return wpi::cs::CreateHttpCamera(wpi::util::to_string_view(name), vec, kind,
status);
}
CS_HttpCameraKind CS_GetHttpCameraKind(CS_Source source, CS_Status* status) {

View File

@@ -28,7 +28,8 @@ namespace wpi::cs {
class HttpCameraImpl : public SourceImpl {
public:
HttpCameraImpl(std::string_view name, CS_HttpCameraKind kind,
wpi::util::Logger& logger, Notifier& notifier, Telemetry& telemetry);
wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry);
~HttpCameraImpl() override;
void Start() override;
@@ -146,8 +147,8 @@ class HttpCameraImpl : public SourceImpl {
class AxisCameraImpl : public HttpCameraImpl {
public:
AxisCameraImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry)
AxisCameraImpl(std::string_view name, wpi::util::Logger& logger,
Notifier& notifier, Telemetry& telemetry)
: HttpCameraImpl{name, CS_HTTP_AXIS, logger, notifier, telemetry} {}
#if 0
void SetProperty(int property, int value, CS_Status* status) override;

View File

@@ -33,8 +33,8 @@ static void def_log_func(unsigned int level, const char* file,
return;
}
wpi::util::print(stderr, "CS: {}: {} ({}:{})\n", levelmsg, msg,
// NOLINTNEXTLINE(build/include_what_you_use)
fs::path{file}.filename().string(), line);
// NOLINTNEXTLINE(build/include_what_you_use)
fs::path{file}.filename().string(), line);
}
Instance::Instance()

View File

@@ -91,12 +91,13 @@ class Instance {
return m_sources.GetAll(vec);
}
std::span<CS_Sink> EnumerateSinkHandles(wpi::util::SmallVectorImpl<CS_Sink>& vec) {
std::span<CS_Sink> EnumerateSinkHandles(
wpi::util::SmallVectorImpl<CS_Sink>& vec) {
return m_sinks.GetAll(vec);
}
std::span<CS_Sink> EnumerateSourceSinks(CS_Source source,
wpi::util::SmallVectorImpl<CS_Sink>& vec) {
std::span<CS_Sink> EnumerateSourceSinks(
CS_Source source, wpi::util::SmallVectorImpl<CS_Sink>& vec) {
vec.clear();
m_sinks.ForEach([&](CS_Sink sinkHandle, const SinkData& data) {
if (source == data.sourceHandle.load()) {

View File

@@ -146,7 +146,8 @@ static inline void ReadInto(wpi::util::raw_istream& is, std::string& buf,
is.read(&(*buf.begin()) + oldSize, len);
}
bool ReadJpeg(wpi::util::raw_istream& is, std::string& buf, int* width, int* height) {
bool ReadJpeg(wpi::util::raw_istream& is, std::string& buf, int* width,
int* height) {
// in case we don't get a SOF
*width = 0;
*height = 0;

View File

@@ -10,7 +10,7 @@
namespace wpi::util {
class raw_istream;
} // namespace wpi
} // namespace wpi::util
namespace wpi::cs {
@@ -22,7 +22,8 @@ bool JpegNeedsDHT(const char* data, size_t* size, size_t* locSOF);
std::string_view JpegGetDHT();
bool ReadJpeg(wpi::util::raw_istream& is, std::string& buf, int* width, int* height);
bool ReadJpeg(wpi::util::raw_istream& is, std::string& buf, int* width,
int* height);
} // namespace wpi::cs

View File

@@ -4,9 +4,10 @@
#include "Log.hpp"
void wpi::cs::NamedLogV(wpi::util::Logger& logger, unsigned int level, const char* file,
unsigned int line, std::string_view name,
fmt::string_view format, fmt::format_args args) {
void wpi::cs::NamedLogV(wpi::util::Logger& logger, unsigned int level,
const char* file, unsigned int line,
std::string_view name, fmt::string_view format,
fmt::format_args args) {
fmt::memory_buffer out;
fmt::format_to(fmt::appender{out}, "{}: ", name);
fmt::vformat_to(fmt::appender{out}, format, args);

View File

@@ -16,9 +16,9 @@ void NamedLogV(wpi::util::Logger& logger, unsigned int level, const char* file,
fmt::string_view format, fmt::format_args args);
template <typename S, typename... Args>
inline void NamedLog(wpi::util::Logger& logger, unsigned int level, const char* file,
unsigned int line, std::string_view name, const S& format,
Args&&... args) {
inline void NamedLog(wpi::util::Logger& logger, unsigned int level,
const char* file, unsigned int line, std::string_view name,
const S& format, Args&&... args) {
if (logger.HasLogger() && level >= logger.min_level()) {
NamedLogV(logger, level, file, line, name, format,
fmt::make_format_args(args...));

View File

@@ -362,9 +362,9 @@ void MjpegServerImpl::ConnThread::SendHTML(wpi::util::raw_ostream& os,
switch (kind) {
case CS_PROP_BOOLEAN:
wpi::util::print(os,
"<input id=\"{0}\" type=\"checkbox\" "
"onclick=\"update('{0}', this.checked ? 1 : 0)\" ",
name);
"<input id=\"{0}\" type=\"checkbox\" "
"onclick=\"update('{0}', this.checked ? 1 : 0)\" ",
name);
if (source.GetProperty(prop, &status) != 0) {
os << "checked />\n";
} else {
@@ -377,12 +377,12 @@ void MjpegServerImpl::ConnThread::SendHTML(wpi::util::raw_ostream& os,
auto max = source.GetPropertyMax(prop, &status);
auto step = source.GetPropertyStep(prop, &status);
wpi::util::print(os,
"<input type=\"range\" min=\"{1}\" max=\"{2}\" "
"value=\"{3}\" id=\"{0}\" step=\"{4}\" "
"oninput=\"updateInt('#{0}op', '{0}', value)\" />\n",
name, min, max, valI, step);
wpi::util::print(os, "<output for=\"{0}\" id=\"{0}op\">{1}</output>\n", name,
valI);
"<input type=\"range\" min=\"{1}\" max=\"{2}\" "
"value=\"{3}\" id=\"{0}\" step=\"{4}\" "
"oninput=\"updateInt('#{0}op', '{0}', value)\" />\n",
name, min, max, valI, step);
wpi::util::print(os, "<output for=\"{0}\" id=\"{0}op\">{1}</output>\n",
name, valI);
break;
}
case CS_PROP_ENUM: {
@@ -400,27 +400,28 @@ void MjpegServerImpl::ConnThread::SendHTML(wpi::util::raw_ostream& os,
ch_name.push_back(wpi::util::isPrint(ch) ? ch : ' ');
}
wpi::util::print(os,
"<input id=\"{0}{1}\" type=\"radio\" name=\"{0}\" "
"value=\"{2}\" onclick=\"update('{0}', {1})\"",
name, j, ch_name.str());
"<input id=\"{0}{1}\" type=\"radio\" name=\"{0}\" "
"value=\"{2}\" onclick=\"update('{0}', {1})\"",
name, j, ch_name.str());
if (j == valE) {
os << " checked";
}
wpi::util::print(os, " /><label for=\"{}{}\">{}</label>\n", name, j,
ch_name.str());
ch_name.str());
}
break;
}
case CS_PROP_STRING: {
wpi::util::SmallString<128> strval_buf;
wpi::util::print(os,
"<input type=\"text\" id=\"{0}box\" name=\"{0}\" "
"value=\"{1}\" />\n",
name, source.GetStringProperty(prop, strval_buf, &status));
"<input type=\"text\" id=\"{0}box\" name=\"{0}\" "
"value=\"{1}\" />\n",
name,
source.GetStringProperty(prop, strval_buf, &status));
wpi::util::print(os,
"<input type=\"button\" value =\"Submit\" "
"onclick=\"update('{0}', {0}box.value)\" />\n",
name);
"<input type=\"button\" value =\"Submit\" "
"onclick=\"update('{0}', {0}box.value)\" />\n",
name);
break;
}
default:
@@ -473,8 +474,8 @@ void MjpegServerImpl::ConnThread::SendHTML(wpi::util::raw_ostream& os,
os << "unknown";
break;
}
wpi::util::print(os, "</td><td>{}</td><td>{}</td><td>{}</td></tr>", mode.width,
mode.height, mode.fps);
wpi::util::print(os, "</td><td>{}</td><td>{}</td><td>{}</td></tr>",
mode.width, mode.height, mode.fps);
}
os << "</table>\n";
os << endRootPage << "\r\n";
@@ -505,12 +506,14 @@ void MjpegServerImpl::ConnThread::SendJSON(wpi::util::raw_ostream& os,
wpi::util::print(os, "\n\"name\": \"{}\"", name);
wpi::util::print(os, ",\n\"id\": \"{}\"", prop);
wpi::util::print(os, ",\n\"type\": \"{}\"", static_cast<int>(kind));
wpi::util::print(os, ",\n\"min\": \"{}\"", source.GetPropertyMin(prop, &status));
wpi::util::print(os, ",\n\"max\": \"{}\"", source.GetPropertyMax(prop, &status));
wpi::util::print(os, ",\n\"min\": \"{}\"",
source.GetPropertyMin(prop, &status));
wpi::util::print(os, ",\n\"max\": \"{}\"",
source.GetPropertyMax(prop, &status));
wpi::util::print(os, ",\n\"step\": \"{}\"",
source.GetPropertyStep(prop, &status));
source.GetPropertyStep(prop, &status));
wpi::util::print(os, ",\n\"default\": \"{}\"",
source.GetPropertyDefault(prop, &status));
source.GetPropertyDefault(prop, &status));
os << ",\n\"value\": \"";
switch (kind) {
case CS_PROP_BOOLEAN:
@@ -597,10 +600,10 @@ void MjpegServerImpl::ConnThread::SendJSON(wpi::util::raw_ostream& os,
os.flush();
}
MjpegServerImpl::MjpegServerImpl(std::string_view name, wpi::util::Logger& logger,
Notifier& notifier, Telemetry& telemetry,
std::string_view listenAddress, int port,
std::unique_ptr<wpi::net::NetworkAcceptor> acceptor)
MjpegServerImpl::MjpegServerImpl(
std::string_view name, wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry, std::string_view listenAddress, int port,
std::unique_ptr<wpi::net::NetworkAcceptor> acceptor)
: SinkImpl{name, logger, notifier, telemetry},
m_listenAddress(listenAddress),
m_port(port),
@@ -813,14 +816,17 @@ void MjpegServerImpl::ConnThread::ProcessRequest() {
// compatibility, others are for Axis camera compatibility.
if ((pos = req.find("POST /stream")) != std::string_view::npos) {
kind = kStream;
parameters = wpi::util::substr(wpi::util::substr(req, req.find('?', pos + 12)), 1);
parameters =
wpi::util::substr(wpi::util::substr(req, req.find('?', pos + 12)), 1);
} else if ((pos = req.find("GET /?action=stream")) !=
std::string_view::npos) {
kind = kStream;
parameters = wpi::util::substr(wpi::util::substr(req, req.find('&', pos + 19)), 1);
parameters =
wpi::util::substr(wpi::util::substr(req, req.find('&', pos + 19)), 1);
} else if ((pos = req.find("GET /stream.mjpg")) != std::string_view::npos) {
kind = kStream;
parameters = wpi::util::substr(wpi::util::substr(req, req.find('?', pos + 16)), 1);
parameters =
wpi::util::substr(wpi::util::substr(req, req.find('?', pos + 16)), 1);
} else if (req.find("GET /settings") != std::string_view::npos &&
req.find(".json") != std::string_view::npos) {
kind = kGetSettings;
@@ -836,7 +842,8 @@ void MjpegServerImpl::ConnThread::ProcessRequest() {
} else if ((pos = req.find("GET /?action=command")) !=
std::string_view::npos) {
kind = kCommand;
parameters = wpi::util::substr(wpi::util::substr(req, req.find('&', pos + 20)), 1);
parameters =
wpi::util::substr(wpi::util::substr(req, req.find('&', pos + 20)), 1);
} else if (req.find("GET / ") != std::string_view::npos || req == "GET /\n") {
kind = kRootPage;
} else {
@@ -959,11 +966,12 @@ void MjpegServerImpl::ServerThreadMain() {
std::scoped_lock lock(m_mutex);
// Find unoccupied worker thread, or create one if necessary
auto it = std::find_if(m_connThreads.begin(), m_connThreads.end(),
[](const wpi::util::SafeThreadOwner<ConnThread>& owner) {
auto thr = owner.GetThread();
return !thr || !thr->m_stream;
});
auto it =
std::find_if(m_connThreads.begin(), m_connThreads.end(),
[](const wpi::util::SafeThreadOwner<ConnThread>& owner) {
auto thr = owner.GetThread();
return !thr || !thr->m_stream;
});
if (it == m_connThreads.end()) {
m_connThreads.emplace_back();
it = std::prev(m_connThreads.end());
@@ -1052,13 +1060,14 @@ CS_Sink CS_CreateMjpegServer(const struct WPI_String* name,
const struct WPI_String* listenAddress, int port,
CS_Status* status) {
return wpi::cs::CreateMjpegServer(wpi::util::to_string_view(name),
wpi::util::to_string_view(listenAddress), port,
status);
wpi::util::to_string_view(listenAddress),
port, status);
}
void CS_GetMjpegServerListenAddress(CS_Sink sink, WPI_String* listenAddress,
CS_Status* status) {
wpi::cs::ConvertToC(listenAddress, wpi::cs::GetMjpegServerListenAddress(sink, status));
wpi::cs::ConvertToC(listenAddress,
wpi::cs::GetMjpegServerListenAddress(sink, status));
}
int CS_GetMjpegServerPort(CS_Sink sink, CS_Status* status) {

View File

@@ -53,7 +53,8 @@ class NotifierThread
} // namespace impl
class Notifier : public wpi::util::CallbackManager<Notifier, impl::NotifierThread> {
class Notifier
: public wpi::util::CallbackManager<Notifier, impl::NotifierThread> {
friend class NotifierTest;
public:

View File

@@ -59,7 +59,8 @@ CS_PropertyKind PropertyContainer::GetPropertyKind(int property) const {
}
std::string_view PropertyContainer::GetPropertyName(
int property, wpi::util::SmallVectorImpl<char>& buf, CS_Status* status) const {
int property, wpi::util::SmallVectorImpl<char>& buf,
CS_Status* status) const {
if (!m_properties_cached && !CacheProperties(status)) {
return {};
}
@@ -168,7 +169,8 @@ int PropertyContainer::GetPropertyDefault(int property,
}
std::string_view PropertyContainer::GetStringProperty(
int property, wpi::util::SmallVectorImpl<char>& buf, CS_Status* status) const {
int property, wpi::util::SmallVectorImpl<char>& buf,
CS_Status* status) const {
if (!m_properties_cached && !CacheProperties(status)) {
return {};
}

View File

@@ -23,7 +23,7 @@ namespace wpi::util {
class Logger;
template <typename T>
class SmallVectorImpl;
} // namespace wpi
} // namespace wpi::util
namespace wpi::cs {
@@ -52,8 +52,9 @@ class PropertyContainer {
std::vector<std::string> GetEnumPropertyChoices(int property,
CS_Status* status) const;
bool SetPropertiesJson(const wpi::util::json& config, wpi::util::Logger& logger,
std::string_view logName, CS_Status* status);
bool SetPropertiesJson(const wpi::util::json& config,
wpi::util::Logger& logger, std::string_view logName,
CS_Status* status);
wpi::util::json GetPropertiesJsonObject(CS_Status* status);
protected:

View File

@@ -233,8 +233,8 @@ uint64_t CS_GrabRawSinkFrameTimeoutWithFrameTime(CS_Sink sink,
double timeout,
uint64_t lastFrameTime,
CS_Status* status) {
return wpi::cs::GrabSinkFrameTimeoutLastTime(sink, *image, timeout, lastFrameTime,
status);
return wpi::cs::GrabSinkFrameTimeoutLastTime(sink, *image, timeout,
lastFrameTime, status);
}
} // extern "C"

View File

@@ -22,10 +22,10 @@ class SourceImpl;
class RawSinkImpl : public SinkImpl {
public:
RawSinkImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry);
RawSinkImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry,
RawSinkImpl(std::string_view name, wpi::util::Logger& logger,
Notifier& notifier, Telemetry& telemetry);
RawSinkImpl(std::string_view name, wpi::util::Logger& logger,
Notifier& notifier, Telemetry& telemetry,
std::function<void(uint64_t time)> processFrame);
~RawSinkImpl() override;

View File

@@ -55,7 +55,8 @@ extern "C" {
CS_Source CS_CreateRawSource(const struct WPI_String* name, CS_Bool isCv,
const CS_VideoMode* mode, CS_Status* status) {
return wpi::cs::CreateRawSource(wpi::util::to_string_view(name), isCv,
static_cast<const wpi::cs::VideoMode&>(*mode), status);
static_cast<const wpi::cs::VideoMode&>(*mode),
status);
}
void CS_PutRawSourceFrame(CS_Source source, const struct WPI_RawFrame* image,

View File

@@ -20,8 +20,9 @@ namespace wpi::cs {
class RawSourceImpl : public ConfigurableSourceImpl {
public:
RawSourceImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry, const VideoMode& mode);
RawSourceImpl(std::string_view name, wpi::util::Logger& logger,
Notifier& notifier, Telemetry& telemetry,
const VideoMode& mode);
~RawSourceImpl() override;
// Raw-specific functions

View File

@@ -113,7 +113,8 @@ std::string SinkImpl::GetError() const {
return std::string{m_source->GetCurFrame().GetError()};
}
std::string_view SinkImpl::GetError(wpi::util::SmallVectorImpl<char>& buf) const {
std::string_view SinkImpl::GetError(
wpi::util::SmallVectorImpl<char>& buf) const {
std::scoped_lock lock(m_mutex);
if (!m_source) {
return "no source connected";
@@ -221,7 +222,8 @@ std::string GetSinkError(CS_Sink sink, CS_Status* status) {
return data->sink->GetError();
}
std::string_view GetSinkError(CS_Sink sink, wpi::util::SmallVectorImpl<char>& buf,
std::string_view GetSinkError(CS_Sink sink,
wpi::util::SmallVectorImpl<char>& buf,
CS_Status* status) {
auto data = Instance::GetInstance().GetSink(sink);
if (!data || (data->kind & SinkMask) == 0) {
@@ -245,7 +247,8 @@ void SetSinkEnabled(CS_Sink sink, bool enabled, CS_Status* status) {
extern "C" {
void CS_SetSinkDescription(CS_Sink sink, const struct WPI_String* description,
CS_Status* status) {
return wpi::cs::SetSinkDescription(sink, wpi::util::to_string_view(description), status);
return wpi::cs::SetSinkDescription(
sink, wpi::util::to_string_view(description), status);
}
void CS_GetSinkError(CS_Sink sink, struct WPI_String* error,

View File

@@ -190,7 +190,8 @@ bool SourceImpl::SetConfigJson(std::string_view config, CS_Status* status) {
return SetConfigJson(j, status);
}
bool SourceImpl::SetConfigJson(const wpi::util::json& config, CS_Status* status) {
bool SourceImpl::SetConfigJson(const wpi::util::json& config,
CS_Status* status) {
VideoMode mode;
// pixel format
@@ -260,8 +261,9 @@ bool SourceImpl::SetConfigJson(const wpi::util::json& config, CS_Status* status)
} else {
if (mode.pixelFormat != wpi::cs::VideoMode::kUnknown) {
SINFO("SetConfigJson: setting pixelFormat {}", mode.pixelFormat);
SetPixelFormat(static_cast<wpi::cs::VideoMode::PixelFormat>(mode.pixelFormat),
status);
SetPixelFormat(
static_cast<wpi::cs::VideoMode::PixelFormat>(mode.pixelFormat),
status);
}
if (mode.width != 0 && mode.height != 0) {
SINFO("SetConfigJson: setting width {}, height {}", mode.width,

View File

@@ -32,8 +32,8 @@ class SourceImpl : public PropertyContainer {
friend class Frame;
public:
SourceImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry);
SourceImpl(std::string_view name, wpi::util::Logger& logger,
Notifier& notifier, Telemetry& telemetry);
~SourceImpl() override;
SourceImpl(const SourceImpl& oth) = delete;
SourceImpl& operator=(const SourceImpl& oth) = delete;

View File

@@ -35,14 +35,15 @@ extern "C" {
CS_Source CS_CreateUsbCameraDev(const struct WPI_String* name, int dev,
CS_Status* status) {
return wpi::cs::CreateUsbCameraDev(wpi::util::to_string_view(name), dev, status);
return wpi::cs::CreateUsbCameraDev(wpi::util::to_string_view(name), dev,
status);
}
CS_Source CS_CreateUsbCameraPath(const struct WPI_String* name,
const struct WPI_String* path,
CS_Status* status) {
return wpi::cs::CreateUsbCameraPath(wpi::util::to_string_view(name),
wpi::util::to_string_view(path), status);
wpi::util::to_string_view(path), status);
}
void CS_SetUsbCameraPath(CS_Source source, const struct WPI_String* path,

View File

@@ -34,7 +34,8 @@ template <typename O, typename I>
static O* ConvertToC(std::vector<I>&& in, int* count) {
using T = std::vector<I>;
size_t size = in.size();
O* out = static_cast<O*>(wpi::util::safe_malloc(size * sizeof(O) + sizeof(T)));
O* out =
static_cast<O*>(wpi::util::safe_malloc(size * sizeof(O) + sizeof(T)));
*count = size;
for (size_t i = 0; i < size; ++i) {
out[i] = ConvertToC(in[i]);
@@ -92,7 +93,8 @@ void CS_GetStringProperty(CS_Property property, WPI_String* value,
void CS_SetStringProperty(CS_Property property, const struct WPI_String* value,
CS_Status* status) {
return wpi::cs::SetStringProperty(property, wpi::util::to_string_view(value), status);
return wpi::cs::SetStringProperty(property, wpi::util::to_string_view(value),
status);
}
WPI_String* CS_GetEnumPropertyChoices(CS_Property property, int* count,
@@ -118,7 +120,8 @@ void CS_GetSourceName(CS_Source source, WPI_String* name, CS_Status* status) {
void CS_GetSourceDescription(CS_Source source, WPI_String* description,
CS_Status* status) {
wpi::util::SmallString<128> buf;
wpi::cs::ConvertToC(description, wpi::cs::GetSourceDescription(source, buf, status));
wpi::cs::ConvertToC(description,
wpi::cs::GetSourceDescription(source, buf, status));
}
uint64_t CS_GetSourceLastFrameTime(CS_Source source, CS_Status* status) {
@@ -142,7 +145,8 @@ CS_Bool CS_IsSourceEnabled(CS_Source source, CS_Status* status) {
CS_Property CS_GetSourceProperty(CS_Source source,
const struct WPI_String* name,
CS_Status* status) {
return wpi::cs::GetSourceProperty(source, wpi::util::to_string_view(name), status);
return wpi::cs::GetSourceProperty(source, wpi::util::to_string_view(name),
status);
}
CS_Property* CS_EnumerateSourceProperties(CS_Source source, int* count,
@@ -174,8 +178,8 @@ CS_Bool CS_SetSourceVideoModeDiscrete(CS_Source source,
return wpi::cs::SetSourceVideoMode(
source,
wpi::cs::VideoMode{static_cast<wpi::cs::VideoMode::PixelFormat>(
static_cast<int>(pixelFormat)),
width, height, fps},
static_cast<int>(pixelFormat)),
width, height, fps},
status);
}
@@ -184,7 +188,8 @@ CS_Bool CS_SetSourcePixelFormat(CS_Source source,
CS_Status* status) {
return wpi::cs::SetSourcePixelFormat(
source,
static_cast<wpi::cs::VideoMode::PixelFormat>(static_cast<int>(pixelFormat)),
static_cast<wpi::cs::VideoMode::PixelFormat>(
static_cast<int>(pixelFormat)),
status);
}
@@ -200,7 +205,8 @@ CS_Bool CS_SetSourceFPS(CS_Source source, int fps, CS_Status* status) {
CS_Bool CS_SetSourceConfigJson(CS_Source source,
const struct WPI_String* config,
CS_Status* status) {
return wpi::cs::SetSourceConfigJson(source, wpi::util::to_string_view(config), status);
return wpi::cs::SetSourceConfigJson(source, wpi::util::to_string_view(config),
status);
}
void CS_GetSourceConfigJson(CS_Source source, WPI_String* config,
@@ -222,8 +228,8 @@ CS_Sink* CS_EnumerateSourceSinks(CS_Source source, int* count,
CS_Status* status) {
wpi::util::SmallVector<CS_Sink, 32> buf;
auto handles = wpi::cs::EnumerateSourceSinks(source, buf, status);
CS_Sink* sinks =
static_cast<CS_Sink*>(wpi::util::safe_malloc(handles.size() * sizeof(CS_Sink)));
CS_Sink* sinks = static_cast<CS_Sink*>(
wpi::util::safe_malloc(handles.size() * sizeof(CS_Sink)));
*count = handles.size();
std::copy(handles.begin(), handles.end(), sinks);
return sinks;
@@ -284,12 +290,14 @@ void CS_GetSinkName(CS_Sink sink, WPI_String* name, CS_Status* status) {
void CS_GetSinkDescription(CS_Sink sink, WPI_String* description,
CS_Status* status) {
wpi::util::SmallString<128> buf;
wpi::cs::ConvertToC(description, wpi::cs::GetSinkDescription(sink, buf, status));
wpi::cs::ConvertToC(description,
wpi::cs::GetSinkDescription(sink, buf, status));
}
CS_Property CS_GetSinkProperty(CS_Sink sink, const struct WPI_String* name,
CS_Status* status) {
return wpi::cs::GetSinkProperty(sink, wpi::util::to_string_view(name), status);
return wpi::cs::GetSinkProperty(sink, wpi::util::to_string_view(name),
status);
}
CS_Property* CS_EnumerateSinkProperties(CS_Sink sink, int* count,
@@ -305,7 +313,8 @@ CS_Property* CS_EnumerateSinkProperties(CS_Sink sink, int* count,
CS_Bool CS_SetSinkConfigJson(CS_Sink sink, const struct WPI_String* config,
CS_Status* status) {
return wpi::cs::SetSinkConfigJson(sink, wpi::util::to_string_view(config), status);
return wpi::cs::SetSinkConfigJson(sink, wpi::util::to_string_view(config),
status);
}
void CS_GetSinkConfigJson(CS_Sink sink, WPI_String* config, CS_Status* status) {
@@ -323,7 +332,8 @@ CS_Source CS_GetSinkSource(CS_Sink sink, CS_Status* status) {
CS_Property CS_GetSinkSourceProperty(CS_Sink sink,
const struct WPI_String* name,
CS_Status* status) {
return wpi::cs::GetSinkSourceProperty(sink, wpi::util::to_string_view(name), status);
return wpi::cs::GetSinkSourceProperty(sink, wpi::util::to_string_view(name),
status);
}
CS_Sink CS_CopySink(CS_Sink sink, CS_Status* status) {
@@ -464,8 +474,8 @@ void CS_ReleaseEnumeratedSources(CS_Source* sources, int count) {
CS_Sink* CS_EnumerateSinks(int* count, CS_Status* status) {
wpi::util::SmallVector<CS_Sink, 32> buf;
auto handles = wpi::cs::EnumerateSinkHandles(buf, status);
CS_Sink* sinks =
static_cast<CS_Sink*>(wpi::util::safe_malloc(handles.size() * sizeof(CS_Sink)));
CS_Sink* sinks = static_cast<CS_Sink*>(
wpi::util::safe_malloc(handles.size() * sizeof(CS_Sink)));
*count = handles.size();
std::copy(handles.begin(), handles.end(), sinks);
return sinks;

View File

@@ -401,9 +401,9 @@ std::vector<VideoMode> EnumerateSourceVideoModes(CS_Source source,
return data->source->EnumerateVideoModes(status);
}
std::span<CS_Sink> EnumerateSourceSinks(CS_Source source,
wpi::util::SmallVectorImpl<CS_Sink>& vec,
CS_Status* status) {
std::span<CS_Sink> EnumerateSourceSinks(
CS_Source source, wpi::util::SmallVectorImpl<CS_Sink>& vec,
CS_Status* status) {
auto& inst = Instance::GetInstance();
auto data = inst.GetSource(source);
if (!data) {
@@ -540,7 +540,8 @@ std::string GetSinkName(CS_Sink sink, CS_Status* status) {
return std::string{data->sink->GetName()};
}
std::string_view GetSinkName(CS_Sink sink, wpi::util::SmallVectorImpl<char>& buf,
std::string_view GetSinkName(CS_Sink sink,
wpi::util::SmallVectorImpl<char>& buf,
CS_Status* status) {
auto data = Instance::GetInstance().GetSink(sink);
if (!data) {
@@ -587,7 +588,8 @@ CS_Property GetSinkProperty(CS_Sink sink, std::string_view name,
}
std::span<CS_Property> EnumerateSinkProperties(
CS_Sink sink, wpi::util::SmallVectorImpl<CS_Property>& vec, CS_Status* status) {
CS_Sink sink, wpi::util::SmallVectorImpl<CS_Property>& vec,
CS_Status* status) {
auto data = Instance::GetInstance().GetSink(sink);
if (!data) {
*status = CS_INVALID_HANDLE;
@@ -873,8 +875,8 @@ std::span<CS_Source> EnumerateSourceHandles(
return Instance::GetInstance().EnumerateSourceHandles(vec);
}
std::span<CS_Sink> EnumerateSinkHandles(wpi::util::SmallVectorImpl<CS_Sink>& vec,
CS_Status* status) {
std::span<CS_Sink> EnumerateSinkHandles(
wpi::util::SmallVectorImpl<CS_Sink>& vec, CS_Status* status) {
return Instance::GetInstance().EnumerateSinkHandles(vec);
}

View File

@@ -475,7 +475,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_createUsbCameraDev
return 0;
}
CS_Status status = 0;
auto val = wpi::cs::CreateUsbCameraDev(JStringRef{env, name}.str(), dev, &status);
auto val =
wpi::cs::CreateUsbCameraDev(JStringRef{env, name}.str(), dev, &status);
CheckStatus(env, status);
return val;
}
@@ -499,7 +500,7 @@ Java_org_wpilib_vision_camera_CameraServerJNI_createUsbCameraPath
}
CS_Status status = 0;
auto val = wpi::cs::CreateUsbCameraPath(JStringRef{env, name}.str(),
JStringRef{env, path}.str(), &status);
JStringRef{env, path}.str(), &status);
CheckStatus(env, status);
return val;
}
@@ -561,7 +562,7 @@ Java_org_wpilib_vision_camera_CameraServerJNI_createHttpCameraMulti
CS_Status status = 0;
auto val =
wpi::cs::CreateHttpCamera(JStringRef{env, name}.str(), vec,
static_cast<CS_HttpCameraKind>(kind), &status);
static_cast<CS_HttpCameraKind>(kind), &status);
CheckStatus(env, status);
return val;
}
@@ -583,9 +584,10 @@ Java_org_wpilib_vision_camera_CameraServerJNI_createRawSource
CS_Status status = 0;
auto val = wpi::cs::CreateRawSource(
JStringRef{env, name}.str(), isCv,
wpi::cs::VideoMode{static_cast<wpi::cs::VideoMode::PixelFormat>(pixelFormat),
static_cast<int>(width), static_cast<int>(height),
static_cast<int>(fps)},
wpi::cs::VideoMode{
static_cast<wpi::cs::VideoMode::PixelFormat>(pixelFormat),
static_cast<int>(width), static_cast<int>(height),
static_cast<int>(fps)},
&status);
CheckStatus(env, status);
return val;
@@ -770,8 +772,9 @@ Java_org_wpilib_vision_camera_CameraServerJNI_setSourceVideoMode
CS_Status status = 0;
auto val = wpi::cs::SetSourceVideoMode(
source,
wpi::cs::VideoMode(static_cast<wpi::cs::VideoMode::PixelFormat>(pixelFormat), width,
height, fps),
wpi::cs::VideoMode(
static_cast<wpi::cs::VideoMode::PixelFormat>(pixelFormat), width,
height, fps),
&status);
CheckStatus(env, status);
return val;
@@ -788,7 +791,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_setSourcePixelFormat
{
CS_Status status = 0;
auto val = wpi::cs::SetSourcePixelFormat(
source, static_cast<wpi::cs::VideoMode::PixelFormat>(pixelFormat), &status);
source, static_cast<wpi::cs::VideoMode::PixelFormat>(pixelFormat),
&status);
CheckStatus(env, status);
return val;
}
@@ -833,7 +837,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_setSourceConfigJson
(JNIEnv* env, jclass, jint source, jstring config)
{
CS_Status status = 0;
auto val = wpi::cs::SetSourceConfigJson(source, JStringRef{env, config}, &status);
auto val =
wpi::cs::SetSourceConfigJson(source, JStringRef{env, config}, &status);
CheckStatus(env, status);
return val;
}
@@ -1271,7 +1276,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_setSourceDescription
return;
}
CS_Status status = 0;
wpi::cs::SetSourceDescription(source, JStringRef{env, description}.str(), &status);
wpi::cs::SetSourceDescription(source, JStringRef{env, description}.str(),
&status);
CheckStatus(env, status);
}
@@ -1342,8 +1348,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_createMjpegServer
}
CS_Status status = 0;
auto val = wpi::cs::CreateMjpegServer(JStringRef{env, name}.str(),
JStringRef{env, listenAddress}.str(), port,
&status);
JStringRef{env, listenAddress}.str(),
port, &status);
CheckStatus(env, status);
return val;
}
@@ -1432,7 +1438,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_getSinkProperty
return 0;
}
CS_Status status = 0;
auto val = wpi::cs::GetSinkProperty(sink, JStringRef{env, name}.str(), &status);
auto val =
wpi::cs::GetSinkProperty(sink, JStringRef{env, name}.str(), &status);
CheckStatus(env, status);
return val;
}
@@ -1465,7 +1472,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_setSinkConfigJson
(JNIEnv* env, jclass, jint source, jstring config)
{
CS_Status status = 0;
auto val = wpi::cs::SetSinkConfigJson(source, JStringRef{env, config}, &status);
auto val =
wpi::cs::SetSinkConfigJson(source, JStringRef{env, config}, &status);
CheckStatus(env, status);
return val;
}
@@ -1513,8 +1521,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_getSinkSourceProperty
return 0;
}
CS_Status status = 0;
auto val =
wpi::cs::GetSinkSourceProperty(sink, JStringRef{env, name}.str(), &status);
auto val = wpi::cs::GetSinkSourceProperty(sink, JStringRef{env, name}.str(),
&status);
CheckStatus(env, status);
return val;
}
@@ -1609,7 +1617,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_setSinkDescription
return;
}
CS_Status status = 0;
wpi::cs::SetSinkDescription(sink, JStringRef{env, description}.str(), &status);
wpi::cs::SetSinkDescription(sink, JStringRef{env, description}.str(),
&status);
CheckStatus(env, status);
}
@@ -1630,7 +1639,7 @@ Java_org_wpilib_vision_camera_CameraServerJNI_grabRawSinkFrame
return 0;
}
wpi::util::SetFrameData(env, rawFrameCls, frameObj, *frame,
origData != frame->data);
origData != frame->data);
return rv;
}
@@ -1648,12 +1657,12 @@ Java_org_wpilib_vision_camera_CameraServerJNI_grabRawSinkFrameTimeout
auto origData = frame->data;
CS_Status status = 0;
auto rv = wpi::cs::GrabSinkFrameTimeout(static_cast<CS_Sink>(sink), *frame,
timeout, &status);
timeout, &status);
if (!CheckStatus(env, status)) {
return 0;
}
wpi::util::SetFrameData(env, rawFrameCls, frameObj, *frame,
origData != frame->data);
origData != frame->data);
return rv;
}
@@ -1801,7 +1810,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_addPolledListener
(JNIEnv* env, jclass, jint poller, jint eventMask, jboolean immediateNotify)
{
CS_Status status = 0;
auto rv = wpi::cs::AddPolledListener(poller, eventMask, immediateNotify, &status);
auto rv =
wpi::cs::AddPolledListener(poller, eventMask, immediateNotify, &status);
CheckStatus(env, status);
return rv;
}
@@ -1887,8 +1897,8 @@ Java_org_wpilib_vision_camera_CameraServerJNI_getTelemetryValue
(JNIEnv* env, jclass, jint handle, jint kind)
{
CS_Status status = 0;
auto val = wpi::cs::GetTelemetryValue(handle, static_cast<CS_TelemetryKind>(kind),
&status);
auto val = wpi::cs::GetTelemetryValue(
handle, static_cast<CS_TelemetryKind>(kind), &status);
CheckStatus(env, status);
return val;
}

View File

@@ -252,9 +252,9 @@ std::string GetSourceConfigJson(CS_Source source, CS_Status* status);
wpi::util::json GetSourceConfigJsonObject(CS_Source source, CS_Status* status);
std::vector<VideoMode> EnumerateSourceVideoModes(CS_Source source,
CS_Status* status);
std::span<CS_Sink> EnumerateSourceSinks(CS_Source source,
wpi::util::SmallVectorImpl<CS_Sink>& vec,
CS_Status* status);
std::span<CS_Sink> EnumerateSourceSinks(
CS_Source source, wpi::util::SmallVectorImpl<CS_Sink>& vec,
CS_Status* status);
CS_Source CopySource(CS_Source source, CS_Status* status);
void ReleaseSource(CS_Source source, CS_Status* status);
/** @} */
@@ -332,7 +332,8 @@ CS_Sink CreateCvSinkCallback(std::string_view name,
*/
CS_SinkKind GetSinkKind(CS_Sink sink, CS_Status* status);
std::string GetSinkName(CS_Sink sink, CS_Status* status);
std::string_view GetSinkName(CS_Sink sink, wpi::util::SmallVectorImpl<char>& buf,
std::string_view GetSinkName(CS_Sink sink,
wpi::util::SmallVectorImpl<char>& buf,
CS_Status* status);
std::string GetSinkDescription(CS_Sink sink, CS_Status* status);
std::string_view GetSinkDescription(CS_Sink sink,
@@ -341,7 +342,8 @@ std::string_view GetSinkDescription(CS_Sink sink,
CS_Property GetSinkProperty(CS_Sink sink, std::string_view name,
CS_Status* status);
std::span<CS_Property> EnumerateSinkProperties(
CS_Sink sink, wpi::util::SmallVectorImpl<CS_Property>& vec, CS_Status* status);
CS_Sink sink, wpi::util::SmallVectorImpl<CS_Property>& vec,
CS_Status* status);
void SetSinkSource(CS_Sink sink, CS_Source source, CS_Status* status);
CS_Property GetSinkSourceProperty(CS_Sink sink, std::string_view name,
CS_Status* status);
@@ -371,7 +373,8 @@ int GetMjpegServerPort(CS_Sink sink, CS_Status* status);
void SetSinkDescription(CS_Sink sink, std::string_view description,
CS_Status* status);
std::string GetSinkError(CS_Sink sink, CS_Status* status);
std::string_view GetSinkError(CS_Sink sink, wpi::util::SmallVectorImpl<char>& buf,
std::string_view GetSinkError(CS_Sink sink,
wpi::util::SmallVectorImpl<char>& buf,
CS_Status* status);
void SetSinkEnabled(CS_Sink sink, bool enabled, CS_Status* status);
/** @} */
@@ -437,8 +440,8 @@ std::vector<UsbCameraInfo> EnumerateUsbCameras(CS_Status* status);
std::span<CS_Source> EnumerateSourceHandles(
wpi::util::SmallVectorImpl<CS_Source>& vec, CS_Status* status);
std::span<CS_Sink> EnumerateSinkHandles(wpi::util::SmallVectorImpl<CS_Sink>& vec,
CS_Status* status);
std::span<CS_Sink> EnumerateSinkHandles(
wpi::util::SmallVectorImpl<CS_Sink>& vec, CS_Status* status);
std::string GetHostname();

View File

@@ -107,8 +107,8 @@ class CvSink : public ImageSink {
* with.
*
* @return Frame time, or 0 on error (call GetError() to obtain the error
* message); the frame time is in the same time base as wpi::util::Now(),
* and is in 1 us increments.
* message); the frame time is in the same time base as
* wpi::util::Now(), and is in 1 us increments.
*/
[[nodiscard]]
uint64_t GrabFrame(cv::Mat& image, double timeout = 0.225);
@@ -119,8 +119,8 @@ class CvSink : public ImageSink {
* with.
*
* @return Frame time, or 0 on error (call GetError() to obtain the error
* message); the frame time is in the same time base as wpi::util::Now(),
* and is in 1 us increments.
* message); the frame time is in the same time base as
* wpi::util::Now(), and is in 1 us increments.
*/
[[nodiscard]]
uint64_t GrabFrameNoTimeout(cv::Mat& image);
@@ -133,8 +133,8 @@ class CvSink : public ImageSink {
* any grabFrame*() call on the sink.
*
* @return Frame time, or 0 on error (call GetError() to obtain the error
* message); the frame time is in the same time base as wpi::util::Now(),
* and is in 1 us increments.
* message); the frame time is in the same time base as
* wpi::util::Now(), and is in 1 us increments.
*/
[[nodiscard]]
uint64_t GrabFrameDirect(cv::Mat& image, double timeout = 0.225);
@@ -146,8 +146,8 @@ class CvSink : public ImageSink {
* any grabFrame*() call on the sink.
*
* @return Frame time, or 0 on error (call GetError() to obtain the error
* message); the frame time is in the same time base as wpi::util::Now(),
* and is in 1 us increments.
* message); the frame time is in the same time base as
* wpi::util::Now(), and is in 1 us increments.
*/
[[nodiscard]]
uint64_t GrabFrameNoTimeoutDirect(cv::Mat& image);
@@ -166,8 +166,8 @@ class CvSink : public ImageSink {
* a new frame.
*
* @return Frame time, or 0 on error (call GetError() to obtain the error
* message); the frame time is in the same time base as wpi::util::Now(),
* and is in 1 us increments.
* message); the frame time is in the same time base as
* wpi::util::Now(), and is in 1 us increments.
*/
[[nodiscard]]
uint64_t GrabFrameDirectLastTime(cv::Mat& image, uint64_t lastFrameTime,

View File

@@ -546,8 +546,8 @@ class VideoSource {
*/
double GetActualFPS() const {
m_status = 0;
return wpi::cs::GetTelemetryAverageValue(m_handle, CS_SOURCE_FRAMES_RECEIVED,
&m_status);
return wpi::cs::GetTelemetryAverageValue(
m_handle, CS_SOURCE_FRAMES_RECEIVED, &m_status);
}
/**
@@ -560,7 +560,7 @@ class VideoSource {
double GetActualDataRate() const {
m_status = 0;
return wpi::cs::GetTelemetryAverageValue(m_handle, CS_SOURCE_BYTES_RECEIVED,
&m_status);
&m_status);
}
/**

View File

@@ -155,8 +155,8 @@ class RawSink : public ImageSink {
* The provided image will have three 8-bit channels stored in BGR order.
*
* @return Frame time, or 0 on error (call GetError() to obtain the error
* message); the frame time is in the same time base as wpi::util::Now(),
* and is in 1 us increments.
* message); the frame time is in the same time base as
* wpi::util::Now(), and is in 1 us increments.
*/
[[nodiscard]]
uint64_t GrabFrame(wpi::util::RawFrame& image, double timeout = 0.225) const;
@@ -166,8 +166,8 @@ class RawSink : public ImageSink {
* The provided image will have three 8-bit channels stored in BGR order.
*
* @return Frame time, or 0 on error (call GetError() to obtain the error
* message); the frame time is in the same time base as wpi::util::Now(),
* and is in 1 us increments.
* message); the frame time is in the same time base as
* wpi::util::Now(), and is in 1 us increments.
*/
[[nodiscard]]
uint64_t GrabFrameNoTimeout(wpi::util::RawFrame& image) const;
@@ -183,8 +183,8 @@ class RawSink : public ImageSink {
* a new frame.
*
* @return Frame time, or 0 on error (call GetError() to obtain the error
* message); the frame time is in the same time base as wpi::util::Now(),
* and is in 1 us increments.
* message); the frame time is in the same time base as
* wpi::util::Now(), and is in 1 us increments.
*/
[[nodiscard]]
uint64_t GrabFrameLastTime(wpi::util::RawFrame& image, uint64_t lastFrameTime,
@@ -216,7 +216,8 @@ inline RawSink::RawSink(std::string_view name,
m_handle = CreateRawSinkCallback(name, false, processFrame, &m_status);
}
inline uint64_t RawSink::GrabFrame(wpi::util::RawFrame& image, double timeout) const {
inline uint64_t RawSink::GrabFrame(wpi::util::RawFrame& image,
double timeout) const {
m_status = 0;
return GrabSinkFrameTimeout(m_handle, image, timeout, &m_status);
}

View File

@@ -20,7 +20,8 @@ void RunMainRunLoop() {
int RunMainRunLoopTimeout(double timeout) {
wpi::util::Event& event = GetInstance();
bool timedOut = false;
bool signaled = wpi::util::WaitForObject(event.GetHandle(), timeout, &timedOut);
bool signaled =
wpi::util::WaitForObject(event.GetHandle(), timeout, &timedOut);
if (timedOut) {
return 3;
}

View File

@@ -207,13 +207,17 @@ static bool GetVendorProduct(int dev, int* vendor, int* product) {
}
std::string_view readStr{readBuf};
if (auto v = wpi::util::parse_integer<int>(
wpi::util::substr(wpi::util::substr(readStr, readStr.find('v')), 1, 4), 16)) {
wpi::util::substr(wpi::util::substr(readStr, readStr.find('v')), 1,
4),
16)) {
*vendor = v.value();
} else {
return false;
}
if (auto v = wpi::util::parse_integer<int>(
wpi::util::substr(wpi::util::substr(readStr, readStr.find('p')), 1, 4), 16)) {
wpi::util::substr(wpi::util::substr(readStr, readStr.find('p')), 1,
4),
16)) {
*product = v.value();
} else {
return false;
@@ -262,8 +266,10 @@ static bool GetDescriptionIoctl(const char* cpath, std::string* desc) {
std::optional<int> vendor;
std::optional<int> product;
if (wpi::util::starts_with(card, "UVC Camera (") &&
(vendor = wpi::util::parse_integer<int>(wpi::util::substr(card, 12, 4), 16)) &&
(product = wpi::util::parse_integer<int>(wpi::util::substr(card, 17, 4), 16))) {
(vendor =
wpi::util::parse_integer<int>(wpi::util::substr(card, 12, 4), 16)) &&
(product =
wpi::util::parse_integer<int>(wpi::util::substr(card, 17, 4), 16))) {
std::string card2 = GetUsbNameFromId(vendor.value(), product.value());
if (!card2.empty()) {
*desc = std::move(card2);
@@ -566,9 +572,9 @@ void UsbCameraImpl::CameraThreadMain() {
} else if (tsFlags == V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC) {
SDEBUG4("Got valid monotonic time for frame");
// we can't go directly to frametime, since the rest of cscore
// expects us to use wpi::util::Now, which is in an arbitrary timebase
// (see timestamp.cpp). Best I can do is (approximately) translate
// between timebases
// expects us to use wpi::util::Now, which is in an arbitrary
// timebase (see timestamp.cpp). Best I can do is (approximately)
// translate between timebases
// grab current time in the same timebase as buf.timestamp
struct timespec ts;
@@ -595,7 +601,8 @@ void UsbCameraImpl::CameraThreadMain() {
// Can't do anything if we can't access the clock, leave default
}
} else if (tsFlags == V4L2_BUF_FLAG_TIMESTAMP_COPY) {
SDEBUG4("Got valid copy time for frame - default to wpi::util::Now");
SDEBUG4(
"Got valid copy time for frame - default to wpi::util::Now");
}
PutFrame(static_cast<VideoMode::PixelFormat>(m_mode.pixelFormat),
@@ -1708,8 +1715,8 @@ std::vector<UsbCameraInfo> EnumerateUsbCameras(CS_Status* status) {
}
unsigned int dev = 0;
if (auto v =
wpi::util::parse_integer<unsigned int>(wpi::util::substr(fname, 5), 10)) {
if (auto v = wpi::util::parse_integer<unsigned int>(
wpi::util::substr(fname, 5), 10)) {
dev = v.value();
} else {
continue;
@@ -1760,8 +1767,8 @@ std::vector<UsbCameraInfo> EnumerateUsbCameras(CS_Status* status) {
std::string fname = fs::path{target}.filename();
std::optional<unsigned int> dev;
if (wpi::util::starts_with(fname, "video") &&
(dev = wpi::util::parse_integer<unsigned int>(wpi::util::substr(fname, 5),
10)) &&
(dev = wpi::util::parse_integer<unsigned int>(
wpi::util::substr(fname, 5), 10)) &&
dev.value() < retval.size()) {
retval[dev.value()].otherPaths.emplace_back(path.str());
}

View File

@@ -31,8 +31,9 @@ class Telemetry;
class UsbCameraImpl : public SourceImpl {
public:
UsbCameraImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry, std::string_view path);
UsbCameraImpl(std::string_view name, wpi::util::Logger& logger,
Notifier& notifier, Telemetry& telemetry,
std::string_view path);
~UsbCameraImpl() override;
void Start() override;

View File

@@ -24,7 +24,8 @@ class UsbCameraListener::Impl {
std::unique_ptr<wpi::net::EventLoopRunner> m_runner;
};
UsbCameraListener::UsbCameraListener(wpi::util::Logger& logger, Notifier& notifier)
UsbCameraListener::UsbCameraListener(wpi::util::Logger& logger,
Notifier& notifier)
: m_impl(std::make_unique<Impl>(notifier)) {}
UsbCameraListener::~UsbCameraListener() = default;
@@ -32,22 +33,23 @@ UsbCameraListener::~UsbCameraListener() = default;
void UsbCameraListener::Start() {
if (!m_impl->m_runner) {
m_impl->m_runner = std::make_unique<wpi::net::EventLoopRunner>();
m_impl->m_runner->ExecAsync([impl = m_impl.get()](wpi::net::uv::Loop& loop) {
auto refreshTimer = wpi::net::uv::Timer::Create(loop);
refreshTimer->timeout.connect([notifier = &impl->m_notifier] {
notifier->NotifyUsbCamerasChanged();
});
refreshTimer->Unreference();
m_impl->m_runner->ExecAsync(
[impl = m_impl.get()](wpi::net::uv::Loop& loop) {
auto refreshTimer = wpi::net::uv::Timer::Create(loop);
refreshTimer->timeout.connect([notifier = &impl->m_notifier] {
notifier->NotifyUsbCamerasChanged();
});
refreshTimer->Unreference();
auto devEvents = wpi::net::uv::FsEvent::Create(loop);
devEvents->fsEvent.connect([refreshTimer](const char* fn, int flags) {
if (wpi::util::starts_with(fn, "video")) {
refreshTimer->Start(wpi::net::uv::Timer::Time(200));
}
});
devEvents->Start("/dev");
devEvents->Unreference();
});
auto devEvents = wpi::net::uv::FsEvent::Create(loop);
devEvents->fsEvent.connect([refreshTimer](const char* fn, int flags) {
if (wpi::util::starts_with(fn, "video")) {
refreshTimer->Start(wpi::net::uv::Timer::Time(200));
}
});
devEvents->Start("/dev");
devEvents->Unreference();
});
}
}

View File

@@ -267,7 +267,8 @@ std::unique_ptr<UsbCameraProperty> UsbCameraProperty::DeviceQuery(int fd,
return prop;
}
bool UsbCameraProperty::DeviceGet(std::unique_lock<wpi::util::mutex>& lock, int fd) {
bool UsbCameraProperty::DeviceGet(std::unique_lock<wpi::util::mutex>& lock,
int fd) {
if (fd < 0) {
return true;
}
@@ -313,8 +314,8 @@ bool UsbCameraProperty::DeviceSet(std::unique_lock<wpi::util::mutex>& lock,
return DeviceSet(lock, fd, value, valueStrCopy.str());
}
bool UsbCameraProperty::DeviceSet(std::unique_lock<wpi::util::mutex>& lock, int fd,
int newValue,
bool UsbCameraProperty::DeviceSet(std::unique_lock<wpi::util::mutex>& lock,
int fd, int newValue,
std::string_view newValueStr) const {
if (!device || fd < 0) {
return true;

View File

@@ -8,7 +8,8 @@ using namespace wpi::cs;
class NetworkListener::Impl {};
NetworkListener::NetworkListener(wpi::util::Logger& logger, Notifier& notifier) {}
NetworkListener::NetworkListener(wpi::util::Logger& logger,
Notifier& notifier) {}
NetworkListener::~NetworkListener() = default;

View File

@@ -94,7 +94,8 @@ STDMETHODIMP SourceReaderCB::OnReadSample(HRESULT hrStatus, DWORD dwStreamIndex,
// Create a Source Reader COM Smart Object
ComPtr<SourceReaderCB> CreateSourceReaderCB(
std::weak_ptr<wpi::cs::UsbCameraImpl> source, const wpi::cs::VideoMode& mode) {
std::weak_ptr<wpi::cs::UsbCameraImpl> source,
const wpi::cs::VideoMode& mode) {
SourceReaderCB* ptr = new SourceReaderCB(source, mode);
ComPtr<SourceReaderCB> sourceReaderCB;
sourceReaderCB.Attach(ptr);

View File

@@ -35,7 +35,9 @@ class SourceReaderCB : public IMFSourceReaderCallback {
IMFSample* pSample // Can be NULL
);
void InvalidateCapture() { m_source = std::weak_ptr<wpi::cs::UsbCameraImpl>(); }
void InvalidateCapture() {
m_source = std::weak_ptr<wpi::cs::UsbCameraImpl>();
}
private:
// Destructor is private. Caller should call Release.
@@ -48,7 +50,8 @@ class SourceReaderCB : public IMFSourceReaderCallback {
};
ComPtr<SourceReaderCB> CreateSourceReaderCB(
std::weak_ptr<wpi::cs::UsbCameraImpl> source, const wpi::cs::VideoMode& mode);
std::weak_ptr<wpi::cs::UsbCameraImpl> source,
const wpi::cs::VideoMode& mode);
ComPtr<IMFSourceReader> CreateSourceReader(IMFMediaSource* mediaSource,
IMFSourceReaderCallback* callback);
ComPtr<IMFMediaSource> CreateVideoCaptureDevice(LPCWSTR pszSymbolicLink);

View File

@@ -20,7 +20,8 @@ void RunMainRunLoop() {
int RunMainRunLoopTimeout(double timeout) {
wpi::util::Event& event = GetInstance();
bool timedOut = false;
bool signaled = wpi::util::WaitForObject(event.GetHandle(), timeout, &timedOut);
bool signaled =
wpi::util::WaitForObject(event.GetHandle(), timeout, &timedOut);
if (timedOut) {
return 3;
}

View File

@@ -39,10 +39,11 @@ namespace wpi::cs {
class UsbCameraImpl : public SourceImpl,
public std::enable_shared_from_this<UsbCameraImpl> {
public:
UsbCameraImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry, std::string_view path);
UsbCameraImpl(std::string_view name, wpi::util::Logger& logger, Notifier& notifier,
Telemetry& telemetry, int deviceId);
UsbCameraImpl(std::string_view name, wpi::util::Logger& logger,
Notifier& notifier, Telemetry& telemetry,
std::string_view path);
UsbCameraImpl(std::string_view name, wpi::util::Logger& logger,
Notifier& notifier, Telemetry& telemetry, int deviceId);
~UsbCameraImpl() override;
void Start() override;

View File

@@ -58,7 +58,8 @@ class UsbCameraListener::Impl {
std::unique_ptr<wpi::cs::WindowsMessagePump> m_messagePump;
};
UsbCameraListener::UsbCameraListener(wpi::util::Logger& logger, Notifier& notifier)
UsbCameraListener::UsbCameraListener(wpi::util::Logger& logger,
Notifier& notifier)
: m_impl{std::make_unique<Impl>(notifier)} {}
UsbCameraListener::~UsbCameraListener() {

View File

@@ -85,13 +85,14 @@ class UsbCameraProperty : public PropertyImpl {
IAMCameraControl* pProcAmp);
bool DeviceSet(std::unique_lock<wpi::util::mutex>& lock,
IAMCameraControl* pProcAmp) const;
bool DeviceSet(std::unique_lock<wpi::util::mutex>& lock, IAMCameraControl* pProcAmp,
int newValue) const;
bool DeviceSet(std::unique_lock<wpi::util::mutex>& lock,
IAMCameraControl* pProcAmp, int newValue) const;
bool DeviceGet(std::unique_lock<wpi::util::mutex>& lock, IAMVideoProcAmp* pProcAmp);
bool DeviceGet(std::unique_lock<wpi::util::mutex>& lock,
IAMVideoProcAmp* pProcAmp);
bool DeviceSet(std::unique_lock<wpi::util::mutex>& lock,
IAMVideoProcAmp* pProcAmp) const;
bool DeviceSet(std::unique_lock<wpi::util::mutex>& lock, IAMVideoProcAmp* pProcAmp,
int newValue) const;
bool DeviceSet(std::unique_lock<wpi::util::mutex>& lock,
IAMVideoProcAmp* pProcAmp, int newValue) const;
};
} // namespace wpi::cs