nsqdriver 0.2.4__py3-none-any.whl → 0.3.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nsqdriver might be problematic. Click here for more details.

nsqdriver/NS_CST.py ADDED
@@ -0,0 +1,260 @@
1
+ import socket
2
+ import struct
3
+ import time
4
+ from functools import lru_cache, wraps
5
+ from typing import Union, TYPE_CHECKING, Tuple, Iterable
6
+
7
+ try:
8
+ from .common import BaseDriver, Quantity
9
+ except ImportError as e:
10
+ class BaseDriver:
11
+ def __init__(self, addr, timeout, **kw):
12
+ self.addr = addr
13
+ self.timeout = timeout
14
+
15
+
16
+ class Quantity(object):
17
+ def __init__(self, name: str, value=None, ch: int = 1, unit: str = ''):
18
+ self.name = name
19
+ self.default = dict(value=value, ch=ch, unit=unit)
20
+
21
+
22
+ DEBUG_PRINT = False
23
+
24
+
25
+ def print_debug(*args, **kwargs):
26
+ if DEBUG_PRINT:
27
+ print(*args, **kwargs)
28
+
29
+
30
+ def retry(times):
31
+ def decorator(func):
32
+ @wraps(func)
33
+ def wrapper(*args, **kwargs):
34
+ _times = times - 1
35
+ while not func(*args, **kwargs) and _times > 0:
36
+ _times -= 1
37
+ return _times != 0
38
+
39
+ return wrapper
40
+
41
+ return decorator
42
+
43
+
44
+ class Driver(BaseDriver):
45
+ icd_head_mode = 0x51000009
46
+ icd_head_open = 0x5100000A
47
+ CHs = list(range(1, 17))
48
+
49
+ quants = [
50
+ Quantity('SAMode', value='manual'), # set/get, 运行模式manual为手动,根据指令切换开关
51
+ Quantity('Strobe', value=1, ch=1), # set/get, 选通开关通道,value为开关矩阵in口,ch为out口
52
+ ]
53
+
54
+ SystemParameter = {
55
+ 'SAMode': 'manual', # 运行模式manual为手动,根据指令切换开关
56
+ 'StrobeList': [1, 9],
57
+ }
58
+
59
+ def __init__(self, addr: str = '', timeout: float = 10.0, **kw):
60
+ super().__init__(addr, timeout, **kw)
61
+ self.handle = None
62
+ self.model = 'NS_CST' # 默认为设备名字
63
+ self.srate = None
64
+ self.gen_trig_num = 0
65
+ self.addr = addr
66
+
67
+ self.param = {'SAMode': 'manual'}
68
+ print_debug(f'CST: 实例化成功{addr}')
69
+
70
+ def open(self, **kw):
71
+ """!
72
+ 输入IP打开设备,配置默认超时时间为5秒
73
+ 打开设备时配置RFSoC采样时钟,采样时钟以参数定义
74
+ @param kw:
75
+ @return:
76
+ """
77
+ # 配置系统初始值
78
+ system_parameter = kw.get('system_parameter', {})
79
+ values = self.SystemParameter.copy()
80
+ values.update(system_parameter)
81
+ for name, value in values.items():
82
+ if value is not None:
83
+ self.set(name, value, 1)
84
+
85
+ def close(self, **kw):
86
+ """
87
+ 关闭设备
88
+ """
89
+ # self.handle.release_dma()
90
+ # self.handle.close()
91
+ ...
92
+
93
+ def write(self, name: str, value, **kw):
94
+ channel = kw.get('ch', 1)
95
+ return self.set(name, value, channel)
96
+
97
+ def read(self, name: str, **kw):
98
+ channel = kw.get('ch', 1)
99
+ result = self.get(name, channel)
100
+ return result
101
+
102
+ def set(self, name, value=None, channel=1):
103
+ """!
104
+ 设置设备属性
105
+ @param name:
106
+ @param value:
107
+ @param channel:
108
+ @return:
109
+ """
110
+ print_debug(f'CST: set操作被调用{name}')
111
+ if name == 'SAMode':
112
+ data = self.__fmt_cst_mode(
113
+ value
114
+ )
115
+ self._send_command(data, connect_timeout=2)
116
+ elif name == 'Strobe':
117
+ config = self.param['StrobeList']
118
+ if value not in [1, 2]:
119
+ raise ValueError(f'IN通道超界,不应为{value},需要为1或2')
120
+ config[value-1] = channel
121
+ data = self.__fmt_cst_strobe(
122
+ config
123
+ )
124
+ self._send_command(data, connect_timeout=2)
125
+ elif name == 'UpdateFirmware':
126
+ self.update_firmware(value)
127
+
128
+ else:
129
+ self.param[name] = value
130
+
131
+ def get(self, name, channel=1, value=0):
132
+ """!
133
+ 查询设备属性,获取数据
134
+ @param name:
135
+ @param channel:
136
+ @param value:
137
+ @return:
138
+ """
139
+ print_debug(f'CST: get操作被调用{name}')
140
+ return self.param.get(name, None)
141
+
142
+ def update_firmware(self, file_path, boards=None):
143
+ """!
144
+ 固件更新
145
+
146
+ @param file_path: 固件路径
147
+ @param boards:
148
+ @return:
149
+ """
150
+ import os
151
+ if not os.path.exists(file_path):
152
+ raise ValueError(f'文件路径: {file_path} 不存在')
153
+ with open(file_path, 'rb') as fp:
154
+ cmd_data = self.__fmt_update_firmware(fp.read())
155
+ if not self._send_command(cmd_data):
156
+ print(f'qsync: 固件更新 执行失败')
157
+
158
+ def _connect(self, addr=None, port=5001, timeout=None):
159
+ """!
160
+ 获取到指定ip的tcp连接
161
+
162
+ @param addr:
163
+ @param port:
164
+ @return:
165
+ """
166
+ timeout = self.timeout if timeout is None else timeout
167
+ addr = self.addr if addr is None else addr
168
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
169
+ sock.settimeout(timeout)
170
+ sock.connect((addr, port))
171
+ return sock
172
+
173
+ @retry(3)
174
+ def _send_command(self, data: Union[str, bytes], wait=0, addr=None, port=5001,
175
+ check_feedback=True, return_fdk=False, connect_timeout=10):
176
+ """!
177
+ 发送指定内容到后端
178
+
179
+ @param data: 指令内容
180
+ @param wait: 指令发送完成后,等待一段时间再接收反馈,阻塞式等待
181
+ @param addr: 后端IP
182
+ @param port: 后端端口
183
+ @param check_feedback: 是否解析反馈
184
+ @param connect_timeout:
185
+ @return:
186
+ """
187
+ command_bak = data
188
+ try:
189
+ sock = self._connect(addr=addr, port=port, timeout=connect_timeout)
190
+ except Exception as e:
191
+ print(f'device: {addr}无法连接 {e}')
192
+ return False
193
+
194
+ try:
195
+ sock.sendall(memoryview(data))
196
+
197
+ time.sleep(wait)
198
+ _feedback = sock.recv(20)
199
+ if check_feedback:
200
+ if not _feedback.startswith(b'\xcf\xcf\xcf\xcf'):
201
+ print('返回指令包头错误')
202
+ return False
203
+ if command_bak[4:8] != _feedback[4:8]:
204
+ print(f'返回指令ID错误')
205
+ return False
206
+ _feedback = struct.unpack('=IIIII', _feedback)
207
+ if _feedback[4] != 0:
208
+ print('指令成功下发,但执行失败')
209
+ return False
210
+ except Exception as e:
211
+ print(f'device: {addr}指令{command_bak[:4]}发送失败 {e}')
212
+ return False
213
+ finally:
214
+ sock.close()
215
+ return True
216
+
217
+ @lru_cache(maxsize=32)
218
+ def __fmt_cst_mode(self, mode):
219
+ cmd_pack = (
220
+ 0x5F5F5F5F,
221
+ self.icd_head_mode,
222
+ 0x00000000,
223
+ 20,
224
+ 0 if mode == 'manual' else 1
225
+ )
226
+
227
+ return struct.pack('=' + 'I' * len(cmd_pack), *cmd_pack)
228
+
229
+ @lru_cache(maxsize=32)
230
+ def __fmt_cst_strobe(self, out_ch):
231
+ if out_ch[0] > 8:
232
+ raise ValueError(f'不能将IN1通道选通到OUT9~16')
233
+ if out_ch[1] <= 8:
234
+ raise ValueError(f'不能将IN2通道选通到OUT1~8')
235
+ cmd_pack = (
236
+ 0x5F5F5F5F,
237
+ self.icd_head_open,
238
+ 0x00000000,
239
+ 20,
240
+ (1 << (out_ch[0] - 1)) + (1 << (out_ch[1]-1))
241
+ )
242
+
243
+ return struct.pack('=' + 'I' * len(cmd_pack), *cmd_pack)
244
+
245
+ @staticmethod
246
+ def __fmt_update_firmware(file_data):
247
+ cmd_pack = (
248
+ 0x5F5F5F5F,
249
+ 0x31000006,
250
+ 0x00000000,
251
+ 16 + len(file_data),
252
+ )
253
+ return struct.pack('=' + 'I' * len(cmd_pack), *cmd_pack) + file_data
254
+
255
+
256
+ if __name__ == '__main__':
257
+ driver = Driver('192.168.1.241')
258
+ driver.open()
259
+ driver.set('Strobe', 1, 3) # I1选通到OUT3,所有通道编号从1计数
260
+ driver.set('Strobe', 2, 9) # I2选通到OUT9,OUT9为第二个模块的OUT1
nsqdriver/NS_MCI.py CHANGED
@@ -10,7 +10,23 @@ from functools import wraps
10
10
  import numpy as np
