SimSo Web 开发者手册(中文版)

来源:互联网 发布:风险矩阵法的作用 编辑:程序博客网 时间:2024/06/07 06:51



1  序言
         本文档是一个非详尽的开发人员文档,其目标是帮助未来的simso-web应用程序维护人员开始使用代码。 本文档是在假设开发人员使用UNIX环境的前提下编写的,假定开发人员对Javascript和Angular UI已经有基本的了解。

2  入门
        Simso web是一个基于simso的图形界面。 它作为一个完整的客户端应用程序(无需服务器端)使用JavaScript编写,并使用PypyJS(Pypy的JavaScript实现)来运行Python以执行simso。 用于前端开发的主要框架/工具是Angular JS和Bootstrap。

2.1  获取代码
        代码在这里可以在github上找到:https://github.com/MaximeCheramy/simsoweb。 由于simso-web嵌入了它自己的simso版本,它被包含在一个git子模块的形式中。 要设置您的工作副本,您必须运行以下命令:

                                                                                                                                                                                                           

git clone https://github.com/MaximeCheramy/simso-web.git
cd simso-web/submodules/simso
git submodule init
git submodule update

———————————————————————————————————————————————————


2.2  架构
2.2.1 概述

          该项目由三个主要组成部分组成:

          •HTML / Javascript / AngularUI前端

          •Simso:用于运行模拟的组件。

          •Simso和Javascript应用程序之间的Python Bridge(桥梁)


    图1:Simso web的主要组件


2.2.2 用例

        为了理解代码的结构,我们将介绍一个典型的simso-web用例:

       1.用户在配置视图中设置配置。

       2.用户点击“运行”按钮

                •使用配置视图中的参数(文件js / controlers / config-controler.py)创建一个python配置脚本。这个脚本然后被执行并创建一个python“配置”对象。

               •桥的“run()”方法被称为(py / simso-bridge.py)并启动Simso仿真。

       一旦完成,一个包含模拟结果的变量就可以被javascript应用程序读取。

       3.用户点击“结果”按钮:现在显示结果。一些python函数(在py / simso-bridge.py中)用于聚合结果。

2.2.3 HTML / Javascript / Angular UI前端

        前端基于MVC架构。

         •Model:模型文件包含在js / services /目录中。

           他们被称为“服务”。主要服务有:

                   {conf-service.js:包含所有与模拟配置相关的数据。这些数据将被用来生成配置脚本。

                   {pypy-service.js:包含所有与虚拟机初始化相关的代码。

         •视图:视图文件包含在部分/文件夹中。他们是HTML文件。有两个主要观点:

                   {配置视图是用户可以设置模拟参数的地方。

                   {结果视图是用户一旦运行就可以看到模拟结果的地方。

         •控制者:控制者位于js / controlers /目录中。

2.2.4  Python桥梁
         该桥梁负责将配置传递给simso,收集结果并将其传回给javascript。 brige的源文件位于py /文件夹中。


图2:Python桥梁


2.2.5  Simso

        Simso作为子模块集成在simso-web中。 Simso的文档可以在这里找到:http://homepages.laas.fr/mcheramy/simso/doc。

3  进入代码
        本节的目标是解释代码中棘手或重要的部分,并解释一些设计选择。

3.1  python虚拟机

        从这篇文章开始,Pypy.js没有任何形式的文档。 在这一节中会对使用的函数做一些说明。

3.1.1 设置

        通过

3.1.2  运行一个python脚本

        首先,确保你有权访问pypyService。 执行Python代码的代码应该如下所示:

                                                                                                                                

pypyService.vm.exec(code).then(function() {
    // Your code
}, logScriptErrors);

————————————————————————————————

        其中,logScriptErrors是config-controlers.js中定义的函数。 这个函数会在对象作为参数包含“名称”、“消息”和“跟踪”时被调用。

3.1.3 管理import

        由于pypy.js将会在用户的浏览器中运行自己的python环境,所以捆绑所有需要的模块是非常重要的。 所有捆绑模块的列表可以在lib/modules/index.json中找到。

3.1.4 将变量传入和传出python

        我们使用在js / app.js中定义的JavaScript全局变量“python”来传递来自python的变量。 将变量从javascript传递给python很简单:

                                                                                           

python["variable_name"] = myObject;

—————————————————

但是,在某些情况下,将变量从python传递到javascript可能会有点棘手。

                                                                                            

import js
...
js.globals["python"]["variable_name"] = myObject;

——————————————————————————————

         棘手的部分来自myObject需要是pypy.js可以转换为JavaScript对象的事实。传递复杂对象最简单的方法就是通过Hash散列表(就像你在javascript中那样)。

3.2将Simso集成在配置中
3.2.1调度程序自动检测机制

        Simso-web具有用于自动检测所有simso调度程序的功能,它们自己需要的参数,任务和/或处理器。 在Simso的代码中,每个调度程序都佩带“调度程序”装饰器(在simso / schedulers / init .py中声明)。 这里是一个例子:

                                                                                                                                

@scheduler("simso.schedulers.CC_EDF",
            required_proc_fields = [
              { ’name’: ’speed’, ’type’: ’float’, ’default’: ’1.0’ }
            ]
  )

————————————————————————————————

由于执行所有这些装饰器需要手动导入所有的调度器在pypy.js(这不一定是我们想要的),simso-web不直接使用它们。 而是读取py / simso-schedulers.py中的所有调度程序描述。 执行shell脚本tools / schedulers_discovery.sh时会自动生成该文件。

当添加/删除调度程序时,调度程序discovery.sh脚本必须再次执行!

ETM检测所有的执行时间模型(ETM)必须在py / simso-etm.py中声明。 这里是一个ETM声明的例子:

                                                                                                                     

{

               ’name’ : ’acet’,
               ’display_name’ : ’ACET’,
               ’required_fields’ : [],
               ’required_proc_fields’ : [],
               ’required_task_fields’ : [
                          {
                            ’name’ : ’acet’,
                            ’display_name’ : ’acet (ms)’,
                            ’type’ : ’float’,
                            ’default’ : ’0’

                          },
                          {
                            ’name’ : ’et_stddev’,
                            ’display_name’ : ’ET std dev (ms)’,
                            ’type’ : ’float’,
                            ’default’ : ’0’

                          }
                ]

},

——————————————————————

3.3 控制器层次结构


图3:配置控制器作用域层次结构



图4:结果控制器作用域层次结构