Module lib.shell.shelltask
Class defining a minimalist shell, directly executable on the board. We modify directories, list, delete, move files, edit files …
Expand source code
# Distributed under Pycameresp License
# Copyright (c) 2023 Remi BERTHOLET
# pylint:disable=too-many-lines
# pylint:disable=consider-using-f-string
# pylint:disable=unspecified-encoding
""" Class defining a minimalist shell, directly executable on the board.
We modify directories, list, delete, move files, edit files ...
"""
# pylint:disable=wrong-import-position
import sys
sys.path.append("lib")
sys.path.append("simul")
import tools.logger
import tools.filesystem
import tools.terminal
import tools.watchdog
import tools.console
import tools.tasking
import tools.strings
if tools.filesystem.ismicropython():
SHELL_KEY = 0x1A
else:
SHELL_KEY = 0x20
class Shell:
""" Shell """
@staticmethod
def start():
""" Start shell task """
tools.tasking.Tasks.loop.create_task(Shell.task())
@staticmethod
async def task():
""" Asynchronous shell task """
import uasyncio
tools.console.Console.print("\n\x1B[1m\x1B[48;5;226m\x1B[38;5;70mPress %s to start shell\x1b[m"%tools.strings.key_to_string(SHELL_KEY))
if tools.filesystem.ismicropython():
polling1 = 1
polling2 = 0.01
else:
polling1 = 0.1
polling2 = 0.5
while 1:
# If key pressed
if tools.terminal.kbhit(polling2):
character = tools.terminal.getch()[0]
# Check if character is correct to start shell
if character == chr(SHELL_KEY):
tools.tasking.Tasks.suspend()
# Wait all server suspended
await tools.tasking.Tasks.wait_all_suspended()
# Extend watch dog duration
tools.watchdog.WatchDog.start(tools.watchdog.LONG_WATCH_DOG*2)
# Get the size of screen
tools.terminal.refresh_screen_size()
# Start shell
print("")
tools.logger.syslog("<"*10+" Enter shell " +">"*10)
print("Use 'exit' to restart server or 'quit' to get python prompt")
from shell.commands import commands
commands(throw=True)
print("")
tools.logger.syslog("<"*10+" Exit shell " +">"*10)
del sys.modules["shell.commands"]
# Resume watch dog duration
tools.watchdog.WatchDog.start(tools.watchdog.SHORT_WATCH_DOG)
# Resume server
tools.tasking.Tasks.resume()
else:
await uasyncio.sleep(polling1)
Classes
class Shell-
Shell
Expand source code
class Shell: """ Shell """ @staticmethod def start(): """ Start shell task """ tools.tasking.Tasks.loop.create_task(Shell.task()) @staticmethod async def task(): """ Asynchronous shell task """ import uasyncio tools.console.Console.print("\n\x1B[1m\x1B[48;5;226m\x1B[38;5;70mPress %s to start shell\x1b[m"%tools.strings.key_to_string(SHELL_KEY)) if tools.filesystem.ismicropython(): polling1 = 1 polling2 = 0.01 else: polling1 = 0.1 polling2 = 0.5 while 1: # If key pressed if tools.terminal.kbhit(polling2): character = tools.terminal.getch()[0] # Check if character is correct to start shell if character == chr(SHELL_KEY): tools.tasking.Tasks.suspend() # Wait all server suspended await tools.tasking.Tasks.wait_all_suspended() # Extend watch dog duration tools.watchdog.WatchDog.start(tools.watchdog.LONG_WATCH_DOG*2) # Get the size of screen tools.terminal.refresh_screen_size() # Start shell print("") tools.logger.syslog("<"*10+" Enter shell " +">"*10) print("Use 'exit' to restart server or 'quit' to get python prompt") from shell.commands import commands commands(throw=True) print("") tools.logger.syslog("<"*10+" Exit shell " +">"*10) del sys.modules["shell.commands"] # Resume watch dog duration tools.watchdog.WatchDog.start(tools.watchdog.SHORT_WATCH_DOG) # Resume server tools.tasking.Tasks.resume() else: await uasyncio.sleep(polling1)Static methods
def start()-
Start shell task
Expand source code
@staticmethod def start(): """ Start shell task """ tools.tasking.Tasks.loop.create_task(Shell.task()) async def task()-
Asynchronous shell task
Expand source code
@staticmethod async def task(): """ Asynchronous shell task """ import uasyncio tools.console.Console.print("\n\x1B[1m\x1B[48;5;226m\x1B[38;5;70mPress %s to start shell\x1b[m"%tools.strings.key_to_string(SHELL_KEY)) if tools.filesystem.ismicropython(): polling1 = 1 polling2 = 0.01 else: polling1 = 0.1 polling2 = 0.5 while 1: # If key pressed if tools.terminal.kbhit(polling2): character = tools.terminal.getch()[0] # Check if character is correct to start shell if character == chr(SHELL_KEY): tools.tasking.Tasks.suspend() # Wait all server suspended await tools.tasking.Tasks.wait_all_suspended() # Extend watch dog duration tools.watchdog.WatchDog.start(tools.watchdog.LONG_WATCH_DOG*2) # Get the size of screen tools.terminal.refresh_screen_size() # Start shell print("") tools.logger.syslog("<"*10+" Enter shell " +">"*10) print("Use 'exit' to restart server or 'quit' to get python prompt") from shell.commands import commands commands(throw=True) print("") tools.logger.syslog("<"*10+" Exit shell " +">"*10) del sys.modules["shell.commands"] # Resume watch dog duration tools.watchdog.WatchDog.start(tools.watchdog.SHORT_WATCH_DOG) # Resume server tools.tasking.Tasks.resume() else: await uasyncio.sleep(polling1)