Compare commits

...

21 Commits

Author SHA1 Message Date
peterlu14 d866d48cbf -testing 2023-06-14 12:08:04 +08:00
peterlu14 aae1ab7a33 -update send instruction when trigger channel used 2023-06-14 12:02:35 +08:00
Roy 59148cff6d Feat(#6): new instruction of all output mode
https://www.notion.so/6-TRIG-s-All-output-mode-c382a9f88a444185873dbb62a7deee1a
2023-06-14 11:01:15 +08:00
Roy c9b10fc6aa [update] TRIG json 2023-06-13 13:23:58 +08:00
peterlu14 f82c3ab033 - add new mode 2023-06-13 09:51:43 +08:00
peterlu14 3884fad006 -update trigger 2023-06-13 09:33:31 +08:00
peterlu14 75ca525f36 -add trigger dev mode 2023-05-15 11:30:04 +08:00
Roy 9bb947f8e0 Refactor(#4): optimize scan function
https://www.notion.so/4-Controller-Uart-451f896953eb4e15bd70eeadb17eb94e
2023-04-26 22:50:15 +08:00
Roy fc4f931f9d Refactor(#4): fix battery and elite version info
https://www.notion.so/4-Controller-Uart-451f896953eb4e15bd70eeadb17eb94e
2023-04-21 17:50:06 +08:00
Roy 57ba7ed94f Refactor(#4): fix uart fun, and connect 5 times
https://www.notion.so/4-Controller-Uart-451f896953eb4e15bd70eeadb17eb94e
2023-04-21 16:15:44 +08:00
Roy cf8433c7ee Refactor(#3): fix cali version byte
https://www.notion.so/3-EIS-Controller-EIS-Controller-check-sum-5426fe5ccb024a9da73770bed559df65
2023-04-21 15:16:33 +08:00
Roy 4d1eee6893 Refactor(#4): fix instruction
https://www.notion.so/4-Controller-Uart-451f896953eb4e15bd70eeadb17eb94e
2023-04-21 14:55:48 +08:00
Roy 7a77c4d413 Refactor(#3): calibration data use CRC and cali version
https://www.notion.so/3-EIS-Controller-EIS-Controller-check-sum-5426fe5ccb024a9da73770bed559df65
2023-04-20 23:42:36 +08:00
Roy 6f8d68f476 Style: uart formatting 2023-04-20 23:37:42 +08:00
Roy 8ae45d3b50 Style: uart formatting 2023-04-20 23:28:32 +08:00
Roy 5e4980a1d5 Refactor(#4): optimize write/read function
https://www.notion.so/4-Controller-Uart-451f896953eb4e15bd70eeadb17eb94e
2023-04-20 22:56:07 +08:00
Roy 7716908a3b Refactor(#4): optimize disconnect function
https://www.notion.so/4-Controller-Uart-451f896953eb4e15bd70eeadb17eb94e
2023-04-20 22:41:52 +08:00
Roy 813ff7bc7d Refactor(#4): optimize connect function
https://www.notion.so/4-Controller-Uart-451f896953eb4e15bd70eeadb17eb94e
2023-04-20 20:22:32 +08:00
Roy c2224ed624 Refactor(#4): optimize scan function
https://www.notion.so/4-Controller-Uart-451f896953eb4e15bd70eeadb17eb94e
2023-04-20 20:20:40 +08:00
Roy 72943c3b6f Style: uart formatting 2023-04-20 18:20:52 +08:00
Roy 4d47d07996 Refactor(4): uart data reserve len, optimize chk memboard
https://www.notion.so/4-Controller-Uart-451f896953eb4e15bd70eeadb17eb94e
2023-04-20 18:00:22 +08:00
10 changed files with 1349 additions and 522 deletions
+329 -389
View File
@@ -163,14 +163,12 @@ def is_headstage_device(info: cc2650.GapEvt_DeviceInformation) -> Optional[Devic
version_info[3], version_info[3],
version_info[4], version_info[4],
version_info[5]) version_info[5])
return DeviceResponseInfo(local_name.decode(), serial_number, info.address, battery=battery_percentage) return DeviceResponseInfo(local_name.decode(), serial_number, info.address, battery=battery_percentage)
elif company_code[:2] == b'HS': elif company_code[:2] == b'HS':
# legacy device # legacy device
serial_number = DeviceSerialNumber(0, 0, 0, 0, 0, 0) serial_number = DeviceSerialNumber(0, 0, 0, 0, 0, 0)
return DeviceResponseInfo(local_name.decode(), serial_number, info.address) return DeviceResponseInfo(local_name.decode(), serial_number, info.address)
else: else:
@@ -200,7 +198,7 @@ def is_headstage_device_central_version(device_mac: ADDRESS = EMPTY_ADDRESS,
version_info[3], version_info[3],
version_info[4], version_info[4],
version_info[5]) version_info[5])
print('***********', version_info, device_mac)
return DeviceResponseInfo(local_name, return DeviceResponseInfo(local_name,
serial_number, serial_number,
device_mac, device_mac,
@@ -433,12 +431,12 @@ class CC2650Device(Device):
if length == 1 and instruction[0] < 0: if length == 1 and instruction[0] < 0:
return struct.pack('2B1b', return struct.pack('2B1b',
(ins_type & 0xF0) | (self.device_id & 0x0F), (ins_type & 0xF0) | (self.device_id & 0x0F),
(ins_oper & 0xF0) | (length & 0x0F), (ins_oper & 0xFF),
*instruction) *instruction)
return struct.pack('%dB' % (length + 2), return struct.pack('%dB' % (length + 2),
(ins_type & 0xF0) | (self.device_id & 0x0F), (ins_type & 0xF0) | (self.device_id & 0x0F),
(ins_oper & 0xF0) | (length & 0x0F), (ins_oper & 0xFF),
*instruction) *instruction)
def _decode_data(self, ins_oper: int, data: bytes) -> bytes: def _decode_data(self, ins_oper: int, data: bytes) -> bytes:
@@ -478,13 +476,13 @@ class CC2650Device(Device):
else: else:
if data is not None and len(data) > 0: if data is not None and len(data) > 0:
year = struct.unpack('<B', data[0:1])[0] year = struct.unpack('<B', data[2:3])[0]
month = struct.unpack('<B', data[1:2])[0] month = struct.unpack('<B', data[3:4])[0]
day = struct.unpack('<B', data[2:3])[0] day = struct.unpack('<B', data[4:5])[0]
hour = struct.unpack('<B', data[3:4])[0] hour = struct.unpack('<B', data[5:6])[0]
minute = struct.unpack('<B', data[4:5])[0] minute = struct.unpack('<B', data[6:7])[0]
mac1 = struct.unpack('<B', data[5:6])[0] mac1 = struct.unpack('<B', data[7:8])[0]
mac2 = struct.unpack('<B', data[6:7])[0] mac2 = struct.unpack('<B', data[8:9])[0]
mac1 = "%02X" % mac1 mac1 = "%02X" % mac1
mac2 = "%02X" % mac2 mac2 = "%02X" % mac2
@@ -538,7 +536,7 @@ class CC2650Device(Device):
else: else:
if data is not None and len(data) > 2 : if data is not None and len(data) > 2 :
battery = struct.unpack('<H', data[1:3])[0] battery = struct.unpack('<H', data[2:4])[0]
if battery is not None: if battery is not None:
self._battery = battery self._battery = battery
@@ -551,23 +549,38 @@ class CC2650Device(Device):
return self._coeff return self._coeff
def update_cali_version(self) -> bool: def _check_crc(self, data):
try: data_chk_sum = data[-1]
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, 0)
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code) # print('data:', list(data), 'data_chk_sum:', data_chk_sum)
except SendInstructionTimeoutError: # print('data[0:-1]:', list(data[0:-1]), 'check_sum:', sum(data[0:-1]) & 0b11111111)
self._master.log_warn('device', self.device_id, 'update cali version error')
return False if data_chk_sum == sum(data[0:-1]) & 0b11111111:
except RuntimeError:
self._master.log_warn('device', self.device_id, 'update cali version error')
return False
else:
sleep(0.1)
# receive
version = self._master.read_characteristic(self.device_id,CC2650MasterDevice.RETURN_HANDLE)
self._cali_version = struct.unpack('<H', version[2:4])[0]
return True return True
return False
def update_cali_version(self) -> bool:
for _ in range(5):
try:
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, 0)
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
except SendInstructionTimeoutError:
self._master.log_warn('device', self.device_id, 'update cali version error')
return False
except RuntimeError:
self._master.log_warn('device', self.device_id, 'update cali version error')
return False
else:
version = self._master.read_characteristic(self.device_id,CC2650MasterDevice.RETURN_HANDLE)
if self._check_crc(version):
self._cali_version = struct.unpack('<H', version[2:4])[0]
print('self._cali_version=', self._cali_version)
return True
self._master.log_warn('device', self.device_id, 'update cali version error')
return False
def update_calibration_info(self, device_type: str): def update_calibration_info(self, device_type: str):
""" get device calibration info """ """ get device calibration info """
@@ -590,20 +603,6 @@ class CC2650Device(Device):
elif device_type == 'TDC4VC': elif device_type == 'TDC4VC':
i = 0 i = 0
request_times = 0 request_times = 0
# neulive 2.1 (only support ch1~ch8)
# try:
# # send
# code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, 0)
# self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
# # receive
# data = self._master.read_characteristic(self.device_id, CC2650MasterDevice.RETURN_HANDLE)
#
# coeff.append(self._decode_data(DeviceInstruction.CIS_CALI, data))
# except SendInstructionTimeoutError:
# self._master.log_warn('device', self.device_id, 'update_calibration_info no response')
# except RuntimeError:
# self._master.log_warn('device', self.device_id, 'update_calibration_info no response')
while i < 4: while i < 4:
try: try:
# print('i', i) # print('i', i)
@@ -680,41 +679,32 @@ class CC2650Device(Device):
elif device_type == 'EISZeroOne': elif device_type == 'EISZeroOne':
i = 1 i = 1
request_times = 0
while i <= 24: while i <= 24:
try: for _ in range(5):
# send try:
code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i) # send
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code) code = self._encode_instruction(DeviceInstruction.TYP_CIS, DeviceInstruction.CIS_CALI, i)
self._master.write_characteristic(self.device_id, CC2650MasterDevice.COMMAND_HANDLE, code)
sleep(0.1) except SerialTimeoutException:
self._master.log_warn('device', self.device_id, 'send update_calibration_info instruction fail')
continue
# receive
data = self._master.read_characteristic(self.device_id,
CC2650MasterDevice.RETURN_HANDLE)
coeff.append(self._decode_data(DeviceInstruction.CIS_CALI, data))
except SendInstructionTimeoutError as e:
print(e)
self._master.log_warn('device', self.device_id, 'update_calibration_info no response')
raise BaseException
except RuntimeError as e:
print(e)
self._master.log_warn('device', self.device_id, 'update_calibration_info no response - 2')
request_times += 1
if request_times > 3:
self._master.reset(self.device_id)
break
else:
# print('data success')
if len(data) > 0:
i += 1
else: else:
request_times += 1 try:
if request_times > 3: # receive
self._master.reset(self.device_id) data = self._master.read_characteristic(self.device_id,
break CC2650MasterDevice.RETURN_HANDLE)
except RecvTimeout:
self._master.log_warn('device', self.device_id, 'update_calibration_info no response')
else:
if self._check_crc(data) and data is not None:
coeff.append(self._decode_data(DeviceInstruction.CIS_CALI, data))
i += 1
else:
self._master.log_warn('device', self.device_id, 'update_calibration_info crc wrong')
continue
else: else:
# default: neulive 2.1 # default: neulive 2.1
@@ -1969,123 +1959,6 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
"""initialize cc2650 (master)""" """initialize cc2650 (master)"""
pass pass
def scan_send_ins(self):
# send scan command
try:
print(':: scan_send_ins ::', self.CC2650_COMMAND_LEN, 3, 0, 0)
self._cc2650.send(self.CC2650_COMMAND_LEN, 3, 0, 0)
except SerialTimeoutException as e:
raise RecvTimeout('send scan fail') from e
else:
# wait scanning
# sleep(2)
clean_buf = self._cc2650.receive_timeout("20B", timeout=3)
print("clean_buf = ", clean_buf)
# def cc2650_uart_irq(self):
# uart_irq = self.get_uart_irq_pin()
# uart_irq.output(False)
# sleep(0.001)
# uart_irq.output(True)
@synchronized
def scan_callback(self, callback: Callable[[DeviceResponseInfo], None], timeout=5, all_device=False) -> bool:
self._found = found = []
self._found_with_id = []
hdr_BPHS = [66, 80, 72, 83]
scan_response: Union[Optional[tuple], Any] = None
# build scan instruction
scan_ins = bytearray()
scan_ins.append(3) #scan instruction
scan_ins.append(1) #length
scan_ins.append(0xF1)
# print('send_scan', bytes(scan_ins))
self._cc2650.send("bytes", bytes(scan_ins))
try:
scan_response = self._cc2650.recv_uart(timeout)
except RecvTimeout:
# self.reset_internal()
# self.reset_hardware()
# self._interface.flush()
return False
if len(scan_response) <= 1:
print('len(scan) <= 1, scan_response:', list(scan_response))
return False
# instruction format:
# ins[0]: get_scan_response = 0x04
# ins[1]: number of scanned device=0; a certain device = device_id (could be 1~8)
# ins[2]: addr=MAC=1, localName=2, company_code=3, version_info=4, battery_info=5, all_info=6;
# attr_length=0, e.g. len(addr)=6, len(company_code)=4
local_mac = None
local_cc = None
local_ver = None
local_bat = None
local_name = None
local_addr_type = None
# get device attribute length
attr_length = [6, 4, 6, 5, 20]
index = 0
local_mac = get_device_mac_in_address_format(scan_response[index:index + 6])
index = index + 6
# print("local_mac = ", hex(local_mac[0]), hex(local_mac[1]),
# hex(local_mac[2]), hex(local_mac[3]),
# hex(local_mac[4]), hex(local_mac[5]))
local_cc = get_device_company_code(scan_response[index:index + 4])
index = index + 4
# print("local_cc = ", local_cc)
local_ver = scan_response[index:index + 6]
index = index + 6
# print("local_ver = ", local_ver)
local_bat = get_device_battery_info(scan_response[index:index + 5])
index = index + 5
# print("local_bat = ", local_bat)
local_name = get_device_name_in_string_format(list(scan_response[index:index + 20]))
index = index + 20
# print("local_name = ", local_name)
# addr type is don't care in BMD380
print('scan_response:', list(scan_response))
local_addr_type = int(scan_response[index:index + 1][0])
# local_addr_type = 0xFF
index = index + 1
# print("local_addr_type = ", local_addr_type)
response = is_headstage_device_central_version(local_mac,
local_addr_type,
local_name,
local_cc,
local_ver,
local_bat)
if response is not None:
self.log_info('found', address_str(response.mac_address), response.serial_number)
self._interface.flush_input()
# apppend into db
devicesList = DeviceAPI.getByMac(address_str(response.mac_address))
if devicesList is not None:
if len(devicesList) == 0:
DeviceAPI.create(response.device_name, local_ver, address_str(response.mac_address))
found.append(response)
# print('scan_done_found', found)
self._found_with_id.append((response, 0 + 1))
callback(response)
return True
def decode_uart_preamble(self, raw_uart: tuple, expect_ret_len: int = 0) -> Optional[list]: def decode_uart_preamble(self, raw_uart: tuple, expect_ret_len: int = 0) -> Optional[list]:
# print("decode_uart_preamble: raw_uart = ", raw_uart) # print("decode_uart_preamble: raw_uart = ", raw_uart)
if raw_uart is None: if raw_uart is None:
@@ -2112,34 +1985,154 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
return self._found return self._found
def check_mem_survive(self) -> Optional[CC2650Device]: def check_mem_survive(self) -> Optional[CC2650Device]:
ack = [] chk_mem_response = None
ins = bytearray() ins = bytearray()
ins.append(10)
ins.append(1) #length ins.append(0x0A)
ins.append(0x01) #length
ins.append(0xF1) ins.append(0xF1)
# print('ins', list(ins)) self._interface.flush_input()
try: try:
self.log_verbose('[CC2650]', 'check_mem_survive att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins)) self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException as e: except SerialTimeoutException:
raise RecvTimeout('device CC2650 check_mem_survive timeout') from e self.log_verbose('[CC2650]', 'check_mem_survive send fail')
else: else:
try: try:
ack = self._cc2650.recv_uart(0.001) chk_mem_response = self._cc2650.recv_uart(0.001)
except RecvTimeout: except RecvTimeout:
self.log_info("no memory board") self.log_verbose('[CC2650]', 'check_mem_survive response timeout, no memory board')
# else: if chk_mem_response is None:
# print('ack=', ack) return False
if ack == [3]: pack_len = chk_mem_response[0]
mem_ack = chk_mem_response[1:pack_len+1]
if mem_ack == [3]:
chk_mem_response_hex = ''.join(format(i, '02X') for i in chk_mem_response)
self.log_verbose('[CC2650]', 'check_mem_survive success', '0x'+chk_mem_response_hex)
return True return True
return False return False
@synchronized
def scan_callback(self, callback: Callable[[DeviceResponseInfo], None], timeout=5, all_device=False) -> bool:
self._found = found = []
self._found_with_id = []
scan_response = None
ins = bytearray()
ins.append(0x03)
ins.append(0x01) #length
ins.append(0xF1)
self._interface.flush_input()
for _ in range(5):
try:
self.log_verbose('[CC2650]', 'scan_callback att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException:
self.log_verbose('[CC2650]', 'scan_callback send fail, rescan')
continue
else:
try:
scan_response = self._cc2650.recv_uart(0.01)
except RecvTimeout:
self.log_verbose('[CC2650]', 'scan_callback response timeout, no device, rescan')
continue
else:
if scan_response is None:
self.log_verbose('[CC2650]', 'scan_callback response is None, rescan')
continue
else:
break
if scan_response is None:
self.log_verbose('[CC2650]', 'scan_callback response is None--2')
return False
scan_response_hex = ''.join(format(i, '02X') for i in scan_response)
self.log_verbose('[CC2650]', 'scan_callback success', '0x'+scan_response_hex)
if len(scan_response) <= 2:
print('******************************************************************')
print('******************************************************************')
print('******************************************************************')
print('******************************************************************')
print('****need to fix, len(scan) <= 2')
print()
return False
pack_len = scan_response[0]
device_info_pkg = scan_response[1:pack_len+1]
# instruction format:
# ins[0]: get_scan_response = 0x04
# ins[1]: number of scanned device=0; a certain device = device_id (could be 1~8)
# ins[2]: addr=MAC=1, localName=2, company_code=3, version_info=4, battery_info=5, all_info=6;
# attr_length=0, e.g. len(addr)=6, len(company_code)=4
local_mac = None
local_cc = None
local_ver = None
local_bat = None
local_name = None
local_addr_type = None
# get device attribute length
attr_length = [6, 4, 6, 5, 20]
index = 0
local_mac = get_device_mac_in_address_format(device_info_pkg[index:index + 6])
index = index + 6
local_cc = get_device_company_code(device_info_pkg[index:index + 4])
index = index + 4
local_ver = device_info_pkg[index:index + 6]
index = index + 6
local_bat = get_device_battery_info(device_info_pkg[index:index + 5])
index = index + 5
local_name = get_device_name_in_string_format(list(device_info_pkg[index:index + 20]))
index = index + 20
local_addr_type = int(device_info_pkg[index:index + 1][0])
index = index + 1
response = is_headstage_device_central_version(local_mac,
local_addr_type,
local_name,
local_cc,
local_ver,
local_bat)
if response is not None:
self.log_info('found', address_str(response.mac_address), response.serial_number)
self._interface.flush_input()
# apppend into db
devicesList = DeviceAPI.getByMac(address_str(response.mac_address))
if devicesList is not None:
if len(devicesList) == 0:
DeviceAPI.create(response.device_name, local_ver, address_str(response.mac_address))
found.append(response)
# print('scan_done_found', found)
self._found_with_id.append((response, 0 + 1))
callback(response)
return True
@synchronized @synchronized
def connect(self, response: DeviceResponseInfo, direct_connect: bool = False) -> Optional[CC2650Device]: def connect(self, response: DeviceResponseInfo, direct_connect: bool = False) -> Optional[CC2650Device]:
if self._handle is not None: if self._handle is not None:
@@ -2149,215 +2142,163 @@ class CC2650SingleMasterCentralDevice(CC2650MasterDevice, Synchronized):
addr_type = response.addr_type addr_type = response.addr_type
address_s = cc2650.address_str(address) address_s = cc2650.address_str(address)
self.log_info(DEVICE_CONNECTING, address_s)
connect_ins = bytearray()
connect_ins.append(5)
connect_ins.append(8) #length
connect_ins.append(addr_type)
connect_ins.append(address[0])
connect_ins.append(address[1])
connect_ins.append(address[2])
connect_ins.append(address[3])
connect_ins.append(address[4])
connect_ins.append(address[5])
connect_ins.append(0xF1)
connected = False connected = False
connect_response = None
# send connect command ins = bytearray()
if direct_connect is True: ins.append(0x05)
ins.append(0x08) #length
# send device mac and addrType ins.append(addr_type)
try: ins.append(address[0])
self._cc2650.send("bytes", bytes(connect_ins)) ins.append(address[1])
ins.append(address[2])
except SerialTimeoutException as e: ins.append(address[3])
raise RecvTimeout('device CC2650 connect fail') from e ins.append(address[4])
return None ins.append(address[5])
ins.append(0xF1)
# connection establish done?
for retry_recv_ack in range(10):
try:
con_done = self._cc2650.recv_uart(timeout = 0.5)
# print("con_done = ", con_done)
except RecvTimeout:
self.log_info("recv connection timeout, retry... ")
continue
# is the ack valid?
if con_done is None:
continue
elif con_done[0] is 46 and \
con_done[1] is 80 and \
con_done[2] is 48 and \
con_done[3] is 4:
connected = True
break
else:
for dev in self._found:
if dev.mac_address == address:
# connection establish done?
for retry_recv_ack in range(5):
try:
# send device mac and addrType
self._cc2650.send("bytes", bytes(connect_ins))
sleep(1.5)
con_done = self._cc2650.recv_uart(timeout = 0.1)
except RecvTimeout:
self.log_info("recv connection timeout, retry... ")
continue
# is the ack valid?
if con_done is None:
self.log_info("recv connection timeout, retry... ")
continue
elif con_done[0] is 46 and \
con_done[1] is 80 and \
con_done[2] is 48 and \
con_done[3] is 4:
connected = True
# print('con_done=', con_done)
break
else:
continue
# if select device is invalid or connect failed
self._interface.flush_input() self._interface.flush_input()
if connected is False: for retry in range(5):
if direct_connect is True: try:
self.reset_internal() self.log_verbose('[CC2650]', 'connect att_write', '0x'+str.upper(ins.hex()))
self.reset_hardware() self._cc2650.send("bytes", bytes(ins))
self._interface.flush()
return None
# CC2650Device(device_id, master, scan_response) is a slave device except RecvTimeout:
# device_id is don't care, because it will be overwrite later self.log_verbose('[CC2650]', 'connect send fail')
dont_care = 0 continue
self._device = ret = CC2650Device(device_id=dont_care, master=self, response_info=response)
self.log_info(DEVICE_CONNECTED, address_s)
sleep(0.5)
print('ret',ret)
return ret else:
try:
connect_response = self._cc2650.recv_uart(2)
except RecvTimeout:
self.log_verbose('[CC2650]', 'connect response timeout')
if retry < 5:
self.log_verbose('[CC2650]', 'connect retry')
continue
else:
break
if connect_response is None:
return False
pack_len = connect_response[0]
connect_ack = connect_response[1:pack_len+1]
if connect_ack[0] == 46 and connect_ack[1] == 80 and \
connect_ack[2] == 48 and connect_ack[3] == 4:
connected = True
connect_response_hex = ''.join(format(i, '02X') for i in connect_response)
self.log_verbose('[CC2650]', 'connect success', '0x'+connect_response_hex)
if connected == True:
# CC2650Device(device_id, master, scan_response) is a slave device
# device_id is don't care, because it will be overwrite later
dont_care = 0
self._device = ret = CC2650Device(device_id=dont_care, master=self, response_info=response)
self.log_verbose('[CC2650]', DEVICE_CONNECTED, address_s)
return ret
self.log_verbose('[CC2650]', 'connect fail')
return False
@synchronized @synchronized
def disconnect(self, device: int, force=False) -> bool: def disconnect(self, device: int, force=False) -> bool:
self.log_info(DEVICE_DISCONNECTING, device)
ins = bytearray() ins = bytearray()
ins.append(8)
ins.append(1) #length ins.append(0x08)
ins.append(0x01) #length
ins.append(0xF1) ins.append(0xF1)
self._interface.flush_input()
for _ in range(5):
try:
self.log_verbose('[CC2650]', 'disconnect att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException:
self.log_verbose('[CC2650]', 'disconnect send fail')
continue
else:
self.reset_internal()
self.reset_hardware()
self.log_verbose('[CC2650]', 'disconnect success')
return True
self.log_verbose('[CC2650]', 'disconnect fail')
return False
@synchronized
def write_characteristic(self, device: int, handle: int, data: bytes) -> bool:
write_response = None
ins = bytearray()
ins.append(0x06)
ins.append(len(data)+2) #length = handle + C0C0XXXX(data len) + F1
ins.append(handle)
ins.extend(data)
ins.append(0xF1)
self._interface.flush_input()
try: try:
# print('send_disconnect',bytes(ins)) self.log_verbose('[CC2650]', 'write_characteristic', device, str(hex(handle).upper()))
self.log_verbose('[CC2650]', 'write_characteristic att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins)) self._cc2650.send("bytes", bytes(ins))
except RecvTimeout: except SerialTimeoutException:
self.log_warn('disconnect time out') self.log_verbose('[CC2650]', 'write_characteristic send fail')
return False
except RuntimeError as e:
self.log_warn('suppressed error', str(e))
return False
else: else:
sleep(0.01) try:
write_response = self._cc2650.recv_uart(0.5)
except RecvTimeout:
self.log_verbose('[CC2650]', 'write_characteristic response timeout')
if write_response is None:
return False
pack_len = write_response[0]
write_ack = write_response[1:pack_len+1]
if write_ack == [3]:
write_response_hex = ''.join(format(i, '02X') for i in write_response)
self.log_verbose('[CC2650]', 'write_characteristic success', '0x'+write_response_hex)
return True return True
finally: self.log_verbose('[CC2650]', 'write_characteristic fail')
self.log_info(DEVICE_DISCONNECTED, device) return False
# reset single 2650 after disconnected
self.reset_internal()
self.reset_hardware()
self._interface.flush()
@synchronized @synchronized
def read_characteristic(self, device: int, handle: int) -> Optional[bytes]: def read_characteristic(self, device: int, handle: int) -> Optional[bytes]:
read_response = None
# print("read_characteristic, expect_data_length = ", expect_data_length)
ret = None
ins = bytearray() ins = bytearray()
ins.append(7)
ins.append(2) #length ins.append(0x07)
ins.append(0x02) #length
ins.append(handle) ins.append(handle)
ins.append(0xF1) ins.append(0xF1)
self._interface.flush_input()
for _ in range(2):
try:
# print('send_read',bytes(ins))
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException:
raise RecvTimeout('device CC2650 send read_characteristic fail')
try:
ret = self._cc2650.recv_uart(timeout = 2)
except Exception as e2:
raise RecvTimeout()
else:
# print("======== read ret = ", ret)
self._interface.flush_input()
# try:
# ret = self._cc2650.recv_uart(timeout = 1)
# except Exception as e2:
# raise RecvTimeout()
# else:
# # print("read_characteristic ret = ", ret)
# pass
if ret is None:
return None
return bytes(ret)
@synchronized
def write_characteristic(self, device: int, handle: int, data: bytes):
# print("device", device)
# print("handle", handle)
# print("data", data.hex())
# self.log_info('reset')
self.log_verbose('write_characteristic', device, handle)
self.log_verbose('[CC2650]', 'att_write', str.upper(data.hex()))
ack = None
ret = None
data_array = bytearray()
data_array.append(6)
data_array.append(len(data)+2) #length
data_array.append(handle)
data_array.extend(data)
data_array.append(0xF1)
try: try:
self._cc2650.send("bytes", bytes(data_array)) self.log_verbose('[CC2650]', 'read_characteristic', device, str(hex(handle).upper()))
# print('send_write',bytes(data_array)) self.log_verbose('[CC2650]', 'read_characteristic att_write','0x'+str.upper(ins.hex()))
self._cc2650.send("bytes", bytes(ins))
except SerialTimeoutException as e: except SerialTimeoutException:
raise RecvTimeout('device CC2650 send instruction fail') from e self.log_verbose('[CC2650]', 'read_characteristic send fail')
# read error code
try:
ret = self._cc2650.recv_uart()
# print("_______ write ack = ", ret)
except Exception as e2:
pass
else: else:
pass try:
read_response = self._cc2650.recv_uart(1)
self._interface.flush_input() except RecvTimeout:
self._interface.flush_output() self.log_verbose('[CC2650]', 'read_characteristic response timeout')
if read_response is None:
return None
read_response_hex = ''.join(format(i, '02X') for i in read_response)
self.log_verbose('[CC2650]', 'read_characteristic success', '0x'+read_response_hex)
return bytes(read_response)
def set_notify(self, device: Union[int, Device], enable: bool): def set_notify(self, device: Union[int, Device], enable: bool):
if isinstance(device, CompletedDevice): if isinstance(device, CompletedDevice):
@@ -2458,7 +2399,6 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
self._cc2650_log_level = self.log_level self._cc2650_log_level = self.log_level
def read_characteristic(self, device: int, handle: int) -> Optional[bytes]: def read_characteristic(self, device: int, handle: int) -> Optional[bytes]:
self.log_verbose('read_characteristic', device, '0x%02X' % handle)
master = self._cc2650[device] master = self._cc2650[device]
@@ -2516,11 +2456,6 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
self._interface.flush() self._interface.flush()
self._selector.select(device_id) self._selector.select(device_id)
# self._mem_selector.select(device_id)
# print("multiMaster selector = ", device_id)
# print("\n")
# device._notify_flag = enable
try: try:
master.write_characteristic(device_id, self.NOTIFY_HANDLE, value) master.write_characteristic(device_id, self.NOTIFY_HANDLE, value)
except SendInstructionTimeoutError: except SendInstructionTimeoutError:
@@ -2634,15 +2569,15 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
return ret return ret
def connect(self, response: DeviceResponseInfo, direct_connect: bool = False) -> Device: def connect(self, response: DeviceResponseInfo, direct_connect: bool = True) -> Device:
self.log_verbose('connect') self.log_verbose('connect')
master = None master = None
print('self._foreach_empty_master()', self._foreach_empty_master())
for master in self._foreach_empty_master(): for master in self._foreach_empty_master():
m = self._cc2650[master] m = self._cc2650[master]
d = self._device[master] d = self._device[master]
print('master', master, d, m)
if direct_connect is True and d is None: if direct_connect is True and d is None:
break break
@@ -2653,22 +2588,27 @@ class CC2650MultiMasterCentralDevice(CC2650MasterDevice, Synchronized):
if master is None: if master is None:
raise RuntimeError('cannot connect any more device') raise RuntimeError('cannot connect any more device')
else: else:
print('456')
raise RuntimeError('rescan please') raise RuntimeError('rescan please')
# #
master = 4
self.log_verbose('use', master) self.log_verbose('use', master)
m = self._cc2650[master] m = self._cc2650[master]
d = self._device[master] d = self._device[master]
print('4')
if d is not None: if d is not None:
raise RuntimeError('cc2650 has connected a device') raise RuntimeError('cc2650 has connected a device')
with self: with self:
print('5')
self._interface.flush() self._interface.flush()
self._selector.select(master) self._selector.select(master)
sleep(0.0001) sleep(0.0001)
d = m.connect(response, direct_connect) d = m.connect(response, direct_connect)
print('6')
if d is None: if d is None:
raise RuntimeError('connect failed, retry please') raise RuntimeError('connect failed, retry please')
+7 -5
View File
@@ -683,12 +683,12 @@ class DeviceManager(MasterDevice, Synchronized):
address = address_str(response.mac_address) address = address_str(response.mac_address)
self.log_info(DEVICE_CONNECTING, address) self.log_info(DEVICE_CONNECTING, address)
response = self.found_device(response) # response = self.found_device(response)
''' device not found''' # ''' device not found'''
if response is None: # if response is None:
self.log_warn(DEVICE_CONNECT_FAIL, address, DEVICE_NOT_FOUND) # self.log_warn(DEVICE_CONNECT_FAIL, address, DEVICE_NOT_FOUND)
return None # return None
# raise RuntimeError(DEVICE_NOT_FOUND, address) # raise RuntimeError(DEVICE_NOT_FOUND, address)
# get device library # get device library
@@ -718,7 +718,9 @@ class DeviceManager(MasterDevice, Synchronized):
serial_number=response.serial_number) serial_number=response.serial_number)
else: else:
try: try:
print('here!!!!!!!!!!!!!!!!!!!!!!!', response)
device = self._centralMaster.connect(response) device = self._centralMaster.connect(response)
print('connect', device)
device = CompletedDevice(self, library, device.device_id, device) device = CompletedDevice(self, library, device.device_id, device)
except Exception as e: except Exception as e:
+88 -88
View File
@@ -1437,186 +1437,186 @@ class EISZeroOneDataDecoder(RecDataDecoder):
#hstia=0 #hstia=0
cis_cali_packet = 1 cis_cali_packet = 1
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+2:index+6])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0]) hsrtia_b.append(struct.unpack('>q', cali_coeff[index+6:index+14])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0]) rolloff.append(struct.unpack('>i', cali_coeff[index+14:index+18])[0])
cis_cali_packet = 2 cis_cali_packet = 2
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 0 g = 0
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
cis_cali_packet = 3 cis_cali_packet = 3
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 0 g = 0
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
#hstia=1 #hstia=1
cis_cali_packet = 4 cis_cali_packet = 4
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+2:index+6])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0]) hsrtia_b.append(struct.unpack('>q', cali_coeff[index+6:index+14])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0]) rolloff.append(struct.unpack('>i', cali_coeff[index+14:index+18])[0])
cis_cali_packet = 5 cis_cali_packet = 5
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 1 g = 1
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
cis_cali_packet = 6 cis_cali_packet = 6
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 1 g = 1
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
#hstia=2 #hstia=2
cis_cali_packet = 7 cis_cali_packet = 7
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+2:index+6])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0]) hsrtia_b.append(struct.unpack('>q', cali_coeff[index+6:index+14])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0]) rolloff.append(struct.unpack('>i', cali_coeff[index+14:index+18])[0])
cis_cali_packet = 8 cis_cali_packet = 8
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 2 g = 2
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
cis_cali_packet = 9 cis_cali_packet = 9
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 2 g = 2
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
#hstia=3 #hstia=3
cis_cali_packet = 10 cis_cali_packet = 10
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+2:index+6])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0]) hsrtia_b.append(struct.unpack('>q', cali_coeff[index+6:index+14])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0]) rolloff.append(struct.unpack('>i', cali_coeff[index+14:index+18])[0])
cis_cali_packet = 11 cis_cali_packet = 11
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 3 g = 3
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
cis_cali_packet = 12 cis_cali_packet = 12
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 3 g = 3
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
#hstia=4 #hstia=4
cis_cali_packet = 13 cis_cali_packet = 13
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+2:index+6])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0]) hsrtia_b.append(struct.unpack('>q', cali_coeff[index+6:index+14])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0]) rolloff.append(struct.unpack('>i', cali_coeff[index+14:index+18])[0])
cis_cali_packet = 14 cis_cali_packet = 14
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 4 g = 4
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
cis_cali_packet = 15 cis_cali_packet = 15
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 4 g = 4
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
#hstia=5 #hstia=5
cis_cali_packet = 16 cis_cali_packet = 16
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+2:index+6])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0]) hsrtia_b.append(struct.unpack('>q', cali_coeff[index+6:index+14])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0]) rolloff.append(struct.unpack('>i', cali_coeff[index+14:index+18])[0])
cis_cali_packet = 17 cis_cali_packet = 17
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 5 g = 5
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
cis_cali_packet = 18 cis_cali_packet = 18
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 5 g = 5
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
#hstia=6 #hstia=6
cis_cali_packet = 19 cis_cali_packet = 19
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+2:index+6])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0]) hsrtia_b.append(struct.unpack('>q', cali_coeff[index+6:index+14])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0]) rolloff.append(struct.unpack('>i', cali_coeff[index+14:index+18])[0])
cis_cali_packet = 20 cis_cali_packet = 20
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 6 g = 6
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
cis_cali_packet = 21 cis_cali_packet = 21
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 6 g = 6
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
#hstia=7 #hstia=7
cis_cali_packet = 22 cis_cali_packet = 22
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
hsrtia_a.append(struct.unpack('>i', cali_coeff[index+1:index+5])[0]) hsrtia_a.append(struct.unpack('>i', cali_coeff[index+2:index+6])[0])
hsrtia_b.append(struct.unpack('>q', cali_coeff[index+5:index+13])[0]) hsrtia_b.append(struct.unpack('>q', cali_coeff[index+6:index+14])[0])
rolloff.append(struct.unpack('>i', cali_coeff[index+13:index+17])[0]) rolloff.append(struct.unpack('>i', cali_coeff[index+14:index+18])[0])
cis_cali_packet = 23 cis_cali_packet = 23
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 7 g = 7
phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][0] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][0] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][1] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][1] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
cis_cali_packet = 24 cis_cali_packet = 24
index = (cis_cali_packet - 1) * cis_data_len index = (cis_cali_packet - 1) * cis_data_len
g = 7 g = 7
phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+1:index+5])[0] phase_coeff[g][2] = struct.unpack('>i', cali_coeff[index+2:index+6])[0]
phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+5:index+9])[0] phase_offset[g][2] = struct.unpack('>i', cali_coeff[index+6:index+10])[0]
phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+9:index+13])[0] phase_coeff[g][3] = struct.unpack('>i', cali_coeff[index+10:index+14])[0]
phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+13:index+17])[0] phase_offset[g][3] = struct.unpack('>i', cali_coeff[index+14:index+18])[0]
print('hsrtia_a', hsrtia_a) print('hsrtia_a', hsrtia_a)
print('hsrtia_b', hsrtia_b) print('hsrtia_b', hsrtia_b)
print('rolloff', rolloff) print('rolloff', rolloff)
+5
View File
@@ -532,6 +532,7 @@ class ComplexExpression(Expression[T]):
@classmethod @classmethod
def parse(cls, json: JSON_OBJECT) -> Union['ComplexExpression', UndeterminedExpression]: def parse(cls, json: JSON_OBJECT) -> Union['ComplexExpression', UndeterminedExpression]:
expression = _get(json, 'expression', str, _truncate(json), nullable=True) expression = _get(json, 'expression', str, _truncate(json), nullable=True)
print('expression parse', expression, json)
if expression is None: if expression is None:
# un-determined expression # un-determined expression
@@ -879,9 +880,13 @@ class WhenExpression(ComplexExpression[T]):
self._when: Dict[str, Expression[T]] = when self._when: Dict[str, Expression[T]] = when
def value(self, context: Scope) -> Union[str, T]: def value(self, context: Scope) -> Union[str, T]:
print('value', context)
value = super().value(context) value = super().value(context)
key = str(value) key = str(value)
print('value1', key,value)
print('when', self._when)
if key in self._when: if key in self._when:
return self._when[key].value(context.child(VALUE=value)) return self._when[key].value(context.child(VALUE=value))
+2
View File
@@ -404,7 +404,9 @@ class ListInstruction(Instruction, ImmutableListNode[Union[Instruction, Expressi
ImmutableListNode.__init__(self, list(ins)) ImmutableListNode.__init__(self, list(ins))
def eval_instruction(self, context: Scope) -> Iterable['SingleInstruction']: def eval_instruction(self, context: Scope) -> Iterable['SingleInstruction']:
print('eval_instruction', context)
for ins in self: for ins in self:
print(ins)
# foreach instructions # foreach instructions
# ins type could be Union[str, Expression] # ins type could be Union[str, Expression]
-14
View File
@@ -1403,20 +1403,6 @@ class DebugDevice(CompletedDevice):
def read_command_return_data(self) -> Optional[bytes]: def read_command_return_data(self) -> Optional[bytes]:
return None return None
def send_command(self, ins_type: int, ins_oper: int, *instruction: int):
length = len(instruction)
print('instruction send :',
'%02X' % ((ins_type & 0xF0) | (self.device_id & 0x0F)),
'%02X' % ((ins_oper & 0xF0) | (length & 0x0F)),
' '.join(map(lambda v: '%02X' % v, instruction)))
def send_instruction(self, ins_type: int, ins_oper: int, *instruction: int):
length = len(instruction)
print('instruction send :',
'%02X' % ((ins_type & 0xF0) | (self.device_id & 0x0F)),
'%02X' % ((ins_oper & 0xF0) | (length & 0x0F)),
' '.join(map(lambda v: '%02X' % v, instruction)))
@property @property
def battery(self) -> int: def battery(self) -> int:
return 100 return 100
+16 -12
View File
@@ -3697,7 +3697,6 @@ class CC2650Central(LoggerFlag):
def recv(self, timeout: Optional[float] = None) -> Optional[list]: def recv(self, timeout: Optional[float] = None) -> Optional[list]:
packet = self._recv_byte() packet = self._recv_byte()
# print("packet = ", packet)
if packet is None: if packet is None:
return None return None
@@ -3709,6 +3708,8 @@ class CC2650Central(LoggerFlag):
def _recv_byte(self) -> Optional[int]: def _recv_byte(self) -> Optional[int]:
ret = self._recv_bytes(1) ret = self._recv_bytes(1)
# if ret is not None:
# print('packet = {0}'.format(hex(ret[0]).upper()))
return ret[0] if ret is not None else None return ret[0] if ret is not None else None
def _recv_bytes(self, size: int = 1) -> Union[None, bytes]: def _recv_bytes(self, size: int = 1) -> Union[None, bytes]:
@@ -3724,27 +3725,28 @@ class CC2650Central(LoggerFlag):
return None return None
def _recv_event(self, timeout: Optional[float] = 1) -> Optional[list]: def _recv_event(self, timeout: Optional[float] = 1) -> Optional[list]:
code = self._recv_byte() packet = self._recv_byte()
# print("code = ", code)
if code is None: if packet is None:
return None return None
length = self._recv_byte() length = self._recv_byte()
# print('code::',code,'length::',length) len_b = _struct.pack("B", length)
_start = _time()
data = b'' data = b''
while len(data) < length: _start = _time()
ret = self._recv_bytes(length - len(data))
# print("ret = ", ret)
if ret is not None: while len(data) < length:
data += ret packets = self._recv_bytes(length - len(data))
# hex_packets = ''.join(format(i, '02x') for i in packets)
# print("packets = ", hex_packets.upper())
if packets is not None:
data += packets
elif timeout is not None and _time() - _start > timeout: elif timeout is not None and _time() - _start > timeout:
raise RecvTimeout() raise RecvTimeout()
data = len_b + data
self._interface.flush() self._interface.flush()
return list(data) return list(data)
@@ -3760,5 +3762,7 @@ class CC2650Central(LoggerFlag):
raise RecvTimeout() raise RecvTimeout()
else: else:
uart_data_hex = ''.join(format(i, '02X') for i in uart_data)
# print('uart_data: 0x{0}'.format(uart_data_hex.upper()))
return uart_data return uart_data
+2
View File
@@ -53,6 +53,8 @@ class UARTInterface(LowLevelHardwareInterface):
:param data: raw byte instruction :param data: raw byte instruction
:raises SerialTimeoutException: :raises SerialTimeoutException:
""" """
data_hex = ''.join(format(i, '02X') for i in data)
# print('send_byte: 0x{0}'.format(data_hex.upper()))
self._serial.write(data) self._serial.write(data)
def recv_byte(self, size: int) -> Optional[bytes]: def recv_byte(self, size: int) -> Optional[bytes]:
+24 -2
View File
@@ -329,6 +329,30 @@ class ControlServer(SocketServer, ControlServerAPI):
finally: finally:
self.led_thread.set_state(LED.AVAILABLE) self.led_thread.set_state(LED.AVAILABLE)
# version_info = [0, 2, 1, 7, 23, 2]
# serial_number = DeviceSerialNumber(version_info[0],
# version_info[1],
# version_info[2],
# version_info[3],
# version_info[4],
# version_info[5])
# response = DeviceResponseInfo('Elite-EDC', serial_number, (164, 218, 50, 212, 231, 12), addr_type=0)
# print('setup done', response)
# ret = self.device_manager.connect(response)
# print('ret', ret)
version_info = [0, 5, 1, 0, 23, 5]
serial_number = DeviceSerialNumber(version_info[0],
version_info[1],
version_info[2],
version_info[3],
version_info[4],
version_info[5])
response = DeviceResponseInfo('Elite-EDC', serial_number, (164, 218, 50, 212, 238, 89), addr_type=0)
print('setup done', response)
ret = self.device_manager.connect(response)
print('ret', ret)
def _setup_get_available_channel(self) -> Optional[List[int]]: def _setup_get_available_channel(self) -> Optional[List[int]]:
client = self.data_server.client() client = self.data_server.client()
@@ -558,7 +582,6 @@ class ControlServer(SocketServer, ControlServerAPI):
response = content response = content
else: else:
response = to_device_info(content) response = to_device_info(content)
try: try:
ret = self.device_manager.connect(response) ret = self.device_manager.connect(response)
except DeviceInstructionError as e: except DeviceInstructionError as e:
@@ -1398,7 +1421,6 @@ class ControlServer(SocketServer, ControlServerAPI):
if client is not None: if client is not None:
with client: with client:
client.show_data(device) client.show_data(device)
class _RandomCrashThread(ServerThread): class _RandomCrashThread(ServerThread):
def __init__(self): def __init__(self):
super().__init__('Crash') super().__init__('Crash')
@@ -9,9 +9,189 @@
"minor_version_number": 0 "minor_version_number": 0
}, },
"constant": { "constant": {
"TIME_MAX": 100000 "TIME_MAX": 100000,
"BLE_WRITE_MAX": 255,
"MODE_ALL_OUTPUT": 15,
"ELITE_CH_PR0": 0,
"ELITE_CH_D0": 1,
"ELITE_CH_A0": 2,
"ELITE_CH_A2": 3,
"ELITE_CH_A3": 4,
"ELITE_CH_A1": 5,
"ELITE_CH_D1": 6,
"ELITE_CH_PR1": 7,
"PR0": 0,
"PR1": 1,
"D0": 2,
"D1": 3,
"A0": 4,
"A1": 5,
"A2": 6,
"A3": 7
}, },
"parameters": { "parameters": {
"USED": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"T_EARLY": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"V_EARLY": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"CYCLE": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 65535
]
},
"value": "VALUE"
},
"T_MID0": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"T_MID1": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"T_MID2": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"T_MID3": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"V_MID0": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"V_MID1": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"V_MID2": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"V_MID3": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"T_LATE": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 86400000
]
},
"value": "VALUE"
},
"V_LATE": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"CURRENT": {
"initial": [0, 0, 0, 0, 0, 0, 0, 0],
"domain": {
"list": [
0, 50000
]
},
"value": "VALUE"
},
"OUTPUT_5V": {
"initial": [false, false, false, false, false, false, false, false],
"domain": {
"list": [
0, 2
]
},
"value": "VALUE"
},
"ADC_VALUE_I": {
"description": "ADC value current value",
"domain": "int"
},
"BLE_WRITE": {
"description": "send msg to elite",
"domain": {
"list": [
"BLE_WRITE_MAX"
]
},
"initial": "[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]",
"value": "VALUE"
},
"BLE_READ": {
"description": "receive msg from elite",
"domain": "int"
},
"TIME_DURATION": { "TIME_DURATION": {
"description": "timer", "description": "timer",
"record_meta": true, "record_meta": true,
@@ -154,14 +334,11 @@
"record_meta": true, "record_meta": true,
"value": [ "value": [
"Analog Current Control (ACC)", "Analog Current Control (ACC)",
"Idle" "Idle",
"Dev Mode",
"Trigger"
] ]
}, },
"CHANNEL": { "CHANNEL": {
"description": "delete it", "description": "delete it",
"record_meta": true, "record_meta": true,
@@ -220,7 +397,8 @@
{ {
"expression": "MODE", "expression": "MODE",
"when": { "when": {
"0": "curve_acc" "0": "curve_acc",
"3": "trig_timer_mode"
} }
}, },
"_sync(True)", "_sync(True)",
@@ -245,6 +423,21 @@
"CIS_VOLT", "CIS_VOLT",
"_cdr('20X>ADC_VALUE_I')" "_cdr('20X>ADC_VALUE_I')"
], ],
"ble_instru_send": [
"ble_write",
"_cdr('20X>ADC_VALUE_I')"
],
"ble_write": {
"type": "RIS",
"data": [
"XFF;",
"1B>BLE_WRITE[0];1B>BLE_WRITE[1];1B>BLE_WRITE[2];1B>BLE_WRITE[3];",
"1B>BLE_WRITE[4];1B>BLE_WRITE[5];1B>BLE_WRITE[6];1B>BLE_WRITE[7];",
"1B>BLE_WRITE[8];1B>BLE_WRITE[9];1B>BLE_WRITE[10];1B>BLE_WRITE[11];",
"1B>BLE_WRITE[12];1B>BLE_WRITE[13];1B>BLE_WRITE[14];1B>BLE_WRITE[15];",
"1B>BLE_WRITE[16];"
]
},
"curve_acc": { "curve_acc": {
"type": "RIS", "type": "RIS",
"parameter": { "parameter": {
@@ -307,6 +500,677 @@
"data": [ "data": [
"XE2;X02;X03;2B>ACC_a_out3_current;1B>ACC_a_out3" "XE2;X02;X03;2B>ACC_a_out3_current;1B>ACC_a_out3"
] ]
},
"trig_timer_mode": [
"trig_timer_mode_set_mode",
{
"expression": "USED[PR0]",
"when": {
"True": "trig_timer_mode_set_PR0"
}
},
{
"expression": "USED[PR1]",
"when": {
"True": "trig_timer_mode_set_PR1"
}
},
{
"expression": "USED[D0]",
"when": {
"True": "trig_timer_mode_set_D0"
}
},
{
"expression": "USED[D1]",
"when": {
"True": "trig_timer_mode_set_D1"
}
},
{
"expression": "USED[A0]",
"when": {
"True": "trig_timer_mode_set_A0"
}
},
{
"expression": "USED[A1]",
"when": {
"True": "trig_timer_mode_set_A1"
}
},
{
"expression": "USED[A2]",
"when": {
"True": "trig_timer_mode_set_A2"
}
},
{
"expression": "USED[A3]",
"when": {
"True": "trig_timer_mode_set_A3"
}
}
],
"trig_timer_mode_set_mode": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT"
},
"data": [
"1B>mode;",
"1XFF;"
]
},
"trig_timer_mode_set_PR0": [
"trig_timer_mode_set_PR0_para1",
"trig_timer_mode_set_PR0_para2",
"trig_timer_mode_set_PR0_para3"
],
"trig_timer_mode_set_PR0_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR0",
"para_sequence": 1,
"used": "USED[PR0]",
"v_early": "V_EARLY[PR0]",
"v_late": "V_LATE[PR0]",
"v_mid0": "V_MID0[PR0]",
"v_mid1": "V_MID1[PR0]",
"v_mid2": "V_MID2[PR0]",
"v_mid3": "V_MID3[PR0]",
"cycle": "CYCLE[PR0]",
"t_early": "T_EARLY[PR0]",
"t_late": "T_LATE[PR0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_PR0_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR0",
"para_sequence": 2,
"t_mid0": "T_MID0[PR0]",
"t_mid1": "T_MID1[PR0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_PR0_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR0",
"para_sequence": 3,
"t_mid2": "T_MID2[PR0]",
"t_mid3": "T_MID3[PR0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_PR1": [
"trig_timer_mode_set_PR1_para1",
"trig_timer_mode_set_PR1_para2",
"trig_timer_mode_set_PR1_para3"
],
"trig_timer_mode_set_PR1_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR1",
"para_sequence": 1,
"used": "USED[PR1]",
"v_early": "V_EARLY[PR1]",
"v_late": "V_LATE[PR1]",
"v_mid0": "V_MID0[PR1]",
"v_mid1": "V_MID1[PR1]",
"v_mid2": "V_MID2[PR1]",
"v_mid3": "V_MID3[PR1]",
"cycle": "CYCLE[PR1]",
"t_early": "T_EARLY[PR1]",
"t_late": "T_LATE[PR1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_PR1_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR1",
"para_sequence": 2,
"t_mid0": "T_MID0[PR1]",
"t_mid1": "T_MID1[PR1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_PR1_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_PR1",
"para_sequence": 3,
"t_mid2": "T_MID2[PR1]",
"t_mid3": "T_MID3[PR1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_D0": [
"trig_timer_mode_set_D0_para1",
"trig_timer_mode_set_D0_para2",
"trig_timer_mode_set_D0_para3",
"trig_timer_mode_set_D0_para4"
],
"trig_timer_mode_set_D0_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D0",
"para_sequence": 1,
"used": "USED[D0]",
"v_early": "V_EARLY[D0]",
"v_late": "V_LATE[D0]",
"v_mid0": "V_MID0[D0]",
"v_mid1": "V_MID1[D0]",
"v_mid2": "V_MID2[D0]",
"v_mid3": "V_MID3[D0]",
"cycle": "CYCLE[D0]",
"t_early": "T_EARLY[D0]",
"t_late": "T_LATE[D0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_D0_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D0",
"para_sequence": 2,
"t_mid0": "T_MID0[D0]",
"t_mid1": "T_MID1[D0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_D0_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D0",
"para_sequence": 3,
"t_mid2": "T_MID2[D0]",
"t_mid3": "T_MID3[D0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_D0_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D0",
"para_sequence": 4,
"d0_as_5v_en": "OUTPUT_5V[D0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"1B>d0_as_5v_en;"
]
},
"trig_timer_mode_set_D1": [
"trig_timer_mode_set_D1_para1",
"trig_timer_mode_set_D1_para2",
"trig_timer_mode_set_D1_para3",
"trig_timer_mode_set_D1_para4"
],
"trig_timer_mode_set_D1_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D1",
"para_sequence": 1,
"used": "USED[D1]",
"v_early": "V_EARLY[D1]",
"v_late": "V_LATE[D1]",
"v_mid0": "V_MID0[D1]",
"v_mid1": "V_MID1[D1]",
"v_mid2": "V_MID2[D1]",
"v_mid3": "V_MID3[D1]",
"cycle": "CYCLE[D1]",
"t_early": "T_EARLY[D1]",
"t_late": "T_LATE[D1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_D1_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D1",
"para_sequence": 2,
"t_mid0": "T_MID0[D1]",
"t_mid1": "T_MID1[D1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_D1_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D1",
"para_sequence": 3,
"t_mid2": "T_MID2[D1]",
"t_mid3": "T_MID3[D1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_D1_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_D1",
"para_sequence": 4,
"d0_as_5v_en": "OUTPUT_5V[D1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"1B>d0_as_5v_en;"
]
},
"trig_timer_mode_set_A0": [
"trig_timer_mode_set_A0_para1",
"trig_timer_mode_set_A0_para2",
"trig_timer_mode_set_A0_para3",
"trig_timer_mode_set_A0_para4"
],
"trig_timer_mode_set_A0_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A0",
"para_sequence": 1,
"used": "USED[A0]",
"v_early": "V_EARLY[A0]",
"v_late": "V_LATE[A0]",
"v_mid0": "V_MID0[A0]",
"v_mid1": "V_MID1[A0]",
"v_mid2": "V_MID2[A0]",
"v_mid3": "V_MID3[A0]",
"cycle": "CYCLE[A0]",
"t_early": "T_EARLY[A0]",
"t_late": "T_LATE[A0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_A0_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A0",
"para_sequence": 2,
"t_mid0": "T_MID0[A0]",
"t_mid1": "T_MID1[A0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_A0_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A0",
"para_sequence": 3,
"t_mid2": "T_MID2[A0]",
"t_mid3": "T_MID3[A0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_A0_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A0",
"para_sequence": 4,
"current": "CURRENT[A0]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"2B>current;"
]
},
"trig_timer_mode_set_A1": [
"trig_timer_mode_set_A1_para1",
"trig_timer_mode_set_A1_para2",
"trig_timer_mode_set_A1_para3",
"trig_timer_mode_set_A1_para4"
],
"trig_timer_mode_set_A1_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A1",
"para_sequence": 1,
"used": "USED[A1]",
"v_early": "V_EARLY[A1]",
"v_late": "V_LATE[A1]",
"v_mid0": "V_MID0[A1]",
"v_mid1": "V_MID1[A1]",
"v_mid2": "V_MID2[A1]",
"v_mid3": "V_MID3[A1]",
"cycle": "CYCLE[A1]",
"t_early": "T_EARLY[A1]",
"t_late": "T_LATE[A1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_A1_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A1",
"para_sequence": 2,
"t_mid0": "T_MID0[A1]",
"t_mid1": "T_MID1[A1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_A1_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A1",
"para_sequence": 3,
"t_mid2": "T_MID2[A1]",
"t_mid3": "T_MID3[A1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_A1_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A1",
"para_sequence": 4,
"current": "CURRENT[A1]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"2B>current;"
]
},
"trig_timer_mode_set_A2": [
"trig_timer_mode_set_A2_para1",
"trig_timer_mode_set_A2_para2",
"trig_timer_mode_set_A2_para3",
"trig_timer_mode_set_A2_para4"
],
"trig_timer_mode_set_A2_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A2",
"para_sequence": 1,
"used": "USED[A2]",
"v_early": "V_EARLY[A2]",
"v_late": "V_LATE[A2]",
"v_mid0": "V_MID0[A2]",
"v_mid1": "V_MID1[A2]",
"v_mid2": "V_MID2[A2]",
"v_mid3": "V_MID3[A2]",
"cycle": "CYCLE[A2]",
"t_early": "T_EARLY[A2]",
"t_late": "T_LATE[A2]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_A2_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A2",
"para_sequence": 2,
"t_mid0": "T_MID0[A2]",
"t_mid1": "T_MID1[A2]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_A2_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A2",
"para_sequence": 3,
"t_mid2": "T_MID2[A2]",
"t_mid3": "T_MID3[A2]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_A2_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A2",
"para_sequence": 4,
"current": "CURRENT[A2]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"2B>current;"
]
},
"trig_timer_mode_set_A3": [
"trig_timer_mode_set_A3_para1",
"trig_timer_mode_set_A3_para2",
"trig_timer_mode_set_A3_para3",
"trig_timer_mode_set_A3_para4"
],
"trig_timer_mode_set_A3_para1": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A3",
"para_sequence": 1,
"used": "USED[A3]",
"v_early": "V_EARLY[A3]",
"v_late": "V_LATE[A3]",
"v_mid0": "V_MID0[A3]",
"v_mid1": "V_MID1[A3]",
"v_mid2": "V_MID2[A3]",
"v_mid3": "V_MID3[A3]",
"cycle": "CYCLE[A3]",
"t_early": "T_EARLY[A3]",
"t_late": "T_LATE[A3]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"5b>0;1b>v_late;1b>v_early;1b>used;",
"4b>0;1b>v_mid3;1b>v_mid2;1b>v_mid1;1b>v_mid0;",
"2B>cycle;4B>t_early;4B>t_late;"
]
},
"trig_timer_mode_set_A3_para2": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A3",
"para_sequence": 2,
"t_mid0": "T_MID0[A3]",
"t_mid1": "T_MID1[A3]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid0;4B>t_mid1;"
]
},
"trig_timer_mode_set_A3_para3": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A3",
"para_sequence": 3,
"t_mid2": "T_MID2[A3]",
"t_mid3": "T_MID3[A3]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"4B>t_mid2;4B>t_mid3;"
]
},
"trig_timer_mode_set_A3_para4": {
"type": "RIS",
"parameter": {
"mode": "MODE_ALL_OUTPUT",
"elite_ch": "ELITE_CH_A3",
"para_sequence": 4,
"current": "CURRENT[A3]"
},
"data": [
"1B>mode;",
"1B>elite_ch;",
"1B>para_sequence;",
"2B>current;"
]
} }
} }
} }