BioImager  5.0.0
A .NET microscopy imaging application based on Bio library. Supports various microscopes by using imported libraries & GUI automation. Supports XInput game controllers to move stage, take images, run ImageJ macros on images or Bio C# scripts.
Loading...
Searching...
No Matches
_SDK3.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2
3
21
22import ctypes
23import os
24from ctypes import POINTER, c_double, c_int, c_uint, c_void_p
25
26
27
28AT_H = ctypes.c_int
29AT_BOOL = ctypes.c_int
30AT_64 = ctypes.c_int64
31AT_U8 = ctypes.c_uint8
32AT_WC = ctypes.c_wchar
33
34_stdcall_libraries = {}
35
36if os.name in ("nt", "ce"):
37 _stdcall_libraries["ATCORE"] = ctypes.WinDLL("atcore")
38 _stdcall_libraries["ATUTIL"] = ctypes.WinDLL("atutility")
39 CALLBACKTYPE = ctypes.WINFUNCTYPE(c_int, AT_H, POINTER(AT_WC), c_void_p)
40else:
41 _stdcall_libraries["ATCORE"] = ctypes.CDLL("atcore.so")
42 _stdcall_libraries["ATUTIL"] = ctypes.CDLL("atutility.so")
43 CALLBACKTYPE = ctypes.CFUNCTYPE(c_int, AT_H, POINTER(AT_WC), c_void_p)
44
45
46errorCodes = {}
47
48
49def errCode(name, value):
50 errorCodes[value] = name
51
52
53AT_INFINITE = 0xFFFFFFFF
54AT_CALLBACK_SUCCESS = 0
55
56AT_TRUE = 1
57AT_FALSE = 0
58
59AT_SUCCESS = 0
60errCode("AT_ERR_NOTINITIALISED", 1)
61errCode("AT_ERR_NOTIMPLEMENTED", 2)
62errCode("AT_ERR_READONLY", 3)
63errCode("AT_ERR_NOTREADABLE", 4)
64errCode("AT_ERR_NOTWRITABLE", 5)
65errCode("AT_ERR_OUTOFRANGE", 6)
66errCode("AT_ERR_INDEXNOTAVAILABLE", 7)
67errCode("AT_ERR_INDEXNOTIMPLEMENTED", 8)
68errCode("AT_ERR_EXCEEDEDMAXSTRINGLENGTH", 9)
69errCode("AT_ERR_CONNECTION", 10)
70errCode("AT_ERR_NODATA", 11)
71errCode("AT_ERR_INVALIDHANDLE", 12)
72errCode("AT_ERR_TIMEDOUT", 13)
73errCode("AT_ERR_BUFFERFULL", 14)
74errCode("AT_ERR_INVALIDSIZE", 15)
75errCode("AT_ERR_INVALIDALIGNMENT", 16)
76errCode("AT_ERR_COMM", 17)
77errCode("AT_ERR_STRINGNOTAVAILABLE", 18)
78errCode("AT_ERR_STRINGNOTIMPLEMENTED", 19)
79
80errCode("AT_ERR_NULL_FEATURE", 20)
81errCode("AT_ERR_NULL_HANDLE", 21)
82errCode("AT_ERR_NULL_IMPLEMENTED_VAR", 22)
83errCode("AT_ERR_NULL_READABLE_VAR", 23)
84errCode("AT_ERR_NULL_READONLY_VAR", 24)
85errCode("AT_ERR_NULL_WRITABLE_VAR", 25)
86errCode("AT_ERR_NULL_MINVALUE", 26)
87errCode("AT_ERR_NULL_MAXVALUE", 27)
88errCode("AT_ERR_NULL_VALUE", 28)
89errCode("AT_ERR_NULL_STRING", 29)
90errCode("AT_ERR_NULL_COUNT_VAR", 30)
91errCode("AT_ERR_NULL_ISAVAILABLE_VAR", 31)
92errCode("AT_ERR_NULL_MAXSTRINGLENGTH", 32)
93errCode("AT_ERR_NULL_EVCALLBACK", 33)
94errCode("AT_ERR_NULL_QUEUE_PTR", 34)
95errCode("AT_ERR_NULL_WAIT_PTR", 35)
96errCode("AT_ERR_NULL_PTRSIZE", 36)
97errCode("AT_ERR_NOMEMORY", 37)
98
99errCode("AT_ERR_HARDWARE_OVERFLOW", 100)
100
101
102class CameraError(Exception):
103 def __init__(self, fcnName, errNo):
104 self.errNo = errNo
105 self.fcnName = fcnName
106
107 def __str__(self):
108 return "when calling %s - %s" % (self.fcnName, errorCodes[self.errNo])
109
110
111# special case for buffer timeout
112AT_ERR_TIMEDOUT = 13
113AT_ERR_NODATA = 11
114
115
117 pass
118
119
120AT_HANDLE_UNINITIALISED = -1
121AT_HANDLE_SYSTEM = 1
122
123
124STRING = POINTER(AT_WC)
125
126# classes so that we do some magic and automatically add byrefs etc ... can classify outputs
127class _meta:
128 pass
129
130
132 def __init__(self, val):
133 self.type = val
134 self.val = POINTER(val)
135
136 def getVar(self, bufLen=0):
137 v = self.type()
138 return v, ctypes.byref(v)
139
140
142 def __init__(self):
143 self.valval = STRING
144
145 def getVar(self, bufLen):
146 v = ctypes.create_unicode_buffer(bufLen)
147 return v, v
148
149
150OUTSTRING = _OUTSTRING()
151
152
154 def __init__(self):
155 self.val = c_int
156
157
158OUTSTRLEN = _OUTSTRLEN()
159
160
161def stripMeta(val):
162 if isinstance(val, _meta):
163 return val.val
164 else:
165 return val
166
167
169 def __init__(self, name, args=[], argnames=[], lib="ATCORE"):
170 self.f = getattr(_stdcall_libraries[lib], name)
171 self.f.restype = c_int
172 self.f.argtypes = [stripMeta(a) for a in args]
173
174 self.fargs = args
175 self.fargnames = argnames
176 self.name = name
177
178 self.inp = [not isinstance(a, OUTPUT) for a in args]
179 self.in_args = [a for a in args if not isinstance(a, OUTPUT)]
180 self.out_args = [a for a in args if isinstance(a, OUTPUT)]
181
183 for i in range(len(self.in_args)):
184 if isinstance(self.in_args[i], _OUTSTRLEN):
186
187 ds = name + "\n\nArguments:\n===========\n"
188 for i in range(len(args)):
189 an = ""
190 if i < len(argnames):
191 an = argnames[i]
192 ds += "\t%s\t%s\n" % (args[i], an)
193
194 self.f.__doc__ = ds
195
196 def __call__(self, *args):
197 ars = []
198 i = 0
199 ret = []
200
201 if len(args) < len(self.in_args):
202 raise TypeError("Not enough arguments passed to %s" % self.name)
203
206 else:
207 bs = 255
208
209 for j in range(len(self.inp)):
210 if self.inp[j]: # an input
211 ars.append(args[i])
212 i += 1
213 else: # an output
214 r, ar = self.fargs[j].getVar(bs)
215 ars.append(ar)
216 ret.append(r)
217 # print r, r._type_
218
219 # print ars
220 res = self.f(*ars)
221 # print res
222
223 if not res == AT_SUCCESS:
224 if res == AT_ERR_TIMEDOUT or res == AT_ERR_NODATA:
225 # handle timeouts as a special case, as we expect to get them
226 raise TimeoutError(self.name, res)
227 else:
228 raise CameraError(self.name, res)
229
230 if len(ret) == 0:
231 return None
232 if len(ret) == 1:
233 return ret[0]
234 else:
235 return ret
236
237
238def dllFunc(name, args=[], argnames=[], lib="ATCORE"):
239 f = dllFunction(name, args, argnames, lib)
240 globals()[name[3:]] = f
241
242
243dllFunc("AT_InitialiseLibrary")
244dllFunc("AT_FinaliseLibrary")
245
246dllFunc("AT_Open", [c_int, OUTPUT(AT_H)])
247dllFunc("AT_Close", [AT_H])
248
249dllFunc("AT_IsImplemented", [AT_H, STRING, OUTPUT(AT_BOOL)])
250dllFunc("AT_IsReadable", [AT_H, STRING, OUTPUT(AT_BOOL)])
251dllFunc("AT_IsWritable", [AT_H, STRING, OUTPUT(AT_BOOL)])
252dllFunc("AT_IsReadOnly", [AT_H, STRING, OUTPUT(AT_BOOL)])
253
254dllFunc("AT_SetInt", [AT_H, STRING, AT_64])
255dllFunc("AT_GetInt", [AT_H, STRING, OUTPUT(AT_64)])
256dllFunc("AT_GetIntMax", [AT_H, STRING, OUTPUT(AT_64)])
257dllFunc("AT_GetIntMin", [AT_H, STRING, OUTPUT(AT_64)])
258
259dllFunc("AT_SetFloat", [AT_H, STRING, c_double])
260dllFunc("AT_GetFloat", [AT_H, STRING, OUTPUT(c_double)])
261dllFunc("AT_GetFloatMax", [AT_H, STRING, OUTPUT(c_double)])
262dllFunc("AT_GetFloatMin", [AT_H, STRING, OUTPUT(c_double)])
263
264dllFunc("AT_SetBool", [AT_H, STRING, AT_BOOL])
265dllFunc("AT_GetBool", [AT_H, STRING, OUTPUT(AT_BOOL)])
266
267dllFunc("AT_SetEnumerated", [AT_H, STRING, c_int])
268dllFunc("AT_SetEnumeratedString", [AT_H, STRING, STRING])
269dllFunc("AT_GetEnumerated", [AT_H, STRING, OUTPUT(c_int)])
270dllFunc("AT_GetEnumeratedCount", [AT_H, STRING, OUTPUT(c_int)])
271dllFunc(
272 "AT_IsEnumeratedIndexAvailable", [AT_H, STRING, c_int, OUTPUT(AT_BOOL)]
273)
274dllFunc(
275 "AT_IsEnumeratedIndexImplemented", [AT_H, STRING, c_int, OUTPUT(AT_BOOL)]
276)
277dllFunc("AT_GetEnumeratedString", [AT_H, STRING, c_int, OUTSTRING, OUTSTRLEN])
278
279dllFunc("AT_SetEnumIndex", [AT_H, STRING, c_int])
280dllFunc("AT_SetEnumString", [AT_H, STRING, STRING])
281dllFunc("AT_GetEnumIndex", [AT_H, STRING, OUTPUT(c_int)])
282dllFunc("AT_GetEnumCount", [AT_H, STRING, OUTPUT(c_int)])
283dllFunc("AT_IsEnumIndexAvailable", [AT_H, STRING, c_int, OUTPUT(AT_BOOL)])
284dllFunc("AT_IsEnumIndexImplemented", [AT_H, STRING, c_int, OUTPUT(AT_BOOL)])
285dllFunc("AT_GetEnumStringByIndex", [AT_H, STRING, c_int, OUTSTRING, OUTSTRLEN])
286
287dllFunc("AT_Command", [AT_H, POINTER(AT_WC)])
288
289dllFunc("AT_SetString", [AT_H, STRING, STRING])
290dllFunc("AT_GetString", [AT_H, STRING, OUTSTRING, OUTSTRLEN])
291dllFunc("AT_GetStringMaxLength", [AT_H, STRING, OUTPUT(c_int)])
292
293dllFunc("AT_QueueBuffer", [AT_H, POINTER(AT_U8), c_int])
294dllFunc("AT_WaitBuffer", [AT_H, OUTPUT(POINTER(AT_U8)), OUTPUT(c_int), c_uint])
295dllFunc("AT_Flush", [AT_H])
296
297dllFunc(
298 "AT_RegisterFeatureCallback",
299 [AT_H, POINTER(AT_WC), CALLBACKTYPE, c_void_p],
300)
301dllFunc(
302 "AT_UnregisterFeatureCallback",
303 [AT_H, POINTER(AT_WC), CALLBACKTYPE, c_void_p],
304)
305
307dllFunc("AT_InitialiseUtilityLibrary", lib="ATUTIL")
308dllFunc("AT_FinaliseUtilityLibrary", lib="ATUTIL")
309dllFunc(
310 "AT_ConvertBuffer",
311 [POINTER(AT_U8), POINTER(AT_U8), AT_64, AT_64, AT_64, STRING, STRING],
312 lib="ATUTIL",
313)
314dllFunc(
315 "AT_ConvertBufferUsingMetadata",
316 [POINTER(AT_U8), POINTER(AT_U8), AT_64, STRING],
317 lib="ATUTIL",
318)
319
320# Initialize the utility library
321InitialiseUtilityLibrary()
__init__(self, fcnName, errNo)
Definition _SDK3.py:103
__init__(self, name, args=[], argnames=[], lib="ATCORE")
Definition _SDK3.py:169
dllFunc(name, args=[], argnames=[], lib="ATCORE")
Definition _SDK3.py:238
errCode(name, value)
Definition _SDK3.py:49