qlsdk2 0.6.0a7__py3-none-any.whl → 0.6.0a9__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.
qlsdk/persist/ars_edf.py CHANGED
@@ -213,12 +213,12 @@ class ARSKindlingEDFHandler(object):
213
213
  channel_pos = intersection_positions(packet.channels, channel_filter)
214
214
 
215
215
  if channel_pos is None or len(channel_pos) == 0 :
216
- logger.debug(f"没有指定分区{name}的通道,跳过")
217
- pass
216
+ logger.trace(f"没有指定分区{name}的通道,跳过")
217
+ return
218
218
 
219
219
  # 分区数据包写入
220
220
  if name not in self._edf_handler.keys():
221
- edf_handler = RscEDFHandler(self.sample_rate, self.digital_max , self.digital_min, self.resolution)
221
+ edf_handler = RscEDFHandler(self.sample_rate, self.physical_max , self.physical_min, self.resolution)
222
222
  edf_handler.set_device_type(self._device_type)
223
223
  edf_handler.set_device_no(self._device_no)
224
224
  edf_handler.set_storage_path(self._storage_path)
@@ -234,7 +234,8 @@ class ARSKindlingEDFHandler(object):
234
234
  data = RscPacket()
235
235
  data.time_stamp = packet.time_stamp
236
236
  data.pkg_id = packet.pkg_id
237
- data.channels = channels
237
+ # data.channels = channels
238
+ data.channels = self.channel_display(channels)
238
239
  data.origin_sample_rate = packet.origin_sample_rate
239
240
  data.sample_rate = packet.sample_rate
240
241
  data.sample_num = packet.sample_num
@@ -251,3 +252,6 @@ class ARSKindlingEDFHandler(object):
251
252
  # trigger现在(20250702)多个分区共享, 分发到所有分区文件中标记
252
253
  for k in self._edf_handler.keys():
253
254
  self._edf_handler[k].trigger(desc, cur_time)
255
+
256
+ def channel_display(self, channel):
257
+ return [self._channel_mapping.get(channel_id, []) for channel_id in channel]
@@ -77,19 +77,4 @@ class ARSKindling(QLBaseDevice):
77
77
 
78
78
  return body
79
79
 
80
- def __str__(self):
81
- return f'''
82
- Device:
83
- Name: {self.device_no},
84
- Type: {hex(self.device_type) if self.device_type else None},
85
- ID: {self.device_id if self.device_id else None},
86
- Software: {self.software_version},
87
- Hardware: {self.hardware_version},
88
- Connect Time: {self.connect_time},
89
- Current Time: {self.current_time},
90
- Voltage: {str(self.voltage) + "mV" if self.voltage else None},
91
- Battery Remain: {str(self.battery_remain)+ "%" if self.battery_remain else None},
92
- Battery Total: {str(self.battery_total) + "%" if self.battery_total else None}
93
- '''
94
-
95
80
 
qlsdk/rsc/device/base.py CHANGED
@@ -144,14 +144,14 @@ class QLBaseDevice(IDevice):
144
144
  def _produce_signal(self, body: bytes):
145
145
 
146
146
  # 处理信号数据
147
- data = self._signal_wrapper(body)
147
+ data = self._signal_wrapper(body)
148
148
  # logger.debug("pkg_id: {}, eeg len: {}".format(data.pkg_id, len(data.eeg)))
149
149
  #
150
150
  trigger_positions = [index for index, value in enumerate(data.trigger) if value != 0]
151
151
  if len(trigger_positions) > 0:
152
152
  # logger.debug(f"Trigger触发点位置: {trigger_positions}, 触发点时间戳: {[data.time_stamp + int(pos * 1000 / data.sample_rate) for pos in trigger_positions]}")
153
153
  for pos in trigger_positions:
154
- self.trigger(data.trigger[pos])
154
+ self.trigger(trigger_info(data.trigger[pos]))
155
155
  # 存储
156
156
  if self.storage_enable:
157
157
  # 确保记录线程启动
@@ -402,8 +402,8 @@ class QLBaseDevice(IDevice):
402
402
  msg = StartStimulationCommand.build(self).pack()
403
403
  logger.trace(f"start_stimulation message is {msg.hex()}")
404
404
  self.socket.sendall(msg)
405
- t = Thread(target=self._stop_stimulation_trigger, args=(self.stim_paradigm.duration,), daemon=True)
406
- t.start()
405
+ # t = Thread(target=self._stop_stimulation_trigger, args=(self.stim_paradigm.duration,), daemon=True)
406
+ # t.start()
407
407
 
408
408
  def get_stim_param(self) -> bytes:
409
409
  return self.stim_paradigm.to_bytes()
@@ -421,7 +421,7 @@ class QLBaseDevice(IDevice):
421
421
 
422
422
  def stop_stimulation(self):
