diff --git a/src/filament/generic.py b/src/filament/generic.py index 81a71bc..52f3a68 100644 --- a/src/filament/generic.py +++ b/src/filament/generic.py @@ -26,7 +26,9 @@ def __init__(self, drying_temp_c: float, drying_time_hours: float, manufacturing_date: str, # ISO 8601 date string - td: float = 0.0 # Transmission Distance in mm for HueForge/OrcaSlicer-FullSpectrum + td: float = 0.0, # Transmission Distance in mm for HueForge/OrcaSlicer-FullSpectrum + tag_index: int = 0, # Which tag of the item was read (1-based), 0 = unknown + tag_count: int = 0, # Number of tags on the item (2 = twin tags), 0 = unknown ): self.source_processor = source_processor self.unique_id = unique_id @@ -43,6 +45,8 @@ def __init__(self, self.drying_time_hours = drying_time_hours self.manufacturing_date = manufacturing_date self.td = td + self.tag_index = tag_index + self.tag_count = tag_count if "CF" in self.modifiers: self.type += "-CF" @@ -71,7 +75,7 @@ def pretty_text(self) -> str: f"- Drying: {self.drying_temp_c:.1f}C for {self.drying_time_hours:.1f} hours", f"- Manufactured on: {self.manufacturing_date}", f"- TD: {self.td:.1f} mm" - ]) + ] + ([f"- Tag: {self.tag_index or '?'} of {self.tag_count}"] if self.tag_count else [])) @property def rgba(self) -> int: @@ -102,7 +106,9 @@ def to_dict(self) -> dict: "drying_temp_c": self.drying_temp_c, "drying_time_hours": self.drying_time_hours, "manufacturing_date": self.manufacturing_date, - "td": self.td + "td": self.td, + "tag_index": self.tag_index, + "tag_count": self.tag_count } @staticmethod diff --git a/src/tag/tigertag/constants.py b/src/tag/tigertag/constants.py index 75cdd52..bea7628 100644 --- a/src/tag/tigertag/constants.py +++ b/src/tag/tigertag/constants.py @@ -20,6 +20,7 @@ OFF_BED_TEMP_MIN = 30 OFF_BED_TEMP_MAX = 31 OFF_TIMESTAMP = 32 +OFF_TAG_INDEX_COUNT = 39 # high nibble = tag index, low nibble = tag count, 0 = unknown OFF_TD = 44 OFF_METADATA = 48 OFF_SIGNATURE = 80 diff --git a/src/tag/tigertag/processor.py b/src/tag/tigertag/processor.py index 975670b..0507334 100644 --- a/src/tag/tigertag/processor.py +++ b/src/tag/tigertag/processor.py @@ -68,6 +68,17 @@ def __parse_tigertag(self, scan_result: ScanResult, user_data: bytes, tag_id: in timestamp_raw = struct.unpack_from('>I', user_data, Constants.OFF_TIMESTAMP)[0] + # Tag index / count (spec v2.2): 0x12 = tag 1 of 2. Tags written + # before v2.2 have 0x00 here, which means unknown. + tag_index = 0 + tag_count = 0 + if len(user_data) > Constants.OFF_TAG_INDEX_COUNT: + index_count = user_data[Constants.OFF_TAG_INDEX_COUNT] + tag_index = index_count >> 4 + tag_count = index_count & 0x0F + if tag_index > tag_count: + tag_index = 0 + material_label = self.registry.material_ids.get(material_id, f"Unknown({material_id})") material_type = self.registry.material_type_ids.get(material_id, material_label) filled_type = self.registry.filled_type_ids.get(material_id, "") @@ -100,6 +111,7 @@ def __parse_tigertag(self, scan_result: ScanResult, user_data: bytes, tag_id: in self.logger.debug(" Bed Temp: %d-%d °C", bed_temp_min, bed_temp_max) self.logger.debug(" TD: raw=%d → %.1f mm", td_raw, td_mm) self.logger.debug(" Timestamp: %d (%s)", timestamp_raw, manufacturing_date) + self.logger.debug(" Tag: %d of %d", tag_index, tag_count) return GenericFilament( source_processor=self.name, @@ -120,6 +132,8 @@ def __parse_tigertag(self, scan_result: ScanResult, user_data: bytes, tag_id: in drying_time_hours=float(dry_time), manufacturing_date=manufacturing_date, td=td_mm, + tag_index=tag_index, + tag_count=tag_count, ) except Exception as e: diff --git a/test/tags/Tigertag/Elegoo PLA Basic Grey.yml b/test/tags/Tigertag/Elegoo PLA Basic Grey.yml index 08bade3..c04e201 100644 --- a/test/tags/Tigertag/Elegoo PLA Basic Grey.yml +++ b/test/tags/Tigertag/Elegoo PLA Basic Grey.yml @@ -14,4 +14,6 @@ bed_temp_c: 0.0 drying_temp_c: 50.0 drying_time_hours: 8.0 manufacturing_date: "2026-04-03" -td: 0.0 \ No newline at end of file +td: 0.0 +tag_index: 0 +tag_count: 0 diff --git a/test/tags/Tigertag/R3D PETG HS Carbon Fiber Black TigerTag+.bin b/test/tags/Tigertag/R3D PETG HS Carbon Fiber Black TigerTag+.bin index 3328d99..a64f28a 100644 Binary files a/test/tags/Tigertag/R3D PETG HS Carbon Fiber Black TigerTag+.bin and b/test/tags/Tigertag/R3D PETG HS Carbon Fiber Black TigerTag+.bin differ diff --git a/test/tags/Tigertag/R3D PETG HS Carbon Fiber Black TigerTag+.yml b/test/tags/Tigertag/R3D PETG HS Carbon Fiber Black TigerTag+.yml index 6cba9f9..60507b5 100644 --- a/test/tags/Tigertag/R3D PETG HS Carbon Fiber Black TigerTag+.yml +++ b/test/tags/Tigertag/R3D PETG HS Carbon Fiber Black TigerTag+.yml @@ -16,3 +16,5 @@ td: 0.0 type: PETG-CF unique_id: f97ed8a8deccab7724f6b498c41a0b18c8e9250307b5f332a34055e7308f47a4 weight_grams: 1000.0 +tag_index: 1 +tag_count: 2 diff --git a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Cyan TigerTag+.bin b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Cyan TigerTag+.bin index 81771e5..2b45b31 100644 Binary files a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Cyan TigerTag+.bin and b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Cyan TigerTag+.bin differ diff --git a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Cyan TigerTag+.yml b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Cyan TigerTag+.yml index 088b3fc..c223661 100644 --- a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Cyan TigerTag+.yml +++ b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Cyan TigerTag+.yml @@ -15,3 +15,5 @@ td: 0.0 type: PLA unique_id: f90c55783e801ae94761b4ac89be2c9699de24bd1f946b9ee523c5d58b325a04 weight_grams: 1000.0 +tag_index: 1 +tag_count: 2 diff --git a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Magenta TigerTag+.bin b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Magenta TigerTag+.bin index 8f7229d..0c44bfc 100644 Binary files a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Magenta TigerTag+.bin and b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Magenta TigerTag+.bin differ diff --git a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Magenta TigerTag+.yml b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Magenta TigerTag+.yml index 1c1804b..9d04c18 100644 --- a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Magenta TigerTag+.yml +++ b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Magenta TigerTag+.yml @@ -15,3 +15,5 @@ td: 0.0 type: PLA unique_id: f2773567e0bd0ae8d2dac1dc8a9565f5bb4ee497572304c84e3b0b70bdb16b4e weight_grams: 1000.0 +tag_index: 1 +tag_count: 2 diff --git a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane White TigerTag+.bin b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane White TigerTag+.bin index dc4d871..0106634 100644 Binary files a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane White TigerTag+.bin and b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane White TigerTag+.bin differ diff --git a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane White TigerTag+.yml b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane White TigerTag+.yml index 880aa82..900b091 100644 --- a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane White TigerTag+.yml +++ b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane White TigerTag+.yml @@ -15,3 +15,5 @@ td: 0.0 type: PLA unique_id: ca98c88138a8c8f300f07c240dc834677e59656f983b34b8c9c8d8c641bbdec1 weight_grams: 1000.0 +tag_index: 1 +tag_count: 2 diff --git a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Yellow TigerTag+.bin b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Yellow TigerTag+.bin index 74c5a1b..8ac527c 100644 Binary files a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Yellow TigerTag+.bin and b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Yellow TigerTag+.bin differ diff --git a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Yellow TigerTag+.yml b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Yellow TigerTag+.yml index 3a469f4..86b2c52 100644 --- a/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Yellow TigerTag+.yml +++ b/test/tags/Tigertag/Rosa3D PLA Starter Lithophane Yellow TigerTag+.yml @@ -15,3 +15,5 @@ td: 0.0 type: PLA unique_id: e51a87ddc3e239f0a2bb81c370d1c99d8dbf2ef9b2e6506fa0d908a640cab0f2 weight_grams: 1000.0 +tag_index: 1 +tag_count: 2 diff --git a/test/tags/Tigertag/Sunlu PLA Roasted Chestnut TigerTag+.bin b/test/tags/Tigertag/Sunlu PLA Roasted Chestnut TigerTag+.bin index 0052dfe..5f27e3c 100644 Binary files a/test/tags/Tigertag/Sunlu PLA Roasted Chestnut TigerTag+.bin and b/test/tags/Tigertag/Sunlu PLA Roasted Chestnut TigerTag+.bin differ diff --git a/test/tags/Tigertag/Sunlu PLA Roasted Chestnut TigerTag+.yml b/test/tags/Tigertag/Sunlu PLA Roasted Chestnut TigerTag+.yml index 2043ee4..829e0d1 100644 --- a/test/tags/Tigertag/Sunlu PLA Roasted Chestnut TigerTag+.yml +++ b/test/tags/Tigertag/Sunlu PLA Roasted Chestnut TigerTag+.yml @@ -15,3 +15,5 @@ td: 0.0 type: PLA unique_id: b537b06ab1f153b9176caa3cb12492d87094703848da8e682f242c052bdf940f weight_grams: 1000.0 +tag_index: 1 +tag_count: 2 diff --git a/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+ Twin 2 of 2.bin b/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+ Twin 2 of 2.bin new file mode 100644 index 0000000..ccbd08f Binary files /dev/null and b/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+ Twin 2 of 2.bin differ diff --git a/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+ Twin 2 of 2.yml b/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+ Twin 2 of 2.yml new file mode 100644 index 0000000..8b84f64 --- /dev/null +++ b/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+ Twin 2 of 2.yml @@ -0,0 +1,19 @@ +bed_temp_c: 0.0 +colors: +- 0xFFDDE5ED +diameter_mm: 1.75 +drying_temp_c: 50.0 +drying_time_hours: 8.0 +hotend_max_temp_c: 230.0 +hotend_min_temp_c: 210.0 +manufacturer: eSun +manufacturing_date: '2025-11-12' +modifiers: +- Basic +source_processor: TigerTagProcessor +td: 0.0 +type: PLA +unique_id: c97d79c4ec83c89e5063834556625468b602e492996bfd674fbbeb238469d031 +weight_grams: 1000.0 +tag_index: 2 +tag_count: 2 diff --git a/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+.bin b/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+.bin index cf191b8..fde080f 100644 Binary files a/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+.bin and b/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+.bin differ diff --git a/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+.yml b/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+.yml index fa50170..23bd722 100644 --- a/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+.yml +++ b/test/tags/Tigertag/eSun PLA Basic Refill Cold White TigerTag+.yml @@ -15,3 +15,5 @@ td: 0.0 type: PLA unique_id: c97d79c4ec83c89e5063834556625468b602e492996bfd674fbbeb238469d031 weight_grams: 1000.0 +tag_index: 1 +tag_count: 2