78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
#!/usr/bin/env python
|
|
|
|
from .base import G2InventoryResponse as BaseG2InventoryResponse, ReaderCommand, ReaderResponseFrame, Tag, TagData
|
|
from .command import G2_TAG_INVENTORY
|
|
|
|
G2_TAG_INVENTORY_PARAM_MEMORY_EPC = 0x01
|
|
G2_TAG_INVENTORY_PARAM_MEMORY_TID = 0x02
|
|
G2_TAG_INVENTORY_PARAM_MEMORY_USER = 0x03
|
|
|
|
G2_TAG_INVENTORY_PARAM_SESSION_S0 = 0x00
|
|
G2_TAG_INVENTORY_PARAM_SESSION_S1 = 0x01
|
|
G2_TAG_INVENTORY_PARAM_SESSION_S2 = 0x02
|
|
G2_TAG_INVENTORY_PARAM_SESSION_S3 = 0x03
|
|
G2_TAG_INVENTORY_PARAM_SESSION_SMART = 0xFF
|
|
|
|
G2_TAG_INVENTORY_PARAM_ANTENNA_1 = 0x80
|
|
G2_TAG_INVENTORY_PARAM_ANTENNA_2 = 0x81
|
|
G2_TAG_INVENTORY_PARAM_ANTENNA_3 = 0x82
|
|
G2_TAG_INVENTORY_PARAM_ANTENNA_4 = 0x83
|
|
|
|
G2_TAG_INVENTORY_PARAM_TARGET_A = 0x00
|
|
G2_TAG_INVENTORY_PARAM_TARGET_B = 0x01
|
|
|
|
|
|
class G2InventoryCommand(ReaderCommand):
|
|
|
|
def __init__(self, addr=0xFF, q_value=15, deliver_statistics=0, strategy=0, fast_id=0,
|
|
session=G2_TAG_INVENTORY_PARAM_SESSION_S0, mask_source=G2_TAG_INVENTORY_PARAM_MEMORY_EPC,
|
|
target=G2_TAG_INVENTORY_PARAM_TARGET_A, antenna=G2_TAG_INVENTORY_PARAM_ANTENNA_1, scan_time=0x14):
|
|
# TODO check q_value in range 0 ~ 15, session 0 ~ 3
|
|
mask_data = [0x00, 0x00, 0x00]
|
|
q_value_byte = (deliver_statistics << 7) + (strategy << 6) + (fast_id << 5) + q_value
|
|
cmd_data = [q_value_byte, session, mask_source] + mask_data + [target, antenna, scan_time]
|
|
super(G2InventoryCommand, self).__init__(G2_TAG_INVENTORY, addr, data=cmd_data)
|
|
|
|
|
|
def _translate_antenna_num(antenna_code):
|
|
if antenna_code == 1:
|
|
return 1
|
|
elif antenna_code == 2:
|
|
return 2
|
|
elif antenna_code == 4:
|
|
return 3
|
|
elif antenna_code == 8:
|
|
return 4
|
|
else:
|
|
return None
|
|
|
|
|
|
class G2InventoryResponseFrame(ReaderResponseFrame):
|
|
|
|
tag_prefix_bytes = 0
|
|
tag_suffix_bytes = 1
|
|
|
|
tag_data_prefix_bytes = 1 # Number of bytes before 'num tags' byte
|
|
|
|
def __init__(self, resp_bytes, offset=0):
|
|
super(G2InventoryResponseFrame, self).__init__(resp_bytes, offset)
|
|
self.num_tags = 0
|
|
self.antenna = 0
|
|
if len(self.data) > self.tag_data_prefix_bytes:
|
|
self.antenna = _translate_antenna_num(self.data[0])
|
|
self.num_tags = self.data[1]
|
|
|
|
def get_tag(self):
|
|
tag_data_prefix_and_num_tags_bytes = self.tag_data_prefix_bytes + 1
|
|
if len(self.data) > tag_data_prefix_and_num_tags_bytes:
|
|
tag_data = TagData(self.data[self.tag_data_prefix_bytes:], prefix_bytes=self.tag_prefix_bytes, suffix_bytes=self.tag_suffix_bytes)
|
|
for data_item in tag_data.get_tag_data():
|
|
epc_value = data_item[1]
|
|
rssi = data_item[2][0]
|
|
yield Tag(epc_value, antenna_num=self.antenna, rssi=rssi)
|
|
|
|
|
|
class G2InventoryResponse(BaseG2InventoryResponse):
|
|
|
|
frame_class = G2InventoryResponseFrame
|