CVB++ 15.0
detail_notify_observable.hpp
1#pragma once
2
3#include "../../global.hpp"
4
5#include "../_decl/decl_notify_observable.hpp"
6
7#include "../../_cexports/c_driver.h"
8
9#include "../../_decl/decl_device.hpp"
10
11namespace Cvb
12{
13
14 CVB_BEGIN_INLINE_NS
15
16 namespace Driver
17 {
18
19 inline NotifyObservable::NotifyObservable(const DevicePtr &parent, int index)
20 : parent_(parent)
21 {
22 std::size_t bufferSize = 0;
23 CExports::CVNotifyInfo_t eventNumber = 0;
24 auto bufferSizeResult = CExports::NOGetDescription(parent_->Handle(), static_cast<std::size_t>(index), nullptr,
25 bufferSize, eventNumber);
26 if (bufferSizeResult < 0)
27 std::rethrow_exception(CvbException::FromCvbResult(bufferSizeResult, "failed description buffer size"));
28
29 std::vector<char> buffer(bufferSize);
30 auto bufferResult = CExports::NOGetDescription(parent_->Handle(), static_cast<std::size_t>(index), &buffer[0],
31 bufferSize, eventNumber);
32 if (bufferResult)
33 std::rethrow_exception(CvbException::FromCvbResult(bufferResult, "failed description buffer"));
34
35 eventNumber_ = eventNumber;
36 description_ = String(buffer.begin(), buffer.end());
37
38 CExports::cvbres_t resultRegister =
39 CExports::NORegister(parent_->Handle(), static_cast<CExports::CVNotifyEvent_t>(eventNumber_),
40 &NotifyObservable::Callback, this, cookie_);
41 if (resultRegister < 0)
42 std::rethrow_exception(CvbException::FromCvbResult(resultRegister, "failed to register node object"));
43 }
44
45 inline NotifyObservable::~NotifyObservable()
46 {
47 // may be switched to another port
48 CExports::NOUnregister(parent_->Handle(), cookie_);
49 }
50
52 {
53 CExports::cvbint64_t info = 0;
54 auto result = CExports::NOGetStatus(parent_->Handle(), static_cast<CExports::CVNotifyEvent_t>(ID()),
55 CExports::CVNO_INFO_IS_AVAILABLE, info);
56 if (result < 0)
57 std::rethrow_exception(CvbException::FromCvbResult(result, "failed get status available"));
58
59 return (info) ? true : false;
60 }
61
63 {
64 auto carrier = Internal::CbCarrier<void(NotifyArgs)>::Create(handler);
65 return carrierContainer_.Register(carrier);
66 }
67
68 inline void NotifyObservable::UnregisterEvent(EventCookie eventCookie) noexcept
69 {
70 carrierContainer_.Unregister(eventCookie);
71 }
72
73 } // namespace Driver
74
75 CVB_END_INLINE_NS
76
77} // namespace Cvb
Event argument for notification events.
Definition decl_notify_observable.hpp:22
bool IsAvailable() const
Gets whether the current device can actually handle this event.
Definition detail_notify_observable.hpp:51
int ID() const noexcept
Get the native ID.
Definition decl_notify_observable.hpp:134
void UnregisterEvent(EventCookie eventCookie) noexcept
Manually unregister a listener to this observable.
Definition detail_notify_observable.hpp:68
EventCookie RegisterEvent(std::function< void(NotifyArgs)> handler)
Register a listener to this observable.
Definition detail_notify_observable.hpp:62
Namespace for driver or device related operations.
Definition decl_composite.hpp:28
Root namespace for the Image Manager interface.
Definition c_bayer_to_rgb.h:17
std::string String
String for wide characters or unicode characters.
Definition string.hpp:49
std::shared_ptr< Device > DevicePtr
Convenience shared pointer for Device.
Definition global.hpp:98
T rethrow_exception(T... args)