423
423
  logger.info(f"[设备-{self.device_no}]停止电刺激")
424
- msg = StopStimulationCommand.pack()
424
+ msg = StopStimulationCommand.build(self).pack()
425
425
  logger.trace(f"stop_stimulation message is {msg.hex()}")
426
426
  self.socket.sendall(msg)
427
427
 
@@ -537,4 +537,15 @@ class QLBaseDevice(IDevice):
537
537
  return self.device_type == other.device_type and self.device_no == other.device_no
538
538
 
539
539
  def __hash__(self):
540
- return hash((self.device_type, self.device_no))
540
+ return hash((self.device_type, self.device_no))
541
+
542
+ __TRIGGER_MAPPING = {
543
+ 0x3E8: "Start of stimulation",
544
+ 0x3E9: "End of stimulation",
545
+ 0x3EA: "Ascending end of stimulation",
546
+ 0x3EB: "Descending start of stimulation ",
547
+ 0x3EC: "刺激参数有误",
548
+ 0x3ED: "End of stimulation (by force)",
549
+ }
550
+ def trigger_info(code: int) -> str:
551
+ return __TRIGGER_MAPPING.get(code, "未知触发事件")
qlsdk/rsc/parser/base.py CHANGED
@@ -131,10 +131,15 @@ class TcpMessageParser(IParser):
131
131
 
132
132
  def unpack(self, packet):
133
133
  # 提取指令码
134
- cmd_code = int.from_bytes(packet[self.cmd_pos : self.cmd_pos + 2], 'little')
135
- cmd_class = CommandFactory.create_command(cmd_code)
136
- instance = cmd_class(self.device)
137
- instance.parse_body(packet[self.header_len:-2])
134
+ cmd_code = None
135
+ try:
136
+ cmd_code = int.from_bytes(packet[self.cmd_pos : self.cmd_pos + 2], 'little')
137
+ cmd_class = CommandFactory.create_command(cmd_code)
138
+ instance = cmd_class(self.device)
139
+ instance.parse_body(packet[self.header_len:-2])
140
+ except Exception as e:
141
+ logger.error(f"指令[{cmd_code}]数据包[len={len(packet)}]解析异常: {e}")
142
+
138
143
  return instance
139
144
 
