Skip to content

Commit 03e4016

Browse files
author
Simon Nishi McCorkindale
committed
Implement libmeterfeeder over libqwqng for multiple device support
WebSockets API isn't updated yet
1 parent 3fe4b5b commit 03e4016

11 files changed

Lines changed: 225 additions & 276 deletions

libmeterfeeder.dylib

230 KB
Binary file not shown.

libmeterfeeder.so

404 KB
Binary file not shown.

libqwqng-wrapper-x86-64.so

-17.8 KB
Binary file not shown.

libqwqng-wrapper.so

-11.9 KB
Binary file not shown.

meterfeeder.dll

251 KB
Binary file not shown.

quanttp/__main__.py

Lines changed: 100 additions & 58 deletions
Large diffs are not rendered by default.
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
##
2+
# MeterFeeder Library Wrapper
3+
#
4+
# by soliax
5+
##
6+
7+
from platform import os
8+
from sys import platform
9+
from ctypes import *
10+
11+
cdll = LibraryLoader(CDLL)
12+
13+
class MeterFeederWrapper:
14+
15+
def __init__(self):
16+
if platform == "linux" or platform == "linux2":
17+
# Linux
18+
self._meterfeeder = cdll.LoadLibrary(os.getcwd() + '/libmeterfeeder.so')
19+
elif platform == "darwin":
20+
# OS X
21+
self._meterfeeder = cdll.LoadLibrary(os.getcwd() + '/libmeterfeeder.dylib')
22+
elif platform == "win32":
23+
# Windows
24+
self._meterfeeder = cdll.LoadLibrary(os.getcwd() + '/meterfeeder.dll')
25+
26+
# Declare function bridging
27+
self._meterfeeder.MF_Initialize.argtypes = c_char_p,
28+
self._meterfeeder.MF_Initialize.restype = c_int
29+
30+
self._meterfeeder.MF_GetNumberGenerators.restype = c_int
31+
32+
self._meterfeeder.MF_GetListGenerators.argtypes = [POINTER(c_char_p)]
33+
34+
self._meterfeeder.MF_GetBytes.argtypes = c_int, POINTER(c_ubyte), c_char_p, c_char_p,
35+
36+
self._meterfeeder.MF_RandInt32.argtypes = c_char_p, c_char_p,
37+
self._meterfeeder.MF_RandInt32.restype = c_int
38+
39+
self._meterfeeder.MF_RandUniform.argtypes = c_char_p, c_char_p,
40+
self._meterfeeder.MF_RandUniform.restype = c_double
41+
42+
self._meterfeeder.MF_RandNormal.argtypes = c_char_p, c_char_p,
43+
self._meterfeeder.MF_RandNormal.restype = c_double
44+
45+
self._meterfeeder.MF_Clear.argtypes = c_char_p, c_char_p,
46+
self._meterfeeder.MF_Clear.restype = c_bool
47+
48+
self._meterfeeder.MF_Reset.argtypes = c_char_p,
49+
self._meterfeeder.MF_Reset.restype = c_int
50+
51+
self._medErrorReason = create_string_buffer(256)
52+
53+
# Initialize Meter Feeder
54+
result = self._meterfeeder.MF_Initialize(self._medErrorReason)
55+
if (len(self._medErrorReason.value) > 0):
56+
print(self._medErrorReason)
57+
exit(result)
58+
59+
def deviceIds(self, returnAsList):
60+
# Get the list of connected devices
61+
numGenerators = self._meterfeeder.MF_GetNumberGenerators()
62+
generatorsListBuffers = [create_string_buffer(58) for i in range(numGenerators)]
63+
generatorsListBufferPointers = (c_char_p*numGenerators)(*map(addressof, generatorsListBuffers))
64+
self._meterfeeder.MF_GetListGenerators(generatorsListBufferPointers)
65+
generatorsList = [str(s.value, 'utf-8') for s in generatorsListBuffers]
66+
67+
if returnAsList:
68+
return generatorsList
69+
70+
deviceIdsCsvList = ""
71+
for i in range(numGenerators):
72+
if i < numGenerators - 1:
73+
deviceIdsCsvList += generatorsList[i].split("|")[0] + ","
74+
else:
75+
deviceIdsCsvList += generatorsList[i].split("|")[0]
76+
return deviceIdsCsvList
77+
78+
def randint32(self, deviceId):
79+
try:
80+
return self._meterfeeder.MF_RandInt32(deviceId.encode("utf-8"), self._medErrorReason)
81+
except:
82+
self._meterfeeder.MF_Reset()
83+
return self._meterfeeder.MF_RandInt32(deviceId.encode("utf-8"), self._medErrorReason)
84+
85+
def randuniform(self, deviceId):
86+
try:
87+
return self._meterfeeder.MF_RandUniform(deviceId.encode("utf-8"), self._medErrorReason)
88+
except:
89+
self._meterfeeder.MF_Reset()
90+
return self._meterfeeder.MF_RandUniform(deviceId.encode("utf-8"), self._medErrorReason)
91+
92+
def randnormal(self, deviceId):
93+
try:
94+
return self._meterfeeder.MF_RandNormal(deviceId.encode("utf-8"), self._medErrorReason)
95+
except:
96+
self._meterfeeder.MF_Reset()
97+
return self._meterfeeder.MF_RandNormal(deviceId.encode("utf-8"), self._medErrorReason)
98+
99+
def randbytes(self, deviceId, length):
100+
barray = bytearray(length)
101+
ubuffer = (c_ubyte * length).from_buffer(barray)
102+
try:
103+
self._meterfeeder.MF_GetBytes(length, ubuffer, deviceId.encode("utf-8"), self._medErrorReason)
104+
return barray
105+
except:
106+
self._meterfeeder.MF_Reset()
107+
self._meterfeeder.MF_GetBytes(length, ubuffer, deviceId.encode("utf-8"), self._medErrorReason)
108+
return barray
109+
110+
def clear(self, deviceId):
111+
if self._meterfeeder.MF_Clear(deviceId.encode("utf-8"), self._medErrorReason) == False:
112+
print("unable to clear", deviceId, ": ", self._medErrorReason.value)
113+
114+
def reset(self):
115+
result = self._meterfeeder.MF_Reset(self._medErrorReason)
116+
if (len(self._medErrorReason.value) > 0):
117+
print(self._medErrorReason)
118+
exit(result)
119+
120+
def status(self):
121+
return "ONLINE"

quanttp/data/qng_wrapper_linux.py

Lines changed: 0 additions & 99 deletions
This file was deleted.

quanttp/data/qng_wrapper_mock.py

Lines changed: 0 additions & 40 deletions
This file was deleted.

quanttp/data/qng_wrapper_windows.py

Lines changed: 0 additions & 76 deletions
This file was deleted.

0 commit comments

Comments
 (0)