6#include "../_cexports/c_gev_server.h"
8#include "../global.hpp"
10#include "_decl/decl_node.hpp"
36 ValueNode(
const ValueNode &other) =
delete;
37 ValueNode &operator=(
const ValueNode &other) =
delete;
38 ValueNode(ValueNode &&other) =
delete;
39 ValueNode &operator=(ValueNode &&other) =
delete;
43 CVB_CALL_CAPI(GSNUnregisterEvent(
Handle(), CExports::TGSNodeEvent::GSNE_Read, readCallbackID_));
46 CVB_CALL_CAPI(GSNUnregisterEvent(
Handle(), CExports::TGSNodeEvent::GSNE_Write, writeCallbackID_));
68 return CVB_CALL_CAPI(GSNSetInfoAsInteger(
Handle(), CExports::TGSNodeInfo::GSNI_Streamable, (value ? 1 : 0)));
79 template <
class Rep,
class Period>
96 auto bufferSize = NativeCall<size_t>(
97 [&](
size_t &size) {
return CExports::GSNGetAsStringTyped(
Handle(),
reinterpret_cast<Char *
>(0), size); });
98 bufferSize +=
sizeof(
Char);
100 NativeCall([&]() {
return CExports::GSNGetAsStringTyped(
Handle(), buffer.data(), bufferSize); });
101 return buffer.data();
111 NativeCall([&]() {
return CExports::GSNSetAsStringTyped(
Handle(), value.data()); });
122 auto holder = Internal::CbCarrier<void(ValueNode &)>::Create(handler);
123 return updatedCarrierContainerWritten_.Register(holder);
133 updatedCarrierContainerWritten_.Unregister(eventCookie);
144 auto holder = Internal::CbCarrier<void(ValueNode &)>::Create(handler);
145 return updatedCarrierContainerOnRead_.Register(holder);
155 updatedCarrierContainerOnRead_.Unregister(eventCookie);
159 explicit ValueNode(HandleGuard<Node> &&guard)
160 :
Node(std::move(guard))
168 int resultRegister = CVB_CALL_CAPI(GSNRegisterEventWithStatus(
169 Handle(), CExports::TGSNodeEvent::GSNE_Read, &ValueNode::EventOnReadCallback,
this, readCallbackID_));
170 if (resultRegister < 0)
171 std::rethrow_exception(CvbException::FromCvbResult(resultRegister,
"failed to register updated handler"));
174 CVB_CALL_CAPI(GSNRegisterEventWithStatus(
Handle(), CExports::TGSNodeEvent::GSNE_Write,
175 &ValueNode::EventWrittenCallback,
this, writeCallbackID_));
176 if (resultRegister < 0)
177 std::rethrow_exception(CvbException::FromCvbResult(resultRegister,
"failed to register updated handler"));
183 static void __stdcall EventWrittenCallback(CExports::cvbres_t &status,
void *pPrivate)
185 if (status == ReplyStatus::Success)
189 auto node =
reinterpret_cast<ValueNode *
>(pPrivate);
190 node->updatedCarrierContainerWritten_.Call<void(ValueNode &)>(*node);
198 case ReplyStatus::Success:
201 case ReplyStatus::AccessDenied:
204 case ReplyStatus::Busy:
207 case ReplyStatus::NotImplemented:
210 case ReplyStatus::DataOverrun:
213 case ReplyStatus::InvalidParameter:
216 case ReplyStatus::WrongConfig:
220 case ReplyStatus::LocalProblem:
226 static void __stdcall EventOnReadCallback(CExports::cvbres_t &status,
void *pPrivate)
228 if (status == ReplyStatus::Success)
232 auto node =
reinterpret_cast<ValueNode *
>(pPrivate);
233 node->updatedCarrierContainerOnRead_.Call<void(ValueNode &)>(*node);
242 case ReplyStatus::Success:
245 case ReplyStatus::AccessDenied:
248 case ReplyStatus::Busy:
251 case ReplyStatus::NotImplemented:
254 case ReplyStatus::DataOverrun:
257 case ReplyStatus::InvalidParameter:
260 case ReplyStatus::WrongConfig:
264 case ReplyStatus::LocalProblem:
270 Internal::CarrierContainer updatedCarrierContainerWritten_;
271 Internal::CarrierContainer updatedCarrierContainerOnRead_;
273 std::size_t readCallbackID_{0};
274 std::size_t writeCallbackID_{0};
Cookie used to unregister event handlers.
Definition global.hpp:591
Basic GevServer node for device feature access.
Definition decl_node.hpp:34
void * Handle() const noexcept
Classic API node handle.
Definition decl_node.hpp:102
Base class for all nodes that have a value.
Definition value_node.hpp:21
virtual String ToString() const
Returns this node's value as a string representation.
Definition value_node.hpp:94
void UnregisterEventOnReadUpdated(EventCookie eventCookie) noexcept
Manually unregister a listener to the node on read event.
Definition value_node.hpp:153
EventCookie RegisterEventOnReadUpdated(std::function< void(ValueNode &)> handler)
Register a listener to node on read event.
Definition value_node.hpp:142
virtual void SetIsStreamable(const std::int64_t &value)
Sets whether this node should be used when the camera settings are stored.
Definition value_node.hpp:65
virtual void FromString(const String &value)
Sets this node's value from the string value.
Definition value_node.hpp:109
virtual bool IsStreamable() const
Gets whether this node should be used when the camera settings are stored.
Definition value_node.hpp:55
void UnregisterEventWrittenUpdated(EventCookie eventCookie) noexcept
Manually unregister a listener to the node written event.
Definition value_node.hpp:131
EventCookie RegisterEventWrittenUpdated(std::function< void(ValueNode &)> handler)
Register a listener to node written event.
Definition value_node.hpp:120
std::chrono::duration< Rep, Period > PollingTime() const
Gets the polling time of this value.
Definition value_node.hpp:80
const int CVB_BUSY
Hardware busy.
Definition exception.hpp:57
const int CVB_ERROR
Generic unspecified error.
Definition exception.hpp:23
const int CVB_NOTENOUGHDATA
Too few data available for a calculation.
Definition exception.hpp:65
const int CVB_OK
No error occurred.
Definition exception.hpp:21
const int CVB_PARAMETER
Parameter error.
Definition exception.hpp:25
const int CVB_ACCESS
Access error.
Definition exception.hpp:111
const int CVB_NOTSUPPORTED
A certain feature is not supported.
Definition exception.hpp:59
const int CVB_OVERFLOW
Input value was too big or did lead to a too big result.
Definition exception.hpp:107
Describes a GenICam Pixel Format Naming Convention (PFNC) compatible image memory buffer with possibl...
Definition decl_int_swiss_knife_node.hpp:11
@ PollingTime
Gets the polling time in ms.
Definition gevserver.hpp:204
@ Streamable
Information on the streamability of the node.
Definition gevserver.hpp:199
NodeType
Available node types.
Definition gevserver.hpp:162
@ String
Node is a string node (no reg).
Definition gevserver.hpp:168
@ Category
Node is a category node.
Definition gevserver.hpp:165
@ EnumEntry
Node is an enumeration entry node (no reg).
Definition gevserver.hpp:173
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
char Char
Character type for wide characters or unicode characters.
Definition string.hpp:63
T rethrow_exception(T... args)