11
11
  import waveforms
12
12
 
13
- from .common import BaseDriver, Quantity, get_coef
13
+ try:
14
+ from .common import BaseDriver, Quantity, get_coef
15
+ except ImportError as e:
16
+ class BaseDriver:
17
+ def __init__(self, addr, timeout, **kw):
18
+ self.addr = addr
19
+ self.timeout = timeout
20
+
21
+
22
+ class Quantity(object):
23
+ def __init__(self, name: str, value=None, ch: int = 1, unit: str = ''):
24
+ self.name = name
25
+ self.default = dict(value=value, ch=ch, unit=unit)
26
+
27
+
28
+ def get_coef(*args):
29
+ return '', '', '', ''
14
30
 
15
31
  DEBUG_PRINT = False
16
32
 
@@ -265,13 +281,9 @@ class Driver(BaseDriver):
265
281
  if not self.device_online:
266
282
  return
267
283
  print_debug(f'Driver: get操作被调用{name}')
268
- if name in {'TraceIQ', 'IQ', 'TraceData', 'IQData'}:
269
- func = self.fast_rpc.rpc_get
270
- else:
271
- func = self.handle.rpc_get
272
-
273
284
  self.has_start_capture = False
274
285
 
286
+ func = self.fast_rpc.rpc_get
275
287
  tmp = func(name, channel, value)
