Files
templates/python/pysetterminal

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.

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 панель выполняет асинхронный запрос, а запись подтверждает последующим чтением. Пример подключения к существующей очереди:

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.