# PySetTerminal Shared PySide6 terminal migrated from PySetTerminal-master/pysetterminal. - Standalone entry point: `python -m pysetterminal` with templates/python on PYTHONPATH. - SETGUI embeds `pysetterminal.panel.ByteWorkPanel` in TMS2812 / Работа с байтом. - Serial bus, macro editor, asynchronous macro execution with cancellation, PEEK/POKE and RAW console are included. - COM transport uses QtSerialPort. Embedded operations reuse the TMS2812 connection and configured controller address. - PEEK/POKE packet construction and response validation use the existing protocan native C ABI, with 16-bit TMS2812 values. - Macro files are stored under the application data directory, outside the source checkout. - The standalone launcher uses PySide6; SETGUI Windows 7 uses its existing PySide2/Qt5 compatibility layer. Frozen SETGUI builds bundle Python and Qt. Pyserial is not required. A native set-protocol runtime remains required. `build_and_clean.py` is the migrated original standalone packaging helper. ## Подключение «Работы с байтом» в другую вкладку Вся панель — самостоятельный `ByteWorkPanel`: чтение и запись слова, HEX/BIN, операции с шиной, макросы, PEEK/POKE и RAW. Она не требует `Tms2812Tab`. Данные — 16 бит, адрес слова — 32 бита; протокол по умолчанию — TMS2812. ```python from pysetterminal.panel import ByteWorkPanel from pysetterminal.rawprotocol import RawProtocol # Сохраните протокол в объекте, который владеет соединением. self.byte_protocol = RawProtocol() self.byte_page = ByteWorkPanel( self.byte_protocol, device_address=lambda: self.controller_address.value(), ) self.tabs.addTab(self.byte_page, "Работа с байтом") # Подключение выполняется явным действием пользователя. # self.byte_protocol.connect("COM3", 57600) # Перед закрытием соединения: # self.byte_page.stop() # self.byte_protocol.disconnect() ``` В существующую компоновку панель добавляется через `layout.addWidget(self.byte_page)`. Фабрика `build_byte_page(protocol, **options)` возвращает такой же виджет. Параметры: - `protocol` — существующий протокол с методами `request_async`, `cancel_async`, `peek`, `poke`, `send_raw`, `receive_raw`. Асинхронный ответ передаётся в `callback(success, result)`: для чтения `result["value"]`, для записи `result["raw"]`; ошибки — строкой. Синхронные `peek/poke` возвращают `(success, result)`; чтение дополнительно содержит `result["raw_response"]["raw"]` для журнала. - `device_address` — адрес контроллера или функция, возвращающая текущий адрес; используется всеми блоками панели. Адрес фиксируется на время записи с проверкой и выполнения макроса. - `macros_file` — отдельный JSON-файл макросов для конкретной вкладки. По умолчанию сохраняется существующее хранилище приложения. - `default_address`, `hint`, `initial_status` — начальный адрес и тексты. - `start_word(write, address, value)` — необязательный обработчик для вкладок, у которых уже есть очередь памяти. При чтении `value=None`. Обработчик отвечает за чтение, проверку записи и остановку своей очереди. Без `start_word` панель выполняет асинхронный запрос, а запись подтверждает последующим чтением. Пример подключения к существующей очереди: ```python self.byte_page = ByteWorkPanel( self.protocol, device_address=lambda: self.address.value(), start_word=lambda write, address, value: self.start_memory( write=write, address=address, value=value), macros_file=self.storage_dir / "byte_macros.json", ) self.tabs.addTab(self.byte_page, "Работа с байтом") # В обработчике ответа очереди: self.byte_page.set_read_value(address, value) self.byte_page.set_status("Чтение завершено") ``` `set_status(text)` показывает внешний статус. Сигнал `status_changed(str)` передаёт ошибки ввода и результаты операций панели владельцу. `stop()` отменяет её асинхронный обмен и макрос; внешнюю очередь памяти останавливает владелец вкладки. Каждому независимому соединению нужен собственный протокол. Если вкладки используют одно соединение, владелец транспорта должен запрещать одновременные запросы и маршрутизировать ответы. В SETGUI это делает существующая очередь TMS2812.