.. _module-pw_console: ---------- pw_console ---------- The Pigweed Console provides a Python repl (read eval print loop) using `ptpython `_ and a log message viewer in a single-window terminal based interface. It is designed to be a replacement for `IPython's embed() `_ function. ========== Motivation ========== ``pw_console`` is the complete solution for interacting with hardware devices using :ref:`module-pw_rpc` over a :ref:`module-pw_hdlc` transport. The repl allows interactive RPC sending while the log viewer provides immediate feedback on device status. ===== Usage ===== ``pw console`` is invoked by calling the ``embed()`` function in your own Python script. .. automodule:: pw_console.console_app :members: embed :undoc-members: :show-inheritance: ========================= Implementation and Design ========================= Detains on Pigweed Console internals follows. Thread and Event Loop Design ---------------------------- Here's a diagram showing how ``pw_console`` threads and asyncio tasks are organized. .. mermaid:: flowchart LR classDef eventLoop fill:#e3f2fd,stroke:#90caf9,stroke-width:1px; classDef thread fill:#fffde7,stroke:#ffeb3b,stroke-width:1px; classDef plugin fill:#fce4ec,stroke:#f06292,stroke-width:1px; classDef builtinFeature fill:#e0f2f1,stroke:#4db6ac,stroke-width:1px; %% Subgraphs are drawn in reverse order. subgraph pluginThread [Plugin Thread 1] subgraph pluginLoop [Plugin Event Loop 1] toolbarFunc-->|"Refresh
UI Tokens"| toolbarFunc toolbarFunc[Toolbar Update Function] end class pluginLoop eventLoop; end class pluginThread thread; subgraph pluginThread2 [Plugin Thread 2] subgraph pluginLoop2 [Plugin Event Loop 2] paneFunc-->|"Refresh
UI Tokens"| paneFunc paneFunc[Pane Update Function] end class pluginLoop2 eventLoop; end class pluginThread2 thread; subgraph replThread [Repl Thread] subgraph replLoop [Repl Event Loop] Task1 -->|Finished| Task2 -->|Cancel with Ctrl-C| Task3 end class replLoop eventLoop; end class replThread thread; subgraph main [Main Thread] subgraph mainLoop [User Interface Event Loop] log[[Log Pane]] repl[[Python Repl]] pluginToolbar([User Toolbar Plugin]) pluginPane([User Pane Plugin]) class log,repl builtinFeature; class pluginToolbar,pluginPane plugin; end class mainLoop eventLoop; end class main thread; repl-.->|Run Code| replThread pluginToolbar-.->|Register Plugin| pluginThread pluginPane-.->|Register Plugin| pluginThread2