-
Notifications
You must be signed in to change notification settings - Fork 2
/
multicam.go
246 lines (217 loc) · 9.66 KB
/
multicam.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
package multicam
// #include <multicam.h>
import "C"
import (
"fmt"
"time"
)
//go:generate go run golang.org/x/tools/cmd/stringer -type StatusCode
type StatusCode int32
const (
StatusOK StatusCode = C.MC_OK
StatusNoBoardFound StatusCode = C.MC_NO_BOARD_FOUND
StatusBadParameter StatusCode = C.MC_BAD_PARAMETER
StatusIOError StatusCode = C.MC_IO_ERROR
StatusInternalError StatusCode = C.MC_INTERNAL_ERROR
StatusNoMoreResources StatusCode = C.MC_NO_MORE_RESOURCES
StatusInUse StatusCode = C.MC_IN_USE
StatusNotSupported StatusCode = C.MC_NOT_SUPPORTED
StatusDatabaseError StatusCode = C.MC_DATABASE_ERROR
StatusOutOfBound StatusCode = C.MC_OUT_OF_BOUND
StatusInstanceNotFound StatusCode = C.MC_INSTANCE_NOT_FOUND
StatusInvalidHandle StatusCode = C.MC_INVALID_HANDLE
StatusTimeout StatusCode = C.MC_TIMEOUT
StatusInvalidValue StatusCode = C.MC_INVALID_VALUE
StatusRangeError StatusCode = C.MC_RANGE_ERROR
StatusBadHWConfig StatusCode = C.MC_BAD_HW_CONFIG
StatusNoEvent StatusCode = C.MC_NO_EVENT
StatusLicenseNotGranted StatusCode = C.MC_LICENSE_NOT_GRANTED
StatusFatalError StatusCode = C.MC_FATAL_ERROR
StatusHWEventConflict StatusCode = C.MC_HW_EVENT_CONFLICT
StatusFileNotFound StatusCode = C.MC_FILE_NOT_FOUND
StatusOverflow StatusCode = C.MC_OVERFLOW
StatusInvalidParameterSetting StatusCode = C.MC_INVALID_PARAMETER_SETTING
StatusParameterIllegalAccess StatusCode = C.MC_PARAMETER_ILLEGAL_ACCESS
StatusClusterBusy StatusCode = C.MC_CLUSTER_BUSY
StatusServiceError StatusCode = C.MC_SERVICE_ERROR
StatusInvalidSurface StatusCode = C.MC_INVALID_SURFACE
)
type Handle uint32
const (
ConfigurationHandle Handle = C.MC_CONFIGURATION
DefaultSurfaceHandle Handle = C.MC_DEFAULT_SURFACE_HANDLE
DefaultBoardHandle Handle = C.MC_BOARD
)
//go:generate go run golang.org/x/tools/cmd/stringer -type ParamID
type ParamID uint32
const (
AcquisitionModeParam ParamID = C.MC_AcquisitionMode
BoardCountParam ParamID = C.MC_BoardCount
BoardNameParam ParamID = C.MC_BoardName
BoardNameChangeParam ParamID = C.MC_NameBoard
BoardIdentifierParam ParamID = C.MC_BoardIdentifier
BoardIndexParam ParamID = C.MC_BoardIndex
BoardPCIPositionParam ParamID = C.MC_PciPosition
BoardSerialNumberParam ParamID = C.MC_SerialNumber
BoardTypeParam ParamID = C.MC_BoardType
BufferPitchParam ParamID = C.MC_BufferPitch
BufferSizeParam ParamID = C.MC_BufferSize
CamFileParam ParamID = C.MC_CamFile
ChannelStateParam ParamID = C.MC_ChannelState
ClusterParam ParamID = C.MC_Cluster
ColorFormatParam ParamID = C.MC_ColorFormat
ConnectorParam ParamID = C.MC_Connector
DriverIndexParam ParamID = C.MC_DriverIndex
ElapsedPgParam ParamID = C.MC_Elapsed_Pg
EncoderPitchParam ParamID = C.MC_EncoderPitch
ErrorHandlingParam ParamID = C.MC_ErrorHandling
ErrorLogParam ParamID = C.MC_ErrorLog
EqualizationLevelParam ParamID = C.MC_EqualizationLevel
ForceTrigParam ParamID = C.MC_ForceTrig
ImageFlipXParam ParamID = C.MC_ImageFlipX
ImageSizeXParam ParamID = C.MC_ImageSizeX
ImageSizeYParam ParamID = C.MC_ImageSizeY
InputConfigParam ParamID = C.MC_InputConfig
InputStateParam ParamID = C.MC_InputState
LinePitchParam ParamID = C.MC_LinePitch
LineRateModeParam ParamID = C.MC_LineRateMode
MetadataContentParam ParamID = C.MC_MetadataContent
MetadataGPPCInputLineParam ParamID = C.MC_MetadataGPPCInputLine
MetadataGPPCLocationParam ParamID = C.MC_MetadataGPPCLocation
MetadataGPPCResetLineParam ParamID = C.MC_MetadataGPPCResetLine
MetadataInsertionParam ParamID = C.MC_MetadataInsertion
MetadataLocationParam ParamID = C.MC_MetadataLocation
MinBufferPitchParam ParamID = C.MC_MinBufferPitch
OutputConfigParam ParamID = C.MC_OutputConfig
OutputStateParam ParamID = C.MC_OutputState
PeriodUsParam ParamID = C.MC_Period_us
SerialNumberParam ParamID = C.MC_SerialNumber
SeqLengthFrParam ParamID = C.MC_SeqLength_Fr
SeqLengthPgParam ParamID = C.MC_SeqLength_Pg
SeqLengthLnParam ParamID = C.MC_SeqLength_Ln
SignalEnableParam ParamID = C.MC_SignalEnable
SurfaceAddrParam ParamID = C.MC_SurfaceAddr
SurfaceCountParam ParamID = C.MC_SurfaceCount
SurfaceIndexParam ParamID = C.MC_SurfaceIndex
SurfacePitchParam ParamID = C.MC_SurfacePitch
SurfaceSizeParam ParamID = C.MC_SurfaceSize
SurfaceStateParam ParamID = C.MC_SurfaceState
)
const (
AnySignal ParamID = C.MC_SIG_ANY
StartAcquisitionSignal ParamID = C.MC_SIG_START_ACQUISITION_SEQUENCE
EndAcquisitionSignal ParamID = C.MC_SIG_END_ACQUISITION_SEQUENCE
AcquisitionFailureSignal ParamID = C.MC_SIG_ACQUISITION_FAILURE
ClusterUnavailableSignal ParamID = C.MC_SIG_CLUSTER_UNAVAILABLE
EndChannelActivitySignal ParamID = C.MC_SIG_END_CHANNEL_ACTIVITY
FrameTriggerViolationSignal ParamID = C.MC_SIG_FRAMETRIGGER_VIOLATION
SurfaceProcessingSignal ParamID = C.MC_SIG_SURFACE_PROCESSING
SurfaceFilledSignal ParamID = C.MC_SIG_SURFACE_FILLED
StartExposureSignal ParamID = C.MC_SIG_START_EXPOSURE
EndExposureSignal ParamID = C.MC_SIG_END_EXPOSURE
UnrecoverableOverrunSignal ParamID = C.MC_SIG_UNRECOVERABLE_OVERRUN
ReleaseSignal ParamID = C.MC_SIG_RELEASE
)
const (
SignalEnableOn int = C.MC_SignalEnable_ON
SignalEnableOff int = C.MC_SignalEnable_OFF
)
const (
SurfaceStateFree int = C.MC_SurfaceState_FREE
SurfaceStateFilling = C.MC_SurfaceState_FILLING
SurfaceStateFilled = C.MC_SurfaceState_FILLED
SurfaceStateProcessing = C.MC_SurfaceState_PROCESSING
SurfaceStateReserved = C.MC_SurfaceState_RESERVED
)
type ChannelStateID uint32
const (
ChannelStateActive ChannelStateID = C.MC_ChannelState_ACTIVE
ChannelStateIdle ChannelStateID = C.MC_ChannelState_IDLE
)
const (
ColorFormatY8 = C.MC_ColorFormat_Y8
ColorFormatY10 = C.MC_ColorFormat_Y10
ColorFormatY10P = C.MC_ColorFormat_Y10P
ColorFormatY12 = C.MC_ColorFormat_Y12
ColorFormatY14 = C.MC_ColorFormat_Y14
ColorFormatY16 = C.MC_ColorFormat_Y16
ColorFormatBayer8 = C.MC_ColorFormat_BAYER8
ColorFormatBayer10 = C.MC_ColorFormat_BAYER10
ColorFormatBayer12 = C.MC_ColorFormat_BAYER12
ColorFormatBayer14 = C.MC_ColorFormat_BAYER14
ColorFormatBayer16 = C.MC_ColorFormat_BAYER16
)
const (
AcquisitionModeSnapshot = C.MC_AcquisitionMode_SNAPSHOT
AcquisitionModeHFR = C.MC_AcquisitionMode_HFR
AcquisitionModePage = C.MC_AcquisitionMode_PAGE
AcquisitionModeWeb = C.MC_AcquisitionMode_WEB
AcquisitionModeLongPage = C.MC_AcquisitionMode_LONGPAGE
AcquisitionModeInvalid = C.MC_AcquisitionMode_INVALID
AcquisitionModeVideo = C.MC_AcquisitionMode_VIDEO
)
const IndeterminateLength = C.MC_INDETERMINATE
const (
// LED is id of built-in LED
LED = 25
)
//go:generate go run golang.org/x/tools/cmd/stringer -type MetadataContentType
type MetadataContentType int
const (
MetadataContentNone MetadataContentType = C.MC_MetadataContent_NONE
MetadataContentOneField MetadataContentType = C.MC_MetadataContent_ONE_FIELD
MetadataContentTwoField MetadataContentType = C.MC_MetadataContent_TWO_FIELD
MetadataContentThreeField MetadataContentType = C.MC_MetadataContent_THREE_FIELD
MetadataGPPCInputLineNone = C.MC_MetadataGPPCInputLine_NONE
MetadataGPPCInputLineIIN1 = C.MC_MetadataGPPCInputLine_IIN1
MetadataGPPCLocationNone = C.MC_MetadataGPPCLocation_NONE
MetadataGPPCLocationInsteadLVALCNT = C.MC_MetadataGPPCLocation_INSTEAD_LVALCNT
MetadataGPPCLocationInsteadQCNT = C.MC_MetadataGPPCLocation_INSTEAD_QCNT
MetadataGPPCResetLineNone = C.MC_MetadataGPPCResetLine_NONE
MetadataGPPCResetLineIIN4 = C.MC_MetadataGPPCResetLine_IIN4
MetadataInsertionEnable = C.MC_MetadataInsertion_ENABLE
MetadataInsertionDisable = C.MC_MetadataInsertion_DISABLE
MetadataLocationLeft = C.MC_MetadataLocation_LEFT
MetadataLocationSparse1 = C.MC_MetadataLocation_SPARSE_1
MetadataLocationLeftBoarder = C.MC_MetadataLocation_LEFT_BOARDER
MetadataLocationTap10 = C.MC_MetadataLocation_TAP10
MetadataLocationLVALRISE = C.MC_MetadataLocation_LVALRISE
)
const (
LineRateModeCamera = C.MC_LineRateMode_CAMERA
LineRateModePeriod = C.MC_LineRateMode_PERIOD
LineRateModePulse = C.MC_LineRateMode_PULSE
LineRateModeConvert = C.MC_LineRateMode_CONVERT
)
const (
ImageFlipXOff = C.MC_ImageFlipX_OFF
ImageFlipXOn = C.MC_ImageFlipX_ON
)
// OpenDriver starts up the Multicam drivers.
func OpenDriver() error {
// create channel for feedback
statusChannel := make(chan StatusCode, 1)
timeoutInSec := time.Duration(10)
// start go routine to check timeout
go func() {
select {
case <-statusChannel:
return
case <-time.After(timeoutInSec * time.Second):
// using a panic here to so the application ends if this non recoverable error occurs
panic("timeout when calling McOpenDriver()")
}
}()
status := StatusCode(C.McOpenDriver(nil))
statusChannel <- status
if status != StatusOK {
return fmt.Errorf("%s: %w", status.String(), ErrCannotOpenDriver)
}
initChannels()
return nil
}
// CloseDriver closes the Multicam drivers. Call before exiting.
func CloseDriver() error {
C.McCloseDriver()
return nil
}