diff --git a/src/filament/generic.py b/src/filament/generic.py index 81a71bc..683d141 100644 --- a/src/filament/generic.py +++ b/src/filament/generic.py @@ -26,7 +26,8 @@ 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 + color_mode: str = "default" # Multicolor style: "gradient" or "default" (single color or segments), as in OrcaSlicer's filament_colour_type ): self.source_processor = source_processor self.unique_id = unique_id @@ -43,6 +44,7 @@ def __init__(self, self.drying_time_hours = drying_time_hours self.manufacturing_date = manufacturing_date self.td = td + self.color_mode = color_mode if color_mode in ("gradient", "default") else "default" if "CF" in self.modifiers: self.type += "-CF" @@ -70,7 +72,8 @@ def pretty_text(self) -> str: f"- Bed Temp: {self.bed_temp_c:.1f}C", 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"- TD: {self.td:.1f} mm", + f"- Color mode: {self.color_mode}" ]) @property @@ -102,7 +105,8 @@ 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, + "color_mode": self.color_mode } @staticmethod diff --git a/src/tag/openspool/processor.py b/src/tag/openspool/processor.py index f8eb523..1ef09f1 100644 --- a/src/tag/openspool/processor.py +++ b/src/tag/openspool/processor.py @@ -41,6 +41,9 @@ def __openspool_parse_payload(self, payload : bytes) -> GenericFilament | None: return None brand = data.get('brand', 'Generic') + # color_type uses OrcaSlicer's filament_colour_type values: + # 0 = gradient, 1 = default. Missing or other values are default. + color_mode = "gradient" if str(data.get('color_type', '')).strip() == '0' else "default" main_type = data.get('type', 'PLA').upper() subtype = data.get('subtype', '') color_hex = self.__parse_color_hex(data.get('color_hex', 'FFFFFF')) @@ -88,7 +91,8 @@ def __openspool_parse_payload(self, payload : bytes) -> GenericFilament | None: bed_temp_c=bed_temp_c, drying_temp_c=drying_temp_c, drying_time_hours=drying_time_hours, - manufacturing_date="0001-01-01" + manufacturing_date="0001-01-01", + color_mode=color_mode ) except json.JSONDecodeError as e: self.logger.exception("OpenSpool payload parsing failed: Invalid JSON: %s", str(e)) diff --git a/src/tag/snapmaker/constants.py b/src/tag/snapmaker/constants.py index 44ea6ef..6f31774 100644 --- a/src/tag/snapmaker/constants.py +++ b/src/tag/snapmaker/constants.py @@ -67,6 +67,8 @@ M1_PROTO_COLOR_NUMS_LEN = (1) M1_PROTO_ALPHA_POS = (1 * 64 + 0 * 16 + 9) M1_PROTO_ALPHA_LEN = (1) +M1_PROTO_MULTI_MODE_POS = (1 * 64 + 0 * 16 + 10) +M1_PROTO_MULTI_MODE_LEN = (1) M1_PROTO_RGB_1_POS = (1 * 64 + 1 * 16 + 0) M1_PROTO_RGB_1_LEN = (3) M1_PROTO_RGB_2_POS = (1 * 64 + 1 * 16 + 3) diff --git a/src/tag/snapmaker/processor.py b/src/tag/snapmaker/processor.py index 6819cd4..153f3a3 100644 --- a/src/tag/snapmaker/processor.py +++ b/src/tag/snapmaker/processor.py @@ -123,6 +123,10 @@ def process_tag(self, scan_result : ScanResult, data : bytes) -> GenericFilament self.logger.debug(" Card UID: %s", card_uid.hex(':').upper()) colors = [rgb_1, rgb_2, rgb_3, rgb_4, rgb_5][:color_nums] + # MULTI_MODE byte, as read by Snapmaker's u1-klipper (M1_PROTO_MULTI_MODE_POS). + # Snapmaker values: 0 = segment, anything else = gradient (as in Snapmaker + # Orca's FilamentColorModeFromConfig). + color_mode = "gradient" if data[Constants.M1_PROTO_MULTI_MODE_POS] != 0 else "default" return GenericFilament( source_processor=self.name, @@ -138,7 +142,8 @@ def process_tag(self, scan_result : ScanResult, data : bytes) -> GenericFilament bed_temp_c=bed_temp, drying_temp_c=drying_temp, drying_time_hours=drying_time, - manufacturing_date="2026-01-01" # TODO: Extract actual date + manufacturing_date="2026-01-01", # TODO: Extract actual date + color_mode=color_mode ) def __hkdf_create_key(self, ikm : bytes, salt : bytes, key_type='a'): diff --git a/test/tags/OpenSpool/Generic PLA Magenta OpenSpool.yml b/test/tags/OpenSpool/Generic PLA Magenta OpenSpool.yml index 1e97be7..10d3e5a 100644 --- a/test/tags/OpenSpool/Generic PLA Magenta OpenSpool.yml +++ b/test/tags/OpenSpool/Generic PLA Magenta OpenSpool.yml @@ -5,6 +5,7 @@ type: PLA modifiers: [] colors: - 0xFFF330F9 +color_mode: default diameter_mm: 1.75 weight_grams: 1000 hotend_min_temp_c: 180 diff --git a/test/tags/OpenSpool/Generic PLA Silk Default OpenSpool.bin b/test/tags/OpenSpool/Generic PLA Silk Default OpenSpool.bin new file mode 100644 index 0000000..9a2249b Binary files /dev/null and b/test/tags/OpenSpool/Generic PLA Silk Default OpenSpool.bin differ diff --git a/test/tags/OpenSpool/Generic PLA Silk Default OpenSpool.yml b/test/tags/OpenSpool/Generic PLA Silk Default OpenSpool.yml new file mode 100644 index 0000000..6984daf --- /dev/null +++ b/test/tags/OpenSpool/Generic PLA Silk Default OpenSpool.yml @@ -0,0 +1,8 @@ +source_processor: OpenspoolTagProcessor +manufacturer: Generic +type: PLA +modifiers: + - Silk +color_mode: default +hotend_min_temp_c: 190 +hotend_max_temp_c: 230 diff --git a/test/tags/OpenSpool/Generic PLA Silk Gradient OpenSpool.bin b/test/tags/OpenSpool/Generic PLA Silk Gradient OpenSpool.bin new file mode 100644 index 0000000..da15938 Binary files /dev/null and b/test/tags/OpenSpool/Generic PLA Silk Gradient OpenSpool.bin differ diff --git a/test/tags/OpenSpool/Generic PLA Silk Gradient OpenSpool.yml b/test/tags/OpenSpool/Generic PLA Silk Gradient OpenSpool.yml new file mode 100644 index 0000000..b3e55e0 --- /dev/null +++ b/test/tags/OpenSpool/Generic PLA Silk Gradient OpenSpool.yml @@ -0,0 +1,8 @@ +source_processor: OpenspoolTagProcessor +manufacturer: Generic +type: PLA +modifiers: + - Silk +color_mode: gradient +hotend_min_temp_c: 190 +hotend_max_temp_c: 230 diff --git a/test/tags/Snapmaker/Snapmaker SnapSpeed PLA Red 500g.yml b/test/tags/Snapmaker/Snapmaker SnapSpeed PLA Red 500g.yml index b5c9ac0..4a393d0 100644 --- a/test/tags/Snapmaker/Snapmaker SnapSpeed PLA Red 500g.yml +++ b/test/tags/Snapmaker/Snapmaker SnapSpeed PLA Red 500g.yml @@ -6,6 +6,7 @@ modifiers: - SnapSpeed colors: - 0xFFE72F1D +color_mode: default diameter_mm: 1.75 weight_grams: 500 hotend_min_temp_c: 190