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桥梁图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:结果控制器作用域层次结构