AJA NTV2 SDK  17.1.1.1245
NTV2 SDK 17.1.1.1245
eventimpl.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
9 #include "ajabase/system/event.h"
10 #include "ajabase/system/debug.h"
11 
12 #define MAX_EVENTS 64
13 
14 using std::string;
15 
16 // event implementation class (windows)
17 AJAEventImpl::AJAEventImpl(bool manualReset, const std::string& name)
18  :mManualReset(manualReset)
19 {
20  if (name == "")
21  {
22  mEvent = CreateEvent(NULL, manualReset? TRUE:FALSE, FALSE, NULL);
23  }
24  else
25  {
26  mEvent = CreateEvent(NULL, manualReset? TRUE:FALSE, FALSE, name.c_str());
27  }
28 }
29 
30 
32 {
33  // close the handle to the windows event
34  if (mEvent != NULL)
35  {
36  CloseHandle(mEvent);
37  }
38 }
39 
40 
41 AJAStatus
43 {
44  // check for open
45  if (mEvent == NULL)
46  {
47  return AJA_STATUS_INITIALIZE;
48  }
49 
50  // signal event
51  return ::SetEvent(mEvent) ? AJA_STATUS_SUCCESS : AJA_STATUS_FAIL;
52 }
53 
54 
57 {
58  // check for open
59  if (mEvent == NULL)
60  {
61  return AJA_STATUS_INITIALIZE;
62  }
63 
64  return ::ResetEvent(mEvent) ? AJA_STATUS_SUCCESS : AJA_STATUS_FAIL;
65 }
66 
67 
69 AJAEventImpl::SetState(bool signaled)
70 {
71  AJAStatus status;
72 
73  if (signaled)
74  {
75  status = Signal();
76  }
77  else
78  {
79  status = Clear();
80  }
81 
82  return status;
83 }
84 
85 
87 AJAEventImpl::GetState(bool* pSignaled)
88 {
89  if (pSignaled != NULL)
90  {
91  // wait with timeout 0 returns immediately
92  AJAStatus status = WaitForSignal(0);
93  // the event was signaled
94  if (status == AJA_STATUS_SUCCESS)
95  {
96  *pSignaled = true;
97  }
98  else if (status == AJA_STATUS_TIMEOUT)
99  {
100  *pSignaled = false;
101  }
102  else
103  {
104  return status;
105  }
106  }
107 
108  return AJA_STATUS_SUCCESS;
109 }
110 
111 
112 AJAStatus
113 AJAEventImpl::SetManualReset(bool manualReset)
114 {
115  mManualReset = manualReset;
116  return AJA_STATUS_SUCCESS;
117 }
118 
119 
120 AJAStatus
121 AJAEventImpl::GetManualReset(bool* pManualReset)
122 {
123  if (pManualReset)
124  {
125  *pManualReset = mManualReset;
126  return AJA_STATUS_SUCCESS;
127  }
128  else
129  return AJA_STATUS_FAIL;
130 }
131 
132 
133 AJAStatus
134 AJAEventImpl::WaitForSignal(uint32_t timeout)
135 {
136  DWORD retCode = WAIT_OBJECT_0;
137 
138  // check for open
139  if (mEvent == NULL)
140  {
141  return AJA_STATUS_INITIALIZE;
142  }
143 
144  // check for infinite timeout
145  if (timeout == 0xffffffff)
146  {
147  timeout = INFINITE;
148  }
149 
150  if (true)//(timeout != 0)
151  {
152  // wait for the event to be signaled
153  retCode = WaitForSingleObject(mEvent, (DWORD)timeout);
154  }
155  else
156  {
157  // special case timeout==0, min wait
158  SwitchToThread();
159  }
160 
161  // the event was signaled
162  if (retCode == WAIT_OBJECT_0)
163  {
164  return AJA_STATUS_SUCCESS;
165  }
166  // the wait timed out
167  else if (retCode == WAIT_TIMEOUT)
168  {
169  return AJA_STATUS_TIMEOUT;
170  }
171 
172  // some type of error occurred
173  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAEvent::WaitForSignal WaitForSingleObject() returns error %08x", retCode);
174 
175  return AJA_STATUS_FAIL;
176 }
177 
178 AJAStatus
179 AJAEventImpl::GetEventObject(uint64_t* pEventObject)
180 {
181  if (pEventObject != NULL)
182  {
184  {
185  *pEventObject = (uint64_t)mEvent;
186  }
187  else
188  {
189  return AJA_STATUS_OPEN;
190  }
191  }
192 
193  return AJA_STATUS_SUCCESS;
194 }
195 
196 
197 
198 AJAStatus
199 AJAWaitForEvents(AJAEvent* pEventList, uint32_t numEvents, bool all, uint32_t timeout)
200 {
201  HANDLE eventArray[MAX_EVENTS];
202 
203  if (pEventList == NULL)
204  {
205  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAWaitForEvents event list is NULL");
206  return AJA_STATUS_INITIALIZE;
207  }
208 
209  if (numEvents == 0)
210  {
211  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAWaitForEvents event list is empty");
212  return AJA_STATUS_RANGE;
213  }
214 
215  if (numEvents > MAX_EVENTS)
216  {
217  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAWaitForEvents event list larger that MAX_EVENTS");
218  return AJA_STATUS_RANGE;
219  }
220 
221  uint32_t i;
222 
223  // build the array of handles from the AJAEvent(s)
224  for (i = 0; i < numEvents; i++)
225  {
226  AJAEvent* pEvent = &pEventList[i];
227  if(pEvent->mpImpl->mEvent == NULL)
228  {
229  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAWaitForEvents event not initialized");
230  return AJA_STATUS_INITIALIZE;
231  }
232  eventArray[i] = pEvent->mpImpl->mEvent;
233  }
234 
235  // check for infinite timeout
236  if (timeout == 0xffffffff)
237  {
238  timeout = INFINITE;
239  }
240 
241  // wait for event(s) to be signaled
242  DWORD retCode = WaitForMultipleObjects(numEvents, eventArray, all, (DWORD)timeout);
243 
244  // an event was signaled
245  if ((retCode >= WAIT_OBJECT_0) && (retCode < (WAIT_OBJECT_0 + numEvents)))
246  {
247  return AJA_STATUS_SUCCESS;
248  }
249  // the wait timed out
250  else if (retCode == WAIT_TIMEOUT)
251  {
252  return AJA_STATUS_TIMEOUT;
253  }
254 
255  // some type of error occurred
256  AJA_REPORT(0, AJA_DebugSeverity_Error, "AJAEvent()::WaitForEvents WaitForMultipleObjects() returns error %08x", retCode);
257 
258  return AJA_STATUS_FAIL;
259 }
HANDLE
short HANDLE
Definition: ajatypes.h:315
NULL
#define NULL
Definition: ntv2caption608types.h:19
AJA_STATUS_SUCCESS
@ AJA_STATUS_SUCCESS
Definition: types.h:381
AJA_DebugSeverity_Error
@ AJA_DebugSeverity_Error
Definition: debugshare.h:28
AJAEventImpl::~AJAEventImpl
virtual ~AJAEventImpl(void)
Definition: eventimpl.cpp:29
AJAStatus
AJAStatus
Definition: types.h:378
AJAEventImpl::mEvent
HANDLE mEvent
Definition: eventimpl.h:36
AJA_STATUS_FAIL
@ AJA_STATUS_FAIL
Definition: types.h:382
AJAWaitForEvents
AJAStatus AJAWaitForEvents(AJAEvent *pEventList, uint32_t numEvents, bool all, uint32_t timeout)
Definition: eventimpl.cpp:199
AJAEventImpl::GetState
AJAStatus GetState(bool *pSignaled)
Definition: eventimpl.cpp:90
AJAEvent
Definition: event.h:21
AJAEventImpl::SetState
AJAStatus SetState(bool signaled=true)
Definition: eventimpl.cpp:72
AJA_REPORT
#define AJA_REPORT(_index_, _severity_, _format_,...)
Definition: debug.h:117
AJAEventImpl::GetEventObject
virtual AJAStatus GetEventObject(uint64_t *pEventObject)
Definition: eventimpl.cpp:176
event.h
Declares the AJAEvent class.
AJAEventImpl::WaitForSignal
AJAStatus WaitForSignal(uint32_t timeout=0xffffffff)
Definition: eventimpl.cpp:121
AJA_STATUS_RANGE
@ AJA_STATUS_RANGE
Definition: types.h:385
AJA_STATUS_TIMEOUT
@ AJA_STATUS_TIMEOUT
Definition: types.h:384
AJA_STATUS_INITIALIZE
@ AJA_STATUS_INITIALIZE
Definition: types.h:386
AJAEventImpl::GetManualReset
AJAStatus GetManualReset(bool *pManualReset)
Definition: eventimpl.cpp:108
AJAEventImpl::AJAEventImpl
AJAEventImpl(bool manualReset, const std::string &name)
Definition: eventimpl.cpp:17
AJA_STATUS_OPEN
@ AJA_STATUS_OPEN
Definition: types.h:388
MAX_EVENTS
#define MAX_EVENTS
Definition: eventimpl.cpp:12
AJAEventImpl::SetManualReset
AJAStatus SetManualReset(bool manualReset)
Definition: eventimpl.cpp:100
INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE
Definition: ajatypes.h:329
AJAEventImpl::Clear
AJAStatus Clear(void)
Definition: eventimpl.cpp:63
AJAEventImpl::Signal
AJAStatus Signal(void)
Definition: eventimpl.cpp:39
eventimpl.h
Declares the AJAEventImpl class.
debug.h
Declares the AJADebug class.