Files
2025-04-15 12:15:27 +02:00

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