140
145
  def start(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qlsdk2
3
- Version: 0.6.0a7
3
+ Version: 0.6.0a9
4
4
  Summary: SDK for quanlan device
5
5
  Home-page: https://github.com/hehuajun/qlsdk
6
6
  Author: hehuajun
@@ -28,7 +28,7 @@ qlsdk/interface/parser.py,sha256=00Ds01Xp9eUPwx7okL4B1Bl0_fRbgaxfm_2GOeWoZiM,248
28
28
  qlsdk/interface/stimulator.py,sha256=MJbgiI-4qTMjbdhcBAZe8zb10hV9x8yhFCPL3Iq_QyI,28
29
29
  qlsdk/interface/store.py,sha256=694WQnnrtXThP44JkQlBXzghvqA0PwHKK3uA640aiUo,23
30
30
  qlsdk/persist/__init__.py,sha256=b8qk1aOU6snEMCQNYDl1ijV3-2gwBmMt76fiAzNk1E8,107
31
- qlsdk/persist/ars_edf.py,sha256=9OSZyEwyTMPMo6Tqnk5wPATCs5Y_Cr80EA3BzhJEJ_0,8928
31
+ qlsdk/persist/ars_edf.py,sha256=EI0V3kcjBduqk6UDzPR99ua_5YED-LHsC6lpKV411kc,9131
32
32
  qlsdk/persist/edf.py,sha256=ETngb86CfkIUJYWmw86QR445MvTFC7Edk_CH9nyNgtY,7857
33
33
  qlsdk/persist/rsc_edf.py,sha256=djR_qXScb_XOOXaoMsvnK_qO2NCPzqEeKxKJCm4xnpk,13989
34
34
  qlsdk/persist/stream.py,sha256=TCVF1sqDrHiYBsJC27At66AaCs-_blXeXA_WXdJiIVA,5828
@@ -42,8 +42,8 @@ qlsdk/rsc/proxy.py,sha256=9CPdGNGWremwBUh4GvlXAykYB-x_BEPPLqsNvwuwIDE,2736
42
42
  qlsdk/rsc/command/__init__.py,sha256=iPrPor7NwBIrkQDxz061gVbnlLYK9KE7VXy-NKJy1XQ,12277
43
43
  qlsdk/rsc/command/message.py,sha256=nTdG-Vp4MBnltyrgedAWiKD6kzOaPrg58Z_hq6yjhys,12220
44
44
  qlsdk/rsc/device/__init__.py,sha256=BzY9lRfssGPUlJ1ys-v3CWNgGihg7mPa2T4X0tl0Vg4,214
45
- qlsdk/rsc/device/arskindling.py,sha256=tVih2D3Hhhal3WP0yqjKpzkwFPi6KLenshFStoP-vsw,4123
46
- qlsdk/rsc/device/base.py,sha256=fCGzjAbagTTGRBfHhbiYOqN3TLOViEd8il8Qp6RiVJs,21106
45
+ qlsdk/rsc/device/arskindling.py,sha256=j1t-_49MNpi2cNYCWpJaBgj6s_NGVQCuMrdAB7rpPfg,3358
46
+ qlsdk/rsc/device/base.py,sha256=G3o9Pgvy4zoTFvh_mX1ihw0AzglgCcFAmfwAXbmIKlk,21515
47
47
  qlsdk/rsc/device/c16_rs.py,sha256=qXt8m5vwcKQsN8JBllWnAsda5_Y6qkEhfHQQX101TMQ,5826
48
48
  qlsdk/rsc/device/c256_rs.py,sha256=7vAEzf_ggNcwrXKmcZMylnKzLFD5ZqtAIfkkI3lQ1iI,1682
49
49
  qlsdk/rsc/device/c64_rs.py,sha256=x8wHdwATKDU34j9vXNEXsNSJg23RAWmAKL8pgIGamG8,1091
@@ -61,7 +61,7 @@ qlsdk/rsc/network/__init__.py,sha256=PfYiqXS2pZV__uegQ1TjaeYhY1pefZ_shwE_X5HNVbs
61
61
  qlsdk/rsc/network/discover.py,sha256=GRXP0WxxIorDZWXq1X5CPAV60raSRvNiVwMQE8647XA,3044
62
62
  qlsdk/rsc/parser/__init__.py,sha256=cVKk06bRYOnwE3XMoksGlatKJSaZE1GVrYypQm-9aro,69
63
63
  qlsdk/rsc/parser/base-new.py,sha256=cAOy1V_1fAJyGq7bm7uLxpW41DbkllWOprnfWKpjtsQ,5116
64
- qlsdk/rsc/parser/base.py,sha256=tH4r_1PVkYfF2alpxKdXiFHmhTDPW_NKbq6DUqU6LVg,5702
64
+ qlsdk/rsc/parser/base.py,sha256=EelI7jYLQFJ-frN_X8X0bc7rWSe-pJWCCylSvJdr0TM,5897
65
65
  qlsdk/rsc/parser/rsc.py,sha256=RuBqsg5KZNio7mTyM14svQEeU0_0CLhnRmfbP0NBM2o,4724
66
66
  qlsdk/sdk/__init__.py,sha256=v9LKP-5qXCqnAsCkiRE9LDb5Tagvl_Qd_fqrw7y9yd4,68
67
67
  qlsdk/sdk/ar4sdk.py,sha256=tugH3UUeNebdka78AzLyrtAXbYQQE3iFJ227zUit6tY,27261
@@ -70,7 +70,7 @@ qlsdk/sdk/libs/libAr4SDK.dll,sha256=kZp9_DRwPdAJ5OgTFQSqS8tEETxUs7YmmETuBP2g60U,
70
70
  qlsdk/sdk/libs/libwinpthread-1.dll,sha256=W77ySaDQDi0yxpnQu-ifcU6-uHKzmQpcvsyx2J9j5eg,52224
71
71
  qlsdk/x8/__init__.py,sha256=FDpDK7GAYL-g3vzfU9U_V03QzoYoxH9YLm93PjMlANg,4870
72
72
  qlsdk/x8m/__init__.py,sha256=cLeUqEEj65qXw4Qa4REyxoLh6T24anSqPaKe9_lR340,634
73
- qlsdk2-0.6.0a7.dist-info/METADATA,sha256=nNB6PqpoJ4omwY3m3_1ca5yWT4vHRtMIRlloDuD7NGk,1882
74
- qlsdk2-0.6.0a7.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
75
- qlsdk2-0.6.0a7.dist-info/top_level.txt,sha256=2CHzn0SY-NIBVyBl07Suh-Eo8oBAQfyNPtqQ_aDatBg,6
76
- qlsdk2-0.6.0a7.dist-info/RECORD,,
73
+ qlsdk2-0.6.0a9.dist-info/METADATA,sha256=As8KCL909tZ_a7nQ2H7lqircEwZx_Jxah768hCKkIWQ,1882
74
+ qlsdk2-0.6.0a9.dist-info/WHEEL,sha256=Z4pYXqR_rTB7OWNDYFOm1qRk0RX6GFP2o8LgvP453Hk,91
75
+ qlsdk2-0.6.0a9.dist-info/top_level.txt,sha256=2CHzn0SY-NIBVyBl07Suh-Eo8oBAQfyNPtqQ_aDatBg,6
76
+ qlsdk2-0.6.0a9.dist-info/RECORD,,