276
288
  tmp = RPCValueParser.load(tmp)
277
289
  return tmp
@@ -336,9 +348,9 @@ class Driver(BaseDriver):
336
348
  _string = [f'*********设备{self.addr}开启成功*********']
337
349
  for key in keys:
338
350
  _string.append(f'{key}: {status.get(key, "nan")}')
339
- for i in range(len(status['rfsoc_addr'])):
340
- _string.append(f'sub_device{status["rfsoc_addr"][i]}: '
341
- f'{status["ref_clock_lock"][i]}{status["ref_clock_from"][i]}')
351
+ # for i in range(len(status['rfsoc_addr'])):
352
+ # _string.append(f'sub_device{status["rfsoc_addr"][i]}: '
353
+ # f'{status["ref_clock_lock"][i]}{status["ref_clock_from"][i]}')
342
354
  print('\n'.join(_string))
343
355
 
344
356
 
nsqdriver/NS_QSYNC.py CHANGED
@@ -11,7 +11,26 @@ from multiprocessing import shared_memory
11
11
  from functools import lru_cache, wraps
12
12
  from typing import Union, TYPE_CHECKING, Tuple, Iterable
13
13
 
14
- from .common import BaseDriver, Quantity, QInteger
14
+ try:
15
+ from .common import BaseDriver, Quantity, QInteger
16
+ except ImportError as e:
17
+ class BaseDriver:
18
+ def __init__(self, addr, timeout, **kw):
19
+ self.addr = addr
20
+ self.timeout = timeout
21
+
22
+
23
+ class Quantity(object):
24
+ def __init__(self, name: str, value=None, ch: int = 1, unit: str = ''):
25
+ self.name = name
26
+ self.default = dict(value=value, ch=ch, unit=unit)
27
+
28
+
29
+ class QInteger:
30
+ def __init__(self, name, value=None, unit='', ch=None,
31
+ get_cmd='', set_cmd='', ):
32
+ self.name = name
33
+
15
34
 
16
35
  if TYPE_CHECKING:
17
36
  from backend.board_parser import MCIBoard
nsqdriver/__init__.py CHANGED
@@ -1,7 +1,9 @@
1
1
  from .NS_MCI import Driver as MCIDriver
2
2
  from .NS_QSYNC import Driver as QSYNCDriver
3
+ from .NS_CST import Driver as CSTDriver
4
+ from .compiler.ns_wave import InsChannel
3
5
 
4
- version_pack = (0, 2, 4)
6
+ version_pack = (0, 3, 0)
5
7
 
6
8
  __version__ = '.'.join(str(_) for _ in version_pack)
7
- __all__ = ['MCIDriver', 'QSYNCDriver', '__version__']
9
+ __all__ = ['MCIDriver', 'QSYNCDriver', 'CSTDriver', 'InsChannel', '__version__']
File without changes