Extract reusable byte work panel with configurable terminal addressing
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
Shared PySide6 terminal migrated from PySetTerminal-master/pysetterminal.
|
||||
|
||||
- Standalone entry point: `python -m pysetterminal` with templates/python on PYTHONPATH.
|
||||
- SETGUI embeds `pysetterminal.panel.build_byte_page` in TMS2812 / Работа с байтом.
|
||||
- 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.
|
||||
@@ -11,3 +11,78 @@ Shared PySide6 terminal migrated from PySetTerminal-master/pysetterminal.
|
||||
- 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.
|
||||
|
||||
Reference in New Issue
Block a user