1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_console-internals: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard WorkerInternal Design 4*61c4878aSAndroid Build Coastguard Worker=============== 5*61c4878aSAndroid Build Coastguard Worker.. pigweed-module-subpage:: 6*61c4878aSAndroid Build Coastguard Worker :name: pw_console 7*61c4878aSAndroid Build Coastguard Worker 8*61c4878aSAndroid Build Coastguard WorkerThreads and Event Loops 9*61c4878aSAndroid Build Coastguard Worker----------------------- 10*61c4878aSAndroid Build Coastguard Worker 11*61c4878aSAndroid Build Coastguard WorkerIn `ptpython`_ and `IPython`_ all user repl code is run in the foreground. This 12*61c4878aSAndroid Build Coastguard Workerallows interrupts like ``Ctrl-C`` and functions like ``print()`` and 13*61c4878aSAndroid Build Coastguard Worker``time.sleep()`` to work as expected. Pigweed's Console doesn't use this 14*61c4878aSAndroid Build Coastguard Workerapproach as it would hide or freeze the `prompt_toolkit`_ user interface while 15*61c4878aSAndroid Build Coastguard Workerrunning repl code. 16*61c4878aSAndroid Build Coastguard Worker 17*61c4878aSAndroid Build Coastguard WorkerTo get around this issue all user repl code is run in a dedicated thread with 18*61c4878aSAndroid Build Coastguard Workerstdout and stderr patched to capture output. This lets the user interface stay 19*61c4878aSAndroid Build Coastguard Workerresponsive and new log messages to continue to be displayed. 20*61c4878aSAndroid Build Coastguard Worker 21*61c4878aSAndroid Build Coastguard WorkerHere's a diagram showing how ``pw_console`` threads and `asyncio`_ tasks are 22*61c4878aSAndroid Build Coastguard Workerorganized. 23*61c4878aSAndroid Build Coastguard Worker 24*61c4878aSAndroid Build Coastguard Worker.. mermaid:: 25*61c4878aSAndroid Build Coastguard Worker 26*61c4878aSAndroid Build Coastguard Worker flowchart LR 27*61c4878aSAndroid Build Coastguard Worker classDef eventLoop fill:#e3f2fd,stroke:#90caf9,stroke-width:1px; 28*61c4878aSAndroid Build Coastguard Worker classDef thread fill:#fffde7,stroke:#ffeb3b,stroke-width:1px; 29*61c4878aSAndroid Build Coastguard Worker classDef plugin fill:#fce4ec,stroke:#f06292,stroke-width:1px; 30*61c4878aSAndroid Build Coastguard Worker classDef builtinFeature fill:#e0f2f1,stroke:#4db6ac,stroke-width:1px; 31*61c4878aSAndroid Build Coastguard Worker 32*61c4878aSAndroid Build Coastguard Worker %% Subgraphs are drawn in reverse order. 33*61c4878aSAndroid Build Coastguard Worker 34*61c4878aSAndroid Build Coastguard Worker subgraph pluginThread [Plugin Thread 1] 35*61c4878aSAndroid Build Coastguard Worker subgraph pluginLoop [Plugin Event Loop 1] 36*61c4878aSAndroid Build Coastguard Worker toolbarFunc-->|"Refresh<br/>UI Tokens"| toolbarFunc 37*61c4878aSAndroid Build Coastguard Worker toolbarFunc[Toolbar Update Function] 38*61c4878aSAndroid Build Coastguard Worker end 39*61c4878aSAndroid Build Coastguard Worker class pluginLoop eventLoop; 40*61c4878aSAndroid Build Coastguard Worker end 41*61c4878aSAndroid Build Coastguard Worker class pluginThread thread; 42*61c4878aSAndroid Build Coastguard Worker 43*61c4878aSAndroid Build Coastguard Worker subgraph pluginThread2 [Plugin Thread 2] 44*61c4878aSAndroid Build Coastguard Worker subgraph pluginLoop2 [Plugin Event Loop 2] 45*61c4878aSAndroid Build Coastguard Worker paneFunc-->|"Refresh<br/>UI Tokens"| paneFunc 46*61c4878aSAndroid Build Coastguard Worker paneFunc[Pane Update Function] 47*61c4878aSAndroid Build Coastguard Worker end 48*61c4878aSAndroid Build Coastguard Worker class pluginLoop2 eventLoop; 49*61c4878aSAndroid Build Coastguard Worker end 50*61c4878aSAndroid Build Coastguard Worker class pluginThread2 thread; 51*61c4878aSAndroid Build Coastguard Worker 52*61c4878aSAndroid Build Coastguard Worker subgraph replThread [Repl Thread] 53*61c4878aSAndroid Build Coastguard Worker subgraph replLoop [Repl Event Loop] 54*61c4878aSAndroid Build Coastguard Worker Task1 -->|Finished| Task2 -->|Cancel with Ctrl-C| Task3 55*61c4878aSAndroid Build Coastguard Worker end 56*61c4878aSAndroid Build Coastguard Worker class replLoop eventLoop; 57*61c4878aSAndroid Build Coastguard Worker end 58*61c4878aSAndroid Build Coastguard Worker class replThread thread; 59*61c4878aSAndroid Build Coastguard Worker 60*61c4878aSAndroid Build Coastguard Worker subgraph main [Main Thread] 61*61c4878aSAndroid Build Coastguard Worker subgraph mainLoop [User Interface Event Loop] 62*61c4878aSAndroid Build Coastguard Worker log[[Log Pane]] 63*61c4878aSAndroid Build Coastguard Worker repl[[Python Repl]] 64*61c4878aSAndroid Build Coastguard Worker pluginToolbar([User Toolbar Plugin]) 65*61c4878aSAndroid Build Coastguard Worker pluginPane([User Pane Plugin]) 66*61c4878aSAndroid Build Coastguard Worker class log,repl builtinFeature; 67*61c4878aSAndroid Build Coastguard Worker class pluginToolbar,pluginPane plugin; 68*61c4878aSAndroid Build Coastguard Worker end 69*61c4878aSAndroid Build Coastguard Worker class mainLoop eventLoop; 70*61c4878aSAndroid Build Coastguard Worker end 71*61c4878aSAndroid Build Coastguard Worker class main thread; 72*61c4878aSAndroid Build Coastguard Worker 73*61c4878aSAndroid Build Coastguard Worker repl-.->|Run Code| replThread 74*61c4878aSAndroid Build Coastguard Worker pluginToolbar-.->|Register Plugin| pluginThread 75*61c4878aSAndroid Build Coastguard Worker pluginPane-.->|Register Plugin| pluginThread2 76*61c4878aSAndroid Build Coastguard Worker 77*61c4878aSAndroid Build Coastguard Worker.. _IPython: https://ipython.readthedocs.io/ 78*61c4878aSAndroid Build Coastguard Worker.. _prompt_toolkit: https://python-prompt-toolkit.readthedocs.io/ 79*61c4878aSAndroid Build Coastguard Worker.. _asyncio: https://docs.python.org/3/library/asyncio.html 80*61c4878aSAndroid Build Coastguard Worker.. _ptpython: https://github.com/prompt-toolkit/ptpython/ 81