edouard@3501: #!/usr/bin/env python
edouard@3501: # -*- coding: utf-8 -*-
edouard@3501: 
edouard@3501: import os
edouard@3501: import posixpath
edouard@3501: import sys
edouard@3548: import time
edouard@3618: 
edouard@3501: from functools import wraps
edouard@3618: from importlib import import_module
edouard@3501: 
edouard@3501: import click
edouard@3501: 
edouard@3501: class CLISession(object):
edouard@3501:     def __init__(self, **kwargs):
edouard@3501:         self.__dict__.update(kwargs)
edouard@3501:         self.controller = None
edouard@3501: 
edouard@3501: pass_session = click.make_pass_decorator(CLISession)
edouard@3501: 
edouard@3501: 
edouard@3501: @click.group(chain=True)
edouard@3501: @click.option(
edouard@3501:     "--project-home",
edouard@3501:     envvar="PROJECT_HOME",
edouard@3501:     default=".",
edouard@3501:     metavar="PATH",
edouard@3501:     help="Changes the project folder location.",
edouard@3501: )
edouard@3501: @click.option(
edouard@3501:     "--config",
edouard@3501:     nargs=2,
edouard@3501:     multiple=True,
edouard@3501:     metavar="KEY VALUE",
edouard@3501:     help="Overrides a config key/value pair.",
edouard@3501: )
edouard@3501: @click.option(
edouard@3501:     "--keep", "-k", is_flag=True,
edouard@3501:     help="Keep local runtime, do not kill it after executing commands.",
edouard@3501: )
edouard@3501: @click.option("--verbose", "-v", is_flag=True, help="Enables verbose mode.")
edouard@3501: @click.option(
edouard@3501:     "--buildpath", "-b", help="Where to store files created during build."
edouard@3501: )
edouard@3501: @click.option(
edouard@3501:     "--uri", "-u", help="URI to reach remote PLC."
edouard@3501: )
edouard@3501: @click.version_option("0.1")
edouard@3501: @click.pass_context
edouard@3501: def cli(ctx, **kwargs):
edouard@3501:     """Beremiz CLI manipulates beremiz projects and runtimes. """
edouard@3501: 
edouard@3501:     ctx.obj = CLISession(**kwargs)
edouard@3501: 
edouard@3501: def ensure_controller(func):
edouard@3501:     @wraps(func)
edouard@3501:     def func_wrapper(session, *args, **kwargs):
edouard@3501:         if session.controller is None:
edouard@3501:             session.controller = import_module("CLIController").CLIController(session)
edouard@3501:         ret = func(session, *args, **kwargs)
edouard@3501:         return ret
edouard@3501: 
edouard@3501:     return func_wrapper
edouard@3501: 
edouard@3501: @cli.command()
edouard@3501: @click.option(
edouard@3501:     "--target", "-t", help="Target system triplet."
edouard@3501: )
edouard@3501: @pass_session
edouard@3501: @ensure_controller
edouard@3501: def build(session, target):
edouard@3501:     """Builds project. """
edouard@3501:     def processor():
edouard@3501:         return session.controller.build_project(target)
edouard@3501:     return processor
edouard@3501: 
edouard@3501: @cli.command()
edouard@3501: @pass_session
edouard@3501: @ensure_controller
edouard@3501: def transfer(session):
edouard@3501:     """Transfer program to PLC runtim."""
edouard@3501:     def processor():
edouard@3501:         return session.controller.transfer_project()
edouard@3501:     return processor
edouard@3501: 
edouard@3501: @cli.command()
edouard@3501: @pass_session
edouard@3501: @ensure_controller
edouard@3501: def run(session):
edouard@3501:     """Run program already present in PLC. """
edouard@3501:     def processor():
edouard@3501:         return session.controller.run_project()
edouard@3501:     return processor
edouard@3501: 
kinsamanka@3775: @cli.command()
kinsamanka@3775: @pass_session
kinsamanka@3775: @ensure_controller
kinsamanka@3775: def stop(session):
kinsamanka@3775:     """Stop program running in PLC. """
kinsamanka@3775:     def processor():
kinsamanka@3775:         return session.controller.stop_project()
kinsamanka@3775:     return processor
kinsamanka@3775: 
edouard@3501: 
kinsamanka@3754: @cli.result_callback()
edouard@3501: @pass_session
edouard@3501: def process_pipeline(session, processors, **kwargs):
edouard@3501:     ret = 0
edouard@3501:     for processor in processors:
edouard@3501:         ret = processor()
edouard@3501:         if ret != 0:
edouard@3501:             if len(processors) > 1 :
edouard@3501:                 click.echo("Command sequence aborted")
edouard@3501:             break
edouard@3501: 
edouard@3548:     if session.keep:
edouard@3548:         click.echo("Press Ctrl+C to quit")
edouard@3618:         try:
edouard@3618:             while True:
edouard@3812:                 session.controller.UpdateMethodsFromPLCStatus()
edouard@3812:                 time.sleep(0.5)
edouard@3618:         except KeyboardInterrupt:
edouard@3618:             pass
edouard@3618: 
edouard@3618:     session.controller.finish()
edouard@3548: 
edouard@3501:     return ret
edouard@3501: 
edouard@3501: if __name__ == '__main__':
edouard@3501:     cli()
edouard@3501: