42 lines
1.6 KiB
Python
42 lines
1.6 KiB
Python
from os import scandir
|
|
from pyleds.lib.Litsimaja import Litsimaja
|
|
from pyleds.lib.Program import Program
|
|
|
|
|
|
def resolve(namespace: str, class_name: str):
|
|
m_name = 'program.' + namespace + '.' + class_name
|
|
module = __import__(m_name, None, None, [m_name])
|
|
return module
|
|
|
|
|
|
def run(namespace: str, class_name: str, lm: Litsimaja, logger, args: [] = None):
|
|
module = resolve(namespace, class_name)
|
|
loaded_class = getattr(module, class_name)
|
|
program = loaded_class(lm)
|
|
logger.info('Loaded "' + module.name() + '" from ' + namespace + '.' + class_name + ' with args: ' + repr(args))
|
|
lm.add_loop(program.get_loop())
|
|
lm.set_selected_program(namespace + '.' + class_name)
|
|
program.run(args)
|
|
|
|
|
|
def list_all(grouped: bool = False):
|
|
all_programs = []
|
|
programs = []
|
|
for entry in scandir('program'):
|
|
if entry.is_dir():
|
|
for file in scandir('program/' + entry.name):
|
|
if file.is_file() and file.name[-3:] == '.py':
|
|
try:
|
|
program_name = file.name[: -3]
|
|
module = resolve(entry.name, program_name)
|
|
if hasattr(module, program_name) and issubclass(getattr(module, program_name), Program):
|
|
programs.append({'prg': entry.name + '.' + program_name, 'name': module.name()})
|
|
except AttributeError:
|
|
continue
|
|
if grouped and len(programs) > 0:
|
|
all_programs.append({'group': entry.name, 'programs': programs})
|
|
programs = []
|
|
if not grouped:
|
|
all_programs = programs
|
|
return all_programs
|