From f178426874015e6edb7f29aa3706e03e30367e28 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Mon, 8 Dec 2025 14:17:26 -0500 Subject: [PATCH 01/61] This commit introduces a complete, user-friendly Tkinter GUI for the M18 protocol tool, designed to make battery interrogation and charger simulation accessible to users who are not comfortable with command-line workflows. The GUI is packaged as `m18_gui.py` and integrates fully with the existing `m18.py` protocol implementation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit IMPORTANT NOTE — NOT YET TESTED: -------------------------------- This GUI has NOT been tested with actual hardware at the time of submission. The author currently does not have the USB-to-TTL hardware available but will acquire it within ~24 hours. Full validation of: - Connection to FTDI/CP2102 adapters - Reset/calibration behavior - Snapshot reads - Charger simulation timing - Keepalive behaviour - Custom charger profile application will be performed once hardware is available. This commit should be reviewed as a **functional draft** pending real-world verification. Major features: --------------- 1. Connection Management - Auto-detection and refresh of available serial ports. - Clean Connect/Disconnect workflow with status indicators. - Safe fallback to idle mode (`TX low`) when appropriate. 2. Main Controls UI - Buttons for "Idle", "Health report", and "Copy all registers to clipboard". - All output is displayed in a unified scrollable log panel. 3. Interactive Python Console - Executes arbitrary Python code with `m` exposed as the active M18 object. - Captures stdout/stderr for display in the log panel. - Safe, isolated execution environment. 4. Full Charger Simulation Mode (USB-only, protocol-level simulation) - Allows selecting a profile: Gentle, Normal, Aggressive, or Custom. - Completely rewritten simulation controller with: • Reset → configure(2) → keepalive → configure(1) negotiation sequence • Periodic keepalive packets on a configurable simulated baud interval • Clean teardown returning the pack to idle state • Threaded execution with cancellation via Stop button - Simulation-only disclaimer clearly shown (no actual current flows via USB). 5. Profile Parameter Display - Shows cutoff and max current in BOTH: • Raw protocol units • Human-friendly amps (raw / 1000) - Ensures users understand the simulated charging intensity. 6. Custom Profile Editor (advanced mode) - Grid layout: Raw units Amps Cutoff: [ ] [ ] Max: [ ] [ ] - Full two-way synchronization: • Editing raw updates amps (raw/1000) • Editing amps updates raw (amps*1000) - Validation prevents invalid or out-of-range values (< 20000). - Designed for maximum usability for non-technical users. 7. Simulation Baudrate Control (conceptual only) - Does not modify actual UART baudrate (fixed at 4800). - Adjusts simulation keepalive timing to mimic different charger behaviors. 8. Dependency Auto-Installer - Automatically installs `pyserial` and `requests` if missing. - Uses a Tkinter popup with progress bar for user visibility. - Ensures GUI runs even on clean systems. 9. Integration with Existing Codebase - No changes made to m18 protocol logic. - ALL overrides (cutoff/max current) are temporary and restored after simulation. - CLI workflow remains untouched. 10. Robust Error Handling - Extensive try/except protection around serial operations. - Graceful thread termination. - Meaningful GUI feedback through dialogs and output logs. Purpose of this submission: --------------------------- This commit is intended for **early review and feedback**. The GUI is feature-complete but **requires real hardware testing** before merging into upstream or being released for end-user use. Hardware arrival is expected within 24 hours; thorough verification will follow. Future enhancement ideas: ------------------------- - Live telemetry polling during simulation (voltage, temp, imbalance) - GUI for brute-force register exploration - Integrated wiring guide / hardware sanity checker - Improved interactive console autocomplete This commit substantially enhances the usability of the M18 protocol tooling while remaining fully backward-compatible with existing workflows. --- m18gui.py | 873 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 873 insertions(+) create mode 100644 m18gui.py diff --git a/m18gui.py b/m18gui.py new file mode 100644 index 0000000..deb877b --- /dev/null +++ b/m18gui.py @@ -0,0 +1,873 @@ +import sys +import subprocess +import threading +import io +import time +import traceback +import tkinter as tk +from tkinter import ttk, messagebox + +# 1. Dependency installer using Tkinter status window +def ensure_module(mod_name: str, pip_name: str) -> None: + try: + __import__(mod_name) + return + except ImportError: + pass + + install_root = tk.Tk() + install_root.title("M18 GUI - Installing dependencies") + install_root.geometry("420x120") + + label = ttk.Label( + install_root, + text=( + f"Installing required Python package:\n{pip_name}\n\n" + "This may take a moment..." + ) + ) + label.pack(padx=10, pady=10) + + progress = ttk.Progressbar(install_root, mode="indeterminate") + progress.pack(fill="x", padx=10, pady=(0, 10)) + progress.start(10) + + install_root.update_idletasks() + + try: + subprocess.check_call( + [sys.executable, "-m", "pip", "install", pip_name], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + except subprocess.CalledProcessError as e: + progress.stop() + messagebox.showerror( + "Installation error", + f"Failed to install '{pip_name}'.\n\nError code: {e.returncode}" + ) + install_root.destroy() + sys.exit(1) + + progress.stop() + install_root.destroy() + + try: + __import__(mod_name) + except ImportError: + messagebox.showerror( + "Import error", + f"Package '{pip_name}' was installed, but could not be imported.\n" + f"Please restart Python or install it manually." + ) + sys.exit(1) + + +# Make sure dependencies for m18.py are present before importing it +ensure_module("serial", "pyserial") +ensure_module("requests", "requests") + +from serial.tools import list_ports +import m18 # protocol file from the cloned repo, must be m18.py in same folder + + +class M18GUI(tk.Tk): + def __init__(self): + super().__init__() + self.title("M18 Protocol GUI") + self.geometry("900x700") + + self.m18_obj = None + + # Simulation state + self.sim_thread = None + self.sim_stop_event = None + + # Preset profiles: raw cutoff, raw max current + # Approx amps are raw / 1000 + self.sim_profiles = { + "Gentle": (150, 2500), + "Normal": (300, 6000), + "Aggressive": (450, 9000), + } + + # For custom profile fields, we keep StringVars + self.custom_cutoff_raw_var = tk.StringVar(value="300") + self.custom_cutoff_amps_var = tk.StringVar(value="0.30") + self.custom_max_raw_var = tk.StringVar(value="6000") + self.custom_max_amps_var = tk.StringVar(value="6.00") + + # Flag to prevent recursive updates while syncing fields + self._sync_in_progress = False + + self.create_widgets() + self.refresh_ports() + self.update_profile_display() # initialize profile label + + # ---------- UI building ---------- + + def create_widgets(self): + # Notebook for Main Controls, Interactive Console, Simulation + self.notebook = ttk.Notebook(self) + self.notebook.pack(fill="x", padx=10, pady=10) + + self.main_tab = ttk.Frame(self.notebook) + self.console_tab = ttk.Frame(self.notebook) + self.sim_tab = ttk.Frame(self.notebook) + + self.notebook.add(self.main_tab, text="Main Controls") + self.notebook.add(self.console_tab, text="Interactive Console") + self.notebook.add(self.sim_tab, text="Simulation") + + # Main Controls tab content + top_frame = ttk.Frame(self.main_tab) + top_frame.pack(fill="x", padx=5, pady=5) + + ttk.Label(top_frame, text="Serial port:").grid(row=0, column=0, sticky="w") + + self.port_var = tk.StringVar() + self.port_combo = ttk.Combobox( + top_frame, + textvariable=self.port_var, + state="readonly", + width=25 + ) + self.port_combo.grid(row=0, column=1, padx=5, sticky="w") + + refresh_btn = ttk.Button( + top_frame, text="Refresh", command=self.refresh_ports + ) + refresh_btn.grid(row=0, column=2, padx=5) + + self.connect_btn = ttk.Button( + top_frame, text="Connect", command=self.connect_device + ) + self.connect_btn.grid(row=0, column=3, padx=5) + + self.disconnect_btn = ttk.Button( + top_frame, text="Disconnect", command=self.disconnect_device, state="disabled" + ) + self.disconnect_btn.grid(row=0, column=4, padx=5) + + self.status_var = tk.StringVar(value="Not connected") + status_label = ttk.Label(top_frame, textvariable=self.status_var) + status_label.grid(row=1, column=0, columnspan=5, sticky="w", pady=(5, 0)) + + mid_frame = ttk.LabelFrame(self.main_tab, text="Commands") + mid_frame.pack(fill="x", padx=5, pady=5) + + self.idle_btn = ttk.Button( + mid_frame, + text="Idle (TX low, safe to connect)", + command=self.cmd_idle, + state="disabled" + ) + self.idle_btn.grid(row=0, column=0, padx=5, pady=5, sticky="w") + + self.health_btn = ttk.Button( + mid_frame, + text="Health report", + command=self.cmd_health, + state="disabled" + ) + self.health_btn.grid(row=0, column=1, padx=5, pady=5, sticky="w") + + self.clipboard_btn = ttk.Button( + mid_frame, + text="Copy all registers to clipboard", + command=self.cmd_clipboard, + state="disabled" + ) + self.clipboard_btn.grid(row=0, column=2, padx=5, pady=5, sticky="w") + + # Interactive Console tab content + console_frame = ttk.Frame(self.console_tab) + console_frame.pack(fill="both", expand=True, padx=5, pady=5) + + ttk.Label( + console_frame, + text="Python console environment:\n" + "You can use 'm' for the connected M18 object.\n" + "Example: m.read_id() or m.health()" + ).pack(anchor="w") + + self.console_text = tk.Text(console_frame, height=10, wrap="none") + self.console_text.pack(fill="both", expand=True, padx=5, pady=5) + + console_btn_frame = ttk.Frame(console_frame) + console_btn_frame.pack(fill="x", padx=5, pady=(0, 5)) + + self.console_run_btn = ttk.Button( + console_btn_frame, + text="Execute", + command=self.run_console_code + ) + self.console_run_btn.pack(side="left", padx=5) + + self.console_clear_btn = ttk.Button( + console_btn_frame, + text="Clear input", + command=lambda: self.console_text.delete("1.0", tk.END) + ) + self.console_clear_btn.pack(side="left", padx=5) + + # Simulation tab content + sim_main_frame = ttk.Frame(self.sim_tab) + sim_main_frame.pack(fill="x", padx=5, pady=5) + + # Duration + ttk.Label(sim_main_frame, text="Simulation duration (seconds):").grid( + row=0, column=0, sticky="w", padx=5, pady=3 + ) + self.sim_duration_var = tk.StringVar(value="60") + self.sim_duration_entry = ttk.Entry( + sim_main_frame, textvariable=self.sim_duration_var, width=10 + ) + self.sim_duration_entry.grid(row=0, column=1, sticky="w", padx=5, pady=3) + + # Simulation baudrate (conceptual only) + ttk.Label(sim_main_frame, text="Simulation baudrate (conceptual):").grid( + row=1, column=0, sticky="w", padx=5, pady=3 + ) + self.sim_baud_var = tk.StringVar(value="4800") + self.sim_baud_combo = ttk.Combobox( + sim_main_frame, + textvariable=self.sim_baud_var, + state="readonly", + width=10, + values=["1200", "2400", "4800", "9600"], + ) + self.sim_baud_combo.grid(row=1, column=1, sticky="w", padx=5, pady=3) + + ttk.Label( + sim_main_frame, + text=( + "Note: Actual UART to the battery always runs at 4800 baud.\n" + "This setting only changes how often keepalive packets are sent\n" + "during simulation. No real charging current flows over USB." + ) + ).grid(row=2, column=0, columnspan=3, sticky="w", padx=5, pady=(0, 8)) + + # Charger profile + ttk.Label(sim_main_frame, text="Charger profile:").grid( + row=3, column=0, sticky="w", padx=5, pady=3 + ) + self.sim_profile_var = tk.StringVar(value="Normal") + profile_values = ["Gentle", "Normal", "Aggressive", "Custom"] + self.sim_profile_combo = ttk.Combobox( + sim_main_frame, + textvariable=self.sim_profile_var, + state="readonly", + width=12, + values=profile_values, + ) + self.sim_profile_combo.grid(row=3, column=1, sticky="w", padx=5, pady=3) + self.sim_profile_combo.bind("<>", self.on_profile_changed) + + # Profile parameter display label + self.profile_info_var = tk.StringVar( + value="Profile parameters will appear here." + ) + ttk.Label( + sim_main_frame, + textvariable=self.profile_info_var, + foreground="blue" + ).grid(row=4, column=0, columnspan=3, sticky="w", padx=5, pady=(0, 8)) + + # Custom profile editor (grid style) + self.custom_frame = ttk.LabelFrame(self.sim_tab, text="Custom charger parameters") + # Inside this frame we create a small grid: + # Raw units Amps + # Cutoff: [ ] [ ] + # Max: [ ] [ ] + + header_frame = ttk.Frame(self.custom_frame) + header_frame.pack(fill="x", padx=5, pady=(5, 0)) + + ttk.Label(header_frame, text="").grid(row=0, column=0, padx=5) + ttk.Label(header_frame, text="Raw units").grid(row=0, column=1, padx=5) + ttk.Label(header_frame, text="Amps").grid(row=0, column=2, padx=5) + + rows_frame = ttk.Frame(self.custom_frame) + rows_frame.pack(fill="x", padx=5, pady=5) + + # Cutoff row + ttk.Label(rows_frame, text="Cutoff:").grid(row=0, column=0, padx=5, pady=3, sticky="e") + self.custom_cutoff_raw_entry = ttk.Entry( + rows_frame, textvariable=self.custom_cutoff_raw_var, width=10 + ) + self.custom_cutoff_raw_entry.grid(row=0, column=1, padx=5, pady=3) + self.custom_cutoff_amps_entry = ttk.Entry( + rows_frame, textvariable=self.custom_cutoff_amps_var, width=10 + ) + self.custom_cutoff_amps_entry.grid(row=0, column=2, padx=5, pady=3) + + # Max current row + ttk.Label(rows_frame, text="Max current:").grid(row=1, column=0, padx=5, pady=3, sticky="e") + self.custom_max_raw_entry = ttk.Entry( + rows_frame, textvariable=self.custom_max_raw_var, width=10 + ) + self.custom_max_raw_entry.grid(row=1, column=1, padx=5, pady=3) + self.custom_max_amps_entry = ttk.Entry( + rows_frame, textvariable=self.custom_max_amps_var, width=10 + ) + self.custom_max_amps_entry.grid(row=1, column=2, padx=5, pady=3) + + ttk.Label( + self.custom_frame, + text=( + "1 raw unit is treated as approximately 0.001 A.\n" + "These values are for protocol simulation only.\n" + "No real charging current comes from the USB interface." + ) + ).pack(anchor="w", padx=5, pady=(0, 5)) + + # Bind focus-out events to keep raw and amps in sync + self.custom_cutoff_raw_entry.bind("", self.on_custom_raw_focus_out) + self.custom_max_raw_entry.bind("", self.on_custom_raw_focus_out) + self.custom_cutoff_amps_entry.bind("", self.on_custom_amps_focus_out) + self.custom_max_amps_entry.bind("", self.on_custom_amps_focus_out) + + # Simulation control buttons + sim_btn_frame = ttk.Frame(self.sim_tab) + sim_btn_frame.pack(fill="x", padx=5, pady=8) + + self.sim_start_btn = ttk.Button( + sim_btn_frame, + text="Start simulation", + command=self.start_simulation, + state="disabled", + ) + self.sim_start_btn.pack(side="left", padx=5) + + self.sim_stop_btn = ttk.Button( + sim_btn_frame, + text="Stop simulation", + command=self.stop_simulation, + state="disabled", + ) + self.sim_stop_btn.pack(side="left", padx=5) + + self.sim_status_var = tk.StringVar( + value="Simulation idle. Connect to a battery to enable." + ) + ttk.Label(self.sim_tab, textvariable=self.sim_status_var).pack( + anchor="w", padx=10, pady=(0, 5) + ) + + # Bottom frame for output log (shared by everything) + bottom_frame = ttk.LabelFrame(self, text="Output") + bottom_frame.pack(fill="both", expand=True, padx=10, pady=(0, 10)) + + self.output_text = tk.Text(bottom_frame, wrap="word") + self.output_text.pack(side="left", fill="both", expand=True) + + scrollbar = ttk.Scrollbar( + bottom_frame, + orient="vertical", + command=self.output_text.yview + ) + scrollbar.pack(side="right", fill="y") + self.output_text.configure(yscrollcommand=scrollbar.set) + + # This custom frame is only visible when profile is "Custom" + self.custom_frame.pack_forget() + + # ---------- Utility ---------- + + def log(self, text: str, clear: bool = False): + if clear: + self.output_text.delete("1.0", tk.END) + self.output_text.insert(tk.END, text + "\n") + self.output_text.see(tk.END) + + def sim_log(self, text: str): + self.log(f"[SIM] {text}") + + def set_status(self, text: str): + self.status_var.set(text) + + def refresh_ports(self): + ports = list_ports.comports() + port_names = [p.device for p in ports] + self.port_combo["values"] = port_names + if port_names: + self.port_combo.current(0) + else: + self.port_combo.set("") + self.set_status("Ports refreshed") + + def require_connection(self) -> bool: + if self.m18_obj is None: + messagebox.showwarning( + "Not connected", + "Please connect to a port first." + ) + return False + return True + + def capture_output(self, func, *args, **kwargs) -> str: + buf = io.StringIO() + old_stdout = sys.stdout + try: + sys.stdout = buf + func(*args, **kwargs) + finally: + sys.stdout = old_stdout + return buf.getvalue() + + # ---------- Connection handlers ---------- + + def connect_device(self): + if self.m18_obj is not None: + messagebox.showinfo("Already connected", "You are already connected.") + return + + port = self.port_var.get().strip() + if not port: + messagebox.showwarning("No port", "Please select a serial port first.") + return + + try: + self.m18_obj = m18.M18(port) + except Exception as e: + self.m18_obj = None + messagebox.showerror( + "Connection error", + f"Failed to connect to {port}.\n\n{e}" + ) + self.set_status("Connection failed") + return + + self.set_status(f"Connected to {port}") + self.connect_btn.configure(state="disabled") + self.disconnect_btn.configure(state="normal") + self.idle_btn.configure(state="normal") + self.health_btn.configure(state="normal") + self.clipboard_btn.configure(state="normal") + self.sim_start_btn.configure(state="normal") + self.sim_status_var.set("Ready for simulation.") + self.log(f"Connected to {port}", clear=True) + + def disconnect_device(self): + # Stop simulation if running + self.stop_simulation() + + if self.m18_obj is not None: + try: + try: + self.m18_obj.idle() + except Exception: + pass + try: + self.m18_obj.port.close() + except Exception: + pass + finally: + self.m18_obj = None + + self.set_status("Disconnected") + self.connect_btn.configure(state="normal") + self.disconnect_btn.configure(state="disabled") + self.idle_btn.configure(state="disabled") + self.health_btn.configure(state="disabled") + self.clipboard_btn.configure(state="disabled") + self.sim_start_btn.configure(state="disabled") + self.sim_stop_btn.configure(state="disabled") + self.sim_status_var.set("Simulation idle. Connect to a battery to enable.") + self.log("Disconnected") + + # ---------- Command handlers ---------- + + def cmd_idle(self): + if not self.require_connection(): + return + + def work(): + try: + self.m18_obj.idle() + result = ( + "TX should now be low voltage (<1V). " + "Safe to connect the battery." + ) + self.after(0, lambda: self.log(result)) + self.after(0, lambda: self.set_status("Idle (TX low)")) + except Exception as e: + self.after(0, lambda: messagebox.showerror("Idle error", str(e))) + + threading.Thread(target=work, daemon=True).start() + + def cmd_health(self): + if not self.require_connection(): + return + + def work(): + try: + output = self.capture_output(self.m18_obj.health) + def finish(): + self.log("=== Health report ===", clear=True) + self.log(output) + self.set_status("Health report complete") + self.after(0, finish) + except Exception as e: + self.after(0, lambda: messagebox.showerror("Health error", str(e))) + + threading.Thread(target=work, daemon=True).start() + + def cmd_clipboard(self): + if not self.require_connection(): + return + + def work(): + try: + output = self.capture_output( + self.m18_obj.read_id, + None, + True, + "raw" + ) + def finish(): + self.clipboard_clear() + self.clipboard_append(output) + self.log("Register data copied to clipboard", clear=False) + self.set_status("Registers copied to clipboard") + self.after(0, finish) + except Exception as e: + self.after(0, lambda: messagebox.showerror("Clipboard error", str(e))) + + threading.Thread(target=work, daemon=True).start() + + # ---------- Interactive console ---------- + + def run_console_code(self): + code_str = self.console_text.get("1.0", tk.END).strip() + if not code_str: + messagebox.showinfo( + "No code", + "Please enter some Python code to execute." + ) + return + + if not self.require_connection(): + return + + def work(): + buf = io.StringIO() + old_stdout = sys.stdout + old_stderr = sys.stderr + sys.stdout = buf + sys.stderr = buf + + try: + env = {"m": self.m18_obj} + try: + exec(code_str, env, {}) + except Exception: + traceback.print_exc() + finally: + sys.stdout = old_stdout + sys.stderr = old_stderr + + output = buf.getvalue() + def finish(): + self.log("=== Console execution ===") + if output.strip(): + self.log(output) + else: + self.log("(no output)") + self.set_status("Console code executed") + + self.after(0, finish) + + threading.Thread(target=work, daemon=True).start() + + # ---------- Profile display and custom sync ---------- + + def on_profile_changed(self, event=None): + self.update_profile_display() + + def update_profile_display(self): + """Update the profile info label and show/hide custom editor.""" + profile = self.sim_profile_var.get().strip() + if profile in self.sim_profiles: + cutoff, max_current = self.sim_profiles[profile] + cutoff_amps = cutoff / 1000.0 + max_amps = max_current / 1000.0 + info = ( + f"Profile '{profile}': " + f"Cutoff = {cutoff} ({cutoff_amps:.2f} A), " + f"Max = {max_current} ({max_amps:.2f} A). " + "Simulation only. No real charging current flows." + ) + self.profile_info_var.set(info) + self.custom_frame.pack_forget() + else: + # Custom profile + self.profile_info_var.set( + "Profile 'Custom': use the fields below to set cutoff and max. " + "Values are for protocol simulation only." + ) + self.custom_frame.pack(fill="x", padx=5, pady=(0, 8)) + + def on_custom_raw_focus_out(self, event=None): + """When raw fields lose focus, update the amps fields.""" + if self._sync_in_progress: + return + self._sync_in_progress = True + try: + # Cutoff + try: + raw = int(self.custom_cutoff_raw_var.get().strip()) + if raw < 0: + raise ValueError + amps = raw / 1000.0 + self.custom_cutoff_amps_var.set(f"{amps:.2f}") + except ValueError: + # leave as is, but do not crash + pass + + # Max + try: + raw = int(self.custom_max_raw_var.get().strip()) + if raw < 0: + raise ValueError + amps = raw / 1000.0 + self.custom_max_amps_var.set(f"{amps:.2f}") + except ValueError: + pass + finally: + self._sync_in_progress = False + + def on_custom_amps_focus_out(self, event=None): + """When amps fields lose focus, update the raw fields.""" + if self._sync_in_progress: + return + self._sync_in_progress = True + try: + # Cutoff + try: + amps = float(self.custom_cutoff_amps_var.get().strip()) + if amps < 0: + raise ValueError + raw = int(round(amps * 1000.0)) + self.custom_cutoff_raw_var.set(str(raw)) + except ValueError: + pass + + # Max + try: + amps = float(self.custom_max_amps_var.get().strip()) + if amps < 0: + raise ValueError + raw = int(round(amps * 1000.0)) + self.custom_max_raw_var.set(str(raw)) + except ValueError: + pass + finally: + self._sync_in_progress = False + + def get_profile_currents(self): + """ + Return (cutoff_raw, max_raw) based on selected profile. + For custom, validate and derive from raw fields. + Raises ValueError if custom values are invalid. + """ + profile = self.sim_profile_var.get().strip() + if profile in self.sim_profiles: + return self.sim_profiles[profile] + + # Custom profile: use the raw fields as source of truth + try: + cutoff_raw = int(self.custom_cutoff_raw_var.get().strip()) + max_raw = int(self.custom_max_raw_var.get().strip()) + if cutoff_raw < 0 or max_raw <= 0: + raise ValueError + if cutoff_raw > 20000 or max_raw > 20000: + raise ValueError + except Exception: + raise ValueError( + "Invalid custom cutoff or max current values.\n" + "Please enter positive integers less than 20000." + ) + return cutoff_raw, max_raw + + # ---------- Simulation ---------- + + def start_simulation(self): + if not self.require_connection(): + return + + if self.sim_thread is not None and self.sim_thread.is_alive(): + messagebox.showinfo( + "Simulation running", + "A simulation is already in progress." + ) + return + + # Parse duration + try: + duration = float(self.sim_duration_var.get().strip()) + if duration <= 0: + raise ValueError + except ValueError: + messagebox.showwarning( + "Invalid duration", + "Please enter a positive number of seconds." + ) + return + + sim_baud_str = self.sim_baud_var.get().strip() + + # Map simulated baudrate to keepalive interval + # This does not change the real UART towards the pack + interval_map = { + "1200": 1.0, + "2400": 0.75, + "4800": 0.5, + "9600": 0.25, + } + keepalive_interval = interval_map.get(sim_baud_str, 0.5) + + # Get profile currents + try: + cutoff, max_current = self.get_profile_currents() + except ValueError as e: + messagebox.showwarning("Profile error", str(e)) + return + + profile_name = self.sim_profile_var.get().strip() + cutoff_amps = cutoff / 1000.0 + max_amps = max_current / 1000.0 + + self.sim_stop_event = threading.Event() + self.sim_thread = threading.Thread( + target=self._simulation_worker, + args=( + duration, + keepalive_interval, + profile_name, + cutoff, + cutoff_amps, + max_current, + max_amps, + ), + daemon=True, + ) + self.sim_thread.start() + + self.sim_start_btn.configure(state="disabled") + self.sim_stop_btn.configure(state="normal") + self.sim_status_var.set( + f"Simulation running ({profile_name}, simulated baud {sim_baud_str})." + ) + self.sim_log( + f"Starting simulation for {duration} seconds - " + f"profile {profile_name}, " + f"cutoff {cutoff} ({cutoff_amps:.2f} A), " + f"max {max_current} ({max_amps:.2f} A), " + f"simulated baud {sim_baud_str}, " + f"keepalive interval {keepalive_interval:.2f}s." + ) + + def stop_simulation(self): + if self.sim_stop_event is not None: + self.sim_stop_event.set() + + def _simulation_worker( + self, + duration, + interval, + profile_name, + cutoff_raw, + cutoff_amps, + max_raw, + max_amps, + ): + m = self.m18_obj + if m is None: + self.after( + 0, + lambda: messagebox.showerror( + "Simulation error", "No active M18 connection." + ), + ) + return + + # Save and override charger related parameters + old_cutoff = getattr(m, "CUTOFF_CURRENT", None) + old_max = getattr(m, "MAX_CURRENT", None) + m.CUTOFF_CURRENT = cutoff_raw + m.MAX_CURRENT = max_raw + + begin_time = time.time() + + try: + # Reset and configure as a charger would + self.after(0, lambda: self.sim_log("Sending reset and initial configure...")) + try: + m.reset() + except Exception as e: + self.after(0, lambda: self.sim_log(f"reset() failed: {e}")) + return + + try: + # configure(2) - pretend charger in pre charge state + m.configure(2) + m.get_snapchat() + time.sleep(0.6) + m.keepalive() + # configure(1) - active charging + m.configure(1) + m.get_snapchat() + except Exception as e: + self.after(0, lambda: self.sim_log(f"Initial charger negotiation failed: {e}")) + return + + # Main simulation loop + while not self.sim_stop_event.is_set(): + elapsed = time.time() - begin_time + if elapsed >= duration: + break + try: + time.sleep(interval) + m.keepalive() + self.after( + 0, + lambda e=elapsed: self.sim_log( + f"Keepalive at t={e:.1f}s" + ), + ) + except Exception as e: + self.after( + 0, + lambda: self.sim_log(f"keepalive() failed: {e}") + ) + break + + finally: + # Return charger settings and pack state to idle + try: + m.idle() + except Exception: + pass + + if old_cutoff is not None: + m.CUTOFF_CURRENT = old_cutoff + if old_max is not None: + m.MAX_CURRENT = old_max + + def finish(): + self.sim_log( + "Simulation finished. Pack returned to idle. " + "Parameters restored to previous values." + ) + self.sim_status_var.set("Simulation idle. Ready for next run.") + self.sim_start_btn.configure(state="normal") + self.sim_stop_btn.configure(state="disabled") + + self.after(0, finish) + + +if __name__ == "__main__": + app = M18GUI() + app.mainloop() From 8b56fd67c398dee9cb738c06811a84d8f0f01224 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Mon, 8 Dec 2025 15:40:47 -0500 Subject: [PATCH 02/61] Updated GUI for sizing, attempting to make it more compact --- m18gui.py | 371 +++++++++++++----------------------------------------- 1 file changed, 84 insertions(+), 287 deletions(-) diff --git a/m18gui.py b/m18gui.py index deb877b..5744bd0 100644 --- a/m18gui.py +++ b/m18gui.py @@ -7,7 +7,6 @@ import tkinter as tk from tkinter import ttk, messagebox -# 1. Dependency installer using Tkinter status window def ensure_module(mod_name: str, pip_name: str) -> None: try: __import__(mod_name) @@ -18,22 +17,19 @@ def ensure_module(mod_name: str, pip_name: str) -> None: install_root = tk.Tk() install_root.title("M18 GUI - Installing dependencies") install_root.geometry("420x120") - label = ttk.Label( install_root, text=( f"Installing required Python package:\n{pip_name}\n\n" "This may take a moment..." - ) + ), + justify="center" ) label.pack(padx=10, pady=10) - progress = ttk.Progressbar(install_root, mode="indeterminate") - progress.pack(fill="x", padx=10, pady=(0, 10)) + progress.pack(fill="x", padx=3, pady=(0, 3)) progress.start(10) - install_root.update_idletasks() - try: subprocess.check_call( [sys.executable, "-m", "pip", "install", pip_name], @@ -48,10 +44,8 @@ def ensure_module(mod_name: str, pip_name: str) -> None: ) install_root.destroy() sys.exit(1) - progress.stop() install_root.destroy() - try: __import__(mod_name) except ImportError: @@ -62,319 +56,196 @@ def ensure_module(mod_name: str, pip_name: str) -> None: ) sys.exit(1) - -# Make sure dependencies for m18.py are present before importing it +# Ensure dependencies for m18.py ensure_module("serial", "pyserial") ensure_module("requests", "requests") from serial.tools import list_ports -import m18 # protocol file from the cloned repo, must be m18.py in same folder - +import m18 class M18GUI(tk.Tk): def __init__(self): super().__init__() self.title("M18 Protocol GUI") - self.geometry("900x700") - self.m18_obj = None - - # Simulation state self.sim_thread = None self.sim_stop_event = None - - # Preset profiles: raw cutoff, raw max current - # Approx amps are raw / 1000 - self.sim_profiles = { - "Gentle": (150, 2500), - "Normal": (300, 6000), - "Aggressive": (450, 9000), - } - - # For custom profile fields, we keep StringVars + self.sim_profiles = {"Gentle": (150, 2500), "Normal": (300, 6000), "Aggressive": (450, 9000)} self.custom_cutoff_raw_var = tk.StringVar(value="300") self.custom_cutoff_amps_var = tk.StringVar(value="0.30") self.custom_max_raw_var = tk.StringVar(value="6000") self.custom_max_amps_var = tk.StringVar(value="6.00") - - # Flag to prevent recursive updates while syncing fields self._sync_in_progress = False - self.create_widgets() self.refresh_ports() - self.update_profile_display() # initialize profile label - - # ---------- UI building ---------- + self.update_profile_display() def create_widgets(self): - # Notebook for Main Controls, Interactive Console, Simulation self.notebook = ttk.Notebook(self) - self.notebook.pack(fill="x", padx=10, pady=10) + self.notebook.pack(fill="x", expand=False, padx=10, pady=(5, 0)) self.main_tab = ttk.Frame(self.notebook) self.console_tab = ttk.Frame(self.notebook) self.sim_tab = ttk.Frame(self.notebook) - + self.about_tab = ttk.Frame(self.notebook) self.notebook.add(self.main_tab, text="Main Controls") self.notebook.add(self.console_tab, text="Interactive Console") self.notebook.add(self.sim_tab, text="Simulation") + self.notebook.add(self.about_tab, text="About") - # Main Controls tab content + # --- Main Controls top_frame = ttk.Frame(self.main_tab) - top_frame.pack(fill="x", padx=5, pady=5) - + top_frame.pack(fill="x", padx=5, pady=(5, 0)) ttk.Label(top_frame, text="Serial port:").grid(row=0, column=0, sticky="w") - self.port_var = tk.StringVar() - self.port_combo = ttk.Combobox( - top_frame, - textvariable=self.port_var, - state="readonly", - width=25 - ) + self.port_combo = ttk.Combobox(top_frame, textvariable=self.port_var, state="readonly", width=25) self.port_combo.grid(row=0, column=1, padx=5, sticky="w") - - refresh_btn = ttk.Button( - top_frame, text="Refresh", command=self.refresh_ports - ) - refresh_btn.grid(row=0, column=2, padx=5) - - self.connect_btn = ttk.Button( - top_frame, text="Connect", command=self.connect_device - ) - self.connect_btn.grid(row=0, column=3, padx=5) - - self.disconnect_btn = ttk.Button( - top_frame, text="Disconnect", command=self.disconnect_device, state="disabled" - ) - self.disconnect_btn.grid(row=0, column=4, padx=5) - + ttk.Button(top_frame, text="Refresh", command=self.refresh_ports).grid(row=0, column=2, padx=4) + self.connect_btn = ttk.Button(top_frame, text="Connect", command=self.connect_device) + self.connect_btn.grid(row=0, column=3, padx=4) + self.disconnect_btn = ttk.Button(top_frame, text="Disconnect", command=self.disconnect_device, state="disabled") + self.disconnect_btn.grid(row=0, column=4, padx=4) self.status_var = tk.StringVar(value="Not connected") - status_label = ttk.Label(top_frame, textvariable=self.status_var) - status_label.grid(row=1, column=0, columnspan=5, sticky="w", pady=(5, 0)) - + ttk.Label(top_frame, textvariable=self.status_var).grid( + row=1, column=0, columnspan=5, sticky="w", pady=(4, 0) + ) mid_frame = ttk.LabelFrame(self.main_tab, text="Commands") - mid_frame.pack(fill="x", padx=5, pady=5) - + mid_frame.pack(fill="x", padx=5, pady=(6, 4)) self.idle_btn = ttk.Button( - mid_frame, - text="Idle (TX low, safe to connect)", - command=self.cmd_idle, - state="disabled" + mid_frame, text="Idle (TX low, safe to connect)", command=self.cmd_idle, state="disabled" ) - self.idle_btn.grid(row=0, column=0, padx=5, pady=5, sticky="w") - + self.idle_btn.grid(row=0, column=0, padx=3, pady=4, sticky="w") self.health_btn = ttk.Button( - mid_frame, - text="Health report", - command=self.cmd_health, - state="disabled" + mid_frame, text="Health report", command=self.cmd_health, state="disabled" ) - self.health_btn.grid(row=0, column=1, padx=5, pady=5, sticky="w") - + self.health_btn.grid(row=0, column=1, padx=3, pady=4, sticky="w") self.clipboard_btn = ttk.Button( - mid_frame, - text="Copy all registers to clipboard", - command=self.cmd_clipboard, - state="disabled" + mid_frame, text="Copy all registers to clipboard", command=self.cmd_clipboard, state="disabled" ) - self.clipboard_btn.grid(row=0, column=2, padx=5, pady=5, sticky="w") + self.clipboard_btn.grid(row=0, column=2, padx=3, pady=4, sticky="w") - # Interactive Console tab content + # --- Interactive Console console_frame = ttk.Frame(self.console_tab) console_frame.pack(fill="both", expand=True, padx=5, pady=5) - ttk.Label( console_frame, - text="Python console environment:\n" - "You can use 'm' for the connected M18 object.\n" - "Example: m.read_id() or m.health()" + text="Python console environment.\nYou can use 'm' for the connected M18 object.\nExample: m.read_id() or m.health()" ).pack(anchor="w") - - self.console_text = tk.Text(console_frame, height=10, wrap="none") + self.console_text = tk.Text(console_frame, height=8, wrap="none") self.console_text.pack(fill="both", expand=True, padx=5, pady=5) - console_btn_frame = ttk.Frame(console_frame) console_btn_frame.pack(fill="x", padx=5, pady=(0, 5)) - - self.console_run_btn = ttk.Button( - console_btn_frame, - text="Execute", - command=self.run_console_code - ) + self.console_run_btn = ttk.Button(console_btn_frame, text="Execute", command=self.run_console_code) self.console_run_btn.pack(side="left", padx=5) - self.console_clear_btn = ttk.Button( - console_btn_frame, - text="Clear input", - command=lambda: self.console_text.delete("1.0", tk.END) + console_btn_frame, text="Clear input", command=lambda: self.console_text.delete("1.0", tk.END) ) self.console_clear_btn.pack(side="left", padx=5) - # Simulation tab content + # --- Simulation sim_main_frame = ttk.Frame(self.sim_tab) - sim_main_frame.pack(fill="x", padx=5, pady=5) - - # Duration - ttk.Label(sim_main_frame, text="Simulation duration (seconds):").grid( - row=0, column=0, sticky="w", padx=5, pady=3 - ) + sim_main_frame.pack(fill="x", padx=6, pady=6) + ttk.Label(sim_main_frame, text="Simulation duration (seconds):").grid(row=0, column=0, sticky="w", padx=4, pady=2) self.sim_duration_var = tk.StringVar(value="60") - self.sim_duration_entry = ttk.Entry( - sim_main_frame, textvariable=self.sim_duration_var, width=10 - ) - self.sim_duration_entry.grid(row=0, column=1, sticky="w", padx=5, pady=3) - - # Simulation baudrate (conceptual only) - ttk.Label(sim_main_frame, text="Simulation baudrate (conceptual):").grid( - row=1, column=0, sticky="w", padx=5, pady=3 - ) + self.sim_duration_entry = ttk.Entry(sim_main_frame, textvariable=self.sim_duration_var, width=10) + self.sim_duration_entry.grid(row=0, column=1, sticky="w", padx=4, pady=2) + ttk.Label(sim_main_frame, text="Simulation baudrate (conceptual):").grid(row=1, column=0, sticky="w", padx=4, pady=2) self.sim_baud_var = tk.StringVar(value="4800") self.sim_baud_combo = ttk.Combobox( - sim_main_frame, - textvariable=self.sim_baud_var, - state="readonly", - width=10, - values=["1200", "2400", "4800", "9600"], + sim_main_frame, textvariable=self.sim_baud_var, state="readonly", width=10, + values=["1200", "2400", "4800", "9600"] ) - self.sim_baud_combo.grid(row=1, column=1, sticky="w", padx=5, pady=3) - + self.sim_baud_combo.grid(row=1, column=1, sticky="w", padx=4, pady=2) ttk.Label( sim_main_frame, - text=( - "Note: Actual UART to the battery always runs at 4800 baud.\n" - "This setting only changes how often keepalive packets are sent\n" - "during simulation. No real charging current flows over USB." - ) - ).grid(row=2, column=0, columnspan=3, sticky="w", padx=5, pady=(0, 8)) - - # Charger profile - ttk.Label(sim_main_frame, text="Charger profile:").grid( - row=3, column=0, sticky="w", padx=5, pady=3 - ) + text="Note: actual UART to the pack always runs at 4800 baud.\nThis setting only affects how often keepalive packets are sent\nduring simulation. No real charging current flows from USB." + ).grid(row=2, column=0, columnspan=3, sticky="w", padx=4, pady=(2, 8)) + ttk.Label(sim_main_frame, text="Charger profile:").grid(row=3, column=0, sticky="w", padx=4, pady=2) self.sim_profile_var = tk.StringVar(value="Normal") profile_values = ["Gentle", "Normal", "Aggressive", "Custom"] self.sim_profile_combo = ttk.Combobox( - sim_main_frame, - textvariable=self.sim_profile_var, - state="readonly", - width=12, - values=profile_values, + sim_main_frame, textvariable=self.sim_profile_var, state="readonly", width=12, values=profile_values ) - self.sim_profile_combo.grid(row=3, column=1, sticky="w", padx=5, pady=3) + self.sim_profile_combo.grid(row=3, column=1, sticky="w", padx=4, pady=2) self.sim_profile_combo.bind("<>", self.on_profile_changed) - - # Profile parameter display label - self.profile_info_var = tk.StringVar( - value="Profile parameters will appear here." + self.profile_info_var = tk.StringVar(value="Profile parameters will appear here.") + ttk.Label(sim_main_frame, textvariable=self.profile_info_var, foreground="blue").grid( + row=4, column=0, columnspan=3, sticky="w", padx=4, pady=(0, 6) ) - ttk.Label( - sim_main_frame, - textvariable=self.profile_info_var, - foreground="blue" - ).grid(row=4, column=0, columnspan=3, sticky="w", padx=5, pady=(0, 8)) - - # Custom profile editor (grid style) self.custom_frame = ttk.LabelFrame(self.sim_tab, text="Custom charger parameters") - # Inside this frame we create a small grid: - # Raw units Amps - # Cutoff: [ ] [ ] - # Max: [ ] [ ] - header_frame = ttk.Frame(self.custom_frame) header_frame.pack(fill="x", padx=5, pady=(5, 0)) - ttk.Label(header_frame, text="").grid(row=0, column=0, padx=5) ttk.Label(header_frame, text="Raw units").grid(row=0, column=1, padx=5) ttk.Label(header_frame, text="Amps").grid(row=0, column=2, padx=5) - rows_frame = ttk.Frame(self.custom_frame) rows_frame.pack(fill="x", padx=5, pady=5) - - # Cutoff row ttk.Label(rows_frame, text="Cutoff:").grid(row=0, column=0, padx=5, pady=3, sticky="e") - self.custom_cutoff_raw_entry = ttk.Entry( - rows_frame, textvariable=self.custom_cutoff_raw_var, width=10 - ) + self.custom_cutoff_raw_entry = ttk.Entry(rows_frame, textvariable=self.custom_cutoff_raw_var, width=10) self.custom_cutoff_raw_entry.grid(row=0, column=1, padx=5, pady=3) - self.custom_cutoff_amps_entry = ttk.Entry( - rows_frame, textvariable=self.custom_cutoff_amps_var, width=10 - ) + self.custom_cutoff_amps_entry = ttk.Entry(rows_frame, textvariable=self.custom_cutoff_amps_var, width=10) self.custom_cutoff_amps_entry.grid(row=0, column=2, padx=5, pady=3) - - # Max current row ttk.Label(rows_frame, text="Max current:").grid(row=1, column=0, padx=5, pady=3, sticky="e") - self.custom_max_raw_entry = ttk.Entry( - rows_frame, textvariable=self.custom_max_raw_var, width=10 - ) + self.custom_max_raw_entry = ttk.Entry(rows_frame, textvariable=self.custom_max_raw_var, width=10) self.custom_max_raw_entry.grid(row=1, column=1, padx=5, pady=3) - self.custom_max_amps_entry = ttk.Entry( - rows_frame, textvariable=self.custom_max_amps_var, width=10 - ) + self.custom_max_amps_entry = ttk.Entry(rows_frame, textvariable=self.custom_max_amps_var, width=10) self.custom_max_amps_entry.grid(row=1, column=2, padx=5, pady=3) - ttk.Label( self.custom_frame, - text=( - "1 raw unit is treated as approximately 0.001 A.\n" - "These values are for protocol simulation only.\n" - "No real charging current comes from the USB interface." - ) + text="1 raw unit is treated as approximately 0.001 A.\nThese values are for protocol simulation only.\nNo real charging current comes from the USB interface." ).pack(anchor="w", padx=5, pady=(0, 5)) - - # Bind focus-out events to keep raw and amps in sync self.custom_cutoff_raw_entry.bind("", self.on_custom_raw_focus_out) self.custom_max_raw_entry.bind("", self.on_custom_raw_focus_out) self.custom_cutoff_amps_entry.bind("", self.on_custom_amps_focus_out) self.custom_max_amps_entry.bind("", self.on_custom_amps_focus_out) - - # Simulation control buttons sim_btn_frame = ttk.Frame(self.sim_tab) - sim_btn_frame.pack(fill="x", padx=5, pady=8) - + sim_btn_frame.pack(fill="x", padx=6, pady=(4, 4)) self.sim_start_btn = ttk.Button( - sim_btn_frame, - text="Start simulation", - command=self.start_simulation, - state="disabled", + sim_btn_frame, text="Start simulation", command=self.start_simulation, state="disabled" ) - self.sim_start_btn.pack(side="left", padx=5) - + self.sim_start_btn.pack(side="left", padx=4) self.sim_stop_btn = ttk.Button( - sim_btn_frame, - text="Stop simulation", - command=self.stop_simulation, - state="disabled", + sim_btn_frame, text="Stop simulation", command=self.stop_simulation, state="disabled" ) - self.sim_stop_btn.pack(side="left", padx=5) - + self.sim_stop_btn.pack(side="left", padx=4) self.sim_status_var = tk.StringVar( value="Simulation idle. Connect to a battery to enable." ) - ttk.Label(self.sim_tab, textvariable=self.sim_status_var).pack( - anchor="w", padx=10, pady=(0, 5) + ttk.Label(self.sim_tab, textvariable=self.sim_status_var).pack(anchor="w", padx=8, pady=(0, 6)) + import webbrowser + about_frame = ttk.Frame(self.about_tab) + about_frame.pack(fill="both", expand=True, padx=10, pady=10) + ttk.Label( + about_frame, text="M18 Protocol GUI", font=("Segoe UI", 14, "bold") + ).pack(pady=(0, 10)) + ttk.Label(about_frame, text="Developed by KillaVolt").pack(pady=(0, 5)) + github_link = ttk.Label( + about_frame, + text="GitHub Profile: https://github.com/KillaVolt", + foreground="blue", + cursor="hand2" + ) + github_link.pack() + github_link.bind( + "", + lambda e: webbrowser.open("https://github.com/KillaVolt") ) - - # Bottom frame for output log (shared by everything) + ttk.Label( + about_frame, + text="GUI submitted for review — awaiting hardware verification", + foreground="gray" + ).pack(pady=(15, 0)) bottom_frame = ttk.LabelFrame(self, text="Output") bottom_frame.pack(fill="both", expand=True, padx=10, pady=(0, 10)) - self.output_text = tk.Text(bottom_frame, wrap="word") self.output_text.pack(side="left", fill="both", expand=True) - scrollbar = ttk.Scrollbar( - bottom_frame, - orient="vertical", - command=self.output_text.yview + bottom_frame, orient="vertical", command=self.output_text.yview ) scrollbar.pack(side="right", fill="y") self.output_text.configure(yscrollcommand=scrollbar.set) - - # This custom frame is only visible when profile is "Custom" self.custom_frame.pack_forget() - # ---------- Utility ---------- - def log(self, text: str, clear: bool = False): if clear: self.output_text.delete("1.0", tk.END) @@ -416,18 +287,14 @@ def capture_output(self, func, *args, **kwargs) -> str: sys.stdout = old_stdout return buf.getvalue() - # ---------- Connection handlers ---------- - def connect_device(self): if self.m18_obj is not None: messagebox.showinfo("Already connected", "You are already connected.") return - port = self.port_var.get().strip() if not port: messagebox.showwarning("No port", "Please select a serial port first.") return - try: self.m18_obj = m18.M18(port) except Exception as e: @@ -438,7 +305,6 @@ def connect_device(self): ) self.set_status("Connection failed") return - self.set_status(f"Connected to {port}") self.connect_btn.configure(state="disabled") self.disconnect_btn.configure(state="normal") @@ -450,9 +316,7 @@ def connect_device(self): self.log(f"Connected to {port}", clear=True) def disconnect_device(self): - # Stop simulation if running self.stop_simulation() - if self.m18_obj is not None: try: try: @@ -465,7 +329,6 @@ def disconnect_device(self): pass finally: self.m18_obj = None - self.set_status("Disconnected") self.connect_btn.configure(state="normal") self.disconnect_btn.configure(state="disabled") @@ -477,12 +340,9 @@ def disconnect_device(self): self.sim_status_var.set("Simulation idle. Connect to a battery to enable.") self.log("Disconnected") - # ---------- Command handlers ---------- - def cmd_idle(self): if not self.require_connection(): return - def work(): try: self.m18_obj.idle() @@ -494,13 +354,11 @@ def work(): self.after(0, lambda: self.set_status("Idle (TX low)")) except Exception as e: self.after(0, lambda: messagebox.showerror("Idle error", str(e))) - threading.Thread(target=work, daemon=True).start() def cmd_health(self): if not self.require_connection(): return - def work(): try: output = self.capture_output(self.m18_obj.health) @@ -511,13 +369,11 @@ def finish(): self.after(0, finish) except Exception as e: self.after(0, lambda: messagebox.showerror("Health error", str(e))) - threading.Thread(target=work, daemon=True).start() def cmd_clipboard(self): if not self.require_connection(): return - def work(): try: output = self.capture_output( @@ -534,11 +390,8 @@ def finish(): self.after(0, finish) except Exception as e: self.after(0, lambda: messagebox.showerror("Clipboard error", str(e))) - threading.Thread(target=work, daemon=True).start() - # ---------- Interactive console ---------- - def run_console_code(self): code_str = self.console_text.get("1.0", tk.END).strip() if not code_str: @@ -547,17 +400,14 @@ def run_console_code(self): "Please enter some Python code to execute." ) return - if not self.require_connection(): return - def work(): buf = io.StringIO() old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = buf sys.stderr = buf - try: env = {"m": self.m18_obj} try: @@ -567,7 +417,6 @@ def work(): finally: sys.stdout = old_stdout sys.stderr = old_stderr - output = buf.getvalue() def finish(): self.log("=== Console execution ===") @@ -576,18 +425,13 @@ def finish(): else: self.log("(no output)") self.set_status("Console code executed") - self.after(0, finish) - threading.Thread(target=work, daemon=True).start() - # ---------- Profile display and custom sync ---------- - def on_profile_changed(self, event=None): self.update_profile_display() def update_profile_display(self): - """Update the profile info label and show/hide custom editor.""" profile = self.sim_profile_var.get().strip() if profile in self.sim_profiles: cutoff, max_current = self.sim_profiles[profile] @@ -602,7 +446,6 @@ def update_profile_display(self): self.profile_info_var.set(info) self.custom_frame.pack_forget() else: - # Custom profile self.profile_info_var.set( "Profile 'Custom': use the fields below to set cutoff and max. " "Values are for protocol simulation only." @@ -610,12 +453,10 @@ def update_profile_display(self): self.custom_frame.pack(fill="x", padx=5, pady=(0, 8)) def on_custom_raw_focus_out(self, event=None): - """When raw fields lose focus, update the amps fields.""" if self._sync_in_progress: return self._sync_in_progress = True try: - # Cutoff try: raw = int(self.custom_cutoff_raw_var.get().strip()) if raw < 0: @@ -623,10 +464,7 @@ def on_custom_raw_focus_out(self, event=None): amps = raw / 1000.0 self.custom_cutoff_amps_var.set(f"{amps:.2f}") except ValueError: - # leave as is, but do not crash pass - - # Max try: raw = int(self.custom_max_raw_var.get().strip()) if raw < 0: @@ -639,12 +477,10 @@ def on_custom_raw_focus_out(self, event=None): self._sync_in_progress = False def on_custom_amps_focus_out(self, event=None): - """When amps fields lose focus, update the raw fields.""" if self._sync_in_progress: return self._sync_in_progress = True try: - # Cutoff try: amps = float(self.custom_cutoff_amps_var.get().strip()) if amps < 0: @@ -653,8 +489,6 @@ def on_custom_amps_focus_out(self, event=None): self.custom_cutoff_raw_var.set(str(raw)) except ValueError: pass - - # Max try: amps = float(self.custom_max_amps_var.get().strip()) if amps < 0: @@ -667,16 +501,9 @@ def on_custom_amps_focus_out(self, event=None): self._sync_in_progress = False def get_profile_currents(self): - """ - Return (cutoff_raw, max_raw) based on selected profile. - For custom, validate and derive from raw fields. - Raises ValueError if custom values are invalid. - """ profile = self.sim_profile_var.get().strip() if profile in self.sim_profiles: return self.sim_profiles[profile] - - # Custom profile: use the raw fields as source of truth try: cutoff_raw = int(self.custom_cutoff_raw_var.get().strip()) max_raw = int(self.custom_max_raw_var.get().strip()) @@ -691,20 +518,15 @@ def get_profile_currents(self): ) return cutoff_raw, max_raw - # ---------- Simulation ---------- - def start_simulation(self): if not self.require_connection(): return - if self.sim_thread is not None and self.sim_thread.is_alive(): messagebox.showinfo( "Simulation running", "A simulation is already in progress." ) return - - # Parse duration try: duration = float(self.sim_duration_var.get().strip()) if duration <= 0: @@ -715,11 +537,7 @@ def start_simulation(self): "Please enter a positive number of seconds." ) return - sim_baud_str = self.sim_baud_var.get().strip() - - # Map simulated baudrate to keepalive interval - # This does not change the real UART towards the pack interval_map = { "1200": 1.0, "2400": 0.75, @@ -727,18 +545,14 @@ def start_simulation(self): "9600": 0.25, } keepalive_interval = interval_map.get(sim_baud_str, 0.5) - - # Get profile currents try: cutoff, max_current = self.get_profile_currents() except ValueError as e: messagebox.showwarning("Profile error", str(e)) return - profile_name = self.sim_profile_var.get().strip() cutoff_amps = cutoff / 1000.0 max_amps = max_current / 1000.0 - self.sim_stop_event = threading.Event() self.sim_thread = threading.Thread( target=self._simulation_worker, @@ -754,7 +568,6 @@ def start_simulation(self): daemon=True, ) self.sim_thread.start() - self.sim_start_btn.configure(state="disabled") self.sim_stop_btn.configure(state="normal") self.sim_status_var.set( @@ -792,38 +605,28 @@ def _simulation_worker( ), ) return - - # Save and override charger related parameters old_cutoff = getattr(m, "CUTOFF_CURRENT", None) old_max = getattr(m, "MAX_CURRENT", None) m.CUTOFF_CURRENT = cutoff_raw m.MAX_CURRENT = max_raw - begin_time = time.time() - try: - # Reset and configure as a charger would self.after(0, lambda: self.sim_log("Sending reset and initial configure...")) try: m.reset() except Exception as e: self.after(0, lambda: self.sim_log(f"reset() failed: {e}")) return - try: - # configure(2) - pretend charger in pre charge state m.configure(2) m.get_snapchat() time.sleep(0.6) m.keepalive() - # configure(1) - active charging m.configure(1) m.get_snapchat() except Exception as e: self.after(0, lambda: self.sim_log(f"Initial charger negotiation failed: {e}")) return - - # Main simulation loop while not self.sim_stop_event.is_set(): elapsed = time.time() - begin_time if elapsed >= duration: @@ -843,19 +646,15 @@ def _simulation_worker( lambda: self.sim_log(f"keepalive() failed: {e}") ) break - finally: - # Return charger settings and pack state to idle try: m.idle() except Exception: pass - if old_cutoff is not None: m.CUTOFF_CURRENT = old_cutoff if old_max is not None: m.MAX_CURRENT = old_max - def finish(): self.sim_log( "Simulation finished. Pack returned to idle. " @@ -864,10 +663,8 @@ def finish(): self.sim_status_var.set("Simulation idle. Ready for next run.") self.sim_start_btn.configure(state="normal") self.sim_stop_btn.configure(state="disabled") - self.after(0, finish) - if __name__ == "__main__": app = M18GUI() app.mainloop() From ae028ada50c639363b64291a9b060066b60e598c Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sat, 13 Dec 2025 18:56:06 -0500 Subject: [PATCH 03/61] Cleaned up repo of files that are not necessary for the GUI to funciton. --- README.md | 83 ---------- docs/Protocol.ods | Bin 14255 -> 0 bytes docs/thumbnail.png | Bin 0 -> 4551 bytes m18_clipboard.bat | 28 ---- m18_health.bat | 15 -- m18_idle.bat | 14 -- m18_interactive.bat | 5 - m18gui.py | 366 +++++++++++++++++++------------------------- pyproject.toml | 10 -- uv.lock | 100 ------------ 10 files changed, 159 insertions(+), 462 deletions(-) delete mode 100644 README.md delete mode 100644 docs/Protocol.ods create mode 100644 docs/thumbnail.png delete mode 100644 m18_clipboard.bat delete mode 100644 m18_health.bat delete mode 100644 m18_idle.bat delete mode 100644 m18_interactive.bat delete mode 100644 pyproject.toml delete mode 100644 uv.lock diff --git a/README.md b/README.md deleted file mode 100644 index 82e99c3..0000000 --- a/README.md +++ /dev/null @@ -1,83 +0,0 @@ -# M18 Protocol - -This repository contains research about the Milwaukee M18 protocol. - -First step was to fake the charger commands in order to verify that the communication works as expected. :white_check_mark: Next step was figuring out what other commands are supported. :white_check_mark: - -While most of the registers and data are known, there are still some unknown. Contributions are welcome! - -## Hardware - -In order to simulate the charger, the following circuit is proposed: - -**NOTE When using fake FT232 chips, break condition is not supported. The behaviour can be emulated by using the DTR line to pull the TX line low.** - -List of [working and non-working devices](https://github.com/mnh-jansson/m18-protocol/discussions/16). Please add yours if not already listed. - -The voltage of the USB to Serial adapter should be 3.3V - -![hardware](docs/wiring.png) - -## Requirements and Usage - -To use this software, Python is required. Please read the [python](https://docs.python.org/3/) and [pip](https://pip.pypa.io/en/stable/installation/) documentation. - -Install the required packages by running - -```bash -pip install -r requirements.txt -``` - -Once the required packages are installed, run the following command. If the serial port is known, specify it using `--port` to speed things up. - -```bash -python3 m18.py -``` -or on Windows -```bash -python.exe m18.py -``` - -Alternatively, use the [uv](https://docs.astral.sh/uv/) package manager to create an isolated virtual environment, install the correct version of Python, install dependencies, and execute the project: - -```bash -uv run m18.py -``` - - -This opens an interactive shell that can be used to send different commands. Refer to the instructions provided in the shell. - -## Output - -* Most users will just want to use `m.health()` for a simple health report. -* To see all registers, use `m.read_id()` -* To output all registers in a format that can be copy/pasted into a spreadsheet, use `m.read_id(output="raw")` -* To help us identify unknown registers, you can submit your diagnostics to us with `m.submit_form()`. This will prompt you for the 3 parts of the serial number, the type of battery (e.g. 3Ah high output), and other stuff that you can leave blank if you like - -A spreadsheet template can be found below. Do NOT request access, go to `File -> Make a copy` or `File -> Download` - -https://docs.google.com/spreadsheets/d/1rZZ3mtU2uwuo_uMv7O7hi5kyPA9AXUDU5CBsHKWMi-U/ - -## Windows Users -There are 4 .bat files for Windows users that are not familiar with the command line. Double-click on them to run them. -* `m18_idle.bat` will prompt you to select a serial device, then bring the TX (J2) pin low. This is recommended before connecting to the battery to avoid increasing the counter for dumb-charges -* `m18_health.bat` will print out a simple health report. The adapter must be connected to the battery or you will get errors -* `m18_interactive.bat` will put you into the interactive shell where you can call `m.health()`, `m.read_id()`, and submit your diagnostics to us with `m.submit_form()` -* `m18_clipboard.bat` will fetch all diagnostic registers and copy them to the clipboard. You must right-click on this .bat file and select `Edit`, then change `--port COM5` to whatever your port is. Once finished, you can select a cell in a spreadsheet (for example, the template provided above), and ctrl+v to copy all the registers - -## Troubleshooting -Some USB serial adapters don't give/receive the correct voltages when paired with M18 batteries. To test if this is your problem, connect adapter to battery then measure voltages between B- and J2 (next to B-) and J1 (next to B+). Then use the m.idle() and m.high() commands. - -You should see: -* m.idle(): J2<1V, J1<1V -* m.high(): J2>8V, J2>2V - -I get: -* m.idle(): J2=0.13V, J1=0.81V -* m.high(): J2=8.8V, J1=3.3V - -If m.idle() has J1 > 1V, then [this circuit](https://github.com/mnh-jansson/m18-protocol/issues/7#issuecomment-3312151944) by Spud2233 has fixed this issue for some people. -![isolator](docs/spud_isolator.png) - - - diff --git a/docs/Protocol.ods b/docs/Protocol.ods deleted file mode 100644 index 15fff3a82c9fcfa8f4f9b5fc62174fa17ceec8d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14255 zcmcJ01yo$w(k?*~G`I#0mf-FZ+%;HmcN%vK4nYG1cXxMp65PEZSkP`<8+l~z&7GP1 z&&+%4z4fYBuf5OdQ(x7oy}M5Bv#S(kU|_MJpx~jPKI=z{&alLQ5xGTkC(;lH@P6w6HNSGjU`Tws5jBuygzeRsYH`rq;Fw zPA30k&cC|BpNiTU08Fg^LE2vppn;K*iM7eoc-sDw2oDec+jM%mum2G8Q_sc#U}0+F z=)~Y)Y&se@3J73A3q0ZrG8tQV#|Q`K@MfslGP8?4SObpnGzDX|BPvc!DX(Ndb7r$b zoOLa#E)`@z_%*zys9S~2=q=@tq$bN({V(n13*Nea=4Wk7x=O^YjlhFdQo zh@KPKdb~F0ja$kYpF-Q~?pZE-N#udLD0l?oNMVbMEiVG@u?+-MbtR{RtQhwzQvPrt zPjOZaqCtaldq@N6XTNum2(m+gP6321@-qFb31>>&-PxdxLH+jWfE+&kW7??kh1F2x zf^FUJ?NwmyfHki#<{n@p59jIrlQr^q{WKP^!hS2S`{T|7!}ufqMrECgsP((CT(jGl zow`#JRf$SPnHTVNSLRc2&!C_JV4$G>HUIz0e27oxb98dIHgRNdv#|zh9oTL*p+By6 z_8jMkA;o_--Z5wm3uxD^bnPwPn$RkLATBbD9{PGRlE zAKM(vF4ERrD>QZp!5d_2O?giJ;N)KuBhDpLQJ~j(2aPj*a6!UgLAZ%l{+a-+9FNe| z4yBeWr+aLNzG?1V)Kkhpv8Qsji;{KDcWc0{BOuffnC zpM+7-^WyCpxe)jUQ(r$DTq<-crLriD!k!yZweSP?YZ&xveKBdq3++lCRFqGCbJzXd zr;Mtf*0H#R&hX5!2!ytFlO0)2iblbA)B+? zo~M*Wy!OJ@gf(4Z9pp213l%ejw6|E;+NYxG?whAv6|UM-vsj-YEg35*1tD;1&>bl zelSDiIp*^-`mZJ^uc@jIE0LufhCi6Ud_4j;qEfn@nYLbbo+!NCkk(L3UBb+69Mvi1 z@O?)(8a;`UH|Z-`{GOlU>jeF&t;)>8Q42phj3np&{H^zAyaKuXXz8ydAPvq~rIY9n z57p)BHV3dkSM0z!^$A{foEdt+KAmKz_sp}S(5}?9$xzMbs>uc-d&RM+VAySLmF6&VQ50H=8=RKKGaZ~y>0?4R z^<_L|Z907~%;2r@{A*|vGrF_!s!9nQ(!?a!Yk3lPrQ(Th?=VDql+fYS#oHpR=SzaE zECutdf(MrT)y7=*Uvxr z=la4?QaP8eL-dug!;!&{)(ZvvP}>(WK6%g=VRE1L-)6vlZ0UHm#j25)t>6)lLHNN- znk?>yx^TL%_9|lX9;Z9>QQ*uMmB-DPNW6snLg6mFU+kG9djeW<#vGXtLb>xOdsXB% z^*Oy*H-TgxrGB_w4R!?!fv8p3>}wgikk1~0&=f1?FgwHV(`Mhiq6xHA<_&}G&k5;^ zz^5$t2eCXd4f5RIx&*!~UW(G+Tg$F>dvK|)4dc#{*z0K+yo^~x-QZDYo;YDUIh-I{ z_v}rsY3!p6m-xXP;=S~YXQDroBZ=x#>l3Rtnp~cCASPYYOg6UD$c_2;Qnpo?g{#s) zq7POuJ)7uNSS1Ncw$x^FODt(X>2oM%oR{hzR?4<}&)dB2Ez|}MXBwbQNBB%fwmxf7 zetNa4^>JAdF5b^rZVim2K?aY^2GIbY>1O7F0b)U~J zZ32h*W}fQHTthDHy8*$r`fjwm6*@SxkoqcF?xYE1j4HBsO!ZC3_2$B{NSc+r@jOGX zX9aGlaWPV;TFlbgw66DezG?8!XP#8t2PuE%uk_3`QE&iT9tvu_Q_i4VN|j=4FQOS{ zCe9(wbN*p?WaF*~+A9ieHI2v4n)grR1-Tc*^%E=1xaWuDW?R(B2qL|4xhwad6?_{R zRRd&z;58wNz^IQW((dfkz!0J?m{V)y7kiL#a?SWKaMC44JN7CZ_p=Idf9KXg3%;de zT7rA@yIo(aZCO{PJ12=yx;%B(OB>1PN2q>?;2I<1`pge{cOjsnu%f%>GjY&C0xtEd zEi~Xd-L)XMmn~5ve$8iALcCs-5tr{gWB+29nyX}Lv4cfo^aT;SuZ4uztz%v8K=}ja zMz6x1F6E`UD759(H%uA(5zr%@Xe)?6uN`7J?+AE$P8$In*)6QZuU$6Zo zHg|Pulq)6gMQ2UE_GOOTeOuw&oSZ$UiZOzPwY1|s>wGISl3uZpgS80JVLj;_ktt?> zzNxOe3Hiv0%$~%q6-gT#jj029*g!<^GLA4_XsBndo}bf$0a-Omz_N=Wa99=pFW z=x)eAJEJ5dP8?QIu{F(5L$xEjh^kG73Y&;==(S8NnL0s zrNtv*LqU^F7nAc+``DPI%zbH&1a1wG~T<8i^+C!Aq zsAmXPE^2*Qv@%9P=~aP!qEm-9_TCdf%y|jg#^`1 zefXjCW!Q{ok=df{p2gO_*6^br8y{+KGQ0d$K8#*<)_JK)WHMSP8miko# zm#~s1YmHc&F;Vpy>*Xfv%7HjdB_t7f{t@P9c*i1TLsEzU1(nD3PvPBfi!Bo;gP*}& zWSmTNDic=F)jjrC5YAoTN4SxKk{0t>>Cqyfn7*E}rlEv>@Lnh5INP2v^C8#6So@By z$nCM0WgE45>rx8xR4|t#Pa{A*&Wcm+x5Im+Qe^>QvOEa!T#Q4cVtzFQg zO7Ag_`@yw3($1T;243v3>E<@eY&-JxXw$Fw2H6Tp3O)RrEEKV^`nb{Ch1C77gvDy7 za|B1lF`|+T&@{WIz^Z)O-K9v}ql1ogt8KkKi1!^cR;K&84d~3jxxPfO#E)U;ak8|n zN`i?g#U|CaWEiJoWZH-d8fW5TJ48476-i5PG#8I(Ppjd}ow*0-?J9<#U};fGbTai% z%=#&I7~t6SlGvmKC1h2NBKH2yV407@W-HD1!DF*Ssm|*0DAz-m116!_Vk#4CsRQnH zB@Jo*);vO73MZrN8=jrA54bbKgww6|-y^cn2a!V>0Zep=9nb$c`~4~;^kYfVaJK&Se) zZ}2kCD06V|vb*`d?wtSl(?%akKx?p1E;|(B;e>s_p3Wv@ICsjztL1UfhAX*=W1l;l z|4Qj2HZL;M4XPxVbkC&NHPW5%TsWyoit(d>w8sKC2pv(a*+XnkS5w`G8u^HTH6k~o zWC}UCPYzE(Rb)EF^3t1UoDrzDwn|gKD2c%uT{d)^_)$=OplIHgapkBoTbhl4g?-aUG57`pS}vt(k2J z*ZJx7iU$xXUBAqy5{XJbz6*Y*6+#~^Mmw6aPI5E<7+Qdk&G(r1~QV?!_!Tr`!> zLlhZ}bUei zT3Vv9Np4zEiMBLy@89%SO60#0M^HtV4{>jBdGq62d?IbfcZQ@$$QRofcCDNWTiMX) zEZM9`tQU*A4!)`Ai?)M*18I8}bL%szY}iw70J@n&!V9!h*{KB2-h_B8Wc( zOKusaI)T+CS>9tPUCrP3Q%0l-P`L#Q)xh-&8ema9-jF5&SE6m!slL6P$k66}8E5C; z{rKH%3mkYU6a_~Rw=|<;le`w6`yeW04sHdJFqJW=)Jh{4pN>G~C zpDHaXi`Ty(hL9B4ZXfX-)g&U6Jr3GpwiLthB@lUG;F56-Ev&%~4$pW}0#Wb~^Uo z&nvo%xpgo@Dy#@>?>B$gjEoxPzeF1K%oe9&ZRB97pE`AUAI60?)sV5cW&M7D|3|K%Rsh zXIRr4N-c68Ex>x%T5`v;#l3$+AtvbRQwKygEEW#y? z;0ri~&zxy(ArgjU)ULCbA|NKqbm_aY=meciu;5sMTXyzQYdNPKL6l~g&Oev4KX1(W3!cPRwCN08B1MjpSiSjC^kzv#WXQb z`yy4n9sgi(bzIw3J{@!W5C3G#%(w5nzcd#)Emd-yZeKQuu{o!lDNj4+YO|5Kk;5{- z#(eKcxo#Yp+;B6ewkj$^ZzS_&MpH10e7n5RXCjpxu2W2urJGsF38qXu=F5Ez2h(iP+ia2FX4ncQ3QiQ6`fHciV{Zq%RUcWYm~x9daFV%CUMq|wfq|n@oRi395dgW^z*jr9CuG2+u9VTg9Bd;wk&uK z@h#b`y*I55WGTlOvi_oI+8W5hOBugNpDo)`=K3If!GcKN8}CH+{=3a#BOHoOSo7}6 zg{bUvOe%rFEfv{(Sq=FJDw#J0IG68Rpd%P_D?2;ADxhN@?5;sa`=mF@a1?pYfy!Y6qLf~= z8kEJR$L?&`M`u@sH2OD=#1aPnB~aT|p|pOR_*0RsNEK!?ro$l>tf3W(hd&UC6%P}j zieut(`iBR+v=h9~y z_(pDwV#9TRaF_|y?Fue!qNTTKg67Z``9fUZ=YlR>^|1hE8mgD0N<0f#Kry+m7Wt|K zPnM#2ou8D1nf;9E?j?lIm1cu-f|UoZ)_A z&DH>yG+3DfLcuI)sIjkV+Y8gDA1{Qgz?7tr6}fZHVJ9iKaKX*_Qa8*tRHD{&aePEN%xCMM&ThDnjrvb=h=9n~C3CsJu>U;vML_i?Tj) zL)@fGES4KBTTrFjjK16vs)wBgRJ)!VcQjWq&Td3kSI(A3yCh{g{feUC5gG+>MjK-7 zXV?;f6-SO?8zfh);70lU8%}!u@G+f5%*yi{Qk2*=(#4J1z9S;3fU zo}ZDo6O116#Sgh}Su=A5M|9t8U;o%b?3Yl^aE&g-y7dt92{a7dVTP{b%ci+~j+-U8 z<%Qk1$Z>(pv^xcdSn6PgjA!kq5RB{Sx6eyZ&8Fv z?zYfEUxgplkDhQUem$m>kc^0F910bkEX zKH%jgcMhxB2FQn;e)W^{lR1XhS}1;jEZGxT>vwA6Qa^eJ4vIe6`ekRPvbA)SZ?DeWjuUJN zda)BbC{L$mRc@CGEM}f0`QQ~~)}EO>cc0oM$BWp#XcF{>7yrV0vuqr0#%{uAb?^SZ zP8wCzRxhK7u{$-_B+we!AFc0ASPv;WgePz%SLUYdeRCsys&#eghF&e%;_eD|PwCZ$ zoA0dG$H*Z*w7mL$9Wu^lgd8_BxCD%V+$gV_8Mu&>IvyCCZ zz{1**(dk#0!46;+rYJ9gf=KZ5B{_gC}=47r(hgP1;khI)R-#Ds)#*% z_6!LL2@?~OkdTm^oScS+hLx3-kB?7SSXf3zMny$MTU*=6$jHjd%F)r$+uJ)JARs(E zJT5LSEiElKH@CF3w6?aky}iA+w|97WcxGm1Wo2b^b8~-x|Mc|q;o;#)&g0`_Ih8&s z6cjq4l&Fx3+Y$)4n2?v%0H;_51L;t|e0^fSD_8>bk^|oKeRpQm_yXRD8AAYe8qe!!{~JoI@j-2 z2VtJB&#u>F47q)MnoX3K#2yCm8sgDOLCbUj-1be3gj71 zWwUk9N2fygBS)pgi%Bkv8$l0kodIOukFpyfLZZ&1ci9=vWwSxvxkz9im9&8!fgP5$ zqxp!Dcy9OYmiTn0e!p!?9xGcw4cH0oxEdmQFU)UZ2hRszdp&~ z0zn1)tF=B7U+PSA#(l`($Oz~nzJxzCh<<9m`Yt^{W{^n?AKgbMsLt$KU5S|V6ZzWGd9`z35cB(+!~FZy zlF~y)t!xR7crNUOOxBUe- z4WNc+XpUa8bfO`du1tBE@}j292;y8+RFND1{KJfU)s5L>hpBnAIw9k*?Xr)J!~96y zT-`JTVv`|})@(X%3*Hlpz`y6d;CzKdp;oH-#2i4~?rMRI(NdhP*6oOH!y_h?~N zRQsg@XhWCDMsH@yWXW>VdN?qN#|$40e50M{9CGLni`5*b!CO~cKRkf$hRgSKZnavL z0YijJQX$snk%5anmibJY=4h#%m*gZ$pv!vU(3J+??kfS=xsDFhp4EJ5XikTLOEAY* zs)ow}P-}bMfq)43pxN`Z9tAk4=_xsC4v(|68Ot#@M$S_iV7I#tL^VnjUk2`omQ!1hh{J3AX=GCHUkdo#^Ropqa zG(j96Rn-Pb6R6S?Q}SM5ynJJg0k{G=F5MTy5G?}EC5>Ot-c)D!yM7SHNAT_#J3=bX zb=zFN(eYJip0T$QRAKmX(gu8tzt0G1qiKUxS2zwpUexVdsYLx&`f=gjXs#4L#pSH$ zAv%T3xn{)8tqpNVc5J-b7rT0BTmc;YM)u3@UDac`sauuj^wdD5^Ev3yk>R32ud`}K z&nkHTb`eD$)N_F37$<`sdC86`)Cj1a_ zX#WY8ge_9?BF8^9`g7d)R*OoAZwPvJR>{u9P!QA-;9rH?>qF6=9^!6(AEF2QM0ynea;!%8Jdd(%&_T;j-G&i)6GTQYzFC!> zy4tzP9)X>g`$Yi-DjG^XvvkY-BxTEeg1$0Ap7!Ah8M-6w*IJ`?jlc*c{B$8JPVTej z#nvfJz@s!aXX>Yti3zGBm(E4Tpx{7D)A?`M?xYLhvsi{;<4s1W>9Q(Cw{g9$T5|S1X){*IX0a z>%9}SqOQZ{0kv0Uil!`L)qOSHyJ=yJ4vEs6*Vwl;?+h&~Hvxy-mjd!DI@O53CsVy< zS9w^j96o8m+G+W6f77so?V^kO;|dP4S78N2o4vj;3hbP*TI`rm>FgT4NSGHvRLaYv zTSmEfVY9bKHPRI10`%U||`LE{ZA;#)+{<8|-W zoqB8B>gJ0nQza!L{3RflDWJlBge5z}7Jpcx_w0DEweqc@;BDF`)CQPwgh?e2jOYs+ zr3ZM=M$c0oKRzE4)jYR50lCT-9qfFAhM3Ewl_$4ZUXgjpbgTDOu7gX#mYhD7Qmjp_ z@27kr^eD#1o}*P>v*mee+DduCfz8{Q!r8oonR&z!W)Dh@DS_XPQq~X9zB}gJZ53m6 z&LUr^Hqu};E)g>-@tcA<6L@C8vV$ReH&3_j?n?yg3>I(yjsWu6+0zQQSp;PGx9z;8 zaBX!Z33M~Tf*5MetfN3k2A2ki&7vuCS?R{u%f3d45JU%zyV~I`E&v8ITCpYpC0RLY z6%C6kmlBHj@5NP$(xaMIt*1HbX@#v6_SM3D_BgWP5h1+=D{K`3o-+CE3_2)&idt_W ztk^=mjs{3%;bR$AG_J3U17~>C;l^cH+4_WwW~qO9iQk;Xqxa$3Jo3#q?eewd$I2HL zUS*S9COnyKwZ2-cY@Z2kNqx(_1s^n0>#$AKLstbMob0_y8GH%WUJb4$J)7*P3Dg5i zhx6es2l>r4+4g5=!wXsvLCfGYCAT$j_`8syh0(FNq*976Ds6yxjMq6;pXybNR~pyB zou?xY-lG#&o+Jw$n-^2DQ!cc*p2&MNraW<;03P3npA=taAbO?lD=F7~HO%JB(6H#XD&?-4}{?C`buLB2|t$7(eo`gH@{ zX(4+rs}#zOZ6@Pc8{K@mO{KHJPUd`&^QD|H@$#b*>&ye=wJC(qRc7BpU~bT9cIHWHAk%G55-YsmxLCTjzLeVD*@l<#R>R>~ zkhsIO8DyZ1bo%+SZgV$*8Dq0U5^jk{*8P*G4p_TbqOocYs=Dv#g)dCIo#6ZW5SOx! zljze3iP+e$scfE_6HoB<`VD+zj^<*;=W}VTIv-5nfnc*w%snJ!or8AUJ+rs5uKNC4 z>k-|pJAl}s?taia_zGz3vz(e$dl{$I&nKyp<9};^**TB=3T*qbb3Vw#(^Eh(PbJ~p z149RsZ}35G)D8z!ou7T>{ql3d+Y{--tButVyr&Sd!E_fqEOW0*R_h8Jt|&>TX2Q7| z0hV;Ty@d8$Ag>DHe`9B5kggeVl6<+{f%+g=N*K2TSZzakW_CdJA+v0I|C0 zo_@u!F=Itz+-o>9Zs8Ja+-=cE?jt`8alH&Wx~w!CwOcQjHs4VC3~Vo^Sp!8^BsT+7 zJM06v&hA6UX4_j_1W7I%_cKD0+|3$%Z6K?4)F`8O+n1cSuXH>ul20~D(w?4qN2xwI z$!E$sB1vlb)?uer49$R9I1@7JdGOiRit%b*x4o`{@zNUwXCi9%524>MJ>yDvWL%_c zHG=NiGWi!=e$Jl|?r*g_G$P3phY3YU6)gt&O_Zu9QtawEt+U6r+>nWh9t9=UZS`f^ z?YUb1I>4zpB|RsLcH0z+JHQqkd~ge)>L7;k4854msL6?Z$sk?#0yti@Is2-aXG^Vi z_^h(Q*2A+b{V+ok>|PJ%C{;>fSf@X48DBgaisBu&Fro<@o>^nns!?o0c<)V@6Ezm? za&+jLp|l~Di3wyEX^gm}lf_#k5`L4J*d^!-xSH!|n^*Sc=c5Zx{7x_|sJWObco@Ed z>A4Nih@Iy_Y`8y*Q+>hg0X%MQKfHCT_vB37C9J$R7-{azq-)Z$C8G!KSLfCX4aL&dRLaGGeqS? zZe=ph`awRGdf1DU^Y{uh?Db>dxXRiSuh@BW1zd%t6_t@Oo0cDP95y932lzMkOCVXD zeSxR7-l_S^tINd&HTFn7tDno3f3IHtvibGb`x!9(J8t@O^J^;pdq)1b=_Q8!*F^pE z=|3DDqA&Ck`|5~`{~kt z{*C`&kN|I<4ETlt4VQ2#I5J(=*gb@5+VXLb6HL@%*zg()K{>gkOMl$4mfXoax8 z|KF!S{>&bAG;wmW0GR!j0147ud%wwn=5wUieNA*4V5Q6wlZuu#5loKxVrf-IqM9@8 z`G-?UhqM*FwJ+%tMa!gXC_Lzml!@^tNKJ5SA<$y2yXpoyu5#6hV@coLyQ zugM;G3AV(+YYC!nj3iqTxmdEZk`dWcY?aNG%?r*>J*G~|h~I2ZUvou8Z)_S{Z*Fbn zCA0yNFJLpLJ}C81O%@wkQFgM9R!;*L3~KMddmhraj*{%K0~{|72E`YW14<9*-t;M` zIoAB(&pdmFozAo?MQVi3lbYy(y&*GHKV6I2`;dWFHufwn zk0=C!Eqbv`g}pW1J1xDrS8#k)BvO=Hif>Aop&rIqTyygZ`9dD3F zdz4cS!xWZUHblBB$M)Auo9hSoRMB%l?vE9rGcrGRpwoP63eWlTkKTGK>dH_+MdTUeOL-GXS{xjFp>bE z&kOD?#=YtVmho{XybaQ=^jA_tQ6R=m60M=c*}}SMz!I+PSJ_1ChN#q0JuU2}D7fCr zNFRCQAEv`RD#JC%N>bgQ_)LW^UOD4hh^&KYlHd!pzseD|!b|1s5!m!bc*l4$HfL|M zaBtceP{Bm?hrW?j!hy}}YASGw9!&{Ef76|F2g);TrHBLcn%TYu!5@iZW-=5Fsdm0T zw%#6Ykw;w9Qr@npQj7PWw!P79VHEW}6?SST%iw?K$KbQ^Ss;{x`PofIZZxsTJiZ}! z=_6X4z&bG#5||*^Iw(^`7fp_?OG5J;;fyI{Ut544buAN9iq9#o16~+mXhM7&`@)3j zS!dy!^#$Y!#Z=PTm`Y4$QzGPqOStw=?IL$n-(k)#P?_e46to+A>bEk349K{$J5cYw zZMz8Kzd{oT|2iDm=8S~YM)zJq+~?(fyVmK-XUT|KF^BQUm%YjQsgl2p%6^==tgp@A+UldNL`)CSAq|}5zVv&`vV;* zg*yM$SH|l?ww-e3UtC7mQB{>%lU=vzYyh|4 za-FRnD%ZQX6S;go zx`Ks*dQSK2ZTVm2i(@}IOgS+XA$lo!amN4T-9M$Al*b7HdP&j5uDFBx8(8u{1;X|< zMKhRrFS0JblXid94~<>M)w16x`Gh62$jsFCctg(78dp1uZpcFX>T+nl4BFb;tjc!b z>Y?;OzZGP;iA8`CwpCXkHvW5AtrPLoWb#4Q=Cxd)@avwR38^#DrDovKg4cQeDS zyRb`Xs!qg|ghZt0OnIaGzyD|+Om31tzf?zR7N}&=S^`j*7!cN3+PpD+XJ&PfwL8IN zKR-_oyBkrmN0? z{sok%3v1}i@)xARXC_iGN;lKdrtRpDK6jVDrT28m4)?P@rT5T1Szb}*88jBu-&f5% znf?#-tA^&kx&Cko)X%bt-$~`E`_EM}f0q9{=f8GIen0;Cbp3Cn->YW+9_43w$nVtm z)ctRiKUUHFpW@v81bq6^Y>tX zR;lnWz<#g7`FoT<8yff*D1WTV`For{PatgQ|7oB6hd9V+qR7Nb7e}ctZM* z_jsz>`8A1uasDy8@#pT_?-cd4_4a$g%763yF{eE;}f-@jhheSbdJ{eIo=`+dJY@7L#{?d1zn z;`_u!L`0-4E}Geih-`w1i2NiXws~U)%rtzx0p7OO;Paa{ZIY0Xkd>9)zkmPX!-v(> z)U>s=4Gj%VOiZk-tiWKfv$L~@hX(`#2@Vd1!{M>9u}Miu>FMb?IXQ)eg-9f_wzjsp zxtTy9bai!+$>fodk%@_kxw*OJz`X(&SE2kF5nYJGLBjmD}{wu#iMoW^*nXQ$D^_ z9kyvZdLVs^!J{-@N>(!LY%ZTZr@cowT<&Q2E}H5edW(>Laq>(YF(Rj(#wAuiD_9CB zq@ZQGrtvj~?*&bQ8@@b;=e7#2K!wxGR+>@s4~E`H)$vXb)aTc`Y8$;YpBDXyn4g<4 zU4_Ot3zdGtHCvod(dz1ialCBYCK=w@4!FhGXv;cyM~Qh6W0#L-oB!-YVm++9SX|rm zs>~5Bnky60-)+jnF)m!%|86m@AC@OO_-#U! zew!tT-ieG+%?!iE=%l5E0^`VW>+M$-7Ci#mr}aZFKH_oJvB2TIU%mw3N{T+QJ0@;% zW9Nfas%0moAzY_d*=>;|yQ`K}n4tKeBVJ5~IR)ei=+Sw2-utSp3)8rXW^@#k>rK)l z8Ui(TkXl%wEe96o5CC}QwATun@89JwbT%6Qs2j?YX5F{P36(fE1_0@f2wg<%TP2Rz zf?L`Ke2Ae5cw|XscVR?Np9=dnE==i^U^^!el5kQ;3=Mz7Q2VaJ$)iZZtxJ~aEjA&o z697S#^1n5VC-E)?^#v-0sA7@ENeIMp3-)AuQ(NLCA^3vkar zw9lvVft?Y_&s`Yy(rGcF4TzHW4)G9vr%cZzKzTupj~p-^efepv(Nf?LQR&lc`W^Ho z-+Y67NNLZ22QyEHaAl?j9n*A{JF7m4Bst<<@0NYo$_J}Z0Eb>jWSa7%wha1*#{m`B zA?NbQk|`*7Dl^D<0r|?`;B@nA@Rv0MF|p!j_Rgl(UN>DaT05z;L3wPap0D2qTW}=! zETa7mEtK?j{i<`xHa6*b`qY}6l!7u7SScTwg=FATb9p)7;PI$jtV?OqzzX|)^s|Jq zQTjvaozIC(!HX<6^fj3LR*ub=LU_=Mz8bW~pmXTtMPwf)Q@z5Desra#!h;u5T3S{3 zY^x(V0=?=ZZ1MI@bJ(xh6-bW`xI^i#8$vRsyzdapUQaN>Aqt~@Jz!h|Gc7kv)G4{R z^$$liu|C>^o~R8Uz}0@5PhsSav6Y41TWAuG$7$u|JmTcyOg;a|{kJYH?RVq+a=YTq zcU%Y}FNIXXfnv=H#2mBh=G6qD|Eph;WZb5)e52Q&wiamhuuE?=DUu$le?N|kq55zD z1&PBis=P}}FBvwtM#Opm)XOUPG7r%zb4X*EPEMxBF>;0V!NQz2U0J1GccEKM+FkWK z1t%BE?1KkbU$}Zxk&Fm;I$u4!*6CJk=YEhyqQ7rS9JTFM@u};+GTC^}VPz1LQ*ZKM z1QXNBHMSmVX_0OlEw=m#aHpNa(*2-<;j}Yx%|-LZrmT4^Y`I>FLA(yT*yAgO)O zcc}NU0V?+P%s4~ZO{}m2JHj(A*Z98DdR=C-^U>*54y?!eU4(-ms@^gBNA>F~Uv?X1M*Jtr?=d-Zd<-YF+nky*?xxkxcP#D~y$CYz(%xBn< zH#5kBWAJJ9=c5|0yJh9vRVl+0X?;r1QqfJk9AmWWc@TV9lXJ{}CzQ(!rt!-*D^j7~ zE_xmsT&+gj4|6n;-v)2#U6d#*44Xu*UPHCWi1CACcH}5;taga9&d( zTpe$%uT6JXF{Um>*{=ZhTb*UD^7HM4fNy70JuX*2rf!4%%t2qcDGeJII%?OIkf4%O zmv&C!+eh+qpj4K{Zc7-I&tx=^eGu!4Rg43;bq;Pa(&k?q~v+FFl=tuFe9Vn0M zW|kl~w{qh&9?C=(r_Re}4>$i%%p1FvV9-5%S@#)MuETS&mfzwkLBT3Ss@G2i*!u^D zZ3R5VKPZ%7AOhZ{rS)%d9V-&pYm-MPXU4mtzc!Nmv@74;eZKF_FCSKvS;23R>TQis zwbOY)kGat5YlHq=*5}q9OiY=4R&o-l_EeP+&^9ltm}}joHbx89sm9>iuf^RP9Nl+R zjY8$!mf<<|^eK9Xc0ekY!)}LLFS0`D@6DjE!Ph`-gX;A6$`$l?z!NB1;QWnhi1lI<1LIlqD@@(;K7pUO!1UBd-*+9DKG*X}~7 z!uF1k-`kf^#IBD4X9?>-h-#gj0kavMXO>0XRrkSrcC}G6Eiu)Va&0cq7yqE5(uBi^$Rm`+psLP%y?iSu`6@(!(_>Kv6jO0fQPI&c!ZpA56Z-j=wJv3so+nJ`2fcX;$`?-`kXrn3Z=_if>8e98s+iKa zcI<@sadE)caX4>~g*WW{wXW{uCw zd!fx-S4nv6u z+^&z%@>d1+RT%0B=Yp;L6?1TDZt9y+{{cY#2@{CToPARCtZu%TIFImp$$2?E7zOeGIs_2HFvC9z6Xw-6 zp(CB4+D==bB!$iwV{7t**zB%hCm!%tLJlZ=jFt3%iJikez3DHJN1lV5pwD(5DnLJ~ z2YZe*jI;2|-2!+|9~Y)P+%mD!|Fl2!L?KLaR?XWW9ad@Jq8owBIDItznShE%$=mH% zZ5DgX46Y)6jCVk4#9UYHt4yQbPMo-W0Hdd~@k*uqKIUqGDiq#r>nE2qMj;xaLWR}# zj2+)G>dPfM1Z@kc)xbPWc9S|KHvkplHl0U_58+%gQKAb$+GK&|cW>VQFsnH~<00bR z!QQpOF`#Ea{}?18b|x`suMLTAgxVZE?6J@ly+^U~G~HpUBy=o8iMA1T`}%&n$|jd{ zB@2u-Za*SJiuKZIN#lfFOFCL^lULNq>}4kP#=WH+VWcGRRk5_vX#|_OK=4;85a+l) zDeUvR@T**J97G~tRfkZxEQoWfVw_*?&Zc7zKE}Wv^XXaR@~=Ji>~aZ=IqD40cjr8V zbS3TLr7w(;B^d#hx!>q6*w%eMn%Fxp_moGz;%_K*?AQuT4T6nF^VwB3L^tq~KhM>mu>C{k88K16F8+B)ZDl0-39{C~aC6)|5F7oN&&wLuJuw-PM`)<4 z=6B#0)z>1RN_Xn`M0f(1;TcWOepSm!cY1Gl5nOP8Er^4sNGh-bx8o`CUND%kZ4o%* zTjb6gvW7&#rJmcnnbpPlT=@1U8ON6_7r38C6ZdYkkQnb7R+kmu-Yl z>KjjY2KZ>pXwG8To{f6IhMC5jlJ5>LB!+R~7da@Op4;P;x!VQ>T=F;c#oQ-eZVs`ZI zOt#$()0g(e{tuVY8d&Jy7O#V<6c+o-i05cgYmkeLC+(O`h@xtQJfq>zAN7-{-%&fQW}4ZzkWng8)#z6I=IGTW3mu07+~C(heO_N*n+@pdqyzoL zJ9Fu%rAX;In?d$2Nys3}O|a3@Ts^zS!4x zu~C@7NLWSg0^%YoqMoIT1Z8QApZwNHqAqr(o+bHtsKs@W$F!YlY~O6V0#`3c?M(|^ zTnIyeK3n9;GIUHEk~!+ud#Q>h$MRmh1;#+RLoH1dJGhaddeVze`?`SFsoB7Vq!C%z zB=p)-ih($W&rZK8dODKv72CY97G4hnWY6qJ@!h(y_&oJDPJstcGUloa>ov7luqIzF z5m{ZwejDQbJek=%)jqyjjd{T+B45b!a5u8)R4QNg-P_igJ53%3ohOXY2M}hLOxLXP z*zcLqC|5b^QHs2cnofN$D;-t46!nziYqQ6OHUjSM4QQOYq#IBkFfYFvL}Oatm^0q+ zddt4sxg6@Sy-tcN|EzhSqL!e4#yUu0)=U|reuMbpSBL~82B9}^La^Ow!4Om5!)7Z=5zO#lD@ literal 0 HcmV?d00001 diff --git a/m18_clipboard.bat b/m18_clipboard.bat deleted file mode 100644 index 7fa5375..0000000 --- a/m18_clipboard.bat +++ /dev/null @@ -1,28 +0,0 @@ -@echo off - -echo *************************************************** -echo ** Runs m18.py with spreadsheet output and ** -echo ** copies to clipboard. You will not see output, ** -echo ** just a completion message. Then you can ** -echo ** 'ctrl+v' into a spreadsheet ** -echo ** ** -echo ** THIS WILL TAKE ~10 SECONDS ** -echo ** ** -echo ** RIGHT-CLICK AND EDIT .BAT FILE. ** -echo ** CHANGE "--port COM5" to where your adapter is ** -echo ** (you can delete this message) ** -echo *************************************************** - -python.exe .\m18.py --ss --port COM5 | clip.exe - -echo: -echo *************************************************** -echo ** Finished. Now use 'ctrl+v' to paste ** -echo ** diagnostics output into spreadsheet ** -echo ** ** -echo ** If you get errors, you must edit this batch ** -echo ** file to have the correct port. You may also ** -echo ** have hardware issues. See github ** -echo *************************************************** - -cmd /k \ No newline at end of file diff --git a/m18_health.bat b/m18_health.bat deleted file mode 100644 index 65b4117..0000000 --- a/m18_health.bat +++ /dev/null @@ -1,15 +0,0 @@ -:: RECOMMEND RUNNING m18_idle.bat BEFORE CONNECTING TO BATTERY -:: Gives simple health report of M18 batteries -:: Add "--port COM5" (or whatever your port is) to avoid -:: having to enter it everytime - -@echo off -echo *************************************************** -echo ** RIGHT-CLICK AND EDIT .BAT FILE. ** -echo ** ADD "--port COM5" to command ** -echo ** (or whatever port your serial adapter is on) ** -echo ** (you can delete this message ** -echo *************************************************** - -python.exe .\m18.py --health -cmd /k \ No newline at end of file diff --git a/m18_idle.bat b/m18_idle.bat deleted file mode 100644 index e553f3f..0000000 --- a/m18_idle.bat +++ /dev/null @@ -1,14 +0,0 @@ -:: Puts serial adapter TX in idle (low = <1V) -:: This prevents false charge count increases - -@echo off - -echo *************************************************** -echo ** RIGHT-CLICK AND EDIT .BAT FILE. ** -echo ** ADD "--port COM5" to command ** -echo ** (or whatever port your serial adapter is on) ** -echo ** (you can delete this message ** -echo *************************************************** - -python.exe .\m18.py --idle -cmd /k \ No newline at end of file diff --git a/m18_interactive.bat b/m18_interactive.bat deleted file mode 100644 index 92c0864..0000000 --- a/m18_interactive.bat +++ /dev/null @@ -1,5 +0,0 @@ -:: RECOMMEND RUNNING m18_idle.bat BEFORE CONNECTING TO BATTERY -:: Runs script in interactive mode -:: All functions available - -python.exe .\m18.py \ No newline at end of file diff --git a/m18gui.py b/m18gui.py index 5744bd0..14bac7f 100644 --- a/m18gui.py +++ b/m18gui.py @@ -13,7 +13,6 @@ def ensure_module(mod_name: str, pip_name: str) -> None: return except ImportError: pass - install_root = tk.Tk() install_root.title("M18 GUI - Installing dependencies") install_root.geometry("420x120") @@ -27,7 +26,7 @@ def ensure_module(mod_name: str, pip_name: str) -> None: ) label.pack(padx=10, pady=10) progress = ttk.Progressbar(install_root, mode="indeterminate") - progress.pack(fill="x", padx=3, pady=(0, 3)) + progress.pack(fill="x", padx=10, pady=(0, 10)) progress.start(10) install_root.update_idletasks() try: @@ -56,7 +55,6 @@ def ensure_module(mod_name: str, pip_name: str) -> None: ) sys.exit(1) -# Ensure dependencies for m18.py ensure_module("serial", "pyserial") ensure_module("requests", "requests") @@ -76,6 +74,7 @@ def __init__(self): self.custom_max_raw_var = tk.StringVar(value="6000") self.custom_max_amps_var = tk.StringVar(value="6.00") self._sync_in_progress = False + self.port_map = {} self.create_widgets() self.refresh_ports() self.update_profile_display() @@ -83,7 +82,6 @@ def __init__(self): def create_widgets(self): self.notebook = ttk.Notebook(self) self.notebook.pack(fill="x", expand=False, padx=10, pady=(5, 0)) - self.main_tab = ttk.Frame(self.notebook) self.console_tab = ttk.Frame(self.notebook) self.sim_tab = ttk.Frame(self.notebook) @@ -92,13 +90,11 @@ def create_widgets(self): self.notebook.add(self.console_tab, text="Interactive Console") self.notebook.add(self.sim_tab, text="Simulation") self.notebook.add(self.about_tab, text="About") - - # --- Main Controls top_frame = ttk.Frame(self.main_tab) top_frame.pack(fill="x", padx=5, pady=(5, 0)) ttk.Label(top_frame, text="Serial port:").grid(row=0, column=0, sticky="w") self.port_var = tk.StringVar() - self.port_combo = ttk.Combobox(top_frame, textvariable=self.port_var, state="readonly", width=25) + self.port_combo = ttk.Combobox(top_frame, textvariable=self.port_var, state="readonly", width=55) self.port_combo.grid(row=0, column=1, padx=5, sticky="w") ttk.Button(top_frame, text="Refresh", command=self.refresh_ports).grid(row=0, column=2, padx=4) self.connect_btn = ttk.Button(top_frame, text="Connect", command=self.connect_device) @@ -123,7 +119,6 @@ def create_widgets(self): mid_frame, text="Copy all registers to clipboard", command=self.cmd_clipboard, state="disabled" ) self.clipboard_btn.grid(row=0, column=2, padx=3, pady=4, sticky="w") - # --- Interactive Console console_frame = ttk.Frame(self.console_tab) console_frame.pack(fill="both", expand=True, padx=5, pady=5) @@ -141,7 +136,6 @@ def create_widgets(self): console_btn_frame, text="Clear input", command=lambda: self.console_text.delete("1.0", tk.END) ) self.console_clear_btn.pack(side="left", padx=5) - # --- Simulation sim_main_frame = ttk.Frame(self.sim_tab) sim_main_frame.pack(fill="x", padx=6, pady=6) @@ -245,7 +239,9 @@ def create_widgets(self): scrollbar.pack(side="right", fill="y") self.output_text.configure(yscrollcommand=scrollbar.set) self.custom_frame.pack_forget() - + # ------------------------------------------------------------------------- + # Utility Logging + # ------------------------------------------------------------------------- def log(self, text: str, clear: bool = False): if clear: self.output_text.delete("1.0", tk.END) @@ -258,22 +254,34 @@ def sim_log(self, text: str): def set_status(self, text: str): self.status_var.set(text) + # ------------------------------------------------------------------------- + # Port Refresh + # ------------------------------------------------------------------------- def refresh_ports(self): ports = list_ports.comports() - port_names = [p.device for p in ports] - self.port_combo["values"] = port_names - if port_names: + display_names = [] + self.port_map = {} + + for p in ports: + label = f"{p.device} — {p.description} ({p.manufacturer or 'Unknown'})" + display_names.append(label) + self.port_map[label] = p.device + + self.port_combo["values"] = display_names + + if display_names: self.port_combo.current(0) else: self.port_combo.set("") + self.set_status("Ports refreshed") + # ------------------------------------------------------------------------- + # Helpers + # ------------------------------------------------------------------------- def require_connection(self) -> bool: if self.m18_obj is None: - messagebox.showwarning( - "Not connected", - "Please connect to a port first." - ) + messagebox.showwarning("Not connected", "Please connect to a port first.") return False return True @@ -287,49 +295,50 @@ def capture_output(self, func, *args, **kwargs) -> str: sys.stdout = old_stdout return buf.getvalue() + # ------------------------------------------------------------------------- + # Connect / Disconnect + # ------------------------------------------------------------------------- def connect_device(self): - if self.m18_obj is not None: - messagebox.showinfo("Already connected", "You are already connected.") - return - port = self.port_var.get().strip() - if not port: + selected = self.port_var.get() + if not selected: messagebox.showwarning("No port", "Please select a serial port first.") return + + port = self.port_map.get(selected, selected) + try: self.m18_obj = m18.M18(port) except Exception as e: self.m18_obj = None - messagebox.showerror( - "Connection error", - f"Failed to connect to {port}.\n\n{e}" - ) + messagebox.showerror("Connection error", f"Failed to connect to {port}.\n\n{e}") self.set_status("Connection failed") return + self.set_status(f"Connected to {port}") + self.log(f"Connected to {port}", clear=True) + self.connect_btn.configure(state="disabled") self.disconnect_btn.configure(state="normal") self.idle_btn.configure(state="normal") self.health_btn.configure(state="normal") self.clipboard_btn.configure(state="normal") self.sim_start_btn.configure(state="normal") - self.sim_status_var.set("Ready for simulation.") - self.log(f"Connected to {port}", clear=True) def disconnect_device(self): self.stop_simulation() + if self.m18_obj is not None: try: - try: - self.m18_obj.idle() - except Exception: - pass - try: - self.m18_obj.port.close() - except Exception: - pass + try: self.m18_obj.idle() + except: pass + try: self.m18_obj.port.close() + except: pass finally: self.m18_obj = None + self.set_status("Disconnected") + self.log("Disconnected") + self.connect_btn.configure(state="normal") self.disconnect_btn.configure(state="disabled") self.idle_btn.configure(state="disabled") @@ -337,28 +346,26 @@ def disconnect_device(self): self.clipboard_btn.configure(state="disabled") self.sim_start_btn.configure(state="disabled") self.sim_stop_btn.configure(state="disabled") - self.sim_status_var.set("Simulation idle. Connect to a battery to enable.") - self.log("Disconnected") + # ------------------------------------------------------------------------- + # Commands + # ------------------------------------------------------------------------- def cmd_idle(self): - if not self.require_connection(): - return + if not self.require_connection(): return + def work(): try: self.m18_obj.idle() - result = ( - "TX should now be low voltage (<1V). " - "Safe to connect the battery." - ) - self.after(0, lambda: self.log(result)) + self.after(0, lambda: self.log("TX now low (<1V). Safe to connect battery.")) self.after(0, lambda: self.set_status("Idle (TX low)")) except Exception as e: self.after(0, lambda: messagebox.showerror("Idle error", str(e))) + threading.Thread(target=work, daemon=True).start() def cmd_health(self): - if not self.require_connection(): - return + if not self.require_connection(): return + def work(): try: output = self.capture_output(self.m18_obj.health) @@ -369,11 +376,12 @@ def finish(): self.after(0, finish) except Exception as e: self.after(0, lambda: messagebox.showerror("Health error", str(e))) + threading.Thread(target=work, daemon=True).start() def cmd_clipboard(self): - if not self.require_connection(): - return + if not self.require_connection(): return + def work(): try: output = self.capture_output( @@ -385,29 +393,30 @@ def work(): def finish(): self.clipboard_clear() self.clipboard_append(output) - self.log("Register data copied to clipboard", clear=False) - self.set_status("Registers copied to clipboard") + self.log("Register data copied to clipboard") self.after(0, finish) except Exception as e: self.after(0, lambda: messagebox.showerror("Clipboard error", str(e))) + threading.Thread(target=work, daemon=True).start() + # ------------------------------------------------------------------------- + # Console Executor + # ------------------------------------------------------------------------- def run_console_code(self): code_str = self.console_text.get("1.0", tk.END).strip() if not code_str: - messagebox.showinfo( - "No code", - "Please enter some Python code to execute." - ) - return - if not self.require_connection(): + messagebox.showinfo("No code", "Please enter some code.") return + + if not self.require_connection(): return + def work(): buf = io.StringIO() - old_stdout = sys.stdout - old_stderr = sys.stderr + old_stdout, old_stderr = sys.stdout, sys.stderr sys.stdout = buf sys.stderr = buf + try: env = {"m": self.m18_obj} try: @@ -417,206 +426,156 @@ def work(): finally: sys.stdout = old_stdout sys.stderr = old_stderr + output = buf.getvalue() def finish(): self.log("=== Console execution ===") - if output.strip(): - self.log(output) - else: - self.log("(no output)") - self.set_status("Console code executed") + self.log(output if output.strip() else "(no output)") self.after(0, finish) + threading.Thread(target=work, daemon=True).start() + # ------------------------------------------------------------------------- + # Profile Logic + # ------------------------------------------------------------------------- def on_profile_changed(self, event=None): self.update_profile_display() def update_profile_display(self): - profile = self.sim_profile_var.get().strip() + profile = self.sim_profile_var.get() if profile in self.sim_profiles: - cutoff, max_current = self.sim_profiles[profile] - cutoff_amps = cutoff / 1000.0 - max_amps = max_current / 1000.0 + cutoff, maxc = self.sim_profiles[profile] info = ( - f"Profile '{profile}': " - f"Cutoff = {cutoff} ({cutoff_amps:.2f} A), " - f"Max = {max_current} ({max_amps:.2f} A). " - "Simulation only. No real charging current flows." + f"Profile '{profile}': Cutoff {cutoff} ({cutoff/1000:.2f}A), " + f"Max {maxc} ({maxc/1000:.2f}A). Simulation only." ) self.profile_info_var.set(info) self.custom_frame.pack_forget() else: - self.profile_info_var.set( - "Profile 'Custom': use the fields below to set cutoff and max. " - "Values are for protocol simulation only." - ) + self.profile_info_var.set("Custom profile: adjust fields below.") self.custom_frame.pack(fill="x", padx=5, pady=(0, 8)) def on_custom_raw_focus_out(self, event=None): - if self._sync_in_progress: - return + if self._sync_in_progress: return self._sync_in_progress = True try: try: - raw = int(self.custom_cutoff_raw_var.get().strip()) - if raw < 0: - raise ValueError - amps = raw / 1000.0 - self.custom_cutoff_amps_var.set(f"{amps:.2f}") - except ValueError: - pass + val = int(self.custom_cutoff_raw_var.get()) + self.custom_cutoff_amps_var.set(f"{val/1000:.2f}") + except: pass try: - raw = int(self.custom_max_raw_var.get().strip()) - if raw < 0: - raise ValueError - amps = raw / 1000.0 - self.custom_max_amps_var.set(f"{amps:.2f}") - except ValueError: - pass + val = int(self.custom_max_raw_var.get()) + self.custom_max_amps_var.set(f"{val/1000:.2f}") + except: pass finally: self._sync_in_progress = False def on_custom_amps_focus_out(self, event=None): - if self._sync_in_progress: - return + if self._sync_in_progress: return self._sync_in_progress = True try: try: - amps = float(self.custom_cutoff_amps_var.get().strip()) - if amps < 0: - raise ValueError - raw = int(round(amps * 1000.0)) - self.custom_cutoff_raw_var.set(str(raw)) - except ValueError: - pass + amps = float(self.custom_cutoff_amps_var.get()) + self.custom_cutoff_raw_var.set(str(int(round(amps*1000)))) + except: pass try: - amps = float(self.custom_max_amps_var.get().strip()) - if amps < 0: - raise ValueError - raw = int(round(amps * 1000.0)) - self.custom_max_raw_var.set(str(raw)) - except ValueError: - pass + amps = float(self.custom_max_amps_var.get()) + self.custom_max_raw_var.set(str(int(round(amps*1000)))) + except: pass finally: self._sync_in_progress = False def get_profile_currents(self): - profile = self.sim_profile_var.get().strip() - if profile in self.sim_profiles: - return self.sim_profiles[profile] + p = self.sim_profile_var.get() + if p in self.sim_profiles: + return self.sim_profiles[p] + # custom try: - cutoff_raw = int(self.custom_cutoff_raw_var.get().strip()) - max_raw = int(self.custom_max_raw_var.get().strip()) - if cutoff_raw < 0 or max_raw <= 0: - raise ValueError - if cutoff_raw > 20000 or max_raw > 20000: + c = int(self.custom_cutoff_raw_var.get()) + m = int(self.custom_max_raw_var.get()) + if c < 0 or m <= 0 or c > 20000 or m > 20000: raise ValueError - except Exception: - raise ValueError( - "Invalid custom cutoff or max current values.\n" - "Please enter positive integers less than 20000." - ) - return cutoff_raw, max_raw + except: + raise ValueError("Invalid custom values.") + return c, m + # ------------------------------------------------------------------------- + # Simulation + # ------------------------------------------------------------------------- def start_simulation(self): - if not self.require_connection(): - return - if self.sim_thread is not None and self.sim_thread.is_alive(): - messagebox.showinfo( - "Simulation running", - "A simulation is already in progress." - ) + if not self.require_connection(): return + + if self.sim_thread and self.sim_thread.is_alive(): + messagebox.showinfo("Running", "Simulation already running.") return + try: - duration = float(self.sim_duration_var.get().strip()) + duration = float(self.sim_duration_var.get()) if duration <= 0: raise ValueError - except ValueError: - messagebox.showwarning( - "Invalid duration", - "Please enter a positive number of seconds." - ) + except: + messagebox.showwarning("Invalid duration", "Enter a positive number.") return - sim_baud_str = self.sim_baud_var.get().strip() + + sim_baud = self.sim_baud_var.get() interval_map = { "1200": 1.0, "2400": 0.75, "4800": 0.5, - "9600": 0.25, + "9600": 0.25 } - keepalive_interval = interval_map.get(sim_baud_str, 0.5) + keepalive_interval = interval_map.get(sim_baud, 0.5) + try: - cutoff, max_current = self.get_profile_currents() - except ValueError as e: + cutoff, maxc = self.get_profile_currents() + except Exception as e: messagebox.showwarning("Profile error", str(e)) return - profile_name = self.sim_profile_var.get().strip() - cutoff_amps = cutoff / 1000.0 - max_amps = max_current / 1000.0 + + pname = self.sim_profile_var.get() + self.sim_stop_event = threading.Event() self.sim_thread = threading.Thread( target=self._simulation_worker, - args=( - duration, - keepalive_interval, - profile_name, - cutoff, - cutoff_amps, - max_current, - max_amps, - ), - daemon=True, + args=(duration, keepalive_interval, pname, cutoff, cutoff/1000, maxc, maxc/1000), + daemon=True ) self.sim_thread.start() + self.sim_start_btn.configure(state="disabled") self.sim_stop_btn.configure(state="normal") - self.sim_status_var.set( - f"Simulation running ({profile_name}, simulated baud {sim_baud_str})." - ) + self.sim_status_var.set(f"Simulation running ({pname}, baud {sim_baud})") + self.sim_log( - f"Starting simulation for {duration} seconds - " - f"profile {profile_name}, " - f"cutoff {cutoff} ({cutoff_amps:.2f} A), " - f"max {max_current} ({max_amps:.2f} A), " - f"simulated baud {sim_baud_str}, " - f"keepalive interval {keepalive_interval:.2f}s." + f"Start {duration}s, {pname}, cutoff={cutoff} ({cutoff/1000:.2f}A), " + f"max={maxc} ({maxc/1000:.2f}A), interval={keepalive_interval}s" ) def stop_simulation(self): - if self.sim_stop_event is not None: + if self.sim_stop_event: self.sim_stop_event.set() - def _simulation_worker( - self, - duration, - interval, - profile_name, - cutoff_raw, - cutoff_amps, - max_raw, - max_amps, - ): + def _simulation_worker(self, duration, interval, pname, cutoff_raw, cutoff_amps, max_raw, max_amps): m = self.m18_obj if m is None: - self.after( - 0, - lambda: messagebox.showerror( - "Simulation error", "No active M18 connection." - ), - ) + self.after(0, lambda: messagebox.showerror("Simulation error", "No connection.")) return - old_cutoff = getattr(m, "CUTOFF_CURRENT", None) + + old_cut = getattr(m, "CUTOFF_CURRENT", None) old_max = getattr(m, "MAX_CURRENT", None) m.CUTOFF_CURRENT = cutoff_raw m.MAX_CURRENT = max_raw - begin_time = time.time() + + start = time.time() + try: - self.after(0, lambda: self.sim_log("Sending reset and initial configure...")) + self.after(0, lambda: self.sim_log("Reset + initial negotiate...")) try: m.reset() except Exception as e: self.after(0, lambda: self.sim_log(f"reset() failed: {e}")) return + try: m.configure(2) m.get_snapchat() @@ -625,46 +584,39 @@ def _simulation_worker( m.configure(1) m.get_snapchat() except Exception as e: - self.after(0, lambda: self.sim_log(f"Initial charger negotiation failed: {e}")) + self.after(0, lambda: self.sim_log(f"configure failed: {e}")) return + while not self.sim_stop_event.is_set(): - elapsed = time.time() - begin_time + elapsed = time.time() - start if elapsed >= duration: break + try: time.sleep(interval) m.keepalive() - self.after( - 0, - lambda e=elapsed: self.sim_log( - f"Keepalive at t={e:.1f}s" - ), - ) + self.after(0, lambda e=elapsed: self.sim_log(f"Keepalive t={e:.1f}s")) except Exception as e: - self.after( - 0, - lambda: self.sim_log(f"keepalive() failed: {e}") - ) + self.after(0, lambda: self.sim_log(f"keepalive() failed: {e}")) break + finally: - try: - m.idle() - except Exception: - pass - if old_cutoff is not None: - m.CUTOFF_CURRENT = old_cutoff - if old_max is not None: - m.MAX_CURRENT = old_max + try: m.idle() + except: pass + + if old_cut is not None: m.CUTOFF_CURRENT = old_cut + if old_max is not None: m.MAX_CURRENT = old_max + def finish(): - self.sim_log( - "Simulation finished. Pack returned to idle. " - "Parameters restored to previous values." - ) - self.sim_status_var.set("Simulation idle. Ready for next run.") + self.sim_log("Simulation finished. Back to idle.") + self.sim_status_var.set("Simulation idle.") self.sim_start_btn.configure(state="normal") self.sim_stop_btn.configure(state="disabled") self.after(0, finish) +# ------------------------------------------------------------------------- +# Main loop +# ------------------------------------------------------------------------- if __name__ == "__main__": app = M18GUI() app.mainloop() diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index a032c50..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,10 +0,0 @@ -[project] -name = "m18-protocol" -version = "0.1.0" -description = "Read Milwaukee M18 Protocol Data" -readme = "README.md" -requires-python = ">=3.13" -dependencies = [ - "pyserial==3.5", - "requests", -] diff --git a/uv.lock b/uv.lock deleted file mode 100644 index 8949790..0000000 --- a/uv.lock +++ /dev/null @@ -1,100 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.13" - -[[package]] -name = "certifi" -version = "2025.8.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, - { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, - { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, - { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, - { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, - { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, - { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" }, - { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" }, - { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, - { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, - { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, - { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, - { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, - { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, - { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, - { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, - { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, -] - -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, -] - -[[package]] -name = "m18-protocol" -version = "0.1.0" -source = { virtual = "." } -dependencies = [ - { name = "pyserial" }, - { name = "requests" }, -] - -[package.metadata] -requires-dist = [ - { name = "pyserial", specifier = "==3.5" }, - { name = "requests" }, -] - -[[package]] -name = "pyserial" -version = "3.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/7d/ae3f0a63f41e4d2f6cb66a5b57197850f919f59e558159a4dd3a818f5082/pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb", size = 159125, upload-time = "2020-11-23T03:59:15.045Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0", size = 90585, upload-time = "2020-11-23T03:59:13.41Z" }, -] - -[[package]] -name = "requests" -version = "2.32.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, -] - -[[package]] -name = "urllib3" -version = "2.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, -] From d3c0333f9603aea3cfb1d175f23509aa28b0e070 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sat, 13 Dec 2025 19:40:04 -0500 Subject: [PATCH 04/61] Added .gitignore, Help Contents.txt, M18.png, and updated the GUI. --- .gitignore | 2 + Help Contents.txt | 121 +++++++++ M18.png | Bin 0 -> 24644 bytes m18gui.py | 634 ++++++++++++++-------------------------------- 4 files changed, 319 insertions(+), 438 deletions(-) create mode 100644 .gitignore create mode 100644 Help Contents.txt create mode 100644 M18.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1c6c50c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Python cache +__pycache__/ diff --git a/Help Contents.txt b/Help Contents.txt new file mode 100644 index 0000000..505d927 --- /dev/null +++ b/Help Contents.txt @@ -0,0 +1,121 @@ +Functions: + DIAGNOSTICS: + m.health() - print simple health report on battery + m.read_id() - print labelled and formatted diagnostics + m.read_id(output="raw") - print in spreadsheet format + m.submit_form() - prompts for manual inputs and submits battery diagnostics data + + m.help() - this message + m.adv_help() - advanced help + + exit() - end program + +Advanced functions: + m.read_all() - print all known bytes in 0x01 command + m.read_all_spreadsheet() - print bytes in spreadsheet format + + CHARGING SIMULATION: + m.simulate() - simulate charging comms + m.simulate_for(t) - simulate for t seconds + m.high_for(t) - bring J2 high for t sec, then idle + + m.write_message(message) - write ascii string to 0x0023 register (20 chars) + + Debug: + m.PRINT_TX = True - boolean to enable TX messages + m.PRINT_RX = True - boolean to enable RX messages + m.txrx_print(bool) - set PRINT_TX & RX to bool + m.txrx_save_and_set(bool) - save PRINT_TX & RX state, then set both to bool + m.txrx_restore() - restore PRINT_TX & RX to saved values + m.brute(addr_msb, addr_lsb) + m.full_brute(start, stop, len) - check registers from 'start' to 'stop'. look for 'len' bytes + m.debug(addr_msb, addr_lsb, len, rsp_len) - send reset() then cmd() to battery + m.try_cmd(cmd, addr_h, addr_l, len) - try 'cmd' at [addr_h addr_l] with 'len' bytes + + Internal: + m.high() - bring J2 pin high (20V) + m.idle() - pull J2 pin low (0V) + m.reset() - send 0xAA to battery. Return true if battery replies wih 0xAA + m.get_snapchat() - request 'snapchat' from battery (0x61) + m.configure() - send 'configure' message (0x60, charger parameters) + m.calibrate() - calibration/interrupt command (0x55) + m.keepalive() - send charge current request (0x62) + + + + +@echo off + +echo *************************************************** +echo ** Runs m18.py with spreadsheet output and ** +echo ** copies to clipboard. You will not see output, ** +echo ** just a completion message. Then you can ** +echo ** 'ctrl+v' into a spreadsheet ** +echo ** ** +echo ** THIS WILL TAKE ~10 SECONDS ** +echo ** ** +echo ** RIGHT-CLICK AND EDIT .BAT FILE. ** +echo ** CHANGE "--port COM5" to where your adapter is ** +echo ** (you can delete this message) ** +echo *************************************************** + +python.exe .\m18.py --ss --port COM5 | clip.exe + +echo: +echo *************************************************** +echo ** Finished. Now use 'ctrl+v' to paste ** +echo ** diagnostics output into spreadsheet ** +echo ** ** +echo ** If you get errors, you must edit this batch ** +echo ** file to have the correct port. You may also ** +echo ** have hardware issues. See github ** +echo *************************************************** + +cmd /k + + + + +:: RECOMMEND RUNNING m18_idle.bat BEFORE CONNECTING TO BATTERY +:: Gives simple health report of M18 batteries +:: Add "--port COM5" (or whatever your port is) to avoid +:: having to enter it everytime + +@echo off +echo *************************************************** +echo ** RIGHT-CLICK AND EDIT .BAT FILE. ** +echo ** ADD "--port COM5" to command ** +echo ** (or whatever port your serial adapter is on) ** +echo ** (you can delete this message ** +echo *************************************************** + +python.exe .\m18.py --health +cmd /k + + + + + +:: Puts serial adapter TX in idle (low = <1V) +:: This prevents false charge count increases + +@echo off + +echo *************************************************** +echo ** RIGHT-CLICK AND EDIT .BAT FILE. ** +echo ** ADD "--port COM5" to command ** +echo ** (or whatever port your serial adapter is on) ** +echo ** (you can delete this message ** +echo *************************************************** + +python.exe .\m18.py --idle +cmd /k + + + + +:: RECOMMEND RUNNING m18_idle.bat BEFORE CONNECTING TO BATTERY +:: Runs script in interactive mode +:: All functions available + +python.exe .\m18.py \ No newline at end of file diff --git a/M18.png b/M18.png new file mode 100644 index 0000000000000000000000000000000000000000..87e3cab67d995e91fd94150926f458c9a6e488fc GIT binary patch literal 24644 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 F{{RW21|a|d literal 0 HcmV?d00001 diff --git a/m18gui.py b/m18gui.py index 14bac7f..9ab8cba 100644 --- a/m18gui.py +++ b/m18gui.py @@ -1,63 +1,18 @@ -import sys -import subprocess -import threading -import io -import time -import traceback -import tkinter as tk +import sys, subprocess, threading, io, time, traceback, tkinter as tk from tkinter import ttk, messagebox -def ensure_module(mod_name: str, pip_name: str) -> None: - try: - __import__(mod_name) - return +def ensure_module(mod_name, pip_name): + try: __import__(mod_name) except ImportError: - pass - install_root = tk.Tk() - install_root.title("M18 GUI - Installing dependencies") - install_root.geometry("420x120") - label = ttk.Label( - install_root, - text=( - f"Installing required Python package:\n{pip_name}\n\n" - "This may take a moment..." - ), - justify="center" - ) - label.pack(padx=10, pady=10) - progress = ttk.Progressbar(install_root, mode="indeterminate") - progress.pack(fill="x", padx=10, pady=(0, 10)) - progress.start(10) - install_root.update_idletasks() - try: - subprocess.check_call( - [sys.executable, "-m", "pip", "install", pip_name], - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL - ) - except subprocess.CalledProcessError as e: - progress.stop() - messagebox.showerror( - "Installation error", - f"Failed to install '{pip_name}'.\n\nError code: {e.returncode}" - ) - install_root.destroy() - sys.exit(1) - progress.stop() - install_root.destroy() - try: - __import__(mod_name) - except ImportError: - messagebox.showerror( - "Import error", - f"Package '{pip_name}' was installed, but could not be imported.\n" - f"Please restart Python or install it manually." - ) - sys.exit(1) - + root = tk.Tk(); root.title("Installing dependencies") + ttk.Label(root, text=f"Installing {pip_name}…").pack(padx=6, pady=6) + pb = ttk.Progressbar(root, mode="indeterminate"); pb.pack(fill="x", padx=6, pady=(0, 6)); pb.start(12) + root.update_idletasks() + subprocess.check_call([sys.executable, "-m", "pip", "install", pip_name], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + pb.stop(); root.destroy() + try: __import__(mod_name) + except ImportError: messagebox.showerror("Error", f"Installed {pip_name} but cannot import."); sys.exit(1) ensure_module("serial", "pyserial") -ensure_module("requests", "requests") - from serial.tools import list_ports import m18 @@ -65,6 +20,8 @@ class M18GUI(tk.Tk): def __init__(self): super().__init__() self.title("M18 Protocol GUI") + self.geometry("610x370") + self.resizable(False, False) self.m18_obj = None self.sim_thread = None self.sim_stop_event = None @@ -80,279 +37,133 @@ def __init__(self): self.update_profile_display() def create_widgets(self): - self.notebook = ttk.Notebook(self) - self.notebook.pack(fill="x", expand=False, padx=10, pady=(5, 0)) - self.main_tab = ttk.Frame(self.notebook) - self.console_tab = ttk.Frame(self.notebook) - self.sim_tab = ttk.Frame(self.notebook) - self.about_tab = ttk.Frame(self.notebook) - self.notebook.add(self.main_tab, text="Main Controls") - self.notebook.add(self.console_tab, text="Interactive Console") - self.notebook.add(self.sim_tab, text="Simulation") - self.notebook.add(self.about_tab, text="About") - top_frame = ttk.Frame(self.main_tab) - top_frame.pack(fill="x", padx=5, pady=(5, 0)) - ttk.Label(top_frame, text="Serial port:").grid(row=0, column=0, sticky="w") + self.notebook = ttk.Notebook(self); self.notebook.pack(fill="both", expand=True, padx=0, pady=0) + self.main_tab, self.console_tab, self.sim_tab, self.about_tab = (ttk.Frame(self.notebook) for _ in range(4)) + self.notebook.add(self.main_tab, text="Main Controls"); self.notebook.add(self.console_tab, text="Interactive Console") + self.notebook.add(self.sim_tab, text="Simulation"); self.notebook.add(self.about_tab, text="About") + + # Main Controls + top = ttk.Frame(self.main_tab); top.pack(fill="x", padx=5, pady=(4,1)) + ttk.Label(top, text="Serial port:").grid(row=0, column=0, sticky="w") self.port_var = tk.StringVar() - self.port_combo = ttk.Combobox(top_frame, textvariable=self.port_var, state="readonly", width=55) - self.port_combo.grid(row=0, column=1, padx=5, sticky="w") - ttk.Button(top_frame, text="Refresh", command=self.refresh_ports).grid(row=0, column=2, padx=4) - self.connect_btn = ttk.Button(top_frame, text="Connect", command=self.connect_device) - self.connect_btn.grid(row=0, column=3, padx=4) - self.disconnect_btn = ttk.Button(top_frame, text="Disconnect", command=self.disconnect_device, state="disabled") - self.disconnect_btn.grid(row=0, column=4, padx=4) + self.port_combo = ttk.Combobox(top, textvariable=self.port_var, state="readonly", width=40); self.port_combo.grid(row=0, column=1, padx=2, sticky="w") + ttk.Button(top, text="Refresh", width=7, command=self.refresh_ports).grid(row=0, column=2, padx=2) + self.connect_btn = ttk.Button(top, text="Connect", width=7, command=self.connect_device); self.connect_btn.grid(row=0, column=3, padx=2) + self.disconnect_btn = ttk.Button(top, text="Disconnect", width=9, command=self.disconnect_device, state="disabled"); self.disconnect_btn.grid(row=0, column=4, padx=2) self.status_var = tk.StringVar(value="Not connected") - ttk.Label(top_frame, textvariable=self.status_var).grid( - row=1, column=0, columnspan=5, sticky="w", pady=(4, 0) - ) - mid_frame = ttk.LabelFrame(self.main_tab, text="Commands") - mid_frame.pack(fill="x", padx=5, pady=(6, 4)) - self.idle_btn = ttk.Button( - mid_frame, text="Idle (TX low, safe to connect)", command=self.cmd_idle, state="disabled" - ) - self.idle_btn.grid(row=0, column=0, padx=3, pady=4, sticky="w") - self.health_btn = ttk.Button( - mid_frame, text="Health report", command=self.cmd_health, state="disabled" - ) - self.health_btn.grid(row=0, column=1, padx=3, pady=4, sticky="w") - self.clipboard_btn = ttk.Button( - mid_frame, text="Copy all registers to clipboard", command=self.cmd_clipboard, state="disabled" - ) - self.clipboard_btn.grid(row=0, column=2, padx=3, pady=4, sticky="w") - # --- Interactive Console - console_frame = ttk.Frame(self.console_tab) - console_frame.pack(fill="both", expand=True, padx=5, pady=5) - ttk.Label( - console_frame, - text="Python console environment.\nYou can use 'm' for the connected M18 object.\nExample: m.read_id() or m.health()" - ).pack(anchor="w") - self.console_text = tk.Text(console_frame, height=8, wrap="none") - self.console_text.pack(fill="both", expand=True, padx=5, pady=5) - console_btn_frame = ttk.Frame(console_frame) - console_btn_frame.pack(fill="x", padx=5, pady=(0, 5)) - self.console_run_btn = ttk.Button(console_btn_frame, text="Execute", command=self.run_console_code) - self.console_run_btn.pack(side="left", padx=5) - self.console_clear_btn = ttk.Button( - console_btn_frame, text="Clear input", command=lambda: self.console_text.delete("1.0", tk.END) - ) - self.console_clear_btn.pack(side="left", padx=5) - # --- Simulation - sim_main_frame = ttk.Frame(self.sim_tab) - sim_main_frame.pack(fill="x", padx=6, pady=6) - ttk.Label(sim_main_frame, text="Simulation duration (seconds):").grid(row=0, column=0, sticky="w", padx=4, pady=2) + ttk.Label(top, textvariable=self.status_var).grid(row=1, column=0, columnspan=5, sticky="w", pady=(2,0)) + cmds = ttk.LabelFrame(self.main_tab, text="Commands"); cmds.pack(fill="x", padx=5, pady=(3,1)) + self.idle_btn = ttk.Button(cmds, text="Idle (TX low, safe to connect)", width=25, command=self.cmd_idle, state="disabled"); self.idle_btn.grid(row=0, column=0, padx=2, pady=2) + self.health_btn = ttk.Button(cmds, text="Health report", width=15, command=self.cmd_health, state="disabled"); self.health_btn.grid(row=0, column=1, padx=2, pady=2) + self.clipboard_btn = ttk.Button(cmds, text="Copy all registers to clipboard", width=28, command=self.cmd_clipboard, state="disabled"); self.clipboard_btn.grid(row=0, column=2, padx=2, pady=2) + # Output (only on non-About tabs) + self.bottom_frame = ttk.LabelFrame(self, text="Output"); self.bottom_frame.pack(fill="x", padx=5, pady=(0,4), side="bottom") + self.output_text = tk.Text(self.bottom_frame, wrap="word", height=6, font=("Consolas", 9)); self.output_text.pack(fill="both", expand=True, padx=2, pady=2) + scrollbar = ttk.Scrollbar(self.bottom_frame, orient="vertical", command=self.output_text.yview); scrollbar.pack(side="right", fill="y") + self.output_text.configure(yscrollcommand=scrollbar.set) + def on_tab_changed(event): + tab = event.widget.tab(event.widget.select(), "text") + if tab == "About": self.bottom_frame.pack_forget() + else: self.bottom_frame.pack(fill="x", padx=5, pady=(0,4), side="bottom") + self.notebook.bind("<>", on_tab_changed) + + # Console Tab + c_frame = ttk.Frame(self.console_tab); c_frame.pack(fill="both", expand=True, padx=4, pady=2) + ttk.Label(c_frame, text="Python console. Use 'm' for M18 object.").pack(anchor="w", pady=(0,1)) + self.console_text = tk.Text(c_frame, height=4, wrap="none", font=("Consolas",9)); self.console_text.pack(fill="x", padx=1, pady=(0,1)) + c_btns = ttk.Frame(c_frame); c_btns.pack(fill="x") + ttk.Button(c_btns, text="Execute", width=10, command=self.run_console_code).pack(side="left", padx=3) + ttk.Button(c_btns, text="Clear", width=7, command=lambda: self.console_text.delete("1.0", tk.END)).pack(side="left", padx=3) + + # Simulation Tab + s_frame = ttk.Frame(self.sim_tab); s_frame.pack(fill="both", padx=4, pady=1) + ttk.Label(s_frame, text="Simulation duration (sec):").grid(row=0, column=0, sticky="w", padx=2) self.sim_duration_var = tk.StringVar(value="60") - self.sim_duration_entry = ttk.Entry(sim_main_frame, textvariable=self.sim_duration_var, width=10) - self.sim_duration_entry.grid(row=0, column=1, sticky="w", padx=4, pady=2) - ttk.Label(sim_main_frame, text="Simulation baudrate (conceptual):").grid(row=1, column=0, sticky="w", padx=4, pady=2) + ttk.Entry(s_frame, textvariable=self.sim_duration_var, width=5).grid(row=0, column=1, sticky="w", padx=2) + ttk.Label(s_frame, text="Sim baudrate (concept):").grid(row=1, column=0, sticky="w", padx=2) self.sim_baud_var = tk.StringVar(value="4800") - self.sim_baud_combo = ttk.Combobox( - sim_main_frame, textvariable=self.sim_baud_var, state="readonly", width=10, - values=["1200", "2400", "4800", "9600"] - ) - self.sim_baud_combo.grid(row=1, column=1, sticky="w", padx=4, pady=2) - ttk.Label( - sim_main_frame, - text="Note: actual UART to the pack always runs at 4800 baud.\nThis setting only affects how often keepalive packets are sent\nduring simulation. No real charging current flows from USB." - ).grid(row=2, column=0, columnspan=3, sticky="w", padx=4, pady=(2, 8)) - ttk.Label(sim_main_frame, text="Charger profile:").grid(row=3, column=0, sticky="w", padx=4, pady=2) + ttk.Combobox(s_frame, textvariable=self.sim_baud_var, state="readonly", width=8, values=["1200","2400","4800","9600"]).grid(row=1, column=1, sticky="w", padx=2) + ttk.Label(s_frame, text="UART to pack always runs at 4800 baud.\nNo real charging current flows from USB.").grid(row=2, column=0, columnspan=2, sticky="w", padx=2, pady=(0,6)) + ttk.Label(s_frame, text="Charger profile:").grid(row=3, column=0, sticky="w", padx=2) self.sim_profile_var = tk.StringVar(value="Normal") - profile_values = ["Gentle", "Normal", "Aggressive", "Custom"] - self.sim_profile_combo = ttk.Combobox( - sim_main_frame, textvariable=self.sim_profile_var, state="readonly", width=12, values=profile_values - ) - self.sim_profile_combo.grid(row=3, column=1, sticky="w", padx=4, pady=2) - self.sim_profile_combo.bind("<>", self.on_profile_changed) - self.profile_info_var = tk.StringVar(value="Profile parameters will appear here.") - ttk.Label(sim_main_frame, textvariable=self.profile_info_var, foreground="blue").grid( - row=4, column=0, columnspan=3, sticky="w", padx=4, pady=(0, 6) - ) - self.custom_frame = ttk.LabelFrame(self.sim_tab, text="Custom charger parameters") - header_frame = ttk.Frame(self.custom_frame) - header_frame.pack(fill="x", padx=5, pady=(5, 0)) - ttk.Label(header_frame, text="").grid(row=0, column=0, padx=5) - ttk.Label(header_frame, text="Raw units").grid(row=0, column=1, padx=5) - ttk.Label(header_frame, text="Amps").grid(row=0, column=2, padx=5) - rows_frame = ttk.Frame(self.custom_frame) - rows_frame.pack(fill="x", padx=5, pady=5) - ttk.Label(rows_frame, text="Cutoff:").grid(row=0, column=0, padx=5, pady=3, sticky="e") - self.custom_cutoff_raw_entry = ttk.Entry(rows_frame, textvariable=self.custom_cutoff_raw_var, width=10) - self.custom_cutoff_raw_entry.grid(row=0, column=1, padx=5, pady=3) - self.custom_cutoff_amps_entry = ttk.Entry(rows_frame, textvariable=self.custom_cutoff_amps_var, width=10) - self.custom_cutoff_amps_entry.grid(row=0, column=2, padx=5, pady=3) - ttk.Label(rows_frame, text="Max current:").grid(row=1, column=0, padx=5, pady=3, sticky="e") - self.custom_max_raw_entry = ttk.Entry(rows_frame, textvariable=self.custom_max_raw_var, width=10) - self.custom_max_raw_entry.grid(row=1, column=1, padx=5, pady=3) - self.custom_max_amps_entry = ttk.Entry(rows_frame, textvariable=self.custom_max_amps_var, width=10) - self.custom_max_amps_entry.grid(row=1, column=2, padx=5, pady=3) - ttk.Label( - self.custom_frame, - text="1 raw unit is treated as approximately 0.001 A.\nThese values are for protocol simulation only.\nNo real charging current comes from the USB interface." - ).pack(anchor="w", padx=5, pady=(0, 5)) - self.custom_cutoff_raw_entry.bind("", self.on_custom_raw_focus_out) - self.custom_max_raw_entry.bind("", self.on_custom_raw_focus_out) - self.custom_cutoff_amps_entry.bind("", self.on_custom_amps_focus_out) - self.custom_max_amps_entry.bind("", self.on_custom_amps_focus_out) - sim_btn_frame = ttk.Frame(self.sim_tab) - sim_btn_frame.pack(fill="x", padx=6, pady=(4, 4)) - self.sim_start_btn = ttk.Button( - sim_btn_frame, text="Start simulation", command=self.start_simulation, state="disabled" - ) - self.sim_start_btn.pack(side="left", padx=4) - self.sim_stop_btn = ttk.Button( - sim_btn_frame, text="Stop simulation", command=self.stop_simulation, state="disabled" - ) - self.sim_stop_btn.pack(side="left", padx=4) - self.sim_status_var = tk.StringVar( - value="Simulation idle. Connect to a battery to enable." - ) - ttk.Label(self.sim_tab, textvariable=self.sim_status_var).pack(anchor="w", padx=8, pady=(0, 6)) + profs = list(self.sim_profiles.keys())+["Custom"] + prof_box = ttk.Combobox(s_frame, textvariable=self.sim_profile_var, state="readonly", width=10, values=profs) + prof_box.grid(row=3, column=1, sticky="w", padx=2) + prof_box.bind("<>", self.on_profile_changed) + self.profile_info_var = tk.StringVar() + ttk.Label(s_frame, textvariable=self.profile_info_var, foreground="blue").grid(row=4, column=0, columnspan=2, sticky="w", padx=2, pady=(0,2)) + self.sim_status_var = tk.StringVar(value="Simulation idle. Connect to a battery to enable.") + ttk.Label(s_frame, textvariable=self.sim_status_var).grid(row=5, column=0, columnspan=2, sticky="w", padx=2) + self.sim_start_btn = ttk.Button(s_frame, text="Start simulation", width=15, command=self.start_simulation, state="disabled") + self.sim_start_btn.grid(row=6, column=0, padx=2, pady=2) + self.sim_stop_btn = ttk.Button(s_frame, text="Stop simulation", width=15, command=self.stop_simulation, state="disabled") + self.sim_stop_btn.grid(row=6, column=1, padx=2, pady=2) + + # About Tab import webbrowser - about_frame = ttk.Frame(self.about_tab) - about_frame.pack(fill="both", expand=True, padx=10, pady=10) - ttk.Label( - about_frame, text="M18 Protocol GUI", font=("Segoe UI", 14, "bold") - ).pack(pady=(0, 10)) - ttk.Label(about_frame, text="Developed by KillaVolt").pack(pady=(0, 5)) - github_link = ttk.Label( - about_frame, - text="GitHub Profile: https://github.com/KillaVolt", - foreground="blue", - cursor="hand2" - ) - github_link.pack() - github_link.bind( - "", - lambda e: webbrowser.open("https://github.com/KillaVolt") - ) - ttk.Label( - about_frame, - text="GUI submitted for review — awaiting hardware verification", - foreground="gray" - ).pack(pady=(15, 0)) - bottom_frame = ttk.LabelFrame(self, text="Output") - bottom_frame.pack(fill="both", expand=True, padx=10, pady=(0, 10)) - self.output_text = tk.Text(bottom_frame, wrap="word") - self.output_text.pack(side="left", fill="both", expand=True) - scrollbar = ttk.Scrollbar( - bottom_frame, orient="vertical", command=self.output_text.yview - ) - scrollbar.pack(side="right", fill="y") - self.output_text.configure(yscrollcommand=scrollbar.set) - self.custom_frame.pack_forget() - # ------------------------------------------------------------------------- - # Utility Logging - # ------------------------------------------------------------------------- - def log(self, text: str, clear: bool = False): - if clear: - self.output_text.delete("1.0", tk.END) - self.output_text.insert(tk.END, text + "\n") - self.output_text.see(tk.END) - - def sim_log(self, text: str): - self.log(f"[SIM] {text}") - - def set_status(self, text: str): - self.status_var.set(text) - - # ------------------------------------------------------------------------- - # Port Refresh - # ------------------------------------------------------------------------- + a_frame = ttk.Frame(self.about_tab) + a_frame.place(relx=0.5, rely=0.09, anchor="n") + ttk.Label(a_frame, text="M18 Protocol GUI", font=("Segoe UI", 15, "bold")).pack(pady=(0,1)) + ttk.Label(a_frame, text="Core protocol by Martin Jansson", font=("Segoe UI", 9, "italic")).pack(pady=(5,0)) + link2 = ttk.Label(a_frame, text="Original: https://github.com/mnh-jansson/m18-protocol", foreground="blue", cursor="hand2"); link2.pack() + link2.bind("", lambda e: webbrowser.open("https://github.com/mnh-jansson/m18-protocol")) + ttk.Label(a_frame, text="Developed by KillaVolt", font=("Segoe UI", 9)).pack() + link = ttk.Label(a_frame, text="GitHub Profile: https://github.com/KillaVolt", foreground="blue", cursor="hand2"); link.pack() + link.bind("", lambda e: webbrowser.open("https://github.com/KillaVolt")) + + table = ttk.Treeview(a_frame, columns=("addr", "desc"), show="headings", height=8) + table.heading("addr", text="Hex Addr"); table.heading("desc", text="Meaning") + table.column("addr", width=65, anchor="center"); table.column("desc", width=150, anchor="w"); table.pack() + for addr, desc in [("F85D","1: Command"),("F85E","4: Access"),("F85F","3: Length"),("F860","Address?"),("F861","Address?"),("F862","Length?"),("F863","N/A"),("F864","Checksum")]: + table.insert("", "end", values=(addr,desc)) + + # -------- Utility / Port / Logging ---------- + def log(self, text, clear=False): self.output_text.delete("1.0", tk.END) if clear else None; self.output_text.insert(tk.END, text + "\n"); self.output_text.see(tk.END) + def sim_log(self, text): self.log(f"[SIM] {text}") + def set_status(self, text): self.status_var.set(text) def refresh_ports(self): - ports = list_ports.comports() - display_names = [] - self.port_map = {} - + ports = list_ports.comports(); names = []; self.port_map.clear() for p in ports: - label = f"{p.device} — {p.description} ({p.manufacturer or 'Unknown'})" - display_names.append(label) - self.port_map[label] = p.device - - self.port_combo["values"] = display_names - - if display_names: - self.port_combo.current(0) - else: - self.port_combo.set("") - + label = f"{p.device} — {p.description} ({getattr(p,'manufacturer','') or ''})".strip() + names.append(label); self.port_map[label] = p.device + self.port_combo["values"] = names; self.port_combo.current(0) if names else self.port_combo.set("") self.set_status("Ports refreshed") - - # ------------------------------------------------------------------------- - # Helpers - # ------------------------------------------------------------------------- - def require_connection(self) -> bool: - if self.m18_obj is None: - messagebox.showwarning("Not connected", "Please connect to a port first.") - return False + def require_connection(self): + if self.m18_obj is None: messagebox.showwarning("Not connected", "Please connect to a port first."); return False return True - - def capture_output(self, func, *args, **kwargs) -> str: - buf = io.StringIO() - old_stdout = sys.stdout - try: - sys.stdout = buf - func(*args, **kwargs) - finally: - sys.stdout = old_stdout + def capture_output(self, func, *a, **k): + buf, old = io.StringIO(), sys.stdout + try: sys.stdout = buf; func(*a, **k) + finally: sys.stdout = old return buf.getvalue() - # ------------------------------------------------------------------------- - # Connect / Disconnect - # ------------------------------------------------------------------------- + # --------- Connect/Disconnect ----------- def connect_device(self): - selected = self.port_var.get() - if not selected: - messagebox.showwarning("No port", "Please select a serial port first.") - return - - port = self.port_map.get(selected, selected) - - try: - self.m18_obj = m18.M18(port) + sel = self.port_var.get() + port = self.port_map.get(sel, sel) + try: self.m18_obj = m18.M18(port) except Exception as e: - self.m18_obj = None - messagebox.showerror("Connection error", f"Failed to connect to {port}.\n\n{e}") - self.set_status("Connection failed") - return - - self.set_status(f"Connected to {port}") - self.log(f"Connected to {port}", clear=True) - - self.connect_btn.configure(state="disabled") - self.disconnect_btn.configure(state="normal") - self.idle_btn.configure(state="normal") - self.health_btn.configure(state="normal") - self.clipboard_btn.configure(state="normal") - self.sim_start_btn.configure(state="normal") + self.m18_obj = None; messagebox.showerror("Connection error", f"Failed to connect to {port}.\n\n{e}") + self.set_status("Connection failed"); return + self.set_status(f"Connected to {port}"); self.log(f"Connected to {port}", clear=True) + for b in [self.connect_btn]: b.configure(state="disabled") + for b in [self.disconnect_btn, self.idle_btn, self.health_btn, self.clipboard_btn, self.sim_start_btn]: b.configure(state="normal") def disconnect_device(self): self.stop_simulation() + if self.m18_obj: + try: self.m18_obj.idle() + except: pass + try: self.m18_obj.port.close() + except: pass + self.m18_obj = None + self.set_status("Disconnected"); self.log("Disconnected") + for b in [self.connect_btn]: b.configure(state="normal") + for b in [self.disconnect_btn, self.idle_btn, self.health_btn, self.clipboard_btn, self.sim_start_btn, self.sim_stop_btn]: b.configure(state="disabled") - if self.m18_obj is not None: - try: - try: self.m18_obj.idle() - except: pass - try: self.m18_obj.port.close() - except: pass - finally: - self.m18_obj = None - - self.set_status("Disconnected") - self.log("Disconnected") - - self.connect_btn.configure(state="normal") - self.disconnect_btn.configure(state="disabled") - self.idle_btn.configure(state="disabled") - self.health_btn.configure(state="disabled") - self.clipboard_btn.configure(state="disabled") - self.sim_start_btn.configure(state="disabled") - self.sim_stop_btn.configure(state="disabled") - - # ------------------------------------------------------------------------- - # Commands - # ------------------------------------------------------------------------- + # ----------- Command Handlers ----------- def cmd_idle(self): if not self.require_connection(): return - def work(): try: self.m18_obj.idle() @@ -360,12 +171,10 @@ def work(): self.after(0, lambda: self.set_status("Idle (TX low)")) except Exception as e: self.after(0, lambda: messagebox.showerror("Idle error", str(e))) - threading.Thread(target=work, daemon=True).start() def cmd_health(self): if not self.require_connection(): return - def work(): try: output = self.capture_output(self.m18_obj.health) @@ -376,20 +185,13 @@ def finish(): self.after(0, finish) except Exception as e: self.after(0, lambda: messagebox.showerror("Health error", str(e))) - threading.Thread(target=work, daemon=True).start() def cmd_clipboard(self): if not self.require_connection(): return - def work(): try: - output = self.capture_output( - self.m18_obj.read_id, - None, - True, - "raw" - ) + output = self.capture_output(self.m18_obj.read_id, None, True, "raw") def finish(): self.clipboard_clear() self.clipboard_append(output) @@ -397,135 +199,59 @@ def finish(): self.after(0, finish) except Exception as e: self.after(0, lambda: messagebox.showerror("Clipboard error", str(e))) - threading.Thread(target=work, daemon=True).start() - # ------------------------------------------------------------------------- - # Console Executor - # ------------------------------------------------------------------------- + # ---------- Interactive Console ---------- def run_console_code(self): - code_str = self.console_text.get("1.0", tk.END).strip() - if not code_str: - messagebox.showinfo("No code", "Please enter some code.") - return - + code = self.console_text.get("1.0", tk.END).strip() + if not code: messagebox.showinfo("No code", "Please enter some code."); return if not self.require_connection(): return - def work(): - buf = io.StringIO() - old_stdout, old_stderr = sys.stdout, sys.stderr - sys.stdout = buf - sys.stderr = buf - + buf = io.StringIO(); old_stdout, old_stderr = sys.stdout, sys.stderr + sys.stdout = sys.stderr = buf try: env = {"m": self.m18_obj} - try: - exec(code_str, env, {}) - except Exception: - traceback.print_exc() - finally: - sys.stdout = old_stdout - sys.stderr = old_stderr - + try: exec(code, env, {}) + except Exception: traceback.print_exc() + finally: sys.stdout, sys.stderr = old_stdout, old_stderr output = buf.getvalue() def finish(): self.log("=== Console execution ===") self.log(output if output.strip() else "(no output)") self.after(0, finish) - threading.Thread(target=work, daemon=True).start() - # ------------------------------------------------------------------------- - # Profile Logic - # ------------------------------------------------------------------------- - def on_profile_changed(self, event=None): - self.update_profile_display() - + # ---------- Profile Display ---------- + def on_profile_changed(self, event=None): self.update_profile_display() def update_profile_display(self): - profile = self.sim_profile_var.get() - if profile in self.sim_profiles: - cutoff, maxc = self.sim_profiles[profile] - info = ( - f"Profile '{profile}': Cutoff {cutoff} ({cutoff/1000:.2f}A), " - f"Max {maxc} ({maxc/1000:.2f}A). Simulation only." - ) + p = self.sim_profile_var.get() + if p in self.sim_profiles: + c, m = self.sim_profiles[p] + info = f"Profile '{p}': Cutoff {c} ({c/1000:.2f}A), Max {m} ({m/1000:.2f}A). Simulation only." self.profile_info_var.set(info) - self.custom_frame.pack_forget() - else: - self.profile_info_var.set("Custom profile: adjust fields below.") - self.custom_frame.pack(fill="x", padx=5, pady=(0, 8)) - - def on_custom_raw_focus_out(self, event=None): - if self._sync_in_progress: return - self._sync_in_progress = True - try: - try: - val = int(self.custom_cutoff_raw_var.get()) - self.custom_cutoff_amps_var.set(f"{val/1000:.2f}") - except: pass - try: - val = int(self.custom_max_raw_var.get()) - self.custom_max_amps_var.set(f"{val/1000:.2f}") - except: pass - finally: - self._sync_in_progress = False - - def on_custom_amps_focus_out(self, event=None): - if self._sync_in_progress: return - self._sync_in_progress = True - try: - try: - amps = float(self.custom_cutoff_amps_var.get()) - self.custom_cutoff_raw_var.set(str(int(round(amps*1000)))) - except: pass - try: - amps = float(self.custom_max_amps_var.get()) - self.custom_max_raw_var.set(str(int(round(amps*1000)))) - except: pass - finally: - self._sync_in_progress = False - + else: self.profile_info_var.set("Custom profile: adjust fields below.") def get_profile_currents(self): p = self.sim_profile_var.get() - if p in self.sim_profiles: - return self.sim_profiles[p] - # custom + if p in self.sim_profiles: return self.sim_profiles[p] try: c = int(self.custom_cutoff_raw_var.get()) m = int(self.custom_max_raw_var.get()) - if c < 0 or m <= 0 or c > 20000 or m > 20000: - raise ValueError - except: - raise ValueError("Invalid custom values.") + if c < 0 or m <= 0 or c > 20000 or m > 20000: raise ValueError + except: raise ValueError("Invalid custom values.") return c, m - # ------------------------------------------------------------------------- - # Simulation - # ------------------------------------------------------------------------- + # ---------- Simulation ---------- def start_simulation(self): if not self.require_connection(): return - if self.sim_thread and self.sim_thread.is_alive(): - messagebox.showinfo("Running", "Simulation already running.") - return - + messagebox.showinfo("Running", "Simulation already running."); return try: duration = float(self.sim_duration_var.get()) - if duration <= 0: - raise ValueError - except: - messagebox.showwarning("Invalid duration", "Enter a positive number.") - return - + if duration <= 0: raise ValueError + except: messagebox.showwarning("Invalid duration", "Enter a positive number."); return sim_baud = self.sim_baud_var.get() - interval_map = { - "1200": 1.0, - "2400": 0.75, - "4800": 0.5, - "9600": 0.25 - } + interval_map = {"1200": 1.0, "2400": 0.75, "4800": 0.5, "9600": 0.25} keepalive_interval = interval_map.get(sim_baud, 0.5) - try: cutoff, maxc = self.get_profile_currents() except Exception as e: @@ -537,8 +263,16 @@ def start_simulation(self): self.sim_stop_event = threading.Event() self.sim_thread = threading.Thread( target=self._simulation_worker, - args=(duration, keepalive_interval, pname, cutoff, cutoff/1000, maxc, maxc/1000), - daemon=True + args=( + duration, + keepalive_interval, + pname, + cutoff, + cutoff / 1000.0, + maxc, + maxc / 1000.0, + ), + daemon=True, ) self.sim_thread.start() @@ -547,29 +281,47 @@ def start_simulation(self): self.sim_status_var.set(f"Simulation running ({pname}, baud {sim_baud})") self.sim_log( - f"Start {duration}s, {pname}, cutoff={cutoff} ({cutoff/1000:.2f}A), " - f"max={maxc} ({maxc/1000:.2f}A), interval={keepalive_interval}s" + f"Start {duration}s | {pname} | " + f"cutoff={cutoff} ({cutoff/1000:.2f}A) | " + f"max={maxc} ({maxc/1000:.2f}A) | " + f"interval={keepalive_interval:.2f}s" ) def stop_simulation(self): if self.sim_stop_event: self.sim_stop_event.set() - def _simulation_worker(self, duration, interval, pname, cutoff_raw, cutoff_amps, max_raw, max_amps): + def _simulation_worker( + self, + duration, + interval, + pname, + cutoff_raw, + cutoff_amps, + max_raw, + max_amps, + ): m = self.m18_obj if m is None: - self.after(0, lambda: messagebox.showerror("Simulation error", "No connection.")) + self.after( + 0, + lambda: messagebox.showerror( + "Simulation error", "No active M18 connection." + ), + ) return - old_cut = getattr(m, "CUTOFF_CURRENT", None) + old_cutoff = getattr(m, "CUTOFF_CURRENT", None) old_max = getattr(m, "MAX_CURRENT", None) + m.CUTOFF_CURRENT = cutoff_raw m.MAX_CURRENT = max_raw - start = time.time() + start_time = time.time() try: - self.after(0, lambda: self.sim_log("Reset + initial negotiate...")) + self.after(0, lambda: self.sim_log("Resetting and negotiating charger state...")) + try: m.reset() except Exception as e: @@ -584,39 +336,45 @@ def _simulation_worker(self, duration, interval, pname, cutoff_raw, cutoff_amps, m.configure(1) m.get_snapchat() except Exception as e: - self.after(0, lambda: self.sim_log(f"configure failed: {e}")) + self.after(0, lambda: self.sim_log(f"Initial negotiation failed: {e}")) return while not self.sim_stop_event.is_set(): - elapsed = time.time() - start + elapsed = time.time() - start_time if elapsed >= duration: break try: time.sleep(interval) m.keepalive() - self.after(0, lambda e=elapsed: self.sim_log(f"Keepalive t={e:.1f}s")) + self.after( + 0, + lambda e=elapsed: self.sim_log(f"Keepalive t={e:.1f}s"), + ) except Exception as e: self.after(0, lambda: self.sim_log(f"keepalive() failed: {e}")) break finally: - try: m.idle() - except: pass + try: + m.idle() + except Exception: + pass - if old_cut is not None: m.CUTOFF_CURRENT = old_cut - if old_max is not None: m.MAX_CURRENT = old_max + if old_cutoff is not None: + m.CUTOFF_CURRENT = old_cutoff + if old_max is not None: + m.MAX_CURRENT = old_max def finish(): - self.sim_log("Simulation finished. Back to idle.") + self.sim_log("Simulation finished. Returned to idle.") self.sim_status_var.set("Simulation idle.") self.sim_start_btn.configure(state="normal") self.sim_stop_btn.configure(state="disabled") + self.after(0, finish) -# ------------------------------------------------------------------------- -# Main loop -# ------------------------------------------------------------------------- + if __name__ == "__main__": app = M18GUI() app.mainloop() From 738d61981e5f5ef4458d3b9023c4bcbef9ed640f Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sat, 13 Dec 2025 19:52:22 -0500 Subject: [PATCH 05/61] Add comprehensive comments to M18 scripts --- m18.py | 94 ++++++++++++++++++++++++++++++++++++++++++------------- m18gui.py | 38 +++++++++++++++++++--- 2 files changed, 107 insertions(+), 25 deletions(-) diff --git a/m18.py b/m18.py index 39def59..0ff49cc 100644 --- a/m18.py +++ b/m18.py @@ -1,3 +1,13 @@ +""" +Core protocol implementation for communicating with Milwaukee M18 battery packs. + +This module exposes the :class:`M18` class, which handles all low-level serial +communication and provides helper routines for querying registers, simulating +charger behaviour, and collecting diagnostic data. The large data tables at the +top of the file describe the known register layout for the pack so higher-level +functions can translate raw bytes into meaningful information. +""" + import code import datetime import struct @@ -9,6 +19,10 @@ from serial import Serial from serial.tools import list_ports +# Address map describing contiguous register blocks to read from the pack. +# Each entry is [MSB, LSB, LENGTH] describing the starting address and +# number of bytes available in that window. These windows are used to prime +# caches and pull coherent chunks of data before decoding individual fields. data_matrix = [ [0x00, 0x00, 0x02], [0x00, 0x02, 0x02], @@ -45,13 +59,14 @@ ] -# label, addr, len, type -# uint - unsigned integer -# date - UNIX time (seconds from 1 Jan 1970) -# ascii - ascii string -# sn - serial number (2 bytes battery type, 3 bytes serial) -# adc_t - analog-to-digital converter temperature (mV of thermistor) -# dec_t - decimal temperature (byte_1 + byte_2/255) +# Lookup table describing each known register and how to decode it. Entries are +# formatted as [address, length, data_type, label] with the following types: +# uint - unsigned integer +# date - UNIX time (seconds from 1 Jan 1970) +# ascii - ASCII string +# sn - serial number (2 bytes battery type, 3 bytes serial) +# adc_t - analog-to-digital converter temperature (mV of thermistor) +# dec_t - decimal temperature (byte_1 + byte_2/255) # cell_v - cell voltages (1: 3568, 2: 3567, 3:3570, etc) data_id = [ [0x0000, 2, "uint", "Cell type"], # 0 @@ -250,6 +265,7 @@ def print_debug_bytes(data): print(f"DEBUG: ", data_print) class M18: + """Encapsulates serial communications and helper utilities for M18 packs.""" SYNC_BYTE = 0xAA CAL_CMD = 0x55 CONF_CMD = 0x60 @@ -265,24 +281,33 @@ class M18: PRINT_RX = False # Used to temporarily disable then restore print_tx/rx state - PRINT_TX_SAVE = False + PRINT_TX_SAVE = False PRINT_RX_SAVE = False - + def txrx_print(self, enable = True): + """Toggle verbose logging of transmitted and received frames.""" self.PRINT_TX = enable self.PRINT_RX = enable - + def txrx_save_and_set(self, enable = True): + """Save current TX/RX logging state and apply a temporary setting.""" self.PRINT_TX_SAVE = self.PRINT_TX self.PRINT_RX_SAVE = self.PRINT_RX self.txrx_print(enable) - + def txrx_restore(self): + """Restore TX/RX logging flags saved via :meth:`txrx_save_and_set`.""" self.PRINT_TX = self.PRINT_TX_SAVE self.PRINT_RX = self.PRINT_RX_SAVE def __init__(self, port): + """Create a protocol instance and open the serial port. + + Args: + port (str | None): Serial device path. When ``None`` the user is + prompted to choose from detected ports in an interactive menu. + """ if port is None: print("*** NO PORT SPECIFIED ***") print("Available serial ports (choose one that says USB somewhere):") @@ -345,36 +370,43 @@ def reset(self): return False def update_acc(self): + """Cycle the access control code used when issuing commands.""" acc_values = [0x04, 0x0C, 0x1C] current_index = acc_values.index(self.ACC) next_index = (current_index + 1) % len(acc_values) self.ACC = acc_values[next_index] def reverse_bits(self, byte): + """Reverse the bit-order of a single byte.""" return int(f"{byte:08b}"[::-1], 2) - + def checksum(self, payload): + """Calculate a simple additive checksum for the payload.""" checksum = 0 for byte in payload: checksum += byte & 0xFFFF return checksum def add_checksum(self, lsb_command): - lsb_command += struct.pack(">H", self.checksum(lsb_command)) + """Append a big-endian checksum to a command payload.""" + lsb_command += struct.pack(">H", self.checksum(lsb_command)) return lsb_command - + def send(self, command): + """Transmit a raw command buffer after reversing bit order for the wire.""" self.port.reset_input_buffer() debug_print = " ".join(f"{byte:02X}" for byte in command) msb = bytearray(self.reverse_bits(byte) for byte in command) if self.PRINT_TX: print(f"Sending: {debug_print}") self.port.write(msb) - + def send_command(self, command): + """Send a command with checksum pre-appended.""" self.send(self.add_checksum(command)) def read_response(self, size): + """Read and decode a response of ``size`` bytes from the serial port.""" msb_response = self.port.read(1) if not msb_response or len(msb_response) < 1: raise ValueError("Empty response") @@ -390,28 +422,33 @@ def read_response(self, size): return lsb_response def configure(self, state): + """Send configuration command declaring charger capabilities.""" self.ACC = 4 - self.send_command(struct.pack('>BBBHHHBB', self.CONF_CMD, self.ACC, 8, + self.send_command(struct.pack('>BBBHHHBB', self.CONF_CMD, self.ACC, 8, self.CUTOFF_CURRENT, self.MAX_CURRENT, self.MAX_CURRENT, state, 13)) return self.read_response(5) def get_snapchat(self): + """Request a short snapshot from the pack and advance ACC.""" self.send_command(struct.pack('>BBB', self.SNAP_CMD, self.ACC, 0)) self.update_acc() return self.read_response(8) - + def keepalive(self): + """Send a keepalive/charge-current request.""" self.send_command(struct.pack('>BBB', self.KEEPALIVE_CMD, self.ACC, 0)) return self.read_response(9) - + def calibrate(self): + """Trigger calibration/interrupt command on the pack.""" self.send_command(struct.pack('>BBB', self.CAL_CMD, self.ACC, 0)) self.update_acc() return self.read_response(8) def simulate(self): + """Continuously mimic charger behaviour until interrupted.""" print("Simulating charger communication") - + self.txrx_save_and_set(True) # Turn on TX/RX messages self.reset() @@ -435,6 +472,7 @@ def simulate(self): def simulate_for(self, duration): + """Simulate charging communication for ``duration`` seconds.""" # Simulate charging for 'time' seconds print(f"Simulating charger communication for {duration} seconds...") begin_time = time.time() @@ -457,6 +495,7 @@ def simulate_for(self, duration): print(f"Duration: ", time.time() - begin_time) def debug(self, a,b,c,length): + """Send a single command after reset and print the raw response.""" # Turn off debug, restore after printing rx_debug = self.PRINT_RX @@ -473,6 +512,7 @@ def debug(self, a,b,c,length): self.PRINT_RX = rx_debug def try_cmd(self, cmd, msb, lsb, length, ret_len=0): + """Fire an arbitrary command and display the response for debugging.""" # Turn off TX/RX printing, restore after printing self.txrx_save_and_set(False) @@ -490,11 +530,13 @@ def try_cmd(self, cmd, msb, lsb, length, ret_len=0): def cmd(self, a,b,c,length, command = 0x01): + """Send a read command to address ``a:b`` with length ``c``.""" self.send_command(struct.pack('>BBBBBB', command, 0x04, 0x03, a, b, c)) return self.read_response(length) def brute(self, a, b, length = 0xFF, command = 0x01): + """Probe a single address with many lengths looking for valid replies.""" self.reset() try: for i in range(length): @@ -532,10 +574,12 @@ def full_brute(self, start=0, stop=0xFFFF, length = 0xFF): self.idle() def wcmd(self, a,b,c,length): + """Send a write command to address ``a:b`` requesting ``c`` bytes.""" self.send_command(struct.pack('>BBBBBB', 0x01, 0x05, 0x03, a, b, c)) return self.read_response(length) def write_message(self, message): + """Write a short ASCII message into the pack's note register.""" try: if len(message) > 0x14: print("ERROR: Message too long!") @@ -549,14 +593,17 @@ def write_message(self, message): print(f"write_message: Failed with error: {e}") def idle(self): + """Drive control pins low to indicate idle/stop state.""" self.port.break_condition = True self.port.dtr = True def high(self): + """Drive control pins high to request charging.""" self.port.break_condition = False self.port.dtr = False - + def high_for(self, duration): + """Bring control pins high for ``duration`` seconds then idle.""" self.high() time.sleep(duration) self.idle() @@ -584,12 +631,14 @@ def calculate_temperature(self, adc_value): return round(temperature, 2) def bytes2dt(self, time_bytes): + """Convert a big-endian timestamp to an aware ``datetime`` object.""" epoch_time = int.from_bytes(time_bytes, 'big') dt = datetime.datetime.fromtimestamp(epoch_time, tz=datetime.UTC) return dt def read_all(self): + """Read and print every address block defined in :data:`data_matrix`.""" try: self.reset() for addr_h, addr_l, length in data_matrix: @@ -899,6 +948,7 @@ def health(self, force_refresh = True): def submit_form(self): + """Collect diagnostics and submit them to the community Google Form.""" form_url = 'https://docs.google.com/forms/d/e/1FAIpQLScvTbSDYBzSQ8S4XoF-rfgwNj97C-Pn4Px3GIixJxf0C1YJJA/formResponse' # Get data from battery @@ -956,6 +1006,7 @@ def submit_form(self): def help(self): + """Print a concise overview of commonly used interactive commands.""" print("Functions: \n \ DIAGNOSTICS: \n \ m.health() - print simple health report on battery \n \ @@ -967,8 +1018,9 @@ def help(self): m.adv_help() - advanced help\n \ \n \ exit() - end program\n") - + def adv_help(self): + """Print extended help covering simulations and debugging helpers.""" print("Advanced functions: \n \ m.read_all() - print all known bytes in 0x01 command \n \ m.read_all_spreadsheet() - print bytes in spreadsheet format \n \ diff --git a/m18gui.py b/m18gui.py index 9ab8cba..5eac978 100644 --- a/m18gui.py +++ b/m18gui.py @@ -1,7 +1,10 @@ +"""Tkinter-based GUI wrapper around the :mod:`m18` protocol module.""" + import sys, subprocess, threading, io, time, traceback, tkinter as tk from tkinter import ttk, messagebox def ensure_module(mod_name, pip_name): + """Import ``mod_name``, installing ``pip_name`` via pip if missing.""" try: __import__(mod_name) except ImportError: root = tk.Tk(); root.title("Installing dependencies") @@ -17,6 +20,7 @@ def ensure_module(mod_name, pip_name): import m18 class M18GUI(tk.Tk): + """Simple desktop interface for performing common M18 operations.""" def __init__(self): super().__init__() self.title("M18 Protocol GUI") @@ -37,6 +41,7 @@ def __init__(self): self.update_profile_display() def create_widgets(self): + """Build all tabs, controls, and shared output areas.""" self.notebook = ttk.Notebook(self); self.notebook.pack(fill="both", expand=True, padx=0, pady=0) self.main_tab, self.console_tab, self.sim_tab, self.about_tab = (ttk.Frame(self.notebook) for _ in range(4)) self.notebook.add(self.main_tab, text="Main Controls"); self.notebook.add(self.console_tab, text="Interactive Console") @@ -118,20 +123,34 @@ def on_tab_changed(event): table.insert("", "end", values=(addr,desc)) # -------- Utility / Port / Logging ---------- - def log(self, text, clear=False): self.output_text.delete("1.0", tk.END) if clear else None; self.output_text.insert(tk.END, text + "\n"); self.output_text.see(tk.END) - def sim_log(self, text): self.log(f"[SIM] {text}") - def set_status(self, text): self.status_var.set(text) + def log(self, text, clear=False): + """Append ``text`` to the shared output area, optionally clearing it.""" + self.output_text.delete("1.0", tk.END) if clear else None; self.output_text.insert(tk.END, text + "\n"); self.output_text.see(tk.END) + + def sim_log(self, text): + """Prefix simulation messages to distinguish them in the log area.""" + self.log(f"[SIM] {text}") + + def set_status(self, text): + """Update the status label at the top of the UI.""" + self.status_var.set(text) + def refresh_ports(self): + """Enumerate available serial ports and repopulate the dropdown.""" ports = list_ports.comports(); names = []; self.port_map.clear() for p in ports: label = f"{p.device} — {p.description} ({getattr(p,'manufacturer','') or ''})".strip() names.append(label); self.port_map[label] = p.device self.port_combo["values"] = names; self.port_combo.current(0) if names else self.port_combo.set("") self.set_status("Ports refreshed") + def require_connection(self): + """Warn the user if no device is connected before running an action.""" if self.m18_obj is None: messagebox.showwarning("Not connected", "Please connect to a port first."); return False return True + def capture_output(self, func, *a, **k): + """Run ``func`` while capturing stdout into a string.""" buf, old = io.StringIO(), sys.stdout try: sys.stdout = buf; func(*a, **k) finally: sys.stdout = old @@ -139,6 +158,7 @@ def capture_output(self, func, *a, **k): # --------- Connect/Disconnect ----------- def connect_device(self): + """Instantiate :class:`m18.M18` using the selected serial port.""" sel = self.port_var.get() port = self.port_map.get(sel, sel) try: self.m18_obj = m18.M18(port) @@ -150,8 +170,9 @@ def connect_device(self): for b in [self.disconnect_btn, self.idle_btn, self.health_btn, self.clipboard_btn, self.sim_start_btn]: b.configure(state="normal") def disconnect_device(self): + """Return the pack to idle, close the port, and reset UI state.""" self.stop_simulation() - if self.m18_obj: + if self.m18_obj: try: self.m18_obj.idle() except: pass try: self.m18_obj.port.close() @@ -163,6 +184,7 @@ def disconnect_device(self): # ----------- Command Handlers ----------- def cmd_idle(self): + """Invoke ``idle`` on the connected device in a worker thread.""" if not self.require_connection(): return def work(): try: @@ -174,6 +196,7 @@ def work(): threading.Thread(target=work, daemon=True).start() def cmd_health(self): + """Run ``health`` and display captured output.""" if not self.require_connection(): return def work(): try: @@ -188,6 +211,7 @@ def finish(): threading.Thread(target=work, daemon=True).start() def cmd_clipboard(self): + """Copy all register values to the clipboard.""" if not self.require_connection(): return def work(): try: @@ -203,6 +227,7 @@ def finish(): # ---------- Interactive Console ---------- def run_console_code(self): + """Execute arbitrary Python with the M18 object available as ``m``.""" code = self.console_text.get("1.0", tk.END).strip() if not code: messagebox.showinfo("No code", "Please enter some code."); return if not self.require_connection(): return @@ -224,6 +249,7 @@ def finish(): # ---------- Profile Display ---------- def on_profile_changed(self, event=None): self.update_profile_display() def update_profile_display(self): + """Show human readable info about the selected simulation profile.""" p = self.sim_profile_var.get() if p in self.sim_profiles: c, m = self.sim_profiles[p] @@ -231,6 +257,7 @@ def update_profile_display(self): self.profile_info_var.set(info) else: self.profile_info_var.set("Custom profile: adjust fields below.") def get_profile_currents(self): + """Return cutoff and max currents based on profile or custom fields.""" p = self.sim_profile_var.get() if p in self.sim_profiles: return self.sim_profiles[p] try: @@ -242,6 +269,7 @@ def get_profile_currents(self): # ---------- Simulation ---------- def start_simulation(self): + """Spawn a background thread to perform the charging dialogue.""" if not self.require_connection(): return if self.sim_thread and self.sim_thread.is_alive(): messagebox.showinfo("Running", "Simulation already running."); return @@ -288,6 +316,7 @@ def start_simulation(self): ) def stop_simulation(self): + """Signal the simulation worker to exit.""" if self.sim_stop_event: self.sim_stop_event.set() @@ -301,6 +330,7 @@ def _simulation_worker( max_raw, max_amps, ): + """Perform the scripted keepalive dialogue for the configured duration.""" m = self.m18_obj if m is None: self.after( From 895037738ec107b30188ac80245b859c86532812 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sat, 13 Dec 2025 22:53:20 -0500 Subject: [PATCH 06/61] Began work on advanced GUI with full settings, ported to C#. --- .../ColorByRegexConfig.txt | 10 + .../DesignTimeBuild/.dtbcache.v2 | Bin 0 -> 115252 bytes ...685ff634-f535-4eac-aa70-e6aa7232e97b.vsidx | Bin 0 -> 107 bytes ...a9d78f83-41c1-41e5-9ba3-44871b9ea2d8.vsidx | Bin 0 -> 549340 bytes ...b81dfdc3-818e-4d4c-bf4a-61922e61b362.vsidx | Bin 0 -> 140 bytes ...d3b49ca1-96f4-44b0-8eee-d4d8bf6b1c72.vsidx | Bin 0 -> 79794 bytes .vs/M18BatteryInfo.slnx/v18/.futdcache.v2 | Bin 0 -> 104 bytes .vs/M18BatteryInfo.slnx/v18/.suo | Bin 0 -> 33792 bytes .../v18/DocumentLayout.backup.json | 36 + .../v18/DocumentLayout.json | 36 + .../m18batteryinfo.metadata.v10.bin | Bin 0 -> 1493 bytes .../m18batteryinfo.projects.v10.bin | Bin 0 -> 54936 bytes .../m18batteryinfo.strings.v10.bin | Bin 0 -> 136740 bytes M18.ico | Bin 0 -> 199871 bytes M18AnalyzerMain.Designer.cs | 905 +++++ M18AnalyzerMain.cs | 30 + M18AnalyzerMain.resx | 3460 +++++++++++++++++ M18BatteryInfo.csproj | 11 + M18BatteryInfo.csproj.user | 8 + M18BatteryInfo.slnx | 3 + Program.cs | 17 + .../net10.0-windows/M18BatteryInfo.deps.json | 23 + bin/Debug/net10.0-windows/M18BatteryInfo.dll | Bin 0 -> 219136 bytes bin/Debug/net10.0-windows/M18BatteryInfo.exe | Bin 0 -> 162304 bytes bin/Debug/net10.0-windows/M18BatteryInfo.pdb | Bin 0 -> 15756 bytes .../M18BatteryInfo.runtimeconfig.json | 19 + ...oreApp,Version=v10.0.AssemblyAttributes.cs | 4 + .../M18BatteryInfo.AssemblyInfo.cs | 25 + .../M18BatteryInfo.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 24 + .../M18BatteryInfo.GlobalUsings.g.cs | 10 + .../M18BatteryInfo.assets.cache | Bin 0 -> 230 bytes ...8BatteryInfo.csproj.BuildWithSkipAnalyzers | 0 ...BatteryInfo.csproj.CoreCompileInputs.cache | 1 + ...M18BatteryInfo.csproj.FileListAbsolute.txt | 17 + ...8BatteryInfo.csproj.GenerateResource.cache | Bin 0 -> 54 bytes .../M18BatteryInfo.designer.deps.json | 11 + ...M18BatteryInfo.designer.runtimeconfig.json | 25 + obj/Debug/net10.0-windows/M18BatteryInfo.dll | Bin 0 -> 219136 bytes .../M18BatteryInfo.frmMain.resources | Bin 0 -> 200337 bytes .../M18BatteryInfo.genruntimeconfig.cache | 1 + obj/Debug/net10.0-windows/M18BatteryInfo.pdb | Bin 0 -> 15756 bytes .../M18BatteryInfo.sourcelink.json | 1 + obj/Debug/net10.0-windows/apphost.exe | Bin 0 -> 162304 bytes .../net10.0-windows/ref/M18BatteryInfo.dll | Bin 0 -> 5632 bytes .../net10.0-windows/refint/M18BatteryInfo.dll | Bin 0 -> 5632 bytes obj/M18BatteryInfo.csproj.nuget.dgspec.json | 367 ++ obj/M18BatteryInfo.csproj.nuget.g.props | 16 + obj/M18BatteryInfo.csproj.nuget.g.targets | 2 + obj/project.assets.json | 373 ++ obj/project.nuget.cache | 8 + 51 files changed, 5444 insertions(+) create mode 100644 .vs/M18BatteryInfo.slnx/ColorByRegexConfig.txt create mode 100644 .vs/M18BatteryInfo.slnx/DesignTimeBuild/.dtbcache.v2 create mode 100644 .vs/M18BatteryInfo.slnx/FileContentIndex/685ff634-f535-4eac-aa70-e6aa7232e97b.vsidx create mode 100644 .vs/M18BatteryInfo.slnx/FileContentIndex/a9d78f83-41c1-41e5-9ba3-44871b9ea2d8.vsidx create mode 100644 .vs/M18BatteryInfo.slnx/FileContentIndex/b81dfdc3-818e-4d4c-bf4a-61922e61b362.vsidx create mode 100644 .vs/M18BatteryInfo.slnx/FileContentIndex/d3b49ca1-96f4-44b0-8eee-d4d8bf6b1c72.vsidx create mode 100644 .vs/M18BatteryInfo.slnx/v18/.futdcache.v2 create mode 100644 .vs/M18BatteryInfo.slnx/v18/.suo create mode 100644 .vs/M18BatteryInfo.slnx/v18/DocumentLayout.backup.json create mode 100644 .vs/M18BatteryInfo.slnx/v18/DocumentLayout.json create mode 100644 .vs/ProjectEvaluation/m18batteryinfo.metadata.v10.bin create mode 100644 .vs/ProjectEvaluation/m18batteryinfo.projects.v10.bin create mode 100644 .vs/ProjectEvaluation/m18batteryinfo.strings.v10.bin create mode 100644 M18.ico create mode 100644 M18AnalyzerMain.Designer.cs create mode 100644 M18AnalyzerMain.cs create mode 100644 M18AnalyzerMain.resx create mode 100644 M18BatteryInfo.csproj create mode 100644 M18BatteryInfo.csproj.user create mode 100644 M18BatteryInfo.slnx create mode 100644 Program.cs create mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.deps.json create mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.dll create mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.exe create mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.pdb create mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.runtimeconfig.json create mode 100644 obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.GlobalUsings.g.cs create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.assets.cache create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.csproj.BuildWithSkipAnalyzers create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.csproj.GenerateResource.cache create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.designer.deps.json create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.designer.runtimeconfig.json create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.dll create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.frmMain.resources create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.genruntimeconfig.cache create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.pdb create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.sourcelink.json create mode 100644 obj/Debug/net10.0-windows/apphost.exe create mode 100644 obj/Debug/net10.0-windows/ref/M18BatteryInfo.dll create mode 100644 obj/Debug/net10.0-windows/refint/M18BatteryInfo.dll create mode 100644 obj/M18BatteryInfo.csproj.nuget.dgspec.json create mode 100644 obj/M18BatteryInfo.csproj.nuget.g.props create mode 100644 obj/M18BatteryInfo.csproj.nuget.g.targets create mode 100644 obj/project.assets.json create mode 100644 obj/project.nuget.cache diff --git a/.vs/M18BatteryInfo.slnx/ColorByRegexConfig.txt b/.vs/M18BatteryInfo.slnx/ColorByRegexConfig.txt new file mode 100644 index 0000000..c078dde --- /dev/null +++ b/.vs/M18BatteryInfo.slnx/ColorByRegexConfig.txt @@ -0,0 +1,10 @@ +// This file contains rules to color document tabs by regular expressions. Each line contains a regular expression that will be tested against a file's full path. All files matching a regular expression will share a color. +// You can customize the color assigned to any group of files by right-clicking the tab and choosing "Set Tab Color." +// Regular expressions will be matched in the order they appear in this file. See https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expressions for syntax. +// Regular expressions are matched as case-insensitive by default. You can override this behavior using capture group options like "(?-i:expression)". +// Edit this file and save your changes to see changes immediately applied. Any errors encountered during parsing or evaluating expressions will appear in the Output Window in a pane named "Color by Regular Expression." +^.*\.cs$ +^.*\.fs$ +^.*\.vb$ +^.*\.cp?p?$ +^.*\.hp?p?$ diff --git a/.vs/M18BatteryInfo.slnx/DesignTimeBuild/.dtbcache.v2 b/.vs/M18BatteryInfo.slnx/DesignTimeBuild/.dtbcache.v2 new file mode 100644 index 0000000000000000000000000000000000000000..a26ef91280d8fede41a1b113a1a053299f7a272b GIT binary patch literal 115252 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 literal 0 HcmV?d00001 diff --git a/.vs/M18BatteryInfo.slnx/FileContentIndex/a9d78f83-41c1-41e5-9ba3-44871b9ea2d8.vsidx b/.vs/M18BatteryInfo.slnx/FileContentIndex/a9d78f83-41c1-41e5-9ba3-44871b9ea2d8.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..e7480cfcb9ca61b8f8dfc5fb8257563184dcbcae GIT binary patch literal 549340 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 + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); + tabControl1 = new TabControl(); + tabPage1 = new TabPage(); + grpOutput = new GroupBox(); + btnCopyOutput = new Button(); + btnReset = new Button(); + btnHealthReport = new Button(); + btnActive = new Button(); + rtbOutput = new RichTextBox(); + btnIdle = new Button(); + btnDisconnect = new Button(); + btnConnect = new Button(); + btnRefresh = new Button(); + lblSerialPort = new Label(); + comboBox1 = new ComboBox(); + tabAdvanced = new TabPage(); + btnRestoreTxRxState = new Button(); + grpTryCmd = new GroupBox(); + txtTryCmdLength = new TextBox(); + txtAddressLow = new TextBox(); + txtAddressHigh = new TextBox(); + lblTryCmdLength = new Label(); + lblAddressLow = new Label(); + lblAddrHigh = new Label(); + lblCommand = new Label(); + txtCommand = new TextBox(); + grpbxDebugCmd = new GroupBox(); + txtResponseLength = new TextBox(); + txtDebugCmdLength = new TextBox(); + txtAddrLSB = new TextBox(); + lblResponseLength = new Label(); + lblDebugCmdLength = new Label(); + lblLSB = new Label(); + lblMSB = new Label(); + txtAddrMSB = new TextBox(); + btnFullBrute = new Button(); + btnBruteAddr = new Button(); + btnSaveTxRxState = new Button(); + chkboxRxLog = new CheckBox(); + chkbxTXLog = new CheckBox(); + txtWriteMessage = new TextBox(); + btnWriteMessage = new Button(); + btnReadIDLabelled = new Button(); + btnReadIDRaw = new Button(); + btnReadAllSpreadsheet = new Button(); + btnReadAllRegisters = new Button(); + rtbAdvOutput = new RichTextBox(); + tabPage3 = new TabPage(); + comboBox4 = new ComboBox(); + comboBox3 = new ComboBox(); + cmbDuration = new ComboBox(); + tabDiagnostics = new TabPage(); + label6 = new Label(); + label5 = new Label(); + label4 = new Label(); + label3 = new Label(); + label2 = new Label(); + label1 = new Label(); + richTextBox1 = new RichTextBox(); + textBox6 = new TextBox(); + textBox5 = new TextBox(); + textBox4 = new TextBox(); + textBox3 = new TextBox(); + textBox2 = new TextBox(); + textBox1 = new TextBox(); + btnSubmitForm = new Button(); + tabAbout = new TabPage(); + toolTipSimpleTab = new ToolTip(components); + lblDuration = new Label(); + lblBaudRate = new Label(); + lblSimProfile = new Label(); + btnStartSim = new Button(); + btnStopSim = new Button(); + tabControl1.SuspendLayout(); + tabPage1.SuspendLayout(); + grpOutput.SuspendLayout(); + tabAdvanced.SuspendLayout(); + grpTryCmd.SuspendLayout(); + grpbxDebugCmd.SuspendLayout(); + tabPage3.SuspendLayout(); + tabDiagnostics.SuspendLayout(); + SuspendLayout(); + // + // tabControl1 + // + tabControl1.Controls.Add(tabPage1); + tabControl1.Controls.Add(tabAdvanced); + tabControl1.Controls.Add(tabPage3); + tabControl1.Controls.Add(tabDiagnostics); + tabControl1.Controls.Add(tabAbout); + tabControl1.Location = new Point(8, 8); + tabControl1.Name = "tabControl1"; + tabControl1.SelectedIndex = 0; + tabControl1.Size = new Size(908, 484); + tabControl1.TabIndex = 0; + // + // tabPage1 + // + tabPage1.Controls.Add(grpOutput); + tabPage1.Controls.Add(btnDisconnect); + tabPage1.Controls.Add(btnConnect); + tabPage1.Controls.Add(btnRefresh); + tabPage1.Controls.Add(lblSerialPort); + tabPage1.Controls.Add(comboBox1); + tabPage1.Location = new Point(4, 34); + tabPage1.Name = "tabPage1"; + tabPage1.Padding = new Padding(3); + tabPage1.Size = new Size(900, 446); + tabPage1.TabIndex = 0; + tabPage1.Text = "Simple"; + tabPage1.UseVisualStyleBackColor = true; + // + // grpOutput + // + grpOutput.Controls.Add(btnCopyOutput); + grpOutput.Controls.Add(btnReset); + grpOutput.Controls.Add(btnHealthReport); + grpOutput.Controls.Add(btnActive); + grpOutput.Controls.Add(rtbOutput); + grpOutput.Controls.Add(btnIdle); + grpOutput.Location = new Point(6, 88); + grpOutput.Name = "grpOutput"; + grpOutput.Size = new Size(882, 352); + grpOutput.TabIndex = 6; + grpOutput.TabStop = false; + grpOutput.Text = "Output"; + // + // btnCopyOutput + // + btnCopyOutput.Location = new Point(728, 144); + btnCopyOutput.Name = "btnCopyOutput"; + btnCopyOutput.Size = new Size(148, 34); + btnCopyOutput.TabIndex = 11; + btnCopyOutput.Text = "Copy Output"; + toolTipSimpleTab.SetToolTip(btnCopyOutput, "Send 0xAA to battery. \r\nReturn true if battery replies wih 0xAA"); + btnCopyOutput.UseVisualStyleBackColor = true; + // + // btnReset + // + btnReset.Location = new Point(728, 304); + btnReset.Name = "btnReset"; + btnReset.Size = new Size(148, 34); + btnReset.TabIndex = 10; + btnReset.Text = "Reset"; + toolTipSimpleTab.SetToolTip(btnReset, "Send 0xAA to battery. \r\nReturn true if battery replies wih 0xAA"); + btnReset.UseVisualStyleBackColor = true; + // + // btnHealthReport + // + btnHealthReport.Location = new Point(728, 104); + btnHealthReport.Name = "btnHealthReport"; + btnHealthReport.Size = new Size(148, 34); + btnHealthReport.TabIndex = 9; + btnHealthReport.Text = "Health Report"; + toolTipSimpleTab.SetToolTip(btnHealthReport, "Print simple health report on the connected battery."); + btnHealthReport.UseVisualStyleBackColor = true; + // + // btnActive + // + btnActive.Location = new Point(728, 64); + btnActive.Name = "btnActive"; + btnActive.Size = new Size(148, 34); + btnActive.TabIndex = 8; + btnActive.Text = "Active (Tx High)"; + toolTipSimpleTab.SetToolTip(btnActive, "Charger simulation active.\r\nMay increase battery charge counter.\r\nNot safe to connect or disconnect battery during this state."); + btnActive.UseVisualStyleBackColor = true; + // + // rtbOutput + // + rtbOutput.Location = new Point(6, 30); + rtbOutput.Name = "rtbOutput"; + rtbOutput.Size = new Size(714, 314); + rtbOutput.TabIndex = 0; + rtbOutput.Text = "Step 1: Set Idle.\nStep 2: Connect Battery.\nStep 3: Set Active."; + // + // btnIdle + // + btnIdle.Location = new Point(728, 24); + btnIdle.Name = "btnIdle"; + btnIdle.Size = new Size(148, 34); + btnIdle.TabIndex = 7; + btnIdle.Text = "Idle (Tx Low)"; + toolTipSimpleTab.SetToolTip(btnIdle, "Does not increase charge count.\r\nSafe to connect or disconnect battery."); + btnIdle.UseVisualStyleBackColor = true; + // + // btnDisconnect + // + btnDisconnect.Location = new Point(344, 48); + btnDisconnect.Name = "btnDisconnect"; + btnDisconnect.Size = new Size(112, 34); + btnDisconnect.TabIndex = 5; + btnDisconnect.Text = "Disconnect"; + btnDisconnect.UseVisualStyleBackColor = true; + // + // btnConnect + // + btnConnect.Location = new Point(224, 48); + btnConnect.Name = "btnConnect"; + btnConnect.Size = new Size(112, 34); + btnConnect.TabIndex = 4; + btnConnect.Text = "Connect"; + toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); + btnConnect.UseVisualStyleBackColor = true; + // + // btnRefresh + // + btnRefresh.Location = new Point(104, 48); + btnRefresh.Name = "btnRefresh"; + btnRefresh.Size = new Size(112, 34); + btnRefresh.TabIndex = 3; + btnRefresh.Text = "Refresh"; + toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the serial port list."); + btnRefresh.UseVisualStyleBackColor = true; + // + // lblSerialPort + // + lblSerialPort.AutoSize = true; + lblSerialPort.Location = new Point(6, 14); + lblSerialPort.Name = "lblSerialPort"; + lblSerialPort.Size = new Size(95, 25); + lblSerialPort.TabIndex = 2; + lblSerialPort.Text = "Serial Port:"; + // + // comboBox1 + // + comboBox1.FormattingEnabled = true; + comboBox1.Location = new Point(107, 11); + comboBox1.Name = "comboBox1"; + comboBox1.Size = new Size(781, 33); + comboBox1.TabIndex = 1; + // + // tabAdvanced + // + tabAdvanced.Controls.Add(btnRestoreTxRxState); + tabAdvanced.Controls.Add(grpTryCmd); + tabAdvanced.Controls.Add(grpbxDebugCmd); + tabAdvanced.Controls.Add(btnFullBrute); + tabAdvanced.Controls.Add(btnBruteAddr); + tabAdvanced.Controls.Add(btnSaveTxRxState); + tabAdvanced.Controls.Add(chkboxRxLog); + tabAdvanced.Controls.Add(chkbxTXLog); + tabAdvanced.Controls.Add(txtWriteMessage); + tabAdvanced.Controls.Add(btnWriteMessage); + tabAdvanced.Controls.Add(btnReadIDLabelled); + tabAdvanced.Controls.Add(btnReadIDRaw); + tabAdvanced.Controls.Add(btnReadAllSpreadsheet); + tabAdvanced.Controls.Add(btnReadAllRegisters); + tabAdvanced.Controls.Add(rtbAdvOutput); + tabAdvanced.Location = new Point(4, 34); + tabAdvanced.Name = "tabAdvanced"; + tabAdvanced.Padding = new Padding(3); + tabAdvanced.Size = new Size(900, 446); + tabAdvanced.TabIndex = 1; + tabAdvanced.Text = "Advanced"; + tabAdvanced.UseVisualStyleBackColor = true; + // + // btnRestoreTxRxState + // + btnRestoreTxRxState.Location = new Point(8, 232); + btnRestoreTxRxState.Name = "btnRestoreTxRxState"; + btnRestoreTxRxState.Size = new Size(208, 34); + btnRestoreTxRxState.TabIndex = 15; + btnRestoreTxRxState.Text = "Restore TxRx State"; + btnRestoreTxRxState.UseVisualStyleBackColor = true; + // + // grpTryCmd + // + grpTryCmd.Controls.Add(txtTryCmdLength); + grpTryCmd.Controls.Add(txtAddressLow); + grpTryCmd.Controls.Add(txtAddressHigh); + grpTryCmd.Controls.Add(lblTryCmdLength); + grpTryCmd.Controls.Add(lblAddressLow); + grpTryCmd.Controls.Add(lblAddrHigh); + grpTryCmd.Controls.Add(lblCommand); + grpTryCmd.Controls.Add(txtCommand); + grpTryCmd.Location = new Point(560, 8); + grpTryCmd.Name = "grpTryCmd"; + grpTryCmd.Size = new Size(328, 184); + grpTryCmd.TabIndex = 14; + grpTryCmd.TabStop = false; + grpTryCmd.Text = "Try Command"; + // + // txtTryCmdLength + // + txtTryCmdLength.Location = new Point(160, 144); + txtTryCmdLength.Name = "txtTryCmdLength"; + txtTryCmdLength.Size = new Size(160, 31); + txtTryCmdLength.TabIndex = 14; + // + // txtAddressLow + // + txtAddressLow.Location = new Point(160, 104); + txtAddressLow.Name = "txtAddressLow"; + txtAddressLow.Size = new Size(160, 31); + txtAddressLow.TabIndex = 13; + // + // txtAddressHigh + // + txtAddressHigh.Location = new Point(160, 64); + txtAddressHigh.Name = "txtAddressHigh"; + txtAddressHigh.Size = new Size(160, 31); + txtAddressHigh.TabIndex = 12; + // + // lblTryCmdLength + // + lblTryCmdLength.AutoSize = true; + lblTryCmdLength.Location = new Point(8, 152); + lblTryCmdLength.Name = "lblTryCmdLength"; + lblTryCmdLength.Size = new Size(66, 25); + lblTryCmdLength.TabIndex = 11; + lblTryCmdLength.Text = "Length"; + // + // lblAddressLow + // + lblAddressLow.AutoSize = true; + lblAddressLow.Location = new Point(8, 112); + lblAddressLow.Name = "lblAddressLow"; + lblAddressLow.Size = new Size(114, 25); + lblAddressLow.TabIndex = 10; + lblAddressLow.Text = "Address Low"; + // + // lblAddrHigh + // + lblAddrHigh.AutoSize = true; + lblAddrHigh.Location = new Point(8, 72); + lblAddrHigh.Name = "lblAddrHigh"; + lblAddrHigh.Size = new Size(120, 25); + lblAddrHigh.TabIndex = 9; + lblAddrHigh.Text = "Address High"; + // + // lblCommand + // + lblCommand.AutoSize = true; + lblCommand.Location = new Point(8, 32); + lblCommand.Name = "lblCommand"; + lblCommand.Size = new Size(96, 25); + lblCommand.TabIndex = 8; + lblCommand.Text = "Command"; + // + // txtCommand + // + txtCommand.Location = new Point(160, 24); + txtCommand.Name = "txtCommand"; + txtCommand.Size = new Size(160, 31); + txtCommand.TabIndex = 7; + // + // grpbxDebugCmd + // + grpbxDebugCmd.Controls.Add(txtResponseLength); + grpbxDebugCmd.Controls.Add(txtDebugCmdLength); + grpbxDebugCmd.Controls.Add(txtAddrLSB); + grpbxDebugCmd.Controls.Add(lblResponseLength); + grpbxDebugCmd.Controls.Add(lblDebugCmdLength); + grpbxDebugCmd.Controls.Add(lblLSB); + grpbxDebugCmd.Controls.Add(lblMSB); + grpbxDebugCmd.Controls.Add(txtAddrMSB); + grpbxDebugCmd.Location = new Point(224, 8); + grpbxDebugCmd.Name = "grpbxDebugCmd"; + grpbxDebugCmd.Size = new Size(328, 184); + grpbxDebugCmd.TabIndex = 13; + grpbxDebugCmd.TabStop = false; + grpbxDebugCmd.Text = "Debug Command"; + // + // txtResponseLength + // + txtResponseLength.Location = new Point(160, 144); + txtResponseLength.Name = "txtResponseLength"; + txtResponseLength.Size = new Size(160, 31); + txtResponseLength.TabIndex = 14; + // + // txtDebugCmdLength + // + txtDebugCmdLength.Location = new Point(160, 104); + txtDebugCmdLength.Name = "txtDebugCmdLength"; + txtDebugCmdLength.Size = new Size(160, 31); + txtDebugCmdLength.TabIndex = 13; + // + // txtAddrLSB + // + txtAddrLSB.Location = new Point(160, 64); + txtAddrLSB.Name = "txtAddrLSB"; + txtAddrLSB.Size = new Size(160, 31); + txtAddrLSB.TabIndex = 12; + // + // lblResponseLength + // + lblResponseLength.AutoSize = true; + lblResponseLength.Location = new Point(8, 152); + lblResponseLength.Name = "lblResponseLength"; + lblResponseLength.Size = new Size(147, 25); + lblResponseLength.TabIndex = 11; + lblResponseLength.Text = "Response Length"; + lblResponseLength.Click += lblResponseLength_Click; + // + // lblDebugCmdLength + // + lblDebugCmdLength.AutoSize = true; + lblDebugCmdLength.Location = new Point(8, 112); + lblDebugCmdLength.Name = "lblDebugCmdLength"; + lblDebugCmdLength.Size = new Size(66, 25); + lblDebugCmdLength.TabIndex = 10; + lblDebugCmdLength.Text = "Length"; + // + // lblLSB + // + lblLSB.AutoSize = true; + lblLSB.Location = new Point(8, 72); + lblLSB.Name = "lblLSB"; + lblLSB.Size = new Size(110, 25); + lblLSB.TabIndex = 9; + lblLSB.Text = "LSB Address"; + // + // lblMSB + // + lblMSB.AutoSize = true; + lblMSB.Location = new Point(8, 32); + lblMSB.Name = "lblMSB"; + lblMSB.Size = new Size(118, 25); + lblMSB.TabIndex = 8; + lblMSB.Text = "MSB Address"; + // + // txtAddrMSB + // + txtAddrMSB.Location = new Point(160, 24); + txtAddrMSB.Name = "txtAddrMSB"; + txtAddrMSB.Size = new Size(160, 31); + txtAddrMSB.TabIndex = 7; + // + // btnFullBrute + // + btnFullBrute.Location = new Point(8, 320); + btnFullBrute.Name = "btnFullBrute"; + btnFullBrute.Size = new Size(208, 34); + btnFullBrute.TabIndex = 12; + btnFullBrute.Text = "Brute Force All"; + btnFullBrute.UseVisualStyleBackColor = true; + // + // btnBruteAddr + // + btnBruteAddr.Location = new Point(8, 280); + btnBruteAddr.Name = "btnBruteAddr"; + btnBruteAddr.Size = new Size(208, 34); + btnBruteAddr.TabIndex = 11; + btnBruteAddr.Text = "Brute Force Addresses"; + btnBruteAddr.UseVisualStyleBackColor = true; + // + // btnSaveTxRxState + // + btnSaveTxRxState.Location = new Point(8, 192); + btnSaveTxRxState.Name = "btnSaveTxRxState"; + btnSaveTxRxState.Size = new Size(208, 34); + btnSaveTxRxState.TabIndex = 10; + btnSaveTxRxState.Text = "Save && Set TxRx State"; + btnSaveTxRxState.UseVisualStyleBackColor = true; + // + // chkboxRxLog + // + chkboxRxLog.AutoSize = true; + chkboxRxLog.Location = new Point(368, 376); + chkboxRxLog.Name = "chkboxRxLog"; + chkboxRxLog.Size = new Size(149, 29); + chkboxRxLog.TabIndex = 8; + chkboxRxLog.Text = "Enable Rx Log"; + chkboxRxLog.UseVisualStyleBackColor = true; + // + // chkbxTXLog + // + chkbxTXLog.AutoSize = true; + chkbxTXLog.Location = new Point(224, 376); + chkbxTXLog.Name = "chkbxTXLog"; + chkbxTXLog.Size = new Size(150, 29); + chkbxTXLog.TabIndex = 7; + chkbxTXLog.Text = "Enable TX Log"; + chkbxTXLog.UseVisualStyleBackColor = true; + // + // txtWriteMessage + // + txtWriteMessage.Location = new Point(224, 408); + txtWriteMessage.Name = "txtWriteMessage"; + txtWriteMessage.Size = new Size(664, 31); + txtWriteMessage.TabIndex = 6; + txtWriteMessage.Text = "Write ASCII To Register. 20 Characters Max."; + // + // btnWriteMessage + // + btnWriteMessage.Location = new Point(8, 408); + btnWriteMessage.Name = "btnWriteMessage"; + btnWriteMessage.Size = new Size(208, 34); + btnWriteMessage.TabIndex = 5; + btnWriteMessage.Text = "Write Message"; + btnWriteMessage.UseVisualStyleBackColor = true; + // + // btnReadIDLabelled + // + btnReadIDLabelled.Location = new Point(8, 144); + btnReadIDLabelled.Name = "btnReadIDLabelled"; + btnReadIDLabelled.Size = new Size(208, 34); + btnReadIDLabelled.TabIndex = 4; + btnReadIDLabelled.Text = "Read ID (Labelled)"; + btnReadIDLabelled.UseVisualStyleBackColor = true; + // + // btnReadIDRaw + // + btnReadIDRaw.Location = new Point(8, 104); + btnReadIDRaw.Name = "btnReadIDRaw"; + btnReadIDRaw.Size = new Size(208, 34); + btnReadIDRaw.TabIndex = 3; + btnReadIDRaw.Text = "Read ID (Raw)"; + btnReadIDRaw.UseVisualStyleBackColor = true; + // + // btnReadAllSpreadsheet + // + btnReadAllSpreadsheet.Location = new Point(8, 48); + btnReadAllSpreadsheet.Name = "btnReadAllSpreadsheet"; + btnReadAllSpreadsheet.Size = new Size(208, 34); + btnReadAllSpreadsheet.TabIndex = 2; + btnReadAllSpreadsheet.Text = "Read All Spreadsheet"; + btnReadAllSpreadsheet.UseVisualStyleBackColor = true; + // + // btnReadAllRegisters + // + btnReadAllRegisters.Location = new Point(8, 8); + btnReadAllRegisters.Name = "btnReadAllRegisters"; + btnReadAllRegisters.Size = new Size(208, 34); + btnReadAllRegisters.TabIndex = 1; + btnReadAllRegisters.Text = "Read All Registers"; + btnReadAllRegisters.UseVisualStyleBackColor = true; + // + // rtbAdvOutput + // + rtbAdvOutput.Location = new Point(224, 200); + rtbAdvOutput.Name = "rtbAdvOutput"; + rtbAdvOutput.Size = new Size(664, 176); + rtbAdvOutput.TabIndex = 0; + rtbAdvOutput.Text = ""; + // + // tabPage3 + // + tabPage3.Controls.Add(btnStopSim); + tabPage3.Controls.Add(btnStartSim); + tabPage3.Controls.Add(lblSimProfile); + tabPage3.Controls.Add(lblBaudRate); + tabPage3.Controls.Add(lblDuration); + tabPage3.Controls.Add(comboBox4); + tabPage3.Controls.Add(comboBox3); + tabPage3.Controls.Add(cmbDuration); + tabPage3.Location = new Point(4, 34); + tabPage3.Name = "tabPage3"; + tabPage3.Padding = new Padding(3); + tabPage3.Size = new Size(900, 446); + tabPage3.TabIndex = 2; + tabPage3.Text = "Simulation"; + tabPage3.UseVisualStyleBackColor = true; + // + // comboBox4 + // + comboBox4.FormattingEnabled = true; + comboBox4.Location = new Point(152, 88); + comboBox4.Name = "comboBox4"; + comboBox4.Size = new Size(232, 33); + comboBox4.TabIndex = 2; + // + // comboBox3 + // + comboBox3.FormattingEnabled = true; + comboBox3.Location = new Point(152, 48); + comboBox3.Name = "comboBox3"; + comboBox3.Size = new Size(232, 33); + comboBox3.TabIndex = 1; + // + // cmbDuration + // + cmbDuration.FormattingEnabled = true; + cmbDuration.Location = new Point(152, 8); + cmbDuration.Name = "cmbDuration"; + cmbDuration.Size = new Size(232, 33); + cmbDuration.TabIndex = 0; + // + // tabDiagnostics + // + tabDiagnostics.Controls.Add(label6); + tabDiagnostics.Controls.Add(label5); + tabDiagnostics.Controls.Add(label4); + tabDiagnostics.Controls.Add(label3); + tabDiagnostics.Controls.Add(label2); + tabDiagnostics.Controls.Add(label1); + tabDiagnostics.Controls.Add(richTextBox1); + tabDiagnostics.Controls.Add(textBox6); + tabDiagnostics.Controls.Add(textBox5); + tabDiagnostics.Controls.Add(textBox4); + tabDiagnostics.Controls.Add(textBox3); + tabDiagnostics.Controls.Add(textBox2); + tabDiagnostics.Controls.Add(textBox1); + tabDiagnostics.Controls.Add(btnSubmitForm); + tabDiagnostics.Location = new Point(4, 34); + tabDiagnostics.Name = "tabDiagnostics"; + tabDiagnostics.Padding = new Padding(3); + tabDiagnostics.Size = new Size(900, 446); + tabDiagnostics.TabIndex = 3; + tabDiagnostics.Text = "Submit Diagnostics"; + tabDiagnostics.UseVisualStyleBackColor = true; + // + // label6 + // + label6.AutoSize = true; + label6.Location = new Point(24, 208); + label6.Name = "label6"; + label6.Size = new Size(59, 25); + label6.TabIndex = 22; + label6.Text = "label6"; + // + // label5 + // + label5.AutoSize = true; + label5.Location = new Point(24, 168); + label5.Name = "label5"; + label5.Size = new Size(59, 25); + label5.TabIndex = 21; + label5.Text = "label5"; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(24, 128); + label4.Name = "label4"; + label4.Size = new Size(59, 25); + label4.TabIndex = 20; + label4.Text = "label4"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(24, 88); + label3.Name = "label3"; + label3.Size = new Size(59, 25); + label3.TabIndex = 19; + label3.Text = "label3"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(24, 48); + label2.Name = "label2"; + label2.Size = new Size(59, 25); + label2.TabIndex = 18; + label2.Text = "label2"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(24, 16); + label1.Name = "label1"; + label1.Size = new Size(59, 25); + label1.TabIndex = 17; + label1.Text = "label1"; + // + // richTextBox1 + // + richTextBox1.Location = new Point(8, 296); + richTextBox1.Name = "richTextBox1"; + richTextBox1.Size = new Size(248, 144); + richTextBox1.TabIndex = 16; + richTextBox1.Text = ""; + // + // textBox6 + // + textBox6.Location = new Point(96, 48); + textBox6.Name = "textBox6"; + textBox6.Size = new Size(150, 31); + textBox6.TabIndex = 15; + // + // textBox5 + // + textBox5.Location = new Point(96, 88); + textBox5.Name = "textBox5"; + textBox5.Size = new Size(150, 31); + textBox5.TabIndex = 14; + // + // textBox4 + // + textBox4.Location = new Point(96, 128); + textBox4.Name = "textBox4"; + textBox4.Size = new Size(150, 31); + textBox4.TabIndex = 13; + // + // textBox3 + // + textBox3.Location = new Point(96, 208); + textBox3.Name = "textBox3"; + textBox3.Size = new Size(150, 31); + textBox3.TabIndex = 12; + // + // textBox2 + // + textBox2.Location = new Point(96, 168); + textBox2.Name = "textBox2"; + textBox2.Size = new Size(150, 31); + textBox2.TabIndex = 11; + // + // textBox1 + // + textBox1.Location = new Point(96, 8); + textBox1.Name = "textBox1"; + textBox1.Size = new Size(150, 31); + textBox1.TabIndex = 10; + // + // btnSubmitForm + // + btnSubmitForm.Location = new Point(696, 400); + btnSubmitForm.Name = "btnSubmitForm"; + btnSubmitForm.Size = new Size(192, 34); + btnSubmitForm.TabIndex = 9; + btnSubmitForm.Text = "Submit Form"; + btnSubmitForm.UseVisualStyleBackColor = true; + // + // tabAbout + // + tabAbout.Location = new Point(4, 34); + tabAbout.Name = "tabAbout"; + tabAbout.Padding = new Padding(3); + tabAbout.Size = new Size(900, 446); + tabAbout.TabIndex = 4; + tabAbout.Text = "About"; + tabAbout.UseVisualStyleBackColor = true; + // + // lblDuration + // + lblDuration.AutoSize = true; + lblDuration.Location = new Point(8, 8); + lblDuration.Name = "lblDuration"; + lblDuration.Size = new Size(81, 25); + lblDuration.TabIndex = 3; + lblDuration.Text = "Duration"; + // + // lblBaudRate + // + lblBaudRate.AutoSize = true; + lblBaudRate.Location = new Point(8, 48); + lblBaudRate.Name = "lblBaudRate"; + lblBaudRate.Size = new Size(92, 25); + lblBaudRate.TabIndex = 4; + lblBaudRate.Text = "Baud Rate"; + // + // lblSimProfile + // + lblSimProfile.AutoSize = true; + lblSimProfile.Location = new Point(8, 88); + lblSimProfile.Name = "lblSimProfile"; + lblSimProfile.Size = new Size(129, 25); + lblSimProfile.TabIndex = 5; + lblSimProfile.Text = "Charger Profile"; + // + // btnStartSim + // + btnStartSim.Location = new Point(152, 128); + btnStartSim.Name = "btnStartSim"; + btnStartSim.Size = new Size(112, 34); + btnStartSim.TabIndex = 1; + btnStartSim.Text = "Start"; + btnStartSim.UseVisualStyleBackColor = true; + // + // btnStopSim + // + btnStopSim.Location = new Point(272, 128); + btnStopSim.Name = "btnStopSim"; + btnStopSim.Size = new Size(112, 34); + btnStopSim.TabIndex = 6; + btnStopSim.Text = "Stop"; + btnStopSim.UseVisualStyleBackColor = true; + // + // frmMain + // + AutoScaleDimensions = new SizeF(10F, 25F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(928, 499); + Controls.Add(tabControl1); + Icon = (Icon)resources.GetObject("$this.Icon"); + Name = "frmMain"; + ShowIcon = false; + Text = "M18 Pack Analyzer"; + Load += frmMain_Load; + tabControl1.ResumeLayout(false); + tabPage1.ResumeLayout(false); + tabPage1.PerformLayout(); + grpOutput.ResumeLayout(false); + tabAdvanced.ResumeLayout(false); + tabAdvanced.PerformLayout(); + grpTryCmd.ResumeLayout(false); + grpTryCmd.PerformLayout(); + grpbxDebugCmd.ResumeLayout(false); + grpbxDebugCmd.PerformLayout(); + tabPage3.ResumeLayout(false); + tabPage3.PerformLayout(); + tabDiagnostics.ResumeLayout(false); + tabDiagnostics.PerformLayout(); + ResumeLayout(false); + } + + #endregion + + private TabControl tabControl1; + private TabPage tabPage1; + private TabPage tabAdvanced; + private ComboBox comboBox1; + private RichTextBox rtbOutput; + private TabPage tabPage3; + private TabPage tabDiagnostics; + private Button btnConnect; + private Button btnRefresh; + private Label lblSerialPort; + private GroupBox grpOutput; + private Button btnDisconnect; + private Button btnIdle; + private Button btnActive; + private ToolTip toolTipSimpleTab; + private Button btnHealthReport; + private Button btnReset; + private Button btnCopyOutput; + private Button btnReadAllSpreadsheet; + private Button btnReadAllRegisters; + private RichTextBox rtbAdvOutput; + private TextBox txtWriteMessage; + private Button btnWriteMessage; + private Button btnReadIDLabelled; + private Button btnReadIDRaw; + private TabPage tabAbout; + private CheckBox chkboxRxLog; + private CheckBox chkbxTXLog; + private Button btnSaveTxRxState; + private Button btnBruteAddr; + private Button btnFullBrute; + private GroupBox grpbxDebugCmd; + private TextBox txtAddrMSB; + private Label lblResponseLength; + private Label lblDebugCmdLength; + private Label lblLSB; + private Label lblMSB; + private TextBox txtResponseLength; + private TextBox txtDebugCmdLength; + private TextBox txtAddrLSB; + private GroupBox grpTryCmd; + private TextBox txtTryCmdLength; + private TextBox txtAddressLow; + private TextBox txtAddressHigh; + private Label lblTryCmdLength; + private Label lblAddressLow; + private Label lblAddrHigh; + private Label lblCommand; + private TextBox txtCommand; + private ComboBox comboBox4; + private ComboBox comboBox3; + private ComboBox cmbDuration; + private Button btnRestoreTxRxState; + private Button btnSubmitForm; + private Label label6; + private Label label5; + private Label label4; + private Label label3; + private Label label2; + private Label label1; + private RichTextBox richTextBox1; + private TextBox textBox6; + private TextBox textBox5; + private TextBox textBox4; + private TextBox textBox3; + private TextBox textBox2; + private TextBox textBox1; + private Button btnStartSim; + private Label lblSimProfile; + private Label lblBaudRate; + private Label lblDuration; + private Button btnStopSim; + } +} diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs new file mode 100644 index 0000000..9d66819 --- /dev/null +++ b/M18AnalyzerMain.cs @@ -0,0 +1,30 @@ +namespace M18BatteryInfo +{ + public partial class frmMain : Form + { + public frmMain() + { + InitializeComponent(); + } + + private void toolStripButton1_Click(object sender, EventArgs e) + { + + } + + private void toolTipReset_Popup(object sender, PopupEventArgs e) + { + + } + + private void frmMain_Load(object sender, EventArgs e) + { + + } + + private void lblResponseLength_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/M18AnalyzerMain.resx b/M18AnalyzerMain.resx new file mode 100644 index 0000000..89df265 --- /dev/null +++ b/M18AnalyzerMain.resx @@ -0,0 +1,3460 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 9, 21 + + + + + AAABAAkAEBAAAAEAIABoBAAAlgAAABgYAAABACAAiAkAAP4EAAAgIAAAAQAgAKgQAACGDgAAMDAAAAEA + IACoJQAALh8AAEBAAAABACAAKEIAANZEAABISAAAAQAgAIhUAAD+hgAAYGAAAAEAIAColAAAhtsAAICA + AAABACAAKAgBAC5wAQAAAAAAAQAgAGmUAABWeAIAKAAAABAAAAAgAAAAAQAgAAAAAAAABAAAEwsAABML + AAAAAAAAAAAAADgx4LE8NuFqPTfhWDkz4JJCPOE6ODLgqT8550o8OzUyNDM3oDo5PUFJSUwoMTA0xCko + LPgvLjLWQkFESQAAAwAnIN3/LSbenS4n3pApIt3hMy3fXigh3fgwKeVtLCskSSIhJf8rKi52Li0xkCEg + JP8gHyP/IB8j/ykoLMpHR0odJyDd/y0m3p4sJt6hKCHd6jMs32ooId31MCnlbC0sIzwhICT4KiktlCUk + KMogHyP/IB8j/yAfI/8iISX6MTA0Yicg3f8tJt6iKyXesycg3fMyK994KCHd9C8p5G0uLiEwIiEl8yko + K60jIibbIB8j/iIhJcghICTeIB8j/ykoLJknIN3/LSfeqSsk3sMnIN35MSrfiSgh3fQvKeNuMTEfJiIh + JewoJyq8IyIm4CIhJeMxMDQkJiUpWiAfI/0mJSm6JyDd/y4n3rEqI97SJh/d/TAp35soId3zLynibjMz + Gx0iISXlJyYqwyQjJ9ohICTgLi0xFiQjJzUgHyP1JSQoyScg3f8uJ967KiPe3igh3f8vKd6tKCHd9C8p + 4W84OBUVIyIm3SYmKcQnJirEIB8j+iYlKYIlJCiNIB8j/iYlKcQnIN3/LifeyCsl3uMsJt7vLifewSgh + 3fQvKeBvPD4ADCMiJtMlJCjFLy4yjyEgJP8gHyP/IB8j/yAfI/8qKi2fJyDd/i0n3tcrJd7fLife0C0n + 3tYoId32MSvadVVWPR0lJCjOIyImz0A/QkkmJSntIB8j/yAfI/8kIyb5PDs+Yycg3f4tJ97oKyTe2S4o + 3rItJt7pKCHf9zIss5krKirGIiEl+CMiJtUxMDRpIiEl+SEgJOUiISXTISAk/iwsL6QnIN39LCbe+isk + 3tAvKN6ULCXe+igi3/wvKrGYIiEh5iAfI/8jIibdKyoujiAfI/8lJCd2LCwvKiEgJOQlJCjjJyDd/Scg + 3f8qJN7DMSrfeSch3f8nIN7/MCq6jiIhIt0gHyP/IiEl5SsqLpYgHyP/JSQofjQ0NxshICTZIyIm+icg + 3f0mH93/KiTeszIr32AnIN39Jh/e/zErxoMqKSm/ISAk/yIhJewsKy+PISAk/CIhJeUlJCfDIB8j+CIh + Jf4nIN39Jh/d/ywl3qM0Ld9KJyDd+SYf3f8wKt1xWFhCICopLbghICT1MC8zeSIhJe4gHyP/IB8j/yAf + I/8kIyb1JyDd/yYf3f8sJd6SNi/fOCgh3fQnIN3/LyjfcCckdwAwLzNZIiEl+DEwNFwpKCy7IB8j/yAf + I/8gHyP/KSgsxjQt364zLN+yODLgWkE74R40Lt+iNC3fsj034U01MZUAPj1BKDQzNrk8Oz9CQEBDQS4t + MNcoJyv9LSww2kA/Qk0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAKAAAABgAAAAwAAAAAQAgAAAAAAAACQAAEwsAABMLAAAAAAAAAAAAAElD + 431IQuKAUk3kN1VQ5B9JQ+J8S0bjZWdi5wxMRuNeSELigk9K408AACoATk1QMkdGSmxJSUxiWFdaEwAA + AABTUlVIOjk9yC4tMfMxMDTuPz5BrV5eYS4dHCAAAAAAACoj3vwpIt3/NS7fbzkz4EoqI979LSbe1ExG + 4x8tJ96+KCHd/zIs358AAAQAMC8ycCQjJ/8nJinsODc7MFRTViktLC/ZIB8j/x8eIv8fHiL/ISAk/zEw + NMRcW14fT05RACgh3fwmH93/MyzfbzUv310nIN3/KiPe4UQ+4iorJN69Jh/d/zAp36AAAAkALSwwZSEg + JP8iISX1NzY6PDQ0N38hICT/IB8j/yAfI/8gHyP/IB8j/yIhJf83NjqCAAAAACgh3fwnIN3/My3fcDMt + 33AmH93/KSLd60A64TcrJN69Jh/d/zAp36AAAA8ALy4xVyEgJP0iISX5NzY6UykoLLYgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8pKCzOVlVZGCgh3fwnIN3/NC3fcTEr34MmH93/KCHd8z024UYrJN68Jh/d/zAp + 36AAABMAMTAzSyIhJfohICT8NDM3bCUkKM8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8kIyfwPDs/QSgh + 3fwmIN3/NC7fcy8p3pYmH93/KCHd+joz4FYrJN67Jh/d/zAp36AAABQAMjE0PiIhJfUhICT+MTA0gCQj + J9ggHyP/IB8j/SMiJr8kIyekISAk7SAfI/8hICT8MjE0aSgh3fwmH93/NS7fdy4n3qkmH93/JyDd/jcx + 4GgrJN67Jh/d/zAp36AAABQANDQ3MyMiJu8gHyP/Ly4yjiQjJ9kgHyP/IyIm5DY1OSr///8BJyYqiCAf + I/8hICT/Li0wiSgh3fwmH93/NS/ffS0m3romH93/JyDd/zUv33srJd67Jh/d/zAp36AAAA8ANzY5KSMi + JukgHyP/Ly4xmCUkKNUgHyP/IyIm1Dk4PBQpKCwAJSQoTiAfI/sgHyP/Kyounigh3fwmH93/NS/fhCwl + 3skmH93/Jh/d/zMt344sJd68Jh/d/zAp36AAAAUAOTg8ICQjJ+EgHyP/Li0xnicmKskgHyP/IiEl3i8u + Mh0qKS0AJSQoRyAfI/kgHyP/KiktqCgh3fwmH93/NS/fjisk3tcmH93/Jh/d/zEr36IsJd6/Jh/d/zAp + 36AAAAAAPj1AGCQjJ9ggHyP/LCsvoSsqLrEgHyP/ISAk+CopLWk/PkIcJyYqgiAfI/8gHyP/KiotpCgh + 3fwmH93/NS/fmikj3uMsJd77KSLd/zAp3rQtJt7CJh/d/zAp36AAAAAAQ0NFESUkKM4gHyP/KSkspzMy + NochICT/IB8j/yEgJPIkIybeISAk9CAfI/8hICT/Li0xjigh3fwmH93+NS7fqCgi3e0wKt/hKiPe9C4n + 3sYtJt7IJh/d/zAp36AAAAAATExOCyYlKcMgHyP/JyYqs0RDR0olJCjzIB8j/yAfI/8gHyP/IB8j/yAf + I/8jIib5OTg7Xygh3fwmH93+NC7ftygh3fUyK9/DKyTe5S0m3tcuJ97PJh/d/zAp36AAAAAA29vZAicm + KrYgHyP/JiUpwmhnahQ3NjqqISAk/yAfI/8gHyP/IB8j/yAfI/8wLzPQYmFkHSgh3fwmH939NC3fySgh + 3fszLN+mKyTe1Swl3uUuJ97ZJh/d/zEq3qFNTE1JRERHcCopLdEfHiL/JSQozVZVWBcyMTSqISAk/yAf + I/8gHyP/IB8j/yAfI/8rKi7fT05RNCgh3fwnIN39Myzf2ycg3f40Lt+KLCXexSsk3vIuKN7kJh/d/zIr + 36EtLC+lIyIm/yEgJP8gHyP/JSQo1UJBRDglJCjfIB8j/yEgJPEkIye2IiEl0CAfI/8hICT/NDM3jCgh + 3fwnIN3+Mivf7ycg3f82L99xLSbetCoj3vwvKN7yJh/d/zEr4Z8rKi2XIB8j/yAfI/8gHyP/JCMn3Tk4 + O1EjIibsIB8j/yUkKKtWVVgIMTA0NyIhJeogHyP/Kyotxigh3fwnIN3/LSbe/Sch3f04MeBbLifeoygh + 3f8rJd79Jh/d/zEq450sKy6JIB8j/yAfI/8gHyP/IyIm5TY1OV4iISXuIB8j/yMiJpYYFxsALi0wECIh + Jc4gHyP/JyYq5igh3fwmH93/Jh/d/ygh3fk7NeBHLynekSYf3f8mH93/Jh/d/zAp45wtLC97IB8j/yAf + I/8gHyP/IyIm7DU1OGIjIibqIB8j/yUkKLlfXmELOzo+GCIhJdQgHyP/JSQo9ygh3fwmH93/Jh/d/ygh + 3fI8NuA1MSrffyYf3f8mH93/Jh/d/zAp5JsxMDJuIiEl/yAfI/8gHyP/IiEl8jY1OWEkIyfgIB8j/yEg + JPQpKCuqKCcrsSEgJPggHyP/JCMn/Sgh3fwmH93/Jh/d/yki3epAOuEmMivfbScg3f8mH93/Jh/d/y8o + 4Z1UU1MxPTw/licmKu0gHyP/IiEl+Dc2Ol0mJSnNIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JCMn+ygh + 3fwmH93/Jh/d/yoj3uBHQeIaNC3fXCcg3f4mH93/Jh/d/y8p3p8AAAAA////ADo5PXwiISX/ISAk/TU0 + N1otLDCmIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JiUp6ygh3fwmH93/Jh/d/ysk3tNMRuMQNjDgTCgh + 3fomH93/Jh/d/y8p3p////8ATEtRAEhHSigmJSnlISAk/y8uMmA7Oz5fIyIm/iAfI/8gHyP/IB8j/yAf + I/8gHyP/LSwwvyoj3vwoId3/KCHd/y0n3sRdWOYIOTPgPCoj3vMoId3/KCHd/zEr35////8AaGd2AGdm + aQkqKS29IiEk/y0tMHFycXQRMTA0uiEgJP8fHiL/Hx4i/x8eIv8nJirxQkFFXUE74X0/OeF/PznhgEQ+ + 4l2AfOsCT0njGUI84XdAOuF/QTvhgkxG41H///8AnJrCAP///wBHRkpnQUBDq0tKTVAvLjIAW1teLDw7 + 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 + rAQpKCyIIB8j/yAfI/8hICT/MTA0giki3fsmH93/KCHd+EA64W4rJN7fJh/d/ysk3v4mH93/Lifeyjkz + 4HsnIN3/Jh/d/y8o3sphW+YPWleaAFBPUxAnJirNIB8j/yAfI/8wLzOJOTg7eSEgJP8gHyP/IB8j/yMi + JuIqKS2lKCcrpyIhJeogHyP/IB8j/yIhJf01NDhxKSLd+yYf3f8oId33PjjhfCoj3ukoId3+Ni/f6iYf + 3f8sJd7XOTPghCcg3f4mH93/LyjeymFb5g9gXa4AXFteCygnK8IgHyP/IB8j/ywrL5ZKSUxHJSQo9iAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm9z49QVQpIt37Jh/d/ygh3fY9N+GLKSLd8Sgh + 3fk5MuDGJiDd/isk3uM5M+CRJyDd/iYf3f8vKN7KYVvmD2VhwwB1dHYGKSgstiAfI/8gHyP/KyotpnZ2 + eBcvLjLMHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8pKCzgVFNWKSki3fsmH93/KCHd9js1 + 4JwoId33KSLd8zs14KQnIN38KiPe7Dky4J8nIN39Jh/d/y8o3spfWukOdXOmAP///wEqKS2pIB8j/yAf + I/8qKS2009PTBExLTmMpKCz2IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/z8+QpbQ0NEEKSLd+yYf + 3f8oId32OjTgricg3fwqI97sPjjhgygh3fgpIt3zODLgrycg3fwmH93/Lyjeym9rzRWNjYgTmZmbFDAv + M6QgHyP/IB8j/ykoLMBlZGcHZWRnMi8vMugfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8mJSj/TU1QfwAA + AAApIt37Jh/d/yki3fY4MuDBJh/d/yok3uNCPOFmKSLd8ygh3fk3MeDAJyDd/CYf3f8uKOHHTUtpSzc2 + OcY1NDjLKikt6iAfI/8gHyP/KCcrzGtqbQ03Nzp6IiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8sKy/bXFteKSki3fsmH93/KSLd9zcx4NUmH93/LCXe2UZA4kwqI97sJyDd/TYw4NMnIN38Jh/d/y8o + 4sY/PlpSIiEl+B8eIv8gHyP/IB8j/yAfI/8nJinWWllcGi0sMKwgHyP/IB8j/yEgJPskIye6JiUpmyMi + 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 + 39BoY+cSlJHuBjMt37kmH93/Jh/d/yYf3f8tJt7nVE/kKAAA1QA1L9+WJh/d/yYf3f8mH93/KiPe+0lD + 4lI4MeAAhoWHAKampwUvLjGxIB8j/yAfI/8gHyP/IiEl/zs6PW0sKy8AWVhbRCgnK/QfHiP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8pKCz2W1pdUDU0OAAfHiMAKiPe+SYf + 3f8mH93/Jh/d/zEq39BoY+cSc27pDjIr38kmH93/Jh/d/yYf3f8sJd7wTknjNgAA1wA1L9+WJh/d/yYf + 3f8mH93/KiPe+0lD4lI4MeAAlZSWAP///wIwLzOkIB8j/yAfI/8gHyP/ISAk/zg3O3sAAAAAQkFFdyIh + Jf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT/Pz5Bn/// + /wOzs7QAKiPe+SYf3f8mH93/Jh/d/zEq39BpZOgRYVzmFzAp39cmH93/Jh/d/yYf3f8qI974SkTjRwAA + 1wA1L9+WJh/d/yYf3f8mH93/KiPe+0lD4lI4MeAAtbS2AAAAAAAyMTWXIB8j/yAfI/8gHyP/ISAk/zY1 + OIkAAAAANzY5oSAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/MC8z2XZ1dxxycnQAKiPe+SYf3f8mH93/Jh/d/zEq39BrZugQVU/kIi0n3uMmH93/Jh/d/yYf + 3f8pIt39RT/iWAAA1gA1L9+WJh/d/yYf3f8mH93/KiPe+0lD4lI4MeAA/f39AAAAAAA1NDeJISAk/yAf + I/8gHyP/IB8j/zQzNpbFxMUILy4yvCAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/JyYq9VNSVkRCQUUAKiPe+SYf3f8mH93/Jh/d/zEq39BuaegQUEvkMCwl + 3u0mH93/Jh/d/yYf3f8oId3/QTvhagAA0wA1L9+WJh/d/yYf3f8mH93/KiPe+0lD4lI4MeAAAAAAAAAA + AAA3Njp7ISAk/yAfI/8gHyP/IB8j/zEwNKN9fX8SKyouzCAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl/0NCRXAIBwsAKiPe+SYf3f8mH93/Jh/d/zEq + 39BybukPSUTjPysk3vUmH93/Jh/d/yYf3f8nIN3/PTfhfQAAzQA1L9+WJh/d/yYf3f8mH93/KiPe+0lD + 4lI4MeAAnZ2fABYVGQA4NzttIiEl/yAfI/8gHyP/IB8j/zAvMrBoZ2ocKSgs1SAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yEgJPQiISXuISAk9iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zc2OpYAAAAAKiPe+SYf + 3f8mH93/Jh/d/zEq39B3c+oOQz3iTyki3fomH93/Jh/d/yYf3f8mH93/OjTgkAAAuAA1L9+WJh/d/yYf + 3f8mH93/KiPe+0lD4lI4MeAA5ubnACQjJgA6OT1fIiEl/iAfI/8gHyP/IB8j/y0sMLxfXmEjKCcr2iAf + I/8gHyP/IB8j/yAfI/8gHyP/JSQoxi8uMV4xMDRJLi0wbSUkKNkgHyP/IB8j/yAfI/8gHyP/IB8j/zAv + M7WdnZ8IKiPe+SYf3f8mH93/Jh/d/zEq39B8eOsOQTvhYigh3f8mH93/Jh/d/yYf3f8mH93/NzHgo/// + /wE1L9+WJh/d/yYf3f8mH93/KiPe+0lD4lI4MeAA////AC4tMAA/PkFTIyIm+yAfI/8gHyP/IB8j/ysq + LsdaWl0pJyYq2iAfI/8gHyP/IB8j/yAfI/8kIyfxPTxASQAAAAAWFRkAAAAAADg3O1ciISXwIB8j/yAf + I/8gHyP/IB8j/ywrL8xtbG8UKiPe+SYf3f8mH93/Jh/d/zEq39B/e+sPPTfhdCcg3f8mH93/Jh/d/yYf + 3f8mH93/NS7fterq/AU1L9+VJh/d/yYf3f8mH93/KiPe+0lD4lI4MeAA/v7/ADY1OQBCQUVGJCMn+CAf + I/8gHyP/IB8j/yopLdFbWl0uKCcr1yAfI/8gHyP/IB8j/yAfI/8pKCvTY2JlF2FgYwAAAAAAUFBTAFhY + Ww4mJSnAIB8j/yAfI/8gHyP/IB8j/yopLdxcW14iKiPe+SYf3f8mH93/Jh/d/zEq39CAfOsQOjTgiCcg + 3f8mH93/Jh/d/yYf3f8mH93/MizfxZaT7ww1Lt+VJh/d/yYf3f8mH93/KiPe+0lD4lI4MeAA/f3/AD09 + QABFREg6JSQo8yAfI/8gHyP/IB8j/ykoLNtaWVwxKSgs0SAfI/8gHyP/IB8j/yAfI/8qKS3GaWhrDWtq + bQDd3N0AgH+CAAAAAAAnJiqXIB8j/yAfI/8gHyP/IB8j/ycmKudRUFMwKiPe+SYf3f8mH93/Jh/d/zEq + 39B+eusTODLgmyYf3f8mH93/Jh/d/yYf3f8mH93/MCrf1Hdz6hU1Lt+UJh/d/yYf3f8mH93/KiPe+0lD + 41I4MeAA/f3/AEVERwBJSEswJiUp7CAfI/8gHyP/IB8j/ycmKuRZWVw1KyouyCAfI/8gHyP/IB8j/yAf + I/8nJirGUlJVDVRTVgD///8A////AA0MEAAlJCh9IB8j/yAfI/8gHyP/IB8j/yYlKe5KSU08KiPe+SYf + 3f8mH93/Jh/d/zAq3893c+oXNC7frCYf3f8mH93/Jh/d/yYf3f8mH93/Life4GRf5x81Lt+UJh/d/yYf + 3f8mH93/KiPe+0pE41I4MeAA/f3/AEtKTgBMTE8mJyYq5SAfI/8gHyP/IB8j/yYlKetWVVg4Li0xuiAf + I/8gHyP/IB8j/yAfI/8kIyfQQD9DFEFAQwB3d3kAAAAAABgXGwAkIyd3IB8j/yAfI/8gHyP/IB8j/yUk + KPJIR0pFKiPe+SYf3f8mH93/Jh/d/zAq389xbOkcMizfvSYf3f8mH93/Jh/d/yYf3f8mH93/LSbe61pV + 5Sw1Lt+TJh/d/yYf3f8mH93/KiPe+0pE41I4MeAA/f3/AFVUVwBVVFcdKCcr3SAfI/8gHyP/IB8j/yUk + KPJRUFM8MzI2pCAfI/8gHyP/IB8j/yAfI/8jIiblOjk9KDc2OQDBwcIAAAADAAQDCAAnJiqAIB8j/yAf + I/8gHyP/IB8j/yUkKPNFREhHKiPe+SYf3f8mH93/Jh/d/zAq389qZegkMSrfzSYf3f8mH93/Jh/d/yYf + 3f8mH93/KyTe81JM5Ds1Lt+SJh/d/yYf3f8mH93/KiPe+0pE41I4MeAA/f3/AF5dYABcW14WKSgs1CAf + I/8gHyP/IB8j/yQjJ/dKSUxDOjk8hSEgJP8gHyP/IB8j/yAfI/8hICT6MzI2YAAAAAA4NzsAOjk9AM7N + zgQpKCylIB8j/yAfI/8gHyP/IB8j/yUkKPFHRkpDKiPe+SYf3f8mH93/Jh/d/zAq385hW+YuLife2iYf + 3f8mH93/Jh/d/yYf3f8mH93/KiPe+UtF40s1L9+SJh/d/yYf3f8mH93/KiPe+0pE41I4MeAA/f3/AGlo + awBnZmkPKyouySAfI/8gHyP/IB8j/yMiJvtCQUVNR0ZJYSMiJv8gHyP/IB8j/yAfI/8gHyP/JiUpyzk4 + PEZOTVAlSklNJDMzNlkkIybnIB8j/yAfI/8gHyP/IB8j/yYlKe1LS046KiPe+SYf3f8mH93/Jh/d/zAp + 381bVuU7LSbe5iYf3f8mH93/Lyne/Sgh3f8mH93/KCLd/kdB4l42L9+SJh/d/yYf3f8mH93/KiPe+0pE + 41I4MeAA/f3/AHl4ewB8fH4KLSwwvyAfI/8gHyP/IB8j/yMiJv4+PUBcWlpdNygnK/EgHyP/IB8j/yAf + I/8gHyP/IB8j/yMiJucpKCzWKCcr1iEhJOogHyP/IB8j/yAfI/8gHyP/IB8j/ykoK+NWVVgrKiPe+SYf + 3f8mH93/Jh/d/zAq38xUT+RIKyTe7yYf3f8mH93/PTbh6Soj3vsmH93/KCHd/0I84XA2MOCSJh/d/yYf + 3f8mH93/KiPe+0pE41I4MeAA/f3/AIiIigCgn6EFLi0xsiAfI/8gHyP/IB8j/yIhJf86OT1rj4+REzEw + NNMfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y4t + MNFwb3IZKiPe+SYf3f8mH93/Jh/d/zAq38xOSONYKiPe9iYf3f8nIN3/QTrhxysk3vQmH93/JyDd/z44 + 4YM3MOCTJh/d/yYf3f8mH93/KiPe+0pE41I4MeAA/f3/AKWkpgD///8CMC8zpiAfI/8gHyP/IB8j/yEg + JP83Njp5AAAAAEFARJkhICT/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/zY1ObDBwcIHKiPe+SYf3f8mH93/Jh/d/zEq38tLReNqKSLd+yYf3f8nIN3+RD7ipiwl + 3uwmH93/Jh/d/zs14Jc4MeCVJh/d/yYf3f8mH93/KiPe+0pE41I4MeAA/f3/ANLS0wAAAAAAMjE1mCAf + I/8gHyP/IB8j/yEgJP82NTiIDQwQAF9fYUoqKS30Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IyIm/0dGSnkAAAAAKiPe+SYf3f8mH93/Jh/d/zEq38xGQOJ8KCHd/yYf + 3f8oId38SELihi0m3uMmH93/Jh/d/zgy4Kk5MuCZJh/d/yYf3f8mH93/KiPe+0pE41I4MeAA/f3/AP// + /wAAAAAANTQ3iyEgJP8gHyP/IB8j/yAfI/8zMjaWAAAAAK2srgxFREepIyIm/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/MjE14m1sbzFcXF8AKiPe+SYf3f8mH93/Jh/d/zEr + 38xCPOGPJyDd/yYf3f8pIt74TUfjai4o3tgmH93/Jh/d/zUv37o6NOCeJh/d/yYf3f8mH93/KiPe+0pE + 41JDPdIAd3Z4AHZ1eAAlJCcANjU5eyEgJP8gHyP/IB8j/yAfI/8yMTSj////AmhnagCLio0zQD9D3yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8pKCv/ZGNmjf///wLd3d4AKiPe+SYf + 3f8mH93/Jh/d/zIr385AOeGjJh/d/yYf3f8rJN7zU03kUDAq38wmH93/Jh/d/zMt38o7NeCmJh/d/yYf + 3f8mH93/KiPe+0lD41L//28EpaSmE6WkphPKyssQQ0JFeyIhJf8gHyP/IB8j/yAfI/8wLzKwsrKzBUdG + SQBlZWhIMjE17SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIib/RkVIvI6O + kBl7e30AKiPe+SYf3f8mH93/Jh7d/zMs39E8NeC1Jh/d/yYf3f8sJd7rWVTlOjMs374mH93/Jh/d/zEq + 39c7NeCvJh/d/yYf3f8mH93/KiPe+0pE6U9YWFFKRURHvkNDRr5EQ0e8ODc62CEgJP8gHyP/IB8j/yAf + I/8uLTG8hIOGCf///wI8Oz6hIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/JiUp/lJSVW4AAAAAKiPe+SYf3f8mH93/JR7d/zQt39Y5M+DHJR7d/yYf3f8uJ97iY17nJzUu + 368mH93/Jh/d/y8o3uM8NuC7Jh/d/yYf3f8mH93/KiPe+0xG7U49PTheIyIm/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8sKy/IcG9yDW5ucBcuLTDUHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP9ISAk/CAf + I/0gHyP/IB8j/yAfI/8gHyP/IB8j/zc2Or6ZmZsQKiPe+SYf3f8mH93/JR7d/zUu3903MeDYJR7d/yYf + 3f8wKd/Wc2/pGTcx4J8mH93/Jh/d/y0m3u08NuDIJh/d/yYf3f8mH93/KiPe+0tF7E4/PzlPIyIm/CAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8qKi3SZWRnElRTVi8oJyvsIB8j/yAfI/8gHyP/IB8j/yMi + JuIpKCyHLSwwdCgnK4QjIibfIB8j/yAfI/8gHyP/Hx4i/yoqLepgX2I5KiPe+SYf3f8mH93/JR7d/zUv + 3+U0Lt/lJR7d/yYf3f8yK9/JkY7uDToz4I0nIN3/Jh/d/ywl3vU8NeDYJh/d/yYf3f8mH93/KiPe+0tE + 605CQTpDJCMn+CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8pKCzcX19hGUVER0AlJCj2IB8j/yAf + I/8gHyP/ISAk/zQzNoLk5OUDAAAAAP///wI1NDhqIiEl+iAfI/8gHyP/IB8j/yQjJ/tIR0tqKiPe+SYf + 3f8mH93/JR7d/zYw4PAzLN/yJR7d/yYf3f8zLN+5+vn+BDw24XsnIN3/Jh/d/yok3vo7NeDpJh/d/yYf + 3f8mH93/KiPe+0pE6k5GRjw3JSQo8yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8oJyvkVlVYIEBA + Q0wkIyf6IB8j/yAfI/8gHyP/IiEl9zc2OkgmJSkAXl1gAEVERwBSUlUjJiUp3yAfI/8gHyP/IB8j/yEg + JP89PD+XKiPe+SYf3f8mH93/JR7d/zUv3/swKd/8JR7d/yYf3f81L9+oAACjAD854WkoId3/Jh/d/yki + 3f45M+D5Jh/d/yYf3f8mH93/KiPe+0lD6E9MSz4sJiUp7SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8mJSnrTk5RKkA/QlAjIib8IB8j/yAfI/8gHyP/ISAk8ygnKzslJCgASEdLAE5NUABMS04MJCMnwCAf + I/8gHyP/IB8j/yAfI/80Mze7KiPe+SYf3f8mH93/Jh/d/y0m3v8qI97/Jh/d/yYf3f85M+CYAADSAEM9 + 4lcpIt38Jh/d/ycg3f8uJ97/Jh/d/yYf3f8mH93/KiPe+0hB509RUT8iJyYq5iAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8lJCjySklNNT8+QU0jIib7IB8j/yAfI/8gHyP/ISAk9ywrL0YlJCgA6OjoAD49 + QQBCQUQFIyImryAfI/8gHyP/IB8j/yAfI/8vLjLVKiPe+SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ycg + 3f89N+GGEgvaAEdB4kYqI973Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KiPe+0dB5k9ZWUAZKCcr3iAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8kIyf3RURHQD8+QkUkIyb5IB8j/yAfI/8gHyP/ISAk/jU0 + OGUNDBAA////AISEhgBZWFsFJCMnsSAfI/8gHyP/IB8j/yAfI/8tLC/oKiPe+SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ych3f8/OeFzKSLdAE1H4zcrJN7xJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KiPe+0dB + 5VBlZkASKiks1SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIib7QUBETUZFSDolJCj0IB8j/yAf + I/8gHyP/IB8j/y8uMqWenZ8JCQgMAAoIDQBYWFsbJyYp0SAfI/8gHyP/IB8j/yAfI/8qKS30KiPe+SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f5BO+FgODHgAFNO5CotJt7oJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/KiPe+0dB5FB7fUALKyouyiAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIib+PTxAW05N + USwmJSntIB8j/yAfI/8gHyP/IB8j/yMiJu40MzaDR0ZKS0VESFMvLjKSISAk+CAfI/8gHyP/IB8j/yAf + I/8oJyv6KiPe+SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yki3fpDPeJPQTvhAFxW5R4vKN7eJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/KiPe+0dB41CqrjMGLCsuwB8eIv8fHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8iISX/Ojk9aWFgYx0pKCzhIB8j/yAfI/8gHyP/IB8j/yAfI/8hICT6JSQo7SQjJ/IhICT8IB8j/yAf + I/8gHyP/IB8j/yAfI/8oJyv9KiPe+SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yoj3vRIQuI/SkTjAGVg + 5xQwKd/RJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KiPe+0dB41H//wABS0pNmTs6PuAsKy/0ISAk/yAf + I/8gHyP/IB8j/yAfI/8hICT/ODc7eIyLjQ4tLDDNIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8oJyv7KiPe+SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ywl + 3u1QS+QxVE7kAHdz6gwyK9/DJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KiPe+0dC4lElHuEAoKChGY+O + kChpaWtfOTg71iEgI/8gHyP/IB8j/yAfI/8hICT/NjU4h////wM0MzavIB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8qKS30KiPe+SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y4n3uRZVOUlX1nmAKCd8AY0Ld+zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KiPe+0hC + 4lE4Md8AhYSGAHt6fQAAAAAAa2ptTy0sMO0fHiL/IB8j/yAfI/8gHyP/NDM3lQAAAAA/PkKDIiEl/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8uLTHjKiPe+SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zAp39ljXucZaWToAP///wE3MOCiJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/KiPe+0hC4lE3MOAA6+vsANLS0wC9vL4A////BUJBRJ8hICT/IB8j/yAfI/8gHyP/MTE0ogAA + AABUU1ZPJyYq+SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8zMjbFKiPe+SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zEq38psZ+gQcW3pAAAAvwA6M+CRJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/KiPe+0hC4lE3MOAA/f3/AMTExQB2dngAPDs+AFdWWU0nJir2IB8j/yAf + I/8gHyP/Ly4yr+Df4AN7enwcMjE11R8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yIhJP8/PkGVKiPe+SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zIs37uDf+wJf3vrAAAA + 1gA9N+F+JyDd/yYf3f8mH93/Jh/d/yYf3f8mH93/KiPe+0hC4lE3MOAA/f3/AAAAAAD///8Ac3N1AHZ1 + eBkvLjLVHx4i/yAfI/8gHyP/Li0xvIWEhgkAAAAASUhLiSMiJv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ygnKvRVVFdTKiPe+SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zQu + 36vOzfcDkI3uAB0V3AA/OeFrKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/KiPe+0hC4lE3MOAA/f3/AAAA + AADk4+QAqaiqAP///wQ4NzqnIB8j/yAfI/8gHyP/LCsvx29ucQ5kY2YAdXR3LDU0ONkgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zo5PcGOjZAWKiPe/SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/zgy4JwAAAAAqqjyAC4n3gBCPOFaKSLd/yYf3f8mH93/Jh/d/yYf3f8mH93/KiPe/0hC + 4lI3MeAA/f3/AAAAAAAAAAAA////AAAAAAA/PkJ4ISAk/x8eIv8fHiL/Kikt1GJhZBRycXQAAAAAAGFg + Y2EwLzPwIB8j/x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8fHiL/MC8z8GVkZ1YAAAAAQTvhvj03 + 4cM9N+HCPTfhwj034cI9N+HCPjfhxU1H42kAANMAwb/1AEtF4wBWUOU5QDrhvj034cM+N+HDPjfhwz43 + 4cM+OOHERD7iw11X5j5PSeQA/f3/AAAAAAAAAAAA3t7fAEJBRABUU1ZJODc75TU0OOo1NDfsPj1AyGpp + bBhqamwApqWnAOPj5AZkY2ZlOjk91ycnKvwhICT/Hx4i/x8eIv8fHiL/IB8j/yUkKP43NjnhYWBjbuLi + 4garq6wAko7uGI+M7hiQjO4YkIzuGJCM7hiQjO4YkIzuGZiU7wx9eOsA////AJuY8ACgnPAGk4/uGJGN + 7hmRje4ZkY3uGZGN7hmUkO8ZoJ3wG6uo8gmlovEA/v7/AAAAAAAAAAAApaWmAI6NjwCUk5URhIOFRYKB + g0mBgYNJhoWHP5ubnAibm50AeHd6AJuanAD///8Cg4OFN11dYJFLSk3TPj1B7z09QPs9PED0R0ZK3lpZ + XKN8e35F////BJiYmgB+foAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAIAAAAAAAAAAgAAAAAAAAADAAAAAAAAAAMAAAAAAAAAAwAAAAAAKAAAAEAAAACAAAAAAQAgAAAA + AAAAQAAAEwsAABMLAAAAAAAAAAAAAP///wT///8E////BP///wT///8E////BP///wL///8A////AP// + /wD///8D////BP///wT///8E////BP///wLv7vwA////AP///wD///8D////BP///wT///8E////BP// + /wT///8D////AP///wCioqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AJKR + kwD9/f0AcG9yAHR0dgCoqKkA////ALCwsR6JiIphcG9ypl9fYtNMS07YSUhL2FVUV9hoZ2rCe3p8iZWU + lkLS0tIPBQQJANHR0gCwr7EAubi6AP///wAAAAAAAAAAAAAAAABtaOhyamXod2pl6HZqZeh2amXodmtm + 6Hh9ees+KiPeAJqX7wCYlO8IcWzpX2pl6HhqZeh2amXodmpl6Hh3cupGAABLAKyp8gCsqfIFdG/pWWpl + 6HhqZeh2amXodmpl6HZqZeh4eHPqUOzr/AK8uvUAwL/BAHl4ewB/foEXdHR2T3NydVFzcnVRc3J1UXNy + dVF0c3ZSg4OFLQAAAQDT09QA7u7uALGxsgCxsbIA////BYODhUtYWFu0Ojk97ykoLP4jIib/ISAk/yEg + JP8iISX/JSQo/y8uMvpFREfeZGRmkpWVlzH///8A1dTVAMvLywDq6uoAAAAAAAAAAAAAAAAAODHg9TIs + 3/8yLN/+Mizf/jIs3/40Ld//TUfjhQAA0QB3c+oAdXHpGT034dYyK9//Mizf/jIs3/4zLN//R0Hio/// + /wKRje4AjYntCkA54b4yK9//Mizf/jIs3/4yLN/+Mizf/0dC4q7n5vsFqqjyAMrKywBJSEwAVlVYRTs6 + Pek3NjrvNzY67zc2Ou83NjrvODc6801NUIsAAAAAuLe5AP///wDj4+QA////A3Z2eF9BQETfJCMn/x4d + If8fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Hx4i/ysqLv9MS0/IhoWISv///wH///8A////AODg + 4QAAAAAAAAAAACoj3vckHd3/JR7d/yUe3f8lHt3/Jh/d/0E74YUAAM4AYl3mAGJd5iQvKN7jJB3d/yUe + 3f8lHt3/JB3d/zky4La2tPQHi4ftAIWB7AozLN+/JB3d/yUe3f8lHt3/JR7d/yUd3f88NeCv5uX7Baek + 8QDo5+gAPj1BAEtKTkMkIyf3Hh0h/x4dIf8eHSH/Hh0h/x4dIf82NTmh////AaWlpwD///8AAwIHAIKC + hEQ+PUDfIB8j/x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/IyIm/0VE + SNSJiYs/Dg0RAP///wDd3d0AAAAAAAAAAAAsJd73Jh/d/yYf3f8mH93/Jh/d/ycg3f9CPOGFAADOAFZR + 5QBbVuUyLife7SYf3f8mH93/Jh/d/yYf3f82MODGi4ftDoWB7ACGguwKNC3fvyYf3f8mH93/Jh/d/yYf + 3f8mH93/PTfhr+bl+wWnpPEA////AEpKTQBTUlU3JyYq8CAfI/8gHyP/IB8j/yAfI/8gHyP/NTU4rt3d + 3QWfnqAAoaGjALe2uBNNTE+3IiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8jIib/TEtOvKemqByPjpAAmJeZAP///wAAAAAALCXe9yYf3f8mH93/Jh/d/yYf + 3f8nIN3/QjzhhQAAzgBKROMAVlHlQSwm3vUmH93/Jh/d/yYf3f8lHt3/NC3f1Hdy6hd6duoAhoLsCjQt + 378mH93/Jh/d/yYf3f8mH93/Jh/d/z034a/m5fsFp6TxAPX19QBUU1YAWFdaLSkoLOofHiP/IB8j/yAf + I/8gHyP/IB8j/zMyNrqjoqQJl5aYACopLABsa25WLSww9h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ykoLPxjYmV7////Adzc3QD///8AAAAAACwl + 3vcmH93/Jh/d/yYf3f8mH93/JyDd/0I84YUAAM4AOzXgAE9K41IrJN76Jh/d/yYf3f8mH93/JR7d/zEr + 3+BpZOcibWnoAIaC7Ao0Ld+/Jh/d/yYf3f8mH93/Jh/d/yYf3f89N+Gv5uX7Baek8QD///8AXVxfAF9e + YSMqKS3iHx4i/yAfI/8gHyP/IB8j/yAfI/8wMDPFhoWIDpeWmAD///8GSUhLpiEgJP8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/PDs+2JCQ + kiZ/foAAubm6AP///wAsJd73Jh/d/yYf3f8mH93/Jh/d/ycg3f9CPOGFAADOACcg3QBJQ+JjKSLd/iYf + 3f8mH93/Jh/d/yUe3f8vKN7qXlnmLmFb5gCGguwKNC3fvyYf3f8mH93/Jh/d/yYf3f8mH93/PTfhr+bl + +wWnpPEA////AGZmaABnZmkbLCsv2h8eIv8gHyP/IB8j/yAfI/8fHiL/Ly4y0Hd2eRR7enwAg4OFIjQz + N9wfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/ycmKv1cXF9xAAAAAP///wD///8ALCXe9yYf3f8mH93/Jh/d/yYf3f8nIN3/QjzhhQAA + zwAAANcARkDidigh3f8mH93/Jh/d/yYf3f8mH93/LSbe81hS5T1UT+QAhoLsCjQt378mH93/Jh/d/yYf + 3f8mH93/Jh/d/z034a/m5fsFp6TxAAAAAABwb3IAcG9xEy0sMNAgHyP/IB8j/yAfI/8gHyP/Hx4i/y0s + MNpra20bUVFUAF1dYEspKCv3Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Pz5CvbKysw6dnZ8AaGdqACwl3vcmH93/Jh/d/yYf + 3f8mH93/JyDd/0I84YUAAM8AAADDAEI84YonIN3/Jh/d/yYf3f8mH93/Jh/d/ysk3vlSTeROR0HiAIaC + 7Ao0Ld+/Jh/d/yYf3f8mH93/Jh/d/yYf3f89N+Gv5uX7Baek8QAAAAAAf36BAIGBgw4wLzLFIB8j/yAf + I/8gHyP/IB8j/x8eIv8rKi7iYWBjIxwbHwBKSk11IyIm/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y4uMe10c3Y5YmFkAM/P + 0AAsJd73Jh/d/yYf3f8mH93/Jh/d/ycg3f9CPOGFAADQAP///wE9N+GcJh/d/yYf3f8mH93/Jh/d/yYf + 3f8qI97+TUfjYDcw4ACGguwKNC3fvyYf3f8mH93/Jh/d/yYf3f8mH93/PTfhr+bl+wWnpPEAAAAAAI+O + kACdnZ8JMjE1uiAfI/8gHyP/IB8j/yAfI/8fHiL/KSgs6ltbXi0AAAAAPz5CmCEgJP8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8lJCj/VFNWbgAAAAD///8ALCXe9yYf3f8mH93/Jh/d/yYf3f8nIN3/QjzhhQAA0gDV1PgFOjPgrSYf + 3f8mH93/Jh/d/yYf3f8mH93/KCHd/0dB4nIdFtwAhoLsCjQt378mH93/Jh/d/yYf3f8mH93/Jh/d/z03 + 4a/m5fsFp6TxAAAAAACamZsA1dTVBTQzN64gHyP/IB8j/yAfI/8gHyP/IB8j/ygnK/BVVVg3////AjY1 + ObEgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/ISAk/0JBRKP///8DvLy9ACwl3vcmH93/Jh/d/yYf3f8mH93/JyDd/0I8 + 4YUAANUAmJXvCzgx4L8mH93/Jh/d/yYf3f8mH93/Jh/d/ycg3f9DPeKFAADSAIaC7Ao0Ld+/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f89N+Gv5uX7Baek8QAAAAAApaSmAP///wI3NjqhIB8j/yAfI/8gHyP/IB8j/yAf + I/8mJSn1T05RQqyrrQkxMDTDIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv81NTjMkpKUE42NjwAsJd73Jh/d/yYf + 3f8mH93/Jh/d/ycg3f9CPOGFAgDXAH156xM1Lt/OJR7d/yYf3f8mH93/Jh/d/yYf3f8nIN3/QDnhmAAA + eQCFgewKNC3fvyYf3f8mH93/Jh/d/yYf3f8mH93/PTfhr+bl+wWnpPEAAAAAAK+vsAAAAAAAODg7kyEg + JP8gHyP/IB8j/yAfI/8gHyP/JSQo+kxLTk6DgoUOLi0xziAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/LSwv5mpp + bCllZGcALCXe9yYf3f8mH93/Jh/d/yYf3f8nIN3/QjzhhQsD2QBqZegcMSvf2yUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/zs14Kr///8DhYHsCjQt378mH93/Jh/d/yYf3f8mH93/Jh/d/z034a/m5fsFp6TxAAAA + AADHxscAAAAAADo5PYQhICT/IB8j/yAfI/8gHyP/IB8j/yQjJ/1IR0tbdXR2EywrL9UfHiP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMiJeglJCjKJiUpyCMiJtghICT7IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/ycmKvZVVFdFRENHACwl3vcmH93/Jh/d/yYf3f8mH93/JyDd/0I84YURCdoAX1rmKC8o + 3uYlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f84MuC7pKHxCYWB7Ao0Ld+/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f89N+Gv5uX7Baek8QAAAAAA////AAAAAAA9PUB3IiEl/yAfI/8gHyP/IB8j/yAfI/8jIib/Q0NGZ3Bv + cRUrKi7YHx4j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yUkKM01NDdcODc7Ljs6PSw2NjlALi0xnSIh + JfggHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8kIyf+SklMYh8eIgAsJd73Jh/d/yYf3f8mH93/Jh/d/ycg + 3f9CPOGFFQ3aAFpV5TcuJ97wJh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/Ni/fy4N/7BCGguwJNC3fvyYf + 3f8mH93/Jh/d/yYf3f8mH93/PTfhr+bl+wWnpPEAAAAAAAAAAAAXFhoAQkFEaiMiJv8gHyP/IB8j/yAf + I/8gHyP/IiEl/z8+QnVvbnEWKikt2SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMiJvc8Oz9j////ABIR + FQAXFhoAAAAAAGBgYx4sKy+xIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl/0JBRH0AAAAALCXe9yYf + 3f8mH93/Jh/d/yYf3f8nIN3/QjzhhRIK2gBTTuRHLCXe9yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zMs + 39lwbOkaiobtCTQt378mH93/Jh/d/yYf3f8mH93/Jh/d/z034a/m5fsFp6TxAAAAAABkY2YAKCcrAEZF + SV0kIyf9IB8j/yAfI/8gHyP/IB8j/yEgJP89PD+DeHh6FiwrLtgfHiL/IB8j/yAfI/8gHyP/IB8j/x8e + I/8qKS3ba2ttI1hXWgD///8AAAAAAIWFhwAAAAAAOzo9TyIhJfIgHyP/IB8j/yAfI/8gHyP/IB8j/yEg + JP88Oz+WAAAAACwl3vcmH93/Jh/d/yYf3f8mH93/JyDd/0I84YUKAtkAS0bjVyoj3vwmH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f8wKd/kY17nJZGN7gg0Ld+/Jh/d/yYf3f8mH93/Jh/d/yYf3f89N+Gv5uX7Baek + 8QAAAAAAvr6/ADU0OABJSExQJSQo+iAfI/8gHyP/IB8j/yAfI/8hICT/Ojo9kYB/ghUsKy/TIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/LSwwwoOChQ2Af4EAysnKAPj5+QBmZmgARURHAElITB0lJCjXIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/ODc7qf///wQsJd73Jh/d/yYf3f8mH93/Jh/d/ycg3f9CPOGFAADWAEhD + 4mopIt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life7lxX5TObmO8HNC3fvyYf3f8mH93/Jh/d/yYf + 3f8mH93/PTfhr+bl+wWnpPEAAAAAAOrp6gA/PkIATUxPQyYlKfYgHyP/IB8j/yAfI/8gHyP/IB8j/zc2 + Op6Pj5ETLi0xzSAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zAvM7qWlZcJi4qMAP///wAAAAAA5+bnAFhY + WwBbW14KJiUpuiAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zQzNrimpqgKLCXe9yYf3f8mH93/Jh/d/yYf + 3f8nIN3/QjzhhQAA0QBFP+J+KCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ywl3vZVUORDqqfyBjQt + 378mH93/Jh/d/yYf3f8mH93/Jh/d/z034a/n5vsFqKXxAAAAAAD///8ASUhLAFFRVDgnJirxIB8j/yAf + I/8gHyP/IB8j/yAfI/81NDisoJ+hEjEwNMQgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8rKi66d3Z5CXBw + cgD///8AAAAAAObm5wBeXWAAiIiKAiUkKKMgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8xMDTFh4aIECwl + 3vcmH93/Jh/d/yYf3f8mH93/JyDd/0I84YUAAMMAQDrhkCcg3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8qJN77T0njU7q49AY0Ld+/Jh/d/yYf3f8mH93/Jh/d/yYf3f89N+Gv5+b7Bamm8QAAAAAA////AFBP + UwBVVFctKCcr6iAfI/8gHyP/IB8j/yAfI/8gHyP/MzI2uampqhA0Mza2IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/JiUpwVNSVgxTUlUA1tbWAAAAAAD///8AR0dKAP///wAkIyeaIB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/Ly4yzXt6fBUsJd73Jh/d/yYf3f8mH93/Jh/d/ycg3f9CPOGFAABEADs14KImH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/KSLd/0lE42XIxvYGNC3fvyYf3f8mH93/Jh/d/yYf3f8mH93/PTfhr+fm + +wWppvEAAAAAAP///wBaWVwAXFteJCopLeMfHiL/IB8j/yAfI/8gHyP/IB8j/zEwM8Wop6kQOTg8pCAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yUkKNNKSUwYSEhLAP///wD///8A/v7+AFRTVgD///8AJSQomiAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y4tMdJzcnQZLCXe9yYf3f8mH93/Jh/d/yYf3f8nIN3/Qjzhhf// + /wQ5M+C0Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9GQOJ4y8r3BzQt378mH93/Jh/d/yYf + 3f8mH93/Jh/d/z034a/n5vsFqabxAAAAAAD///8AZmVoAGZlaBwsKy/bHx4i/yAfI/8gHyP/IB8j/x8e + Iv8vLjLPlZWXEj8/QoshICT/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIibpQD9CMTY1OABnZmkA1dXWANTU + 1QB4eHoAmZmbAycmKqYgHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8uLTHScG9yGSwl3vcmH93/Jh/d/yYf + 3f8mH93/JyDd/0I84YS7ufQLNzDgxSYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8nIN3/Qjzhi8LA + 9Qk0Ld+/Jh/d/yYf3f8mH93/Jh/d/yYf3f89N+Gv5+b7Bamm8QAAAAAAMzMzAG9vcQBvbnEULSww0R8e + Iv8gHyP/IB8j/yAfI/8fHiL/LSww2nx8fhdIR0psIyIm/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk+jY1 + OGcAAAAAiYiKAOrq6gDn5+gAUlFUAGZlaBEnJirEIB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Ly4y0HZ1 + eBcsJd73Jh/d/yYf3f8mH93/Jh/d/ycg3f9CPOGEi4ftEzMt39MlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/z034Z6wrvMLNC3fvyYf3f8mH93/Jh/d/yYf3f8mH93/PTfhr+fm+wWppvEAAAAAAAAA + AAB8e30AfX1/Di8uMsYgHyP/IB8j/yAfI/8gHyP/Hx4i/ysqLuJmZWgfWFdaSycmKvggHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8pKCzBUlFUKgAAAAAAAAAAAAAAAAAAAAA/PkJUIyIm7CAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/zAvM8l/foESLCXe9yYf3f8mH93/Jh/d/yYf3f8nIN3/Qjvhg3Rw6R4xKt/fJR7d/yYf + 3f8mH93/JyDd/ycg3f8mH93/Jh/d/yYf3f86NOCwnpvwEDQt374mH93/Jh/d/yYf3f8mH93/Jh/d/z03 + 4a/n5vsFqabxAAAAAAAAAAAAi4qNAJiXmQkxMTS7IB8j/yAfI/8gHyP/IB8j/x8eIv8pKCzpW1pdKnJx + dCouLTHoHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk+iopLbMyMTVoQkFEYj8/QmEtLDBsJyYqzCAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8zMja9mpqcDCwl3vcmH93/Jh/d/yYf3f8mH93/JyDd/0I8 + 4YJpZOgsLyje6iUe3f8mH93/JR7d/zMs3/0tJt7+Jh/d/yYf3f8mH93/NzHgwY6K7RY0Ld++Jh/d/yYf + 3f8mH93/Jh/d/yYf3f89N+Gv5+b7Bamm8QAAAAAAAAAAAJmZmwDNzc4FNDM3ryAfI/8gHyP/IB8j/yAf + I/8gHyP/KCcr8FVVWDavrrAONzY6xx8eI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP+IiEl8CYl + Ke4lJCjuISAk8SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ODc7q/T09AUsJd73Jh/d/yYf + 3f8mH93/Jh/d/ycg3f9CPOGCXlnmOi0m3vMmH93/Jh/d/yUe3f8+OOHsMyzf9SUe3f8mH93/JR7d/zQu + 389/e+seMy3fvSYf3f8mH93/Jh/d/yYf3f8mH93/PTfhr+fm+wWppvEAAAAAAAAAAACgoKIA////AjY1 + OKEgHyP/IB8j/yAfI/8gHyP/IB8j/yYmKfVQUFNCAAAAAEhHSpciISX/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/0JB + RZEAAAAALCXe9yYf3f8mH93/Jh/d/yYf3f8nIN3/QjzhgVNO5EkrJN75Jh/d/yYf3f8lHt3/QTvh0TUu + 3+UlHt3/Jh/d/yUe3f8xK9/ccm3pKDMt370mH93/Jh/d/yYf3f8mH93/Jh/d/z034a/n5vsFqabxAAAA + AAAAAAAAq6utAAAAAAA4NzuUISAk/yAfI/8gHyP/IB8j/yAfI/8lJCj5S0pOTjIxNQBhYWRbKCcr+h8e + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yQjJ/9OTlFsCAcLACwl3vcmH93/Jh/d/yYf3f8mH93/JyDd/0M94oFOSONbKSLe/SYf + 3f8mH93/Jh/d/0Q+4rY2MODVJR7d/yYf3f8lHt3/Lyne52lk5zUzLd+8Jh/d/yYf3f8mH93/Jh/d/yYf + 3f89N+Gv5+b7Bamm8QAAAAAAAAAAAMbGxwAAAAAAPDs+hyEgJP8gHyP/IB8j/yAfI/8gHyP/JCMn/UdG + SVpHRkkAioqMIjg3OtkfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8rKi7zZWRnQlJRVAAsJd73Jh/d/yYf3f8mH93/Jh/d/ycg + 3f9EPuKBSkXjbygh3f8mH93/Jh/d/ycg3f9IQuKcODHgxCYf3f8mH93/Jh/d/y0m3vBhXOZDMy3fuyYf + 3f8mH93/Jh/d/yYf3f8mH93/PTfhr+fm+wWppvEAAAAAAAAAAAD///8AAAAAAD8+QXkiISX/IB8j/yAf + I/8gHyP/IB8j/yMiJv9EQ0doJyYqAP///wNUU1eQJCMn/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/OTg80JKSlBmJiIoALCXe9yYf + 3f8mH93/Jh/d/yYf3f8nIN3/RT/ig0U/4oEnIN3/Jh/d/yYf3f8oId3/S0Xjgzo04LMmH93/Jh/d/yYf + 3f8rJN73WVTlUzQt37smH93/Jh/d/yYf3f8mH93/Jh/d/z034a/n5vsFqabxAAAAAAAAAAAA////ABQT + FwBCQURsIyIl/yAfI/8gHyP/IB8j/yAfI/8iISX/QD9DdgAAAgBiYmQAhISGMzs6Pd4fHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/JiUp/1dX + WoX///8B2NjZACwl3vcmH93/Jh/d/yYf3f8mH93/JyDd/0ZA4oVAOuGUJyDd/yYf3f8mH93/KSLd/09J + 42w8NuGhJh/d/yYf3f8mH93/KiPe/FNN5GU0Ld+7Jh/d/yYf3f8mH93/Jh/d/yYf3f89N+Gv5+b7Baqo + 9AAAAAAAAAAAAAAABAAnJioARUVIXiMiJv4gHyP/IB8j/yAfI/8gHyP/ISAk/z09QIQAAAAA1tbXAP// + /wJvbnFsOTg77yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/JCMn/0tLTsyTkpQpdHR2AJeXmQAsJd73Jh/d/yYf3f8mH93/Jh/d/ycg3f9HQeKJPTfhpyYf + 3f8mH93/Jh/d/yoj3vxUTuRXPznhkCcg3f8mH93/Jh/d/ygh3f9OSON3NS7fuyYf3f8mH93/Jh/d/yYf + 3f8mH93/PTfhr+bl+gV8epAAYF9iAF9eYQBfXmEAQUFEAEhHSk8kIyf6IB8j/yAfI/8gHyP/IB8j/yEg + JP87Oj6SAAAAAOHh4gCVlZcAvr6/H1hXWs0iISX/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ywrLv90c3ae////CcHBwgDDw8QALCXe9yYf3f8mH93/Jh/d/yYf + 3f8nIN3/SEPijjo04LgmH93/Jh/d/yYf3f8sJd73WFPlREQ+4n8nIN3/Jh/d/yYf3f8nIN3/SUTjijUv + 37wmH93/Jh/d/yYf3f8mH93/Jh/d/z034a/q6f8FsK+uCqyrrRSsq60UrKutFMbGxxBdXF9UJiUp9yAf + I/8gHyP/IB8j/yAfI/8gHyP/ODc7n////wHCwcMAAAAAAGVkZ2ktLDD3IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/NzY663d2eVMAAAAA////ACwl + 3vcmH93/Jh/d/yYf3f8mH93/JyDd/0lD4pU2MODHJh/d/yYf3f8mH93/LSfe8F5Z5jRHQeJtKCHd/yYf + 3f8mH93/JyDd/0U/4p02MOC+Jh/d/yYf3f8mH93/Jh/d/yYf3f89N+Gv////A2VkZ1tVVFeuVFNXrFRT + V6xVVFerS0tOwSUkKPwgHyP/IB8j/yAfI/8gHyP/IB8j/zU0OKzq6usEk5KUAKCfoQ89PEC/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEg + JP9GRUm9r66wEpqanAAsJd73Jh/d/yYf3f8mH93/Jh/d/ycg3f9JQ+OfMy3f1SUe3f8mH93/JR7d/y8p + 3udmYecmTEbjXCoj3v4mH93/Jh/d/yYf3f9BO+GvNzHgwSYf3f8mH93/Jh/d/yYf3f8mH93/PTfhr/// + /wI+PUGEJCMn/yIhJf8iISX/IiIl/yIhJf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/80Mza5qaiqCGNj + ZQBnZmk0LCsv6x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/LCsv9GppbEtCQUQALCXe9yYf3f8mH93/Jh/d/yYf3f8nIN3/SkXjqzIr + 3+IlHt3/Jh/d/yUe3f8xK9/dcGzpGlFL5EsrJN75Jh/d/yYf3f8mH93/PTfhwTky4MYlHt3/Jh/d/yYf + 3f8mH93/Jh/d/z034a////8BQUBDdSIhJf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/MTA0xImIig04NzsAUlFUXiUkKP0gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP+ISAk8CMi + Ju4iISXuIB8j+CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIhJf9MTE+S////ASwl3vcmH93/Jh/d/yYf + 3f8mH93/JyDd/0pE47gvKd7rJR7d/yYf3f8lHt3/NC7f0YSA7BFWUOU8LSbe8yYf3f8mH93/JR7d/zo0 + 4NE6NODNJR7d/yYf3f8mH93/Jh/d/yYf3f89N+Gv////AUNCRWYjIib/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y8uMs93d3kTAAADAERDR38iISX/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP8KCcrsDAvM1o4NztSMTAzUiopLYMjIibrIB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/OTg8x5yb + nRQsJd73Jh/d/yYf3f8mH93/Jh/d/ycg3f9IQuLGLSbe8iYf3f8mH93/Jh/d/zcw4MOin/AKXFfmLi4o + 3usmHt3/Jh/d/yUe3f83MeDfOzXg1iUe3f8mH93/Jh/d/yYf3f8mH93/PTfhr////wFFRUhZJCMn/CAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8tLDDZbm1wGgAAAAA7Oj2WISAk/yAf + I/8gHyP/IB8j/yAfI/8gHyP/KCcr305OUTQAAAAAAAAAAAAAAABsbG4NMzI2jyEgJP4gHyP/IB8j/yAf + I/8gHyP/Hx4i/y0sMOdtbW81LCXe9yYf3f8mH93/Jh/d/yYf3f8nIN3+R0Hi2Csl3vgmH93/Jh/d/yYf + 3f85MuCy8O/9BGVg5yIxKt/hJR7d/yYf3f8lHt3/NS7f6zw24OElHt3/Jh/d/yYf3f8mH93/Jh/d/z03 + 4a////8BSklMTSUkKPkgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Kyou4WNi + ZSIAAAAANjU5pCAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zAvM7G4t7kJcG9yAFxbXgBMS08ALSwwAFNT + Vj0mJSnsIB8j/yAfI/8gHyP/IB8j/yAfI/8nJir4V1ZZXCwl3vcmH93/Jh/d/yYf3f8mH93/JyDd/kZA + 4usqI978Jh/d/yYf3f8mH93/OzTgoAAAAABxbOkYMyzf1SUe3f8mH93/JR7d/zIs3/Y9NuHuJR7d/yYf + 3f8mH93/Jh/d/yYf3f89N+Gv////AU5NUEAmJSn1IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/ykoLOlaWVwr////AjY1OK4gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8oJyuSAAAAAI2M + jgBXV1oAcXBzAGNiZQBpaGsWKCcrzCAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/0pJTIQsJd73Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9BO+H5KSLd/iYf3f8mH93/JyDd/z854Y8AAMsAg3/sDzUv38gmH93/Jh/d/yUe + 3f8wKd/9OzTg+yUe3f8mH93/Jh/d/yYf3f8mH93/PTfhr////wJTU1U1KCcq7yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8oJyvvVFNWNf///wI0NDexIB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/JSQojQAAAABaWVwA////AP///wBfXmEAaWhrBiYlKa8gHyP/IB8j/yAfI/8gHyP/IB8j/yEg + JP8/PkKlLCXe9yYf3f8mH93/Jh/d/yYf3f8nIN3/NC3f/ycg3f8mH93/Jh/d/ygh3f9EPuJ+AADXAKSh + 8Qg4MeC4Jh/d/yYf3f8mH93/KiPe/zEq3/8mH93/Jh/d/yYf3f8mH93/Jh/d/zw24K7///8CWFdaKyko + LOgfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JiYp9VBQU0H///8BNDQ3ryAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/ycmKpr///8BaWhrAP7+/gD///8AV1ZZANLS0wElJCidIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/ODc7wCwl3vcmH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f8mH93/Jh/d/yYf + 3f8pIt3/SkTjbCEZ3AD///8DOzTgpyYf3f8mH93/Jh/d/yYf3f8nIN3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f88NuCu////Al5dYCEqKS3hHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yUk + KPlMS05NAAAAADQzNqcgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8pKCyyhISGCHl5ewD///8A////AEZF + SQAAAAAAIyImlyAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zQzN9YsJd73Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/KiPe/U9J41s1Lt8AAAAfAD444ZYnIN3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/PDbgrv///wNnZ2kZLCsv2B8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8kIyf9R0dKWgAAAAA2NjmeIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Kikt1W1s + bx5iYmUA////AP///wClpacAtLS2BCkoLKggHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8xMDPmLCXe9yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ysl3vhTTuRKQz3iAAAAzQBCPOGFJyDd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zw24K7///8Dc3JzEi4tMc4gHiP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/0VER2gAAAAAOjk8kSEgJP8gHyP/IB8j/yAf + I/8gHyP/IB8j/yQjJ/REREdaAAAAAAgHDAAODREAAAADAGRjZiApKCzSIB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/Li0x8Swl3vcmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8tJt7xVlHlOU5I + 4wALA9kARkHicygh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f88NuCu+/r/BIWF + hQ0wLzPEIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIhJf9BQEN1AAAAAD49 + QX8iIST/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Kiktx0RDRlNYV1ouXFteLlBPUz0yMTWGIiEl9yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ysrLvgsJd73Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mHt3/Lyje6F1Y5itZU+UAKiPeAEtG42EpIt7+Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/PDbgrvDv/wSjoqEIMjE1uCAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8hICT/PT1AgwAAAABFREdqIyIm/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/4mJSnlLSwwxy8u + McgrKi7bIiEl8iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eI/8rKi78LCXe9yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zAq391kX+cfYl3mADs14ABQSuRPKyTe+iYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zw24K7q6f8E6+vlBDMzNqwfHiL/Hx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/ISAk/zs7PpEAAAAAT05RUyUkKPogHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/yAfI/8gHyP/Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Kyou/Cwl + 3vcmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f8zLN/Sc27pFXNv6QBJQ+IAVE/kPywl + 3vQmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f88NuCu5+b9BP///wBcW16FS0pN2D8+ + QeErKi75IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/85ODueAAAAAFtbXjgpKCzwHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/ysqLvgsJd73Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/NjDgxYyI + 7Q2JhewAVU/kAFtV5TAuJ97sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/PDbgruXk + +wSPjcAAsK+xGKSkpSiSkZM2a2ptgTg4O+YgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/NjU4q/// + /wJzcnUfLy4y3R8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8uLTHxLCXe9yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/zo04La2tPQHm5jvAGFc5gBjXuckMCnf4iUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/zw24K7l5PsFp6TzAHV0dwBnZmkAbGtuAP///wZ1dHZmMTE07x8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/zQzN7iurq8HqamqCzg3O70gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/MjE14ywl3vcmH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8+OOGm////A66r8gBuaegAbmnoGTIs39clHt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f88NuCu5eT7BaSh8QDq6usA6OjpAMnJygDCwsMA/v7+CVRT + VpsjIib/IB8j/yAfI/8gHyP/IB8j/yAfI/8xMTTEi4uNDQAAAABIR0qRIiEl/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zc2 + OsosJd73Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8nIN3/QDrhkwAAgwC9u/UAf3vrAIB8 + 6xA1Lt/KJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/PDbgruXk+wWkofEAAAAAAP// + /wDU1NQAlZWXAGBfYgB7e304MTA06B8eIv8gHyP/IB8j/yAfI/8fHiL/Ly4yznd3eRJCQkUAYF9iWSgn + K/ogHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yEgJP9AP0KnLCXe9yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JyDd/0I8 + 4X8AANIA4+L7AJKP7gCgnfAJODLguyYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zw2 + 4K7l5PsFpKHxAAAAAAAAAAAA/v7+AP///wC2tbcA5eXmCERDRq4hICT/IB8j/yAfI/8gHyP/Hx4i/y0s + L9hqamwZdnV4AImIiiM2NTnbHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8kIyf8UE9Sdywl3vcmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9GQOJtFg/bAP///wCin/AA8fH9BDs14KsmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f88NuCu5eT7BaSh8QAAAAAAAAAAAAAAAAD5+fkA////AAAAAABVVFhoJSQo/SAf + I/8gHyP/IB8j/x8eIv8rKi7hY2NlInBvcgD///8DT05RmCMiJv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/LSwv62loaz8sJd73Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8pIt79SUPiWy4o3gBeWeYAsa/zAP///wA+OOGZJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/PDbgruXk+wWkofEAAAAAAAAAAAAAAAAA////AMrK + ywBkY2YAb25xNC0sMOsfHiL/IB8j/yAfI/8fHiL/KSgs6FtbXStYV1oAUVFUAHh4ekAzMjXqHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/0A/ + Qr2rq6wSLCXe9yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KyTe+E5I40o+OOEAysj3AMnH + 9wAAAMoAQTvhhycg3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zw24K7l5PsFpKHxAAAA + AAAAAAAAAAAAAAAAAAD///8Ajo6QAJWUlhI1NTjKHx4i/yAfI/8gHyP/IB8j/ygnK+9VVFc1TU1QALa2 + twDt7e0HVlZZlCYmKf8fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/yopLftjYmVpAAAAACsk3vclHt3/JR7d/yUe3f8lHt3/JR7d/yUe3f8lHt3/JR3d/ywl + 3vNWUeU8TEbjAPr6/gD///8ABgDYAEQ+4nQnIN3/JR7d/yUe3f8lHt3/JR7d/yUe3f8lHt3/JR7d/yUe + 3f87NeCu5eT7BaSh8QAAAAAAAAAAAAAAAAAAAAAA9fX1ALu6vAD///8CPz5BoCAfI/8gHyP/IB8j/x8e + Iv8mJSn0UVBTQERDRwCNjY8AcG9yAJaWmCZJSEvCJCMn/x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/yQjJ/9NTE+5qKepGZOSlAA1Lt/2Lyje/y8p3v4vKd7+Lyne/i8p + 3v4vKd7+Lyne/i8o3v83MeDpYl3mLV5Z5gD///8AAADRADAp3wBOSONhMivf/S8p3v4vKd7+Lyne/i8p + 3v4vKd7+Lyne/jAp3/4wKd//RD7irubl+wSmo/EAAAAAAAAAAAAAAAAAAAAAAH9/fwD///8AAAAAAEpJ + THYkIyf/ISAk/yEgJP8gHyP/JiUp/U1MT046Oj0A6+vrAP///wAAAAAAiYiKPExLTsIqKS3/Hx4i/x8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hh0i/yYlKf9ISEvLiomLPAAAAAD///8AXljmc1lU + 5XdZVOV3WVTld1lU5XdZVOV3WVTld1lU5XdZVOV3X1nmaX966xF9eOsA////AJ6b8ABhXOYAcWzpKFxX + 5nZaVeV3WlXld1pV5XdaVeV3WlXld1pV5XdcV+Z5Y13ngHFs6VXp6PwCtrP0AAAAAAAAAAAAAAAAAAAA + AAAAAAAAjo2PAFxbXgBxcHNAV1ZZv1VUV8NVVFfDVVRXw1hXWsBzcnRAYmJkAMTExQDk4+QA7e3uAAAA + AACTkpQvX15hlD8+QuErKi77IyIm/yEgJP8gHyP/IB8j/yAfI/8iISX/KCcr/jk4POxZWFunioqMOf// + /wDw8PAA9PT1AP///wT///8E////BP///wT///8E////BP///wT///8E////BP///wT///8A////AP// + /wD///8A////AP///wH///8E////Bf///wX///8F////Bf///wX///8E////Bf///wb///8E////AP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wCzs7QAvLu9CKyrrR+qqashqqqrIaqpqyGrqqwgtLS1C62t + rgDR0dIAzs7PALu6vADX19cAAwIHAMTDxQ+LioxHb25xkVxbXsxLSk3lSUlM90pJTPlJSUztVVVY12tq + bamDg4VbsrGzGAAAAADIyMkAtrW3ANzc3QAAAAAAAAAABwAAAAAAAAAHAAAAAAAAAAMAAAAAAAAAAwAA + AAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAA + AAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAAAAgAAAAAAAAACAAAAAAAAAAIAAAAAAAA + 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 + AAAtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979UErkXTIs3wBPSeMAWlXlOy0n3vImH93/Jh/d/yYf + 3f8mH93/JR7d/y8p3uxjXucxXFblAB8Y3ABFP+JpKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzDg1oN/ + 7BiDf+wAAAAAAPDv8ABYWFsAXl5gLCopLegfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/87Oz6f////AZiY + mgChoaIWPDs/zB8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Ojo925CQkieAf4EA5+foAP///wAtJt71Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8qI979UErkXTIr3wBAOuEAVlDkTSwl3vkmH93/Jh/d/yYf3f8mH93/Jh/d/y0n + 3vRcVuVBTUfjAB8Y3ABFP+JpKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzDg1oN/7BiDf+wAAAAAAP// + /wBhYGMAY2NmIisqLuAfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/85ODys+fn5BGhnagBvb3E4Li0x7h8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/KCcr/GJhZGcAAAAA////AP///wAtJt71Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8qI979UErkXTIr3wAtJt4AUUzkXyoj3v0mH93/Jh/d/yYf3f8mH93/Jh/d/ywl3vpWUORSPTbhAB8X + 3ABFP+JpKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzDg1oN/7BiDf+wAAAAAAP///wBtbW8Abm1wGi4t + MNgfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/82NTi4s7K0CDU0NwBXV1pfJiUp/CAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/ISAk/0hHSq3t7e4Jv77AAMPDxAAtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979UErkXTIs + 3wANBdkAS0XjcSki3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yoj3v5QS+RkJh/dAB8Y3ABFP+JpKCLd/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NzDg1oN/7BiDf+wAAAAAAP///wB5eXsAfHt9EzAvM88fHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8zMjbElJSWDQAAAABJSEyEIiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zY1 + Od+JiIolgYCCAPT09AAtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979UErkXTQt3wAAAM0ART/igycg + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9KReN2AADWACAZ3ABFP+JpKCLd/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NzDg1oN/7BiDf+wAAAAAAP///wCDg4UAjY2PDTIxNcQgHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8xMDTPgoKEE////wA+PkGgISAk/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ykoLPdkY2ZPQkFEABgX + GwAtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979UErkXTcx4AAAAAAAQjzhlicg3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ycg3f9GQOKJAAC+ACIb3ABFP+JpKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzDg1oN/ + 7BiDf+wAAAAAAAAAAACNjY8AqamrCTU0N7kgHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8vLjLYc3J1GtfX + 2AY3Njq1IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMiJv9QT1N/AAAAAPHx8QAtJt71Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8qI979UErkXTs14AD///8EPznhqSYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ycg + 3f9CPOGc////ASYf3QBFP+JpKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzDg1oN/7BiDf+wAAAAAAAAA + AACbm50A5+bnBTc2OqwgHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8tLC/haGhqIZeXmQszMjXEIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/9BQEOq////Bbu6vAAtJt71Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8qI979UErkXT854QCsqvIJOzTguiYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8+N+Gu4+L7BSsk + 3gBFP+JpKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzDg1oN/7BiDf+wAAAAAAAAAAACtrK4A////ATg4 + O54gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8rKi7pY2JlK3x7fRAvLjLNHx4j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv82NTjLlJOVEo+PkQAtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979UErkXUI8 + 4QCGguwQNjDgyCYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f86M+C+oJ3wCzAp3wBFP+JpKCLd/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NzDg1oN/7BiDf+wAAAAAAAAAAADNzc4AAAAAADs6PZAhICT/IB8j/yAf + I/8gHyP/IB8j/x8eIv8pKCzvXFxfNXRzdhQuLTHUHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IyIm5yYlKbcqKS2xJyYqsyQjJ9wgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8uLTHib29xJWxrbgAtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979UErkXUU/4gB1cOkZNC3f1iUe + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f83MODNhoLsEzYw4ABFP+JpKCLd/yYf3f8mH93/Jh/d/yYf + 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 + 8gg1NDe7IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yopLLZxcXMIbWxvAP///wAAAAAAAAAAAOjo + 6ABCQUUATUxPBSMiJq0gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ODc6rd7e3gYtJt72Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8qI979UErkXQAA1gBEPuKKJyDd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8oId3/SELifQcA2ABFP+JpKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAA + AAD///8AV1ZZAFtaXSwpKCzpHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/Ozo+nv///wU5OTysIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/ycmKsFbWl0NWllcALOytAAAAAAAAAAAAGhnagBAP0IAUlFVBCQj + J6ogHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/NzY6t7e3uAktJt72Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8qI979UErkXAAAxQA/OeGcJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8nIN3/RD7ikAAA + 0ABFP+JpKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAAAAD///8AYmFkAGRj + ZiMrKi7hHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/ODc7qv///wRAP0KYISAk/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yYlKdVOTVAbS0pNAP///wD///8AAAAAAO/v7wBKSUwAXVxfBCUkKKsgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/NTQ4uqWkpgstJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979T0rkXP// + /wE9NuGvJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QDrhogAAogBFP+JpKCLd/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAAAAD///8Abm5wAG9ucRsuLTDZHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/NjU5t////wVHRkp+IiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMi + JupBQEQ2Ly4yACYlKQDOzs8A1NTUAMnIyQBeXmAAYmFkCScmKrcgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/NTQ3uqOipAstJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979T0nkXN7d+gc6M+DAJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/PTbhtP///wNFP+JpKCLd/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAAAAAAAAAAeXl7AHl4exQvLjLPHx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/NDM3w8bGxwlQT1NfJSQo/SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJPs3NjlrAAAAAG1s + bwDb29wA5ubmANDQ0QA+PUAAVlVYHCYlKdIgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/NjU5uLCv + sQotJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979T0nkW5iV7w82L9/OJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/OTLgxMrJ9wlFP+JpKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA + 7BiEgOwAAAAAAAAAAAAAAAAAiIiKAImJiw0xMDTEIB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/MTA0zoyM + jg9jYmVAKikt8x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8qKS2+WVhbJf///wAAAAAAAAAAAAAA + AAD///8CPz9CWSIiJfAgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/NzY6sM7OzwctJt72Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8qI979T0nkW3p26hkzLN/bJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/Ni/f0pSR7hJFP+JoKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAA + AAAAAAAAnJudAKenqAk0Mze5IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Ly4y13NzdRd/f4EjMjE14R8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT5MC8znj8+QT1NTE8tWFdaLkdGSS04NztIKiotyCAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Ozo+pP///wMtJt72Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8qI979T0nkWm9q6CYxKt/nJR7d/yYf3f8mH93/JyDd/y8o3v8nIN3/Jh/d/yYf3f8lHt3/Myzf3314 + 6x1FP+JnKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAAAAAAAAAAsbGyAOTk + 5QU3NjqtIB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/LSww4WtqbSHDw8QMPTw/wCAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/ISAk+yUkKNUtLDDIMjE1ySsqLsgiISXZIB8j/iAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8hICT/QD9CkgAAAAAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979T0rkWWRf + 5zQvKN7wJR7d/yYf3f8mH93/KSLd/kM94fQoId3+Jh/d/yYf3f8lHt3/MCrf6m5p6CpFP+JnKCLd/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAAAAAAAAAAxcXGAP///wE5ODygIB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/Kyou6GNiZSsAAAAATEtOkCIhJf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/Hx4i/x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8jIib/SklNewAAAAAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979UEvkWVlU5UMsJt73Jh/d/yYf + 3f8mH93/KiPe+01H49YpIt38Jh/d/yYf3f8mHt3/Life8mJd5jhFP+JmKCLd/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAAAAAAAAAA0tLTAAAAAAA7Oj6SISAk/yAfI/8gHyP/IB8j/yAf + I/8fHiL/KSgs71xbXjVDQkUAZmVoWikoLPofHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8mJSn9WVhbXSwr + LgAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979UUvkWVFL5FQqI978Jh/d/yYf3f8mH93/KyTe9lFM + 5LMqI976Jh/d/yYf3f8mH93/LCXe+FlU5UhGQOJlKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA + 7BiEgOwAAAAAAAAAAAAAAAAA29rbAAAAAAA/PkGFISAk/yAfI/8gHyP/IB8j/yAfI/8gHyP/JyYq9FVU + V0BeXWAAjo6QJjg3Ot0fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8tLC/vbGtuOV5dYAAtJt72Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8qI979Uk3kWUxH42cpIt3/Jh/d/yYf3f8mH93/LSbe8VdS5ZIrJN72Jh/d/yYf + 3f8mH93/KiPe/VNO5FpGQOJlKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAA + AAAAAAAA39/gAAAAAABDQkV4IiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/JiUp+FFQU0xLS04A////BlBP + UqAiISX/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv85ODvTlZWXGY6OkAAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8qI979VE7kWklD4nsoId3/Jh/d/yYf3f8lHt3/Lyje6l5Z5nMtJt7wJh/d/yYf3f8mH93/KSLd/05I + 421IQuJmKCLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAAAAAAAAAA////ABUU + GABGRUlqIyIm/yAfI/8gHyP/IB8j/yAfI/8gHyP/JSQo/E1MT1kvLjIANDM3AHd3eU8xMDTyHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yIhJf9OTVCc////BMrKywAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979VVDkXEQ9 + 4o0nIN3/Jh/d/yYf3f8lHt3/MSrf4mZh51gvKN7pJR7d/yYf3f8mH93/KCHd/0hC4oBJQ+JnKCHd/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAAAAAAAAAAAAAAACkoLABKSUxdJCMn/SAf + I/8gHyP/IB8j/yAfI/8gHyP/JCMm/0hHS2YcGyAAqqqrAMXFxhBSUVSrJCMn/x8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hh0h/zEx + NPN0c3VONTQ4AAAAAAAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979VlHlXz444Z4mH93/Jh/d/yYf + 3f8lHt3/NC3f13Br6UAxK9/gJR7d/yYf3f8mH93/JyDd/0M94pJLReNpKCHd/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NzHg1oSA7BiEgOwAAAAAAAAAAAAAAAAANDM2ADg3OwBPTlFQJSQo+iAfI/8gHyP/IB8j/yAf + I/8gHyP/IyIm/0VER3QAAAMAAAAAACMiJgCHh4k+SEdK0SYlKf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/LSwv/FpZXKK+vb8RpqanAPDw + 8AAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI979WFLlZDw14LEmH93/Jh/d/yYf3f8lHt3/NzDgy356 + 6yw0Ld/VJR7d/yYf3f8mH93/Jh/d/z854aVMRuNtKCHd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA + 7BiGgu8AAAAAAAAAAAAAAAAAAAAAAEZFSQBSUVREJyYp9SAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl/0JB + RYIAAAAAlZWXAOfn6AD///8BiomLdTo5PPkfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/S0pN7aenqExRUFMAAAAAANvb2wAtJt72Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8qI978WVTlazkz4MImH93/Jh/d/yYf3f8mH93/OjPgvZWR7hs3MeDJJR7d/yYf + 3f8mH93/Jh/d/zw24LZOSONzKCHd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA6xh2c7IAQ0JFAD08 + PwA9PEAAPTxAAENCRgBbWl0zKCcr8B8eIv8gHyP/IB8j/yAfI/8gHyP/ISAk/z8+QZAAAAAA2dnZALKy + swDOzs8NXV1goCwrLv4fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/MzI2+WZlaJHh4OEMvr6/APz8/AAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8qI978WVPldDUv388lHt3/Jh/d/yYf3f8mH93/PTfhrb279Q46NOC6Jh/d/yYf3f8mH93/JR7d/zgy + 4MVPSeN6KCHd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oN/7xecm5MPh4aJU4SDhVqEg4ZZhIOGWYaF + h1dxcXN5Kyou8x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/zs6PZz///8B0tHSAExLTgBycnRIMjE17x8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/zU0OO56eXxUDAsPAP///wAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI977V1HlfjIr + 39slHt3/Jh/d/yYf3f8nIN3/QDrhnP///wU+OOGqJh/d/yYf3f8mH93/JR7d/zUu39NPSuODKCHd/iYf + 3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oiD/BVmZWQpPTxA0jU0OOY1NDjkNTQ45DU0OOQ0MzbpJCMn/SAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/zk4PKr///8EycjJAP///wBLSk6OIyIm/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIh + Jf9MS06xz8/QDLOztAAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI976V1HljDAp3+YlHt3/Jh/d/yYf + 3f8nIN3/RD7iigAAaABCPOGZJyDd/yYf3f8mH93/JR7d/zIs399QSuSPKCHd/SYf3f8mH93/Jh/d/yYf + 3f8lHt3/NzHg1oiE/RViYWAoLCsv6iAfI/8hICT/ISAk/yEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/zY2Obe7u7wInZyeAKKioxA5ODzEHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8yMTXrfHt+OWNj + ZQAtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI976VlDlmy4n3u8mH93/Jh/d/yYf3f8oId3/SELieAAA + zgBGQOKHJyDd/yYf3f8mH93/JR7d/zAp3+lPSeOcKCHd/SYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oaC + +BZsa2kfLSww3x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zMy + NsKWlpgMeHh6AHZ1eCgwLzLkHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICTvJCMm5SQj + J+UiISXmIB8j9yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8lJCj/W1pdeQAAAAAtJt72Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8qI975U03kqywl3vUmH93/Jh/d/yYf3f8pI97/TknjZxEK2gBKRON0KCHd/yYf + 3f8mH93/Jh/d/y4n3vFOSOOsKCHd/CYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oWB9BZycm0WLi4x1R8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zEwNM2DgoQSXFteAF9e + YUApKCzzHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yYlKc0yMTVhOjk9QkA/QkMxMDNELCsvjCIh + JfEgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Q0JFr+Pj5AktJt72Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8qI975T0njuyoj3vkmH93/Jh/d/yYf3f8rJN77VE7kVTAp3wBOSeNiKiPe/iYf3f8mH93/Jh/d/ysl + 3vZMRuO8KCHd/CYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oSA8ReAgHgPMDAzyx8eI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zAvMth4d3kaSUlMAFBQU1QmJSj7IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/JCMn9kJBRWKIh4kFmpmbAaqpqwJycXQBYGBjFjEwNJ8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/NTQ31omJiyEtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8rJN76TEfjzigh + 3fwmH93/Jh/d/yYf3f8sJt72WFLlREI84QBTTuRRKyTe+iYf3f8mH93/Jh/d/yoj3vpKROPOKSLd/CYf + 3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oN/7xeamowKMzI2wCAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y0sMOBsa24hOzo+AEhHS2IkIyf+IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/Kiot229ucSVPTlEAUE9SAFlYWwBCQUUAAAAEAFFQU0wlJCjyIB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/LCsu7mhoa0ItJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8rJd77SkXj4icg3f4mH93/Jh/d/yYf + 3f8uJ97uW1blNE9J4wBZVOVBLSbe9CYf3f8mH93/Jh/d/ygi3f1IQuLhKSLd/CYf3f8mH93/Jh/d/yYf + 3f8lHt3/NzHg1oN/7RfJyqwFNTQ4tCAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/ysqLudiYWQqLi0xAEdGSm4jIib/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JyYqv2pp + bA1paGsAU1NWAFVUVwA+PUEAY2JlAG9ucR4qKS3TIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JiUp+lhX + WmgtJt72Jh/d/yYf3f8mH93/Jh/d/yYf3f8sJd79R0Hi9CYf3f8mH93/Jh/d/yUe3f8wKd/lZF/nJ11Y + 5gBgW+YyLyje7SUe3f8mH93/Jh/d/ycg3f5FP+L0KiPe/iYf3f8mH93/Jh/d/yYf3f8lHt3/NzHg1oN/ + 7Bj///8CODg7qCAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/yko + LO5bWl00KCcrAEVESHMjIib/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyImtUNCRgdCQkUAysnKAP// + /wD///8AcXBzAHd2eAgoJyuzIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/0tKTYstJt71Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8rJd7/PTfh/SYf3f8mH93/Jh/d/yUe3f8zLd/bcm7pHWxn6ABpZOclMSrf4yUe + 3f8mH93/Jh/d/ycg3f88NuD+KSPe/yYf3f8mH93/Jh/d/yYf3f8lHt3/NzDg1YF97BcAAAAAOzo9miEg + JP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/ygnKvRWVVg/JSQoAERE + R3MjIib/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JCMnukxMTwpMS08A////AAAAAAD///8AeHd6APDw + 8QEnJiqcIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/0FAQ6ctJt71Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8oId3/Life/yYf3f8mH93/Jh/d/yUe3f83MODPhIHsFHt26gB0cOkaNC3f2CUe3f8mH93/Jh/d/yYf + 3f8tJ97/JyDd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB76xcAAAkAPTxAjCEgJP8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yYlKflSUlVMJiUpAEVER24jIib/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/JSQoyUxLThFMS04A////AP///wD19fUAeHd6AAAAAAAlJCiOIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/zs6PsEtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f86NODBoZ7wDI6K7QCFgewRNjDgyyYe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xcODDUAQD9DfyIhJf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yUkKPxNTE9YJyYqAENDRmUjIib/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/JiUp3VdWWSRKSU0AvLy9AP///wD///8AjYyOAAAAAAAlJCiPIB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/zc2OdUtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8+OOGx2tn5Bqmm8QClovEKOTPgvCYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NjDg1YB86xcoJkkARENGcSMiJf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yQjJ/9JSEtlJSQoAElJTFwkIyf9IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JCQn81FR + VE4TEhYA9PT0AP///wD///8AqaiqAM3NzgUsKy+lIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zMy + NuUtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f9BO+Gg////As7M + 9wDx8f0EPTfhrCYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB8 + 6xc6OFgAR0ZKYyMiJv4gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMi + Jv9GRUlzHx4iAE9OUU4mJSj5IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/zc3OpSdnJ4MAAAAAAAA + AAAAAAAAAAAAAGVkZyQqKS3SIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zAvM/AtJt71Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ycg3f9DPeKNAAC5AP///wD///8BQTvhmycg + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xdGRGQATEtOVyUk + KPwgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIhJf9CQUWBEA8TAFZV + WD8nJyrzIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yYlKeU/PkFqV1ZZLWRjZiFeXWAlVVRXNDQz + N4IiISX4IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y0sMPYtJt71Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9HQeJ6AADVAAAAAAAAAMIART/iiScg3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xdQTm8AUE9TSiYlKfggHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP8+PUGOAAAAAGBfYi8qKS3rHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8kIyfqMC8zvzc2Oqw0Mze2MC8yzyIhJe4gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ywsL/stJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yki3f9JRONnHhfcAKuo8gAAANYASUPjdygh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xdXVnkAU1JVPiUkKPUeHSH/Hh0h/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP88Oz+cAAAAAHNydR8vLjLdHx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/yAfI/8gHyP/Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/y0sL/wtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yok + 3vtPSeNWNS/fAOTj+wAjHN0ATUfjZSkj3v4mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NjDg1YB86xdoZo0AY2JlMTw7P+UyMTX3LCsv/SIhJf8fHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/85OTyq////A5KRkxE0NDfJHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ywr + L/otJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ywm3vdXUuVHRkDiAJaS + 7gA5M+AAUkzkUysk3vomH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB8 + 6xeEgb0Ai4qMFnRzdnhmZWiBWFdamkJCRdIpKCz+Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/82NTm2uLe5B////wU9PD+sIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y4tMfQtJt71Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/y8o3vBfWuY4VVDkAG5p6ABJQ+IAWFLlQy0m + 3vUmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xeJhfIA////AP// + /wX///8E9vb2EYuLjUZQUFO3JyYq/h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/80MzfCl5aYDAAA + AABISEuHIiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zIxNeotJt71Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zEr3+hpZegrZF/nANPR+ABWUOQAXlnmNC8o3u4lHt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xd/e+sA9PT0APHx8QDr6+wAuLi5AAAA + AACbm502RURHziEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8yMTXNhYWHEkJBRQBaWVxcJyYq/CAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/zc2OtgtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/zQu3952cuogdHDpAP///wBjXuYAZ2LnJzEq3+QlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xeAfOsA6+vrAOrp6gDm5eYAuLe5AP///wAAAAAAcXBzZi0s + L/YfHiL/IB8j/yAfI/8gHyP/IB8j/x8eIv8vLjLXdnV4GXBvcgB4eHoyMC8z6h8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/z08QLwtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zYw + 4NGCfusVgX3rAP///wBybekAc2/pHDMt39olHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NjDg1YB86xeAfOsAAAAAAAAAAAD///8A2trbAMnJygCenZ8As7K0F0JBRMMgHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8tLDDfamlsIXx7fgC0tLURQUBDwyAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl/0dG + SpctJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zgy4MGUke4MiobtAP// + /wCAfOsAhIDsEzYw4M0lHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB8 + 6xeAfOsAAAAAAAAAAAAAAAAA/v7+AKSjpQD///8AAAAAAFxbXnkmJSn/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8rKi7nYWBjKWRjZgAAAAAAWFdagyQjJ/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JyYq+lpZXGktJt71Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/zs14LHCwPUGlZLuAP///wCOiu0AnpvwCzoz + 4L8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xeAfOsAAAAAAAAA + AAAAAAAAAAAAAP///wC5uboAZGNmAHh3ejYvLjLqHx4i/yAfI/8gHyP/IB8j/x8eIv8pKCzuXFxfNFRT + VgBgX2IAfn2AOzMyNusfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/MC8z5XZ1eDYtJt71Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/z034aD///8CpKHxAP///wCem/AA2dj5BT034a8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xeAfOsAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8An5+hAK6urxA9PEDEIB8j/yAfI/8gHyP/IB8j/yAfI/8oJyvzV1ZZP0pJTACysrMA2tnaC1BP + UqgiISX/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/RENHt729vg4tJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JyDd/0E74Y4AAK4Awb/1AAAAAAC2tPQA////AUA54Z0mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NjDg1YB86xeAfOsAAAAAAAAAAAAAAAAAAAAAAAAAAAD09PQA7OzsAP// + /wBKSU2RIiEl/yAfI/8gHyP/IB8j/yAfI/8mJSn4UVBTSj49QQD///8AKSgrAH59f0Y3NjnqHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8qKS37Z2ZpaQAAAAAtJt71Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KCHd/0ZA + 4n0AANIA////AAAAAADo5/sAAAC5AEM94osnIN3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 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 + Kf5CQUTghYSHbv///wbd3d4A2dnaAP///wD///8AAAAAAAAAAAAAAAAALyne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9Qq9u/UAQTvhAF1Y5gBsaOg5MSvf7iUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f9EPuKx4N/6CLOw8wCrqfIAUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAACXl5kAz8/QCD08QLIgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIhJf9JSEyLAAAAAP///wDOzs8A////AM3NzgD///8LcG9xijMy + NvYfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x4dIf8oJyv/S0tOzpSTlUkAAAAA////AP///wDBwMEAAAAAAAAA + AAAAAAAALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9Qq9u/UAdXHpAExG + 4wBmYedJLyje9iUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f9AOuHBrqzyDpuX7wCsqfIAUErkAF1Y + 5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAA + AAChoKIA////BEA/Q6UhICT/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP9GRUiZ////Ae3t + 7gDf398AAAAAAD8+QQCWlZc6SEhL2yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8eHSH/Kysu/2Fg + Y6i3trgddHN2ACIhJQDo6OkA////AAAAAAAAAAAALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QTvhvMC+9Qq9u/UAvrv1ADIs3wBfWuZbLSbe+yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f88NuDQlZHuF4mF7ACtq/IAUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAACvr7AA////AURDRpghICT/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yEgJP9CQUSm////BMjIyQDz8/MAz8/QAP///wVram2IKikt/h8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zg3O/KCgYRl////A9HR0gD7+/sAk5OUAAAAAAAAAAAALyne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9Qq9u/UAs7DzAAkC2QBYU+VsKyTe/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f84MuDdhIDsIXt36gCvrPIAUErkAF1Y5kEuJ97zJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAADFxcYAAAAAAEdG + SosiISX/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8+PUCy2trbCK6trwDV1dUAoqGjALCw + sSFIR0rPIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMiJv9TU1bCvLu9HqGh + owDU09QAubi6AAAAAAAAAAAALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+ + 9Qq9u/UAAACoAAAAzABQSuR9KSLd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f80Lt/ndnLqLW1o + 6ACqqPIAUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP// + /wAAAAAAAAAAAAAAAADq6uoAAAAAAExLTn4jIib/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/87Oj2+srGzDJqanAD///8AKiktAH18f1QxMTT0Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv80MzbzfHt+YQAAAAD///8Azs7PAAAAAAAAAAAALyne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9Qq9u/UA////AAAABQBLReOQKCHd/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f8xK9/wbWjoO11Y5gCgnfAAUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAAD///8AAAAAAE9OUXAkIyf/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv84NzvJnJudEo2MjgDV1NUA////Al5dYI0lJCj/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIyb/VlVYrdTT1BC5uboA7OzsAP// + /wAAAAAALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9Qq9u/UA5uX7AP// + /wNHQeKjJyDd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f8vKN73ZWDnTElD4wCkofEAUErkAF1Y + 5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAA + AAD///8AHx4iAFJRVGIlJCj9IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv82NTjUjIyOGYGB + gwCkpKYAv7/AEEdGSr4gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/Ozo+5Y2NjzliYWQA////AP///wAAAAAALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QTvhvMC+9Qq9u/UAx8b2ANbV+QlDPeK1Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8tJt78XlnmXS4n3gC1s/MAUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAAAKCQ0ANzc6AFhXWlUnJir6IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8zMjXcf3+BIHZ2eACBgIIAjYyOKDc2OuAfHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiP/KSgs/Whoanj///8A3t7fAKKhowAAAAAALyne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9Qq9u/UArKnyAKuo8hA/OeHFJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8rJN7/WFPlcAAA1wCopfEAUErkAF1Y5kEuJ97zJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAACDg4UASEdLAF5d + YEkoKCv2IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8wLzLkdXV3KWxsbgBUU1YAcnJ0Ry0t + MPQfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/1BP + UrnW1tYQurq7AHRzdgACAgIALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+ + 9Qq9uvUAkI3uAJCM7hg6NODSJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8pIt3/Uk3kggAA + wgAAALYAUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP// + /wAAAAAAAAAAAAAAAAC4uLkAVlVYAGVkZz4rKi3xHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8uLTDrb29xM2VkZwAREBQAYGBiZycmKv0gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zs6PeORkZMuf36BAPDw8AD///8ALyne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9Qq8uvUAenXqAH156yI2MODeJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8nId3/TUfjlP///wD///8AUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAADc3NwAYWBjAGtrbTMtLDDrHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8sKy7xaWhrPl1cXwAAAAAAUlFUgyMiJv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ywrL/hwb3JaISAkAP// + /wD///8ALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9Qq8uvUAaWTnAHJt + 6S8zLN/oJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8nIN3/R0Hipv///wTk4/sAUErkAF1Y + 5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAA + AADx8fIAbGtuAHJydCkvLjLlHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8pKSz2YmJkSlNS + VQD///8BR0ZKmiEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yQjJ/9aWVyL////Aerp6gD///8ALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QTvhvMC+9Qq9u/UAW1blAGxn6D8xKt/xJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Qz3it87N9wnEwvYAUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAAD9/f0Aenp8AH18fyExMTTdHx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8oJyr6W1teVUZGSQD19fUGQD9CrSAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/9IR0u32traDLe3uAD///8ALyne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9Qq/vfUAR0HiAGVg51AuKN74Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/Pzjhx6il8RGpp/IAUErkAF1Y5kEuJ97zJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAAD///8AiomMAImI + ihk0MzfUHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8mJSn9VlVYYjY1OAC2tbcLOzo9uyAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv86OT3WmJeZHouLjQDBwcMALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+ + 9QrBv/YAJyDdAF1X5mEsJd78Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OjTg1ZCM + 7hqQjO4AUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP// + /wAAAAAAAAAAAAAAAAD///8AmZmbAJaWmBI2NTjJHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8lJCf/U1JVcBwbIACXl5kPNjU5xSAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8wLzPseHh6OGVlZwC4t7kALyne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9QrCwPYAAADUAFRP5HIqI97/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NzDg4H966yV6duoAUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAAD///8AqqqrAKuqrAw4Nzq9IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIib/T05SfgAAAACIh4oTNDM3zB8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/4iISXvIiEl4iMiJuIjIibhIiEl5CEg + JPcgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8pKCz5ZGNmVTg4 + OwCxsLIALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9QrAvvUAAAC3AE1H + 44MoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/My3f6nNu6TJoZOcAT0rjAF1Y + 5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAA + AAD///8AwMDBANPS0wc7Oj6xIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8iISX/SklNiwAA + AACDgoQXMzI20h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/CMi + JuAqKS2oLCsufjIxNX0wLzN9KSgshignK8MiISXuIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8lJCj/VVRXcwAAAAD///8ALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QTvhvMC+9Qq6uPQA////AUlD4pYnIN3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/MCrf8mtm6EFZVOUAT0rjAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAAD///8A29vcAP///wQ/PkGmIB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8hICT/RkVImAAAAAB7en0YMTA00x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/JCMn3jY1OG1NTE8sPz5CE01MTxNGRUkSRENGGEZGST80MzaaIyIm9CAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8iISX/TEtOkv///wD///8ALyne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9QqzsPMA/f3/BUZA4qkmH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life+WRe51JDPeIAUErkAF1Y5kEuJ97zJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAAAAAAAA////AP// + /wFDQkaZISAk/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT/QUFEpP///wJ4d3oYMTAz1B8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8iISX8NzY5k1hXWhv///8CBgUJAAAA + AwAHBgoAAAAAAJmYmgdTUlU2MTAzriAfI/0gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Q0JGrP///wbV1dYALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+ + 9QqqqPIAu7n0C0I84bsmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/LCXe/VxX + 5mQgGdwAUUvkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP// + /wAAAAAAAAAAAAAAAAAAAAAA////AAAAAABIR0qMIiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Pj1Asf///wV7e30YMjE11B8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8oJyvrXFteTAAAAAB5eHsA////AP///wD///8AtLS1AFVUVwD///8CR0ZKVSQjJ+IgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/PDs/wrOztA6xsLIALyne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9QqfnPAAm5jvEz034colHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/KiPe/1VQ5HYAANEAUk3kAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMS05/IyIm/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Ozo+vcLCwwqCgYMWMzI20h8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8xMTTPlZSWIHd3eQB7en0AtLO1ANvb3ADJycoAnJudABEQ + FQBfXmEAfn1/FCsrLrIgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/NzY605WU + lhmVlZYALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9QqRje4AhYHsGzgy + 4NYlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KCHd/09J44gAAJsAVE/kAF1Y + 5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAA1AP///wAAAAAAAAAAAAAA + AAAAAAAAoqGjAAAAAABPTlJxJCMn/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/ODc7yaSj + pRCGhYgTNDM3zB8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/82NTmzvb2+C5yc + ngCbm5wAxMTFANvb3ADJycoAzc3OAAAAAACSkZMA////ATQ0N30hICT+IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/MzI24YKBhCV9fX8ALyne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QTvhvMC+9QqCfusAeXXqJzUv3+IlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JyDd/0pE45r///8CV1HlAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9RTOSRAAA1AP///wAAAAAAAAAAAAAAAAAAAAAAysrLABsaHgBTUlVjJSQo/SAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/NTQ40o+OkBeSkpQPNjU4xiAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/88Oz6m////BMDAwQBzcnUA////AAAAAAD///8A////AAAAAAD///8AAAABADs6 + PlUiISX2IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Ly4x6nNydDFpaGsALyne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+9QpzbukAcWzpNjMs3+0lHt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/0ZA4qzv7/0GWlXlAF1Y5kEuJ97zJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAAzAP///wAAAAAAAAAAAAAAAAAAAAAAr6+wADIx + NQBXV1pXJyYq+iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/MjE1239/gR6xsbILOjk8wCAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8+PUCj////A8rKywD///8AAAAAAAAA + AAAAAAAA////AP///wA9PEAALSwwAEA/QzgjIibqIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/LCsu8WppbD5aWVwAMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhvMC+ + 9QpiXeYAaWToRTAp3/UlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/0I7 + 4b22tPQMXlnmAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RTOSRAAAqAP// + /wAAAAAAAAAAAAAAAAAAAAAAHBsfAENCRgBdXF9LKCcr9iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/MC8z5HZ1eCfq6uoHPT1AtyAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/84Nzqj////A6+vsAD///8AAAAAAAAAAAAAAAAAAAAAAP///wCUlJYANjU4AD8+QiUjIibeIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/KSgs92JiZEpLS04AMCne8iYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QTvhu8C+9QpPSeMAYVzmVi0n3vomH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/z034cybl+8UYl3mAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9STOSSAAAaAP///wAAAAAAAAAAAAAAAAAAAAAAJiUpAFFQUwBiYWQ/Kikt8R8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Li0x629vcTL///8CQD9DqSAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8tLDCmrKutBHt7fQD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AADV1NUAMjE0ADQ0NxsiISXVIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JyYq+lxb + XlQ8Oz4AMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhu7+99Qo2L98AWFPlZisk + 3v4mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zky4NmHg+weYl3mAF1Y + 5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAA + AAAAAAAAfHt+AFtbXgBmZWgzLCsu6x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/LCsu8Whn + aj0AAAAARkZJmiEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8qKS2xfn6ACWpp + bAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAADh4eIANDM3ADY1ORgjIibTIB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/JiYp/FtaXV8rKi4AMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QTvhu7+99QoGANgAUUvkeCki3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/zUv3+R6duoqX1nmAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAAsrKzAGZlaABubXAqLi0x5R8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/KSgs9mFhZEgAAAAAT05RhyMiJv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8pKCzFZWVoE1xcXwD///8A////AAAAAAAAAAAAAAAAAAAAAAD///8ANzY6ADk4 + PBgjIibTIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JiUp/ldWWWQhICQAMCnf8iYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhu7+99QoAALYATEbjiygh3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zIs3+5wa+k3WFPlAF1Y5kEuJ97zJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAA2NjZAHFw + cwB5eHshMTA03R8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JyYq+lxbXlQbGh4AWFdbcCUk + KP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8mJSnbU1NWJkVERwC6ursA1NTVAP// + /wAAAAAAAAAAAP///wD///8APj1BAEFBRB0kIyfXIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/JSQo/lRTVmUdHCAAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhu7+9 + 9Qr///8CSELinicg3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zAp + 3/VoY+dHUErkAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP// + /wAAAAAAAAAAAAAAAAAAAAAA8vLyAHp6fACFhIYaNDM21B8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/JiUp/VdXWmIsKy8AY2JlVykoLPofHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8jIibuRURHRgMCBwD///8Ag4KEAMbGxwDT0tMA0tLSALm5ugAzMzYAPj5BAEhHSiokIyfhIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JSQo/lVUV2UeHSEAMCnf8iYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QTvhu8C+9Qro5/sHRD/isCYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0m3vthXOZYRD7iAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAA/Pz8AIODhQCRkZMTNjU4yh8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JSQo/1RTVnArKi4AcHByPC4tMe8fHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT7ODc7ef///wNpaGsAcnF0AMbGxwDT09QA09LTALi4 + uQBzcnUAAAAAAEVER0YjIibvIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JiUp/VhY + WmMjIiYAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhu8TC9gmuq/INQDnhwCYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ysk3v9ZVOVqMyzfAF1Y + 5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAA + AAAAAAAA////AJCQkgClpacNODc7vyAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/05O + UX0QDxMAiomLJTY1Od4fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Kyouvmtq + bScAAAAAfXx+AMvKywDa2tsA2dnaALu7vABSUVQA////BDk4O30hICT7IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/JiUp/FlYW1swLzMAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QTvhu8nI9wmPi+0UOzTgziUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yki3f9TTeR8EgvaAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAA+fr5AKOjpADJycoIOzo+syAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IiEl/0lITIkAAAAAtLS1EkFBRMUgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IyIm7jc2OYNiYmUj////AQAAAAAAAAAAAAAAAAAAAADw8PEDT05SRSop + LcYgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/KCcr+V5eYFFCQUQAMCnf8iYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhu9LQ+Ah/e+sfNzHg2iUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ycg3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9NSOOPAADMAF1Y5kEuJ97zJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAA////ALy8 + vQD///8EPz5BpyAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/0ZFSJf///8B////BVBP + UqIiISX/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/ycmKtk2NTiCNTQ4R0JC + RUBOTVFATUxPQDw7P0AwLzJLMTA0pSIhJfcgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/Kikt9GZmaEVSUlUAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhu97d + +gd3cuosNS7f5iUe3f8mH93/Jh/d/yYf3f8mH93/KCHd/y4n3v8mH93/Jh/d/yYf3f8mH93/Jh/d/ycg + 3f9JQ+KhAAAAAF1Y5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP// + /wAAAAAAAAAAAAAAAAAAAAAA////AN/f4AD///8BQ0JFmyEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/ISAk/0NCRqX///8EAAAAAGJhZHcnJir+IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8jIibsJiUpwS8uMrs2NTm7NTQ4uywrL7skIyfFISAk8yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Li0x7XBwcjZkY2YAMCnf8iYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QTvhu+/v/Qduaeg7Mivf8CUe3f8mH93/Jh/d/yYf3f8mH93/Life/kI8 + 4fomH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f9EPuKz////BV1X5kEuJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAA////AP///wAAAAAAR0ZKjiIh + Jf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/0A/QrLa2tsHW1pdAHh3ekgvLjLyHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP+IB8j+yEgJPoiISX6IiEl+iEg + JPogHyP7IB8j/iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/MzI24YOC + hCZ+fYAAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhu////wZlYOdKLyje9iUe + 3f8mH93/Jh/d/yYf3f8lHt3/Mivf+E9J4+UmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f9AOeHDycf3C1xX + 5kAuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wAAAAAASUlMfyIhJf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zw7 + P720tLUMlJSWAJ6eoCI/PkHXHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/PDs/0KSjpReioqQAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QTvhu////wZbVuVaLCbe+yYf3f8mH93/Jh/d/yYf3f8lHt3/NC7f7ldR5cgnIN3/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f87NeDRnZrwFFxX5kAuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATUxPcSQjJ/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zk4O8idnJ4RqKipAPj4+AlUU1aqIiEl/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/R0ZJteLi4wrKycoAMCnf8iYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhu////wdUTuRrKiPe/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NjDg5FxX5akoIt3+Jh/d/yYf3f8mH93/Jh/d/yUe3f83MeDdh4PsHlxX5j8uJ97zJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAHd3 + eQAeHSEAUlFUZSUkKP4gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zU0ONKMi40XjYyOAAAA + AABwcHJuLCsv+h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8jIib/VVRYj////wH///8AMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhu/// + /whPSeN+KSLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/ODLg2GJd5osqI979Jh/d/yYf3f8mH93/Jh/d/yUe + 3f80Lt/oenbqK11X5j4uJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAALOztAAzMjYAWFdaWCcmKvsgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/zIxNdt/foEffHt+AHp5fACYmJoxPj1B3x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8qKi37bGtuYxEQFAAAAAAAMCnf8iYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QTvhu/z8/wpLRuOSJyHd/yYf3f8mH93/Jh/d/yYf3f8lHt3/PDXgzGlk + 6HAsJd75Jh/d/yYf3f8mH93/Jh/d/yUe3f8xK9/wb2roOV1Y5j4uJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAANnZ2gBDQkUAXV1gTCgo + K/cfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zAvM+R4d3oocnJ0ALa2twDk5OULXl1goyUk + KP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv84NzvmjIyONXNy + dQDKyssAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTrhu+Hh+w5HQeKlJyDd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/PznhvnFs6VcuKN71JR7d/yYf3f8mH93/Jh/d/yUe3f8vKN73ZmHnSl9a + 5j0uJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAPDw8QBQT1IAYmJkQCopLfMfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y4t + MetvbnEyZWRnAP///wAAAAAAhIOFVDo5Pe0fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yEgJP9QT1K2xMTFEaioqQD///8AMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QDrhu8fF9hNCPOG1Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Qz3ir3p26kIxKt/vJR7d/yYf + 3f8mH93/Jh/d/yYf3f8sJt78XlnmW2Bb5j0uJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP39/QBdXF8AaWhrNSwrL+0fHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ysrLvFnZmk8V1ZZANzc3QCpqaoAyMfIF1pZXKkqKS3/Hh0h/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hh0h/zEwNPhxcHNv////AP///wB7e30AMCnf8iYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QDrhuq+s8xo9NuHEJh/d/yYf3f8mH93/Jh/d/yYf + 3f8nIN3/SELin4WB7C80Ld/mJR7d/yYf3f8mH93/Jh/d/yYf3f8qI97/VlHlbGJd5j4uJ97zJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wBram0AcnF0LC8uMeYfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ykpLPZgYGNHSklMAOnp + 6QD///8AAAAAAJKRk0tFREjYJiUp/SEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT/JyYq/VBP + U8arq6wojo2PAL69vwD///8AMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QDrhupyY + 7yM5MuDSJR7d/yYf3f8mH93/Jh/d/yYf3f8oId3/TUfjjpWS7iA3MeDcJR7d/yYf3f8mH93/Jh/d/yYf + 3f8pIt3/UUvkf2Vg5z8uJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAYAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wB3dnkAenp8IjEwNN4fHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/ygnK/pcW15UOzo9AMjIyQD///8AqamrANjY2QqEg4VuTEtO5CYlKf8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8mJSn/Tk5R442Nj17///8EysnKAMHBwgD///8AMCnf8iYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QDrhuY6K7S82MODfJR7d/yYf3f8mH93/Jh/d/yYf3f8pIt3/Uk3kfa6s + 8hQ7NODQJR7d/yYf3f8mH93/Jh/d/yYf3f8nIN3/TEbjkmdi50IuJ97zJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9STOSSAAAYAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJiIoAg4KEGjMy + NtUfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yYlKf1YV1phJyYqAJiXmQD///8A////AFpZ + XADNzM0jd3d5vC4tMf8fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8tLDD/d3Z5xtXV1imJiIoAFhUZAL++ + vwD+/v4AMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QDrhuYJ+6zwzLd/qJR7d/yYf + 3f8mH93/Jh/d/yYf3f8rJN7/V1LlbODf+gs/OeHDJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/R0HipGpl + 6EYuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAASAMbGvwBaWlwATEtPAExM + TwBMTE8ATExPAExMTwBWVVgAtbS2DTY1OcofHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yUk + J/9TUlVuCAcLACsqLgBtbXAA////AAAAAACOjY9IU1JV1ignK/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8nJir/T05R4H18f2n///8IycnKANra2wD///8AMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/QDrhuHdz6kswKt/yJR7d/yYf3f8mH93/Jh/d/yYf3f8tJt77XVjmWv///wREPuK0Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QjzhtWxn6EsuJ97zJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9STOSSAAA3ALq6vQKbmpwalJSWI5WUliKVlJYilZSWIpWUliKVlJYhl5eZLzw7P8sfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMiJv9NTVB7AAAAAP///wC4uLkAo6KkAL+/wBFeXWClKCcr/x8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/JSQn/1BPUs+WlZc7AAAAAP///wDLy8wAMCnf8iYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhuGxo6FotJ973Jh/d/yYf3f8mH93/Jh/d/yUe + 3f8vKN72ZF/nSgAALgBIQuKjJyDd/yYf3f8mH93/Jh/d/yYf3f8lHt3/PTfhxGxn6FItJ97yJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAABlALe2uAd5eHptbGxulGxsbpJsbG6SbGxukmxs + bpJsbG6Rbm5wlzw8P+MfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIhJf9JSEuIAAAAAP// + /wD///8AYWBjAIWEhz45ODzoHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/yop + Lf5paWuV6+vsCru7vADg4OAAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QTvhuGJd + 52orJN78Jh/d/yYf3f8mH93/Jh/d/yUe3f8xKt/wbGfoOwAAygBNSOOSKCHd/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/OTPg0mtm6FwtJt7yJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAABwALCv + sQtEQ0azLSww9S0sMPItLDDyLSww8i0sMPItLDDyLi0w8iYlKfsgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yEgJP9HRkmX////Afb29gDZ2doAAAAAAF1cX3onJir+Hx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/9BQEPdmJeZNHl4ewDU09QAMCnf8iYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/QjzhuV1Y5n4pIt7/Jh/d/yYf3f8mH93/Jh/d/yUe3f80Ld/ndXDpLQwE + 2QBSTeSAKSLd/yYf3f8mH93/Jh/d/yYf3f8lHt3/NjDg3mll6GctJt7xJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9STOSSAABwAM3Mzgg+PUC5ISAk/yEgJP8hICT/ISAk/yEgJP8hICT/ISAk/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP9DQkak////A8/P0ACurq8A0tLTC0hH + SrEhICT/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8rKi78ampseP// + /wD///8AMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/RD7iullT5ZIoId3/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f83MeDdgHzrITEr3wBYUuVuKyTe/yYf3f8mH93/Jh/d/yYf3f8lHt3/Myzf6Gdi + 53UtJt7xJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAABjAP///wVBQESqIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8/PkGw5eXlB7KyswCKiowAlpaYIDo5PdgfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/0hICT4IiEl+CIhJfghICT4IB8j/CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8hICT/Tk5RucvLzBK1tbYAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/RT/ivVNO5KUnIN3/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NeDRj4zuF0dB4gBeWOZdLCbe/CYf + 3f8mH93/Jh/d/yYf3f8lHt3/MCnf8GRf54QtJ97wJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9STOSSAABJAP///wFEREecISAk/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/87Oj68t7e4C52cngBpaGsAenl8OTAvM+4fHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk8yMiJs8lJCi5KCcruignK7olJCe5IiElySEh + JPEgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Ojk855GQkjR9fX8AMCnf8iYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/RkDiwU1H47YmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8/OeHEqabyD1pU5QBkX+dMLyje9yUe3f8mH93/Jh/d/yYf3f8mH93/LSbe9WBb5pQuJ97wJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAsAAAAAABGRUmNIiEl/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv84ODvHn56gEY2M + jgBDQkYAZmVoUSopLfkfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT7KikstTo5 + PFQ8Oz8uTk1QL01MUC86OTwuMjE1SisrLrAhICT3IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/Kyou+m1sb2APDhMAMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/R0HixkZB + 4sUlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f9DPeK10tD4CWlk6ABrZ+g8MSrf8CUe3f8mH93/Jh/d/yYf + 3f8mH93/KyTe+lxW5aUuJ97wJh7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAbAAAA + AABKSUyAIyIm/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv82NjnSkJCSGIWEhgAdHCAAWFdaZiYlKf4gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8pKCzjSUlMT1hYWw1lZGcEjYyOBIyLjQReXWAET05RC0pKTUAsKy/FIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/1ZWWZD///8CMCnf8iYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/SUPizkI84dQlHt3/Jh/d/yYf3f8mH93/Jh/d/ycg3f9HQeKk////BHZx + 6QB0cOkuNC3f6CUe3f8mH93/Jh/d/yYf3f8mH93/KSLd/FhS5bgvKN7xJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9STOSSAAAVAAAAAABPTlFzJCMn/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv80Mzbbg4OFH3x8fgAAAAAAT05RdiQj + J/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/83Njq5n56gFi0sMABDQkYAWllcAFlY + WwBCQUUAGBcbAN/f4AdDQkWAIyIm+iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/0ZF + SLjLy8wOMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/SkXj2T854eIlHt3/Jh/d/yYf + 3f8mH93/Jh/d/ycg3f9KROORAAAAAH976wB/e+siNzDg3iUe3f8mH93/Jh/d/yYf3f8mH93/KCHd/lRO + 5MswKd/zJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAUAB8eIQBTUlZmJSQo/iAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8wLzPjeHd5J3RzdgAAAAAASklNhCIhJf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/9AP0KK////Av///wBAQEMAVFNWAFNTVgBFREcAAAAAACEgJABoZ2pCKCgr5yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zo5PNaWlpgjMCnf8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/TEbj5Tw14O4lHt3/Jh/d/yYf3f8mH93/Jh/d/ygi3f9NSON+AADKAIiE7ACNiu0YOjTg0iUe + 3f8mH93/Jh/d/yYf3f8mH93/JyDd/1BK5N0xK9/2JR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9STOSSAAAWADY2OABXVllYJyYq+yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8uLTDqbm1wMGtqbQAAAAAASUhMjiIhJf8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP01NDhoAAAAAP///wB+foEA////AP///wDJycoAxcXGAHFw + cwCKiowbLi0wxx8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zEwNOt9fH8/MCnf8iYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/S0Xj8jgy4PglHt3/Jh/d/yYf3f8mH93/Jh/d/yoj + 3v9TTuRsDQXZAJSR7gCjoPEQPjfhxCYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/0xG4+8zLN/6JR7d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSSAAAZAElISwBdXWBNKCcr9x8eI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8rKi7wZ2ZpO2Bf + YgAAAAAAR0ZKlCIhJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJPwqKS1cGRgcAA8O + EgC0tLYA////AP///wDNzc4A////AISEhgCqqqsHLCsvpSAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/ysqLfdpaGtcMCne8iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/RkDi+jQt + 3/0lHt3/Jh/d/yYf3f8mH93/Jh/d/ywl3vxbVuVcMSvfAKil8QDKyfcJQTvhtCYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/0U/4vsyLN/9JR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9RS+SRAAA/AFhX + WQBjYmVBKikt8h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8pKCz1YWBjRlJRVAD///8ARkVJlSEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yEgJPwsKy5fExIWAAAAAAD8/PwAAAAAAAAAAAD///8A1tbXAKSjpQAAAAAALCsviyAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yYlKf1aWVx4MCne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/OzXg/i4n3v8mH93/Jh/d/yYf3f8mH93/JR7d/y4o3vdjXudNSELiAMXE + 9gD///8ERkDipCcg3f8mH93/Jh/d/yYf3f8mH93/JR7d/zky4P8vKN7/JR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9QSuSQAABaAGRjZQBpaGs1LCsv7R8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8oJyv5XVxfU0BAQwAAAAAARkZJkyEg + JP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP4uLTFsAAACAAAAAAD///8AAAAAAAAA + AAAAAAAA////AP///wAAAAAAKikteCAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMi + Jv9QT1OTMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Lyje/yki3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/zEr3/FsaOg+W1blAPj3/gD///8ASkTjkycg3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ywm + 3v8pIt7/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9PSuOQAABkAG5tbwBvb3ErLi0x5h8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8mJSn9WFdaYCopLQAAAAAAR0ZJjCIhJf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8wLzKAAAAAAObm5gDCwsMA////AAAAAAAAAAAA////AAAAAAAMCg8AJycqbiAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP9JSEysMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JyDd/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zQu3+p3c+oxbmnoAP///wAAAMUAT0njgSgi + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9QSuOQAABjAHd3eAB3d3kiMDAz3h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8lJCj/U1JVbQoJDQAAAAAARkVIgiIhJf8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8xMTSd4+PkBqSjpQDPz9AA8/P0AP///wD///8A8fHyAAAA + AAALCQ4AJyYqbiAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/9DQkbBMCne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zgx + 4OCEgOwlf3vrAAAAzwAFANgAVU/kbyoj3v8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAIKCggCDgoQaMzI21R8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIib/Tk1QegAA + AAAAAAAAS0pNeSMiJv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8xMDTEmZiaGYSE + hgC5uboA9PT0AP///wD///8A7e3tAP///wAAAAAAMC8zfiAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8+PUDTMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs14NSSj+4ajYntAJaS7gAuKN4AW1blXiwl3vwmH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAI+O + jgCQkJITNjU4yx8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8iISX/S0pNiAAAAAALCQ4AUE9TbSQjJ/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8pKCzmZWRnQQAAAQC6ursA////AP///wD///8A////AIqKjADl5eUJMzI2pCAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/86OT3hMCne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/z444cakofERlpPvANHP + +ABGQOIAYl3mTi4n3vglHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9QSuOQAABjAJ+enQCkpKYOODg7wSAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT/R0ZKlv///wAuLTAAVlVYXyYl + Kf0gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8iISX6Pj1BiIGBgxUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABhYGMzLCsv0SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv83NjnrMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/0E74bXCwPUJmpfvAPb2/gBZU+UAamXoPzEq3/IlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjALW1sgDHxscJPDs/tiAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8hICT/Q0JFo////wNIR0oAXVxfTygnK/gfHiP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/KSks2EhIS2BhYGMka2ptFXh4ehNtbW8UcG9yHFhXWig5OTyCIyIm9iAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8zMzbyMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JyDd/0U/4qX///8EpaLxAP39/wBpZegAc2/pMTQt + 3+olHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9QSuOQAABjANDQywD///8FPz9CqSAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Pz5Br+/v8AZgX2IAZmVoPisqLvEfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk+yYlKdM3NjqlPz5BfU1MT3hDQkZ/QD9ClTIy + Na4jIibdIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8yMTX3MCne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JyDd/0lD + 4pP///8BtrT0AP///wB7d+oAf3vrJDcw4OAlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAPHx6AD///8CQkFFnCEgJP8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Ozs+u76+ + vwt7e30AdXR3LjAvMugfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEg + JPslJCjvJiUp3ikoLNwoJyviJyYp6iQjJ/IgHyP8IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8yMTX6MCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/KCHd/0xH44EAAMAA19X5AP///wCIhOwAjYntGjo04NQlHt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAP// + /wAAAAAARENGkB8eIv8eHSH/Hh0h/x4dIf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/OTg8x6WkphCQkJIAioqMHjY1ONkfHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/IB8j/yAfI/8gHyP/Hx4i/x8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8yMTX7MCne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KiPe/1JM5G8AANcA////AP// + /wCRju4AnpvwET034cYlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9QSuOQAABjAP///wAAAAAAUVBTfi8uMvwrKi74KSgs+yUkKP8hICT/Hx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/NjU50ZOSlBeYl5kArKytED08 + P8QgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8yMTT4MCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/LCXe/FpV5V8rJN4A////AP///wCZle8Avrz1CkE74bcmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAP///wA5ODwAdHN2Wl9e + YctVVVjDTUxP0Tw7PucqKS35ISAk/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/MzI22oODhR6Li40A////BkZFSaghICT/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8zMjXyMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life+GNe509HQeIAT0rjAP///wCjoPEA////BEU/ + 4qYnIN3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9QSuOQAABjAP///wCOjY8Ao6KkGJqZmzuNjI41h4aJQHp5fGVgYGKtOTg88yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/MC8z4nh3eiZ5eHsAAAAAAFRTVoYjIyb/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv83NjnrMCne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/MSrf8mtn + 6EBaVeUAsa7zAAAAAAC1svMA////AUpE45UnIN3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAP///wD///8A////Af///wT///8C////Bc7O + zxSNjI47ZWVokzg3O/EfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Li0x6nFx + czBqaWwAFhUZAGRkZmApKCz7Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/88Oz7fMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/NC3f63Zx6TJsZ+gA4uH6AAAAAADV0/gAAAC1AE5J44QoIt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAP// + /wDv7+8A8vLyAPDw8ADr6+sA1tbXAJ2cngAAAAAAt7e4LlxcX6krKi78Hx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/LCsv8GtrbTtdXF8AaGhqAHx8fjoyMTTsHx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/9CQUTMMCne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/ODHg4oN/7CZ+eusA/f3/AAAA + AAD///8AAADVAFNO5HEqI97/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9QSuOQAABjAP///wDp6ekA6urrAOrq6gDk5OQA1tbWALCvsQD///8ACgkOAKGh + o0NEQ0fZISAk/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Kikt9WRkZkdQT1IAoJ+hAKem + qBtAP0LQHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEg + JP9JSEuyMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/OzXg1pKP7huSj+4A////AAAAAAD///8AKCHdAFpV5WAsJd78Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAP///wDp6ekA6urrAOrq + 6gDk5OQA1tbWALGxsgD///8AoqKkAP///whsa26GKikt/B8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/KCcr+V1dYFJAP0IA2NjZAP///wdVVFekIiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMjJv9TUlWQMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/PTfhyKSh8RGmo/EA////AAAAAAA8NuAARD7iAGFc + 5lAuJ974Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9QSuOQAABjAP///wAAAAAAAAAAAAAAAAAAAAAA////AN3d3gD19fYA////ADo5PQCUlJY2Pj1A3B8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JiUp/FdWWV8pKCwA////AAAAAABwb3JrLCsu/B8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4j/ygoK/pjYmVrMCne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/QDrhuMTC + 9gq8uvQA////AAAAAACtqvIAWFPlAGlk6EAwKt/yJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wDw8PEA9fX1AMjIyQD///8KV1daoyQjJ/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JSQn/1JR + VGsHBgoA////AHV0dgCUlJY0PDw/4R8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/zEwNOt7en1DMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/RD7ip////wTa2fkA////AAAAAADi4foAaGPnAHJu6TIzLd/rJR7d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A5OTlAAAAAAAAAAAAdnV4YC0sMPYfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IyIm/05NUHkAAAAA////AMHAwgDk5OQNVlVYqiQjJ/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/z8+Qs2ioqMfMCne8SYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8nIN3/SUPilv///wH///8A////AAAA + AAD8/P8AeHTqAH156yY2MODhJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9QSuOQAABjAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMPFANzc + 3ACCgoQAl5eZJzo5PdofHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl/0tKTYcAAAAA09PUAP// + /wAAAAAAfXx/XzIxNfMfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/1RT + Vpv///8GMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8oId3/TEbjgwAAwAD///8A////AAAAAAD///8AjIntAIyJ7Rs6M+DWJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuOQAABjAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAoaGjAP///wCwsLEA4ODgC05NULEhICT/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IiEl/0ZFSZX///8BuLi5ADY1OACMjI4AsbCyHlJRVL8iISX/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/MC8z9nd2eVsAAAAAMCne8SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI97/UUvkcQAA1gB3cuoAAAAAAAAAAAD7+/4AoZ7wAJ+c + 8BE9NuHIJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh + 3f9QSuOQAABjAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////APDw8QD09PQAAAAAAF9f + Yn0mJSn/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/0JBRaH///8Dp6aoAP///wDi4uIA////Anl4 + e2Q5ODvvHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT/S0pOyaWlpiKHhogAMCne8SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8rJd79V1LlYCYf + 3QDFw/YAAAAAAAAAAAD///8Aurf0AMC+9QpAOuG5Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9QSuSQAABjAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAPPz8wAAAAAARENGAHNydUwtLDD0Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/z8+ + Qa7k5OUGnZyeAP///wCWlpgAlJSWAL29vhxbWl2nLSwv/B8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8zMjX3b29xev///wT19fUALyje8iUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f8tJt75YFvmUUA54QChnvAAAAAAAAAAAAD///8A2dj5AP///wVEPuKpJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh7d/ycg3f9PSeOQAABiAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADn5+cAhoaIAI6Njyc2NTneHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/zw7P7q5uLoLl5aYAP///wD///8A////AAAAAACZmZtES0pNzSgn + K/0gHyP/Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/ygnK/1UU1bBsbGyKYaFhwCop6kALyne8iUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f8wKd/zaWTnQlZQ5ABAOuEAAAAAAAAA + AAD///8A////AP///wFIQuKXJyDd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9PSuOQAABjAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD09PQAtbW2AL6+vw9BQUTAIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zo5PMehoaMQkpKUAP// + /wD///8A////AK6urwDv7+8GjIuOXktKTdomJSn+IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JCMn/0pJTd2SkZNW////A9DQ + 0QClpKYAPDbh8DMs3/4zLd/9My3f/TMt3/0zLd/9My3f/TMt3/0zLd/9My3f/TMt3/0zLd/9My3f/TMs + 3/8+OOHpdnLqMmtm6AB+eusAAAAAAAAAAAD///8A////AAAAwQBVUOSENS/f/zMt3/4zLd/+My3f/jMt + 3/4zLd/+My3f/jMt3/4zLd/+My3f/jMt3/40Ld/+NC7f/zYw4P9aVOWOAACHAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJycoA4+PkAP///wNOTVGdIyIm/yEgJP8hICT/ISAk/yEg + JP8hICT/IB8j/zc2OtWPj5EXiomLAAAAAAD///8A////AP///wA2NTkAvr2/En9+gF9VVVjIMjE1/SEg + JP8eHSH/Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Hh0h/x8e + Iv8sKy//T05R1n9+gGfGxscQamlsAAAAAABjY2YAV1Hljk9J45dPSeSWT0nklk9J5JZPSeSWT0nklk9J + 5JZPSeSWT0nklk9J5JZPSeSWT0nklk5J45dYUuWGh4PsGYB86wCxrvMAAAAAAAAAAAAAAAAAFg7bAA0F + 2QBsZ+hIUUzkmFBK5JdQSuSXUErkl1BK5JdQSuSXUErkl1BK5JdQSuSXUErkl1BK5JdRTOSYVlHlnVhS + 5Z9zb+lWAACzAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AAAA + AABsa25oS0pN2klIS9pJSEvaSUhL2klIS9pJSEvaSEdL3FlYW7ebmpwWmZiaAAAAAAD///8A+Pj4APT0 + 9AD///8AWVhbAOHh4hKAf4JWWVlcoUNCRto0Mzb5KCcr/yIhJf8fHiL/Hh0h/x4dIf8dHCD/HRwg/x0c + IP8eHSH/Hh0h/yAfI/8lJCj/Li0x/j49QehUU1a0eHd6ZNDQ0RdQT1IA////AP///wD///8AoZ7xI52Z + 8CWdmvAlnZrwJZ2a8CWdmvAlnZrwJZ2a8CWdmvAlnZrwJZ2a8CWdmvAlnZrwJZ2Z8CWinvEgvbr1BLq3 + 9AD7+/8AAAAAAAAAAAAAAAAA5eT7AJGO7gCvrfMQoJzwJp6b8Caem/AmnpvwJp6b8Caem/AmnpvwJp6b + 8Caem/AmnpvwJp6b8Cain/EnrKnyLK2q8i24tfQXZmHoAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A5ubmAHJydACamZssgYCDcH9+gXJ/f4Fyf3+Bcn9/gXJ/f4Fyf36Ac4iH + iWCvr7AMr66wAAAAAAAAAAAA/Pz8AOjo6QD5+fkA////AJ+foQD///8Erq6vMnRzdnRWVlmqRENGyzs6 + PuE2NTjvMC8z8y8vMvowLzP9MC8y/TAvM/wvLjL3MjE18To5POpAP0PXTk1Rumloa4mcm51F////CouL + jQD///8A////APn5+QD///8AiobtAIWA7ACFgewAhYHsAIWB7ACFgewAhYHsAIWB7ACFgewAhYHsAIWB + 7ACFgewAhYHsAISA7ACKhu0ApqPxAKKf8QDV1PkAAAAAAAAAAAAAAAAAraryAG1o6ACXk+8AhoLsAISA + 7ACFgOwAhYDsAIWA7ACFgOwAhYDsAIWA7ACFgOwAhYDsAIWA7ACEgOwAgn7sAIN/7ACWku8AAADSAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8B////Bf// + /wb///8G////Bv///wb///8G////Bv///wX///8B////AAAAAAAAAAAAAAAAAP///wDw8PEA////AAAA + AADd3d4AVVRXAP///wq9vL01kZGTbHp6fKNoaGrKVVVY2FNSVe5TUlX3U1JV91NTVvZTUlXjXV1f0nRz + dr2Ih4mJqamqTOrq6hcAAAAAysrLAP///wD///8A8fHxAP///wAAAAAAAAAAAABwABwAAAB/AAAAAABw + ABgAAAA/AAAAAABwABAAAAAfAAAAAABwABAAAAAPAAAAAABwAAAAAAAHAAAAAABwAAAAAAAHAAAAAABw + AAAAAAAHAAAAAABwAAAAAAADAAAAAABwAAAAAAADAAAAAABwAAAAAAADAAAAAABwAAAAAAADAAAAAABw + AAAAAAABAAAAAABwAAAAAAABAAAAAABwAAAAAAAAAAAAAABwAAAAAAAAAAAAAABwAAAAAAAAAAAAAABw + AAAAAAAAAAAAAABwAAAAAAAAAAAAAABwAAAAAAAAAAAAAABwAAAAAAAAAAAAAABwAAAAAAAAAAAAAABw + AAAAAAAAAAAAAABwAAAAAAAAAAAAAABwAAAAAAAAAAAAAAB4AAAAAAAAAAAAAAB4AAAAAAAAAAAAAAB4 + AAAAAAAAAAAAAAB4AAAAAAAAAAAAAAB4AAAACAAAAAAAAAB4AAAAHAAAAAAAAAB4AAAAHgAAAAAAAAB4 + AAAAHwAAAAAAAAB4AAAAHwAAAAAAAAB4AAAADwAAAAAAAAB4AAAABgAAAAAAAAB4AAAAAAAAAAAAAAB4 + AAAAAAAAAAAAAAB4AAAAAAAAAAAAAAB4AAAAAAAAAAAAAAB4AAAAAAAAAAAAAAB4AAAAAAAAAAAAAAB4 + AAAAAAAAAAAAAAB8AAAAAAAAAAAAAAB8AAAAAAAAAAAAAAB8AAAAAAAAAAAAAAB8AAAAAAAAAAAAAAB8 + AAAAAAAAAAAAAAB8AAAAAAAAAAAAAAB8AAAAAAAAAAAAAAB8AAAAAAAAAAAAAAB8AAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAA + AAAAA4AAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAA + AAAAAAAAAAAQAAAAAAAAAAAAAAAQAAB4AAAAAAAAAAAQAAB8AAAAAAAAAAAQAAB+AAAAAAAAAAAQAAB/ + AAAAAAAAAAAQAAB/AAAAAAAAAAAwAAB/AAAAAAAAAAAwAAB/gAAAAAAAAAAwAAB/wAAAAAAAAAAwAAB/ + wAAAAAAAAAAwAAB/wACAAAAAAAA4AAB/wACAAAAAAAA4AAB/wADAAAAAAAA4AAB/4ADgAAABKAAAAIAA + AAAAAQAAAQAgAAAAAAAAAAEAEwsAABMLAAAAAAAAAAAAAKuo8gCnpPEAp6TxAKek8QCnpPEAp6TxAKek + 8QCnpPEAp6TxAKek8QCnpPEAp6TxALCt8wDQzvgAy8n3AO3s/AAAAAAA////AMnH9wDh4PoAr63zAKek + 8QCnpPEAp6TxAKek8QCnpPEAp6TxAKek8QCnpPEAp6TxAKuo8gDAvvUAt7X0ALOx8wAAAAAAAAAAAN/e + +gD///8At7T0AKil8QCnpPEAp6TxAKek8QCnpPEAp6TxAKek8QCnpPEAp6TxAKek8QCnpPEAqqfyAL27 + 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 + AAAAAAAAAAAAAAAAAAD///8AAAAAAF5eYGknJir9Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8pKCz6ZmZoXSUkKAD///8AAAAAAAAAAAD19fUA9PT0AP///wB3d3kA1NTUIXR0 + dpk5ODzuJCMn/iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT/JyYq/EJB + ROZ7e32Qz8/PIEJBRAD///8A5OTlAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAA0Ld/rJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f88NeDjioftKn566wDS0fgAAAAAAEI7 + 4QBeWeYAeHTqQTQu3+8lHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8pIt3/VE/km/// + /wS2tPQA////AAAAAACwrfMA////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y4n3v9pZOdzAADOAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAkIycAZWRnXCko + LPkgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/ygnK/xiYWRqAAAAAP// + /wAAAAAA////AO/u7wC7ursAycjJAP///wmKiYtoS0pO2SgnK/8eHSH/Hx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8eHSH/LSww/01MT9R+fYBv6urqE5KSlAD///8A////AP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAADQt3+smH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/zw14OOKh+0qfnrrANLR+AD///8A////AEE74QBybelSMSvf9iUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ycg3f9PSeOs6ur8CaSh8QD///8AAAAAALCt8wD///8CTUfjlCgh + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2lk53MAAM4A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVERwBsa25QKyou9h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/JiUp/11dYHcAAAAA////AP///wCBgIIA8vLyAPj3+AAqKS0At7e4J2hn + argsKy/+Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/Kyou/l5dYMWko6VC////A6+vsQAAAAAA////AOzs7AAAAAAAAAAAAAAAAAAAAAAANC3f6yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/PDXg44qH7Sp+eusA0tH4AP// + /wD///8ABgDYAGpm6GQvKN77Jh7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/0pE + 47zBvvUPlpPvAP///wAAAAAAsK3zAP///wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8uJ97/aWTncwAAzgD///8AAAAAAAAAAAAAAAAAAAAAAAAAAABIR0oAWVhbAHJx + dEUuLTHxHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8lJCj/WFdahAAA + AADe3t4A////ALy8vQD8/PwA7u7vAP///wSFhIdsQD9C6SIhJf8fHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8iISX/ODc68WxrbpnW1tYehYSGAAAA + AAAAAAAA7OzsAAAAAAAAAAAAAAAAAAAAAAA0Ld/rJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f88NeDjioftKn566wDS0fgA////AP7+/wAAAL4AY17ndiwm3v4mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/RT/iy6im8ReNiu0A9fX9AAAAAACwrfMA////Ak1H + 45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9pZOdzAADOAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAIyMjgBnZ2kAeXh7OjAvM+wfHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMiJv9SUlWR////AcTExQD///8A3d3dAAAAAACFhIcAv7/AHWRj + Zq8pKCv/Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8jIib/TUxP3JKRk1f///8FxMTFALGxswDk5OUA////AAAAAAAAAAAAAAAAADQt + 3+smH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw14OOKh+0qfnrrANLR + +AD///8A1tX5AP///wBbVuWHKiTe/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f9AOuHYmJXvIYaC7ADk4/sAAAAAALCt8wD///8CTUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Life/2lk53MAAM4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAtbW2AHJy + dACAgIIvMzI25R8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl/05N + UJ3///8EsbCyAP///wDR0dEA////AAAAAACZmJpNQkFE5CEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8tLDD6aWhrq9PT + 1BympqcAfHt+AOjo6QD///8AAAAAAAAAAAAAAAAANC3f6yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/PDXg44qH7Sp+eusA0tH4APj4/gC3tfQA////A1RO5JcpIt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs14OOLh+0te3fqAL689QAAAAAAsK3zAP// + /wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/aWTncwAA + zgD///8AAAAAAAAAAAAAAAAAAAAAAAAAAADS0dIAenp8AImJiyY3NjneHx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT/SklMqfX19QihoaMA////AP7+/gDPz9AA////B3Nz + dYcvLjH8Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/yEgJP9IR0vhj46QU////wH19fYA+Pj4AP///wAAAAAAAAAAAAAA + AAA0Ld/rJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f88NeDjioftKn56 + 6wDS0fgA////AKGd8ADy8v0HTUfjpycg3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NzDg7H976zprZ+gAh4PsAAAAAACwrfMA////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9pZOdzAADOAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAOXl + 5gB/f4EAk5KUHjo5PdUfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/9GRUm2zMzNDJaVlwD///8AuLi5AKWlpgDGxscaV1ZZvyMiJv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ywr + L/xtbW+b4ODhELS0tQBtbG8A////AAAAAAAAAAAAAAAAADQt3+smH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw14OOKh+0qfnrrANLR+AD///8Ak5DuAMG/9Q1IQuK4Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f8zLN/zdnLqSlJN5AAAAMoA////ALCt + 8wD///8CTUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2lk + 53MAAM4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAA9PT1AIKBhACdnJ4XPDw/yx8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/0NCRsK1tbYRjo6QAP///wD///8AWlpcAJeW + mD5AP0LkHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/IiEl/0tKTdShoaI7SEhLAP///wAAAAAA////AAAA + AAAAAAAANC3f6yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/PDXg44qH + 7Sp+eusA0tH4APTz/QCLiO0AqabxFUQ+4scmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/zAp3/luaehbKSPeAP///wD///8AsK3zAP///wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/aWTncwAAzgD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8AhYWHAKurrBA/PkLAIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/QD9CzKWkpheIiIoA+vr6AOnp6gAAAAAAenl7aTAvMvkfHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/MzI293x8fnP///8EysrLAM/P0AD///8AAAAAAAAAAAA0Ld/rJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f88NeDjioftKn566wDS0fgA5+f7AIeD7ACal+8gQDrh1iUe + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/LSfe/WZh520AANAA////AP// + /wCwrfMA////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n + 3v9pZOdzAADOAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wCPjpAAxMPFC0NCRrQgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv88Oz7VmJeZHoOChQDw8PAAxMTFAP// + /wVgX2KVJiUp/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8mJSj/WllcsdLS0xasrK0Avb2/AP// + /wAAAAAAAAAAADQt3+smH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw1 + 4OOKh+0qfnrrANLR+ADCwPYAfXnrAI6K7Sw8NuDiJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8rJd7/X1rmfwAAegDo5/sA////ALCt8wD///8CTUfjlCgh3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2lk53MAAM4A////AAAAAAAAAAAAAAAAAAAA + AAAAAAAA////AJubnQDt7e0HR0ZKqSEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/zg3O96NjI4mfXx/ANzc3QClpacAysrKEk9OUbohICT/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv9DQkXenJudPxgXGwD///8AxMTFAFdXVwAAAAAANC3f6yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/PDXg44qH7Sp+eusA0tH4AJCN7gBva+kAg3/sOTgx + 4OslHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yoj3v9ZVOWR////AsnH + 9wD9/f8AsK3zAP///wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8uJ97/aWTncwAAzgD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8Aq6utAP///wRLS06dIiEl/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/NDM35YSDhi92dXcAwsLDAI2N + jwCko6UmQUBE2B8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zAvM/l/f4F2////Aerq + 6gD///8AVlZWAAAAAAA0Ld/rJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f88NeDjioftKn566wDS0fgADwfZAFhT5QB3c+pHNC3f8iUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/KCHd/1NO5KL///8GsK7zAP///wCwrfMA////Ak1H45QoId3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9pZOdzAADOAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wC/vsAA////AlBPU5EjIib/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8xMTTsfn1/OmtqbQBoaGoAaWhrAIqKjD02NTnrHx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/JiUp/2FgY6jr6+sNvLu9APPz8wD///8AAAAAADQt3+smH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw14OOKh+0qfnrrANLR+AD///8ANi/fAGxo + 6FcwKd/3JR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8nIN3/TUjjstjW + +Quem/AA////ALCt8wD///8CTUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Life/2lk53MAAM4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////ANjX2AAAAAAAVVRXhCQj + J/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y8uMvJ4d3lGXVxfAAAA + AAA3NjoAd3d5Vi4tMfYfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/SUhL0K2t + riSKiowAFRQZAP///wAAAAAANC3f6yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/PDXg44qH7Sp+eusA0tH4AP///wAAANUAY17nZy0n3vwmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f9IQuLCtbPzEpGO7gD///8AsK3zAP///wJNR+OUKCHd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/aWTncwAAzgD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A+fn5AAAAAABaWVx3JiUp/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/LCsv9nFwc1FHRkoA////AAAAAABmZmltKSgs/R8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv84NzrsjIuNSjs7PgD///8A////AAAAAAA0Ld/rJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f88NeDjioftKn566wDS0fgA7Oz8AAAA + qABdWOZ5KyTe/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/0M9 + 4c+hnvAbiYbtAO/u/ACwrfMA////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y4n3v9pZOdzAADOAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAF9e + YWonJir9IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8qKS36amlsXSgn + KwD09PUAAAAAAFpaXYIlJCj/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ywr + L/xzc3V0////AOPj5AD///8AAAAAADQt3+smH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/zw14OOKh+0qfnrrANLR+ADLyvcA////AVlT5Y0qI97/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/Pjjh3JOQ7iWDf+wA2tn5ALCt8wD///8CTUfjlCgh + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2lk53MAAM4A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAfHiIAZWVoXikoLPogHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/ygnK/xiYmRpAAAAAM7NzgD///8DUVFUlSMiJv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JSQn/15dYKD///8IwMDBAP///wAAAAAANC3f6yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/PDXg44qH7Sp+eusA0tH4ALOx + 8wD///8FVE7knygh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f86M+DniITsMndz6gCtqvIAsK3zAP///wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8uJ97/aWTncwAAzgD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEA/ + QgBsa25SKyou9h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JiUp/1xc + X3YAAAAAtbW2AP///wZLSk2lIiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8hICT/TExPw7++wBegoKIA5OTkAP///wA0Ld/rJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f88NeDjioftKn566wDU0vgAoZ7wAN/e+gpOSOOwJyDd/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zYv3+9+eutBZWDnAF5Y5gCwrfMA////Ak1H + 45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9pZOdzAADOAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4NzsAVlZZAHFxc0YtLDDxHx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8lJCj/WFdagwAAAACkpKYA0dDRCkVFSLEhICT/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8+PUDdmpqbLIGBgwCjo6QA////ADQt + 3+smH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw14OOKh+0qfnrrANfW + +QCTj+4Aubf0EUhC4r8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/Mivf9XRv6VFIQuIAAACAALCt8wD///8CTUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Life/2lk53MAAM4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAISE + hgBkY2YAdnV4OS8uMusfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yQj + Jv9UU1aR////ApiXmQCysrMNQD9DuiAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/zMyNu+BgIJHUE9SAP///wD7+/sANC3f6yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/PDXg44qH7Sp+eusA2Nf5AIeE7AChnvAYQz3hzSUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYe3f8vKN76a2boYRcP2wD///8AsK3zAP// + /wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/aWTncwAA + zgD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArq2vAG1sbwB7en0vMjE15B8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl/1BPUp7///8EkI+RAKKipBE9PEDCIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8hICT9ISAk8iEgJOsiISXrIiEl6yIhJeshICTsISAk9SAfI/0gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Kyou+m1tb2UAAAAA////AP// + /wA0Ld/rJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f88NeDjioftKn56 + 6wDV0/gAfnrrAI+L7SI9N+HYJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y0m3v5iXeZyAADHAP///wCwrfMA////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9pZOdzAADOAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADLy8wAdHR2AIOChCU1NDjdHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8hICT/S0pOqvj4+QiLio0AnJudFTw8P8kfHiP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/SQjJ+wnJirBJyYqpCsqLqQtLDCkKiktpCYl + KKYnJirLIyIm8CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8mJSn/XVxfhP///wHU1NUA////ADQt3+smH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw14OOKh+0qfnrrAMG/9QB0b+kAg3/sLjky4OMlHt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KyTe/1xW5YQAAAAA2dj5ALCt + 8wD///8CTUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2lk + 53MAAM4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOPj4wB6eXwAjYyOHjg3O9UfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP9HRkm1zs7PDIWFhwCVlZcXOzo9zR8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/slJCjTKyouojEwNHEtLDBTNTQ4Uzg3O1MzMjZSKyouVDEwM3wqKS2rJiUp3SEgJP0gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIhJf9RUFSh////B7Cw + sQD///8ANC3f6yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/PDXg44qH + 7Sp+eusAnpvwAGVg5wB7d+o8NS/f7CUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8pIt3/VlHllv///wO+vPUAsK3zAP///wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/aWTncwAAzgD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA7+/vAH9+gQCamZsXPDs/zB8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/0NCRcC0tLUQgH+BAI+PkRc5ODvOHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm6DEwNItHRkk9YWFkG0dGSgpdXF8KZWVoCldX + WgpHRkoLXVxfIkVFSEc2NTieJCMn7CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/0hHS7vFxcYQmpqcAP39/QA0Ld/rJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f88NeDjioftKn566wAwKd8AS0XjAHRv6U0yLN/0JR7d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ych3f9RS+So/f3/B6mm + 8QCwrfMA////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n + 3v9pZOdzAADOAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f0AhoaIAKurrBFAP0PCIB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Pz5ByqKioxZ9fH4AjY2PFzg3 + O84fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEg + JP0yMTW1RkVIP3Bwcg////8BCgkOAAEABAAAAAAABQMIAAAAAwD///8EaWhrFEtKTkwyMTWrIiEl9SAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/QD9C0KOj + pRyMjI4A6enpADQt3+smH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw1 + 4OOKh+0qfnrrAP///wAdFdwAbWjoXy8p3volHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/0tG47jKyPcNmpbvAK+t8wD///8CTUfjlCgh3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2lk53MAAM4A////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wCRkJIAxMPEDERDR7cgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv87Oj7UlZWXHXx7fQCPjpAXOTg7zh8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JSQo801MT3nKyssJMTA0AISEhgCJiYsAtLS1AMjI + yQCnp6gAh4eJAHl4egAAAAAAvr2/DkxMT18mJSnXIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv85ODvgj4+RK318fgC/v8AANC3f6yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/PDXg44qH7Sp+eusA////AAAAygBkX+dwLSbe/SYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/RkDix66r + 8hWPjO4Ar6zyAP///wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8uJ97/aWTncwAAzgD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AJ2dnwDp6OkISEdLrCEg + JP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zg3Ot2MjI4lfHt9AJWU + lhc7Oj3OHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8wLzPddXR3RAAAAABJSEwAjo6QAP///wD///8A////AP///wD+/v0Af36AADAvMwD///8BbWxvIjIx + NZohICT6IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zMy + NeyCgYM9aWhrAHFwcwA0Ld/rJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f88NeDjioftKn566wDf3voAAABZAFxX5YErJN7/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f9BO+HUm5jvHoeD7ACurPIA////Ak1H45QoId3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9pZOdzAADOAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8ArKytAP///wVMS0+fIiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/NTQ35YWEhi95eHoAmpqbFjw7P8sfHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/zk4PMGxsbIfamlsAAAAAACJiIoAmJiaAMvL + zADi4uIAvb2+AJGQkgB/foAAAAAAAJKSlAD///8CQ0JFYCMiJuwgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Li0x9XZ2eFBIR0oAAAAAADQt3+smH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw14OOKh+0qfnrrALu59AD///8CVE7kkSki + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw2 + 4OCNie0pfnrrAK6s8gD///8CTUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Life/2lk53MAAM4A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wC+vr8A////AlBP + UpIjIib/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8yMTXsfn2AOXJx + dACfnqATPTw/xSAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8hICT/QD9DpN3d3gySkZMAAAAAAIqJjACYmJkAy8vMAOLi4gC9vb4AkZCSAIGAgwAAAAAAnp6fAAAA + AABaWVwxJyYq1CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8qKS36bGxuYg4NEgD///8ANC3f6yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/PDXg44qH7Sp+eusApaLxAP///wZPSeOiKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/ODHg6YJ+6zdwa+kAsa/zAP///wJNR+OUKCHd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/aWTncwAAzgD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////ANTU1QAAAAAAVFNWhSQjJ/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y8uMvF2dnhEZ2ZpAKioqRA+PkG/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIhJf9IR0qT////A8bFxgD///8A////AP// + /wAAAAAAAAAAAAAAAAD///8A9vb2AP///wBPTlEAX15hAHp6fBYsKy+4IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/ycmKv5iYmRzAAAAAP///wA0Ld/rJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f88NeDjioftKn566wCYlO8Azcz3DEpF + 47QnIN3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f80Lt/xenXqRltW5QC3tfQA////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y4n3v9pZOdzAADOAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A9fX2AAAA + AABYV1p4JiUo/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/LCsv9W9u + cU9XVlkAubm6DEJBRLggHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IyIm/01MT4z///8BxcXGAP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////ALy8 + vQBxcXMAqamqCDEwNJogHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/JSQo/1pZXIIAAAAA4eHhADQt3+smH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/zw14OOKh+0qfnrrAI+M7QCxrvMURkHixCYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zEq3/dxbOlXODHgAL+99QD///8CTUfjlCgh + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2lk6HMAAM4A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8AAAAAAF5dYGsnJir9IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8qKS35aGdqW0A/QwDW1tcKR0ZKsiEgJP8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIib/Tk1Qi////wHJycoA////AP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AJKSlAD///8BNDM3fSEgJP0gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8kIyb/VFNWkv///wLGxscANC3f6yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/PDXg44qG7Sp+eusAiITsAJ+b + 8B1CPOHTJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Life/Glk52gAANUAxcP2AP///wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8uJ97/aWTocwAAzgD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wAcGx8AY2NmXykoLPogHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/ygn + K/xiYWRoFxYaAP///wdMS06oISAk/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yIhJf9HRkqL////AbW1tgD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP// + /wDf3+AAuLi5AAAAAAA0MzZlISAk+SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yIhJf9PTlGf////BbOytAA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f88NeDjiobtKn156wCAfOsAkY3uKD034d8lHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8sJd7/YlzmegAArADFw/YA////Ak1H + 45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZehzAADNAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD08PwBpaGtSKyot9h8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JiUp/15dYHYAAAAA////A05OUZoiISX/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/zo5PIz///8BjIuNAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AOnp6QD///8AAAACAC8uMlUhICT2IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/0pJTKr19fUIoaGjADQt + 3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zw14OOKhu0qfnnrAHJu + 6QCEgOw0OTLg6CUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yoj3v9aVeWL////Ab679QD///8CTUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Life/2pl6HQAAM0A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoJysAUlJVAG5tcEYtLC/xHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8lJCj/WVhbgwAAAAD///8BVFNWjCQjJ/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/MjE1k/v7+wN2dXcA////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////AAAAAAAaGR0ALSwwTCEgJPQgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8hICT/R0dKtNTU1QuZmJoANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/OzXg44qG7Sp+eusAXlnmAHh06kI0Lt/wJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KCHd/1NO5Jz///8EsrDzAP// + /wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/amXodAAA + zQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIOChQBiYWQAc3J1Oi8uMuwfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yQjJ/9TU1aP////AQAAAABdXF98JiUp/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8vLzKhoqKjCGxr + bgDv7/AA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAB0cIAAvLjJKISAk8yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/9GRkm9w8PEDpST + lQA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NeDjiobtKoB8 + 6wBAOuEAbWnoUTEq3/YlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8nIN3/TkjjreXk+wmmo/EA////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZeh0AADNAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAra2vAG5tcAB7en0wMjE15h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IiEl/09OUZz///8ECAYLAGdnaWkpKCz8Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/y0sMLZ/foERaWlrANLR0gD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAALu6vAAAAAAAHh0hADEwM0oiISXzIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/0RDR8G3t7gQjYyOADQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs14OOKhu0qgn7sAAkB2ABlYOdiLife+iYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f9JQ+K9vLr1EJuY + 7wD///8CTUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2pl + 6HQAAM0A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNzc4Ad3Z5AIWEhyc1NTjfHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT/SkpNqPz8/AdLSk0AdHN2Vi0s + MPcfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/KiktzGZm + aCBJSUwAAAAAAP///wD+/v4A////AAAAAAAAAAAAAAAAAAAAAAD///8AmZiaAAAAAAATEhYANDM2TiIh + JfQgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/QkFFw6+v + sBGIh4kANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OzXg44qG + 7SqFgewAAAC+AF9a5nUsJd7+Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/0Q+4symo/EYk5DuAP///wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/amXodAAAzQD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAOLi4gB9fX8AkI+RHzk4PNcfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yEgJP9HRkm00NDRC29vcQCCgoRBMzI17h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8mJSnhVVRXOBQTFwAAAAAA////AP7+/gD///8AAAAAAAAA + AAAAAAAAAAAAAP///wCampwA////AAAAAAA4NztZIiEl9yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/9BQETDrayuEYaFhwA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NeDjiobtKoeD7AD///8AWlXliCoj3v8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/QDnh2ZeU + 7yKMiO0A////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n + 3v9qZeh0AADNAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PT1AIKBhACcm50YPTw/zR8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/0NCRsC3t7gRhIOFAJOS + lC05OTzgHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMi + JvBEREdcAAAAAKCfoQAEAwgAcnF0ALGxsgDQz9AA0tLTANLS0wDJycoAl5eZAFJRVADb29sAAAAAADk4 + O24hICT6IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/0JB + RcOwr7ERiIeJADQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs1 + 4OOKhu0qiITsAP///wRVT+SaKSLd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NeDkjIjtL4N/7AD///8CTUfjlCgh3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2pl6HQAAM0A////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD6+voAhYWHAKmpqhI/P0LDIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/QD9Dy6emqBeMjI4AqamqGkJBRcwgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk+zg3OouxsLIMX19iAHh3egBiYWQAsbGyANDP + 0ADS0tMA0tLTAMnJygCTk5UAHx4iAIqJiwDj4+MGNjU4jSAfI/4gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/RENHwbe3uBCNjY8ANC3f7CYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OzXg44qG7SqHg+wA7u78CE9J46snIN3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zcw + 4O2AfOs8c27pAP///wJNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8uJ97/amXodAAAzQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wCMjI4Avr6/DEJB + RbcgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv88PD/VmpmbHpCP + kQDW1tcNTk1QsyEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Kyouv1xbXjcAAAAARkVIAHh3eQC3trgA39/fAOXl5QDl5OUA1dTVAJmYmgBUVFcAAAAAAHl4 + ex8uLTC0IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/9FREi7wsHCDpGRkwA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f87NeDjiobtKoSA7ADAvvUOSUPiuiYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/Myzf9HZx6ktcVuUA////Ak1H45QoId3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZeh0AADNAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AJeXmQDi4uIIRkVIqyEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zk4O92OjpAli4uNAP///wRdXF+VJSQo/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIibpQkFEdXd2eRiOjY8E////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAALu7vAGYmJoLUE9TUCcmKdkgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/0dGSbLV1NUKl5eZADQt3+wmH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs14OOKhu0qgX3rAKSh8RVDPeLIJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f8wKd/5bGjoXDYw4AD///8CTUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Life/2pl6HQAAM0A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD6+voApqanAP// + /wVKSUyfIiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/NTQ45ISE + hi5/foAAAAAAAHBvcnMrKi79Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yEgJPorKi7CQUBEYGtqbSP6+voEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk5OVB1dW + WT8zMjajIiEl8yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8hICT/S0tOqfz8/AelpaYANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/OzXg44qG7Sp/e+sAlJHuHz444dUlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ycg + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0m3v1lYOdtAADTAP///wJNR+OUKCHd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/amXodAAAzQD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wC5uLoA////Ak5NUZIjIib/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8yMTTrfX1/OG9ucQA1NDgAhoWHUDQzN/IfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMiJvEwLzOsPj1BZzo5 + PDg/PkIwUVBUMVZVWDFVVFgxTEtOMTg3OjAzMjU9OTk8iCgnK+AgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMiJv9RUFOc////BLe2uAA0Ld/sJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NeDjiobtKn146wCLh+0sOzXg4SUe + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KiTe/ych3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/KyTe/15Z5n8AAJwA////Ak1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y4n3v9qZeh0AADNAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////ANDQ + 0QAAAAAAU1JWhiQjJ/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y8u + MvF5eHpEX15hAIKBgwChoaIvQkFE3h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/SMiJuwoJyvKKCcrnC4uMZQ6Oj2VPj1AlT49QJU2NTmVKyotlCUk + KKIlJCjZISAk+iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/JCMn/1dWWYv///8B0M/QADQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/zs14OOKhu0qdXDpAIJ+6zo3MeDrJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f85M+D+LCbe/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8pIt7/WFLlkf///wL///8BTUfjlCgh + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2pl6HQAAM0A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A8PDxAAAAAABZWFt6JSUo/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/LSww9nJxdFBJSEsArq2vAMnJyhZQUFO8ISAk/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIh + JfYjIibdJiUp2SwrL9ktLDDZLSww2SopLNkkIyfZIiEl4CAfI/sfHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8nJir/YWBjeAAAAAD09PUANC3f7CYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OzXg44qG7SpnYucAeXTqSjQt + 3/MlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JiDd/0xG4/YzLN/8JR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ygh3f9STeSj////Bv///wFNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8uJ97/amXodAAAzQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8AAAAAAF5eYG0nJir9IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8qKS35a2ptXCsqLgDU1NQA////BWRjZpEnJir/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP+IB8j/iEgJP4hICT+IB8j/iAf + I/4gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/ysqLvpubXBjCggNAP///wA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f87NeDjiobtKlBL5ABvauhaMCrf+CUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8nIN3/WVTl4jcx4PUlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JyDd/01H47TW1PkL////AU1H + 45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZeh0AADNAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAVFBgAYmFkXygnK/ogHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/ygnK/xkY2ZoAAAAAP///wAAAAAAfn2AYjMy + NfcfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/Hx4i/x8eIv8fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/MjE184GAgkxTU1YAAAAAADQt + 3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs14OOKhu0qLyjeAGZh + 52suJ978Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yki3f5jXufIOzXg7CUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/SELiw7Ox8xL///8ATUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Life/2pl6HQAAM0A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAADs6PgBnZmlSKikt9h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/JyYp/15dYHUAAAAA////AHt6fQChoaM4Q0JG4CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv87Oj7ll5aYNX19fwCXl5kANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/OzXg44mG7SoAANUAXFfleysk3v8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/KiPe/Wlk6Ko+OOHhJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f9CPOHQnpvwGwAA + AABNR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/amXodAAA + zQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsKy8AU1JVAG5tcEctLC/yHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8lJCj/WFdagQAAAADm5uYAp6eoAMzM + zRddXF+2JCMn/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/0dGSc2ysbMdlpaYANDQ + 0QA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NeDjiYbtKgAA + qQBVUOSMKSLe/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8sJd77cGvpjkE74dUlHt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/z034dyQje4lAAA9AE1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZeh0AADNAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIGAgwBjY2UAdnV3PC8uMu0fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yQjJ/9SUlWN////AcbGxwDj4+MA////BHd2eH8wLzP5Hx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8jIib/V1ZZrebm5gyysbMA////ADQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs14OOJhu0q////AlBK5J0oId3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/y8o3vd3c+pzRT/ixyUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OTPg54aC + 7DMAAI8ATUfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2pl + 6HQAAM0A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAra2uAHBvcgB+foAyMzI15x8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl/05NUJr///8Ds7K0AP// + /wAAAAAAm5qcQkRDRuIgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/ykoLP5tbG+E////AtXV + 1QD///8ANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OzXg44mG + 7Sn6+v4HTEbjrycg3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/Mivf84F961xJQ+K5Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f81L9/vfHjqQQAAogBNR+OUKCHd/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/amXodAAAzQD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAADMzM0AeXh6AIeGiSk2NTngHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8hICT/SkpNp////wekpKUAenp8AJuanADIx8gZYWBjrikoLP8fHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/NzY68YaFh1UAAAAA////APr6+gA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NeDjiobtKcG/9Q9IQuLAJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f82L9/ti4jtR01H46knIN3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zIr + 3/Zzb+lRAACdAE1H45QoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n + 3v9qZeh0AADNAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAObm5gB+foAAkJCSITk4 + PNgfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP9HRkq009LTC5iY + mgD///8A6+vrAP///wOHh4luOTg87yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP9KSUzSrKutK4eG + iAADAgcA+fn5ADQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs1 + 4OOKhu0op6TxF0M94s8lHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zkz4OWXlO81UkzkmSgh + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mHt3/Lyje+2tm6GMAAHQATUfjlCgh3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2pl6HQAAM0A////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA8fHxAIGAgwCamZsZPDs/zh8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/0NCRr+3trgQjYyPAP///wD///8ADQwRAKuqrC5bW16+KCcq/x4d + If8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHSL/Kikt/2hnapvd3N0OsLCxALa2twDp6ekANC3f7CYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OzXg44qH7SiUke4iPjjh2yUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/Pjjh26aj8SVXUuWJKiPe/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8tJt7+Y17ndAAAAABMR+OUKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8uJ97/amXodAAAzQD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD7+/sAhoWHAKio + qRNAP0LEIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiP/Pz5CyaSk + pRaGhYgA/f39ANjY2ADX19gA////CX19f3k8Oz/oJCMn/x8eIv8fHiL/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/yIhJf8+PkHniYiKXf// + /wD///8A////AP///wA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f87NeDji4jtJ4WB7C05M+DlJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f9DPeLPu7j0GV1Y + 5ngrJd7/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yok3v9bVeWF////AkxH45QoId3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZeh0AADNAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/wCPj5EAv77ADkRDRrogHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv88Oz7Tl5eZHIKBgwD09PQA1tbXAOLi4wD///8AqqqsK2Zl + aK4yMTT8Hx4i/x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8eHSH/LSww/2VkZ7O0tLUiZmVoAP///wD///8A////ADQt3+wmH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs14OONiu0neXXqOzUu3+0lHt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/0hC4sLb2vkPZF/naC4n3vwmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/KSLd/1VP5Jb///8FTEfjlCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Life/2pl6HQAAM0A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AJua + nADg4OEJR0dKriEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zg3 + O9yOjY8kfX1/AN3d3QDBwcIAqqqrAMLBwgD///8Ih4aJXlBPU8M1NDjzJiUp/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl/zAvM/lLSk3QhYSGZv// + /wfW1tcA1NTVAP///wAAAAAANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/OzXg45CM7idxbOlLMivf9CUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8nIN3/TEbjs/// + /whsaOhXMCnf+CUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8nIN3/T0rjqP///wlMRuOUKCHd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/amXodAAAzQD///8AOTg7AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqamrAP///wVLSk2hIiEl/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/NTQ45IaFiC53d3kAw8LDAKKipACwsLEA////AISD + hgDW1tYWioqMdlhXWtkxMTT+IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8nJir/TUxP7oCAgpLNzM0edXR3AP///wDHxscA////AAAAAAA0Ld/sJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NeDilJDuJ2pl6F0vKN76Jh7d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9STOSj////A3Vw6UgzLN/zJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f9KROO46en8D0xG45MoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y4n3v9qZeh0AADNAP///wA5ODsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8A////Ak5NUJQjIib/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8yMTXrf3+BOG9ucQCfnqAAoqKkAAAAAACIh4kAxcXGAP///wDCwsMxhIOFskFARPwgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y4tMf9ubXDgsbGyYP// + /wPV1dYAt7e4AMHBwgD+/v4AAAAAADQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/zs14OKXlO8oZF/nby0m3v4mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KSLe/1hS + 5ZMAAGUAfnrrOjcw4OwlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/0ZA4sjFxPYXTEbjkygh + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2pl6HQAAM0A////AIOC + hQBRUFMARUVIAEZFSQBGRUkARkVJAEZFSQBGRUkARkVJAFVUVwAAAAAAU1JVhiQjJ/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y8uMvF4d3pDYWBjAGRjZgAAAAAA////ANHR + 0gDg4OAA////AKuqrDF8fH6zPz9C/SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/LSww/2dmaeKPjpBwtbS2GAAAAAD39/cA3d3eAPv7+wD///8ANC3f7CYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OzXg4pqX7ypdV+aBKyTe/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8rJN7/XVjmgQAAzACKhu0uOzXg4yUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/QTvh1a+s8iFMRuOSKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8uJ97/amXodAAAzQD///8AYmFkAB8eIgAPDhMAEA8TABAPEwAQDxMAEA8TABAP + EwAQDxMAGRgcAAAAAABbWl14JiUp/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/LCwv9XBvck5MS04AAAAAAAAAAAD///8Ara2uALy8vQDt7e4PeXl7hj8/QuonJir/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8jIib/MjE1+VJS + Vc2WlZdd////BuDg4QDS0tMA/Pz8AP///wA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f87NeDim5jwLVZQ5JIpIt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0m + 3v1jXudwFxDbAJaT7yI/OeHZJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f88NuDhnZnwLUxG + 45IoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZeh0AADNAL+/ + uwCvr7AJlZWXKpGQki+RkJIvkZCSL5GQki+RkJIvkZCSL5GQki+RkJIvnZyeLWRkZ4wmJSn+IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8qKS35aGdqWi8vMgD///8A////AP// + /wD///8AAAAAAJaWmDxTUlXKKCcr/x4dIf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8fHiL/NjY5+WNjZqqrqqwvAAAAAP///wD///8AwsLDADQt + 3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs14OKal+8xT0njoigh + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mHt3/Lyje+mtm6F9BOuEApKHxGEQ+4swlHt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zcx4OqOiu06TEbjkSgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Life/2pl6HQAAM0ApaSkAKKioxh8fH53dHN2hnR0doV0dHaFdHR2hXR0 + doV0dHaFdHR2hXR0doV3d3mDX19iuCYlKf4gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/ygnK/xiYWRmAQAFAP///wD///8A6+rrAMfGyAD///8EdXR3fDIxNfcgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8hICT/Pj1A7YiIinL///8Gzc3OAMDAwQDLy8wANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/OzXg4peU7zZJQ+KyJyDd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f8yK9/1c27pT1xX5gC6uPQQSUPivyYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NC3f8YF9 + 60lMR+ORKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/amXodAAA + zQCIiIkAi4uNJk5NUbw/PkLUQD9C00A/QtNAP0LTQD9C00A/QtNAP0LTQD9C00A/Q9I7Oj7lIyIm/iAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JyYp/l5dYHMAAAAA////APr6 + +gCvr7EAmJeZALW0thhTUlW2JSQo/x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x4dIf8qKS3/W1pdubS0tSeDg4UAIyImANvb + 2wA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NeDhlJHuPUM9 + 4sEmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zUv3+57d+o/cWzpAN/e+gpOSOOwJyDd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f8wKt/3d3PqWU1H45EoId3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZeh0AADNAH18fgCDg4UrODg75SQjJ/8lJCj/JSQo/yUk + KP8lJCj/JSQo/yUkKP8lJCj/JSQo/yMiJv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8lJCj/WllcgQAAAADl5eUA////AP///wBQT1IAjo2POTw7P+EfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8+PUHtiomLW////wHa2toA8fHxADQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs14OGRju5HQDrh0CUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/OTLg5oSA7DJ/e+sA////BVNN5J8oId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n + 3vxuaehqT0njkSgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2pl + 6HQAAM0AhYWGAI6NkCQ5ODzeIB8j/yEgJP8hICT/ISAk/yEgJP8hICT/ISAk/yEgJP8hICT/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yQjJ/9VVFeO////AcvL + zAD///8A/f39AAAAAABzcnVnLi0x9x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/yopLf1kZGef7u7uD8TE + xQDt7O0ANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OzTg4I6K + 7VQ8NuDdJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f89N+Hcj4vtJYqG7QD///8BWFPljyoj + 3v8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KyXe/2Zh53xQS+STKCHd/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/amXodAAAzQCOjY4Am5udHD08P9MfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IyIm/1BPUpv///8EtrW3AP///wDDwsQA////BWBfYpIlJCj/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j+yEg + JPohICT6ISAk+iEgJPohICT6IB8j/CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/0tLTtOpqKoxZWVnAP///wA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NODfiYXtYjgy4OclHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/0E74dCcmfAbkY3uAAAAigBfWuZ+KyTe/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8qI97/X1rmjlJN5JUoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n + 3v9qZeh0AADNAJSTkwCpqKoVQD9DyR8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8iISX/S0pNpv// + /welpKYA////AKinqQDV1dUPUE9StyEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJPghICTjIyIm3yUkKN8lJCjfJCMn3yIhJd8hICTlIB8j+iAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/NjU484iI + imIAAAAA////ADQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zs1 + 4N+BfetwNC7f7yUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/R0HixLCu8xOZle8AAADQAGVg + 52wtJ979Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ygh3f9ZU+WgVE/kmSgh3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2pl6HQAAM0Am5qaALm5ug9DQkW9IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP9HRkmy1NTVC5eXmQDm5uYAkpKUAKqqqx1DQ0bQHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eI/8iISXoKSgsuicm + KosqKS2CLi0xgzAvMoMtLDCDJyYqgiUkKI8nJirFIiEl9CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8pKCz/aWhrk////wbKyssANC3f7CYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/OzXg33l16n8wKt/0JR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/ycg3f9MRuO2z874DKKf8QAqI94AbGjoWzAp3/klHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JyDd/1JN5LFWUOSeKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8uJ97/amXodAAAzQCkpKIA09LTCkVESLAhICT/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/0ND + Rr66ubsQj46QAMbGxwB/f4EAkZGTLTk5POIfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/ISAk+SkoLLc6OTxoPT1AL0VESCRXVlklXFteJVFQUyU7Oj4kNDM3MzQz + NnkoJyvNISAk+iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEg + JP9RUFS/w8PEFqGhogA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f88NuHfcGzpji0m3vgmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KCHd/1FL5Kb///8HsK7zAFFL + 5AB0cOlLMyzf8yUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/TEfjwFdS5aQoId3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZeh0AADNALSzsQD///8GSUhLpCIh + JP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/QUBDyqmpqxaLiowAkI+RAGloawB/foA9MjE17R8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8qKS3kRENGZ0tK + TiBYWFsKa2ttBo6OkAaZmJoGg4KEBlhXWgZGRUkLSUhLKz08P3cnJirhIB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/z8+Qt+cnJ0zenl7ADQt3+wmH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/z034eFpZeifKyTe/CYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8pIt3/VlDklP///wPDwfYAaWTnAH156zw2L9/tJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f9HQeLOWVTlrSch3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Life/2pl6HQAAM0Ax8fDAP///wNNTFCYIyIl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv89PUDUnJyeHYaGiABCQUUAUVBTAHFxc0stLDD0Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/zg3OsGAgIIqAAAAACAfIwBHRkkAVlZZAFtbXgBRUFMAPTw/ABoZ + HQD///8AaGdqMTQzN7YhICT+IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/MjE19IGAg1UeHSEANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/Pznh42Rf57IpIt3+Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yok3v9bVeWDAAAAAN7d + +gB3c+oAh4PsLzoz4OQlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/0I84dtaVeW3JyDd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ97/amXodAAAzQDe3tgA////AVNS + VYwkIyf/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zk4PNyRkJIlgYCCAAAAAAAyMjUAZ2dpWCop + LfgfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8iISX8TEtPkdTU + 1Q09PEAAJSQoAEdGSQBXVlkAXFteAFFQVAA9PD8AHx4iAAAAAACurq8LUlFUeyUkKPYgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8pKCz+amlsegAAAAA0Ld/sJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f9AOuHnX1rmxSch3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/LCXe/V9a5nAAAMgA////AIF96wCSju4jPjjh2iUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/Pjjh5ltW5cQnIN3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y4n3v9qZeh0AADNAPj57wAAAAAAV1ZZfyUkKP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/NTU45IaGiC14eHoA////AAoJDgBjYmVkKCcr+yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yMiJvZUU1Zn////AP///wAAAAAARkVJAFNSVQBXV1oATU1QAD08 + QAAAAAAA0tLTAAAAAABycXRJKyou4CAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yQjJ/9aWVyd////CDQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/0I84exbVeXXJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8uJ975ZF/nXhcQ + 2wD///8Ah4PsAKCd8BlCPOHNJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f86M+DvXFbl0icg + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Life/2pl6HQAAM0A////AAAA + AABbWl1yJiUp/iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8yMTXqfX1/Nm5tcAD///8AAAAAAGFg + Y24nJir+IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm7klI + TEcAAAAA////AP///wD///8A////AAAAAAD///8A9PT0AAAAAADk5OQATEtPAJeWmCIyMTXBHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/01MT73LyssVNC3f7CYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHd3/RD7i8lZQ5OclHt3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zEq3/VsaOhORT7iAAAAtgCPi+0AtLLzEUdB4r8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/JR7d/zYw4PZbVuXiKCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8uJ97/amXodAAAzQD///8ABAMHAGFhZGUoJyv8IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/y8uMvB2dXdBYF9iAP///wAAAAAAXl1gdCcmKv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8iISXpOzo9OC0sMAAmJSkA////AP///wD///8AAAAAAP// + /wD09PQAAAAAAJmYmgCNjY8AxsbHDDQzNp8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/QkFE1KalpyY0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yQd3f9EPuL4T0nj8yUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/NC3f7nZy + 6kBfWuYAYFvmAJqW7wDV1PgKS0XjsCcg3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/Myzf+1hT + 5fAoId3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y4n3v9qZehzAADNAP// + /wAwLzIAaGdqWSopLfgfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/LCsv9G9ucUxNTE8A////AAAA + AABcW153JiUp/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIh + JegyMTU0KiktACQjJwD29vYAAAAAAAAAAAAAAAAAAAAAAAAAAACAgIMA////AJaVlwD///8BMzI2gSAf + I/4gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv84Nzvljo2POjQt + 3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/0I74fxGQOL6JR7d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f84MuDngn7rM3Jt6QClo/EAq6jyAP///wVQSuSgKCHd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f8vKd7+UUvk+igh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Life/mhk53IAAM4A////AEtKTQBubXBNLCsv9B8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8qKS34aWhrWS8uMgD///8AAAAAAFtaXXgmJSn/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IiEl6jg3OjoiISUAAAAAAPz8/AAAAAAAAAAAAAAA + AAAAAAAAAAAAAKGhowD///8Ar66wAAAAAAA0MzdqISAk+iAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zAvM/B7e31RNC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/OzXg/jw24P4lHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/z02 + 4d6Oi+0nf3vrAM/N9wDCwPUA////AlVQ5I8pIt7/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ywl + 3v9FP+L/KCHd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8tJ97+Z2LncgAA + zwD///8AXl1gAHR0dkEuLTHvHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/ygnK/xkY2ZmAAACAP// + /wAAAAAAXFtedSYlKf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8iISXvOjk9RBwbHwAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8AAAADADMy + NlghICT2IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Kyou925u + cGk0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f8yLN//MSvf/yUe + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/QTvh05yZ8B2Hg+wA6+r8AOHg+gAAAIgAW1blfysk + 3v8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KSLd/zYv3/8nIN3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0n3v5nYudxAADPAP///wBram0Ae3p8NjEwNOkfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/JyYq/l9eYXQAAAAA////AAAAAABdXF9xJyYq/iAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yIhJfQ6OT1VAAAAAP///wD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAA7OzsA////AP///wARDxQAMC8yTCEgJPMgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8nJir8ZGNmgTQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ysk3v8qI97/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f9HQeLHsK3zFJCN7gD///8A////AAAAzwBiXeZtLSbe/SYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8nIN3/LCXe/ycg3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/LSfe/mdi + 53EAANAA////AHRzdgCCgYMsNDM34h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8lJCj/WVlcgAAA + AAD9/f0AAAAAAFxbXmgnJir8IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/ISAk+jw7P2wAAAAA4uLiAP///wD///8AAAAAAAAAAAAAAAAAAAAAAP///wD///8AAAAAACEg + JAAsKy9GISAk8SAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yUk + KP5bW16XNC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/0xH47nLyfcOm5fvAP///wD///8AJBzdAGlk + 6FwvKN75Jh7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8tJ97+Z2LncQAAzwD///8Aenp8AIqJiyM3NjrbHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yQjJ/9UU1aN////Ad/f3wAeHSEAXVxfXygnK/ogHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT+PDs+iv///waenqAAIiElAMfH + yADx8fEA////AP///wD///8A9PT0AM7OzwAAAAAAEhEWAC8uMkohICTyIB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/1RTVqw0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8nId3/Ukzkqfv7/giqqPIA////AAAAvwBNR+MAcW3pTTIr3/QlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0n + 3v5nYudxAADPAP///wB/foEAlZSWHDs6PdIfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/09O + UZn///8Dw8LDADU0NwBkZGdXKiks+B8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/85ODuxurq7GIeHiQAAAAAAx8bHAPHx8QD///8A////AP///wD09PQAzc3OAP// + /wAAAAAAPDs+WSEgJPYgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8iISX/TU1QvTQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yki3f9XUuWZ////BL+99QD///8Ac2/pAGZh + 5wB7d+o+NS/f7iUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/LSfe/mdi53EAAM8A////AISDhgCioqQVPj1ByCAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8iISX/S0pNpf///watrK4ASUhLAGxrbk0sKy/1Hx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zEwNNR8fH45AAAAAGhn + agDR0dEA////AP///wD///8A////AP///wDW1dYAamlsAP///wQ/PkF4ISAk+iAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP9ISEvNNC3f7CYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/KiTe/11Y5oj///8A2dj5AP///wCwrvMAdXHpAIWB7DA5M+DlJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8tJ97+Z2LncQAAzwD///8AiYmLALOztA9BQES9IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEg + JP9IR0uy2NjZC52cngBdXF8Ac3N1QS4tMfAfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/JyYq71ZVWGr///8GR0ZKAMPCwwDn5+gA6urrAPDw8ADw7/AA7OzsAMjH + yABHRkoAt7e4FTs6PaQgHyP+IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/0RER9o0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8sJd7+Yl3mdQAAvQD///8A////ANXU + +ACAfOsAkY3uJT034dslHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0n3v5nYudxAADPAP///wCTk5UAz8/QCkVE + SLIhICT/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/0RDR767u7wQkI+RAGxrbgB8fH42MjE16R8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8iISX8ODc6qGBf + YjjMzM0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOno6QVcW15HLi0xzyAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/QD9D4zQt3+wmH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y4n3vtnYudjBwDYAP///wD///8A8fD9AIeE7ACfnPAbQjzh0CUe3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/LSfe/mdi53EAAM8A////AKKhowD///8HSUhMpiEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/QD9DyaenqRWHhogAeHh6AIeHiSo2NTngHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8nJirhRURHgl5dYCx9fH8XiYiKDYaGiAqfnqAMhYSHC42M + jhCBgIIYU1NWJj49QIokIyfxIB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv89PD/rNC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/MSrf9m9q6FI/OOEAAAAAAP// + /wD///8Aj4ztALKv8xJHQeLCJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8tJ97+Z2LncQAAzwD///8As7O0AP// + /wROTVCaIiEl/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv88Oz/SmZmbHIKChACAgIIAlZSWHjs6 + PdQfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEg + JPkrKi7NMDAzjURDRnNGRUhUUE9ST1pZXFBJSEtWR0ZJYkZFSHctLDCGKSgszSEgJP0gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zs6PfE0Ld/sJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yUe3f80Ld/wd3PqQ1xX5QA+OOEAAAAAAP///wCal+8A0c/4C0xG47QnIN3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y0n3v5nYudxAADPAP///wDHx8gA////AVJRVI0kIyb/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/zk4O9uPjpAjfn1/AIqJiwCqqqsUQUBExSAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJPomJSnaNDM2xTQzNqM7Oj6eQD9Dnzc2 + Oag1NDi1NTQ4yyUkKNYgHyP3IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/Ojk89jQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zcw4Od+eus0bWjoAJaT + 7wAAAAAA////AKup8gD///8GUUzkpCgh3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/LSfe/mdi53EAAM8A////AODg + 4AAAAAAAVVRXfyUkKP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/NTQ444aGiCx4d3oAm5qcANLS + 0wxJSEyzISAk/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yEgJPkkIyb0JCMm6CYlKeYnJirnJSQo7SQjJ/EkIyf2ISAk+CAfI/4gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv86OTz5NC3f7CYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8lHt3/OjTg3YeD7Cd3c+oAw8D2AAAAAAD///8Awb/1AP///wJWUeWTKSLd/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8tJ97+Z2LncQAAzwD///8A////AAAAAABZWFtzJCMn/x4dIf8eHSH/Hh0h/x4d + If8fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv8yMjXqgH+CN29vcQC1tLYA////BVNSVZ0jIib/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8fHiL/IB8j/yAf + I/8gHyP/Hx4i/x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zo5PPk0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f8+OOHSko7uHH56 + 6wDh4PoAAAAAAP///wDd3PoAAABDAFtW5YErJN7/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0n3v5nYudxAADPAP// + /wD///8AAQAFAF9fYmUoJyv8IB8j/yEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zAvM/B6eXxCY2JlAOTk + 5QD///8AXV1ghCYlKf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Ojk89zQt + 3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/0M94salovEUh4PsAPv7/gAAAAAA////AP///wAAAMsAYVzmcCwm + 3v0mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/LSfe/mdi53EAAM8A////AP///wA+PkEAcXBzUkZFSeo/PkHxOzo97Dg4 + O/QxMDT8KSgs/yAfI/8eHSH/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/LSww9XJxdE1PTlEA////AAAAAABram1nKikt+x8eIv8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv86OTzyNC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/SUPiuMG/ + 9Q2Tj+4A////AAAAAAD///8A////ABoS2wBpZOdfLyje+iYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8tJ97+Z2LncQAA + zwD///8AAAAAAGtqbQCHhok3Z2ZptGBfYrxYV1qzU1NWwUZFSdE5ODzmLCsv9SQjJ/4gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8rKi34ampsWTIx + NQD///8AS0pNAHx7fksxMDTxHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zw7 + Puw0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ycg3f9PSeOq8fD9CKSh8QD///8AAAAAAP///wAAAJsASELiAHBs + 6U4xK9/1JR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0n3v5nYudxAADPAP///wBDQkUAkJCSAKCgohSOjY9IiIiKS3t7 + fUR7en1PcXFzY2hnaotWVVjDOjo99SIhJf8fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/ygnK/xjY2ZlBQQJAP///wB4d3kAkpKUMDs6PeEfHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/QD9D5TQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/KSLd/1VP + 5Jr///8Eubb0AP///wAAAAAAAAAAAGVg5wBiXeYAeXXqPzUu3+4lHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/LSfe/mdi + 53EAAM8A////AP///wD///8A////Av///wv///8L////CP///w3Z2docpaSmPHp5fHNVVFe4NzY57SMi + Jv8fHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JyYq/l5e + YXIAAAAA////AJiYmgCysrMaRkZJyCAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/9GRUjZNC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8qI97/W1Xlif///wDT0fgA////AAAAAAAAAAAAqqfyAHNu + 6QCDfuwyODLg5iUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8tJ97+Z2LncQAAzwD///8A////AP///wD///8A////Af// + /wH///8B////Adzc3QO5uboHrKutGJSUllNhYWO7Ly4y+x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8lJCj/WlpdgAAAAADq6uoAsLCxAPDw8ApWVVimIyIm/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/ISAk/0xLTsk0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/ywl + 3v9jXud5AAC0APn5/gD///8AAAAAAAAAAADQzvgAfXnrAI2J7SY8NuDcJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0n + 3v5nYudxAADPAP///wDx8fEA8/PzAPX19QDx8fEA8O/wAOrp6gDe3t8At7e4AIODhQAAAAAA4uLjGYKC + hGVOTVHPJyYq/x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yQj + J/9WVViN////Ac/OzwDW1tYA////AWlpa34qKSz+Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8jIiX/VFNWtDQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mHt3/Lyje/Gtn6GoAANQA////AP///wAAAAAAAAAAAO/v + /QCEgOwAmpbvG0A64dAlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/LSfe/mdi53EAAM8A////AOXl5gDq6eoA6+vrAOrq + 6gDp6ekA4uHiAN7d3gC0tLUAWVhbAMrKywBvbnEA4eDhF318f4w2NTnyIB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IyIm/1FQU5r///8Durm7AP///wAcGx8Ag4OFVDQz + N/IfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yUkKP5dXF+ZNC3f7CYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe + 3f8xK9/4dG/pWTUu3wD///8A////AAAAAAAAAAAA////AIuH7QCsqfITRT/iwyYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8tJ97+Z2LncQAAzwD///8A5eXmAOrp6gDr6+sA6urqAOnp6QDi4eIA3t3eALW1tgBqaWwA////AKmo + qgD///8CoaGjPFdWWcAlJSj/Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8iISX/TEtOpv///waoqKkAAAAAAHx7fgCko6UuRkVI2h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHiL/KSgs+mloa3o0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JR7d/zQu3/J8d+pIWVTlAAAA0wAAAAAAAAAAAAAA + AAD///8AlpLuAMrI9wxKROO1JiDd/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0n3v5nYudxAADPAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A////AMPDxAD9/f0AeXl7AMvLzAD///8Kenp8fjMyNvIgHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yEgJP9HR0qx2NjZCpmZmwD19fUAuLi5ANzc + 3BNbWl2yJCMn/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8vLjLxeHd6WjQt3+wmH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8lHt3/NzHg6oJ+6zhtaegAi4jtAAAAAAAAAAAAAAAAAP///wCnpPEA////B09J46UoId3/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/LSfe/mdi53EAAM8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8Aw8PEAP39 + /QCCgYQA1NTVAAAAAACioaM1TUxPzyEgJP8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/0NCRry6ubsPjY2PAP7+/gDU1NUA////A3h4enwvLjL8Hx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/zo5POOPj5E6NC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f87NODgiYbtKnp16gDAvvUAAAAAAAAA + AAAAAAAA////ALy69QD///8DVU/klSki3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8tJ97+Z2LncQAAzwD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AAAAAACtrK4AwcHCAP///w5nZ2mYKikt/R8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Pz9Cx6ampxSGhYgA////AP// + /wAlJCgAmJeZR0FBROMgHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/SEdLyK+vsCA0Ld/sJh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/JR7d/z444dWUkO4fgXzrAN/e+gAAAAAAAAAAAAAAAAD7+/4A2Nf5AAAAAABbVuWEKiTe/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/y0n3v5nYudxAADPAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA////AJ6dnwDh4eEAAAAAAI2Nj1k5ODvuHx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv88Oz/RmZiaG4GBgwDu7u8Aa2ptAKWkpgDKyssaXFtetiUkKP8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yQjJ/9bWl2i9PT0DDQt3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Qz3iyKOg8RWHhOwA9vb+AAAA + AAAAAAAAAAAAAP///wD///8AAADFAGJd5nMsJt7+Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/LSfe/mdi53EAAM8A////AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAAB8eIgB/foEAsrKzKEpK + TcghICT/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/Hx4i/zk4PNqQkJIjf3+BAOHg + 4QDt7e0A19fYAP///wV6enx0NzY59R8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Li0x+XFwc3D///8BNC3f7CYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f9HQeK5u7n0Do+M7gD///8AAAAAAAAAAAAAAAAA////AP///wAOB9kAaWToYy8o + 3vsmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8tJ97+Z2LncQAAzwD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///8A9vb3AMrKywD///8JYGBjmCYlKf8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8fHiL/NjU544iIiix6eXwAycjJAMnIyQD///8AXVxfAKqpqzdOTVDQJCMn/x8e + Iv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8+PUHikI+RP0lJTAA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/JyDd/0tF46nl5PsInJjvAP// + /wAAAAAAAAAAAAAAAAD///8AAAAAAEI84QBybelTMSvf9iUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0n3v5nYudxAADPAP// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A8vLzAAAA + AAB8fH5mMTA09x8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8zMjXqf3+BNnBv + cgCmpqcA0tLTAF5dYACgoKEA1tbXEHRzdok0Mzf4Hh0h/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/JSQo/1paXba5uboZkZGTADQt + 3+wmH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8oId3/T0njmP///wOtqvIA////AAAAAAAAAAAAAAAAAAAAAABCPOIAX1nmAHp1 + 6kM0Lt/wJR7d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/LSfe/mdi53EAAM8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////APHx8QArKi4AdHR2AJybnTo+PUDiHx4i/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/Hx4i/y8vMu93dnlAYmFkAHJxdAC+vr8A////AP///wAAAAAAnJyeRU1M + T8woJyv/Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/x8eIv82NTjzeHd6eP///wXg4OEANC3f7CYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yoj3v9VT+SH////AMfF + 9gD///8AAAAAAAAAAAAAAAAAAAAAAKGd8ABwbOkAgX3rNDgx4OglHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8tJ97+Z2LncQAA + zwD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A8vLyAKmp + qwCdnZ4AwcHCGU1MUMAhICT/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/LSww9HBv + cktPT1IAAAAAAL6+vwD///8A////AIeGiADQ0NAQfHt9gjs6PvEgHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/JCMn/1NSVc+mpac2CQcMAPT0 + 9AA0Ld/sJh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/KyXe/1xX5XgAALsA7+/8AP///wAAAAAAAAAAAAAAAAAAAAAAy8r3AHx4 + 6wCLiO0nPDXg3iUe3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/y0n3v5nYudxAADPAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz8/MA////AMnJygD///8HXl1glyUkKP8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8qKS34amlsVzQzNgD///8AAAAAAP///wDp6ekA////AAAA + AACgoKE6XFterzQzN/ggHyP/Hh0h/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/Hx4i/yEgJP88Oz/xc3J1heTj5BCrq6wAmZmbADQt3+wlHt3/Jh/d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yUe3f8tJ978ZWDnaAAA + 1QD///8A////AAAAAAAAAAAAAAAAAAAAAADt7PwAhIDsAJiV7x1AOuHSJR7d/yYf3f8mH93/Jh/d/yYf + 3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8mH93/Jh/d/yYf3f8lHt3/LSbe/mdi + 53EAAM8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AADg4OEA/f39AAAAAABxcHNsKyou+h8eIv8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yko + K/tkZGdkBwYKAP///wAAAAAA////ALe3uACqqasAzMzNAP///weSkpRfTk1Q0iopLfohICT/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8hICT/LCsu+ltaXcOura87AAAAAP// + /wD///8AMyzf7CQd3f8lHt3/JR7d/yUe3f8lHt3/JR7d/yUe3f8lHt3/JR7d/yUe3f8lHt3/JR7d/yUe + 3f8lHt3/JR7d/yUe3f8lHt3/JB3d/y8o3vhtaehYNC3fAP///wD///8AAAAAAAAAAAAAAAAAAAAAAP39 + /wCJhe0AqKbxFEM94sUkHd3/JR3d/yUe3f8lHt3/JR7d/yUe3f8lHt3/JR7d/yUe3f8lHt3/JR7d/yUe + 3f8lHt3/JR7d/yUe3f8lHd3/JB3d/yQd3f8sJd7/ZmHncQAAzwD///8AAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHx8QD///8ASklNAIWFh0Y1NDftHx4i/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/JyYq/mBfYnIAAAAA////AAAAAAD///8A2dnaANHR + 0gDx8fEAAAAAALOztB14eHp1UE9S1i4tMf8fHiL/Hh0h/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8fHSL/Hh0h/ywrL/9SUVTWg4OFZ9nY2RCFhIYAAAAAAP///wA3MeDtKSLe/yoj3v8qI97/KiPe/yoj + 3v8qI97/KiPe/yoj3v8qI97/KiPe/yoj3v8qI97/KiPe/yoj3v8qI97/KiPe/yoj3v8pIt3/NjDg83dz + 6khYU+UABADYAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AJGO7gDCwPUMSkTjtioj3v8qI97/KiPe/yoj + 3v8qI97/KiPe/yoj3v8qI97/KiPe/yoj3v8qI97/KiPe/yoj3v8qI97/KiPe/yoj3v8qI97/KiPe/zEq + 3/9pZOdyAADRAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAA6enpALi3uQCLiowAoaGjJ0A/QtkfHiL/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8e + Iv8lJCj/WllcgQAAAADn5+cAAAAAAAAAAAD19fYAw8PEANLR0gD6+voAAAAAAMPDxCxycnSMRURH1DAv + M/QmJSn/ISAk/x8eIv8fHiL/Hx4i/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/x8eIv8fHiL/IB8j/yQjJ/8tLDD5QkJF2nV1d47R0dIkSklNAP// + /wD///8A////AEI84eY1L9/6NS/f+TUv3/k1L9/5NS/f+TUv3/k1L9/5NS/f+TUv3/k1L9/5NS/f+TUv + 3/k1L9/5NS/f+TUv3/k1L9/5NS/f+TUu3/pDPeLkhIDsOHFs6QCGguwAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8AoZ7wAO3t/AdXUeWiNzDg/DUv3/k2L9/5Ni/f+TYv3/k2L9/5Ni/f+TYv3/k2L9/5Ni/f+TYv + 3/k2L9/5Ni/f+TYv3/k2L9/5Ni/g+Tcw4Po2MOD7PTfh+XBs6W0AANUA////AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADp6ekA19fYAKGgogDGxscSTk1QvSMi + Jv8jIiX/IyIm/yMiJv8jIib/IyIm/yMiJv8jIib/IiEl/ycmKf9WVlmN////Ac7OzwAAAAAAAAAAAPX1 + 9gDDw8QA0dHSAPv7+wAyMTUA3d3dB6Khoyp8fH55WFdazDk4O/cmJSn/IB8j/x4dIf8fHiL/IB8j/yAf + I/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8gHyP/IB8j/yAfI/8fHiL/Hx4i/x8e + Iv8jIib/MTA0/E9PUtp5eHuIpqanLu/v8AV6enwA////AP///wD///8AVU/knElD46pJQ+OpSUPjqUlD + 46lJQ+OpSUPjqUlD46lJQ+OpSUPjqUlD46lJQ+OpSUPjqUlD46lJQ+OpSUPjqUlD46lJQ+OpSELiqlVP + 5JiQjO4gg3/sALGv8wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wCwrvMA////A2di52hLReOsSUPjqklE + 46pJROOqSUTjqklE46pJROOqSUTjqklE46pJROOqSUTjqklE46pJROOqSUTjqklD46pLReOrT0njr09J + 469VT+Suf3vrSxoT2wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wD///8Avb2+AP///wZlZWeNQkFE5EBAQ+JBQEPiQUBD4kFAQ+JBQEPiQUBD4kFA + Q+JAQEPiQ0JG5WppbIH///8BysnKAAAAAAAAAAAAAAAAAPLy8wDPz9AA5+foAP///wCZmZsA////BK+v + sDF1dHdyVVRXq0NCRdQ3NjnuLi0x/ScmKv8jIib/IB8j/x8eIv8fHiL/Hh0h/x4dIf8eHSH/Hh0h/x4d + If8eHSH/Hh0h/x8eIv8fHiL/ISAk/yQjJ/8qKS3/MjE19z49QeJPTlG7bGtugqWlpjv///8GpKSmAP// + /wD///8A+fn5AP///wCIhO0/f3vrRH9760R/e+tEf3vrRH9760R/e+tEf3vrRH9760R/e+tEf3vrRH97 + 60R/e+tEf3vrRH9760R/e+tEf3vrRH9760R/e+tFhoLsO6up8gqkofEA09L4AAAAAAAAAAAAAAAAAAAA + AAAAAAAA/v7/AMrJ9wD///8AlJDuJ4J+7EaBfetFgX3rRYF960WBfetFgX3rRYF960WBfetFgX3rRYF9 + 60WBfetFgX3rRYF960WBfetFgXzrRYWB7EeOiu1NjoruTZGO7kyppvIfeHPqAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADd3d0A////AYyM + jlRycXOjcHBypHBwcqNwcHKjcHByo3BwcqNwcHKjcHByo3BwcqNycXSli4uNYP///wHMy8wAAAAAAAAA + AAAAAAAAAAAAAPv7+wDp6ekA////AHt7fQCrqqwA////As7Ozhecm51KdnV3iVlYW71FRUjfNjU57y0s + MPcoKCv7JSQo/SMiJv4jIib+IiEl/yIhJf8iISX/IiEl/yMiJv8jIib+JCMn/SYlKf0qKS37MTAz9Tw8 + P+pPTlHQa2pto4+PkWG+vr8i////BKinqQCamZsA////APn5+QD///8AAAAAALKv8w+tqvIQraryEK2q + 8hCtqvIQraryEK2q8hCtqvIQraryEK2q8hCtqvIQraryEK2q8hCtqvIQraryEK2q8hCtqvIQraryEKyq + 8hC0sfQN19b5AtLQ+AD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD9/f8A////AAAAvgDAvvYJr63zEa6r + 8xGurPMRrqzzEa6s8xGurPMRrqzzEa6s8xGurPMRrqzzEa6s8xGurPMRrqzzEa6s8xGuq/MQs7DzEby5 + 9RS8uvUUvrz1FMrI9wi0sfQA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wAAAAAAp6aoHY+OkD2NjY8+jo2PPo6Njz6OjY8+jo2PPo6N + jz6OjY8+jY2PPo6OkD+goKEk////AdDQ0QAAAAAAAAAAAAAAAAAAAAAA+/v7AOnp6gD///8AaGhqAOvr + 6wB5eHsA////AdHR0hOTkpQweXl7U21sb3leXmCZV1ZZt1JRVdFKSU3fQUBE5T8+Qu5AP0P5QD9D+kA/ + Q/pAP0P6QUBD9z8+QutDQkbjTk1R3VVVWMpcW16uZWVnjHNydWaIiIo/tra3Hf///wRZWFsA4+PkAGtq + bQD///8A+fn5AP///wAAAAAAj4vuAIeD7ACHg+wAh4PsAIeD7ACHg+wAh4PsAIeD7ACHg+wAh4PsAIeD + 7ACHg+wAh4PsAIeD7ACHg+wAh4PsAIeD7ACHg+wAh4PsAI6K7QCwrvMAqqfyANnY+QAAAAAAAAAAAAAA + AAAAAAAAAAAAAP///wDQzvgA////AJqW7wCIhO0Ah4PtAIeD7QCHg+0Ah4PtAIeD7QCHg+0Ah4PtAIeD + 7QCHg+0Ah4PtAIeD7QCHg+0Ah4PtAIeD7QCJhe0Ai4jtAIuI7QCPi+4AqKXxAHRv6gD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4+PkA0tLTAP// + /wAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAD///8AAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wAaGR0A4eHiAAAAAADr6+sAl5aYAAAAAAD///8QyMjJN52d + n2CHhoiLeXh6tGloa8tYWFvVVFNW41VUV/VVVFf3VVRX91VUV/dWVVjyVVRX31xcX9Fwb3HIf3+BqZGR + k36wr7FO6OjoIv///wNkZGYA1NPUAP///wDf3t8AAAAAAP///wD///8AAAAAAAAAAAAAAIAAMAAD4AAD + 4AAAAAP/AACAADAAA+AAA8AAAAAA/wAAgAAwAAPgAAPAAAAAAP8AAIAAMAAD4AADgAAAAAB/AACAABAA + A+AAAwAAAAAAPwAAgAAQAAPgAAMAAAAAAD8AAIAAEAAD4AADAAAAAAAfAACAABAAA+AAAwAAAAAAHwAA + gAAQAAPgAAIAAAAAAB8AAAAAEAAD4AAAAAAAAAAPAAAAABAAA+AAAAAAAAAADwAAAAAQAAPgAAAAAAAA + AAcAAAAAEAAD4AAAAAAAAAAHAAAAABAAA+AAAAAAAAAABwAAAAAQAAPgAAAAAAAAAAcAAAAAAAAD4AAA + AAAAAAADAAAAAAAAA+AAAAAAAAAAAwAAAAAAAAPgAAAAAAAAAAMAAAAAAAAD4AAAAAAAAAABAAAAAAAA + A+AAAAAAAAAAAQAAAAAAAAPgAAAAAAAAAAEAAAAAAAAD4AAAAAAAAAABAAAAAAAAA+AAAAAAAAAAAQAA + AAAAAAPwAAAAAAAAAAEAAAAAAAAD8AAAAAAAAAABAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAPwAAAAAAAA + AAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAD8AAA + AAAAAAAAAAAAAAAAA/AAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAA + A/AAAAAAAAAAAAAAAAAAAAPwAAAAAAAAAAAAAAAAAAAD8AAAAAAAAAAAAAAAAAAAA/AAAAAABwAAAAAA + AAAAAAPwAAAAAA+AAAAAAAAAAAAD8AAAAAAPgAAAAAAAAAAAA/gAAAAAH8AAAAAAAAAAAAP4AAAAAB/A + AAAAAAAAAAAD+AAAAAAP4AAAAAAAAAAAA/gAAAAAD+AAAAAAAAAAAAP4AAAAAA/gAAAAAAAAAAAD+AAA + AAADwAAAAAAAAAAAA/gAAAAAA8AAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAA + A/gAAAAAAAAAAAAAAAAAAAP4AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAA/gAAAAAAAAAAAAA + AAAAAAP4AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAA + AAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAA + AAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAA + A/wAAAAAAAAAAAAAAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAA + AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAAASUVORK5CYII= + + + \ No newline at end of file diff --git a/M18BatteryInfo.csproj b/M18BatteryInfo.csproj new file mode 100644 index 0000000..6c9771e --- /dev/null +++ b/M18BatteryInfo.csproj @@ -0,0 +1,11 @@ + + + + WinExe + net10.0-windows + enable + true + enable + + + \ No newline at end of file diff --git a/M18BatteryInfo.csproj.user b/M18BatteryInfo.csproj.user new file mode 100644 index 0000000..03f6b68 --- /dev/null +++ b/M18BatteryInfo.csproj.user @@ -0,0 +1,8 @@ + + + + + Form + + + \ No newline at end of file diff --git a/M18BatteryInfo.slnx b/M18BatteryInfo.slnx new file mode 100644 index 0000000..a4665e5 --- /dev/null +++ b/M18BatteryInfo.slnx @@ -0,0 +1,3 @@ + + + diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..f12554f --- /dev/null +++ b/Program.cs @@ -0,0 +1,17 @@ +namespace M18BatteryInfo +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new frmMain()); + } + } +} \ No newline at end of file diff --git a/bin/Debug/net10.0-windows/M18BatteryInfo.deps.json b/bin/Debug/net10.0-windows/M18BatteryInfo.deps.json new file mode 100644 index 0000000..37de914 --- /dev/null +++ b/bin/Debug/net10.0-windows/M18BatteryInfo.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v10.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v10.0": { + "M18BatteryInfo/1.0.0": { + "runtime": { + "M18BatteryInfo.dll": {} + } + } + } + }, + "libraries": { + "M18BatteryInfo/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/bin/Debug/net10.0-windows/M18BatteryInfo.dll b/bin/Debug/net10.0-windows/M18BatteryInfo.dll new file mode 100644 index 0000000000000000000000000000000000000000..a8323127c170ca868fb293456092535bdcd6ac04 GIT binary patch literal 219136 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
{bS<#|lOs!5sTUIS`ft4Yzt+*L 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

tGrq?PTk{` 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 literal 0 HcmV?d00001 diff --git a/bin/Debug/net10.0-windows/M18BatteryInfo.pdb b/bin/Debug/net10.0-windows/M18BatteryInfo.pdb new file mode 100644 index 0000000000000000000000000000000000000000..091aa97a4e57e8df399956bbdcb9baf80de8fda9 GIT binary patch literal 15756 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 Ik$mj`0OtfA7XSbN literal 0 HcmV?d00001 diff --git a/bin/Debug/net10.0-windows/M18BatteryInfo.runtimeconfig.json b/bin/Debug/net10.0-windows/M18BatteryInfo.runtimeconfig.json new file mode 100644 index 0000000..24d6a16 --- /dev/null +++ b/bin/Debug/net10.0-windows/M18BatteryInfo.runtimeconfig.json @@ -0,0 +1,19 @@ +{ + "runtimeOptions": { + "tfm": "net10.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "10.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "10.0.0" + } + ], + "configProperties": { + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false + } + } +} \ No newline at end of file diff --git a/obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs b/obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs new file mode 100644 index 0000000..d3d9ce2 --- /dev/null +++ b/obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs new file mode 100644 index 0000000..7f6285a --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("M18BatteryInfo")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1818b2638f1ef88717123ce42b72196c27be34d2")] +[assembly: System.Reflection.AssemblyProductAttribute("M18BatteryInfo")] +[assembly: System.Reflection.AssemblyTitleAttribute("M18BatteryInfo")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache new file mode 100644 index 0000000..92c4027 --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +7575c4301571741b446174bb1ebd417e1038fb60b6d7ca0a2b3736ed4ef3a060 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net10.0-windows/M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..08b0b5d --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,24 @@ +is_global = true +build_property.ApplicationManifest = +build_property.StartupObject = +build_property.ApplicationDefaultFont = +build_property.ApplicationHighDpiMode = +build_property.ApplicationUseCompatibleTextRendering = +build_property.ApplicationVisualStyles = +build_property.TargetFramework = net10.0-windows +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v10.0 +build_property.TargetPlatformMinVersion = 7.0 +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = M18BatteryInfo +build_property.ProjectDir = E:\M18BatteryInfo\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 10.0 +build_property.EnableCodeStyleSeverity = diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.GlobalUsings.g.cs b/obj/Debug/net10.0-windows/M18BatteryInfo.GlobalUsings.g.cs new file mode 100644 index 0000000..a5265bd --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.GlobalUsings.g.cs @@ -0,0 +1,10 @@ +// +global using System; +global using System.Collections.Generic; +global using System.Drawing; +global using System.IO; +global using System.Linq; +global using System.Net.Http; +global using System.Threading; +global using System.Threading.Tasks; +global using System.Windows.Forms; diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.assets.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..34994a0c73e3ec16269f5c9bc42d91afc8683423 GIT binary patch literal 230 zcmWIWc6a1qU|>j#c%S4M`0t$4+e58p8TL97y=rV8TWkIa$IX#!o9i?25l{`WfC;Ej z(b*~{v^ce>IL0rrB(XRnF-9-1G(EK>rXVpnJ25@AI0j^zJ5W_XQGR++Vy=Q)W=?9c zf~t{4g@u`_k!6f;W^z$}aei8fLRe;TX=08-a7k%OW`0a?Mq*KFN{nBrdumAl)G$IW F0{}z?Ho*V@ literal 0 HcmV?d00001 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.BuildWithSkipAnalyzers b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.BuildWithSkipAnalyzers new file mode 100644 index 0000000..e69de29 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..8e679ce --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +87262b33ebba52d80e8829de1c41818fd4a7576b9789a60c4bcb8061d989d534 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..84053ea --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt @@ -0,0 +1,17 @@ +E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.exe +E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.deps.json +E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.runtimeconfig.json +E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.dll +E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.pdb +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.frmMain.resources +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.csproj.GenerateResource.cache +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.AssemblyInfoInputs.cache +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.AssemblyInfo.cs +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.csproj.CoreCompileInputs.cache +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.sourcelink.json +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.dll +E:\M18BatteryInfo\obj\Debug\net10.0-windows\refint\M18BatteryInfo.dll +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.pdb +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.genruntimeconfig.cache +E:\M18BatteryInfo\obj\Debug\net10.0-windows\ref\M18BatteryInfo.dll diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.GenerateResource.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.GenerateResource.cache new file mode 100644 index 0000000000000000000000000000000000000000..934a8c9fd80083310e7c5a544ec6df3f771e7d58 GIT binary patch literal 54 scmZQ$WMp7qVB~VkFUmF4D@rY{0P#@-n1Fl>jy=iKtnP7uRWmRE02@aNqW}N^ literal 0 HcmV?d00001 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.designer.deps.json b/obj/Debug/net10.0-windows/M18BatteryInfo.designer.deps.json new file mode 100644 index 0000000..889d7e8 --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.designer.deps.json @@ -0,0 +1,11 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v10.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v10.0": {} + }, + "libraries": {} +} \ No newline at end of file diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.designer.runtimeconfig.json b/obj/Debug/net10.0-windows/M18BatteryInfo.designer.runtimeconfig.json new file mode 100644 index 0000000..6beda30 --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.designer.runtimeconfig.json @@ -0,0 +1,25 @@ +{ + "runtimeOptions": { + "tfm": "net10.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "10.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "10.0.0" + } + ], + "additionalProbingPaths": [ + "C:\\Users\\Natasha\\.dotnet\\store\\|arch|\\|tfm|", + "C:\\Users\\Natasha\\.nuget\\packages", + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configProperties": { + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false, + "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false, + "Microsoft.NETCore.DotNetHostPolicy.SetAppPaths": true + } + } +} \ No newline at end of file diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.dll b/obj/Debug/net10.0-windows/M18BatteryInfo.dll new file mode 100644 index 0000000000000000000000000000000000000000..a8323127c170ca868fb293456092535bdcd6ac04 GIT binary patch literal 219136 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

{bS<#|lOs!5sTUIS`ft4Yzt+*L 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 Y=ihfeTo6CtfEoNd+yCeO@2r9U0j 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%0D@4OV;@v{V4J2pa?h#;k0uldW zl$b-QNCRxfxp3k4Ol)D$-lzj~V6I9t+20l|&q7i@1WY!lC?tkWXyu_B-X;*96)xS$ zfB;@})vU_4Ul7CXBcG#cp=SDGmG}DzV$A~mUtiOO+=~9}J4bAiK=`X7w%OmG{rRKO zsKq9#&qj90N&c4LYj`*tidtB6NB|&^bHPZZ?#H zHM>uKz7UW`utlbBE$%m#Qh35Z80AL^k){`psEtuV`FY&ws?304XVLUjLq*x>rd)Gep{Ze9XQ_l z17^XuMrAR|hHG=BQv}_y4eB0!I3qE~MXnX$N<5`Dqm=;};J|F)@Ql8VG#@Ro5@Szn&lyfUZ=?tQs0x3>a61#rfkKnra0i;A&JIQT>l=uR9-^MZ<6h9 zU{l;-;9nw$I?A-k!g51UX+v=P{YitCKvw?ycXBHX6t(Q*WyEycdch$f$7b_QzWv-? zgl3vYD;>uqv1ZEYi?77^#I%d2QfYA$eW)1$(AcPc)inHcFlgNT&#!$=Pc$U>*1k+y zBuIG&d9Nt|8wu=&k_-b5Pr>P0y^X9J#05m540h?Ch)IJm0{=o|TCX7Re#OMq*WXLV z4|`8PtOr~+UN-(i87o?3s|++KC2ViCpFmVyoX?(AAAY-g$#@*1;!OhoZ;heDi9dEmjHx zoNMBis={S-PLs%Sq(Fw_G6OjFzZ8UqzXlID(DoleGL$EpFwVOqH)#C%_x-$UDSrI6 z1Q_EU-o>^mz6pjJT-|L#=s`6rM?e5iJ0W*Z9}P@cJ9e(3Ah)+IfR^biepj1?NTI{J zuq80>wNCJ`u(Z$bdbZUHhMex-zI{6$;jw__l`gW>_c@k9B7YoA!6j9fl)zn9IzkpM zeO5^7!T3SzPFkbql|kd}!uPbaF5mmXr8-MLjUst*t3%r(M{TEW3;ZG)+FrJnIBrRR zR9f53X|u~9qd*Xy4zn0(4=@(QB*hX?J+$Y4uA)PReQ z_>29znWODtZ*qqrO|Xy11zT%Za^8D0Zl&d3thAwsJ{*5V6)zn>pw!jZ_L40`D5xHyNg(+nQ|0=486xd2ggLh>gq#3n7eUb07a?>1^R_1*7%0>x z9Mr2G>;TIkLX|Y01==|WK~viTe>5i~5`Te7?J%`#*y9aYg~%xs#SL^?{HXSFNdrPV zf7wz5(TP5ce*GJTl!THC8^}?j}>r1}mK?JFE&}5QG`b*$;MCXk{ zZyZAMr9j&gr=&vDx`u|cj^_kocP*FRkC$$Xw`rGK)eYx`HA&$*MFN06c#CrBZ%Qrv zELbovS7=rY{+lns8SOow;nRN`wZ)RAW#CyeDr#Y)o@{Vd@LLv~?Tj;$B0p*fT9wVO zG|PSI!^_GY&`EE>ABhS_28UxdT~rnni=B-qfxEJ{K)=|IzzaMrhj*3VR6a)du+5jY zKmLrpCr(2c_f4_39mr|l3}njEcsqmca5k^K=QOQ>ooe4=#GBAmnU}Rpi07TWHw67z z3K>xXjr_6(P?0%oxI+X;zuL%QDkj6o2)pTzDv1w+89BUh8lA!^K{sfI+M2i@H9Udm8rh50zl$+V7;;AO&hFYCe65EAs&J z3|2A5O+Qx|e*n+Eo?ecPeN7WU`O5)^l?k&pj3*vY=9E zi&hX*ulAc9QM0r2$D0qd4wTuW<~rc^t51&DpepAnSEm7eHeMU^1OFxGoPcB^Ej|?* z=O;QRjCq2QQ_Kwb%UA^JcINUg735FyW!cpz}pgzV3(lpzi3YHMptC^s9LCuV(B=6Q=RWfc66 zG{guHb$;&avyNr(AgSizW*zyNP>t!*q;G|bqFBmSGv ziar_`r6`PZbh1RBtg>;FE+)HDxGERB2R~`>rT6k-Nkt7m7*jt;Nlq5hD4u9&${swu zFYtW@?*dP+8yg$j0#g|_px6Bbq}zY%7q5;or6V;cE-TibK^VBcm$c~eZA6ZLMBTwe zB3=XG;iFzYIz74VER~eUN!aq=NHd3gOvZvG8Mro@z$o1Qf^zrG2{=eD zU8-?>;|xtZi2x9IPPeb^hu@Yt8XChVkPaVqXes>=36WXRe%BB!%|6QNUL15AWf7<0 z8<{uxsg+?0EU8)rx)lI!yIde4Rd?0-Fa3)X&}&`{1d9igbSJ2D6o&%|Ev*phQ$XT3H1bHx5t>4I} zR03w|enbkG6VQ*0VDVRk+Fb06@sS9o4yb9%um9vHceemX)~)Xe(wrX0VW4!cG8=ZS z=i5KOH%|pde`1aJoh9<{0(q565x?TWwt$Z*p>^Oa2=ydd3hYS)pc_?%h6%Ze#(ai} z{?T^w2xTL!QKKyc1FIY+6XuXeHC9*8_h~P6q-Hrf=#d7Mw#{7hC~PAafz1lv$A_@V zAITzLGP6GJ2ea~ouEJRvTMSRR`S=(rrcs)UdpB4nG8e1gkNv*@Db4AWqwwX!klVz8`hh$M z-|(f>sY%|fCVxT>xj<4)VV7HW;Ssh1L^tT(Jm`(l1FOPQ)6mM3e$S7aF^J2UrzxwZ zjI36GzS;~~mKqosAj%u&BY>+o9XQiY>a)t}fw5=3bZ0v5ZPb!)i)QWY93Y2j2aa4W zMuLTsMlw?}CmVElX^7)0kdgtcj>P)<8nKWu&)Dr8!JE6s1&r?FBv&esvyYF+ z;qz@vcK01}Xw5IW#T6%;C}IKbQODrQB+TgGpR@VhwNJjQu|gVSt_`KYE1>E$1hxZ= zmA6#eSA6_rkDz^dCc6qGIzxtJX(}8skZHJbjXpC1upUl(GCH& zSXajtoUgK-`0pMu;j8%u+?dSu`V0qRn}}!CKWG0GfGKPA#Q=sy!Ms|5q|1hVQ zK@mNN(SUP_;QsYMbXx>DnkZj0LF)n@Cs6rzx=0rq#N}`Jp7w+!AtzSeci*vWE**I-7G` zg>mH@_-dtf(W_p!<3SfzwC^@?l*!X7%3z}yjqWgik0ni7$Pii2>>?E5UNS{kV}BoB zSaaxsB|@k`fZWBmEGL)!Pq=xW_krKv=W||%L%{gw1DGJ|<5__`{5|Ad{NhF^)*e3_ zH{xM2ZYDQYYO8S?RgOZVcW@5>f&W;cM`Wwx_U^(P+cfC_cmvIPI58+NL7vmR5agLH zg4*m_WCuJP5##J5MpqkbJ0z3mJTU~Dc=0J70#}W~4Y@5KK{h#{WdQ5-7+HO}x!>sk z2;Ify9voRQzeR?0wR_!OuiWt?Nin-<_PZSrgtKZ#P+*6bU~qO|_kWcz?AR%K}!ys@UsJcPI3E zX>R^=>oyMF-R%MpPt5Tv1%#A62F?J@=-F-qQ+k0bP`rFb85P(i)F;Fx$Vd`=!UGL_BOf3)g=X4=Xvc-H*6H@Hx@0UXT)Tm8#e_p=Amwgz3!bn2h09!I~Y+o&R6 zx1Znl_1fJw3_N+9*L{ax(Jh_KpLLFA#QiUrRQC%z=a$fMR9_e4?x}s4XuQV#{Y5&xfB+h^4)rIjS_ zfyhQ3nsX;#^K&6oeGsVaS!%`rQ83R3`Y;-%=Umaqq!NjBtSAKQdfGE>GilES3`p%nZ+z@#S%85AVAO}hw87`&uk z9Q>vOCS$w)CBD6CkwKzPZy#z&e*oS#vz$|5WY1M5rZ`(Svi}G!|=P>1piSP(0e3P$NX+WX)2Ng z1qgh&1uEdv&wNB!T#fs8XB00xaB( z4ksS9jBH;)@=Hm}0ew?bW8=)5gMPMQ|B8SjEN!?Q+W4V&}Kmwt^AG4^>+uNL+>|v>m1_lN@|CBM@%M zo)yCxl%`YsRi6fEAJl9FWHW2k2x1<#pwJA5J2aptX7zsZ-O2?jNCG z1cB!B{67EvIUAm>D+ zfys=%m+9rxIT*Ko8hlEBBz3#Na6UOUhSkMy)Rzb4PyA~A*5~*N(?UHK1Ns*%gAm{P zVpm_wiQ{VW*`(#Z+X9uOi1j^c_Q;nbgn65 z?=C-bI7rh=&&C!ZUF*UCy*cS};moGScn&H6Sax!i;&jdMdVqhoGB@tqYS#vdBwzFd z0V*)zuLar+Q|x@OABab}>X?}Q8kcFXDwq-CDUB~sglN*0AccWe+7)X#Qn%sITm)j zdb=3e|Efb^8*eZv8Em@{u5_RdSI7fiFo7o$G2j?RN_KN(8uFImwmqE#Tx$X_`6D^JLSz6599#X!)pS=3LU(I$xR6EVPW zfb`Fk?tC6mbcDGrv2*f6)`JP^5>mk(tKK=ZV$8ewRSZV?dtSdOEGbv#-Jhn})`004i4A%0S^eIb&()>*wH_c~^urEk-FAH=)ZQi+kU_w< zei_nF-y%#J5-NvS0tcsl7m2(_=S+;aHTTm~#-Hn~>IA%|iKu@+U&pN$0%W2%(Ai&m z84M0M(9N^iQm)d+CAlDvfv3G-Ob10Vs74b*NnHCR-N|MAh zYo|&0z4*IE@AT@`6x1_bjtFRU)5~9KdHlJ%^ZI8ji>#9W!H&ExbA0pp&L?-g)H_fg zx!@kA=r*wqmdLtIo(Ur8@1=AS%lEvie+*rRbF>S$?>Br}!1SRvt)sTISF6nGxIdd|DpM7y)^Z{xlRmIn~wjPf7?jsHygb$IY*NIHrXpib$ z_&`@-?8h0VD`42qI0+Fox&es3iV)^^aBf%cQsz_vdp=5#khDm9RwQoMC=t4h?>)vI11pK)=oQg_ zdAE7D?|e$@nkB_wd0o4jALF`bS6Slb0!%A^+)QiXp^w3Dr&qv2qCh8(`^98x?$8J$ z8K+~+y7v8+A9_-qFG&?%+a{3x=BHSxmdt&F{4q(<5z5|}Lv{p!Oo=F@Yr4T@)whyVqvj(e^VRHFrTTj34arA6YtMF1Icm0<%a z)DrfA^mDD}bj1r7YGI5*Hq+x)Lt+iT;csU=|xZ>4>!tNM? zy@5-LW>(wB2(Qtz0{lcOkZF^KvX;pnndF;HcXvAKsHYwneP|@@todqGUIe}B9j13W zk$O1Esr2lb`@s)9^*Akrw+VqPn%Fu-IPpt93h@n?QG6G-Q0L?b*5X0@_hsV!?&xcx z^OnAtg2Vc&h!>FhOcWof_ME!5>V4G`s|SbAdtl+Lfdhi~66(5hV}KZC?5zLraCYY9=UlxemFCjEaG*d9&uPFrU@0$-#@UTB@{N3yy~!`_%vB$;`sN1!#l%zwdc$Fr!)LC7rTYdLLNqT9)L-N~14 z|Gr0jM^nYgRBnMxwvzarXMFY8A^uARdiTK^ezZ`rdLxo+XpsMdnC3ePO%ICA&3N=1uWy|E!NyF(K2j{2E9L3m3etNqpJ9Z zvSjtkW%*N~!U@XT8^Fi| zL&~>|xP*(Rz1~@CoR3pE1d%l_KQwXb;uCt_%TM3;j6=^@hl6P|e}oCKvmu^u4z{o9 zPWwe}OuT0;V(&v3JKTc;LqJ^tS-&A(;W>u;LdSzORVubKL)WROP;l@1sQCW6;V0)x z#f#|9`y=5u_7_0yaKasY+7JRp2Y(hmhM>!wPsqFnY*1^T24vfmd`xMl%pF&E*z6O@+66_>8R2|#B`ET0cQVxPExJPg+envK7Kj5Enc-_ z++N~2JmU6Rz=UBkeN5l`0cKsAONbC>gx2AF*c5Lwte<4EMgT=w4(mfSa-0*AN^A?F zv7HJf$d#_QNp~r;sKf;{bp}4Sm|cCIoK9x>qmncu6pjl{4j^pB#>COhq&gNt~&+oQk+xo?mn3`Q6bG{7NiZBd^v=lvV%o2#Q} zo}@Why)P=hBLc~CtaiI+r&Gx?hwpfHHGaiq)p(Ix=od=(Xnd$@1e~8J1{T*3N~~GKv&dIY@(9BA0bz zILPw?lAZIE7_5)nB0;#Y*;J$-qs4v1=^aT$#a4SN=XE`hrOxp<-9y3x(|y=CFN_y4iSVs<;fzr*>{ z%zLu4_z~E)e(CFL10>pUWPAL1lUOS%CnWaEv%H>n<^fP%%N{VSiN?PJ4ezDFIqu7M zi?V0WN%JPY|Ma9bFX*`(q z5`2gahZs^*1H%Kju7IWoIflTH0q!4+{H<5s$KK4#iYyUiXe=sLfJ)^OJY7jTwxx>5 zA0xP({du73ZR_Xvny&XtUk9#oOYX~t?$sCD1r(uUEliE;ScBegEy;k0VbHr}Zpfef z4C_PEQ22S1A1T=jRjPwmSlG}&O$w_bWYUTWuUj*6A`m0Ng+Qo;Gax>JQs)tr5fel3 zb$Tl^xINfaLynN}qtpd^6fOY)!F~{f7QIXa@QwKT`S~>i)R$T56tQTmZ#g1_XX9%<&-ta}vxnC7Lg|aC;vxyHS&sPwRU&igafL@dAJyWvIT{F!P zU}VnKnzBNd0EeG&xdQpOqI4nQI$$Q{$+K||&a z#X9yyYfs8=`G=!{D^f&s9jMlPvInql;Y-t@c79GRSZW^P0_tQUy$d{uW^|DvmZ_ z`SL{pNJV(vYo%tIaiKcEy*UC3nS%H4-~08}8`|0w`hkoG7SNkQONiHd2Hx93-O<9t zPy`w*wo8bxv7%)Q(>bfidwb*g4Y1t3nb)*u#_t0B=0mCu<_5}(^}W`3fAoGmYx@tsDc zDw{3qLmzY4zK6CoubSFdh9xFl8Ww$qa#{~bZlkV0 z%3M!$0^;g3YHBLe@?$Sj%t&;ZMk&HB;}jj^x+#U~EFp~->8fzs=|lOYWoAZ;K47+2 z`0e=pcLQ~+cAw;V*`E}Q$4o4q^Hh&DG9>CNA1vO1iKkFL$%#U#NoKs|hzL2LN^k+r zlbA{lYr0sXCnPyVCA4h)R1f1%vE-`Al?vil8bM|Wa8roIDLp*E#{!C*VKF+SQZ@_d zpQt1;?qeuE|KYPYYl=3Lmb$u1z8)y9lJrjJXPZir^ZlN=4iY9s9d0V>(uWVpq3HBR zQxYlkrB%T}7sEX%-|R;eR-!#0;^_r@Hz7uA=c5SUrUzpUD@m&O9I2mTV7Tin&d3HA zcf-a+6+K%2KE(m=tTZdQPtp`xs8v?syy%DZmYiLOd%e;m3WX}@J@*S^6CQEslow1; z>Zr2Af#hvmbUje30Z9)q)QULCLYbNq-;@;t4c0fBD>&1l58)nSO_$w#P21Pt9Sc1? zSOVJC6Su$LGhJ{7t0fTUTR(;(f=^zmur6o+kOfqKaI<)rc#{~w%UNoEjvwnhY5&S1 zHY{ozxQgqhVg*F786mfd;;cE9q`z17SvB7)g}-S6T;sPXNy09No*5?iudh?h>WUMJ zLaK^u{CLBMtyQ|5BeW3(V3TiOtvQX$|A^TM%BB zBdXu@?axUaMAutj?Amtx`BZd0%ab>e6+QANx>QFyGxS(v0v5Vko)r#kqs1IBYh?qE z#0#y(EiRR$=RGqiQ_YHs`W^ia8Gn0f|NG%zqWd34eo22x47N@#ZBEVJUDZ~pkPrYbmczTT8HY@QlmMbEV0gq|iv94L0H@yYo zmy#l4?rd4S-ko%r!a>vhIfD^;4l|l0;$mBt487(?{7djYW z=T3LBK3H=i9#G9(7s+(kJV14L&!k&v8FGs;0M>7q+bb#Gg+Ut@BkR-$KSf+9ze%k}byA&uNBGaHf!| z>?g>r-)qL$96xBj5Wqnj7RwFZ;s}>Rq(rMZB(1@*De;&<$dM|wZUOyVElE5oX=f(P zl5m>T?s2D(24^}~-G_f4SRsEv)5Y!DuQ7`)ppa!4HuZfQU`7>ftX}~RhxK|RpAyQX z0xZf34FB@~JMMk(KH9n>hhVg{Eng{WKYA-b%W0p`hD%-&XFJItusoKkd@2g`j>G}6jEhyRi7b>y zexQa05~bc4Tl6}##AWJppO0rfV7(e5#>O5wO#0COp|%3$1Mt)lovcz&5V+%2C)+=X z7rc!JhpQPv1^AJ~nJ6Fd+`I|+Wg|0=vF|@UpMCon+ju67)Q1p?U-@h_^s~%&=Po?7 z-+SKY_L`a>#y<@7@bCKj`)gNKS?^{W)wTmvEGiy}9Jp2SxCj^n24qz+Vb?jV^&lHu z;UBodee0#kt)gET+tamb9C2n`Zp21Vb~q0@a+fR=1?G9^(4$9!e}t#qk?}6iMu5E> zVau;U@$g}4k8+*AYha*B+p){*cP>cA@|UL37Y0u-5dreigY_+C_RNU{Fbv-u-rAl0 z5cDOp-OuGsj5~Kcs1#Ky4+pGab&eoQ^9n5ftYhN@RFliJXV*}g7d_Sg+^m6CRs|-U zd06?rdkZ;je(#-HgK_g46n{7)?d#`-K$-t=HcY8w%jo+8OnaC;rt33fPyapVR zc&!*SsY3a}8=W_BZdrEN-3}*Mc8JR`_JUarAI364Wu2)xsfd^pKlqW`eB0 zMf(DKM>7-nKL<)h!)a%~bshdiqV1QmsEG(h;abAbp_C+fj@4B-mIXlzN_5y3lV3yx zy9b8f{nnhF(g;;eW%2N>XS`MQ#>e=$+=W`-*DD>@yL-#SExYJ$O*Ew7?uSz2&yavd zg;o57lIChb8PMI+v9D^hebuHXjV-9RclkIz(^Tm(VMn#&ZNbOQmK8Do z9T5>RgP(x+&qbH>VK10*eSSIbIU+1m>xv8Y(NSc$^v-!2_o=aW3Pl0=2VP<<$t8Lj z(`O)IES>2epqk^?xDybD=cjl4g;Tdp^C|z6)Jo$@wH>H20}LIAd!Y00-(Slc8yoJ> zzsDNoQzU?cLoMZZH+<|GWM#1_O7)m_@|d2)s`jHt6VCxM1|5|r@p`=S_lg_}fmaw= ze|#sR>HyOk^n{@o^lSrlDO~sTc+=DAF5kluv|uV;f%@;?hkvs>67?hKqtuSPHOJYQ zn4yA%Rq_I0p;6SFv{W}R#L%hEZ<}tjn@P7A8g&##gLG7%=)0R)F@7M`2NSdH-)#ho zhi!`iW0#e!m$u-3s12-+2Nr0<{u91Z!XX3h6{TLK>#?zFihz?{mpdoI7kUYw{E1DI zV^35x6#e=_gx`3Bo29{n8A`N?lYP|0*8!GfaIsfH5Oha==so|2{z=~oZwyV=m~RXn z3I(=Q+V3!MorAz86Jj$1yhZ_oq7Nk{n`=M*{uuLUqDvXLN2&JIq;%fjlq@vhR1Lu$ z)3{!Du!UnGue{sL1F^VD6Y2=;wg()N$+^I>ZN$&O0%2=dP1=bgo1C03!P|b2`w|U` z(=ClzRc&e-_Cgb(G|=}<)YR1A*`29gDV#F$5qDvS>r)_Jb~ZOI#|k9q@cZsUpgXc& zm+4X&BqOVjO;?_V_Bs=rf(odqD~T?X2X5JbI{s+s`@6Fx9O+P?=rlX7MZE>d z(s*c|;xBO4zyeaAGmxDC8pkHZ7*L>%%}l!GklVp86?S-r&N-><6y7V9u@`>4X}pz{ zUsDFosu^x90q9~1EErSn^inLvOLs3bDLUA}1|}Vks{srDqT}56mKc0vrp}Z4QNVvl z@Hv?v=vu_Yssd^0LwpSdiS6gw(N{VT>w)=XuJ{4vXLc*VB28MOK*Lr0|4r)7RZI)K zu+&r<=iYz4y}cupt#1RFNcOkKN^d5>S1tJW(Y>cdB@4)!RFd_y`nW8EKsQk`rKw_s z4r%TLmX$Cu&AaK@b?o=Au9^y@!(tDD&Md<%`{26WLjC3UL~H0<>{av{H-ebu>x@9Q z530VxCA1FC>pEuHk;s++@ZHqxT z^M2E&XXT4$d^2@U)553K;Hr28^o*zx-|VR@iC!9PchI3V{<_}f`HZ6*o`RM0?yo-| z7d@^-EmnsPJ#d49Ks-!{GgYm2;>AR5yh{iFMIIK+nw<*2AAIs*O?7oirtl3-bz3gp z6^aoPWOF+%qK5SIB8f$VMVX5N>A)3~HRpan*3UqGkrSe$`uLduDY-mmeWM_n+pwHs z?M0RA2*H}1I!w1FTg5R8-zSb26s#pk8#`~8gcr+OumuEkKW$! z%oU3#&{}i!tR{xjJd<4(P!D5sz3E@ezP7itGRKtXu>H^Ao^ZJoxCoQ;A0+5z8t&Yt zt`&dabT2{dY)&qA?OT1VUC$cLmmlOpW!WPYUv-K5oC(D+37g+_b2_E!T zN9mccpq1u?eEITcs@yp5KV79< z%%#(GS0&(3`<6VWc7^N7nxZiwt1q-00Opr3(7ma^P*ZW@b z8`Nl-K>C@h;>&=R{ebS~-@kuLKtO1&rxahXC5@ZQ5oNl7h_u;at?vkMwI}yNU)zt2 zTjtvD5~dxt-qg?%2)U z&9(NmKN;VeIcDvL5oAO4V%v~P6;Z+0XbRjgSv?)Rh@W^V1e~dEdP(@tIL{N90~t#w z6EKeYZ<6Fg1tMK$YpPj{jZCL13R8X7w>K|Wy9Uejl}_T}nRTQ$dPBpzQ%9&%vysb= z+e?OyTdeCwBR2p_J)3vzwS>_C+5?O_bo4mFolKB4pZ2@Gv!HbRV)JG0_HR^$ zgp{C&_@20?-t_TH-B9YV3RIt1lah3vOud8M+APww&89pe4f+!g}{A1ppmpaQPl06%Xa6@y`81OQE z4Gy2dt9~Ys(;rb{VEO;|GVcl#jDkMB5B!5LXlk{XJ^Akw>R$G z+~G=9J%oOP1&CCBDa)y1GvHy%XG|z+c;cP0zV+90D2E*p%3X^G8ToB{7`IyeX)vPa z4dqXHPWPIW8X6(|;)(gjJ3YxUX9PpmfQExU8xVn)MK!(Z9IVr0a`^$<*SqbF|HKj4 zl}dWKkBWii@%vL}D`5G(mt+_Xu*E~p2LLwm0!(*!oB?>Z& zZ7OlY4jGwWWnnA)1Y{&n;1YiZZ2#{2MW0;7FT)lCI<|)XgR_F#k#e?h&E#6z% zSEbFea9kJ6$HJ6d}7m+KQm z64Q6a=SckP(_(mD>*+bEQ}U+Dfb+qzB;Vic+i?age-P=IQS`y8K%0j$dW1@?J8!4; zU(ZvGiO+n&s{?1-i^14Kb`*f98PpI2eh2&MjW zU(9Pfu~La0?glVyV6OhYiRHtS@Zbh6=r^Rj?dVOd&}L>H_hN(mCCjSEY99d5# zMFdwU_>q{ipl9kM#E+J`$ZoTW`ci~z%HL2xf+9ae>i;k@(@FS%Y(C%!^Ql3z{T^Tf zMQr0jr%%Vre7EO5u$}I7U0q4KF4PfR=DuNW@tYo6FM2XW_j8>f(qzQA-bG?UXeWJ_ zeU!Ge$l+4q`l z>g(-azkWH6sW!Y|=H*U{ex?RrUH}$PiudwN=eD(2M?L?gpx;%SMXRc-UQH$o=_Bi> zfV)Bgby`(_G4)G-)z!>gD)43lYqRg(_&0STIc>7_`3m));@SbyWXj1LyC$B*3Wi&a|w!sg?$#(KO6`@XD{Wzq|OfU2^ zZHv}W<_-S0rT64WtJv{9H?iU91O*Loyyc&4Gxc+_m)D36e{*CKdit2F8F&$2&$tBAV*pc>3!iy-)#fX zp3|a^>1KPTq?CJjaE{<7Bpv&2%B}7dW?S`958Q!<8>s|3+HtY5bR*RGm#u-pi=Z1V zfUHN|{yPro-JYXsKbZ_cnFM?|ZTl<~`k+i=fpA&Udfea(i6ngP}RAoR@ zq@q0$wC`nJGy!A zT?pFzqWjIBH-e2#*5rjvmiPGaejx2T6vcfd1a~bO)Jn2dNI-p^u=d}jPTN0X2&{(? zNM(8o3kR`(-=;bxW2d*s5d1oj!N^A~#m3`$<1q>3^nZGiR}*KD2;XY1Tmh&1oi{_PVV}AF-*8 zuVMw1ITAgyXAb99U=sFEP~^ z#z)+2@kmHxfUxV;W<;XO&G^HQwPheSfQ3|8YDA*d8zo|g6q`thz+sorw0fvXE~Sw~ z;B&*}_fMwdqawf?kjf*3hJ^A?w?IMR?%{C&YK<#phr*-q6>+u{9StbzGtg)*mtb7t zjFS-e$YxuAt+=OwVp-Jg{Z+f$tHzoVwLeGlz%iNQ)4N>;yah2c1ARBXi!$6_mpTGl zvBe}^Q>>?26Z~Is``8KpC{sMAb5P}Y6b|!0rsuGAR-Ogxdcg6}lhY@5%y;05nYMr@ z?T0(BSK2=Y5d!882v&b{7AX_E;L%GD9I0wokt9+=RAAy_R{CkkPL0)Fhf%i2eXy3> znpz5<&}|Qf>CfBl>SNyXURj+3C>T)jE4)-{aQot-Vv>cb>j?V=H&l5q#JzXE>-)TN z8n~~bYSq+0xcOX@W>UJXVfq}krabAUczy&cgv)~YFwUE5#J~DlHEh*6@E(+Dhj1>H z(?Q?NZwR;^Eo-m zV2Fm!BOBv^(c{KNI@vA58nKr)u=}X4hM@jYAyR6NC`vLpc)DiXjBCR`r`G{oSNdw3 z&ATnRNV-PqFKqucOSph7&9Gk2J{CBWc9UoVZ_MXoJ4c09`vcoUK|cq?48|FiQ|XuL zm6esfI`+?@Fv_|(@9QLLATrs$X*;b*WvF*~Cf4iVpX>Ycu+?wco8-;;RhU(^=xgMO z%0SI9n(`Et-hHoIu}!5o^`=-$(x*Nhq&6_U@o$*1<&|ipP|p&EMMP|0jppMC$zt+h z0T>QlVv0a*+2cWeeH2=mMD;wS+Oi}Q$4lj`^-Bo@(u^WTMIy!Y^0cSV!)af)lF6Li zoKi6TNJ{qfcxQ6^>)ic2cVopw4RnFqT0swq0_ z(cM;W&PM;7{9Ea*u5#0%Cg|*|i5(ZxsO28ufMb$5#0uCLf@R>oLCfg$O=Zg^7gIRc z83i;RfAhRMdzjPE(@W`8q>#jZ{3s(VEZi0XB7HnT^sVrO(2ALRw#-f6Gg3^nn@#f@ zzsU<3!STpbM|wBA%t%At-Uw#MpTZ(jjkHxGtNuULj*WG(XVspjo$80|p4-=)4@}4j zG6f$^NXpgcoRs#xn9g|GykJv*9P8oHRm$?8gT=V0{Eub<()62GHQXq@NFu^6Q40Wq z8tZNsG8vUa4xbkZji76r-5eZpj|)9*n+Kk0^!5WdpY3VTwzW5$^74-Y$?S8=pCE;x ze$kahMXLafa;S%gI?fU1L!5XmmG?$}BUJY!J;z&lr5i$796t%NH3P2XX#V+WSg_ z9w%huPwiY<3Obyc!uN}fIS>*BlG7e=@`6rcDdux-QAWK zb?0y3Lv+PYL7*dd8}TFi3N)B)pqH2Qr%%F(w(lk&uf$jIaXcXX+6%TfpMEu;?Ne^> zHKzR2sUv)OzbrI1?Bh#KlDCwTLOkDs7~acQx4HNrljTT#^hcrY>%&hTbZkS^_*~Ga z+RHY&qgX$Oqjb?o_{mpO#2<-S{550pHuN<%bw=AN43tVT$tuq|H}e|I10FF4|~r{kJeM0vnp z_Zz?0{WWC|HHXEvR@>I;dc_=!rgVmfCu_I~pdYFnS3fJJ8C9$lpZ`)xeK3CT_o8l^ z?xkFnWcHeb5|nmo#j}S+k5(0|Yw+8#V88fOjw>}KW4>82%?~$|CYwxqKV`((=uwyU z$?Mj(N+*K`uSOA(E!4D`MCI?`myASm?#ypR#C7b8{ANo6CMI5JLuPHLwX-SYYvZM^ z1sw>Ni87Q5n)`+GaDRm4wv`7Ii_;x{h_qFiG|8`K0c0sfN7VnX@<}q#=U$9P%FuDZ z-`ag4le{^j81rO{?*+l}?W7@pdMU?6}ED0Tx>;tz(39Y)K zDu)dp`NmVloSK7;>`h?}j0qulN;F>7`wA|F=@+DRg(-<3@24W>-pCcq*|V_{flm%Fm~T?+$emNL8KZ=l;7! zO(z6Q&j*=y0aALtpIMZ~i(*|$l96n6sCFlza8NoRQzK4G9RhRVe&}pQ^yAr5sW``b z-;P65Nc*N-iVT~~Dy$f`=_PplVDo!sg2-s*fYSz#ThQMII`8jNswmHkoa zxy?oUNEAC;`2Mn}m3uabMEhA2yUY^&hrS{CGeM8CJ8udppe%ELNcIP~zlj<_4%_Ua ze#5Q=9uC`Nf%?CGW?e!_DPL*JQrMuDSV|NaKW{K0~bAdB}4ReTRy~SWpgJl%S_P$T2IjX zUSX+_w=B`-eq^@br0^$v-EZJrz8#$JHT5}H$}@)^>-88wjDdS?9q(j7A`HL8lgRnS z8)9ki+v~3tWsCzlz~RKfy4$`Ea>--l-X*6n3bTZ@(ct9!zBPtnTv)tet&lsM)69V; zFdu7tMN{G=r)K1kYbIVhULQjF@kJdD*R|!mVt)ipjj3ZJB0xO2;Y@v;{u3^@SMT+w zLOqFVOAU!S391|>ieheLG$^hXbAj$OSHd0LkMAR2;I8M)@qeGjdrzePaKUS;J?_^T zX*`hd*QL%b<&QQpSz(TU2t=ibrYOCl6rE@ecogjUTpUX)3}$TuYhE__s)uG_3<5aO z$m*m<)S|mTSEBr_oy$z}va`wnl6wjg8WTgUT<--jxPk+}=1HEzpNfFp9@EpgxQ@#! g>WCZX+>f_77GLZRGb5#>A@HU0R8z4+-s0{50WuLXApigX literal 0 HcmV?d00001 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.genruntimeconfig.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.genruntimeconfig.cache new file mode 100644 index 0000000..4e9f758 --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.genruntimeconfig.cache @@ -0,0 +1 @@ +4c13f7999c980dd263c35561d52bc0d1b3dfd347003e2377a2afe03ef4a2d42c diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.pdb b/obj/Debug/net10.0-windows/M18BatteryInfo.pdb new file mode 100644 index 0000000000000000000000000000000000000000..091aa97a4e57e8df399956bbdcb9baf80de8fda9 GIT binary patch literal 15756 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 Ik$mj`0OtfA7XSbN literal 0 HcmV?d00001 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.sourcelink.json b/obj/Debug/net10.0-windows/M18BatteryInfo.sourcelink.json new file mode 100644 index 0000000..1a61951 --- /dev/null +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.sourcelink.json @@ -0,0 +1 @@ +{"documents":{"E:\\M18BatteryInfo\\*":"https://raw.githubusercontent.com/mnh-jansson/m18-protocol/1818b2638f1ef88717123ce42b72196c27be34d2/*"}} \ No newline at end of file diff --git a/obj/Debug/net10.0-windows/apphost.exe b/obj/Debug/net10.0-windows/apphost.exe new file mode 100644 index 0000000000000000000000000000000000000000..601bd4899e6b449edeb9b3a5d6411388c329c933 GIT binary patch literal 162304 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

q7^*PTVQ9k8 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 diff --git a/.vs/M18BatteryInfo.slnx/FileContentIndex/d3b49ca1-96f4-44b0-8eee-d4d8bf6b1c72.vsidx b/.vs/M18BatteryInfo.slnx/FileContentIndex/d3b49ca1-96f4-44b0-8eee-d4d8bf6b1c72.vsidx deleted file mode 100644 index 1a8e3c30762b5a0ba8b0096e12657f2e7a68fc79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79794 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 yVc2| diff --git a/.vs/M18BatteryInfo.slnx/v18/.suo b/.vs/M18BatteryInfo.slnx/v18/.suo index 6d4c140aec32fa395c68d0be08bba79587f7a369..da123df4f5fa1c2d4a2d3298e70c4a43d5dca629 100644 GIT binary patch delta 3122 zcmd5;O>9#~5Pth?gOfZvc7AM=AM6ANOoGF+lb9qVjsJ>50wmxB5`I$R{HPodPO$k) zT8w&VDJcz}9w?P66;ugTJ>~V*qFMsA2P%4Kq#h`odTdoyN)B$7xHHdw^r6yFsiNvy zpLTb4c6N8>n|V&Y#V4=x^I|p6<(rA)8gWST)oeCPQVlR&_S*5!Qv4p)05!bb=(y26 zZaMh_tHxEo6E5%<*gP!r`wUzuO3DzpH4A2=Gv(02IZZEwES;@bQHii2$PP6-j^Uhk)=-XvoG6$$# z{vG=lt$1@0737=uz`aUQzWoEbWJ<3uFyPt>?q0pNztSDTi33rEP%KivEk8G_AfzCfGZWu$j@(*}Je@mb(=3TQMW6miHRum=N`p1>IGglu4Po^?b_M4c+E#5I6P<45k0p zv!%bUd6`*3J{k|AmU4y+OoIa@7v#t#4`6CJ@8=v)*9V~r4?bMWG?4Mkup^N0=0bHC zmT`ok((OVMkKlY$k34%BXS|fLmoh=76uz3M3bvYX^AN5LBS@ge2+CeTjON#(Djk@w z87hBUC3qdj7ZFKVDc?m$qNAmAmR?3z))C#kkSRwdP!8226u-*>vD`N>5-91EW2;pT zxU$)Un~9)L(TH9i(W~t-a=}IU`492=GdlU{kTLfPRAs0FDMv%RWKrMvl%TX+gcY& z6-vWWW0H+QV*8a;{qCA$AJjeG=?Pt~x_xRgaDUJBZ{OeBRpQ#U>C@E{4}8Tx9^|mx zl=7Sdx@rd@)nJ34>dP1k8$yEnyT$RMlT%-Re{Ssvr2xl>$>o4`KKoxuJycNFeK>}(buMMjvcZyH2< z_6m%pAQP|M@VG)p#CFM(#gR|-pg}AcVr-EabjX}w8iTc z-4ounR=3A9F1lMMceJ`iaa0^@^LRwDWyfn_>C|8Y12$aE8o@s7=Ig7#GhC^uXHJ|t z;p*_nX8hkF%9+e@XUGlQUYxaZK`b_L{E>^W!5gtUaK#+(%~UPa$1ISHxvYPq4`0SE zLHewJp}mTKRyOrR*evEUYQZ7A@G>Z^?3^LWV6#?9fljzo7eM11f;^R@wQvZX$IGZk5HX_QTz$Q;^~*bA5TL1G$Ni}>q1g;+RxO= vsaijz@$2A7*kI_aOG?-J*}@srQ9c>ZSby>L{V$~)F4;pcZ*N``B5(Kum9h&E delta 2686 zcmd^9|4&<06u#`qKb&?wY%O6%TS{bj+Qye}vB zp3gn^ymLP1+^fDXsP74jN+TUa4~yl;>)yfl1tDmG?|suqq2L` zKk+8qU9rI>;S#?M8@nHvI3CG55TzNa%yv`32{|eSZmXoXb%xC=$vZ6goyj z#PxG1yLA}h^{7{&7*Wbl8c??G4A(%?5I1$B;zJ?BN{x#rcs|^ZT7LYOa1}JyhYRZ^ zwF{*PZlVtgQa=g-@5B8&60qgxy5(T|EzqT<3*9aK<9TBOx2FUFFgWrOU`k+L;^n%U+ zVvTC)O$3M}2Aj5iShXJ0Qg%NV`7VM!PBwuen8YqrT#&&i^9a8I^Ibuy1#xPPLVEl< zY;O9!2E?$W$MPp8Xz(*CeGgh*0rqq@SI*<3uCG zYEK*W~pt?_&$5@1&NAm~^Lxs|;t)zTBZSBd$r4AV&ZvEE8=|)q#qmS*jh#kJU zv_~jv=lq9V+C2#KNl*2D#(sIYCI9d+Tt4&0{YOh<7FZlma%HGoBTx1#q#QDJ@J9lj3|9mludj>Eb?i{w~>j1w8Ia;E*5i0h<*o{Pt) zT`CX3eA^9B?Z~v^HSX0pfY_Puwu|EonmD}``ou({lR>8GG9QC^$B2g$>7o z*oV+vNF2B<_Toy=GL{ly$H>TCDSg6F>`ImAt`zE~&fiE_FVMf_6P8;f{@?VumW}w!`G?>iJ^;TC)q^@b z&Od|pQ)l@A{5)*8&0tx*EQD7e#HLw-UBZhn$7WD_9kEt6#V*1Zr(Rz0Mr3c)tH?^H zcghuwc7!7xVa~4e-Yx~d%K@)j@w(leL^QR6-R%jtDQ&JvS&6hw%I?WFm)zOm49U*+ zN$+IH+35_0UHbEZfY;;p^xriUKVMhWfp%{sD(vE{SNnYAAcqTYE`l)nN=-XvqT@h07E%1*WgOyPu48^VRsoanrb6Cz{2gF$qo5lJ^ zu?x;&7sOZ`j*VSO#~l`#1y~VZ@b$Yr5QvY$vfKc_C!`X3GI7BDMCbB?kAs>p!-M1; z_>wC4-dcg%DG5%>Zt$gi%ZF$`gw{wr4j;Ox?y#0Ek diff --git a/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.backup.json b/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.backup.json index a753a26..38f11c7 100644 --- a/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.backup.json +++ b/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.backup.json @@ -14,16 +14,20 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 0, + "SelectedChildIndex": 1, "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{eefa5220-e298-11d0-8f78-00a0c9110057}" + }, { "$type": "Document", "DocumentIndex": 0, "Title": "M18AnalyzerMain.cs [Design]", "DocumentMoniker": "E:\\M18BatteryInfo\\M18AnalyzerMain.cs", "RelativeDocumentMoniker": "M18AnalyzerMain.cs", - "ToolTip": "E:\\M18BatteryInfo\\M18AnalyzerMain.cs [Design]", - "RelativeToolTip": "M18AnalyzerMain.cs [Design]", + "ToolTip": "E:\\M18BatteryInfo\\M18AnalyzerMain.cs [Design]*", + "RelativeToolTip": "M18AnalyzerMain.cs [Design]*", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "WhenOpened": "2025-12-14T01:05:32.518Z", "EditorCaption": " [Design]" diff --git a/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.json b/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.json index a753a26..f9d1b32 100644 --- a/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.json +++ b/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.json @@ -14,8 +14,12 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 0, + "SelectedChildIndex": 1, "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{eefa5220-e298-11d0-8f78-00a0c9110057}" + }, { "$type": "Document", "DocumentIndex": 0, diff --git a/M18 copy.png b/M18 copy.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6143fe1951ec2677c6025a9334267727fb3ea7 GIT binary patch literal 8571 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, 21 + + + iVBORw0KGgoAAAANSUhEUgAAAH0AAAAkCAYAAACkATUaAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAABsvSURBVHhexVx3XJTH1h4BkQ4iRRBEqghKIoI1GguJveRq + xMQSazDGwrUktphi9CbGEs2NvSWWRI2FqBELGlRQQEEBhWVh6b33urzfeQaWu25epMR7vz+eH7D7zpmz + 88ypMwurfPK0R/mdwF4VD0LsKoIf2rcLNLY84E7v2uQUI3lxMavLzGJ1WdkNP3NymCCvZ4IgvIjaWs2K + +8E9ywPvOYrKfDmgK8Y5l98Lcq54GOImLy3Vl1dXM3lFRQPKy5lAf/9lXoJEImFfffEFkyUksN/OnmMp + ycmstraW5eXlsWLSv6amxiAqMnJ2aEjovCcRT2ZFhEeIYWZwUNBHiTLZO5BZX1/fBPx988YNlhCfwLKz + s1nQvfvs90t+9Hc8CwsJwfvqN/z9ex89fHh6wK2ATw7s2//ltm++/fena9ZcnD9vftC0qVPDxo8bFzFy + xAjZsKFD098cNiwFwO9eo0bFTZww4ZH3dO8wn0U+dzdt3Pjrrh07dpw6cWJD0P37HwfcvPVmeVm5flpq + Kp8vMyODxUul7Bbpk0G/QzeW/sH8+/F2PYVk98ElSX0HlrYHGCs1sxRyv/76AoRyNH54QS5n2AjywkIm + LyriP/F65YOQBfG2jkKiq3sFyShrIzBveVLfQVWynr3rkwa9IVRFRk+tpU1WI0vkqI6TsprcvAYdVKBM + +nV/f3btylX2IDi46f39e/du7cCYAGh30hJFp46atHpM2PTZpivKsptIv36Dy8/KzGSJCTJ29fIVW/8/ + rvkuWrjw9sSx4xL7e3jUmpmYchnKUCNoqmsI2pqdBB2aR1dL+wXgNS2aW0NNjeunOt7R3kHwGj4ie9bM + mWGXL19em5qSYldYUED6XGcZ6elcN5Y0YtSTZ/SwVKeLEKfduV3AWMhIdPcsry8utZeXV7C6/IL/gHZ7 + E3Jz+cTZ69efivqb88bpGAuxTE2QGpoKVaGPZtSlprGaWAmrJZRFP2MFjXOpQpn0OwG32cmff2Z+ly7x + 95KTkiYaGxvzhbU0Mxe6EjFiMOtszMnftWvX6tjYWBYYGMhiY2Ka5rh39y6rJI8TGhr6ju8K33vOjk71 + OkRkRw0NQZ0+t6GOrmBOcmy6WQn2Nj0Ehx62gpOdvdCTSGs17Bz4GIy1624jWFtYCsaGhoJmB3VBrUMH + QUujo+Bkby8c2L//l+D797sVEPnQjaWMGRcq6aQnyBx6Cwk9erYb8d3shTgTc6HkwsXZ1XHxrPJxBKsM + fcSqnkSy+rq6psVohGnKyLcyYtW0/t68ts6C1NhSSHBwFaqePJ1Wl5HJasil1kvjWS4hp/FDqkKZdHKH + 7MzpX9jjR49gpZ5DhgypgLX1cnDiZIgBiwzSezk6CZGRkWNBNjyFwn0CEeHhjit9fe8Yd+7MLdBQT4+P + dSayHG3tuAxVua8KkO/s4Mjn0KWNiflHDB+enZuT0x+6sZTRRLqmriCzdxESbJzaDyIhhoTnff2vsxBc + X1HJ6qtrWH1ZOW2AcFb5MIQ2QRirfvaclflfnxJv1k2IN+9B40RktRY0p7SzhZBAuitIryOyq4n4xMRE + lleQ/wLZCiiTfotIv09Wef7sb3Nee+31CiwQyBRbTAVgZR3V1IVRI0YkV1VVGajKz8zMnOLp4ckXG5sD + RMMixWT9NwHSMbeDjS3XxdPDo6heLrd5daST1cUyTSHl7dHS+qpqXSRyteRua9MzmLykhMnLyvhPLErh + 3v17Ypi6uJy2QIX0WiJdTqQXJCUxKaEgX5z0fHp95/btPN5SgjN6zcpVfkYGBtylcwvvIb6ICnDS1dWF + WTNnBZw8/jP79dTpJtmpqalvvebmVsc3D8mC1YnJ+F8C5Dv2sOPEk6vf8Qot3VmIMzITpGYWQm1axptN + i0yJHMhQbAC8lj51RlgsSKeNIiqrtVC1dJJfm5TMM+ZMQk5urml2ZtbgnJycXjnZOU5ZmVl9iZQxV69c + XUUJ1akpEybGOZIbxGJYmppxlyi2aKqws+7Ox5w6cXInPk9RY3JK0B42dFgs3nNpwVuoghNDG6Q5ODX+ + bG9YgMXrUx7hNXLUs1dHOmDbi1y8hlC4/8D62qQUVhn0gFU9Cmf1VA41LgqTFxT1ibdzFOL0u/CNIiqn + tVAhXcjOYclRUSwwKIhR1sq2bdu2GwRYW3YTuhO6UWJmbtxF0NfWEXS0tQX1DmqCiVFnWlB7DrHFUoUD + AYkckjiK29PwmRDLUer97ufni/l6dLPmBImNFwMIsTQ1p6xdXTAlfboYGQmdDV+EsYGhYEYJpjYlZ1Zd + LWiMo2BnYyMqTwwIL5Dt4uSc0XbSaaFFXycgKYuhbDrTZ/EdTnBJKZNT9l5FmTSRQjV7Liu56PcxErgE + a4fmZb1kjhegQrqcvEkllW2VdXyTqc2bNzcYJJhSXO1CC4efFkQYLLUXWbUTLbbYArWEzkRAH1fX+ksX + Lr5OpRgrR0+APi+VSaENSWDrPAYA72Kkpy9YmJsL48eMDR42aPDh0V5v7Xx36rSNs2fO+mL2rFmbZ0z3 + 3kXv7X1jwMAfRnt5XUNyaNalCw8zYjLFANKxBn1cXFPbRjotcrwFJV/dHcWJIXct0TQQktwH5cvLy23k + paWsjjLo2rR0DiR32f/8px+8Ac/aVcc3It7StuH3lshXIb02OYWXiCCgurra2bOve4UeWTUWVtlVii1K + a4Hx2Eiz3ns/jubRzM7KYglSKUtISPB0c+1da6ir12oXDCKQ1Xc1N49f4uPjkZQoY+9P92ZTJ09hSz9a + wj5ZtZp9sno1812+nM2b8wEbMXQYu+Hvzw7s2z+LSjQ5SsrWzgVvgtp/0qSJT1pPOhEtI1Jldr2oPLNr + lpB48+6CRN9IqAgOXoDFR5OmvgqZPO+O6aeMGJ0q6aAtJJAcsfF8QzW3qVTxIulTBarLJQ8fMv9bN9nF + ixemWFlYCNbkCsUWob1AbQzSN6xb9ws+X1RkJJGzim3+6qt3u1tbc9crNk4MFpRHWFta1h8+dGjI8SNH + WVhYGJv2zj/YhDFj2cK589iyJR+zFUuXso8Xf8QmT5jIfBYuoqpExkoolIx9e/SfmmpqrbZ2PAe9/7V1 + 677Wk07uWGpiKWTOW1SV3H9obbyptfhzRMRzEp7/zfYfsSg1ZH31je6v6mnk5DhzS0HapZvoWGwmqbm1 + kPH+B3KSU8+9ishzTVAmPeLJuwJZXUVjQ+b4sWNbtTp1EmzJlYstQnvhSJYF77Fn956N8XHx7MRPP7MP + Fy5ky5cunWuJTWZhKTpOFfAYaJ68NWJkGPQtJa/46Zo1bNjgIWzlCl+qLnawHd99x3yXLWf0DHPt2Yvt + 2rGDf7by8jIDNxfXBCPyKq3xXPAGCG0IC9K4uIltcu8oyQq27QzOWfPpg9gOnUTHwBPgubTJUyT1lVX6 + DS3YIq5s0YHD32FDcEtWGQeAwMS+HvnFJ08HUB1fG2/WXfS5JiiRXv04YkZNTg6rbmwErV2z5iZ2dnuz + XTFggZHEwa1K46TjME8IeZbPNmxgZEEzbLp3F6zMLXh3TGy8MqBXZ4rlffu4ZcdL4+1CQ0KYm6srGz3K + i+RtZIcPHmL7ftzLSR/k4cl62tmz7779ljeTZrw7/bQG68AzejHZqujVaOU+iz68DZ1bTzq5djRfio+d + +LHycdgS/C6zdxV9TmpswS2W4vggTFKbSvG8slotY+784BhSFhtDdZzMzkWI7aAlZHjPDCm/dfszSUfd + hvxB5bkXoES6EP3cu1CWyE6eOMGCgoJ0xo4ZI9FUU//bMVwZiMEGurpCr17OVWSZNvhsFRUVPHsvyM93 + 6NO7TzGaNq5OPUXHqwK6GRsYCJ79+sVt/XrLu+PHjHGeOG6c+ZavNludPnnK6ufjP1lt+HSt1fA3hpq9 + MXCQ85LFH82cPGlSCNqsvEJoYUPTRuEbA4R7eHiU1tTUerSNdFpgEJb/3c7dNYnJnnGd9Hn8xut/fdZZ + iNXQEopPnNiMSYC6vPy+CTYODaWaGOm0gZDg5f/ww7qSX899KFHXpoSOcgeV516AEum1EU+9KzMzWWFR + EQsJCRmlaH+2BMTV1tbnIAmHHPPnzn1SUFCgFUnxPL3xEAO4cP78d5DZmYhEBt8SKbB2bCQ9HR3ek+9h + ZV1Hr+U7OzoV9Ondu9DVxbXQycGxkF7LpTBVo0cbDg0kyHWkcWIyAcRvEI6GE/R5a5RXWUZ6+jCFnm0i + PZZIyV6+8nxddk7X5OEjkiXqOqINFlgtPEHmAp9gxUSll68sg/UmdH/xWQ6SjXgeq6FHCeDDXoX7Ds6R + aNGmUmTxzUGJ9KrH4d51eQ2napkZmSM3bdgY8M2Wrae3b/v2F3KLf8H2bdtOHjpwcC/Fy8zO+gatCgNw + 21jEfT/+uA/zUIXAKisrm0gHtm/fftiY6mGclCG+g1QxWcoASZCNsIHE04Q2rBHpBL3MjLs09BjMu/Jn + kIWLyQDwGdB5M6H4jVM41PGzZ84MSEtN7QHdampquI5tJF1NyF7qy2vwnE82nOLxWYR0PIvSjeJzaV1W + th2ez169xr/ZkECeQaJtKMjcXq+lZ9XLrl1fhLnaRHp4hHdtVjarIndbI5e/QMRLoE9ZsQzW25owgMXv + 1LGj8NPx48tLS0r4OTzkhIWEMkqQWBVVKVVVVXjN9pfTp/98vY8bbwaJyRKDYuPhpzKU33sZyFPwhG3m + e+8L8QkJmx+FhnZAH0Fx+idvXJc2kq4OSw9EGVZy5uyiOCMTfrom9jxcP5I9is/egryOpbwxMk3SAZ5B + vL7HhshestwfSpWcO7++zaQ/eepdR5VCLSVzFbU1vKwpLytjZZQVKwCiKui1RmKYTCYbCYuCNbVEOha9 + i4Gh8Lrba8K9e/eGX71yhQXcusXloHbGhQX63fTUiZObF/v4XJowfkIqLFhxdPq/ADxBd/IuHn3dhXlz + 54b9a8vWTXl5eZa52Tn8kgh0BdpO+lLfQByV1uXkWcuc3SridI3FYzS9BiILdu3xJZc9TGpKGW8XIshG + hHRrRyFWW18oOnCI5wClFy593i7S0XunZK6CSsRiIleVdPydTyEA599om166cHFxR8pTsFgtWRLctAZ9 + nrdHjkoiHXUUCwhIJXEs4MbNOW97eZUqcgVtir3wDK1x7wqLxsZThdjzzQEyMB+sXaHHsDeGFmekpQ9Q + 1rftpC9ZHohDFAzOXPzRXZ6Ni7jshsRMXcjZuPF86cXLW7ABIEP1OVh5nJE5NklN9bPnfSG39KJf+0jH + wU6clFWmpLISEE7kK1s53BusvLDxgOTrzZtPYWFeFicVQLKHMLBwwYIAWA3qasUinvj5xI6O5PYhy542 + EJIoTlgrNhKegzdA/EcoQH9cAfyNjYNeA55raWMqoCAfCR90mjZtWjrp2VWhb7ssXXFEWnrp8qecTPTR + VZ8nN44mTPKQEVWpoyeWS426kkcQSfoaN0f6ezOjSKYm5JJ7bzfpuERRGyNh1WlprJRIL6cYX03JVp2S + e2uE2qQJE6UgsjVdLSxkxw5qwvFjx7elUBhRxPNzZ8+tx8LqaWkLrj2dRceqAvOhc4f8wMgQBykm9RSP + KwB7G5tKgLxPpY2VdaWddfcKCj/yTpqaPBtv6axfGdAZGwb6nTt79kvFZ2876ctWBvL7bkR85ZPI4VKL + blSXE6FiY0gmOndSAzP+u+gzJBcbp/Dg4S0Kpf4u6Zz4WAmrSUtnJSXF7Pnz57jJwp5GRHBEPnnCZPEJ + 9v3d+xUZ6Oi2aEGwGJR2KJdI1gToiLtwlBWPc3Rw4LdTQAbChNh4ZeB0zLyLiaCvqyeMfHO4/xebNn1w + 7do1jz3f77amvMCWSkG7rKwsOwo/dvHx8Xa+y5dbHjt61HXTxo2fW1t2y9DT1uZepzVzAfA6IN3Hx+dm + MZWzT+mzt530FasCccO1Kvo5brlqpk36R1ws6yiexQOK7huN/8t7BGkXS0FiaEwlV8T4V0k6UAfiKXZn + 5ubyCxMK4O5a4J9/zjGhxQeZYoulDJBuqKcvuPXpI1y7etUVV6sQJma+PzMQC9pawgFYeGey7q++/HLq + Zb/f2b9372YpKSn8Vq5q+Yc5cMPnxjV/dvvmLRYVGeVEGzQfp2UtbVQF4OY7aWgI48eNT7t4/oLJ/r37 + 2kl6fj766PxSRM6GjUdjOmpTTBYpxVoChQCJmo6QPHREZk1Skgn69K+S9OrYOFZPBCsvpAJHDh3ijZTW + 9OYdbG0bmjIfzH2Wm5fbsYZCRVFh4XBrKyt+9t0WArjVLfrwIHSgRJJ9u3UrI4tmp0+dYmWUhyjriD7A + 2k8+wU1a9v2OnezCud/YO5OnXOiortGqPATAnOhMTpwwIe13Pz+TQwcPto90eUEBqwp/wmokUlbmf2OG + 1MBUSED3rBlrbg7YKM8pEcxdt8FP+cO2k/TpqqQLlMk/ffiQ3bpzh99OBcjC+VXglb6+l0BAazJkkIpn + N3/x5U/Qr4jc5KEDB3gsb2uGjXBy8sTJeQX5BeyPK1fZgg/msrmzZrMlPovZsSNH+QHOl5s28Z77nJmz + MA87uG8f+3HPHnb2zBnW28UlABcqWjtv00ZbuPBWDnnoR2FhnPSQNpJ+l99/o0SJk1Qn75Y4cEh+LG7U + ipRuzQIXIrs7CejSlf5+2YfLarwz/qpIr0+QsRQqp57FxDAJlWlAUmIiS01O7uI1yiulE64I06KILZYy + cOnCgNz7gf37P4uOimIXfvuNrVi+/DBifGtbuApoU0J27syZNYmyBPbZ+g3M1aknP1mbNuUdtpH+BiaN + G8/c3V5jttY27Mwvv7Bt33zD7tJm9bvkNwfXp9GEEZMtCgo7IP3Avv07sLaoPNpHOtz743BWSwsIQTkr + 11xotjvXDLBBJLpGgszVrV5eUtabk96IV0F6dUwsv2evLFeBvLzcnrbW1vwKUkukw8pR97o4UWkpkbz1 + hBJBnIAtmL/gihYR2Fo3C8A6cU/Nw71fzqXzFz13bd/OPF/vy/4xeQqbN3sO273re0YJHVs0fwEbP3oM + G9DPk/1x9Sr7/dIlww9mzf7UzNS0Eqd8rdmoAHRH/O9mYSFQ3vC24vO3j/S8PFYVGcWvQkFI2ZWrS2M1 + tYV4ixZIUgJIx0bJXOhzE3fouOdorP9fBelCYhLLoqz9blAQC3nwoAkSsvqb168vwHUj1MAtxWOUV0iE + Bg8YmEm6GSLZOnzgIJs/b/5F3ERBNi42Tgx2BBzE6FIGbmXVrXZQ//53Bnp4/kBZ/LLJEybOX71y5eLV + q1YtnjplykKy/sVvDBy0c9TwETc9+rmX4MsLILwtV7HwLKx8+bJlAVhXNKSA9pGOmE6JHOI6vtRAv7vJ + XNwq4/RM+HOi41WA9i1KtZIz576CQoqLFq+O9GSWGRXNAsgtBt2/34QY2gjr1q49AitFOSO2WMoA6Uji + Fsyff7+0uFgNPfY7t2+z9evXf49DlbZYugIICWj9Gujo8fINQBWBrB4Aufgbr+tpaZF30OHWDbSmSsDm + gl5Genr84kRiYiI/+y+hMhtoH+lUAsHS66v+8wXBjLnzH+JS5MvuvimDN2vISipCQoZWPnrcdLftVZH+ + MvdOWXgQLKA1pCuSuB9279mRnZXD0JiBjPDHj2fhJAudtLYmcwDkAhgLKP5WhvLrYjKaAywcmwp6nz59 + isdydCMVaLelg6hqSpJwMwZCi44e+xyk4xq06HglNHXhpnrH0FgNnsA1JnHAK7F0Qt7zGBZBHimaNqgC + mRmZNuQyi3BVqTWLiSNNLB5l/h8q9GuE+ry5c5/iPSxyW4n5bwA64AIHwg70OnLkyM8qOnO0n/TQMFZD + cVMhqEaaMEqi31mQmhAJLdxnbyCdCfk7d+7BWFynqm886wX+NunSeFaHn+Q9yioqWXlZOQdkR4RHjEbr + E65TbOGUgUXE7VYnJychOSlpEDpaOLBR6JmVmTnCva87/yoUMmq41P8P8nFZE0BYgC7GZOWXL1/epdBT + FUT6WCKdyi17uGXE42bQA3fflGJ6eAR3obVEPL4aLC8oNErxGpOMK08N1i4iAyA5UjMrQaJlIFQ/i5kE + JfCVp8bbshz/IR03Z0RkKECbS5R0fE2ZdFIkhsrw/+PaMiwMDjlA0MuAGIpTuInjxknKyss1nj17xuIo + pis6ZzWkM9X8/WZ4e6dBJu68Qy4sv7UZdnug0A2bDM0lxZcUzUxMhI98FofHxsQOVf3cymBJI70eI4uO + p8WTGpo1DyNz/nXkzA+X3KfsvUNl2COezPE+fOOJU96Wb05H0zNo1ojKAEgO5pN5Diisy861qsvCPy54 + 8SvFxad/3Yy54nTIc4jJUIBkYZNJTbvh5sx7OFoF4XIiviJWwm5dv86uUsnjf+0aR+TTp2z16lV+WCB9 + LR1+SNIS8Cxlv4HQC/12HNwozuPxxX/ce6+rqzPa9+PebW97eRWCAFx9QvIHL2FhZtZ0dAuikBgqA68p + Q+x9Rc6ADcX79p20+QbDbV/o2NvFRVi+dNkNKu9mJMpkTEKfXfG1ZDGwVO8Zj+O6WgqJvVwFmbPLSxGr + ayBkr9sYVJeb36HqaRTP3isePOTABijx+31uvIsrWaC96HiOnuQx9I2E/G07rkIB/qXDooa8QIHSS35b + Y42pEqBET1SGEuKtewgy934Czf8e/vNFTYKMCSmprJji+ebPv2CrVq1m69eu49iy+etOM99/P6J3Lxdh + 6KDBJUMGDCx9GQZ59i9z691bOHv27BfI2tFzR0crLDQURDN0uMjts/S0dBbxOBxWbxgcHDzHd8WKyxPG + jEnp+9prchCDjaOAGnkONIXwDwaQlePbLcowoI2iq63D43JHShSVxwKGFJoGDxhQOWnc+IQliz/64+7d + wA8p5NiiKkHHEbpFU9WiOD4WAys5e75/wY7dY4sOHx9adPDom83i0LFh+dt2ji2//edAfFOlLjuH1VE2 + K8/PJ2svaPhvE8XFusXHT4wq3LN3JD0vLodQsG3nuOro5/zelhgoQeyR/+2O8UX7D4uOV0bhv/cPLzpy + fExtdo4pwkQd8oPiElZN8TyKLJuybIaGSiM6RISH20VHRfV8/vy5Lblru5chOjoaz/YqKyvTLSXZijoX + gJ741x4gHT//vHOHPYuOJutPYyEP+b8Y0fjz9p1+AbcCFl44f2H97l3f79qwdt0lSv6CJ02c+HT4m29K + BvTvH+vh3jfW0929AX37xvbv5xH7xuAhkjGjRz/znj798Yply+9s3bz5+IF9+zbfunFzzd3AwOmPHz12 + IvlqfhcvcE8Dq6a5WCDpEBoSyvVonnSB/R8o7cRn6N8BkQAAAABJRU5ErkJggg== + + AAABAAkAEBAAAAEAIABoBAAAlgAAABgYAAABACAAiAkAAP4EAAAgIAAAAQAgAKgQAACGDgAAMDAAAAEA diff --git a/M18BatteryInfo.csproj b/M18BatteryInfo.csproj index 6c9771e..4c29fc6 100644 --- a/M18BatteryInfo.csproj +++ b/M18BatteryInfo.csproj @@ -8,4 +8,19 @@ enable + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs new file mode 100644 index 0000000..848d075 --- /dev/null +++ b/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace M18BatteryInfo.Properties { + using System; + + + ///

+ /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "18.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("M18BatteryInfo.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Properties/Resources.resx b/Properties/Resources.resx new file mode 100644 index 0000000..29dcb1b --- /dev/null +++ b/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/bin/Debug/net10.0-windows/M18BatteryInfo.dll b/bin/Debug/net10.0-windows/M18BatteryInfo.dll index a8323127c170ca868fb293456092535bdcd6ac04..c830ecfcc235e79e1623502b82a31f6546a25a0a 100644 GIT binary patch delta 25760 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 delta 10730 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 delta 97 zcmZqp!r1^sEsR^3T*`e787vq;IElfC!HmHe$Vvn9Q-P!f5SjzoAZ!GbNd}6V09i>u d5hI|OB~X1bkYx@ONd?NAFr;jsSk9Es1OU!W5%mB7 diff --git a/bin/Debug/net10.0-windows/M18BatteryInfo.pdb b/bin/Debug/net10.0-windows/M18BatteryInfo.pdb index 091aa97a4e57e8df399956bbdcb9baf80de8fda9..e87dda460cda64f11981edca30397435642a014f 100644 GIT binary patch delta 2969 zcmZ`*X-r&I6h8OO&>70i*a!2NDMRTLC_|yk%)rn$P+M%MOSEoSi;7l?W2LsBL*1%z zpc?nBxmDvq>)nzc8s0D}a_o6|Z%r?Kg!LG&k6Lp~ z59WRk(RJP6S8f_%XP-45NZ+}xV%0YD+0{#E=$#MR20kb!nz7c}t;!Jte+2b3m0{6` z5yA*y^kU4$;6SW|I0WCa_A$Tx^;p4=1sfd38yGV%c&`a+t=Ksa^JdIo^B&AUVEzO1e#1it4EEHSQshr73S-1E7Gl_GgL*JV(jIzfg`b`?S9qzq z+e@t&0~i-|>psaP5J*_U@JuG9=(`jrs_1uA!Pq9c6G-B0ZvuKhgZjwt`vkU| z(xm*fdquVK(ig@U)~9vv0?l{BjA%=4^97X8jgDNDAIx!o=nmudLgng|eZ=sdJjUD@6o$x&I+m}b@*TxPt z?8%J|Z5YnwT@S~_lT8Qy-qRa-v!zTo?df|wpMAIW?yGlgKff$+@gv71lTXb&F+Wn+ zkRR9#i!#IWZpX^_}%q8Q;%-^>bmo8eR;viywwT&&gPfK{vxt*RD|Jl2zQMaA;FxTSZ98JygA*-fzo>+r%_Q5FE^V`O zgQ?`w^=-+NZ4V6E$#i>Wy`9Mp+8vp;w4KsDzAKbHvEO&i!kS{ADy~z-t*UsvDr!}{ zUlpHJ#eJ%HP!F^xXK>%Bx%$TTlyP%P?``j`m}j7wYMC_Xotac&E-&k+NQ_tUDPr+T zhzP_^h^WkAX^9nACI9nT+Q3BiX7eh+L|lpOT!UL%Jk+tIv~tDRtC=zpsjx!CtHcx{ z8A%~6Y*EdmOCZRvPBz|C+_V!Oz9gskDQhAQ;ZhzJ_?9ZTwmA~)dO8&y}YYI$GhsZ zAtR!1TUMt>I%E3y&bk^2B?SYwDAy1oydx$h^|#rCely#kH)m(-%FarEkP|U!iC&bg z*Hzg%{i|K)P5LRUKeTJ~UVHYEMVvRVh%l@un+afcSHij=h=7qOpkR~B3=;B>a7iw~ z!yKVQ2r_e}8OhN=#lR`VL4(x6dvh36KpE!nCJQWXxsb!oW$8lpBDFN50|oOCZ<-8z zY*GRNjygznYyyPBT#Ct35rhbUnY7Rkwj_{9VgYH%!eUn;M-L!PvnV){R^FUUIO-$} z*HdYt2uY@y_i#uimu*p$6GUs8oD8z$^wEJPN3vKDWLMG!Y!P!Xl5U2pAfY*9d~^bj+uU+ixIID2FqQ?0DLNoA=K=si=@OID zXm2{C*YKE_6y?IuT!MnhZ>GhMPKb#~(q_1dQ3qONDR_if&!l-SS{8CEfJf?<6IeQ+ zp2aBEaxODY%wjv&SPnugN(YU1$(5pF*9_I*4PXIku$((B8R2S%sGa)_cg^%U$JW4) z#qt)`oOB!I=MIm-e_s`OAOv+BOpqEFLqO_2Z1WD6-apl#I=)b)Qrm|9396nh1|9_3@ zg@gPB9FCX!@U_%}4=7`;M-}@P;d4|qn~D*^CmMf!ouz1Om(f~7RR%tylyRBjm7iBW gBdo@*s#de`v89&6D&h(Z?D03Y>cl24sMrzx3m&$By#N3J delta 1381 zcmZ`&ZERCz6h7~5*WQ&DSGLiv-DbCLbhPZF-(Aiw1Pk z&VUdi2%IHi3}^&N7A06G!AyT(q9zgn6Bo_IL=@sL;*XIKB{A`w+jc)pyy*OE{_g`_QOQXJztdM=j~90JZ)YB^a&q9JJ{Y713tCp}F1FzI8Y{~*0Y`bi;R zn+QnoCK>Mt36hcuvJ#KI-6LSuE#L~tmn1jb5-gIaJt|0rwQwMe1u>F$5mgH+>Q`FI z+5{kzFO_|Mi)z}Z;;$y3pAuWZacarlr(r%+2Qh`(LA#$O)WWRh8g&z%JA|X*hjdOy zn4V4NGB0LR=^Wrs(wV%xDU;pf?n>pB!8ZR=Q~%X1Q}4Hbf9FB9>e#u{OW)i|IQ!3Bzxn*ouwQec9eX_Wc)V&xUoQD# z`uEr3bDf$8!r>0NLrG7-8=7#ZCqkj1JLvX!Q)!=(s^D2|EZejNAr;Cp_TbaWVR_y_V<306QOL&Gw-Brrk? zyLN_l28E);9%t9a(9F=ZoK-9(tCT4f3MesU5Z(V3pn%fACaKA{;?95>djs|;vGu%% z9xM!sOGETLsT`}3=z7>?Fu@v$fF_lp0~dk;(SkMWo8~$~r-YYC2L6)kc|{{L&0vx! z*2dM8Fo9zky4Z5!{od_TyNt$=2|L&8DyAi-!<*3tOSeoPC*4~kbaFE~4FmMB>%|k% zR@@hD#vzhWv;|wEt7A@{is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh literal 0 HcmV?d00001 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache index 8e679ce..c27e3ad 100644 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -87262b33ebba52d80e8829de1c41818fd4a7576b9789a60c4bcb8061d989d534 +8fa94695351c064965830dd520a5b20142cd79da0cdc20cd61a06dd3cdb63ee1 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt index 84053ea..f2fb75b 100644 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt @@ -15,3 +15,4 @@ E:\M18BatteryInfo\obj\Debug\net10.0-windows\refint\M18BatteryInfo.dll E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.pdb E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.genruntimeconfig.cache E:\M18BatteryInfo\obj\Debug\net10.0-windows\ref\M18BatteryInfo.dll +E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.Properties.Resources.resources diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.GenerateResource.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.GenerateResource.cache index 934a8c9fd80083310e7c5a544ec6df3f771e7d58..24763faa9a79a773efe9acfb7753dbd4df67ef9e 100644 GIT binary patch literal 188 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 delta 10730 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 KMNUMnLSTZ4i34f? delta 51 zcmX?im1p8yo(-0atc(l{42+ZQ7_+#XvS!Z$av07sPS#?QZq8w9&tYN&Vy5jmOw31k E0B#r!fB*mh diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.pdb b/obj/Debug/net10.0-windows/M18BatteryInfo.pdb index 091aa97a4e57e8df399956bbdcb9baf80de8fda9..e87dda460cda64f11981edca30397435642a014f 100644 GIT binary patch delta 2969 zcmZ`*X-r&I6h8OO&>70i*a!2NDMRTLC_|yk%)rn$P+M%MOSEoSi;7l?W2LsBL*1%z zpc?nBxmDvq>)nzc8s0D}a_o6|Z%r?Kg!LG&k6Lp~ z59WRk(RJP6S8f_%XP-45NZ+}xV%0YD+0{#E=$#MR20kb!nz7c}t;!Jte+2b3m0{6` z5yA*y^kU4$;6SW|I0WCa_A$Tx^;p4=1sfd38yGV%c&`a+t=Ksa^JdIo^B&AUVEzO1e#1it4EEHSQshr73S-1E7Gl_GgL*JV(jIzfg`b`?S9qzq z+e@t&0~i-|>psaP5J*_U@JuG9=(`jrs_1uA!Pq9c6G-B0ZvuKhgZjwt`vkU| z(xm*fdquVK(ig@U)~9vv0?l{BjA%=4^97X8jgDNDAIx!o=nmudLgng|eZ=sdJjUD@6o$x&I+m}b@*TxPt z?8%J|Z5YnwT@S~_lT8Qy-qRa-v!zTo?df|wpMAIW?yGlgKff$+@gv71lTXb&F+Wn+ zkRR9#i!#IWZpX^_}%q8Q;%-^>bmo8eR;viywwT&&gPfK{vxt*RD|Jl2zQMaA;FxTSZ98JygA*-fzo>+r%_Q5FE^V`O zgQ?`w^=-+NZ4V6E$#i>Wy`9Mp+8vp;w4KsDzAKbHvEO&i!kS{ADy~z-t*UsvDr!}{ zUlpHJ#eJ%HP!F^xXK>%Bx%$TTlyP%P?``j`m}j7wYMC_Xotac&E-&k+NQ_tUDPr+T zhzP_^h^WkAX^9nACI9nT+Q3BiX7eh+L|lpOT!UL%Jk+tIv~tDRtC=zpsjx!CtHcx{ z8A%~6Y*EdmOCZRvPBz|C+_V!Oz9gskDQhAQ;ZhzJ_?9ZTwmA~)dO8&y}YYI$GhsZ zAtR!1TUMt>I%E3y&bk^2B?SYwDAy1oydx$h^|#rCely#kH)m(-%FarEkP|U!iC&bg z*Hzg%{i|K)P5LRUKeTJ~UVHYEMVvRVh%l@un+afcSHij=h=7qOpkR~B3=;B>a7iw~ z!yKVQ2r_e}8OhN=#lR`VL4(x6dvh36KpE!nCJQWXxsb!oW$8lpBDFN50|oOCZ<-8z zY*GRNjygznYyyPBT#Ct35rhbUnY7Rkwj_{9VgYH%!eUn;M-L!PvnV){R^FUUIO-$} z*HdYt2uY@y_i#uimu*p$6GUs8oD8z$^wEJPN3vKDWLMG!Y!P!Xl5U2pAfY*9d~^bj+uU+ixIID2FqQ?0DLNoA=K=si=@OID zXm2{C*YKE_6y?IuT!MnhZ>GhMPKb#~(q_1dQ3qONDR_if&!l-SS{8CEfJf?<6IeQ+ zp2aBEaxODY%wjv&SPnugN(YU1$(5pF*9_I*4PXIku$((B8R2S%sGa)_cg^%U$JW4) z#qt)`oOB!I=MIm-e_s`OAOv+BOpqEFLqO_2Z1WD6-apl#I=)b)Qrm|9396nh1|9_3@ zg@gPB9FCX!@U_%}4=7`;M-}@P;d4|qn~D*^CmMf!ouz1Om(f~7RR%tylyRBjm7iBW gBdo@*s#de`v89&6D&h(Z?D03Y>cl24sMrzx3m&$By#N3J delta 1381 zcmZ`&ZERCz6h7~5*WQ&DSGLiv-DbCLbhPZF-(Aiw1Pk z&VUdi2%IHi3}^&N7A06G!AyT(q9zgn6Bo_IL=@sL;*XIKB{A`w+jc)pyy*OE{_g`_QOQXJztdM=j~90JZ)YB^a&q9JJ{Y713tCp}F1FzI8Y{~*0Y`bi;R zn+QnoCK>Mt36hcuvJ#KI-6LSuE#L~tmn1jb5-gIaJt|0rwQwMe1u>F$5mgH+>Q`FI z+5{kzFO_|Mi)z}Z;;$y3pAuWZacarlr(r%+2Qh`(LA#$O)WWRh8g&z%JA|X*hjdOy zn4V4NGB0LR=^Wrs(wV%xDU;pf?n>pB!8ZR=Q~%X1Q}4Hbf9FB9>e#u{OW)i|IQ!3Bzxn*ouwQec9eX_Wc)V&xUoQD# z`uEr3bDf$8!r>0NLrG7-8=7#ZCqkj1JLvX!Q)!=(s^D2|EZejNAr;Cp_TbaWVR_y_V<306QOL&Gw-Brrk? zyLN_l28E);9%t9a(9F=ZoK-9(tCT4f3MesU5Z(V3pn%fACaKA{;?95>djs|;vGu%% z9xM!sOGETLsT`}3=z7>?Fu@v$fF_lp0~dk;(SkMWo8~$~r-YYC2L6)kc|{{L&0vx! z*2dM8Fo9zky4Z5!{od_TyNt$=2|L&8DyAi-!<*3tOSeoPC*4~kbaFE~4FmMB>%|k% zR@@hD#vzhWv;|wEt7A@{6&On~Z>fNWEsPLP-xkYx-Mw_q^bKCzrBp9uiD=@B~s delta 97 zcmZqp!r1^sEsR^3T*`e787vq;IElfC!HmHe$Vvn9Q-P!f5SjzoAZ!GbNd}6V09i>u d5hI|OB~X1bkYx@ONd?NAFr;jsSk9Es1OU!W5%mB7 diff --git a/obj/Debug/net10.0-windows/ref/M18BatteryInfo.dll b/obj/Debug/net10.0-windows/ref/M18BatteryInfo.dll index c38bf81312134b3b4d44d71eb58434462045c8c0..2b95ac4c9bfaf3ae1fd7880effe5b846651c8768 100644 GIT binary patch delta 1222 zcmZXUPmEJV9LK*i-9EbQx^%%s5lC3NVNtMoucg~p|FO$1?rz8~E8As*CTRaWN@KTg zeXms;6T1nCG3deOB^dBTI7x`QHbjpeOf-0b$bon;BoZQCyy(Sn@H<2C;!Nf>pi7DD~>;8D5PRxEKaCAA3V9itb(eom9+($kx75>Jh zaq5m&XgK95x9m(dc>9XYhJ$IR*sN3>Z^5lE`;MoA-Aw;(`NUGoZ#b(-<(PI=zq(ef zIbM*DJ!c+we7EV99KSc67kQrJe9T++;Xf*Y~n zaCo;AgTdX{k8L}bG1J*>+IC8onJuPG%eD(8+e{tI6zxo|WRGXkDcec`n+2jP)q2@| z$ImADwkHMBz1{w|v1HzLYkrcC%&k{yt$b_EDL)DxZdPk$$BS5Y(o_|Q2n6>B5?e-l zuUVbnOUj<;jBJzUY%u=V?XD@~qB}VFa%kS>{mH=O51M67!-j(rEPApiQk%4G)&jjY hRfB%0*lMp>)hm{{r{J@+SZQ delta 998 zcmZ9LPiPZC7{%XAlI@?QZPI8}l#(=(s4XR%geF0RwARKVwUuhM2-5s(EEPqo2dy*_ zK|D4t6beP{#e-TDgBOotp`czoNWF*`kD_=G5f8qZ1QBPM-@NzjH{Z_e&X&XFp2gc; z?Oz_hM!kJP7n~vtG&0a!3!X_=9!?0CB}B;aZ3x(9`DKqaDMp*~4a`WfH(Jj`w`jFK zijde+HRLbhUT*nuKeOIGvN*i*^WLhJta|KUg&(POt>|G65)K^a^c4dT^ftg??XWdw z>^TsYKwyD4IlfVP{PLxl^Tjze{j3A9a}1mq$2n@Z(&-b!gB-8Z`>f|isN|(nS*ok@ zDob^xS&;3wP?}H0fLM?Qo@kC@R<_|TQw+@O$Te&V1509%IZn+DDE(P8t0OtBpXy9Y zv4nk`+>B1S#?+T`8|jB)3=8`CwTBBXNN`~RIU)PCE(=nm1@pj>y|*)f(<3%<3z zz&fJtUSS79e_aJZ*~1N%YN<16d$Q-`!ZIFqiy zLiS3r$P+bkA#V-1g1i4eu(11tXtent926dpveq5fM#xNP#h z2>SSP5`0PgB4mPBoLcn=@8lSbQDqs4FqUL~jw;Sbf%jv`S6977DW~H4hpU7e{s5PZ Bo$vqv diff --git a/obj/Debug/net10.0-windows/refint/M18BatteryInfo.dll b/obj/Debug/net10.0-windows/refint/M18BatteryInfo.dll index c38bf81312134b3b4d44d71eb58434462045c8c0..2b95ac4c9bfaf3ae1fd7880effe5b846651c8768 100644 GIT binary patch delta 1222 zcmZXUPmEJV9LK*i-9EbQx^%%s5lC3NVNtMoucg~p|FO$1?rz8~E8As*CTRaWN@KTg zeXms;6T1nCG3deOB^dBTI7x`QHbjpeOf-0b$bon;BoZQCyy(Sn@H<2C;!Nf>pi7DD~>;8D5PRxEKaCAA3V9itb(eom9+($kx75>Jh zaq5m&XgK95x9m(dc>9XYhJ$IR*sN3>Z^5lE`;MoA-Aw;(`NUGoZ#b(-<(PI=zq(ef zIbM*DJ!c+we7EV99KSc67kQrJe9T++;Xf*Y~n zaCo;AgTdX{k8L}bG1J*>+IC8onJuPG%eD(8+e{tI6zxo|WRGXkDcec`n+2jP)q2@| z$ImADwkHMBz1{w|v1HzLYkrcC%&k{yt$b_EDL)DxZdPk$$BS5Y(o_|Q2n6>B5?e-l zuUVbnOUj<;jBJzUY%u=V?XD@~qB}VFa%kS>{mH=O51M67!-j(rEPApiQk%4G)&jjY hRfB%0*lMp>)hm{{r{J@+SZQ delta 998 zcmZ9LPiPZC7{%XAlI@?QZPI8}l#(=(s4XR%geF0RwARKVwUuhM2-5s(EEPqo2dy*_ zK|D4t6beP{#e-TDgBOotp`czoNWF*`kD_=G5f8qZ1QBPM-@NzjH{Z_e&X&XFp2gc; z?Oz_hM!kJP7n~vtG&0a!3!X_=9!?0CB}B;aZ3x(9`DKqaDMp*~4a`WfH(Jj`w`jFK zijde+HRLbhUT*nuKeOIGvN*i*^WLhJta|KUg&(POt>|G65)K^a^c4dT^ftg??XWdw z>^TsYKwyD4IlfVP{PLxl^Tjze{j3A9a}1mq$2n@Z(&-b!gB-8Z`>f|isN|(nS*ok@ zDob^xS&;3wP?}H0fLM?Qo@kC@R<_|TQw+@O$Te&V1509%IZn+DDE(P8t0OtBpXy9Y zv4nk`+>B1S#?+T`8|jB)3=8`CwTBBXNN`~RIU)PCE(=nm1@pj>y|*)f(<3%<3z zz&fJtUSS79e_aJZ*~1N%YN<16d$Q-`!ZIFqiy zLiS3r$P+bkA#V-1g1i4eu(11tXtent926dpveq5fM#xNP#h z2>SSP5`0PgB4mPBoLcn=@8lSbQDqs4FqUL~jw;Sbf%jv`S6977DW~H4hpU7e{s5PZ Bo$vqv From 2aa33c3a9012d59bbfc0a33cd03e8071784a4dde Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 11:58:15 -0500 Subject: [PATCH 08/61] Syncing repositories. --- .vs/M18BatteryInfo.slnx/v18/.suo | Bin 35840 -> 35840 bytes .../v18/DocumentLayout.backup.json | 4 +- M18AnalyzerMain.Designer.cs | 1 + M18AnalyzerMain.cs | 5 + M18AnalyzerMain.resx | 3 + m18gui.py | 410 ++++++++++++++++++ .../M18BatteryInfo.AssemblyInfo.cs | 2 +- .../M18BatteryInfo.AssemblyInfoInputs.cache | 2 +- 8 files changed, 423 insertions(+), 4 deletions(-) create mode 100644 m18gui.py diff --git a/.vs/M18BatteryInfo.slnx/v18/.suo b/.vs/M18BatteryInfo.slnx/v18/.suo index da123df4f5fa1c2d4a2d3298e70c4a43d5dca629..b1ed5c6c107c83cd600947837fb829c6a5e1a09e 100644 GIT binary patch delta 942 zcma)5&1(};5Z`&-B-{8B)3i-LOq=wRP^%_I)CyLyizX;G)Pki}kX}4_C~TqDszDEW z$f52a^y;FZs8sU2cq=A7dC{AKH~j+?1L~n&XJ}U!Pd@m;%}8-;c{;lpX>Rq6FUTx zai46Gyrr4~7a_2|Q25?~^TG326Sr_Y^l_9^ZT1;UHl_d}AIAZ?tQJBOp_Qkv_^E&1`uSYZ>lLUcXx4RIX0)x~4!&pblV8=~mo+^R-w`+k}GR@$x z)-z}hWzkAZM6?m2xOguD))Q04pr5e1%67V{s+nV8M{AN>%=LHsK{)Ng$q4&kq37|>yRYXWfC`aegYpZr!XrbXvK??7so#Ztj8y?DspI@ zF5CU%SnWQJw+G)yZrfg8M6?FVcGje|p<&Ftlm0E`+R@5AQOQGJpfX~Dj9;kHA?J&P=znEGkPN6b!pixmgJRcLVM;{07w{N~!<= delta 1016 zcma)4-%C?b9KYw>ZEkuuuX8$o%v`$3T4q~`2AWPcWt!neDk5qG5eP*HH?WYhw}K_@ zejl`Y@;>#@gX}y9fqRGo4eBv_>JR8)FG9J#U%kWSQwKhLzu(XKoG+jAJ!fr`uWj;| z5kHsArAks4rc@smi$!8(gcz#aW;&l>=V7bcZ-1S#0U8huw0uKW9MW}HF zK$A195}3vN#DTOOQH`K}6&M>4B&B7;+>NlBoY#y^7-MEmtzC#_L<55Q&}zk;;#o7c zn=ybfi0F_c*sv_9btX^RD$KL#-@5ItHP)N{=7nY34W$!FGD!mRFABC0%g(EjIFf#Z z&)g&dEjmE4ri@oG&!#=THj}$(#*$kaQZ^lcZTqZ)TqF>OqQ=o{g=E93LKmbK)b`ke zYl_)vJS7G+{}gpV(A z;-K*ww~#~FT4{v{cY@}dvY#tIUhwTXB?~h2bR~b*bu2vMAXve5*N&4hEKl7?VL4x1 zh8;NyT5AgOY6SaRm<$JXpN`l<{UpR)QR^t4-G_(XajG06SRH*(xOKHwsQtf~5#V|t zq0s!ph>``+y1yJvp!5jGzcH9GLR@c4K*AFd+Q17Y*lLj(U0k2bEA&HK%6f>xT#8$q z$ei52FQbRY{0nb_Kl-Ba=f1c1?+ksO*xY+{eb5~mZGU&TwA)ktb4DzMH<)pS8=YMD zC++30AT%|@j2JftxG~IgO>qYC=zAl + + 9, 21 + AAABAAkAEBAAAAEAIABoBAAAlgAAABgYAAABACAAiAkAAP4EAAAgIAAAAQAgAKgQAACGDgAAMDAAAAEA diff --git a/m18gui.py b/m18gui.py new file mode 100644 index 0000000..5eac978 --- /dev/null +++ b/m18gui.py @@ -0,0 +1,410 @@ +"""Tkinter-based GUI wrapper around the :mod:`m18` protocol module.""" + +import sys, subprocess, threading, io, time, traceback, tkinter as tk +from tkinter import ttk, messagebox + +def ensure_module(mod_name, pip_name): + """Import ``mod_name``, installing ``pip_name`` via pip if missing.""" + try: __import__(mod_name) + except ImportError: + root = tk.Tk(); root.title("Installing dependencies") + ttk.Label(root, text=f"Installing {pip_name}…").pack(padx=6, pady=6) + pb = ttk.Progressbar(root, mode="indeterminate"); pb.pack(fill="x", padx=6, pady=(0, 6)); pb.start(12) + root.update_idletasks() + subprocess.check_call([sys.executable, "-m", "pip", "install", pip_name], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + pb.stop(); root.destroy() + try: __import__(mod_name) + except ImportError: messagebox.showerror("Error", f"Installed {pip_name} but cannot import."); sys.exit(1) +ensure_module("serial", "pyserial") +from serial.tools import list_ports +import m18 + +class M18GUI(tk.Tk): + """Simple desktop interface for performing common M18 operations.""" + def __init__(self): + super().__init__() + self.title("M18 Protocol GUI") + self.geometry("610x370") + self.resizable(False, False) + self.m18_obj = None + self.sim_thread = None + self.sim_stop_event = None + self.sim_profiles = {"Gentle": (150, 2500), "Normal": (300, 6000), "Aggressive": (450, 9000)} + self.custom_cutoff_raw_var = tk.StringVar(value="300") + self.custom_cutoff_amps_var = tk.StringVar(value="0.30") + self.custom_max_raw_var = tk.StringVar(value="6000") + self.custom_max_amps_var = tk.StringVar(value="6.00") + self._sync_in_progress = False + self.port_map = {} + self.create_widgets() + self.refresh_ports() + self.update_profile_display() + + def create_widgets(self): + """Build all tabs, controls, and shared output areas.""" + self.notebook = ttk.Notebook(self); self.notebook.pack(fill="both", expand=True, padx=0, pady=0) + self.main_tab, self.console_tab, self.sim_tab, self.about_tab = (ttk.Frame(self.notebook) for _ in range(4)) + self.notebook.add(self.main_tab, text="Main Controls"); self.notebook.add(self.console_tab, text="Interactive Console") + self.notebook.add(self.sim_tab, text="Simulation"); self.notebook.add(self.about_tab, text="About") + + # Main Controls + top = ttk.Frame(self.main_tab); top.pack(fill="x", padx=5, pady=(4,1)) + ttk.Label(top, text="Serial port:").grid(row=0, column=0, sticky="w") + self.port_var = tk.StringVar() + self.port_combo = ttk.Combobox(top, textvariable=self.port_var, state="readonly", width=40); self.port_combo.grid(row=0, column=1, padx=2, sticky="w") + ttk.Button(top, text="Refresh", width=7, command=self.refresh_ports).grid(row=0, column=2, padx=2) + self.connect_btn = ttk.Button(top, text="Connect", width=7, command=self.connect_device); self.connect_btn.grid(row=0, column=3, padx=2) + self.disconnect_btn = ttk.Button(top, text="Disconnect", width=9, command=self.disconnect_device, state="disabled"); self.disconnect_btn.grid(row=0, column=4, padx=2) + self.status_var = tk.StringVar(value="Not connected") + ttk.Label(top, textvariable=self.status_var).grid(row=1, column=0, columnspan=5, sticky="w", pady=(2,0)) + cmds = ttk.LabelFrame(self.main_tab, text="Commands"); cmds.pack(fill="x", padx=5, pady=(3,1)) + self.idle_btn = ttk.Button(cmds, text="Idle (TX low, safe to connect)", width=25, command=self.cmd_idle, state="disabled"); self.idle_btn.grid(row=0, column=0, padx=2, pady=2) + self.health_btn = ttk.Button(cmds, text="Health report", width=15, command=self.cmd_health, state="disabled"); self.health_btn.grid(row=0, column=1, padx=2, pady=2) + self.clipboard_btn = ttk.Button(cmds, text="Copy all registers to clipboard", width=28, command=self.cmd_clipboard, state="disabled"); self.clipboard_btn.grid(row=0, column=2, padx=2, pady=2) + # Output (only on non-About tabs) + self.bottom_frame = ttk.LabelFrame(self, text="Output"); self.bottom_frame.pack(fill="x", padx=5, pady=(0,4), side="bottom") + self.output_text = tk.Text(self.bottom_frame, wrap="word", height=6, font=("Consolas", 9)); self.output_text.pack(fill="both", expand=True, padx=2, pady=2) + scrollbar = ttk.Scrollbar(self.bottom_frame, orient="vertical", command=self.output_text.yview); scrollbar.pack(side="right", fill="y") + self.output_text.configure(yscrollcommand=scrollbar.set) + def on_tab_changed(event): + tab = event.widget.tab(event.widget.select(), "text") + if tab == "About": self.bottom_frame.pack_forget() + else: self.bottom_frame.pack(fill="x", padx=5, pady=(0,4), side="bottom") + self.notebook.bind("<>", on_tab_changed) + + # Console Tab + c_frame = ttk.Frame(self.console_tab); c_frame.pack(fill="both", expand=True, padx=4, pady=2) + ttk.Label(c_frame, text="Python console. Use 'm' for M18 object.").pack(anchor="w", pady=(0,1)) + self.console_text = tk.Text(c_frame, height=4, wrap="none", font=("Consolas",9)); self.console_text.pack(fill="x", padx=1, pady=(0,1)) + c_btns = ttk.Frame(c_frame); c_btns.pack(fill="x") + ttk.Button(c_btns, text="Execute", width=10, command=self.run_console_code).pack(side="left", padx=3) + ttk.Button(c_btns, text="Clear", width=7, command=lambda: self.console_text.delete("1.0", tk.END)).pack(side="left", padx=3) + + # Simulation Tab + s_frame = ttk.Frame(self.sim_tab); s_frame.pack(fill="both", padx=4, pady=1) + ttk.Label(s_frame, text="Simulation duration (sec):").grid(row=0, column=0, sticky="w", padx=2) + self.sim_duration_var = tk.StringVar(value="60") + ttk.Entry(s_frame, textvariable=self.sim_duration_var, width=5).grid(row=0, column=1, sticky="w", padx=2) + ttk.Label(s_frame, text="Sim baudrate (concept):").grid(row=1, column=0, sticky="w", padx=2) + self.sim_baud_var = tk.StringVar(value="4800") + ttk.Combobox(s_frame, textvariable=self.sim_baud_var, state="readonly", width=8, values=["1200","2400","4800","9600"]).grid(row=1, column=1, sticky="w", padx=2) + ttk.Label(s_frame, text="UART to pack always runs at 4800 baud.\nNo real charging current flows from USB.").grid(row=2, column=0, columnspan=2, sticky="w", padx=2, pady=(0,6)) + ttk.Label(s_frame, text="Charger profile:").grid(row=3, column=0, sticky="w", padx=2) + self.sim_profile_var = tk.StringVar(value="Normal") + profs = list(self.sim_profiles.keys())+["Custom"] + prof_box = ttk.Combobox(s_frame, textvariable=self.sim_profile_var, state="readonly", width=10, values=profs) + prof_box.grid(row=3, column=1, sticky="w", padx=2) + prof_box.bind("<>", self.on_profile_changed) + self.profile_info_var = tk.StringVar() + ttk.Label(s_frame, textvariable=self.profile_info_var, foreground="blue").grid(row=4, column=0, columnspan=2, sticky="w", padx=2, pady=(0,2)) + self.sim_status_var = tk.StringVar(value="Simulation idle. Connect to a battery to enable.") + ttk.Label(s_frame, textvariable=self.sim_status_var).grid(row=5, column=0, columnspan=2, sticky="w", padx=2) + self.sim_start_btn = ttk.Button(s_frame, text="Start simulation", width=15, command=self.start_simulation, state="disabled") + self.sim_start_btn.grid(row=6, column=0, padx=2, pady=2) + self.sim_stop_btn = ttk.Button(s_frame, text="Stop simulation", width=15, command=self.stop_simulation, state="disabled") + self.sim_stop_btn.grid(row=6, column=1, padx=2, pady=2) + + # About Tab + import webbrowser + a_frame = ttk.Frame(self.about_tab) + a_frame.place(relx=0.5, rely=0.09, anchor="n") + ttk.Label(a_frame, text="M18 Protocol GUI", font=("Segoe UI", 15, "bold")).pack(pady=(0,1)) + ttk.Label(a_frame, text="Core protocol by Martin Jansson", font=("Segoe UI", 9, "italic")).pack(pady=(5,0)) + link2 = ttk.Label(a_frame, text="Original: https://github.com/mnh-jansson/m18-protocol", foreground="blue", cursor="hand2"); link2.pack() + link2.bind("", lambda e: webbrowser.open("https://github.com/mnh-jansson/m18-protocol")) + ttk.Label(a_frame, text="Developed by KillaVolt", font=("Segoe UI", 9)).pack() + link = ttk.Label(a_frame, text="GitHub Profile: https://github.com/KillaVolt", foreground="blue", cursor="hand2"); link.pack() + link.bind("", lambda e: webbrowser.open("https://github.com/KillaVolt")) + + table = ttk.Treeview(a_frame, columns=("addr", "desc"), show="headings", height=8) + table.heading("addr", text="Hex Addr"); table.heading("desc", text="Meaning") + table.column("addr", width=65, anchor="center"); table.column("desc", width=150, anchor="w"); table.pack() + for addr, desc in [("F85D","1: Command"),("F85E","4: Access"),("F85F","3: Length"),("F860","Address?"),("F861","Address?"),("F862","Length?"),("F863","N/A"),("F864","Checksum")]: + table.insert("", "end", values=(addr,desc)) + + # -------- Utility / Port / Logging ---------- + def log(self, text, clear=False): + """Append ``text`` to the shared output area, optionally clearing it.""" + self.output_text.delete("1.0", tk.END) if clear else None; self.output_text.insert(tk.END, text + "\n"); self.output_text.see(tk.END) + + def sim_log(self, text): + """Prefix simulation messages to distinguish them in the log area.""" + self.log(f"[SIM] {text}") + + def set_status(self, text): + """Update the status label at the top of the UI.""" + self.status_var.set(text) + + def refresh_ports(self): + """Enumerate available serial ports and repopulate the dropdown.""" + ports = list_ports.comports(); names = []; self.port_map.clear() + for p in ports: + label = f"{p.device} — {p.description} ({getattr(p,'manufacturer','') or ''})".strip() + names.append(label); self.port_map[label] = p.device + self.port_combo["values"] = names; self.port_combo.current(0) if names else self.port_combo.set("") + self.set_status("Ports refreshed") + + def require_connection(self): + """Warn the user if no device is connected before running an action.""" + if self.m18_obj is None: messagebox.showwarning("Not connected", "Please connect to a port first."); return False + return True + + def capture_output(self, func, *a, **k): + """Run ``func`` while capturing stdout into a string.""" + buf, old = io.StringIO(), sys.stdout + try: sys.stdout = buf; func(*a, **k) + finally: sys.stdout = old + return buf.getvalue() + + # --------- Connect/Disconnect ----------- + def connect_device(self): + """Instantiate :class:`m18.M18` using the selected serial port.""" + sel = self.port_var.get() + port = self.port_map.get(sel, sel) + try: self.m18_obj = m18.M18(port) + except Exception as e: + self.m18_obj = None; messagebox.showerror("Connection error", f"Failed to connect to {port}.\n\n{e}") + self.set_status("Connection failed"); return + self.set_status(f"Connected to {port}"); self.log(f"Connected to {port}", clear=True) + for b in [self.connect_btn]: b.configure(state="disabled") + for b in [self.disconnect_btn, self.idle_btn, self.health_btn, self.clipboard_btn, self.sim_start_btn]: b.configure(state="normal") + + def disconnect_device(self): + """Return the pack to idle, close the port, and reset UI state.""" + self.stop_simulation() + if self.m18_obj: + try: self.m18_obj.idle() + except: pass + try: self.m18_obj.port.close() + except: pass + self.m18_obj = None + self.set_status("Disconnected"); self.log("Disconnected") + for b in [self.connect_btn]: b.configure(state="normal") + for b in [self.disconnect_btn, self.idle_btn, self.health_btn, self.clipboard_btn, self.sim_start_btn, self.sim_stop_btn]: b.configure(state="disabled") + + # ----------- Command Handlers ----------- + def cmd_idle(self): + """Invoke ``idle`` on the connected device in a worker thread.""" + if not self.require_connection(): return + def work(): + try: + self.m18_obj.idle() + self.after(0, lambda: self.log("TX now low (<1V). Safe to connect battery.")) + self.after(0, lambda: self.set_status("Idle (TX low)")) + except Exception as e: + self.after(0, lambda: messagebox.showerror("Idle error", str(e))) + threading.Thread(target=work, daemon=True).start() + + def cmd_health(self): + """Run ``health`` and display captured output.""" + if not self.require_connection(): return + def work(): + try: + output = self.capture_output(self.m18_obj.health) + def finish(): + self.log("=== Health report ===", clear=True) + self.log(output) + self.set_status("Health report complete") + self.after(0, finish) + except Exception as e: + self.after(0, lambda: messagebox.showerror("Health error", str(e))) + threading.Thread(target=work, daemon=True).start() + + def cmd_clipboard(self): + """Copy all register values to the clipboard.""" + if not self.require_connection(): return + def work(): + try: + output = self.capture_output(self.m18_obj.read_id, None, True, "raw") + def finish(): + self.clipboard_clear() + self.clipboard_append(output) + self.log("Register data copied to clipboard") + self.after(0, finish) + except Exception as e: + self.after(0, lambda: messagebox.showerror("Clipboard error", str(e))) + threading.Thread(target=work, daemon=True).start() + + # ---------- Interactive Console ---------- + def run_console_code(self): + """Execute arbitrary Python with the M18 object available as ``m``.""" + code = self.console_text.get("1.0", tk.END).strip() + if not code: messagebox.showinfo("No code", "Please enter some code."); return + if not self.require_connection(): return + def work(): + buf = io.StringIO(); old_stdout, old_stderr = sys.stdout, sys.stderr + sys.stdout = sys.stderr = buf + try: + env = {"m": self.m18_obj} + try: exec(code, env, {}) + except Exception: traceback.print_exc() + finally: sys.stdout, sys.stderr = old_stdout, old_stderr + output = buf.getvalue() + def finish(): + self.log("=== Console execution ===") + self.log(output if output.strip() else "(no output)") + self.after(0, finish) + threading.Thread(target=work, daemon=True).start() + + # ---------- Profile Display ---------- + def on_profile_changed(self, event=None): self.update_profile_display() + def update_profile_display(self): + """Show human readable info about the selected simulation profile.""" + p = self.sim_profile_var.get() + if p in self.sim_profiles: + c, m = self.sim_profiles[p] + info = f"Profile '{p}': Cutoff {c} ({c/1000:.2f}A), Max {m} ({m/1000:.2f}A). Simulation only." + self.profile_info_var.set(info) + else: self.profile_info_var.set("Custom profile: adjust fields below.") + def get_profile_currents(self): + """Return cutoff and max currents based on profile or custom fields.""" + p = self.sim_profile_var.get() + if p in self.sim_profiles: return self.sim_profiles[p] + try: + c = int(self.custom_cutoff_raw_var.get()) + m = int(self.custom_max_raw_var.get()) + if c < 0 or m <= 0 or c > 20000 or m > 20000: raise ValueError + except: raise ValueError("Invalid custom values.") + return c, m + + # ---------- Simulation ---------- + def start_simulation(self): + """Spawn a background thread to perform the charging dialogue.""" + if not self.require_connection(): return + if self.sim_thread and self.sim_thread.is_alive(): + messagebox.showinfo("Running", "Simulation already running."); return + try: + duration = float(self.sim_duration_var.get()) + if duration <= 0: raise ValueError + except: messagebox.showwarning("Invalid duration", "Enter a positive number."); return + sim_baud = self.sim_baud_var.get() + interval_map = {"1200": 1.0, "2400": 0.75, "4800": 0.5, "9600": 0.25} + keepalive_interval = interval_map.get(sim_baud, 0.5) + try: + cutoff, maxc = self.get_profile_currents() + except Exception as e: + messagebox.showwarning("Profile error", str(e)) + return + + pname = self.sim_profile_var.get() + + self.sim_stop_event = threading.Event() + self.sim_thread = threading.Thread( + target=self._simulation_worker, + args=( + duration, + keepalive_interval, + pname, + cutoff, + cutoff / 1000.0, + maxc, + maxc / 1000.0, + ), + daemon=True, + ) + self.sim_thread.start() + + self.sim_start_btn.configure(state="disabled") + self.sim_stop_btn.configure(state="normal") + self.sim_status_var.set(f"Simulation running ({pname}, baud {sim_baud})") + + self.sim_log( + f"Start {duration}s | {pname} | " + f"cutoff={cutoff} ({cutoff/1000:.2f}A) | " + f"max={maxc} ({maxc/1000:.2f}A) | " + f"interval={keepalive_interval:.2f}s" + ) + + def stop_simulation(self): + """Signal the simulation worker to exit.""" + if self.sim_stop_event: + self.sim_stop_event.set() + + def _simulation_worker( + self, + duration, + interval, + pname, + cutoff_raw, + cutoff_amps, + max_raw, + max_amps, + ): + """Perform the scripted keepalive dialogue for the configured duration.""" + m = self.m18_obj + if m is None: + self.after( + 0, + lambda: messagebox.showerror( + "Simulation error", "No active M18 connection." + ), + ) + return + + old_cutoff = getattr(m, "CUTOFF_CURRENT", None) + old_max = getattr(m, "MAX_CURRENT", None) + + m.CUTOFF_CURRENT = cutoff_raw + m.MAX_CURRENT = max_raw + + start_time = time.time() + + try: + self.after(0, lambda: self.sim_log("Resetting and negotiating charger state...")) + + try: + m.reset() + except Exception as e: + self.after(0, lambda: self.sim_log(f"reset() failed: {e}")) + return + + try: + m.configure(2) + m.get_snapchat() + time.sleep(0.6) + m.keepalive() + m.configure(1) + m.get_snapchat() + except Exception as e: + self.after(0, lambda: self.sim_log(f"Initial negotiation failed: {e}")) + return + + while not self.sim_stop_event.is_set(): + elapsed = time.time() - start_time + if elapsed >= duration: + break + + try: + time.sleep(interval) + m.keepalive() + self.after( + 0, + lambda e=elapsed: self.sim_log(f"Keepalive t={e:.1f}s"), + ) + except Exception as e: + self.after(0, lambda: self.sim_log(f"keepalive() failed: {e}")) + break + + finally: + try: + m.idle() + except Exception: + pass + + if old_cutoff is not None: + m.CUTOFF_CURRENT = old_cutoff + if old_max is not None: + m.MAX_CURRENT = old_max + + def finish(): + self.sim_log("Simulation finished. Returned to idle.") + self.sim_status_var.set("Simulation idle.") + self.sim_start_btn.configure(state="normal") + self.sim_stop_btn.configure(state="disabled") + + self.after(0, finish) + + +if __name__ == "__main__": + app = M18GUI() + app.mainloop() diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs index 37fe491..62307a0 100644 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs @@ -14,7 +14,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("M18BatteryInfo")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+895037738ec107b30188ac80245b859c86532812")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0a5d3c4d0eb780ade68cf7a694f3b2e199d7dddc")] [assembly: System.Reflection.AssemblyProductAttribute("M18BatteryInfo")] [assembly: System.Reflection.AssemblyTitleAttribute("M18BatteryInfo")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache index a80ec30..7f4d625 100644 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache +++ b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache @@ -1 +1 @@ -d09d337c3421e669f5cf3b760d4f1e938dcac62817e9a66708905e6530f4cee3 +c7598f277efecde557b65eedbc6f145bd375238436ffe7a6e633d539e65c5a74 From d09bc169aee90686c93be486f051b0d7d751ae92 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 12:00:19 -0500 Subject: [PATCH 09/61] Add helper to run python script --- PythonScriptRunner.cs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 PythonScriptRunner.cs diff --git a/PythonScriptRunner.cs b/PythonScriptRunner.cs new file mode 100644 index 0000000..ee660ef --- /dev/null +++ b/PythonScriptRunner.cs @@ -0,0 +1,38 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Text; + +namespace M18BatteryInfo +{ + public static class PythonScriptRunner + { + public static string RunPythonScript(string arguments) + { + var scriptPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "m18.py"); + + var startInfo = new ProcessStartInfo + { + FileName = "python", + Arguments = $"\"{scriptPath}\" {arguments}".Trim(), + WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + using var process = new Process { StartInfo = startInfo }; + var outputBuilder = new StringBuilder(); + + process.Start(); + + outputBuilder.Append(process.StandardOutput.ReadToEnd()); + outputBuilder.Append(process.StandardError.ReadToEnd()); + + process.WaitForExit(); + + return outputBuilder.ToString(); + } + } +} From d9ee17e82cf9de7f7ad8d67b9124100f83be8517 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 12:09:23 -0500 Subject: [PATCH 10/61] Add verbose serial port management --- M18AnalyzerMain.cs | 232 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 202 insertions(+), 30 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index a178ee6..aa8310e 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -1,14 +1,22 @@ -namespace M18BatteryInfo -{ - public partial class frmMain : Form - { - public frmMain() - { - InitializeComponent(); - } - - private void toolStripButton1_Click(object sender, EventArgs e) - { +using System.IO.Ports; + +namespace M18BatteryInfo +{ + public partial class frmMain : Form + { + private SerialPort? _serialPort; + + public frmMain() + { + InitializeComponent(); + + btnRefresh.Click += btnRefresh_Click; + btnConnect.Click += btnConnect_Click; + btnDisconnect.Click += btnDisconnect_Click; + } + + private void toolStripButton1_Click(object sender, EventArgs e) + { } @@ -17,29 +25,193 @@ private void toolTipReset_Popup(object sender, PopupEventArgs e) } - private void frmMain_Load(object sender, EventArgs e) - { + private void frmMain_Load(object sender, EventArgs e) + { + RefreshSerialPorts(); + } - } - - private void lblResponseLength_Click(object sender, EventArgs e) - { - - } + private void lblResponseLength_Click(object sender, EventArgs e) + { + + } private void pictureBox1_Click(object sender, EventArgs e) { } - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - - } - - private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) - { - - } - } -} + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + + } + + private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) + { + + } + + private void btnRefresh_Click(object? sender, EventArgs e) + { + RefreshSerialPorts(); + } + + private void RefreshSerialPorts() + { + AppendLog("Refreshing serial port list..."); + + try + { + var portDescriptions = GetPortDescriptions(); + var portNames = SerialPort.GetPortNames().OrderBy(port => port, StringComparer.OrdinalIgnoreCase).ToList(); + + cmbBxSerialPort.Items.Clear(); + + foreach (var port in portNames) + { + portDescriptions.TryGetValue(port, out var description); + cmbBxSerialPort.Items.Add(new SerialPortDisplay(port, description)); + AppendLog($"Found port {port}{(string.IsNullOrWhiteSpace(description) ? string.Empty : $" - {description}")}"); + } + + if (portNames.Count == 0) + { + AppendLog("No serial ports detected."); + } + else + { + cmbBxSerialPort.SelectedIndex = 0; + } + } + catch (Exception ex) + { + LogError("Error while refreshing serial ports", ex); + } + } + + private void btnConnect_Click(object? sender, EventArgs e) + { + if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) + { + AppendLog("No serial port selected. Please choose a port before connecting."); + MessageBox.Show("Please select a serial port before connecting.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + if (_serialPort?.IsOpen == true) + { + if (string.Equals(_serialPort.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) + { + AppendLog($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); + MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + AppendLog($"A different port ({_serialPort.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); + btnDisconnect_Click(sender, e); + } + + AppendLog($"Attempting to open {selectedPort} with settings: 4800 baud, 8 data bits, parity None, stop bits One, handshake None."); + + _serialPort = new SerialPort(selectedPort.PortName, 4800, Parity.None, 8, StopBits.One) + { + Handshake = Handshake.None, + ReadTimeout = 500, + WriteTimeout = 500 + }; + + try + { + _serialPort.Open(); + AppendLog($"{selectedPort} opened successfully."); + } + catch (Exception ex) + { + LogError($"Failed to open {selectedPort}.", ex); + } + } + + private void btnDisconnect_Click(object? sender, EventArgs e) + { + if (_serialPort == null || !_serialPort.IsOpen) + { + AppendLog("Disconnect requested, but no serial port is currently open."); + MessageBox.Show("No serial port is currently open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + AppendLog($"Closing {_serialPort.PortName}..."); + + try + { + _serialPort.Close(); + AppendLog($"{_serialPort.PortName} closed successfully."); + } + catch (Exception ex) + { + LogError($"Error while closing {_serialPort.PortName}.", ex); + } + finally + { + _serialPort.Dispose(); + _serialPort = null; + } + } + + private Dictionary GetPortDescriptions() + { + var descriptions = new Dictionary(StringComparer.OrdinalIgnoreCase); + + try + { + using var searcher = new System.Management.ManagementObjectSearcher("SELECT Caption, DeviceID FROM Win32_PnPEntity WHERE Caption LIKE 'COM%' OR DeviceID LIKE 'COM%'"); + foreach (var obj in searcher.Get().OfType()) + { + var caption = obj["Caption"]?.ToString(); + var deviceId = obj["DeviceID"]?.ToString(); + + if (string.IsNullOrWhiteSpace(caption) && string.IsNullOrWhiteSpace(deviceId)) + { + continue; + } + + var combined = caption ?? deviceId ?? string.Empty; + var match = System.Text.RegularExpressions.Regex.Match(combined, @"\((COM\d+)\)"); + var portName = match.Success ? match.Groups[1].Value : SerialPort.GetPortNames().FirstOrDefault(name => combined.Contains(name, StringComparison.OrdinalIgnoreCase)); + + if (!string.IsNullOrWhiteSpace(portName) && !descriptions.ContainsKey(portName)) + { + descriptions[portName] = caption ?? deviceId ?? portName; + } + } + } + catch (Exception ex) + { + LogError("Failed to read port descriptions.", ex); + } + + return descriptions; + } + + private void AppendLog(string message) + { + var formattedMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}" + Environment.NewLine; + rtbOutput.AppendText(formattedMessage); + rtbOutput.ScrollToCaret(); + } + + private void LogError(string context, Exception exception) + { + var fullMessage = $"{context} Error details: {exception}"; + AppendLog(fullMessage); + MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + private sealed record SerialPortDisplay(string PortName, string? Description) + { + public override string ToString() + { + return string.IsNullOrWhiteSpace(Description) ? PortName : $"{PortName} - {Description}"; + } + } + } +} From 8820ac72d9a360c55caca9fbc62734e4d19ef38a Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 12:33:31 -0500 Subject: [PATCH 11/61] Add output separator to serial logs --- M18AnalyzerMain.cs | 233 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 203 insertions(+), 30 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index a178ee6..07f0c7a 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -1,14 +1,22 @@ -namespace M18BatteryInfo -{ - public partial class frmMain : Form - { - public frmMain() - { - InitializeComponent(); - } - - private void toolStripButton1_Click(object sender, EventArgs e) - { +using System.IO.Ports; + +namespace M18BatteryInfo +{ + public partial class frmMain : Form + { + private SerialPort? _serialPort; + + public frmMain() + { + InitializeComponent(); + + btnRefresh.Click += btnRefresh_Click; + btnConnect.Click += btnConnect_Click; + btnDisconnect.Click += btnDisconnect_Click; + } + + private void toolStripButton1_Click(object sender, EventArgs e) + { } @@ -17,29 +25,194 @@ private void toolTipReset_Popup(object sender, PopupEventArgs e) } - private void frmMain_Load(object sender, EventArgs e) - { + private void frmMain_Load(object sender, EventArgs e) + { + RefreshSerialPorts(); + } - } - - private void lblResponseLength_Click(object sender, EventArgs e) - { - - } + private void lblResponseLength_Click(object sender, EventArgs e) + { + + } private void pictureBox1_Click(object sender, EventArgs e) { } - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - - } - - private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) - { - - } - } -} + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + + } + + private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) + { + + } + + private void btnRefresh_Click(object? sender, EventArgs e) + { + RefreshSerialPorts(); + } + + private void RefreshSerialPorts() + { + AppendLog("Refreshing serial port list..."); + + try + { + var portDescriptions = GetPortDescriptions(); + var portNames = SerialPort.GetPortNames().OrderBy(port => port, StringComparer.OrdinalIgnoreCase).ToList(); + + cmbBxSerialPort.Items.Clear(); + + foreach (var port in portNames) + { + portDescriptions.TryGetValue(port, out var description); + cmbBxSerialPort.Items.Add(new SerialPortDisplay(port, description)); + AppendLog($"Found port {port}{(string.IsNullOrWhiteSpace(description) ? string.Empty : $" - {description}")}"); + } + + if (portNames.Count == 0) + { + AppendLog("No serial ports detected."); + } + else + { + cmbBxSerialPort.SelectedIndex = 0; + } + } + catch (Exception ex) + { + LogError("Error while refreshing serial ports", ex); + } + } + + private void btnConnect_Click(object? sender, EventArgs e) + { + if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) + { + AppendLog("No serial port selected. Please choose a port before connecting."); + MessageBox.Show("Please select a serial port before connecting.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + if (_serialPort?.IsOpen == true) + { + if (string.Equals(_serialPort.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) + { + AppendLog($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); + MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + AppendLog($"A different port ({_serialPort.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); + btnDisconnect_Click(sender, e); + } + + AppendLog($"Attempting to open {selectedPort} with settings: 4800 baud, 8 data bits, parity None, stop bits One, handshake None."); + + _serialPort = new SerialPort(selectedPort.PortName, 4800, Parity.None, 8, StopBits.One) + { + Handshake = Handshake.None, + ReadTimeout = 500, + WriteTimeout = 500 + }; + + try + { + _serialPort.Open(); + AppendLog($"{selectedPort} opened successfully."); + } + catch (Exception ex) + { + LogError($"Failed to open {selectedPort}.", ex); + } + } + + private void btnDisconnect_Click(object? sender, EventArgs e) + { + if (_serialPort == null || !_serialPort.IsOpen) + { + AppendLog("Disconnect requested, but no serial port is currently open."); + MessageBox.Show("No serial port is currently open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + AppendLog($"Closing {_serialPort.PortName}..."); + + try + { + _serialPort.Close(); + AppendLog($"{_serialPort.PortName} closed successfully."); + } + catch (Exception ex) + { + LogError($"Error while closing {_serialPort.PortName}.", ex); + } + finally + { + _serialPort.Dispose(); + _serialPort = null; + } + } + + private Dictionary GetPortDescriptions() + { + var descriptions = new Dictionary(StringComparer.OrdinalIgnoreCase); + + try + { + using var searcher = new System.Management.ManagementObjectSearcher("SELECT Caption, DeviceID FROM Win32_PnPEntity WHERE Caption LIKE 'COM%' OR DeviceID LIKE 'COM%'"); + foreach (var obj in searcher.Get().OfType()) + { + var caption = obj["Caption"]?.ToString(); + var deviceId = obj["DeviceID"]?.ToString(); + + if (string.IsNullOrWhiteSpace(caption) && string.IsNullOrWhiteSpace(deviceId)) + { + continue; + } + + var combined = caption ?? deviceId ?? string.Empty; + var match = System.Text.RegularExpressions.Regex.Match(combined, @"\((COM\d+)\)"); + var portName = match.Success ? match.Groups[1].Value : SerialPort.GetPortNames().FirstOrDefault(name => combined.Contains(name, StringComparison.OrdinalIgnoreCase)); + + if (!string.IsNullOrWhiteSpace(portName) && !descriptions.ContainsKey(portName)) + { + descriptions[portName] = caption ?? deviceId ?? portName; + } + } + } + catch (Exception ex) + { + LogError("Failed to read port descriptions.", ex); + } + + return descriptions; + } + + private void AppendLog(string message) + { + var formattedMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; + var entry = $"====== OUTPUT ======{Environment.NewLine}{formattedMessage}{Environment.NewLine}"; + rtbOutput.AppendText(entry); + rtbOutput.ScrollToCaret(); + } + + private void LogError(string context, Exception exception) + { + var fullMessage = $"{context} Error details: {exception}"; + AppendLog(fullMessage); + MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + private sealed record SerialPortDisplay(string PortName, string? Description) + { + public override string ToString() + { + return string.IsNullOrWhiteSpace(Description) ? PortName : $"{PortName} - {Description}"; + } + } + } +} From 594cdc71ce5658388c9f7e6f4bc7727559b94183 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 12:41:47 -0500 Subject: [PATCH 12/61] Updated .gitignore --- .gitignore | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 5fed8e3..0f6b387 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,46 @@ -# Python cache +# Build results +bin/ +obj/ +*.exe +*.dll +*.pdb + +# VS temporary files +.vs/ +*.suo +*.user +*.userosscache +*.sln.docstates + +# VS Code workspace +.vscode/ + +# Backup and cache +*.cache +*.dbmdl +*.bak +*.log +*.tlog + +# Project-specific +*.ncb +*.sdf +*.opensdf +*.VC.db + +# Others you mentioned +*.dtbcache.v2 +*.futdcache.v2 +*.suo +*.DocumentLayout* +*.metadata.* +*.projects.* +*.strings.* +M18Batte.C072E897.Up2Date +TempPE/ + +# System __pycache__/ -.vs/ \ No newline at end of file +runtimes/ +System.IO.Ports.dll +System.Management.dll From 9f53eb3819aa1146200bbd06ce141bb83026c1c0 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 12:43:25 -0500 Subject: [PATCH 13/61] Clean up build artifacts and update .gitignore --- .../ColorByRegexConfig.txt | 10 - .../DesignTimeBuild/.dtbcache.v2 | Bin 115379 -> 0 bytes .vs/M18BatteryInfo.slnx/v18/.futdcache.v2 | Bin 104 -> 0 bytes .vs/M18BatteryInfo.slnx/v18/.suo | Bin 35840 -> 0 bytes .../v18/DocumentLayout.backup.json | 40 -- .../v18/DocumentLayout.json | 40 -- .../m18batteryinfo.metadata.v10.bin | Bin 1493 -> 0 bytes .../m18batteryinfo.projects.v10.bin | Bin 54936 -> 0 bytes .../m18batteryinfo.strings.v10.bin | Bin 136740 -> 0 bytes .../net10.0-windows/M18BatteryInfo.deps.json | 23 -- bin/Debug/net10.0-windows/M18BatteryInfo.dll | Bin 234496 -> 0 bytes bin/Debug/net10.0-windows/M18BatteryInfo.exe | Bin 162304 -> 0 bytes bin/Debug/net10.0-windows/M18BatteryInfo.pdb | Bin 17380 -> 0 bytes .../M18BatteryInfo.runtimeconfig.json | 19 - ...oreApp,Version=v10.0.AssemblyAttributes.cs | 4 - .../M18BatteryInfo.AssemblyInfo.cs | 25 -- .../M18BatteryInfo.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 24 -- .../M18BatteryInfo.GlobalUsings.g.cs | 10 - ...BatteryInfo.Properties.Resources.resources | Bin 180 -> 0 bytes .../M18BatteryInfo.assets.cache | Bin 230 -> 0 bytes ...8BatteryInfo.csproj.BuildWithSkipAnalyzers | 0 ...BatteryInfo.csproj.CoreCompileInputs.cache | 1 - ...M18BatteryInfo.csproj.FileListAbsolute.txt | 18 - ...8BatteryInfo.csproj.GenerateResource.cache | Bin 188 -> 0 bytes .../M18BatteryInfo.designer.deps.json | 11 - ...M18BatteryInfo.designer.runtimeconfig.json | 25 -- obj/Debug/net10.0-windows/M18BatteryInfo.dll | Bin 234496 -> 0 bytes .../M18BatteryInfo.frmMain.resources | Bin 207566 -> 0 bytes .../M18BatteryInfo.genruntimeconfig.cache | 1 - obj/Debug/net10.0-windows/M18BatteryInfo.pdb | Bin 17380 -> 0 bytes .../M18BatteryInfo.sourcelink.json | 1 - obj/Debug/net10.0-windows/apphost.exe | Bin 162304 -> 0 bytes .../net10.0-windows/ref/M18BatteryInfo.dll | Bin 6144 -> 0 bytes .../net10.0-windows/refint/M18BatteryInfo.dll | Bin 6144 -> 0 bytes obj/M18BatteryInfo.csproj.nuget.dgspec.json | 367 ----------------- obj/M18BatteryInfo.csproj.nuget.g.props | 16 - obj/M18BatteryInfo.csproj.nuget.g.targets | 2 - obj/project.assets.json | 373 ------------------ obj/project.nuget.cache | 8 - 40 files changed, 1019 deletions(-) delete mode 100644 .vs/M18BatteryInfo.slnx/ColorByRegexConfig.txt delete mode 100644 .vs/M18BatteryInfo.slnx/DesignTimeBuild/.dtbcache.v2 delete mode 100644 .vs/M18BatteryInfo.slnx/v18/.futdcache.v2 delete mode 100644 .vs/M18BatteryInfo.slnx/v18/.suo delete mode 100644 .vs/M18BatteryInfo.slnx/v18/DocumentLayout.backup.json delete mode 100644 .vs/M18BatteryInfo.slnx/v18/DocumentLayout.json delete mode 100644 .vs/ProjectEvaluation/m18batteryinfo.metadata.v10.bin delete mode 100644 .vs/ProjectEvaluation/m18batteryinfo.projects.v10.bin delete mode 100644 .vs/ProjectEvaluation/m18batteryinfo.strings.v10.bin delete mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.deps.json delete mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.dll delete mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.exe delete mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.pdb delete mode 100644 bin/Debug/net10.0-windows/M18BatteryInfo.runtimeconfig.json delete mode 100644 obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.GlobalUsings.g.cs delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.Properties.Resources.resources delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.assets.cache delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.csproj.BuildWithSkipAnalyzers delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.csproj.GenerateResource.cache delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.designer.deps.json delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.designer.runtimeconfig.json delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.dll delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.frmMain.resources delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.genruntimeconfig.cache delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.pdb delete mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.sourcelink.json delete mode 100644 obj/Debug/net10.0-windows/apphost.exe delete mode 100644 obj/Debug/net10.0-windows/ref/M18BatteryInfo.dll delete mode 100644 obj/Debug/net10.0-windows/refint/M18BatteryInfo.dll delete mode 100644 obj/M18BatteryInfo.csproj.nuget.dgspec.json delete mode 100644 obj/M18BatteryInfo.csproj.nuget.g.props delete mode 100644 obj/M18BatteryInfo.csproj.nuget.g.targets delete mode 100644 obj/project.assets.json delete mode 100644 obj/project.nuget.cache diff --git a/.vs/M18BatteryInfo.slnx/ColorByRegexConfig.txt b/.vs/M18BatteryInfo.slnx/ColorByRegexConfig.txt deleted file mode 100644 index c078dde..0000000 --- a/.vs/M18BatteryInfo.slnx/ColorByRegexConfig.txt +++ /dev/null @@ -1,10 +0,0 @@ -// This file contains rules to color document tabs by regular expressions. Each line contains a regular expression that will be tested against a file's full path. All files matching a regular expression will share a color. -// You can customize the color assigned to any group of files by right-clicking the tab and choosing "Set Tab Color." -// Regular expressions will be matched in the order they appear in this file. See https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expressions for syntax. -// Regular expressions are matched as case-insensitive by default. You can override this behavior using capture group options like "(?-i:expression)". -// Edit this file and save your changes to see changes immediately applied. Any errors encountered during parsing or evaluating expressions will appear in the Output Window in a pane named "Color by Regular Expression." -^.*\.cs$ -^.*\.fs$ -^.*\.vb$ -^.*\.cp?p?$ -^.*\.hp?p?$ diff --git a/.vs/M18BatteryInfo.slnx/DesignTimeBuild/.dtbcache.v2 b/.vs/M18BatteryInfo.slnx/DesignTimeBuild/.dtbcache.v2 deleted file mode 100644 index a71be8a1abc0695b9d84377bb3d74cdd284b4b1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115379 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 diff --git a/.vs/M18BatteryInfo.slnx/v18/.futdcache.v2 b/.vs/M18BatteryInfo.slnx/v18/.futdcache.v2 deleted file mode 100644 index 527f5d9163a363c4326ccdeb803c5af737ea7025..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104 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 LH_+2XIc+@$uyb?` diff --git a/.vs/ProjectEvaluation/m18batteryinfo.projects.v10.bin b/.vs/ProjectEvaluation/m18batteryinfo.projects.v10.bin deleted file mode 100644 index e3ed20abb82488252113a9d0fa67e7d85ff68888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54936 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 aUANeFbUj<?iBq%06gvT>6@5D*YSQBiD&6}w;o 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

(J>l6HeutKSe81$g&(>DKZ=1}5-*_0`HoU6e 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 diff --git a/bin/Debug/net10.0-windows/M18BatteryInfo.exe b/bin/Debug/net10.0-windows/M18BatteryInfo.exe deleted file mode 100644 index 89d647b28031c34441319f03555d0dfe6ea78234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162304 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

tGrq?PTk{` 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 diff --git a/bin/Debug/net10.0-windows/M18BatteryInfo.runtimeconfig.json b/bin/Debug/net10.0-windows/M18BatteryInfo.runtimeconfig.json deleted file mode 100644 index 24d6a16..0000000 --- a/bin/Debug/net10.0-windows/M18BatteryInfo.runtimeconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "runtimeOptions": { - "tfm": "net10.0", - "frameworks": [ - { - "name": "Microsoft.NETCore.App", - "version": "10.0.0" - }, - { - "name": "Microsoft.WindowsDesktop.App", - "version": "10.0.0" - } - ], - "configProperties": { - "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false, - "CSWINRT_USE_WINDOWS_UI_XAML_PROJECTIONS": false - } - } -} \ No newline at end of file diff --git a/obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs b/obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs deleted file mode 100644 index d3d9ce2..0000000 --- a/obj/Debug/net10.0-windows/.NETCoreApp,Version=v10.0.AssemblyAttributes.cs +++ /dev/null @@ -1,4 +0,0 @@ -// -using System; -using System.Reflection; -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")] diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs deleted file mode 100644 index 62307a0..0000000 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfo.cs +++ /dev/null @@ -1,25 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("M18BatteryInfo")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0a5d3c4d0eb780ade68cf7a694f3b2e199d7dddc")] -[assembly: System.Reflection.AssemblyProductAttribute("M18BatteryInfo")] -[assembly: System.Reflection.AssemblyTitleAttribute("M18BatteryInfo")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] -[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] -[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache deleted file mode 100644 index 7f4d625..0000000 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -c7598f277efecde557b65eedbc6f145bd375238436ffe7a6e633d539e65c5a74 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net10.0-windows/M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index 08b0b5d..0000000 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,24 +0,0 @@ -is_global = true -build_property.ApplicationManifest = -build_property.StartupObject = -build_property.ApplicationDefaultFont = -build_property.ApplicationHighDpiMode = -build_property.ApplicationUseCompatibleTextRendering = -build_property.ApplicationVisualStyles = -build_property.TargetFramework = net10.0-windows -build_property.TargetFrameworkIdentifier = .NETCoreApp -build_property.TargetFrameworkVersion = v10.0 -build_property.TargetPlatformMinVersion = 7.0 -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = M18BatteryInfo -build_property.ProjectDir = E:\M18BatteryInfo\ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.CsWinRTUseWindowsUIXamlProjections = false -build_property.EffectiveAnalysisLevelStyle = 10.0 -build_property.EnableCodeStyleSeverity = diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.GlobalUsings.g.cs b/obj/Debug/net10.0-windows/M18BatteryInfo.GlobalUsings.g.cs deleted file mode 100644 index a5265bd..0000000 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.GlobalUsings.g.cs +++ /dev/null @@ -1,10 +0,0 @@ -// -global using System; -global using System.Collections.Generic; -global using System.Drawing; -global using System.IO; -global using System.Linq; -global using System.Net.Http; -global using System.Threading; -global using System.Threading.Tasks; -global using System.Windows.Forms; diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.Properties.Resources.resources b/obj/Debug/net10.0-windows/M18BatteryInfo.Properties.Resources.resources deleted file mode 100644 index 6c05a9776bd7cbae976fdcec7e3a254e93018279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.assets.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.assets.cache deleted file mode 100644 index 34994a0c73e3ec16269f5c9bc42d91afc8683423..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmWIWc6a1qU|>j#c%S4M`0t$4+e58p8TL97y=rV8TWkIa$IX#!o9i?25l{`WfC;Ej z(b*~{v^ce>IL0rrB(XRnF-9-1G(EK>rXVpnJ25@AI0j^zJ5W_XQGR++Vy=Q)W=?9c zf~t{4g@u`_k!6f;W^z$}aei8fLRe;TX=08-a7k%OW`0a?Mq*KFN{nBrdumAl)G$IW F0{}z?Ho*V@ diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.BuildWithSkipAnalyzers b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.BuildWithSkipAnalyzers deleted file mode 100644 index e69de29..0000000 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache deleted file mode 100644 index c27e3ad..0000000 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.CoreCompileInputs.cache +++ /dev/null @@ -1 +0,0 @@ -8fa94695351c064965830dd520a5b20142cd79da0cdc20cd61a06dd3cdb63ee1 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt deleted file mode 100644 index f2fb75b..0000000 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.FileListAbsolute.txt +++ /dev/null @@ -1,18 +0,0 @@ -E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.exe -E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.deps.json -E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.runtimeconfig.json -E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.dll -E:\M18BatteryInfo\bin\Debug\net10.0-windows\M18BatteryInfo.pdb -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.frmMain.resources -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.csproj.GenerateResource.cache -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.GeneratedMSBuildEditorConfig.editorconfig -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.AssemblyInfoInputs.cache -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.AssemblyInfo.cs -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.csproj.CoreCompileInputs.cache -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.sourcelink.json -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.dll -E:\M18BatteryInfo\obj\Debug\net10.0-windows\refint\M18BatteryInfo.dll -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.pdb -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.genruntimeconfig.cache -E:\M18BatteryInfo\obj\Debug\net10.0-windows\ref\M18BatteryInfo.dll -E:\M18BatteryInfo\obj\Debug\net10.0-windows\M18BatteryInfo.Properties.Resources.resources diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.GenerateResource.cache b/obj/Debug/net10.0-windows/M18BatteryInfo.csproj.GenerateResource.cache deleted file mode 100644 index 24763faa9a79a773efe9acfb7753dbd4df67ef9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 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

(J>l6HeutKSe81$g&(>DKZ=1}5-*_0`HoU6e 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 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.frmMain.resources b/obj/Debug/net10.0-windows/M18BatteryInfo.frmMain.resources deleted file mode 100644 index 69caaab27d7d40414aa8f50177596c3f674130b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207566 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%0AsqlF)Gi|!jW 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 diff --git a/obj/Debug/net10.0-windows/M18BatteryInfo.sourcelink.json b/obj/Debug/net10.0-windows/M18BatteryInfo.sourcelink.json deleted file mode 100644 index 788923d..0000000 --- a/obj/Debug/net10.0-windows/M18BatteryInfo.sourcelink.json +++ /dev/null @@ -1 +0,0 @@ -{"documents":{"E:\\M18BatteryInfo\\*":"https://raw.githubusercontent.com/mnh-jansson/m18-protocol/895037738ec107b30188ac80245b859c86532812/*"}} \ No newline at end of file diff --git a/obj/Debug/net10.0-windows/apphost.exe b/obj/Debug/net10.0-windows/apphost.exe deleted file mode 100644 index 89d647b28031c34441319f03555d0dfe6ea78234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162304 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

tGrq?PTk{` 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 h_o?P$l|O9^eI4gzw&&*`0Mv zl2=OZ?wothx#yn0d*|LWt53a1T}0H4=k{%)x6q50m+v@wEvxRZz)&a zIak~@J+;Q&D%Wk*&>hG1)e=*A-BC?PU0g4ywp(V}i4)1;Q1!+V(G{he{`s@*$TS^L zijFC1q9laGgSPg0fIJ=*k3dA92>b>n{TDsGibn*4mY|()5e>?JyAR1ggg&@Tv@Y-+ zqJy508SnOqj)Ojc+~aZnz3@CyUreSCv+vfCw3>9DUgG(4cWkq^)haR%P) z|NTeTezLXnefw|kPS$Vz`9mD)gV2u1Ksr2>M3=jeFtHNppmPL#*VP zn>1he!n`6i1m{d+OiOFobT%_7gnP&W+{L*w^mU>?pr3-Fp@Pp%r|JobL0A<>_|R5? z&Hxw3*wE#zl|}T!pm*Wi(7ffAK#K+y%H@ZN`UUYXB`eM|;Xhcg7U&Z6NAR4+BXG;cY7_yGz0ti)fI@OzT;S1I{h z39n&pk~R}hboJ6`*OQPxM*@zKu(eLF09Ig2co6s@vZf&3tBL0ma}wWI25AA*5~wZ` z)b)@O85*Sb5?x(ltcN!8LeIA!eFIvRkopasr3)?UC3-3`ipT@Wmr0S7u>HwIKfQrm zoB~8tfJyp{#4~_{G%4Yngeww$QNk}ts7q){__TygK!sic?4?&Ed=2nn`hmnhMIK#K zG&)8XNyCcF0zO990Eegwcpf`Mqb&Up@N@KQzy{6^bApMH20yh$D3CPP07_uBhbuX34ZnKQ_AJ zn7*l7=1nYh#}3fKU~zg;S#Ab_t!8rby6-dI6p7KwmPK$<)WzX+T1L94!tGVvbZD+t zvrI#V*O8)@EmpCZA(D1Tb0i?P%A#v)(VipC@Le8_E}DAPaXsHOyoeP>+nP{dykQ#5 zqfO?ybuO@AHzFEreUOJjLO3-L}VVVm%a**qu1w-I-^@vl)f&N zlpY|bP6=|LM@=XL1AVtonC z(~VqubZoqo8=o|C7ss=sxy&fhNrjSO?k0qeIfb&(9*Y)3E4r@bX}Bd_r;7KzS!3mB zrRM9VRc5>|lZ(7S{KulqxBEk%12i1_Aej+(zAYQaq8cIKT}K+1_L$tZwr3!xOm1&6 zdixWU&j(@;;QwF-60+7(@n!fZyx$1E5MyzOw~i=x1YZd43((O5`Q1B)f@}gbntf=^jK8@N_p)0Ugl^R4Q zYKT!}vP!$qPNd>lllIm_zR0q$7sV~8AY=DyH^}=2^tte+j-2^1?}_fF2ky`}X#{?E z&Oe;BcFxXY4JT0!O8LWSc^r|R6fiwbEB*z;wJ+(Otu-`bg7jwbV$U!RK|)7X{XR`ZJo6^I+R!MxDcENQ1-K({=dC${XBlpwg`}?>@C= zBdsc0TMsTtqb`b)E3CmR)e>+zrF$z*!@a?HO0Ao72I?%Nv7%cZ3xkqMMvm|%a($%3 h_o - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - $(UserProfile)\.nuget\packages\ - C:\Users\Natasha\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages - PackageReference - 7.0.0 - - - - - - \ No newline at end of file diff --git a/obj/M18BatteryInfo.csproj.nuget.g.targets b/obj/M18BatteryInfo.csproj.nuget.g.targets deleted file mode 100644 index 35a7576..0000000 --- a/obj/M18BatteryInfo.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/obj/project.assets.json b/obj/project.assets.json deleted file mode 100644 index ec7e7b5..0000000 --- a/obj/project.assets.json +++ /dev/null @@ -1,373 +0,0 @@ -{ - "version": 3, - "targets": { - "net10.0-windows7.0": {} - }, - "libraries": {}, - "projectFileDependencyGroups": { - "net10.0-windows7.0": [] - }, - "packageFolders": { - "C:\\Users\\Natasha\\.nuget\\packages\\": {}, - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "E:\\M18BatteryInfo\\M18BatteryInfo.csproj", - "projectName": "M18BatteryInfo", - "projectPath": "E:\\M18BatteryInfo\\M18BatteryInfo.csproj", - "packagesPath": "C:\\Users\\Natasha\\.nuget\\packages\\", - "outputPath": "E:\\M18BatteryInfo\\obj\\", - "projectStyle": "PackageReference", - "fallbackFolders": [ - "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" - ], - "configFilePaths": [ - "C:\\Users\\Natasha\\AppData\\Roaming\\NuGet\\NuGet.Config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", - "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" - ], - "originalTargetFrameworks": [ - "net10.0-windows" - ], - "sources": { - "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "C:\\Program Files\\dotnet\\library-packs": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net10.0-windows7.0": { - "targetAlias": "net10.0-windows", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "all" - }, - "SdkAnalysisLevel": "10.0.100" - }, - "frameworks": { - "net10.0-windows7.0": { - "targetAlias": "net10.0-windows", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - }, - "Microsoft.WindowsDesktop.App.WindowsForms": { - "privateAssets": "none" - } - }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.101/PortableRuntimeIdentifierGraph.json", - "packagesToPrune": { - "Microsoft.CSharp": "(,4.7.32767]", - "Microsoft.VisualBasic": "(,10.4.32767]", - "Microsoft.Win32.Primitives": "(,4.3.32767]", - "Microsoft.Win32.Registry": "(,5.0.32767]", - "Microsoft.Win32.Registry.AccessControl": "(,10.0.32767]", - "Microsoft.Win32.SystemEvents": "(,10.0.32767]", - "runtime.any.System.Collections": "(,4.3.32767]", - "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", - "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", - "runtime.any.System.Globalization": "(,4.3.32767]", - "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", - "runtime.any.System.IO": "(,4.3.32767]", - "runtime.any.System.Reflection": "(,4.3.32767]", - "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", - "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", - "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", - "runtime.any.System.Runtime": "(,4.3.32767]", - "runtime.any.System.Runtime.Handles": "(,4.3.32767]", - "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", - "runtime.any.System.Text.Encoding": "(,4.3.32767]", - "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", - "runtime.any.System.Threading.Tasks": "(,4.3.32767]", - "runtime.any.System.Threading.Timer": "(,4.3.32767]", - "runtime.aot.System.Collections": "(,4.3.32767]", - "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", - "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", - "runtime.aot.System.Globalization": "(,4.3.32767]", - "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", - "runtime.aot.System.IO": "(,4.3.32767]", - "runtime.aot.System.Reflection": "(,4.3.32767]", - "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", - "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", - "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", - "runtime.aot.System.Runtime": "(,4.3.32767]", - "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", - "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", - "runtime.aot.System.Text.Encoding": "(,4.3.32767]", - "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", - "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", - "runtime.aot.System.Threading.Timer": "(,4.3.32767]", - "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", - "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", - "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", - "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", - "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", - "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", - "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", - "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", - "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", - "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", - "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", - "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", - "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", - "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", - "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", - "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", - "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", - "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", - "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", - "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", - "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", - "runtime.unix.System.Console": "(,4.3.32767]", - "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", - "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", - "runtime.unix.System.Net.Primitives": "(,4.3.32767]", - "runtime.unix.System.Net.Sockets": "(,4.3.32767]", - "runtime.unix.System.Private.Uri": "(,4.3.32767]", - "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", - "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", - "runtime.win.System.Console": "(,4.3.32767]", - "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", - "runtime.win.System.IO.FileSystem": "(,4.3.32767]", - "runtime.win.System.Net.Primitives": "(,4.3.32767]", - "runtime.win.System.Net.Sockets": "(,4.3.32767]", - "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", - "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", - "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", - "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", - "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", - "runtime.win7.System.Private.Uri": "(,4.3.32767]", - "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", - "System.AppContext": "(,4.3.32767]", - "System.Buffers": "(,5.0.32767]", - "System.CodeDom": "(,10.0.32767]", - "System.Collections": "(,4.3.32767]", - "System.Collections.Concurrent": "(,4.3.32767]", - "System.Collections.Immutable": "(,10.0.32767]", - "System.Collections.NonGeneric": "(,4.3.32767]", - "System.Collections.Specialized": "(,4.3.32767]", - "System.ComponentModel": "(,4.3.32767]", - "System.ComponentModel.Annotations": "(,4.3.32767]", - "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", - "System.ComponentModel.Primitives": "(,4.3.32767]", - "System.ComponentModel.TypeConverter": "(,4.3.32767]", - "System.Configuration.ConfigurationManager": "(,10.0.32767]", - "System.Console": "(,4.3.32767]", - "System.Data.Common": "(,4.3.32767]", - "System.Data.DataSetExtensions": "(,4.4.32767]", - "System.Diagnostics.Contracts": "(,4.3.32767]", - "System.Diagnostics.Debug": "(,4.3.32767]", - "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", - "System.Diagnostics.EventLog": "(,10.0.32767]", - "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", - "System.Diagnostics.PerformanceCounter": "(,10.0.32767]", - "System.Diagnostics.Process": "(,4.3.32767]", - "System.Diagnostics.StackTrace": "(,4.3.32767]", - "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", - "System.Diagnostics.Tools": "(,4.3.32767]", - "System.Diagnostics.TraceSource": "(,4.3.32767]", - "System.Diagnostics.Tracing": "(,4.3.32767]", - "System.DirectoryServices": "(,10.0.32767]", - "System.Drawing.Common": "(,10.0.32767]", - "System.Drawing.Primitives": "(,4.3.32767]", - "System.Dynamic.Runtime": "(,4.3.32767]", - "System.Formats.Asn1": "(,10.0.32767]", - "System.Formats.Nrbf": "(,10.0.32767]", - "System.Formats.Tar": "(,10.0.32767]", - "System.Globalization": "(,4.3.32767]", - "System.Globalization.Calendars": "(,4.3.32767]", - "System.Globalization.Extensions": "(,4.3.32767]", - "System.IO": "(,4.3.32767]", - "System.IO.Compression": "(,4.3.32767]", - "System.IO.Compression.ZipFile": "(,4.3.32767]", - "System.IO.FileSystem": "(,4.3.32767]", - "System.IO.FileSystem.AccessControl": "(,4.4.32767]", - "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", - "System.IO.FileSystem.Primitives": "(,4.3.32767]", - "System.IO.FileSystem.Watcher": "(,4.3.32767]", - "System.IO.IsolatedStorage": "(,4.3.32767]", - "System.IO.MemoryMappedFiles": "(,4.3.32767]", - "System.IO.Packaging": "(,10.0.32767]", - "System.IO.Pipelines": "(,10.0.32767]", - "System.IO.Pipes": "(,4.3.32767]", - "System.IO.Pipes.AccessControl": "(,5.0.32767]", - "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", - "System.Linq": "(,4.3.32767]", - "System.Linq.AsyncEnumerable": "(,10.0.32767]", - "System.Linq.Expressions": "(,4.3.32767]", - "System.Linq.Parallel": "(,4.3.32767]", - "System.Linq.Queryable": "(,4.3.32767]", - "System.Memory": "(,5.0.32767]", - "System.Net.Http": "(,4.3.32767]", - "System.Net.Http.Json": "(,10.0.32767]", - "System.Net.NameResolution": "(,4.3.32767]", - "System.Net.NetworkInformation": "(,4.3.32767]", - "System.Net.Ping": "(,4.3.32767]", - "System.Net.Primitives": "(,4.3.32767]", - "System.Net.Requests": "(,4.3.32767]", - "System.Net.Security": "(,4.3.32767]", - "System.Net.ServerSentEvents": "(,10.0.32767]", - "System.Net.Sockets": "(,4.3.32767]", - "System.Net.WebHeaderCollection": "(,4.3.32767]", - "System.Net.WebSockets": "(,4.3.32767]", - "System.Net.WebSockets.Client": "(,4.3.32767]", - "System.Numerics.Vectors": "(,5.0.32767]", - "System.ObjectModel": "(,4.3.32767]", - "System.Private.DataContractSerialization": "(,4.3.32767]", - "System.Private.Uri": "(,4.3.32767]", - "System.Reflection": "(,4.3.32767]", - "System.Reflection.DispatchProxy": "(,6.0.32767]", - "System.Reflection.Emit": "(,4.7.32767]", - "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", - "System.Reflection.Emit.Lightweight": "(,4.7.32767]", - "System.Reflection.Extensions": "(,4.3.32767]", - "System.Reflection.Metadata": "(,10.0.32767]", - "System.Reflection.Primitives": "(,4.3.32767]", - "System.Reflection.TypeExtensions": "(,4.3.32767]", - "System.Resources.Extensions": "(,10.0.32767]", - "System.Resources.Reader": "(,4.3.32767]", - "System.Resources.ResourceManager": "(,4.3.32767]", - "System.Resources.Writer": "(,4.3.32767]", - "System.Runtime": "(,4.3.32767]", - "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", - "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", - "System.Runtime.Extensions": "(,4.3.32767]", - "System.Runtime.Handles": "(,4.3.32767]", - "System.Runtime.InteropServices": "(,4.3.32767]", - "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", - "System.Runtime.Loader": "(,4.3.32767]", - "System.Runtime.Numerics": "(,4.3.32767]", - "System.Runtime.Serialization.Formatters": "(,4.3.32767]", - "System.Runtime.Serialization.Json": "(,4.3.32767]", - "System.Runtime.Serialization.Primitives": "(,4.3.32767]", - "System.Runtime.Serialization.Xml": "(,4.3.32767]", - "System.Security.AccessControl": "(,6.0.32767]", - "System.Security.Claims": "(,4.3.32767]", - "System.Security.Cryptography.Algorithms": "(,4.3.32767]", - "System.Security.Cryptography.Cng": "(,5.0.32767]", - "System.Security.Cryptography.Csp": "(,4.3.32767]", - "System.Security.Cryptography.Encoding": "(,4.3.32767]", - "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", - "System.Security.Cryptography.Pkcs": "(,10.0.32767]", - "System.Security.Cryptography.Primitives": "(,4.3.32767]", - "System.Security.Cryptography.ProtectedData": "(,10.0.32767]", - "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", - "System.Security.Cryptography.Xml": "(,10.0.32767]", - "System.Security.Permissions": "(,10.0.32767]", - "System.Security.Principal": "(,4.3.32767]", - "System.Security.Principal.Windows": "(,5.0.32767]", - "System.Security.SecureString": "(,4.3.32767]", - "System.Text.Encoding": "(,4.3.32767]", - "System.Text.Encoding.CodePages": "(,10.0.32767]", - "System.Text.Encoding.Extensions": "(,4.3.32767]", - "System.Text.Encodings.Web": "(,10.0.32767]", - "System.Text.Json": "(,10.0.32767]", - "System.Text.RegularExpressions": "(,4.3.32767]", - "System.Threading": "(,4.3.32767]", - "System.Threading.AccessControl": "(,10.0.32767]", - "System.Threading.Channels": "(,10.0.32767]", - "System.Threading.Overlapped": "(,4.3.32767]", - "System.Threading.Tasks": "(,4.3.32767]", - "System.Threading.Tasks.Dataflow": "(,10.0.32767]", - "System.Threading.Tasks.Extensions": "(,5.0.32767]", - "System.Threading.Tasks.Parallel": "(,4.3.32767]", - "System.Threading.Thread": "(,4.3.32767]", - "System.Threading.ThreadPool": "(,4.3.32767]", - "System.Threading.Timer": "(,4.3.32767]", - "System.ValueTuple": "(,4.5.32767]", - "System.Windows.Extensions": "(,10.0.32767]", - "System.Xml.ReaderWriter": "(,4.3.32767]", - "System.Xml.XDocument": "(,4.3.32767]", - "System.Xml.XmlDocument": "(,4.3.32767]", - "System.Xml.XmlSerializer": "(,4.3.32767]", - "System.Xml.XPath": "(,4.3.32767]", - "System.Xml.XPath.XDocument": "(,5.0.32767]" - } - } - } - } -} \ No newline at end of file diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache deleted file mode 100644 index 676525e..0000000 --- a/obj/project.nuget.cache +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "jRDLlfFBnmE=", - "success": true, - "projectFilePath": "E:\\M18BatteryInfo\\M18BatteryInfo.csproj", - "expectedPackageFiles": [], - "logs": [] -} \ No newline at end of file From 224c5739dc646dc9dfb7f36e9aca8ce9c8879311 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 12:50:47 -0500 Subject: [PATCH 14/61] Add System.IO.Ports and System.Maintainence --- M18BatteryInfo.csproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/M18BatteryInfo.csproj b/M18BatteryInfo.csproj index 4c29fc6..7604f86 100644 --- a/M18BatteryInfo.csproj +++ b/M18BatteryInfo.csproj @@ -8,6 +8,11 @@ enable + + + + + True From a6eb4d0052db15d3262835b9529701c7435ad6b9 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 13:00:47 -0500 Subject: [PATCH 15/61] Minor visual tweaks. --- M18AnalyzerMain.Designer.cs | 82 +++++++------ M18AnalyzerMain.resx | 239 ++++++++++++++++++------------------ 2 files changed, 160 insertions(+), 161 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 4b11622..d561357 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -110,12 +110,12 @@ private void InitializeComponent() txtOneKeyID = new TextBox(); btnSubmitDiagForm = new Button(); tabAbout = new TabPage(); - lblAboutTitle = new Label(); - toolTipSimpleTab = new ToolTip(components); - lblMartin = new Label(); - linkLabel1 = new LinkLabel(); linkLabel2 = new LinkLabel(); label1 = new Label(); + linkLabel1 = new LinkLabel(); + lblMartin = new Label(); + lblAboutTitle = new Label(); + toolTipSimpleTab = new ToolTip(components); tabControl1.SuspendLayout(); tabPage1.SuspendLayout(); grpOutput.SuspendLayout(); @@ -215,11 +215,13 @@ private void InitializeComponent() // // rtbOutput // + rtbOutput.BackColor = Color.Black; + rtbOutput.ForeColor = Color.Lime; rtbOutput.Location = new Point(6, 30); rtbOutput.Name = "rtbOutput"; rtbOutput.Size = new Size(714, 314); rtbOutput.TabIndex = 0; - rtbOutput.Text = "Step 1: Set Idle.\nStep 2: Connect Battery.\nStep 3: Set Active."; + rtbOutput.Text = "Step 1: Set Idle.\nStep 2: Connect Battery.\nStep 3: Set Active.\n"; // // btnIdle // @@ -905,41 +907,6 @@ private void InitializeComponent() tabAbout.Text = "About"; tabAbout.UseVisualStyleBackColor = true; // - // lblAboutTitle - // - lblAboutTitle.Font = new Font("Segoe UI Black", 26F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point, 0); - lblAboutTitle.Image = (Image)resources.GetObject("lblAboutTitle.Image"); - lblAboutTitle.ImageAlign = ContentAlignment.MiddleLeft; - lblAboutTitle.Location = new Point(144, 8); - lblAboutTitle.Name = "lblAboutTitle"; - lblAboutTitle.Size = new Size(632, 80); - lblAboutTitle.TabIndex = 0; - lblAboutTitle.Text = " Pack Analyzer GUI"; - lblAboutTitle.TextAlign = ContentAlignment.TopCenter; - // - // lblMartin - // - lblMartin.AutoSize = true; - lblMartin.Font = new Font("Segoe UI", 10F, FontStyle.Bold, GraphicsUnit.Point, 0); - lblMartin.Location = new Point(224, 80); - lblMartin.Name = "lblMartin"; - lblMartin.Size = new Size(459, 28); - lblMartin.TabIndex = 1; - lblMartin.Text = "Original M18 Protocol code by: Martin Jansson"; - // - // linkLabel1 - // - linkLabel1.AutoSize = true; - linkLabel1.LinkArea = new LinkArea(13, 60); - linkLabel1.Location = new Point(200, 112); - linkLabel1.Name = "linkLabel1"; - linkLabel1.Size = new Size(514, 30); - linkLabel1.TabIndex = 2; - linkLabel1.TabStop = true; - linkLabel1.Text = "GitHub Repo: https://github.com/mnh-jansson/m18-protocol/"; - linkLabel1.UseCompatibleTextRendering = true; - linkLabel1.LinkClicked += linkLabel1_LinkClicked; - // // linkLabel2 // linkLabel2.AutoSize = true; @@ -962,6 +929,41 @@ private void InitializeComponent() label1.TabIndex = 3; label1.Text = "GUI designed By: KillaVolt"; // + // linkLabel1 + // + linkLabel1.AutoSize = true; + linkLabel1.LinkArea = new LinkArea(13, 60); + linkLabel1.Location = new Point(200, 112); + linkLabel1.Name = "linkLabel1"; + linkLabel1.Size = new Size(514, 30); + linkLabel1.TabIndex = 2; + linkLabel1.TabStop = true; + linkLabel1.Text = "GitHub Repo: https://github.com/mnh-jansson/m18-protocol/"; + linkLabel1.UseCompatibleTextRendering = true; + linkLabel1.LinkClicked += linkLabel1_LinkClicked; + // + // lblMartin + // + lblMartin.AutoSize = true; + lblMartin.Font = new Font("Segoe UI", 10F, FontStyle.Bold, GraphicsUnit.Point, 0); + lblMartin.Location = new Point(224, 80); + lblMartin.Name = "lblMartin"; + lblMartin.Size = new Size(459, 28); + lblMartin.TabIndex = 1; + lblMartin.Text = "Original M18 Protocol code by: Martin Jansson"; + // + // lblAboutTitle + // + lblAboutTitle.Font = new Font("Segoe UI Black", 26F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point, 0); + lblAboutTitle.Image = (Image)resources.GetObject("lblAboutTitle.Image"); + lblAboutTitle.ImageAlign = ContentAlignment.MiddleLeft; + lblAboutTitle.Location = new Point(144, 8); + lblAboutTitle.Name = "lblAboutTitle"; + lblAboutTitle.Size = new Size(632, 80); + lblAboutTitle.TabIndex = 0; + lblAboutTitle.Text = " Pack Analyzer GUI"; + lblAboutTitle.TextAlign = ContentAlignment.TopCenter; + // // frmMain // AutoScaleDimensions = new SizeF(10F, 25F); diff --git a/M18AnalyzerMain.resx b/M18AnalyzerMain.resx index 9a8a2c4..4bf8076 100644 --- a/M18AnalyzerMain.resx +++ b/M18AnalyzerMain.resx @@ -123,129 +123,126 @@ - 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 - - 9, 21 - AAABAAkAEBAAAAEAIABoBAAAlgAAABgYAAABACAAiAkAAP4EAAAgIAAAAQAgAKgQAACGDgAAMDAAAAEA From f0f8b80a2a928a3ecea6114158d26bd165cbe7c6 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 13:03:13 -0500 Subject: [PATCH 16/61] Improve log formatting --- M18AnalyzerMain.Designer.cs | 2 +- M18AnalyzerMain.cs | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index d561357..47ce632 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -221,7 +221,7 @@ private void InitializeComponent() rtbOutput.Name = "rtbOutput"; rtbOutput.Size = new Size(714, 314); rtbOutput.TabIndex = 0; - rtbOutput.Text = "Step 1: Set Idle.\nStep 2: Connect Battery.\nStep 3: Set Active.\n"; + rtbOutput.Text = "Step 1: Set Idle.\nStep 2: Connect Battery.\nStep 3: Set Active.\n\n"; // // btnIdle // diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 598fb6e..beffa7c 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -2,9 +2,10 @@ namespace M18BatteryInfo { - public partial class frmMain : Form - { - private SerialPort? _serialPort; + public partial class frmMain : Form + { + private SerialPort? _serialPort; + private bool _hasAppendedLog; public frmMain() { @@ -192,13 +193,17 @@ private Dictionary GetPortDescriptions() return descriptions; } - private void AppendLog(string message) - { - var formattedMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; - var entry = $"====== OUTPUT ======{Environment.NewLine}{formattedMessage}{Environment.NewLine}"; - rtbOutput.AppendText(entry); - rtbOutput.ScrollToCaret(); - } + private void AppendLog(string message) + { + var timestampedMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; + var prefix = _hasAppendedLog ? $"{Environment.NewLine}{Environment.NewLine}" : string.Empty; + + rtbOutput.AppendText($"{prefix}{timestampedMessage}"); + rtbOutput.SelectionStart = rtbOutput.TextLength; + rtbOutput.ScrollToCaret(); + + _hasAppendedLog = true; + } private void LogError(string context, Exception exception) { From cd817216762ad993aa2d365829806855fd1f465b Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 13:34:47 -0500 Subject: [PATCH 17/61] Minor visual tweaks, updated basic instructions in output window. --- M18AnalyzerMain.Designer.cs | 3 +- M18AnalyzerMain.cs | 423 ++++++++++++++++++------------------ M18AnalyzerMain.resx | 11 +- 3 files changed, 226 insertions(+), 211 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 47ce632..4095f09 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -221,7 +221,8 @@ private void InitializeComponent() rtbOutput.Name = "rtbOutput"; rtbOutput.Size = new Size(714, 314); rtbOutput.TabIndex = 0; - rtbOutput.Text = "Step 1: Set Idle.\nStep 2: Connect Battery.\nStep 3: Set Active.\n\n"; + rtbOutput.Text = resources.GetString("rtbOutput.Text"); + rtbOutput.TextChanged += rtbOutput_TextChanged; // // btnIdle // diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index beffa7c..bc65e73 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -1,202 +1,202 @@ -using System.IO.Ports; - -namespace M18BatteryInfo -{ +using System.IO.Ports; + +namespace M18BatteryInfo +{ public partial class frmMain : Form { private SerialPort? _serialPort; private bool _hasAppendedLog; - - public frmMain() - { - InitializeComponent(); - - btnRefresh.Click += btnRefresh_Click; - btnConnect.Click += btnConnect_Click; - btnDisconnect.Click += btnDisconnect_Click; - } - - private void toolStripButton1_Click(object sender, EventArgs e) - { - - } - - private void toolTipReset_Popup(object sender, PopupEventArgs e) - { - - } - - private void frmMain_Load(object sender, EventArgs e) - { - RefreshSerialPorts(); - } - - private void lblResponseLength_Click(object sender, EventArgs e) - { - - } - - private void pictureBox1_Click(object sender, EventArgs e) - { - - } - - private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) - { - - } - - private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) - { - - } - - private void btnRefresh_Click(object? sender, EventArgs e) - { - RefreshSerialPorts(); - } - - private void RefreshSerialPorts() - { - AppendLog("Refreshing serial port list..."); - - try - { - var portDescriptions = GetPortDescriptions(); - var portNames = SerialPort.GetPortNames().OrderBy(port => port, StringComparer.OrdinalIgnoreCase).ToList(); - - cmbBxSerialPort.Items.Clear(); - - foreach (var port in portNames) - { - portDescriptions.TryGetValue(port, out var description); - cmbBxSerialPort.Items.Add(new SerialPortDisplay(port, description)); - AppendLog($"Found port {port}{(string.IsNullOrWhiteSpace(description) ? string.Empty : $" - {description}")}"); - } - - if (portNames.Count == 0) - { - AppendLog("No serial ports detected."); - } - else - { - cmbBxSerialPort.SelectedIndex = 0; - } - } - catch (Exception ex) - { - LogError("Error while refreshing serial ports", ex); - } - } - - private void btnConnect_Click(object? sender, EventArgs e) - { - if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) - { - AppendLog("No serial port selected. Please choose a port before connecting."); - MessageBox.Show("Please select a serial port before connecting.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return; - } - - if (_serialPort?.IsOpen == true) - { - if (string.Equals(_serialPort.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) - { - AppendLog($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); - MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); - return; - } - - AppendLog($"A different port ({_serialPort.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); - btnDisconnect_Click(sender, e); - } - - AppendLog($"Attempting to open {selectedPort} with settings: 4800 baud, 8 data bits, parity None, stop bits One, handshake None."); - - _serialPort = new SerialPort(selectedPort.PortName, 4800, Parity.None, 8, StopBits.One) - { - Handshake = Handshake.None, - ReadTimeout = 500, - WriteTimeout = 500 - }; - - try - { - _serialPort.Open(); - AppendLog($"{selectedPort} opened successfully."); - } - catch (Exception ex) - { - LogError($"Failed to open {selectedPort}.", ex); - } - } - - private void btnDisconnect_Click(object? sender, EventArgs e) - { - if (_serialPort == null || !_serialPort.IsOpen) - { - AppendLog("Disconnect requested, but no serial port is currently open."); - MessageBox.Show("No serial port is currently open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); - return; - } - - AppendLog($"Closing {_serialPort.PortName}..."); - - try - { - _serialPort.Close(); - AppendLog($"{_serialPort.PortName} closed successfully."); - } - catch (Exception ex) - { - LogError($"Error while closing {_serialPort.PortName}.", ex); - } - finally - { - _serialPort.Dispose(); - _serialPort = null; - } - } - - private Dictionary GetPortDescriptions() - { - var descriptions = new Dictionary(StringComparer.OrdinalIgnoreCase); - - try - { - using var searcher = new System.Management.ManagementObjectSearcher("SELECT Caption, DeviceID FROM Win32_PnPEntity WHERE Caption LIKE 'COM%' OR DeviceID LIKE 'COM%'"); - foreach (var obj in searcher.Get().OfType()) - { - var caption = obj["Caption"]?.ToString(); - var deviceId = obj["DeviceID"]?.ToString(); - - if (string.IsNullOrWhiteSpace(caption) && string.IsNullOrWhiteSpace(deviceId)) - { - continue; - } - - var combined = caption ?? deviceId ?? string.Empty; - var match = System.Text.RegularExpressions.Regex.Match(combined, @"\((COM\d+)\)"); - var portName = match.Success ? match.Groups[1].Value : SerialPort.GetPortNames().FirstOrDefault(name => combined.Contains(name, StringComparison.OrdinalIgnoreCase)); - - if (!string.IsNullOrWhiteSpace(portName) && !descriptions.ContainsKey(portName)) - { - descriptions[portName] = caption ?? deviceId ?? portName; - } - } - } - catch (Exception ex) - { - LogError("Failed to read port descriptions.", ex); - } - - return descriptions; - } - + + public frmMain() + { + InitializeComponent(); + + btnRefresh.Click += btnRefresh_Click; + btnConnect.Click += btnConnect_Click; + btnDisconnect.Click += btnDisconnect_Click; + } + + private void toolStripButton1_Click(object sender, EventArgs e) + { + + } + + private void toolTipReset_Popup(object sender, PopupEventArgs e) + { + + } + + private void frmMain_Load(object sender, EventArgs e) + { + RefreshSerialPorts(); + } + + private void lblResponseLength_Click(object sender, EventArgs e) + { + + } + + private void pictureBox1_Click(object sender, EventArgs e) + { + + } + + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + + } + + private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) + { + + } + + private void btnRefresh_Click(object? sender, EventArgs e) + { + RefreshSerialPorts(); + } + + private void RefreshSerialPorts() + { + AppendLog("Refreshing serial port list..."); + + try + { + var portDescriptions = GetPortDescriptions(); + var portNames = SerialPort.GetPortNames().OrderBy(port => port, StringComparer.OrdinalIgnoreCase).ToList(); + + cmbBxSerialPort.Items.Clear(); + + foreach (var port in portNames) + { + portDescriptions.TryGetValue(port, out var description); + cmbBxSerialPort.Items.Add(new SerialPortDisplay(port, description)); + AppendLog($"Found port {port}{(string.IsNullOrWhiteSpace(description) ? string.Empty : $" - {description}")}"); + } + + if (portNames.Count == 0) + { + AppendLog("No serial ports detected."); + } + else + { + cmbBxSerialPort.SelectedIndex = 0; + } + } + catch (Exception ex) + { + LogError("Error while refreshing serial ports", ex); + } + } + + private void btnConnect_Click(object? sender, EventArgs e) + { + if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) + { + AppendLog("No serial port selected. Please choose a port before connecting."); + MessageBox.Show("Please select a serial port before connecting.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + if (_serialPort?.IsOpen == true) + { + if (string.Equals(_serialPort.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) + { + AppendLog($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); + MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + AppendLog($"A different port ({_serialPort.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); + btnDisconnect_Click(sender, e); + } + + AppendLog($"Attempting to open {selectedPort} with settings: 4800 baud, 8 data bits, parity None, stop bits One, handshake None."); + + _serialPort = new SerialPort(selectedPort.PortName, 4800, Parity.None, 8, StopBits.One) + { + Handshake = Handshake.None, + ReadTimeout = 500, + WriteTimeout = 500 + }; + + try + { + _serialPort.Open(); + AppendLog($"{selectedPort} opened successfully."); + } + catch (Exception ex) + { + LogError($"Failed to open {selectedPort}.", ex); + } + } + + private void btnDisconnect_Click(object? sender, EventArgs e) + { + if (_serialPort == null || !_serialPort.IsOpen) + { + AppendLog("Disconnect requested, but no serial port is currently open."); + MessageBox.Show("No serial port is currently open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + AppendLog($"Closing {_serialPort.PortName}..."); + + try + { + _serialPort.Close(); + AppendLog($"{_serialPort.PortName} closed successfully."); + } + catch (Exception ex) + { + LogError($"Error while closing {_serialPort.PortName}.", ex); + } + finally + { + _serialPort.Dispose(); + _serialPort = null; + } + } + + private Dictionary GetPortDescriptions() + { + var descriptions = new Dictionary(StringComparer.OrdinalIgnoreCase); + + try + { + using var searcher = new System.Management.ManagementObjectSearcher("SELECT Caption, DeviceID FROM Win32_PnPEntity WHERE Caption LIKE 'COM%' OR DeviceID LIKE 'COM%'"); + foreach (var obj in searcher.Get().OfType()) + { + var caption = obj["Caption"]?.ToString(); + var deviceId = obj["DeviceID"]?.ToString(); + + if (string.IsNullOrWhiteSpace(caption) && string.IsNullOrWhiteSpace(deviceId)) + { + continue; + } + + var combined = caption ?? deviceId ?? string.Empty; + var match = System.Text.RegularExpressions.Regex.Match(combined, @"\((COM\d+)\)"); + var portName = match.Success ? match.Groups[1].Value : SerialPort.GetPortNames().FirstOrDefault(name => combined.Contains(name, StringComparison.OrdinalIgnoreCase)); + + if (!string.IsNullOrWhiteSpace(portName) && !descriptions.ContainsKey(portName)) + { + descriptions[portName] = caption ?? deviceId ?? portName; + } + } + } + catch (Exception ex) + { + LogError("Failed to read port descriptions.", ex); + } + + return descriptions; + } + private void AppendLog(string message) { var timestampedMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; - var prefix = _hasAppendedLog ? $"{Environment.NewLine}{Environment.NewLine}" : string.Empty; + var prefix = _hasAppendedLog ? $"{Environment.NewLine}" : string.Empty; rtbOutput.AppendText($"{prefix}{timestampedMessage}"); rtbOutput.SelectionStart = rtbOutput.TextLength; @@ -204,20 +204,25 @@ private void AppendLog(string message) _hasAppendedLog = true; } - - private void LogError(string context, Exception exception) - { - var fullMessage = $"{context} Error details: {exception}"; - AppendLog(fullMessage); - MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - - private sealed record SerialPortDisplay(string PortName, string? Description) - { - public override string ToString() - { - return string.IsNullOrWhiteSpace(Description) ? PortName : $"{PortName} - {Description}"; - } - } - } -} + + private void LogError(string context, Exception exception) + { + var fullMessage = $"{context} Error details: {exception}"; + AppendLog(fullMessage); + MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + private void rtbOutput_TextChanged(object sender, EventArgs e) + { + + } + + private sealed record SerialPortDisplay(string PortName, string? Description) + { + public override string ToString() + { + return string.IsNullOrWhiteSpace(Description) ? PortName : $"{PortName} - {Description}"; + } + } + } +} diff --git a/M18AnalyzerMain.resx b/M18AnalyzerMain.resx index 4bf8076..3071537 100644 --- a/M18AnalyzerMain.resx +++ b/M18AnalyzerMain.resx @@ -120,11 +120,20 @@ 9, 21 + + Step 1: Choose the serial port for your UART device, and press connect UART. +Step 2: Once UART is connected, set Idle (Tx Low). +Step 3: Plug in battery. +Step 3: Once battery has been plugged in set Active (Tx High). +Step 4: Set Idle (Tx Low) before unplugging battery and/or disconnecting the serial port. +=========================================================== + + iVBORw0KGgoAAAANSUhEUgAAAH0AAAAkCAYAAACkATUaAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL - EAAACxABrSO9dQAAGy9JREFUeF7FXHdclMfWHgGRDiJFEESqCEoigjUaC4m95GrExBJrMMbCtSS2mGL0 + DAAACwwBP0AiyAAAGy9JREFUeF7FXHdclMfWHgGRDiJFEESqCEoigjUaC4m95GrExBJrMMbCtSS2mGL0 JsYSzY29JZZEjYWoEQsaVFBAQQGFZWHpvfe6vN95Bpa7bl6kxHu/P54fsPvOmbPzzKkzC6t88rRH+Z3A XhUPQuwqgh/atws0tjzgTu/a5BQjeXExq8vMYnVZ2Q0/c3KYIK9ngiC8iNpazYr7wT3LA+85isp8OaAr xjmX3wtyrngY4iYvLdWXV1czeUVFA8rLmUB//2VegkQiYV998QWTJSSw386eYynJyay2tpbl5eWxYtK/ From b85603f0adc6fc1ba5056a8c4223de98fa4eba14 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 13:59:24 -0500 Subject: [PATCH 18/61] Add C# M18 protocol implementation --- M18Protocol.cs | 247 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 247 insertions(+) create mode 100644 M18Protocol.cs diff --git a/M18Protocol.cs b/M18Protocol.cs new file mode 100644 index 0000000..a3fa3e3 --- /dev/null +++ b/M18Protocol.cs @@ -0,0 +1,247 @@ +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; +using System.Text; +using System.Threading; + +namespace M18BatteryInfo +{ + ///

+ /// C# port of the Python M18 protocol implementation. + /// SerialPort.DtrEnable and SerialPort.BreakState map the DTR and BREAK + /// control signals; on platforms where these lines are not supported, an + /// equivalent control-line mechanism must be provided. Timing delays mirror + /// the original behavior but may require platform-specific adjustments when + /// interacting with different serial drivers. + /// + public class M18Protocol + { + public const byte SYNC_BYTE = 0xAA; + public const byte CAL_CMD = 0x55; + public const byte CONF_CMD = 0x60; + public const byte SNAP_CMD = 0x61; + public const byte KEEPALIVE_CMD = 0x62; + + public const int CUTOFF_CURRENT = 300; + public const int MAX_CURRENT = 6000; + + public int Acc { get; private set; } = 4; + + public bool PrintTx { get; set; } + public bool PrintRx { get; set; } + + private readonly SerialPort _port; + + public M18Protocol(string portName) + { + _port = new SerialPort(portName, 4800, Parity.None, 8, StopBits.Two) + { + ReadTimeout = 800, + WriteTimeout = 800 + }; + + _port.Open(); + Idle(); + } + + public byte ReverseBits(byte value) + { + byte reversed = 0; + for (int i = 0; i < 8; i++) + { + reversed <<= 1; + reversed |= (byte)((value >> i) & 0x01); + } + + return reversed; + } + + public int Checksum(IEnumerable payload) + { + int checksum = 0; + foreach (var b in payload) + { + checksum += b & 0xFFFF; + } + + return checksum; + } + + public byte[] AddChecksum(byte[] lsbCommand) + { + if (lsbCommand == null) + { + throw new ArgumentNullException(nameof(lsbCommand)); + } + + int checksum = Checksum(lsbCommand); + var withChecksum = new byte[lsbCommand.Length + 2]; + Buffer.BlockCopy(lsbCommand, 0, withChecksum, 0, lsbCommand.Length); + + withChecksum[withChecksum.Length - 2] = (byte)((checksum >> 8) & 0xFF); + withChecksum[withChecksum.Length - 1] = (byte)(checksum & 0xFF); + + return withChecksum; + } + + public void Send(byte[] command) + { + if (command == null) + { + throw new ArgumentNullException(nameof(command)); + } + + _port.DiscardInBuffer(); + + var msb = new byte[command.Length]; + for (int i = 0; i < command.Length; i++) + { + msb[i] = ReverseBits(command[i]); + } + + if (PrintTx) + { + var builder = new StringBuilder(); + for (int i = 0; i < command.Length; i++) + { + builder.Append(command[i].ToString("X2")); + if (i < command.Length - 1) + { + builder.Append(' '); + } + } + + Console.WriteLine($"TX: {builder}"); + } + + _port.Write(msb, 0, msb.Length); + } + + public void SendCommand(byte[] command) + { + Send(AddChecksum(command)); + } + + public byte[] ReadResponse(int size) + { + int firstByte; + try + { + firstByte = _port.ReadByte(); + } + catch (TimeoutException) + { + throw new InvalidOperationException("Empty response"); + } + + if (firstByte < 0) + { + throw new InvalidOperationException("Empty response"); + } + + var msbResponse = new List { (byte)firstByte }; + int remaining = ReverseBits((byte)firstByte) == 0x82 ? 1 : Math.Max(0, size - 1); + + if (remaining > 0) + { + msbResponse.AddRange(ReadAvailable(remaining)); + } + + var lsbResponse = msbResponse.Select(ReverseBits).ToArray(); + + if (PrintRx) + { + var builder = new StringBuilder(); + for (int i = 0; i < lsbResponse.Length; i++) + { + builder.Append(lsbResponse[i].ToString("X2")); + if (i < lsbResponse.Length - 1) + { + builder.Append(' '); + } + } + + Console.WriteLine($"RX: {builder}"); + } + + return lsbResponse; + } + + public bool Reset() + { + Acc = 4; + + _port.BreakState = true; + _port.DtrEnable = true; + Thread.Sleep(300); + + _port.BreakState = false; + _port.DtrEnable = false; + Thread.Sleep(300); + + Send(new[] { SYNC_BYTE }); + + try + { + var response = ReadResponse(1); + return response.Length > 0 && response[0] == SYNC_BYTE; + } + catch (InvalidOperationException) + { + return false; + } + } + + public void Idle() + { + _port.BreakState = true; + _port.DtrEnable = true; + } + + public void High() + { + _port.BreakState = false; + _port.DtrEnable = false; + } + + public byte[] Cmd(byte addrMsb, byte addrLsb, byte length, byte command = 0x01) + { + SendCommand(new[] + { + command, + (byte)0x04, + (byte)0x03, + addrMsb, + addrLsb, + length + }); + + return ReadResponse(length); + } + + private IEnumerable ReadAvailable(int count) + { + var buffer = new byte[count]; + int totalRead = 0; + + while (totalRead < count) + { + try + { + int read = _port.Read(buffer, totalRead, count - totalRead); + if (read > 0) + { + totalRead += read; + } + } + catch (TimeoutException) + { + break; + } + } + + return buffer.Take(totalRead).ToArray(); + } + } +} From 99d70444f284655e28e8b9eae1c1a8fb9475142a Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 14:25:52 -0500 Subject: [PATCH 19/61] Minor tweaks. --- M18AnalyzerMain.Designer.cs | 212 ++++++++++++++++++------------------ M18AnalyzerMain.resx | 6 + 2 files changed, 112 insertions(+), 106 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 4095f09..b14f062 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -30,8 +30,8 @@ private void InitializeComponent() { components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); - tabControl1 = new TabControl(); - tabPage1 = new TabPage(); + tabControlM18Main = new TabControl(); + tabSimple = new TabPage(); grpOutput = new GroupBox(); btnCopyOutput = new Button(); btnReset = new Button(); @@ -76,7 +76,7 @@ private void InitializeComponent() btnReadAllSpreadsheet = new Button(); btnReadAllRegisters = new Button(); rtbAdvOutput = new RichTextBox(); - tabPage3 = new TabPage(); + tabSimulation = new TabPage(); grpBxSimCustomProfile = new GroupBox(); lblCutoffRaw = new Label(); lblMaxCurrAmps = new Label(); @@ -110,53 +110,53 @@ private void InitializeComponent() txtOneKeyID = new TextBox(); btnSubmitDiagForm = new Button(); tabAbout = new TabPage(); - linkLabel2 = new LinkLabel(); - label1 = new Label(); - linkLabel1 = new LinkLabel(); + linkLabelKillaVolt = new LinkLabel(); + lblKillaVoltAbout = new Label(); + linkLabelMartin = new LinkLabel(); lblMartin = new Label(); lblAboutTitle = new Label(); toolTipSimpleTab = new ToolTip(components); - tabControl1.SuspendLayout(); - tabPage1.SuspendLayout(); + tabControlM18Main.SuspendLayout(); + tabSimple.SuspendLayout(); grpOutput.SuspendLayout(); tabAdvanced.SuspendLayout(); grpTryCmd.SuspendLayout(); grpbxDebugCmd.SuspendLayout(); - tabPage3.SuspendLayout(); + tabSimulation.SuspendLayout(); grpBxSimCustomProfile.SuspendLayout(); tabDiagnostics.SuspendLayout(); grpboxDiagOutput.SuspendLayout(); tabAbout.SuspendLayout(); SuspendLayout(); // - // tabControl1 - // - tabControl1.Controls.Add(tabPage1); - tabControl1.Controls.Add(tabAdvanced); - tabControl1.Controls.Add(tabPage3); - tabControl1.Controls.Add(tabDiagnostics); - tabControl1.Controls.Add(tabAbout); - tabControl1.Location = new Point(8, 8); - tabControl1.Name = "tabControl1"; - tabControl1.SelectedIndex = 0; - tabControl1.Size = new Size(908, 512); - tabControl1.TabIndex = 0; - // - // tabPage1 - // - tabPage1.Controls.Add(grpOutput); - tabPage1.Controls.Add(btnDisconnect); - tabPage1.Controls.Add(btnConnect); - tabPage1.Controls.Add(btnRefresh); - tabPage1.Controls.Add(lblSerialPort); - tabPage1.Controls.Add(cmbBxSerialPort); - tabPage1.Location = new Point(4, 34); - tabPage1.Name = "tabPage1"; - tabPage1.Padding = new Padding(3); - tabPage1.Size = new Size(900, 474); - tabPage1.TabIndex = 0; - tabPage1.Text = "Simple"; - tabPage1.UseVisualStyleBackColor = true; + // tabControlM18Main + // + tabControlM18Main.Controls.Add(tabSimple); + tabControlM18Main.Controls.Add(tabAdvanced); + tabControlM18Main.Controls.Add(tabSimulation); + tabControlM18Main.Controls.Add(tabDiagnostics); + tabControlM18Main.Controls.Add(tabAbout); + tabControlM18Main.Location = new Point(8, 8); + tabControlM18Main.Name = "tabControlM18Main"; + tabControlM18Main.SelectedIndex = 0; + tabControlM18Main.Size = new Size(908, 512); + tabControlM18Main.TabIndex = 0; + // + // tabSimple + // + tabSimple.Controls.Add(grpOutput); + tabSimple.Controls.Add(btnDisconnect); + tabSimple.Controls.Add(btnConnect); + tabSimple.Controls.Add(btnRefresh); + tabSimple.Controls.Add(lblSerialPort); + tabSimple.Controls.Add(cmbBxSerialPort); + tabSimple.Location = new Point(4, 34); + tabSimple.Name = "tabSimple"; + tabSimple.Padding = new Padding(3); + tabSimple.Size = new Size(900, 474); + tabSimple.TabIndex = 0; + tabSimple.Text = "Simple"; + tabSimple.UseVisualStyleBackColor = true; // // grpOutput // @@ -507,7 +507,7 @@ private void InitializeComponent() // chkboxRxLog // chkboxRxLog.AutoSize = true; - chkboxRxLog.Location = new Point(744, 376); + chkboxRxLog.Location = new Point(736, 376); chkboxRxLog.Name = "chkboxRxLog"; chkboxRxLog.Size = new Size(149, 29); chkboxRxLog.TabIndex = 8; @@ -517,7 +517,7 @@ private void InitializeComponent() // chkbxTXLog // chkbxTXLog.AutoSize = true; - chkbxTXLog.Location = new Point(592, 376); + chkbxTXLog.Location = new Point(576, 376); chkbxTXLog.Name = "chkbxTXLog"; chkbxTXLog.Size = new Size(150, 29); chkbxTXLog.TabIndex = 7; @@ -585,24 +585,24 @@ private void InitializeComponent() rtbAdvOutput.TabIndex = 0; rtbAdvOutput.Text = ""; // - // tabPage3 - // - tabPage3.Controls.Add(grpBxSimCustomProfile); - tabPage3.Controls.Add(txtSimDuration); - tabPage3.Controls.Add(btnStopSim); - tabPage3.Controls.Add(btnStartSim); - tabPage3.Controls.Add(lblSimProfile); - tabPage3.Controls.Add(lblBaudRate); - tabPage3.Controls.Add(lblDuration); - tabPage3.Controls.Add(cmbBxChgProfile); - tabPage3.Controls.Add(cmbBxBaudRate); - tabPage3.Location = new Point(4, 34); - tabPage3.Name = "tabPage3"; - tabPage3.Padding = new Padding(3); - tabPage3.Size = new Size(900, 474); - tabPage3.TabIndex = 2; - tabPage3.Text = "Simulation"; - tabPage3.UseVisualStyleBackColor = true; + // tabSimulation + // + tabSimulation.Controls.Add(grpBxSimCustomProfile); + tabSimulation.Controls.Add(txtSimDuration); + tabSimulation.Controls.Add(btnStopSim); + tabSimulation.Controls.Add(btnStartSim); + tabSimulation.Controls.Add(lblSimProfile); + tabSimulation.Controls.Add(lblBaudRate); + tabSimulation.Controls.Add(lblDuration); + tabSimulation.Controls.Add(cmbBxChgProfile); + tabSimulation.Controls.Add(cmbBxBaudRate); + tabSimulation.Location = new Point(4, 34); + tabSimulation.Name = "tabSimulation"; + tabSimulation.Padding = new Padding(3); + tabSimulation.Size = new Size(900, 474); + tabSimulation.TabIndex = 2; + tabSimulation.Text = "Simulation"; + tabSimulation.UseVisualStyleBackColor = true; // // grpBxSimCustomProfile // @@ -895,9 +895,9 @@ private void InitializeComponent() // // tabAbout // - tabAbout.Controls.Add(linkLabel2); - tabAbout.Controls.Add(label1); - tabAbout.Controls.Add(linkLabel1); + tabAbout.Controls.Add(linkLabelKillaVolt); + tabAbout.Controls.Add(lblKillaVoltAbout); + tabAbout.Controls.Add(linkLabelMartin); tabAbout.Controls.Add(lblMartin); tabAbout.Controls.Add(lblAboutTitle); tabAbout.Location = new Point(4, 34); @@ -908,40 +908,40 @@ private void InitializeComponent() tabAbout.Text = "About"; tabAbout.UseVisualStyleBackColor = true; // - // linkLabel2 - // - linkLabel2.AutoSize = true; - linkLabel2.LinkArea = new LinkArea(13, 60); - linkLabel2.Location = new Point(272, 176); - linkLabel2.Name = "linkLabel2"; - linkLabel2.Size = new Size(347, 30); - linkLabel2.TabIndex = 4; - linkLabel2.TabStop = true; - linkLabel2.Text = "GitHub Repo: https://github.com/KillaVolt"; - linkLabel2.UseCompatibleTextRendering = true; - // - // label1 - // - label1.AutoSize = true; - label1.Font = new Font("Segoe UI", 10F, FontStyle.Bold, GraphicsUnit.Point, 0); - label1.Location = new Point(320, 144); - label1.Name = "label1"; - label1.Size = new Size(258, 28); - label1.TabIndex = 3; - label1.Text = "GUI designed By: KillaVolt"; - // - // linkLabel1 - // - linkLabel1.AutoSize = true; - linkLabel1.LinkArea = new LinkArea(13, 60); - linkLabel1.Location = new Point(200, 112); - linkLabel1.Name = "linkLabel1"; - linkLabel1.Size = new Size(514, 30); - linkLabel1.TabIndex = 2; - linkLabel1.TabStop = true; - linkLabel1.Text = "GitHub Repo: https://github.com/mnh-jansson/m18-protocol/"; - linkLabel1.UseCompatibleTextRendering = true; - linkLabel1.LinkClicked += linkLabel1_LinkClicked; + // linkLabelKillaVolt + // + linkLabelKillaVolt.AutoSize = true; + linkLabelKillaVolt.LinkArea = new LinkArea(13, 60); + linkLabelKillaVolt.Location = new Point(272, 176); + linkLabelKillaVolt.Name = "linkLabelKillaVolt"; + linkLabelKillaVolt.Size = new Size(347, 30); + linkLabelKillaVolt.TabIndex = 4; + linkLabelKillaVolt.TabStop = true; + linkLabelKillaVolt.Text = "GitHub Repo: https://github.com/KillaVolt"; + linkLabelKillaVolt.UseCompatibleTextRendering = true; + // + // lblKillaVoltAbout + // + lblKillaVoltAbout.AutoSize = true; + lblKillaVoltAbout.Font = new Font("Segoe UI", 10F, FontStyle.Bold, GraphicsUnit.Point, 0); + lblKillaVoltAbout.Location = new Point(320, 144); + lblKillaVoltAbout.Name = "lblKillaVoltAbout"; + lblKillaVoltAbout.Size = new Size(258, 28); + lblKillaVoltAbout.TabIndex = 3; + lblKillaVoltAbout.Text = "GUI designed By: KillaVolt"; + // + // linkLabelMartin + // + linkLabelMartin.AutoSize = true; + linkLabelMartin.LinkArea = new LinkArea(13, 60); + linkLabelMartin.Location = new Point(200, 112); + linkLabelMartin.Name = "linkLabelMartin"; + linkLabelMartin.Size = new Size(514, 30); + linkLabelMartin.TabIndex = 2; + linkLabelMartin.TabStop = true; + linkLabelMartin.Text = "GitHub Repo: https://github.com/mnh-jansson/m18-protocol/"; + linkLabelMartin.UseCompatibleTextRendering = true; + linkLabelMartin.LinkClicked += linkLabel1_LinkClicked; // // lblMartin // @@ -970,15 +970,15 @@ private void InitializeComponent() AutoScaleDimensions = new SizeF(10F, 25F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(928, 528); - Controls.Add(tabControl1); + Controls.Add(tabControlM18Main); Icon = (Icon)resources.GetObject("$this.Icon"); Name = "frmMain"; ShowIcon = false; Text = "M18 Pack Analyzer"; Load += frmMain_Load; - tabControl1.ResumeLayout(false); - tabPage1.ResumeLayout(false); - tabPage1.PerformLayout(); + tabControlM18Main.ResumeLayout(false); + tabSimple.ResumeLayout(false); + tabSimple.PerformLayout(); grpOutput.ResumeLayout(false); tabAdvanced.ResumeLayout(false); tabAdvanced.PerformLayout(); @@ -986,8 +986,8 @@ private void InitializeComponent() grpTryCmd.PerformLayout(); grpbxDebugCmd.ResumeLayout(false); grpbxDebugCmd.PerformLayout(); - tabPage3.ResumeLayout(false); - tabPage3.PerformLayout(); + tabSimulation.ResumeLayout(false); + tabSimulation.PerformLayout(); grpBxSimCustomProfile.ResumeLayout(false); grpBxSimCustomProfile.PerformLayout(); tabDiagnostics.ResumeLayout(false); @@ -1000,12 +1000,12 @@ private void InitializeComponent() #endregion - private TabControl tabControl1; - private TabPage tabPage1; + private TabControl tabControlM18Main; + private TabPage tabSimple; private TabPage tabAdvanced; private ComboBox cmbBxSerialPort; private RichTextBox rtbOutput; - private TabPage tabPage3; + private TabPage tabSimulation; private TabPage tabDiagnostics; private Button btnConnect; private Button btnRefresh; @@ -1084,9 +1084,9 @@ private void InitializeComponent() private Button btnClearDiagForm; private GroupBox grpBxSimCustomProfile; private Label lblAboutTitle; - private LinkLabel linkLabel1; + private LinkLabel linkLabelMartin; private Label lblMartin; - private LinkLabel linkLabel2; - private Label label1; + private LinkLabel linkLabelKillaVolt; + private Label lblKillaVoltAbout; } } diff --git a/M18AnalyzerMain.resx b/M18AnalyzerMain.resx index 3071537..ce496dc 100644 --- a/M18AnalyzerMain.resx +++ b/M18AnalyzerMain.resx @@ -252,6 +252,12 @@ Step 4: Set Idle (Tx Low) before unplugging battery and/or disconnecting the ser IOkQGhLK9WiedIH9HyjtxGfo3wGRAAAAAElFTkSuQmCC + + 9, 21 + + + 40 + AAABAAkAEBAAAAEAIABoBAAAlgAAABgYAAABACAAiAkAAP4EAAAgIAAAAQAgAKgQAACGDgAAMDAAAAEA From b92b0e9c30351600be703b609c26e2716d7437f8 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 14:45:23 -0500 Subject: [PATCH 20/61] Add async protocol handlers for Simple tab controls --- M18AnalyzerMain.cs | 151 ++++++++++++++++++++++++++++++++++++++------- M18Protocol.cs | 46 ++++++++++++++ 2 files changed, 175 insertions(+), 22 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index bc65e73..719c41a 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -1,10 +1,15 @@ +using System; +using System.Collections.Generic; using System.IO.Ports; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; namespace M18BatteryInfo { public partial class frmMain : Form { - private SerialPort? _serialPort; + private M18Protocol? _protocol; private bool _hasAppendedLog; public frmMain() @@ -14,6 +19,20 @@ public frmMain() btnRefresh.Click += btnRefresh_Click; btnConnect.Click += btnConnect_Click; btnDisconnect.Click += btnDisconnect_Click; + btnIdle.Click += btnIdle_Click; + btnActive.Click += btnActive_Click; + btnHealthReport.Click += btnHealthReport_Click; + btnReset.Click += btnReset_Click; + btnCopyOutput.Click += btnCopyOutput_Click; + + toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available serial ports."); + toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); + toolTipSimpleTab.SetToolTip(btnDisconnect, "Disconnect from the currently connected device."); + toolTipSimpleTab.SetToolTip(btnIdle, "Drive TX low (idle). Safe for connect/disconnect."); + toolTipSimpleTab.SetToolTip(btnActive, "Drive TX high (active). Charger simulation."); + toolTipSimpleTab.SetToolTip(btnHealthReport, "Read and display a basic battery health report."); + toolTipSimpleTab.SetToolTip(btnReset, "Send a reset signal to the connected battery."); + toolTipSimpleTab.SetToolTip(btnCopyOutput, "Copy all output log text to the clipboard."); } private void toolStripButton1_Click(object sender, EventArgs e) @@ -89,7 +108,7 @@ private void RefreshSerialPorts() } } - private void btnConnect_Click(object? sender, EventArgs e) + private async void btnConnect_Click(object? sender, EventArgs e) { if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) { @@ -98,66 +117,148 @@ private void btnConnect_Click(object? sender, EventArgs e) return; } - if (_serialPort?.IsOpen == true) + if (_protocol != null) { - if (string.Equals(_serialPort.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(_protocol.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) { AppendLog($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } - AppendLog($"A different port ({_serialPort.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); - btnDisconnect_Click(sender, e); + AppendLog($"A different port ({_protocol.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); + await DisconnectAsync(); } AppendLog($"Attempting to open {selectedPort} with settings: 4800 baud, 8 data bits, parity None, stop bits One, handshake None."); - _serialPort = new SerialPort(selectedPort.PortName, 4800, Parity.None, 8, StopBits.One) - { - Handshake = Handshake.None, - ReadTimeout = 500, - WriteTimeout = 500 - }; - try { - _serialPort.Open(); + await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName)); AppendLog($"{selectedPort} opened successfully."); } catch (Exception ex) { + _protocol = null; LogError($"Failed to open {selectedPort}.", ex); } } - private void btnDisconnect_Click(object? sender, EventArgs e) + private async void btnDisconnect_Click(object? sender, EventArgs e) + { + await DisconnectAsync(); + } + + private async Task DisconnectAsync() { - if (_serialPort == null || !_serialPort.IsOpen) + if (_protocol == null) { AppendLog("Disconnect requested, but no serial port is currently open."); MessageBox.Show("No serial port is currently open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } - AppendLog($"Closing {_serialPort.PortName}..."); + AppendLog($"Closing {_protocol.PortName}..."); try { - _serialPort.Close(); - AppendLog($"{_serialPort.PortName} closed successfully."); + await Task.Run(() => _protocol.Close()); + AppendLog($"{_protocol.PortName} closed successfully."); } catch (Exception ex) { - LogError($"Error while closing {_serialPort.PortName}.", ex); + LogError($"Error while closing {_protocol.PortName}.", ex); } finally { - _serialPort.Dispose(); - _serialPort = null; + _protocol = null; + } + } + + private async void btnIdle_Click(object? sender, EventArgs e) + { + if (!EnsureConnected()) + { + return; + } + + await Task.Run(() => _protocol!.Idle()); + AppendLog("TX set to Idle (low). Safe to connect or disconnect battery."); + } + + private async void btnActive_Click(object? sender, EventArgs e) + { + if (!EnsureConnected()) + { + return; + } + + await Task.Run(() => _protocol!.High()); + AppendLog("TX set to Active (high). Charger simulation enabled."); + } + + private async void btnHealthReport_Click(object? sender, EventArgs e) + { + if (!EnsureConnected()) + { + return; + } + + try + { + var report = await Task.Run(() => _protocol!.HealthReport()); + AppendLog("=== Health report ==="); + AppendLog(report); + AppendLog("Health report complete."); + } + catch (Exception ex) + { + LogError("Health report failed.", ex); + } + } + + private async void btnReset_Click(object? sender, EventArgs e) + { + if (!EnsureConnected()) + { + return; + } + + try + { + var success = await Task.Run(() => _protocol!.Reset()); + AppendLog(success ? "Reset command acknowledged by device." : "Reset command did not receive expected response."); + } + catch (Exception ex) + { + LogError("Reset failed.", ex); } } + private void btnCopyOutput_Click(object? sender, EventArgs e) + { + if (string.IsNullOrEmpty(rtbOutput.Text)) + { + AppendLog("No output to copy."); + return; + } + + Clipboard.SetText(rtbOutput.Text); + AppendLog("Output copied to clipboard."); + } + + private bool EnsureConnected() + { + if (_protocol != null) + { + return true; + } + + AppendLog("No active connection. Please connect to a serial port first."); + MessageBox.Show("Please connect to a serial port first.", "Connection required", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return false; + } + private Dictionary GetPortDescriptions() { var descriptions = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -198,6 +299,12 @@ private void AppendLog(string message) var timestampedMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; var prefix = _hasAppendedLog ? $"{Environment.NewLine}" : string.Empty; + if (rtbOutput.InvokeRequired) + { + rtbOutput.Invoke(new Action(() => AppendLog(message))); + return; + } + rtbOutput.AppendText($"{prefix}{timestampedMessage}"); rtbOutput.SelectionStart = rtbOutput.TextLength; rtbOutput.ScrollToCaret(); diff --git a/M18Protocol.cs b/M18Protocol.cs index a3fa3e3..a991494 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -32,6 +32,7 @@ public class M18Protocol public bool PrintRx { get; set; } private readonly SerialPort _port; + private bool _disposed; public M18Protocol(string portName) { @@ -45,6 +46,9 @@ public M18Protocol(string portName) Idle(); } + public string PortName => _port.PortName; + public bool IsOpen => _port.IsOpen; + public byte ReverseBits(byte value) { byte reversed = 0; @@ -205,6 +209,48 @@ public void High() _port.DtrEnable = false; } + public string HealthReport() + { + var builder = new StringBuilder(); + + builder.AppendLine($"Port: {_port.PortName}"); + builder.AppendLine($"Port open: {_port.IsOpen}"); + builder.AppendLine("Basic health report functionality is limited in this build."); + builder.AppendLine("Connect to a battery pack to retrieve detailed statistics."); + + return builder.ToString().TrimEnd(); + } + + public void Close() + { + if (_disposed) + { + return; + } + + _disposed = true; + + try + { + Idle(); + } + catch + { + } + + try + { + _port.Close(); + } + catch + { + } + finally + { + _port.Dispose(); + } + } + public byte[] Cmd(byte addrMsb, byte addrLsb, byte length, byte command = 0x01) { SendCommand(new[] From 39e27c4a7730ba1dfd4f273bbc42a94992601e61 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 14:59:04 -0500 Subject: [PATCH 21/61] Add UI-controlled TX/RX logging --- M18AnalyzerMain.Designer.cs | 34 +++++++++-------- M18AnalyzerMain.cs | 75 ++++++++++++++++++++++++++++++++++--- M18Protocol.cs | 15 ++++++-- 3 files changed, 100 insertions(+), 24 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index b14f062..4deec11 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -504,21 +504,25 @@ private void InitializeComponent() btnSaveTxRxState.Text = "Save && Set TxRx State"; btnSaveTxRxState.UseVisualStyleBackColor = true; // - // chkboxRxLog - // - chkboxRxLog.AutoSize = true; - chkboxRxLog.Location = new Point(736, 376); - chkboxRxLog.Name = "chkboxRxLog"; - chkboxRxLog.Size = new Size(149, 29); - chkboxRxLog.TabIndex = 8; - chkboxRxLog.Text = "Enable Rx Log"; - chkboxRxLog.UseVisualStyleBackColor = true; - // - // chkbxTXLog - // - chkbxTXLog.AutoSize = true; - chkbxTXLog.Location = new Point(576, 376); - chkbxTXLog.Name = "chkbxTXLog"; + // chkboxRxLog + // + chkboxRxLog.AutoSize = true; + chkboxRxLog.Checked = true; + chkboxRxLog.CheckState = CheckState.Checked; + chkboxRxLog.Location = new Point(736, 376); + chkboxRxLog.Name = "chkboxRxLog"; + chkboxRxLog.Size = new Size(149, 29); + chkboxRxLog.TabIndex = 8; + chkboxRxLog.Text = "Enable Rx Log"; + chkboxRxLog.UseVisualStyleBackColor = true; + // + // chkbxTXLog + // + chkbxTXLog.AutoSize = true; + chkbxTXLog.Checked = true; + chkbxTXLog.CheckState = CheckState.Checked; + chkbxTXLog.Location = new Point(576, 376); + chkbxTXLog.Name = "chkbxTXLog"; chkbxTXLog.Size = new Size(150, 29); chkbxTXLog.TabIndex = 7; chkbxTXLog.Text = "Enable TX Log"; diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 719c41a..15da6f2 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -11,6 +11,7 @@ public partial class frmMain : Form { private M18Protocol? _protocol; private bool _hasAppendedLog; + private bool _hasAppendedAdvancedLog; public frmMain() { @@ -24,6 +25,11 @@ public frmMain() btnHealthReport.Click += btnHealthReport_Click; btnReset.Click += btnReset_Click; btnCopyOutput.Click += btnCopyOutput_Click; + chkbxTXLog.CheckedChanged += chkbxTXLog_CheckedChanged; + chkboxRxLog.CheckedChanged += chkboxRxLog_CheckedChanged; + + chkbxTXLog.Checked = true; + chkboxRxLog.Checked = true; toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available serial ports."); toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); @@ -135,6 +141,7 @@ private async void btnConnect_Click(object? sender, EventArgs e) try { await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName)); + ApplyProtocolLoggingPreferences(); AppendLog($"{selectedPort} opened successfully."); } catch (Exception ex) @@ -296,22 +303,51 @@ private Dictionary GetPortDescriptions() private void AppendLog(string message) { - var timestampedMessage = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; - var prefix = _hasAppendedLog ? $"{Environment.NewLine}" : string.Empty; + AppendSimpleLog(FormatLogMessage(message)); + } + private void AppendSimpleLog(string formattedMessage) + { if (rtbOutput.InvokeRequired) { - rtbOutput.Invoke(new Action(() => AppendLog(message))); + rtbOutput.Invoke(new Action(() => AppendSimpleLog(formattedMessage))); return; } - rtbOutput.AppendText($"{prefix}{timestampedMessage}"); + var prefix = _hasAppendedLog ? Environment.NewLine : string.Empty; + rtbOutput.AppendText($"{prefix}{formattedMessage}"); rtbOutput.SelectionStart = rtbOutput.TextLength; rtbOutput.ScrollToCaret(); - _hasAppendedLog = true; } + private void AppendAdvancedLog(string formattedMessage) + { + if (rtbAdvOutput.InvokeRequired) + { + rtbAdvOutput.Invoke(new Action(() => AppendAdvancedLog(formattedMessage))); + return; + } + + var prefix = _hasAppendedAdvancedLog ? Environment.NewLine : string.Empty; + rtbAdvOutput.AppendText($"{prefix}{formattedMessage}"); + rtbAdvOutput.SelectionStart = rtbAdvOutput.TextLength; + rtbAdvOutput.ScrollToCaret(); + _hasAppendedAdvancedLog = true; + } + + private string FormatLogMessage(string message) + { + return $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; + } + + private void AppendProtocolLog(string message) + { + var formattedMessage = FormatLogMessage(message); + AppendSimpleLog(formattedMessage); + AppendAdvancedLog(formattedMessage); + } + private void LogError(string context, Exception exception) { var fullMessage = $"{context} Error details: {exception}"; @@ -319,6 +355,35 @@ private void LogError(string context, Exception exception) MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } + private void ApplyProtocolLoggingPreferences() + { + if (_protocol == null) + { + return; + } + + _protocol.PrintTx = chkbxTXLog.Checked; + _protocol.PrintRx = chkboxRxLog.Checked; + _protocol.TxLogger = AppendProtocolLog; + _protocol.RxLogger = AppendProtocolLog; + } + + private void chkbxTXLog_CheckedChanged(object? sender, EventArgs e) + { + if (_protocol != null) + { + _protocol.PrintTx = chkbxTXLog.Checked; + } + } + + private void chkboxRxLog_CheckedChanged(object? sender, EventArgs e) + { + if (_protocol != null) + { + _protocol.PrintRx = chkboxRxLog.Checked; + } + } + private void rtbOutput_TextChanged(object sender, EventArgs e) { diff --git a/M18Protocol.cs b/M18Protocol.cs index a991494..99bb435 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -28,8 +28,11 @@ public class M18Protocol public int Acc { get; private set; } = 4; - public bool PrintTx { get; set; } - public bool PrintRx { get; set; } + public bool PrintTx { get; set; } = true; + public bool PrintRx { get; set; } = true; + + public Action? TxLogger { get; set; } + public Action? RxLogger { get; set; } private readonly SerialPort _port; private bool _disposed; @@ -116,7 +119,9 @@ public void Send(byte[] command) } } - Console.WriteLine($"TX: {builder}"); + var logMessage = $"TX: {builder}"; + TxLogger?.Invoke(logMessage); + Console.WriteLine(logMessage); } _port.Write(msb, 0, msb.Length); @@ -166,7 +171,9 @@ public byte[] ReadResponse(int size) } } - Console.WriteLine($"RX: {builder}"); + var logMessage = $"RX: {builder}"; + RxLogger?.Invoke(logMessage); + Console.WriteLine(logMessage); } return lsbResponse; From 0a211db2eed01e7698ccb7cb57a9db0caf806e38 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 16:41:10 -0500 Subject: [PATCH 22/61] Added temporary debugging output window. --- M18AnalyzerMain.Designer.cs | 51 ++++++++++++++++++++++--------------- M18AnalyzerMain.resx | 3 --- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 4deec11..d3ae74d 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -116,6 +116,7 @@ private void InitializeComponent() lblMartin = new Label(); lblAboutTitle = new Label(); toolTipSimpleTab = new ToolTip(components); + rtbDebugOutput = new RichTextBox(); tabControlM18Main.SuspendLayout(); tabSimple.SuspendLayout(); grpOutput.SuspendLayout(); @@ -504,25 +505,25 @@ private void InitializeComponent() btnSaveTxRxState.Text = "Save && Set TxRx State"; btnSaveTxRxState.UseVisualStyleBackColor = true; // - // chkboxRxLog - // - chkboxRxLog.AutoSize = true; - chkboxRxLog.Checked = true; - chkboxRxLog.CheckState = CheckState.Checked; - chkboxRxLog.Location = new Point(736, 376); - chkboxRxLog.Name = "chkboxRxLog"; - chkboxRxLog.Size = new Size(149, 29); - chkboxRxLog.TabIndex = 8; - chkboxRxLog.Text = "Enable Rx Log"; - chkboxRxLog.UseVisualStyleBackColor = true; - // - // chkbxTXLog - // - chkbxTXLog.AutoSize = true; - chkbxTXLog.Checked = true; - chkbxTXLog.CheckState = CheckState.Checked; - chkbxTXLog.Location = new Point(576, 376); - chkbxTXLog.Name = "chkbxTXLog"; + // chkboxRxLog + // + chkboxRxLog.AutoSize = true; + chkboxRxLog.Checked = true; + chkboxRxLog.CheckState = CheckState.Checked; + chkboxRxLog.Location = new Point(736, 376); + chkboxRxLog.Name = "chkboxRxLog"; + chkboxRxLog.Size = new Size(149, 29); + chkboxRxLog.TabIndex = 8; + chkboxRxLog.Text = "Enable Rx Log"; + chkboxRxLog.UseVisualStyleBackColor = true; + // + // chkbxTXLog + // + chkbxTXLog.AutoSize = true; + chkbxTXLog.Checked = true; + chkbxTXLog.CheckState = CheckState.Checked; + chkbxTXLog.Location = new Point(576, 376); + chkbxTXLog.Name = "chkbxTXLog"; chkbxTXLog.Size = new Size(150, 29); chkbxTXLog.TabIndex = 7; chkbxTXLog.Text = "Enable TX Log"; @@ -969,11 +970,20 @@ private void InitializeComponent() lblAboutTitle.Text = " Pack Analyzer GUI"; lblAboutTitle.TextAlign = ContentAlignment.TopCenter; // + // rtbDebugOutput + // + rtbDebugOutput.Location = new Point(24, 544); + rtbDebugOutput.Name = "rtbDebugOutput"; + rtbDebugOutput.Size = new Size(880, 168); + rtbDebugOutput.TabIndex = 1; + rtbDebugOutput.Text = ""; + // // frmMain // AutoScaleDimensions = new SizeF(10F, 25F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(928, 528); + ClientSize = new Size(928, 730); + Controls.Add(rtbDebugOutput); Controls.Add(tabControlM18Main); Icon = (Icon)resources.GetObject("$this.Icon"); Name = "frmMain"; @@ -1092,5 +1102,6 @@ private void InitializeComponent() private Label lblMartin; private LinkLabel linkLabelKillaVolt; private Label lblKillaVoltAbout; + private RichTextBox rtbDebugOutput; } } diff --git a/M18AnalyzerMain.resx b/M18AnalyzerMain.resx index ce496dc..5bc1ef6 100644 --- a/M18AnalyzerMain.resx +++ b/M18AnalyzerMain.resx @@ -252,9 +252,6 @@ Step 4: Set Idle (Tx Low) before unplugging battery and/or disconnecting the ser IOkQGhLK9WiedIH9HyjtxGfo3wGRAAAAAElFTkSuQmCC - - 9, 21 - 40 From f4283daf8dcb91499ce6f1bcc5d2b516875917f2 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 16:48:35 -0500 Subject: [PATCH 23/61] Add comprehensive debug logging --- M18AnalyzerMain.cs | 65 ++++++++++++++++++++++++++++++++-- M18Protocol.cs | 88 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 145 insertions(+), 8 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 15da6f2..5cccba4 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -12,6 +12,7 @@ public partial class frmMain : Form private M18Protocol? _protocol; private bool _hasAppendedLog; private bool _hasAppendedAdvancedLog; + private bool _hasAppendedDebugLog; public frmMain() { @@ -31,6 +32,8 @@ public frmMain() chkbxTXLog.Checked = true; chkboxRxLog.Checked = true; + LogDebug("Application initialized. Default TX/RX logging enabled."); + toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available serial ports."); toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); toolTipSimpleTab.SetToolTip(btnDisconnect, "Disconnect from the currently connected device."); @@ -78,11 +81,13 @@ private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) private void btnRefresh_Click(object? sender, EventArgs e) { + LogDebug("Refresh button pressed - calling RefreshSerialPorts()."); RefreshSerialPorts(); } private void RefreshSerialPorts() { + LogDebug("Entering RefreshSerialPorts(). Fetching available serial ports."); AppendLog("Refreshing serial port list..."); try @@ -90,12 +95,15 @@ private void RefreshSerialPorts() var portDescriptions = GetPortDescriptions(); var portNames = SerialPort.GetPortNames().OrderBy(port => port, StringComparer.OrdinalIgnoreCase).ToList(); + LogDebug($"Detected {portNames.Count} serial port(s)."); + cmbBxSerialPort.Items.Clear(); foreach (var port in portNames) { portDescriptions.TryGetValue(port, out var description); cmbBxSerialPort.Items.Add(new SerialPortDisplay(port, description)); + LogDebug($"Added port to combo box: {port}{(string.IsNullOrWhiteSpace(description) ? string.Empty : $" - {description}")}"); AppendLog($"Found port {port}{(string.IsNullOrWhiteSpace(description) ? string.Empty : $" - {description}")}"); } @@ -116,6 +124,7 @@ private void RefreshSerialPorts() private async void btnConnect_Click(object? sender, EventArgs e) { + LogDebug("Connect button pressed - attempting to establish protocol connection."); if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) { AppendLog("No serial port selected. Please choose a port before connecting."); @@ -140,8 +149,9 @@ private async void btnConnect_Click(object? sender, EventArgs e) try { - await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName)); + await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName, LogDebug)); ApplyProtocolLoggingPreferences(); + LogDebug($"Protocol initialized for {selectedPort.PortName}."); AppendLog($"{selectedPort} opened successfully."); } catch (Exception ex) @@ -153,11 +163,13 @@ private async void btnConnect_Click(object? sender, EventArgs e) private async void btnDisconnect_Click(object? sender, EventArgs e) { + LogDebug("Disconnect button pressed - initiating disconnect sequence."); await DisconnectAsync(); } private async Task DisconnectAsync() { + LogDebug("Entering DisconnectAsync()."); if (_protocol == null) { AppendLog("Disconnect requested, but no serial port is currently open."); @@ -170,6 +182,7 @@ private async Task DisconnectAsync() try { await Task.Run(() => _protocol.Close()); + LogDebug("Protocol closed successfully."); AppendLog($"{_protocol.PortName} closed successfully."); } catch (Exception ex) @@ -184,6 +197,7 @@ private async Task DisconnectAsync() private async void btnIdle_Click(object? sender, EventArgs e) { + LogDebug("Idle button pressed - requesting _protocol.Idle()."); if (!EnsureConnected()) { return; @@ -195,6 +209,7 @@ private async void btnIdle_Click(object? sender, EventArgs e) private async void btnActive_Click(object? sender, EventArgs e) { + LogDebug("Active button pressed - requesting _protocol.High()."); if (!EnsureConnected()) { return; @@ -206,6 +221,7 @@ private async void btnActive_Click(object? sender, EventArgs e) private async void btnHealthReport_Click(object? sender, EventArgs e) { + LogDebug("Health Report button pressed - requesting _protocol.HealthReport()."); if (!EnsureConnected()) { return; @@ -226,6 +242,7 @@ private async void btnHealthReport_Click(object? sender, EventArgs e) private async void btnReset_Click(object? sender, EventArgs e) { + LogDebug("Reset button pressed - requesting _protocol.Reset()."); if (!EnsureConnected()) { return; @@ -244,6 +261,7 @@ private async void btnReset_Click(object? sender, EventArgs e) private void btnCopyOutput_Click(object? sender, EventArgs e) { + LogDebug("Copy Output button pressed - copying rtbOutput content to clipboard."); if (string.IsNullOrEmpty(rtbOutput.Text)) { AppendLog("No output to copy."); @@ -256,8 +274,10 @@ private void btnCopyOutput_Click(object? sender, EventArgs e) private bool EnsureConnected() { + LogDebug("Checking connection status via EnsureConnected()."); if (_protocol != null) { + LogDebug("Protocol already connected."); return true; } @@ -268,6 +288,7 @@ private bool EnsureConnected() private Dictionary GetPortDescriptions() { + LogDebug("Attempting to retrieve port descriptions via WMI query."); var descriptions = new Dictionary(StringComparer.OrdinalIgnoreCase); try @@ -346,12 +367,14 @@ private void AppendProtocolLog(string message) var formattedMessage = FormatLogMessage(message); AppendSimpleLog(formattedMessage); AppendAdvancedLog(formattedMessage); + LogDebug($"Protocol log forwarded to debug output: {message}"); } private void LogError(string context, Exception exception) { var fullMessage = $"{context} Error details: {exception}"; AppendLog(fullMessage); + LogDebug(fullMessage); MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } @@ -364,8 +387,18 @@ private void ApplyProtocolLoggingPreferences() _protocol.PrintTx = chkbxTXLog.Checked; _protocol.PrintRx = chkboxRxLog.Checked; - _protocol.TxLogger = AppendProtocolLog; - _protocol.RxLogger = AppendProtocolLog; + _protocol.DebugLogger = LogDebug; + _protocol.TxLogger = message => + { + AppendProtocolLog(message); + LogDebug($"TX log forwarded from protocol: {message}"); + }; + _protocol.RxLogger = message => + { + AppendProtocolLog(message); + LogDebug($"RX log forwarded from protocol: {message}"); + }; + LogDebug($"Protocol logging preferences applied. PrintTx={_protocol.PrintTx}, PrintRx={_protocol.PrintRx}."); } private void chkbxTXLog_CheckedChanged(object? sender, EventArgs e) @@ -373,6 +406,11 @@ private void chkbxTXLog_CheckedChanged(object? sender, EventArgs e) if (_protocol != null) { _protocol.PrintTx = chkbxTXLog.Checked; + LogDebug($"TX logging preference changed: {_protocol.PrintTx}."); + } + else + { + LogDebug($"TX logging checkbox changed to {chkbxTXLog.Checked} (protocol not initialized yet)."); } } @@ -381,9 +419,30 @@ private void chkboxRxLog_CheckedChanged(object? sender, EventArgs e) if (_protocol != null) { _protocol.PrintRx = chkboxRxLog.Checked; + LogDebug($"RX logging preference changed: {_protocol.PrintRx}."); + } + else + { + LogDebug($"RX logging checkbox changed to {chkboxRxLog.Checked} (protocol not initialized yet)."); } } + private void LogDebug(string message) + { + if (rtbDebugOutput.InvokeRequired) + { + rtbDebugOutput.Invoke(new Action(() => LogDebug(message))); + return; + } + + var timestamped = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; + var prefix = _hasAppendedDebugLog ? Environment.NewLine : string.Empty; + rtbDebugOutput.AppendText($"{prefix}{timestamped}"); + rtbDebugOutput.SelectionStart = rtbDebugOutput.TextLength; + rtbDebugOutput.ScrollToCaret(); + _hasAppendedDebugLog = true; + } + private void rtbOutput_TextChanged(object sender, EventArgs e) { diff --git a/M18Protocol.cs b/M18Protocol.cs index 99bb435..4c784bf 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -33,20 +33,26 @@ public class M18Protocol public Action? TxLogger { get; set; } public Action? RxLogger { get; set; } + public Action? DebugLogger { get; set; } private readonly SerialPort _port; private bool _disposed; - public M18Protocol(string portName) + public M18Protocol(string portName, Action? debugLogger = null) { + DebugLogger = debugLogger; + LogDebug($"Initializing protocol for port {portName}."); _port = new SerialPort(portName, 4800, Parity.None, 8, StopBits.Two) { ReadTimeout = 800, WriteTimeout = 800 }; + LogDebug("Opening serial port..."); _port.Open(); + LogDebug("Serial port opened. Setting TX to idle state."); Idle(); + LogDebug("Protocol initialization complete."); } public string PortName => _port.PortName; @@ -54,6 +60,7 @@ public M18Protocol(string portName) public byte ReverseBits(byte value) { + LogDebug($"ReverseBits called with value 0x{value:X2}."); byte reversed = 0; for (int i = 0; i < 8; i++) { @@ -61,17 +68,26 @@ public byte ReverseBits(byte value) reversed |= (byte)((value >> i) & 0x01); } + LogDebug($"ReverseBits returning 0x{reversed:X2}."); return reversed; } public int Checksum(IEnumerable payload) { + if (payload == null) + { + LogDebug("Checksum called with null payload."); + throw new ArgumentNullException(nameof(payload)); + } + + LogDebug("Checksum calculation started."); int checksum = 0; foreach (var b in payload) { checksum += b & 0xFFFF; } + LogDebug($"Checksum calculation complete: {checksum & 0xFFFF}."); return checksum; } @@ -79,9 +95,11 @@ public byte[] AddChecksum(byte[] lsbCommand) { if (lsbCommand == null) { + LogDebug("AddChecksum called with null lsbCommand."); throw new ArgumentNullException(nameof(lsbCommand)); } + LogDebug($"AddChecksum called for payload length {lsbCommand.Length}."); int checksum = Checksum(lsbCommand); var withChecksum = new byte[lsbCommand.Length + 2]; Buffer.BlockCopy(lsbCommand, 0, withChecksum, 0, lsbCommand.Length); @@ -89,6 +107,7 @@ public byte[] AddChecksum(byte[] lsbCommand) withChecksum[withChecksum.Length - 2] = (byte)((checksum >> 8) & 0xFF); withChecksum[withChecksum.Length - 1] = (byte)(checksum & 0xFF); + LogDebug($"Checksum {checksum & 0xFFFF} appended. Final payload: {FormatBytes(withChecksum)}."); return withChecksum; } @@ -96,10 +115,13 @@ public void Send(byte[] command) { if (command == null) { + LogDebug("Send called with null command."); throw new ArgumentNullException(nameof(command)); } + LogDebug($"Send called with command length {command.Length}. Raw payload: {FormatBytes(command)}."); _port.DiscardInBuffer(); + LogDebug("Input buffer discarded prior to send."); var msb = new byte[command.Length]; for (int i = 0; i < command.Length; i++) @@ -125,15 +147,18 @@ public void Send(byte[] command) } _port.Write(msb, 0, msb.Length); + LogDebug($"Command sent over serial: {FormatBytes(msb)} (MSB)."); } public void SendCommand(byte[] command) { + LogDebug("SendCommand invoked."); Send(AddChecksum(command)); } public byte[] ReadResponse(int size) { + LogDebug($"ReadResponse called with expected size {size}."); int firstByte; try { @@ -141,24 +166,31 @@ public byte[] ReadResponse(int size) } catch (TimeoutException) { + LogDebug("ReadResponse timed out waiting for first byte."); throw new InvalidOperationException("Empty response"); } if (firstByte < 0) { + LogDebug("ReadResponse encountered invalid first byte (<0)."); throw new InvalidOperationException("Empty response"); } var msbResponse = new List { (byte)firstByte }; int remaining = ReverseBits((byte)firstByte) == 0x82 ? 1 : Math.Max(0, size - 1); + LogDebug($"First byte received (MSB): 0x{firstByte:X2}. Calculated remaining bytes to read: {remaining}."); + if (remaining > 0) { + LogDebug($"Reading remaining {remaining} byte(s) from serial port."); msbResponse.AddRange(ReadAvailable(remaining)); } var lsbResponse = msbResponse.Select(ReverseBits).ToArray(); + LogDebug($"Full response received (LSB): {FormatBytes(lsbResponse)}."); + if (PrintRx) { var builder = new StringBuilder(); @@ -181,6 +213,7 @@ public byte[] ReadResponse(int size) public bool Reset() { + LogDebug("Reset invoked. Driving control lines to issue reset sequence."); Acc = 4; _port.BreakState = true; @@ -195,29 +228,36 @@ public bool Reset() try { + LogDebug("Awaiting reset response after SYNC byte."); var response = ReadResponse(1); - return response.Length > 0 && response[0] == SYNC_BYTE; + var success = response.Length > 0 && response[0] == SYNC_BYTE; + LogDebug($"Reset response {(success ? "acknowledged" : "did not match expected SYNC")}."); + return success; } - catch (InvalidOperationException) + catch (InvalidOperationException ex) { + LogDebug($"Reset failed with exception: {ex.GetType().Name} - {ex.Message}"); return false; } } public void Idle() { + LogDebug("Setting TX to Idle (BreakState=true, DtrEnable=true)."); _port.BreakState = true; _port.DtrEnable = true; } public void High() { + LogDebug("Setting TX to Active (BreakState=false, DtrEnable=false)."); _port.BreakState = false; _port.DtrEnable = false; } public string HealthReport() { + LogDebug("Generating HealthReport summary."); var builder = new StringBuilder(); builder.AppendLine($"Port: {_port.PortName}"); @@ -230,8 +270,10 @@ public string HealthReport() public void Close() { + LogDebug("Close invoked. Beginning disposal sequence."); if (_disposed) { + LogDebug("Close skipped because object is already disposed."); return; } @@ -241,25 +283,29 @@ public void Close() { Idle(); } - catch + catch (Exception ex) { + LogDebug($"Error setting idle during close: {ex.GetType().Name} - {ex.Message}"); } try { _port.Close(); } - catch + catch (Exception ex) { + LogDebug($"Error while closing serial port: {ex.GetType().Name} - {ex.Message}"); } finally { _port.Dispose(); + LogDebug("Serial port disposed."); } } public byte[] Cmd(byte addrMsb, byte addrLsb, byte length, byte command = 0x01) { + LogDebug($"Cmd invoked with addrMsb=0x{addrMsb:X2}, addrLsb=0x{addrLsb:X2}, length={length}, command=0x{command:X2}."); SendCommand(new[] { command, @@ -275,6 +321,7 @@ public byte[] Cmd(byte addrMsb, byte addrLsb, byte length, byte command = 0x01) private IEnumerable ReadAvailable(int count) { + LogDebug($"ReadAvailable attempting to read {count} byte(s)."); var buffer = new byte[count]; int totalRead = 0; @@ -286,15 +333,46 @@ private IEnumerable ReadAvailable(int count) if (read > 0) { totalRead += read; + LogDebug($"Read {read} byte(s); total read so far: {totalRead}."); } } catch (TimeoutException) { + LogDebug("Timeout encountered while reading available bytes."); break; } } + var result = buffer.Take(totalRead).ToArray(); + LogDebug($"ReadAvailable returning {result.Length} byte(s): {FormatBytes(result)}."); return buffer.Take(totalRead).ToArray(); } + + private void LogDebug(string message) + { + DebugLogger?.Invoke(message); + } + + private static string FormatBytes(IEnumerable bytes) + { + if (bytes == null) + { + return string.Empty; + } + + var builder = new StringBuilder(); + var array = bytes.ToArray(); + + for (int i = 0; i < array.Length; i++) + { + builder.Append(array[i].ToString("X2")); + if (i < array.Length - 1) + { + builder.Append(' '); + } + } + + return builder.ToString(); + } } } From c04195b1f6b1116044116071e5d7a5211996cc18 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 17:37:11 -0500 Subject: [PATCH 24/61] Add concise debug logging for key actions --- M18AnalyzerMain.cs | 56 +++++++++++----------------------------------- 1 file changed, 13 insertions(+), 43 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 5cccba4..e03b016 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -31,9 +31,6 @@ public frmMain() chkbxTXLog.Checked = true; chkboxRxLog.Checked = true; - - LogDebug("Application initialized. Default TX/RX logging enabled."); - toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available serial ports."); toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); toolTipSimpleTab.SetToolTip(btnDisconnect, "Disconnect from the currently connected device."); @@ -81,13 +78,12 @@ private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) private void btnRefresh_Click(object? sender, EventArgs e) { - LogDebug("Refresh button pressed - calling RefreshSerialPorts()."); + LogDebugAction("Requesting RefreshSerialPorts()."); RefreshSerialPorts(); } private void RefreshSerialPorts() { - LogDebug("Entering RefreshSerialPorts(). Fetching available serial ports."); AppendLog("Refreshing serial port list..."); try @@ -95,15 +91,11 @@ private void RefreshSerialPorts() var portDescriptions = GetPortDescriptions(); var portNames = SerialPort.GetPortNames().OrderBy(port => port, StringComparer.OrdinalIgnoreCase).ToList(); - LogDebug($"Detected {portNames.Count} serial port(s)."); - cmbBxSerialPort.Items.Clear(); - foreach (var port in portNames) { portDescriptions.TryGetValue(port, out var description); cmbBxSerialPort.Items.Add(new SerialPortDisplay(port, description)); - LogDebug($"Added port to combo box: {port}{(string.IsNullOrWhiteSpace(description) ? string.Empty : $" - {description}")}"); AppendLog($"Found port {port}{(string.IsNullOrWhiteSpace(description) ? string.Empty : $" - {description}")}"); } @@ -124,7 +116,7 @@ private void RefreshSerialPorts() private async void btnConnect_Click(object? sender, EventArgs e) { - LogDebug("Connect button pressed - attempting to establish protocol connection."); + LogDebugAction("Requesting Connect()."); if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) { AppendLog("No serial port selected. Please choose a port before connecting."); @@ -149,9 +141,8 @@ private async void btnConnect_Click(object? sender, EventArgs e) try { - await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName, LogDebug)); + await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName)); ApplyProtocolLoggingPreferences(); - LogDebug($"Protocol initialized for {selectedPort.PortName}."); AppendLog($"{selectedPort} opened successfully."); } catch (Exception ex) @@ -163,13 +154,12 @@ private async void btnConnect_Click(object? sender, EventArgs e) private async void btnDisconnect_Click(object? sender, EventArgs e) { - LogDebug("Disconnect button pressed - initiating disconnect sequence."); + LogDebugAction("Requesting DisconnectAsync()."); await DisconnectAsync(); } private async Task DisconnectAsync() { - LogDebug("Entering DisconnectAsync()."); if (_protocol == null) { AppendLog("Disconnect requested, but no serial port is currently open."); @@ -182,7 +172,6 @@ private async Task DisconnectAsync() try { await Task.Run(() => _protocol.Close()); - LogDebug("Protocol closed successfully."); AppendLog($"{_protocol.PortName} closed successfully."); } catch (Exception ex) @@ -197,7 +186,7 @@ private async Task DisconnectAsync() private async void btnIdle_Click(object? sender, EventArgs e) { - LogDebug("Idle button pressed - requesting _protocol.Idle()."); + LogDebugAction("Requesting _protocol.Idle()."); if (!EnsureConnected()) { return; @@ -209,7 +198,7 @@ private async void btnIdle_Click(object? sender, EventArgs e) private async void btnActive_Click(object? sender, EventArgs e) { - LogDebug("Active button pressed - requesting _protocol.High()."); + LogDebugAction("Requesting _protocol.High()."); if (!EnsureConnected()) { return; @@ -221,7 +210,7 @@ private async void btnActive_Click(object? sender, EventArgs e) private async void btnHealthReport_Click(object? sender, EventArgs e) { - LogDebug("Health Report button pressed - requesting _protocol.HealthReport()."); + LogDebugAction("Requesting _protocol.HealthReport()."); if (!EnsureConnected()) { return; @@ -242,7 +231,7 @@ private async void btnHealthReport_Click(object? sender, EventArgs e) private async void btnReset_Click(object? sender, EventArgs e) { - LogDebug("Reset button pressed - requesting _protocol.Reset()."); + LogDebugAction("Requesting _protocol.Reset()."); if (!EnsureConnected()) { return; @@ -261,7 +250,7 @@ private async void btnReset_Click(object? sender, EventArgs e) private void btnCopyOutput_Click(object? sender, EventArgs e) { - LogDebug("Copy Output button pressed - copying rtbOutput content to clipboard."); + LogDebugAction("Copying output via btnCopyOutput_Click()."); if (string.IsNullOrEmpty(rtbOutput.Text)) { AppendLog("No output to copy."); @@ -274,10 +263,9 @@ private void btnCopyOutput_Click(object? sender, EventArgs e) private bool EnsureConnected() { - LogDebug("Checking connection status via EnsureConnected()."); + LogDebugAction("Checking EnsureConnected()."); if (_protocol != null) { - LogDebug("Protocol already connected."); return true; } @@ -288,7 +276,6 @@ private bool EnsureConnected() private Dictionary GetPortDescriptions() { - LogDebug("Attempting to retrieve port descriptions via WMI query."); var descriptions = new Dictionary(StringComparer.OrdinalIgnoreCase); try @@ -367,14 +354,12 @@ private void AppendProtocolLog(string message) var formattedMessage = FormatLogMessage(message); AppendSimpleLog(formattedMessage); AppendAdvancedLog(formattedMessage); - LogDebug($"Protocol log forwarded to debug output: {message}"); } private void LogError(string context, Exception exception) { var fullMessage = $"{context} Error details: {exception}"; AppendLog(fullMessage); - LogDebug(fullMessage); MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } @@ -387,18 +372,14 @@ private void ApplyProtocolLoggingPreferences() _protocol.PrintTx = chkbxTXLog.Checked; _protocol.PrintRx = chkboxRxLog.Checked; - _protocol.DebugLogger = LogDebug; _protocol.TxLogger = message => { AppendProtocolLog(message); - LogDebug($"TX log forwarded from protocol: {message}"); }; _protocol.RxLogger = message => { AppendProtocolLog(message); - LogDebug($"RX log forwarded from protocol: {message}"); }; - LogDebug($"Protocol logging preferences applied. PrintTx={_protocol.PrintTx}, PrintRx={_protocol.PrintRx}."); } private void chkbxTXLog_CheckedChanged(object? sender, EventArgs e) @@ -406,11 +387,6 @@ private void chkbxTXLog_CheckedChanged(object? sender, EventArgs e) if (_protocol != null) { _protocol.PrintTx = chkbxTXLog.Checked; - LogDebug($"TX logging preference changed: {_protocol.PrintTx}."); - } - else - { - LogDebug($"TX logging checkbox changed to {chkbxTXLog.Checked} (protocol not initialized yet)."); } } @@ -419,25 +395,19 @@ private void chkboxRxLog_CheckedChanged(object? sender, EventArgs e) if (_protocol != null) { _protocol.PrintRx = chkboxRxLog.Checked; - LogDebug($"RX logging preference changed: {_protocol.PrintRx}."); - } - else - { - LogDebug($"RX logging checkbox changed to {chkboxRxLog.Checked} (protocol not initialized yet)."); } } - private void LogDebug(string message) + private void LogDebugAction(string message) { if (rtbDebugOutput.InvokeRequired) { - rtbDebugOutput.Invoke(new Action(() => LogDebug(message))); + rtbDebugOutput.Invoke(new Action(() => LogDebugAction(message))); return; } - var timestamped = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; var prefix = _hasAppendedDebugLog ? Environment.NewLine : string.Empty; - rtbDebugOutput.AppendText($"{prefix}{timestamped}"); + rtbDebugOutput.AppendText($"{prefix}{DateTime.Now:HH:mm:ss} - {message}"); rtbDebugOutput.SelectionStart = rtbDebugOutput.TextLength; rtbDebugOutput.ScrollToCaret(); _hasAppendedDebugLog = true; From abb4dce70d1cd31afe11b7690d65b9f3e9fca814 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 17:43:40 -0500 Subject: [PATCH 25/61] Added Test Device button to check the connected device is correct. --- M18AnalyzerMain.Designer.cs | 20 ++++++++++++++++---- M18AnalyzerMain.resx | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index d3ae74d..03d3378 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -117,6 +117,7 @@ private void InitializeComponent() lblAboutTitle = new Label(); toolTipSimpleTab = new ToolTip(components); rtbDebugOutput = new RichTextBox(); + btnTestFT232 = new Button(); tabControlM18Main.SuspendLayout(); tabSimple.SuspendLayout(); grpOutput.SuspendLayout(); @@ -145,6 +146,7 @@ private void InitializeComponent() // // tabSimple // + tabSimple.Controls.Add(btnTestFT232); tabSimple.Controls.Add(grpOutput); tabSimple.Controls.Add(btnDisconnect); tabSimple.Controls.Add(btnConnect); @@ -237,7 +239,7 @@ private void InitializeComponent() // // btnDisconnect // - btnDisconnect.Location = new Point(344, 48); + btnDisconnect.Location = new Point(464, 48); btnDisconnect.Name = "btnDisconnect"; btnDisconnect.Size = new Size(112, 34); btnDisconnect.TabIndex = 5; @@ -972,17 +974,26 @@ private void InitializeComponent() // // rtbDebugOutput // - rtbDebugOutput.Location = new Point(24, 544); + rtbDebugOutput.Location = new Point(8, 520); rtbDebugOutput.Name = "rtbDebugOutput"; - rtbDebugOutput.Size = new Size(880, 168); + rtbDebugOutput.Size = new Size(904, 168); rtbDebugOutput.TabIndex = 1; rtbDebugOutput.Text = ""; // + // btnTestFT232 + // + btnTestFT232.Location = new Point(342, 48); + btnTestFT232.Name = "btnTestFT232"; + btnTestFT232.Size = new Size(112, 34); + btnTestFT232.TabIndex = 7; + btnTestFT232.Text = "Test Device"; + btnTestFT232.UseVisualStyleBackColor = true; + // // frmMain // AutoScaleDimensions = new SizeF(10F, 25F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(928, 730); + ClientSize = new Size(928, 715); Controls.Add(rtbDebugOutput); Controls.Add(tabControlM18Main); Icon = (Icon)resources.GetObject("$this.Icon"); @@ -1103,5 +1114,6 @@ private void InitializeComponent() private LinkLabel linkLabelKillaVolt; private Label lblKillaVoltAbout; private RichTextBox rtbDebugOutput; + private Button btnTestFT232; } } diff --git a/M18AnalyzerMain.resx b/M18AnalyzerMain.resx index 5bc1ef6..3d4939d 100644 --- a/M18AnalyzerMain.resx +++ b/M18AnalyzerMain.resx @@ -253,7 +253,7 @@ Step 4: Set Idle (Tx Low) before unplugging battery and/or disconnecting the ser - 40 + 67 From 7b7108468c7fcb93df92850717037bf23dcc4c2e Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 18:02:32 -0500 Subject: [PATCH 26/61] Improve serial port selection and testing --- M18AnalyzerMain.cs | 177 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 150 insertions(+), 27 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index e03b016..ef3e25b 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO.Ports; using System.Linq; +using System.Management; using System.Threading.Tasks; using System.Windows.Forms; @@ -28,6 +29,7 @@ public frmMain() btnCopyOutput.Click += btnCopyOutput_Click; chkbxTXLog.CheckedChanged += chkbxTXLog_CheckedChanged; chkboxRxLog.CheckedChanged += chkboxRxLog_CheckedChanged; + btnTestFT232.Click += btnTestFT232_Click; chkbxTXLog.Checked = true; chkboxRxLog.Checked = true; @@ -88,18 +90,16 @@ private void RefreshSerialPorts() try { - var portDescriptions = GetPortDescriptions(); - var portNames = SerialPort.GetPortNames().OrderBy(port => port, StringComparer.OrdinalIgnoreCase).ToList(); + var ports = GetSerialPortInfos(); cmbBxSerialPort.Items.Clear(); - foreach (var port in portNames) + foreach (var port in ports) { - portDescriptions.TryGetValue(port, out var description); - cmbBxSerialPort.Items.Add(new SerialPortDisplay(port, description)); - AppendLog($"Found port {port}{(string.IsNullOrWhiteSpace(description) ? string.Empty : $" - {description}")}"); + cmbBxSerialPort.Items.Add(port); + AppendLog($"Found port {port.DisplayName}{(port.IsLikelyFtdi ? " (FTDI detected)" : string.Empty)}"); } - if (portNames.Count == 0) + if (ports.Count == 0) { AppendLog("No serial ports detected."); } @@ -137,18 +137,18 @@ private async void btnConnect_Click(object? sender, EventArgs e) await DisconnectAsync(); } - AppendLog($"Attempting to open {selectedPort} with settings: 4800 baud, 8 data bits, parity None, stop bits One, handshake None."); + AppendLog($"Attempting to open {selectedPort.DisplayName} with settings: 4800 baud, 8 data bits, parity None, stop bits One, handshake None."); try { await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName)); ApplyProtocolLoggingPreferences(); - AppendLog($"{selectedPort} opened successfully."); + AppendLog($"{selectedPort.DisplayName} opened successfully."); } catch (Exception ex) { _protocol = null; - LogError($"Failed to open {selectedPort}.", ex); + LogError($"Failed to open {selectedPort.DisplayName}.", ex); } } @@ -274,39 +274,134 @@ private bool EnsureConnected() return false; } - private Dictionary GetPortDescriptions() + private List GetSerialPortInfos() { - var descriptions = new Dictionary(StringComparer.OrdinalIgnoreCase); + var portLookup = new Dictionary(StringComparer.OrdinalIgnoreCase); + + foreach (var portName in SerialPort.GetPortNames()) + { + portLookup[portName] = new SerialPortDisplay(portName, null, null, null); + } try { - using var searcher = new System.Management.ManagementObjectSearcher("SELECT Caption, DeviceID FROM Win32_PnPEntity WHERE Caption LIKE 'COM%' OR DeviceID LIKE 'COM%'"); - foreach (var obj in searcher.Get().OfType()) + using var serialSearcher = new ManagementObjectSearcher("SELECT DeviceID, Description, Manufacturer, Name FROM Win32_SerialPort"); + foreach (var obj in serialSearcher.Get().OfType()) { - var caption = obj["Caption"]?.ToString(); - var deviceId = obj["DeviceID"]?.ToString(); - - if (string.IsNullOrWhiteSpace(caption) && string.IsNullOrWhiteSpace(deviceId)) + var portName = ExtractPortName(obj["DeviceID"]?.ToString()); + if (string.IsNullOrWhiteSpace(portName)) { continue; } - var combined = caption ?? deviceId ?? string.Empty; - var match = System.Text.RegularExpressions.Regex.Match(combined, @"\((COM\d+)\)"); - var portName = match.Success ? match.Groups[1].Value : SerialPort.GetPortNames().FirstOrDefault(name => combined.Contains(name, StringComparison.OrdinalIgnoreCase)); + portLookup[portName] = portLookup.GetValueOrDefault(portName, new SerialPortDisplay(portName, null, null, null)) + with + { + Description = obj["Description"]?.ToString(), + Manufacturer = obj["Manufacturer"]?.ToString(), + FriendlyName = obj["Name"]?.ToString() + }; + } + } + catch (Exception ex) + { + LogError("Failed to read serial port details.", ex); + } - if (!string.IsNullOrWhiteSpace(portName) && !descriptions.ContainsKey(portName)) + try + { + using var pnpSearcher = new ManagementObjectSearcher("SELECT DeviceID, Caption, Manufacturer, Name FROM Win32_PnPEntity WHERE Caption LIKE 'COM%' OR DeviceID LIKE 'COM%'"); + foreach (var obj in pnpSearcher.Get().OfType()) + { + var portName = ExtractPortName(obj["Caption"]?.ToString()) ?? ExtractPortName(obj["DeviceID"]?.ToString()); + if (string.IsNullOrWhiteSpace(portName)) { - descriptions[portName] = caption ?? deviceId ?? portName; + continue; } + + var existing = portLookup.GetValueOrDefault(portName, new SerialPortDisplay(portName, null, null, null)); + portLookup[portName] = existing with + { + Description = existing.Description ?? obj["Caption"]?.ToString(), + Manufacturer = existing.Manufacturer ?? obj["Manufacturer"]?.ToString(), + FriendlyName = existing.FriendlyName ?? obj["Name"]?.ToString() + }; } } catch (Exception ex) { - LogError("Failed to read port descriptions.", ex); + LogError("Failed to read plug-and-play port details.", ex); + } + + return portLookup.Values + .OrderBy(port => port.PortName, StringComparer.OrdinalIgnoreCase) + .ToList(); + } + + private static string? ExtractPortName(string? source) + { + if (string.IsNullOrWhiteSpace(source)) + { + return null; + } + + var match = System.Text.RegularExpressions.Regex.Match(source, @"(COM\d+)", System.Text.RegularExpressions.RegexOptions.IgnoreCase); + return match.Success ? match.Groups[1].Value.ToUpperInvariant() : null; + } + + private async void btnTestFT232_Click(object? sender, EventArgs e) + { + LogDebugAction("Requesting Test FT232 operation."); + + if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) + { + AppendLog("No serial port selected. Please choose a port before testing."); + MessageBox.Show("Please select a serial port before testing.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + AppendLog($"Testing FT232 on {selectedPort.DisplayName}..."); + LogDebugAction($"Testing FT232 on {selectedPort.DisplayName}."); + + var testResult = await Task.Run(() => TestSerialDevice(selectedPort)); + + if (testResult.Success) + { + AppendLog($"Device responded successfully on {selectedPort.PortName}."); + LogDebugAction($"Device responded successfully on {selectedPort.PortName}."); } + else + { + AppendLog($"No response / failed to communicate with device on {selectedPort.PortName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); + LogDebugAction($"No response / failed to communicate with device on {selectedPort.PortName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); + } + } - return descriptions; + private static (bool Success, string? ErrorMessage) TestSerialDevice(SerialPortDisplay port) + { + try + { + using var serialPort = new SerialPort(port.PortName, 4800, Parity.None, 8, StopBits.Two) + { + ReadTimeout = 500, + WriteTimeout = 500, + DtrEnable = true, + RtsEnable = true + }; + + serialPort.Open(); + + serialPort.DtrEnable = !serialPort.DtrEnable; + serialPort.RtsEnable = !serialPort.RtsEnable; + + serialPort.Write(new byte[] { 0x00 }, 0, 1); + + return (true, null); + } + catch (Exception ex) + { + return (false, ex.Message); + } } private void AppendLog(string message) @@ -418,11 +513,39 @@ private void rtbOutput_TextChanged(object sender, EventArgs e) } - private sealed record SerialPortDisplay(string PortName, string? Description) + private sealed record SerialPortDisplay(string PortName, string? Description, string? Manufacturer, string? FriendlyName) { + public string DisplayName + { + get + { + var parts = new List { PortName }; + + if (!string.IsNullOrWhiteSpace(Manufacturer)) + { + parts.Add(Manufacturer); + } + + if (!string.IsNullOrWhiteSpace(Description) && !parts.Contains(Description)) + { + parts.Add(Description); + } + + if (!string.IsNullOrWhiteSpace(FriendlyName) && !parts.Contains(FriendlyName)) + { + parts.Add(FriendlyName); + } + + return string.Join(" — ", parts); + } + } + + public bool IsLikelyFtdi => new[] { Description, Manufacturer, FriendlyName } + .Any(value => value != null && value.IndexOf("FTDI", StringComparison.OrdinalIgnoreCase) >= 0); + public override string ToString() { - return string.IsNullOrWhiteSpace(Description) ? PortName : $"{PortName} - {Description}"; + return DisplayName; } } } From 44b45a9e03a9ec5c92b2fca7dba9e5798c50b846 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 18:43:22 -0500 Subject: [PATCH 27/61] Enhance Simple tab serial handling --- M18AnalyzerMain.cs | 84 +++++++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 24 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index ef3e25b..c323e98 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -86,7 +86,7 @@ private void btnRefresh_Click(object? sender, EventArgs e) private void RefreshSerialPorts() { - AppendLog("Refreshing serial port list..."); + AppendLogBoth("Refreshing serial port list..."); try { @@ -96,12 +96,12 @@ private void RefreshSerialPorts() foreach (var port in ports) { cmbBxSerialPort.Items.Add(port); - AppendLog($"Found port {port.DisplayName}{(port.IsLikelyFtdi ? " (FTDI detected)" : string.Empty)}"); + AppendLogBoth($"Found port {port.DisplayName}{(port.IsLikelyFtdi ? " (FTDI detected)" : string.Empty)}"); } if (ports.Count == 0) { - AppendLog("No serial ports detected."); + AppendLogBoth("No serial ports detected."); } else { @@ -128,22 +128,23 @@ private async void btnConnect_Click(object? sender, EventArgs e) { if (string.Equals(_protocol.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) { - AppendLog($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); + AppendLogBoth($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } - AppendLog($"A different port ({_protocol.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); + AppendLogBoth($"A different port ({_protocol.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); await DisconnectAsync(); } - AppendLog($"Attempting to open {selectedPort.DisplayName} with settings: 4800 baud, 8 data bits, parity None, stop bits One, handshake None."); + AppendLogBoth($"Attempting to open {selectedPort.DisplayName} with settings: 4800 baud, 8 data bits, parity None, stop bits Two, handshake None."); + AppendDebugLog("Serial connection will set TX low (idle) after open."); try { - await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName)); + await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName, AppendDebugLog)); ApplyProtocolLoggingPreferences(); - AppendLog($"{selectedPort.DisplayName} opened successfully."); + AppendLogBoth($"{selectedPort.DisplayName} opened successfully."); } catch (Exception ex) { @@ -162,17 +163,17 @@ private async Task DisconnectAsync() { if (_protocol == null) { - AppendLog("Disconnect requested, but no serial port is currently open."); + AppendLogBoth("Disconnect requested, but no serial port is currently open."); MessageBox.Show("No serial port is currently open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } - AppendLog($"Closing {_protocol.PortName}..."); + AppendLogBoth($"Closing {_protocol.PortName}..."); try { await Task.Run(() => _protocol.Close()); - AppendLog($"{_protocol.PortName} closed successfully."); + AppendLogBoth($"{_protocol.PortName} closed successfully."); } catch (Exception ex) { @@ -192,8 +193,16 @@ private async void btnIdle_Click(object? sender, EventArgs e) return; } - await Task.Run(() => _protocol!.Idle()); - AppendLog("TX set to Idle (low). Safe to connect or disconnect battery."); + AppendDebugLog("Invoking _protocol.Idle() to drive TX low."); + try + { + await Task.Run(() => _protocol!.Idle()); + AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery."); + } + catch (Exception ex) + { + LogError("Failed to set TX to Idle.", ex); + } } private async void btnActive_Click(object? sender, EventArgs e) @@ -204,8 +213,16 @@ private async void btnActive_Click(object? sender, EventArgs e) return; } - await Task.Run(() => _protocol!.High()); - AppendLog("TX set to Active (high). Charger simulation enabled."); + AppendDebugLog("Invoking _protocol.High() to drive TX high."); + try + { + await Task.Run(() => _protocol!.High()); + AppendLogBoth("TX set to Active (high). Charger simulation enabled."); + } + catch (Exception ex) + { + LogError("Failed to set TX to Active (high).", ex); + } } private async void btnHealthReport_Click(object? sender, EventArgs e) @@ -218,10 +235,14 @@ private async void btnHealthReport_Click(object? sender, EventArgs e) try { + AppendDebugLog("Starting health report collection (mirrors m18.py health())."); var report = await Task.Run(() => _protocol!.HealthReport()); - AppendLog("=== Health report ==="); - AppendLog(report); - AppendLog("Health report complete."); + AppendLogBoth("=== Health report ==="); + foreach (var line in report.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None)) + { + AppendLogBoth(line); + } + AppendLogBoth("Health report complete."); } catch (Exception ex) { @@ -239,8 +260,9 @@ private async void btnReset_Click(object? sender, EventArgs e) try { + AppendDebugLog("Sending reset sequence (BREAK/DTR + SYNC)."); var success = await Task.Run(() => _protocol!.Reset()); - AppendLog(success ? "Reset command acknowledged by device." : "Reset command did not receive expected response."); + AppendLogBoth(success ? "Reset command acknowledged by device." : "Reset command did not receive expected response."); } catch (Exception ex) { @@ -253,12 +275,12 @@ private void btnCopyOutput_Click(object? sender, EventArgs e) LogDebugAction("Copying output via btnCopyOutput_Click()."); if (string.IsNullOrEmpty(rtbOutput.Text)) { - AppendLog("No output to copy."); + AppendLogBoth("No output to copy."); return; } Clipboard.SetText(rtbOutput.Text); - AppendLog("Output copied to clipboard."); + AppendLogBoth("Output copied to clipboard."); } private bool EnsureConnected() @@ -409,6 +431,13 @@ private void AppendLog(string message) AppendSimpleLog(FormatLogMessage(message)); } + private void AppendLogBoth(string message) + { + var formatted = FormatLogMessage(message); + AppendSimpleLog(formatted); + AppendDebugLog(formatted); + } + private void AppendSimpleLog(string formattedMessage) { if (rtbOutput.InvokeRequired) @@ -449,12 +478,13 @@ private void AppendProtocolLog(string message) var formattedMessage = FormatLogMessage(message); AppendSimpleLog(formattedMessage); AppendAdvancedLog(formattedMessage); + AppendDebugLog(formattedMessage); } private void LogError(string context, Exception exception) { var fullMessage = $"{context} Error details: {exception}"; - AppendLog(fullMessage); + AppendLogBoth(fullMessage); MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } @@ -494,15 +524,21 @@ private void chkboxRxLog_CheckedChanged(object? sender, EventArgs e) } private void LogDebugAction(string message) + { + AppendDebugLog(message); + } + + private void AppendDebugLog(string message) { if (rtbDebugOutput.InvokeRequired) { - rtbDebugOutput.Invoke(new Action(() => LogDebugAction(message))); + rtbDebugOutput.Invoke(new Action(() => AppendDebugLog(message))); return; } var prefix = _hasAppendedDebugLog ? Environment.NewLine : string.Empty; - rtbDebugOutput.AppendText($"{prefix}{DateTime.Now:HH:mm:ss} - {message}"); + var formatted = message.Contains("- ") ? message : FormatLogMessage(message); + rtbDebugOutput.AppendText($"{prefix}{formatted}"); rtbDebugOutput.SelectionStart = rtbDebugOutput.TextLength; rtbDebugOutput.ScrollToCaret(); _hasAppendedDebugLog = true; From fc2e940eea4640932578751904f87bb0dc13e256 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 18:50:10 -0500 Subject: [PATCH 28/61] Handle WMI failures when refreshing serial ports --- M18AnalyzerMain.cs | 68 +++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index c323e98..69bbf20 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -99,6 +99,13 @@ private void RefreshSerialPorts() AppendLogBoth($"Found port {port.DisplayName}{(port.IsLikelyFtdi ? " (FTDI detected)" : string.Empty)}"); } + AppendDebugLog($"RefreshSerialPorts(): {ports.Count} port(s) detected."); + foreach (var port in ports) + { + var sourceLabel = string.IsNullOrWhiteSpace(port.Source) ? "Unknown source" : port.Source; + AppendDebugLog($" - {port.DisplayName} (source: {sourceLabel})"); + } + if (ports.Count == 0) { AppendLogBoth("No serial ports detected."); @@ -300,9 +307,21 @@ private List GetSerialPortInfos() { var portLookup = new Dictionary(StringComparer.OrdinalIgnoreCase); + static string CombineSources(string? existingSource, string newSource) + { + if (string.IsNullOrWhiteSpace(existingSource)) + { + return newSource; + } + + return existingSource.Contains(newSource, StringComparison.OrdinalIgnoreCase) + ? existingSource + : $"{existingSource}; {newSource}"; + } + foreach (var portName in SerialPort.GetPortNames()) { - portLookup[portName] = new SerialPortDisplay(portName, null, null, null); + portLookup[portName] = new SerialPortDisplay(portName, null, null, null, "SerialPort.GetPortNames() fallback"); } try @@ -316,18 +335,19 @@ private List GetSerialPortInfos() continue; } - portLookup[portName] = portLookup.GetValueOrDefault(portName, new SerialPortDisplay(portName, null, null, null)) - with - { - Description = obj["Description"]?.ToString(), - Manufacturer = obj["Manufacturer"]?.ToString(), - FriendlyName = obj["Name"]?.ToString() - }; + var existing = portLookup.GetValueOrDefault(portName, new SerialPortDisplay(portName, null, null, null, string.Empty)); + portLookup[portName] = existing with + { + Description = obj["Description"]?.ToString(), + Manufacturer = obj["Manufacturer"]?.ToString(), + FriendlyName = obj["Name"]?.ToString(), + Source = CombineSources(existing.Source, "WMI: Win32_SerialPort") + }; } } catch (Exception ex) { - LogError("Failed to read serial port details.", ex); + AppendDebugLog($"Win32_SerialPort query failed; using fallback data only. Details: {ex.Message}"); } try @@ -341,18 +361,19 @@ private List GetSerialPortInfos() continue; } - var existing = portLookup.GetValueOrDefault(portName, new SerialPortDisplay(portName, null, null, null)); + var existing = portLookup.GetValueOrDefault(portName, new SerialPortDisplay(portName, null, null, null, string.Empty)); portLookup[portName] = existing with { Description = existing.Description ?? obj["Caption"]?.ToString(), Manufacturer = existing.Manufacturer ?? obj["Manufacturer"]?.ToString(), - FriendlyName = existing.FriendlyName ?? obj["Name"]?.ToString() + FriendlyName = existing.FriendlyName ?? obj["Name"]?.ToString(), + Source = CombineSources(existing.Source, "WMI: Win32_PnPEntity") }; } } catch (Exception ex) { - LogError("Failed to read plug-and-play port details.", ex); + AppendDebugLog($"Win32_PnPEntity query failed; using available data. Details: {ex.Message}"); } return portLookup.Values @@ -549,30 +570,15 @@ private void rtbOutput_TextChanged(object sender, EventArgs e) } - private sealed record SerialPortDisplay(string PortName, string? Description, string? Manufacturer, string? FriendlyName) + private sealed record SerialPortDisplay(string PortName, string? Description, string? Manufacturer, string? FriendlyName, string Source) { public string DisplayName { get { - var parts = new List { PortName }; - - if (!string.IsNullOrWhiteSpace(Manufacturer)) - { - parts.Add(Manufacturer); - } - - if (!string.IsNullOrWhiteSpace(Description) && !parts.Contains(Description)) - { - parts.Add(Description); - } - - if (!string.IsNullOrWhiteSpace(FriendlyName) && !parts.Contains(FriendlyName)) - { - parts.Add(FriendlyName); - } - - return string.Join(" — ", parts); + return string.IsNullOrWhiteSpace(FriendlyName) + ? PortName + : $"{PortName} - {FriendlyName}"; } } From 90867992c5759b6e2705ad17fbf5902fb8a15590 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 10:07:38 -0500 Subject: [PATCH 29/61] Improve serial port detection and logging --- M18AnalyzerMain.cs | 53 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 69bbf20..d3a9f51 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -14,6 +14,8 @@ public partial class frmMain : Form private bool _hasAppendedLog; private bool _hasAppendedAdvancedLog; private bool _hasAppendedDebugLog; + private string? _selectedPortName; + private string? _selectedPortDescription; public frmMain() { @@ -30,6 +32,7 @@ public frmMain() chkbxTXLog.CheckedChanged += chkbxTXLog_CheckedChanged; chkboxRxLog.CheckedChanged += chkboxRxLog_CheckedChanged; btnTestFT232.Click += btnTestFT232_Click; + cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged; chkbxTXLog.Checked = true; chkboxRxLog.Checked = true; @@ -114,6 +117,12 @@ private void RefreshSerialPorts() { cmbBxSerialPort.SelectedIndex = 0; } + + if (cmbBxSerialPort.SelectedItem is null) + { + _selectedPortName = null; + _selectedPortDescription = null; + } } catch (Exception ex) { @@ -121,6 +130,21 @@ private void RefreshSerialPorts() } } + private void cmbBxSerialPort_SelectedIndexChanged(object? sender, EventArgs e) + { + if (cmbBxSerialPort.SelectedItem is SerialPortDisplay selected) + { + _selectedPortName = selected.PortName; + _selectedPortDescription = selected.DisplayName; + AppendDebugLog($"Selected port set to {selected.DisplayName} (source: {selected.Source})."); + } + else + { + _selectedPortName = null; + _selectedPortDescription = null; + } + } + private async void btnConnect_Click(object? sender, EventArgs e) { LogDebugAction("Requesting Connect()."); @@ -144,19 +168,21 @@ private async void btnConnect_Click(object? sender, EventArgs e) await DisconnectAsync(); } - AppendLogBoth($"Attempting to open {selectedPort.DisplayName} with settings: 4800 baud, 8 data bits, parity None, stop bits Two, handshake None."); + var selectedDescription = _selectedPortDescription ?? selectedPort.DisplayName; + + AppendLogBoth($"Attempting to open {selectedDescription} with settings: 4800 baud, 8 data bits, parity None, stop bits Two, handshake None."); AppendDebugLog("Serial connection will set TX low (idle) after open."); try { await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName, AppendDebugLog)); ApplyProtocolLoggingPreferences(); - AppendLogBoth($"{selectedPort.DisplayName} opened successfully."); + AppendLogBoth($"{selectedDescription} opened successfully."); } catch (Exception ex) { _protocol = null; - LogError($"Failed to open {selectedPort.DisplayName}.", ex); + LogError($"Failed to open {selectedDescription}.", ex); } } @@ -403,8 +429,10 @@ private async void btnTestFT232_Click(object? sender, EventArgs e) return; } - AppendLog($"Testing FT232 on {selectedPort.DisplayName}..."); - LogDebugAction($"Testing FT232 on {selectedPort.DisplayName}."); + var selectedDescription = _selectedPortDescription ?? selectedPort.DisplayName; + + AppendLog($"Testing FT232 on {selectedDescription}..."); + LogDebugAction($"Testing FT232 on {selectedDescription}."); var testResult = await Task.Run(() => TestSerialDevice(selectedPort)); @@ -576,9 +604,18 @@ public string DisplayName { get { - return string.IsNullOrWhiteSpace(FriendlyName) - ? PortName - : $"{PortName} - {FriendlyName}"; + var coreDescription = FriendlyName ?? Description; + + if (string.IsNullOrWhiteSpace(coreDescription)) + { + return PortName; + } + + var manufacturerText = string.IsNullOrWhiteSpace(Manufacturer) + ? string.Empty + : $" ({Manufacturer})"; + + return $"{PortName} — {coreDescription}{manufacturerText}"; } } From 9082fc9e5a3fe2c592178449cffc60def9177545 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 10:38:19 -0500 Subject: [PATCH 30/61] Improve serial port enumeration via SetupAPI --- M18AnalyzerMain.cs | 119 +------------------ SerialPortUtil.cs | 286 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 289 insertions(+), 116 deletions(-) create mode 100644 SerialPortUtil.cs diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index d3a9f51..2298313 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.IO.Ports; using System.Linq; -using System.Management; using System.Threading.Tasks; using System.Windows.Forms; @@ -107,6 +106,7 @@ private void RefreshSerialPorts() { var sourceLabel = string.IsNullOrWhiteSpace(port.Source) ? "Unknown source" : port.Source; AppendDebugLog($" - {port.DisplayName} (source: {sourceLabel})"); + AppendDebugLog($" Details: description='{port.DeviceDescription ?? "(none)"}', manufacturer='{port.Manufacturer ?? "(none)"}', hwid='{port.HardwareIds ?? "(none)"}'"); } if (ports.Count == 0) @@ -135,7 +135,7 @@ private void cmbBxSerialPort_SelectedIndexChanged(object? sender, EventArgs e) if (cmbBxSerialPort.SelectedItem is SerialPortDisplay selected) { _selectedPortName = selected.PortName; - _selectedPortDescription = selected.DisplayName; + _selectedPortDescription = selected.DeviceDescription ?? selected.DisplayName; AppendDebugLog($"Selected port set to {selected.DisplayName} (source: {selected.Source})."); } else @@ -331,91 +331,7 @@ private bool EnsureConnected() private List GetSerialPortInfos() { - var portLookup = new Dictionary(StringComparer.OrdinalIgnoreCase); - - static string CombineSources(string? existingSource, string newSource) - { - if (string.IsNullOrWhiteSpace(existingSource)) - { - return newSource; - } - - return existingSource.Contains(newSource, StringComparison.OrdinalIgnoreCase) - ? existingSource - : $"{existingSource}; {newSource}"; - } - - foreach (var portName in SerialPort.GetPortNames()) - { - portLookup[portName] = new SerialPortDisplay(portName, null, null, null, "SerialPort.GetPortNames() fallback"); - } - - try - { - using var serialSearcher = new ManagementObjectSearcher("SELECT DeviceID, Description, Manufacturer, Name FROM Win32_SerialPort"); - foreach (var obj in serialSearcher.Get().OfType()) - { - var portName = ExtractPortName(obj["DeviceID"]?.ToString()); - if (string.IsNullOrWhiteSpace(portName)) - { - continue; - } - - var existing = portLookup.GetValueOrDefault(portName, new SerialPortDisplay(portName, null, null, null, string.Empty)); - portLookup[portName] = existing with - { - Description = obj["Description"]?.ToString(), - Manufacturer = obj["Manufacturer"]?.ToString(), - FriendlyName = obj["Name"]?.ToString(), - Source = CombineSources(existing.Source, "WMI: Win32_SerialPort") - }; - } - } - catch (Exception ex) - { - AppendDebugLog($"Win32_SerialPort query failed; using fallback data only. Details: {ex.Message}"); - } - - try - { - using var pnpSearcher = new ManagementObjectSearcher("SELECT DeviceID, Caption, Manufacturer, Name FROM Win32_PnPEntity WHERE Caption LIKE 'COM%' OR DeviceID LIKE 'COM%'"); - foreach (var obj in pnpSearcher.Get().OfType()) - { - var portName = ExtractPortName(obj["Caption"]?.ToString()) ?? ExtractPortName(obj["DeviceID"]?.ToString()); - if (string.IsNullOrWhiteSpace(portName)) - { - continue; - } - - var existing = portLookup.GetValueOrDefault(portName, new SerialPortDisplay(portName, null, null, null, string.Empty)); - portLookup[portName] = existing with - { - Description = existing.Description ?? obj["Caption"]?.ToString(), - Manufacturer = existing.Manufacturer ?? obj["Manufacturer"]?.ToString(), - FriendlyName = existing.FriendlyName ?? obj["Name"]?.ToString(), - Source = CombineSources(existing.Source, "WMI: Win32_PnPEntity") - }; - } - } - catch (Exception ex) - { - AppendDebugLog($"Win32_PnPEntity query failed; using available data. Details: {ex.Message}"); - } - - return portLookup.Values - .OrderBy(port => port.PortName, StringComparer.OrdinalIgnoreCase) - .ToList(); - } - - private static string? ExtractPortName(string? source) - { - if (string.IsNullOrWhiteSpace(source)) - { - return null; - } - - var match = System.Text.RegularExpressions.Regex.Match(source, @"(COM\d+)", System.Text.RegularExpressions.RegexOptions.IgnoreCase); - return match.Success ? match.Groups[1].Value.ToUpperInvariant() : null; + return SerialPortUtil.EnumerateDetailedPorts(AppendDebugLog); } private async void btnTestFT232_Click(object? sender, EventArgs e) @@ -598,34 +514,5 @@ private void rtbOutput_TextChanged(object sender, EventArgs e) } - private sealed record SerialPortDisplay(string PortName, string? Description, string? Manufacturer, string? FriendlyName, string Source) - { - public string DisplayName - { - get - { - var coreDescription = FriendlyName ?? Description; - - if (string.IsNullOrWhiteSpace(coreDescription)) - { - return PortName; - } - - var manufacturerText = string.IsNullOrWhiteSpace(Manufacturer) - ? string.Empty - : $" ({Manufacturer})"; - - return $"{PortName} — {coreDescription}{manufacturerText}"; - } - } - - public bool IsLikelyFtdi => new[] { Description, Manufacturer, FriendlyName } - .Any(value => value != null && value.IndexOf("FTDI", StringComparison.OrdinalIgnoreCase) >= 0); - - public override string ToString() - { - return DisplayName; - } - } } } diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs new file mode 100644 index 0000000..659a58a --- /dev/null +++ b/SerialPortUtil.cs @@ -0,0 +1,286 @@ +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.RegularExpressions; +using Microsoft.Win32; +using Microsoft.Win32.SafeHandles; + +namespace M18BatteryInfo; + +/// +/// Provides serial port enumeration using Windows SetupAPI to capture detailed +/// descriptions similar to Python's pyserial list_ports.comports(). +/// +internal static class SerialPortUtil +{ + // SetupAPI flags and registry property identifiers. + private const uint DIGCF_PRESENT = 0x00000002; // Return only devices present in the system. + + private const uint SPDRP_DEVICEDESC = 0x00000000; // Device description (REG_SZ). + private const uint SPDRP_HARDWAREID = 0x00000001; // Hardware IDs (REG_MULTI_SZ). + private const uint SPDRP_FRIENDLYNAME = 0x0000000C; // Friendly name shown in Device Manager (REG_SZ). + private const uint SPDRP_MFG = 0x0000000B; // Manufacturer string (REG_SZ). + + private const uint DIREG_DEV = 0x00000001; // Open hardware key for device. + private const int KEY_QUERY_VALUE = 0x0001; // Access mask for querying registry values. + + private static readonly Guid PortsClassGuid = new("4d36e978-e325-11ce-bfc1-08002be10318"); + + /// + /// Enumerates serial ports using SetupAPI and falls back to SerialPort.GetPortNames() + /// when additional details cannot be retrieved. + /// + /// Optional logger for verbose debug output. + /// Ordered list of serial port metadata. + public static List EnumerateDetailedPorts(Action? debugLogger = null) + { + var ports = new Dictionary(StringComparer.OrdinalIgnoreCase); + + EnumerateViaSetupApi(ports, debugLogger); + AppendSerialPortFallbacks(ports, debugLogger); + + return ports.Values + .OrderBy(port => port.PortName, StringComparer.OrdinalIgnoreCase) + .ToList(); + } + + private static void EnumerateViaSetupApi(IDictionary ports, Action? log) + { + // Acquire a handle to the Ports device class (COM & LPT) containing the serial devices. + var deviceInfoSet = SetupDiGetClassDevs(ref PortsClassGuid, null, IntPtr.Zero, DIGCF_PRESENT); + if (deviceInfoSet == IntPtr.Zero || deviceInfoSet == new IntPtr(-1)) + { + log?.Invoke("SetupAPI enumeration failed to acquire device info set; continuing with fallbacks only."); + return; + } + + try + { + var devInfoData = new SP_DEVINFO_DATA + { + cbSize = (uint)Marshal.SizeOf() + }; + + for (uint index = 0; SetupDiEnumDeviceInfo(deviceInfoSet, index, ref devInfoData); index++) + { + try + { + var friendlyName = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_FRIENDLYNAME); + var description = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_DEVICEDESC); + var manufacturer = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_MFG); + var hardwareIds = GetMultiStringProperty(deviceInfoSet, ref devInfoData, SPDRP_HARDWAREID); + + var portName = ExtractPortName(friendlyName) + ?? ExtractPortName(description) + ?? TryGetPortNameFromRegistry(deviceInfoSet, ref devInfoData); + + if (string.IsNullOrWhiteSpace(portName)) + { + log?.Invoke($"SetupAPI device entry missing COM port name. Desc: '{description ?? friendlyName ?? "(none)"}'"); + continue; + } + + var existing = ports.GetValueOrDefault(portName!, new SerialPortDisplay(portName!, null, null, null, null, string.Empty)); + var combinedSource = CombineSources(existing.Source, "SetupAPI (Ports class)"); + + ports[portName!] = existing with + { + Description = string.IsNullOrWhiteSpace(existing.Description) ? description : existing.Description, + Manufacturer = string.IsNullOrWhiteSpace(existing.Manufacturer) ? manufacturer : existing.Manufacturer, + FriendlyName = string.IsNullOrWhiteSpace(existing.FriendlyName) ? friendlyName : existing.FriendlyName, + HardwareIds = string.IsNullOrWhiteSpace(existing.HardwareIds) ? hardwareIds : existing.HardwareIds, + Source = combinedSource + }; + + log?.Invoke($"SetupAPI found {portName}: desc='{description ?? friendlyName ?? "(none)"}', mfg='{manufacturer ?? "(none)"}', hwid='{hardwareIds ?? "(none)"}'."); + } + catch (Exception ex) + { + log?.Invoke($"SetupAPI enumeration error: {ex.Message}"); + } + } + } + finally + { + SetupDiDestroyDeviceInfoList(deviceInfoSet); + } + } + + private static void AppendSerialPortFallbacks(IDictionary ports, Action? log) + { + try + { + foreach (var portName in SerialPort.GetPortNames()) + { + if (ports.TryGetValue(portName, out var existing)) + { + ports[portName] = existing with + { + Source = CombineSources(existing.Source, "SerialPort.GetPortNames()") + }; + } + else + { + ports[portName] = new SerialPortDisplay(portName, null, null, null, null, "SerialPort.GetPortNames() fallback"); + } + + log?.Invoke($"SerialPort.GetPortNames detected {portName}."); + } + } + catch (Exception ex) + { + log?.Invoke($"SerialPort.GetPortNames() failed: {ex.Message}"); + } + } + + private static string CombineSources(string? existingSource, string newSource) + { + if (string.IsNullOrWhiteSpace(existingSource)) + { + return newSource; + } + + return existingSource.Contains(newSource, StringComparison.OrdinalIgnoreCase) + ? existingSource + : $"{existingSource}; {newSource}"; + } + + private static string? GetDeviceRegistryProperty(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, uint property) + { + var buffer = new byte[1024]; + + if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, ref deviceInfoData, property, out _, buffer, (uint)buffer.Length, out var requiredSize) || requiredSize == 0) + { + return null; + } + + return Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); + } + + private static string? GetMultiStringProperty(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, uint property) + { + var buffer = new byte[2048]; + + if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, ref deviceInfoData, property, out var regType, buffer, (uint)buffer.Length, out var requiredSize) || requiredSize == 0) + { + return null; + } + + // REG_MULTI_SZ is a sequence of null-terminated UTF-16 strings ending with an additional null terminator. + if (regType != 7) // 7 = REG_MULTI_SZ + { + return Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); + } + + var multiSz = Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); + var entries = multiSz.Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries); + return entries.Length == 0 ? null : string.Join(", ", entries); + } + + private static string? TryGetPortNameFromRegistry(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData) + { + var regKey = SetupDiOpenDevRegKey(deviceInfoSet, ref deviceInfoData, 0, 0, DIREG_DEV, KEY_QUERY_VALUE); + if (regKey == IntPtr.Zero || regKey == new IntPtr(-1)) + { + return null; + } + + using var safeHandle = new SafeRegistryHandle(regKey, true); + using var key = RegistryKey.FromHandle(safeHandle); + return key.GetValue("PortName") as string; + } + + private static string? ExtractPortName(string? source) + { + if (string.IsNullOrWhiteSpace(source)) + { + return null; + } + + var match = Regex.Match(source, @"(COM\d+)", RegexOptions.IgnoreCase); + return match.Success ? match.Groups[1].Value.ToUpperInvariant() : null; + } + + /// + /// Mirrors the native SP_DEVINFO_DATA structure used by SetupAPI to describe a device instance. + /// + [StructLayout(LayoutKind.Sequential)] + private struct SP_DEVINFO_DATA + { + public uint cbSize; + public Guid ClassGuid; + public uint DevInst; + public IntPtr Reserved; + } + + /// Retrieves a handle to a device information set for a specified class. + [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern IntPtr SetupDiGetClassDevs(ref Guid classGuid, string? enumerator, IntPtr hwndParent, uint flags); + + /// Enumerates device information elements in a device information set. + [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool SetupDiEnumDeviceInfo(IntPtr deviceInfoSet, uint memberIndex, ref SP_DEVINFO_DATA deviceInfoData); + + /// Destroys a device information set and frees associated memory. + [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool SetupDiDestroyDeviceInfoList(IntPtr deviceInfoSet); + + /// Retrieves a device property from the registry. + [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool SetupDiGetDeviceRegistryProperty( + IntPtr deviceInfoSet, + ref SP_DEVINFO_DATA deviceInfoData, + uint property, + out uint propertyRegDataType, + byte[] propertyBuffer, + uint propertyBufferSize, + out uint requiredSize); + + /// Opens a registry key for a device instance. + [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern IntPtr SetupDiOpenDevRegKey( + IntPtr deviceInfoSet, + ref SP_DEVINFO_DATA deviceInfoData, + uint scope, + uint hwProfile, + uint keyType, + int samDesired); +} + +internal sealed record SerialPortDisplay( + string PortName, + string? Description, + string? Manufacturer, + string? FriendlyName, + string? HardwareIds, + string Source) +{ + public string? DeviceDescription => SanitizeDescription(FriendlyName ?? Description); + + public string DisplayName => string.IsNullOrWhiteSpace(DeviceDescription) + ? PortName + : $"{PortName} — {DeviceDescription}"; + + public bool IsLikelyFtdi => new[] { Description, Manufacturer, FriendlyName } + .Any(value => value != null && value.IndexOf("FTDI", StringComparison.OrdinalIgnoreCase) >= 0); + + private string? SanitizeDescription(string? rawDescription) + { + if (string.IsNullOrWhiteSpace(rawDescription)) + { + return null; + } + + var cleaned = rawDescription + .Replace($"({PortName})", string.Empty, StringComparison.OrdinalIgnoreCase) + .Replace(PortName, string.Empty, StringComparison.OrdinalIgnoreCase) + .Trim().Trim('-', '—').Trim(); + + return string.IsNullOrWhiteSpace(cleaned) ? rawDescription : cleaned; + } + + public override string ToString() => DisplayName; +} From fae5e265f309af23c59a4bf5d0412ff00556de5a Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 12:31:39 -0500 Subject: [PATCH 31/61] Enhance serial port enumeration details --- SerialPortUtil.cs | 266 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 256 insertions(+), 10 deletions(-) diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index 659a58a..da3dcf2 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -21,13 +21,22 @@ internal static class SerialPortUtil private const uint SPDRP_DEVICEDESC = 0x00000000; // Device description (REG_SZ). private const uint SPDRP_HARDWAREID = 0x00000001; // Hardware IDs (REG_MULTI_SZ). - private const uint SPDRP_FRIENDLYNAME = 0x0000000C; // Friendly name shown in Device Manager (REG_SZ). private const uint SPDRP_MFG = 0x0000000B; // Manufacturer string (REG_SZ). + private const uint SPDRP_FRIENDLYNAME = 0x0000000C; // Friendly name shown in Device Manager (REG_SZ). + private const uint SPDRP_LOCATION_INFORMATION = 0x0000000D; // Location information string (REG_SZ). + + private const uint DEVPROP_TYPE_STRING = 0x12; // DEVPROP_TYPE_STRING + private const uint DEVPROP_TYPE_STRING_LIST = 0x1012; // DEVPROP_TYPE_STRING | DEVPROP_TYPEMOD_LIST private const uint DIREG_DEV = 0x00000001; // Open hardware key for device. private const int KEY_QUERY_VALUE = 0x0001; // Access mask for querying registry values. private static readonly Guid PortsClassGuid = new("4d36e978-e325-11ce-bfc1-08002be10318"); + private static readonly DEVPROPKEY DEVPKEY_Device_LocationPaths = new() + { + fmtid = new Guid("9d7debbc-c85d-4e75-a5f2-0e0e3bfb4ffd"), + pid = 37 + }; /// /// Enumerates serial ports using SetupAPI and falls back to SerialPort.GetPortNames() @@ -72,10 +81,11 @@ private static void EnumerateViaSetupApi(IDictionary var description = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_DEVICEDESC); var manufacturer = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_MFG); var hardwareIds = GetMultiStringProperty(deviceInfoSet, ref devInfoData, SPDRP_HARDWAREID); + var locationInformation = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_LOCATION_INFORMATION); + var locationPaths = GetDevicePropertyMultiString(deviceInfoSet, ref devInfoData, DEVPKEY_Device_LocationPaths); + var deviceInstanceId = GetDeviceInstanceId(deviceInfoSet, ref devInfoData); - var portName = ExtractPortName(friendlyName) - ?? ExtractPortName(description) - ?? TryGetPortNameFromRegistry(deviceInfoSet, ref devInfoData); + var (portName, portSource) = ExtractBestPortName(friendlyName, description, deviceInfoSet, ref devInfoData, deviceInstanceId); if (string.IsNullOrWhiteSpace(portName)) { @@ -83,19 +93,39 @@ private static void EnumerateViaSetupApi(IDictionary continue; } - var existing = ports.GetValueOrDefault(portName!, new SerialPortDisplay(portName!, null, null, null, null, string.Empty)); + var existing = ports.GetValueOrDefault(portName!, SerialPortDisplay.Create(portName!)); var combinedSource = CombineSources(existing.Source, "SetupAPI (Ports class)"); + var parsedUsb = ParseUsbIdentifiers(hardwareIds, deviceInstanceId); + var locationPath = locationPaths?.FirstOrDefault() ?? locationInformation; + ports[portName!] = existing with { Description = string.IsNullOrWhiteSpace(existing.Description) ? description : existing.Description, Manufacturer = string.IsNullOrWhiteSpace(existing.Manufacturer) ? manufacturer : existing.Manufacturer, FriendlyName = string.IsNullOrWhiteSpace(existing.FriendlyName) ? friendlyName : existing.FriendlyName, HardwareIds = string.IsNullOrWhiteSpace(existing.HardwareIds) ? hardwareIds : existing.HardwareIds, + DeviceInstanceId = string.IsNullOrWhiteSpace(existing.DeviceInstanceId) ? deviceInstanceId : existing.DeviceInstanceId, + UsbVendorId = string.IsNullOrWhiteSpace(existing.UsbVendorId) ? parsedUsb.Vid : existing.UsbVendorId, + UsbProductId = string.IsNullOrWhiteSpace(existing.UsbProductId) ? parsedUsb.Pid : existing.UsbProductId, + UsbSerialNumber = string.IsNullOrWhiteSpace(existing.UsbSerialNumber) ? parsedUsb.SerialNumber : existing.UsbSerialNumber, + LocationPath = string.IsNullOrWhiteSpace(existing.LocationPath) ? locationPath : existing.LocationPath, Source = combinedSource }; - log?.Invoke($"SetupAPI found {portName}: desc='{description ?? friendlyName ?? "(none)"}', mfg='{manufacturer ?? "(none)"}', hwid='{hardwareIds ?? "(none)"}'."); + LogDevice(log, portName!, new() + { + ($"FriendlyName", friendlyName, "SetupAPI SPDRP_FRIENDLYNAME"), + ($"Description", description, "SetupAPI SPDRP_DEVICEDESC"), + ($"Manufacturer", manufacturer, "SetupAPI SPDRP_MFG"), + ($"HardwareIds", hardwareIds, "SetupAPI SPDRP_HARDWAREID"), + ($"DeviceInstanceId", deviceInstanceId, "SetupDiGetDeviceInstanceId"), + ($"LocationPath", locationPath, "DEVPKEY_Device_LocationPaths/SPDRP_LOCATION_INFORMATION"), + ($"USB VID", parsedUsb.Vid, "Parsed from hardware IDs"), + ($"USB PID", parsedUsb.Pid, "Parsed from hardware IDs"), + ($"USB Serial", parsedUsb.SerialNumber, "Parsed from device instance"), + ($"Port source", portSource, "FriendlyName/Description/Registry") + }); } catch (Exception ex) { @@ -124,7 +154,10 @@ private static void AppendSerialPortFallbacks(IDictionary? log, string portName, List<(string Name, string? Value, string Source)> values) + { + if (log == null) + { + return; + } + + var builder = new StringBuilder(); + builder.Append($"Detected {portName} with: "); + foreach (var (name, value, source) in values) + { + if (string.IsNullOrWhiteSpace(value)) + { + continue; + } + + builder.Append($"{name}='{value}' (from {source}); "); + } + + log(builder.ToString().Trim()); + } + private static string CombineSources(string? existingSource, string newSource) { if (string.IsNullOrWhiteSpace(existingSource)) @@ -148,6 +232,25 @@ private static string CombineSources(string? existingSource, string newSource) : $"{existingSource}; {newSource}"; } + private static string? GetDeviceInstanceId(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData) + { + var buffer = new StringBuilder(512); + if (SetupDiGetDeviceInstanceId(deviceInfoSet, ref deviceInfoData, buffer, (uint)buffer.Capacity, out var requiredSize)) + { + return buffer.ToString(); + } + + if (Marshal.GetLastWin32Error() != 122) // ERROR_INSUFFICIENT_BUFFER + { + return null; + } + + buffer = new StringBuilder((int)requiredSize); + return SetupDiGetDeviceInstanceId(deviceInfoSet, ref deviceInfoData, buffer, (uint)buffer.Capacity, out _) + ? buffer.ToString() + : null; + } + private static string? GetDeviceRegistryProperty(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, uint property) { var buffer = new byte[1024]; @@ -180,6 +283,25 @@ private static string CombineSources(string? existingSource, string newSource) return entries.Length == 0 ? null : string.Join(", ", entries); } + private static List? GetDevicePropertyMultiString(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, DEVPROPKEY propertyKey) + { + var buffer = new byte[4096]; + + if (!SetupDiGetDeviceProperty(deviceInfoSet, ref deviceInfoData, ref propertyKey, out var propertyType, buffer, (uint)buffer.Length, out var requiredSize, 0) || requiredSize == 0) + { + return null; + } + + if (propertyType != DEVPROP_TYPE_STRING_LIST && propertyType != DEVPROP_TYPE_STRING) + { + return null; + } + + var value = Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); + var parts = value.Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries); + return parts.Length == 0 ? null : new List(parts); + } + private static string? TryGetPortNameFromRegistry(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData) { var regKey = SetupDiOpenDevRegKey(deviceInfoSet, ref deviceInfoData, 0, 0, DIREG_DEV, KEY_QUERY_VALUE); @@ -193,6 +315,26 @@ private static string CombineSources(string? existingSource, string newSource) return key.GetValue("PortName") as string; } + private static string? TryGetPortNameFromEnumRegistry(string? deviceInstanceId) + { + if (string.IsNullOrWhiteSpace(deviceInstanceId)) + { + return null; + } + + try + { + var path = $"SYSTEM\\CurrentControlSet\\Enum\\{deviceInstanceId}\\Device Parameters"; + using var enumKey = Registry.LocalMachine.OpenSubKey(path); + return enumKey?.GetValue("PortName") as string; + } + catch + { + // Registry access can fail due to permissions; ignore and continue. + return null; + } + } + private static string? ExtractPortName(string? source) { if (string.IsNullOrWhiteSpace(source)) @@ -204,6 +346,32 @@ private static string CombineSources(string? existingSource, string newSource) return match.Success ? match.Groups[1].Value.ToUpperInvariant() : null; } + private static (string? Vid, string? Pid, string? SerialNumber) ParseUsbIdentifiers(string? hardwareIds, string? deviceInstanceId) + { + string? firstHardwareId = hardwareIds + ?.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries) + .Select(id => id.Trim()) + .FirstOrDefault(); + + var vidMatch = Regex.Match(firstHardwareId ?? string.Empty, "VID_([0-9A-Fa-f]{4})"); + var pidMatch = Regex.Match(firstHardwareId ?? string.Empty, "PID_([0-9A-Fa-f]{4})"); + + string? serialNumber = null; + if (!string.IsNullOrWhiteSpace(deviceInstanceId)) + { + var segments = deviceInstanceId.Split('\\'); + if (segments.Length >= 3) + { + serialNumber = segments[2]; + } + } + + return ( + vidMatch.Success ? vidMatch.Groups[1].Value.ToUpperInvariant() : null, + pidMatch.Success ? pidMatch.Groups[1].Value.ToUpperInvariant() : null, + serialNumber); + } + /// /// Mirrors the native SP_DEVINFO_DATA structure used by SetupAPI to describe a device instance. /// @@ -216,6 +384,14 @@ private struct SP_DEVINFO_DATA public IntPtr Reserved; } + /// Represents a DEVPROPKEY structure used with SetupDiGetDeviceProperty. + [StructLayout(LayoutKind.Sequential)] + private struct DEVPROPKEY + { + public Guid fmtid; + public uint pid; + } + /// Retrieves a handle to a device information set for a specified class. [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] private static extern IntPtr SetupDiGetClassDevs(ref Guid classGuid, string? enumerator, IntPtr hwndParent, uint flags); @@ -239,6 +415,27 @@ private static extern bool SetupDiGetDeviceRegistryProperty( uint propertyBufferSize, out uint requiredSize); + /// Retrieves a device instance identifier (e.g., USB\\VID_XXXX&PID_XXXX\\SERIAL). + [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool SetupDiGetDeviceInstanceId( + IntPtr deviceInfoSet, + ref SP_DEVINFO_DATA deviceInfoData, + StringBuilder deviceInstanceId, + uint deviceInstanceIdSize, + out uint requiredSize); + + /// Retrieves device properties such as DEVPKEY_Device_LocationPaths. + [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] + private static extern bool SetupDiGetDeviceProperty( + IntPtr deviceInfoSet, + ref SP_DEVINFO_DATA deviceInfoData, + ref DEVPROPKEY propertyKey, + out uint propertyType, + byte[] propertyBuffer, + uint propertyBufferSize, + out uint requiredSize, + uint flags); + /// Opens a registry key for a device instance. [DllImport("setupapi.dll", CharSet = CharSet.Unicode, SetLastError = true)] private static extern IntPtr SetupDiOpenDevRegKey( @@ -256,13 +453,62 @@ internal sealed record SerialPortDisplay( string? Manufacturer, string? FriendlyName, string? HardwareIds, + string? DeviceInstanceId, + string? UsbVendorId, + string? UsbProductId, + string? UsbSerialNumber, + string? LocationPath, string Source) { + public static SerialPortDisplay Create(string portName) => new(portName, null, null, null, null, null, null, null, null, null, string.Empty); + public string? DeviceDescription => SanitizeDescription(FriendlyName ?? Description); - public string DisplayName => string.IsNullOrWhiteSpace(DeviceDescription) - ? PortName - : $"{PortName} — {DeviceDescription}"; + public string DisplayName + { + get + { + var parts = new List { PortName }; + + if (!string.IsNullOrWhiteSpace(DeviceDescription)) + { + parts.Add(DeviceDescription!); + } + + var usbParts = new List(); + if (!string.IsNullOrWhiteSpace(UsbVendorId) || !string.IsNullOrWhiteSpace(UsbProductId)) + { + usbParts.Add($"USB VID:{UsbVendorId ?? "????"} PID:{UsbProductId ?? "????"}"); + } + + if (!string.IsNullOrWhiteSpace(UsbSerialNumber)) + { + usbParts.Add($"SNR:{UsbSerialNumber}"); + } + + if (!string.IsNullOrWhiteSpace(LocationPath)) + { + usbParts.Add(LocationPath!); + } + + if (usbParts.Count > 0) + { + parts.Add(string.Join(' ', usbParts)); + } + + if (!string.IsNullOrWhiteSpace(Manufacturer)) + { + parts.Add(Manufacturer!); + } + + if (!string.IsNullOrWhiteSpace(HardwareIds)) + { + parts.Add($"Hardware ID: {HardwareIds}"); + } + + return string.Join(" — ", parts); + } + } public bool IsLikelyFtdi => new[] { Description, Manufacturer, FriendlyName } .Any(value => value != null && value.IndexOf("FTDI", StringComparison.OrdinalIgnoreCase) >= 0); From 02bcf25bee15dfda8b1f3cf81778b7a66b57c52f Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 13:29:56 -0500 Subject: [PATCH 32/61] Better serial port naming. --- M18AnalyzerMain.Designer.cs | 473 +++++++++++++++++++++--------------- M18AnalyzerMain.resx | 2 +- SerialPortUtil.cs | 6 +- 3 files changed, 287 insertions(+), 194 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 03d3378..e532742 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -32,6 +32,7 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); tabControlM18Main = new TabControl(); tabSimple = new TabPage(); + btnTestFT232 = new Button(); grpOutput = new GroupBox(); btnCopyOutput = new Button(); btnReset = new Button(); @@ -117,7 +118,6 @@ private void InitializeComponent() lblAboutTitle = new Label(); toolTipSimpleTab = new ToolTip(components); rtbDebugOutput = new RichTextBox(); - btnTestFT232 = new Button(); tabControlM18Main.SuspendLayout(); tabSimple.SuspendLayout(); grpOutput.SuspendLayout(); @@ -138,10 +138,11 @@ private void InitializeComponent() tabControlM18Main.Controls.Add(tabSimulation); tabControlM18Main.Controls.Add(tabDiagnostics); tabControlM18Main.Controls.Add(tabAbout); - tabControlM18Main.Location = new Point(8, 8); + tabControlM18Main.Location = new Point(6, 6); + tabControlM18Main.Margin = new Padding(2, 2, 2, 2); tabControlM18Main.Name = "tabControlM18Main"; tabControlM18Main.SelectedIndex = 0; - tabControlM18Main.Size = new Size(908, 512); + tabControlM18Main.Size = new Size(762, 394); tabControlM18Main.TabIndex = 0; // // tabSimple @@ -153,14 +154,25 @@ private void InitializeComponent() tabSimple.Controls.Add(btnRefresh); tabSimple.Controls.Add(lblSerialPort); tabSimple.Controls.Add(cmbBxSerialPort); - tabSimple.Location = new Point(4, 34); + tabSimple.Location = new Point(4, 29); + tabSimple.Margin = new Padding(2, 2, 2, 2); tabSimple.Name = "tabSimple"; - tabSimple.Padding = new Padding(3); - tabSimple.Size = new Size(900, 474); + tabSimple.Padding = new Padding(2, 2, 2, 2); + tabSimple.Size = new Size(754, 361); tabSimple.TabIndex = 0; tabSimple.Text = "Simple"; tabSimple.UseVisualStyleBackColor = true; // + // btnTestFT232 + // + btnTestFT232.Location = new Point(274, 38); + btnTestFT232.Margin = new Padding(2, 2, 2, 2); + btnTestFT232.Name = "btnTestFT232"; + btnTestFT232.Size = new Size(90, 27); + btnTestFT232.TabIndex = 7; + btnTestFT232.Text = "Test Device"; + btnTestFT232.UseVisualStyleBackColor = true; + // // grpOutput // grpOutput.Controls.Add(btnCopyOutput); @@ -169,18 +181,21 @@ private void InitializeComponent() grpOutput.Controls.Add(btnActive); grpOutput.Controls.Add(rtbOutput); grpOutput.Controls.Add(btnIdle); - grpOutput.Location = new Point(6, 88); + grpOutput.Location = new Point(5, 70); + grpOutput.Margin = new Padding(2, 2, 2, 2); grpOutput.Name = "grpOutput"; - grpOutput.Size = new Size(882, 352); + grpOutput.Padding = new Padding(2, 2, 2, 2); + grpOutput.Size = new Size(739, 282); grpOutput.TabIndex = 6; grpOutput.TabStop = false; grpOutput.Text = "Output"; // // btnCopyOutput // - btnCopyOutput.Location = new Point(728, 144); + btnCopyOutput.Location = new Point(616, 120); + btnCopyOutput.Margin = new Padding(2, 2, 2, 2); btnCopyOutput.Name = "btnCopyOutput"; - btnCopyOutput.Size = new Size(148, 34); + btnCopyOutput.Size = new Size(118, 27); btnCopyOutput.TabIndex = 11; btnCopyOutput.Text = "Copy Output"; toolTipSimpleTab.SetToolTip(btnCopyOutput, "Send 0xAA to battery. \r\nReturn true if battery replies wih 0xAA"); @@ -188,9 +203,10 @@ private void InitializeComponent() // // btnReset // - btnReset.Location = new Point(728, 304); + btnReset.Location = new Point(616, 248); + btnReset.Margin = new Padding(2, 2, 2, 2); btnReset.Name = "btnReset"; - btnReset.Size = new Size(148, 34); + btnReset.Size = new Size(118, 27); btnReset.TabIndex = 10; btnReset.Text = "Reset"; toolTipSimpleTab.SetToolTip(btnReset, "Send 0xAA to battery. \r\nReturn true if battery replies wih 0xAA"); @@ -198,9 +214,10 @@ private void InitializeComponent() // // btnHealthReport // - btnHealthReport.Location = new Point(728, 104); + btnHealthReport.Location = new Point(616, 88); + btnHealthReport.Margin = new Padding(2, 2, 2, 2); btnHealthReport.Name = "btnHealthReport"; - btnHealthReport.Size = new Size(148, 34); + btnHealthReport.Size = new Size(118, 27); btnHealthReport.TabIndex = 9; btnHealthReport.Text = "Health Report"; toolTipSimpleTab.SetToolTip(btnHealthReport, "Print simple health report on the connected battery."); @@ -208,9 +225,10 @@ private void InitializeComponent() // // btnActive // - btnActive.Location = new Point(728, 64); + btnActive.Location = new Point(616, 56); + btnActive.Margin = new Padding(2, 2, 2, 2); btnActive.Name = "btnActive"; - btnActive.Size = new Size(148, 34); + btnActive.Size = new Size(118, 27); btnActive.TabIndex = 8; btnActive.Text = "Active (Tx High)"; toolTipSimpleTab.SetToolTip(btnActive, "Charger simulation active.\r\nMay increase battery charge counter.\r\nNot safe to connect or disconnect battery during this state."); @@ -220,18 +238,20 @@ private void InitializeComponent() // rtbOutput.BackColor = Color.Black; rtbOutput.ForeColor = Color.Lime; - rtbOutput.Location = new Point(6, 30); + rtbOutput.Location = new Point(5, 24); + rtbOutput.Margin = new Padding(2, 2, 2, 2); rtbOutput.Name = "rtbOutput"; - rtbOutput.Size = new Size(714, 314); + rtbOutput.Size = new Size(603, 252); rtbOutput.TabIndex = 0; rtbOutput.Text = resources.GetString("rtbOutput.Text"); rtbOutput.TextChanged += rtbOutput_TextChanged; // // btnIdle // - btnIdle.Location = new Point(728, 24); + btnIdle.Location = new Point(616, 24); + btnIdle.Margin = new Padding(2, 2, 2, 2); btnIdle.Name = "btnIdle"; - btnIdle.Size = new Size(148, 34); + btnIdle.Size = new Size(118, 27); btnIdle.TabIndex = 7; btnIdle.Text = "Idle (Tx Low)"; toolTipSimpleTab.SetToolTip(btnIdle, "Does not increase charge count.\r\nSafe to connect or disconnect battery."); @@ -239,18 +259,20 @@ private void InitializeComponent() // // btnDisconnect // - btnDisconnect.Location = new Point(464, 48); + btnDisconnect.Location = new Point(371, 38); + btnDisconnect.Margin = new Padding(2, 2, 2, 2); btnDisconnect.Name = "btnDisconnect"; - btnDisconnect.Size = new Size(112, 34); + btnDisconnect.Size = new Size(90, 27); btnDisconnect.TabIndex = 5; btnDisconnect.Text = "Disconnect"; btnDisconnect.UseVisualStyleBackColor = true; // // btnConnect // - btnConnect.Location = new Point(224, 48); + btnConnect.Location = new Point(179, 38); + btnConnect.Margin = new Padding(2, 2, 2, 2); btnConnect.Name = "btnConnect"; - btnConnect.Size = new Size(112, 34); + btnConnect.Size = new Size(90, 27); btnConnect.TabIndex = 4; btnConnect.Text = "Connect"; toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); @@ -258,9 +280,10 @@ private void InitializeComponent() // // btnRefresh // - btnRefresh.Location = new Point(104, 48); + btnRefresh.Location = new Point(83, 38); + btnRefresh.Margin = new Padding(2, 2, 2, 2); btnRefresh.Name = "btnRefresh"; - btnRefresh.Size = new Size(112, 34); + btnRefresh.Size = new Size(90, 27); btnRefresh.TabIndex = 3; btnRefresh.Text = "Refresh"; toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the serial port list."); @@ -269,18 +292,20 @@ private void InitializeComponent() // lblSerialPort // lblSerialPort.AutoSize = true; - lblSerialPort.Location = new Point(6, 14); + lblSerialPort.Location = new Point(5, 11); + lblSerialPort.Margin = new Padding(2, 0, 2, 0); lblSerialPort.Name = "lblSerialPort"; - lblSerialPort.Size = new Size(95, 25); + lblSerialPort.Size = new Size(79, 20); lblSerialPort.TabIndex = 2; lblSerialPort.Text = "Serial Port:"; // // cmbBxSerialPort // cmbBxSerialPort.FormattingEnabled = true; - cmbBxSerialPort.Location = new Point(107, 11); + cmbBxSerialPort.Location = new Point(86, 9); + cmbBxSerialPort.Margin = new Padding(2, 2, 2, 2); cmbBxSerialPort.Name = "cmbBxSerialPort"; - cmbBxSerialPort.Size = new Size(781, 33); + cmbBxSerialPort.Size = new Size(626, 28); cmbBxSerialPort.TabIndex = 1; // // tabAdvanced @@ -300,19 +325,21 @@ private void InitializeComponent() tabAdvanced.Controls.Add(btnReadAllSpreadsheet); tabAdvanced.Controls.Add(btnReadAllRegisters); tabAdvanced.Controls.Add(rtbAdvOutput); - tabAdvanced.Location = new Point(4, 34); + tabAdvanced.Location = new Point(4, 29); + tabAdvanced.Margin = new Padding(2, 2, 2, 2); tabAdvanced.Name = "tabAdvanced"; - tabAdvanced.Padding = new Padding(3); - tabAdvanced.Size = new Size(900, 474); + tabAdvanced.Padding = new Padding(2, 2, 2, 2); + tabAdvanced.Size = new Size(754, 361); tabAdvanced.TabIndex = 1; tabAdvanced.Text = "Advanced"; tabAdvanced.UseVisualStyleBackColor = true; // // btnRestoreTxRxState // - btnRestoreTxRxState.Location = new Point(8, 248); + btnRestoreTxRxState.Location = new Point(6, 198); + btnRestoreTxRxState.Margin = new Padding(2, 2, 2, 2); btnRestoreTxRxState.Name = "btnRestoreTxRxState"; - btnRestoreTxRxState.Size = new Size(208, 34); + btnRestoreTxRxState.Size = new Size(166, 27); btnRestoreTxRxState.TabIndex = 15; btnRestoreTxRxState.Text = "Restore TxRx State"; btnRestoreTxRxState.UseVisualStyleBackColor = true; @@ -327,75 +354,85 @@ private void InitializeComponent() grpTryCmd.Controls.Add(lblAddrHigh); grpTryCmd.Controls.Add(lblCommand); grpTryCmd.Controls.Add(txtCommand); - grpTryCmd.Location = new Point(560, 8); + grpTryCmd.Location = new Point(448, 6); + grpTryCmd.Margin = new Padding(2, 2, 2, 2); grpTryCmd.Name = "grpTryCmd"; - grpTryCmd.Size = new Size(328, 184); + grpTryCmd.Padding = new Padding(2, 2, 2, 2); + grpTryCmd.Size = new Size(262, 147); grpTryCmd.TabIndex = 14; grpTryCmd.TabStop = false; grpTryCmd.Text = "Try Command"; // // txtTryCmdLength // - txtTryCmdLength.Location = new Point(160, 144); + txtTryCmdLength.Location = new Point(128, 115); + txtTryCmdLength.Margin = new Padding(2, 2, 2, 2); txtTryCmdLength.Name = "txtTryCmdLength"; - txtTryCmdLength.Size = new Size(160, 31); + txtTryCmdLength.Size = new Size(129, 27); txtTryCmdLength.TabIndex = 14; // // txtAddressLow // - txtAddressLow.Location = new Point(160, 104); + txtAddressLow.Location = new Point(128, 83); + txtAddressLow.Margin = new Padding(2, 2, 2, 2); txtAddressLow.Name = "txtAddressLow"; - txtAddressLow.Size = new Size(160, 31); + txtAddressLow.Size = new Size(129, 27); txtAddressLow.TabIndex = 13; // // txtAddressHigh // - txtAddressHigh.Location = new Point(160, 64); + txtAddressHigh.Location = new Point(128, 51); + txtAddressHigh.Margin = new Padding(2, 2, 2, 2); txtAddressHigh.Name = "txtAddressHigh"; - txtAddressHigh.Size = new Size(160, 31); + txtAddressHigh.Size = new Size(129, 27); txtAddressHigh.TabIndex = 12; // // lblTryCmdLength // lblTryCmdLength.AutoSize = true; - lblTryCmdLength.Location = new Point(8, 152); + lblTryCmdLength.Location = new Point(6, 122); + lblTryCmdLength.Margin = new Padding(2, 0, 2, 0); lblTryCmdLength.Name = "lblTryCmdLength"; - lblTryCmdLength.Size = new Size(66, 25); + lblTryCmdLength.Size = new Size(54, 20); lblTryCmdLength.TabIndex = 11; lblTryCmdLength.Text = "Length"; // // lblAddressLow // lblAddressLow.AutoSize = true; - lblAddressLow.Location = new Point(8, 112); + lblAddressLow.Location = new Point(6, 90); + lblAddressLow.Margin = new Padding(2, 0, 2, 0); lblAddressLow.Name = "lblAddressLow"; - lblAddressLow.Size = new Size(114, 25); + lblAddressLow.Size = new Size(93, 20); lblAddressLow.TabIndex = 10; lblAddressLow.Text = "Address Low"; // // lblAddrHigh // lblAddrHigh.AutoSize = true; - lblAddrHigh.Location = new Point(8, 72); + lblAddrHigh.Location = new Point(6, 58); + lblAddrHigh.Margin = new Padding(2, 0, 2, 0); lblAddrHigh.Name = "lblAddrHigh"; - lblAddrHigh.Size = new Size(120, 25); + lblAddrHigh.Size = new Size(98, 20); lblAddrHigh.TabIndex = 9; lblAddrHigh.Text = "Address High"; // // lblCommand // lblCommand.AutoSize = true; - lblCommand.Location = new Point(8, 32); + lblCommand.Location = new Point(6, 26); + lblCommand.Margin = new Padding(2, 0, 2, 0); lblCommand.Name = "lblCommand"; - lblCommand.Size = new Size(96, 25); + lblCommand.Size = new Size(78, 20); lblCommand.TabIndex = 8; lblCommand.Text = "Command"; // // txtCommand // - txtCommand.Location = new Point(160, 24); + txtCommand.Location = new Point(128, 19); + txtCommand.Margin = new Padding(2, 2, 2, 2); txtCommand.Name = "txtCommand"; - txtCommand.Size = new Size(160, 31); + txtCommand.Size = new Size(129, 27); txtCommand.TabIndex = 7; // // grpbxDebugCmd @@ -408,40 +445,46 @@ private void InitializeComponent() grpbxDebugCmd.Controls.Add(lblLSB); grpbxDebugCmd.Controls.Add(lblMSB); grpbxDebugCmd.Controls.Add(txtAddrMSB); - grpbxDebugCmd.Location = new Point(224, 8); + grpbxDebugCmd.Location = new Point(179, 6); + grpbxDebugCmd.Margin = new Padding(2, 2, 2, 2); grpbxDebugCmd.Name = "grpbxDebugCmd"; - grpbxDebugCmd.Size = new Size(328, 184); + grpbxDebugCmd.Padding = new Padding(2, 2, 2, 2); + grpbxDebugCmd.Size = new Size(262, 147); grpbxDebugCmd.TabIndex = 13; grpbxDebugCmd.TabStop = false; grpbxDebugCmd.Text = "Debug Command"; // // txtResponseLength // - txtResponseLength.Location = new Point(160, 144); + txtResponseLength.Location = new Point(128, 115); + txtResponseLength.Margin = new Padding(2, 2, 2, 2); txtResponseLength.Name = "txtResponseLength"; - txtResponseLength.Size = new Size(160, 31); + txtResponseLength.Size = new Size(129, 27); txtResponseLength.TabIndex = 14; // // txtDebugCmdLength // - txtDebugCmdLength.Location = new Point(160, 104); + txtDebugCmdLength.Location = new Point(128, 83); + txtDebugCmdLength.Margin = new Padding(2, 2, 2, 2); txtDebugCmdLength.Name = "txtDebugCmdLength"; - txtDebugCmdLength.Size = new Size(160, 31); + txtDebugCmdLength.Size = new Size(129, 27); txtDebugCmdLength.TabIndex = 13; // // txtAddrLSB // - txtAddrLSB.Location = new Point(160, 64); + txtAddrLSB.Location = new Point(128, 51); + txtAddrLSB.Margin = new Padding(2, 2, 2, 2); txtAddrLSB.Name = "txtAddrLSB"; - txtAddrLSB.Size = new Size(160, 31); + txtAddrLSB.Size = new Size(129, 27); txtAddrLSB.TabIndex = 12; // // lblResponseLength // lblResponseLength.AutoSize = true; - lblResponseLength.Location = new Point(8, 144); + lblResponseLength.Location = new Point(6, 115); + lblResponseLength.Margin = new Padding(2, 0, 2, 0); lblResponseLength.Name = "lblResponseLength"; - lblResponseLength.Size = new Size(147, 25); + lblResponseLength.Size = new Size(121, 20); lblResponseLength.TabIndex = 11; lblResponseLength.Text = "Response Length"; lblResponseLength.Click += lblResponseLength_Click; @@ -449,60 +492,67 @@ private void InitializeComponent() // lblDebugCmdLength // lblDebugCmdLength.AutoSize = true; - lblDebugCmdLength.Location = new Point(8, 112); + lblDebugCmdLength.Location = new Point(6, 90); + lblDebugCmdLength.Margin = new Padding(2, 0, 2, 0); lblDebugCmdLength.Name = "lblDebugCmdLength"; - lblDebugCmdLength.Size = new Size(66, 25); + lblDebugCmdLength.Size = new Size(54, 20); lblDebugCmdLength.TabIndex = 10; lblDebugCmdLength.Text = "Length"; // // lblLSB // lblLSB.AutoSize = true; - lblLSB.Location = new Point(8, 72); + lblLSB.Location = new Point(6, 58); + lblLSB.Margin = new Padding(2, 0, 2, 0); lblLSB.Name = "lblLSB"; - lblLSB.Size = new Size(110, 25); + lblLSB.Size = new Size(90, 20); lblLSB.TabIndex = 9; lblLSB.Text = "LSB Address"; // // lblMSB // lblMSB.AutoSize = true; - lblMSB.Location = new Point(8, 32); + lblMSB.Location = new Point(6, 26); + lblMSB.Margin = new Padding(2, 0, 2, 0); lblMSB.Name = "lblMSB"; - lblMSB.Size = new Size(118, 25); + lblMSB.Size = new Size(96, 20); lblMSB.TabIndex = 8; lblMSB.Text = "MSB Address"; // // txtAddrMSB // - txtAddrMSB.Location = new Point(160, 24); + txtAddrMSB.Location = new Point(128, 19); + txtAddrMSB.Margin = new Padding(2, 2, 2, 2); txtAddrMSB.Name = "txtAddrMSB"; - txtAddrMSB.Size = new Size(160, 31); + txtAddrMSB.Size = new Size(129, 27); txtAddrMSB.TabIndex = 7; // // btnFullBrute // - btnFullBrute.Location = new Point(8, 352); + btnFullBrute.Location = new Point(6, 282); + btnFullBrute.Margin = new Padding(2, 2, 2, 2); btnFullBrute.Name = "btnFullBrute"; - btnFullBrute.Size = new Size(208, 34); + btnFullBrute.Size = new Size(166, 27); btnFullBrute.TabIndex = 12; btnFullBrute.Text = "Brute Force All"; btnFullBrute.UseVisualStyleBackColor = true; // // btnBruteAddr // - btnBruteAddr.Location = new Point(8, 312); + btnBruteAddr.Location = new Point(6, 250); + btnBruteAddr.Margin = new Padding(2, 2, 2, 2); btnBruteAddr.Name = "btnBruteAddr"; - btnBruteAddr.Size = new Size(208, 34); + btnBruteAddr.Size = new Size(166, 27); btnBruteAddr.TabIndex = 11; btnBruteAddr.Text = "Brute Force Addresses"; btnBruteAddr.UseVisualStyleBackColor = true; // // btnSaveTxRxState // - btnSaveTxRxState.Location = new Point(8, 208); + btnSaveTxRxState.Location = new Point(6, 166); + btnSaveTxRxState.Margin = new Padding(2, 2, 2, 2); btnSaveTxRxState.Name = "btnSaveTxRxState"; - btnSaveTxRxState.Size = new Size(208, 34); + btnSaveTxRxState.Size = new Size(166, 27); btnSaveTxRxState.TabIndex = 10; btnSaveTxRxState.Text = "Save && Set TxRx State"; btnSaveTxRxState.UseVisualStyleBackColor = true; @@ -512,9 +562,10 @@ private void InitializeComponent() chkboxRxLog.AutoSize = true; chkboxRxLog.Checked = true; chkboxRxLog.CheckState = CheckState.Checked; - chkboxRxLog.Location = new Point(736, 376); + chkboxRxLog.Location = new Point(589, 301); + chkboxRxLog.Margin = new Padding(2, 2, 2, 2); chkboxRxLog.Name = "chkboxRxLog"; - chkboxRxLog.Size = new Size(149, 29); + chkboxRxLog.Size = new Size(125, 24); chkboxRxLog.TabIndex = 8; chkboxRxLog.Text = "Enable Rx Log"; chkboxRxLog.UseVisualStyleBackColor = true; @@ -524,71 +575,79 @@ private void InitializeComponent() chkbxTXLog.AutoSize = true; chkbxTXLog.Checked = true; chkbxTXLog.CheckState = CheckState.Checked; - chkbxTXLog.Location = new Point(576, 376); + chkbxTXLog.Location = new Point(461, 301); + chkbxTXLog.Margin = new Padding(2, 2, 2, 2); chkbxTXLog.Name = "chkbxTXLog"; - chkbxTXLog.Size = new Size(150, 29); + chkbxTXLog.Size = new Size(126, 24); chkbxTXLog.TabIndex = 7; chkbxTXLog.Text = "Enable TX Log"; chkbxTXLog.UseVisualStyleBackColor = true; // // txtWriteMessage // - txtWriteMessage.Location = new Point(224, 408); + txtWriteMessage.Location = new Point(179, 326); + txtWriteMessage.Margin = new Padding(2, 2, 2, 2); txtWriteMessage.Name = "txtWriteMessage"; - txtWriteMessage.Size = new Size(664, 31); + txtWriteMessage.Size = new Size(532, 27); txtWriteMessage.TabIndex = 6; txtWriteMessage.Text = "Write ASCII To Register. 20 Characters Max."; // // btnWriteMessage // - btnWriteMessage.Location = new Point(8, 408); + btnWriteMessage.Location = new Point(6, 326); + btnWriteMessage.Margin = new Padding(2, 2, 2, 2); btnWriteMessage.Name = "btnWriteMessage"; - btnWriteMessage.Size = new Size(208, 34); + btnWriteMessage.Size = new Size(166, 27); btnWriteMessage.TabIndex = 5; btnWriteMessage.Text = "Write Message"; btnWriteMessage.UseVisualStyleBackColor = true; // // btnReadIDLabelled // - btnReadIDLabelled.Location = new Point(8, 144); + btnReadIDLabelled.Location = new Point(6, 115); + btnReadIDLabelled.Margin = new Padding(2, 2, 2, 2); btnReadIDLabelled.Name = "btnReadIDLabelled"; - btnReadIDLabelled.Size = new Size(208, 34); + btnReadIDLabelled.Size = new Size(166, 27); btnReadIDLabelled.TabIndex = 4; btnReadIDLabelled.Text = "Read ID (Labelled)"; btnReadIDLabelled.UseVisualStyleBackColor = true; // // btnReadIDRaw // - btnReadIDRaw.Location = new Point(8, 104); + btnReadIDRaw.Location = new Point(6, 83); + btnReadIDRaw.Margin = new Padding(2, 2, 2, 2); btnReadIDRaw.Name = "btnReadIDRaw"; - btnReadIDRaw.Size = new Size(208, 34); + btnReadIDRaw.Size = new Size(166, 27); btnReadIDRaw.TabIndex = 3; btnReadIDRaw.Text = "Read ID (Raw)"; btnReadIDRaw.UseVisualStyleBackColor = true; // // btnReadAllSpreadsheet // - btnReadAllSpreadsheet.Location = new Point(8, 64); + btnReadAllSpreadsheet.Location = new Point(6, 51); + btnReadAllSpreadsheet.Margin = new Padding(2, 2, 2, 2); btnReadAllSpreadsheet.Name = "btnReadAllSpreadsheet"; - btnReadAllSpreadsheet.Size = new Size(208, 34); + btnReadAllSpreadsheet.Size = new Size(166, 27); btnReadAllSpreadsheet.TabIndex = 2; btnReadAllSpreadsheet.Text = "Read All Spreadsheet"; btnReadAllSpreadsheet.UseVisualStyleBackColor = true; // // btnReadAllRegisters // - btnReadAllRegisters.Location = new Point(8, 24); + btnReadAllRegisters.Location = new Point(6, 19); + btnReadAllRegisters.Margin = new Padding(2, 2, 2, 2); btnReadAllRegisters.Name = "btnReadAllRegisters"; - btnReadAllRegisters.Size = new Size(208, 34); + btnReadAllRegisters.Size = new Size(166, 27); btnReadAllRegisters.TabIndex = 1; btnReadAllRegisters.Text = "Read All Registers"; btnReadAllRegisters.UseVisualStyleBackColor = true; // // rtbAdvOutput // - rtbAdvOutput.Location = new Point(224, 200); + rtbAdvOutput.Location = new Point(179, 160); + rtbAdvOutput.Margin = new Padding(2, 2, 2, 2); rtbAdvOutput.Name = "rtbAdvOutput"; - rtbAdvOutput.Size = new Size(664, 176); + rtbAdvOutput.Size = new Size(532, 142); rtbAdvOutput.TabIndex = 0; rtbAdvOutput.Text = ""; // @@ -603,10 +662,11 @@ private void InitializeComponent() tabSimulation.Controls.Add(lblDuration); tabSimulation.Controls.Add(cmbBxChgProfile); tabSimulation.Controls.Add(cmbBxBaudRate); - tabSimulation.Location = new Point(4, 34); + tabSimulation.Location = new Point(4, 29); + tabSimulation.Margin = new Padding(2, 2, 2, 2); tabSimulation.Name = "tabSimulation"; - tabSimulation.Padding = new Padding(3); - tabSimulation.Size = new Size(900, 474); + tabSimulation.Padding = new Padding(2, 2, 2, 2); + tabSimulation.Size = new Size(718, 377); tabSimulation.TabIndex = 2; tabSimulation.Text = "Simulation"; tabSimulation.UseVisualStyleBackColor = true; @@ -621,9 +681,11 @@ private void InitializeComponent() grpBxSimCustomProfile.Controls.Add(lblCutoffAmps); grpBxSimCustomProfile.Controls.Add(txtMaxCurrRaw); grpBxSimCustomProfile.Controls.Add(txtCutoffRaw); - grpBxSimCustomProfile.Location = new Point(296, 8); + grpBxSimCustomProfile.Location = new Point(237, 6); + grpBxSimCustomProfile.Margin = new Padding(2, 2, 2, 2); grpBxSimCustomProfile.Name = "grpBxSimCustomProfile"; - grpBxSimCustomProfile.Size = new Size(336, 200); + grpBxSimCustomProfile.Padding = new Padding(2, 2, 2, 2); + grpBxSimCustomProfile.Size = new Size(269, 160); grpBxSimCustomProfile.TabIndex = 16; grpBxSimCustomProfile.TabStop = false; grpBxSimCustomProfile.Text = "Custom Charger Profile"; @@ -632,88 +694,99 @@ private void InitializeComponent() // lblCutoffRaw // lblCutoffRaw.AutoSize = true; - lblCutoffRaw.Location = new Point(8, 32); + lblCutoffRaw.Location = new Point(6, 26); + lblCutoffRaw.Margin = new Padding(2, 0, 2, 0); lblCutoffRaw.Name = "lblCutoffRaw"; - lblCutoffRaw.Size = new Size(110, 25); + lblCutoffRaw.Size = new Size(92, 20); lblCutoffRaw.TabIndex = 12; lblCutoffRaw.Text = "Cutoff (Raw)"; // // lblMaxCurrAmps // lblMaxCurrAmps.AutoSize = true; - lblMaxCurrAmps.Location = new Point(8, 152); + lblMaxCurrAmps.Location = new Point(6, 122); + lblMaxCurrAmps.Margin = new Padding(2, 0, 2, 0); lblMaxCurrAmps.Name = "lblMaxCurrAmps"; - lblMaxCurrAmps.Size = new Size(174, 25); + lblMaxCurrAmps.Size = new Size(144, 20); lblMaxCurrAmps.TabIndex = 15; lblMaxCurrAmps.Text = "Max. Current (Amps)"; // // txtMaxCurrAmps // - txtMaxCurrAmps.Location = new Point(184, 152); + txtMaxCurrAmps.Location = new Point(147, 122); + txtMaxCurrAmps.Margin = new Padding(2, 2, 2, 2); txtMaxCurrAmps.Name = "txtMaxCurrAmps"; - txtMaxCurrAmps.Size = new Size(134, 31); + txtMaxCurrAmps.Size = new Size(108, 27); txtMaxCurrAmps.TabIndex = 8; // // lblMaxCurrRaw // lblMaxCurrRaw.AutoSize = true; - lblMaxCurrRaw.Location = new Point(8, 112); + lblMaxCurrRaw.Location = new Point(6, 90); + lblMaxCurrRaw.Margin = new Padding(2, 0, 2, 0); lblMaxCurrRaw.Name = "lblMaxCurrRaw"; - lblMaxCurrRaw.Size = new Size(160, 25); + lblMaxCurrRaw.Size = new Size(134, 20); lblMaxCurrRaw.TabIndex = 14; lblMaxCurrRaw.Text = "Max. Current (Raw)"; // // txtCutoffAmps // - txtCutoffAmps.Location = new Point(184, 72); + txtCutoffAmps.Location = new Point(147, 58); + txtCutoffAmps.Margin = new Padding(2, 2, 2, 2); txtCutoffAmps.Name = "txtCutoffAmps"; - txtCutoffAmps.Size = new Size(134, 31); + txtCutoffAmps.Size = new Size(108, 27); txtCutoffAmps.TabIndex = 9; // // lblCutoffAmps // lblCutoffAmps.AutoSize = true; - lblCutoffAmps.Location = new Point(8, 72); + lblCutoffAmps.Location = new Point(6, 58); + lblCutoffAmps.Margin = new Padding(2, 0, 2, 0); lblCutoffAmps.Name = "lblCutoffAmps"; - lblCutoffAmps.Size = new Size(124, 25); + lblCutoffAmps.Size = new Size(102, 20); lblCutoffAmps.TabIndex = 13; lblCutoffAmps.Text = "Cutoff (Amps)"; // // txtMaxCurrRaw // - txtMaxCurrRaw.Location = new Point(184, 112); + txtMaxCurrRaw.Location = new Point(147, 90); + txtMaxCurrRaw.Margin = new Padding(2, 2, 2, 2); txtMaxCurrRaw.Name = "txtMaxCurrRaw"; - txtMaxCurrRaw.Size = new Size(134, 31); + txtMaxCurrRaw.Size = new Size(108, 27); txtMaxCurrRaw.TabIndex = 10; // // txtCutoffRaw // - txtCutoffRaw.Location = new Point(184, 32); + txtCutoffRaw.Location = new Point(147, 26); + txtCutoffRaw.Margin = new Padding(2, 2, 2, 2); txtCutoffRaw.Name = "txtCutoffRaw"; - txtCutoffRaw.Size = new Size(134, 31); + txtCutoffRaw.Size = new Size(108, 27); txtCutoffRaw.TabIndex = 11; // // txtSimDuration // - txtSimDuration.Location = new Point(168, 8); + txtSimDuration.Location = new Point(134, 6); + txtSimDuration.Margin = new Padding(2, 2, 2, 2); txtSimDuration.Name = "txtSimDuration"; - txtSimDuration.Size = new Size(120, 31); + txtSimDuration.Size = new Size(97, 27); txtSimDuration.TabIndex = 7; // // btnStopSim // - btnStopSim.Location = new Point(8, 128); + btnStopSim.Location = new Point(6, 102); + btnStopSim.Margin = new Padding(2, 2, 2, 2); btnStopSim.Name = "btnStopSim"; - btnStopSim.Size = new Size(112, 34); + btnStopSim.Size = new Size(90, 27); btnStopSim.TabIndex = 6; btnStopSim.Text = "Stop"; btnStopSim.UseVisualStyleBackColor = true; // // btnStartSim // - btnStartSim.Location = new Point(176, 128); + btnStartSim.Location = new Point(141, 102); + btnStartSim.Margin = new Padding(2, 2, 2, 2); btnStartSim.Name = "btnStartSim"; - btnStartSim.Size = new Size(112, 34); + btnStartSim.Size = new Size(90, 27); btnStartSim.TabIndex = 1; btnStartSim.Text = "Start"; btnStartSim.UseVisualStyleBackColor = true; @@ -721,44 +794,49 @@ private void InitializeComponent() // lblSimProfile // lblSimProfile.AutoSize = true; - lblSimProfile.Location = new Point(8, 88); + lblSimProfile.Location = new Point(6, 70); + lblSimProfile.Margin = new Padding(2, 0, 2, 0); lblSimProfile.Name = "lblSimProfile"; - lblSimProfile.Size = new Size(129, 25); + lblSimProfile.Size = new Size(108, 20); lblSimProfile.TabIndex = 5; lblSimProfile.Text = "Charger Profile"; // // lblBaudRate // lblBaudRate.AutoSize = true; - lblBaudRate.Location = new Point(8, 48); + lblBaudRate.Location = new Point(6, 38); + lblBaudRate.Margin = new Padding(2, 0, 2, 0); lblBaudRate.Name = "lblBaudRate"; - lblBaudRate.Size = new Size(92, 25); + lblBaudRate.Size = new Size(77, 20); lblBaudRate.TabIndex = 4; lblBaudRate.Text = "Baud Rate"; // // lblDuration // lblDuration.AutoSize = true; - lblDuration.Location = new Point(8, 8); + lblDuration.Location = new Point(6, 6); + lblDuration.Margin = new Padding(2, 0, 2, 0); lblDuration.Name = "lblDuration"; - lblDuration.Size = new Size(163, 25); + lblDuration.Size = new Size(136, 20); lblDuration.TabIndex = 3; lblDuration.Text = "Duration (Seconds)"; // // cmbBxChgProfile // cmbBxChgProfile.FormattingEnabled = true; - cmbBxChgProfile.Location = new Point(168, 88); + cmbBxChgProfile.Location = new Point(134, 70); + cmbBxChgProfile.Margin = new Padding(2, 2, 2, 2); cmbBxChgProfile.Name = "cmbBxChgProfile"; - cmbBxChgProfile.Size = new Size(120, 33); + cmbBxChgProfile.Size = new Size(97, 28); cmbBxChgProfile.TabIndex = 2; // // cmbBxBaudRate // cmbBxBaudRate.FormattingEnabled = true; - cmbBxBaudRate.Location = new Point(168, 48); + cmbBxBaudRate.Location = new Point(134, 38); + cmbBxBaudRate.Margin = new Padding(2, 2, 2, 2); cmbBxBaudRate.Name = "cmbBxBaudRate"; - cmbBxBaudRate.Size = new Size(120, 33); + cmbBxBaudRate.Size = new Size(97, 28); cmbBxBaudRate.TabIndex = 1; // // tabDiagnostics @@ -776,19 +854,21 @@ private void InitializeComponent() tabDiagnostics.Controls.Add(txtSubmitDiagType); tabDiagnostics.Controls.Add(txtOneKeyID); tabDiagnostics.Controls.Add(btnSubmitDiagForm); - tabDiagnostics.Location = new Point(4, 34); + tabDiagnostics.Location = new Point(4, 29); + tabDiagnostics.Margin = new Padding(2, 2, 2, 2); tabDiagnostics.Name = "tabDiagnostics"; - tabDiagnostics.Padding = new Padding(3); - tabDiagnostics.Size = new Size(900, 474); + tabDiagnostics.Padding = new Padding(2, 2, 2, 2); + tabDiagnostics.Size = new Size(718, 377); tabDiagnostics.TabIndex = 3; tabDiagnostics.Text = "Submit Diagnostics"; tabDiagnostics.UseVisualStyleBackColor = true; // // btnClearDiagForm // - btnClearDiagForm.Location = new Point(576, 216); + btnClearDiagForm.Location = new Point(461, 173); + btnClearDiagForm.Margin = new Padding(2, 2, 2, 2); btnClearDiagForm.Name = "btnClearDiagForm"; - btnClearDiagForm.Size = new Size(152, 34); + btnClearDiagForm.Size = new Size(122, 27); btnClearDiagForm.TabIndex = 23; btnClearDiagForm.Text = "Clear Form"; btnClearDiagForm.UseVisualStyleBackColor = true; @@ -796,106 +876,120 @@ private void InitializeComponent() // grpboxDiagOutput // grpboxDiagOutput.Controls.Add(rtbSubmitDiagReadOnly); - grpboxDiagOutput.Location = new Point(296, 8); + grpboxDiagOutput.Location = new Point(237, 6); + grpboxDiagOutput.Margin = new Padding(2, 2, 2, 2); grpboxDiagOutput.Name = "grpboxDiagOutput"; - grpboxDiagOutput.Size = new Size(592, 200); + grpboxDiagOutput.Padding = new Padding(2, 2, 2, 2); + grpboxDiagOutput.Size = new Size(474, 160); grpboxDiagOutput.TabIndex = 22; grpboxDiagOutput.TabStop = false; grpboxDiagOutput.Text = "Diagnostic Output"; // // rtbSubmitDiagReadOnly // - rtbSubmitDiagReadOnly.Location = new Point(8, 32); + rtbSubmitDiagReadOnly.Location = new Point(6, 26); + rtbSubmitDiagReadOnly.Margin = new Padding(2, 2, 2, 2); rtbSubmitDiagReadOnly.Name = "rtbSubmitDiagReadOnly"; - rtbSubmitDiagReadOnly.Size = new Size(576, 160); + rtbSubmitDiagReadOnly.Size = new Size(462, 129); rtbSubmitDiagReadOnly.TabIndex = 16; rtbSubmitDiagReadOnly.Text = ""; // // lblType // lblType.AutoSize = true; - lblType.Location = new Point(16, 176); + lblType.Location = new Point(13, 141); + lblType.Margin = new Padding(2, 0, 2, 0); lblType.Name = "lblType"; - lblType.Size = new Size(49, 25); + lblType.Size = new Size(40, 20); lblType.TabIndex = 21; lblType.Text = "Type"; // // lblStickerInfo // lblStickerInfo.AutoSize = true; - lblStickerInfo.Location = new Point(16, 136); + lblStickerInfo.Location = new Point(13, 109); + lblStickerInfo.Margin = new Padding(2, 0, 2, 0); lblStickerInfo.Name = "lblStickerInfo"; - lblStickerInfo.Size = new Size(63, 25); + lblStickerInfo.Size = new Size(53, 20); lblStickerInfo.TabIndex = 20; lblStickerInfo.Text = "Sticker"; // // lblToolSerialNum // lblToolSerialNum.AutoSize = true; - lblToolSerialNum.Location = new Point(16, 96); + lblToolSerialNum.Location = new Point(13, 77); + lblToolSerialNum.Margin = new Padding(2, 0, 2, 0); lblToolSerialNum.Name = "lblToolSerialNum"; - lblToolSerialNum.Size = new Size(70, 25); + lblToolSerialNum.Size = new Size(59, 20); lblToolSerialNum.TabIndex = 19; lblToolSerialNum.Text = "Serial #"; // // lblSubmitDiagDate // lblSubmitDiagDate.AutoSize = true; - lblSubmitDiagDate.Location = new Point(16, 56); + lblSubmitDiagDate.Location = new Point(13, 45); + lblSubmitDiagDate.Margin = new Padding(2, 0, 2, 0); lblSubmitDiagDate.Name = "lblSubmitDiagDate"; - lblSubmitDiagDate.Size = new Size(49, 25); + lblSubmitDiagDate.Size = new Size(41, 20); lblSubmitDiagDate.TabIndex = 18; lblSubmitDiagDate.Text = "Date"; // // lblOneKeyID // lblOneKeyID.AutoSize = true; - lblOneKeyID.Location = new Point(16, 16); + lblOneKeyID.Location = new Point(13, 13); + lblOneKeyID.Margin = new Padding(2, 0, 2, 0); lblOneKeyID.Name = "lblOneKeyID"; - lblOneKeyID.Size = new Size(103, 25); + lblOneKeyID.Size = new Size(85, 20); lblOneKeyID.TabIndex = 17; lblOneKeyID.Text = "One-Key ID"; // // txtSubmitDiagDate // - txtSubmitDiagDate.Location = new Point(120, 56); + txtSubmitDiagDate.Location = new Point(96, 45); + txtSubmitDiagDate.Margin = new Padding(2, 2, 2, 2); txtSubmitDiagDate.Name = "txtSubmitDiagDate"; - txtSubmitDiagDate.Size = new Size(150, 31); + txtSubmitDiagDate.Size = new Size(121, 27); txtSubmitDiagDate.TabIndex = 15; // // txtSubmitDiagSerial // - txtSubmitDiagSerial.Location = new Point(120, 96); + txtSubmitDiagSerial.Location = new Point(96, 77); + txtSubmitDiagSerial.Margin = new Padding(2, 2, 2, 2); txtSubmitDiagSerial.Name = "txtSubmitDiagSerial"; - txtSubmitDiagSerial.Size = new Size(150, 31); + txtSubmitDiagSerial.Size = new Size(121, 27); txtSubmitDiagSerial.TabIndex = 14; // // txtSubmitDiagSticker // - txtSubmitDiagSticker.Location = new Point(120, 136); + txtSubmitDiagSticker.Location = new Point(96, 109); + txtSubmitDiagSticker.Margin = new Padding(2, 2, 2, 2); txtSubmitDiagSticker.Name = "txtSubmitDiagSticker"; - txtSubmitDiagSticker.Size = new Size(150, 31); + txtSubmitDiagSticker.Size = new Size(121, 27); txtSubmitDiagSticker.TabIndex = 13; // // txtSubmitDiagType // - txtSubmitDiagType.Location = new Point(120, 176); + txtSubmitDiagType.Location = new Point(96, 141); + txtSubmitDiagType.Margin = new Padding(2, 2, 2, 2); txtSubmitDiagType.Name = "txtSubmitDiagType"; - txtSubmitDiagType.Size = new Size(150, 31); + txtSubmitDiagType.Size = new Size(121, 27); txtSubmitDiagType.TabIndex = 11; // // txtOneKeyID // - txtOneKeyID.Location = new Point(120, 16); + txtOneKeyID.Location = new Point(96, 13); + txtOneKeyID.Margin = new Padding(2, 2, 2, 2); txtOneKeyID.Name = "txtOneKeyID"; - txtOneKeyID.Size = new Size(150, 31); + txtOneKeyID.Size = new Size(121, 27); txtOneKeyID.TabIndex = 10; // // btnSubmitDiagForm // - btnSubmitDiagForm.Location = new Point(736, 216); + btnSubmitDiagForm.Location = new Point(589, 173); + btnSubmitDiagForm.Margin = new Padding(2, 2, 2, 2); btnSubmitDiagForm.Name = "btnSubmitDiagForm"; - btnSubmitDiagForm.Size = new Size(152, 34); + btnSubmitDiagForm.Size = new Size(122, 27); btnSubmitDiagForm.TabIndex = 9; btnSubmitDiagForm.Text = "Submit Form"; btnSubmitDiagForm.UseVisualStyleBackColor = true; @@ -907,10 +1001,11 @@ private void InitializeComponent() tabAbout.Controls.Add(linkLabelMartin); tabAbout.Controls.Add(lblMartin); tabAbout.Controls.Add(lblAboutTitle); - tabAbout.Location = new Point(4, 34); + tabAbout.Location = new Point(4, 29); + tabAbout.Margin = new Padding(2, 2, 2, 2); tabAbout.Name = "tabAbout"; - tabAbout.Padding = new Padding(3); - tabAbout.Size = new Size(900, 474); + tabAbout.Padding = new Padding(2, 2, 2, 2); + tabAbout.Size = new Size(718, 377); tabAbout.TabIndex = 4; tabAbout.Text = "About"; tabAbout.UseVisualStyleBackColor = true; @@ -919,9 +1014,10 @@ private void InitializeComponent() // linkLabelKillaVolt.AutoSize = true; linkLabelKillaVolt.LinkArea = new LinkArea(13, 60); - linkLabelKillaVolt.Location = new Point(272, 176); + linkLabelKillaVolt.Location = new Point(218, 141); + linkLabelKillaVolt.Margin = new Padding(2, 0, 2, 0); linkLabelKillaVolt.Name = "linkLabelKillaVolt"; - linkLabelKillaVolt.Size = new Size(347, 30); + linkLabelKillaVolt.Size = new Size(289, 25); linkLabelKillaVolt.TabIndex = 4; linkLabelKillaVolt.TabStop = true; linkLabelKillaVolt.Text = "GitHub Repo: https://github.com/KillaVolt"; @@ -931,9 +1027,10 @@ private void InitializeComponent() // lblKillaVoltAbout.AutoSize = true; lblKillaVoltAbout.Font = new Font("Segoe UI", 10F, FontStyle.Bold, GraphicsUnit.Point, 0); - lblKillaVoltAbout.Location = new Point(320, 144); + lblKillaVoltAbout.Location = new Point(256, 115); + lblKillaVoltAbout.Margin = new Padding(2, 0, 2, 0); lblKillaVoltAbout.Name = "lblKillaVoltAbout"; - lblKillaVoltAbout.Size = new Size(258, 28); + lblKillaVoltAbout.Size = new Size(219, 23); lblKillaVoltAbout.TabIndex = 3; lblKillaVoltAbout.Text = "GUI designed By: KillaVolt"; // @@ -941,9 +1038,10 @@ private void InitializeComponent() // linkLabelMartin.AutoSize = true; linkLabelMartin.LinkArea = new LinkArea(13, 60); - linkLabelMartin.Location = new Point(200, 112); + linkLabelMartin.Location = new Point(160, 90); + linkLabelMartin.Margin = new Padding(2, 0, 2, 0); linkLabelMartin.Name = "linkLabelMartin"; - linkLabelMartin.Size = new Size(514, 30); + linkLabelMartin.Size = new Size(429, 25); linkLabelMartin.TabIndex = 2; linkLabelMartin.TabStop = true; linkLabelMartin.Text = "GitHub Repo: https://github.com/mnh-jansson/m18-protocol/"; @@ -954,9 +1052,10 @@ private void InitializeComponent() // lblMartin.AutoSize = true; lblMartin.Font = new Font("Segoe UI", 10F, FontStyle.Bold, GraphicsUnit.Point, 0); - lblMartin.Location = new Point(224, 80); + lblMartin.Location = new Point(179, 64); + lblMartin.Margin = new Padding(2, 0, 2, 0); lblMartin.Name = "lblMartin"; - lblMartin.Size = new Size(459, 28); + lblMartin.Size = new Size(386, 23); lblMartin.TabIndex = 1; lblMartin.Text = "Original M18 Protocol code by: Martin Jansson"; // @@ -965,38 +1064,32 @@ private void InitializeComponent() lblAboutTitle.Font = new Font("Segoe UI Black", 26F, FontStyle.Bold | FontStyle.Italic, GraphicsUnit.Point, 0); lblAboutTitle.Image = (Image)resources.GetObject("lblAboutTitle.Image"); lblAboutTitle.ImageAlign = ContentAlignment.MiddleLeft; - lblAboutTitle.Location = new Point(144, 8); + lblAboutTitle.Location = new Point(115, 6); + lblAboutTitle.Margin = new Padding(2, 0, 2, 0); lblAboutTitle.Name = "lblAboutTitle"; - lblAboutTitle.Size = new Size(632, 80); + lblAboutTitle.Size = new Size(506, 64); lblAboutTitle.TabIndex = 0; lblAboutTitle.Text = " Pack Analyzer GUI"; lblAboutTitle.TextAlign = ContentAlignment.TopCenter; // // rtbDebugOutput // - rtbDebugOutput.Location = new Point(8, 520); + rtbDebugOutput.Location = new Point(8, 400); + rtbDebugOutput.Margin = new Padding(2, 2, 2, 2); rtbDebugOutput.Name = "rtbDebugOutput"; - rtbDebugOutput.Size = new Size(904, 168); + rtbDebugOutput.Size = new Size(754, 79); rtbDebugOutput.TabIndex = 1; rtbDebugOutput.Text = ""; // - // btnTestFT232 - // - btnTestFT232.Location = new Point(342, 48); - btnTestFT232.Name = "btnTestFT232"; - btnTestFT232.Size = new Size(112, 34); - btnTestFT232.TabIndex = 7; - btnTestFT232.Text = "Test Device"; - btnTestFT232.UseVisualStyleBackColor = true; - // // frmMain // - AutoScaleDimensions = new SizeF(10F, 25F); + AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(928, 715); + ClientSize = new Size(768, 485); Controls.Add(rtbDebugOutput); Controls.Add(tabControlM18Main); Icon = (Icon)resources.GetObject("$this.Icon"); + Margin = new Padding(2, 2, 2, 2); Name = "frmMain"; ShowIcon = false; Text = "M18 Pack Analyzer"; @@ -1078,7 +1171,6 @@ private void InitializeComponent() private ComboBox cmbBxBaudRate; private Button btnRestoreTxRxState; private Button btnSubmitDiagForm; - private Label label6; private Label lblType; private Label lblStickerInfo; private Label lblToolSerialNum; @@ -1088,7 +1180,6 @@ private void InitializeComponent() private TextBox txtSubmitDiagDate; private TextBox txtSubmitDiagSerial; private TextBox txtSubmitDiagSticker; - private TextBox textBox3; private TextBox txtSubmitDiagType; private TextBox txtOneKeyID; private Button btnStartSim; diff --git a/M18AnalyzerMain.resx b/M18AnalyzerMain.resx index 3d4939d..460cf1d 100644 --- a/M18AnalyzerMain.resx +++ b/M18AnalyzerMain.resx @@ -253,7 +253,7 @@ Step 4: Set Idle (Tx Low) before unplugging battery and/or disconnecting the ser - 67 + 68 diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index da3dcf2..861f9be 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -59,7 +59,8 @@ public static List EnumerateDetailedPorts(Action? deb private static void EnumerateViaSetupApi(IDictionary ports, Action? log) { // Acquire a handle to the Ports device class (COM & LPT) containing the serial devices. - var deviceInfoSet = SetupDiGetClassDevs(ref PortsClassGuid, null, IntPtr.Zero, DIGCF_PRESENT); + var portsClassGuid = PortsClassGuid; + var deviceInfoSet = SetupDiGetClassDevs(ref portsClassGuid, null, IntPtr.Zero, DIGCF_PRESENT); if (deviceInfoSet == IntPtr.Zero || deviceInfoSet == new IntPtr(-1)) { log?.Invoke("SetupAPI enumeration failed to acquire device info set; continuing with fallbacks only."); @@ -93,7 +94,8 @@ private static void EnumerateViaSetupApi(IDictionary continue; } - var existing = ports.GetValueOrDefault(portName!, SerialPortDisplay.Create(portName!)); + ports.TryGetValue(portName!, out var existing); + existing ??= SerialPortDisplay.Create(portName!); var combinedSource = CombineSources(existing.Source, "SetupAPI (Ports class)"); var parsedUsb = ParseUsbIdentifiers(hardwareIds, deviceInstanceId); From 9eae665ac8bff487ce5a53525b21d845c031ac0b Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 16:09:21 -0500 Subject: [PATCH 33/61] Visual tweaks. --- M18AnalyzerMain.Designer.cs | 151 ++++++++++++++++++------------------ M18AnalyzerMain.cs | 6 +- 2 files changed, 81 insertions(+), 76 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index e532742..1c21a44 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -139,7 +139,7 @@ private void InitializeComponent() tabControlM18Main.Controls.Add(tabDiagnostics); tabControlM18Main.Controls.Add(tabAbout); tabControlM18Main.Location = new Point(6, 6); - tabControlM18Main.Margin = new Padding(2, 2, 2, 2); + tabControlM18Main.Margin = new Padding(2); tabControlM18Main.Name = "tabControlM18Main"; tabControlM18Main.SelectedIndex = 0; tabControlM18Main.Size = new Size(762, 394); @@ -155,9 +155,9 @@ private void InitializeComponent() tabSimple.Controls.Add(lblSerialPort); tabSimple.Controls.Add(cmbBxSerialPort); tabSimple.Location = new Point(4, 29); - tabSimple.Margin = new Padding(2, 2, 2, 2); + tabSimple.Margin = new Padding(2); tabSimple.Name = "tabSimple"; - tabSimple.Padding = new Padding(2, 2, 2, 2); + tabSimple.Padding = new Padding(2); tabSimple.Size = new Size(754, 361); tabSimple.TabIndex = 0; tabSimple.Text = "Simple"; @@ -166,7 +166,7 @@ private void InitializeComponent() // btnTestFT232 // btnTestFT232.Location = new Point(274, 38); - btnTestFT232.Margin = new Padding(2, 2, 2, 2); + btnTestFT232.Margin = new Padding(2); btnTestFT232.Name = "btnTestFT232"; btnTestFT232.Size = new Size(90, 27); btnTestFT232.TabIndex = 7; @@ -182,9 +182,9 @@ private void InitializeComponent() grpOutput.Controls.Add(rtbOutput); grpOutput.Controls.Add(btnIdle); grpOutput.Location = new Point(5, 70); - grpOutput.Margin = new Padding(2, 2, 2, 2); + grpOutput.Margin = new Padding(2); grpOutput.Name = "grpOutput"; - grpOutput.Padding = new Padding(2, 2, 2, 2); + grpOutput.Padding = new Padding(2); grpOutput.Size = new Size(739, 282); grpOutput.TabIndex = 6; grpOutput.TabStop = false; @@ -193,7 +193,7 @@ private void InitializeComponent() // btnCopyOutput // btnCopyOutput.Location = new Point(616, 120); - btnCopyOutput.Margin = new Padding(2, 2, 2, 2); + btnCopyOutput.Margin = new Padding(2); btnCopyOutput.Name = "btnCopyOutput"; btnCopyOutput.Size = new Size(118, 27); btnCopyOutput.TabIndex = 11; @@ -204,7 +204,7 @@ private void InitializeComponent() // btnReset // btnReset.Location = new Point(616, 248); - btnReset.Margin = new Padding(2, 2, 2, 2); + btnReset.Margin = new Padding(2); btnReset.Name = "btnReset"; btnReset.Size = new Size(118, 27); btnReset.TabIndex = 10; @@ -215,7 +215,7 @@ private void InitializeComponent() // btnHealthReport // btnHealthReport.Location = new Point(616, 88); - btnHealthReport.Margin = new Padding(2, 2, 2, 2); + btnHealthReport.Margin = new Padding(2); btnHealthReport.Name = "btnHealthReport"; btnHealthReport.Size = new Size(118, 27); btnHealthReport.TabIndex = 9; @@ -226,7 +226,7 @@ private void InitializeComponent() // btnActive // btnActive.Location = new Point(616, 56); - btnActive.Margin = new Padding(2, 2, 2, 2); + btnActive.Margin = new Padding(2); btnActive.Name = "btnActive"; btnActive.Size = new Size(118, 27); btnActive.TabIndex = 8; @@ -239,7 +239,7 @@ private void InitializeComponent() rtbOutput.BackColor = Color.Black; rtbOutput.ForeColor = Color.Lime; rtbOutput.Location = new Point(5, 24); - rtbOutput.Margin = new Padding(2, 2, 2, 2); + rtbOutput.Margin = new Padding(2); rtbOutput.Name = "rtbOutput"; rtbOutput.Size = new Size(603, 252); rtbOutput.TabIndex = 0; @@ -249,7 +249,7 @@ private void InitializeComponent() // btnIdle // btnIdle.Location = new Point(616, 24); - btnIdle.Margin = new Padding(2, 2, 2, 2); + btnIdle.Margin = new Padding(2); btnIdle.Name = "btnIdle"; btnIdle.Size = new Size(118, 27); btnIdle.TabIndex = 7; @@ -260,7 +260,7 @@ private void InitializeComponent() // btnDisconnect // btnDisconnect.Location = new Point(371, 38); - btnDisconnect.Margin = new Padding(2, 2, 2, 2); + btnDisconnect.Margin = new Padding(2); btnDisconnect.Name = "btnDisconnect"; btnDisconnect.Size = new Size(90, 27); btnDisconnect.TabIndex = 5; @@ -270,7 +270,7 @@ private void InitializeComponent() // btnConnect // btnConnect.Location = new Point(179, 38); - btnConnect.Margin = new Padding(2, 2, 2, 2); + btnConnect.Margin = new Padding(2); btnConnect.Name = "btnConnect"; btnConnect.Size = new Size(90, 27); btnConnect.TabIndex = 4; @@ -281,7 +281,7 @@ private void InitializeComponent() // btnRefresh // btnRefresh.Location = new Point(83, 38); - btnRefresh.Margin = new Padding(2, 2, 2, 2); + btnRefresh.Margin = new Padding(2); btnRefresh.Name = "btnRefresh"; btnRefresh.Size = new Size(90, 27); btnRefresh.TabIndex = 3; @@ -303,10 +303,11 @@ private void InitializeComponent() // cmbBxSerialPort.FormattingEnabled = true; cmbBxSerialPort.Location = new Point(86, 9); - cmbBxSerialPort.Margin = new Padding(2, 2, 2, 2); + cmbBxSerialPort.Margin = new Padding(2); cmbBxSerialPort.Name = "cmbBxSerialPort"; cmbBxSerialPort.Size = new Size(626, 28); cmbBxSerialPort.TabIndex = 1; + cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged_1; // // tabAdvanced // @@ -326,9 +327,9 @@ private void InitializeComponent() tabAdvanced.Controls.Add(btnReadAllRegisters); tabAdvanced.Controls.Add(rtbAdvOutput); tabAdvanced.Location = new Point(4, 29); - tabAdvanced.Margin = new Padding(2, 2, 2, 2); + tabAdvanced.Margin = new Padding(2); tabAdvanced.Name = "tabAdvanced"; - tabAdvanced.Padding = new Padding(2, 2, 2, 2); + tabAdvanced.Padding = new Padding(2); tabAdvanced.Size = new Size(754, 361); tabAdvanced.TabIndex = 1; tabAdvanced.Text = "Advanced"; @@ -337,7 +338,7 @@ private void InitializeComponent() // btnRestoreTxRxState // btnRestoreTxRxState.Location = new Point(6, 198); - btnRestoreTxRxState.Margin = new Padding(2, 2, 2, 2); + btnRestoreTxRxState.Margin = new Padding(2); btnRestoreTxRxState.Name = "btnRestoreTxRxState"; btnRestoreTxRxState.Size = new Size(166, 27); btnRestoreTxRxState.TabIndex = 15; @@ -355,9 +356,9 @@ private void InitializeComponent() grpTryCmd.Controls.Add(lblCommand); grpTryCmd.Controls.Add(txtCommand); grpTryCmd.Location = new Point(448, 6); - grpTryCmd.Margin = new Padding(2, 2, 2, 2); + grpTryCmd.Margin = new Padding(2); grpTryCmd.Name = "grpTryCmd"; - grpTryCmd.Padding = new Padding(2, 2, 2, 2); + grpTryCmd.Padding = new Padding(2); grpTryCmd.Size = new Size(262, 147); grpTryCmd.TabIndex = 14; grpTryCmd.TabStop = false; @@ -366,7 +367,7 @@ private void InitializeComponent() // txtTryCmdLength // txtTryCmdLength.Location = new Point(128, 115); - txtTryCmdLength.Margin = new Padding(2, 2, 2, 2); + txtTryCmdLength.Margin = new Padding(2); txtTryCmdLength.Name = "txtTryCmdLength"; txtTryCmdLength.Size = new Size(129, 27); txtTryCmdLength.TabIndex = 14; @@ -374,7 +375,7 @@ private void InitializeComponent() // txtAddressLow // txtAddressLow.Location = new Point(128, 83); - txtAddressLow.Margin = new Padding(2, 2, 2, 2); + txtAddressLow.Margin = new Padding(2); txtAddressLow.Name = "txtAddressLow"; txtAddressLow.Size = new Size(129, 27); txtAddressLow.TabIndex = 13; @@ -382,7 +383,7 @@ private void InitializeComponent() // txtAddressHigh // txtAddressHigh.Location = new Point(128, 51); - txtAddressHigh.Margin = new Padding(2, 2, 2, 2); + txtAddressHigh.Margin = new Padding(2); txtAddressHigh.Name = "txtAddressHigh"; txtAddressHigh.Size = new Size(129, 27); txtAddressHigh.TabIndex = 12; @@ -430,7 +431,7 @@ private void InitializeComponent() // txtCommand // txtCommand.Location = new Point(128, 19); - txtCommand.Margin = new Padding(2, 2, 2, 2); + txtCommand.Margin = new Padding(2); txtCommand.Name = "txtCommand"; txtCommand.Size = new Size(129, 27); txtCommand.TabIndex = 7; @@ -446,9 +447,9 @@ private void InitializeComponent() grpbxDebugCmd.Controls.Add(lblMSB); grpbxDebugCmd.Controls.Add(txtAddrMSB); grpbxDebugCmd.Location = new Point(179, 6); - grpbxDebugCmd.Margin = new Padding(2, 2, 2, 2); + grpbxDebugCmd.Margin = new Padding(2); grpbxDebugCmd.Name = "grpbxDebugCmd"; - grpbxDebugCmd.Padding = new Padding(2, 2, 2, 2); + grpbxDebugCmd.Padding = new Padding(2); grpbxDebugCmd.Size = new Size(262, 147); grpbxDebugCmd.TabIndex = 13; grpbxDebugCmd.TabStop = false; @@ -457,7 +458,7 @@ private void InitializeComponent() // txtResponseLength // txtResponseLength.Location = new Point(128, 115); - txtResponseLength.Margin = new Padding(2, 2, 2, 2); + txtResponseLength.Margin = new Padding(2); txtResponseLength.Name = "txtResponseLength"; txtResponseLength.Size = new Size(129, 27); txtResponseLength.TabIndex = 14; @@ -465,7 +466,7 @@ private void InitializeComponent() // txtDebugCmdLength // txtDebugCmdLength.Location = new Point(128, 83); - txtDebugCmdLength.Margin = new Padding(2, 2, 2, 2); + txtDebugCmdLength.Margin = new Padding(2); txtDebugCmdLength.Name = "txtDebugCmdLength"; txtDebugCmdLength.Size = new Size(129, 27); txtDebugCmdLength.TabIndex = 13; @@ -473,7 +474,7 @@ private void InitializeComponent() // txtAddrLSB // txtAddrLSB.Location = new Point(128, 51); - txtAddrLSB.Margin = new Padding(2, 2, 2, 2); + txtAddrLSB.Margin = new Padding(2); txtAddrLSB.Name = "txtAddrLSB"; txtAddrLSB.Size = new Size(129, 27); txtAddrLSB.TabIndex = 12; @@ -522,7 +523,7 @@ private void InitializeComponent() // txtAddrMSB // txtAddrMSB.Location = new Point(128, 19); - txtAddrMSB.Margin = new Padding(2, 2, 2, 2); + txtAddrMSB.Margin = new Padding(2); txtAddrMSB.Name = "txtAddrMSB"; txtAddrMSB.Size = new Size(129, 27); txtAddrMSB.TabIndex = 7; @@ -530,7 +531,7 @@ private void InitializeComponent() // btnFullBrute // btnFullBrute.Location = new Point(6, 282); - btnFullBrute.Margin = new Padding(2, 2, 2, 2); + btnFullBrute.Margin = new Padding(2); btnFullBrute.Name = "btnFullBrute"; btnFullBrute.Size = new Size(166, 27); btnFullBrute.TabIndex = 12; @@ -540,7 +541,7 @@ private void InitializeComponent() // btnBruteAddr // btnBruteAddr.Location = new Point(6, 250); - btnBruteAddr.Margin = new Padding(2, 2, 2, 2); + btnBruteAddr.Margin = new Padding(2); btnBruteAddr.Name = "btnBruteAddr"; btnBruteAddr.Size = new Size(166, 27); btnBruteAddr.TabIndex = 11; @@ -550,7 +551,7 @@ private void InitializeComponent() // btnSaveTxRxState // btnSaveTxRxState.Location = new Point(6, 166); - btnSaveTxRxState.Margin = new Padding(2, 2, 2, 2); + btnSaveTxRxState.Margin = new Padding(2); btnSaveTxRxState.Name = "btnSaveTxRxState"; btnSaveTxRxState.Size = new Size(166, 27); btnSaveTxRxState.TabIndex = 10; @@ -563,7 +564,7 @@ private void InitializeComponent() chkboxRxLog.Checked = true; chkboxRxLog.CheckState = CheckState.Checked; chkboxRxLog.Location = new Point(589, 301); - chkboxRxLog.Margin = new Padding(2, 2, 2, 2); + chkboxRxLog.Margin = new Padding(2); chkboxRxLog.Name = "chkboxRxLog"; chkboxRxLog.Size = new Size(125, 24); chkboxRxLog.TabIndex = 8; @@ -576,7 +577,7 @@ private void InitializeComponent() chkbxTXLog.Checked = true; chkbxTXLog.CheckState = CheckState.Checked; chkbxTXLog.Location = new Point(461, 301); - chkbxTXLog.Margin = new Padding(2, 2, 2, 2); + chkbxTXLog.Margin = new Padding(2); chkbxTXLog.Name = "chkbxTXLog"; chkbxTXLog.Size = new Size(126, 24); chkbxTXLog.TabIndex = 7; @@ -586,7 +587,7 @@ private void InitializeComponent() // txtWriteMessage // txtWriteMessage.Location = new Point(179, 326); - txtWriteMessage.Margin = new Padding(2, 2, 2, 2); + txtWriteMessage.Margin = new Padding(2); txtWriteMessage.Name = "txtWriteMessage"; txtWriteMessage.Size = new Size(532, 27); txtWriteMessage.TabIndex = 6; @@ -595,7 +596,7 @@ private void InitializeComponent() // btnWriteMessage // btnWriteMessage.Location = new Point(6, 326); - btnWriteMessage.Margin = new Padding(2, 2, 2, 2); + btnWriteMessage.Margin = new Padding(2); btnWriteMessage.Name = "btnWriteMessage"; btnWriteMessage.Size = new Size(166, 27); btnWriteMessage.TabIndex = 5; @@ -605,7 +606,7 @@ private void InitializeComponent() // btnReadIDLabelled // btnReadIDLabelled.Location = new Point(6, 115); - btnReadIDLabelled.Margin = new Padding(2, 2, 2, 2); + btnReadIDLabelled.Margin = new Padding(2); btnReadIDLabelled.Name = "btnReadIDLabelled"; btnReadIDLabelled.Size = new Size(166, 27); btnReadIDLabelled.TabIndex = 4; @@ -615,7 +616,7 @@ private void InitializeComponent() // btnReadIDRaw // btnReadIDRaw.Location = new Point(6, 83); - btnReadIDRaw.Margin = new Padding(2, 2, 2, 2); + btnReadIDRaw.Margin = new Padding(2); btnReadIDRaw.Name = "btnReadIDRaw"; btnReadIDRaw.Size = new Size(166, 27); btnReadIDRaw.TabIndex = 3; @@ -625,7 +626,7 @@ private void InitializeComponent() // btnReadAllSpreadsheet // btnReadAllSpreadsheet.Location = new Point(6, 51); - btnReadAllSpreadsheet.Margin = new Padding(2, 2, 2, 2); + btnReadAllSpreadsheet.Margin = new Padding(2); btnReadAllSpreadsheet.Name = "btnReadAllSpreadsheet"; btnReadAllSpreadsheet.Size = new Size(166, 27); btnReadAllSpreadsheet.TabIndex = 2; @@ -635,7 +636,7 @@ private void InitializeComponent() // btnReadAllRegisters // btnReadAllRegisters.Location = new Point(6, 19); - btnReadAllRegisters.Margin = new Padding(2, 2, 2, 2); + btnReadAllRegisters.Margin = new Padding(2); btnReadAllRegisters.Name = "btnReadAllRegisters"; btnReadAllRegisters.Size = new Size(166, 27); btnReadAllRegisters.TabIndex = 1; @@ -645,7 +646,7 @@ private void InitializeComponent() // rtbAdvOutput // rtbAdvOutput.Location = new Point(179, 160); - rtbAdvOutput.Margin = new Padding(2, 2, 2, 2); + rtbAdvOutput.Margin = new Padding(2); rtbAdvOutput.Name = "rtbAdvOutput"; rtbAdvOutput.Size = new Size(532, 142); rtbAdvOutput.TabIndex = 0; @@ -663,10 +664,10 @@ private void InitializeComponent() tabSimulation.Controls.Add(cmbBxChgProfile); tabSimulation.Controls.Add(cmbBxBaudRate); tabSimulation.Location = new Point(4, 29); - tabSimulation.Margin = new Padding(2, 2, 2, 2); + tabSimulation.Margin = new Padding(2); tabSimulation.Name = "tabSimulation"; - tabSimulation.Padding = new Padding(2, 2, 2, 2); - tabSimulation.Size = new Size(718, 377); + tabSimulation.Padding = new Padding(2); + tabSimulation.Size = new Size(754, 361); tabSimulation.TabIndex = 2; tabSimulation.Text = "Simulation"; tabSimulation.UseVisualStyleBackColor = true; @@ -682,9 +683,9 @@ private void InitializeComponent() grpBxSimCustomProfile.Controls.Add(txtMaxCurrRaw); grpBxSimCustomProfile.Controls.Add(txtCutoffRaw); grpBxSimCustomProfile.Location = new Point(237, 6); - grpBxSimCustomProfile.Margin = new Padding(2, 2, 2, 2); + grpBxSimCustomProfile.Margin = new Padding(2); grpBxSimCustomProfile.Name = "grpBxSimCustomProfile"; - grpBxSimCustomProfile.Padding = new Padding(2, 2, 2, 2); + grpBxSimCustomProfile.Padding = new Padding(2); grpBxSimCustomProfile.Size = new Size(269, 160); grpBxSimCustomProfile.TabIndex = 16; grpBxSimCustomProfile.TabStop = false; @@ -714,7 +715,7 @@ private void InitializeComponent() // txtMaxCurrAmps // txtMaxCurrAmps.Location = new Point(147, 122); - txtMaxCurrAmps.Margin = new Padding(2, 2, 2, 2); + txtMaxCurrAmps.Margin = new Padding(2); txtMaxCurrAmps.Name = "txtMaxCurrAmps"; txtMaxCurrAmps.Size = new Size(108, 27); txtMaxCurrAmps.TabIndex = 8; @@ -732,7 +733,7 @@ private void InitializeComponent() // txtCutoffAmps // txtCutoffAmps.Location = new Point(147, 58); - txtCutoffAmps.Margin = new Padding(2, 2, 2, 2); + txtCutoffAmps.Margin = new Padding(2); txtCutoffAmps.Name = "txtCutoffAmps"; txtCutoffAmps.Size = new Size(108, 27); txtCutoffAmps.TabIndex = 9; @@ -750,7 +751,7 @@ private void InitializeComponent() // txtMaxCurrRaw // txtMaxCurrRaw.Location = new Point(147, 90); - txtMaxCurrRaw.Margin = new Padding(2, 2, 2, 2); + txtMaxCurrRaw.Margin = new Padding(2); txtMaxCurrRaw.Name = "txtMaxCurrRaw"; txtMaxCurrRaw.Size = new Size(108, 27); txtMaxCurrRaw.TabIndex = 10; @@ -758,7 +759,7 @@ private void InitializeComponent() // txtCutoffRaw // txtCutoffRaw.Location = new Point(147, 26); - txtCutoffRaw.Margin = new Padding(2, 2, 2, 2); + txtCutoffRaw.Margin = new Padding(2); txtCutoffRaw.Name = "txtCutoffRaw"; txtCutoffRaw.Size = new Size(108, 27); txtCutoffRaw.TabIndex = 11; @@ -766,7 +767,7 @@ private void InitializeComponent() // txtSimDuration // txtSimDuration.Location = new Point(134, 6); - txtSimDuration.Margin = new Padding(2, 2, 2, 2); + txtSimDuration.Margin = new Padding(2); txtSimDuration.Name = "txtSimDuration"; txtSimDuration.Size = new Size(97, 27); txtSimDuration.TabIndex = 7; @@ -774,7 +775,7 @@ private void InitializeComponent() // btnStopSim // btnStopSim.Location = new Point(6, 102); - btnStopSim.Margin = new Padding(2, 2, 2, 2); + btnStopSim.Margin = new Padding(2); btnStopSim.Name = "btnStopSim"; btnStopSim.Size = new Size(90, 27); btnStopSim.TabIndex = 6; @@ -784,7 +785,7 @@ private void InitializeComponent() // btnStartSim // btnStartSim.Location = new Point(141, 102); - btnStartSim.Margin = new Padding(2, 2, 2, 2); + btnStartSim.Margin = new Padding(2); btnStartSim.Name = "btnStartSim"; btnStartSim.Size = new Size(90, 27); btnStartSim.TabIndex = 1; @@ -825,7 +826,7 @@ private void InitializeComponent() // cmbBxChgProfile.FormattingEnabled = true; cmbBxChgProfile.Location = new Point(134, 70); - cmbBxChgProfile.Margin = new Padding(2, 2, 2, 2); + cmbBxChgProfile.Margin = new Padding(2); cmbBxChgProfile.Name = "cmbBxChgProfile"; cmbBxChgProfile.Size = new Size(97, 28); cmbBxChgProfile.TabIndex = 2; @@ -834,7 +835,7 @@ private void InitializeComponent() // cmbBxBaudRate.FormattingEnabled = true; cmbBxBaudRate.Location = new Point(134, 38); - cmbBxBaudRate.Margin = new Padding(2, 2, 2, 2); + cmbBxBaudRate.Margin = new Padding(2); cmbBxBaudRate.Name = "cmbBxBaudRate"; cmbBxBaudRate.Size = new Size(97, 28); cmbBxBaudRate.TabIndex = 1; @@ -855,10 +856,10 @@ private void InitializeComponent() tabDiagnostics.Controls.Add(txtOneKeyID); tabDiagnostics.Controls.Add(btnSubmitDiagForm); tabDiagnostics.Location = new Point(4, 29); - tabDiagnostics.Margin = new Padding(2, 2, 2, 2); + tabDiagnostics.Margin = new Padding(2); tabDiagnostics.Name = "tabDiagnostics"; - tabDiagnostics.Padding = new Padding(2, 2, 2, 2); - tabDiagnostics.Size = new Size(718, 377); + tabDiagnostics.Padding = new Padding(2); + tabDiagnostics.Size = new Size(754, 361); tabDiagnostics.TabIndex = 3; tabDiagnostics.Text = "Submit Diagnostics"; tabDiagnostics.UseVisualStyleBackColor = true; @@ -866,7 +867,7 @@ private void InitializeComponent() // btnClearDiagForm // btnClearDiagForm.Location = new Point(461, 173); - btnClearDiagForm.Margin = new Padding(2, 2, 2, 2); + btnClearDiagForm.Margin = new Padding(2); btnClearDiagForm.Name = "btnClearDiagForm"; btnClearDiagForm.Size = new Size(122, 27); btnClearDiagForm.TabIndex = 23; @@ -877,9 +878,9 @@ private void InitializeComponent() // grpboxDiagOutput.Controls.Add(rtbSubmitDiagReadOnly); grpboxDiagOutput.Location = new Point(237, 6); - grpboxDiagOutput.Margin = new Padding(2, 2, 2, 2); + grpboxDiagOutput.Margin = new Padding(2); grpboxDiagOutput.Name = "grpboxDiagOutput"; - grpboxDiagOutput.Padding = new Padding(2, 2, 2, 2); + grpboxDiagOutput.Padding = new Padding(2); grpboxDiagOutput.Size = new Size(474, 160); grpboxDiagOutput.TabIndex = 22; grpboxDiagOutput.TabStop = false; @@ -888,7 +889,7 @@ private void InitializeComponent() // rtbSubmitDiagReadOnly // rtbSubmitDiagReadOnly.Location = new Point(6, 26); - rtbSubmitDiagReadOnly.Margin = new Padding(2, 2, 2, 2); + rtbSubmitDiagReadOnly.Margin = new Padding(2); rtbSubmitDiagReadOnly.Name = "rtbSubmitDiagReadOnly"; rtbSubmitDiagReadOnly.Size = new Size(462, 129); rtbSubmitDiagReadOnly.TabIndex = 16; @@ -947,7 +948,7 @@ private void InitializeComponent() // txtSubmitDiagDate // txtSubmitDiagDate.Location = new Point(96, 45); - txtSubmitDiagDate.Margin = new Padding(2, 2, 2, 2); + txtSubmitDiagDate.Margin = new Padding(2); txtSubmitDiagDate.Name = "txtSubmitDiagDate"; txtSubmitDiagDate.Size = new Size(121, 27); txtSubmitDiagDate.TabIndex = 15; @@ -955,7 +956,7 @@ private void InitializeComponent() // txtSubmitDiagSerial // txtSubmitDiagSerial.Location = new Point(96, 77); - txtSubmitDiagSerial.Margin = new Padding(2, 2, 2, 2); + txtSubmitDiagSerial.Margin = new Padding(2); txtSubmitDiagSerial.Name = "txtSubmitDiagSerial"; txtSubmitDiagSerial.Size = new Size(121, 27); txtSubmitDiagSerial.TabIndex = 14; @@ -963,7 +964,7 @@ private void InitializeComponent() // txtSubmitDiagSticker // txtSubmitDiagSticker.Location = new Point(96, 109); - txtSubmitDiagSticker.Margin = new Padding(2, 2, 2, 2); + txtSubmitDiagSticker.Margin = new Padding(2); txtSubmitDiagSticker.Name = "txtSubmitDiagSticker"; txtSubmitDiagSticker.Size = new Size(121, 27); txtSubmitDiagSticker.TabIndex = 13; @@ -971,7 +972,7 @@ private void InitializeComponent() // txtSubmitDiagType // txtSubmitDiagType.Location = new Point(96, 141); - txtSubmitDiagType.Margin = new Padding(2, 2, 2, 2); + txtSubmitDiagType.Margin = new Padding(2); txtSubmitDiagType.Name = "txtSubmitDiagType"; txtSubmitDiagType.Size = new Size(121, 27); txtSubmitDiagType.TabIndex = 11; @@ -979,7 +980,7 @@ private void InitializeComponent() // txtOneKeyID // txtOneKeyID.Location = new Point(96, 13); - txtOneKeyID.Margin = new Padding(2, 2, 2, 2); + txtOneKeyID.Margin = new Padding(2); txtOneKeyID.Name = "txtOneKeyID"; txtOneKeyID.Size = new Size(121, 27); txtOneKeyID.TabIndex = 10; @@ -987,7 +988,7 @@ private void InitializeComponent() // btnSubmitDiagForm // btnSubmitDiagForm.Location = new Point(589, 173); - btnSubmitDiagForm.Margin = new Padding(2, 2, 2, 2); + btnSubmitDiagForm.Margin = new Padding(2); btnSubmitDiagForm.Name = "btnSubmitDiagForm"; btnSubmitDiagForm.Size = new Size(122, 27); btnSubmitDiagForm.TabIndex = 9; @@ -1002,10 +1003,10 @@ private void InitializeComponent() tabAbout.Controls.Add(lblMartin); tabAbout.Controls.Add(lblAboutTitle); tabAbout.Location = new Point(4, 29); - tabAbout.Margin = new Padding(2, 2, 2, 2); + tabAbout.Margin = new Padding(2); tabAbout.Name = "tabAbout"; - tabAbout.Padding = new Padding(2, 2, 2, 2); - tabAbout.Size = new Size(718, 377); + tabAbout.Padding = new Padding(2); + tabAbout.Size = new Size(754, 361); tabAbout.TabIndex = 4; tabAbout.Text = "About"; tabAbout.UseVisualStyleBackColor = true; @@ -1075,7 +1076,7 @@ private void InitializeComponent() // rtbDebugOutput // rtbDebugOutput.Location = new Point(8, 400); - rtbDebugOutput.Margin = new Padding(2, 2, 2, 2); + rtbDebugOutput.Margin = new Padding(2); rtbDebugOutput.Name = "rtbDebugOutput"; rtbDebugOutput.Size = new Size(754, 79); rtbDebugOutput.TabIndex = 1; @@ -1089,7 +1090,7 @@ private void InitializeComponent() Controls.Add(rtbDebugOutput); Controls.Add(tabControlM18Main); Icon = (Icon)resources.GetObject("$this.Icon"); - Margin = new Padding(2, 2, 2, 2); + Margin = new Padding(2); Name = "frmMain"; ShowIcon = false; Text = "M18 Pack Analyzer"; diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 2298313..2cc4718 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -117,7 +117,7 @@ private void RefreshSerialPorts() { cmbBxSerialPort.SelectedIndex = 0; } - + if (cmbBxSerialPort.SelectedItem is null) { _selectedPortName = null; @@ -514,5 +514,9 @@ private void rtbOutput_TextChanged(object sender, EventArgs e) } + private void cmbBxSerialPort_SelectedIndexChanged_1(object sender, EventArgs e) + { + + } } } From 24a9c55cf216c7486b9d5f0e7449ede29da3600f Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 16:34:40 -0500 Subject: [PATCH 34/61] Standardize serial port display formatting --- M18AnalyzerMain.cs | 2 +- SerialPortUtil.cs | 54 ++++++++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 2cc4718..bc2a97e 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -98,7 +98,7 @@ private void RefreshSerialPorts() foreach (var port in ports) { cmbBxSerialPort.Items.Add(port); - AppendLogBoth($"Found port {port.DisplayName}{(port.IsLikelyFtdi ? " (FTDI detected)" : string.Empty)}"); + AppendLogBoth($"Found port {port.DisplayName}"); } AppendDebugLog($"RefreshSerialPorts(): {ports.Count} port(s) detected."); diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index 861f9be..e8aa525 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -472,30 +472,15 @@ public string DisplayName { var parts = new List { PortName }; - if (!string.IsNullOrWhiteSpace(DeviceDescription)) - { - parts.Add(DeviceDescription!); - } - - var usbParts = new List(); - if (!string.IsNullOrWhiteSpace(UsbVendorId) || !string.IsNullOrWhiteSpace(UsbProductId)) - { - usbParts.Add($"USB VID:{UsbVendorId ?? "????"} PID:{UsbProductId ?? "????"}"); - } - - if (!string.IsNullOrWhiteSpace(UsbSerialNumber)) + var ftdiOrUsbSegment = BuildFtdiOrUsbSegment(); + if (!string.IsNullOrWhiteSpace(ftdiOrUsbSegment)) { - usbParts.Add($"SNR:{UsbSerialNumber}"); + parts.Add(ftdiOrUsbSegment!); } - if (!string.IsNullOrWhiteSpace(LocationPath)) - { - usbParts.Add(LocationPath!); - } - - if (usbParts.Count > 0) + if (!string.IsNullOrWhiteSpace(DeviceDescription)) { - parts.Add(string.Join(' ', usbParts)); + parts.Add(DeviceDescription!); } if (!string.IsNullOrWhiteSpace(Manufacturer)) @@ -503,18 +488,35 @@ public string DisplayName parts.Add(Manufacturer!); } - if (!string.IsNullOrWhiteSpace(HardwareIds)) - { - parts.Add($"Hardware ID: {HardwareIds}"); - } - - return string.Join(" — ", parts); + return string.Join(" - ", parts); } } public bool IsLikelyFtdi => new[] { Description, Manufacturer, FriendlyName } .Any(value => value != null && value.IndexOf("FTDI", StringComparison.OrdinalIgnoreCase) >= 0); + private string? BuildFtdiOrUsbSegment() + { + if (IsLikelyFtdi) + { + return "FTDI detected"; + } + + var usbParts = new List(); + + if (!string.IsNullOrWhiteSpace(UsbVendorId)) + { + usbParts.Add($"VID:{UsbVendorId}"); + } + + if (!string.IsNullOrWhiteSpace(UsbProductId)) + { + usbParts.Add($"PID:{UsbProductId}"); + } + + return usbParts.Count > 0 ? string.Join(" ", usbParts) : null; + } + private string? SanitizeDescription(string? rawDescription) { if (string.IsNullOrWhiteSpace(rawDescription)) From f21cd34be64b356365b1a6d85cf8be5ef52b942f Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 16:38:58 -0500 Subject: [PATCH 35/61] Changed serial port display names. --- SerialPortUtil.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index e8aa525..bfddf77 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -499,7 +499,7 @@ public string DisplayName { if (IsLikelyFtdi) { - return "FTDI detected"; + return "FTDI"; } var usbParts = new List(); From ec09777d77cfefac3336767d20ba0922446901e9 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 17:02:01 -0500 Subject: [PATCH 36/61] Improve TX control logging and safe disconnects --- M18AnalyzerMain.cs | 71 +++++++++++++++++++++++++------ M18Protocol.cs | 104 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 157 insertions(+), 18 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index bc2a97e..bcc3ae9 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -32,6 +32,7 @@ public frmMain() chkboxRxLog.CheckedChanged += chkboxRxLog_CheckedChanged; btnTestFT232.Click += btnTestFT232_Click; cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged; + FormClosing += frmMain_FormClosing; chkbxTXLog.Checked = true; chkboxRxLog.Checked = true; @@ -43,6 +44,8 @@ public frmMain() toolTipSimpleTab.SetToolTip(btnHealthReport, "Read and display a basic battery health report."); toolTipSimpleTab.SetToolTip(btnReset, "Send a reset signal to the connected battery."); toolTipSimpleTab.SetToolTip(btnCopyOutput, "Copy all output log text to the clipboard."); + + UpdateConnectionUi(false); } private void toolStripButton1_Click(object sender, EventArgs e) @@ -178,26 +181,34 @@ private async void btnConnect_Click(object? sender, EventArgs e) await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName, AppendDebugLog)); ApplyProtocolLoggingPreferences(); AppendLogBoth($"{selectedDescription} opened successfully."); + UpdateConnectionUi(true); } catch (Exception ex) { _protocol = null; LogError($"Failed to open {selectedDescription}.", ex); + UpdateConnectionUi(false); } } private async void btnDisconnect_Click(object? sender, EventArgs e) { - LogDebugAction("Requesting DisconnectAsync()."); + LogDebugAction(FormatLogMessage("btnDisconnect pressed - requesting DisconnectAsync().")); await DisconnectAsync(); } - private async Task DisconnectAsync() + private async Task DisconnectAsync(bool showUserMessages = true) { if (_protocol == null) { - AppendLogBoth("Disconnect requested, but no serial port is currently open."); - MessageBox.Show("No serial port is currently open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); + var message = "Disconnect requested, but no serial port is currently open."; + AppendDebugLog(FormatLogMessage(message)); + if (showUserMessages) + { + AppendLog(message); + MessageBox.Show(message, "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + UpdateConnectionUi(false); return; } @@ -215,22 +226,24 @@ private async Task DisconnectAsync() finally { _protocol = null; + UpdateConnectionUi(false); } } private async void btnIdle_Click(object? sender, EventArgs e) { - LogDebugAction("Requesting _protocol.Idle()."); + AppendDebugLog(FormatLogMessage("btnIdle pressed - calling _protocol.Idle().")); if (!EnsureConnected()) { return; } - AppendDebugLog("Invoking _protocol.Idle() to drive TX low."); + AppendDebugLog(FormatLogMessage("Invoking _protocol.Idle() to drive TX low.")); try { await Task.Run(() => _protocol!.Idle()); AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery."); + AppendDebugLog(FormatLogMessage(_protocol!.GetTxStateSummary("Idle"))); } catch (Exception ex) { @@ -240,17 +253,18 @@ private async void btnIdle_Click(object? sender, EventArgs e) private async void btnActive_Click(object? sender, EventArgs e) { - LogDebugAction("Requesting _protocol.High()."); + AppendDebugLog(FormatLogMessage("btnActive pressed - calling _protocol.High().")); if (!EnsureConnected()) { return; } - AppendDebugLog("Invoking _protocol.High() to drive TX high."); + AppendDebugLog(FormatLogMessage("Invoking _protocol.High() to drive TX high.")); try { await Task.Run(() => _protocol!.High()); AppendLogBoth("TX set to Active (high). Charger simulation enabled."); + AppendDebugLog(FormatLogMessage(_protocol!.GetTxStateSummary("High"))); } catch (Exception ex) { @@ -260,7 +274,7 @@ private async void btnActive_Click(object? sender, EventArgs e) private async void btnHealthReport_Click(object? sender, EventArgs e) { - LogDebugAction("Requesting _protocol.HealthReport()."); + AppendDebugLog(FormatLogMessage("btnHealthReport pressed - calling _protocol.HealthReport().")); if (!EnsureConnected()) { return; @@ -268,14 +282,15 @@ private async void btnHealthReport_Click(object? sender, EventArgs e) try { - AppendDebugLog("Starting health report collection (mirrors m18.py health())."); + AppendDebugLog(FormatLogMessage("Starting health report collection (mirrors m18.py health()).")); var report = await Task.Run(() => _protocol!.HealthReport()); - AppendLogBoth("=== Health report ==="); + AppendLog("=== Health report ==="); foreach (var line in report.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None)) { - AppendLogBoth(line); + AppendLog(line); } - AppendLogBoth("Health report complete."); + AppendLog("Health report complete."); + AppendDebugLog(FormatLogMessage("Health report appended to output.")); } catch (Exception ex) { @@ -318,7 +333,7 @@ private void btnCopyOutput_Click(object? sender, EventArgs e) private bool EnsureConnected() { - LogDebugAction("Checking EnsureConnected()."); + LogDebugAction(FormatLogMessage("Checking EnsureConnected().")); if (_protocol != null) { return true; @@ -509,6 +524,34 @@ private void AppendDebugLog(string message) _hasAppendedDebugLog = true; } + private void UpdateConnectionUi(bool connected) + { + btnConnect.Enabled = !connected; + btnDisconnect.Enabled = connected; + btnIdle.Enabled = connected; + btnActive.Enabled = connected; + btnHealthReport.Enabled = connected; + btnReset.Enabled = connected; + btnCopyOutput.Enabled = true; + btnTestFT232.Enabled = !connected; + cmbBxSerialPort.Enabled = !connected; + btnRefresh.Enabled = !connected; + } + + private async void frmMain_FormClosing(object? sender, FormClosingEventArgs e) + { + AppendDebugLog(FormatLogMessage("Form closing requested - attempting clean disconnect.")); + + try + { + await DisconnectAsync(false); + } + catch (Exception ex) + { + AppendDebugLog(FormatLogMessage($"Form closing disconnect encountered an error: {ex.GetType().Name} - {ex.Message}")); + } + } + private void rtbOutput_TextChanged(object sender, EventArgs e) { diff --git a/M18Protocol.cs b/M18Protocol.cs index 4c784bf..e5bf5c6 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -38,6 +38,23 @@ public class M18Protocol private readonly SerialPort _port; private bool _disposed; + private bool EnsurePortOpen(string operation) + { + if (_disposed) + { + LogDebug($"{operation} skipped because protocol is disposed."); + return false; + } + + if (!_port.IsOpen) + { + LogDebug($"{operation} skipped because serial port {_port.PortName} is not open."); + return false; + } + + return true; + } + public M18Protocol(string portName, Action? debugLogger = null) { DebugLogger = debugLogger; @@ -119,9 +136,23 @@ public void Send(byte[] command) throw new ArgumentNullException(nameof(command)); } + if (!EnsurePortOpen("Send")) + { + return; + } + LogDebug($"Send called with command length {command.Length}. Raw payload: {FormatBytes(command)}."); - _port.DiscardInBuffer(); - LogDebug("Input buffer discarded prior to send."); + + try + { + _port.DiscardInBuffer(); + LogDebug("Input buffer discarded prior to send."); + } + catch (Exception ex) when (ex is InvalidOperationException || ex is ObjectDisposedException) + { + LogDebug($"DiscardInBuffer skipped because port is not available: {ex.GetType().Name} - {ex.Message}"); + return; + } var msb = new byte[command.Length]; for (int i = 0; i < command.Length; i++) @@ -146,8 +177,15 @@ public void Send(byte[] command) Console.WriteLine(logMessage); } - _port.Write(msb, 0, msb.Length); - LogDebug($"Command sent over serial: {FormatBytes(msb)} (MSB)."); + try + { + _port.Write(msb, 0, msb.Length); + LogDebug($"Command sent over serial: {FormatBytes(msb)} (MSB)."); + } + catch (Exception ex) when (ex is InvalidOperationException || ex is ObjectDisposedException) + { + LogDebug($"Send aborted because port is not available: {ex.GetType().Name} - {ex.Message}"); + } } public void SendCommand(byte[] command) @@ -158,12 +196,22 @@ public void SendCommand(byte[] command) public byte[] ReadResponse(int size) { + if (!EnsurePortOpen("ReadResponse")) + { + return Array.Empty(); + } + LogDebug($"ReadResponse called with expected size {size}."); int firstByte; try { firstByte = _port.ReadByte(); } + catch (InvalidOperationException ex) + { + LogDebug($"ReadResponse skipped because port is unavailable: {ex.GetType().Name} - {ex.Message}"); + return Array.Empty(); + } catch (TimeoutException) { LogDebug("ReadResponse timed out waiting for first byte."); @@ -216,6 +264,11 @@ public bool Reset() LogDebug("Reset invoked. Driving control lines to issue reset sequence."); Acc = 4; + if (!EnsurePortOpen("Reset")) + { + return false; + } + _port.BreakState = true; _port.DtrEnable = true; Thread.Sleep(300); @@ -244,6 +297,10 @@ public bool Reset() public void Idle() { LogDebug("Setting TX to Idle (BreakState=true, DtrEnable=true)."); + if (!EnsurePortOpen("Idle")) + { + return; + } _port.BreakState = true; _port.DtrEnable = true; } @@ -251,12 +308,41 @@ public void Idle() public void High() { LogDebug("Setting TX to Active (BreakState=false, DtrEnable=false)."); + if (!EnsurePortOpen("High")) + { + return; + } _port.BreakState = false; _port.DtrEnable = false; } + public string GetTxStateSummary(string caller) + { + try + { + var disposedText = _disposed ? "disposed" : "active"; + var openState = _port.IsOpen ? "open" : "closed"; + if (!_port.IsOpen) + { + return $"{caller}: Port {_port.PortName} is {openState} and protocol is {disposedText}; TX state unavailable."; + } + + return $"{caller}: Port {_port.PortName} is {openState} and protocol is {disposedText}. BreakState={_port.BreakState}, DtrEnable={_port.DtrEnable}."; + } + catch (Exception ex) + { + LogDebug($"Error while retrieving TX state: {ex.GetType().Name} - {ex.Message}"); + return $"{caller}: TX state unavailable due to error."; + } + } + public string HealthReport() { + if (_disposed) + { + return "Protocol disposed; health report unavailable."; + } + LogDebug("Generating HealthReport summary."); var builder = new StringBuilder(); @@ -336,6 +422,16 @@ private IEnumerable ReadAvailable(int count) LogDebug($"Read {read} byte(s); total read so far: {totalRead}."); } } + catch (InvalidOperationException ex) + { + LogDebug($"ReadAvailable stopped because port is unavailable: {ex.GetType().Name} - {ex.Message}"); + break; + } + catch (ObjectDisposedException ex) + { + LogDebug($"ReadAvailable stopped because port is disposed: {ex.GetType().Name} - {ex.Message}"); + break; + } catch (TimeoutException) { LogDebug("Timeout encountered while reading available bytes."); From 82e5e7045e97a756d201d90b42900631dade8204 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 17:09:15 -0500 Subject: [PATCH 37/61] Minor change to error logging. --- M18Protocol.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index e5bf5c6..ac40d73 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -427,11 +427,6 @@ private IEnumerable ReadAvailable(int count) LogDebug($"ReadAvailable stopped because port is unavailable: {ex.GetType().Name} - {ex.Message}"); break; } - catch (ObjectDisposedException ex) - { - LogDebug($"ReadAvailable stopped because port is disposed: {ex.GetType().Name} - {ex.Message}"); - break; - } catch (TimeoutException) { LogDebug("Timeout encountered while reading available bytes."); From 615643014d1a06c200527f4119081c04e04be982 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 18:07:49 -0500 Subject: [PATCH 38/61] Implement full health report logic in C# --- M18Protocol.cs | 442 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 436 insertions(+), 6 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index ac40d73..515b55b 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading; +using System.Text.RegularExpressions; namespace M18BatteryInfo { @@ -35,8 +36,189 @@ public class M18Protocol public Action? RxLogger { get; set; } public Action? DebugLogger { get; set; } + private readonly List<(byte AddrMsb, byte AddrLsb, byte Length)> _dataMatrix = new() + { + (0x00, 0x00, 0x02), + (0x00, 0x02, 0x02), + (0x00, 0x04, 0x05), + (0x00, 0x0D, 0x04), + (0x00, 0x11, 0x04), + (0x00, 0x15, 0x04), + (0x00, 0x19, 0x04), + (0x00, 0x23, 0x14), + (0x00, 0x37, 0x04), + (0x00, 0x69, 0x02), + (0x00, 0x7B, 0x01), + (0x40, 0x00, 0x04), + (0x40, 0x0A, 0x0A), + (0x40, 0x14, 0x02), + (0x40, 0x16, 0x02), + (0x40, 0x19, 0x02), + (0x40, 0x1B, 0x02), + (0x40, 0x1D, 0x02), + (0x40, 0x1F, 0x02), + (0x60, 0x00, 0x02), + (0x60, 0x02, 0x02), + (0x60, 0x04, 0x04), + (0x60, 0x08, 0x04), + (0x60, 0x0C, 0x02), + (0x90, 0x00, 0x3A), + (0x90, 0x3A, 0x3A), + (0x90, 0x74, 0x3A), + (0x90, 0xAE, 0x3A), + (0x90, 0xE8, 0x3A), + (0x91, 0x22, 0x30), + (0x91, 0x52, 0x00), + (0xA0, 0x00, 0x06) + }; + + private readonly List<(ushort Address, byte Length, string Type, string Label)> _dataId = new() + { + (0x0000, 2, "uint", "Cell type"), + (0x0002, 2, "uint", "Unknown (always 0)"), + (0x0004, 5, "sn", "Capacity & Serial number (?)"), + (0x000D, 4, "uint", "Unknown (4th code?)"), + (0x0011, 4, "date", "Manufacture date"), + (0x0015, 4, "date", "Date of first charge (Forge)"), + (0x0019, 4, "date", "Date of last charge (Forge)"), + (0x0023, 20, "ascii", "Note (ascii string)"), + (0x0037, 4, "date", "Current date"), + (0x0069, 2, "uint", "Unknown (always 2)"), + (0x007B, 1, "uint", "Unknown (always 0)"), + (0x4000, 4, "uint", "Unknown (Forge)"), + (0x400A, 10, "cell_v","Cell voltages (mV)"), + (0x4014, 2, "adc_t", "Temperature (C) (non-Forge)"), + (0x4016, 2, "uint", "Unknown (Forge)"), + (0x4019, 2, "uint", "Unknown (Forge)"), + (0x401B, 2, "uint", "Unknown (Forge)"), + (0x401D, 2, "uint", "Unknown (Forge)"), + (0x401F, 2, "dec_t", "Temperature (C) (Forge)"), + (0x6000, 2, "uint", "Unknown (Forge)"), + (0x6002, 2, "uint", "Unknown (Forge)"), + (0x6004, 4, "uint", "Unknown (Forge)"), + (0x6008, 4, "uint", "Unknown (Forge)"), + (0x600C, 2, "uint", "Unknown (Forge)"), + (0x9000, 4, "date", "Date of first charge (rounded)"), + (0x9004, 4, "date", "Date of last tool use (rounded)"), + (0x9008, 4, "date", "Date of last charge (rounded)"), + (0x900C, 4, "date", "Unknown date (often zero)"), + (0x9010, 2, "uint", "Days since first charge"), + (0x9012, 4, "uint", "Total discharge (amp-sec)"), + (0x9016, 4, "uint", "Total discharge (watt-sec or joules)"), + (0x901A, 4, "uint", "Total charge count"), + (0x901E, 2, "uint", "Dumb charge count (J2>7.1V for >=0.48s)"), + (0x9020, 2, "uint", "Redlink (UART) charge count"), + (0x9022, 2, "uint", "Completed charge count (?)"), + (0x9024, 4, "hhmmss","Total charging time (HH:MM:SS)"), + (0x9028, 4, "hhmmss","Time on charger whilst full (HH:MM:SS)"), + (0x902C, 2, "uint", "Unknown (another low-voltage charge counter?)"), + (0x902E, 2, "uint", "Charge started with a cell < 2.5V"), + (0x9030, 2, "uint", "Discharge to empty"), + (0x9032, 2, "uint", "Num. overheat on tool (must be > 10A)"), + (0x9034, 2, "uint", "Overcurrent?"), + (0x9036, 2, "uint", "Low voltage events)"), + (0x9038, 2, "uint", "Low-voltage bounce? (4 flashing LEDs)"), + (0x903A, 2, "uint", "Discharge @ 10-20A (seconds)"), + (0x903C, 2, "uint", " @ 20-30A (could be watts)"), + (0x903E, 2, "uint", " @ 30-40A "), + (0x9040, 2, "uint", " @ 40-50A "), + (0x9042, 2, "uint", " @ 50-60A "), + (0x9044, 2, "uint", " @ 60-70A "), + (0x9046, 2, "uint", " @ 70-80A "), + (0x9048, 2, "uint", " @ 80-90A "), + (0x904A, 2, "uint", " @ 90-100A "), + (0x904C, 2, "uint", " @ 100-110A "), + (0x904E, 2, "uint", " @ 110-120A "), + (0x9050, 2, "uint", " @ 120-130A "), + (0x9052, 2, "uint", " @ 130-140A "), + (0x9054, 2, "uint", " @ 140-150A "), + (0x9056, 2, "uint", " @ 150-160A "), + (0x9058, 2, "uint", " @ 160-170A "), + (0x905A, 2, "uint", " @ 170-180A "), + (0x905C, 2, "uint", " @ 180-190A "), + (0x905E, 2, "uint", " @ 190-200A "), + (0x9060, 2, "uint", " @ 200-210A "), + (0x9062, 2, "uint", "Discharge @ 5-10A (seconds)"), + (0x9064, 2, "uint", " @ 10-15A (could be watts)"), + (0x9066, 2, "uint", " @ 15-20A (histo not well understood yet)"), + (0x9068, 2, "uint", " @ 20-25A "), + (0x906A, 2, "uint", " @ 25-30A "), + (0x906C, 2, "uint", " @ 30-35A "), + (0x906E, 2, "uint", " @ 35-40A "), + (0x9070, 2, "uint", " @ 40-45A "), + (0x9072, 2, "uint", " @ 45-50A "), + (0x9074, 2, "uint", " @ 50-55A "), + (0x9076, 2, "uint", " @ 55-60A "), + (0x9078, 2, "uint", " @ 60-65A "), + (0x907A, 2, "uint", " @ 65-70A "), + (0x907C, 2, "uint", " @ 70-65A "), + (0x907E, 2, "uint", " @ 75-80A "), + (0x9080, 2, "uint", " @ 80-85A "), + (0x9082, 2, "uint", " @ 85-90A "), + (0x9084, 2, "uint", " @ 90-95A "), + (0x9086, 2, "uint", " @ 95-100A "), + (0x9088, 2, "uint", " @ 100-105A "), + (0x908A, 2, "uint", " @ 105-110A "), + (0x908C, 2, "uint", " @ 110-115A "), + (0x908E, 2, "uint", " @ 115-120A "), + (0x9090, 2, "uint", " @ 120-125A "), + (0x9092, 2, "uint", " @ 125-130A "), + (0x9094, 2, "uint", " @ 130-135A "), + (0x9096, 2, "uint", " @ 135-140A "), + (0x9098, 2, "uint", " @ 140-145A "), + (0x909A, 2, "uint", " @ 145-150A "), + (0x909C, 2, "uint", " @ 150-155A "), + (0x909E, 2, "uint", " @ 155-160A "), + (0x90A0, 2, "uint", " @ 160-165A "), + (0x90A2, 2, "uint", " @ 165-170A "), + (0x90A4, 2, "uint", " @ 170-175A "), + (0x90A6, 2, "uint", " @ 175-180A "), + (0x90A8, 2, "uint", " @ 180-185A "), + (0x90AA, 2, "uint", " @ 185-190A "), + (0x90AC, 2, "uint", " @ 190-195A "), + (0x90AE, 2, "uint", " @ 195-200A "), + (0x90B0, 2, "uint", " @ 200A+ "), + (0x90B2, 2, "uint", "Charge started < 17V"), + (0x90B4, 2, "uint", "Charge started 17-18V"), + (0x90B6, 2, "uint", "Charge started 18-19V"), + (0x90B8, 2, "uint", "Charge started 19-20V"), + (0x90BA, 2, "uint", "Charge started 20V+"), + (0x90BC, 2, "uint", "Charge ended < 17V"), + (0x90BE, 2, "uint", "Charge ended 17-18V"), + (0x90C0, 2, "uint", "Charge ended 18-19V"), + (0x90C2, 2, "uint", "Charge ended 19-20V"), + (0x90C4, 2, "uint", "Charge ended 20V+"), + (0x90C6, 2, "uint", "Charge start temp -30C to -20C"), + (0x90C8, 2, "uint", "Charge start temp -20C to -10C"), + (0x90CA, 2, "uint", "Charge start temp -10C to 0C"), + (0x90CC, 2, "uint", "Charge start temp 0C to +10C"), + (0x90CE, 2, "uint", "Charge start temp +10C to +20C"), + (0x90D0, 2, "uint", "Charge start temp +20C to +30C"), + (0x90D2, 2, "uint", "Charge start temp +30C to +40C"), + (0x90D4, 2, "uint", "Charge start temp +40C to +50C"), + (0x90D6, 2, "uint", "Charge start temp +50C to +60C"), + (0x90D8, 2, "uint", "Charge start temp +60C to +70C"), + (0x90DA, 2, "uint", "Charge start temp +70C to +80C"), + (0x90DC, 2, "uint", "Charge start temp +80C and over"), + (0x90DE, 2, "uint", "Charge end temp -30C to -20C"), + (0x90E0, 2, "uint", "Charge end temp -20C to -10C"), + (0x90E2, 2, "uint", "Charge end temp -10C to 0C"), + (0x90E4, 2, "uint", "Charge end temp 0C to +10C"), + (0x90E6, 2, "uint", "Charge end temp +10C to +20C"), + (0x90E8, 2, "uint", "Charge end temp +20C to +30C"), + (0x90EA, 2, "uint", "Charge end temp +30C to +40C"), + (0x90EC, 2, "uint", "Charge end temp +40C to +50C"), + (0x90EE, 2, "uint", "Charge end temp +50C to +60C"), + (0x90F0, 2, "uint", "Charge end temp +60C to +70C"), + (0x90F2, 2, "uint", "Charge end temp +70C to +80C"), + (0x90F4, 2, "uint", "Charge end temp +80C and over"), + (0xA000, 6, "uint", "Unknown (Forge)") + }; + private readonly SerialPort _port; private bool _disposed; + private bool? _savedPrintTx; + private bool? _savedPrintRx; private bool EnsurePortOpen(string operation) { @@ -344,14 +526,262 @@ public string HealthReport() } LogDebug("Generating HealthReport summary."); - var builder = new StringBuilder(); + var regList = new List + { + 4, 28, 25, 26, 12, 13, 18, 29, 39, 40, 41, 42, 43, 33, 32, 31, 35, 36, 38 + }; + regList.AddRange(Enumerable.Range(44, 20)); + regList.AddRange(new[] { 8, 2 }); + + TxRxSaveAndSet(false); + try + { + var values = ReadId(regList, true); + if (values == null || values.Count != regList.Count) + { + return "Health report failed: incomplete data returned."; + } + + var builder = new StringBuilder(); + builder.AppendLine("Reading battery. This will take 5-10sec\n"); + + var serialInfo = values[^1] as string ?? string.Empty; + var matches = Regex.Matches(serialInfo, "\\d+\\.?\\d*"); + var batType = matches.Count > 0 ? matches[0].Value : ""; + var eSerial = matches.Count > 1 ? matches[1].Value : ""; + + var batLookup = new Dictionary + { + {"36", (1.5, "1.5Ah CP (5s1p 18650)")}, + {"37", (2, "2Ah CP (5s1p 18650)")}, + {"38", (3, "3Ah XC (5s2p 18650)")}, + {"39", (4, "4Ah XC (5s2p 18650)")}, + {"40", (5, "5Ah XC (5s2p 18650) (<= Dec 2018)")}, + {"165", (5, "5Ah XC (5s2p 18650) (Aug 2019 - Jun 2021)")}, + {"306", (5, "5Ah XC (5s2p 18650) (Feb 2021 - Jul 2023)")}, + {"424", (5, "5Ah XC (5s2p 18650) (>= Sep 2023)")}, + {"46", (6, "6Ah XC (5s2p 18650)")}, + {"47", (9, "9Ah HD (5s3p 18650)")}, + {"104", (3, "3Ah HO (5s1p 21700)")}, + {"106", (6, "6Ah HO (5s2p 21700)")}, + {"107", (8, "8Ah HO (5s2p 21700)")}, + {"108", (12, "12Ah HO (5s3p 21700)")}, + {"383", (8, "8Ah Forge (5s2p 21700 tabless)")}, + {"384", (12, "12Ah Forge (5s3p 21700 tabless)")} + }; + + var batteryDetails = batLookup.TryGetValue(batType, out var details) ? details : (0d, "Unknown"); + builder.AppendLine($"Type: {batType} [{batteryDetails.Description}]"); + builder.AppendLine($"E-serial: {eSerial} (does NOT match case serial)"); + + var batNow = values[^2] as DateTime? ?? DateTime.UtcNow; + var manufactureDate = values[0] as DateTime?; + if (manufactureDate.HasValue) + { + builder.AppendLine($"Manufacture date: {manufactureDate:yyyy-MM-dd}"); + } + + builder.AppendLine($"Days since 1st charge: {values[1]}"); + builder.AppendLine($"Days since last tool use: {(batNow - ((DateTime?)values[2] ?? batNow)).Days}"); + builder.AppendLine($"Days since last charge: {(batNow - ((DateTime?)values[3] ?? batNow)).Days}"); + + if (values[4] is List cellVoltages) + { + var totalVoltage = cellVoltages.Sum() / 1000.0; + builder.AppendLine($"Pack voltage: {totalVoltage}"); + builder.AppendLine($"Cell Voltages (mV): {string.Join(", ", cellVoltages)}"); + builder.AppendLine($"Cell Imbalance (mV): {cellVoltages.Max() - cellVoltages.Min()}"); + } + + if (values[5] != null) + { + builder.AppendLine($"Temperature (deg C): {values[5]}"); + } + + if (values[6] != null) + { + builder.AppendLine($"Temperature (deg C): {values[6]}"); + } + + builder.AppendLine("\nCHARGING STATS:"); + builder.AppendLine($"Charge count [Redlink, dumb, (total)]: {values[13]}, {values[14]}, ({values[15]})"); + builder.AppendLine($"Total charge time: {values[16]}"); + builder.AppendLine($"Time idling on charger: {values[17]}"); + builder.AppendLine($"Low-voltage charges (any cell <2.5V): {values[18]}"); + + builder.AppendLine("\nTOOL USE STATS:"); + var totalDischarge = Convert.ToDouble(values[7] ?? 0); + builder.AppendLine($"Total discharge (Ah): {totalDischarge / 3600:0.00}"); + var totalDischargeCycles = batteryDetails.Capacity != 0 + ? $"{totalDischarge / 3600 / batteryDetails.Capacity:0.00}" + : "Unknown battery type, unable to calculate"; + builder.AppendLine($"Total discharge cycles: {totalDischargeCycles}"); + builder.AppendLine($"Times discharged to empty: {values[8]}"); + builder.AppendLine($"Times overheated: {values[9]}"); + builder.AppendLine($"Overcurrent events: {values[10]}"); + builder.AppendLine($"Low-voltage events: {values[11]}"); + builder.AppendLine($"Low-voltage bounce/stutter: {values[12]}"); + + var toolTime = Enumerable.Range(19, 20).Sum(i => Convert.ToInt32(values[i] ?? 0)); + builder.AppendLine($"Total time on tool (>10A): {TimeSpan.FromSeconds(toolTime)}"); + + for (int i = 19; i < 38; i++) + { + var seconds = Convert.ToInt32(values[i] ?? 0); + var pct = toolTime > 0 ? Math.Round(seconds / (double)toolTime * 100) : 0; + var bar = new string('X', (int)pct); + var ampRange = $"{(i - 18) * 10}-{(i - 17) * 10}A"; + builder.AppendLine($"Time @ {ampRange,8}: {TimeSpan.FromSeconds(seconds)} {pct,2:0}% {bar}"); + } + + var lastSeconds = Convert.ToInt32(values[38] ?? 0); + var lastPct = toolTime > 0 ? Math.Round(lastSeconds / (double)toolTime * 100) : 0; + var lastBar = new string('X', (int)lastPct); + builder.AppendLine($"Time @ {"> 200A",8}: {TimeSpan.FromSeconds(lastSeconds)} {lastPct,2:0}% {lastBar}"); + + return builder.ToString().TrimEnd(); + } + catch (Exception ex) + { + LogDebug($"HealthReport failed: {ex.GetType().Name} - {ex.Message}"); + return "Health report failed. Check battery is connected and you have correct serial port."; + } + finally + { + TxRxRestore(); + } + } + + public List? ReadId(IEnumerable? idArray, bool forceRefresh) + { + var ids = idArray?.ToList() ?? Enumerable.Range(0, _dataId.Count).ToList(); + var results = new List(); + + try + { + Reset(); + + if (forceRefresh) + { + foreach (var (addrMsb, addrLsb, length) in _dataMatrix) + { + Cmd(addrMsb, addrLsb, length, (byte)(length + 5)); + } + Idle(); + Thread.Sleep(100); + } + + Reset(); + foreach (var i in ids) + { + if (i < 0 || i >= _dataId.Count) + { + results.Add(null); + continue; + } + + var (address, length, dataType, _) = _dataId[i]; + var addrMsb = (byte)((address >> 8) & 0xFF); + var addrLsb = (byte)(address & 0xFF); + + var response = Cmd(addrMsb, addrLsb, (byte)length, (byte)(length + 5)); + if (response.Length >= 4 && response[0] == 0x81) + { + var data = response.Skip(3).Take(length).ToArray(); + results.Add(ParseData(data, dataType)); + } + else + { + results.Add(null); + } + } + + Idle(); + return results; + } + catch (Exception ex) + { + LogDebug($"ReadId failed: {ex.GetType().Name} - {ex.Message}"); + return null; + } + } + + public void TxRxSaveAndSet(bool value) + { + _savedPrintTx = PrintTx; + _savedPrintRx = PrintRx; + PrintTx = value; + PrintRx = value; + } + + public void TxRxRestore() + { + if (_savedPrintTx.HasValue) + { + PrintTx = _savedPrintTx.Value; + _savedPrintTx = null; + } + + if (_savedPrintRx.HasValue) + { + PrintRx = _savedPrintRx.Value; + _savedPrintRx = null; + } + } + + private object? ParseData(byte[] data, string dataType) + { + switch (dataType) + { + case "uint": + return data.Aggregate(0, (current, b) => (current << 8) + b); + case "date": + var seconds = data.Aggregate(0L, (current, b) => (current << 8) + b); + return DateTimeOffset.FromUnixTimeSeconds(seconds).UtcDateTime; + case "hhmmss": + var duration = data.Aggregate(0, (current, b) => (current << 8) + b); + var mmss = TimeSpan.FromSeconds(duration); + return $"{(int)mmss.TotalHours}:{mmss.Minutes:00}:{mmss.Seconds:00}"; + case "ascii": + return Encoding.UTF8.GetString(data); + case "sn": + var btype = (data[0] << 8) + data[1]; + var serial = (data[2] << 16) + (data[3] << 8) + data[4]; + return $"Type: {btype,3}, Serial: {serial}"; + case "adc_t": + var adcValue = data.Aggregate(0, (current, b) => (current << 8) + b); + return CalculateTemperature(adcValue); + case "dec_t": + return Math.Round(data[0] + data[1] / 256.0, 2); + case "cell_v": + var cellVoltages = new List(); + for (var i = 0; i < data.Length; i += 2) + { + cellVoltages.Add((data[i] << 8) + data[i + 1]); + } + return cellVoltages; + default: + return null; + } + } + + private double CalculateTemperature(int adcValue) + { + const double r1 = 10e3; + const double r2 = 20e3; + const double t1 = 50; + const double t2 = 35; + + const double adc1 = 0x0180; + const double adc2 = 0x022E; + + var m = (t2 - t1) / (r2 - r1); + var b = t1 - m * r1; - builder.AppendLine($"Port: {_port.PortName}"); - builder.AppendLine($"Port open: {_port.IsOpen}"); - builder.AppendLine("Basic health report functionality is limited in this build."); - builder.AppendLine("Connect to a battery pack to retrieve detailed statistics."); + var resistance = r1 + (adcValue - adc1) * (r2 - r1) / (adc2 - adc1); + var temperature = m * resistance + b; - return builder.ToString().TrimEnd(); + return Math.Round(temperature, 2); } public void Close() From 3a67b9116f9bb3b64f7bff86efc8799929d3bceb Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 18:17:13 -0500 Subject: [PATCH 39/61] Corrected some errors. --- M18Protocol.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index 515b55b..252dac5 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -571,7 +571,7 @@ public string HealthReport() }; var batteryDetails = batLookup.TryGetValue(batType, out var details) ? details : (0d, "Unknown"); - builder.AppendLine($"Type: {batType} [{batteryDetails.Description}]"); + builder.AppendLine($"Type: {batType} [{batteryDetails.Item2}]"); builder.AppendLine($"E-serial: {eSerial} (does NOT match case serial)"); var batNow = values[^2] as DateTime? ?? DateTime.UtcNow; @@ -612,8 +612,8 @@ public string HealthReport() builder.AppendLine("\nTOOL USE STATS:"); var totalDischarge = Convert.ToDouble(values[7] ?? 0); builder.AppendLine($"Total discharge (Ah): {totalDischarge / 3600:0.00}"); - var totalDischargeCycles = batteryDetails.Capacity != 0 - ? $"{totalDischarge / 3600 / batteryDetails.Capacity:0.00}" + var totalDischargeCycles = batteryDetails.Item1 != 0 + ? $"{totalDischarge / 3600 / batteryDetails.Item1:0.00}" : "Unknown battery type, unable to calculate"; builder.AppendLine($"Total discharge cycles: {totalDischargeCycles}"); builder.AppendLine($"Times discharged to empty: {values[8]}"); @@ -850,7 +850,7 @@ private IEnumerable ReadAvailable(int count) { totalRead += read; LogDebug($"Read {read} byte(s); total read so far: {totalRead}."); - } + } } catch (InvalidOperationException ex) { From 336b20305c840ded66284f3f5e5ce2d5c8312817 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Tue, 16 Dec 2025 18:20:23 -0500 Subject: [PATCH 40/61] Improve serial reset reliability for health report --- M18Protocol.cs | 54 +++++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index 252dac5..15f8fdf 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -243,7 +243,7 @@ public M18Protocol(string portName, Action? debugLogger = null) LogDebug($"Initializing protocol for port {portName}."); _port = new SerialPort(portName, 4800, Parity.None, 8, StopBits.Two) { - ReadTimeout = 800, + ReadTimeout = 1200, WriteTimeout = 800 }; @@ -451,29 +451,43 @@ public bool Reset() return false; } - _port.BreakState = true; - _port.DtrEnable = true; - Thread.Sleep(300); + for (var attempt = 1; attempt <= 3; attempt++) + { + LogDebug($"Reset attempt {attempt} starting."); - _port.BreakState = false; - _port.DtrEnable = false; - Thread.Sleep(300); + _port.DiscardInBuffer(); + _port.BreakState = true; + _port.DtrEnable = true; + Thread.Sleep(300); - Send(new[] { SYNC_BYTE }); + _port.BreakState = false; + _port.DtrEnable = false; + Thread.Sleep(300); - try - { - LogDebug("Awaiting reset response after SYNC byte."); - var response = ReadResponse(1); - var success = response.Length > 0 && response[0] == SYNC_BYTE; - LogDebug($"Reset response {(success ? "acknowledged" : "did not match expected SYNC")}."); - return success; - } - catch (InvalidOperationException ex) - { - LogDebug($"Reset failed with exception: {ex.GetType().Name} - {ex.Message}"); - return false; + Send(new[] { SYNC_BYTE }); + + try + { + LogDebug("Awaiting reset response after SYNC byte."); + var response = ReadResponse(1); + var success = response.Length > 0 && response[0] == SYNC_BYTE; + LogDebug($"Reset response {(success ? "acknowledged" : "did not match expected SYNC")}."); + if (success) + { + Thread.Sleep(10); + return true; + } + } + catch (InvalidOperationException ex) + { + LogDebug($"Reset attempt {attempt} failed: {ex.GetType().Name} - {ex.Message}"); + } + + Thread.Sleep(50); } + + LogDebug("All reset attempts exhausted without a response."); + return false; } public void Idle() From 7b1496579430a2844ed3a1a39bbb5bef14e09aea Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Wed, 17 Dec 2025 18:08:05 -0500 Subject: [PATCH 41/61] Added Echo Test button for debugging. --- M18AnalyzerMain.Designer.cs | 17 +++++++++++++-- M18AnalyzerMain.cs | 41 +++++++++++++++++++++++++++++++++++++ M18AnalyzerMain.resx | 3 +++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 1c21a44..94085d7 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -34,6 +34,7 @@ private void InitializeComponent() tabSimple = new TabPage(); btnTestFT232 = new Button(); grpOutput = new GroupBox(); + btnTestEcho = new Button(); btnCopyOutput = new Button(); btnReset = new Button(); btnHealthReport = new Button(); @@ -175,6 +176,7 @@ private void InitializeComponent() // // grpOutput // + grpOutput.Controls.Add(btnTestEcho); grpOutput.Controls.Add(btnCopyOutput); grpOutput.Controls.Add(btnReset); grpOutput.Controls.Add(btnHealthReport); @@ -190,6 +192,16 @@ private void InitializeComponent() grpOutput.TabStop = false; grpOutput.Text = "Output"; // + // btnTestEcho + // + btnTestEcho.Location = new Point(616, 176); + btnTestEcho.Name = "btnTestEcho"; + btnTestEcho.Size = new Size(120, 29); + btnTestEcho.TabIndex = 12; + btnTestEcho.Text = "Test Raw Echo"; + btnTestEcho.UseVisualStyleBackColor = true; + btnTestEcho.Click += button1_Click; + // // btnCopyOutput // btnCopyOutput.Location = new Point(616, 120); @@ -1078,7 +1090,7 @@ private void InitializeComponent() rtbDebugOutput.Location = new Point(8, 400); rtbDebugOutput.Margin = new Padding(2); rtbDebugOutput.Name = "rtbDebugOutput"; - rtbDebugOutput.Size = new Size(754, 79); + rtbDebugOutput.Size = new Size(754, 168); rtbDebugOutput.TabIndex = 1; rtbDebugOutput.Text = ""; // @@ -1086,7 +1098,7 @@ private void InitializeComponent() // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(768, 485); + ClientSize = new Size(768, 576); Controls.Add(rtbDebugOutput); Controls.Add(tabControlM18Main); Icon = (Icon)resources.GetObject("$this.Icon"); @@ -1207,5 +1219,6 @@ private void InitializeComponent() private Label lblKillaVoltAbout; private RichTextBox rtbDebugOutput; private Button btnTestFT232; + private Button btnTestEcho; } } diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index bcc3ae9..2b095f2 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -561,5 +561,46 @@ private void cmbBxSerialPort_SelectedIndexChanged_1(object sender, EventArgs e) { } + + private void button1_Click(object sender, EventArgs e) + { + + } + private void btnTestEcho_Click(object sender, EventArgs e) +{ + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on COM{_protocol?.PortName ?? "??"}\n"); + try + { + if (_protocol == null || !_protocol.IsOpen) + { + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Serial port not open. Connect first.\n"); + return; + } + + // Clear input buffer to avoid stale data + _protocol.DiscardInBuffer(); + + // Send 0xAA + byte[] send = { 0xAA }; + _protocol.Write(send, 0, 1); + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Sent byte 0xAA.\n"); + + // Try to read one byte, with timeout + int response = _protocol.ReadByte(); // This blocks up to ReadTimeout + if (response >= 0) + { + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Received byte: 0x{response:X2}\n"); + } + else + { + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - No byte received (timeout).\n"); + } + } + catch (Exception ex) + { + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Exception: {ex.Message}\n"); + } +} + } } diff --git a/M18AnalyzerMain.resx b/M18AnalyzerMain.resx index 460cf1d..0ca5ce8 100644 --- a/M18AnalyzerMain.resx +++ b/M18AnalyzerMain.resx @@ -252,6 +252,9 @@ Step 4: Set Idle (Tx Low) before unplugging battery and/or disconnecting the ser IOkQGhLK9WiedIH9HyjtxGfo3wGRAAAAAElFTkSuQmCC + + 9, 21 + 68 From 0f1b679fb089073bd422c279520fa2c249ef861c Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Wed, 17 Dec 2025 18:17:11 -0500 Subject: [PATCH 42/61] Expose protocol serial port for diagnostics --- M18AnalyzerMain.cs | 8 ++++---- M18Protocol.cs | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 2b095f2..7cffe8f 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -571,22 +571,22 @@ private void btnTestEcho_Click(object sender, EventArgs e) rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on COM{_protocol?.PortName ?? "??"}\n"); try { - if (_protocol == null || !_protocol.IsOpen) + if (_protocol?.Port.IsOpen != true) { rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Serial port not open. Connect first.\n"); return; } // Clear input buffer to avoid stale data - _protocol.DiscardInBuffer(); + _protocol.Port.DiscardInBuffer(); // Send 0xAA byte[] send = { 0xAA }; - _protocol.Write(send, 0, 1); + _protocol.Port.Write(send, 0, 1); rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Sent byte 0xAA.\n"); // Try to read one byte, with timeout - int response = _protocol.ReadByte(); // This blocks up to ReadTimeout + int response = _protocol.Port.ReadByte(); // This blocks up to ReadTimeout if (response >= 0) { rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Received byte: 0x{response:X2}\n"); diff --git a/M18Protocol.cs b/M18Protocol.cs index 15f8fdf..a967b1e 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -220,6 +220,8 @@ public class M18Protocol private bool? _savedPrintTx; private bool? _savedPrintRx; + public SerialPort Port => _port; + private bool EnsurePortOpen(string operation) { if (_disposed) From a1869d4d8eb178822e8413d6d4f995a2500d3141 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Wed, 17 Dec 2025 21:02:23 -0500 Subject: [PATCH 43/61] Add comprehensive inline documentation --- M18AnalyzerMain.Designer.cs | 218 ++++++----- M18AnalyzerMain.cs | 695 ++++++++++++++++++++++------------- M18Protocol.cs | 701 +++++++++++++++++++++--------------- Program.cs | 68 +++- PythonScriptRunner.cs | 59 ++- SerialPortUtil.cs | 284 ++++++++------- 6 files changed, 1206 insertions(+), 819 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 94085d7..005bc12 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -1,7 +1,17 @@ -namespace M18BatteryInfo -{ - partial class frmMain - { +// ************************************************************************************************* +// M18AnalyzerMain.Designer.cs +// --------------------------- +// Auto-generated WinForms designer file that declares and initializes every UI control used by +// frmMain. The code positions buttons, text boxes, labels, tabs, and rich text boxes that the logic +// in M18AnalyzerMain.cs interacts with. Although the designer typically omits comments, we include +// them here to help beginners understand how InitializeComponent wires up control properties (size, +// docking, events) and how the UI layout maps to protocol actions such as toggling TX lines and +// reading health reports. +// ************************************************************************************************* +namespace M18BatteryInfo +{ + partial class frmMain + { /// /// Required designer variable. /// @@ -22,102 +32,110 @@ protected override void Dispose(bool disposing) #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); - tabControlM18Main = new TabControl(); - tabSimple = new TabPage(); - btnTestFT232 = new Button(); - grpOutput = new GroupBox(); - btnTestEcho = new Button(); - btnCopyOutput = new Button(); - btnReset = new Button(); - btnHealthReport = new Button(); - btnActive = new Button(); - rtbOutput = new RichTextBox(); - btnIdle = new Button(); - btnDisconnect = new Button(); - btnConnect = new Button(); - btnRefresh = new Button(); - lblSerialPort = new Label(); - cmbBxSerialPort = new ComboBox(); - tabAdvanced = new TabPage(); - btnRestoreTxRxState = new Button(); - grpTryCmd = new GroupBox(); - txtTryCmdLength = new TextBox(); - txtAddressLow = new TextBox(); - txtAddressHigh = new TextBox(); - lblTryCmdLength = new Label(); - lblAddressLow = new Label(); - lblAddrHigh = new Label(); - lblCommand = new Label(); - txtCommand = new TextBox(); - grpbxDebugCmd = new GroupBox(); - txtResponseLength = new TextBox(); - txtDebugCmdLength = new TextBox(); - txtAddrLSB = new TextBox(); - lblResponseLength = new Label(); - lblDebugCmdLength = new Label(); - lblLSB = new Label(); - lblMSB = new Label(); - txtAddrMSB = new TextBox(); - btnFullBrute = new Button(); - btnBruteAddr = new Button(); - btnSaveTxRxState = new Button(); - chkboxRxLog = new CheckBox(); - chkbxTXLog = new CheckBox(); - txtWriteMessage = new TextBox(); - btnWriteMessage = new Button(); - btnReadIDLabelled = new Button(); - btnReadIDRaw = new Button(); - btnReadAllSpreadsheet = new Button(); - btnReadAllRegisters = new Button(); - rtbAdvOutput = new RichTextBox(); - tabSimulation = new TabPage(); - grpBxSimCustomProfile = new GroupBox(); - lblCutoffRaw = new Label(); - lblMaxCurrAmps = new Label(); - txtMaxCurrAmps = new TextBox(); - lblMaxCurrRaw = new Label(); - txtCutoffAmps = new TextBox(); - lblCutoffAmps = new Label(); - txtMaxCurrRaw = new TextBox(); - txtCutoffRaw = new TextBox(); - txtSimDuration = new TextBox(); - btnStopSim = new Button(); - btnStartSim = new Button(); - lblSimProfile = new Label(); - lblBaudRate = new Label(); - lblDuration = new Label(); - cmbBxChgProfile = new ComboBox(); - cmbBxBaudRate = new ComboBox(); - tabDiagnostics = new TabPage(); - btnClearDiagForm = new Button(); - grpboxDiagOutput = new GroupBox(); - rtbSubmitDiagReadOnly = new RichTextBox(); - lblType = new Label(); - lblStickerInfo = new Label(); - lblToolSerialNum = new Label(); - lblSubmitDiagDate = new Label(); - lblOneKeyID = new Label(); - txtSubmitDiagDate = new TextBox(); - txtSubmitDiagSerial = new TextBox(); - txtSubmitDiagSticker = new TextBox(); - txtSubmitDiagType = new TextBox(); - txtOneKeyID = new TextBox(); - btnSubmitDiagForm = new Button(); - tabAbout = new TabPage(); - linkLabelKillaVolt = new LinkLabel(); - lblKillaVoltAbout = new Label(); - linkLabelMartin = new LinkLabel(); - lblMartin = new Label(); - lblAboutTitle = new Label(); - toolTipSimpleTab = new ToolTip(components); + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + // InitializeComponent is responsible for instantiating every control, setting layout + // properties (Location, Size, Dock), attaching imagery/resources, and adding controls to + // parent containers. The sequence follows WinForms best practice: create child controls, + // configure them, then add them to their parent (e.g., GroupBox or TabPage). Comments are + // provided around major groups (Simple tab, Advanced tab, Simulation tab, Diagnostics tab, + // About tab) so readers understand how the UI maps to functionality described in + // M18AnalyzerMain.cs. WinForms uses absolute positioning here, so changing Size/Location + // adjusts pixel coordinates relative to parent containers. + components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); + tabControlM18Main = new TabControl(); // Main tab control housing Simple/Advanced/Simulation/Diagnostics/About views. + tabSimple = new TabPage(); // User-friendly tab with core actions (connect, idle, active, health, reset). + btnTestFT232 = new Button(); // Button to perform FT232 hardware test (wired to btnTestFT232_Click). + grpOutput = new GroupBox(); // Group box holding primary log output and basic controls. + btnTestEcho = new Button(); // Button to trigger raw echo test; logic in M18AnalyzerMain.cs. + btnCopyOutput = new Button(); // Copies output log to clipboard for sharing. + btnReset = new Button(); // Issues reset handshake to battery. + btnHealthReport = new Button(); // Initiates health report read. + btnActive = new Button(); // Drives TX high (charger simulation). + rtbOutput = new RichTextBox(); // Rich text box showing simple log messages. + btnIdle = new Button(); // Drives TX low (idle). + btnDisconnect = new Button(); // Closes serial connection. + btnConnect = new Button(); // Opens serial connection. + btnRefresh = new Button(); // Refreshes COM port list. + lblSerialPort = new Label(); // Label describing serial port combo box. + cmbBxSerialPort = new ComboBox(); // Dropdown listing available COM ports. + tabAdvanced = new TabPage(); // Advanced tab for raw register reads/writes and debug logging. + btnRestoreTxRxState = new Button(); // Restores protocol logging preferences. + grpTryCmd = new GroupBox(); // Input fields for manually issuing commands (address/length). + txtTryCmdLength = new TextBox(); // Text box for specifying custom length. + txtAddressLow = new TextBox(); // LSB of address for TryCmd. + txtAddressHigh = new TextBox(); // MSB of address for TryCmd. + lblTryCmdLength = new Label(); // Label for custom length field. + lblAddressLow = new Label(); // Label for LSB field. + lblAddrHigh = new Label(); // Label for MSB field. + lblCommand = new Label(); // Label for command byte field. + txtCommand = new TextBox(); // Text box for command byte entry. + grpbxDebugCmd = new GroupBox(); // Debug command group for low-level reads. + txtResponseLength = new TextBox(); // Field for expected response length. + txtDebugCmdLength = new TextBox(); // Field for command length. + txtAddrLSB = new TextBox(); // LSB address input for debug command. + lblResponseLength = new Label(); // Label for response length. + lblDebugCmdLength = new Label(); // Label for debug command length. + lblLSB = new Label(); // Label identifying LSB text box. + lblMSB = new Label(); // Label identifying MSB text box. + txtAddrMSB = new TextBox(); // MSB address input for debug command. + btnFullBrute = new Button(); // Triggers brute-force address scan. + btnBruteAddr = new Button(); // Triggers targeted brute-force call. + btnSaveTxRxState = new Button(); // Saves current protocol logging flags. + chkboxRxLog = new CheckBox(); // Toggles RX logging. + chkbxTXLog = new CheckBox(); // Toggles TX logging. + txtWriteMessage = new TextBox(); // Input for raw message writing. + btnWriteMessage = new Button(); // Sends raw message. + btnReadIDLabelled = new Button(); // Reads ID registers with labels. + btnReadIDRaw = new Button(); // Reads raw ID registers. + btnReadAllSpreadsheet = new Button(); // Reads all registers for spreadsheet export. + btnReadAllRegisters = new Button(); // Reads entire register set. + rtbAdvOutput = new RichTextBox(); // Advanced output log box. + tabSimulation = new TabPage(); // Simulation tab for charge profile emulation. + grpBxSimCustomProfile = new GroupBox(); // Custom profile input group. + lblCutoffRaw = new Label(); // Label describing raw cutoff value textbox. + lblMaxCurrAmps = new Label(); // Label for maximum current in amps. + txtMaxCurrAmps = new TextBox(); // Maximum current (amps) input. + lblMaxCurrRaw = new Label(); // Label for raw maximum current field. + txtCutoffAmps = new TextBox(); // Cutoff current (amps) input. + lblCutoffAmps = new Label(); // Label for cutoff amps field. + txtMaxCurrRaw = new TextBox(); // Raw maximum current value input. + txtCutoffRaw = new TextBox(); // Raw cutoff current value input. + txtSimDuration = new TextBox(); // Simulation duration input. + btnStopSim = new Button(); // Button to stop simulation loop. + btnStartSim = new Button(); // Button to start simulation loop. + lblSimProfile = new Label(); // Label for profile dropdown. + lblBaudRate = new Label(); // Label for baud rate dropdown. + lblDuration = new Label(); // Label for duration input. + cmbBxChgProfile = new ComboBox(); // Predefined charging profiles. + cmbBxBaudRate = new ComboBox(); // Baud rate selection for simulation. + tabDiagnostics = new TabPage(); // Diagnostics tab for capturing user input in log format. + btnClearDiagForm = new Button(); // Clears diagnostics form fields. + grpboxDiagOutput = new GroupBox(); // Container for diagnostics output log. + rtbSubmitDiagReadOnly = new RichTextBox(); // Read-only diagnostics output box. + lblType = new Label(); // Label for battery type field. + lblStickerInfo = new Label(); // Label for sticker info field. + lblToolSerialNum = new Label(); // Label for tool serial number field. + lblSubmitDiagDate = new Label(); // Label for submission date field. + lblOneKeyID = new Label(); // Label for One-Key ID field. + txtSubmitDiagDate = new TextBox(); // Date input. + txtSubmitDiagSerial = new TextBox(); // Serial number input. + txtSubmitDiagSticker = new TextBox(); // Sticker info input. + txtSubmitDiagType = new TextBox(); // Type input. + txtOneKeyID = new TextBox(); // One-Key ID input. + btnSubmitDiagForm = new Button(); // Submits diagnostics info to output box. + tabAbout = new TabPage(); // About tab with credits. + linkLabelKillaVolt = new LinkLabel(); // Hyperlink to KillaVolt resources. + lblKillaVoltAbout = new Label(); // Label describing KillaVolt. + linkLabelMartin = new LinkLabel(); // Hyperlink to martin/other contributor. + lblMartin = new Label(); // Label describing martin's contributions. + lblAboutTitle = new Label(); // Title label for About tab. + toolTipSimpleTab = new ToolTip(components); // Tooltip component shared across controls. rtbDebugOutput = new RichTextBox(); tabControlM18Main.SuspendLayout(); tabSimple.SuspendLayout(); diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 7cffe8f..a5e798b 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -1,606 +1,789 @@ -using System; -using System.Collections.Generic; -using System.IO.Ports; -using System.Linq; -using System.Threading.Tasks; -using System.Windows.Forms; +// ************************************************************************************************* +// M18AnalyzerMain.cs +// ------------------ +// Hosts the user-facing WinForms logic for the Milwaukee M18 battery analyzer GUI. This partial +// class pairs with M18AnalyzerMain.Designer.cs (UI layout) to render the form and wire up buttons, +// combo boxes, and rich text boxes. It acts as a bridge between the UI events and the lower-level +// serial protocol implementation in M18Protocol.cs as well as the COM port discovery helper +// SerialPortUtil.cs. Every method and key line is commented to teach WinForms fundamentals (event +// registration, marshaling to the UI thread), serial programming (driving DTR/Break for idle/high), +// and logging approaches. Reading the comments alone should explain how the GUI controls map to the +// electrical behavior on the FT232/COM port pins and how the protocol layer is orchestrated. +// ************************************************************************************************* + +using System; // Provides core types like EventArgs, Action, and DateTime used throughout the form. +using System.Collections.Generic; // Supplies List for storing SerialPortDisplay objects. +using System.IO.Ports; // Exposes SerialPort and related enumerations (Parity, StopBits) for UART control. +using System.Linq; // Enables LINQ helpers such as Select and ToList used during logging. +using System.Threading.Tasks; // Enables Task.Run for background work that keeps the UI responsive. +using System.Windows.Forms; // Provides Form, control types, and dialog helpers used by WinForms. namespace M18BatteryInfo { + /// + /// The primary WinForms window that presents user controls for serial-port selection, + /// connection management, and protocol commands (idle/high/reset/health-report). This class + /// captures events fired by buttons and other controls, marshals work to background threads so + /// the UI does not freeze, and forwards user actions to which drives + /// the UART (TX) line high/low and exchanges bytes with the battery BMS. It also uses + /// to enumerate available COM ports with extended metadata. + /// public partial class frmMain : Form { - private M18Protocol? _protocol; - private bool _hasAppendedLog; - private bool _hasAppendedAdvancedLog; - private bool _hasAppendedDebugLog; - private string? _selectedPortName; - private string? _selectedPortDescription; - + // Backing field holding the active protocol connection. Null means no port is open. + private M18Protocol? _protocol; // M18Protocol manipulates SerialPort.BreakState/DtrEnable to emulate charger signals. + // Track whether the simple output RichTextBox already has content to manage newlines. + private bool _hasAppendedLog; // Ensures we only prepend Environment.NewLine after the first log line. + // Track whether the advanced output RichTextBox already has content. + private bool _hasAppendedAdvancedLog; // Similar flag for the advanced log tab to avoid leading blank lines. + // Track whether the debug output RichTextBox already has content. + private bool _hasAppendedDebugLog; // Prevents inserting extra blank lines before first debug message. + // Store the currently selected COM port name for connection attempts. + private string? _selectedPortName; // Persisted when user picks an item from cmbBxSerialPort. + // Store a human-friendly port description for user messages. + private string? _selectedPortDescription; // Derived from SerialPortDisplay to show manufacturer/USB metadata. + + /// + /// Constructs the form, initializes UI components generated by the designer, and hooks up + /// event handlers for all buttons and checkbox controls. The constructor also sets helpful + /// tooltips and initializes the UI to a disconnected state. + /// public frmMain() { - InitializeComponent(); - - btnRefresh.Click += btnRefresh_Click; - btnConnect.Click += btnConnect_Click; - btnDisconnect.Click += btnDisconnect_Click; - btnIdle.Click += btnIdle_Click; - btnActive.Click += btnActive_Click; - btnHealthReport.Click += btnHealthReport_Click; - btnReset.Click += btnReset_Click; - btnCopyOutput.Click += btnCopyOutput_Click; - chkbxTXLog.CheckedChanged += chkbxTXLog_CheckedChanged; - chkboxRxLog.CheckedChanged += chkboxRxLog_CheckedChanged; - btnTestFT232.Click += btnTestFT232_Click; - cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged; - FormClosing += frmMain_FormClosing; - - chkbxTXLog.Checked = true; - chkboxRxLog.Checked = true; - toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available serial ports."); - toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); - toolTipSimpleTab.SetToolTip(btnDisconnect, "Disconnect from the currently connected device."); - toolTipSimpleTab.SetToolTip(btnIdle, "Drive TX low (idle). Safe for connect/disconnect."); - toolTipSimpleTab.SetToolTip(btnActive, "Drive TX high (active). Charger simulation."); - toolTipSimpleTab.SetToolTip(btnHealthReport, "Read and display a basic battery health report."); - toolTipSimpleTab.SetToolTip(btnReset, "Send a reset signal to the connected battery."); - toolTipSimpleTab.SetToolTip(btnCopyOutput, "Copy all output log text to the clipboard."); - - UpdateConnectionUi(false); - } - + InitializeComponent(); // Calls into the designer-generated control creation code. + + // Wire up button click and change handlers to their corresponding methods. Delegates are + // created here to keep designer file clean and to demonstrate event subscription syntax. + btnRefresh.Click += btnRefresh_Click; // Refresh list of serial ports when "Refresh" pressed. + btnConnect.Click += btnConnect_Click; // Attempt to open serial port when "Connect" pressed. + btnDisconnect.Click += btnDisconnect_Click; // Close serial port when "Disconnect" pressed. + btnIdle.Click += btnIdle_Click; // Drive TX low (Break/DTR asserted) to simulate idle charger pin. + btnActive.Click += btnActive_Click; // Drive TX high (Break/DTR deasserted) to simulate charging. + btnHealthReport.Click += btnHealthReport_Click; // Trigger multi-register read to show battery stats. + btnReset.Click += btnReset_Click; // Send reset handshake (BREAK + SYNC byte) to battery. + btnCopyOutput.Click += btnCopyOutput_Click; // Copy logs to clipboard for sharing/debugging. + chkbxTXLog.CheckedChanged += chkbxTXLog_CheckedChanged; // Toggle TX byte logging. + chkboxRxLog.CheckedChanged += chkboxRxLog_CheckedChanged; // Toggle RX byte logging. + btnTestFT232.Click += btnTestFT232_Click; // Run quick FT232 loopback/response test. + cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged; // Capture selected COM port. + FormClosing += frmMain_FormClosing; // Ensure we cleanly close serial port when form closes. + + // Default logging preferences to on so that users see both TX and RX traffic. + chkbxTXLog.Checked = true; // Enables printing TX bytes through M18Protocol.TxLogger. + chkboxRxLog.Checked = true; // Enables printing RX bytes through M18Protocol.RxLogger. + + // Provide friendly tooltips describing each control's purpose. + toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available serial ports."); // Helps beginners understand UI flow. + toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); // Explains connection button. + toolTipSimpleTab.SetToolTip(btnDisconnect, "Disconnect from the currently connected device."); // Clarifies safe disconnect. + toolTipSimpleTab.SetToolTip(btnIdle, "Drive TX low (idle). Safe for connect/disconnect."); // Notes electrical effect on TX line. + toolTipSimpleTab.SetToolTip(btnActive, "Drive TX high (active). Charger simulation."); // Indicates charger-simulation state. + toolTipSimpleTab.SetToolTip(btnHealthReport, "Read and display a basic battery health report."); // References M18Protocol.HealthReport. + toolTipSimpleTab.SetToolTip(btnReset, "Send a reset signal to the connected battery."); // Tied to M18Protocol.Reset handshake. + toolTipSimpleTab.SetToolTip(btnCopyOutput, "Copy all output log text to the clipboard."); // Guides how to export logs. + + UpdateConnectionUi(false); // Disable connection-dependent buttons until a port opens. + } + + /// + /// Placeholder handler generated by WinForms designer for a tool strip button; retained to + /// illustrate event signatures even when unused. + /// private void toolStripButton1_Click(object sender, EventArgs e) { - + // No logic implemented. Keeping the method demonstrates the event handler pattern that + // other buttons follow. Deleting could break designer hookups, so it stays as a template. } + /// + /// Stub for tooltip popup events. Included for completeness to show how ToolTip can be + /// customized if desired. + /// private void toolTipReset_Popup(object sender, PopupEventArgs e) { - + // Intentionally blank. If we wanted dynamic tooltips, this would adjust size or text. } + /// + /// Executes when the form finishes loading. We immediately refresh serial ports so the + /// combo box is populated before the user interacts with it. + /// private void frmMain_Load(object sender, EventArgs e) { - RefreshSerialPorts(); + RefreshSerialPorts(); // Kick off port enumeration via SerialPortUtil. } + /// + /// Auto-generated click handler for label controls; retained as teaching stub. + /// private void lblResponseLength_Click(object sender, EventArgs e) { - + // Labels typically do not need click handlers, but this stub shows the event signature. } + /// + /// Stub demonstrating how to handle PictureBox click events if interactive imagery is added. + /// private void pictureBox1_Click(object sender, EventArgs e) { - + // No operation required; included so readers see how to subscribe to image clicks. } + /// + /// Stub illustrating how to respond to link clicks in LinkLabel controls. + /// private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { - + // Could open documentation URLs; left empty to avoid unintended navigation. } + /// + /// Stub demonstrating Enter events on group boxes (focus gained). + /// private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) { - + // Could be used to populate custom simulation values; no logic required today. } + /// + /// Handles the Refresh button click by logging intent and enumerating ports. + /// private void btnRefresh_Click(object? sender, EventArgs e) { - LogDebugAction("Requesting RefreshSerialPorts()."); - RefreshSerialPorts(); + LogDebugAction("Requesting RefreshSerialPorts()."); // Show action in debug log for traceability. + RefreshSerialPorts(); // Pull latest COM ports using SerialPortUtil. } + /// + /// Enumerates available serial ports, populates the combo box, and logs rich metadata for + /// troubleshooting USB cables/adapters. Uses . + /// private void RefreshSerialPorts() { - AppendLogBoth("Refreshing serial port list..."); + AppendLogBoth("Refreshing serial port list..."); // Inform user in both simple and debug logs. try { - var ports = GetSerialPortInfos(); + var ports = GetSerialPortInfos(); // Gather COM port info via SerialPortUtil (uses SetupAPI). - cmbBxSerialPort.Items.Clear(); + cmbBxSerialPort.Items.Clear(); // Reset combo box so old entries do not linger. foreach (var port in ports) { - cmbBxSerialPort.Items.Add(port); - AppendLogBoth($"Found port {port.DisplayName}"); + cmbBxSerialPort.Items.Add(port); // Add SerialPortDisplay; ToString() shows DisplayName. + AppendLogBoth($"Found port {port.DisplayName}"); // Echo discovery to the log. } - AppendDebugLog($"RefreshSerialPorts(): {ports.Count} port(s) detected."); + AppendDebugLog($"RefreshSerialPorts(): {ports.Count} port(s) detected."); // Debug summary count. foreach (var port in ports) { - var sourceLabel = string.IsNullOrWhiteSpace(port.Source) ? "Unknown source" : port.Source; - AppendDebugLog($" - {port.DisplayName} (source: {sourceLabel})"); - AppendDebugLog($" Details: description='{port.DeviceDescription ?? "(none)"}', manufacturer='{port.Manufacturer ?? "(none)"}', hwid='{port.HardwareIds ?? "(none)"}'"); + var sourceLabel = string.IsNullOrWhiteSpace(port.Source) ? "Unknown source" : port.Source; // Prefer readable source text. + AppendDebugLog($" - {port.DisplayName} (source: {sourceLabel})."); // Include display name and source origin. + AppendDebugLog($" Details: description='{port.DeviceDescription ?? "(none)"}', manufacturer='{port.Manufacturer ?? "(none)"}', hwid='{port.HardwareIds ?? "(none)"}'"); // Show manufacturer/hardware IDs for driver troubleshooting. } if (ports.Count == 0) { - AppendLogBoth("No serial ports detected."); + AppendLogBoth("No serial ports detected."); // Warn user if no COM ports are found (e.g., driver missing). } else { - cmbBxSerialPort.SelectedIndex = 0; + cmbBxSerialPort.SelectedIndex = 0; // Auto-select first port to streamline connection flow. } if (cmbBxSerialPort.SelectedItem is null) { - _selectedPortName = null; - _selectedPortDescription = null; + _selectedPortName = null; // Reset selection tracking if nothing is selected. + _selectedPortDescription = null; // Clear human-friendly description too. } } catch (Exception ex) { - LogError("Error while refreshing serial ports", ex); + LogError("Error while refreshing serial ports", ex); // Surface exceptions with MessageBox to aid debugging. } } + /// + /// Captures combo-box selection changes so we know which COM port to open. + /// private void cmbBxSerialPort_SelectedIndexChanged(object? sender, EventArgs e) { if (cmbBxSerialPort.SelectedItem is SerialPortDisplay selected) { - _selectedPortName = selected.PortName; - _selectedPortDescription = selected.DeviceDescription ?? selected.DisplayName; - AppendDebugLog($"Selected port set to {selected.DisplayName} (source: {selected.Source})."); + _selectedPortName = selected.PortName; // Save COM port name (e.g., COM3) for connection. + _selectedPortDescription = selected.DeviceDescription ?? selected.DisplayName; // Save descriptive text for user prompts. + AppendDebugLog($"Selected port set to {selected.DisplayName} (source: {selected.Source})."); // Log the selection for trace. } else { - _selectedPortName = null; - _selectedPortDescription = null; + _selectedPortName = null; // Clear cached name if selection is removed. + _selectedPortDescription = null; // Clear description as well. } } + /// + /// Opens a serial connection using the selected port. Ensures any existing connection is + /// closed first, then spins up on a background thread to avoid UI + /// blocking while the FTDI driver initializes the UART pins. + /// private async void btnConnect_Click(object? sender, EventArgs e) { - LogDebugAction("Requesting Connect()."); + LogDebugAction("Requesting Connect()."); // Debug log entry noting button press. if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) { - AppendLog("No serial port selected. Please choose a port before connecting."); - MessageBox.Show("Please select a serial port before connecting.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return; + AppendLog("No serial port selected. Please choose a port before connecting."); // User guidance when no selection exists. + MessageBox.Show("Please select a serial port before connecting.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal dialog prevents accidental action. + return; // Abort connect flow. } if (_protocol != null) { if (string.Equals(_protocol.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) { - AppendLogBoth($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); - MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); - return; + AppendLogBoth($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); // Avoid reopening same port. + MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify user. + return; // Exit without reopening. } - AppendLogBoth($"A different port ({_protocol.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); - await DisconnectAsync(); + AppendLogBoth($"A different port ({_protocol.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); // Explain why we close first. + await DisconnectAsync(); // Close current protocol instance to free COM port handle. } - var selectedDescription = _selectedPortDescription ?? selectedPort.DisplayName; + var selectedDescription = _selectedPortDescription ?? selectedPort.DisplayName; // Build friendly text for status lines. - AppendLogBoth($"Attempting to open {selectedDescription} with settings: 4800 baud, 8 data bits, parity None, stop bits Two, handshake None."); - AppendDebugLog("Serial connection will set TX low (idle) after open."); + AppendLogBoth($"Attempting to open {selectedDescription} with settings: 4800 baud, 8 data bits, parity None, stop bits Two, handshake None."); // Describe UART config so readers learn standard serial settings. + AppendDebugLog("Serial connection will set TX low (idle) after open."); // Note initial electrical state (BreakState/DTR true). try { - await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName, AppendDebugLog)); - ApplyProtocolLoggingPreferences(); - AppendLogBoth($"{selectedDescription} opened successfully."); - UpdateConnectionUi(true); + await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName, AppendDebugLog)); // Instantiate protocol off-UI thread; constructor opens SerialPort and drives TX idle. + ApplyProtocolLoggingPreferences(); // Sync checkbox states into protocol PrintTx/PrintRx and hook log delegates. + AppendLogBoth($"{selectedDescription} opened successfully."); // Confirm connection to user. + UpdateConnectionUi(true); // Toggle button enabled states to reflect connected status. } catch (Exception ex) { - _protocol = null; - LogError($"Failed to open {selectedDescription}.", ex); - UpdateConnectionUi(false); + _protocol = null; // Ensure no dangling protocol reference if open failed. + LogError($"Failed to open {selectedDescription}.", ex); // Show error details. + UpdateConnectionUi(false); // Re-enable connection buttons so user can retry. } } + /// + /// Handles Disconnect button clicks by invoking and logging the + /// action for debugging. Uses async void because it is an event handler. + /// private async void btnDisconnect_Click(object? sender, EventArgs e) { - LogDebugAction(FormatLogMessage("btnDisconnect pressed - requesting DisconnectAsync().")); - await DisconnectAsync(); + LogDebugAction(FormatLogMessage("btnDisconnect pressed - requesting DisconnectAsync().")); // Timestamped debug entry. + await DisconnectAsync(); // Attempt to close the serial port and dispose protocol safely. } + /// + /// Closes the active protocol/serial port if present, optionally informing the user via + /// MessageBox. Runs on a background thread to prevent UI freezes if the driver blocks. + /// private async Task DisconnectAsync(bool showUserMessages = true) { if (_protocol == null) { - var message = "Disconnect requested, but no serial port is currently open."; - AppendDebugLog(FormatLogMessage(message)); + var message = "Disconnect requested, but no serial port is currently open."; // Friendly explanation. + AppendDebugLog(FormatLogMessage(message)); // Debug log for trace. if (showUserMessages) { - AppendLog(message); - MessageBox.Show(message, "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); + AppendLog(message); // Display in primary log when requested by user (e.g., clicking Disconnect). + MessageBox.Show(message, "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify via modal dialog. } - UpdateConnectionUi(false); - return; + UpdateConnectionUi(false); // Reset UI state regardless. + return; // Exit early when nothing to close. } - AppendLogBoth($"Closing {_protocol.PortName}..."); + AppendLogBoth($"Closing {_protocol.PortName}..."); // Inform user which COM port is closing. try { - await Task.Run(() => _protocol.Close()); - AppendLogBoth($"{_protocol.PortName} closed successfully."); + await Task.Run(() => _protocol.Close()); // Execute Close on background thread; sets TX idle then disposes SerialPort. + AppendLogBoth($"{_protocol.PortName} closed successfully."); // Confirm closure. } catch (Exception ex) { - LogError($"Error while closing {_protocol.PortName}.", ex); + LogError($"Error while closing {_protocol.PortName}.", ex); // Report exceptions thrown during close. } finally { - _protocol = null; - UpdateConnectionUi(false); + _protocol = null; // Drop reference to release resources and signal disconnected state. + UpdateConnectionUi(false); // Re-enable Connect and refresh buttons. } } + /// + /// Sets TX line to idle (low) by calling . Idle corresponds to + /// SerialPort.BreakState = true and DtrEnable = true, which on FT232 asserts BREAK (logic 0) + /// and DTR simultaneously, keeping the battery safe to connect/disconnect. + /// private async void btnIdle_Click(object? sender, EventArgs e) { - AppendDebugLog(FormatLogMessage("btnIdle pressed - calling _protocol.Idle().")); + AppendDebugLog(FormatLogMessage("btnIdle pressed - calling _protocol.Idle().")); // Trace button press. if (!EnsureConnected()) { - return; + return; // Bail out if no active protocol object. } - AppendDebugLog(FormatLogMessage("Invoking _protocol.Idle() to drive TX low.")); + AppendDebugLog(FormatLogMessage("Invoking _protocol.Idle() to drive TX low.")); // Explain electrical effect. try { - await Task.Run(() => _protocol!.Idle()); - AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery."); - AppendDebugLog(FormatLogMessage(_protocol!.GetTxStateSummary("Idle"))); + await Task.Run(() => _protocol!.Idle()); // Background call to avoid UI hiccup; Idle toggles BreakState/DTR. + AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery."); // Teach user about safe state. + AppendDebugLog(FormatLogMessage(_protocol!.GetTxStateSummary("Idle"))); // Log resulting control-line states. } catch (Exception ex) { - LogError("Failed to set TX to Idle.", ex); + LogError("Failed to set TX to Idle.", ex); // Show error if driver throws. } } + /// + /// Drives TX line high (active) using . High corresponds to + /// SerialPort.BreakState = false and DtrEnable = false, emulating a charger engaging the + /// battery's communication line. + /// private async void btnActive_Click(object? sender, EventArgs e) { - AppendDebugLog(FormatLogMessage("btnActive pressed - calling _protocol.High().")); + AppendDebugLog(FormatLogMessage("btnActive pressed - calling _protocol.High().")); // Trace user action. if (!EnsureConnected()) { - return; + return; // Cannot change TX state without an open port. } - AppendDebugLog(FormatLogMessage("Invoking _protocol.High() to drive TX high.")); + AppendDebugLog(FormatLogMessage("Invoking _protocol.High() to drive TX high.")); // Clarify electrical behavior. try { - await Task.Run(() => _protocol!.High()); - AppendLogBoth("TX set to Active (high). Charger simulation enabled."); - AppendDebugLog(FormatLogMessage(_protocol!.GetTxStateSummary("High"))); + await Task.Run(() => _protocol!.High()); // Toggle control lines on background thread. + AppendLogBoth("TX set to Active (high). Charger simulation enabled."); // Show user the state change. + AppendDebugLog(FormatLogMessage(_protocol!.GetTxStateSummary("High"))); // Record final TX states. } catch (Exception ex) { - LogError("Failed to set TX to Active (high).", ex); + LogError("Failed to set TX to Active (high).", ex); // Provide actionable error output. } } + /// + /// Initiates a comprehensive battery health report by invoking . + /// The method reads multiple register blocks from the battery BMS and prints human-readable + /// diagnostics to the log window. + /// private async void btnHealthReport_Click(object? sender, EventArgs e) { - AppendDebugLog(FormatLogMessage("btnHealthReport pressed - calling _protocol.HealthReport().")); + AppendDebugLog(FormatLogMessage("btnHealthReport pressed - calling _protocol.HealthReport().")); // Trace user action. if (!EnsureConnected()) { - return; + return; // Skip if no connection available. } try { - AppendDebugLog(FormatLogMessage("Starting health report collection (mirrors m18.py health()).")); - var report = await Task.Run(() => _protocol!.HealthReport()); - AppendLog("=== Health report ==="); + AppendDebugLog(FormatLogMessage("Starting health report collection (mirrors m18.py health()).")); // Note parity with Python script. + var report = await Task.Run(() => _protocol!.HealthReport()); // Run heavy register reads off UI thread. + AppendLog("=== Health report ==="); // Header in simple log. foreach (var line in report.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None)) { - AppendLog(line); + AppendLog(line); // Preserve line breaks by appending each separately. } - AppendLog("Health report complete."); - AppendDebugLog(FormatLogMessage("Health report appended to output.")); + AppendLog("Health report complete."); // Footer for clarity. + AppendDebugLog(FormatLogMessage("Health report appended to output.")); // Debug trace. } catch (Exception ex) { - LogError("Health report failed.", ex); + LogError("Health report failed.", ex); // Surface exceptions (timeouts, parsing errors). } } + /// + /// Issues a reset command to the battery by toggling BREAK/DTR and sending the SYNC byte via + /// . This simulates a charger reset line pulsing low/high. + /// private async void btnReset_Click(object? sender, EventArgs e) { - LogDebugAction("Requesting _protocol.Reset()."); + LogDebugAction("Requesting _protocol.Reset()."); // Note action for trace. if (!EnsureConnected()) { - return; + return; // Cannot reset without open port. } try { - AppendDebugLog("Sending reset sequence (BREAK/DTR + SYNC)."); - var success = await Task.Run(() => _protocol!.Reset()); - AppendLogBoth(success ? "Reset command acknowledged by device." : "Reset command did not receive expected response."); + AppendDebugLog("Sending reset sequence (BREAK/DTR + SYNC)."); // Explain protocol handshake. + var success = await Task.Run(() => _protocol!.Reset()); // Execute reset on worker thread; toggles control lines and reads response. + AppendLogBoth(success ? "Reset command acknowledged by device." : "Reset command did not receive expected response."); // Inform user of result. } catch (Exception ex) { - LogError("Reset failed.", ex); + LogError("Reset failed.", ex); // Show errors such as port access issues. } } + /// + /// Copies all simple log output to the clipboard, allowing users to paste logs into emails + /// or issue reports. + /// private void btnCopyOutput_Click(object? sender, EventArgs e) { - LogDebugAction("Copying output via btnCopyOutput_Click()."); + LogDebugAction("Copying output via btnCopyOutput_Click()."); // Record action. if (string.IsNullOrEmpty(rtbOutput.Text)) { - AppendLogBoth("No output to copy."); - return; + AppendLogBoth("No output to copy."); // Warn when nothing to copy. + return; // Exit early to avoid placing empty text on clipboard. } - Clipboard.SetText(rtbOutput.Text); - AppendLogBoth("Output copied to clipboard."); + Clipboard.SetText(rtbOutput.Text); // Use System.Windows.Forms.Clipboard to place text into OS clipboard. + AppendLogBoth("Output copied to clipboard."); // Confirm to user. } + /// + /// Ensures there is an active connection before executing protocol operations. Shows a + /// MessageBox when not connected so the user knows to click Connect first. + /// private bool EnsureConnected() { - LogDebugAction(FormatLogMessage("Checking EnsureConnected().")); + LogDebugAction(FormatLogMessage("Checking EnsureConnected().")); // Trace call origin. if (_protocol != null) { - return true; + return true; // Connection exists, safe to proceed. } - AppendLog("No active connection. Please connect to a serial port first."); - MessageBox.Show("Please connect to a serial port first.", "Connection required", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return false; + AppendLog("No active connection. Please connect to a serial port first."); // User-friendly guidance. + MessageBox.Show("Please connect to a serial port first.", "Connection required", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal warning clarifies next step. + return false; // Signal caller to abort operation. } + /// + /// Wrapper around SerialPortUtil to retrieve detailed port metadata, keeping the logic + /// isolated for easier unit testing and mocking. + /// private List GetSerialPortInfos() { - return SerialPortUtil.EnumerateDetailedPorts(AppendDebugLog); + return SerialPortUtil.EnumerateDetailedPorts(AppendDebugLog); // Pass debug logger to capture enumeration details. } + /// + /// Executes a quick FT232 communication test against the selected port by toggling control + /// lines and sending a byte. Helps verify USB-UART hardware is responsive. + /// private async void btnTestFT232_Click(object? sender, EventArgs e) { - LogDebugAction("Requesting Test FT232 operation."); + LogDebugAction("Requesting Test FT232 operation."); // Trace user action. if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) { - AppendLog("No serial port selected. Please choose a port before testing."); - MessageBox.Show("Please select a serial port before testing.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return; + AppendLog("No serial port selected. Please choose a port before testing."); // Provide guidance. + MessageBox.Show("Please select a serial port before testing.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Block until user acknowledges. + return; // Abort test. } - var selectedDescription = _selectedPortDescription ?? selectedPort.DisplayName; + var selectedDescription = _selectedPortDescription ?? selectedPort.DisplayName; // Friendly name for messages. - AppendLog($"Testing FT232 on {selectedDescription}..."); - LogDebugAction($"Testing FT232 on {selectedDescription}."); + AppendLog($"Testing FT232 on {selectedDescription}..."); // Inform user test is starting. + LogDebugAction($"Testing FT232 on {selectedDescription}."); // Duplicate in debug log. - var testResult = await Task.Run(() => TestSerialDevice(selectedPort)); + var testResult = await Task.Run(() => TestSerialDevice(selectedPort)); // Run test on background thread to keep UI fluid. if (testResult.Success) { - AppendLog($"Device responded successfully on {selectedPort.PortName}."); - LogDebugAction($"Device responded successfully on {selectedPort.PortName}."); + AppendLog($"Device responded successfully on {selectedPort.PortName}."); // Success message for user. + LogDebugAction($"Device responded successfully on {selectedPort.PortName}."); // Debug confirmation. } else { - AppendLog($"No response / failed to communicate with device on {selectedPort.PortName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); - LogDebugAction($"No response / failed to communicate with device on {selectedPort.PortName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); + AppendLog($"No response / failed to communicate with device on {selectedPort.PortName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); // Provide failure details. + LogDebugAction($"No response / failed to communicate with device on {selectedPort.PortName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); // Debug echo. } } + /// + /// Opens the specified port with the FTDI-friendly serial settings and performs a minimal + /// control-line toggle plus a single-byte write to check for driver/hardware responsiveness. + /// private static (bool Success, string? ErrorMessage) TestSerialDevice(SerialPortDisplay port) { try { using var serialPort = new SerialPort(port.PortName, 4800, Parity.None, 8, StopBits.Two) { - ReadTimeout = 500, - WriteTimeout = 500, - DtrEnable = true, - RtsEnable = true + ReadTimeout = 500, // Limit read blocking to half a second to avoid hanging the test. + WriteTimeout = 500, // Avoid hanging on write if driver misbehaves. + DtrEnable = true, // Assert DTR to mimic idle charger line initially. + RtsEnable = true // Assert RTS as well; some devices power LEDs or buffers off this line. }; - serialPort.Open(); + serialPort.Open(); // Acquire OS handle to COM port; toggles control lines instantly. - serialPort.DtrEnable = !serialPort.DtrEnable; - serialPort.RtsEnable = !serialPort.RtsEnable; + serialPort.DtrEnable = !serialPort.DtrEnable; // Flip DTR once to ensure hardware responds to control changes. + serialPort.RtsEnable = !serialPort.RtsEnable; // Flip RTS similarly; useful for FT232 loopback LEDs. - serialPort.Write(new byte[] { 0x00 }, 0, 1); + serialPort.Write(new byte[] { 0x00 }, 0, 1); // Send a single zero byte out TX to verify TX data path. - return (true, null); + return (true, null); // Success indicates driver and hardware are reachable. } catch (Exception ex) { - return (false, ex.Message); + return (false, ex.Message); // Return error message so caller can log it. } } + /// + /// Appends a message to the primary output log after prefixing with a timestamp. + /// private void AppendLog(string message) { - AppendSimpleLog(FormatLogMessage(message)); + AppendSimpleLog(FormatLogMessage(message)); // Reuse helper to add timestamp and write to RichTextBox. } + /// + /// Appends a message to both the simple log and debug log so the text appears in two tabs. + /// private void AppendLogBoth(string message) { - var formatted = FormatLogMessage(message); - AppendSimpleLog(formatted); - AppendDebugLog(formatted); + var formatted = FormatLogMessage(message); // Create timestamped text once. + AppendSimpleLog(formatted); // Show in user-friendly log window. + AppendDebugLog(formatted); // Also show in verbose debug tab. } + /// + /// Writes text into the primary rich text box, marshaling to the UI thread if necessary so + /// background tasks can safely log without cross-thread exceptions. + /// private void AppendSimpleLog(string formattedMessage) { if (rtbOutput.InvokeRequired) { - rtbOutput.Invoke(new Action(() => AppendSimpleLog(formattedMessage))); - return; + rtbOutput.Invoke(new Action(() => AppendSimpleLog(formattedMessage))); // Marshal to UI thread. + return; // Exit current thread path. } - var prefix = _hasAppendedLog ? Environment.NewLine : string.Empty; - rtbOutput.AppendText($"{prefix}{formattedMessage}"); - rtbOutput.SelectionStart = rtbOutput.TextLength; - rtbOutput.ScrollToCaret(); - _hasAppendedLog = true; + var prefix = _hasAppendedLog ? Environment.NewLine : string.Empty; // Insert newline if previous messages exist. + rtbOutput.AppendText($"{prefix}{formattedMessage}"); // Append timestamped message. + rtbOutput.SelectionStart = rtbOutput.TextLength; // Move caret to end to keep view updated. + rtbOutput.ScrollToCaret(); // Auto-scroll so latest text is visible. + _hasAppendedLog = true; // Record that log has content. } + /// + /// Writes text into the advanced output rich text box (used for protocol-level logs), + /// marshaling to the UI thread when invoked from background tasks. + /// private void AppendAdvancedLog(string formattedMessage) { if (rtbAdvOutput.InvokeRequired) { - rtbAdvOutput.Invoke(new Action(() => AppendAdvancedLog(formattedMessage))); - return; + rtbAdvOutput.Invoke(new Action(() => AppendAdvancedLog(formattedMessage))); // Ensure UI-thread access. + return; // Prevent cross-thread access. } - var prefix = _hasAppendedAdvancedLog ? Environment.NewLine : string.Empty; - rtbAdvOutput.AppendText($"{prefix}{formattedMessage}"); - rtbAdvOutput.SelectionStart = rtbAdvOutput.TextLength; - rtbAdvOutput.ScrollToCaret(); - _hasAppendedAdvancedLog = true; + var prefix = _hasAppendedAdvancedLog ? Environment.NewLine : string.Empty; // Add newline after first entry. + rtbAdvOutput.AppendText($"{prefix}{formattedMessage}"); // Append formatted message. + rtbAdvOutput.SelectionStart = rtbAdvOutput.TextLength; // Move caret to end. + rtbAdvOutput.ScrollToCaret(); // Auto-scroll to maintain visibility. + _hasAppendedAdvancedLog = true; // Track that text exists. } + /// + /// Creates a timestamped log message string using millisecond resolution to help correlate + /// serial I/O timing. + /// private string FormatLogMessage(string message) { - return $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; + return $"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - {message}"; // Compose human-readable timestamp + message. } + /// + /// Writes a formatted message to all log panes (simple, advanced, debug) to keep them in sync. + /// private void AppendProtocolLog(string message) { - var formattedMessage = FormatLogMessage(message); - AppendSimpleLog(formattedMessage); - AppendAdvancedLog(formattedMessage); - AppendDebugLog(formattedMessage); + var formattedMessage = FormatLogMessage(message); // Timestamp once for consistency. + AppendSimpleLog(formattedMessage); // User-friendly log. + AppendAdvancedLog(formattedMessage); // Protocol log. + AppendDebugLog(formattedMessage); // Debug log. } + /// + /// Logs an error context with exception details and shows a MessageBox to alert the user. + /// private void LogError(string context, Exception exception) { - var fullMessage = $"{context} Error details: {exception}"; - AppendLogBoth(fullMessage); - MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + var fullMessage = $"{context} Error details: {exception}"; // Combine context and exception message/stack trace. + AppendLogBoth(fullMessage); // Write to logs for persistence. + MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // Display blocking error dialog. } + /// + /// Applies checkbox settings to the protocol instance so TX/RX byte logging aligns with user + /// preferences, and wires the protocol's TxLogger/RxLogger delegates to the UI log writers. + /// private void ApplyProtocolLoggingPreferences() { if (_protocol == null) { - return; + return; // Nothing to configure if no active protocol. } - _protocol.PrintTx = chkbxTXLog.Checked; - _protocol.PrintRx = chkboxRxLog.Checked; + _protocol.PrintTx = chkbxTXLog.Checked; // Mirror checkbox to protocol flag controlling TX byte echo. + _protocol.PrintRx = chkboxRxLog.Checked; // Mirror checkbox to protocol flag controlling RX byte echo. _protocol.TxLogger = message => { - AppendProtocolLog(message); + AppendProtocolLog(message); // Route TX log messages into all log panes. }; _protocol.RxLogger = message => { - AppendProtocolLog(message); + AppendProtocolLog(message); // Route RX log messages into all log panes. }; } + /// + /// Updates protocol TX logging preference when the TX checkbox changes. + /// private void chkbxTXLog_CheckedChanged(object? sender, EventArgs e) { if (_protocol != null) { - _protocol.PrintTx = chkbxTXLog.Checked; + _protocol.PrintTx = chkbxTXLog.Checked; // Immediately reflect UI change in protocol. } } + /// + /// Updates protocol RX logging preference when the RX checkbox changes. + /// private void chkboxRxLog_CheckedChanged(object? sender, EventArgs e) { if (_protocol != null) { - _protocol.PrintRx = chkboxRxLog.Checked; + _protocol.PrintRx = chkboxRxLog.Checked; // Immediately reflect UI change in protocol. } } + /// + /// Convenience wrapper to send a debug message to the dedicated debug log pane. + /// private void LogDebugAction(string message) { - AppendDebugLog(message); + AppendDebugLog(message); // Delegates to AppendDebugLog for thread-safe logging. } + /// + /// Appends text to the debug rich text box with optional timestamping. Invocations from + /// background threads are marshaled to the UI thread to avoid InvalidOperationException. + /// private void AppendDebugLog(string message) { if (rtbDebugOutput.InvokeRequired) { - rtbDebugOutput.Invoke(new Action(() => AppendDebugLog(message))); - return; + rtbDebugOutput.Invoke(new Action(() => AppendDebugLog(message))); // Marshal to UI thread if needed. + return; // Stop processing on worker thread. } - var prefix = _hasAppendedDebugLog ? Environment.NewLine : string.Empty; - var formatted = message.Contains("- ") ? message : FormatLogMessage(message); - rtbDebugOutput.AppendText($"{prefix}{formatted}"); - rtbDebugOutput.SelectionStart = rtbDebugOutput.TextLength; - rtbDebugOutput.ScrollToCaret(); - _hasAppendedDebugLog = true; + var prefix = _hasAppendedDebugLog ? Environment.NewLine : string.Empty; // Add newline after first message. + var formatted = message.Contains("- ") ? message : FormatLogMessage(message); // Preserve existing timestamps if provided. + rtbDebugOutput.AppendText($"{prefix}{formatted}"); // Write to debug output box. + rtbDebugOutput.SelectionStart = rtbDebugOutput.TextLength; // Move caret to end. + rtbDebugOutput.ScrollToCaret(); // Auto-scroll to newest entry. + _hasAppendedDebugLog = true; // Note content exists. } + /// + /// Enables or disables UI controls based on connection state so users cannot issue protocol + /// commands before opening a port. + /// private void UpdateConnectionUi(bool connected) { - btnConnect.Enabled = !connected; - btnDisconnect.Enabled = connected; - btnIdle.Enabled = connected; - btnActive.Enabled = connected; - btnHealthReport.Enabled = connected; - btnReset.Enabled = connected; - btnCopyOutput.Enabled = true; - btnTestFT232.Enabled = !connected; - cmbBxSerialPort.Enabled = !connected; - btnRefresh.Enabled = !connected; - } - + btnConnect.Enabled = !connected; // Disable Connect when connected to prevent double opens. + btnDisconnect.Enabled = connected; // Enable Disconnect to allow clean closure. + btnIdle.Enabled = connected; // Only allow TX toggling when port is open. + btnActive.Enabled = connected; // Only allow TX toggling when port is open. + btnHealthReport.Enabled = connected; // Health report requires open protocol. + btnReset.Enabled = connected; // Reset requires open protocol. + btnCopyOutput.Enabled = true; // Copy is always allowed because it is read-only. + btnTestFT232.Enabled = !connected; // Prevent running FT232 test while another session holds the port. + cmbBxSerialPort.Enabled = !connected; // Lock selection to avoid confusion while connected. + btnRefresh.Enabled = !connected; // Avoid refresh while port is open to prevent handle conflicts. + } + + /// + /// Attempts to disconnect gracefully when the form is closing. This prevents dangling COM + /// handles and leaves TX in idle (safe) state. + /// private async void frmMain_FormClosing(object? sender, FormClosingEventArgs e) { - AppendDebugLog(FormatLogMessage("Form closing requested - attempting clean disconnect.")); + AppendDebugLog(FormatLogMessage("Form closing requested - attempting clean disconnect.")); // Trace closure intent. try { - await DisconnectAsync(false); + await DisconnectAsync(false); // Do not show user messages to avoid blocking closure. } catch (Exception ex) { - AppendDebugLog(FormatLogMessage($"Form closing disconnect encountered an error: {ex.GetType().Name} - {ex.Message}")); + AppendDebugLog(FormatLogMessage($"Form closing disconnect encountered an error: {ex.GetType().Name} - {ex.Message}")); // Log but do not rethrow to avoid crash. } } + /// + /// Stub for RichTextBox text change event; kept for demonstration of event wiring. + /// private void rtbOutput_TextChanged(object sender, EventArgs e) { - + // Could auto-save logs or update counters; not needed currently. } + /// + /// Duplicate combo box change handler generated by designer; kept for completeness. + /// private void cmbBxSerialPort_SelectedIndexChanged_1(object sender, EventArgs e) { - + // All selection logic handled in cmbBxSerialPort_SelectedIndexChanged; this remains empty. } + /// + /// Stub button handler reserved for future UI actions. + /// private void button1_Click(object sender, EventArgs e) { - + // Intentionally left blank to illustrate event handler shape. } + + /// + /// Sends a raw byte (0xAA) and waits for a response to validate echo/loopback behavior on + /// the open serial port. This is similar to a ping test for UART communications. + /// private void btnTestEcho_Click(object sender, EventArgs e) -{ - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on COM{_protocol?.PortName ?? "??"}\n"); - try - { - if (_protocol?.Port.IsOpen != true) { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Serial port not open. Connect first.\n"); - return; - } + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on COM{_protocol?.PortName ?? "??"}\n"); // Timestamp test start with chosen port name. + try + { + if (_protocol?.Port.IsOpen != true) + { + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Serial port not open. Connect first.\n"); // Warn user that port must be open. + return; // Exit early because no active SerialPort exists. + } - // Clear input buffer to avoid stale data - _protocol.Port.DiscardInBuffer(); + _protocol.Port.DiscardInBuffer(); // Clear inbound buffer to remove stale bytes before test. - // Send 0xAA - byte[] send = { 0xAA }; - _protocol.Port.Write(send, 0, 1); - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Sent byte 0xAA.\n"); + byte[] send = { 0xAA }; // Single SYNC-like byte to transmit; echoed devices should return it. + _protocol.Port.Write(send, 0, 1); // Write to UART TX line; FT232 shifts bits out over USB-UART bridge. + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Sent byte 0xAA.\n"); // Confirm transmission to user. - // Try to read one byte, with timeout - int response = _protocol.Port.ReadByte(); // This blocks up to ReadTimeout - if (response >= 0) - { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Received byte: 0x{response:X2}\n"); - } - else - { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - No byte received (timeout).\n"); + int response = _protocol.Port.ReadByte(); // Block up to ReadTimeout waiting for one byte on RX. + if (response >= 0) + { + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Received byte: 0x{response:X2}\n"); // Show returned byte in hex for clarity. + } + else + { + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - No byte received (timeout).\n"); // Note absence of response. + } + } + catch (Exception ex) + { + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Exception: {ex.Message}\n"); // Capture and display any exceptions (IO errors, timeouts). + } } } - catch (Exception ex) - { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Exception: {ex.Message}\n"); - } -} - - } } diff --git a/M18Protocol.cs b/M18Protocol.cs index a967b1e..f9a636f 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -1,43 +1,60 @@ -using System; -using System.Collections.Generic; -using System.IO.Ports; -using System.Linq; -using System.Text; -using System.Threading; -using System.Text.RegularExpressions; +// ************************************************************************************************* +// M18Protocol.cs +// -------------- +// Implements the Milwaukee M18 battery serial protocol in C#. The class encapsulates all UART +// command composition, bit-level encoding/decoding, and register parsing so that the WinForms UI +// (frmMain in M18AnalyzerMain.cs) can simply call high-level methods like Idle(), High(), +// HealthReport(), and Reset(). Control-line manipulation (BreakState and DtrEnable) is used to +// emulate charger signals electrically on the FT232 USB-UART bridge. Extensive comments explain the +// meaning of each operation, including how bytes flow to and from the hardware. +// ************************************************************************************************* + +using System; // Core .NET types including DateTime, Array, and Action delegates. +using System.Collections.Generic; // Collections such as List and IEnumerable. +using System.IO.Ports; // SerialPort class for UART communication and control-line toggling. +using System.Linq; // LINQ helpers like Select, Aggregate, and Take for byte processing. +using System.Text; // StringBuilder for efficient log formatting and byte-to-hex conversion. +using System.Threading; // Thread.Sleep for deterministic protocol timing delays. +using System.Text.RegularExpressions; // Regex for parsing serial numbers and hardware IDs from responses. namespace M18BatteryInfo { /// - /// C# port of the Python M18 protocol implementation. - /// SerialPort.DtrEnable and SerialPort.BreakState map the DTR and BREAK - /// control signals; on platforms where these lines are not supported, an - /// equivalent control-line mechanism must be provided. Timing delays mirror - /// the original behavior but may require platform-specific adjustments when - /// interacting with different serial drivers. + /// C# port of the Python M18 protocol implementation. Wraps to expose + /// high-level methods for toggling TX line states, issuing reset sequences, and reading/writing + /// registers. Control lines map directly to physical UART pins: + /// drives the TX line low (space) while drives the DTR pin, + /// both of which connect to the battery's interface header. The class also formats verbose logs + /// for the WinForms UI to display. /// public class M18Protocol { - public const byte SYNC_BYTE = 0xAA; - public const byte CAL_CMD = 0x55; - public const byte CONF_CMD = 0x60; - public const byte SNAP_CMD = 0x61; - public const byte KEEPALIVE_CMD = 0x62; + // Protocol constants mirroring the Python implementation and datasheets. + public const byte SYNC_BYTE = 0xAA; // Sync byte used to initiate communication and acknowledge reset. + public const byte CAL_CMD = 0x55; // Calibration command identifier (not fully implemented here). + public const byte CONF_CMD = 0x60; // Configuration command base value. + public const byte SNAP_CMD = 0x61; // Snapshot command for specific data reads. + public const byte KEEPALIVE_CMD = 0x62; // Keepalive command to maintain session. - public const int CUTOFF_CURRENT = 300; - public const int MAX_CURRENT = 6000; + // Current limits used when simulating charger load profiles. + public const int CUTOFF_CURRENT = 300; // Milliamps at which discharge is considered complete. + public const int MAX_CURRENT = 6000; // Milliamps representing maximum allowable current draw. - public int Acc { get; private set; } = 4; + public int Acc { get; private set; } = 4; // Protocol accumulator (used by Python port); kept for compatibility. - public bool PrintTx { get; set; } = true; - public bool PrintRx { get; set; } = true; + public bool PrintTx { get; set; } = true; // When true, TX bytes are logged through TxLogger. + public bool PrintRx { get; set; } = true; // When true, RX bytes are logged through RxLogger. + // Delegates that allow the UI to receive protocol events. frmMain sets these to append to rich text boxes. public Action? TxLogger { get; set; } public Action? RxLogger { get; set; } public Action? DebugLogger { get; set; } + // Pre-defined register ranges to request during initial read (mirrors Python data_matrix). private readonly List<(byte AddrMsb, byte AddrLsb, byte Length)> _dataMatrix = new() { + // Each tuple describes a memory address (MSB/LSB) and how many bytes to read. These are + // executed by Cmd(addrMsb, addrLsb, length) in ReadId when forceRefresh is requested. (0x00, 0x00, 0x02), (0x00, 0x02, 0x02), (0x00, 0x04, 0x05), @@ -72,6 +89,7 @@ public class M18Protocol (0xA0, 0x00, 0x06) }; + // Human-readable descriptions for register addresses used by HealthReport and diagnostic reads. private readonly List<(ushort Address, byte Length, string Type, string Label)> _dataId = new() { (0x0000, 2, "uint", "Cell type"), @@ -220,352 +238,409 @@ public class M18Protocol private bool? _savedPrintTx; private bool? _savedPrintRx; - public SerialPort Port => _port; + public SerialPort Port => _port; // Exposes the underlying SerialPort so UI can run diagnostic echo tests. + /// + /// Ensures the serial port is open and the protocol has not been disposed before performing + /// operations. Returns false and logs a message when actions should be skipped. + /// private bool EnsurePortOpen(string operation) { if (_disposed) { - LogDebug($"{operation} skipped because protocol is disposed."); - return false; + LogDebug($"{operation} skipped because protocol is disposed."); // Warn when caller uses disposed instance. + return false; // Abort operation. } if (!_port.IsOpen) { - LogDebug($"{operation} skipped because serial port {_port.PortName} is not open."); - return false; + LogDebug($"{operation} skipped because serial port {_port.PortName} is not open."); // Note closed port state. + return false; // Abort because control lines cannot be toggled on a closed port. } - return true; + return true; // Port is available. } + /// + /// Constructs the protocol handler, opens the specified serial port with correct UART + /// settings (4800 8N2), and immediately drives TX to idle (BreakState/DTR true) to avoid + /// sending unintended pulses to the battery. The optional + /// allows the UI to capture initialization details. + /// public M18Protocol(string portName, Action? debugLogger = null) { - DebugLogger = debugLogger; - LogDebug($"Initializing protocol for port {portName}."); - _port = new SerialPort(portName, 4800, Parity.None, 8, StopBits.Two) + DebugLogger = debugLogger; // Store logger delegate so we can write debug lines throughout the class. + LogDebug($"Initializing protocol for port {portName}."); // Inform caller about port selection. + _port = new SerialPort(portName, 4800, Parity.None, 8, StopBits.Two) // Configure UART to match battery protocol (4800 baud, 8 data bits, 2 stop bits). { - ReadTimeout = 1200, - WriteTimeout = 800 + ReadTimeout = 1200, // Set read timeout so calls to ReadByte() don't hang indefinitely. + WriteTimeout = 800 // Set write timeout to fail fast if driver stalls. }; - LogDebug("Opening serial port..."); - _port.Open(); - LogDebug("Serial port opened. Setting TX to idle state."); - Idle(); - LogDebug("Protocol initialization complete."); + LogDebug("Opening serial port..."); // Trace start of open call. + _port.Open(); // Acquire OS handle; this toggles control lines to default states. + LogDebug("Serial port opened. Setting TX to idle state."); // Notify that handle is open. + Idle(); // Immediately assert BreakState/DTR to drive TX low; prevents spurious high pulses on battery pin. + LogDebug("Protocol initialization complete."); // Signal completion. } - public string PortName => _port.PortName; - public bool IsOpen => _port.IsOpen; + public string PortName => _port.PortName; // Convenience property used by frmMain for display and comparisons. + public bool IsOpen => _port.IsOpen; // Exposes port state so UI can check connectivity. + /// + /// Reverses the bit order of a byte (LSB to MSB) because the protocol transmits bytes with + /// bits reversed relative to how they are represented in memory. This mirrors Python's + /// reverse_bits function and is applied before sending/after receiving. + /// public byte ReverseBits(byte value) { - LogDebug($"ReverseBits called with value 0x{value:X2}."); - byte reversed = 0; + LogDebug($"ReverseBits called with value 0x{value:X2}."); // Trace incoming value. + byte reversed = 0; // Start with zero so we can shift bits in. for (int i = 0; i < 8; i++) { - reversed <<= 1; - reversed |= (byte)((value >> i) & 0x01); + reversed <<= 1; // Make room for next bit by shifting left. + reversed |= (byte)((value >> i) & 0x01); // Extract bit i from original (LSB-first) and OR into result. } - LogDebug($"ReverseBits returning 0x{reversed:X2}."); - return reversed; + LogDebug($"ReverseBits returning 0x{reversed:X2}."); // Trace output for debugging. + return reversed; // Return reversed byte used for MSB-first serial I/O. } + /// + /// Computes a simple additive checksum across the provided payload (sum of bytes, mod 2^16). + /// The M18 protocol appends this 16-bit checksum to commands to help the battery validate + /// data integrity. + /// public int Checksum(IEnumerable payload) { if (payload == null) { - LogDebug("Checksum called with null payload."); - throw new ArgumentNullException(nameof(payload)); + LogDebug("Checksum called with null payload."); // Guard against null reference misuse. + throw new ArgumentNullException(nameof(payload)); // Propagate argument error to caller. } - LogDebug("Checksum calculation started."); - int checksum = 0; + LogDebug("Checksum calculation started."); // Trace operation. + int checksum = 0; // Initialize accumulator. foreach (var b in payload) { - checksum += b & 0xFFFF; + checksum += b & 0xFFFF; // Add each byte value; mask not strictly necessary but keeps parity with Python implementation. } - LogDebug($"Checksum calculation complete: {checksum & 0xFFFF}."); - return checksum; + LogDebug($"Checksum calculation complete: {checksum & 0xFFFF}."); // Trace final checksum (16-bit value). + return checksum; // Return full integer; caller masks to 16 bits when writing bytes. } + /// + /// Appends a 2-byte checksum to the provided payload (LSB first). The checksum is computed + /// using and returned as a new byte array ready for + /// transmission over the UART. + /// public byte[] AddChecksum(byte[] lsbCommand) { if (lsbCommand == null) { - LogDebug("AddChecksum called with null lsbCommand."); - throw new ArgumentNullException(nameof(lsbCommand)); + LogDebug("AddChecksum called with null lsbCommand."); // Alert misuse. + throw new ArgumentNullException(nameof(lsbCommand)); // Throw to fail fast. } - LogDebug($"AddChecksum called for payload length {lsbCommand.Length}."); - int checksum = Checksum(lsbCommand); - var withChecksum = new byte[lsbCommand.Length + 2]; - Buffer.BlockCopy(lsbCommand, 0, withChecksum, 0, lsbCommand.Length); + LogDebug($"AddChecksum called for payload length {lsbCommand.Length}."); // Trace size for debugging. + int checksum = Checksum(lsbCommand); // Compute additive checksum. + var withChecksum = new byte[lsbCommand.Length + 2]; // Allocate new array with two extra bytes. + Buffer.BlockCopy(lsbCommand, 0, withChecksum, 0, lsbCommand.Length); // Copy original payload into new array. - withChecksum[withChecksum.Length - 2] = (byte)((checksum >> 8) & 0xFF); - withChecksum[withChecksum.Length - 1] = (byte)(checksum & 0xFF); + withChecksum[withChecksum.Length - 2] = (byte)((checksum >> 8) & 0xFF); // Append high byte of checksum. + withChecksum[withChecksum.Length - 1] = (byte)(checksum & 0xFF); // Append low byte of checksum. - LogDebug($"Checksum {checksum & 0xFFFF} appended. Final payload: {FormatBytes(withChecksum)}."); - return withChecksum; + LogDebug($"Checksum {checksum & 0xFFFF} appended. Final payload: {FormatBytes(withChecksum)}."); // Trace final buffer for logging panel. + return withChecksum; // Return ready-to-send buffer (LSB-ordered before bit reversal). } + /// + /// Sends a prepared command (LSB bit order) over the serial port after reversing bits for + /// MSB-first transmission. Also logs the TX bytes when requested. + /// public void Send(byte[] command) { if (command == null) { - LogDebug("Send called with null command."); - throw new ArgumentNullException(nameof(command)); + LogDebug("Send called with null command."); // Guard against misuse. + throw new ArgumentNullException(nameof(command)); // Fail fast to avoid null reference. } if (!EnsurePortOpen("Send")) { - return; + return; // Skip when port unavailable. } - LogDebug($"Send called with command length {command.Length}. Raw payload: {FormatBytes(command)}."); + LogDebug($"Send called with command length {command.Length}. Raw payload: {FormatBytes(command)}."); // Trace outgoing payload. try { - _port.DiscardInBuffer(); - LogDebug("Input buffer discarded prior to send."); + _port.DiscardInBuffer(); // Clear any stale incoming bytes to avoid mixing responses. + LogDebug("Input buffer discarded prior to send."); // Confirm buffer clear. } catch (Exception ex) when (ex is InvalidOperationException || ex is ObjectDisposedException) { - LogDebug($"DiscardInBuffer skipped because port is not available: {ex.GetType().Name} - {ex.Message}"); + LogDebug($"DiscardInBuffer skipped because port is not available: {ex.GetType().Name} - {ex.Message}"); // Log and exit if port not usable. return; } - var msb = new byte[command.Length]; + var msb = new byte[command.Length]; // Allocate buffer for bit-reversed bytes. for (int i = 0; i < command.Length; i++) { - msb[i] = ReverseBits(command[i]); + msb[i] = ReverseBits(command[i]); // Reverse each byte so bits are transmitted MSB-first as device expects. } if (PrintTx) { - var builder = new StringBuilder(); + var builder = new StringBuilder(); // Build hex string for UI logging. for (int i = 0; i < command.Length; i++) { - builder.Append(command[i].ToString("X2")); + builder.Append(command[i].ToString("X2")); // Append LSB-order byte for readability. if (i < command.Length - 1) { - builder.Append(' '); + builder.Append(' '); // Separate bytes with spaces for clarity. } } - var logMessage = $"TX: {builder}"; - TxLogger?.Invoke(logMessage); - Console.WriteLine(logMessage); + var logMessage = $"TX: {builder}"; // Prefix with TX for disambiguation in UI. + TxLogger?.Invoke(logMessage); // Notify UI logger delegate to show in rich text box. + Console.WriteLine(logMessage); // Also emit to console (useful when running headless). } try { - _port.Write(msb, 0, msb.Length); - LogDebug($"Command sent over serial: {FormatBytes(msb)} (MSB)."); + _port.Write(msb, 0, msb.Length); // Stream bytes over UART using FT232 driver; TX pin toggles bits on physical line. + LogDebug($"Command sent over serial: {FormatBytes(msb)} (MSB)."); // Trace MSB-encoded payload. } catch (Exception ex) when (ex is InvalidOperationException || ex is ObjectDisposedException) { - LogDebug($"Send aborted because port is not available: {ex.GetType().Name} - {ex.Message}"); + LogDebug($"Send aborted because port is not available: {ex.GetType().Name} - {ex.Message}"); // Note failure without throwing to allow UI recovery. } } + /// + /// Adds a checksum to the provided command and transmits it via . + /// public void SendCommand(byte[] command) { - LogDebug("SendCommand invoked."); - Send(AddChecksum(command)); + LogDebug("SendCommand invoked."); // Trace wrapper usage. + Send(AddChecksum(command)); // Compose checksumed payload then send. } + /// + /// Reads a response of the specified size, reversing bits back to LSB order and logging when + /// enabled. Throws InvalidOperationException on timeout to mirror Python behavior. + /// public byte[] ReadResponse(int size) { if (!EnsurePortOpen("ReadResponse")) { - return Array.Empty(); + return Array.Empty(); // Return empty array when port unavailable. } - LogDebug($"ReadResponse called with expected size {size}."); + LogDebug($"ReadResponse called with expected size {size}."); // Trace expected length. int firstByte; try { - firstByte = _port.ReadByte(); + firstByte = _port.ReadByte(); // Block for first byte from RX line. } catch (InvalidOperationException ex) { - LogDebug($"ReadResponse skipped because port is unavailable: {ex.GetType().Name} - {ex.Message}"); - return Array.Empty(); + LogDebug($"ReadResponse skipped because port is unavailable: {ex.GetType().Name} - {ex.Message}"); // Log closed/ disposed port. + return Array.Empty(); // Return nothing to caller. } catch (TimeoutException) { - LogDebug("ReadResponse timed out waiting for first byte."); - throw new InvalidOperationException("Empty response"); + LogDebug("ReadResponse timed out waiting for first byte."); // Trace timeout event. + throw new InvalidOperationException("Empty response"); // Match Python exception semantics for caller. } if (firstByte < 0) { - LogDebug("ReadResponse encountered invalid first byte (<0)."); - throw new InvalidOperationException("Empty response"); + LogDebug("ReadResponse encountered invalid first byte (<0)."); // Negative return indicates stream ended. + throw new InvalidOperationException("Empty response"); // Propagate error. } - var msbResponse = new List { (byte)firstByte }; - int remaining = ReverseBits((byte)firstByte) == 0x82 ? 1 : Math.Max(0, size - 1); + var msbResponse = new List { (byte)firstByte }; // Seed response with first MSB-ordered byte. + int remaining = ReverseBits((byte)firstByte) == 0x82 ? 1 : Math.Max(0, size - 1); // If first LSB byte equals 0x82 (after reversing), expect one more byte; otherwise size-1. - LogDebug($"First byte received (MSB): 0x{firstByte:X2}. Calculated remaining bytes to read: {remaining}."); + LogDebug($"First byte received (MSB): 0x{firstByte:X2}. Calculated remaining bytes to read: {remaining}."); // Trace first byte and expected remaining count. if (remaining > 0) { - LogDebug($"Reading remaining {remaining} byte(s) from serial port."); - msbResponse.AddRange(ReadAvailable(remaining)); + LogDebug($"Reading remaining {remaining} byte(s) from serial port."); // Note continuation. + msbResponse.AddRange(ReadAvailable(remaining)); // Read remaining bytes using buffered helper. } - var lsbResponse = msbResponse.Select(ReverseBits).ToArray(); + var lsbResponse = msbResponse.Select(ReverseBits).ToArray(); // Convert MSB-ordered bytes back to LSB representation for processing. - LogDebug($"Full response received (LSB): {FormatBytes(lsbResponse)}."); + LogDebug($"Full response received (LSB): {FormatBytes(lsbResponse)}."); // Trace final decoded response. if (PrintRx) { - var builder = new StringBuilder(); + var builder = new StringBuilder(); // Build hex string for logs. for (int i = 0; i < lsbResponse.Length; i++) { - builder.Append(lsbResponse[i].ToString("X2")); + builder.Append(lsbResponse[i].ToString("X2")); // Append each byte in hex. if (i < lsbResponse.Length - 1) { - builder.Append(' '); + builder.Append(' '); // Separate with space. } } - var logMessage = $"RX: {builder}"; - RxLogger?.Invoke(logMessage); - Console.WriteLine(logMessage); + var logMessage = $"RX: {builder}"; // Prefix to indicate receive direction. + RxLogger?.Invoke(logMessage); // Notify UI logger delegate. + Console.WriteLine(logMessage); // Emit to console for CLI scenarios. } - return lsbResponse; + return lsbResponse; // Return decoded payload to caller for further parsing. } + /// + /// Issues a reset sequence to the battery by toggling Break/DTR (TX line) low/high and + /// sending the SYNC byte. Retries up to three times and waits for SYNC acknowledgement. + /// public bool Reset() { - LogDebug("Reset invoked. Driving control lines to issue reset sequence."); - Acc = 4; + LogDebug("Reset invoked. Driving control lines to issue reset sequence."); // Trace action. + Acc = 4; // Reset accumulator to default as in Python implementation. if (!EnsurePortOpen("Reset")) { - return false; + return false; // Abort if port unavailable. } for (var attempt = 1; attempt <= 3; attempt++) { - LogDebug($"Reset attempt {attempt} starting."); + LogDebug($"Reset attempt {attempt} starting."); // Indicate retry count. - _port.DiscardInBuffer(); - _port.BreakState = true; - _port.DtrEnable = true; - Thread.Sleep(300); + _port.DiscardInBuffer(); // Clear any pending bytes to avoid misinterpreting stale data. + _port.BreakState = true; // Drive TX low (logic 0) to assert BREAK on physical line. + _port.DtrEnable = true; // Assert DTR; both pins go low relative to idle high. + Thread.Sleep(300); // Hold low for 300 ms to meet battery reset timing. - _port.BreakState = false; - _port.DtrEnable = false; - Thread.Sleep(300); + _port.BreakState = false; // Release BREAK to drive TX high. + _port.DtrEnable = false; // Release DTR to high. + Thread.Sleep(300); // Hold high allowing BMS to recognize edge transition. - Send(new[] { SYNC_BYTE }); + Send(new[] { SYNC_BYTE }); // Transmit SYNC byte (0xAA) which the battery should echo. try { - LogDebug("Awaiting reset response after SYNC byte."); - var response = ReadResponse(1); - var success = response.Length > 0 && response[0] == SYNC_BYTE; - LogDebug($"Reset response {(success ? "acknowledged" : "did not match expected SYNC")}."); + LogDebug("Awaiting reset response after SYNC byte."); // Trace waiting state. + var response = ReadResponse(1); // Expect single byte echo. + var success = response.Length > 0 && response[0] == SYNC_BYTE; // Evaluate acknowledgement. + LogDebug($"Reset response {(success ? \"acknowledged\" : \"did not match expected SYNC\")}."); // Report result. if (success) { - Thread.Sleep(10); - return true; + Thread.Sleep(10); // Brief pause to stabilize before further commands. + return true; // Signal reset success. } } catch (InvalidOperationException ex) { - LogDebug($"Reset attempt {attempt} failed: {ex.GetType().Name} - {ex.Message}"); + LogDebug($"Reset attempt {attempt} failed: {ex.GetType().Name} - {ex.Message}"); // Report timeout or read issues. } - Thread.Sleep(50); + Thread.Sleep(50); // Small delay before next retry to avoid hammering BMS. } - LogDebug("All reset attempts exhausted without a response."); - return false; + LogDebug("All reset attempts exhausted without a response."); // Final failure message. + return false; // Indicate reset failed. } + /// + /// Drives TX line low (idle state). On FT232 this sets BreakState=true and DtrEnable=true, + /// effectively forcing the TX pin to a continuous logic 0 level and asserting DTR. + /// public void Idle() { - LogDebug("Setting TX to Idle (BreakState=true, DtrEnable=true)."); + LogDebug("Setting TX to Idle (BreakState=true, DtrEnable=true)."); // Describe electrical intent. if (!EnsurePortOpen("Idle")) { - return; + return; // Abort if port not open. } - _port.BreakState = true; - _port.DtrEnable = true; + _port.BreakState = true; // Assert BREAK -> TX held low (space). + _port.DtrEnable = true; // Assert DTR -> control line low. } + /// + /// Drives TX line high (active state). On FT232 this clears BreakState and DtrEnable so the + /// TX pin idles high (mark) like a charger presenting voltage on the comms pin. + /// public void High() { - LogDebug("Setting TX to Active (BreakState=false, DtrEnable=false)."); + LogDebug("Setting TX to Active (BreakState=false, DtrEnable=false)."); // Describe electrical intent. if (!EnsurePortOpen("High")) { - return; + return; // Abort if port not open. } - _port.BreakState = false; - _port.DtrEnable = false; + _port.BreakState = false; // Release BREAK -> TX goes high. + _port.DtrEnable = false; // Release DTR -> line returns to deasserted state. } + /// + /// Returns a textual summary of TX control-line states for debugging, including whether the + /// serial port is open and whether the protocol has been disposed. + /// public string GetTxStateSummary(string caller) { try { - var disposedText = _disposed ? "disposed" : "active"; - var openState = _port.IsOpen ? "open" : "closed"; + var disposedText = _disposed ? "disposed" : "active"; // Human-readable disposed state. + var openState = _port.IsOpen ? "open" : "closed"; // Human-readable port state. if (!_port.IsOpen) { - return $"{caller}: Port {_port.PortName} is {openState} and protocol is {disposedText}; TX state unavailable."; + return $"{caller}: Port {_port.PortName} is {openState} and protocol is {disposedText}; TX state unavailable."; // Indicate missing state when port closed. } - return $"{caller}: Port {_port.PortName} is {openState} and protocol is {disposedText}. BreakState={_port.BreakState}, DtrEnable={_port.DtrEnable}."; + return $"{caller}: Port {_port.PortName} is {openState} and protocol is {disposedText}. BreakState={_port.BreakState}, DtrEnable={_port.DtrEnable}."; // Provide detailed control-line flags. } catch (Exception ex) { - LogDebug($"Error while retrieving TX state: {ex.GetType().Name} - {ex.Message}"); - return $"{caller}: TX state unavailable due to error."; + LogDebug($"Error while retrieving TX state: {ex.GetType().Name} - {ex.Message}"); // Handle rare cases where SerialPort throws. + return $"{caller}: TX state unavailable due to error."; // Graceful fallback. } } + /// + /// Gathers a detailed human-readable health report by reading multiple registers from the + /// battery BMS. Temporarily disables TX/RX printing for performance, then restores settings. + /// public string HealthReport() { if (_disposed) { - return "Protocol disposed; health report unavailable."; + return "Protocol disposed; health report unavailable."; // Prevent operations on disposed object. } - LogDebug("Generating HealthReport summary."); + LogDebug("Generating HealthReport summary."); // Trace start. var regList = new List { - 4, 28, 25, 26, 12, 13, 18, 29, 39, 40, 41, 42, 43, 33, 32, 31, 35, 36, 38 + 4, 28, 25, 26, 12, 13, 18, 29, 39, 40, 41, 42, 43, 33, 32, 31, 35, 36, 38 // Predefined register indices capturing manufacturing data, temps, counters. }; - regList.AddRange(Enumerable.Range(44, 20)); - regList.AddRange(new[] { 8, 2 }); + regList.AddRange(Enumerable.Range(44, 20)); // Add range covering tool-use histogram registers. + regList.AddRange(new[] { 8, 2 }); // Append serial number and manufacture date indices. - TxRxSaveAndSet(false); + TxRxSaveAndSet(false); // Temporarily disable TX/RX logging to reduce noise during bulk reads. try { - var values = ReadId(regList, true); + var values = ReadId(regList, true); // Perform forced refresh using Cmd calls to populate registers. if (values == null || values.Count != regList.Count) { - return "Health report failed: incomplete data returned."; + return "Health report failed: incomplete data returned."; // Early exit when data missing. } var builder = new StringBuilder(); - builder.AppendLine("Reading battery. This will take 5-10sec\n"); + builder.AppendLine("Reading battery. This will take 5-10sec\n"); // Explain expected timing to user. - var serialInfo = values[^1] as string ?? string.Empty; - var matches = Regex.Matches(serialInfo, "\\d+\\.?\\d*"); - var batType = matches.Count > 0 ? matches[0].Value : ""; - var eSerial = matches.Count > 1 ? matches[1].Value : ""; + var serialInfo = values[^1] as string ?? string.Empty; // Retrieve serial number string from last entry. + var matches = Regex.Matches(serialInfo, "\\d+\\.?\\d*"); // Extract numeric tokens (battery type and e-serial). + var batType = matches.Count > 0 ? matches[0].Value : ""; // Battery type code from response. + var eSerial = matches.Count > 1 ? matches[1].Value : ""; // Electronic serial number. + // Lookup table converting battery type codes to capacities and marketing descriptions. var batLookup = new Dictionary { {"36", (1.5, "1.5Ah CP (5s1p 18650)")}, @@ -586,330 +661,370 @@ public string HealthReport() {"384", (12, "12Ah Forge (5s3p 21700 tabless)")} }; - var batteryDetails = batLookup.TryGetValue(batType, out var details) ? details : (0d, "Unknown"); - builder.AppendLine($"Type: {batType} [{batteryDetails.Item2}]"); - builder.AppendLine($"E-serial: {eSerial} (does NOT match case serial)"); + var batteryDetails = batLookup.TryGetValue(batType, out var details) ? details : (0d, "Unknown"); // Default to unknown if type not in table. + builder.AppendLine($"Type: {batType} [{batteryDetails.Item2}]"); // Show battery type and description. + builder.AppendLine($"E-serial: {eSerial} (does NOT match case serial)"); // Clarify that electronic serial differs from label. - var batNow = values[^2] as DateTime? ?? DateTime.UtcNow; - var manufactureDate = values[0] as DateTime?; + var batNow = values[^2] as DateTime? ?? DateTime.UtcNow; // Use current timestamp from BMS if available, else fallback to UTC now. + var manufactureDate = values[0] as DateTime?; // Manufacture date from register 0. if (manufactureDate.HasValue) { - builder.AppendLine($"Manufacture date: {manufactureDate:yyyy-MM-dd}"); + builder.AppendLine($"Manufacture date: {manufactureDate:yyyy-MM-dd}"); // Format date for readability. } - builder.AppendLine($"Days since 1st charge: {values[1]}"); - builder.AppendLine($"Days since last tool use: {(batNow - ((DateTime?)values[2] ?? batNow)).Days}"); - builder.AppendLine($"Days since last charge: {(batNow - ((DateTime?)values[3] ?? batNow)).Days}"); + builder.AppendLine($"Days since 1st charge: {values[1]}"); // Raw counter from BMS. + builder.AppendLine($"Days since last tool use: {(batNow - ((DateTime?)values[2] ?? batNow)).Days}"); // Compute days difference using BMS timestamp. + builder.AppendLine($"Days since last charge: {(batNow - ((DateTime?)values[3] ?? batNow)).Days}"); // Similar calculation for last charge. if (values[4] is List cellVoltages) { - var totalVoltage = cellVoltages.Sum() / 1000.0; - builder.AppendLine($"Pack voltage: {totalVoltage}"); - builder.AppendLine($"Cell Voltages (mV): {string.Join(", ", cellVoltages)}"); - builder.AppendLine($"Cell Imbalance (mV): {cellVoltages.Max() - cellVoltages.Min()}"); + var totalVoltage = cellVoltages.Sum() / 1000.0; // Convert total mV to V for readability. + builder.AppendLine($"Pack voltage: {totalVoltage}"); // Show pack voltage. + builder.AppendLine($"Cell Voltages (mV): {string.Join(\", \", cellVoltages)}"); // List individual cell voltages. + builder.AppendLine($"Cell Imbalance (mV): {cellVoltages.Max() - cellVoltages.Min()}"); // Compute imbalance as diagnostic metric. } if (values[5] != null) { - builder.AppendLine($"Temperature (deg C): {values[5]}"); + builder.AppendLine($"Temperature (deg C): {values[5]}"); // First temperature reading (non-Forge). } if (values[6] != null) { - builder.AppendLine($"Temperature (deg C): {values[6]}"); + builder.AppendLine($"Temperature (deg C): {values[6]}"); // Second temperature reading (Forge). } - builder.AppendLine("\nCHARGING STATS:"); - builder.AppendLine($"Charge count [Redlink, dumb, (total)]: {values[13]}, {values[14]}, ({values[15]})"); - builder.AppendLine($"Total charge time: {values[16]}"); - builder.AppendLine($"Time idling on charger: {values[17]}"); - builder.AppendLine($"Low-voltage charges (any cell <2.5V): {values[18]}"); + builder.AppendLine("\nCHARGING STATS:"); // Section header for charging metrics. + builder.AppendLine($"Charge count [Redlink, dumb, (total)]: {values[13]}, {values[14]}, ({values[15]})"); // Show charge counters from BMS. + builder.AppendLine($"Total charge time: {values[16]}"); // Aggregate charging duration. + builder.AppendLine($"Time idling on charger: {values[17]}"); // Time spent at full charge on charger. + builder.AppendLine($"Low-voltage charges (any cell <2.5V): {values[18]}"); // Count of deep-charge events. - builder.AppendLine("\nTOOL USE STATS:"); - var totalDischarge = Convert.ToDouble(values[7] ?? 0); - builder.AppendLine($"Total discharge (Ah): {totalDischarge / 3600:0.00}"); + builder.AppendLine("\nTOOL USE STATS:"); // Section header for discharge metrics. + var totalDischarge = Convert.ToDouble(values[7] ?? 0); // Retrieve total discharge in amp-seconds. + builder.AppendLine($"Total discharge (Ah): {totalDischarge / 3600:0.00}"); // Convert to amp-hours (1 Ah = 3600 As). var totalDischargeCycles = batteryDetails.Item1 != 0 ? $"{totalDischarge / 3600 / batteryDetails.Item1:0.00}" - : "Unknown battery type, unable to calculate"; - builder.AppendLine($"Total discharge cycles: {totalDischargeCycles}"); - builder.AppendLine($"Times discharged to empty: {values[8]}"); - builder.AppendLine($"Times overheated: {values[9]}"); - builder.AppendLine($"Overcurrent events: {values[10]}"); - builder.AppendLine($"Low-voltage events: {values[11]}"); - builder.AppendLine($"Low-voltage bounce/stutter: {values[12]}"); + : "Unknown battery type, unable to calculate"; // Estimate equivalent full cycles using capacity. + builder.AppendLine($"Total discharge cycles: {totalDischargeCycles}"); // Show calculated cycles or warning. + builder.AppendLine($"Times discharged to empty: {values[8]}"); // Count of deep discharges. + builder.AppendLine($"Times overheated: {values[9]}"); // Count of thermal events. + builder.AppendLine($"Overcurrent events: {values[10]}"); // Count of current-limit trips. + builder.AppendLine($"Low-voltage events: {values[11]}"); // Count of low-voltage warnings. + builder.AppendLine($"Low-voltage bounce/stutter: {values[12]}"); // Count of repeated low-voltage flickers. - var toolTime = Enumerable.Range(19, 20).Sum(i => Convert.ToInt32(values[i] ?? 0)); - builder.AppendLine($"Total time on tool (>10A): {TimeSpan.FromSeconds(toolTime)}"); + var toolTime = Enumerable.Range(19, 20).Sum(i => Convert.ToInt32(values[i] ?? 0)); // Sum histogram buckets to compute total heavy-load time. + builder.AppendLine($"Total time on tool (>10A): {TimeSpan.FromSeconds(toolTime)}"); // Convert seconds to TimeSpan for readability. for (int i = 19; i < 38; i++) { - var seconds = Convert.ToInt32(values[i] ?? 0); - var pct = toolTime > 0 ? Math.Round(seconds / (double)toolTime * 100) : 0; - var bar = new string('X', (int)pct); - var ampRange = $"{(i - 18) * 10}-{(i - 17) * 10}A"; - builder.AppendLine($"Time @ {ampRange,8}: {TimeSpan.FromSeconds(seconds)} {pct,2:0}% {bar}"); + var seconds = Convert.ToInt32(values[i] ?? 0); // Seconds spent in current band. + var pct = toolTime > 0 ? Math.Round(seconds / (double)toolTime * 100) : 0; // Percent of total tool time. + var bar = new string('X', (int)pct); // Simple ASCII bar graph showing relative time share. + var ampRange = $"{(i - 18) * 10}-{(i - 17) * 10}A"; // Human-readable current band (e.g., 10-20A). + builder.AppendLine($"Time @ {ampRange,8}: {TimeSpan.FromSeconds(seconds)} {pct,2:0}% {bar}"); // Log per-band usage. } - var lastSeconds = Convert.ToInt32(values[38] ?? 0); - var lastPct = toolTime > 0 ? Math.Round(lastSeconds / (double)toolTime * 100) : 0; - var lastBar = new string('X', (int)lastPct); - builder.AppendLine($"Time @ {"> 200A",8}: {TimeSpan.FromSeconds(lastSeconds)} {lastPct,2:0}% {lastBar}"); + var lastSeconds = Convert.ToInt32(values[38] ?? 0); // >200A bucket seconds. + var lastPct = toolTime > 0 ? Math.Round(lastSeconds / (double)toolTime * 100) : 0; // Percent for final bucket. + var lastBar = new string('X', (int)lastPct); // ASCII bar for final bucket. + builder.AppendLine($"Time @ {\"> 200A\",8}: {TimeSpan.FromSeconds(lastSeconds)} {lastPct,2:0}% {lastBar}"); // Show extreme current usage. - return builder.ToString().TrimEnd(); + return builder.ToString().TrimEnd(); // Return compiled report with trailing newline trimmed. } catch (Exception ex) { - LogDebug($"HealthReport failed: {ex.GetType().Name} - {ex.Message}"); - return "Health report failed. Check battery is connected and you have correct serial port."; + LogDebug($"HealthReport failed: {ex.GetType().Name} - {ex.Message}"); // Trace exception for UI. + return "Health report failed. Check battery is connected and you have correct serial port."; // Friendly error message. } finally { - TxRxRestore(); + TxRxRestore(); // Restore TX/RX logging flags so UI settings persist. } } + /// + /// Reads a list of register IDs, optionally forcing a refresh by issuing pre-defined Cmd + /// calls that load data into the battery's staging registers. Each register is parsed using + /// metadata in . + /// public List? ReadId(IEnumerable? idArray, bool forceRefresh) { - var ids = idArray?.ToList() ?? Enumerable.Range(0, _dataId.Count).ToList(); - var results = new List(); + var ids = idArray?.ToList() ?? Enumerable.Range(0, _dataId.Count).ToList(); // Use provided IDs or default to all. + var results = new List(); // Holds parsed values in same order as ids. try { - Reset(); + Reset(); // Reset communication before reading to ensure clean state. if (forceRefresh) { foreach (var (addrMsb, addrLsb, length) in _dataMatrix) { - Cmd(addrMsb, addrLsb, length, (byte)(length + 5)); + Cmd(addrMsb, addrLsb, length, (byte)(length + 5)); // Preload battery staging registers to update telemetry. } - Idle(); - Thread.Sleep(100); + Idle(); // Return TX to safe idle state after batch. + Thread.Sleep(100); // Small delay to let BMS process staged reads. } - Reset(); + Reset(); // Perform another reset so subsequent reads start from known state. foreach (var i in ids) { if (i < 0 || i >= _dataId.Count) { - results.Add(null); + results.Add(null); // Insert null for invalid indices to preserve order. continue; } - var (address, length, dataType, _) = _dataId[i]; - var addrMsb = (byte)((address >> 8) & 0xFF); - var addrLsb = (byte)(address & 0xFF); + var (address, length, dataType, _) = _dataId[i]; // Retrieve metadata (address, length, type). + var addrMsb = (byte)((address >> 8) & 0xFF); // Extract high byte of address. + var addrLsb = (byte)(address & 0xFF); // Extract low byte of address. - var response = Cmd(addrMsb, addrLsb, (byte)length, (byte)(length + 5)); - if (response.Length >= 4 && response[0] == 0x81) + var response = Cmd(addrMsb, addrLsb, (byte)length, (byte)(length + 5)); // Issue command to read register. + if (response.Length >= 4 && response[0] == 0x81) // 0x81 indicates valid response header. { - var data = response.Skip(3).Take(length).ToArray(); - results.Add(ParseData(data, dataType)); + var data = response.Skip(3).Take(length).ToArray(); // Skip header/checksum bytes to isolate payload. + results.Add(ParseData(data, dataType)); // Parse to appropriate .NET type (date, int, string). } else { - results.Add(null); + results.Add(null); // Insert null when response not valid/complete. } } - Idle(); - return results; + Idle(); // Return TX to idle after reads. + return results; // Deliver parsed list to caller. } catch (Exception ex) { - LogDebug($"ReadId failed: {ex.GetType().Name} - {ex.Message}"); - return null; + LogDebug($"ReadId failed: {ex.GetType().Name} - {ex.Message}"); // Trace failure. + return null; // Indicate failure to caller. } } + /// + /// Saves current TX/RX print flags and sets both to the provided value. Used to temporarily + /// silence logging during bulk operations. + /// public void TxRxSaveAndSet(bool value) { - _savedPrintTx = PrintTx; - _savedPrintRx = PrintRx; - PrintTx = value; - PrintRx = value; + _savedPrintTx = PrintTx; // Cache current TX flag. + _savedPrintRx = PrintRx; // Cache current RX flag. + PrintTx = value; // Apply new value. + PrintRx = value; // Apply new value. } + /// + /// Restores TX/RX print flags previously captured by . + /// public void TxRxRestore() { if (_savedPrintTx.HasValue) { - PrintTx = _savedPrintTx.Value; - _savedPrintTx = null; + PrintTx = _savedPrintTx.Value; // Restore cached TX flag. + _savedPrintTx = null; // Clear cache. } if (_savedPrintRx.HasValue) { - PrintRx = _savedPrintRx.Value; - _savedPrintRx = null; + PrintRx = _savedPrintRx.Value; // Restore cached RX flag. + _savedPrintRx = null; // Clear cache. } } + /// + /// Parses raw byte data returned from the battery according to the specified type string. + /// Converts to ints, dates, ASCII strings, serial numbers, temperatures, or cell voltage lists. + /// private object? ParseData(byte[] data, string dataType) { switch (dataType) { case "uint": - return data.Aggregate(0, (current, b) => (current << 8) + b); + return data.Aggregate(0, (current, b) => (current << 8) + b); // Big-endian integer conversion. case "date": - var seconds = data.Aggregate(0L, (current, b) => (current << 8) + b); - return DateTimeOffset.FromUnixTimeSeconds(seconds).UtcDateTime; + var seconds = data.Aggregate(0L, (current, b) => (current << 8) + b); // Convert to Unix epoch seconds. + return DateTimeOffset.FromUnixTimeSeconds(seconds).UtcDateTime; // Convert to UTC DateTime for display. case "hhmmss": - var duration = data.Aggregate(0, (current, b) => (current << 8) + b); - var mmss = TimeSpan.FromSeconds(duration); - return $"{(int)mmss.TotalHours}:{mmss.Minutes:00}:{mmss.Seconds:00}"; + var duration = data.Aggregate(0, (current, b) => (current << 8) + b); // Convert to total seconds. + var mmss = TimeSpan.FromSeconds(duration); // Create TimeSpan to format HH:MM:SS. + return $"{(int)mmss.TotalHours}:{mmss.Minutes:00}:{mmss.Seconds:00}"; // Return formatted string. case "ascii": - return Encoding.UTF8.GetString(data); + return Encoding.UTF8.GetString(data); // Interpret payload as UTF-8 text. case "sn": - var btype = (data[0] << 8) + data[1]; - var serial = (data[2] << 16) + (data[3] << 8) + data[4]; - return $"Type: {btype,3}, Serial: {serial}"; + var btype = (data[0] << 8) + data[1]; // Battery type code from first two bytes. + var serial = (data[2] << 16) + (data[3] << 8) + data[4]; // 24-bit serial value from remaining bytes. + return $"Type: {btype,3}, Serial: {serial}"; // Compose friendly serial string. case "adc_t": - var adcValue = data.Aggregate(0, (current, b) => (current << 8) + b); - return CalculateTemperature(adcValue); + var adcValue = data.Aggregate(0, (current, b) => (current << 8) + b); // Convert ADC reading to integer. + return CalculateTemperature(adcValue); // Convert ADC to approximate temperature. case "dec_t": - return Math.Round(data[0] + data[1] / 256.0, 2); + return Math.Round(data[0] + data[1] / 256.0, 2); // Temperature stored as integer + fractional part (1/256). case "cell_v": - var cellVoltages = new List(); + var cellVoltages = new List(); // Prepare list for each cell voltage. for (var i = 0; i < data.Length; i += 2) { - cellVoltages.Add((data[i] << 8) + data[i + 1]); + cellVoltages.Add((data[i] << 8) + data[i + 1]); // Convert pair of bytes to mV reading. } - return cellVoltages; + return cellVoltages; // Return list of cell voltages. default: - return null; + return null; // Unknown type; caller will treat as missing. } } + /// + /// Approximates temperature in Celsius from an ADC value using a linear interpolation between + /// two calibration points derived from the original Python script. Shows how to transform + /// raw ADC counts into meaningful engineering units. + /// private double CalculateTemperature(int adcValue) { - const double r1 = 10e3; - const double r2 = 20e3; - const double t1 = 50; - const double t2 = 35; + const double r1 = 10e3; // Resistance reference point 1 (ohms). + const double r2 = 20e3; // Resistance reference point 2 (ohms). + const double t1 = 50; // Temperature corresponding to r1 (degrees Celsius). + const double t2 = 35; // Temperature corresponding to r2 (degrees Celsius). - const double adc1 = 0x0180; - const double adc2 = 0x022E; + const double adc1 = 0x0180; // ADC reading at r1. + const double adc2 = 0x022E; // ADC reading at r2. - var m = (t2 - t1) / (r2 - r1); - var b = t1 - m * r1; + var m = (t2 - t1) / (r2 - r1); // Calculate slope of temperature vs resistance. + var b = t1 - m * r1; // Calculate intercept for linear model. - var resistance = r1 + (adcValue - adc1) * (r2 - r1) / (adc2 - adc1); - var temperature = m * resistance + b; + var resistance = r1 + (adcValue - adc1) * (r2 - r1) / (adc2 - adc1); // Interpolate resistance from ADC reading. + var temperature = m * resistance + b; // Convert resistance to temperature via line equation. - return Math.Round(temperature, 2); + return Math.Round(temperature, 2); // Round for display friendliness. } + /// + /// Closes the protocol by driving TX to idle, closing the SerialPort, and disposing managed + /// resources. Safe to call multiple times thanks to the _disposed flag. + /// public void Close() { - LogDebug("Close invoked. Beginning disposal sequence."); + LogDebug("Close invoked. Beginning disposal sequence."); // Trace start. if (_disposed) { - LogDebug("Close skipped because object is already disposed."); - return; + LogDebug("Close skipped because object is already disposed."); // Avoid double disposal. + return; // No work to do. } - _disposed = true; + _disposed = true; // Mark disposed to prevent further I/O calls. try { - Idle(); + Idle(); // Drive TX to safe idle state before closing port to avoid floating line. } catch (Exception ex) { - LogDebug($"Error setting idle during close: {ex.GetType().Name} - {ex.Message}"); + LogDebug($"Error setting idle during close: {ex.GetType().Name} - {ex.Message}"); // Log but continue cleanup. } try { - _port.Close(); + _port.Close(); // Close COM port handle. } catch (Exception ex) { - LogDebug($"Error while closing serial port: {ex.GetType().Name} - {ex.Message}"); + LogDebug($"Error while closing serial port: {ex.GetType().Name} - {ex.Message}"); // Log any issues closing port. } finally { - _port.Dispose(); - LogDebug("Serial port disposed."); + _port.Dispose(); // Release unmanaged resources held by SerialPort. + LogDebug("Serial port disposed."); // Confirm disposal. } } + /// + /// Constructs and sends a register read command, then reads the expected number of bytes + /// back. The command byte defaults to 0x01 but can be overridden for other operations. + /// public byte[] Cmd(byte addrMsb, byte addrLsb, byte length, byte command = 0x01) { - LogDebug($"Cmd invoked with addrMsb=0x{addrMsb:X2}, addrLsb=0x{addrLsb:X2}, length={length}, command=0x{command:X2}."); + LogDebug($"Cmd invoked with addrMsb=0x{addrMsb:X2}, addrLsb=0x{addrLsb:X2}, length={length}, command=0x{command:X2}."); // Trace command parameters. SendCommand(new[] { - command, - (byte)0x04, - (byte)0x03, - addrMsb, - addrLsb, - length + command, // Command type (0x01 for read). + (byte)0x04, // Unknown protocol constant from Python implementation (likely addressing mode). + (byte)0x03, // Unknown protocol constant; part of command header. + addrMsb, // High byte of register address. + addrLsb, // Low byte of register address. + length // Number of bytes to read. }); - return ReadResponse(length); + return ReadResponse(length); // Read payload bytes; header/checksum processed in ReadResponse. } + /// + /// Reads the specified number of bytes from the SerialPort, aggregating partial reads until + /// the requested count is met or a timeout/port error occurs. + /// private IEnumerable ReadAvailable(int count) { - LogDebug($"ReadAvailable attempting to read {count} byte(s)."); - var buffer = new byte[count]; - int totalRead = 0; + LogDebug($"ReadAvailable attempting to read {count} byte(s)."); // Trace request. + var buffer = new byte[count]; // Temporary buffer for incoming bytes. + int totalRead = 0; // Track how many bytes we have read so far. while (totalRead < count) { try { - int read = _port.Read(buffer, totalRead, count - totalRead); + int read = _port.Read(buffer, totalRead, count - totalRead); // Attempt to fill remaining bytes. if (read > 0) { - totalRead += read; - LogDebug($"Read {read} byte(s); total read so far: {totalRead}."); + totalRead += read; // Increment total with bytes read this iteration. + LogDebug($"Read {read} byte(s); total read so far: {totalRead}."); // Trace progress. } } catch (InvalidOperationException ex) { - LogDebug($"ReadAvailable stopped because port is unavailable: {ex.GetType().Name} - {ex.Message}"); + LogDebug($"ReadAvailable stopped because port is unavailable: {ex.GetType().Name} - {ex.Message}"); // Port closed/disposed; break loop. break; } catch (TimeoutException) { - LogDebug("Timeout encountered while reading available bytes."); + LogDebug("Timeout encountered while reading available bytes."); // Stop reading on timeout to avoid blocking forever. break; } } - var result = buffer.Take(totalRead).ToArray(); - LogDebug($"ReadAvailable returning {result.Length} byte(s): {FormatBytes(result)}."); - return buffer.Take(totalRead).ToArray(); + var result = buffer.Take(totalRead).ToArray(); // Slice buffer down to bytes actually read. + LogDebug($"ReadAvailable returning {result.Length} byte(s): {FormatBytes(result)}."); // Trace final chunk. + return buffer.Take(totalRead).ToArray(); // Return trimmed array to caller. } + /// + /// Sends debug messages to whichever logger the UI attached. Keeps protocol agnostic of UI + /// output mechanism. + /// private void LogDebug(string message) { - DebugLogger?.Invoke(message); + DebugLogger?.Invoke(message); // Only log when delegate supplied. } + /// + /// Formats a sequence of bytes as a space-delimited hex string (e.g., "AA 55 10"). + /// private static string FormatBytes(IEnumerable bytes) { if (bytes == null) { - return string.Empty; + return string.Empty; // Gracefully handle null sequences. } - var builder = new StringBuilder(); - var array = bytes.ToArray(); + var builder = new StringBuilder(); // Efficient string concatenation. + var array = bytes.ToArray(); // Materialize enumerable to avoid multiple enumerations. for (int i = 0; i < array.Length; i++) { - builder.Append(array[i].ToString("X2")); + builder.Append(array[i].ToString("X2")); // Append byte as two-digit hex. if (i < array.Length - 1) { - builder.Append(' '); + builder.Append(' '); // Add space separator except after last byte. } } - return builder.ToString(); + return builder.ToString(); // Return formatted string for logs. } } } diff --git a/Program.cs b/Program.cs index f12554f..0c21785 100644 --- a/Program.cs +++ b/Program.cs @@ -1,17 +1,51 @@ -namespace M18BatteryInfo -{ - internal static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - // To customize application configuration such as set high DPI settings or default font, - // see https://aka.ms/applicationconfiguration. - ApplicationConfiguration.Initialize(); - Application.Run(new frmMain()); - } - } -} \ No newline at end of file +// ************************************************************************************************* +// Program.cs +// ---------- +// Entry point for the WinForms application. This file ties the executable to the UI defined in +// frmMain (the main form constructed in M18AnalyzerMain.cs / M18AnalyzerMain.Designer.cs) and uses +// ApplicationConfiguration to bootstrap high-DPI awareness and default fonts. The goal is to show +// how a C# WinForms app starts, how STAThread is required for COM-based UI components, and where the +// program transitions from the process boundary into user-interface code that eventually invokes +// serial-protocol logic in M18Protocol.cs and USB enumeration utilities in SerialPortUtil.cs. Even +// though the logic is minimal, commenting every line reveals the basic structure of a .NET desktop +// program for newcomers. +// ************************************************************************************************* + +namespace M18BatteryInfo +{ + /// + /// Hosts the Main method required by .NET to start execution. The class is marked internal to + /// keep the symbol inside the assembly while still being discoverable by the runtime. It + /// delegates all user interaction to , which wires up event handlers to + /// the serial protocol layer () and utility helpers + /// () that talk to hardware. + /// + internal static class Program + { + /// + /// The main entry point for the application. The STAThread attribute is mandatory for + /// WinForms because UI components rely on COM apartment threading. The method enables + /// framework-level configuration (high DPI, default fonts) and then instantiates and shows + /// the primary form, which in turn registers all button click handlers that trigger + /// hardware traffic over UART. + /// + [STAThread] + static void Main() + { + // Initialize WinForms settings such as DPI awareness and default font. This call lives + // in System.Windows.Forms.ApplicationConfiguration and is automatically generated when + // you create a modern WinForms project. Without it, UI rendering may be blurry on high + // DPI displays. This line does not touch our custom code but configures the Win32/WinForms + // plumbing that all later GUI code depends on. + ApplicationConfiguration.Initialize(); + + // Create and run the main window. Application.Run enters the WinForms message loop + // (GetMessage/DispatchMessage under the hood) and will not exit until the form closes. + // We construct frmMain, which is defined across M18AnalyzerMain.cs (logic) and + // M18AnalyzerMain.Designer.cs (control layout). That form then interacts with + // M18Protocol.cs to toggle UART lines and read battery data, plus SerialPortUtil.cs to + // discover COM ports. + Application.Run(new frmMain()); + } + } +} diff --git a/PythonScriptRunner.cs b/PythonScriptRunner.cs index ee660ef..359a024 100644 --- a/PythonScriptRunner.cs +++ b/PythonScriptRunner.cs @@ -1,38 +1,59 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Text; +// ************************************************************************************************* +// PythonScriptRunner.cs +// --------------------- +// Provides a tiny helper to execute the companion Python script (m18.py) from within the C# GUI. +// This allows reuse of the original Python implementation when experimenting or comparing results. +// Comments explain how ProcessStartInfo is configured to capture stdout/stderr without opening a +// console window, which is useful when embedding scripting in desktop applications. +// ************************************************************************************************* + +using System; // Access to AppDomain for locating the application base directory. +using System.Diagnostics; // Process and ProcessStartInfo for launching external interpreters. +using System.IO; // Path.Combine to build script path safely across OSes. +using System.Text; // StringBuilder for efficient concatenation of stdout/stderr text. namespace M18BatteryInfo { + /// + /// Utility class for launching the Python reference implementation (m18.py) with arbitrary + /// arguments. Captures standard output and error streams for display in the WinForms UI. + /// public static class PythonScriptRunner { + /// + /// Executes m18.py with the provided argument string. The method starts a child process + /// configured to hide its console window, captures both stdout and stderr, waits for the + /// process to exit, and returns the combined output. This is helpful for comparing Python + /// protocol behavior to the C# port without leaving the GUI. + /// + /// Arguments passed directly to m18.py (for example, "health"). + /// Combined standard output and error text from the Python process. public static string RunPythonScript(string arguments) { - var scriptPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "m18.py"); + var scriptPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "m18.py"); // Build absolute path to bundled Python script located next to executable. var startInfo = new ProcessStartInfo { - FileName = "python", - Arguments = $"\"{scriptPath}\" {arguments}".Trim(), - WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory, - RedirectStandardOutput = true, - RedirectStandardError = true, - UseShellExecute = false, - CreateNoWindow = true + FileName = "python", // Use system Python interpreter (must be on PATH). + Arguments = $"\"{scriptPath}\" {arguments}".Trim(), // Quote script path to handle spaces; append user arguments. + WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory, // Run from app directory so relative imports/resources resolve. + RedirectStandardOutput = true, // Capture stdout so UI can display results. + RedirectStandardError = true, // Capture stderr for troubleshooting Python exceptions. + UseShellExecute = false, // Required when redirecting streams; avoids shell involvement. + CreateNoWindow = true // Prevent console window from flashing when launched from GUI. }; - using var process = new Process { StartInfo = startInfo }; - var outputBuilder = new StringBuilder(); + using var process = new Process { StartInfo = startInfo }; // Create Process with configured start info inside using to ensure disposal. + var outputBuilder = new StringBuilder(); // Collects both stdout and stderr text. - process.Start(); + process.Start(); // Launch python process; OS loads interpreter and script. - outputBuilder.Append(process.StandardOutput.ReadToEnd()); - outputBuilder.Append(process.StandardError.ReadToEnd()); + outputBuilder.Append(process.StandardOutput.ReadToEnd()); // Read stdout to completion (blocking until stream closes). + outputBuilder.Append(process.StandardError.ReadToEnd()); // Read stderr to completion; concatenated for holistic log. - process.WaitForExit(); + process.WaitForExit(); // Ensure process has exited before returning to caller. - return outputBuilder.ToString(); + return outputBuilder.ToString(); // Return combined output for display/logging. } } } diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index bfddf77..d5fc4b8 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -1,106 +1,121 @@ -using System; -using System.Collections.Generic; -using System.IO.Ports; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Text.RegularExpressions; -using Microsoft.Win32; -using Microsoft.Win32.SafeHandles; +// ************************************************************************************************* +// SerialPortUtil.cs +// ------------------ +// Provides detailed COM-port enumeration for Windows using the SetupAPI P/Invoke layer. This mirrors +// Python's pyserial list_ports.comports() by retrieving friendly names, hardware IDs (VID/PID), +// manufacturer strings, and registry data. The WinForms UI (frmMain) uses these helpers to populate +// the serial-port combo box with human-readable entries and to supply debug metadata for hardware +// troubleshooting. Every method is heavily commented to explain Windows API interop, registry access, +// and why multiple discovery strategies are combined. +// ************************************************************************************************* + +using System; // Core types like IntPtr and StringComparer. +using System.Collections.Generic; // Collections used to gather port metadata. +using System.IO.Ports; // SerialPort.GetPortNames() used as a fallback enumeration method. +using System.Linq; // LINQ helpers for ordering and filtering port lists. +using System.Runtime.InteropServices; // P/Invoke attributes to call SetupAPI functions. +using System.Text; // StringBuilder for marshaling strings from unmanaged memory. +using System.Text.RegularExpressions; // Regex for extracting COM port names and USB VID/PID. +using Microsoft.Win32; // Registry access to augment port data. +using Microsoft.Win32.SafeHandles; // Safe handle wrapper for registry keys opened via SetupAPI. namespace M18BatteryInfo; /// -/// Provides serial port enumeration using Windows SetupAPI to capture detailed -/// descriptions similar to Python's pyserial list_ports.comports(). +/// Provides serial port enumeration using Windows SetupAPI to capture detailed descriptions similar +/// to Python's pyserial list_ports.comports(). The class combines multiple discovery sources (friendly +/// names, registry keys, and GetPortNames) to produce robust metadata for UI display and debugging. /// internal static class SerialPortUtil { - // SetupAPI flags and registry property identifiers. - private const uint DIGCF_PRESENT = 0x00000002; // Return only devices present in the system. + // SetupAPI flags and registry property identifiers. These magic numbers come from Windows header + // files (setupapi.h/devpkey.h) and let us request specific properties from the device tree. + private const uint DIGCF_PRESENT = 0x00000002; // Return only devices currently present in the system (ignores removed/phantom devices). - private const uint SPDRP_DEVICEDESC = 0x00000000; // Device description (REG_SZ). - private const uint SPDRP_HARDWAREID = 0x00000001; // Hardware IDs (REG_MULTI_SZ). - private const uint SPDRP_MFG = 0x0000000B; // Manufacturer string (REG_SZ). + private const uint SPDRP_DEVICEDESC = 0x00000000; // Device description (REG_SZ) property key. + private const uint SPDRP_HARDWAREID = 0x00000001; // Hardware IDs (REG_MULTI_SZ) property key (contains VID/PID). + private const uint SPDRP_MFG = 0x0000000B; // Manufacturer string (REG_SZ) property key. private const uint SPDRP_FRIENDLYNAME = 0x0000000C; // Friendly name shown in Device Manager (REG_SZ). - private const uint SPDRP_LOCATION_INFORMATION = 0x0000000D; // Location information string (REG_SZ). + private const uint SPDRP_LOCATION_INFORMATION = 0x0000000D; // Location information string (REG_SZ) e.g., USB port path. - private const uint DEVPROP_TYPE_STRING = 0x12; // DEVPROP_TYPE_STRING - private const uint DEVPROP_TYPE_STRING_LIST = 0x1012; // DEVPROP_TYPE_STRING | DEVPROP_TYPEMOD_LIST + private const uint DEVPROP_TYPE_STRING = 0x12; // DEVPROP_TYPE_STRING constant used with SetupDiGetDeviceProperty. + private const uint DEVPROP_TYPE_STRING_LIST = 0x1012; // DEVPROP_TYPE_STRING | DEVPROP_TYPEMOD_LIST for multi-string values. - private const uint DIREG_DEV = 0x00000001; // Open hardware key for device. - private const int KEY_QUERY_VALUE = 0x0001; // Access mask for querying registry values. + private const uint DIREG_DEV = 0x00000001; // Flag to open hardware key for device. + private const int KEY_QUERY_VALUE = 0x0001; // Registry access mask for querying values. - private static readonly Guid PortsClassGuid = new("4d36e978-e325-11ce-bfc1-08002be10318"); + private static readonly Guid PortsClassGuid = new("4d36e978-e325-11ce-bfc1-08002be10318"); // GUID for Ports (COM & LPT) device class. private static readonly DEVPROPKEY DEVPKEY_Device_LocationPaths = new() { - fmtid = new Guid("9d7debbc-c85d-4e75-a5f2-0e0e3bfb4ffd"), - pid = 37 + fmtid = new Guid("9d7debbc-c85d-4e75-a5f2-0e0e3bfb4ffd"), // GUID for location paths property set. + pid = 37 // Property identifier within the set representing location paths. }; /// - /// Enumerates serial ports using SetupAPI and falls back to SerialPort.GetPortNames() - /// when additional details cannot be retrieved. + /// Enumerates serial ports using SetupAPI and falls back to SerialPort.GetPortNames() when + /// additional details cannot be retrieved. Combines results into a sorted list ready for UI display. /// /// Optional logger for verbose debug output. /// Ordered list of serial port metadata. public static List EnumerateDetailedPorts(Action? debugLogger = null) { - var ports = new Dictionary(StringComparer.OrdinalIgnoreCase); + var ports = new Dictionary(StringComparer.OrdinalIgnoreCase); // Use dictionary to merge data from multiple sources case-insensitively. - EnumerateViaSetupApi(ports, debugLogger); - AppendSerialPortFallbacks(ports, debugLogger); + EnumerateViaSetupApi(ports, debugLogger); // Primary enumeration using SetupAPI P/Invoke for rich data. + AppendSerialPortFallbacks(ports, debugLogger); // Add/merge entries using SerialPort.GetPortNames() as safety net. return ports.Values - .OrderBy(port => port.PortName, StringComparer.OrdinalIgnoreCase) - .ToList(); + .OrderBy(port => port.PortName, StringComparer.OrdinalIgnoreCase) // Sort alphabetically for predictable UI ordering. + .ToList(); // Materialize list for caller. } private static void EnumerateViaSetupApi(IDictionary ports, Action? log) { - // Acquire a handle to the Ports device class (COM & LPT) containing the serial devices. + // Acquire a handle to the Ports device class (COM & LPT) containing the serial devices. The GUID restricts + // the search to devices implementing the ports interface so we do not enumerate unrelated hardware. var portsClassGuid = PortsClassGuid; - var deviceInfoSet = SetupDiGetClassDevs(ref portsClassGuid, null, IntPtr.Zero, DIGCF_PRESENT); + var deviceInfoSet = SetupDiGetClassDevs(ref portsClassGuid, null, IntPtr.Zero, DIGCF_PRESENT); // Calls into setupapi.dll. if (deviceInfoSet == IntPtr.Zero || deviceInfoSet == new IntPtr(-1)) { - log?.Invoke("SetupAPI enumeration failed to acquire device info set; continuing with fallbacks only."); - return; + log?.Invoke("SetupAPI enumeration failed to acquire device info set; continuing with fallbacks only."); // Warn UI that we are falling back. + return; // Without a valid handle we cannot enumerate; rely on SerialPort.GetPortNames later. } try { var devInfoData = new SP_DEVINFO_DATA { - cbSize = (uint)Marshal.SizeOf() + cbSize = (uint)Marshal.SizeOf() // Populate structure size before calling into SetupAPI. }; - for (uint index = 0; SetupDiEnumDeviceInfo(deviceInfoSet, index, ref devInfoData); index++) + for (uint index = 0; SetupDiEnumDeviceInfo(deviceInfoSet, index, ref devInfoData); index++) // Loop through devices until function returns false. { try { - var friendlyName = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_FRIENDLYNAME); - var description = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_DEVICEDESC); - var manufacturer = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_MFG); - var hardwareIds = GetMultiStringProperty(deviceInfoSet, ref devInfoData, SPDRP_HARDWAREID); - var locationInformation = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_LOCATION_INFORMATION); - var locationPaths = GetDevicePropertyMultiString(deviceInfoSet, ref devInfoData, DEVPKEY_Device_LocationPaths); - var deviceInstanceId = GetDeviceInstanceId(deviceInfoSet, ref devInfoData); + var friendlyName = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_FRIENDLYNAME); // Pull human-friendly text e.g., "USB Serial Port (COM3)". + var description = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_DEVICEDESC); // Generic device description. + var manufacturer = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_MFG); // Manufacturer string (e.g., FTDI). + var hardwareIds = GetMultiStringProperty(deviceInfoSet, ref devInfoData, SPDRP_HARDWAREID); // Multi-string containing USB VID/PID. + var locationInformation = GetDeviceRegistryProperty(deviceInfoSet, ref devInfoData, SPDRP_LOCATION_INFORMATION); // Port location info (hub/port). + var locationPaths = GetDevicePropertyMultiString(deviceInfoSet, ref devInfoData, DEVPKEY_Device_LocationPaths); // More detailed location path list. + var deviceInstanceId = GetDeviceInstanceId(deviceInfoSet, ref devInfoData); // Unique device instance string used for registry lookup. - var (portName, portSource) = ExtractBestPortName(friendlyName, description, deviceInfoSet, ref devInfoData, deviceInstanceId); + var (portName, portSource) = ExtractBestPortName(friendlyName, description, deviceInfoSet, ref devInfoData, deviceInstanceId); // Try multiple strategies to extract "COMx". if (string.IsNullOrWhiteSpace(portName)) { - log?.Invoke($"SetupAPI device entry missing COM port name. Desc: '{description ?? friendlyName ?? "(none)"}'"); + log?.Invoke($"SetupAPI device entry missing COM port name. Desc: '{description ?? friendlyName ?? "(none)"}'"); // Skip devices without COM port string. continue; } - ports.TryGetValue(portName!, out var existing); - existing ??= SerialPortDisplay.Create(portName!); - var combinedSource = CombineSources(existing.Source, "SetupAPI (Ports class)"); + ports.TryGetValue(portName!, out var existing); // Try to merge with existing record if fallback already added. + existing ??= SerialPortDisplay.Create(portName!); // Create base record when first seen. + var combinedSource = CombineSources(existing.Source, "SetupAPI (Ports class)"); // Track provenance for debugging. - var parsedUsb = ParseUsbIdentifiers(hardwareIds, deviceInstanceId); - var locationPath = locationPaths?.FirstOrDefault() ?? locationInformation; + var parsedUsb = ParseUsbIdentifiers(hardwareIds, deviceInstanceId); // Parse VID/PID/serial from hardware IDs and instance ID. + var locationPath = locationPaths?.FirstOrDefault() ?? locationInformation; // Prefer detailed location path but fall back to location info. + // Merge new data into record, preserving existing values when already populated by other sources. ports[portName!] = existing with { Description = string.IsNullOrWhiteSpace(existing.Description) ? description : existing.Description, @@ -115,6 +130,7 @@ private static void EnumerateViaSetupApi(IDictionary Source = combinedSource }; + // Emit verbose log of all discovered values so users can diagnose driver issues. LogDevice(log, portName!, new() { ($"FriendlyName", friendlyName, "SetupAPI SPDRP_FRIENDLYNAME"), @@ -131,13 +147,13 @@ private static void EnumerateViaSetupApi(IDictionary } catch (Exception ex) { - log?.Invoke($"SetupAPI enumeration error: {ex.Message}"); + log?.Invoke($"SetupAPI enumeration error: {ex.Message}"); // Log individual device failures without aborting enumeration. } } } finally { - SetupDiDestroyDeviceInfoList(deviceInfoSet); + SetupDiDestroyDeviceInfoList(deviceInfoSet); // Always release the device info set handle to avoid leaks. } } @@ -145,195 +161,195 @@ private static void AppendSerialPortFallbacks(IDictionary\Device Parameters. } - var enumRegistryPort = TryGetPortNameFromEnumRegistry(deviceInstanceId); + var enumRegistryPort = TryGetPortNameFromEnumRegistry(deviceInstanceId); // Try alternate registry path using device instance ID. if (!string.IsNullOrWhiteSpace(enumRegistryPort)) { - return (enumRegistryPort, "HKLM\\SYSTEM\\CurrentControlSet\\Enum device parameters"); + return (enumRegistryPort, "HKLM\\SYSTEM\\CurrentControlSet\\Enum device parameters"); // Note source for debugging. } - return (null, "Unavailable"); + return (null, "Unavailable"); // Signal failure to extract COM port name. } private static void LogDevice(Action? log, string portName, List<(string Name, string? Value, string Source)> values) { if (log == null) { - return; + return; // No logger supplied; do nothing. } var builder = new StringBuilder(); - builder.Append($"Detected {portName} with: "); + builder.Append($"Detected {portName} with: "); // Prefix with port name for clarity. foreach (var (name, value, source) in values) { if (string.IsNullOrWhiteSpace(value)) { - continue; + continue; // Skip empty values to avoid noise. } - builder.Append($"{name}='{value}' (from {source}); "); + builder.Append($"{name}='{value}' (from {source}); "); // Append each property and where it came from for auditability. } - log(builder.ToString().Trim()); + log(builder.ToString().Trim()); // Emit constructed line to UI logger. } private static string CombineSources(string? existingSource, string newSource) { if (string.IsNullOrWhiteSpace(existingSource)) { - return newSource; + return newSource; // If no existing source, return the new one. } return existingSource.Contains(newSource, StringComparison.OrdinalIgnoreCase) - ? existingSource - : $"{existingSource}; {newSource}"; + ? existingSource // Avoid duplicating same source string. + : $"{existingSource}; {newSource}"; // Concatenate sources with semicolon to show multiple discovery paths. } private static string? GetDeviceInstanceId(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData) { - var buffer = new StringBuilder(512); + var buffer = new StringBuilder(512); // Start with moderate buffer size for instance ID. if (SetupDiGetDeviceInstanceId(deviceInfoSet, ref deviceInfoData, buffer, (uint)buffer.Capacity, out var requiredSize)) { - return buffer.ToString(); + return buffer.ToString(); // Return instance ID string when call succeeds. } if (Marshal.GetLastWin32Error() != 122) // ERROR_INSUFFICIENT_BUFFER { - return null; + return null; // If failure not due to buffer size, give up. } - buffer = new StringBuilder((int)requiredSize); + buffer = new StringBuilder((int)requiredSize); // Resize buffer to required size. return SetupDiGetDeviceInstanceId(deviceInfoSet, ref deviceInfoData, buffer, (uint)buffer.Capacity, out _) - ? buffer.ToString() - : null; + ? buffer.ToString() // Return string on success. + : null; // Otherwise return null. } private static string? GetDeviceRegistryProperty(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, uint property) { - var buffer = new byte[1024]; + var buffer = new byte[1024]; // Allocate buffer for UTF-16 data. if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, ref deviceInfoData, property, out _, buffer, (uint)buffer.Length, out var requiredSize) || requiredSize == 0) { - return null; + return null; // Return null when property missing or call fails. } - return Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); + return Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); // Decode UTF-16 and trim null terminator. } private static string? GetMultiStringProperty(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, uint property) { - var buffer = new byte[2048]; + var buffer = new byte[2048]; // Allocate larger buffer for REG_MULTI_SZ values. if (!SetupDiGetDeviceRegistryProperty(deviceInfoSet, ref deviceInfoData, property, out var regType, buffer, (uint)buffer.Length, out var requiredSize) || requiredSize == 0) { - return null; + return null; // Fail fast on missing data. } // REG_MULTI_SZ is a sequence of null-terminated UTF-16 strings ending with an additional null terminator. if (regType != 7) // 7 = REG_MULTI_SZ { - return Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); + return Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); // For non-multi strings, decode directly. } - var multiSz = Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); - var entries = multiSz.Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries); - return entries.Length == 0 ? null : string.Join(", ", entries); + var multiSz = Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); // Decode concatenated strings. + var entries = multiSz.Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries); // Split into individual entries. + return entries.Length == 0 ? null : string.Join(", ", entries); // Join with comma for display. } private static List? GetDevicePropertyMultiString(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, DEVPROPKEY propertyKey) { - var buffer = new byte[4096]; + var buffer = new byte[4096]; // Large buffer for location paths list. if (!SetupDiGetDeviceProperty(deviceInfoSet, ref deviceInfoData, ref propertyKey, out var propertyType, buffer, (uint)buffer.Length, out var requiredSize, 0) || requiredSize == 0) { - return null; + return null; // Return null when property missing or call fails. } if (propertyType != DEVPROP_TYPE_STRING_LIST && propertyType != DEVPROP_TYPE_STRING) { - return null; + return null; // Ignore unsupported property types to avoid mis-parsing binary data. } - var value = Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); - var parts = value.Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries); - return parts.Length == 0 ? null : new List(parts); + var value = Encoding.Unicode.GetString(buffer, 0, (int)requiredSize).TrimEnd('\0'); // Decode UTF-16. + var parts = value.Split(new[] { '\0' }, StringSplitOptions.RemoveEmptyEntries); // Split on null separators. + return parts.Length == 0 ? null : new List(parts); // Return list for caller convenience. } private static string? TryGetPortNameFromRegistry(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData) { - var regKey = SetupDiOpenDevRegKey(deviceInfoSet, ref deviceInfoData, 0, 0, DIREG_DEV, KEY_QUERY_VALUE); + var regKey = SetupDiOpenDevRegKey(deviceInfoSet, ref deviceInfoData, 0, 0, DIREG_DEV, KEY_QUERY_VALUE); // Open device-specific registry key. if (regKey == IntPtr.Zero || regKey == new IntPtr(-1)) { - return null; + return null; // Key could not be opened (permissions or missing). } - using var safeHandle = new SafeRegistryHandle(regKey, true); - using var key = RegistryKey.FromHandle(safeHandle); - return key.GetValue("PortName") as string; + using var safeHandle = new SafeRegistryHandle(regKey, true); // Wrap raw handle for safe disposal. + using var key = RegistryKey.FromHandle(safeHandle); // Create RegistryKey from handle. + return key.GetValue("PortName") as string; // Return PortName value (e.g., COM3) if present. } private static string? TryGetPortNameFromEnumRegistry(string? deviceInstanceId) { if (string.IsNullOrWhiteSpace(deviceInstanceId)) { - return null; + return null; // No instance ID means we cannot build registry path. } try { - var path = $"SYSTEM\\CurrentControlSet\\Enum\\{deviceInstanceId}\\Device Parameters"; - using var enumKey = Registry.LocalMachine.OpenSubKey(path); - return enumKey?.GetValue("PortName") as string; + var path = $"SYSTEM\\CurrentControlSet\\Enum\\{deviceInstanceId}\\Device Parameters"; // Build registry path to device parameters. + using var enumKey = Registry.LocalMachine.OpenSubKey(path); // Open read-only. + return enumKey?.GetValue("PortName") as string; // Extract PortName if it exists. } catch { // Registry access can fail due to permissions; ignore and continue. - return null; + return null; // Silence exception; other methods may still succeed. } } @@ -341,11 +357,11 @@ private static string CombineSources(string? existingSource, string newSource) { if (string.IsNullOrWhiteSpace(source)) { - return null; + return null; // Nothing to parse. } - var match = Regex.Match(source, @"(COM\d+)", RegexOptions.IgnoreCase); - return match.Success ? match.Groups[1].Value.ToUpperInvariant() : null; + var match = Regex.Match(source, @"(COM\d+)", RegexOptions.IgnoreCase); // Regex finds patterns like COM3. + return match.Success ? match.Groups[1].Value.ToUpperInvariant() : null; // Normalize to uppercase for consistency. } private static (string? Vid, string? Pid, string? SerialNumber) ParseUsbIdentifiers(string? hardwareIds, string? deviceInstanceId) @@ -353,25 +369,25 @@ private static (string? Vid, string? Pid, string? SerialNumber) ParseUsbIdentifi string? firstHardwareId = hardwareIds ?.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries) .Select(id => id.Trim()) - .FirstOrDefault(); + .FirstOrDefault(); // Hardware IDs can be comma/semicolon separated; take the first entry. - var vidMatch = Regex.Match(firstHardwareId ?? string.Empty, "VID_([0-9A-Fa-f]{4})"); - var pidMatch = Regex.Match(firstHardwareId ?? string.Empty, "PID_([0-9A-Fa-f]{4})"); + var vidMatch = Regex.Match(firstHardwareId ?? string.Empty, "VID_([0-9A-Fa-f]{4})"); // Capture USB vendor ID. + var pidMatch = Regex.Match(firstHardwareId ?? string.Empty, "PID_([0-9A-Fa-f]{4})"); // Capture USB product ID. string? serialNumber = null; if (!string.IsNullOrWhiteSpace(deviceInstanceId)) { - var segments = deviceInstanceId.Split('\\'); + var segments = deviceInstanceId.Split('\\'); // Device instance ID typically "USB\\VID_xxxx&PID_xxxx\\SERIAL". if (segments.Length >= 3) { - serialNumber = segments[2]; + serialNumber = segments[2]; // Third segment often contains USB serial number or location. } } return ( - vidMatch.Success ? vidMatch.Groups[1].Value.ToUpperInvariant() : null, - pidMatch.Success ? pidMatch.Groups[1].Value.ToUpperInvariant() : null, - serialNumber); + vidMatch.Success ? vidMatch.Groups[1].Value.ToUpperInvariant() : null, // Normalize VID to uppercase. + pidMatch.Success ? pidMatch.Groups[1].Value.ToUpperInvariant() : null, // Normalize PID to uppercase. + serialNumber); // Return parsed serial (may be null). } /// @@ -462,17 +478,17 @@ internal sealed record SerialPortDisplay( string? LocationPath, string Source) { - public static SerialPortDisplay Create(string portName) => new(portName, null, null, null, null, null, null, null, null, null, string.Empty); + public static SerialPortDisplay Create(string portName) => new(portName, null, null, null, null, null, null, null, null, null, string.Empty); // Factory helper to start with empty metadata. - public string? DeviceDescription => SanitizeDescription(FriendlyName ?? Description); + public string? DeviceDescription => SanitizeDescription(FriendlyName ?? Description); // Choose friendly name or description, cleaning redundant COM text. public string DisplayName { get { - var parts = new List { PortName }; + var parts = new List { PortName }; // Always start with COM port name (e.g., COM3). - var ftdiOrUsbSegment = BuildFtdiOrUsbSegment(); + var ftdiOrUsbSegment = BuildFtdiOrUsbSegment(); // Add FTDI/USB VID/PID segment when available for quick visual identification. if (!string.IsNullOrWhiteSpace(ftdiOrUsbSegment)) { parts.Add(ftdiOrUsbSegment!); @@ -480,29 +496,29 @@ public string DisplayName if (!string.IsNullOrWhiteSpace(DeviceDescription)) { - parts.Add(DeviceDescription!); + parts.Add(DeviceDescription!); // Append cleaned description for context (e.g., "USB Serial Device"). } if (!string.IsNullOrWhiteSpace(Manufacturer)) { - parts.Add(Manufacturer!); + parts.Add(Manufacturer!); // Append manufacturer such as "FTDI" or "Microsoft". } - return string.Join(" - ", parts); + return string.Join(" - ", parts); // Join with hyphen separators to produce combo-box display text. } } public bool IsLikelyFtdi => new[] { Description, Manufacturer, FriendlyName } - .Any(value => value != null && value.IndexOf("FTDI", StringComparison.OrdinalIgnoreCase) >= 0); + .Any(value => value != null && value.IndexOf("FTDI", StringComparison.OrdinalIgnoreCase) >= 0); // Heuristic: check for "FTDI" substring to highlight FT232 cables. private string? BuildFtdiOrUsbSegment() { if (IsLikelyFtdi) { - return "FTDI"; + return "FTDI"; // Explicitly flag FTDI devices because they are commonly used with this project. } - var usbParts = new List(); + var usbParts = new List(); // Collect VID/PID pair for non-FTDI devices. if (!string.IsNullOrWhiteSpace(UsbVendorId)) { @@ -514,23 +530,23 @@ public string DisplayName usbParts.Add($"PID:{UsbProductId}"); } - return usbParts.Count > 0 ? string.Join(" ", usbParts) : null; + return usbParts.Count > 0 ? string.Join(" ", usbParts) : null; // Return combined VID/PID or null if unknown. } private string? SanitizeDescription(string? rawDescription) { if (string.IsNullOrWhiteSpace(rawDescription)) { - return null; + return null; // No description to clean. } var cleaned = rawDescription - .Replace($"({PortName})", string.Empty, StringComparison.OrdinalIgnoreCase) - .Replace(PortName, string.Empty, StringComparison.OrdinalIgnoreCase) - .Trim().Trim('-', '—').Trim(); + .Replace($"({PortName})", string.Empty, StringComparison.OrdinalIgnoreCase) // Remove redundant "(COMx)" segments. + .Replace(PortName, string.Empty, StringComparison.OrdinalIgnoreCase) // Remove raw COM string. + .Trim().Trim('-', '—').Trim(); // Trim leftover punctuation and whitespace. - return string.IsNullOrWhiteSpace(cleaned) ? rawDescription : cleaned; + return string.IsNullOrWhiteSpace(cleaned) ? rawDescription : cleaned; // If cleaning removed everything, fall back to raw description. } - public override string ToString() => DisplayName; + public override string ToString() => DisplayName; // ComboBox calls ToString(), so return DisplayName for a friendly label. } From 927174a6fa07da2745226091c495dfc908ac3e3d Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 08:20:31 -0500 Subject: [PATCH 44/61] Added extensive comments. --- M18Protocol.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index f9a636f..a7e7007 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -531,7 +531,7 @@ public bool Reset() LogDebug("Awaiting reset response after SYNC byte."); // Trace waiting state. var response = ReadResponse(1); // Expect single byte echo. var success = response.Length > 0 && response[0] == SYNC_BYTE; // Evaluate acknowledgement. - LogDebug($"Reset response {(success ? \"acknowledged\" : \"did not match expected SYNC\")}."); // Report result. + LogDebug($"Reset response {(success ? "acknowledged" : "did not match expected SYNC")}."); // Report result. if (success) { Thread.Sleep(10); // Brief pause to stabilize before further commands. @@ -680,7 +680,7 @@ public string HealthReport() { var totalVoltage = cellVoltages.Sum() / 1000.0; // Convert total mV to V for readability. builder.AppendLine($"Pack voltage: {totalVoltage}"); // Show pack voltage. - builder.AppendLine($"Cell Voltages (mV): {string.Join(\", \", cellVoltages)}"); // List individual cell voltages. + builder.AppendLine($"Cell Voltages (mV): {string.Join(", ", cellVoltages)}"); // List individual cell voltages. builder.AppendLine($"Cell Imbalance (mV): {cellVoltages.Max() - cellVoltages.Min()}"); // Compute imbalance as diagnostic metric. } @@ -728,7 +728,7 @@ public string HealthReport() var lastSeconds = Convert.ToInt32(values[38] ?? 0); // >200A bucket seconds. var lastPct = toolTime > 0 ? Math.Round(lastSeconds / (double)toolTime * 100) : 0; // Percent for final bucket. var lastBar = new string('X', (int)lastPct); // ASCII bar for final bucket. - builder.AppendLine($"Time @ {\"> 200A\",8}: {TimeSpan.FromSeconds(lastSeconds)} {lastPct,2:0}% {lastBar}"); // Show extreme current usage. + builder.AppendLine($"Time @ {"> 200A",8}: {TimeSpan.FromSeconds(lastSeconds)} {lastPct,2:0}% {lastBar}"); // Show extreme current usage. return builder.ToString().TrimEnd(); // Return compiled report with trailing newline trimmed. } From f8219691ed43b8593d098c6623a603f566990c28 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 09:24:25 -0500 Subject: [PATCH 45/61] Debugging --- M18AnalyzerMain.Designer.cs | 214 +++++++++++++++++------------------- M18AnalyzerMain.resx | 3 - m18.py | 2 +- 3 files changed, 104 insertions(+), 115 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 005bc12..53dc4a8 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -37,105 +37,97 @@ protected override void Dispose(bool disposing) /// the contents of this method with the code editor. /// private void InitializeComponent() - { - // InitializeComponent is responsible for instantiating every control, setting layout - // properties (Location, Size, Dock), attaching imagery/resources, and adding controls to - // parent containers. The sequence follows WinForms best practice: create child controls, - // configure them, then add them to their parent (e.g., GroupBox or TabPage). Comments are - // provided around major groups (Simple tab, Advanced tab, Simulation tab, Diagnostics tab, - // About tab) so readers understand how the UI maps to functionality described in - // M18AnalyzerMain.cs. WinForms uses absolute positioning here, so changing Size/Location - // adjusts pixel coordinates relative to parent containers. - components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); - tabControlM18Main = new TabControl(); // Main tab control housing Simple/Advanced/Simulation/Diagnostics/About views. - tabSimple = new TabPage(); // User-friendly tab with core actions (connect, idle, active, health, reset). - btnTestFT232 = new Button(); // Button to perform FT232 hardware test (wired to btnTestFT232_Click). - grpOutput = new GroupBox(); // Group box holding primary log output and basic controls. - btnTestEcho = new Button(); // Button to trigger raw echo test; logic in M18AnalyzerMain.cs. - btnCopyOutput = new Button(); // Copies output log to clipboard for sharing. - btnReset = new Button(); // Issues reset handshake to battery. - btnHealthReport = new Button(); // Initiates health report read. - btnActive = new Button(); // Drives TX high (charger simulation). - rtbOutput = new RichTextBox(); // Rich text box showing simple log messages. - btnIdle = new Button(); // Drives TX low (idle). - btnDisconnect = new Button(); // Closes serial connection. - btnConnect = new Button(); // Opens serial connection. - btnRefresh = new Button(); // Refreshes COM port list. - lblSerialPort = new Label(); // Label describing serial port combo box. - cmbBxSerialPort = new ComboBox(); // Dropdown listing available COM ports. - tabAdvanced = new TabPage(); // Advanced tab for raw register reads/writes and debug logging. - btnRestoreTxRxState = new Button(); // Restores protocol logging preferences. - grpTryCmd = new GroupBox(); // Input fields for manually issuing commands (address/length). - txtTryCmdLength = new TextBox(); // Text box for specifying custom length. - txtAddressLow = new TextBox(); // LSB of address for TryCmd. - txtAddressHigh = new TextBox(); // MSB of address for TryCmd. - lblTryCmdLength = new Label(); // Label for custom length field. - lblAddressLow = new Label(); // Label for LSB field. - lblAddrHigh = new Label(); // Label for MSB field. - lblCommand = new Label(); // Label for command byte field. - txtCommand = new TextBox(); // Text box for command byte entry. - grpbxDebugCmd = new GroupBox(); // Debug command group for low-level reads. - txtResponseLength = new TextBox(); // Field for expected response length. - txtDebugCmdLength = new TextBox(); // Field for command length. - txtAddrLSB = new TextBox(); // LSB address input for debug command. - lblResponseLength = new Label(); // Label for response length. - lblDebugCmdLength = new Label(); // Label for debug command length. - lblLSB = new Label(); // Label identifying LSB text box. - lblMSB = new Label(); // Label identifying MSB text box. - txtAddrMSB = new TextBox(); // MSB address input for debug command. - btnFullBrute = new Button(); // Triggers brute-force address scan. - btnBruteAddr = new Button(); // Triggers targeted brute-force call. - btnSaveTxRxState = new Button(); // Saves current protocol logging flags. - chkboxRxLog = new CheckBox(); // Toggles RX logging. - chkbxTXLog = new CheckBox(); // Toggles TX logging. - txtWriteMessage = new TextBox(); // Input for raw message writing. - btnWriteMessage = new Button(); // Sends raw message. - btnReadIDLabelled = new Button(); // Reads ID registers with labels. - btnReadIDRaw = new Button(); // Reads raw ID registers. - btnReadAllSpreadsheet = new Button(); // Reads all registers for spreadsheet export. - btnReadAllRegisters = new Button(); // Reads entire register set. - rtbAdvOutput = new RichTextBox(); // Advanced output log box. - tabSimulation = new TabPage(); // Simulation tab for charge profile emulation. - grpBxSimCustomProfile = new GroupBox(); // Custom profile input group. - lblCutoffRaw = new Label(); // Label describing raw cutoff value textbox. - lblMaxCurrAmps = new Label(); // Label for maximum current in amps. - txtMaxCurrAmps = new TextBox(); // Maximum current (amps) input. - lblMaxCurrRaw = new Label(); // Label for raw maximum current field. - txtCutoffAmps = new TextBox(); // Cutoff current (amps) input. - lblCutoffAmps = new Label(); // Label for cutoff amps field. - txtMaxCurrRaw = new TextBox(); // Raw maximum current value input. - txtCutoffRaw = new TextBox(); // Raw cutoff current value input. - txtSimDuration = new TextBox(); // Simulation duration input. - btnStopSim = new Button(); // Button to stop simulation loop. - btnStartSim = new Button(); // Button to start simulation loop. - lblSimProfile = new Label(); // Label for profile dropdown. - lblBaudRate = new Label(); // Label for baud rate dropdown. - lblDuration = new Label(); // Label for duration input. - cmbBxChgProfile = new ComboBox(); // Predefined charging profiles. - cmbBxBaudRate = new ComboBox(); // Baud rate selection for simulation. - tabDiagnostics = new TabPage(); // Diagnostics tab for capturing user input in log format. - btnClearDiagForm = new Button(); // Clears diagnostics form fields. - grpboxDiagOutput = new GroupBox(); // Container for diagnostics output log. - rtbSubmitDiagReadOnly = new RichTextBox(); // Read-only diagnostics output box. - lblType = new Label(); // Label for battery type field. - lblStickerInfo = new Label(); // Label for sticker info field. - lblToolSerialNum = new Label(); // Label for tool serial number field. - lblSubmitDiagDate = new Label(); // Label for submission date field. - lblOneKeyID = new Label(); // Label for One-Key ID field. - txtSubmitDiagDate = new TextBox(); // Date input. - txtSubmitDiagSerial = new TextBox(); // Serial number input. - txtSubmitDiagSticker = new TextBox(); // Sticker info input. - txtSubmitDiagType = new TextBox(); // Type input. - txtOneKeyID = new TextBox(); // One-Key ID input. - btnSubmitDiagForm = new Button(); // Submits diagnostics info to output box. - tabAbout = new TabPage(); // About tab with credits. - linkLabelKillaVolt = new LinkLabel(); // Hyperlink to KillaVolt resources. - lblKillaVoltAbout = new Label(); // Label describing KillaVolt. - linkLabelMartin = new LinkLabel(); // Hyperlink to martin/other contributor. - lblMartin = new Label(); // Label describing martin's contributions. - lblAboutTitle = new Label(); // Title label for About tab. - toolTipSimpleTab = new ToolTip(components); // Tooltip component shared across controls. + { + components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); + tabControlM18Main = new TabControl(); + tabSimple = new TabPage(); + btnTestFT232 = new Button(); + grpOutput = new GroupBox(); + btnTestEcho = new Button(); + btnCopyOutput = new Button(); + btnReset = new Button(); + btnHealthReport = new Button(); + btnActive = new Button(); + rtbOutput = new RichTextBox(); + btnIdle = new Button(); + btnDisconnect = new Button(); + btnConnect = new Button(); + btnRefresh = new Button(); + lblSerialPort = new Label(); + cmbBxSerialPort = new ComboBox(); + tabAdvanced = new TabPage(); + btnRestoreTxRxState = new Button(); + grpTryCmd = new GroupBox(); + txtTryCmdLength = new TextBox(); + txtAddressLow = new TextBox(); + txtAddressHigh = new TextBox(); + lblTryCmdLength = new Label(); + lblAddressLow = new Label(); + lblAddrHigh = new Label(); + lblCommand = new Label(); + txtCommand = new TextBox(); + grpbxDebugCmd = new GroupBox(); + txtResponseLength = new TextBox(); + txtDebugCmdLength = new TextBox(); + txtAddrLSB = new TextBox(); + lblResponseLength = new Label(); + lblDebugCmdLength = new Label(); + lblLSB = new Label(); + lblMSB = new Label(); + txtAddrMSB = new TextBox(); + btnFullBrute = new Button(); + btnBruteAddr = new Button(); + btnSaveTxRxState = new Button(); + chkboxRxLog = new CheckBox(); + chkbxTXLog = new CheckBox(); + txtWriteMessage = new TextBox(); + btnWriteMessage = new Button(); + btnReadIDLabelled = new Button(); + btnReadIDRaw = new Button(); + btnReadAllSpreadsheet = new Button(); + btnReadAllRegisters = new Button(); + rtbAdvOutput = new RichTextBox(); + tabSimulation = new TabPage(); + grpBxSimCustomProfile = new GroupBox(); + lblCutoffRaw = new Label(); + lblMaxCurrAmps = new Label(); + txtMaxCurrAmps = new TextBox(); + lblMaxCurrRaw = new Label(); + txtCutoffAmps = new TextBox(); + lblCutoffAmps = new Label(); + txtMaxCurrRaw = new TextBox(); + txtCutoffRaw = new TextBox(); + txtSimDuration = new TextBox(); + btnStopSim = new Button(); + btnStartSim = new Button(); + lblSimProfile = new Label(); + lblBaudRate = new Label(); + lblDuration = new Label(); + cmbBxChgProfile = new ComboBox(); + cmbBxBaudRate = new ComboBox(); + tabDiagnostics = new TabPage(); + btnClearDiagForm = new Button(); + grpboxDiagOutput = new GroupBox(); + rtbSubmitDiagReadOnly = new RichTextBox(); + lblType = new Label(); + lblStickerInfo = new Label(); + lblToolSerialNum = new Label(); + lblSubmitDiagDate = new Label(); + lblOneKeyID = new Label(); + txtSubmitDiagDate = new TextBox(); + txtSubmitDiagSerial = new TextBox(); + txtSubmitDiagSticker = new TextBox(); + txtSubmitDiagType = new TextBox(); + txtOneKeyID = new TextBox(); + btnSubmitDiagForm = new Button(); + tabAbout = new TabPage(); + linkLabelKillaVolt = new LinkLabel(); + lblKillaVoltAbout = new Label(); + linkLabelMartin = new LinkLabel(); + lblMartin = new Label(); + lblAboutTitle = new Label(); + toolTipSimpleTab = new ToolTip(components); rtbDebugOutput = new RichTextBox(); tabControlM18Main.SuspendLayout(); tabSimple.SuspendLayout(); @@ -161,7 +153,7 @@ private void InitializeComponent() tabControlM18Main.Margin = new Padding(2); tabControlM18Main.Name = "tabControlM18Main"; tabControlM18Main.SelectedIndex = 0; - tabControlM18Main.Size = new Size(762, 394); + tabControlM18Main.Size = new Size(1098, 394); tabControlM18Main.TabIndex = 0; // // tabSimple @@ -177,7 +169,7 @@ private void InitializeComponent() tabSimple.Margin = new Padding(2); tabSimple.Name = "tabSimple"; tabSimple.Padding = new Padding(2); - tabSimple.Size = new Size(754, 361); + tabSimple.Size = new Size(1090, 361); tabSimple.TabIndex = 0; tabSimple.Text = "Simple"; tabSimple.UseVisualStyleBackColor = true; @@ -205,14 +197,14 @@ private void InitializeComponent() grpOutput.Margin = new Padding(2); grpOutput.Name = "grpOutput"; grpOutput.Padding = new Padding(2); - grpOutput.Size = new Size(739, 282); + grpOutput.Size = new Size(971, 282); grpOutput.TabIndex = 6; grpOutput.TabStop = false; grpOutput.Text = "Output"; // // btnTestEcho // - btnTestEcho.Location = new Point(616, 176); + btnTestEcho.Location = new Point(832, 176); btnTestEcho.Name = "btnTestEcho"; btnTestEcho.Size = new Size(120, 29); btnTestEcho.TabIndex = 12; @@ -222,7 +214,7 @@ private void InitializeComponent() // // btnCopyOutput // - btnCopyOutput.Location = new Point(616, 120); + btnCopyOutput.Location = new Point(832, 120); btnCopyOutput.Margin = new Padding(2); btnCopyOutput.Name = "btnCopyOutput"; btnCopyOutput.Size = new Size(118, 27); @@ -233,7 +225,7 @@ private void InitializeComponent() // // btnReset // - btnReset.Location = new Point(616, 248); + btnReset.Location = new Point(832, 248); btnReset.Margin = new Padding(2); btnReset.Name = "btnReset"; btnReset.Size = new Size(118, 27); @@ -244,7 +236,7 @@ private void InitializeComponent() // // btnHealthReport // - btnHealthReport.Location = new Point(616, 88); + btnHealthReport.Location = new Point(832, 88); btnHealthReport.Margin = new Padding(2); btnHealthReport.Name = "btnHealthReport"; btnHealthReport.Size = new Size(118, 27); @@ -255,7 +247,7 @@ private void InitializeComponent() // // btnActive // - btnActive.Location = new Point(616, 56); + btnActive.Location = new Point(832, 56); btnActive.Margin = new Padding(2); btnActive.Name = "btnActive"; btnActive.Size = new Size(118, 27); @@ -271,14 +263,14 @@ private void InitializeComponent() rtbOutput.Location = new Point(5, 24); rtbOutput.Margin = new Padding(2); rtbOutput.Name = "rtbOutput"; - rtbOutput.Size = new Size(603, 252); + rtbOutput.Size = new Size(811, 252); rtbOutput.TabIndex = 0; rtbOutput.Text = resources.GetString("rtbOutput.Text"); rtbOutput.TextChanged += rtbOutput_TextChanged; // // btnIdle // - btnIdle.Location = new Point(616, 24); + btnIdle.Location = new Point(832, 24); btnIdle.Margin = new Padding(2); btnIdle.Name = "btnIdle"; btnIdle.Size = new Size(118, 27); @@ -1108,7 +1100,7 @@ private void InitializeComponent() rtbDebugOutput.Location = new Point(8, 400); rtbDebugOutput.Margin = new Padding(2); rtbDebugOutput.Name = "rtbDebugOutput"; - rtbDebugOutput.Size = new Size(754, 168); + rtbDebugOutput.Size = new Size(1136, 224); rtbDebugOutput.TabIndex = 1; rtbDebugOutput.Text = ""; // @@ -1116,7 +1108,7 @@ private void InitializeComponent() // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(768, 576); + ClientSize = new Size(1155, 637); Controls.Add(rtbDebugOutput); Controls.Add(tabControlM18Main); Icon = (Icon)resources.GetObject("$this.Icon"); diff --git a/M18AnalyzerMain.resx b/M18AnalyzerMain.resx index 0ca5ce8..460cf1d 100644 --- a/M18AnalyzerMain.resx +++ b/M18AnalyzerMain.resx @@ -252,9 +252,6 @@ Step 4: Set Idle (Tx Low) before unplugging battery and/or disconnecting the ser IOkQGhLK9WiedIH9HyjtxGfo3wGRAAAAAElFTkSuQmCC - - 9, 21 - 68 diff --git a/m18.py b/m18.py index 0ff49cc..09ea439 100644 --- a/m18.py +++ b/m18.py @@ -846,7 +846,7 @@ def health(self, force_refresh = True): # turn off debugging messages - self.txrx_save_and_set(False) + self.txrx_save_and_set(True) try: print("Reading battery. This will take 5-10sec\n") From 98e7235ffcdf955ab63d27b3637ec07a56e51457 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 09:25:32 -0500 Subject: [PATCH 46/61] Align C# protocol reset/read handling with Python --- M18Protocol.cs | 61 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index a7e7007..9a9c4ea 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -391,6 +391,8 @@ public void Send(byte[] command) msb[i] = ReverseBits(command[i]); // Reverse each byte so bits are transmitted MSB-first as device expects. } + LogDebug($"Sending raw wire bytes (MSB): {FormatBytes(msb)}. Logical bytes (LSB): {FormatBytes(command)}."); // Provide both wire and logical views for debugging. + if (PrintTx) { var builder = new StringBuilder(); // Build hex string for UI logging. @@ -403,7 +405,7 @@ public void Send(byte[] command) } } - var logMessage = $"TX: {builder}"; // Prefix with TX for disambiguation in UI. + var logMessage = $"Sending: {builder}"; // Match Python log format for transmitted bytes. TxLogger?.Invoke(logMessage); // Notify UI logger delegate to show in rich text box. Console.WriteLine(logMessage); // Also emit to console (useful when running headless). } @@ -463,38 +465,46 @@ public byte[] ReadResponse(int size) } var msbResponse = new List { (byte)firstByte }; // Seed response with first MSB-ordered byte. - int remaining = ReverseBits((byte)firstByte) == 0x82 ? 1 : Math.Max(0, size - 1); // If first LSB byte equals 0x82 (after reversing), expect one more byte; otherwise size-1. + var lsbResponse = new List { ReverseBits((byte)firstByte) }; // Reverse immediately as Python does. + + int remaining = lsbResponse[0] == 0x82 ? 1 : Math.Max(0, size - 1); // Determine exact follow-up read size based on reversed first byte. - LogDebug($"First byte received (MSB): 0x{firstByte:X2}. Calculated remaining bytes to read: {remaining}."); // Trace first byte and expected remaining count. + LogDebug($"First byte received. Raw (MSB): 0x{firstByte:X2}, reversed (LSB): 0x{lsbResponse[0]:X2}. Calculated remaining bytes to read: {remaining}."); // Trace first byte and expectation. if (remaining > 0) { LogDebug($"Reading remaining {remaining} byte(s) from serial port."); // Note continuation. - msbResponse.AddRange(ReadAvailable(remaining)); // Read remaining bytes using buffered helper. + var remainingBytes = ReadAvailable(remaining).ToArray(); + msbResponse.AddRange(remainingBytes); + foreach (var b in remainingBytes) + { + lsbResponse.Add(ReverseBits(b)); + } } - var lsbResponse = msbResponse.Select(ReverseBits).ToArray(); // Convert MSB-ordered bytes back to LSB representation for processing. - - LogDebug($"Full response received (LSB): {FormatBytes(lsbResponse)}."); // Trace final decoded response. + LogDebug($"Full response wire bytes (MSB): {FormatBytes(msbResponse)}."); // Show raw bytes. + LogDebug($"Full response logical bytes (LSB): {FormatBytes(lsbResponse)}."); // Show reversed bytes. if (PrintRx) { var builder = new StringBuilder(); // Build hex string for logs. - for (int i = 0; i < lsbResponse.Length; i++) + for (int i = 0; i < lsbResponse.Count; i++) { builder.Append(lsbResponse[i].ToString("X2")); // Append each byte in hex. - if (i < lsbResponse.Length - 1) + if (i < lsbResponse.Count - 1) { builder.Append(' '); // Separate with space. } } - var logMessage = $"RX: {builder}"; // Prefix to indicate receive direction. + var logMessage = $"Received: {builder}"; // Match Python log format for received bytes. RxLogger?.Invoke(logMessage); // Notify UI logger delegate. Console.WriteLine(logMessage); // Emit to console for CLI scenarios. } - return lsbResponse; // Return decoded payload to caller for further parsing. + Thread.Sleep(50); // Match Python delay after receiving bytes. + + return lsbResponse.ToArray(); // Return decoded payload to caller for further parsing. } /// @@ -529,15 +539,38 @@ public bool Reset() try { LogDebug("Awaiting reset response after SYNC byte."); // Trace waiting state. - var response = ReadResponse(1); // Expect single byte echo. - var success = response.Length > 0 && response[0] == SYNC_BYTE; // Evaluate acknowledgement. - LogDebug($"Reset response {(success ? "acknowledged" : "did not match expected SYNC")}."); // Report result. + int responseByte = _port.ReadByte(); // Read exactly one byte as Python does. + if (responseByte < 0) + { + throw new InvalidOperationException("Empty response"); // Mirror Python exception semantics. + } + + byte responseMsb = (byte)responseByte; + byte responseLsb = ReverseBits(responseMsb); + + LogDebug($"Reset response wire byte (MSB): 0x{responseMsb:X2}. Reversed logical byte (LSB): 0x{responseLsb:X2}."); // Report raw and logical response. + + if (PrintRx) + { + var rxMessage = $"Received: {responseLsb:X2}"; // Match Python formatting for single-byte receive. + RxLogger?.Invoke(rxMessage); + Console.WriteLine(rxMessage); + } + + Thread.Sleep(50); // Align with Python's post-read delay. + + var success = responseLsb == SYNC_BYTE; // Evaluate acknowledgement against reversed byte. + LogDebug($"Reset response {(success ? "acknowledged" : "did not match expected SYNC")} after bit reversal."); // Report result. if (success) { Thread.Sleep(10); // Brief pause to stabilize before further commands. return true; // Signal reset success. } } + catch (TimeoutException ex) + { + LogDebug($"Reset attempt {attempt} timed out waiting for response: {ex.GetType().Name} - {ex.Message}"); // Report timeout. + } catch (InvalidOperationException ex) { LogDebug($"Reset attempt {attempt} failed: {ex.GetType().Name} - {ex.Message}"); // Report timeout or read issues. From ce4282b433e11215de477d3bfaa2cb928b72cf07 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 10:05:19 -0500 Subject: [PATCH 47/61] Removed Test Raw Echo button. --- M18AnalyzerMain.Designer.cs | 249 +++++++++++++++++------------------- 1 file changed, 118 insertions(+), 131 deletions(-) diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 53dc4a8..4d883af 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -12,26 +12,26 @@ namespace M18BatteryInfo { partial class frmMain { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. @@ -44,7 +44,6 @@ private void InitializeComponent() tabSimple = new TabPage(); btnTestFT232 = new Button(); grpOutput = new GroupBox(); - btnTestEcho = new Button(); btnCopyOutput = new Button(); btnReset = new Button(); btnHealthReport = new Button(); @@ -186,7 +185,6 @@ private void InitializeComponent() // // grpOutput // - grpOutput.Controls.Add(btnTestEcho); grpOutput.Controls.Add(btnCopyOutput); grpOutput.Controls.Add(btnReset); grpOutput.Controls.Add(btnHealthReport); @@ -202,16 +200,6 @@ private void InitializeComponent() grpOutput.TabStop = false; grpOutput.Text = "Output"; // - // btnTestEcho - // - btnTestEcho.Location = new Point(832, 176); - btnTestEcho.Name = "btnTestEcho"; - btnTestEcho.Size = new Size(120, 29); - btnTestEcho.TabIndex = 12; - btnTestEcho.Text = "Test Raw Echo"; - btnTestEcho.UseVisualStyleBackColor = true; - btnTestEcho.Click += button1_Click; - // // btnCopyOutput // btnCopyOutput.Location = new Point(832, 120); @@ -352,7 +340,7 @@ private void InitializeComponent() tabAdvanced.Margin = new Padding(2); tabAdvanced.Name = "tabAdvanced"; tabAdvanced.Padding = new Padding(2); - tabAdvanced.Size = new Size(754, 361); + tabAdvanced.Size = new Size(1090, 361); tabAdvanced.TabIndex = 1; tabAdvanced.Text = "Advanced"; tabAdvanced.UseVisualStyleBackColor = true; @@ -689,7 +677,7 @@ private void InitializeComponent() tabSimulation.Margin = new Padding(2); tabSimulation.Name = "tabSimulation"; tabSimulation.Padding = new Padding(2); - tabSimulation.Size = new Size(754, 361); + tabSimulation.Size = new Size(1090, 361); tabSimulation.TabIndex = 2; tabSimulation.Text = "Simulation"; tabSimulation.UseVisualStyleBackColor = true; @@ -881,7 +869,7 @@ private void InitializeComponent() tabDiagnostics.Margin = new Padding(2); tabDiagnostics.Name = "tabDiagnostics"; tabDiagnostics.Padding = new Padding(2); - tabDiagnostics.Size = new Size(754, 361); + tabDiagnostics.Size = new Size(1090, 361); tabDiagnostics.TabIndex = 3; tabDiagnostics.Text = "Submit Diagnostics"; tabDiagnostics.UseVisualStyleBackColor = true; @@ -1028,7 +1016,7 @@ private void InitializeComponent() tabAbout.Margin = new Padding(2); tabAbout.Name = "tabAbout"; tabAbout.Padding = new Padding(2); - tabAbout.Size = new Size(754, 361); + tabAbout.Size = new Size(1090, 361); tabAbout.TabIndex = 4; tabAbout.Text = "About"; tabAbout.UseVisualStyleBackColor = true; @@ -1137,98 +1125,97 @@ private void InitializeComponent() tabAbout.ResumeLayout(false); tabAbout.PerformLayout(); ResumeLayout(false); - } - - #endregion - - private TabControl tabControlM18Main; - private TabPage tabSimple; - private TabPage tabAdvanced; - private ComboBox cmbBxSerialPort; - private RichTextBox rtbOutput; - private TabPage tabSimulation; - private TabPage tabDiagnostics; - private Button btnConnect; - private Button btnRefresh; - private Label lblSerialPort; - private GroupBox grpOutput; - private Button btnDisconnect; - private Button btnIdle; - private Button btnActive; - private ToolTip toolTipSimpleTab; - private Button btnHealthReport; - private Button btnReset; - private Button btnCopyOutput; - private Button btnReadAllSpreadsheet; - private Button btnReadAllRegisters; - private RichTextBox rtbAdvOutput; - private TextBox txtWriteMessage; - private Button btnWriteMessage; - private Button btnReadIDLabelled; - private Button btnReadIDRaw; - private TabPage tabAbout; - private CheckBox chkboxRxLog; - private CheckBox chkbxTXLog; - private Button btnSaveTxRxState; - private Button btnBruteAddr; - private Button btnFullBrute; - private GroupBox grpbxDebugCmd; - private TextBox txtAddrMSB; - private Label lblResponseLength; - private Label lblDebugCmdLength; - private Label lblLSB; - private Label lblMSB; - private TextBox txtResponseLength; - private TextBox txtDebugCmdLength; - private TextBox txtAddrLSB; - private GroupBox grpTryCmd; - private TextBox txtTryCmdLength; - private TextBox txtAddressLow; - private TextBox txtAddressHigh; - private Label lblTryCmdLength; - private Label lblAddressLow; - private Label lblAddrHigh; - private Label lblCommand; - private TextBox txtCommand; - private ComboBox cmbBxChgProfile; - private ComboBox cmbBxBaudRate; - private Button btnRestoreTxRxState; - private Button btnSubmitDiagForm; - private Label lblType; - private Label lblStickerInfo; - private Label lblToolSerialNum; - private Label lblSubmitDiagDate; - private Label lblOneKeyID; - private RichTextBox rtbSubmitDiagReadOnly; - private TextBox txtSubmitDiagDate; - private TextBox txtSubmitDiagSerial; - private TextBox txtSubmitDiagSticker; - private TextBox txtSubmitDiagType; - private TextBox txtOneKeyID; - private Button btnStartSim; - private Label lblSimProfile; - private Label lblBaudRate; - private Label lblDuration; - private Button btnStopSim; - private TextBox txtSimDuration; - private TextBox txtCutoffRaw; - private TextBox txtMaxCurrRaw; - private TextBox txtCutoffAmps; - private TextBox txtMaxCurrAmps; - private Label lblMaxCurrAmps; - private Label lblMaxCurrRaw; - private Label lblCutoffAmps; - private Label lblCutoffRaw; - private GroupBox grpboxDiagOutput; - private Button btnClearDiagForm; - private GroupBox grpBxSimCustomProfile; - private Label lblAboutTitle; - private LinkLabel linkLabelMartin; - private Label lblMartin; - private LinkLabel linkLabelKillaVolt; - private Label lblKillaVoltAbout; - private RichTextBox rtbDebugOutput; - private Button btnTestFT232; - private Button btnTestEcho; - } -} + } + + #endregion + + private TabControl tabControlM18Main; + private TabPage tabSimple; + private TabPage tabAdvanced; + private ComboBox cmbBxSerialPort; + private RichTextBox rtbOutput; + private TabPage tabSimulation; + private TabPage tabDiagnostics; + private Button btnConnect; + private Button btnRefresh; + private Label lblSerialPort; + private GroupBox grpOutput; + private Button btnDisconnect; + private Button btnIdle; + private Button btnActive; + private ToolTip toolTipSimpleTab; + private Button btnHealthReport; + private Button btnReset; + private Button btnCopyOutput; + private Button btnReadAllSpreadsheet; + private Button btnReadAllRegisters; + private RichTextBox rtbAdvOutput; + private TextBox txtWriteMessage; + private Button btnWriteMessage; + private Button btnReadIDLabelled; + private Button btnReadIDRaw; + private TabPage tabAbout; + private CheckBox chkboxRxLog; + private CheckBox chkbxTXLog; + private Button btnSaveTxRxState; + private Button btnBruteAddr; + private Button btnFullBrute; + private GroupBox grpbxDebugCmd; + private TextBox txtAddrMSB; + private Label lblResponseLength; + private Label lblDebugCmdLength; + private Label lblLSB; + private Label lblMSB; + private TextBox txtResponseLength; + private TextBox txtDebugCmdLength; + private TextBox txtAddrLSB; + private GroupBox grpTryCmd; + private TextBox txtTryCmdLength; + private TextBox txtAddressLow; + private TextBox txtAddressHigh; + private Label lblTryCmdLength; + private Label lblAddressLow; + private Label lblAddrHigh; + private Label lblCommand; + private TextBox txtCommand; + private ComboBox cmbBxChgProfile; + private ComboBox cmbBxBaudRate; + private Button btnRestoreTxRxState; + private Button btnSubmitDiagForm; + private Label lblType; + private Label lblStickerInfo; + private Label lblToolSerialNum; + private Label lblSubmitDiagDate; + private Label lblOneKeyID; + private RichTextBox rtbSubmitDiagReadOnly; + private TextBox txtSubmitDiagDate; + private TextBox txtSubmitDiagSerial; + private TextBox txtSubmitDiagSticker; + private TextBox txtSubmitDiagType; + private TextBox txtOneKeyID; + private Button btnStartSim; + private Label lblSimProfile; + private Label lblBaudRate; + private Label lblDuration; + private Button btnStopSim; + private TextBox txtSimDuration; + private TextBox txtCutoffRaw; + private TextBox txtMaxCurrRaw; + private TextBox txtCutoffAmps; + private TextBox txtMaxCurrAmps; + private Label lblMaxCurrAmps; + private Label lblMaxCurrRaw; + private Label lblCutoffAmps; + private Label lblCutoffRaw; + private GroupBox grpboxDiagOutput; + private Button btnClearDiagForm; + private GroupBox grpBxSimCustomProfile; + private Label lblAboutTitle; + private LinkLabel linkLabelMartin; + private Label lblMartin; + private LinkLabel linkLabelKillaVolt; + private Label lblKillaVoltAbout; + private RichTextBox rtbDebugOutput; + private Button btnTestFT232; + } +} From 9e0d633362fd14bb897cfe8016126f094fa4d232 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 10:08:40 -0500 Subject: [PATCH 48/61] Align serial control line initialization with pyserial --- M18Protocol.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index 9a9c4ea..6948da6 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -277,10 +277,12 @@ public M18Protocol(string portName, Action? debugLogger = null) WriteTimeout = 800 // Set write timeout to fail fast if driver stalls. }; + _port.DtrEnable = true; // Match pyserial default before opening the port. + _port.RtsEnable = false; // Match pyserial default before opening the port. + LogDebug($"Control line defaults before open: DTR={_port.DtrEnable}, RTS={_port.RtsEnable}."); // Trace pre-open control-line states. LogDebug("Opening serial port..."); // Trace start of open call. _port.Open(); // Acquire OS handle; this toggles control lines to default states. - LogDebug("Serial port opened. Setting TX to idle state."); // Notify that handle is open. - Idle(); // Immediately assert BreakState/DTR to drive TX low; prevents spurious high pulses on battery pin. + LogDebug($"Serial port opened. Control lines after open: DTR={_port.DtrEnable}, RTS={_port.RtsEnable}."); // Confirm open and capture post-open states. LogDebug("Protocol initialization complete."); // Signal completion. } From 147923c3f820720c02723724e40fdfd25c15a7e9 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 10:40:55 -0500 Subject: [PATCH 49/61] Mirror Python protocol flow in C# --- M18Protocol.cs | 1551 +++++++++++++++++++++++++++--------------------- 1 file changed, 876 insertions(+), 675 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index 6948da6..788a239 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -1,60 +1,54 @@ // ************************************************************************************************* // M18Protocol.cs // -------------- -// Implements the Milwaukee M18 battery serial protocol in C#. The class encapsulates all UART -// command composition, bit-level encoding/decoding, and register parsing so that the WinForms UI -// (frmMain in M18AnalyzerMain.cs) can simply call high-level methods like Idle(), High(), -// HealthReport(), and Reset(). Control-line manipulation (BreakState and DtrEnable) is used to -// emulate charger signals electrically on the FT232 USB-UART bridge. Extensive comments explain the -// meaning of each operation, including how bytes flow to and from the hardware. +// Literal, instruction-for-instruction port of m18.py. Every sleep, buffer reset, control-line +// toggle, byte ordering rule, and logging string mirrors the Python implementation. The structure +// intentionally ignores .NET conventions so the execution order, timing, and side effects remain +// identical to the Python reference, including redundant operations and blocking behaviour. // ************************************************************************************************* -using System; // Core .NET types including DateTime, Array, and Action delegates. -using System.Collections.Generic; // Collections such as List and IEnumerable. -using System.IO.Ports; // SerialPort class for UART communication and control-line toggling. -using System.Linq; // LINQ helpers like Select, Aggregate, and Take for byte processing. -using System.Text; // StringBuilder for efficient log formatting and byte-to-hex conversion. -using System.Threading; // Thread.Sleep for deterministic protocol timing delays. -using System.Text.RegularExpressions; // Regex for parsing serial numbers and hardware IDs from responses. +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO.Ports; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; namespace M18BatteryInfo { - /// - /// C# port of the Python M18 protocol implementation. Wraps to expose - /// high-level methods for toggling TX line states, issuing reset sequences, and reading/writing - /// registers. Control lines map directly to physical UART pins: - /// drives the TX line low (space) while drives the DTR pin, - /// both of which connect to the battery's interface header. The class also formats verbose logs - /// for the WinForms UI to display. - /// public class M18Protocol { - // Protocol constants mirroring the Python implementation and datasheets. - public const byte SYNC_BYTE = 0xAA; // Sync byte used to initiate communication and acknowledge reset. - public const byte CAL_CMD = 0x55; // Calibration command identifier (not fully implemented here). - public const byte CONF_CMD = 0x60; // Configuration command base value. - public const byte SNAP_CMD = 0x61; // Snapshot command for specific data reads. - public const byte KEEPALIVE_CMD = 0x62; // Keepalive command to maintain session. - - // Current limits used when simulating charger load profiles. - public const int CUTOFF_CURRENT = 300; // Milliamps at which discharge is considered complete. - public const int MAX_CURRENT = 6000; // Milliamps representing maximum allowable current draw. - - public int Acc { get; private set; } = 4; // Protocol accumulator (used by Python port); kept for compatibility. - - public bool PrintTx { get; set; } = true; // When true, TX bytes are logged through TxLogger. - public bool PrintRx { get; set; } = true; // When true, RX bytes are logged through RxLogger. - - // Delegates that allow the UI to receive protocol events. frmMain sets these to append to rich text boxes. - public Action? TxLogger { get; set; } - public Action? RxLogger { get; set; } - public Action? DebugLogger { get; set; } - - // Pre-defined register ranges to request during initial read (mirrors Python data_matrix). - private readonly List<(byte AddrMsb, byte AddrLsb, byte Length)> _dataMatrix = new() + // --------------------------- + // Constants matching m18.py + // --------------------------- + public const byte SYNC_BYTE = 0xAA; + public const byte CAL_CMD = 0x55; + public const byte CONF_CMD = 0x60; + public const byte SNAP_CMD = 0x61; + public const byte KEEPALIVE_CMD = 0x62; + + public const int CUTOFF_CURRENT = 300; + public const int MAX_CURRENT = 6000; + + // --------------------------- + // State fields (mirror Python names and defaults) + // --------------------------- + public int ACC = 4; + public bool PRINT_TX = false; + public bool PRINT_RX = false; + public bool PRINT_TX_SAVE = false; + public bool PRINT_RX_SAVE = false; + + public SerialPort port; + + // --------------------------- + // Data tables copied verbatim from m18.py + // --------------------------- + private readonly List<(int, int, int)> data_matrix = new() { - // Each tuple describes a memory address (MSB/LSB) and how many bytes to read. These are - // executed by Cmd(addrMsb, addrLsb, length) in ReadId when forceRefresh is requested. (0x00, 0x00, 0x02), (0x00, 0x02, 0x02), (0x00, 0x04, 0x05), @@ -89,8 +83,7 @@ public class M18Protocol (0xA0, 0x00, 0x06) }; - // Human-readable descriptions for register addresses used by HealthReport and diagnostic reads. - private readonly List<(ushort Address, byte Length, string Type, string Label)> _dataId = new() + private readonly List<(int, int, string, string)> data_id = new() { (0x0000, 2, "uint", "Cell type"), (0x0002, 2, "uint", "Unknown (always 0)"), @@ -233,833 +226,1041 @@ public class M18Protocol (0xA000, 6, "uint", "Unknown (Forge)") }; - private readonly SerialPort _port; - private bool _disposed; - private bool? _savedPrintTx; - private bool? _savedPrintRx; + // ------------------------------------- + // Helper exception to mirror Python usage + // ------------------------------------- + private class ValueError : Exception + { + public ValueError(string message) : base(message) { } + } - public SerialPort Port => _port; // Exposes the underlying SerialPort so UI can run diagnostic echo tests. + // ------------------------------------- + // Debug byte printer (identical format) + // ------------------------------------- + public static void print_debug_bytes(IEnumerable data) + { + var dataPrint = string.Join(" ", GetHex(data)); + Console.WriteLine("DEBUG: " + dataPrint); + } - /// - /// Ensures the serial port is open and the protocol has not been disposed before performing - /// operations. Returns false and logs a message when actions should be skipped. - /// - private bool EnsurePortOpen(string operation) + private static IEnumerable GetHex(IEnumerable bytes) { - if (_disposed) + foreach (var b in bytes) { - LogDebug($"{operation} skipped because protocol is disposed."); // Warn when caller uses disposed instance. - return false; // Abort operation. + yield return $"{b:02X}"; } + } - if (!_port.IsOpen) + // ------------------------------------- + // Constructor mirroring __init__ in m18.py + // ------------------------------------- + public M18Protocol(string? portName) + { + if (portName == null) { - LogDebug($"{operation} skipped because serial port {_port.PortName} is not open."); // Note closed port state. - return false; // Abort because control lines cannot be toggled on a closed port. + Console.WriteLine("*** NO PORT SPECIFIED ***"); + Console.WriteLine("Available serial ports (choose one that says USB somewhere):"); + + var ports = SerialPortUtil.EnumerateDetailedPorts(); + var i = 1; + foreach (var p in ports) + { + Console.WriteLine($" {i}: {p.PortName} - {p.Manufacturer} - {p.FriendlyName ?? p.Description}"); + i = i + 1; + } + + var portId = 0; + while ((portId < 1) || (portId >= i)) + { + Console.Write($"Choose a port (1-{i - 1}): "); + var userPort = Console.ReadLine(); + try + { + portId = int.Parse(userPort ?? string.Empty, CultureInfo.InvariantCulture); + } + catch (Exception) + { + Console.WriteLine("Invalid input. Please enter a number"); + } + } + + var p = ports[portId - 1]; + Console.WriteLine($"You selected \"{p.PortName} - {p.Manufacturer} - {p.FriendlyName ?? p.Description}\""); + Console.WriteLine($"In future, use \"m18.py --port {p.PortName}\" to avoid this menu"); + Console.Write("Press Enter to continue"); + Console.ReadLine(); + + portName = p.PortName; } - return true; // Port is available. + port = new SerialPort(portName, 4800, Parity.None, 8, StopBits.Two) + { + ReadTimeout = 800, + WriteTimeout = 800 + }; + port.Open(); + idle(); } - /// - /// Constructs the protocol handler, opens the specified serial port with correct UART - /// settings (4800 8N2), and immediately drives TX to idle (BreakState/DTR true) to avoid - /// sending unintended pulses to the battery. The optional - /// allows the UI to capture initialization details. - /// - public M18Protocol(string portName, Action? debugLogger = null) + // ------------------------------------- + // Logging flag helpers (match Python naming and behaviour) + // ------------------------------------- + public void txrx_print(bool enable = true) { - DebugLogger = debugLogger; // Store logger delegate so we can write debug lines throughout the class. - LogDebug($"Initializing protocol for port {portName}."); // Inform caller about port selection. - _port = new SerialPort(portName, 4800, Parity.None, 8, StopBits.Two) // Configure UART to match battery protocol (4800 baud, 8 data bits, 2 stop bits). - { - ReadTimeout = 1200, // Set read timeout so calls to ReadByte() don't hang indefinitely. - WriteTimeout = 800 // Set write timeout to fail fast if driver stalls. - }; + PRINT_TX = enable; + PRINT_RX = enable; + } - _port.DtrEnable = true; // Match pyserial default before opening the port. - _port.RtsEnable = false; // Match pyserial default before opening the port. - LogDebug($"Control line defaults before open: DTR={_port.DtrEnable}, RTS={_port.RtsEnable}."); // Trace pre-open control-line states. - LogDebug("Opening serial port..."); // Trace start of open call. - _port.Open(); // Acquire OS handle; this toggles control lines to default states. - LogDebug($"Serial port opened. Control lines after open: DTR={_port.DtrEnable}, RTS={_port.RtsEnable}."); // Confirm open and capture post-open states. - LogDebug("Protocol initialization complete."); // Signal completion. + public void txrx_save_and_set(bool enable = true) + { + PRINT_TX_SAVE = PRINT_TX; + PRINT_RX_SAVE = PRINT_RX; + txrx_print(enable); } - public string PortName => _port.PortName; // Convenience property used by frmMain for display and comparisons. - public bool IsOpen => _port.IsOpen; // Exposes port state so UI can check connectivity. + public void txrx_restore() + { + PRINT_TX = PRINT_TX_SAVE; + PRINT_RX = PRINT_RX_SAVE; + } - /// - /// Reverses the bit order of a byte (LSB to MSB) because the protocol transmits bytes with - /// bits reversed relative to how they are represented in memory. This mirrors Python's - /// reverse_bits function and is applied before sending/after receiving. - /// - public byte ReverseBits(byte value) + // ------------------------------------- + // Reset: identical control-line toggles, sleeps, send, and idle logic + // ------------------------------------- + public bool reset() { - LogDebug($"ReverseBits called with value 0x{value:X2}."); // Trace incoming value. - byte reversed = 0; // Start with zero so we can shift bits in. - for (int i = 0; i < 8; i++) + ACC = 4; + port.BreakState = true; + port.DtrEnable = true; + Thread.Sleep(300); + port.BreakState = false; + port.DtrEnable = false; + Thread.Sleep(300); + send(new[] { SYNC_BYTE }); + try + { + var response = read_response(1); + Thread.Sleep(10); + if (response.Length > 0 && response[0] == SYNC_BYTE) + { + return true; + } + Console.WriteLine($"Unexpected response: {string.Join(\" \", GetHex(response))}"); + return false; + } + catch (ValueError) { - reversed <<= 1; // Make room for next bit by shifting left. - reversed |= (byte)((value >> i) & 0x01); // Extract bit i from original (LSB-first) and OR into result. + return false; } + } - LogDebug($"ReverseBits returning 0x{reversed:X2}."); // Trace output for debugging. - return reversed; // Return reversed byte used for MSB-first serial I/O. + // ------------------------------------- + // Utility helpers mapped directly + // ------------------------------------- + public void update_acc() + { + var accValues = new List { 0x04, 0x0C, 0x1C }; + var currentIndex = accValues.IndexOf(ACC); + var nextIndex = (currentIndex + 1) % accValues.Count; + ACC = accValues[nextIndex]; } - /// - /// Computes a simple additive checksum across the provided payload (sum of bytes, mod 2^16). - /// The M18 protocol appends this 16-bit checksum to commands to help the battery validate - /// data integrity. - /// - public int Checksum(IEnumerable payload) + public int reverse_bits(int value) { - if (payload == null) - { - LogDebug("Checksum called with null payload."); // Guard against null reference misuse. - throw new ArgumentNullException(nameof(payload)); // Propagate argument error to caller. - } + return Convert.ToInt32(string.Concat(Convert.ToString(value & 0xFF, 2).PadLeft(8, '0').Reverse()), 2); + } - LogDebug("Checksum calculation started."); // Trace operation. - int checksum = 0; // Initialize accumulator. + public int checksum(IEnumerable payload) + { + var cksum = 0; foreach (var b in payload) { - checksum += b & 0xFFFF; // Add each byte value; mask not strictly necessary but keeps parity with Python implementation. + cksum += b & 0xFFFF; } + return cksum; + } - LogDebug($"Checksum calculation complete: {checksum & 0xFFFF}."); // Trace final checksum (16-bit value). - return checksum; // Return full integer; caller masks to 16 bits when writing bytes. + public byte[] add_checksum(List lsbCommand) + { + var cksum = checksum(lsbCommand); + lsbCommand.AddRange(BitConverter.GetBytes((ushort)cksum).Reverse()); + return lsbCommand.ToArray(); } - /// - /// Appends a 2-byte checksum to the provided payload (LSB first). The checksum is computed - /// using and returned as a new byte array ready for - /// transmission over the UART. - /// - public byte[] AddChecksum(byte[] lsbCommand) + // ------------------------------------- + // Send path (input buffer reset + bit reversal + optional log) + // ------------------------------------- + public void send(byte[] command) { - if (lsbCommand == null) + port.DiscardInBuffer(); + var debugPrint = string.Join(" ", GetHex(command)); + var msb = new List(); + foreach (var b in command) { - LogDebug("AddChecksum called with null lsbCommand."); // Alert misuse. - throw new ArgumentNullException(nameof(lsbCommand)); // Throw to fail fast. + msb.Add((byte)reverse_bits(b)); } - LogDebug($"AddChecksum called for payload length {lsbCommand.Length}."); // Trace size for debugging. - int checksum = Checksum(lsbCommand); // Compute additive checksum. - var withChecksum = new byte[lsbCommand.Length + 2]; // Allocate new array with two extra bytes. - Buffer.BlockCopy(lsbCommand, 0, withChecksum, 0, lsbCommand.Length); // Copy original payload into new array. + if (PRINT_TX) + { + Console.WriteLine($"Sending: {debugPrint}"); + } - withChecksum[withChecksum.Length - 2] = (byte)((checksum >> 8) & 0xFF); // Append high byte of checksum. - withChecksum[withChecksum.Length - 1] = (byte)(checksum & 0xFF); // Append low byte of checksum. + port.Write(msb.ToArray(), 0, msb.Count); + } - LogDebug($"Checksum {checksum & 0xFFFF} appended. Final payload: {FormatBytes(withChecksum)}."); // Trace final buffer for logging panel. - return withChecksum; // Return ready-to-send buffer (LSB-ordered before bit reversal). + public void send_command(byte[] command) + { + send(add_checksum(new List(command))); } - /// - /// Sends a prepared command (LSB bit order) over the serial port after reversing bits for - /// MSB-first transmission. Also logs the TX bytes when requested. - /// - public void Send(byte[] command) + // ------------------------------------- + // Read path (exact ordering and timing) + // ------------------------------------- + public byte[] read_response(int size) { - if (command == null) + var msbResponse = new List(); + var first = ReadOneByte(); + msbResponse.Add(first); + if (reverse_bits(first) == 0x82) { - LogDebug("Send called with null command."); // Guard against misuse. - throw new ArgumentNullException(nameof(command)); // Fail fast to avoid null reference. + msbResponse.Add(ReadOneByte()); } - - if (!EnsurePortOpen("Send")) + else { - return; // Skip when port unavailable. + for (var i = 0; i < size - 1; i++) + { + msbResponse.Add(ReadOneByte()); + } } - LogDebug($"Send called with command length {command.Length}. Raw payload: {FormatBytes(command)}."); // Trace outgoing payload. - - try + var lsbResponse = new List(); + foreach (var b in msbResponse) { - _port.DiscardInBuffer(); // Clear any stale incoming bytes to avoid mixing responses. - LogDebug("Input buffer discarded prior to send."); // Confirm buffer clear. + lsbResponse.Add((byte)reverse_bits(b)); } - catch (Exception ex) when (ex is InvalidOperationException || ex is ObjectDisposedException) + + var debugPrint = string.Join(" ", GetHex(lsbResponse)); + if (PRINT_RX) { - LogDebug($"DiscardInBuffer skipped because port is not available: {ex.GetType().Name} - {ex.Message}"); // Log and exit if port not usable. - return; + Console.WriteLine($"Received: {debugPrint}"); } + Thread.Sleep(50); + return lsbResponse.ToArray(); + } - var msb = new byte[command.Length]; // Allocate buffer for bit-reversed bytes. - for (int i = 0; i < command.Length; i++) + private byte ReadOneByte() + { + var buffer = new byte[1]; + var read = port.Read(buffer, 0, 1); + if (read < 1) { - msb[i] = ReverseBits(command[i]); // Reverse each byte so bits are transmitted MSB-first as device expects. + throw new ValueError("Empty response"); } + return buffer[0]; + } + + // ------------------------------------- + // Protocol commands + // ------------------------------------- + public byte[] configure(byte state) + { + ACC = 4; + var cmd = new List(); + cmd.Add(CONF_CMD); + cmd.Add((byte)ACC); + cmd.Add(8); + cmd.AddRange(BitConverter.GetBytes((ushort)CUTOFF_CURRENT).Reverse()); + cmd.AddRange(BitConverter.GetBytes((ushort)MAX_CURRENT).Reverse()); + cmd.AddRange(BitConverter.GetBytes((ushort)MAX_CURRENT).Reverse()); + cmd.Add(state); + cmd.Add(13); + send_command(cmd.ToArray()); + return read_response(5); + } + + public byte[] get_snapchat() + { + var cmd = new List { SNAP_CMD, (byte)ACC, 0 }; + send_command(cmd.ToArray()); + update_acc(); + return read_response(8); + } + + public byte[] keepalive() + { + var cmd = new List { KEEPALIVE_CMD, (byte)ACC, 0 }; + send_command(cmd.ToArray()); + return read_response(9); + } + + public byte[] calibrate() + { + var cmd = new List { CAL_CMD, (byte)ACC, 0 }; + send_command(cmd.ToArray()); + update_acc(); + return read_response(8); + } + + // ------------------------------------- + // Charger simulation routines + // ------------------------------------- + public void simulate() + { + Console.WriteLine("Simulating charger communication"); + txrx_save_and_set(true); - LogDebug($"Sending raw wire bytes (MSB): {FormatBytes(msb)}. Logical bytes (LSB): {FormatBytes(command)}."); // Provide both wire and logical views for debugging. + reset(); - if (PrintTx) + configure(2); + get_snapchat(); + Thread.Sleep(600); + keepalive(); + configure(1); + get_snapchat(); + try { - var builder = new StringBuilder(); // Build hex string for UI logging. - for (int i = 0; i < command.Length; i++) + while (true) { - builder.Append(command[i].ToString("X2")); // Append LSB-order byte for readability. - if (i < command.Length - 1) - { - builder.Append(' '); // Separate bytes with spaces for clarity. - } + Thread.Sleep(500); + keepalive(); } - - var logMessage = $"Sending: {builder}"; // Match Python log format for transmitted bytes. - TxLogger?.Invoke(logMessage); // Notify UI logger delegate to show in rich text box. - Console.WriteLine(logMessage); // Also emit to console (useful when running headless). } - - try + catch (ThreadInterruptedException) { - _port.Write(msb, 0, msb.Length); // Stream bytes over UART using FT232 driver; TX pin toggles bits on physical line. - LogDebug($"Command sent over serial: {FormatBytes(msb)} (MSB)."); // Trace MSB-encoded payload. + Console.WriteLine("\nSimulation aborted by user. Exiting gracefully..."); } - catch (Exception ex) when (ex is InvalidOperationException || ex is ObjectDisposedException) + finally { - LogDebug($"Send aborted because port is not available: {ex.GetType().Name} - {ex.Message}"); // Note failure without throwing to allow UI recovery. + idle(); } - } - /// - /// Adds a checksum to the provided command and transmits it via . - /// - public void SendCommand(byte[] command) - { - LogDebug("SendCommand invoked."); // Trace wrapper usage. - Send(AddChecksum(command)); // Compose checksumed payload then send. + txrx_restore(); } - /// - /// Reads a response of the specified size, reversing bits back to LSB order and logging when - /// enabled. Throws InvalidOperationException on timeout to mirror Python behavior. - /// - public byte[] ReadResponse(int size) + public void simulate_for(double duration) { - if (!EnsurePortOpen("ReadResponse")) - { - return Array.Empty(); // Return empty array when port unavailable. - } - - LogDebug($"ReadResponse called with expected size {size}."); // Trace expected length. - int firstByte; + Console.WriteLine($"Simulating charger communication for {duration} seconds..."); + var beginTime = DateTime.UtcNow; + reset(); + configure(2); + get_snapchat(); + Thread.Sleep(600); + keepalive(); + configure(1); + get_snapchat(); try { - firstByte = _port.ReadByte(); // Block for first byte from RX line. + while ((DateTime.UtcNow - beginTime).TotalSeconds < duration) + { + Thread.Sleep(500); + keepalive(); + } } - catch (InvalidOperationException ex) + catch (ThreadInterruptedException) { - LogDebug($"ReadResponse skipped because port is unavailable: {ex.GetType().Name} - {ex.Message}"); // Log closed/ disposed port. - return Array.Empty(); // Return nothing to caller. + Console.WriteLine("\nSimulation aborted by user. Exiting gracefully..."); } - catch (TimeoutException) + finally { - LogDebug("ReadResponse timed out waiting for first byte."); // Trace timeout event. - throw new InvalidOperationException("Empty response"); // Match Python exception semantics for caller. + idle(); + Console.WriteLine("Duration: " + (DateTime.UtcNow - beginTime).TotalSeconds); } + } + + // ------------------------------------- + // Debug helpers + // ------------------------------------- + public void debug(byte a, byte b, byte c, int length) + { + var rxDebug = PRINT_RX; + var txDebug = PRINT_TX; + PRINT_TX = false; + PRINT_RX = false; + + reset(); + PRINT_TX = txDebug; + var data = cmd(a, b, c, length); + var dataPrint = string.Join(" ", GetHex(data)); + Console.WriteLine($"Response from: 0x{(a * 0x100 + b):04X}: {dataPrint}"); + idle(); + PRINT_RX = rxDebug; + } - if (firstByte < 0) + public void try_cmd(byte cmdByte, byte msb, byte lsb, byte length, int retLen = 0) + { + txrx_save_and_set(false); + if (retLen == 0) { - LogDebug("ReadResponse encountered invalid first byte (<0)."); // Negative return indicates stream ended. - throw new InvalidOperationException("Empty response"); // Propagate error. + retLen = length + 5; } - var msbResponse = new List { (byte)firstByte }; // Seed response with first MSB-ordered byte. - var lsbResponse = new List { ReverseBits((byte)firstByte) }; // Reverse immediately as Python does. - - int remaining = lsbResponse[0] == 0x82 ? 1 : Math.Max(0, size - 1); // Determine exact follow-up read size based on reversed first byte. + reset(); + var cmdBuf = new List { cmdByte, 0x04, 0x03, msb, lsb, length }; + send_command(cmdBuf.ToArray()); + var data = read_response(retLen); + var dataPrint = string.Join(" ", GetHex(data)); + Console.WriteLine($"Response from: 0x{(msb * 0x100 + lsb):04X}: {dataPrint}"); + idle(); + txrx_restore(); + } - LogDebug($"First byte received. Raw (MSB): 0x{firstByte:X2}, reversed (LSB): 0x{lsbResponse[0]:X2}. Calculated remaining bytes to read: {remaining}."); // Trace first byte and expectation. + public byte[] cmd(int a, int b, int c, int length, byte command = 0x01) + { + var cmdBuf = new List { command, 0x04, 0x03, (byte)a, (byte)b, (byte)c }; + send_command(cmdBuf.ToArray()); + return read_response(length); + } - if (remaining > 0) + public void brute(int a, int b, int length = 0xFF, byte command = 0x01) + { + reset(); + try { - LogDebug($"Reading remaining {remaining} byte(s) from serial port."); // Note continuation. - var remainingBytes = ReadAvailable(remaining).ToArray(); - msbResponse.AddRange(remainingBytes); - foreach (var b in remainingBytes) + for (var i = 0; i < length; i++) { - lsbResponse.Add(ReverseBits(b)); + var ret = cmd(a, b, i, i + 5, command); + if (ret[0] == 0x81) + { + var dataPrint = string.Join(" ", GetHex(ret)); + Console.WriteLine($"Valid response from: 0x{(a * 0x100 + b):04X} with length: 0x{i:02X}: {dataPrint}"); + } } } + catch (ThreadInterruptedException) + { + Console.WriteLine("\nSimulation aborted by user. Exiting gracefully..."); + } + finally + { + idle(); + } + } - LogDebug($"Full response wire bytes (MSB): {FormatBytes(msbResponse)}."); // Show raw bytes. - LogDebug($"Full response logical bytes (LSB): {FormatBytes(lsbResponse)}."); // Show reversed bytes. - - if (PrintRx) + public void full_brute(int start = 0, int stop = 0xFFFF, int length = 0xFF) + { + var addr = 0; + try { - var builder = new StringBuilder(); // Build hex string for logs. - for (int i = 0; i < lsbResponse.Count; i++) + for (addr = start; addr < stop; addr++) { - builder.Append(lsbResponse[i].ToString("X2")); // Append each byte in hex. - if (i < lsbResponse.Count - 1) + var msb = (addr >> 8) & 0xFF; + var lsb = addr & 0xFF; + brute(msb, lsb, length, 0x01); + if ((addr % 256) == 0) { - builder.Append(' '); // Separate with space. + Console.WriteLine($"addr = 0x{addr:04X} " + DateTime.Now); } } - - var logMessage = $"Received: {builder}"; // Match Python log format for received bytes. - RxLogger?.Invoke(logMessage); // Notify UI logger delegate. - Console.WriteLine(logMessage); // Emit to console for CLI scenarios. } - - Thread.Sleep(50); // Match Python delay after receiving bytes. - - return lsbResponse.ToArray(); // Return decoded payload to caller for further parsing. + catch (ThreadInterruptedException) + { + Console.WriteLine("\nSimulation aborted by user. Exiting gracefully..."); + Console.WriteLine($"\nStopped at address: 0x{addr:04X}"); + } + finally + { + idle(); + } } - /// - /// Issues a reset sequence to the battery by toggling Break/DTR (TX line) low/high and - /// sending the SYNC byte. Retries up to three times and waits for SYNC acknowledgement. - /// - public bool Reset() + public byte[] wcmd(byte a, byte b, byte c, int length) { - LogDebug("Reset invoked. Driving control lines to issue reset sequence."); // Trace action. - Acc = 4; // Reset accumulator to default as in Python implementation. + var cmdBuf = new List { 0x01, 0x05, 0x03, a, b, c }; + send_command(cmdBuf.ToArray()); + return read_response(length); + } - if (!EnsurePortOpen("Reset")) + public void write_message(string message) + { + try { - return false; // Abort if port unavailable. + if (message.Length > 0x14) + { + Console.WriteLine("ERROR: Message too long!"); + return; + } + Console.WriteLine($"Writing \"{message}\" to memory"); + reset(); + message = message.PadRight(0x14, '-'); + for (var i = 0; i < message.Length; i++) + { + wcmd(0, (byte)(0x23 + i), (byte)message[i], 2); + } } - - for (var attempt = 1; attempt <= 3; attempt++) + catch (Exception e) { - LogDebug($"Reset attempt {attempt} starting."); // Indicate retry count. - - _port.DiscardInBuffer(); // Clear any pending bytes to avoid misinterpreting stale data. - _port.BreakState = true; // Drive TX low (logic 0) to assert BREAK on physical line. - _port.DtrEnable = true; // Assert DTR; both pins go low relative to idle high. - Thread.Sleep(300); // Hold low for 300 ms to meet battery reset timing. - - _port.BreakState = false; // Release BREAK to drive TX high. - _port.DtrEnable = false; // Release DTR to high. - Thread.Sleep(300); // Hold high allowing BMS to recognize edge transition. - - Send(new[] { SYNC_BYTE }); // Transmit SYNC byte (0xAA) which the battery should echo. + Console.WriteLine($"write_message: Failed with error: {e}"); + } + } - try - { - LogDebug("Awaiting reset response after SYNC byte."); // Trace waiting state. - int responseByte = _port.ReadByte(); // Read exactly one byte as Python does. - if (responseByte < 0) - { - throw new InvalidOperationException("Empty response"); // Mirror Python exception semantics. - } + // ------------------------------------- + // Control-line helpers + // ------------------------------------- + public void idle() + { + port.BreakState = true; + port.DtrEnable = true; + } - byte responseMsb = (byte)responseByte; - byte responseLsb = ReverseBits(responseMsb); + public void high() + { + port.BreakState = false; + port.DtrEnable = false; + } - LogDebug($"Reset response wire byte (MSB): 0x{responseMsb:X2}. Reversed logical byte (LSB): 0x{responseLsb:X2}."); // Report raw and logical response. + public void high_for(double duration) + { + high(); + Thread.Sleep((int)(duration * 1000)); + idle(); + } - if (PrintRx) - { - var rxMessage = $"Received: {responseLsb:X2}"; // Match Python formatting for single-byte receive. - RxLogger?.Invoke(rxMessage); - Console.WriteLine(rxMessage); - } + // ------------------------------------- + // Calculations and conversions + // ------------------------------------- + public double calculate_temperature(int adcValue) + { + var r1 = 10e3; + var r2 = 20e3; + var t1 = 50; + var t2 = 35; - Thread.Sleep(50); // Align with Python's post-read delay. + var adc1 = 0x0180; + var adc2 = 0x022E; - var success = responseLsb == SYNC_BYTE; // Evaluate acknowledgement against reversed byte. - LogDebug($"Reset response {(success ? "acknowledged" : "did not match expected SYNC")} after bit reversal."); // Report result. - if (success) - { - Thread.Sleep(10); // Brief pause to stabilize before further commands. - return true; // Signal reset success. - } - } - catch (TimeoutException ex) - { - LogDebug($"Reset attempt {attempt} timed out waiting for response: {ex.GetType().Name} - {ex.Message}"); // Report timeout. - } - catch (InvalidOperationException ex) - { - LogDebug($"Reset attempt {attempt} failed: {ex.GetType().Name} - {ex.Message}"); // Report timeout or read issues. - } + var m = (t2 - t1) / (r2 - r1); + var b = t1 - m * r1; - Thread.Sleep(50); // Small delay before next retry to avoid hammering BMS. - } + var resistance = r1 + (adcValue - adc1) * (r2 - r1) / (adc2 - adc1); + var temperature = m * resistance + b; - LogDebug("All reset attempts exhausted without a response."); // Final failure message. - return false; // Indicate reset failed. + return Math.Round(temperature, 2); } - /// - /// Drives TX line low (idle state). On FT232 this sets BreakState=true and DtrEnable=true, - /// effectively forcing the TX pin to a continuous logic 0 level and asserting DTR. - /// - public void Idle() + private ulong BigEndianToUInt(byte[] data) { - LogDebug("Setting TX to Idle (BreakState=true, DtrEnable=true)."); // Describe electrical intent. - if (!EnsurePortOpen("Idle")) + ulong value = 0; + foreach (var b in data) { - return; // Abort if port not open. + value = (value << 8) + b; } - _port.BreakState = true; // Assert BREAK -> TX held low (space). - _port.DtrEnable = true; // Assert DTR -> control line low. + return value; } - /// - /// Drives TX line high (active state). On FT232 this clears BreakState and DtrEnable so the - /// TX pin idles high (mark) like a charger presenting voltage on the comms pin. - /// - public void High() + public DateTime bytes2dt(byte[] timeBytes) { - LogDebug("Setting TX to Active (BreakState=false, DtrEnable=false)."); // Describe electrical intent. - if (!EnsurePortOpen("High")) - { - return; // Abort if port not open. - } - _port.BreakState = false; // Release BREAK -> TX goes high. - _port.DtrEnable = false; // Release DTR -> line returns to deasserted state. + var epoch = (long)BigEndianToUInt(timeBytes); + var dt = DateTimeOffset.FromUnixTimeSeconds(epoch).UtcDateTime; + return dt; } - /// - /// Returns a textual summary of TX control-line states for debugging, including whether the - /// serial port is open and whether the protocol has been disposed. - /// - public string GetTxStateSummary(string caller) + // ------------------------------------- + // Bulk read helpers + // ------------------------------------- + public void read_all() { try { - var disposedText = _disposed ? "disposed" : "active"; // Human-readable disposed state. - var openState = _port.IsOpen ? "open" : "closed"; // Human-readable port state. - if (!_port.IsOpen) + reset(); + foreach (var entry in data_matrix) { - return $"{caller}: Port {_port.PortName} is {openState} and protocol is {disposedText}; TX state unavailable."; // Indicate missing state when port closed. + var response = cmd(entry.Item1, entry.Item2, entry.Item3, entry.Item3 + 5); + if (response.Length >= 4 && response[0] == 0x81) + { + var data = new byte[entry.Item3]; + Array.Copy(response, 3, data, 0, entry.Item3); + var dataPrint = string.Join(" ", GetHex(data)); + Console.WriteLine($"Response from: 0x{(entry.Item1 * 0x100 + entry.Item2):04X}: {dataPrint}"); + } + else + { + var dataPrint = string.Join(" ", GetHex(response)); + Console.WriteLine($"Invalid response from: 0x{(entry.Item1 * 0x100 + entry.Item2):04X} Response: {dataPrint}"); + } } - - return $"{caller}: Port {_port.PortName} is {openState} and protocol is {disposedText}. BreakState={_port.BreakState}, DtrEnable={_port.DtrEnable}."; // Provide detailed control-line flags. + idle(); } - catch (Exception ex) + catch (Exception e) { - LogDebug($"Error while retrieving TX state: {ex.GetType().Name} - {ex.Message}"); // Handle rare cases where SerialPort throws. - return $"{caller}: TX state unavailable due to error."; // Graceful fallback. + Console.WriteLine($"read_all: Failed with error: {e}"); } } - /// - /// Gathers a detailed human-readable health report by reading multiple registers from the - /// battery BMS. Temporarily disables TX/RX printing for performance, then restores settings. - /// - public string HealthReport() + public object? read_id(IEnumerable? id_array = null, bool force_refresh = true, string output = "label") { - if (_disposed) + if (id_array == null || !id_array.Any()) { - return "Protocol disposed; health report unavailable."; // Prevent operations on disposed object. + id_array = Enumerable.Range(0, data_id.Count); } - LogDebug("Generating HealthReport summary."); // Trace start. - var regList = new List + if (!((output == "label") || (output == "raw") || (output == "array") || (output == "form"))) { - 4, 28, 25, 26, 12, 13, 18, 29, 39, 40, 41, 42, 43, 33, 32, 31, 35, 36, 38 // Predefined register indices capturing manufacturing data, temps, counters. - }; - regList.AddRange(Enumerable.Range(44, 20)); // Add range covering tool-use histogram registers. - regList.AddRange(new[] { 8, 2 }); // Append serial number and manufacture date indices. + Console.WriteLine($"Unrecognised 'output' = {output}. Please choose \"label\", \"raw\", or \"array\""); + output = "label"; + } + + var array = new List(); - TxRxSaveAndSet(false); // Temporarily disable TX/RX logging to reduce noise during bulk reads. try { - var values = ReadId(regList, true); // Perform forced refresh using Cmd calls to populate registers. - if (values == null || values.Count != regList.Count) - { - return "Health report failed: incomplete data returned."; // Early exit when data missing. - } + reset(); - var builder = new StringBuilder(); - builder.AppendLine("Reading battery. This will take 5-10sec\n"); // Explain expected timing to user. - - var serialInfo = values[^1] as string ?? string.Empty; // Retrieve serial number string from last entry. - var matches = Regex.Matches(serialInfo, "\\d+\\.?\\d*"); // Extract numeric tokens (battery type and e-serial). - var batType = matches.Count > 0 ? matches[0].Value : ""; // Battery type code from response. - var eSerial = matches.Count > 1 ? matches[1].Value : ""; // Electronic serial number. - - // Lookup table converting battery type codes to capacities and marketing descriptions. - var batLookup = new Dictionary + if (force_refresh) { - {"36", (1.5, "1.5Ah CP (5s1p 18650)")}, - {"37", (2, "2Ah CP (5s1p 18650)")}, - {"38", (3, "3Ah XC (5s2p 18650)")}, - {"39", (4, "4Ah XC (5s2p 18650)")}, - {"40", (5, "5Ah XC (5s2p 18650) (<= Dec 2018)")}, - {"165", (5, "5Ah XC (5s2p 18650) (Aug 2019 - Jun 2021)")}, - {"306", (5, "5Ah XC (5s2p 18650) (Feb 2021 - Jul 2023)")}, - {"424", (5, "5Ah XC (5s2p 18650) (>= Sep 2023)")}, - {"46", (6, "6Ah XC (5s2p 18650)")}, - {"47", (9, "9Ah HD (5s3p 18650)")}, - {"104", (3, "3Ah HO (5s1p 21700)")}, - {"106", (6, "6Ah HO (5s2p 21700)")}, - {"107", (8, "8Ah HO (5s2p 21700)")}, - {"108", (12, "12Ah HO (5s3p 21700)")}, - {"383", (8, "8Ah Forge (5s2p 21700 tabless)")}, - {"384", (12, "12Ah Forge (5s3p 21700 tabless)")} - }; - - var batteryDetails = batLookup.TryGetValue(batType, out var details) ? details : (0d, "Unknown"); // Default to unknown if type not in table. - builder.AppendLine($"Type: {batType} [{batteryDetails.Item2}]"); // Show battery type and description. - builder.AppendLine($"E-serial: {eSerial} (does NOT match case serial)"); // Clarify that electronic serial differs from label. + foreach (var entry in data_matrix) + { + cmd(entry.Item1, entry.Item2, entry.Item3, entry.Item3 + 5); + } + idle(); + Thread.Sleep(100); + } - var batNow = values[^2] as DateTime? ?? DateTime.UtcNow; // Use current timestamp from BMS if available, else fallback to UTC now. - var manufactureDate = values[0] as DateTime?; // Manufacture date from register 0. - if (manufactureDate.HasValue) + var now = DateTime.Now; + var formattedTime = now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); + if (output == "label") { - builder.AppendLine($"Manufacture date: {manufactureDate:yyyy-MM-dd}"); // Format date for readability. + Console.WriteLine(formattedTime); + Console.WriteLine("ID ADDR LEN TYPE LABEL VALUE"); } - - builder.AppendLine($"Days since 1st charge: {values[1]}"); // Raw counter from BMS. - builder.AppendLine($"Days since last tool use: {(batNow - ((DateTime?)values[2] ?? batNow)).Days}"); // Compute days difference using BMS timestamp. - builder.AppendLine($"Days since last charge: {(batNow - ((DateTime?)values[3] ?? batNow)).Days}"); // Similar calculation for last charge. - - if (values[4] is List cellVoltages) + else if (output == "raw") { - var totalVoltage = cellVoltages.Sum() / 1000.0; // Convert total mV to V for readability. - builder.AppendLine($"Pack voltage: {totalVoltage}"); // Show pack voltage. - builder.AppendLine($"Cell Voltages (mV): {string.Join(", ", cellVoltages)}"); // List individual cell voltages. - builder.AppendLine($"Cell Imbalance (mV): {cellVoltages.Max() - cellVoltages.Min()}"); // Compute imbalance as diagnostic metric. + Console.WriteLine(formattedTime); } - - if (values[5] != null) + else if (output == "form") { - builder.AppendLine($"Temperature (deg C): {values[5]}"); // First temperature reading (non-Forge). + array.Add(formattedTime); } - if (values[6] != null) + reset(); + foreach (var i in id_array) { - builder.AppendLine($"Temperature (deg C): {values[6]}"); // Second temperature reading (Forge). + var entry = data_id[i]; + var addr = entry.Item1; + var addr_h = (addr >> 8) & 0xFF; + var addr_l = addr & 0xFF; + var length = entry.Item2; + var data_type = entry.Item3; + var label = entry.Item4; + + var response = cmd(addr_h, addr_l, length, length + 5); + object? array_value; + object? value; + + if (response.Length >= 4 && response[0] == 0x81) + { + var data = new byte[length]; + Array.Copy(response, 3, data, 0, length); + switch (data_type) + { + case "uint": + array_value = value = BigEndianToUInt(data); + break; + case "date": + var dt = bytes2dt(data); + array_value = dt; + value = dt.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); + break; + case "hhmmss": + var dur = (int)BigEndianToUInt(data); + var mm = dur / 60; + var ss = dur % 60; + var hh = mm / 60; + mm = mm % 60; + array_value = value = $"{hh}:{mm:00}:{ss:00}"; + break; + case "ascii": + var str = Encoding.UTF8.GetString(data); + array_value = value = $"\"{str}\""; + break; + case "sn": + var btype = (data[0] << 8) + data[1]; + var serial = (data[2] << 16) + (data[3] << 8) + data[4]; + if (output == "label" || output == "array") + { + array_value = value = $"Type: {btype:3d}, Serial: {serial:d}"; + } + else + { + value = $"{btype}\n{serial}"; + array_value = value; + } + break; + case "adc_t": + var adcTemp = calculate_temperature((data[0] << 8) + data[1]); + array_value = value = adcTemp; + break; + case "dec_t": + var temp = data[0] + data[1] / 256.0; + array_value = value = temp.ToString("0.00", CultureInfo.InvariantCulture); + break; + case "cell_v": + var cv = new List(); + for (var idx = 0; idx < 10; idx += 2) + { + cv.Add((data[idx] << 8) + data[idx + 1]); + } + array_value = cv; + if (output == "label") + { + value = $"1: {cv[0]:4d}, 2: {cv[1]:4d}, 3: {cv[2]:4d}, 4: {cv[3]:4d}, 5: {cv[4]:4d}"; + } + else + { + value = $"{cv[0]:4d}\n{cv[1]:4d}\n{cv[2]:4d}\n{cv[3]:4d}\n{cv[4]:4d}"; + } + break; + default: + array_value = null; + value = null; + break; + } + } + else + { + array_value = null; + value = "------"; + } + + if (output == "label") + { + Console.WriteLine($"{i:3d} 0x{addr:04X} {length:2d} {data_type,6} {label,-39} {value}"); + } + else if (output == "raw") + { + Console.WriteLine(value); + } + else if (output == "array") + { + array.Add(new List { i, array_value }); + } + else if (output == "form") + { + array.Add(value); + } } - builder.AppendLine("\nCHARGING STATS:"); // Section header for charging metrics. - builder.AppendLine($"Charge count [Redlink, dumb, (total)]: {values[13]}, {values[14]}, ({values[15]})"); // Show charge counters from BMS. - builder.AppendLine($"Total charge time: {values[16]}"); // Aggregate charging duration. - builder.AppendLine($"Time idling on charger: {values[17]}"); // Time spent at full charge on charger. - builder.AppendLine($"Low-voltage charges (any cell <2.5V): {values[18]}"); // Count of deep-charge events. - - builder.AppendLine("\nTOOL USE STATS:"); // Section header for discharge metrics. - var totalDischarge = Convert.ToDouble(values[7] ?? 0); // Retrieve total discharge in amp-seconds. - builder.AppendLine($"Total discharge (Ah): {totalDischarge / 3600:0.00}"); // Convert to amp-hours (1 Ah = 3600 As). - var totalDischargeCycles = batteryDetails.Item1 != 0 - ? $"{totalDischarge / 3600 / batteryDetails.Item1:0.00}" - : "Unknown battery type, unable to calculate"; // Estimate equivalent full cycles using capacity. - builder.AppendLine($"Total discharge cycles: {totalDischargeCycles}"); // Show calculated cycles or warning. - builder.AppendLine($"Times discharged to empty: {values[8]}"); // Count of deep discharges. - builder.AppendLine($"Times overheated: {values[9]}"); // Count of thermal events. - builder.AppendLine($"Overcurrent events: {values[10]}"); // Count of current-limit trips. - builder.AppendLine($"Low-voltage events: {values[11]}"); // Count of low-voltage warnings. - builder.AppendLine($"Low-voltage bounce/stutter: {values[12]}"); // Count of repeated low-voltage flickers. - - var toolTime = Enumerable.Range(19, 20).Sum(i => Convert.ToInt32(values[i] ?? 0)); // Sum histogram buckets to compute total heavy-load time. - builder.AppendLine($"Total time on tool (>10A): {TimeSpan.FromSeconds(toolTime)}"); // Convert seconds to TimeSpan for readability. - - for (int i = 19; i < 38; i++) + if ((output == "array" || output == "form") && array.Count > 0) { - var seconds = Convert.ToInt32(values[i] ?? 0); // Seconds spent in current band. - var pct = toolTime > 0 ? Math.Round(seconds / (double)toolTime * 100) : 0; // Percent of total tool time. - var bar = new string('X', (int)pct); // Simple ASCII bar graph showing relative time share. - var ampRange = $"{(i - 18) * 10}-{(i - 17) * 10}A"; // Human-readable current band (e.g., 10-20A). - builder.AppendLine($"Time @ {ampRange,8}: {TimeSpan.FromSeconds(seconds)} {pct,2:0}% {bar}"); // Log per-band usage. + return array; } - var lastSeconds = Convert.ToInt32(values[38] ?? 0); // >200A bucket seconds. - var lastPct = toolTime > 0 ? Math.Round(lastSeconds / (double)toolTime * 100) : 0; // Percent for final bucket. - var lastBar = new string('X', (int)lastPct); // ASCII bar for final bucket. - builder.AppendLine($"Time @ {"> 200A",8}: {TimeSpan.FromSeconds(lastSeconds)} {lastPct,2:0}% {lastBar}"); // Show extreme current usage. - - return builder.ToString().TrimEnd(); // Return compiled report with trailing newline trimmed. + idle(); } - catch (Exception ex) + catch (Exception e) { - LogDebug($"HealthReport failed: {ex.GetType().Name} - {ex.Message}"); // Trace exception for UI. - return "Health report failed. Check battery is connected and you have correct serial port."; // Friendly error message. - } - finally - { - TxRxRestore(); // Restore TX/RX logging flags so UI settings persist. + Console.WriteLine($"read_id: Failed with error: {e}"); } + + return null; } - /// - /// Reads a list of register IDs, optionally forcing a refresh by issuing pre-defined Cmd - /// calls that load data into the battery's staging registers. Each register is parsed using - /// metadata in . - /// - public List? ReadId(IEnumerable? idArray, bool forceRefresh) + public void read_all_spreadsheet() { - var ids = idArray?.ToList() ?? Enumerable.Range(0, _dataId.Count).ToList(); // Use provided IDs or default to all. - var results = new List(); // Holds parsed values in same order as ids. - try { - Reset(); // Reset communication before reading to ensure clean state. - - if (forceRefresh) + reset(); + foreach (var entry in data_matrix) { - foreach (var (addrMsb, addrLsb, length) in _dataMatrix) - { - Cmd(addrMsb, addrLsb, length, (byte)(length + 5)); // Preload battery staging registers to update telemetry. - } - Idle(); // Return TX to safe idle state after batch. - Thread.Sleep(100); // Small delay to let BMS process staged reads. + cmd(entry.Item1, entry.Item2, entry.Item3, entry.Item3 + 5); } + idle(); + Thread.Sleep(500); - Reset(); // Perform another reset so subsequent reads start from known state. - foreach (var i in ids) - { - if (i < 0 || i >= _dataId.Count) - { - results.Add(null); // Insert null for invalid indices to preserve order. - continue; - } + reset(); + var now = DateTime.Now; + var formattedTime = now.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); + Console.WriteLine(formattedTime); - var (address, length, dataType, _) = _dataId[i]; // Retrieve metadata (address, length, type). - var addrMsb = (byte)((address >> 8) & 0xFF); // Extract high byte of address. - var addrLsb = (byte)(address & 0xFF); // Extract low byte of address. - - var response = Cmd(addrMsb, addrLsb, (byte)length, (byte)(length + 5)); // Issue command to read register. - if (response.Length >= 4 && response[0] == 0x81) // 0x81 indicates valid response header. + foreach (var entry in data_matrix) + { + var response = cmd(entry.Item1, entry.Item2, entry.Item3, entry.Item3 + 5); + if (response.Length >= 4 && response[0] == 0x81) { - var data = response.Skip(3).Take(length).ToArray(); // Skip header/checksum bytes to isolate payload. - results.Add(ParseData(data, dataType)); // Parse to appropriate .NET type (date, int, string). + var data = new byte[entry.Item3]; + Array.Copy(response, 3, data, 0, entry.Item3); + Console.WriteLine($"0x{(entry.Item1 * 0x100 + entry.Item2):04X}"); + if (data.Length == 0) + { + Console.WriteLine("EMPTY"); + } + else + { + var dataPrint = string.Join("\n", data); + Console.WriteLine(dataPrint); + } } else { - results.Add(null); // Insert null when response not valid/complete. + Console.WriteLine($"0x{(entry.Item1 * 0x100 + entry.Item2):04X}"); + var dataPrint = string.Join(" ", GetHex(response)); + Console.WriteLine($"INV: {dataPrint}"); + for (var i = 1; i < entry.Item3; i++) + { + Console.WriteLine("blank"); + } } } - Idle(); // Return TX to idle after reads. - return results; // Deliver parsed list to caller. + idle(); } - catch (Exception ex) + catch (Exception e) { - LogDebug($"ReadId failed: {ex.GetType().Name} - {ex.Message}"); // Trace failure. - return null; // Indicate failure to caller. + Console.WriteLine($"read_all_spreadsheet: Failed with error: {e}"); } } - /// - /// Saves current TX/RX print flags and sets both to the provided value. Used to temporarily - /// silence logging during bulk operations. - /// - public void TxRxSaveAndSet(bool value) + public void health(bool force_refresh = true) { - _savedPrintTx = PrintTx; // Cache current TX flag. - _savedPrintRx = PrintRx; // Cache current RX flag. - PrintTx = value; // Apply new value. - PrintRx = value; // Apply new value. - } - - /// - /// Restores TX/RX print flags previously captured by . - /// - public void TxRxRestore() - { - if (_savedPrintTx.HasValue) + var reg_list = new List { - PrintTx = _savedPrintTx.Value; // Restore cached TX flag. - _savedPrintTx = null; // Clear cache. - } + 4, + 28, + 25, + 26, + 12, + 13, + 18, + 29, + 39, + 40, + 41, + 42, + 43, + 33, 32, 31, + 35, + 36, + 38 + }; + reg_list.AddRange(Enumerable.Range(44, 20)); + reg_list.AddRange(new List { 8, 2 }); - if (_savedPrintRx.HasValue) - { - PrintRx = _savedPrintRx.Value; // Restore cached RX flag. - _savedPrintRx = null; // Clear cache. - } - } + txrx_save_and_set(true); - /// - /// Parses raw byte data returned from the battery according to the specified type string. - /// Converts to ints, dates, ASCII strings, serial numbers, temperatures, or cell voltage lists. - /// - private object? ParseData(byte[] data, string dataType) - { - switch (dataType) + try { - case "uint": - return data.Aggregate(0, (current, b) => (current << 8) + b); // Big-endian integer conversion. - case "date": - var seconds = data.Aggregate(0L, (current, b) => (current << 8) + b); // Convert to Unix epoch seconds. - return DateTimeOffset.FromUnixTimeSeconds(seconds).UtcDateTime; // Convert to UTC DateTime for display. - case "hhmmss": - var duration = data.Aggregate(0, (current, b) => (current << 8) + b); // Convert to total seconds. - var mmss = TimeSpan.FromSeconds(duration); // Create TimeSpan to format HH:MM:SS. - return $"{(int)mmss.TotalHours}:{mmss.Minutes:00}:{mmss.Seconds:00}"; // Return formatted string. - case "ascii": - return Encoding.UTF8.GetString(data); // Interpret payload as UTF-8 text. - case "sn": - var btype = (data[0] << 8) + data[1]; // Battery type code from first two bytes. - var serial = (data[2] << 16) + (data[3] << 8) + data[4]; // 24-bit serial value from remaining bytes. - return $"Type: {btype,3}, Serial: {serial}"; // Compose friendly serial string. - case "adc_t": - var adcValue = data.Aggregate(0, (current, b) => (current << 8) + b); // Convert ADC reading to integer. - return CalculateTemperature(adcValue); // Convert ADC to approximate temperature. - case "dec_t": - return Math.Round(data[0] + data[1] / 256.0, 2); // Temperature stored as integer + fractional part (1/256). - case "cell_v": - var cellVoltages = new List(); // Prepare list for each cell voltage. - for (var i = 0; i < data.Length; i += 2) - { - cellVoltages.Add((data[i] << 8) + data[i + 1]); // Convert pair of bytes to mV reading. - } - return cellVoltages; // Return list of cell voltages. - default: - return null; // Unknown type; caller will treat as missing. - } - } + Console.WriteLine("Reading battery. This will take 5-10sec\n"); + var array = read_id(reg_list, force_refresh, "array") as List; + if (array == null) + { + txrx_restore(); + return; + } - /// - /// Approximates temperature in Celsius from an ADC value using a linear interpolation between - /// two calibration points derived from the original Python script. Shows how to transform - /// raw ADC counts into meaningful engineering units. - /// - private double CalculateTemperature(int adcValue) - { - const double r1 = 10e3; // Resistance reference point 1 (ohms). - const double r2 = 20e3; // Resistance reference point 2 (ohms). - const double t1 = 50; // Temperature corresponding to r1 (degrees Celsius). - const double t2 = 35; // Temperature corresponding to r2 (degrees Celsius). + var sn = array[40] as List; + var snValue = sn?[1]?.ToString() ?? string.Empty; + var numbers = Regex.Matches(snValue, @"\d+\.?\d*"); + var bat_type = numbers.Count > 0 ? numbers[0].Value : ""; + var e_serial = numbers.Count > 1 ? numbers[1].Value : ""; + var bat_lookup = new Dictionary + { + { "36", (1.5, "1.5Ah CP (5s1p 18650)") }, + { "37", (2, "2Ah CP (5s1p 18650)") }, + { "38", (3, "3Ah XC (5s2p 18650)") }, + { "39", (4, "4Ah XC (5s2p 18650)") }, + { "40", (5, "5Ah XC (5s2p 18650) (<= Dec 2018)") }, + { "165", (5, "5Ah XC (5s2p 18650) (Aug 2019 - Jun 2021)") }, + { "306", (5, "5Ah XC (5s2p 18650) (Feb 2021 - Jul 2023)") }, + { "424", (5, "5Ah XC (5s2p 18650) (>= Sep 2023)") }, + { "46", (6, "6Ah XC (5s2p 18650)") }, + { "47", (9, "9Ah HD (5s3p 18650)") }, + { "104", (3, "3Ah HO (5s1p 21700)") }, + { "150", (6, "5.5Ah HO (5s2p 21700) (EU only)") }, + { "106", (6, "6Ah HO (5s2p 21700)") }, + { "107", (8, "8Ah HO (5s2p 21700)") }, + { "108", (12, "12Ah HO (5s3p 21700)") }, + { "383", (8, "8Ah Forge (5s2p 21700 tabless)") }, + { "384", (12, "12Ah Forge (5s3p 21700 tabless)") } + }; + var bat_text = bat_lookup.ContainsKey(bat_type) ? bat_lookup[bat_type] : (0, "Unknown"); + Console.WriteLine($"Type: {bat_type} [{bat_text.Item2}]"); + Console.WriteLine($"E-serial: {e_serial} (does NOT match case serial)"); + + var bat_now = (array[39] as List)?[1] as DateTime? ?? DateTime.Now; + + Console.WriteLine("Manufacture date: " + ((array[0] as List)?[1] as DateTime?)?.ToString("yyyy-MM-dd")); + Console.WriteLine("Days since 1st charge: " + ((array[1] as List)?[1] ?? "")); + Console.WriteLine("Days since last tool use: " + (bat_now - (((array[2] as List)?[1] as DateTime?) ?? bat_now)).Days); + Console.WriteLine("Days since last charge: " + (bat_now - (((array[3] as List)?[1] as DateTime?) ?? bat_now)).Days); + + var cvList = (array[4] as List)?[1] as List ?? new List(); + Console.WriteLine($"Pack voltage: {cvList.Sum() / 1000.0}"); + Console.WriteLine("Cell Voltages (mV): " + string.Join(", ", cvList)); + Console.WriteLine($"Cell Imbalance (mV): {(cvList.Count > 0 ? cvList.Max() - cvList.Min() : 0)}"); + if ((array[5] as List)?[1] != null) + { + Console.WriteLine($"Temperature (deg C): {(array[5] as List)?[1]}"); + } + if ((array[6] as List)?[1] != null) + { + Console.WriteLine($"Temperature (deg C): {(array[6] as List)?[1]}"); + } - const double adc1 = 0x0180; // ADC reading at r1. - const double adc2 = 0x022E; // ADC reading at r2. + Console.WriteLine("\nCHARGING STATS:"); + Console.WriteLine($"Charge count [Redlink, dumb, (total)]: {(array[13] as List)?[1]}, {(array[14] as List)?[1]}, ({(array[15] as List)?[1]})"); + Console.WriteLine($"Total charge time: {(array[16] as List)?[1]}"); + Console.WriteLine($"Time idling on charger: {(array[17] as List)?[1]}"); + Console.WriteLine($"Low-voltage charges (any cell <2.5V): {(array[18] as List)?[1]}"); + + Console.WriteLine("\nTOOL USE STATS:"); + var totalDischarge = Convert.ToDouble((array[7] as List)?[1] ?? 0); + Console.WriteLine("Total discharge (Ah): " + (totalDischarge / 3600).ToString("0.00", CultureInfo.InvariantCulture)); + string total_discharge_cycles; + if (bat_text.Item1 != 0) + { + total_discharge_cycles = (totalDischarge / 3600 / bat_text.Item1).ToString("0.00", CultureInfo.InvariantCulture); + } + else + { + total_discharge_cycles = "Unknown battery type, unable to calculate"; + } + Console.WriteLine($"Total discharge cycles: {total_discharge_cycles}"); + Console.WriteLine($"Times discharged to empty: {(array[8] as List)?[1]}"); + Console.WriteLine($"Times overheated: {(array[9] as List)?[1]}"); + Console.WriteLine($"Overcurrent events: {(array[10] as List)?[1]}"); + Console.WriteLine($"Low-voltage events: {(array[11] as List)?[1]}"); + Console.WriteLine($"Low-voltage bounce/stutter: {(array[12] as List)?[1]}"); + + var tool_time = 0; + for (var i = 19; i < 39; i++) + { + tool_time += Convert.ToInt32((array[i] as List)?[1] ?? 0); + } - var m = (t2 - t1) / (r2 - r1); // Calculate slope of temperature vs resistance. - var b = t1 - m * r1; // Calculate intercept for linear model. + Console.WriteLine($"Total time on tool (>10A): {TimeSpan.FromSeconds(tool_time)}"); - var resistance = r1 + (adcValue - adc1) * (r2 - r1) / (adc2 - adc1); // Interpolate resistance from ADC reading. - var temperature = m * resistance + b; // Convert resistance to temperature via line equation. + var j = 0; + for (var idx = 19; idx < 38; idx++) + { + j = idx; + var amp_range = $"{(idx - 18) * 10}-{(idx - 17) * 10}A"; + var label = $"Time @ {amp_range,>8}:"; + var t = Convert.ToInt32((array[idx] as List)?[1] ?? 0); + var hhmmss = TimeSpan.FromSeconds(t); + var pct = tool_time != 0 ? Math.Round((t / (double)tool_time) * 100) : 0; + var bar = new string('X', (int)Math.Round(pct)); + Console.WriteLine($"{label} {hhmmss} {pct:00}% {bar}"); + } + j += 1; + var lastAmp = "> 200A"; + var lastLabel = $"Time @ {lastAmp,>8}:"; + var lastT = Convert.ToInt32((array[j] as List)?[1] ?? 0); + var lastHhmmss = TimeSpan.FromSeconds(lastT); + var lastPct = tool_time != 0 ? Math.Round((lastT / (double)tool_time) * 100) : 0; + var lastBar = new string('X', (int)Math.Round(lastPct)); + Console.WriteLine($"{lastLabel} {lastHhmmss} {lastPct:00}% {lastBar}"); + } + catch (Exception e) + { + Console.WriteLine($"health: Failed with error: {e}"); + Console.WriteLine("Check battery is connected and you have correct serial port"); + } - return Math.Round(temperature, 2); // Round for display friendliness. + txrx_restore(); } - /// - /// Closes the protocol by driving TX to idle, closing the SerialPort, and disposing managed - /// resources. Safe to call multiple times thanks to the _disposed flag. - /// - public void Close() + // ------------------------------------- + // Form submission (synchronous to match Python flow) + // ------------------------------------- + public void submit_form() { - LogDebug("Close invoked. Beginning disposal sequence."); // Trace start. - if (_disposed) - { - LogDebug("Close skipped because object is already disposed."); // Avoid double disposal. - return; // No work to do. - } + var formUrl = "https://docs.google.com/forms/d/e/1FAIpQLScvTbSDYBzSQ8S4XoF-rfgwNj97C-Pn4Px3GIixJxf0C1YJJA/formResponse"; + Console.WriteLine("Getting data from battery..."); + var output = read_id(output: "form") as List; - _disposed = true; // Mark disposed to prevent further I/O calls. - - try + if (output == null) { - Idle(); // Drive TX to safe idle state before closing port to avoid floating line. + Console.WriteLine("submit_form: No output returned, aborting"); } - catch (Exception ex) + var s_output = output != null ? string.Join("\n", output) : string.Empty; + + Console.WriteLine("Please provide this information. All the values can be found on the label under the battery."); + Console.Write("Enter One-Key ID (example: H18FDCAD): "); + var one_key_id = Console.ReadLine() ?? string.Empty; + Console.Write("Enter Date (example: 190316): "); + var date = Console.ReadLine() ?? string.Empty; + Console.Write("Enter Serial number (example: 0807426): "); + var serial_number = Console.ReadLine() ?? string.Empty; + Console.Write("Enter Sticker (example: 4932 4512 45): "); + var sticker = Console.ReadLine() ?? string.Empty; + Console.Write("Enter Type (example: M18B9): "); + var model_type = Console.ReadLine() ?? string.Empty; + Console.Write("Enter Capacity (example: 9.0Ah): "); + var capacity = Console.ReadLine() ?? string.Empty; + + var formData = new Dictionary { - LogDebug($"Error setting idle during close: {ex.GetType().Name} - {ex.Message}"); // Log but continue cleanup. - } + { "entry.905246449", one_key_id }, + { "entry.453401884", date }, + { "entry.2131879277", serial_number }, + { "entry.337435885", sticker }, + { "entry.1496274605", model_type }, + { "entry.324224550", capacity }, + { "entry.716337020", s_output } + }; - try - { - _port.Close(); // Close COM port handle. - } - catch (Exception ex) - { - LogDebug($"Error while closing serial port: {ex.GetType().Name} - {ex.Message}"); // Log any issues closing port. - } - finally - { - _port.Dispose(); // Release unmanaged resources held by SerialPort. - LogDebug("Serial port disposed."); // Confirm disposal. - } - } + using var client = new HttpClient(); + var response = client.PostAsync(formUrl, new FormUrlEncodedContent(formData)).Result; - /// - /// Constructs and sends a register read command, then reads the expected number of bytes - /// back. The command byte defaults to 0x01 but can be overridden for other operations. - /// - public byte[] Cmd(byte addrMsb, byte addrLsb, byte length, byte command = 0x01) - { - LogDebug($"Cmd invoked with addrMsb=0x{addrMsb:X2}, addrLsb=0x{addrLsb:X2}, length={length}, command=0x{command:X2}."); // Trace command parameters. - SendCommand(new[] + if (response.IsSuccessStatusCode) { - command, // Command type (0x01 for read). - (byte)0x04, // Unknown protocol constant from Python implementation (likely addressing mode). - (byte)0x03, // Unknown protocol constant; part of command header. - addrMsb, // High byte of register address. - addrLsb, // Low byte of register address. - length // Number of bytes to read. - }); - - return ReadResponse(length); // Read payload bytes; header/checksum processed in ReadResponse. - } - - /// - /// Reads the specified number of bytes from the SerialPort, aggregating partial reads until - /// the requested count is met or a timeout/port error occurs. - /// - private IEnumerable ReadAvailable(int count) - { - LogDebug($"ReadAvailable attempting to read {count} byte(s)."); // Trace request. - var buffer = new byte[count]; // Temporary buffer for incoming bytes. - int totalRead = 0; // Track how many bytes we have read so far. - - while (totalRead < count) + Console.WriteLine("Form submitted successfully!"); + } + else { - try - { - int read = _port.Read(buffer, totalRead, count - totalRead); // Attempt to fill remaining bytes. - if (read > 0) - { - totalRead += read; // Increment total with bytes read this iteration. - LogDebug($"Read {read} byte(s); total read so far: {totalRead}."); // Trace progress. - } - } - catch (InvalidOperationException ex) - { - LogDebug($"ReadAvailable stopped because port is unavailable: {ex.GetType().Name} - {ex.Message}"); // Port closed/disposed; break loop. - break; - } - catch (TimeoutException) - { - LogDebug("Timeout encountered while reading available bytes."); // Stop reading on timeout to avoid blocking forever. - break; - } + Console.WriteLine($"submit_form: Failed to submit form. Status code: {(int)response.StatusCode}"); } - - var result = buffer.Take(totalRead).ToArray(); // Slice buffer down to bytes actually read. - LogDebug($"ReadAvailable returning {result.Length} byte(s): {FormatBytes(result)}."); // Trace final chunk. - return buffer.Take(totalRead).ToArray(); // Return trimmed array to caller. } - /// - /// Sends debug messages to whichever logger the UI attached. Keeps protocol agnostic of UI - /// output mechanism. - /// - private void LogDebug(string message) + // ------------------------------------- + // Help text (unchanged) + // ------------------------------------- + public void help() { - DebugLogger?.Invoke(message); // Only log when delegate supplied. + Console.WriteLine("Functions: \n \ + DIAGNOSTICS: \n \ + m.health() - print simple health report on battery \n \ + m.read_id() - print labelled and formatted diagnostics \n \ + m.read_id(output=\"raw\") - print in spreadsheet format \n \ + m.submit_form() - prompts for manual inputs and submits battery diagnostics data \n \ + \n \ + m.help() - this message\n \ + m.adv_help() - advanced help\n \ + \n \ + exit() - end program\n"); } - /// - /// Formats a sequence of bytes as a space-delimited hex string (e.g., "AA 55 10"). - /// - private static string FormatBytes(IEnumerable bytes) + public void adv_help() { - if (bytes == null) - { - return string.Empty; // Gracefully handle null sequences. - } - - var builder = new StringBuilder(); // Efficient string concatenation. - var array = bytes.ToArray(); // Materialize enumerable to avoid multiple enumerations. - - for (int i = 0; i < array.Length; i++) - { - builder.Append(array[i].ToString("X2")); // Append byte as two-digit hex. - if (i < array.Length - 1) - { - builder.Append(' '); // Add space separator except after last byte. - } - } - - return builder.ToString(); // Return formatted string for logs. + Console.WriteLine("Advanced functions: \n \ + m.read_all() - print all known bytes in 0x01 command \n \ + m.read_all_spreadsheet() - print bytes in spreadsheet format \n \ + \n \ + CHARGING SIMULATION: \n \ + m.simulate() - simulate charging comms \n \ + m.simulate_for(t) - simulate for t seconds \n \ + m.high_for(t) - bring J2 high for t sec, then idle \n \ + \n \ + m.write_message(message) - write ascii string to 0x0023 register (20 chars)\n \ + \n \ + Debug: \n \ + m.PRINT_TX = True - boolean to enable TX messages \n \ + m.PRINT_RX = True - boolean to enable RX messages \n \ + m.txrx_print(bool) - set PRINT_TX & RX to bool \n \ + m.txrx_save_and_set(bool) - save PRINT_TX & RX state, then set both to bool \n \ + m.txrx_restore() - restore PRINT_TX & RX to saved values \n \ + m.brute(addr_msb, addr_lsb) \n \ + m.full_brute(start, stop, len) - check registers from 'start' to 'stop'. look for 'len' bytes \n \ + m.debug(addr_msb, addr_lsb, len, rsp_len) - send reset() then cmd() to battery \n \ + m.try_cmd(cmd, addr_h, addr_l, len) - try 'cmd' at [addr_h addr_l] with 'len' bytes \n \ + \n \ + Internal:\n \ + m.high() - bring J2 pin high (20V)\n \ + m.idle() - pull J2 pin low (0V) \n \ + m.reset() - send 0xAA to battery. Return true if battery replies wih 0xAA \n \ + m.get_snapchat() - request 'snapchat' from battery (0x61)\n \ + m.configure() - send 'configure' message (0x60, charger parameters)\n \ + m.calibrate() - calibration/interrupt command (0x55) \n \ + m.keepalive() - send charge current request (0x62) \n"); } } } From 7e230dd233e80f8cee0590c6b6ba5ea6891df9c0 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 11:24:59 -0500 Subject: [PATCH 50/61] Add protocol logger delegates and public logging flags --- M18Protocol.cs | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index 788a239..3b95045 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -41,6 +41,8 @@ public class M18Protocol public bool PRINT_RX = false; public bool PRINT_TX_SAVE = false; public bool PRINT_RX_SAVE = false; + public Action? TxLogger { get; set; } + public Action? RxLogger { get; set; } public SerialPort port; @@ -365,6 +367,18 @@ public void update_acc() ACC = accValues[nextIndex]; } + public bool PrintTx + { + get => PRINT_TX; + set => PRINT_TX = value; + } + + public bool PrintRx + { + get => PRINT_RX; + set => PRINT_RX = value; + } + public int reverse_bits(int value) { return Convert.ToInt32(string.Concat(Convert.ToString(value & 0xFF, 2).PadLeft(8, '0').Reverse()), 2); @@ -402,7 +416,7 @@ public void send(byte[] command) if (PRINT_TX) { - Console.WriteLine($"Sending: {debugPrint}"); + LogTx($"Sending: {debugPrint}"); } port.Write(msb.ToArray(), 0, msb.Count); @@ -442,12 +456,34 @@ public byte[] read_response(int size) var debugPrint = string.Join(" ", GetHex(lsbResponse)); if (PRINT_RX) { - Console.WriteLine($"Received: {debugPrint}"); + LogRx($"Received: {debugPrint}"); } Thread.Sleep(50); return lsbResponse.ToArray(); } + private void LogTx(string message) + { + if (TxLogger != null) + { + TxLogger(message); + return; + } + + Console.WriteLine(message); + } + + private void LogRx(string message) + { + if (RxLogger != null) + { + RxLogger(message); + return; + } + + Console.WriteLine(message); + } + private byte ReadOneByte() { var buffer = new byte[1]; From 77987f55d465bd538abf00365794bcac86a15df3 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 11:38:30 -0500 Subject: [PATCH 51/61] Minor debugging. --- M18AnalyzerMain.cs | 69 ++++++++++++++++++--------- M18Protocol.cs | 116 ++++++++++++++++++++------------------------- 2 files changed, 97 insertions(+), 88 deletions(-) diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index a5e798b..922ee44 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -237,14 +237,14 @@ private async void btnConnect_Click(object? sender, EventArgs e) if (_protocol != null) { - if (string.Equals(_protocol.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(_protocol.port.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) { AppendLogBoth($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); // Avoid reopening same port. MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify user. return; // Exit without reopening. } - AppendLogBoth($"A different port ({_protocol.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); // Explain why we close first. + AppendLogBoth($"A different port ({_protocol.port.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); // Explain why we close first. await DisconnectAsync(); // Close current protocol instance to free COM port handle. } @@ -255,7 +255,7 @@ private async void btnConnect_Click(object? sender, EventArgs e) try { - await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName, AppendDebugLog)); // Instantiate protocol off-UI thread; constructor opens SerialPort and drives TX idle. + await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName)); // Instantiate protocol off-UI thread; constructor opens SerialPort and drives TX idle. ApplyProtocolLoggingPreferences(); // Sync checkbox states into protocol PrintTx/PrintRx and hook log delegates. AppendLogBoth($"{selectedDescription} opened successfully."); // Confirm connection to user. UpdateConnectionUi(true); // Toggle button enabled states to reflect connected status. @@ -297,16 +297,23 @@ private async Task DisconnectAsync(bool showUserMessages = true) return; // Exit early when nothing to close. } - AppendLogBoth($"Closing {_protocol.PortName}..."); // Inform user which COM port is closing. + AppendLogBoth($"Closing {_protocol.port.PortName}..."); // Inform user which COM port is closing. try { - await Task.Run(() => _protocol.Close()); // Execute Close on background thread; sets TX idle then disposes SerialPort. - AppendLogBoth($"{_protocol.PortName} closed successfully."); // Confirm closure. + await Task.Run(() => + { + if (_protocol.port.IsOpen) + { + _protocol.idle(); // Set TX to idle (safe state) before closing. + _protocol.port.Close(); // Close the underlying SerialPort. + } + }); // Execute Close on background thread; sets TX idle then disposes SerialPort. + AppendLogBoth($"{_protocol.port.PortName} closed successfully."); // Confirm closure. } catch (Exception ex) { - LogError($"Error while closing {_protocol.PortName}.", ex); // Report exceptions thrown during close. + LogError($"Error while closing {_protocol.port.PortName}.", ex); // Report exceptions thrown during close. } finally { @@ -331,9 +338,11 @@ private async void btnIdle_Click(object? sender, EventArgs e) AppendDebugLog(FormatLogMessage("Invoking _protocol.Idle() to drive TX low.")); // Explain electrical effect. try { - await Task.Run(() => _protocol!.Idle()); // Background call to avoid UI hiccup; Idle toggles BreakState/DTR. + await Task.Run(() => _protocol!.idle()); // Background call to avoid UI hiccup; idle toggles BreakState/DTR. AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery."); // Teach user about safe state. - AppendDebugLog(FormatLogMessage(_protocol!.GetTxStateSummary("Idle"))); // Log resulting control-line states. + AppendDebugLog(FormatLogMessage( + $"TX State after Idle: BreakState={_protocol!.port.BreakState}, DtrEnable={_protocol.port.DtrEnable}, RtsEnable={_protocol.port.RtsEnable}" + )); // Log resulting control-line states. } catch (Exception ex) { @@ -357,9 +366,11 @@ private async void btnActive_Click(object? sender, EventArgs e) AppendDebugLog(FormatLogMessage("Invoking _protocol.High() to drive TX high.")); // Clarify electrical behavior. try { - await Task.Run(() => _protocol!.High()); // Toggle control lines on background thread. + await Task.Run(() => _protocol!.high()); // Toggle control lines on background thread. AppendLogBoth("TX set to Active (high). Charger simulation enabled."); // Show user the state change. - AppendDebugLog(FormatLogMessage(_protocol!.GetTxStateSummary("High"))); // Record final TX states. + AppendDebugLog(FormatLogMessage( + $"TX State after High: BreakState={_protocol!.port.BreakState}, DtrEnable={_protocol.port.DtrEnable}, RtsEnable={_protocol.port.RtsEnable}" + )); // Log resulting control-line states. } catch (Exception ex) { @@ -383,7 +394,19 @@ private async void btnHealthReport_Click(object? sender, EventArgs e) try { AppendDebugLog(FormatLogMessage("Starting health report collection (mirrors m18.py health()).")); // Note parity with Python script. - var report = await Task.Run(() => _protocol!.HealthReport()); // Run heavy register reads off UI thread. + var report = await Task.Run(() => + { + // Use the existing health() method and capture its output. + // We'll redirect Console output to a string. + using (var sw = new System.IO.StringWriter()) + { + var originalOut = Console.Out; + Console.SetOut(sw); + _protocol!.health(true); // Call the health method (force_refresh: true) + Console.SetOut(originalOut); + return sw.ToString(); + } + }); // Run heavy register reads off UI thread. AppendLog("=== Health report ==="); // Header in simple log. foreach (var line in report.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None)) { @@ -394,7 +417,7 @@ private async void btnHealthReport_Click(object? sender, EventArgs e) } catch (Exception ex) { - LogError("Health report failed.", ex); // Surface exceptions (timeouts, parsing errors). + LogError("Health report failed.", ex); // Surface exceptions (timeout, parsing errors). } } @@ -413,7 +436,7 @@ private async void btnReset_Click(object? sender, EventArgs e) try { AppendDebugLog("Sending reset sequence (BREAK/DTR + SYNC)."); // Explain protocol handshake. - var success = await Task.Run(() => _protocol!.Reset()); // Execute reset on worker thread; toggles control lines and reads response. + var success = await Task.Run(() => _protocol!.reset()); // Execute reset on worker thread; toggles control lines and reads response. AppendLogBoth(success ? "Reset command acknowledged by device." : "Reset command did not receive expected response."); // Inform user of result. } catch (Exception ex) @@ -627,8 +650,8 @@ private void ApplyProtocolLoggingPreferences() return; // Nothing to configure if no active protocol. } - _protocol.PrintTx = chkbxTXLog.Checked; // Mirror checkbox to protocol flag controlling TX byte echo. - _protocol.PrintRx = chkboxRxLog.Checked; // Mirror checkbox to protocol flag controlling RX byte echo. + _protocol.PRINT_TX = chkbxTXLog.Checked; // Mirror checkbox to protocol flag controlling TX byte echo. + _protocol.PRINT_RX = chkboxRxLog.Checked; // Mirror checkbox to protocol flag controlling RX byte echo. _protocol.TxLogger = message => { AppendProtocolLog(message); // Route TX log messages into all log panes. @@ -646,7 +669,7 @@ private void chkbxTXLog_CheckedChanged(object? sender, EventArgs e) { if (_protocol != null) { - _protocol.PrintTx = chkbxTXLog.Checked; // Immediately reflect UI change in protocol. + _protocol.PRINT_TX = chkbxTXLog.Checked; // Immediately reflect UI change in protocol. } } @@ -657,7 +680,7 @@ private void chkboxRxLog_CheckedChanged(object? sender, EventArgs e) { if (_protocol != null) { - _protocol.PrintRx = chkboxRxLog.Checked; // Immediately reflect UI change in protocol. + _protocol.PRINT_RX = chkboxRxLog.Checked; // Immediately reflect UI change in protocol. } } @@ -755,22 +778,22 @@ private void button1_Click(object sender, EventArgs e) /// private void btnTestEcho_Click(object sender, EventArgs e) { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on COM{_protocol?.PortName ?? "??"}\n"); // Timestamp test start with chosen port name. + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on COM{_protocol?.port.PortName ?? "??"}\n"); // Timestamp test start with chosen port name. try { - if (_protocol?.Port.IsOpen != true) + if (_protocol?.port.IsOpen != true) { rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Serial port not open. Connect first.\n"); // Warn user that port must be open. return; // Exit early because no active SerialPort exists. } - _protocol.Port.DiscardInBuffer(); // Clear inbound buffer to remove stale bytes before test. + _protocol.port.DiscardInBuffer(); // Clear inbound buffer to remove stale bytes before test. byte[] send = { 0xAA }; // Single SYNC-like byte to transmit; echoed devices should return it. - _protocol.Port.Write(send, 0, 1); // Write to UART TX line; FT232 shifts bits out over USB-UART bridge. + _protocol.port.Write(send, 0, 1); // Write to UART TX line; FT232 shifts bits out over USB-UART bridge. rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Sent byte 0xAA.\n"); // Confirm transmission to user. - int response = _protocol.Port.ReadByte(); // Block up to ReadTimeout waiting for one byte on RX. + int response = _protocol.port.ReadByte(); // Block up to ReadTimeout waiting for one byte on RX. if (response >= 0) { rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Received byte: 0x{response:X2}\n"); // Show returned byte in hex for clarity. diff --git a/M18Protocol.cs b/M18Protocol.cs index 3b95045..e53d0de 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -265,34 +265,20 @@ public M18Protocol(string? portName) var ports = SerialPortUtil.EnumerateDetailedPorts(); var i = 1; - foreach (var p in ports) - { - Console.WriteLine($" {i}: {p.PortName} - {p.Manufacturer} - {p.FriendlyName ?? p.Description}"); - i = i + 1; - } - var portId = 0; - while ((portId < 1) || (portId >= i)) + foreach (var portEntry in ports) { - Console.Write($"Choose a port (1-{i - 1}): "); - var userPort = Console.ReadLine(); - try - { - portId = int.Parse(userPort ?? string.Empty, CultureInfo.InvariantCulture); - } - catch (Exception) - { - Console.WriteLine("Invalid input. Please enter a number"); - } + Console.WriteLine($" {i}: {portEntry.PortName} - {portEntry.Manufacturer} - {portEntry.FriendlyName ?? portEntry.Description}"); + i = i + 1; } - var p = ports[portId - 1]; - Console.WriteLine($"You selected \"{p.PortName} - {p.Manufacturer} - {p.FriendlyName ?? p.Description}\""); - Console.WriteLine($"In future, use \"m18.py --port {p.PortName}\" to avoid this menu"); + var selectedPort = ports[portId - 1]; + Console.WriteLine($"You selected \"{selectedPort.PortName} - {selectedPort.Manufacturer} - {selectedPort.FriendlyName ?? selectedPort.Description}\""); + Console.WriteLine($"In future, use \"m18.py --port {selectedPort.PortName}\" to avoid this menu"); Console.Write("Press Enter to continue"); Console.ReadLine(); - portName = p.PortName; + portName = selectedPort.PortName; } port = new SerialPort(portName, 4800, Parity.None, 8, StopBits.Two) @@ -347,7 +333,7 @@ public bool reset() { return true; } - Console.WriteLine($"Unexpected response: {string.Join(\" \", GetHex(response))}"); + Console.WriteLine($"Unexpected response: {string.Join(" ", GetHex(response))}"); return false; } catch (ValueError) @@ -1169,7 +1155,7 @@ public void health(bool force_refresh = true) { j = idx; var amp_range = $"{(idx - 18) * 10}-{(idx - 17) * 10}A"; - var label = $"Time @ {amp_range,>8}:"; + var label = $"Time @ {amp_range,8}:"; var t = Convert.ToInt32((array[idx] as List)?[1] ?? 0); var hhmmss = TimeSpan.FromSeconds(t); var pct = tool_time != 0 ? Math.Round((t / (double)tool_time) * 100) : 0; @@ -1178,7 +1164,7 @@ public void health(bool force_refresh = true) } j += 1; var lastAmp = "> 200A"; - var lastLabel = $"Time @ {lastAmp,>8}:"; + var lastLabel = $"Time @ {lastAmp,8}:"; var lastT = Convert.ToInt32((array[j] as List)?[1] ?? 0); var lastHhmmss = TimeSpan.FromSeconds(lastT); var lastPct = tool_time != 0 ? Math.Round((lastT / (double)tool_time) * 100) : 0; @@ -1252,51 +1238,51 @@ public void submit_form() // ------------------------------------- public void help() { - Console.WriteLine("Functions: \n \ - DIAGNOSTICS: \n \ - m.health() - print simple health report on battery \n \ - m.read_id() - print labelled and formatted diagnostics \n \ - m.read_id(output=\"raw\") - print in spreadsheet format \n \ - m.submit_form() - prompts for manual inputs and submits battery diagnostics data \n \ - \n \ - m.help() - this message\n \ - m.adv_help() - advanced help\n \ - \n \ - exit() - end program\n"); + Console.WriteLine("Functions: \n" + + "DIAGNOSTICS: \n" + + "m.health() - print simple health report on battery \n" + + "m.read_id() - print labelled and formatted diagnostics \n" + + "m.read_id(output=\"raw\") - print in spreadsheet format \n" + + "m.submit_form() - prompts for manual inputs and submits battery diagnostics data \n" + + "\n" + + "m.help() - this message\n" + + "m.adv_help() - advanced help\n" + + "\n" + + "exit() - end program\n"); } public void adv_help() { - Console.WriteLine("Advanced functions: \n \ - m.read_all() - print all known bytes in 0x01 command \n \ - m.read_all_spreadsheet() - print bytes in spreadsheet format \n \ - \n \ - CHARGING SIMULATION: \n \ - m.simulate() - simulate charging comms \n \ - m.simulate_for(t) - simulate for t seconds \n \ - m.high_for(t) - bring J2 high for t sec, then idle \n \ - \n \ - m.write_message(message) - write ascii string to 0x0023 register (20 chars)\n \ - \n \ - Debug: \n \ - m.PRINT_TX = True - boolean to enable TX messages \n \ - m.PRINT_RX = True - boolean to enable RX messages \n \ - m.txrx_print(bool) - set PRINT_TX & RX to bool \n \ - m.txrx_save_and_set(bool) - save PRINT_TX & RX state, then set both to bool \n \ - m.txrx_restore() - restore PRINT_TX & RX to saved values \n \ - m.brute(addr_msb, addr_lsb) \n \ - m.full_brute(start, stop, len) - check registers from 'start' to 'stop'. look for 'len' bytes \n \ - m.debug(addr_msb, addr_lsb, len, rsp_len) - send reset() then cmd() to battery \n \ - m.try_cmd(cmd, addr_h, addr_l, len) - try 'cmd' at [addr_h addr_l] with 'len' bytes \n \ - \n \ - Internal:\n \ - m.high() - bring J2 pin high (20V)\n \ - m.idle() - pull J2 pin low (0V) \n \ - m.reset() - send 0xAA to battery. Return true if battery replies wih 0xAA \n \ - m.get_snapchat() - request 'snapchat' from battery (0x61)\n \ - m.configure() - send 'configure' message (0x60, charger parameters)\n \ - m.calibrate() - calibration/interrupt command (0x55) \n \ - m.keepalive() - send charge current request (0x62) \n"); + Console.WriteLine("Advanced functions: \n" + + "m.read_all() - print all known bytes in 0x01 command \n" + + "m.read_all_spreadsheet() - print bytes in spreadsheet format \n" + + "\n" + + "CHARGING SIMULATION: \n" + + "m.simulate() - simulate charging comms \n" + + "m.simulate_for(t) - simulate for t seconds \n" + + "m.high_for(t) - bring J2 high for t sec, then idle \n" + + "\n" + + "m.write_message(message) - write ascii string to 0x0023 register (20 chars)\n" + + "\n" + + "Debug: \n" + + "m.PRINT_TX = True - boolean to enable TX messages \n" + + "m.PRINT_RX = True - boolean to enable RX messages \n" + + "m.txrx_print(bool) - set PRINT_TX & RX to bool \n" + + "m.txrx_save_and_set(bool) - save PRINT_TX & RX state, then set both to bool \n" + + "m.txrx_restore() - restore PRINT_TX & RX to saved values \n" + + "m.brute(addr_msb, addr_lsb) \n" + + "m.full_brute(start, stop, len) - check registers from 'start' to 'stop'. look for 'len' bytes \n" + + "m.debug(addr_msb, addr_lsb, len, rsp_len) - send reset() then cmd() to battery \n" + + "m.try_cmd(cmd, addr_h, addr_l, len) - try 'cmd' at [addr_h addr_l] with 'len' bytes \n" + + "\n" + + "Internal:\n" + + "m.high() - bring J2 pin high (20V)\n" + + "m.idle() - pull J2 pin low (0V) \n" + + "m.reset() - send 0xAA to battery. Return true if battery replies wih 0xAA \n" + + "m.get_snapchat() - request 'snapchat' from battery (0x61)\n" + + "m.configure() - send 'configure' message (0x60, charger parameters)\n" + + "m.calibrate() - calibration/interrupt command (0x55) \n" + + "m.keepalive() - send charge current request (0x62) \n"); } } } From bb28e35b21dd1547258e62e9ca8d8bff46570fd6 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 13:17:52 -0500 Subject: [PATCH 52/61] Switch to FTDI D2XX driver and add raw log --- FtdiD2xxPort.cs | 205 +++++++++++++++++++++++++++++ FtdiDeviceUtil.cs | 136 +++++++++++++++++++ M18AnalyzerMain.Designer.cs | 116 +++++++++++------ M18AnalyzerMain.cs | 253 ++++++++++++++++++------------------ M18BatteryInfo.csproj | 10 +- M18Protocol.cs | 83 +++++------- Program.cs | 8 +- SerialPortUtil.cs | 41 +----- 8 files changed, 591 insertions(+), 261 deletions(-) create mode 100644 FtdiD2xxPort.cs create mode 100644 FtdiDeviceUtil.cs diff --git a/FtdiD2xxPort.cs b/FtdiD2xxPort.cs new file mode 100644 index 0000000..d51d473 --- /dev/null +++ b/FtdiD2xxPort.cs @@ -0,0 +1,205 @@ +// ************************************************************************************************* +// FtdiD2xxPort.cs +// ---------------- +// Thin wrapper around the FTDI D2XX .NET API (FTD2XX_NET.dll) that mirrors the behaviour of +// Python's pyserial.Serial object used in m18.py. Every control-line toggle, baud configuration, +// purge, read, and write operation is forwarded to the equivalent D2XX call while emitting verbose +// log messages so the WinForms UI can show a "Raw D2XX Log" tab. The goal is a drop-in replacement +// for SerialPort that preserves timing and side effects of the original Python implementation. +// ************************************************************************************************* + +using System; // Provides basic types and exceptions. +using System.Collections.Generic; // Enables List usage for byte collections. +using System.Linq; // LINQ helpers for hex string formatting. +using FTD2XX_NET; // Official FTDI D2XX managed wrapper used for all USB-UART interactions. + +namespace M18BatteryInfo; + +/// +/// Wraps an FTDI device opened through the D2XX API and exposes SerialPort-like methods used by the +/// protocol layer. Each method logs the corresponding D2XX call to maintain transparency between the +/// C# port and the reference m18.py behaviour. +/// +internal sealed class FtdiD2xxPort : IDisposable +{ + private readonly FTDI _ftdi = new(); // Underlying D2XX object controlling the FT232. + private Action? _rawLogger; // Optional logger to display each D2XX call. + + public FtdiDeviceDisplay Device { get; } // Selected FTDI device metadata used for logging. + + public bool IsOpen { get; private set; } // Tracks whether FT_Open succeeded. + + /// + /// Constructs the port wrapper, opens the FTDI device by serial number, and configures the + /// communication parameters (4800 8N2) to mirror pyserial settings in m18.py. + /// + public FtdiD2xxPort(FtdiDeviceDisplay device, Action? rawLogger) + { + Device = device; // Store device metadata for logs and future reference. + _rawLogger = rawLogger; // Save logger delegate for raw D2XX log tab. + + Log($"FT_OpenEx (by serial) -> {device.SerialNumber}"); // Trace open request. + EnsureStatus(_ftdi.OpenBySerialNumber(device.SerialNumber), "FT_OpenEx"); // Open FTDI handle. + IsOpen = true; // Mark handle as active so Dispose knows to close it. + + ConfigureForM18(); // Apply baud, framing, flow control, and timeouts identical to pyserial settings. + } + + /// + /// Sets baud rate, data characteristics, flow control, and timeouts to match the original + /// Python Serial() constructor (4800 baud, 8 data bits, no parity, two stop bits, 800ms timeouts). + /// + private void ConfigureForM18() + { + Log("FT_SetBaudRate(4800)"); + EnsureStatus(_ftdi.SetBaudRate(4800), "FT_SetBaudRate(4800)"); + + Log("FT_SetDataCharacteristics(8 data bits, 2 stop bits, no parity)"); + EnsureStatus( + _ftdi.SetDataCharacteristics( + FTDI.FT_DATA_BITS.FT_BITS_8, + FTDI.FT_STOP_BITS.FT_STOP_BITS_2, + FTDI.FT_PARITY.FT_PARITY_NONE), + "FT_SetDataCharacteristics(8N2)"); + + Log("FT_SetFlowControl(NONE)"); + EnsureStatus(_ftdi.SetFlowControl(FTDI.FT_FLOW_CONTROL.FT_FLOW_NONE, 0, 0), "FT_SetFlowControl(NONE)"); + + Log("FT_SetTimeouts(Read=800ms, Write=800ms)"); + EnsureStatus(_ftdi.SetTimeouts(800, 800), "FT_SetTimeouts(800ms)"); + + PurgeAll(); // Clear any residual data to mimic SerialPort.DiscardInBuffer/DiscardOutBuffer. + } + + /// + /// Drives BREAK on (TX low) or off (TX released) to mirror SerialPort.BreakState mutations. + /// + public void SetBreak(bool enable) + { + Log(enable ? "FT_SetBreakOn" : "FT_SetBreakOff"); + EnsureStatus(_ftdi.SetBreak(enable), enable ? "FT_SetBreakOn" : "FT_SetBreakOff"); + } + + /// + /// Asserts or clears DTR using the explicit D2XX functions that map to SerialPort.DtrEnable. + /// + public void SetDtr(bool enable) + { + if (enable) + { + Log("FT_SetDtr"); + EnsureStatus(_ftdi.SetDTR(), "FT_SetDtr"); + } + else + { + Log("FT_ClrDtr"); + EnsureStatus(_ftdi.ClrDTR(), "FT_ClrDtr"); + } + } + + /// + /// Purges both RX and TX buffers, matching SerialPort.DiscardInBuffer/DiscardOutBuffer. + /// + public void PurgeAll() + { + Log("FT_Purge(RX|TX)"); + EnsureStatus(_ftdi.Purge(FTDI.FT_PURGE.FT_PURGE_RX | FTDI.FT_PURGE.FT_PURGE_TX), "FT_Purge(RX|TX)"); + } + + /// + /// Purges only the receive buffer to clear stale bytes before a new transaction (send()). + /// + public void PurgeRx() + { + Log("FT_Purge(RX)"); + EnsureStatus(_ftdi.Purge(FTDI.FT_PURGE.FT_PURGE_RX), "FT_Purge(RX)"); + } + + /// + /// Writes the provided bytes to the FT232 with the same ordering and timing as pyserial.write(). + /// + public void WriteBytes(byte[] data) + { + uint bytesWritten = 0; // Will hold the number of bytes actually written by FT_Write. + Log($"FT_Write {FormatHex(data)}"); + EnsureStatus(_ftdi.Write(data, data.Length, ref bytesWritten), "FT_Write"); + if (bytesWritten != data.Length) + { + throw new InvalidOperationException($"FT_Write wrote {bytesWritten} of {data.Length} bytes"); + } + } + + /// + /// Reads exactly bytes, respecting the configured 800ms timeout to + /// mirror SerialPort.Read behaviour in the Python reference implementation. + /// + public byte[] ReadBytes(int count) + { + var buffer = new byte[count]; // Allocate destination buffer identical to SerialPort.Read(byte[],...). + uint bytesRead = 0; // Tracks how many bytes the driver returned. + var status = _ftdi.Read(buffer, count, ref bytesRead); // Perform blocking read via D2XX. + Log($"FT_Read(count={count}) -> status={status}, bytesRead={bytesRead}, data={FormatHex(buffer.Take((int)bytesRead))}"); + if (status != FTDI.FT_STATUS.FT_OK || bytesRead == 0) + { + throw new InvalidOperationException($"FT_Read failed or returned zero bytes (status={status})"); + } + + if (bytesRead < count) + { + // Partial reads mirror SerialPort's ValueError condition in m18.py when response is shorter than expected. + throw new InvalidOperationException($"FT_Read returned {bytesRead} of {count} bytes"); + } + + return buffer; // Return the full buffer to the caller. + } + + /// + /// Closes the FTDI handle, logging the underlying FT_Close call to keep parity with m18.py exit + /// behaviour. Idempotent so callers can safely invoke multiple times. + /// + public void Close() + { + if (!IsOpen) + { + return; // Already closed or never opened. + } + + Log("FT_Close"); + EnsureStatus(_ftdi.Close(), "FT_Close"); + IsOpen = false; // Mark handle closed to prevent duplicate closes. + } + + /// + /// Disposes the FTDI handle by calling . + /// + public void Dispose() + { + Close(); // Close FTDI handle when wrapper is disposed. + } + + private void EnsureStatus(FTDI.FT_STATUS status, string operation) + { + if (status != FTDI.FT_STATUS.FT_OK) + { + throw new InvalidOperationException($"{operation} failed with status {status}"); + } + } + + private void Log(string message) + { + _rawLogger?.Invoke(message); // Emit raw D2XX trace when logger provided. + } + + /// + /// Updates the raw logger delegate so callers can redirect FTDI call traces at runtime. + /// + public void UpdateLogger(Action? logger) + { + _rawLogger = logger; // Swap logger used by Log(). + } + + private static string FormatHex(IEnumerable data) + { + return string.Join(" ", data.Select(b => $"0x{b:X2}")); // Formats byte arrays similar to m18.py debug. + } +} diff --git a/FtdiDeviceUtil.cs b/FtdiDeviceUtil.cs new file mode 100644 index 0000000..1c0f50b --- /dev/null +++ b/FtdiDeviceUtil.cs @@ -0,0 +1,136 @@ +// ************************************************************************************************* +// FtdiDeviceUtil.cs +// ------------------ +// Enumerates FTDI devices using the official D2XX .NET wrapper (FTD2XX_NET.dll). The helper mirrors +// pyserial's list_ports output by pairing each FTDI node with SetupAPI metadata (manufacturer, +// location path, optional COM port mapping) from SerialPortUtil. This ensures the WinForms UI can +// show human-readable device descriptions while all communications are routed through the D2XX API +// rather than System.IO.Ports.SerialPort. +// ************************************************************************************************* + +using System; // Basic .NET primitives. +using System.Collections.Generic; // List for returning device results. +using System.Linq; // LINQ helpers to correlate FTDI serial numbers with SetupAPI metadata. +using FTD2XX_NET; // Official managed wrapper around the FTDI D2XX driver. + +namespace M18BatteryInfo; + +/// +/// Utility that queries the FTDI D2XX driver for attached USB-UART bridges and enriches the +/// results with SetupAPI metadata so the UI can display friendly text. All serial I/O goes through +/// D2XX; this class only discovers devices and never touches System.IO.Ports.SerialPort. +/// +internal static class FtdiDeviceUtil +{ + /// + /// Enumerates FTDI devices using and correlates the entries + /// with SetupAPI metadata for display. Every D2XX call is logged for the optional debug logger + /// to mimic the verbose output of m18.py. + /// + /// Optional sink that receives raw D2XX call descriptions. + /// Ordered list of FTDI devices present on the system. + public static List EnumerateDevices(Action? debugLogger = null) + { + var devices = new List(); // Accumulates enumeration results. + var ftdi = new FTDI(); // FTDI object used solely for discovery; not kept open. + + // D2XX: query the number of attached FTDI devices. Mirrors pyserial's initial port scan. + var status = ftdi.GetNumberOfDevices(ref var count); + debugLogger?.Invoke($"FT_GetNumberOfDevices -> {status} (count={count})"); + if (status != FTDI.FT_STATUS.FT_OK || count == 0) + { + return devices; // No devices or driver failure; return empty list. + } + + // Prepare a buffer and request the full device list from the driver. + var nodes = new FTDI.FT_DEVICE_INFO_NODE[count]; + status = ftdi.GetDeviceList(nodes); + debugLogger?.Invoke($"FT_GetDeviceInfoList -> {status}"); + if (status != FTDI.FT_STATUS.FT_OK) + { + return devices; // Abort enumeration on error to avoid incomplete data. + } + + // Pull SetupAPI port metadata to correlate COM names and USB descriptors with D2XX entries. + var setupApiPorts = SerialPortUtil.EnumerateDetailedPorts(debugLogger); + + for (var i = 0; i < nodes.Length; i++) + { + var node = nodes[i]; // Capture current device info node from D2XX. + var serialNumber = node.SerialNumber ?? string.Empty; // Serial is the stable key. + + // Try to match the FTDI serial number to a SetupAPI COM-port entry for additional labels. + var matchingPort = setupApiPorts.FirstOrDefault(port => + string.Equals(port.UsbSerialNumber, serialNumber, StringComparison.OrdinalIgnoreCase)); + + // Compose a record that includes both D2XX and SetupAPI metadata for UI display. + var display = new FtdiDeviceDisplay( + Index: (uint)i, + SerialNumber: serialNumber, + Description: node.Description ?? "FTDI Device", + DeviceId: node.ID, + LocationId: node.LocId, + DeviceType: node.Type, + ComPort: matchingPort?.PortName, + Manufacturer: matchingPort?.Manufacturer, + FriendlyName: matchingPort?.FriendlyName, + Source: matchingPort?.Source ?? "D2XX enumeration" + ); + + devices.Add(display); // Store result for caller. + + // Emit a verbose log line to replicate m18.py debug output patterns. + debugLogger?.Invoke( + $"FTDI[{i}] Serial={display.SerialNumber}, Desc={display.Description}, COM={display.ComPort ?? "(none)"}, LocId=0x{display.LocationId:X}, Id=0x{display.DeviceId:X}, Source={display.Source}"); + } + + return devices + .OrderBy(device => device.SerialNumber, StringComparer.OrdinalIgnoreCase) // Stable ordering for UI. + .ToList(); + } +} + +/// +/// Immutable record describing a single FTDI device, combining D2XX and SetupAPI data so the UI can +/// display a helpful label while the protocol layer opens the device by serial number/index. +/// +internal sealed record FtdiDeviceDisplay( + uint Index, + string SerialNumber, + string Description, + uint DeviceId, + uint LocationId, + FTDI.FT_DEVICE DeviceType, + string? ComPort, + string? Manufacturer, + string? FriendlyName, + string? Source) +{ + public string DisplayName + { + get + { + // Example: "SN:FT123ABC - FT232R USB UART - COM3 - FTDI" + var parts = new List { $"SN:{SerialNumber}" }; + + if (!string.IsNullOrWhiteSpace(Description)) + { + parts.Add(Description); + } + + if (!string.IsNullOrWhiteSpace(ComPort)) + { + parts.Add(ComPort!); + } + + if (!string.IsNullOrWhiteSpace(Manufacturer)) + { + parts.Add(Manufacturer!); + } + + return string.Join(" - ", parts); + } + } + + public override string ToString() => DisplayName; // ComboBox uses this for display text. +} diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs index 4d883af..59281a5 100644 --- a/M18AnalyzerMain.Designer.cs +++ b/M18AnalyzerMain.Designer.cs @@ -41,11 +41,11 @@ private void InitializeComponent() components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); tabControlM18Main = new TabControl(); - tabSimple = new TabPage(); - btnTestFT232 = new Button(); - grpOutput = new GroupBox(); - btnCopyOutput = new Button(); - btnReset = new Button(); + tabSimple = new TabPage(); + btnTestFT232 = new Button(); + grpOutput = new GroupBox(); + btnCopyOutput = new Button(); + btnReset = new Button(); btnHealthReport = new Button(); btnActive = new Button(); rtbOutput = new RichTextBox(); @@ -85,11 +85,13 @@ private void InitializeComponent() btnReadIDLabelled = new Button(); btnReadIDRaw = new Button(); btnReadAllSpreadsheet = new Button(); - btnReadAllRegisters = new Button(); - rtbAdvOutput = new RichTextBox(); - tabSimulation = new TabPage(); - grpBxSimCustomProfile = new GroupBox(); - lblCutoffRaw = new Label(); + btnReadAllRegisters = new Button(); + rtbAdvOutput = new RichTextBox(); + tabD2xx = new TabPage(); + rtbD2xxLog = new RichTextBox(); + tabSimulation = new TabPage(); + grpBxSimCustomProfile = new GroupBox(); + lblCutoffRaw = new Label(); lblMaxCurrAmps = new Label(); txtMaxCurrAmps = new TextBox(); lblMaxCurrRaw = new Label(); @@ -143,11 +145,12 @@ private void InitializeComponent() // // tabControlM18Main // - tabControlM18Main.Controls.Add(tabSimple); - tabControlM18Main.Controls.Add(tabAdvanced); - tabControlM18Main.Controls.Add(tabSimulation); - tabControlM18Main.Controls.Add(tabDiagnostics); - tabControlM18Main.Controls.Add(tabAbout); + tabControlM18Main.Controls.Add(tabSimple); + tabControlM18Main.Controls.Add(tabAdvanced); + tabControlM18Main.Controls.Add(tabD2xx); + tabControlM18Main.Controls.Add(tabSimulation); + tabControlM18Main.Controls.Add(tabDiagnostics); + tabControlM18Main.Controls.Add(tabAbout); tabControlM18Main.Location = new Point(6, 6); tabControlM18Main.Margin = new Padding(2); tabControlM18Main.Name = "tabControlM18Main"; @@ -305,9 +308,9 @@ private void InitializeComponent() lblSerialPort.Location = new Point(5, 11); lblSerialPort.Margin = new Padding(2, 0, 2, 0); lblSerialPort.Name = "lblSerialPort"; - lblSerialPort.Size = new Size(79, 20); - lblSerialPort.TabIndex = 2; - lblSerialPort.Text = "Serial Port:"; + lblSerialPort.Size = new Size(79, 20); + lblSerialPort.TabIndex = 2; + lblSerialPort.Text = "FTDI Device:"; // // cmbBxSerialPort // @@ -334,16 +337,29 @@ private void InitializeComponent() tabAdvanced.Controls.Add(btnReadIDLabelled); tabAdvanced.Controls.Add(btnReadIDRaw); tabAdvanced.Controls.Add(btnReadAllSpreadsheet); - tabAdvanced.Controls.Add(btnReadAllRegisters); - tabAdvanced.Controls.Add(rtbAdvOutput); - tabAdvanced.Location = new Point(4, 29); - tabAdvanced.Margin = new Padding(2); - tabAdvanced.Name = "tabAdvanced"; + tabAdvanced.Controls.Add(btnReadAllRegisters); + tabAdvanced.Controls.Add(rtbAdvOutput); + tabAdvanced.Location = new Point(4, 29); + tabAdvanced.Margin = new Padding(2); + tabAdvanced.Name = "tabAdvanced"; tabAdvanced.Padding = new Padding(2); tabAdvanced.Size = new Size(1090, 361); - tabAdvanced.TabIndex = 1; - tabAdvanced.Text = "Advanced"; - tabAdvanced.UseVisualStyleBackColor = true; + tabAdvanced.TabIndex = 1; + tabAdvanced.Text = "Advanced"; + tabAdvanced.UseVisualStyleBackColor = true; + + // + // tabD2xx + // + tabD2xx.Controls.Add(rtbD2xxLog); + tabD2xx.Location = new Point(4, 29); + tabD2xx.Margin = new Padding(2); + tabD2xx.Name = "tabD2xx"; + tabD2xx.Padding = new Padding(2); + tabD2xx.Size = new Size(1090, 361); + tabD2xx.TabIndex = 2; + tabD2xx.Text = "Raw D2XX Log"; + tabD2xx.UseVisualStyleBackColor = true; // // btnRestoreTxRxState // @@ -655,12 +671,23 @@ private void InitializeComponent() // // rtbAdvOutput // - rtbAdvOutput.Location = new Point(179, 160); - rtbAdvOutput.Margin = new Padding(2); - rtbAdvOutput.Name = "rtbAdvOutput"; - rtbAdvOutput.Size = new Size(532, 142); - rtbAdvOutput.TabIndex = 0; - rtbAdvOutput.Text = ""; + rtbAdvOutput.Location = new Point(179, 160); + rtbAdvOutput.Margin = new Padding(2); + rtbAdvOutput.Name = "rtbAdvOutput"; + rtbAdvOutput.Size = new Size(532, 142); + rtbAdvOutput.TabIndex = 0; + rtbAdvOutput.Text = ""; + + // + // rtbD2xxLog + // + rtbD2xxLog.Dock = DockStyle.Fill; + rtbD2xxLog.Location = new Point(2, 2); + rtbD2xxLog.Margin = new Padding(2); + rtbD2xxLog.Name = "rtbD2xxLog"; + rtbD2xxLog.Size = new Size(1086, 357); + rtbD2xxLog.TabIndex = 0; + rtbD2xxLog.Text = ""; // // tabSimulation // @@ -678,7 +705,7 @@ private void InitializeComponent() tabSimulation.Name = "tabSimulation"; tabSimulation.Padding = new Padding(2); tabSimulation.Size = new Size(1090, 361); - tabSimulation.TabIndex = 2; + tabSimulation.TabIndex = 3; tabSimulation.Text = "Simulation"; tabSimulation.UseVisualStyleBackColor = true; // @@ -870,7 +897,7 @@ private void InitializeComponent() tabDiagnostics.Name = "tabDiagnostics"; tabDiagnostics.Padding = new Padding(2); tabDiagnostics.Size = new Size(1090, 361); - tabDiagnostics.TabIndex = 3; + tabDiagnostics.TabIndex = 4; tabDiagnostics.Text = "Submit Diagnostics"; tabDiagnostics.UseVisualStyleBackColor = true; // @@ -1017,7 +1044,7 @@ private void InitializeComponent() tabAbout.Name = "tabAbout"; tabAbout.Padding = new Padding(2); tabAbout.Size = new Size(1090, 361); - tabAbout.TabIndex = 4; + tabAbout.TabIndex = 5; tabAbout.Text = "About"; tabAbout.UseVisualStyleBackColor = true; // @@ -1109,14 +1136,15 @@ private void InitializeComponent() tabSimple.ResumeLayout(false); tabSimple.PerformLayout(); grpOutput.ResumeLayout(false); - tabAdvanced.ResumeLayout(false); - tabAdvanced.PerformLayout(); - grpTryCmd.ResumeLayout(false); - grpTryCmd.PerformLayout(); - grpbxDebugCmd.ResumeLayout(false); - grpbxDebugCmd.PerformLayout(); - tabSimulation.ResumeLayout(false); - tabSimulation.PerformLayout(); + tabAdvanced.ResumeLayout(false); + tabAdvanced.PerformLayout(); + grpTryCmd.ResumeLayout(false); + grpTryCmd.PerformLayout(); + grpbxDebugCmd.ResumeLayout(false); + grpbxDebugCmd.PerformLayout(); + tabD2xx.ResumeLayout(false); + tabSimulation.ResumeLayout(false); + tabSimulation.PerformLayout(); grpBxSimCustomProfile.ResumeLayout(false); grpBxSimCustomProfile.PerformLayout(); tabDiagnostics.ResumeLayout(false); @@ -1132,6 +1160,7 @@ private void InitializeComponent() private TabControl tabControlM18Main; private TabPage tabSimple; private TabPage tabAdvanced; + private TabPage tabD2xx; private ComboBox cmbBxSerialPort; private RichTextBox rtbOutput; private TabPage tabSimulation; @@ -1150,6 +1179,7 @@ private void InitializeComponent() private Button btnReadAllSpreadsheet; private Button btnReadAllRegisters; private RichTextBox rtbAdvOutput; + private RichTextBox rtbD2xxLog; private TextBox txtWriteMessage; private Button btnWriteMessage; private Button btnReadIDLabelled; diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index 922ee44..ee0a860 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -4,16 +4,15 @@ // Hosts the user-facing WinForms logic for the Milwaukee M18 battery analyzer GUI. This partial // class pairs with M18AnalyzerMain.Designer.cs (UI layout) to render the form and wire up buttons, // combo boxes, and rich text boxes. It acts as a bridge between the UI events and the lower-level -// serial protocol implementation in M18Protocol.cs as well as the COM port discovery helper -// SerialPortUtil.cs. Every method and key line is commented to teach WinForms fundamentals (event +// serial protocol implementation in M18Protocol.cs as well as the FTDI discovery helper +// FtdiDeviceUtil.cs. Every method and key line is commented to teach WinForms fundamentals (event // registration, marshaling to the UI thread), serial programming (driving DTR/Break for idle/high), // and logging approaches. Reading the comments alone should explain how the GUI controls map to the // electrical behavior on the FT232/COM port pins and how the protocol layer is orchestrated. // ************************************************************************************************* using System; // Provides core types like EventArgs, Action, and DateTime used throughout the form. -using System.Collections.Generic; // Supplies List for storing SerialPortDisplay objects. -using System.IO.Ports; // Exposes SerialPort and related enumerations (Parity, StopBits) for UART control. +using System.Collections.Generic; // Supplies List for storing FTDI device objects. using System.Linq; // Enables LINQ helpers such as Select and ToList used during logging. using System.Threading.Tasks; // Enables Task.Run for background work that keeps the UI responsive. using System.Windows.Forms; // Provides Form, control types, and dialog helpers used by WinForms. @@ -21,27 +20,29 @@ namespace M18BatteryInfo { /// - /// The primary WinForms window that presents user controls for serial-port selection, + /// The primary WinForms window that presents user controls for FTDI device selection, /// connection management, and protocol commands (idle/high/reset/health-report). This class /// captures events fired by buttons and other controls, marshals work to background threads so /// the UI does not freeze, and forwards user actions to which drives /// the UART (TX) line high/low and exchanges bytes with the battery BMS. It also uses - /// to enumerate available COM ports with extended metadata. + /// to enumerate FTDI devices with extended metadata. /// public partial class frmMain : Form { // Backing field holding the active protocol connection. Null means no port is open. - private M18Protocol? _protocol; // M18Protocol manipulates SerialPort.BreakState/DtrEnable to emulate charger signals. + private M18Protocol? _protocol; // M18Protocol manipulates FT_SetBreak/FT_SetDtr to emulate charger signals. // Track whether the simple output RichTextBox already has content to manage newlines. private bool _hasAppendedLog; // Ensures we only prepend Environment.NewLine after the first log line. // Track whether the advanced output RichTextBox already has content. private bool _hasAppendedAdvancedLog; // Similar flag for the advanced log tab to avoid leading blank lines. // Track whether the debug output RichTextBox already has content. private bool _hasAppendedDebugLog; // Prevents inserting extra blank lines before first debug message. - // Store the currently selected COM port name for connection attempts. - private string? _selectedPortName; // Persisted when user picks an item from cmbBxSerialPort. - // Store a human-friendly port description for user messages. - private string? _selectedPortDescription; // Derived from SerialPortDisplay to show manufacturer/USB metadata. + // Track whether the raw D2XX log RichTextBox already has content. + private bool _hasAppendedD2xxLog; // Prevents inserting extra blank lines before first raw D2XX entry. + // Store the currently selected FTDI device for connection attempts. + private FtdiDeviceDisplay? _selectedDevice; // Persisted when user picks an item from cmbBxSerialPort. + // Store a human-friendly device description for user messages. + private string? _selectedDeviceDescription; // Derived from FtdiDeviceDisplay to show manufacturer/USB metadata. /// /// Constructs the form, initializes UI components generated by the designer, and hooks up @@ -54,9 +55,9 @@ public frmMain() // Wire up button click and change handlers to their corresponding methods. Delegates are // created here to keep designer file clean and to demonstrate event subscription syntax. - btnRefresh.Click += btnRefresh_Click; // Refresh list of serial ports when "Refresh" pressed. - btnConnect.Click += btnConnect_Click; // Attempt to open serial port when "Connect" pressed. - btnDisconnect.Click += btnDisconnect_Click; // Close serial port when "Disconnect" pressed. + btnRefresh.Click += btnRefresh_Click; // Refresh list of FTDI devices when "Refresh" pressed. + btnConnect.Click += btnConnect_Click; // Attempt to open FTDI device when "Connect" pressed. + btnDisconnect.Click += btnDisconnect_Click; // Close FTDI device when "Disconnect" pressed. btnIdle.Click += btnIdle_Click; // Drive TX low (Break/DTR asserted) to simulate idle charger pin. btnActive.Click += btnActive_Click; // Drive TX high (Break/DTR deasserted) to simulate charging. btnHealthReport.Click += btnHealthReport_Click; // Trigger multi-register read to show battery stats. @@ -65,16 +66,16 @@ public frmMain() chkbxTXLog.CheckedChanged += chkbxTXLog_CheckedChanged; // Toggle TX byte logging. chkboxRxLog.CheckedChanged += chkboxRxLog_CheckedChanged; // Toggle RX byte logging. btnTestFT232.Click += btnTestFT232_Click; // Run quick FT232 loopback/response test. - cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged; // Capture selected COM port. - FormClosing += frmMain_FormClosing; // Ensure we cleanly close serial port when form closes. + cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged; // Capture selected FTDI device. + FormClosing += frmMain_FormClosing; // Ensure we cleanly close FTDI device when form closes. // Default logging preferences to on so that users see both TX and RX traffic. chkbxTXLog.Checked = true; // Enables printing TX bytes through M18Protocol.TxLogger. chkboxRxLog.Checked = true; // Enables printing RX bytes through M18Protocol.RxLogger. // Provide friendly tooltips describing each control's purpose. - toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available serial ports."); // Helps beginners understand UI flow. - toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); // Explains connection button. + toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available FTDI devices."); // Helps beginners understand UI flow. + toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected FTDI device."); // Explains connection button. toolTipSimpleTab.SetToolTip(btnDisconnect, "Disconnect from the currently connected device."); // Clarifies safe disconnect. toolTipSimpleTab.SetToolTip(btnIdle, "Drive TX low (idle). Safe for connect/disconnect."); // Notes electrical effect on TX line. toolTipSimpleTab.SetToolTip(btnActive, "Drive TX high (active). Charger simulation."); // Indicates charger-simulation state. @@ -105,12 +106,12 @@ private void toolTipReset_Popup(object sender, PopupEventArgs e) } /// - /// Executes when the form finishes loading. We immediately refresh serial ports so the + /// Executes when the form finishes loading. We immediately refresh FTDI devices so the /// combo box is populated before the user interacts with it. /// private void frmMain_Load(object sender, EventArgs e) { - RefreshSerialPorts(); // Kick off port enumeration via SerialPortUtil. + RefreshSerialPorts(); // Kick off device enumeration via FtdiDeviceUtil. } /// @@ -151,72 +152,72 @@ private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) private void btnRefresh_Click(object? sender, EventArgs e) { LogDebugAction("Requesting RefreshSerialPorts()."); // Show action in debug log for traceability. - RefreshSerialPorts(); // Pull latest COM ports using SerialPortUtil. + RefreshSerialPorts(); // Pull latest FTDI devices using FtdiDeviceUtil. } /// - /// Enumerates available serial ports, populates the combo box, and logs rich metadata for - /// troubleshooting USB cables/adapters. Uses . + /// Enumerates available FTDI devices, populates the combo box, and logs rich metadata for + /// troubleshooting USB cables/adapters. Uses . /// private void RefreshSerialPorts() { - AppendLogBoth("Refreshing serial port list..."); // Inform user in both simple and debug logs. + AppendLogBoth("Refreshing FTDI device list..."); // Inform user in both simple and debug logs. try { - var ports = GetSerialPortInfos(); // Gather COM port info via SerialPortUtil (uses SetupAPI). + var devices = GetFtdiDevices(); // Gather FTDI info via D2XX (plus SetupAPI for COM mapping). cmbBxSerialPort.Items.Clear(); // Reset combo box so old entries do not linger. - foreach (var port in ports) + foreach (var device in devices) { - cmbBxSerialPort.Items.Add(port); // Add SerialPortDisplay; ToString() shows DisplayName. - AppendLogBoth($"Found port {port.DisplayName}"); // Echo discovery to the log. + cmbBxSerialPort.Items.Add(device); // Add FTDI record; ToString() shows DisplayName. + AppendLogBoth($"Found FTDI device {device.DisplayName}"); // Echo discovery to the log. } - AppendDebugLog($"RefreshSerialPorts(): {ports.Count} port(s) detected."); // Debug summary count. - foreach (var port in ports) + AppendDebugLog($"RefreshSerialPorts(): {devices.Count} FTDI device(s) detected."); // Debug summary count. + foreach (var device in devices) { - var sourceLabel = string.IsNullOrWhiteSpace(port.Source) ? "Unknown source" : port.Source; // Prefer readable source text. - AppendDebugLog($" - {port.DisplayName} (source: {sourceLabel})."); // Include display name and source origin. - AppendDebugLog($" Details: description='{port.DeviceDescription ?? "(none)"}', manufacturer='{port.Manufacturer ?? "(none)"}', hwid='{port.HardwareIds ?? "(none)"}'"); // Show manufacturer/hardware IDs for driver troubleshooting. + var sourceLabel = string.IsNullOrWhiteSpace(device.Source) ? "Unknown source" : device.Source; // Prefer readable source text. + AppendDebugLog($" - {device.DisplayName} (source: {sourceLabel})."); // Include display name and source origin. + AppendDebugLog($" Details: description='{device.Description}', serial='{device.SerialNumber}', COM='{device.ComPort ?? "(none)"}', manufacturer='{device.Manufacturer ?? "(none)"}'"); // Show manufacturer/hardware IDs for driver troubleshooting. } - if (ports.Count == 0) + if (devices.Count == 0) { - AppendLogBoth("No serial ports detected."); // Warn user if no COM ports are found (e.g., driver missing). + AppendLogBoth("No FTDI devices detected."); // Warn user if no FTDI cables are found (e.g., driver missing). } else { - cmbBxSerialPort.SelectedIndex = 0; // Auto-select first port to streamline connection flow. + cmbBxSerialPort.SelectedIndex = 0; // Auto-select first device to streamline connection flow. } if (cmbBxSerialPort.SelectedItem is null) { - _selectedPortName = null; // Reset selection tracking if nothing is selected. - _selectedPortDescription = null; // Clear human-friendly description too. + _selectedDevice = null; // Reset selection tracking if nothing is selected. + _selectedDeviceDescription = null; // Clear human-friendly description too. } } catch (Exception ex) { - LogError("Error while refreshing serial ports", ex); // Surface exceptions with MessageBox to aid debugging. + LogError("Error while refreshing FTDI devices", ex); // Surface exceptions with MessageBox to aid debugging. } } /// - /// Captures combo-box selection changes so we know which COM port to open. + /// Captures combo-box selection changes so we know which FTDI device to open. /// private void cmbBxSerialPort_SelectedIndexChanged(object? sender, EventArgs e) { - if (cmbBxSerialPort.SelectedItem is SerialPortDisplay selected) + if (cmbBxSerialPort.SelectedItem is FtdiDeviceDisplay selected) { - _selectedPortName = selected.PortName; // Save COM port name (e.g., COM3) for connection. - _selectedPortDescription = selected.DeviceDescription ?? selected.DisplayName; // Save descriptive text for user prompts. - AppendDebugLog($"Selected port set to {selected.DisplayName} (source: {selected.Source})."); // Log the selection for trace. + _selectedDevice = selected; // Save FTDI device entry for connection. + _selectedDeviceDescription = selected.DisplayName; // Save descriptive text for user prompts. + AppendDebugLog($"Selected FTDI device set to {selected.DisplayName} (source: {selected.Source})."); // Log the selection for trace. } else { - _selectedPortName = null; // Clear cached name if selection is removed. - _selectedPortDescription = null; // Clear description as well. + _selectedDevice = null; // Clear cached name if selection is removed. + _selectedDeviceDescription = null; // Clear description as well. } } @@ -228,34 +229,34 @@ private void cmbBxSerialPort_SelectedIndexChanged(object? sender, EventArgs e) private async void btnConnect_Click(object? sender, EventArgs e) { LogDebugAction("Requesting Connect()."); // Debug log entry noting button press. - if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) + if (cmbBxSerialPort.SelectedItem is not FtdiDeviceDisplay selectedPort) { - AppendLog("No serial port selected. Please choose a port before connecting."); // User guidance when no selection exists. - MessageBox.Show("Please select a serial port before connecting.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal dialog prevents accidental action. + AppendLog("No FTDI device selected. Please choose a device before connecting."); // User guidance when no selection exists. + MessageBox.Show("Please select an FTDI device before connecting.", "FTDI Device", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal dialog prevents accidental action. return; // Abort connect flow. } if (_protocol != null) { - if (string.Equals(_protocol.port.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(_protocol.port.Device.SerialNumber, selectedPort.SerialNumber, StringComparison.OrdinalIgnoreCase)) { - AppendLogBoth($"Port {selectedPort.PortName} is already open. Ignoring duplicate connect request."); // Avoid reopening same port. - MessageBox.Show($"{selectedPort.PortName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify user. + AppendLogBoth($"Device {selectedPort.DisplayName} is already open. Ignoring duplicate connect request."); // Avoid reopening same port. + MessageBox.Show($"{selectedPort.DisplayName} is already open.", "FTDI Device", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify user. return; // Exit without reopening. } - AppendLogBoth($"A different port ({_protocol.port.PortName}) is currently open. Closing it before opening {selectedPort.PortName}..."); // Explain why we close first. + AppendLogBoth($"A different device ({_protocol.port.Device.SerialNumber}) is currently open. Closing it before opening {selectedPort.DisplayName}..."); // Explain why we close first. await DisconnectAsync(); // Close current protocol instance to free COM port handle. } - var selectedDescription = _selectedPortDescription ?? selectedPort.DisplayName; // Build friendly text for status lines. + var selectedDescription = _selectedDeviceDescription ?? selectedPort.DisplayName; // Build friendly text for status lines. - AppendLogBoth($"Attempting to open {selectedDescription} with settings: 4800 baud, 8 data bits, parity None, stop bits Two, handshake None."); // Describe UART config so readers learn standard serial settings. - AppendDebugLog("Serial connection will set TX low (idle) after open."); // Note initial electrical state (BreakState/DTR true). + AppendLogBoth($"Attempting to open {selectedDescription} with D2XX settings: 4800 baud, 8 data bits, parity None, stop bits Two."); // Describe UART config so readers learn standard serial settings. + AppendDebugLog("D2XX connection will set TX low (idle) after open via FT_SetBreakOn + FT_SetDtr."); // Note initial electrical state. try { - await Task.Run(() => _protocol = new M18Protocol(selectedPort.PortName)); // Instantiate protocol off-UI thread; constructor opens SerialPort and drives TX idle. + await Task.Run(() => _protocol = new M18Protocol(selectedPort, AppendD2xxLog)); // Instantiate protocol off-UI thread; constructor opens FTDI handle and drives TX idle. ApplyProtocolLoggingPreferences(); // Sync checkbox states into protocol PrintTx/PrintRx and hook log delegates. AppendLogBoth($"{selectedDescription} opened successfully."); // Confirm connection to user. UpdateConnectionUi(true); // Toggle button enabled states to reflect connected status. @@ -275,29 +276,29 @@ private async void btnConnect_Click(object? sender, EventArgs e) private async void btnDisconnect_Click(object? sender, EventArgs e) { LogDebugAction(FormatLogMessage("btnDisconnect pressed - requesting DisconnectAsync().")); // Timestamped debug entry. - await DisconnectAsync(); // Attempt to close the serial port and dispose protocol safely. + await DisconnectAsync(); // Attempt to close the FTDI device and dispose protocol safely. } /// - /// Closes the active protocol/serial port if present, optionally informing the user via + /// Closes the active protocol/FTDI device if present, optionally informing the user via /// MessageBox. Runs on a background thread to prevent UI freezes if the driver blocks. /// private async Task DisconnectAsync(bool showUserMessages = true) { if (_protocol == null) { - var message = "Disconnect requested, but no serial port is currently open."; // Friendly explanation. + var message = "Disconnect requested, but no FTDI device is currently open."; // Friendly explanation. AppendDebugLog(FormatLogMessage(message)); // Debug log for trace. if (showUserMessages) { AppendLog(message); // Display in primary log when requested by user (e.g., clicking Disconnect). - MessageBox.Show(message, "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify via modal dialog. + MessageBox.Show(message, "FTDI Device", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify via modal dialog. } UpdateConnectionUi(false); // Reset UI state regardless. return; // Exit early when nothing to close. } - AppendLogBoth($"Closing {_protocol.port.PortName}..."); // Inform user which COM port is closing. + AppendLogBoth($"Closing {_protocol.port.Device.DisplayName}..."); // Inform user which device is closing. try { @@ -306,14 +307,14 @@ await Task.Run(() => if (_protocol.port.IsOpen) { _protocol.idle(); // Set TX to idle (safe state) before closing. - _protocol.port.Close(); // Close the underlying SerialPort. + _protocol.port.Close(); // Close the underlying FTDI handle. } - }); // Execute Close on background thread; sets TX idle then disposes SerialPort. - AppendLogBoth($"{_protocol.port.PortName} closed successfully."); // Confirm closure. + }); // Execute Close on background thread; sets TX idle then disposes FTDI handle. + AppendLogBoth($"{_protocol.port.Device.DisplayName} closed successfully."); // Confirm closure. } catch (Exception ex) { - LogError($"Error while closing {_protocol.port.PortName}.", ex); // Report exceptions thrown during close. + LogError($"Error while closing {_protocol.port.Device.DisplayName}.", ex); // Report exceptions thrown during close. } finally { @@ -324,8 +325,8 @@ await Task.Run(() => /// /// Sets TX line to idle (low) by calling . Idle corresponds to - /// SerialPort.BreakState = true and DtrEnable = true, which on FT232 asserts BREAK (logic 0) - /// and DTR simultaneously, keeping the battery safe to connect/disconnect. + /// FT_SetBreakOn and FT_SetDtr(true), which on FT232 asserts BREAK (logic 0) and DTR + /// simultaneously, keeping the battery safe to connect/disconnect. /// private async void btnIdle_Click(object? sender, EventArgs e) { @@ -338,11 +339,8 @@ private async void btnIdle_Click(object? sender, EventArgs e) AppendDebugLog(FormatLogMessage("Invoking _protocol.Idle() to drive TX low.")); // Explain electrical effect. try { - await Task.Run(() => _protocol!.idle()); // Background call to avoid UI hiccup; idle toggles BreakState/DTR. - AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery."); // Teach user about safe state. - AppendDebugLog(FormatLogMessage( - $"TX State after Idle: BreakState={_protocol!.port.BreakState}, DtrEnable={_protocol.port.DtrEnable}, RtsEnable={_protocol.port.RtsEnable}" - )); // Log resulting control-line states. + await Task.Run(() => _protocol!.idle()); // Background call to avoid UI hiccup; idle toggles FT_SetBreakOn/FT_SetDtr. + AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery. (See Raw D2XX Log for FT_SetBreakOn/FT_SetDtr calls.)"); // Teach user about safe state. } catch (Exception ex) { @@ -352,8 +350,7 @@ private async void btnIdle_Click(object? sender, EventArgs e) /// /// Drives TX line high (active) using . High corresponds to - /// SerialPort.BreakState = false and DtrEnable = false, emulating a charger engaging the - /// battery's communication line. + /// FT_SetBreakOff and FT_ClrDtr, emulating a charger engaging the battery's communication line. /// private async void btnActive_Click(object? sender, EventArgs e) { @@ -367,10 +364,7 @@ private async void btnActive_Click(object? sender, EventArgs e) try { await Task.Run(() => _protocol!.high()); // Toggle control lines on background thread. - AppendLogBoth("TX set to Active (high). Charger simulation enabled."); // Show user the state change. - AppendDebugLog(FormatLogMessage( - $"TX State after High: BreakState={_protocol!.port.BreakState}, DtrEnable={_protocol.port.DtrEnable}, RtsEnable={_protocol.port.RtsEnable}" - )); // Log resulting control-line states. + AppendLogBoth("TX set to Active (high). Charger simulation enabled. (See Raw D2XX Log for FT_SetBreakOff/FT_ClrDtr calls.)"); // Show user the state change. } catch (Exception ex) { @@ -474,76 +468,69 @@ private bool EnsureConnected() return true; // Connection exists, safe to proceed. } - AppendLog("No active connection. Please connect to a serial port first."); // User-friendly guidance. - MessageBox.Show("Please connect to a serial port first.", "Connection required", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal warning clarifies next step. + AppendLog("No active connection. Please connect to an FTDI device first."); // User-friendly guidance. + MessageBox.Show("Please connect to an FTDI device first.", "Connection required", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal warning clarifies next step. return false; // Signal caller to abort operation. } /// - /// Wrapper around SerialPortUtil to retrieve detailed port metadata, keeping the logic + /// Wrapper around FtdiDeviceUtil to retrieve detailed device metadata, keeping the logic /// isolated for easier unit testing and mocking. /// - private List GetSerialPortInfos() + private List GetFtdiDevices() { - return SerialPortUtil.EnumerateDetailedPorts(AppendDebugLog); // Pass debug logger to capture enumeration details. + return FtdiDeviceUtil.EnumerateDevices(AppendD2xxLog); // Pass raw logger to capture D2XX enumeration details. } /// - /// Executes a quick FT232 communication test against the selected port by toggling control + /// Executes a quick FT232 communication test against the selected device by toggling control /// lines and sending a byte. Helps verify USB-UART hardware is responsive. /// private async void btnTestFT232_Click(object? sender, EventArgs e) { LogDebugAction("Requesting Test FT232 operation."); // Trace user action. - if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) + if (cmbBxSerialPort.SelectedItem is not FtdiDeviceDisplay selectedPort) { - AppendLog("No serial port selected. Please choose a port before testing."); // Provide guidance. - MessageBox.Show("Please select a serial port before testing.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Block until user acknowledges. + AppendLog("No FTDI device selected. Please choose a device before testing."); // Provide guidance. + MessageBox.Show("Please select an FTDI device before testing.", "FTDI Device", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Block until user acknowledges. return; // Abort test. } - var selectedDescription = _selectedPortDescription ?? selectedPort.DisplayName; // Friendly name for messages. + var selectedDescription = _selectedDeviceDescription ?? selectedPort.DisplayName; // Friendly name for messages. - AppendLog($"Testing FT232 on {selectedDescription}..."); // Inform user test is starting. - LogDebugAction($"Testing FT232 on {selectedDescription}."); // Duplicate in debug log. + AppendLog($"Testing FT232 on {selectedDescription} via D2XX..."); // Inform user test is starting. + LogDebugAction($"Testing FT232 on {selectedDescription} via D2XX."); // Duplicate in debug log. var testResult = await Task.Run(() => TestSerialDevice(selectedPort)); // Run test on background thread to keep UI fluid. if (testResult.Success) { - AppendLog($"Device responded successfully on {selectedPort.PortName}."); // Success message for user. - LogDebugAction($"Device responded successfully on {selectedPort.PortName}."); // Debug confirmation. + AppendLog($"Device responded successfully on {selectedPort.DisplayName}."); // Success message for user. + LogDebugAction($"Device responded successfully on {selectedPort.DisplayName}."); // Debug confirmation. } else { - AppendLog($"No response / failed to communicate with device on {selectedPort.PortName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); // Provide failure details. - LogDebugAction($"No response / failed to communicate with device on {selectedPort.PortName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); // Debug echo. + AppendLog($"No response / failed to communicate with device on {selectedPort.DisplayName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); // Provide failure details. + LogDebugAction($"No response / failed to communicate with device on {selectedPort.DisplayName}{(string.IsNullOrWhiteSpace(testResult.ErrorMessage) ? string.Empty : $": {testResult.ErrorMessage}")}."); // Debug echo. } } /// - /// Opens the specified port with the FTDI-friendly serial settings and performs a minimal + /// Opens the specified device with the FTDI-friendly serial settings and performs a minimal /// control-line toggle plus a single-byte write to check for driver/hardware responsiveness. /// - private static (bool Success, string? ErrorMessage) TestSerialDevice(SerialPortDisplay port) + private static (bool Success, string? ErrorMessage) TestSerialDevice(FtdiDeviceDisplay device) { try { - using var serialPort = new SerialPort(port.PortName, 4800, Parity.None, 8, StopBits.Two) - { - ReadTimeout = 500, // Limit read blocking to half a second to avoid hanging the test. - WriteTimeout = 500, // Avoid hanging on write if driver misbehaves. - DtrEnable = true, // Assert DTR to mimic idle charger line initially. - RtsEnable = true // Assert RTS as well; some devices power LEDs or buffers off this line. - }; - - serialPort.Open(); // Acquire OS handle to COM port; toggles control lines instantly. - - serialPort.DtrEnable = !serialPort.DtrEnable; // Flip DTR once to ensure hardware responds to control changes. - serialPort.RtsEnable = !serialPort.RtsEnable; // Flip RTS similarly; useful for FT232 loopback LEDs. + using var d2xxPort = new FtdiD2xxPort(device, null); // Open FTDI handle with default logger. + d2xxPort.SetDtr(true); // Assert DTR to mimic idle charger line initially. + d2xxPort.SetBreak(true); // Assert BREAK to drive TX low. + d2xxPort.SetDtr(false); // Toggle DTR to confirm control-line responsiveness. + d2xxPort.SetBreak(false); // Release BREAK to drive TX high. - serialPort.Write(new byte[] { 0x00 }, 0, 1); // Send a single zero byte out TX to verify TX data path. + d2xxPort.WriteBytes(new byte[] { 0x00 }); // Send a single zero byte out TX to verify TX data path. return (true, null); // Success indicates driver and hardware are reachable. } @@ -636,7 +623,7 @@ private void LogError(string context, Exception exception) { var fullMessage = $"{context} Error details: {exception}"; // Combine context and exception message/stack trace. AppendLogBoth(fullMessage); // Write to logs for persistence. - MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // Display blocking error dialog. + MessageBox.Show(fullMessage, "FTDI Device Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // Display blocking error dialog. } /// @@ -660,6 +647,7 @@ private void ApplyProtocolLoggingPreferences() { AppendProtocolLog(message); // Route RX log messages into all log panes. }; + _protocol.RawLogger = AppendD2xxLog; // Route raw FTDI call traces into the dedicated D2XX tab. } /// @@ -712,6 +700,26 @@ private void AppendDebugLog(string message) _hasAppendedDebugLog = true; // Note content exists. } + /// + /// Writes text into the raw D2XX log rich text box, mirroring FTDI API calls for visibility. + /// Background threads are marshaled to the UI thread to avoid cross-thread exceptions. + /// + private void AppendD2xxLog(string message) + { + if (rtbD2xxLog.InvokeRequired) + { + rtbD2xxLog.Invoke(new Action(() => AppendD2xxLog(message))); // Marshal to UI thread if needed. + return; // Stop processing on worker thread. + } + + var prefix = _hasAppendedD2xxLog ? Environment.NewLine : string.Empty; // Add newline after first message. + var formatted = message.Contains("- ") ? message : FormatLogMessage(message); // Preserve existing timestamps if provided. + rtbD2xxLog.AppendText($"{prefix}{formatted}"); // Write to raw D2XX output box. + rtbD2xxLog.SelectionStart = rtbD2xxLog.TextLength; // Move caret to end. + rtbD2xxLog.ScrollToCaret(); // Auto-scroll to newest entry. + _hasAppendedD2xxLog = true; // Note content exists. + } + /// /// Enables or disables UI controls based on connection state so users cannot issue protocol /// commands before opening a port. @@ -774,34 +782,27 @@ private void button1_Click(object sender, EventArgs e) /// /// Sends a raw byte (0xAA) and waits for a response to validate echo/loopback behavior on - /// the open serial port. This is similar to a ping test for UART communications. + /// the open FTDI device. This is similar to a ping test for UART communications. /// private void btnTestEcho_Click(object sender, EventArgs e) { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on COM{_protocol?.port.PortName ?? "??"}\n"); // Timestamp test start with chosen port name. + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on {_protocol?.port.Device.SerialNumber ?? "??"}\n"); // Timestamp test start with chosen device. try { if (_protocol?.port.IsOpen != true) { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Serial port not open. Connect first.\n"); // Warn user that port must be open. - return; // Exit early because no active SerialPort exists. + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - FTDI device not open. Connect first.\n"); // Warn user that port must be open. + return; // Exit early because no active FTDI handle exists. } - _protocol.port.DiscardInBuffer(); // Clear inbound buffer to remove stale bytes before test. + _protocol.port.PurgeRx(); // Clear inbound buffer to remove stale bytes before test. byte[] send = { 0xAA }; // Single SYNC-like byte to transmit; echoed devices should return it. - _protocol.port.Write(send, 0, 1); // Write to UART TX line; FT232 shifts bits out over USB-UART bridge. + _protocol.port.WriteBytes(send); // Write to UART TX line via D2XX; FT232 shifts bits out over USB-UART bridge. rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Sent byte 0xAA.\n"); // Confirm transmission to user. - int response = _protocol.port.ReadByte(); // Block up to ReadTimeout waiting for one byte on RX. - if (response >= 0) - { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Received byte: 0x{response:X2}\n"); // Show returned byte in hex for clarity. - } - else - { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - No byte received (timeout).\n"); // Note absence of response. - } + var response = _protocol.port.ReadBytes(1); // Block up to timeout waiting for one byte on RX. + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Received byte: 0x{response[0]:X2}\n"); // Show returned byte in hex for clarity. } catch (Exception ex) { diff --git a/M18BatteryInfo.csproj b/M18BatteryInfo.csproj index 7604f86..779638b 100644 --- a/M18BatteryInfo.csproj +++ b/M18BatteryInfo.csproj @@ -8,10 +8,10 @@ enable - - - - + + + + @@ -28,4 +28,4 @@ - \ No newline at end of file + diff --git a/M18Protocol.cs b/M18Protocol.cs index e53d0de..6fb4b96 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -10,7 +10,6 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.IO.Ports; using System.Linq; using System.Net.Http; using System.Text; @@ -43,8 +42,18 @@ public class M18Protocol public bool PRINT_RX_SAVE = false; public Action? TxLogger { get; set; } public Action? RxLogger { get; set; } + private Action? rawLogger; + public Action? RawLogger + { + get => rawLogger; + set + { + rawLogger = value; + port?.UpdateLogger(value); + } + } - public SerialPort port; + public FtdiD2xxPort port; // --------------------------- // Data tables copied verbatim from m18.py @@ -256,37 +265,10 @@ private static IEnumerable GetHex(IEnumerable bytes) // ------------------------------------- // Constructor mirroring __init__ in m18.py // ------------------------------------- - public M18Protocol(string? portName) + public M18Protocol(FtdiDeviceDisplay device, Action? rawLogger = null) { - if (portName == null) - { - Console.WriteLine("*** NO PORT SPECIFIED ***"); - Console.WriteLine("Available serial ports (choose one that says USB somewhere):"); - - var ports = SerialPortUtil.EnumerateDetailedPorts(); - var i = 1; - var portId = 0; - foreach (var portEntry in ports) - { - Console.WriteLine($" {i}: {portEntry.PortName} - {portEntry.Manufacturer} - {portEntry.FriendlyName ?? portEntry.Description}"); - i = i + 1; - } - - var selectedPort = ports[portId - 1]; - Console.WriteLine($"You selected \"{selectedPort.PortName} - {selectedPort.Manufacturer} - {selectedPort.FriendlyName ?? selectedPort.Description}\""); - Console.WriteLine($"In future, use \"m18.py --port {selectedPort.PortName}\" to avoid this menu"); - Console.Write("Press Enter to continue"); - Console.ReadLine(); - - portName = selectedPort.PortName; - } - - port = new SerialPort(portName, 4800, Parity.None, 8, StopBits.Two) - { - ReadTimeout = 800, - WriteTimeout = 800 - }; - port.Open(); + RawLogger = rawLogger; + port = new FtdiD2xxPort(device, RawLogger); idle(); } @@ -318,11 +300,11 @@ public void txrx_restore() public bool reset() { ACC = 4; - port.BreakState = true; - port.DtrEnable = true; + port.SetBreak(true); + port.SetDtr(true); Thread.Sleep(300); - port.BreakState = false; - port.DtrEnable = false; + port.SetBreak(false); + port.SetDtr(false); Thread.Sleep(300); send(new[] { SYNC_BYTE }); try @@ -392,7 +374,7 @@ public byte[] add_checksum(List lsbCommand) // ------------------------------------- public void send(byte[] command) { - port.DiscardInBuffer(); + port.PurgeRx(); var debugPrint = string.Join(" ", GetHex(command)); var msb = new List(); foreach (var b in command) @@ -405,7 +387,7 @@ public void send(byte[] command) LogTx($"Sending: {debugPrint}"); } - port.Write(msb.ToArray(), 0, msb.Count); + port.WriteBytes(msb.ToArray()); } public void send_command(byte[] command) @@ -472,13 +454,20 @@ private void LogRx(string message) private byte ReadOneByte() { - var buffer = new byte[1]; - var read = port.Read(buffer, 0, 1); - if (read < 1) + try + { + var buffer = port.ReadBytes(1); + if (buffer.Length < 1) + { + throw new ValueError("Empty response"); + } + + return buffer[0]; + } + catch (Exception ex) when (ex is InvalidOperationException) { - throw new ValueError("Empty response"); + throw new ValueError(ex.Message); } - return buffer[0]; } // ------------------------------------- @@ -720,14 +709,14 @@ public void write_message(string message) // ------------------------------------- public void idle() { - port.BreakState = true; - port.DtrEnable = true; + port.SetBreak(true); + port.SetDtr(true); } public void high() { - port.BreakState = false; - port.DtrEnable = false; + port.SetBreak(false); + port.SetDtr(false); } public void high_for(double duration) diff --git a/Program.cs b/Program.cs index 0c21785..7225baf 100644 --- a/Program.cs +++ b/Program.cs @@ -6,7 +6,7 @@ // ApplicationConfiguration to bootstrap high-DPI awareness and default fonts. The goal is to show // how a C# WinForms app starts, how STAThread is required for COM-based UI components, and where the // program transitions from the process boundary into user-interface code that eventually invokes -// serial-protocol logic in M18Protocol.cs and USB enumeration utilities in SerialPortUtil.cs. Even +// serial-protocol logic in M18Protocol.cs and USB enumeration utilities in FtdiDeviceUtil.cs. Even // though the logic is minimal, commenting every line reveals the basic structure of a .NET desktop // program for newcomers. // ************************************************************************************************* @@ -18,7 +18,7 @@ namespace M18BatteryInfo /// keep the symbol inside the assembly while still being discoverable by the runtime. It /// delegates all user interaction to , which wires up event handlers to /// the serial protocol layer () and utility helpers - /// () that talk to hardware. + /// () that talk to hardware. /// internal static class Program { @@ -43,8 +43,8 @@ static void Main() // (GetMessage/DispatchMessage under the hood) and will not exit until the form closes. // We construct frmMain, which is defined across M18AnalyzerMain.cs (logic) and // M18AnalyzerMain.Designer.cs (control layout). That form then interacts with - // M18Protocol.cs to toggle UART lines and read battery data, plus SerialPortUtil.cs to - // discover COM ports. + // M18Protocol.cs to toggle UART lines and read battery data, plus FtdiDeviceUtil.cs to + // discover FTDI devices. Application.Run(new frmMain()); } } diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index d5fc4b8..3bbb57b 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -11,7 +11,6 @@ using System; // Core types like IntPtr and StringComparer. using System.Collections.Generic; // Collections used to gather port metadata. -using System.IO.Ports; // SerialPort.GetPortNames() used as a fallback enumeration method. using System.Linq; // LINQ helpers for ordering and filtering port lists. using System.Runtime.InteropServices; // P/Invoke attributes to call SetupAPI functions. using System.Text; // StringBuilder for marshaling strings from unmanaged memory. @@ -52,8 +51,9 @@ internal static class SerialPortUtil }; /// - /// Enumerates serial ports using SetupAPI and falls back to SerialPort.GetPortNames() when - /// additional details cannot be retrieved. Combines results into a sorted list ready for UI display. + /// Enumerates serial ports using SetupAPI and returns metadata suitable for UI display. This helper + /// remains to correlate FTDI serial numbers with COM port assignments for reference only; all I/O + /// flows through the D2XX driver. /// /// Optional logger for verbose debug output. /// Ordered list of serial port metadata. @@ -62,7 +62,6 @@ public static List EnumerateDetailedPorts(Action? deb var ports = new Dictionary(StringComparer.OrdinalIgnoreCase); // Use dictionary to merge data from multiple sources case-insensitively. EnumerateViaSetupApi(ports, debugLogger); // Primary enumeration using SetupAPI P/Invoke for rich data. - AppendSerialPortFallbacks(ports, debugLogger); // Add/merge entries using SerialPort.GetPortNames() as safety net. return ports.Values .OrderBy(port => port.PortName, StringComparer.OrdinalIgnoreCase) // Sort alphabetically for predictable UI ordering. @@ -77,8 +76,8 @@ private static void EnumerateViaSetupApi(IDictionary var deviceInfoSet = SetupDiGetClassDevs(ref portsClassGuid, null, IntPtr.Zero, DIGCF_PRESENT); // Calls into setupapi.dll. if (deviceInfoSet == IntPtr.Zero || deviceInfoSet == new IntPtr(-1)) { - log?.Invoke("SetupAPI enumeration failed to acquire device info set; continuing with fallbacks only."); // Warn UI that we are falling back. - return; // Without a valid handle we cannot enumerate; rely on SerialPort.GetPortNames later. + log?.Invoke("SetupAPI enumeration failed to acquire device info set; no COM metadata available."); // Warn UI that we cannot fetch metadata. + return; // Without a valid handle we cannot enumerate. } try @@ -157,36 +156,6 @@ private static void EnumerateViaSetupApi(IDictionary } } - private static void AppendSerialPortFallbacks(IDictionary ports, Action? log) - { - try - { - foreach (var portName in SerialPort.GetPortNames()) // .NET API that queries OS for COM port names only. - { - if (ports.TryGetValue(portName, out var existing)) - { - ports[portName] = existing with - { - Source = CombineSources(existing.Source, "SerialPort.GetPortNames()") // Add fallback source info if already present. - }; - } - else - { - ports[portName] = SerialPortDisplay.Create(portName) with - { - Source = "SerialPort.GetPortNames() fallback" // Mark as fallback-only entry. - }; - } - - log?.Invoke($"SerialPort.GetPortNames detected {portName}."); // Debug log for each port found. - } - } - catch (Exception ex) - { - log?.Invoke($"SerialPort.GetPortNames() failed: {ex.Message}"); // Report exceptions (rare but possible on restricted environments). - } - } - private static (string? Port, string Source) ExtractBestPortName(string? friendlyName, string? description, IntPtr deviceInfoSet, ref SP_DEVINFO_DATA devInfoData, string? deviceInstanceId) { var portFromFriendly = ExtractPortName(friendlyName); // Friendly name often contains "(COM3)" suffix. From 60a6bc04f788c6ebb853ea62e2b9169c8eae006c Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 13:32:09 -0500 Subject: [PATCH 53/61] Debugging. --- FtdiD2xxPort.cs | 23 +++++++++++++++++++++++ FtdiDeviceUtil.cs | 48 ++--------------------------------------------- M18Protocol.cs | 2 +- 3 files changed, 26 insertions(+), 47 deletions(-) diff --git a/FtdiD2xxPort.cs b/FtdiD2xxPort.cs index d51d473..64b62cd 100644 --- a/FtdiD2xxPort.cs +++ b/FtdiD2xxPort.cs @@ -203,3 +203,26 @@ private static string FormatHex(IEnumerable data) return string.Join(" ", data.Select(b => $"0x{b:X2}")); // Formats byte arrays similar to m18.py debug. } } + +/// +/// Contains information about an FTDI device. The properties mirror the relevant fields from the +/// D2XX API and provide additional metadata for logging and debugging purposes. +/// +public sealed record FtdiDeviceDisplay : IEquatable +{ + public uint Index { get; init; } + public string SerialNumber { get; init; } + public string Description { get; init; } + public uint DeviceId { get; init; } + public uint LocationId { get; init; } + public FTDI.FT_DEVICE DeviceType { get; init; } + public string? ComPort { get; init; } + public string? Manufacturer { get; init; } + public string? FriendlyName { get; init; } + public string? Source { get; init; } + public string DisplayName { get; } + public override string ToString() + { + return DisplayName; + } +} diff --git a/FtdiDeviceUtil.cs b/FtdiDeviceUtil.cs index 1c0f50b..57049a7 100644 --- a/FtdiDeviceUtil.cs +++ b/FtdiDeviceUtil.cs @@ -35,7 +35,8 @@ public static List EnumerateDevices(Action? debugLogg var ftdi = new FTDI(); // FTDI object used solely for discovery; not kept open. // D2XX: query the number of attached FTDI devices. Mirrors pyserial's initial port scan. - var status = ftdi.GetNumberOfDevices(ref var count); + uint count = 0; + var status = ftdi.GetNumberOfDevices(ref count); debugLogger?.Invoke($"FT_GetNumberOfDevices -> {status} (count={count})"); if (status != FTDI.FT_STATUS.FT_OK || count == 0) { @@ -89,48 +90,3 @@ public static List EnumerateDevices(Action? debugLogg .ToList(); } } - -/// -/// Immutable record describing a single FTDI device, combining D2XX and SetupAPI data so the UI can -/// display a helpful label while the protocol layer opens the device by serial number/index. -/// -internal sealed record FtdiDeviceDisplay( - uint Index, - string SerialNumber, - string Description, - uint DeviceId, - uint LocationId, - FTDI.FT_DEVICE DeviceType, - string? ComPort, - string? Manufacturer, - string? FriendlyName, - string? Source) -{ - public string DisplayName - { - get - { - // Example: "SN:FT123ABC - FT232R USB UART - COM3 - FTDI" - var parts = new List { $"SN:{SerialNumber}" }; - - if (!string.IsNullOrWhiteSpace(Description)) - { - parts.Add(Description); - } - - if (!string.IsNullOrWhiteSpace(ComPort)) - { - parts.Add(ComPort!); - } - - if (!string.IsNullOrWhiteSpace(Manufacturer)) - { - parts.Add(Manufacturer!); - } - - return string.Join(" - ", parts); - } - } - - public override string ToString() => DisplayName; // ComboBox uses this for display text. -} diff --git a/M18Protocol.cs b/M18Protocol.cs index 6fb4b96..8f6ba3a 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -1274,4 +1274,4 @@ public void adv_help() "m.keepalive() - send charge current request (0x62) \n"); } } -} +} \ No newline at end of file From 123b13de726c005d435c1903ec074c2eb7c12962 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 15:45:43 -0500 Subject: [PATCH 54/61] Remove D2XX dependency in favor of SerialPort --- FtdiD2xxPort.cs | 228 ---------------------------------------- FtdiDeviceUtil.cs | 92 ---------------- M18AnalyzerMain.cs | 170 +++++++++++++++--------------- M18BatteryInfo.csproj | 1 - M18Protocol.cs | 8 +- Program.cs | 8 +- SerialPortConnection.cs | 133 +++++++++++++++++++++++ SerialPortUtil.cs | 8 +- 8 files changed, 230 insertions(+), 418 deletions(-) delete mode 100644 FtdiD2xxPort.cs delete mode 100644 FtdiDeviceUtil.cs create mode 100644 SerialPortConnection.cs diff --git a/FtdiD2xxPort.cs b/FtdiD2xxPort.cs deleted file mode 100644 index 64b62cd..0000000 --- a/FtdiD2xxPort.cs +++ /dev/null @@ -1,228 +0,0 @@ -// ************************************************************************************************* -// FtdiD2xxPort.cs -// ---------------- -// Thin wrapper around the FTDI D2XX .NET API (FTD2XX_NET.dll) that mirrors the behaviour of -// Python's pyserial.Serial object used in m18.py. Every control-line toggle, baud configuration, -// purge, read, and write operation is forwarded to the equivalent D2XX call while emitting verbose -// log messages so the WinForms UI can show a "Raw D2XX Log" tab. The goal is a drop-in replacement -// for SerialPort that preserves timing and side effects of the original Python implementation. -// ************************************************************************************************* - -using System; // Provides basic types and exceptions. -using System.Collections.Generic; // Enables List usage for byte collections. -using System.Linq; // LINQ helpers for hex string formatting. -using FTD2XX_NET; // Official FTDI D2XX managed wrapper used for all USB-UART interactions. - -namespace M18BatteryInfo; - -/// -/// Wraps an FTDI device opened through the D2XX API and exposes SerialPort-like methods used by the -/// protocol layer. Each method logs the corresponding D2XX call to maintain transparency between the -/// C# port and the reference m18.py behaviour. -/// -internal sealed class FtdiD2xxPort : IDisposable -{ - private readonly FTDI _ftdi = new(); // Underlying D2XX object controlling the FT232. - private Action? _rawLogger; // Optional logger to display each D2XX call. - - public FtdiDeviceDisplay Device { get; } // Selected FTDI device metadata used for logging. - - public bool IsOpen { get; private set; } // Tracks whether FT_Open succeeded. - - /// - /// Constructs the port wrapper, opens the FTDI device by serial number, and configures the - /// communication parameters (4800 8N2) to mirror pyserial settings in m18.py. - /// - public FtdiD2xxPort(FtdiDeviceDisplay device, Action? rawLogger) - { - Device = device; // Store device metadata for logs and future reference. - _rawLogger = rawLogger; // Save logger delegate for raw D2XX log tab. - - Log($"FT_OpenEx (by serial) -> {device.SerialNumber}"); // Trace open request. - EnsureStatus(_ftdi.OpenBySerialNumber(device.SerialNumber), "FT_OpenEx"); // Open FTDI handle. - IsOpen = true; // Mark handle as active so Dispose knows to close it. - - ConfigureForM18(); // Apply baud, framing, flow control, and timeouts identical to pyserial settings. - } - - /// - /// Sets baud rate, data characteristics, flow control, and timeouts to match the original - /// Python Serial() constructor (4800 baud, 8 data bits, no parity, two stop bits, 800ms timeouts). - /// - private void ConfigureForM18() - { - Log("FT_SetBaudRate(4800)"); - EnsureStatus(_ftdi.SetBaudRate(4800), "FT_SetBaudRate(4800)"); - - Log("FT_SetDataCharacteristics(8 data bits, 2 stop bits, no parity)"); - EnsureStatus( - _ftdi.SetDataCharacteristics( - FTDI.FT_DATA_BITS.FT_BITS_8, - FTDI.FT_STOP_BITS.FT_STOP_BITS_2, - FTDI.FT_PARITY.FT_PARITY_NONE), - "FT_SetDataCharacteristics(8N2)"); - - Log("FT_SetFlowControl(NONE)"); - EnsureStatus(_ftdi.SetFlowControl(FTDI.FT_FLOW_CONTROL.FT_FLOW_NONE, 0, 0), "FT_SetFlowControl(NONE)"); - - Log("FT_SetTimeouts(Read=800ms, Write=800ms)"); - EnsureStatus(_ftdi.SetTimeouts(800, 800), "FT_SetTimeouts(800ms)"); - - PurgeAll(); // Clear any residual data to mimic SerialPort.DiscardInBuffer/DiscardOutBuffer. - } - - /// - /// Drives BREAK on (TX low) or off (TX released) to mirror SerialPort.BreakState mutations. - /// - public void SetBreak(bool enable) - { - Log(enable ? "FT_SetBreakOn" : "FT_SetBreakOff"); - EnsureStatus(_ftdi.SetBreak(enable), enable ? "FT_SetBreakOn" : "FT_SetBreakOff"); - } - - /// - /// Asserts or clears DTR using the explicit D2XX functions that map to SerialPort.DtrEnable. - /// - public void SetDtr(bool enable) - { - if (enable) - { - Log("FT_SetDtr"); - EnsureStatus(_ftdi.SetDTR(), "FT_SetDtr"); - } - else - { - Log("FT_ClrDtr"); - EnsureStatus(_ftdi.ClrDTR(), "FT_ClrDtr"); - } - } - - /// - /// Purges both RX and TX buffers, matching SerialPort.DiscardInBuffer/DiscardOutBuffer. - /// - public void PurgeAll() - { - Log("FT_Purge(RX|TX)"); - EnsureStatus(_ftdi.Purge(FTDI.FT_PURGE.FT_PURGE_RX | FTDI.FT_PURGE.FT_PURGE_TX), "FT_Purge(RX|TX)"); - } - - /// - /// Purges only the receive buffer to clear stale bytes before a new transaction (send()). - /// - public void PurgeRx() - { - Log("FT_Purge(RX)"); - EnsureStatus(_ftdi.Purge(FTDI.FT_PURGE.FT_PURGE_RX), "FT_Purge(RX)"); - } - - /// - /// Writes the provided bytes to the FT232 with the same ordering and timing as pyserial.write(). - /// - public void WriteBytes(byte[] data) - { - uint bytesWritten = 0; // Will hold the number of bytes actually written by FT_Write. - Log($"FT_Write {FormatHex(data)}"); - EnsureStatus(_ftdi.Write(data, data.Length, ref bytesWritten), "FT_Write"); - if (bytesWritten != data.Length) - { - throw new InvalidOperationException($"FT_Write wrote {bytesWritten} of {data.Length} bytes"); - } - } - - /// - /// Reads exactly bytes, respecting the configured 800ms timeout to - /// mirror SerialPort.Read behaviour in the Python reference implementation. - /// - public byte[] ReadBytes(int count) - { - var buffer = new byte[count]; // Allocate destination buffer identical to SerialPort.Read(byte[],...). - uint bytesRead = 0; // Tracks how many bytes the driver returned. - var status = _ftdi.Read(buffer, count, ref bytesRead); // Perform blocking read via D2XX. - Log($"FT_Read(count={count}) -> status={status}, bytesRead={bytesRead}, data={FormatHex(buffer.Take((int)bytesRead))}"); - if (status != FTDI.FT_STATUS.FT_OK || bytesRead == 0) - { - throw new InvalidOperationException($"FT_Read failed or returned zero bytes (status={status})"); - } - - if (bytesRead < count) - { - // Partial reads mirror SerialPort's ValueError condition in m18.py when response is shorter than expected. - throw new InvalidOperationException($"FT_Read returned {bytesRead} of {count} bytes"); - } - - return buffer; // Return the full buffer to the caller. - } - - /// - /// Closes the FTDI handle, logging the underlying FT_Close call to keep parity with m18.py exit - /// behaviour. Idempotent so callers can safely invoke multiple times. - /// - public void Close() - { - if (!IsOpen) - { - return; // Already closed or never opened. - } - - Log("FT_Close"); - EnsureStatus(_ftdi.Close(), "FT_Close"); - IsOpen = false; // Mark handle closed to prevent duplicate closes. - } - - /// - /// Disposes the FTDI handle by calling . - /// - public void Dispose() - { - Close(); // Close FTDI handle when wrapper is disposed. - } - - private void EnsureStatus(FTDI.FT_STATUS status, string operation) - { - if (status != FTDI.FT_STATUS.FT_OK) - { - throw new InvalidOperationException($"{operation} failed with status {status}"); - } - } - - private void Log(string message) - { - _rawLogger?.Invoke(message); // Emit raw D2XX trace when logger provided. - } - - /// - /// Updates the raw logger delegate so callers can redirect FTDI call traces at runtime. - /// - public void UpdateLogger(Action? logger) - { - _rawLogger = logger; // Swap logger used by Log(). - } - - private static string FormatHex(IEnumerable data) - { - return string.Join(" ", data.Select(b => $"0x{b:X2}")); // Formats byte arrays similar to m18.py debug. - } -} - -/// -/// Contains information about an FTDI device. The properties mirror the relevant fields from the -/// D2XX API and provide additional metadata for logging and debugging purposes. -/// -public sealed record FtdiDeviceDisplay : IEquatable -{ - public uint Index { get; init; } - public string SerialNumber { get; init; } - public string Description { get; init; } - public uint DeviceId { get; init; } - public uint LocationId { get; init; } - public FTDI.FT_DEVICE DeviceType { get; init; } - public string? ComPort { get; init; } - public string? Manufacturer { get; init; } - public string? FriendlyName { get; init; } - public string? Source { get; init; } - public string DisplayName { get; } - public override string ToString() - { - return DisplayName; - } -} diff --git a/FtdiDeviceUtil.cs b/FtdiDeviceUtil.cs deleted file mode 100644 index 57049a7..0000000 --- a/FtdiDeviceUtil.cs +++ /dev/null @@ -1,92 +0,0 @@ -// ************************************************************************************************* -// FtdiDeviceUtil.cs -// ------------------ -// Enumerates FTDI devices using the official D2XX .NET wrapper (FTD2XX_NET.dll). The helper mirrors -// pyserial's list_ports output by pairing each FTDI node with SetupAPI metadata (manufacturer, -// location path, optional COM port mapping) from SerialPortUtil. This ensures the WinForms UI can -// show human-readable device descriptions while all communications are routed through the D2XX API -// rather than System.IO.Ports.SerialPort. -// ************************************************************************************************* - -using System; // Basic .NET primitives. -using System.Collections.Generic; // List for returning device results. -using System.Linq; // LINQ helpers to correlate FTDI serial numbers with SetupAPI metadata. -using FTD2XX_NET; // Official managed wrapper around the FTDI D2XX driver. - -namespace M18BatteryInfo; - -/// -/// Utility that queries the FTDI D2XX driver for attached USB-UART bridges and enriches the -/// results with SetupAPI metadata so the UI can display friendly text. All serial I/O goes through -/// D2XX; this class only discovers devices and never touches System.IO.Ports.SerialPort. -/// -internal static class FtdiDeviceUtil -{ - /// - /// Enumerates FTDI devices using and correlates the entries - /// with SetupAPI metadata for display. Every D2XX call is logged for the optional debug logger - /// to mimic the verbose output of m18.py. - /// - /// Optional sink that receives raw D2XX call descriptions. - /// Ordered list of FTDI devices present on the system. - public static List EnumerateDevices(Action? debugLogger = null) - { - var devices = new List(); // Accumulates enumeration results. - var ftdi = new FTDI(); // FTDI object used solely for discovery; not kept open. - - // D2XX: query the number of attached FTDI devices. Mirrors pyserial's initial port scan. - uint count = 0; - var status = ftdi.GetNumberOfDevices(ref count); - debugLogger?.Invoke($"FT_GetNumberOfDevices -> {status} (count={count})"); - if (status != FTDI.FT_STATUS.FT_OK || count == 0) - { - return devices; // No devices or driver failure; return empty list. - } - - // Prepare a buffer and request the full device list from the driver. - var nodes = new FTDI.FT_DEVICE_INFO_NODE[count]; - status = ftdi.GetDeviceList(nodes); - debugLogger?.Invoke($"FT_GetDeviceInfoList -> {status}"); - if (status != FTDI.FT_STATUS.FT_OK) - { - return devices; // Abort enumeration on error to avoid incomplete data. - } - - // Pull SetupAPI port metadata to correlate COM names and USB descriptors with D2XX entries. - var setupApiPorts = SerialPortUtil.EnumerateDetailedPorts(debugLogger); - - for (var i = 0; i < nodes.Length; i++) - { - var node = nodes[i]; // Capture current device info node from D2XX. - var serialNumber = node.SerialNumber ?? string.Empty; // Serial is the stable key. - - // Try to match the FTDI serial number to a SetupAPI COM-port entry for additional labels. - var matchingPort = setupApiPorts.FirstOrDefault(port => - string.Equals(port.UsbSerialNumber, serialNumber, StringComparison.OrdinalIgnoreCase)); - - // Compose a record that includes both D2XX and SetupAPI metadata for UI display. - var display = new FtdiDeviceDisplay( - Index: (uint)i, - SerialNumber: serialNumber, - Description: node.Description ?? "FTDI Device", - DeviceId: node.ID, - LocationId: node.LocId, - DeviceType: node.Type, - ComPort: matchingPort?.PortName, - Manufacturer: matchingPort?.Manufacturer, - FriendlyName: matchingPort?.FriendlyName, - Source: matchingPort?.Source ?? "D2XX enumeration" - ); - - devices.Add(display); // Store result for caller. - - // Emit a verbose log line to replicate m18.py debug output patterns. - debugLogger?.Invoke( - $"FTDI[{i}] Serial={display.SerialNumber}, Desc={display.Description}, COM={display.ComPort ?? "(none)"}, LocId=0x{display.LocationId:X}, Id=0x{display.DeviceId:X}, Source={display.Source}"); - } - - return devices - .OrderBy(device => device.SerialNumber, StringComparer.OrdinalIgnoreCase) // Stable ordering for UI. - .ToList(); - } -} diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index ee0a860..b1c861d 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -4,15 +4,15 @@ // Hosts the user-facing WinForms logic for the Milwaukee M18 battery analyzer GUI. This partial // class pairs with M18AnalyzerMain.Designer.cs (UI layout) to render the form and wire up buttons, // combo boxes, and rich text boxes. It acts as a bridge between the UI events and the lower-level -// serial protocol implementation in M18Protocol.cs as well as the FTDI discovery helper -// FtdiDeviceUtil.cs. Every method and key line is commented to teach WinForms fundamentals (event +// serial protocol implementation in M18Protocol.cs as well as the serial-port discovery helper +// SerialPortUtil.cs. Every method and key line is commented to teach WinForms fundamentals (event // registration, marshaling to the UI thread), serial programming (driving DTR/Break for idle/high), // and logging approaches. Reading the comments alone should explain how the GUI controls map to the // electrical behavior on the FT232/COM port pins and how the protocol layer is orchestrated. // ************************************************************************************************* using System; // Provides core types like EventArgs, Action, and DateTime used throughout the form. -using System.Collections.Generic; // Supplies List for storing FTDI device objects. +using System.Collections.Generic; // Supplies List for storing serial port objects. using System.Linq; // Enables LINQ helpers such as Select and ToList used during logging. using System.Threading.Tasks; // Enables Task.Run for background work that keeps the UI responsive. using System.Windows.Forms; // Provides Form, control types, and dialog helpers used by WinForms. @@ -20,12 +20,12 @@ namespace M18BatteryInfo { /// - /// The primary WinForms window that presents user controls for FTDI device selection, + /// The primary WinForms window that presents user controls for serial port selection, /// connection management, and protocol commands (idle/high/reset/health-report). This class /// captures events fired by buttons and other controls, marshals work to background threads so /// the UI does not freeze, and forwards user actions to which drives /// the UART (TX) line high/low and exchanges bytes with the battery BMS. It also uses - /// to enumerate FTDI devices with extended metadata. + /// to enumerate serial ports with extended metadata. /// public partial class frmMain : Form { @@ -37,12 +37,12 @@ public partial class frmMain : Form private bool _hasAppendedAdvancedLog; // Similar flag for the advanced log tab to avoid leading blank lines. // Track whether the debug output RichTextBox already has content. private bool _hasAppendedDebugLog; // Prevents inserting extra blank lines before first debug message. - // Track whether the raw D2XX log RichTextBox already has content. - private bool _hasAppendedD2xxLog; // Prevents inserting extra blank lines before first raw D2XX entry. - // Store the currently selected FTDI device for connection attempts. - private FtdiDeviceDisplay? _selectedDevice; // Persisted when user picks an item from cmbBxSerialPort. + // Track whether the raw serial log RichTextBox already has content. + private bool _hasAppendedSerialLog; // Prevents inserting extra blank lines before first raw serial entry. + // Store the currently selected serial device for connection attempts. + private SerialPortDisplay? _selectedDevice; // Persisted when user picks an item from cmbBxSerialPort. // Store a human-friendly device description for user messages. - private string? _selectedDeviceDescription; // Derived from FtdiDeviceDisplay to show manufacturer/USB metadata. + private string? _selectedDeviceDescription; // Derived from SerialPortDisplay to show manufacturer/USB metadata. /// /// Constructs the form, initializes UI components generated by the designer, and hooks up @@ -55,9 +55,9 @@ public frmMain() // Wire up button click and change handlers to their corresponding methods. Delegates are // created here to keep designer file clean and to demonstrate event subscription syntax. - btnRefresh.Click += btnRefresh_Click; // Refresh list of FTDI devices when "Refresh" pressed. - btnConnect.Click += btnConnect_Click; // Attempt to open FTDI device when "Connect" pressed. - btnDisconnect.Click += btnDisconnect_Click; // Close FTDI device when "Disconnect" pressed. + btnRefresh.Click += btnRefresh_Click; // Refresh list of serial ports when "Refresh" pressed. + btnConnect.Click += btnConnect_Click; // Attempt to open serial port when "Connect" pressed. + btnDisconnect.Click += btnDisconnect_Click; // Close serial port when "Disconnect" pressed. btnIdle.Click += btnIdle_Click; // Drive TX low (Break/DTR asserted) to simulate idle charger pin. btnActive.Click += btnActive_Click; // Drive TX high (Break/DTR deasserted) to simulate charging. btnHealthReport.Click += btnHealthReport_Click; // Trigger multi-register read to show battery stats. @@ -66,16 +66,16 @@ public frmMain() chkbxTXLog.CheckedChanged += chkbxTXLog_CheckedChanged; // Toggle TX byte logging. chkboxRxLog.CheckedChanged += chkboxRxLog_CheckedChanged; // Toggle RX byte logging. btnTestFT232.Click += btnTestFT232_Click; // Run quick FT232 loopback/response test. - cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged; // Capture selected FTDI device. - FormClosing += frmMain_FormClosing; // Ensure we cleanly close FTDI device when form closes. + cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged; // Capture selected serial port. + FormClosing += frmMain_FormClosing; // Ensure we cleanly close serial port when form closes. // Default logging preferences to on so that users see both TX and RX traffic. chkbxTXLog.Checked = true; // Enables printing TX bytes through M18Protocol.TxLogger. chkboxRxLog.Checked = true; // Enables printing RX bytes through M18Protocol.RxLogger. // Provide friendly tooltips describing each control's purpose. - toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available FTDI devices."); // Helps beginners understand UI flow. - toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected FTDI device."); // Explains connection button. + toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available serial ports."); // Helps beginners understand UI flow. + toolTipSimpleTab.SetToolTip(btnConnect, "Connect to the selected serial port."); // Explains connection button. toolTipSimpleTab.SetToolTip(btnDisconnect, "Disconnect from the currently connected device."); // Clarifies safe disconnect. toolTipSimpleTab.SetToolTip(btnIdle, "Drive TX low (idle). Safe for connect/disconnect."); // Notes electrical effect on TX line. toolTipSimpleTab.SetToolTip(btnActive, "Drive TX high (active). Charger simulation."); // Indicates charger-simulation state. @@ -106,12 +106,12 @@ private void toolTipReset_Popup(object sender, PopupEventArgs e) } /// - /// Executes when the form finishes loading. We immediately refresh FTDI devices so the + /// Executes when the form finishes loading. We immediately refresh serial ports so the /// combo box is populated before the user interacts with it. /// private void frmMain_Load(object sender, EventArgs e) { - RefreshSerialPorts(); // Kick off device enumeration via FtdiDeviceUtil. + RefreshSerialPorts(); // Kick off device enumeration via SerialPortUtil. } /// @@ -152,39 +152,39 @@ private void grpBxSimCustomProfile_Enter(object sender, EventArgs e) private void btnRefresh_Click(object? sender, EventArgs e) { LogDebugAction("Requesting RefreshSerialPorts()."); // Show action in debug log for traceability. - RefreshSerialPorts(); // Pull latest FTDI devices using FtdiDeviceUtil. + RefreshSerialPorts(); // Pull latest serial ports using SerialPortUtil. } /// - /// Enumerates available FTDI devices, populates the combo box, and logs rich metadata for - /// troubleshooting USB cables/adapters. Uses . + /// Enumerates available serial ports, populates the combo box, and logs rich metadata for + /// troubleshooting USB cables/adapters. Uses . /// private void RefreshSerialPorts() { - AppendLogBoth("Refreshing FTDI device list..."); // Inform user in both simple and debug logs. + AppendLogBoth("Refreshing serial port list..."); // Inform user in both simple and debug logs. try { - var devices = GetFtdiDevices(); // Gather FTDI info via D2XX (plus SetupAPI for COM mapping). + var devices = GetSerialPorts(); // Gather serial info via SetupAPI for COM mapping. cmbBxSerialPort.Items.Clear(); // Reset combo box so old entries do not linger. foreach (var device in devices) { - cmbBxSerialPort.Items.Add(device); // Add FTDI record; ToString() shows DisplayName. - AppendLogBoth($"Found FTDI device {device.DisplayName}"); // Echo discovery to the log. + cmbBxSerialPort.Items.Add(device); // Add serial record; ToString() shows DisplayName. + AppendLogBoth($"Found serial port {device.DisplayName}"); // Echo discovery to the log. } - AppendDebugLog($"RefreshSerialPorts(): {devices.Count} FTDI device(s) detected."); // Debug summary count. + AppendDebugLog($"RefreshSerialPorts(): {devices.Count} serial port(s) detected."); // Debug summary count. foreach (var device in devices) { var sourceLabel = string.IsNullOrWhiteSpace(device.Source) ? "Unknown source" : device.Source; // Prefer readable source text. AppendDebugLog($" - {device.DisplayName} (source: {sourceLabel})."); // Include display name and source origin. - AppendDebugLog($" Details: description='{device.Description}', serial='{device.SerialNumber}', COM='{device.ComPort ?? "(none)"}', manufacturer='{device.Manufacturer ?? "(none)"}'"); // Show manufacturer/hardware IDs for driver troubleshooting. + AppendDebugLog($" Details: description='{device.Description}', serial='{device.UsbSerialNumber}', COM='{device.PortName}', manufacturer='{device.Manufacturer ?? "(none)"}'"); // Show manufacturer/hardware IDs for driver troubleshooting. } if (devices.Count == 0) { - AppendLogBoth("No FTDI devices detected."); // Warn user if no FTDI cables are found (e.g., driver missing). + AppendLogBoth("No serial ports detected."); // Warn user if no cables are found (e.g., driver missing). } else { @@ -199,20 +199,20 @@ private void RefreshSerialPorts() } catch (Exception ex) { - LogError("Error while refreshing FTDI devices", ex); // Surface exceptions with MessageBox to aid debugging. + LogError("Error while refreshing serial ports", ex); // Surface exceptions with MessageBox to aid debugging. } } /// - /// Captures combo-box selection changes so we know which FTDI device to open. + /// Captures combo-box selection changes so we know which serial port to open. /// private void cmbBxSerialPort_SelectedIndexChanged(object? sender, EventArgs e) { - if (cmbBxSerialPort.SelectedItem is FtdiDeviceDisplay selected) + if (cmbBxSerialPort.SelectedItem is SerialPortDisplay selected) { - _selectedDevice = selected; // Save FTDI device entry for connection. + _selectedDevice = selected; // Save serial port entry for connection. _selectedDeviceDescription = selected.DisplayName; // Save descriptive text for user prompts. - AppendDebugLog($"Selected FTDI device set to {selected.DisplayName} (source: {selected.Source})."); // Log the selection for trace. + AppendDebugLog($"Selected serial port set to {selected.DisplayName} (source: {selected.Source})."); // Log the selection for trace. } else { @@ -224,39 +224,39 @@ private void cmbBxSerialPort_SelectedIndexChanged(object? sender, EventArgs e) /// /// Opens a serial connection using the selected port. Ensures any existing connection is /// closed first, then spins up on a background thread to avoid UI - /// blocking while the FTDI driver initializes the UART pins. + /// blocking while the serial driver initializes the UART pins. /// private async void btnConnect_Click(object? sender, EventArgs e) { LogDebugAction("Requesting Connect()."); // Debug log entry noting button press. - if (cmbBxSerialPort.SelectedItem is not FtdiDeviceDisplay selectedPort) + if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) { - AppendLog("No FTDI device selected. Please choose a device before connecting."); // User guidance when no selection exists. - MessageBox.Show("Please select an FTDI device before connecting.", "FTDI Device", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal dialog prevents accidental action. + AppendLog("No serial port selected. Please choose a port before connecting."); // User guidance when no selection exists. + MessageBox.Show("Please select a serial port before connecting.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal dialog prevents accidental action. return; // Abort connect flow. } if (_protocol != null) { - if (string.Equals(_protocol.port.Device.SerialNumber, selectedPort.SerialNumber, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(_protocol.port.Device.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) { - AppendLogBoth($"Device {selectedPort.DisplayName} is already open. Ignoring duplicate connect request."); // Avoid reopening same port. - MessageBox.Show($"{selectedPort.DisplayName} is already open.", "FTDI Device", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify user. + AppendLogBoth($"Port {selectedPort.DisplayName} is already open. Ignoring duplicate connect request."); // Avoid reopening same port. + MessageBox.Show($"{selectedPort.DisplayName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify user. return; // Exit without reopening. } - AppendLogBoth($"A different device ({_protocol.port.Device.SerialNumber}) is currently open. Closing it before opening {selectedPort.DisplayName}..."); // Explain why we close first. + AppendLogBoth($"A different port ({_protocol.port.Device.PortName}) is currently open. Closing it before opening {selectedPort.DisplayName}..."); // Explain why we close first. await DisconnectAsync(); // Close current protocol instance to free COM port handle. } var selectedDescription = _selectedDeviceDescription ?? selectedPort.DisplayName; // Build friendly text for status lines. - AppendLogBoth($"Attempting to open {selectedDescription} with D2XX settings: 4800 baud, 8 data bits, parity None, stop bits Two."); // Describe UART config so readers learn standard serial settings. - AppendDebugLog("D2XX connection will set TX low (idle) after open via FT_SetBreakOn + FT_SetDtr."); // Note initial electrical state. + AppendLogBoth($"Attempting to open {selectedDescription} with serial settings: 4800 baud, 8 data bits, parity None, stop bits Two."); // Describe UART config so readers learn standard serial settings. + AppendDebugLog("Serial connection will set TX low (idle) after open via Break and DTR."); // Note initial electrical state. try { - await Task.Run(() => _protocol = new M18Protocol(selectedPort, AppendD2xxLog)); // Instantiate protocol off-UI thread; constructor opens FTDI handle and drives TX idle. + await Task.Run(() => _protocol = new M18Protocol(selectedPort, AppendRawSerialLog)); // Instantiate protocol off-UI thread; constructor opens serial handle and drives TX idle. ApplyProtocolLoggingPreferences(); // Sync checkbox states into protocol PrintTx/PrintRx and hook log delegates. AppendLogBoth($"{selectedDescription} opened successfully."); // Confirm connection to user. UpdateConnectionUi(true); // Toggle button enabled states to reflect connected status. @@ -276,29 +276,29 @@ private async void btnConnect_Click(object? sender, EventArgs e) private async void btnDisconnect_Click(object? sender, EventArgs e) { LogDebugAction(FormatLogMessage("btnDisconnect pressed - requesting DisconnectAsync().")); // Timestamped debug entry. - await DisconnectAsync(); // Attempt to close the FTDI device and dispose protocol safely. + await DisconnectAsync(); // Attempt to close the serial port and dispose protocol safely. } /// - /// Closes the active protocol/FTDI device if present, optionally informing the user via + /// Closes the active protocol/serial port if present, optionally informing the user via /// MessageBox. Runs on a background thread to prevent UI freezes if the driver blocks. /// private async Task DisconnectAsync(bool showUserMessages = true) { if (_protocol == null) { - var message = "Disconnect requested, but no FTDI device is currently open."; // Friendly explanation. + var message = "Disconnect requested, but no serial port is currently open."; // Friendly explanation. AppendDebugLog(FormatLogMessage(message)); // Debug log for trace. if (showUserMessages) { AppendLog(message); // Display in primary log when requested by user (e.g., clicking Disconnect). - MessageBox.Show(message, "FTDI Device", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify via modal dialog. + MessageBox.Show(message, "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify via modal dialog. } UpdateConnectionUi(false); // Reset UI state regardless. return; // Exit early when nothing to close. } - AppendLogBoth($"Closing {_protocol.port.Device.DisplayName}..."); // Inform user which device is closing. + AppendLogBoth($"Closing {_protocol.port.Device.DisplayName}..."); // Inform user which port is closing. try { @@ -307,9 +307,9 @@ await Task.Run(() => if (_protocol.port.IsOpen) { _protocol.idle(); // Set TX to idle (safe state) before closing. - _protocol.port.Close(); // Close the underlying FTDI handle. + _protocol.port.Close(); // Close the underlying serial handle. } - }); // Execute Close on background thread; sets TX idle then disposes FTDI handle. + }); // Execute Close on background thread; sets TX idle then disposes serial handle. AppendLogBoth($"{_protocol.port.Device.DisplayName} closed successfully."); // Confirm closure. } catch (Exception ex) @@ -340,7 +340,7 @@ private async void btnIdle_Click(object? sender, EventArgs e) try { await Task.Run(() => _protocol!.idle()); // Background call to avoid UI hiccup; idle toggles FT_SetBreakOn/FT_SetDtr. - AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery. (See Raw D2XX Log for FT_SetBreakOn/FT_SetDtr calls.)"); // Teach user about safe state. + AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery. (See Raw Serial Log for control-line calls.)"); // Teach user about safe state. } catch (Exception ex) { @@ -364,7 +364,7 @@ private async void btnActive_Click(object? sender, EventArgs e) try { await Task.Run(() => _protocol!.high()); // Toggle control lines on background thread. - AppendLogBoth("TX set to Active (high). Charger simulation enabled. (See Raw D2XX Log for FT_SetBreakOff/FT_ClrDtr calls.)"); // Show user the state change. + AppendLogBoth("TX set to Active (high). Charger simulation enabled. (See Raw Serial Log for control-line calls.)"); // Show user the state change. } catch (Exception ex) { @@ -468,18 +468,18 @@ private bool EnsureConnected() return true; // Connection exists, safe to proceed. } - AppendLog("No active connection. Please connect to an FTDI device first."); // User-friendly guidance. - MessageBox.Show("Please connect to an FTDI device first.", "Connection required", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal warning clarifies next step. + AppendLog("No active connection. Please connect to a serial port first."); // User-friendly guidance. + MessageBox.Show("Please connect to a serial port first.", "Connection required", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal warning clarifies next step. return false; // Signal caller to abort operation. } /// - /// Wrapper around FtdiDeviceUtil to retrieve detailed device metadata, keeping the logic + /// Wrapper around SerialPortUtil to retrieve detailed device metadata, keeping the logic /// isolated for easier unit testing and mocking. /// - private List GetFtdiDevices() + private List GetSerialPorts() { - return FtdiDeviceUtil.EnumerateDevices(AppendD2xxLog); // Pass raw logger to capture D2XX enumeration details. + return SerialPortUtil.EnumerateDetailedPorts(AppendRawSerialLog); // Pass raw logger to capture detailed enumeration. } /// @@ -490,17 +490,17 @@ private async void btnTestFT232_Click(object? sender, EventArgs e) { LogDebugAction("Requesting Test FT232 operation."); // Trace user action. - if (cmbBxSerialPort.SelectedItem is not FtdiDeviceDisplay selectedPort) + if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) { - AppendLog("No FTDI device selected. Please choose a device before testing."); // Provide guidance. - MessageBox.Show("Please select an FTDI device before testing.", "FTDI Device", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Block until user acknowledges. + AppendLog("No serial port selected. Please choose a port before testing."); // Provide guidance. + MessageBox.Show("Please select a serial port before testing.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Block until user acknowledges. return; // Abort test. } var selectedDescription = _selectedDeviceDescription ?? selectedPort.DisplayName; // Friendly name for messages. - AppendLog($"Testing FT232 on {selectedDescription} via D2XX..."); // Inform user test is starting. - LogDebugAction($"Testing FT232 on {selectedDescription} via D2XX."); // Duplicate in debug log. + AppendLog($"Testing serial connectivity on {selectedDescription}..."); // Inform user test is starting. + LogDebugAction($"Testing serial connectivity on {selectedDescription}."); // Duplicate in debug log. var testResult = await Task.Run(() => TestSerialDevice(selectedPort)); // Run test on background thread to keep UI fluid. @@ -517,20 +517,20 @@ private async void btnTestFT232_Click(object? sender, EventArgs e) } /// - /// Opens the specified device with the FTDI-friendly serial settings and performs a minimal + /// Opens the specified device with the serial settings and performs a minimal /// control-line toggle plus a single-byte write to check for driver/hardware responsiveness. /// - private static (bool Success, string? ErrorMessage) TestSerialDevice(FtdiDeviceDisplay device) + private static (bool Success, string? ErrorMessage) TestSerialDevice(SerialPortDisplay device) { try { - using var d2xxPort = new FtdiD2xxPort(device, null); // Open FTDI handle with default logger. - d2xxPort.SetDtr(true); // Assert DTR to mimic idle charger line initially. - d2xxPort.SetBreak(true); // Assert BREAK to drive TX low. - d2xxPort.SetDtr(false); // Toggle DTR to confirm control-line responsiveness. - d2xxPort.SetBreak(false); // Release BREAK to drive TX high. + using var serialPort = new SerialPortConnection(device, null); // Open serial handle with default logger. + serialPort.SetDtr(true); // Assert DTR to mimic idle charger line initially. + serialPort.SetBreak(true); // Assert BREAK to drive TX low. + serialPort.SetDtr(false); // Toggle DTR to confirm control-line responsiveness. + serialPort.SetBreak(false); // Release BREAK to drive TX high. - d2xxPort.WriteBytes(new byte[] { 0x00 }); // Send a single zero byte out TX to verify TX data path. + serialPort.WriteBytes(new byte[] { 0x00 }); // Send a single zero byte out TX to verify TX data path. return (true, null); // Success indicates driver and hardware are reachable. } @@ -623,7 +623,7 @@ private void LogError(string context, Exception exception) { var fullMessage = $"{context} Error details: {exception}"; // Combine context and exception message/stack trace. AppendLogBoth(fullMessage); // Write to logs for persistence. - MessageBox.Show(fullMessage, "FTDI Device Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // Display blocking error dialog. + MessageBox.Show(fullMessage, "Serial Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // Display blocking error dialog. } /// @@ -647,7 +647,7 @@ private void ApplyProtocolLoggingPreferences() { AppendProtocolLog(message); // Route RX log messages into all log panes. }; - _protocol.RawLogger = AppendD2xxLog; // Route raw FTDI call traces into the dedicated D2XX tab. + _protocol.RawLogger = AppendRawSerialLog; // Route raw serial call traces into the dedicated tab. } /// @@ -701,23 +701,23 @@ private void AppendDebugLog(string message) } /// - /// Writes text into the raw D2XX log rich text box, mirroring FTDI API calls for visibility. + /// Writes text into the raw serial log rich text box, mirroring SerialPort actions for visibility. /// Background threads are marshaled to the UI thread to avoid cross-thread exceptions. /// - private void AppendD2xxLog(string message) + private void AppendRawSerialLog(string message) { if (rtbD2xxLog.InvokeRequired) { - rtbD2xxLog.Invoke(new Action(() => AppendD2xxLog(message))); // Marshal to UI thread if needed. + rtbD2xxLog.Invoke(new Action(() => AppendRawSerialLog(message))); // Marshal to UI thread if needed. return; // Stop processing on worker thread. } - var prefix = _hasAppendedD2xxLog ? Environment.NewLine : string.Empty; // Add newline after first message. + var prefix = _hasAppendedSerialLog ? Environment.NewLine : string.Empty; // Add newline after first message. var formatted = message.Contains("- ") ? message : FormatLogMessage(message); // Preserve existing timestamps if provided. - rtbD2xxLog.AppendText($"{prefix}{formatted}"); // Write to raw D2XX output box. + rtbD2xxLog.AppendText($"{prefix}{formatted}"); // Write to raw serial output box. rtbD2xxLog.SelectionStart = rtbD2xxLog.TextLength; // Move caret to end. rtbD2xxLog.ScrollToCaret(); // Auto-scroll to newest entry. - _hasAppendedD2xxLog = true; // Note content exists. + _hasAppendedSerialLog = true; // Note content exists. } /// @@ -782,23 +782,23 @@ private void button1_Click(object sender, EventArgs e) /// /// Sends a raw byte (0xAA) and waits for a response to validate echo/loopback behavior on - /// the open FTDI device. This is similar to a ping test for UART communications. + /// the open serial port. This is similar to a ping test for UART communications. /// private void btnTestEcho_Click(object sender, EventArgs e) { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on {_protocol?.port.Device.SerialNumber ?? "??"}\n"); // Timestamp test start with chosen device. + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on {_protocol?.port.Device.DisplayName ?? "??"}\n"); // Timestamp test start with chosen device. try { if (_protocol?.port.IsOpen != true) { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - FTDI device not open. Connect first.\n"); // Warn user that port must be open. - return; // Exit early because no active FTDI handle exists. + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Serial port not open. Connect first.\n"); // Warn user that port must be open. + return; // Exit early because no active serial handle exists. } _protocol.port.PurgeRx(); // Clear inbound buffer to remove stale bytes before test. byte[] send = { 0xAA }; // Single SYNC-like byte to transmit; echoed devices should return it. - _protocol.port.WriteBytes(send); // Write to UART TX line via D2XX; FT232 shifts bits out over USB-UART bridge. + _protocol.port.WriteBytes(send); // Write to UART TX line; SerialPort shifts bits out over USB-UART bridge. rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Sent byte 0xAA.\n"); // Confirm transmission to user. var response = _protocol.port.ReadBytes(1); // Block up to timeout waiting for one byte on RX. diff --git a/M18BatteryInfo.csproj b/M18BatteryInfo.csproj index 779638b..8a375c9 100644 --- a/M18BatteryInfo.csproj +++ b/M18BatteryInfo.csproj @@ -9,7 +9,6 @@ - diff --git a/M18Protocol.cs b/M18Protocol.cs index 8f6ba3a..9bce76a 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -53,7 +53,7 @@ public Action? RawLogger } } - public FtdiD2xxPort port; + public SerialPortConnection port; // --------------------------- // Data tables copied verbatim from m18.py @@ -265,10 +265,10 @@ private static IEnumerable GetHex(IEnumerable bytes) // ------------------------------------- // Constructor mirroring __init__ in m18.py // ------------------------------------- - public M18Protocol(FtdiDeviceDisplay device, Action? rawLogger = null) + public M18Protocol(SerialPortDisplay device, Action? rawLogger = null) { RawLogger = rawLogger; - port = new FtdiD2xxPort(device, RawLogger); + port = new SerialPortConnection(device, RawLogger); idle(); } @@ -1274,4 +1274,4 @@ public void adv_help() "m.keepalive() - send charge current request (0x62) \n"); } } -} \ No newline at end of file +} diff --git a/Program.cs b/Program.cs index 7225baf..79c1bee 100644 --- a/Program.cs +++ b/Program.cs @@ -6,7 +6,7 @@ // ApplicationConfiguration to bootstrap high-DPI awareness and default fonts. The goal is to show // how a C# WinForms app starts, how STAThread is required for COM-based UI components, and where the // program transitions from the process boundary into user-interface code that eventually invokes -// serial-protocol logic in M18Protocol.cs and USB enumeration utilities in FtdiDeviceUtil.cs. Even +// serial-protocol logic in M18Protocol.cs and USB enumeration utilities in SerialPortUtil.cs. Even // though the logic is minimal, commenting every line reveals the basic structure of a .NET desktop // program for newcomers. // ************************************************************************************************* @@ -18,7 +18,7 @@ namespace M18BatteryInfo /// keep the symbol inside the assembly while still being discoverable by the runtime. It /// delegates all user interaction to , which wires up event handlers to /// the serial protocol layer () and utility helpers - /// () that talk to hardware. + /// () that talk to hardware. /// internal static class Program { @@ -43,8 +43,8 @@ static void Main() // (GetMessage/DispatchMessage under the hood) and will not exit until the form closes. // We construct frmMain, which is defined across M18AnalyzerMain.cs (logic) and // M18AnalyzerMain.Designer.cs (control layout). That form then interacts with - // M18Protocol.cs to toggle UART lines and read battery data, plus FtdiDeviceUtil.cs to - // discover FTDI devices. + // M18Protocol.cs to toggle UART lines and read battery data, plus SerialPortUtil.cs to + // discover serial devices. Application.Run(new frmMain()); } } diff --git a/SerialPortConnection.cs b/SerialPortConnection.cs new file mode 100644 index 0000000..406c15d --- /dev/null +++ b/SerialPortConnection.cs @@ -0,0 +1,133 @@ +// ************************************************************************************************* +// SerialPortConnection.cs +// ----------------------- +// Wraps System.IO.Ports.SerialPort with helper methods that mirror the subset of operations needed +// by M18Protocol: opening the port with specific framing, toggling BREAK/DTR, purging buffers, and +// reading/writing exact byte counts. The wrapper also supports an optional raw logger to surface +// low-level serial actions to the UI without exposing SerialPort directly. +// ************************************************************************************************* + +using System; +using System.Collections.Generic; +using System.IO.Ports; +using System.Linq; + +namespace M18BatteryInfo; + +internal sealed class SerialPortConnection : IDisposable +{ + private readonly SerialPort _serialPort; + private Action? _rawLogger; + + public SerialPortConnection(SerialPortDisplay device, Action? rawLogger) + { + Device = device; + _rawLogger = rawLogger; + + _serialPort = new SerialPort(device.PortName, 4800, Parity.None, 8, StopBits.Two) + { + ReadTimeout = 800, + WriteTimeout = 800, + DtrEnable = false, + RtsEnable = false + }; + + Log($"Opening {device.PortName} at 4800 8N2"); + _serialPort.Open(); + PurgeAll(); + } + + public SerialPortDisplay Device { get; } + + public bool IsOpen => _serialPort.IsOpen; + + public void SetBreak(bool enable) + { + _serialPort.BreakState = enable; + Log($"SerialPort.BreakState={(enable ? "On" : "Off")}"); + } + + public void SetDtr(bool enable) + { + _serialPort.DtrEnable = enable; + Log($"SerialPort.DtrEnable={(enable ? "On" : "Off")}"); + } + + public void PurgeAll() + { + _serialPort.DiscardInBuffer(); + _serialPort.DiscardOutBuffer(); + Log("SerialPort.DiscardInBuffer/DiscardOutBuffer"); + } + + public void PurgeRx() + { + _serialPort.DiscardInBuffer(); + Log("SerialPort.DiscardInBuffer"); + } + + public void WriteBytes(byte[] data) + { + _serialPort.Write(data, 0, data.Length); + Log($"SerialPort.Write {FormatHex(data)}"); + } + + public byte[] ReadBytes(int count) + { + var buffer = new byte[count]; + var totalRead = 0; + try + { + while (totalRead < count) + { + var bytesRead = _serialPort.Read(buffer, totalRead, count - totalRead); + totalRead += bytesRead; + } + } + catch (TimeoutException ex) + { + throw new InvalidOperationException($"SerialPort.Read timed out after reading {totalRead} of {count} byte(s)", ex); + } + + Log($"SerialPort.Read count={count}, bytesRead={totalRead}, data={FormatHex(buffer.Take(totalRead))}"); + + if (totalRead < count) + { + throw new InvalidOperationException($"SerialPort.Read returned {totalRead} of {count} byte(s)"); + } + + return buffer; + } + + public void Close() + { + if (!_serialPort.IsOpen) + { + return; + } + + Log("SerialPort.Close"); + _serialPort.Close(); + } + + public void Dispose() + { + Close(); + _serialPort.Dispose(); + } + + public void UpdateLogger(Action? logger) + { + _rawLogger = logger; + } + + private void Log(string message) + { + _rawLogger?.Invoke(message); + } + + private static string FormatHex(IEnumerable data) + { + return string.Join(" ", data.Select(b => $"0x{b:X2}")); + } +} diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index 3bbb57b..2ea0751 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -21,9 +21,9 @@ namespace M18BatteryInfo; /// -/// Provides serial port enumeration using Windows SetupAPI to capture detailed descriptions similar -/// to Python's pyserial list_ports.comports(). The class combines multiple discovery sources (friendly -/// names, registry keys, and GetPortNames) to produce robust metadata for UI display and debugging. + /// Provides serial port enumeration using Windows SetupAPI to capture detailed descriptions similar + /// to Python's pyserial list_ports.comports(). The class combines multiple discovery sources (friendly + /// names, registry keys, and GetPortNames) to produce robust metadata for UI display and debugging. /// internal static class SerialPortUtil { @@ -53,7 +53,7 @@ internal static class SerialPortUtil /// /// Enumerates serial ports using SetupAPI and returns metadata suitable for UI display. This helper /// remains to correlate FTDI serial numbers with COM port assignments for reference only; all I/O - /// flows through the D2XX driver. + /// now flows through System.IO.Ports.SerialPort. /// /// Optional logger for verbose debug output. /// Ordered list of serial port metadata. From 6fa909a2e41365396b1f85d2441a61753e8cc81c Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 16:06:07 -0500 Subject: [PATCH 55/61] Ensure SerialPort dependency is referenced and public --- M18BatteryInfo.csproj | 4 ++++ SerialPortConnection.cs | 2 +- SerialPortUtil.cs | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/M18BatteryInfo.csproj b/M18BatteryInfo.csproj index 8a375c9..6f458bc 100644 --- a/M18BatteryInfo.csproj +++ b/M18BatteryInfo.csproj @@ -11,6 +11,10 @@ + + + + diff --git a/SerialPortConnection.cs b/SerialPortConnection.cs index 406c15d..98fad0d 100644 --- a/SerialPortConnection.cs +++ b/SerialPortConnection.cs @@ -14,7 +14,7 @@ namespace M18BatteryInfo; -internal sealed class SerialPortConnection : IDisposable +public sealed class SerialPortConnection : IDisposable { private readonly SerialPort _serialPort; private Action? _rawLogger; diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index 2ea0751..ee81e0c 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -434,7 +434,7 @@ private static extern IntPtr SetupDiOpenDevRegKey( int samDesired); } -internal sealed record SerialPortDisplay( +public sealed record SerialPortDisplay( string PortName, string? Description, string? Manufacturer, From 865891e0aecd91acd5e3ff1a763b5047fb0e3f0f Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 16:10:24 -0500 Subject: [PATCH 56/61] Use System.IO.Ports package reference --- M18BatteryInfo.csproj | 1 + SerialPortConnection.cs | 2 +- SerialPortUtil.cs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/M18BatteryInfo.csproj b/M18BatteryInfo.csproj index 8a375c9..b6e471d 100644 --- a/M18BatteryInfo.csproj +++ b/M18BatteryInfo.csproj @@ -10,6 +10,7 @@ + diff --git a/SerialPortConnection.cs b/SerialPortConnection.cs index 406c15d..98fad0d 100644 --- a/SerialPortConnection.cs +++ b/SerialPortConnection.cs @@ -14,7 +14,7 @@ namespace M18BatteryInfo; -internal sealed class SerialPortConnection : IDisposable +public sealed class SerialPortConnection : IDisposable { private readonly SerialPort _serialPort; private Action? _rawLogger; diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index 2ea0751..ee81e0c 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -434,7 +434,7 @@ private static extern IntPtr SetupDiOpenDevRegKey( int samDesired); } -internal sealed record SerialPortDisplay( +public sealed record SerialPortDisplay( string PortName, string? Description, string? Manufacturer, From 758e47067f3e9550584bc9f0bd9a37a21caabbd6 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 16:21:00 -0500 Subject: [PATCH 57/61] Log wire-format bytes and standardize hex output --- M18Protocol.cs | 12 ++++-------- SerialPortConnection.cs | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index 9bce76a..0b53e72 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -375,19 +375,15 @@ public byte[] add_checksum(List lsbCommand) public void send(byte[] command) { port.PurgeRx(); - var debugPrint = string.Join(" ", GetHex(command)); - var msb = new List(); - foreach (var b in command) - { - msb.Add((byte)reverse_bits(b)); - } + var msb = command.Select(b => (byte)reverse_bits(b)).ToArray(); + var msbPrint = string.Join(" ", GetHex(msb)); if (PRINT_TX) { - LogTx($"Sending: {debugPrint}"); + LogTx($"Sending: {msbPrint}"); } - port.WriteBytes(msb.ToArray()); + port.WriteBytes(msb); } public void send_command(byte[] command) diff --git a/SerialPortConnection.cs b/SerialPortConnection.cs index 98fad0d..c32c0ee 100644 --- a/SerialPortConnection.cs +++ b/SerialPortConnection.cs @@ -128,6 +128,6 @@ private void Log(string message) private static string FormatHex(IEnumerable data) { - return string.Join(" ", data.Select(b => $"0x{b:X2}")); + return string.Join(" ", data.Select(b => $"{b:X2}")); } } From dc4e72afcde1c7439392ae1e4b5630b8ef75bf08 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 16:33:24 -0500 Subject: [PATCH 58/61] Ensure serial commands use byte arrays and hex logging --- M18Protocol.cs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index 0b53e72..a7e30ec 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -376,11 +376,10 @@ public void send(byte[] command) { port.PurgeRx(); var msb = command.Select(b => (byte)reverse_bits(b)).ToArray(); - var msbPrint = string.Join(" ", GetHex(msb)); - if (PRINT_TX) { - LogTx($"Sending: {msbPrint}"); + var logBytes = msb.ToArray(); + LogTx("Sending: " + BitConverter.ToString(logBytes).Replace("-", " ")); } port.WriteBytes(msb); @@ -481,14 +480,16 @@ public byte[] configure(byte state) cmd.AddRange(BitConverter.GetBytes((ushort)MAX_CURRENT).Reverse()); cmd.Add(state); cmd.Add(13); - send_command(cmd.ToArray()); + var cmdBytes = cmd.ToArray(); + send_command(cmdBytes); return read_response(5); } public byte[] get_snapchat() { var cmd = new List { SNAP_CMD, (byte)ACC, 0 }; - send_command(cmd.ToArray()); + var cmdBytes = cmd.ToArray(); + send_command(cmdBytes); update_acc(); return read_response(8); } @@ -496,14 +497,16 @@ public byte[] get_snapchat() public byte[] keepalive() { var cmd = new List { KEEPALIVE_CMD, (byte)ACC, 0 }; - send_command(cmd.ToArray()); + var cmdBytes = cmd.ToArray(); + send_command(cmdBytes); return read_response(9); } public byte[] calibrate() { var cmd = new List { CAL_CMD, (byte)ACC, 0 }; - send_command(cmd.ToArray()); + var cmdBytes = cmd.ToArray(); + send_command(cmdBytes); update_acc(); return read_response(8); } @@ -603,7 +606,8 @@ public void try_cmd(byte cmdByte, byte msb, byte lsb, byte length, int retLen = reset(); var cmdBuf = new List { cmdByte, 0x04, 0x03, msb, lsb, length }; - send_command(cmdBuf.ToArray()); + var cmdBytes = cmdBuf.ToArray(); + send_command(cmdBytes); var data = read_response(retLen); var dataPrint = string.Join(" ", GetHex(data)); Console.WriteLine($"Response from: 0x{(msb * 0x100 + lsb):04X}: {dataPrint}"); @@ -614,7 +618,8 @@ public void try_cmd(byte cmdByte, byte msb, byte lsb, byte length, int retLen = public byte[] cmd(int a, int b, int c, int length, byte command = 0x01) { var cmdBuf = new List { command, 0x04, 0x03, (byte)a, (byte)b, (byte)c }; - send_command(cmdBuf.ToArray()); + var cmdBytes = cmdBuf.ToArray(); + send_command(cmdBytes); return read_response(length); } @@ -673,7 +678,8 @@ public void full_brute(int start = 0, int stop = 0xFFFF, int length = 0xFF) public byte[] wcmd(byte a, byte b, byte c, int length) { var cmdBuf = new List { 0x01, 0x05, 0x03, a, b, c }; - send_command(cmdBuf.ToArray()); + var cmdBytes = cmdBuf.ToArray(); + send_command(cmdBytes); return read_response(length); } From 09ada2c8bbb67fbdcdc4d39665dd8f153c1faae4 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 16:42:20 -0500 Subject: [PATCH 59/61] Match Python send logging order --- M18Protocol.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/M18Protocol.cs b/M18Protocol.cs index a7e30ec..2526ac8 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -375,11 +375,12 @@ public byte[] add_checksum(List lsbCommand) public void send(byte[] command) { port.PurgeRx(); + var logBytes = command.ToArray(); var msb = command.Select(b => (byte)reverse_bits(b)).ToArray(); + if (PRINT_TX) { - var logBytes = msb.ToArray(); - LogTx("Sending: " + BitConverter.ToString(logBytes).Replace("-", " ")); + LogTx("Sending: " + BitConverter.ToString(logBytes).Replace("-", " ")); } port.WriteBytes(msb); From f1546d2dcea61877cfbebee44b3da7b03a2242eb Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 18 Dec 2025 18:55:22 -0500 Subject: [PATCH 60/61] Use SerialPortStream for RJCP-based serial handling --- M18BatteryInfo.csproj | 6 +----- M18Protocol.cs | 4 +++- SerialPortConnection.cs | 26 ++++++++++++++++---------- SerialPortUtil.cs | 2 +- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/M18BatteryInfo.csproj b/M18BatteryInfo.csproj index 3c10197..5fc9b35 100644 --- a/M18BatteryInfo.csproj +++ b/M18BatteryInfo.csproj @@ -9,14 +9,10 @@ + - - - - - True diff --git a/M18Protocol.cs b/M18Protocol.cs index 2526ac8..cae7274 100644 --- a/M18Protocol.cs +++ b/M18Protocol.cs @@ -4,7 +4,9 @@ // Literal, instruction-for-instruction port of m18.py. Every sleep, buffer reset, control-line // toggle, byte ordering rule, and logging string mirrors the Python implementation. The structure // intentionally ignores .NET conventions so the execution order, timing, and side effects remain -// identical to the Python reference, including redundant operations and blocking behaviour. +// identical to the Python reference, including redundant operations and blocking behaviour. Serial +// I/O now routes through RJCP.IO.Ports.SerialPortStream (via SerialPortConnection) to guarantee +// .NET 10 compatibility and access to manual BREAK/DTR toggles plus buffer flushes. // ************************************************************************************************* using System; diff --git a/SerialPortConnection.cs b/SerialPortConnection.cs index c32c0ee..03aa78a 100644 --- a/SerialPortConnection.cs +++ b/SerialPortConnection.cs @@ -1,22 +1,25 @@ // ************************************************************************************************* // SerialPortConnection.cs // ----------------------- -// Wraps System.IO.Ports.SerialPort with helper methods that mirror the subset of operations needed -// by M18Protocol: opening the port with specific framing, toggling BREAK/DTR, purging buffers, and -// reading/writing exact byte counts. The wrapper also supports an optional raw logger to surface -// low-level serial actions to the UI without exposing SerialPort directly. +// Wraps RJCP.IO.Ports.SerialPortStream with helper methods that mirror the subset of operations +// needed by M18Protocol: opening the port with specific framing, toggling BREAK/DTR, purging +// buffers, and reading/writing exact byte counts. The wrapper also supports an optional raw logger +// to surface low-level serial actions to the UI without exposing SerialPortStream directly. RJCP +// provides .NET 10 support and granular control-line handling that matches the Python reference +// script, including manual Break/DTR and millisecond timeouts. // ************************************************************************************************* using System; using System.Collections.Generic; -using System.IO.Ports; using System.Linq; +using System.Diagnostics; +using RJCP.IO.Ports; namespace M18BatteryInfo; public sealed class SerialPortConnection : IDisposable { - private readonly SerialPort _serialPort; + private readonly SerialPortStream _serialPort; private Action? _rawLogger; public SerialPortConnection(SerialPortDisplay device, Action? rawLogger) @@ -24,7 +27,7 @@ public SerialPortConnection(SerialPortDisplay device, Action? rawLogger) Device = device; _rawLogger = rawLogger; - _serialPort = new SerialPort(device.PortName, 4800, Parity.None, 8, StopBits.Two) + _serialPort = new SerialPortStream(device.PortName, 4800, 8, Parity.None, StopBits.Two) { ReadTimeout = 800, WriteTimeout = 800, @@ -32,7 +35,7 @@ public SerialPortConnection(SerialPortDisplay device, Action? rawLogger) RtsEnable = false }; - Log($"Opening {device.PortName} at 4800 8N2"); + Log($"Opening {device.PortName} at 4800 8N2 using RJCP.SerialPortStream"); _serialPort.Open(); PurgeAll(); } @@ -69,6 +72,7 @@ public void PurgeRx() public void WriteBytes(byte[] data) { _serialPort.Write(data, 0, data.Length); + _serialPort.Flush(); // Ensure immediate transmission; mirrors Python's synchronous writes. Log($"SerialPort.Write {FormatHex(data)}"); } @@ -76,6 +80,7 @@ public byte[] ReadBytes(int count) { var buffer = new byte[count]; var totalRead = 0; + var stopwatch = Stopwatch.StartNew(); try { while (totalRead < count) @@ -86,10 +91,11 @@ public byte[] ReadBytes(int count) } catch (TimeoutException ex) { - throw new InvalidOperationException($"SerialPort.Read timed out after reading {totalRead} of {count} byte(s)", ex); + throw new InvalidOperationException($"SerialPort.Read timed out after reading {totalRead} of {count} byte(s) over {stopwatch.ElapsedMilliseconds} ms", ex); } - Log($"SerialPort.Read count={count}, bytesRead={totalRead}, data={FormatHex(buffer.Take(totalRead))}"); + stopwatch.Stop(); + Log($"SerialPort.Read count={count}, bytesRead={totalRead}, elapsed={stopwatch.ElapsedMilliseconds}ms, data={FormatHex(buffer.Take(totalRead))}"); if (totalRead < count) { diff --git a/SerialPortUtil.cs b/SerialPortUtil.cs index ee81e0c..6ca1b24 100644 --- a/SerialPortUtil.cs +++ b/SerialPortUtil.cs @@ -53,7 +53,7 @@ internal static class SerialPortUtil /// /// Enumerates serial ports using SetupAPI and returns metadata suitable for UI display. This helper /// remains to correlate FTDI serial numbers with COM port assignments for reference only; all I/O - /// now flows through System.IO.Ports.SerialPort. + /// now flows through RJCP.IO.Ports.SerialPortStream. /// /// Optional logger for verbose debug output. /// Ordered list of serial port metadata. From d948479ec68c9c221ec441b8ac41b646e3f36298 Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Thu, 25 Dec 2025 10:49:30 -0500 Subject: [PATCH 61/61] Integrate Python process controller --- AppSettings.cs | 61 +++++ M18AnalyzerMain.cs | 457 +++++++++++++++++++------------------ PythonProcessController.cs | 240 +++++++++++++++++++ 3 files changed, 530 insertions(+), 228 deletions(-) create mode 100644 AppSettings.cs create mode 100644 PythonProcessController.cs diff --git a/AppSettings.cs b/AppSettings.cs new file mode 100644 index 0000000..5be7ca4 --- /dev/null +++ b/AppSettings.cs @@ -0,0 +1,61 @@ +using System; +using System.IO; +using System.Text.Json; + +namespace M18BatteryInfo +{ + /// + /// Persists user configurable paths for the Python executable and m18.py script. Paths are stored + /// in a JSON file under the user's application data folder so they survive app restarts without + /// requiring registry edits or manual config tweaks. + /// + public class AppSettings + { + public string PythonExecutablePath { get; set; } = "python"; + public string ScriptPath { get; set; } = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "m18.py"); + + private static string SettingsFilePath => + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "M18BatteryInfo", "settings.json"); + + /// + /// Load persisted settings from disk. If the file is missing or unreadable, defaults are + /// returned and a new settings file will be written the next time is called. + /// + public static AppSettings Load() + { + try + { + if (File.Exists(SettingsFilePath)) + { + var json = File.ReadAllText(SettingsFilePath); + var settings = JsonSerializer.Deserialize(json); + if (settings != null) + { + return settings; + } + } + } + catch + { + // If the file is malformed, fall back to defaults without throwing to keep the UI usable. + } + + return new AppSettings(); + } + + /// + /// Persist the current settings to disk, creating the directory if needed. + /// + public void Save() + { + var directory = Path.GetDirectoryName(SettingsFilePath); + if (!string.IsNullOrWhiteSpace(directory) && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + var json = JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true }); + File.WriteAllText(SettingsFilePath, json); + } + } +} diff --git a/M18AnalyzerMain.cs b/M18AnalyzerMain.cs index b1c861d..538cf2e 100644 --- a/M18AnalyzerMain.cs +++ b/M18AnalyzerMain.cs @@ -3,17 +3,18 @@ // ------------------ // Hosts the user-facing WinForms logic for the Milwaukee M18 battery analyzer GUI. This partial // class pairs with M18AnalyzerMain.Designer.cs (UI layout) to render the form and wire up buttons, -// combo boxes, and rich text boxes. It acts as a bridge between the UI events and the lower-level -// serial protocol implementation in M18Protocol.cs as well as the serial-port discovery helper -// SerialPortUtil.cs. Every method and key line is commented to teach WinForms fundamentals (event -// registration, marshaling to the UI thread), serial programming (driving DTR/Break for idle/high), -// and logging approaches. Reading the comments alone should explain how the GUI controls map to the -// electrical behavior on the FT232/COM port pins and how the protocol layer is orchestrated. +// combo boxes, and rich text boxes. It now acts as a bridge between UI events and the authoritative +// Python implementation (m18.py), launching the script as a child process and streaming stdout/stderr +// into the existing logs. Serial port discovery still flows through SerialPortUtil.cs so the user can +// select the COM port that will be passed to Python. Every method and key line is commented to teach +// WinForms fundamentals (event registration, marshaling to the UI thread) and logging approaches. // ************************************************************************************************* using System; // Provides core types like EventArgs, Action, and DateTime used throughout the form. using System.Collections.Generic; // Supplies List for storing serial port objects. +using System.IO; // Validates python and script paths. using System.Linq; // Enables LINQ helpers such as Select and ToList used during logging. +using System.Threading; // Supports cancellation and timeouts. using System.Threading.Tasks; // Enables Task.Run for background work that keeps the UI responsive. using System.Windows.Forms; // Provides Form, control types, and dialog helpers used by WinForms. @@ -23,14 +24,20 @@ namespace M18BatteryInfo /// The primary WinForms window that presents user controls for serial port selection, /// connection management, and protocol commands (idle/high/reset/health-report). This class /// captures events fired by buttons and other controls, marshals work to background threads so - /// the UI does not freeze, and forwards user actions to which drives - /// the UART (TX) line high/low and exchanges bytes with the battery BMS. It also uses - /// to enumerate serial ports with extended metadata. + /// the UI does not freeze, and forwards user actions to the Python reference implementation + /// (m18.py). It also uses to enumerate serial ports with extended + /// metadata for the Python process to consume. /// public partial class frmMain : Form { - // Backing field holding the active protocol connection. Null means no port is open. - private M18Protocol? _protocol; // M18Protocol manipulates FT_SetBreak/FT_SetDtr to emulate charger signals. + // Hosts the interactive Python session. + private PythonProcessController? _pythonController; + // Persisted settings for python and script locations. + private readonly AppSettings _settings = AppSettings.Load(); + // Tracks whether a Python command is currently in-flight (waiting for prompt). + private bool _isPythonBusy; + // Timeout used when waiting for Python to return to the REPL prompt. + private readonly TimeSpan _commandTimeout = TimeSpan.FromSeconds(15); // Track whether the simple output RichTextBox already has content to manage newlines. private bool _hasAppendedLog; // Ensures we only prepend Environment.NewLine after the first log line. // Track whether the advanced output RichTextBox already has content. @@ -56,12 +63,12 @@ public frmMain() // Wire up button click and change handlers to their corresponding methods. Delegates are // created here to keep designer file clean and to demonstrate event subscription syntax. btnRefresh.Click += btnRefresh_Click; // Refresh list of serial ports when "Refresh" pressed. - btnConnect.Click += btnConnect_Click; // Attempt to open serial port when "Connect" pressed. - btnDisconnect.Click += btnDisconnect_Click; // Close serial port when "Disconnect" pressed. - btnIdle.Click += btnIdle_Click; // Drive TX low (Break/DTR asserted) to simulate idle charger pin. - btnActive.Click += btnActive_Click; // Drive TX high (Break/DTR deasserted) to simulate charging. - btnHealthReport.Click += btnHealthReport_Click; // Trigger multi-register read to show battery stats. - btnReset.Click += btnReset_Click; // Send reset handshake (BREAK + SYNC byte) to battery. + btnConnect.Click += btnConnect_Click; // Launch Python on the selected port when "Connect" pressed. + btnDisconnect.Click += btnDisconnect_Click; // Stop the Python process when "Disconnect" pressed. + btnIdle.Click += btnIdle_Click; // Ask Python to drive TX low (idle charger pin). + btnActive.Click += btnActive_Click; // Ask Python to drive TX high (charging simulation). + btnHealthReport.Click += btnHealthReport_Click; // Trigger multi-register read via Python health(). + btnReset.Click += btnReset_Click; // Send reset handshake through Python. btnCopyOutput.Click += btnCopyOutput_Click; // Copy logs to clipboard for sharing/debugging. chkbxTXLog.CheckedChanged += chkbxTXLog_CheckedChanged; // Toggle TX byte logging. chkboxRxLog.CheckedChanged += chkboxRxLog_CheckedChanged; // Toggle RX byte logging. @@ -69,9 +76,9 @@ public frmMain() cmbBxSerialPort.SelectedIndexChanged += cmbBxSerialPort_SelectedIndexChanged; // Capture selected serial port. FormClosing += frmMain_FormClosing; // Ensure we cleanly close serial port when form closes. - // Default logging preferences to on so that users see both TX and RX traffic. - chkbxTXLog.Checked = true; // Enables printing TX bytes through M18Protocol.TxLogger. - chkboxRxLog.Checked = true; // Enables printing RX bytes through M18Protocol.RxLogger. + // Default logging preferences to on to maintain parity with previous UI. + chkbxTXLog.Checked = true; // TX log checkbox retained for compatibility. + chkboxRxLog.Checked = true; // RX log checkbox retained for compatibility. // Provide friendly tooltips describing each control's purpose. toolTipSimpleTab.SetToolTip(btnRefresh, "Refresh the list of available serial ports."); // Helps beginners understand UI flow. @@ -79,10 +86,12 @@ public frmMain() toolTipSimpleTab.SetToolTip(btnDisconnect, "Disconnect from the currently connected device."); // Clarifies safe disconnect. toolTipSimpleTab.SetToolTip(btnIdle, "Drive TX low (idle). Safe for connect/disconnect."); // Notes electrical effect on TX line. toolTipSimpleTab.SetToolTip(btnActive, "Drive TX high (active). Charger simulation."); // Indicates charger-simulation state. - toolTipSimpleTab.SetToolTip(btnHealthReport, "Read and display a basic battery health report."); // References M18Protocol.HealthReport. - toolTipSimpleTab.SetToolTip(btnReset, "Send a reset signal to the connected battery."); // Tied to M18Protocol.Reset handshake. + toolTipSimpleTab.SetToolTip(btnHealthReport, "Read and display a basic battery health report."); + toolTipSimpleTab.SetToolTip(btnReset, "Send a reset signal to the connected battery."); toolTipSimpleTab.SetToolTip(btnCopyOutput, "Copy all output log text to the clipboard."); // Guides how to export logs. + InitializePythonController(); // Prepare the Python process host and logging bridges. + UpdateConnectionUi(false); // Disable connection-dependent buttons until a port opens. } @@ -96,6 +105,25 @@ private void toolStripButton1_Click(object sender, EventArgs e) // other buttons follow. Deleting could break designer hookups, so it stays as a template. } + /// + /// Create a fresh PythonProcessController instance and wire its events into the existing log + /// surfaces so stdout/stderr are mirrored into the UI. + /// + private void InitializePythonController() + { + _pythonController?.Dispose(); + _pythonController = new PythonProcessController(_settings.PythonExecutablePath, _settings.ScriptPath); + _pythonController.OutputReceived += line => AppendPythonLog(line, false); + _pythonController.ErrorReceived += line => AppendPythonLog(line, true); + _pythonController.PromptDetected += () => SetPythonBusy(false); + _pythonController.Exited += exitCode => + { + AppendLogBoth($"Python process exited (code: {exitCode?.ToString() ?? "unknown"})."); + SetPythonBusy(false); + UpdateConnectionUi(false); + }; + } + /// /// Stub for tooltip popup events. Included for completeness to show how ToolTip can be /// customized if desired. @@ -222,50 +250,44 @@ private void cmbBxSerialPort_SelectedIndexChanged(object? sender, EventArgs e) } /// - /// Opens a serial connection using the selected port. Ensures any existing connection is - /// closed first, then spins up on a background thread to avoid UI - /// blocking while the serial driver initializes the UART pins. + /// Launches the Python process against the selected port. Validates configured paths before + /// starting so the backend can run without blocking the UI thread. /// private async void btnConnect_Click(object? sender, EventArgs e) { - LogDebugAction("Requesting Connect()."); // Debug log entry noting button press. - if (cmbBxSerialPort.SelectedItem is not SerialPortDisplay selectedPort) + LogDebugAction("Requesting Python connect."); // Debug log entry noting button press. + if (_pythonController?.IsRunning == true) { - AppendLog("No serial port selected. Please choose a port before connecting."); // User guidance when no selection exists. - MessageBox.Show("Please select a serial port before connecting.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal dialog prevents accidental action. - return; // Abort connect flow. + AppendLogBoth("Python process is already running."); + return; } - if (_protocol != null) + if (!ValidatePythonPaths()) { - if (string.Equals(_protocol.port.Device.PortName, selectedPort.PortName, StringComparison.OrdinalIgnoreCase)) - { - AppendLogBoth($"Port {selectedPort.DisplayName} is already open. Ignoring duplicate connect request."); // Avoid reopening same port. - MessageBox.Show($"{selectedPort.DisplayName} is already open.", "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify user. - return; // Exit without reopening. - } - - AppendLogBoth($"A different port ({_protocol.port.Device.PortName}) is currently open. Closing it before opening {selectedPort.DisplayName}..."); // Explain why we close first. - await DisconnectAsync(); // Close current protocol instance to free COM port handle. + return; } - var selectedDescription = _selectedDeviceDescription ?? selectedPort.DisplayName; // Build friendly text for status lines. - - AppendLogBoth($"Attempting to open {selectedDescription} with serial settings: 4800 baud, 8 data bits, parity None, stop bits Two."); // Describe UART config so readers learn standard serial settings. - AppendDebugLog("Serial connection will set TX low (idle) after open via Break and DTR."); // Note initial electrical state. + var selectedPort = _selectedDevice?.PortName ?? string.Empty; + if (string.IsNullOrWhiteSpace(selectedPort)) + { + AppendLog("No serial port selected. Please choose a port before connecting."); + MessageBox.Show("Please select a serial port before connecting.", "Python Process", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } try { - await Task.Run(() => _protocol = new M18Protocol(selectedPort, AppendRawSerialLog)); // Instantiate protocol off-UI thread; constructor opens serial handle and drives TX idle. - ApplyProtocolLoggingPreferences(); // Sync checkbox states into protocol PrintTx/PrintRx and hook log delegates. - AppendLogBoth($"{selectedDescription} opened successfully."); // Confirm connection to user. - UpdateConnectionUi(true); // Toggle button enabled states to reflect connected status. + UpdatePythonPathsFromSettings(); + AppendLogBoth($"Starting m18.py using {_settings.PythonExecutablePath} on port {selectedPort}..."); + await _pythonController!.StartAsync(selectedPort); + AppendLogBoth("m18.py launched. Waiting for prompt..."); + UpdateConnectionUi(true); } catch (Exception ex) { - _protocol = null; // Ensure no dangling protocol reference if open failed. - LogError($"Failed to open {selectedDescription}.", ex); // Show error details. - UpdateConnectionUi(false); // Re-enable connection buttons so user can retry. + AppendLogBoth($"Failed to start m18.py: {ex.Message}"); + MessageBox.Show($"Failed to start m18.py: {ex.Message}", "Python Process Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + UpdateConnectionUi(false); } } @@ -276,201 +298,235 @@ private async void btnConnect_Click(object? sender, EventArgs e) private async void btnDisconnect_Click(object? sender, EventArgs e) { LogDebugAction(FormatLogMessage("btnDisconnect pressed - requesting DisconnectAsync().")); // Timestamped debug entry. - await DisconnectAsync(); // Attempt to close the serial port and dispose protocol safely. + await DisconnectAsync(); // Attempt to close the python process safely. } /// - /// Closes the active protocol/serial port if present, optionally informing the user via - /// MessageBox. Runs on a background thread to prevent UI freezes if the driver blocks. + /// Closes the active python process if present, optionally informing the user via MessageBox. /// private async Task DisconnectAsync(bool showUserMessages = true) { - if (_protocol == null) + if (_pythonController == null || !_pythonController.IsRunning) { - var message = "Disconnect requested, but no serial port is currently open."; // Friendly explanation. + var message = "Disconnect requested, but the Python process is not running."; // Friendly explanation. AppendDebugLog(FormatLogMessage(message)); // Debug log for trace. if (showUserMessages) { AppendLog(message); // Display in primary log when requested by user (e.g., clicking Disconnect). - MessageBox.Show(message, "Serial Port", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify via modal dialog. + MessageBox.Show(message, "Python Process", MessageBoxButtons.OK, MessageBoxIcon.Information); // Notify via modal dialog. } UpdateConnectionUi(false); // Reset UI state regardless. return; // Exit early when nothing to close. } - AppendLogBoth($"Closing {_protocol.port.Device.DisplayName}..."); // Inform user which port is closing. + AppendLogBoth("Stopping Python process..."); // Inform user which process is closing. try { - await Task.Run(() => - { - if (_protocol.port.IsOpen) - { - _protocol.idle(); // Set TX to idle (safe state) before closing. - _protocol.port.Close(); // Close the underlying serial handle. - } - }); // Execute Close on background thread; sets TX idle then disposes serial handle. - AppendLogBoth($"{_protocol.port.Device.DisplayName} closed successfully."); // Confirm closure. + await _pythonController.StopAsync(TimeSpan.FromSeconds(5)); + AppendLogBoth("Python process stopped successfully."); // Confirm closure. } catch (Exception ex) { - LogError($"Error while closing {_protocol.port.Device.DisplayName}.", ex); // Report exceptions thrown during close. + LogError("Error while stopping Python.", ex); // Report exceptions thrown during close. } finally { - _protocol = null; // Drop reference to release resources and signal disconnected state. UpdateConnectionUi(false); // Re-enable Connect and refresh buttons. } } /// - /// Sets TX line to idle (low) by calling . Idle corresponds to - /// FT_SetBreakOn and FT_SetDtr(true), which on FT232 asserts BREAK (logic 0) and DTR - /// simultaneously, keeping the battery safe to connect/disconnect. + /// Requests Python to set TX line to idle (low) via m.idle(). /// private async void btnIdle_Click(object? sender, EventArgs e) { - AppendDebugLog(FormatLogMessage("btnIdle pressed - calling _protocol.Idle().")); // Trace button press. - if (!EnsureConnected()) - { - return; // Bail out if no active protocol object. - } + AppendDebugLog(FormatLogMessage("btnIdle pressed - sending m.idle().")); // Trace button press. + await SendPythonCommandAsync("m.idle()", "idle (TX low)"); + } - AppendDebugLog(FormatLogMessage("Invoking _protocol.Idle() to drive TX low.")); // Explain electrical effect. - try - { - await Task.Run(() => _protocol!.idle()); // Background call to avoid UI hiccup; idle toggles FT_SetBreakOn/FT_SetDtr. - AppendLogBoth("TX set to Idle (low). Safe to connect or disconnect battery. (See Raw Serial Log for control-line calls.)"); // Teach user about safe state. - } - catch (Exception ex) + /// + /// Requests Python to set TX line high (active) via m.high(). + /// + private async void btnActive_Click(object? sender, EventArgs e) + { + AppendDebugLog(FormatLogMessage("btnActive pressed - sending m.high().")); // Trace user action. + await SendPythonCommandAsync("m.high()", "active (TX high)"); + } + + /// + /// Initiates a comprehensive battery health report by invoking m.health() inside Python. + /// + private async void btnHealthReport_Click(object? sender, EventArgs e) + { + AppendDebugLog(FormatLogMessage("btnHealthReport pressed - sending m.health().")); // Trace user action. + await SendPythonCommandAsync("m.health()", "health report"); + } + + /// + /// Issues a reset command to the battery by invoking m.reset() within Python. + /// + private async void btnReset_Click(object? sender, EventArgs e) + { + LogDebugAction("Requesting Python reset command."); // Note action for trace. + await SendPythonCommandAsync("m.reset()", "reset"); + } + + /// + /// Copies all simple log output to the clipboard, allowing users to paste logs into emails + /// or issue reports. + /// + private void btnCopyOutput_Click(object? sender, EventArgs e) + { + LogDebugAction("Copying output via btnCopyOutput_Click()."); // Record action. + if (string.IsNullOrEmpty(rtbOutput.Text)) { - LogError("Failed to set TX to Idle.", ex); // Show error if driver throws. + AppendLogBoth("No output to copy."); // Warn when nothing to copy. + return; // Exit early to avoid placing empty text on clipboard. } + + Clipboard.SetText(rtbOutput.Text); // Use System.Windows.Forms.Clipboard to place text into OS clipboard. + AppendLogBoth("Output copied to clipboard."); // Confirm to user. } /// - /// Drives TX line high (active) using . High corresponds to - /// FT_SetBreakOff and FT_ClrDtr, emulating a charger engaging the battery's communication line. + /// Sends a command into the Python REPL and handles prompt/timeout state transitions. /// - private async void btnActive_Click(object? sender, EventArgs e) + private async Task SendPythonCommandAsync(string command, string description) { - AppendDebugLog(FormatLogMessage("btnActive pressed - calling _protocol.High().")); // Trace user action. - if (!EnsureConnected()) + if (!EnsurePythonRunning()) { - return; // Cannot change TX state without an open port. + return; } - AppendDebugLog(FormatLogMessage("Invoking _protocol.High() to drive TX high.")); // Clarify electrical behavior. + AppendLogBoth($"Sending {description} command to Python: {command}"); + SetPythonBusy(true); + try { - await Task.Run(() => _protocol!.high()); // Toggle control lines on background thread. - AppendLogBoth("TX set to Active (high). Charger simulation enabled. (See Raw Serial Log for control-line calls.)"); // Show user the state change. + var success = await _pythonController!.SendCommandAsync(command, _commandTimeout); + if (!success) + { + AppendLogBoth($"Timed out waiting for Python prompt after '{command}'. The process is still running."); + SetPythonBusy(false); + } } catch (Exception ex) { - LogError("Failed to set TX to Active (high).", ex); // Provide actionable error output. + SetPythonBusy(false); + LogError($"Failed to send command '{command}' to Python.", ex); } } /// - /// Initiates a comprehensive battery health report by invoking . - /// The method reads multiple register blocks from the battery BMS and prints human-readable - /// diagnostics to the log window. + /// Ensures the Python backend is running before dispatching commands. /// - private async void btnHealthReport_Click(object? sender, EventArgs e) + private bool EnsurePythonRunning() { - AppendDebugLog(FormatLogMessage("btnHealthReport pressed - calling _protocol.HealthReport().")); // Trace user action. - if (!EnsureConnected()) + if (_pythonController?.IsRunning == true) { - return; // Skip if no connection available. + return true; } - try + AppendLog("Python process is not running. Please connect first."); + MessageBox.Show("Start the Python process with the Connect button before sending commands.", "Python Process", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return false; + } + + /// + /// Validate configured paths and prompt the user to locate python.exe or m18.py when missing. + /// + private bool ValidatePythonPaths() + { + if (!File.Exists(_settings.ScriptPath)) { - AppendDebugLog(FormatLogMessage("Starting health report collection (mirrors m18.py health()).")); // Note parity with Python script. - var report = await Task.Run(() => + var message = $"Could not find m18.py at '{_settings.ScriptPath}'. Please locate the script."; + AppendLogBoth(message); + MessageBox.Show(message, "m18.py Missing", MessageBoxButtons.OK, MessageBoxIcon.Error); + + using var dialog = new OpenFileDialog { - // Use the existing health() method and capture its output. - // We'll redirect Console output to a string. - using (var sw = new System.IO.StringWriter()) - { - var originalOut = Console.Out; - Console.SetOut(sw); - _protocol!.health(true); // Call the health method (force_refresh: true) - Console.SetOut(originalOut); - return sw.ToString(); - } - }); // Run heavy register reads off UI thread. - AppendLog("=== Health report ==="); // Header in simple log. - foreach (var line in report.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None)) + Filter = "Python Script|m18.py;*.py|All Files|*.*", + Title = "Select m18.py", + FileName = "m18.py" + }; + + if (dialog.ShowDialog() != DialogResult.OK) { - AppendLog(line); // Preserve line breaks by appending each separately. + return false; } - AppendLog("Health report complete."); // Footer for clarity. - AppendDebugLog(FormatLogMessage("Health report appended to output.")); // Debug trace. + + _settings.ScriptPath = dialog.FileName; + _settings.Save(); + InitializePythonController(); } - catch (Exception ex) + + if (PathLooksLikeFile(_settings.PythonExecutablePath) && !File.Exists(_settings.PythonExecutablePath)) { - LogError("Health report failed.", ex); // Surface exceptions (timeout, parsing errors). + var message = $"Could not find python executable at '{_settings.PythonExecutablePath}'. Please locate python.exe."; + AppendLogBoth(message); + MessageBox.Show(message, "Python Missing", MessageBoxButtons.OK, MessageBoxIcon.Error); + + using var dialog = new OpenFileDialog + { + Filter = "Python|python.exe;python|All Files|*.*", + Title = "Select python executable", + FileName = "python.exe" + }; + + if (dialog.ShowDialog() != DialogResult.OK) + { + return false; + } + + _settings.PythonExecutablePath = dialog.FileName; + _settings.Save(); + InitializePythonController(); } + + return true; + } + + private static bool PathLooksLikeFile(string path) + { + return path.Contains(Path.DirectorySeparatorChar) || path.Contains(Path.AltDirectorySeparatorChar); } /// - /// Issues a reset command to the battery by toggling BREAK/DTR and sending the SYNC byte via - /// . This simulates a charger reset line pulsing low/high. + /// Sync controller paths with the persisted settings in case the user updated them on disk. /// - private async void btnReset_Click(object? sender, EventArgs e) + private void UpdatePythonPathsFromSettings() { - LogDebugAction("Requesting _protocol.Reset()."); // Note action for trace. - if (!EnsureConnected()) + if (_pythonController == null) { - return; // Cannot reset without open port. + InitializePythonController(); } - - try - { - AppendDebugLog("Sending reset sequence (BREAK/DTR + SYNC)."); // Explain protocol handshake. - var success = await Task.Run(() => _protocol!.reset()); // Execute reset on worker thread; toggles control lines and reads response. - AppendLogBoth(success ? "Reset command acknowledged by device." : "Reset command did not receive expected response."); // Inform user of result. - } - catch (Exception ex) + else { - LogError("Reset failed.", ex); // Show errors such as port access issues. + _pythonController.PythonExecutablePath = _settings.PythonExecutablePath; + _pythonController.ScriptPath = _settings.ScriptPath; } } /// - /// Copies all simple log output to the clipboard, allowing users to paste logs into emails - /// or issue reports. + /// Route Python stdout/stderr into the existing logs with a timestamp and error marker. /// - private void btnCopyOutput_Click(object? sender, EventArgs e) + private void AppendPythonLog(string line, bool isError) { - LogDebugAction("Copying output via btnCopyOutput_Click()."); // Record action. - if (string.IsNullOrEmpty(rtbOutput.Text)) - { - AppendLogBoth("No output to copy."); // Warn when nothing to copy. - return; // Exit early to avoid placing empty text on clipboard. - } - - Clipboard.SetText(rtbOutput.Text); // Use System.Windows.Forms.Clipboard to place text into OS clipboard. - AppendLogBoth("Output copied to clipboard."); // Confirm to user. + var tagged = isError ? $"[stderr] {line}" : line; + var formatted = FormatLogMessage(tagged); + AppendSimpleLog(formatted); + AppendDebugLog(formatted); } /// - /// Ensures there is an active connection before executing protocol operations. Shows a - /// MessageBox when not connected so the user knows to click Connect first. + /// Update UI state to reflect Python busy/idle states and disable command buttons while a + /// command is outstanding. /// - private bool EnsureConnected() + private void SetPythonBusy(bool busy) { - LogDebugAction(FormatLogMessage("Checking EnsureConnected().")); // Trace call origin. - if (_protocol != null) - { - return true; // Connection exists, safe to proceed. - } - - AppendLog("No active connection. Please connect to a serial port first."); // User-friendly guidance. - MessageBox.Show("Please connect to a serial port first.", "Connection required", MessageBoxButtons.OK, MessageBoxIcon.Warning); // Modal warning clarifies next step. - return false; // Signal caller to abort operation. + _isPythonBusy = busy; + UpdateConnectionUi(_pythonController?.IsRunning == true); } /// @@ -627,50 +683,15 @@ private void LogError(string context, Exception exception) } /// - /// Applies checkbox settings to the protocol instance so TX/RX byte logging aligns with user - /// preferences, and wires the protocol's TxLogger/RxLogger delegates to the UI log writers. + /// The legacy TX/RX log toggles remain for UI continuity; Python output is always captured to + /// comply with the requirement that no lines are dropped. /// - private void ApplyProtocolLoggingPreferences() - { - if (_protocol == null) - { - return; // Nothing to configure if no active protocol. - } - - _protocol.PRINT_TX = chkbxTXLog.Checked; // Mirror checkbox to protocol flag controlling TX byte echo. - _protocol.PRINT_RX = chkboxRxLog.Checked; // Mirror checkbox to protocol flag controlling RX byte echo. - _protocol.TxLogger = message => - { - AppendProtocolLog(message); // Route TX log messages into all log panes. - }; - _protocol.RxLogger = message => - { - AppendProtocolLog(message); // Route RX log messages into all log panes. - }; - _protocol.RawLogger = AppendRawSerialLog; // Route raw serial call traces into the dedicated tab. - } + private void chkbxTXLog_CheckedChanged(object? sender, EventArgs e) => AppendDebugLog(FormatLogMessage("TX log checkbox toggled (Python output remains enabled).")); /// - /// Updates protocol TX logging preference when the TX checkbox changes. + /// The legacy RX log toggle is informational only for the Python bridge. /// - private void chkbxTXLog_CheckedChanged(object? sender, EventArgs e) - { - if (_protocol != null) - { - _protocol.PRINT_TX = chkbxTXLog.Checked; // Immediately reflect UI change in protocol. - } - } - - /// - /// Updates protocol RX logging preference when the RX checkbox changes. - /// - private void chkboxRxLog_CheckedChanged(object? sender, EventArgs e) - { - if (_protocol != null) - { - _protocol.PRINT_RX = chkboxRxLog.Checked; // Immediately reflect UI change in protocol. - } - } + private void chkboxRxLog_CheckedChanged(object? sender, EventArgs e) => AppendDebugLog(FormatLogMessage("RX log checkbox toggled (Python output remains enabled).")); /// /// Convenience wrapper to send a debug message to the dedicated debug log pane. @@ -728,10 +749,11 @@ private void UpdateConnectionUi(bool connected) { btnConnect.Enabled = !connected; // Disable Connect when connected to prevent double opens. btnDisconnect.Enabled = connected; // Enable Disconnect to allow clean closure. - btnIdle.Enabled = connected; // Only allow TX toggling when port is open. - btnActive.Enabled = connected; // Only allow TX toggling when port is open. - btnHealthReport.Enabled = connected; // Health report requires open protocol. - btnReset.Enabled = connected; // Reset requires open protocol. + var commandsEnabled = connected && !_isPythonBusy; + btnIdle.Enabled = commandsEnabled; // Only allow TX toggling when process is ready. + btnActive.Enabled = commandsEnabled; // Only allow TX toggling when process is ready. + btnHealthReport.Enabled = commandsEnabled; // Health report requires running process. + btnReset.Enabled = commandsEnabled; // Reset requires running process. btnCopyOutput.Enabled = true; // Copy is always allowed because it is read-only. btnTestFT232.Enabled = !connected; // Prevent running FT232 test while another session holds the port. cmbBxSerialPort.Enabled = !connected; // Lock selection to avoid confusion while connected. @@ -786,28 +808,7 @@ private void button1_Click(object sender, EventArgs e) /// private void btnTestEcho_Click(object sender, EventArgs e) { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Starting raw echo test on {_protocol?.port.Device.DisplayName ?? "??"}\n"); // Timestamp test start with chosen device. - try - { - if (_protocol?.port.IsOpen != true) - { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Serial port not open. Connect first.\n"); // Warn user that port must be open. - return; // Exit early because no active serial handle exists. - } - - _protocol.port.PurgeRx(); // Clear inbound buffer to remove stale bytes before test. - - byte[] send = { 0xAA }; // Single SYNC-like byte to transmit; echoed devices should return it. - _protocol.port.WriteBytes(send); // Write to UART TX line; SerialPort shifts bits out over USB-UART bridge. - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Sent byte 0xAA.\n"); // Confirm transmission to user. - - var response = _protocol.port.ReadBytes(1); // Block up to timeout waiting for one byte on RX. - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Received byte: 0x{response[0]:X2}\n"); // Show returned byte in hex for clarity. - } - catch (Exception ex) - { - rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Exception: {ex.Message}\n"); // Capture and display any exceptions (IO errors, timeouts). - } + rtbDebugOutput.AppendText($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} - Raw echo test is not available when controlling the Python reference implementation.\n"); } } } diff --git a/PythonProcessController.cs b/PythonProcessController.cs new file mode 100644 index 0000000..10b2c30 --- /dev/null +++ b/PythonProcessController.cs @@ -0,0 +1,240 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace M18BatteryInfo +{ + /// + /// Hosts the m18.py process and provides asynchronous helpers for sending commands, capturing + /// stdout/stderr, and detecting the Python REPL prompt. The class is intentionally thin and + /// delegates all protocol behavior to the Python script. + /// + public sealed class PythonProcessController : IDisposable + { + private readonly object _syncRoot = new(); + private Process? _process; + private TaskCompletionSource? _promptTcs; + private CancellationTokenSource? _shutdownCts; + + public string PythonExecutablePath { get; set; } + public string ScriptPath { get; set; } + public bool IsRunning => _process != null && !_process.HasExited; + + public event Action? OutputReceived; + public event Action? ErrorReceived; + public event Action? PromptDetected; + public event Action? Exited; + + public PythonProcessController(string pythonExecutablePath, string scriptPath) + { + PythonExecutablePath = pythonExecutablePath; + ScriptPath = scriptPath; + } + + /// + /// Launch m18.py as a child process. Throws if the process is already running or if the + /// underlying executable/script cannot be started. + /// + public Task StartAsync(string? portArgument, CancellationToken cancellationToken = default) + { + if (IsRunning) + { + throw new InvalidOperationException("Python process is already running."); + } + + _shutdownCts?.Dispose(); + _shutdownCts = new CancellationTokenSource(); + _process?.Dispose(); + _process = null; + + var startInfo = BuildStartInfo(portArgument); + var process = new Process + { + StartInfo = startInfo, + EnableRaisingEvents = true + }; + + process.OutputDataReceived += (_, args) => + { + if (args.Data != null) + { + HandleOutputLine(args.Data); + } + }; + + process.ErrorDataReceived += (_, args) => + { + if (args.Data != null) + { + ErrorReceived?.Invoke(args.Data); + } + }; + + process.Exited += (_, _) => + { + Exited?.Invoke(process.ExitCode); + _shutdownCts?.Cancel(); + }; + + if (!process.Start()) + { + throw new InvalidOperationException("Failed to start python process."); + } + + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + _process = process; + + return Task.CompletedTask; + } + + /// + /// Send a command string to the Python REPL and wait for the next prompt. Returns false if a + /// timeout occurs; the process is left running so callers can decide how to recover. + /// + public async Task SendCommandAsync(string command, TimeSpan timeout) + { + if (!IsRunning || _process?.StandardInput == null) + { + throw new InvalidOperationException("Python process is not running."); + } + + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + lock (_syncRoot) + { + _promptTcs = tcs; + } + + await _process.StandardInput.WriteLineAsync(command); + await _process.StandardInput.FlushAsync(); + + var delayTask = Task.Delay(timeout, _shutdownCts?.Token ?? CancellationToken.None); + var completed = await Task.WhenAny(tcs.Task, delayTask); + + if (completed == tcs.Task && tcs.Task.IsCompleted) + { + return true; + } + + lock (_syncRoot) + { + if (ReferenceEquals(_promptTcs, tcs)) + { + _promptTcs = null; + } + } + + return false; + } + + /// + /// Attempt a graceful shutdown by sending exit() to stdin and waiting for the process to + /// exit. If the process does not exit within the timeout, it will be killed. + /// + public async Task StopAsync(TimeSpan timeout) + { + if (!IsRunning || _process?.StandardInput == null) + { + return; + } + + try + { + await _process.StandardInput.WriteLineAsync("exit()"); + await _process.StandardInput.FlushAsync(); + } + catch + { + // Ignore input failures; we'll fall back to kill below. + } + + var exitedTask = WaitForExitAsync(); + var completed = await Task.WhenAny(exitedTask, Task.Delay(timeout)); + + if (completed != exitedTask && IsRunning) + { + try + { + _process.Kill(true); + } + catch + { + // Swallow kill failures to avoid throwing on shutdown. + } + } + } + + public void Dispose() + { + _shutdownCts?.Cancel(); + _shutdownCts?.Dispose(); + _process?.Dispose(); + } + + private Task WaitForExitAsync() + { + if (_process == null) + { + return Task.CompletedTask; + } + + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + _process.EnableRaisingEvents = true; + _process.Exited += (_, _) => tcs.TrySetResult(true); + + if (_process.HasExited) + { + tcs.TrySetResult(true); + } + + return tcs.Task; + } + + private ProcessStartInfo BuildStartInfo(string? portArgument) + { + var workingDirectory = Path.GetDirectoryName(ScriptPath); + var arguments = $"\"{ScriptPath}\""; + if (!string.IsNullOrWhiteSpace(portArgument)) + { + arguments += $" --port {portArgument}"; + } + + return new ProcessStartInfo + { + FileName = PythonExecutablePath, + Arguments = arguments, + WorkingDirectory = string.IsNullOrWhiteSpace(workingDirectory) ? Environment.CurrentDirectory : workingDirectory, + RedirectStandardInput = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + } + + private void HandleOutputLine(string line) + { + OutputReceived?.Invoke(line); + + if (IsPrompt(line)) + { + lock (_syncRoot) + { + _promptTcs?.TrySetResult(true); + _promptTcs = null; + } + + PromptDetected?.Invoke(); + } + } + + private static bool IsPrompt(string line) + { + var trimmed = line.Trim(); + return trimmed == ">>>" || trimmed.EndsWith(">>>", StringComparison.Ordinal); + } + } +}

tGrq?PTk{` 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 literal 0 HcmV?d00001 diff --git a/obj/Debug/net10.0-windows/ref/M18BatteryInfo.dll b/obj/Debug/net10.0-windows/ref/M18BatteryInfo.dll new file mode 100644 index 0000000000000000000000000000000000000000..c38bf81312134b3b4d44d71eb58434462045c8c0 GIT binary patch literal 5632 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 + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + $(UserProfile)\.nuget\packages\ + C:\Users\Natasha\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages + PackageReference + 7.0.0 + + + + + + \ No newline at end of file diff --git a/obj/M18BatteryInfo.csproj.nuget.g.targets b/obj/M18BatteryInfo.csproj.nuget.g.targets new file mode 100644 index 0000000..35a7576 --- /dev/null +++ b/obj/M18BatteryInfo.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/obj/project.assets.json b/obj/project.assets.json new file mode 100644 index 0000000..ec7e7b5 --- /dev/null +++ b/obj/project.assets.json @@ -0,0 +1,373 @@ +{ + "version": 3, + "targets": { + "net10.0-windows7.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net10.0-windows7.0": [] + }, + "packageFolders": { + "C:\\Users\\Natasha\\.nuget\\packages\\": {}, + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "E:\\M18BatteryInfo\\M18BatteryInfo.csproj", + "projectName": "M18BatteryInfo", + "projectPath": "E:\\M18BatteryInfo\\M18BatteryInfo.csproj", + "packagesPath": "C:\\Users\\Natasha\\.nuget\\packages\\", + "outputPath": "E:\\M18BatteryInfo\\obj\\", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], + "configFilePaths": [ + "C:\\Users\\Natasha\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" + ], + "originalTargetFrameworks": [ + "net10.0-windows" + ], + "sources": { + "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net10.0-windows7.0": { + "targetAlias": "net10.0-windows", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "all" + }, + "SdkAnalysisLevel": "10.0.100" + }, + "frameworks": { + "net10.0-windows7.0": { + "targetAlias": "net10.0-windows", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + }, + "Microsoft.WindowsDesktop.App.WindowsForms": { + "privateAssets": "none" + } + }, + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\10.0.101/PortableRuntimeIdentifierGraph.json", + "packagesToPrune": { + "Microsoft.CSharp": "(,4.7.32767]", + "Microsoft.VisualBasic": "(,10.4.32767]", + "Microsoft.Win32.Primitives": "(,4.3.32767]", + "Microsoft.Win32.Registry": "(,5.0.32767]", + "Microsoft.Win32.Registry.AccessControl": "(,10.0.32767]", + "Microsoft.Win32.SystemEvents": "(,10.0.32767]", + "runtime.any.System.Collections": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.any.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.any.System.Globalization": "(,4.3.32767]", + "runtime.any.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.any.System.IO": "(,4.3.32767]", + "runtime.any.System.Reflection": "(,4.3.32767]", + "runtime.any.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.any.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.any.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.any.System.Runtime": "(,4.3.32767]", + "runtime.any.System.Runtime.Handles": "(,4.3.32767]", + "runtime.any.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.any.System.Text.Encoding": "(,4.3.32767]", + "runtime.any.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.any.System.Threading.Tasks": "(,4.3.32767]", + "runtime.any.System.Threading.Timer": "(,4.3.32767]", + "runtime.aot.System.Collections": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tools": "(,4.3.32767]", + "runtime.aot.System.Diagnostics.Tracing": "(,4.3.32767]", + "runtime.aot.System.Globalization": "(,4.3.32767]", + "runtime.aot.System.Globalization.Calendars": "(,4.3.32767]", + "runtime.aot.System.IO": "(,4.3.32767]", + "runtime.aot.System.Reflection": "(,4.3.32767]", + "runtime.aot.System.Reflection.Extensions": "(,4.3.32767]", + "runtime.aot.System.Reflection.Primitives": "(,4.3.32767]", + "runtime.aot.System.Resources.ResourceManager": "(,4.3.32767]", + "runtime.aot.System.Runtime": "(,4.3.32767]", + "runtime.aot.System.Runtime.Handles": "(,4.3.32767]", + "runtime.aot.System.Runtime.InteropServices": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding": "(,4.3.32767]", + "runtime.aot.System.Text.Encoding.Extensions": "(,4.3.32767]", + "runtime.aot.System.Threading.Tasks": "(,4.3.32767]", + "runtime.aot.System.Threading.Timer": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.debian.9-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.27-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.fedora.28-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.opensuse.42.3-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "(,4.3.32767]", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography": "(,4.3.32767]", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Http": "(,4.3.32767]", + "runtime.ubuntu.18.04-x64.runtime.native.System.Net.Security": "(,4.3.32767]", + "runtime.unix.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.unix.System.Console": "(,4.3.32767]", + "runtime.unix.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.unix.System.IO.FileSystem": "(,4.3.32767]", + "runtime.unix.System.Net.Primitives": "(,4.3.32767]", + "runtime.unix.System.Net.Sockets": "(,4.3.32767]", + "runtime.unix.System.Private.Uri": "(,4.3.32767]", + "runtime.unix.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win.Microsoft.Win32.Primitives": "(,4.3.32767]", + "runtime.win.System.Console": "(,4.3.32767]", + "runtime.win.System.Diagnostics.Debug": "(,4.3.32767]", + "runtime.win.System.IO.FileSystem": "(,4.3.32767]", + "runtime.win.System.Net.Primitives": "(,4.3.32767]", + "runtime.win.System.Net.Sockets": "(,4.3.32767]", + "runtime.win.System.Runtime.Extensions": "(,4.3.32767]", + "runtime.win10-arm-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-arm64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win10-x64-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win10-x86-aot.runtime.native.System.IO.Compression": "(,4.0.32767]", + "runtime.win7-x64.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7-x86.runtime.native.System.IO.Compression": "(,4.3.32767]", + "runtime.win7.System.Private.Uri": "(,4.3.32767]", + "runtime.win8-arm.runtime.native.System.IO.Compression": "(,4.3.32767]", + "System.AppContext": "(,4.3.32767]", + "System.Buffers": "(,5.0.32767]", + "System.CodeDom": "(,10.0.32767]", + "System.Collections": "(,4.3.32767]", + "System.Collections.Concurrent": "(,4.3.32767]", + "System.Collections.Immutable": "(,10.0.32767]", + "System.Collections.NonGeneric": "(,4.3.32767]", + "System.Collections.Specialized": "(,4.3.32767]", + "System.ComponentModel": "(,4.3.32767]", + "System.ComponentModel.Annotations": "(,4.3.32767]", + "System.ComponentModel.EventBasedAsync": "(,4.3.32767]", + "System.ComponentModel.Primitives": "(,4.3.32767]", + "System.ComponentModel.TypeConverter": "(,4.3.32767]", + "System.Configuration.ConfigurationManager": "(,10.0.32767]", + "System.Console": "(,4.3.32767]", + "System.Data.Common": "(,4.3.32767]", + "System.Data.DataSetExtensions": "(,4.4.32767]", + "System.Diagnostics.Contracts": "(,4.3.32767]", + "System.Diagnostics.Debug": "(,4.3.32767]", + "System.Diagnostics.DiagnosticSource": "(,10.0.32767]", + "System.Diagnostics.EventLog": "(,10.0.32767]", + "System.Diagnostics.FileVersionInfo": "(,4.3.32767]", + "System.Diagnostics.PerformanceCounter": "(,10.0.32767]", + "System.Diagnostics.Process": "(,4.3.32767]", + "System.Diagnostics.StackTrace": "(,4.3.32767]", + "System.Diagnostics.TextWriterTraceListener": "(,4.3.32767]", + "System.Diagnostics.Tools": "(,4.3.32767]", + "System.Diagnostics.TraceSource": "(,4.3.32767]", + "System.Diagnostics.Tracing": "(,4.3.32767]", + "System.DirectoryServices": "(,10.0.32767]", + "System.Drawing.Common": "(,10.0.32767]", + "System.Drawing.Primitives": "(,4.3.32767]", + "System.Dynamic.Runtime": "(,4.3.32767]", + "System.Formats.Asn1": "(,10.0.32767]", + "System.Formats.Nrbf": "(,10.0.32767]", + "System.Formats.Tar": "(,10.0.32767]", + "System.Globalization": "(,4.3.32767]", + "System.Globalization.Calendars": "(,4.3.32767]", + "System.Globalization.Extensions": "(,4.3.32767]", + "System.IO": "(,4.3.32767]", + "System.IO.Compression": "(,4.3.32767]", + "System.IO.Compression.ZipFile": "(,4.3.32767]", + "System.IO.FileSystem": "(,4.3.32767]", + "System.IO.FileSystem.AccessControl": "(,4.4.32767]", + "System.IO.FileSystem.DriveInfo": "(,4.3.32767]", + "System.IO.FileSystem.Primitives": "(,4.3.32767]", + "System.IO.FileSystem.Watcher": "(,4.3.32767]", + "System.IO.IsolatedStorage": "(,4.3.32767]", + "System.IO.MemoryMappedFiles": "(,4.3.32767]", + "System.IO.Packaging": "(,10.0.32767]", + "System.IO.Pipelines": "(,10.0.32767]", + "System.IO.Pipes": "(,4.3.32767]", + "System.IO.Pipes.AccessControl": "(,5.0.32767]", + "System.IO.UnmanagedMemoryStream": "(,4.3.32767]", + "System.Linq": "(,4.3.32767]", + "System.Linq.AsyncEnumerable": "(,10.0.32767]", + "System.Linq.Expressions": "(,4.3.32767]", + "System.Linq.Parallel": "(,4.3.32767]", + "System.Linq.Queryable": "(,4.3.32767]", + "System.Memory": "(,5.0.32767]", + "System.Net.Http": "(,4.3.32767]", + "System.Net.Http.Json": "(,10.0.32767]", + "System.Net.NameResolution": "(,4.3.32767]", + "System.Net.NetworkInformation": "(,4.3.32767]", + "System.Net.Ping": "(,4.3.32767]", + "System.Net.Primitives": "(,4.3.32767]", + "System.Net.Requests": "(,4.3.32767]", + "System.Net.Security": "(,4.3.32767]", + "System.Net.ServerSentEvents": "(,10.0.32767]", + "System.Net.Sockets": "(,4.3.32767]", + "System.Net.WebHeaderCollection": "(,4.3.32767]", + "System.Net.WebSockets": "(,4.3.32767]", + "System.Net.WebSockets.Client": "(,4.3.32767]", + "System.Numerics.Vectors": "(,5.0.32767]", + "System.ObjectModel": "(,4.3.32767]", + "System.Private.DataContractSerialization": "(,4.3.32767]", + "System.Private.Uri": "(,4.3.32767]", + "System.Reflection": "(,4.3.32767]", + "System.Reflection.DispatchProxy": "(,6.0.32767]", + "System.Reflection.Emit": "(,4.7.32767]", + "System.Reflection.Emit.ILGeneration": "(,4.7.32767]", + "System.Reflection.Emit.Lightweight": "(,4.7.32767]", + "System.Reflection.Extensions": "(,4.3.32767]", + "System.Reflection.Metadata": "(,10.0.32767]", + "System.Reflection.Primitives": "(,4.3.32767]", + "System.Reflection.TypeExtensions": "(,4.3.32767]", + "System.Resources.Extensions": "(,10.0.32767]", + "System.Resources.Reader": "(,4.3.32767]", + "System.Resources.ResourceManager": "(,4.3.32767]", + "System.Resources.Writer": "(,4.3.32767]", + "System.Runtime": "(,4.3.32767]", + "System.Runtime.CompilerServices.Unsafe": "(,7.0.32767]", + "System.Runtime.CompilerServices.VisualC": "(,4.3.32767]", + "System.Runtime.Extensions": "(,4.3.32767]", + "System.Runtime.Handles": "(,4.3.32767]", + "System.Runtime.InteropServices": "(,4.3.32767]", + "System.Runtime.InteropServices.RuntimeInformation": "(,4.3.32767]", + "System.Runtime.Loader": "(,4.3.32767]", + "System.Runtime.Numerics": "(,4.3.32767]", + "System.Runtime.Serialization.Formatters": "(,4.3.32767]", + "System.Runtime.Serialization.Json": "(,4.3.32767]", + "System.Runtime.Serialization.Primitives": "(,4.3.32767]", + "System.Runtime.Serialization.Xml": "(,4.3.32767]", + "System.Security.AccessControl": "(,6.0.32767]", + "System.Security.Claims": "(,4.3.32767]", + "System.Security.Cryptography.Algorithms": "(,4.3.32767]", + "System.Security.Cryptography.Cng": "(,5.0.32767]", + "System.Security.Cryptography.Csp": "(,4.3.32767]", + "System.Security.Cryptography.Encoding": "(,4.3.32767]", + "System.Security.Cryptography.OpenSsl": "(,5.0.32767]", + "System.Security.Cryptography.Pkcs": "(,10.0.32767]", + "System.Security.Cryptography.Primitives": "(,4.3.32767]", + "System.Security.Cryptography.ProtectedData": "(,10.0.32767]", + "System.Security.Cryptography.X509Certificates": "(,4.3.32767]", + "System.Security.Cryptography.Xml": "(,10.0.32767]", + "System.Security.Permissions": "(,10.0.32767]", + "System.Security.Principal": "(,4.3.32767]", + "System.Security.Principal.Windows": "(,5.0.32767]", + "System.Security.SecureString": "(,4.3.32767]", + "System.Text.Encoding": "(,4.3.32767]", + "System.Text.Encoding.CodePages": "(,10.0.32767]", + "System.Text.Encoding.Extensions": "(,4.3.32767]", + "System.Text.Encodings.Web": "(,10.0.32767]", + "System.Text.Json": "(,10.0.32767]", + "System.Text.RegularExpressions": "(,4.3.32767]", + "System.Threading": "(,4.3.32767]", + "System.Threading.AccessControl": "(,10.0.32767]", + "System.Threading.Channels": "(,10.0.32767]", + "System.Threading.Overlapped": "(,4.3.32767]", + "System.Threading.Tasks": "(,4.3.32767]", + "System.Threading.Tasks.Dataflow": "(,10.0.32767]", + "System.Threading.Tasks.Extensions": "(,5.0.32767]", + "System.Threading.Tasks.Parallel": "(,4.3.32767]", + "System.Threading.Thread": "(,4.3.32767]", + "System.Threading.ThreadPool": "(,4.3.32767]", + "System.Threading.Timer": "(,4.3.32767]", + "System.ValueTuple": "(,4.5.32767]", + "System.Windows.Extensions": "(,10.0.32767]", + "System.Xml.ReaderWriter": "(,4.3.32767]", + "System.Xml.XDocument": "(,4.3.32767]", + "System.Xml.XmlDocument": "(,4.3.32767]", + "System.Xml.XmlSerializer": "(,4.3.32767]", + "System.Xml.XPath": "(,4.3.32767]", + "System.Xml.XPath.XDocument": "(,5.0.32767]" + } + } + } + } +} \ No newline at end of file diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache new file mode 100644 index 0000000..676525e --- /dev/null +++ b/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "jRDLlfFBnmE=", + "success": true, + "projectFilePath": "E:\\M18BatteryInfo\\M18BatteryInfo.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file From 0a5d3c4d0eb780ade68cf7a694f3b2e199d7dddc Mon Sep 17 00:00:00 2001 From: KillaVolt Date: Sun, 14 Dec 2025 11:42:22 -0500 Subject: [PATCH 07/61] Populated bare C# GUI with the requisite elements to use all funcitons. --- .gitignore | 1 + .../DesignTimeBuild/.dtbcache.v2 | Bin 115252 -> 115379 bytes ...685ff634-f535-4eac-aa70-e6aa7232e97b.vsidx | Bin 107 -> 0 bytes ...a9d78f83-41c1-41e5-9ba3-44871b9ea2d8.vsidx | Bin 549340 -> 0 bytes ...b81dfdc3-818e-4d4c-bf4a-61922e61b362.vsidx | Bin 140 -> 0 bytes ...d3b49ca1-96f4-44b0-8eee-d4d8bf6b1c72.vsidx | Bin 79794 -> 0 bytes .vs/M18BatteryInfo.slnx/v18/.suo | Bin 33792 -> 35840 bytes .../v18/DocumentLayout.backup.json | 10 +- .../v18/DocumentLayout.json | 6 +- M18 copy.png | Bin 0 -> 8571 bytes M18AnalyzerMain.Designer.cs | 631 +++++++++++------- M18AnalyzerMain.cs | 10 + M18AnalyzerMain.resx | 122 ++++ M18BatteryInfo.csproj | 15 + Properties/Resources.Designer.cs | 63 ++ Properties/Resources.resx | 120 ++++ bin/Debug/net10.0-windows/M18BatteryInfo.dll | Bin 219136 -> 234496 bytes bin/Debug/net10.0-windows/M18BatteryInfo.exe | Bin 162304 -> 162304 bytes bin/Debug/net10.0-windows/M18BatteryInfo.pdb | Bin 15756 -> 17380 bytes m18gui.py => m18gui.pyw | 0 .../M18BatteryInfo.AssemblyInfo.cs | 2 +- .../M18BatteryInfo.AssemblyInfoInputs.cache | 2 +- ...BatteryInfo.Properties.Resources.resources | Bin 0 -> 180 bytes ...BatteryInfo.csproj.CoreCompileInputs.cache | 2 +- ...M18BatteryInfo.csproj.FileListAbsolute.txt | 1 + ...8BatteryInfo.csproj.GenerateResource.cache | Bin 54 -> 188 bytes obj/Debug/net10.0-windows/M18BatteryInfo.dll | Bin 219136 -> 234496 bytes .../M18BatteryInfo.frmMain.resources | Bin 200337 -> 207566 bytes obj/Debug/net10.0-windows/M18BatteryInfo.pdb | Bin 15756 -> 17380 bytes .../M18BatteryInfo.sourcelink.json | 2 +- obj/Debug/net10.0-windows/apphost.exe | Bin 162304 -> 162304 bytes .../net10.0-windows/ref/M18BatteryInfo.dll | Bin 5632 -> 6144 bytes .../net10.0-windows/refint/M18BatteryInfo.dll | Bin 5632 -> 6144 bytes 33 files changed, 755 insertions(+), 232 deletions(-) delete mode 100644 .vs/M18BatteryInfo.slnx/FileContentIndex/685ff634-f535-4eac-aa70-e6aa7232e97b.vsidx delete mode 100644 .vs/M18BatteryInfo.slnx/FileContentIndex/a9d78f83-41c1-41e5-9ba3-44871b9ea2d8.vsidx delete mode 100644 .vs/M18BatteryInfo.slnx/FileContentIndex/b81dfdc3-818e-4d4c-bf4a-61922e61b362.vsidx delete mode 100644 .vs/M18BatteryInfo.slnx/FileContentIndex/d3b49ca1-96f4-44b0-8eee-d4d8bf6b1c72.vsidx create mode 100644 M18 copy.png create mode 100644 Properties/Resources.Designer.cs create mode 100644 Properties/Resources.resx rename m18gui.py => m18gui.pyw (100%) create mode 100644 obj/Debug/net10.0-windows/M18BatteryInfo.Properties.Resources.resources diff --git a/.gitignore b/.gitignore index 1c6c50c..5fed8e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ # Python cache __pycache__/ +.vs/ \ No newline at end of file diff --git a/.vs/M18BatteryInfo.slnx/DesignTimeBuild/.dtbcache.v2 b/.vs/M18BatteryInfo.slnx/DesignTimeBuild/.dtbcache.v2 index a26ef91280d8fede41a1b113a1a053299f7a272b..a71be8a1abc0695b9d84377bb3d74cdd284b4b1c 100644 GIT binary patch delta 7944 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 KPPt%qcJ{v(GL>%t delta 7823 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 diff --git a/.vs/M18BatteryInfo.slnx/FileContentIndex/a9d78f83-41c1-41e5-9ba3-44871b9ea2d8.vsidx b/.vs/M18BatteryInfo.slnx/FileContentIndex/a9d78f83-41c1-41e5-9ba3-44871b9ea2d8.vsidx deleted file mode 100644 index e7480cfcb9ca61b8f8dfc5fb8257563184dcbcae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549340 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

q7^*PTVQ9k8 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 literal 0 HcmV?d00001 diff --git a/.vs/M18BatteryInfo.slnx/FileContentIndex/d3b49ca1-96f4-44b0-8eee-d4d8bf6b1c72.vsidx b/.vs/M18BatteryInfo.slnx/FileContentIndex/d3b49ca1-96f4-44b0-8eee-d4d8bf6b1c72.vsidx new file mode 100644 index 0000000000000000000000000000000000000000..1a8e3c30762b5a0ba8b0096e12657f2e7a68fc79 GIT binary patch literal 79794 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 yVc2| literal 0 HcmV?d00001 diff --git a/.vs/M18BatteryInfo.slnx/v18/.futdcache.v2 b/.vs/M18BatteryInfo.slnx/v18/.futdcache.v2 new file mode 100644 index 0000000000000000000000000000000000000000..527f5d9163a363c4326ccdeb803c5af737ea7025 GIT binary patch literal 104 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 E0|RzfssI20 literal 0 HcmV?d00001 diff --git a/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.backup.json b/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.backup.json new file mode 100644 index 0000000..a753a26 --- /dev/null +++ b/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.backup.json @@ -0,0 +1,36 @@ +{ + "Version": 1, + "WorkspaceRootPath": "E:\\M18BatteryInfo\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{BBB8545F-DDF7-8CBB-3AB2-FA5B47E8990F}|M18BatteryInfo.csproj|e:\\m18batteryinfo\\m18analyzermain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form", + "RelativeMoniker": "D:0:0:{BBB8545F-DDF7-8CBB-3AB2-FA5B47E8990F}|M18BatteryInfo.csproj|solutionrelative:m18analyzermain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 0, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "M18AnalyzerMain.cs [Design]", + "DocumentMoniker": "E:\\M18BatteryInfo\\M18AnalyzerMain.cs", + "RelativeDocumentMoniker": "M18AnalyzerMain.cs", + "ToolTip": "E:\\M18BatteryInfo\\M18AnalyzerMain.cs [Design]", + "RelativeToolTip": "M18AnalyzerMain.cs [Design]", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-14T01:05:32.518Z", + "EditorCaption": " [Design]" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.json b/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.json new file mode 100644 index 0000000..a753a26 --- /dev/null +++ b/.vs/M18BatteryInfo.slnx/v18/DocumentLayout.json @@ -0,0 +1,36 @@ +{ + "Version": 1, + "WorkspaceRootPath": "E:\\M18BatteryInfo\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{BBB8545F-DDF7-8CBB-3AB2-FA5B47E8990F}|M18BatteryInfo.csproj|e:\\m18batteryinfo\\m18analyzermain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form", + "RelativeMoniker": "D:0:0:{BBB8545F-DDF7-8CBB-3AB2-FA5B47E8990F}|M18BatteryInfo.csproj|solutionrelative:m18analyzermain.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}|Form" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 0, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "M18AnalyzerMain.cs [Design]", + "DocumentMoniker": "E:\\M18BatteryInfo\\M18AnalyzerMain.cs", + "RelativeDocumentMoniker": "M18AnalyzerMain.cs", + "ToolTip": "E:\\M18BatteryInfo\\M18AnalyzerMain.cs [Design]", + "RelativeToolTip": "M18AnalyzerMain.cs [Design]", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-12-14T01:05:32.518Z", + "EditorCaption": " [Design]" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/ProjectEvaluation/m18batteryinfo.metadata.v10.bin b/.vs/ProjectEvaluation/m18batteryinfo.metadata.v10.bin new file mode 100644 index 0000000000000000000000000000000000000000..6dbab171089ce93f96817ef0917a6882177db12b GIT binary patch literal 1493 zcmYLIe@vBS6n;M*(CZ71CSaPYO&ub|MNJU`1&M!f6Of5>E!v&*kDFkYCPJcuiv02? z+65Kq$6OPE0Rw|#Nx@K@S_zJ60Zsp?ShAeetoLnrzW2Mk=kA_+&v)MEJm)#*Jzt;@ zdZ!fCPm5C%#$DyQ!4mp?iLMJPzjeFEUAhDaUer6+_#a52caiOu=$TRXo}HjSltO)j z4cQwr>__zzzHaV(>+j-Gmu?Rb>OOi^ZK_G$BN6&aYug%|^d$&gNJM)jBJ&@cb9EIr zg4&$SPe?-%@pj{{ooAfvVu@RBU&)Usvz5qu@p4IVmQkSsk)CwkQM8YaOUU*U!#!-t zbHeH-7M+;Adl{8i1Mt?*`*O9dGmMyl~U*h$aA{S=q{6Jn(#W*hv@h) z9Y?^kIny+(!>N_YK!zV7$cq#!mw4D1Tx8T8l?eMaEz=C>I{uH{n`gom#1w{WgV(xj zDe5c8xJEMo)q(ufWP{h0#8*XDP2e#M-_4k3RMkkdFZNM(@|ccE=(7H|4gGP6(v*!J zQ#BOb@&B2A)C!1{uBQG7s(1imenw@&QgUbeZ&a;;Shz#gMNzaIVrE`jr|qtS_+vqZ z!LDUMDwEYfY#rz@*fQpgfrxC)O8oa{mm0*_FNLOawHP9)CSlWD;;n>ORoiaTZu=KR zy~b(lxP+Ud%UMIe|2EYe3^cYo(@f#CnV3I0KC3$IkbMEq)G5au=Cn5KO7NA~&vRJDdi&7yPmeQ)ByOmhON{te zU44gpu@B6Ot2ZHzjb`WCdVj>jw5^V^A>Qgce8;zVlKUY33<$`vNBsjgRL@D96-t-XC5XWouIv0L}3ol_n6uXyD5aFA8 zB!uTucEOV|mpZ~F;u(9Gqp{q@LB5MCEIpdj4*4%Yce{kX>JpZsueD*jFrQHR?V0*L zzCUr?g^txR6V2oV=(Uzkwsg9s*IPj<7>{2Ke`Fu1Q9R4`xxx=ut@!QTNkgG4EzBx% z5Hs`%dc)(X>Ph-f4iY+%{8Lhd=+jc?TDn$F>oa6$$v!6YlGRCFFZDU{3an{;Ug`@{ LH_+2XIc+@$uyb?` literal 0 HcmV?d00001 diff --git a/.vs/ProjectEvaluation/m18batteryinfo.projects.v10.bin b/.vs/ProjectEvaluation/m18batteryinfo.projects.v10.bin new file mode 100644 index 0000000000000000000000000000000000000000..e3ed20abb82488252113a9d0fa67e7d85ff68888 GIT binary patch literal 54936 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 Nm8Y7D74jBu{twz+msbD) literal 0 HcmV?d00001 diff --git a/M18AnalyzerMain.Designer.cs b/M18AnalyzerMain.Designer.cs new file mode 100644 index 0000000..ea382a4 --- /dev/null +++ b/M18AnalyzerMain.Designer.cs @@ -0,0 +1,905 @@ +namespace M18BatteryInfo +{ + partial class frmMain + { + ///