├── static
├── .gitkeep
├── logo.png
├── favicon.ico
├── manifest.json
└── site.css
├── .eslintignore
├── backend
├── requirements.txt
├── string_parser.py
└── main.py
├── screenshot.png
├── config
├── prod.env.js
├── dev.env.js
└── index.js
├── client
├── static
│ ├── logo.png
│ ├── favicon.ico
│ ├── manifest.json
│ ├── css
│ │ ├── app.1ea883ee04aca0021ec1707aac027547.css
│ │ └── app.1ea883ee04aca0021ec1707aac027547.css.map
│ ├── js
│ │ ├── manifest.2ae2e69a05c33dfc65f8.js
│ │ ├── manifest.2ae2e69a05c33dfc65f8.js.map
│ │ ├── app.c64710128364b0205755.js
│ │ └── app.c64710128364b0205755.js.map
│ └── site.css
└── index.html
├── .editorconfig
├── .gitignore
├── .babelrc
├── .postcssrc.js
├── orac-control-web.service
├── index.html
├── src
├── main.js
├── components
│ ├── OracParameterControl.vue
│ ├── Menu.vue
│ ├── Navigation.vue
│ └── PieControl.vue
├── App.vue
└── store
│ └── index.js
├── .eslintrc.js
├── install-orac-control-web.sh
├── package.json
└── README.md
/static/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | /build/
2 | /config/
3 | /dist/
4 | /*.js
5 |
--------------------------------------------------------------------------------
/backend/requirements.txt:
--------------------------------------------------------------------------------
1 | python-socketio
2 | asyncio
3 | python-osc
4 | aiohttp
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dsedleckas/orac-control-web/HEAD/screenshot.png
--------------------------------------------------------------------------------
/static/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dsedleckas/orac-control-web/HEAD/static/logo.png
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | module.exports = {
3 | NODE_ENV: '"production"'
4 | }
5 |
--------------------------------------------------------------------------------
/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dsedleckas/orac-control-web/HEAD/static/favicon.ico
--------------------------------------------------------------------------------
/client/static/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dsedleckas/orac-control-web/HEAD/client/static/logo.png
--------------------------------------------------------------------------------
/client/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dsedleckas/orac-control-web/HEAD/client/static/favicon.ico
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | const merge = require('webpack-merge')
3 | const prodEnv = require('./prod.env')
4 |
5 | module.exports = merge(prodEnv, {
6 | NODE_ENV: '"development"',
7 | WS_URL: '"http://192.168.1.155:8080/"'
8 | })
9 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules/
3 | /dist/
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | __pycache__/
9 |
10 | # Editor directories and files
11 | .idea
12 | .vscode
13 | *.suo
14 | *.ntvs*
15 | *.njsproj
16 | *.sln
17 |
--------------------------------------------------------------------------------
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", {
4 | "modules": false,
5 | "targets": {
6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
7 | }
8 | }],
9 | "stage-2"
10 | ],
11 | "plugins": ["transform-vue-jsx", "transform-runtime"]
12 | }
13 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | "postcss-import": {},
6 | "postcss-url": {},
7 | // to edit target browsers: use "browserslist" field in package.json
8 | "autoprefixer": {}
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/orac-control-web.service:
--------------------------------------------------------------------------------
1 | [Unit]
2 | Description=Orac Control Service
3 | After=mec.service
4 | Requires=mec.service
5 |
6 | [Service]
7 | User=patch
8 | Environment=HOME=/home/patch
9 | Restart=always
10 | WorkingDirectory=/usr/local/orac-control-web/backend
11 | ExecStart=/usr/bin/python3 ./main.py
12 |
13 | [Install]
14 | WantedBy=multi-user.target
--------------------------------------------------------------------------------
/static/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Orac Control",
3 | "short_name": "Orac",
4 | "description": "Web Client for Orac",
5 | "icons": [
6 | {
7 | "src": "/static/logo.png",
8 | "sizes": "512x512"
9 | }
10 | ],
11 | "display": "fullscreen",
12 | "start_url": "/",
13 | "orientation": "landscape"
14 | }
--------------------------------------------------------------------------------
/client/static/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Orac Control",
3 | "short_name": "Orac",
4 | "description": "Web Client for Orac",
5 | "icons": [
6 | {
7 | "src": "/static/logo.png",
8 | "sizes": "512x512"
9 | }
10 | ],
11 | "display": "fullscreen",
12 | "start_url": "/",
13 | "orientation": "landscape"
14 | }
--------------------------------------------------------------------------------
/backend/string_parser.py:
--------------------------------------------------------------------------------
1 | from pythonosc.parsing import osc_types
2 |
3 | original_get_string = osc_types.get_string
4 | def get_string(dgram: bytes, start_index: int):
5 | offset = 0
6 | while dgram[start_index + offset] != 0:
7 | offset += 1
8 | if offset == 0:
9 | return '', 0
10 | return original_get_string(dgram, start_index)
11 |
12 | def support_empty_strings():
13 | osc_types.get_string = get_string
--------------------------------------------------------------------------------
/client/static/css/app.1ea883ee04aca0021ec1707aac027547.css:
--------------------------------------------------------------------------------
1 | .modal-mask[data-v-7723e048]{position:fixed;z-index:9998;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.5);display:table;transition:opacity .3s ease}.modal-wrapper[data-v-7723e048]{display:table-cell;vertical-align:middle}.red[data-v-7723e048]{color:red}svg[data-v-39423519]{max-height:300px}path[data-v-39423519]{stroke-width:0px;opacity:1}text[data-v-39423519]{pointer-events:none}
2 | /*# sourceMappingURL=app.1ea883ee04aca0021ec1707aac027547.css.map */
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Orac Client
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | // The Vue build version to load with the `import` command
2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
3 | import Vue from 'vue'
4 | import App from './App'
5 | import VueSocketIO from 'vue-socket.io'
6 | import store from './store/index'
7 |
8 | Vue.use(new VueSocketIO({
9 | debug: false,
10 | // config/dev.env.js
11 | connection: (process.env.WS_URL) ? process.env.WS_URL : 'http://' + window.location.host,
12 | vuex: {
13 | store,
14 | actionPrefix: 'socket_',
15 | mutationPrefix: 'SOCKET_'
16 | }
17 | }))
18 |
19 | Vue.config.productionTip = true
20 |
21 | /* eslint-disable no-new */
22 | new Vue({
23 | el: '#app',
24 | store,
25 | render: h => h(App)
26 | })
27 |
--------------------------------------------------------------------------------
/client/index.html:
--------------------------------------------------------------------------------
1 | Orac Client
--------------------------------------------------------------------------------
/client/static/js/manifest.2ae2e69a05c33dfc65f8.js:
--------------------------------------------------------------------------------
1 | !function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,p,a=0,l=[];a
2 |
3 |
4 |
{{ desc }}
5 |
{{ value }}
6 |
7 |
8 |
9 |
10 |
11 |
32 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | // https://eslint.org/docs/user-guide/configuring
2 |
3 | module.exports = {
4 | root: true,
5 | parserOptions: {
6 | parser: 'babel-eslint'
7 | },
8 | env: {
9 | browser: true,
10 | },
11 | extends: [
12 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
13 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
14 | 'plugin:vue/essential',
15 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md
16 | 'standard'
17 | ],
18 | // required to lint *.vue files
19 | plugins: [
20 | 'vue'
21 | ],
22 | // add your custom rules here
23 | rules: {
24 | // allow async-await
25 | 'generator-star-spacing': 'off',
26 | // allow debugger during development
27 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/client/static/css/app.1ea883ee04aca0021ec1707aac027547.css.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["app.1ea883ee04aca0021ec1707aac027547.css"],"names":[],"mappings":"AACA,6BACE,eAAgB,AAChB,aAAc,AACd,MAAO,AACP,OAAQ,AACR,WAAY,AACZ,YAAa,AACb,gCAAqC,AACrC,cAAe,AAEf,2BAA8B,CAC/B,AACD,gCACE,mBAAoB,AACpB,qBAAuB,CACxB,AACD,sBACE,SAAe,CAChB,AAED,qBACE,gBAAiB,CAClB,AACD,sBACE,iBAAkB,AAClB,SAAW,CACZ,AACD,sBACE,mBAAqB,CACtB","file":"app.1ea883ee04aca0021ec1707aac027547.css","sourcesContent":["\n.modal-mask[data-v-7723e048] {\r\n position: fixed;\r\n z-index: 9998;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n display: table;\r\n -webkit-transition: opacity 0.3s ease;\r\n transition: opacity 0.3s ease;\n}\n.modal-wrapper[data-v-7723e048] {\r\n display: table-cell;\r\n vertical-align: middle;\n}\n.red[data-v-7723e048] {\r\n color: #ff0000;\n}\r\n\nsvg[data-v-39423519] {\r\n max-height:300px;\n}\npath[data-v-39423519] {\r\n stroke-width: 0px;\r\n opacity: 1;\n}\ntext[data-v-39423519] {\r\n pointer-events: none;\n}\r\n"]}
--------------------------------------------------------------------------------
/install-orac-control-web.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | REPO_NAME=orac-control-web
4 | REPO_URL=https://github.com/dsedleckas/$REPO_NAME.git
5 | APP_DIR=/usr/local/orac-control-web
6 |
7 | cd $HOME
8 |
9 | pwd
10 |
11 | if [ -z `which git` ]; then
12 | echo "Installing git..."
13 | sudo apt-get update
14 | sudo apt-get install -y git
15 | fi
16 |
17 | if [ ! -d "$REPO_NAME" ]; then
18 | echo Cloning repository from $REPO_URL
19 | git clone $REPO_URL
20 | cd $REPO_NAME
21 | else
22 | echo Updating $REPO_NAME repository with latest stuff
23 | cd $REPO_NAME
24 | git pull
25 | fi
26 |
27 | echo "Setup started..."
28 | pip3 install -r backend/requirements.txt
29 | sudo rm -rf $APP_DIR
30 | sudo mkdir $APP_DIR
31 | sudo mkdir $APP_DIR/client
32 | sudo mkdir $APP_DIR/backend
33 | sudo cp -R client/. $APP_DIR/client
34 | sudo cp -R backend/. $APP_DIR/backend
35 | sudo install -v -m 644 orac-control-web.service /usr/lib/systemd/system/
36 | sudo systemctl daemon-reload
37 | sudo systemctl enable orac-control-web.service
38 | sudo systemctl start orac-control-web.service
39 |
40 | echo "Done! Thank you!"
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
12 |
![]()
13 |
14 |
Looking for MEC Service...
15 |
Looking for OSC Service...
16 |
17 |
18 |
19 |
20 |
39 |
--------------------------------------------------------------------------------
/src/components/Menu.vue:
--------------------------------------------------------------------------------
1 |
2 |
16 |
17 |
18 |
58 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | 'use strict'
2 | // Template version: 1.3.1
3 | // see http://vuejs-templates.github.io/webpack for documentation.
4 |
5 | const path = require('path')
6 |
7 | module.exports = {
8 | dev: {
9 |
10 | // Paths
11 | assetsSubDirectory: 'static',
12 | assetsPublicPath: '/',
13 | proxyTable: {},
14 |
15 | // Various Dev Server settings
16 | host: 'localhost', // can be overwritten by process.env.HOST
17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
18 | autoOpenBrowser: false,
19 | errorOverlay: true,
20 | notifyOnErrors: true,
21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
22 |
23 | // Use Eslint Loader?
24 | // If true, your code will be linted during bundling and
25 | // linting errors and warnings will be shown in the console.
26 | useEslint: true,
27 | // If true, eslint errors and warnings will also be shown in the error overlay
28 | // in the browser.
29 | showEslintErrorsInOverlay: false,
30 |
31 | /**
32 | * Source Maps
33 | */
34 |
35 | // https://webpack.js.org/configuration/devtool/#development
36 | devtool: 'cheap-module-eval-source-map',
37 |
38 | // If you have problems debugging vue-files in devtools,
39 | // set this to false - it *may* help
40 | // https://vue-loader.vuejs.org/en/options.html#cachebusting
41 | cacheBusting: true,
42 |
43 | cssSourceMap: true
44 | },
45 |
46 | build: {
47 | // Template for index.html
48 | index: path.resolve(__dirname, '../dist/index.html'),
49 |
50 | // Paths
51 | assetsRoot: path.resolve(__dirname, '../dist'),
52 | assetsSubDirectory: 'static',
53 | assetsPublicPath: '/',
54 |
55 | /**
56 | * Source Maps
57 | */
58 |
59 | productionSourceMap: true,
60 | // https://webpack.js.org/configuration/devtool/#production
61 | devtool: '#source-map',
62 |
63 | // Gzip off by default as many popular static hosts such as
64 | // Surge or Netlify already gzip all static assets for you.
65 | // Before setting to `true`, make sure to:
66 | // npm install --save-dev compression-webpack-plugin
67 | productionGzip: false,
68 | productionGzipExtensions: ['js', 'css'],
69 |
70 | // Run the build command with an extra argument to
71 | // View the bundle analyzer report after build finishes:
72 | // `npm run build --report`
73 | // Set to `true` or `false` to always turn it on or off
74 | bundleAnalyzerReport: process.env.npm_config_report
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "orac-control-web",
3 | "version": "1.0.0",
4 | "description": "Client for ORAC synth",
5 | "author": "dsedleckas ",
6 | "private": true,
7 | "scripts": {
8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
9 | "lint": "eslint --ext .js,.vue src",
10 | "build": "node build/build.js"
11 | },
12 | "dependencies": {
13 | "es6-promise": "^4.2.8",
14 | "vue": "^2.5.2",
15 | "vue-socket.io": "^3.0.7",
16 | "vuex": "^3.1.1"
17 | },
18 | "devDependencies": {
19 | "autoprefixer": "^7.1.2",
20 | "babel-core": "^6.22.1",
21 | "babel-eslint": "^8.2.1",
22 | "babel-helper-vue-jsx-merge-props": "^2.0.3",
23 | "babel-loader": "^7.1.1",
24 | "babel-plugin-syntax-jsx": "^6.18.0",
25 | "babel-plugin-transform-runtime": "^6.22.0",
26 | "babel-plugin-transform-vue-jsx": "^3.5.0",
27 | "babel-preset-env": "^1.3.2",
28 | "babel-preset-stage-2": "^6.22.0",
29 | "chalk": "^2.0.1",
30 | "copy-webpack-plugin": "^4.0.1",
31 | "css-loader": "^0.28.0",
32 | "d3": "^5.9.2",
33 | "eslint": "^4.15.0",
34 | "eslint-config-standard": "^10.2.1",
35 | "eslint-friendly-formatter": "^3.0.0",
36 | "eslint-loader": "^1.7.1",
37 | "eslint-plugin-import": "^2.7.0",
38 | "eslint-plugin-node": "^5.2.0",
39 | "eslint-plugin-promise": "^3.4.0",
40 | "eslint-plugin-standard": "^3.0.1",
41 | "eslint-plugin-vue": "^4.0.0",
42 | "extract-text-webpack-plugin": "^3.0.0",
43 | "file-loader": "^1.1.4",
44 | "friendly-errors-webpack-plugin": "^1.6.1",
45 | "html-webpack-plugin": "^2.30.1",
46 | "node-notifier": "^5.1.2",
47 | "node-sass": "^4.12.0",
48 | "optimize-css-assets-webpack-plugin": "^3.2.0",
49 | "ora": "^1.2.0",
50 | "portfinder": "^1.0.13",
51 | "postcss-import": "^11.0.0",
52 | "postcss-loader": "^2.0.8",
53 | "postcss-url": "^7.2.1",
54 | "rimraf": "^2.6.0",
55 | "sass-loader": "^7.1.0",
56 | "semver": "^5.3.0",
57 | "shelljs": "^0.7.6",
58 | "style-loader": "^0.23.1",
59 | "uglifyjs-webpack-plugin": "^1.1.1",
60 | "url-loader": "^0.5.8",
61 | "vue-loader": "^13.3.0",
62 | "vue-style-loader": "^3.0.1",
63 | "vue-template-compiler": "^2.5.2",
64 | "webpack": "^3.6.0",
65 | "webpack-bundle-analyzer": "^2.9.0",
66 | "webpack-dev-server": "^2.9.1",
67 | "webpack-merge": "^4.1.0"
68 | },
69 | "engines": {
70 | "node": ">= 6.0.0",
71 | "npm": ">= 3.0.0"
72 | },
73 | "browserslist": [
74 | "> 1%",
75 | "last 2 versions",
76 | "not ie <= 8"
77 | ]
78 | }
79 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # orac-control-web
2 |
3 | Web client for the ORAC [synth](https://github.com/TheTechnobear/Orac) to be run on the Raspberry PI. Installation tested and designed to work out of the box on the [Patchbox OS](https://blokas.io/patchbox-os/). Web client also includes UDP OSC <-> Socket.IO bridge and simple static file server. It runs on the rPi, next to the ORAC, so all you need is a web browser essentially. Application is designed to be mobile-friendly.
4 |
5 | 
6 |
7 | ## Install instructions
8 | Currently tested on [**Patchbox OS**](https://blokas.io/patchbox-os/). Application depends on `git`, `python3` (3.5, should work with 3.6, not sure about 3.7) and `pip3`. Install script will check if `git` is installed, but you need to manually verify that `python3` and `pip3` are available (`pip3 --version` and `python3 --version`). Install the missing dependencies through your package manager, e.g. `sudo apt-get install python3-pip`.
9 |
10 | SSH to your Pi and run:
11 | ```sh
12 | curl https://raw.githubusercontent.com/dsedleckas/orac-control-web/master/install-orac-control-web.sh | sh
13 | ```
14 | Open `http://:8080`
15 | If you're stuck on loading screen, make sure ORAC module is activated and `mec.service` is running. If not, run `patchbox module config`. Any suggestions/comments/bug reports are welcome here, or on the Blokas [community board](https://community.blokas.io/t/web-client-for-orac-2-0/1186).
16 |
17 | ### Save as an app on your phone
18 | **If your Pi always has the same Ip address** (e.g. you're connecting to Pi's WiFi network and accessing `http://172.24.1.1:8080`), you could save the page as an app to your home screen. For example, on Chrome, once opened, click tripple dots and Add to Home screen. Launching application this way will open it in landscape mode and fullscreen instantly.
19 |
20 | ## Menu navigation
21 | Interface should be familiar to any ORAC user before - page/module navigation at the top and parameter controlls below. One change that was made involves menu navigation - _Activate_ button was dropped - instead just tap/click on the wanted item. To scroll the menu (i.e. see more items in the list), you still have to use up/down buttons.
22 |
23 | ## Development notes
24 |
25 | ### Web client
26 | ``` bash
27 | # install client dependencies
28 | npm install
29 |
30 | # serve with hot reload at localhost:8080
31 | npm run dev
32 |
33 | # build for production with minification
34 | npm run build
35 | # For production use copy `./dist` contents to `./client`
36 | ```
37 |
38 | ### Server OSC <-> Socket.IO
39 | ```bash
40 | cd ./backend
41 | pip3 install -r requirements.txt
42 | python3 main.py
43 | ```
44 |
--------------------------------------------------------------------------------
/static/site.css:
--------------------------------------------------------------------------------
1 | /*@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');*/
2 |
3 | html, body {
4 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
5 | }
6 |
7 | .spinner-border{
8 | width: 1rem;
9 | height: 1rem;
10 | }
11 |
12 | .noselect {
13 | -webkit-touch-callout: none; /* iOS Safari */
14 | -webkit-user-select: none; /* Safari */
15 | -khtml-user-select: none; /* Konqueror HTML */
16 | -moz-user-select: none; /* Firefox */
17 | -ms-user-select: none; /* Internet Explorer/Edge */
18 | user-select: none; /* Non-prefixed version, currently
19 | supported by Chrome and Opera */
20 | }
21 |
22 | .modal-container .modal-content,
23 | .modal-container .modal-backdrop {
24 | height: 0;
25 | width: 0;
26 | opacity: 0;
27 | visibility: hidden;
28 | overflow: hidden;
29 | cursor: pointer;
30 | transition: opacity 0.2s ease-in;
31 | }
32 |
33 | .modal-container #modal-toggle {
34 | display: none;
35 | }
36 |
37 | .modal-container #modal-toggle.active ~ .modal-backdrop, .modal-container #modal-toggle:checked ~ .modal-backdrop {
38 | background-color: rgba(0, 0, 0, 0.6);
39 | width: 100vw;
40 | height: 100vh;
41 | position: fixed;
42 | left: 0;
43 | top: 0;
44 | z-index: 9;
45 | visibility: visible;
46 | opacity: 1;
47 | transition: opacity 0.2s ease-in;
48 | }
49 |
50 | .modal-container #modal-toggle.active ~ .modal-content, .modal-container #modal-toggle:checked ~ .modal-content {
51 | opacity: 1;
52 | width: 300px;
53 | height: 301px;
54 | position: fixed;
55 | left: calc(50% - 150px);
56 | top: calc(50% - 150px);
57 | z-index: 999;
58 | pointer-events: auto;
59 | cursor: auto;
60 | visibility: visible;
61 | box-shadow: 0 3px 7px rgba(0, 0, 0, 0.6);
62 | }
63 |
64 | .btn:focus, .btn:active:focus, .btn.active:focus,
65 | .btn.focus, .btn:active.focus, .btn.active.focus {
66 | outline: none;
67 | box-shadow: none;
68 | }
69 |
70 | .container-centered {
71 | display: grid;
72 | justify-content: center;
73 | align-items: center;
74 | height: 100vh;
75 | }
76 |
77 | .param-block {
78 | display: inline-block;
79 | position: relative;
80 | overflow: hidden;
81 | padding: 5px;
82 | }
83 |
84 | .param-text {
85 | white-space: nowrap;
86 | overflow: hidden;
87 | text-overflow: ellipsis;
88 | display: block;
89 | }
90 |
91 | .params-container {
92 | margin: 0 auto;
93 | }
94 |
95 | @media (min-width: 576px) {
96 | .params-container .param-block {
97 | width: 25%;
98 | }
99 | }
100 |
101 | @media (max-width: 575px) {
102 | .params-container .param-block {
103 | width: 50%;
104 | }
105 | }
106 |
107 | .logo {
108 | height: 180px;
109 | margin: 0 auto;
110 | }
111 |
112 | .btn-arrow {
113 | max-width: 60px;
114 | }
115 |
116 | .list-group-item.active {
117 | z-index: 2;
118 | color: #fff;
119 | background-color: #ff0000;
120 | border-color: #ff0000;
121 | }
--------------------------------------------------------------------------------
/client/static/site.css:
--------------------------------------------------------------------------------
1 | /*@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');*/
2 |
3 | html, body {
4 | font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
5 | }
6 |
7 | .spinner-border{
8 | width: 1rem;
9 | height: 1rem;
10 | }
11 |
12 | .noselect {
13 | -webkit-touch-callout: none; /* iOS Safari */
14 | -webkit-user-select: none; /* Safari */
15 | -khtml-user-select: none; /* Konqueror HTML */
16 | -moz-user-select: none; /* Firefox */
17 | -ms-user-select: none; /* Internet Explorer/Edge */
18 | user-select: none; /* Non-prefixed version, currently
19 | supported by Chrome and Opera */
20 | }
21 |
22 | .modal-container .modal-content,
23 | .modal-container .modal-backdrop {
24 | height: 0;
25 | width: 0;
26 | opacity: 0;
27 | visibility: hidden;
28 | overflow: hidden;
29 | cursor: pointer;
30 | transition: opacity 0.2s ease-in;
31 | }
32 |
33 | .modal-container #modal-toggle {
34 | display: none;
35 | }
36 |
37 | .modal-container #modal-toggle.active ~ .modal-backdrop, .modal-container #modal-toggle:checked ~ .modal-backdrop {
38 | background-color: rgba(0, 0, 0, 0.6);
39 | width: 100vw;
40 | height: 100vh;
41 | position: fixed;
42 | left: 0;
43 | top: 0;
44 | z-index: 9;
45 | visibility: visible;
46 | opacity: 1;
47 | transition: opacity 0.2s ease-in;
48 | }
49 |
50 | .modal-container #modal-toggle.active ~ .modal-content, .modal-container #modal-toggle:checked ~ .modal-content {
51 | opacity: 1;
52 | width: 300px;
53 | height: 301px;
54 | position: fixed;
55 | left: calc(50% - 150px);
56 | top: calc(50% - 150px);
57 | z-index: 999;
58 | pointer-events: auto;
59 | cursor: auto;
60 | visibility: visible;
61 | box-shadow: 0 3px 7px rgba(0, 0, 0, 0.6);
62 | }
63 |
64 | .btn:focus, .btn:active:focus, .btn.active:focus,
65 | .btn.focus, .btn:active.focus, .btn.active.focus {
66 | outline: none;
67 | box-shadow: none;
68 | }
69 |
70 | .container-centered {
71 | display: grid;
72 | justify-content: center;
73 | align-items: center;
74 | height: 100vh;
75 | }
76 |
77 | .param-block {
78 | display: inline-block;
79 | position: relative;
80 | overflow: hidden;
81 | padding: 5px;
82 | }
83 |
84 | .param-text {
85 | white-space: nowrap;
86 | overflow: hidden;
87 | text-overflow: ellipsis;
88 | display: block;
89 | }
90 |
91 | .params-container {
92 | margin: 0 auto;
93 | }
94 |
95 | @media (min-width: 576px) {
96 | .params-container .param-block {
97 | width: 25%;
98 | }
99 | }
100 |
101 | @media (max-width: 575px) {
102 | .params-container .param-block {
103 | width: 50%;
104 | }
105 | }
106 |
107 | .logo {
108 | height: 180px;
109 | margin: 0 auto;
110 | }
111 |
112 | .btn-arrow {
113 | max-width: 60px;
114 | }
115 |
116 | .list-group-item.active {
117 | z-index: 2;
118 | color: #fff;
119 | background-color: #ff0000;
120 | border-color: #ff0000;
121 | }
--------------------------------------------------------------------------------
/src/components/Navigation.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
11 |
12 |
13 |
14 |
15 |
20 |
21 |
22 |
23 |
29 |
30 |
31 |
49 |
50 |
51 |
52 |
83 |
84 |
106 |
--------------------------------------------------------------------------------
/src/components/PieControl.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 |
13 |
130 |
131 |
132 |
144 |
--------------------------------------------------------------------------------
/client/static/js/manifest.2ae2e69a05c33dfc65f8.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["webpack:///webpack/bootstrap de65cce2c1059071b0d8"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","2","exports","module","l","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAT,EAGAE,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACAhB,OAAAmB,eAAAT,EAAAM,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAX,EAAAiB,EAAA,SAAAZ,GACA,IAAAM,EAAAN,KAAAa,WACA,WAA2B,OAAAb,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAO,EAAAC,GAAsD,OAAA1B,OAAAC,UAAAC,eAAAC,KAAAsB,EAAAC,IAGtDpB,EAAAqB,EAAA,IAGArB,EAAAsB,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"static/js/manifest.2ae2e69a05c33dfc65f8.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap de65cce2c1059071b0d8"],"sourceRoot":""}
--------------------------------------------------------------------------------
/backend/main.py:
--------------------------------------------------------------------------------
1 | from aiohttp import web
2 | import socketio
3 | import asyncio
4 |
5 | from pythonosc.udp_client import SimpleUDPClient
6 | from pythonosc.osc_server import AsyncIOOSCUDPServer
7 | from pythonosc.dispatcher import Dispatcher
8 | import string_parser
9 |
10 | # Monkey-patch for osc empty string support
11 | string_parser.support_empty_strings()
12 |
13 | ORAC_IP = '127.0.0.1'
14 | ORAC_PORT = 6100
15 | ORAC_LISTEN_PORT = 6009
16 | SOCKET_LISTEN_IP = '0.0.0.0'
17 | SOCKET_PORT = 8080
18 |
19 | #
20 | # Async event loop
21 | #
22 |
23 | loop = asyncio.get_event_loop()
24 |
25 | #
26 | # ORAC UDP client
27 | #
28 |
29 | oracClient = SimpleUDPClient(ORAC_IP, ORAC_PORT) # Create client
30 |
31 | #
32 | # ORAC UDP listener
33 | #
34 |
35 |
36 | def oracMessageHandler(address, *args):
37 | asyncio.ensure_future(sio.emit(address[1:], args))
38 |
39 | dispatcher = Dispatcher()
40 | dispatcher.set_default_handler(oracMessageHandler)
41 |
42 | oracServerTransport = None
43 |
44 | async def runUdpServer():
45 | print('Starting OSC UDP server')
46 | server = AsyncIOOSCUDPServer(
47 | (SOCKET_LISTEN_IP, ORAC_LISTEN_PORT), dispatcher, loop)
48 | global oracServerTransport
49 | oracServerTransport, protocol = await server.create_serve_endpoint()
50 | print('OSC UDP server started')
51 |
52 |
53 | async def stopUdpServer():
54 | print('Stopping OSC UDP server')
55 | oracServerTransport.close() # Clean up serve endpoint
56 | print('OSC UDP server stopped')
57 |
58 | #
59 | # Socket IO server
60 | #
61 |
62 | sio = socketio.AsyncServer(async_mode='aiohttp')
63 | app = web.Application()
64 | sio.attach(app)
65 |
66 |
67 | async def root_handler(request):
68 | return web.HTTPFound('/index.html')
69 |
70 | app.router.add_route('GET', '/', root_handler)
71 | app.router.add_static('/', path='../client/')
72 |
73 |
74 | @sio.event
75 | def connect(sid, environ):
76 | print('connect ', sid)
77 |
78 |
79 | @sio.on('OracConnect')
80 | async def OracConnect(sid):
81 | print('OracConnect!')
82 | oracClient.send_message('/Connect', ORAC_LISTEN_PORT)
83 | await sio.emit('ORAC_CONNECTED', True)
84 |
85 |
86 | @sio.on('/NavNext')
87 | async def NavNext(sid, data):
88 | oracClient.send_message('/NavNext', 1)
89 |
90 |
91 | @sio.on('/NavPrev')
92 | async def NavPrev(sid, data):
93 | oracClient.send_message('/NavPrev', 1)
94 |
95 |
96 | @sio.on('/NavActivate')
97 | async def NavActivate(sid, data):
98 | oracClient.send_message('/NavActivate', 1)
99 |
100 |
101 | @sio.on('/PagePrev')
102 | async def PagePrev(sid, data):
103 | oracClient.send_message('/PagePrev', 1)
104 |
105 |
106 | @sio.on('/PageNext')
107 | async def PageNext(sid, data):
108 | oracClient.send_message('/PageNext', 1)
109 |
110 |
111 | @sio.on('/ModuleNext')
112 | async def ModuleNext(sid, data):
113 | oracClient.send_message('/ModuleNext', 1)
114 |
115 |
116 | @sio.on('/ModulePrev')
117 | async def ModulePrev(sid, data):
118 | oracClient.send_message('/ModulePrev', 1)
119 |
120 |
121 | @sio.on('/P1Ctrl')
122 | async def ModuleNext(sid, data):
123 | oracClient.send_message('/P1Ctrl', data)
124 |
125 |
126 | @sio.on('/P2Ctrl')
127 | async def P2Ctrl(sid, data):
128 | oracClient.send_message('/P2Ctrl', data)
129 |
130 |
131 | @sio.on('/P3Ctrl')
132 | async def P3Ctrl(sid, data):
133 | oracClient.send_message('/P3Ctrl', data)
134 |
135 |
136 | @sio.on('/P4Ctrl')
137 | async def P4Ctrl(sid, data):
138 | oracClient.send_message('/P4Ctrl', data)
139 |
140 |
141 | @sio.on('/P5Ctrl')
142 | async def P5Ctrl(sid, data):
143 | oracClient.send_message('/P5Ctrl', data)
144 |
145 |
146 | @sio.on('/P6Ctrl')
147 | async def P6Ctrl(sid, data):
148 | oracClient.send_message('/P6Ctrl', data)
149 |
150 |
151 | @sio.on('/P7Ctrl')
152 | async def P7Ctrl(sid, data):
153 | oracClient.send_message('/P7Ctrl', data)
154 |
155 |
156 | @sio.on('/P8Ctrl')
157 | async def P8Ctrl(sid, data):
158 | oracClient.send_message('/P8Ctrl', data)
159 |
160 |
161 | @sio.event
162 | def disconnect(sid):
163 | print('disconnect ', sid)
164 |
165 | # We kick off our server
166 |
167 |
168 | runner = None
169 |
170 |
171 | async def runSocketServer():
172 | print('Starting Socket IO server')
173 | global runner
174 | runner = web.AppRunner(app)
175 | await runner.setup()
176 | site = web.TCPSite(runner, '0.0.0.0', SOCKET_PORT)
177 | await site.start()
178 | print('Socket IO server running')
179 |
180 |
181 | async def stopSocketServer():
182 | print('Stopping Socket IO server')
183 | await runner.cleanup()
184 | print('Socket IO server stopped')
185 |
186 |
187 | if __name__ == '__main__':
188 | try:
189 | loop.run_until_complete(runSocketServer())
190 | loop.run_until_complete(runUdpServer())
191 | loop.run_forever()
192 | except KeyboardInterrupt:
193 | pass
194 | print('Stopping...')
195 | loop.run_until_complete(stopSocketServer())
196 | loop.run_until_complete(stopUdpServer())
197 | print('All complete!')
198 |
--------------------------------------------------------------------------------
/src/store/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Vuex from 'vuex'
3 | import 'es6-promise/auto'
4 |
5 | Vue.use(Vuex)
6 |
7 | const store = new Vuex.Store({
8 | state: {
9 | wsConnected: false,
10 | oracConnected: false,
11 | P1Desc: '',
12 | P1Value: '',
13 | P1Ctrl: 0,
14 | P2Desc: '',
15 | P2Value: '',
16 | P2Ctrl: 0,
17 | P3Desc: '',
18 | P3Value: '',
19 | P3Ctrl: 0,
20 | P4Desc: '',
21 | P4Value: '',
22 | P4Ctrl: 0,
23 | P5Desc: '',
24 | P5Value: '',
25 | P5Ctrl: 0,
26 | P6Desc: '',
27 | P6Value: '',
28 | P6Ctrl: 0,
29 | P7Desc: '',
30 | P7Value: '',
31 | P7Ctrl: 0,
32 | P8Desc: '',
33 | P8Value: '',
34 | P8Ctrl: 0,
35 | T1: '',
36 | T2: '',
37 | T3: '',
38 | T4: '',
39 | T5: '',
40 | selectText: null,
41 | module: 'Ask Mark',
42 | page: 'Ask Mark'
43 | },
44 | mutations: {
45 | SET_WS_CONNECTED: (state, bool) => {
46 | state.wsConnected = bool
47 | },
48 | SET_ORAC_CONNECTED: (state, bool) => {
49 | state.oracConnected = bool
50 | },
51 | SET_FIELD: (state, nameFieldValueArray) => {
52 | state[nameFieldValueArray[0] + nameFieldValueArray[1]] = nameFieldValueArray[2]
53 | },
54 | SOCKET_text: (state, lineValueArray) => {
55 | switch (lineValueArray[0]) {
56 | case 1:
57 | state.T1 = lineValueArray[1]
58 | break
59 | case 2:
60 | state.T2 = lineValueArray[1]
61 | break
62 | case 3:
63 | state.T3 = lineValueArray[1]
64 | break
65 | case 4:
66 | state.T4 = lineValueArray[1]
67 | break
68 | case 5:
69 | state.T5 = lineValueArray[1]
70 | break
71 | }
72 | },
73 | SOCKET_selectText: (state, lineNumber) => {
74 | state.selectText = --lineNumber
75 | },
76 | SOCKET_page: (state, pageName) => {
77 | state.page = pageName
78 | },
79 | SOCKET_module: (state, moduleName) => {
80 | state.module = moduleName
81 | },
82 | SOCKET_clearText: (state) => {
83 | state.T1 = state.T2 = state.T3 = state.T4 = state.T5 = ''
84 | }
85 | },
86 | actions: {
87 | socket_connect (context) {
88 | setTimeout(() => {
89 | context.commit('SET_WS_CONNECTED', true)
90 | try {
91 | this._vm.$socket.emit('OracConnect')
92 | } catch (err) {
93 | this.a._vm.$socket.emit('OracConnect')
94 | }
95 | }, 500)
96 | },
97 | socket_ORAC_CONNECTED: (context) => {
98 | setTimeout(() => {
99 | context.commit('SET_ORAC_CONNECTED', true)
100 | }, 500)
101 | },
102 | socket_P1Desc: (context, desc) => {
103 | context.commit('SET_FIELD', ['P1', 'Desc', desc])
104 | },
105 | socket_P1Ctrl: (context, ctrl) => {
106 | context.commit('SET_FIELD', ['P1', 'Ctrl', ctrl])
107 | },
108 | socket_P1Value: (context, value) => {
109 | context.commit('SET_FIELD', ['P1', 'Value', value])
110 | },
111 | socket_P2Desc: (context, desc) => {
112 | context.commit('SET_FIELD', ['P2', 'Desc', desc])
113 | },
114 | socket_P2Ctrl: (context, ctrl) => {
115 | context.commit('SET_FIELD', ['P2', 'Ctrl', ctrl])
116 | },
117 | socket_P2Value: (context, value) => {
118 | context.commit('SET_FIELD', ['P2', 'Value', value])
119 | },
120 | socket_P3Desc: (context, desc) => {
121 | context.commit('SET_FIELD', ['P3', 'Desc', desc])
122 | },
123 | socket_P3Ctrl: (context, ctrl) => {
124 | context.commit('SET_FIELD', ['P3', 'Ctrl', ctrl])
125 | },
126 | socket_P3Value: (context, value) => {
127 | context.commit('SET_FIELD', ['P3', 'Value', value])
128 | },
129 | socket_P4Desc: (context, desc) => {
130 | context.commit('SET_FIELD', ['P4', 'Desc', desc])
131 | },
132 | socket_P4Ctrl: (context, ctrl) => {
133 | context.commit('SET_FIELD', ['P4', 'Ctrl', ctrl])
134 | },
135 | socket_P4Value: (context, value) => {
136 | context.commit('SET_FIELD', ['P4', 'Value', value])
137 | },
138 | socket_P5Desc: (context, desc) => {
139 | context.commit('SET_FIELD', ['P5', 'Desc', desc])
140 | },
141 | socket_P5Ctrl: (context, ctrl) => {
142 | context.commit('SET_FIELD', ['P5', 'Ctrl', ctrl])
143 | },
144 | socket_P5Value: (context, value) => {
145 | context.commit('SET_FIELD', ['P5', 'Value', value])
146 | },
147 | socket_P6Desc: (context, desc) => {
148 | context.commit('SET_FIELD', ['P6', 'Desc', desc])
149 | },
150 | socket_P6Ctrl: (context, ctrl) => {
151 | context.commit('SET_FIELD', ['P6', 'Ctrl', ctrl])
152 | },
153 | socket_P6Value: (context, value) => {
154 | context.commit('SET_FIELD', ['P6', 'Value', value])
155 | },
156 | socket_P7Desc: (context, desc) => {
157 | context.commit('SET_FIELD', ['P7', 'Desc', desc])
158 | },
159 | socket_P7Ctrl: (context, ctrl) => {
160 | context.commit('SET_FIELD', ['P7', 'Ctrl', ctrl])
161 | },
162 | socket_P7Value: (context, value) => {
163 | context.commit('SET_FIELD', ['P7', 'Value', value])
164 | },
165 | socket_P8Desc: (context, desc) => {
166 | context.commit('SET_FIELD', ['P8', 'Desc', desc])
167 | },
168 | socket_P8Ctrl: (context, ctrl) => {
169 | context.commit('SET_FIELD', ['P8', 'Ctrl', ctrl])
170 | },
171 | socket_P8Value: (context, value) => {
172 | context.commit('SET_FIELD', ['P8', 'Value', value])
173 | }
174 | },
175 | getters: {
176 | wsConnected: state => {
177 | return state.wsConnected
178 | },
179 | oracConnected: state => {
180 | return state.oracConnected
181 | },
182 | page: state => {
183 | return state.page
184 | },
185 | module: state => {
186 | return state.module
187 | },
188 | text: state => {
189 | return [state.T1, state.T2, state.T3, state.T4, state.T5]
190 | },
191 | selectText: state => {
192 | return state.selectText
193 | },
194 | getField: (state) => (param, field) => {
195 | return state[param + field]
196 | }
197 | }
198 | })
199 |
200 | export default store
201 |
--------------------------------------------------------------------------------
/client/static/js/app.c64710128364b0205755.js:
--------------------------------------------------------------------------------
1 | webpackJsonp([1],{NHnr:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var s=n("7+uW"),o=n("Dd8w"),i=n.n(o),a=n("NYxO"),c={computed:i()({},Object(a.b)(["text","selectText"])),methods:{selectHandler:function(t){if(this.text[t]){var e=t-this.selectText,n=Math.abs(e);if(e<0)for(var s=0;s0)for(var o=0;o0&&(s=Math.PI-s),t<0&&e<0&&(s=Math.PI+s),t>0&&e<0&&(s=2*Math.PI-s),(s=2*Math.PI-s-1.5*Math.PI+this.angleStart)>2*Math.PI&&(s-=2*Math.PI),s<0&&(s+=2*Math.PI);var o=-1;n.6*this.radius&&(s<=2*this.angleStart?o=s/(2*this.angleStart):2*Math.PI-s<.1*Math.PI?o=0:s-2*this.angleStart<.1*Math.PI&&(o=1),o!=this.value&&o>=0&&(this.value=o,this.emitUpdate()))},emitUpdate:function(){this.$socket.emit(this.ctrlAddress,this.value)}}},h={render:function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"noselect"},[e("svg",{ref:"svg",attrs:{viewBox:"0 0 160 130"}},[e("g",{attrs:{transform:this.translate}},[e("path",{attrs:{d:this.drawArc(0),fill:"#ff0000",stroke:"black"}}),this._v(" "),e("path",{attrs:{d:this.drawArc(1),fill:"#6c757d",stroke:"black"}}),this._v(" "),e("text",{attrs:{"text-anchor":"middle"}},[this._v(this._s((100*this.value).toFixed(0)))])])])])},staticRenderFns:[]};var _=n("VU/8")(m,h,!1,function(t){n("ULlh")},"data-v-39423519",null).exports,v={name:"OracParameterControl",components:{PieControl:_},props:{prefix:{type:String,required:!0}},computed:{desc:function(){return this.$store.getters.getField(this.prefix,"Desc")},value:function(){return this.$store.getters.getField(this.prefix,"Value")}}},p={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"param-block"},[n("div",{staticClass:"d-flex justify-content-between"},[n("div",{staticClass:"param-text small font-weight-bold"},[t._v(t._s(t.desc))]),t._v(" "),n("div",{staticClass:"param-text small font-weight-bold"},[t._v(t._s(t.value))])]),t._v(" "),t.desc?n("PieControl",{attrs:{prefix:t.prefix}}):t._e()],1)},staticRenderFns:[]},P={components:{PieControl:_,Navigation:d,OracParameterControl:n("VU/8")(v,p,!1,null,null,null).exports},computed:i()({},Object(a.b)(["wsConnected","oracConnected"]))},C={render:function(){var t=this.$createElement,e=this._self._c||t;return e("div",{attrs:{id:"app"}},[this.oracConnected?e("div",{attrs:{id:"connected"}},[e("Navigation"),this._v(" "),e("div",{staticClass:"params-container"},this._l(8,function(t){return e("OracParameterControl",{key:t,attrs:{prefix:"P"+t}})}),1)],1):e("div",{staticClass:"container-centered text-center",attrs:{id:"connecting"}},[e("div",{staticStyle:{"min-height":"180px"}},[e("img",{staticClass:"logo",attrs:{src:"/static/logo.png"}})]),this._v(" "),this.wsConnected?e("strong",[this._v("Looking for MEC Service...")]):e("strong",[this._v("Looking for OSC Service...")])])])},staticRenderFns:[]},E=n("VU/8")(P,C,!1,null,null,null).exports,g=n("HI0L"),b=n.n(g);n("MU8w");s.a.use(a.a);var T=new a.a.Store({state:{wsConnected:!1,oracConnected:!1,P1Desc:"",P1Value:"",P1Ctrl:0,P2Desc:"",P2Value:"",P2Ctrl:0,P3Desc:"",P3Value:"",P3Ctrl:0,P4Desc:"",P4Value:"",P4Ctrl:0,P5Desc:"",P5Value:"",P5Ctrl:0,P6Desc:"",P6Value:"",P6Ctrl:0,P7Desc:"",P7Value:"",P7Ctrl:0,P8Desc:"",P8Value:"",P8Ctrl:0,T1:"",T2:"",T3:"",T4:"",T5:"",selectText:null,module:"Ask Mark",page:"Ask Mark"},mutations:{SET_WS_CONNECTED:function(t,e){t.wsConnected=e},SET_ORAC_CONNECTED:function(t,e){t.oracConnected=e},SET_FIELD:function(t,e){t[e[0]+e[1]]=e[2]},SOCKET_text:function(t,e){switch(e[0]){case 1:t.T1=e[1];break;case 2:t.T2=e[1];break;case 3:t.T3=e[1];break;case 4:t.T4=e[1];break;case 5:t.T5=e[1]}},SOCKET_selectText:function(t,e){t.selectText=--e},SOCKET_page:function(t,e){t.page=e},SOCKET_module:function(t,e){t.module=e},SOCKET_clearText:function(t){t.T1=t.T2=t.T3=t.T4=t.T5=""}},actions:{socket_connect:function(t){var e=this;setTimeout(function(){t.commit("SET_WS_CONNECTED",!0);try{e._vm.$socket.emit("OracConnect")}catch(t){e.a._vm.$socket.emit("OracConnect")}},500)},socket_ORAC_CONNECTED:function(t){setTimeout(function(){t.commit("SET_ORAC_CONNECTED",!0)},500)},socket_P1Desc:function(t,e){t.commit("SET_FIELD",["P1","Desc",e])},socket_P1Ctrl:function(t,e){t.commit("SET_FIELD",["P1","Ctrl",e])},socket_P1Value:function(t,e){t.commit("SET_FIELD",["P1","Value",e])},socket_P2Desc:function(t,e){t.commit("SET_FIELD",["P2","Desc",e])},socket_P2Ctrl:function(t,e){t.commit("SET_FIELD",["P2","Ctrl",e])},socket_P2Value:function(t,e){t.commit("SET_FIELD",["P2","Value",e])},socket_P3Desc:function(t,e){t.commit("SET_FIELD",["P3","Desc",e])},socket_P3Ctrl:function(t,e){t.commit("SET_FIELD",["P3","Ctrl",e])},socket_P3Value:function(t,e){t.commit("SET_FIELD",["P3","Value",e])},socket_P4Desc:function(t,e){t.commit("SET_FIELD",["P4","Desc",e])},socket_P4Ctrl:function(t,e){t.commit("SET_FIELD",["P4","Ctrl",e])},socket_P4Value:function(t,e){t.commit("SET_FIELD",["P4","Value",e])},socket_P5Desc:function(t,e){t.commit("SET_FIELD",["P5","Desc",e])},socket_P5Ctrl:function(t,e){t.commit("SET_FIELD",["P5","Ctrl",e])},socket_P5Value:function(t,e){t.commit("SET_FIELD",["P5","Value",e])},socket_P6Desc:function(t,e){t.commit("SET_FIELD",["P6","Desc",e])},socket_P6Ctrl:function(t,e){t.commit("SET_FIELD",["P6","Ctrl",e])},socket_P6Value:function(t,e){t.commit("SET_FIELD",["P6","Value",e])},socket_P7Desc:function(t,e){t.commit("SET_FIELD",["P7","Desc",e])},socket_P7Ctrl:function(t,e){t.commit("SET_FIELD",["P7","Ctrl",e])},socket_P7Value:function(t,e){t.commit("SET_FIELD",["P7","Value",e])},socket_P8Desc:function(t,e){t.commit("SET_FIELD",["P8","Desc",e])},socket_P8Ctrl:function(t,e){t.commit("SET_FIELD",["P8","Ctrl",e])},socket_P8Value:function(t,e){t.commit("SET_FIELD",["P8","Value",e])}},getters:{wsConnected:function(t){return t.wsConnected},oracConnected:function(t){return t.oracConnected},page:function(t){return t.page},module:function(t){return t.module},text:function(t){return[t.T1,t.T2,t.T3,t.T4,t.T5]},selectText:function(t){return t.selectText},getField:function(t){return function(e,n){return t[e+n]}}}});s.a.use(new b.a({debug:!1,connection:Object({NODE_ENV:"production"}).WS_URL?Object({NODE_ENV:"production"}).WS_URL:"http://"+window.location.host,vuex:{store:T,actionPrefix:"socket_",mutationPrefix:"SOCKET_"}})),s.a.config.productionTip=!0,new s.a({el:"#app",store:T,render:function(t){return t(E)}})},ULlh:function(t,e){},tAVb:function(t,e){}},["NHnr"]);
2 | //# sourceMappingURL=app.c64710128364b0205755.js.map
--------------------------------------------------------------------------------
/client/static/js/app.c64710128364b0205755.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["webpack:///src/components/Menu.vue","webpack:///./src/components/Menu.vue?f18f","webpack:///src/components/Navigation.vue","webpack:///./src/components/Menu.vue","webpack:///./src/components/Navigation.vue?1ef4","webpack:///./src/components/Navigation.vue","webpack:///src/components/PieControl.vue","webpack:///./src/components/PieControl.vue?efd7","webpack:///./src/components/PieControl.vue","webpack:///src/components/OracParameterControl.vue","webpack:///./src/components/OracParameterControl.vue?9ed9","webpack:///src/App.vue","webpack:///./src/components/OracParameterControl.vue","webpack:///./src/App.vue?3ecd","webpack:///./src/App.vue","webpack:///./src/store/index.js","webpack:///./src/main.js"],"names":["Menu","computed","extends_default","Object","vuex_esm","methods","selectHandler","position","this","text","diff","selectText","steps","Math","abs","i","$socket","emit","_i","up","down","components_Menu","render","_vm","_h","$createElement","_c","_self","staticClass","_l","item","index","key","staticStyle","height","cursor","on","click","$event","stopPropagation","_v","_s","attrs","role","staticRenderFns","Navigation","components","__webpack_require__","normalizeComponent","data","showModal","nextPage","prevPage","nextModule","prevModule","components_Navigation","id","type","opacity","module","class","disabled","page","name","border","_e","src_components_Navigation","Navigation_normalizeComponent","ssrContext","PieControl","props","radius","Number","default","prefix","String","required","angleStart","PI","margin","ctrlAddress","value","get","$store","getters","getField","set","commit","input","a","b","translate","arcs","d3","sort","d","startAngle","endAngle","mounted","$refs","svg","mouseHandle","touchHandle","drawArc","idx","innerRadius","outerRadius","preventDefault","node","bbox","getBBox","touch","x","width","y","updateValueByCursor","buttons","mouse","r","sqrt","theta","atan","newValue","emitUpdate","components_PieControl","ref","viewBox","transform","fill","stroke","text-anchor","toFixed","src_components_PieControl","PieControl_normalizeComponent","OracParameterControl","desc","components_OracParameterControl","App","OracParameterControl_normalizeComponent","selectortype_template_index_0_src_App","no","min-height","src","src_App","App_normalizeComponent","Vue","use","Vuex","store","Store","state","wsConnected","oracConnected","P1Desc","P1Value","P1Ctrl","P2Desc","P2Value","P2Ctrl","P3Desc","P3Value","P3Ctrl","P4Desc","P4Value","P4Ctrl","P5Desc","P5Value","P5Ctrl","P6Desc","P6Value","P6Ctrl","P7Desc","P7Value","P7Ctrl","P8Desc","P8Value","P8Ctrl","T1","T2","T3","T4","T5","mutations","SET_WS_CONNECTED","bool","SET_ORAC_CONNECTED","SET_FIELD","nameFieldValueArray","SOCKET_text","lineValueArray","SOCKET_selectText","lineNumber","SOCKET_page","pageName","SOCKET_module","moduleName","SOCKET_clearText","actions","socket_connect","context","_this","setTimeout","err","socket_ORAC_CONNECTED","socket_P1Desc","socket_P1Ctrl","ctrl","socket_P1Value","socket_P2Desc","socket_P2Ctrl","socket_P2Value","socket_P3Desc","socket_P3Ctrl","socket_P3Value","socket_P4Desc","socket_P4Ctrl","socket_P4Value","socket_P5Desc","socket_P5Ctrl","socket_P5Value","socket_P6Desc","socket_P6Ctrl","socket_P6Value","socket_P7Desc","socket_P7Ctrl","socket_P7Value","socket_P8Desc","socket_P8Ctrl","socket_P8Value","param","field","VueSocketIO","debug","connection","process","WS_URL","window","location","host","vuex","actionPrefix","mutationPrefix","config","productionTip","el","h"],"mappings":"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","file":"static/js/app.c64710128364b0205755.js","sourcesContent":["\r\n \r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/Menu.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:\"list-group\"},[_vm._l((_vm.text),function(item,index){return _c('li',{key:index,staticClass:\"list-group-item\",staticStyle:{\"height\":\"50px\",\"cursor\":\"pointer\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.selectHandler(index)}}},[_vm._v(_vm._s(item))])}),_vm._v(\" \"),_c('div',{staticClass:\"p-1 btn-group\",attrs:{\"role\":\"group\"}},[_c('button',{staticClass:\"btn btn-outline-secondary\",on:{\"click\":function($event){$event.stopPropagation();return _vm.up()}}},[_vm._v(\"Up\")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-outline-secondary\",on:{\"click\":function($event){$event.stopPropagation();return _vm.down()}}},[_vm._v(\"Down\")])])],2)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5a0041dd\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/Menu.vue\n// module id = null\n// module chunks = ","\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/Navigation.vue","var normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Menu.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Menu.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5a0041dd\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Menu.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Menu.vue\n// module id = null\n// module chunks = ","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"navigation\"}},[_c('div',{staticClass:\"d-flex justify-content-between w-100\"},[_c('div',{staticClass:\"p-1 btn-group btn-group-sm w-100\",attrs:{\"role\":\"group\"}},[_c('button',{staticClass:\"btn btn-arrow btn-outline-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.prevModule()}}},[_vm._v(\"◄\")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-outline-secondary disabled\",staticStyle:{\"opacity\":\"1\"},attrs:{\"type\":\"button\"}},[_c('small',[_vm._v(_vm._s(_vm.module))])]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-arrow btn-outline-secondary\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.nextModule()}}},[_vm._v(\"►\")])]),_vm._v(\" \"),_c('div',{staticClass:\"p-1 btn-group btn-group-sm w-100\",attrs:{\"role\":\"group\"}},[_c('button',{staticClass:\"btn btn-arrow btn-outline-secondary\",class:{ 'disabled': !_vm.page },attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.prevPage()}}},[_vm._v(\"◄\")]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-outline-secondary disabled\",staticStyle:{\"opacity\":\"1\"},attrs:{\"type\":\"button\"}},[_c('small',[_vm._v(_vm._s(_vm.page || '-'))])]),_vm._v(\" \"),_c('button',{staticClass:\"btn btn-arrow btn-outline-secondary\",class:{ 'disabled': !_vm.page },attrs:{\"type\":\"button\"},on:{\"click\":function($event){return _vm.nextPage()}}},[_vm._v(\"►\")])]),_vm._v(\" \"),_c('div',{staticClass:\"p-1\"},[_c('button',{staticClass:\"btn btn-outline-secondary\",staticStyle:{\"height\":\"100%\"},attrs:{\"type\":\"button\"},on:{\"click\":function($event){_vm.showModal = true}}},[_vm._v(\"☰\")])])]),_vm._v(\" \"),(_vm.showModal)?_c('div',[_c('transition',{attrs:{\"name\":\"modal\"}},[_c('div',{staticClass:\"modal-mask\",on:{\"click\":function($event){_vm.showModal = false}}},[_c('div',{staticClass:\"modal-wrapper\"},[_c('div',{staticClass:\"modal-dialog\",attrs:{\"role\":\"document\"}},[_c('div',{staticClass:\"modal-content\",staticStyle:{\"border\":\"none\"}},[_c('Menu')],1)])])])])],1):_vm._e()])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-7723e048\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/Navigation.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-7723e048\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./Navigation.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Navigation.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./Navigation.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7723e048\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./Navigation.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-7723e048\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/Navigation.vue\n// module id = null\n// module chunks = ","\r\n \r\n
\r\n
\r\n\r\n\r\n\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/PieControl.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"noselect\"},[_c('svg',{ref:\"svg\",attrs:{\"viewBox\":\"0 0 160 130\"}},[_c('g',{attrs:{\"transform\":_vm.translate}},[_c('path',{attrs:{\"d\":_vm.drawArc(0),\"fill\":\"#ff0000\",\"stroke\":\"black\"}}),_vm._v(\" \"),_c('path',{attrs:{\"d\":_vm.drawArc(1),\"fill\":\"#6c757d\",\"stroke\":\"black\"}}),_vm._v(\" \"),_c('text',{attrs:{\"text-anchor\":\"middle\"}},[_vm._v(_vm._s((this.value * 100).toFixed(0)))])])])])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-39423519\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/PieControl.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-39423519\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./PieControl.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./PieControl.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./PieControl.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-39423519\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./PieControl.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-39423519\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/PieControl.vue\n// module id = null\n// module chunks = ","\r\n \r\n
\r\n
{{ desc }}
\r\n
{{ value }}
\r\n
\r\n
\r\n
\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/components/OracParameterControl.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"param-block\"},[_c('div',{staticClass:\"d-flex justify-content-between\"},[_c('div',{staticClass:\"param-text small font-weight-bold\"},[_vm._v(_vm._s(_vm.desc))]),_vm._v(\" \"),_c('div',{staticClass:\"param-text small font-weight-bold\"},[_vm._v(_vm._s(_vm.value))])]),_vm._v(\" \"),(_vm.desc)?_c('PieControl',{attrs:{\"prefix\":_vm.prefix}}):_vm._e()],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-d41bfeb8\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/OracParameterControl.vue\n// module id = null\n// module chunks = ","\r\n\r\n \r\n
\r\n
\r\n
\r\n
![]()
\r\n
\r\n
Looking for MEC Service...\r\n
Looking for OSC Service...\r\n
\r\n
\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// src/App.vue","var normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./OracParameterControl.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./OracParameterControl.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-d41bfeb8\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./OracParameterControl.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/OracParameterControl.vue\n// module id = null\n// module chunks = ","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[(_vm.oracConnected)?_c('div',{attrs:{\"id\":\"connected\"}},[_c('Navigation'),_vm._v(\" \"),_c('div',{staticClass:\"params-container\"},_vm._l((8),function(no){return _c('OracParameterControl',{key:no,attrs:{\"prefix\":'P' + no}})}),1)],1):_c('div',{staticClass:\"container-centered text-center\",attrs:{\"id\":\"connecting\"}},[_c('div',{staticStyle:{\"min-height\":\"180px\"}},[_c('img',{staticClass:\"logo\",attrs:{\"src\":'/static/logo.png'}})]),_vm._v(\" \"),(_vm.wsConnected)?_c('strong',[_vm._v(\"Looking for MEC Service...\")]):_c('strong',[_vm._v(\"Looking for OSC Service...\")])])])}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-17648587\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = null\n// module chunks = ","var normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-17648587\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = null\n// module chunks = ","import Vue from 'vue'\r\nimport Vuex from 'vuex'\r\nimport 'es6-promise/auto'\r\n\r\nVue.use(Vuex)\r\n\r\nconst store = new Vuex.Store({\r\n state: {\r\n wsConnected: false,\r\n oracConnected: false,\r\n P1Desc: '',\r\n P1Value: '',\r\n P1Ctrl: 0,\r\n P2Desc: '',\r\n P2Value: '',\r\n P2Ctrl: 0,\r\n P3Desc: '',\r\n P3Value: '',\r\n P3Ctrl: 0,\r\n P4Desc: '',\r\n P4Value: '',\r\n P4Ctrl: 0,\r\n P5Desc: '',\r\n P5Value: '',\r\n P5Ctrl: 0,\r\n P6Desc: '',\r\n P6Value: '',\r\n P6Ctrl: 0,\r\n P7Desc: '',\r\n P7Value: '',\r\n P7Ctrl: 0,\r\n P8Desc: '',\r\n P8Value: '',\r\n P8Ctrl: 0,\r\n T1: '',\r\n T2: '',\r\n T3: '',\r\n T4: '',\r\n T5: '',\r\n selectText: null,\r\n module: 'Ask Mark',\r\n page: 'Ask Mark'\r\n },\r\n mutations: {\r\n SET_WS_CONNECTED: (state, bool) => {\r\n state.wsConnected = bool\r\n },\r\n SET_ORAC_CONNECTED: (state, bool) => {\r\n state.oracConnected = bool\r\n },\r\n SET_FIELD: (state, nameFieldValueArray) => {\r\n state[nameFieldValueArray[0] + nameFieldValueArray[1]] = nameFieldValueArray[2]\r\n },\r\n SOCKET_text: (state, lineValueArray) => {\r\n switch (lineValueArray[0]) {\r\n case 1:\r\n state.T1 = lineValueArray[1]\r\n break\r\n case 2:\r\n state.T2 = lineValueArray[1]\r\n break\r\n case 3:\r\n state.T3 = lineValueArray[1]\r\n break\r\n case 4:\r\n state.T4 = lineValueArray[1]\r\n break\r\n case 5:\r\n state.T5 = lineValueArray[1]\r\n break\r\n }\r\n },\r\n SOCKET_selectText: (state, lineNumber) => {\r\n state.selectText = --lineNumber\r\n },\r\n SOCKET_page: (state, pageName) => {\r\n state.page = pageName\r\n },\r\n SOCKET_module: (state, moduleName) => {\r\n state.module = moduleName\r\n },\r\n SOCKET_clearText: (state) => {\r\n state.T1 = state.T2 = state.T3 = state.T4 = state.T5 = ''\r\n }\r\n },\r\n actions: {\r\n socket_connect (context) {\r\n setTimeout(() => {\r\n context.commit('SET_WS_CONNECTED', true)\r\n try {\r\n this._vm.$socket.emit('OracConnect')\r\n } catch (err) {\r\n this.a._vm.$socket.emit('OracConnect')\r\n }\r\n }, 500)\r\n },\r\n socket_ORAC_CONNECTED: (context) => {\r\n setTimeout(() => {\r\n context.commit('SET_ORAC_CONNECTED', true)\r\n }, 500)\r\n },\r\n socket_P1Desc: (context, desc) => {\r\n context.commit('SET_FIELD', ['P1', 'Desc', desc])\r\n },\r\n socket_P1Ctrl: (context, ctrl) => {\r\n context.commit('SET_FIELD', ['P1', 'Ctrl', ctrl])\r\n },\r\n socket_P1Value: (context, value) => {\r\n context.commit('SET_FIELD', ['P1', 'Value', value])\r\n },\r\n socket_P2Desc: (context, desc) => {\r\n context.commit('SET_FIELD', ['P2', 'Desc', desc])\r\n },\r\n socket_P2Ctrl: (context, ctrl) => {\r\n context.commit('SET_FIELD', ['P2', 'Ctrl', ctrl])\r\n },\r\n socket_P2Value: (context, value) => {\r\n context.commit('SET_FIELD', ['P2', 'Value', value])\r\n },\r\n socket_P3Desc: (context, desc) => {\r\n context.commit('SET_FIELD', ['P3', 'Desc', desc])\r\n },\r\n socket_P3Ctrl: (context, ctrl) => {\r\n context.commit('SET_FIELD', ['P3', 'Ctrl', ctrl])\r\n },\r\n socket_P3Value: (context, value) => {\r\n context.commit('SET_FIELD', ['P3', 'Value', value])\r\n },\r\n socket_P4Desc: (context, desc) => {\r\n context.commit('SET_FIELD', ['P4', 'Desc', desc])\r\n },\r\n socket_P4Ctrl: (context, ctrl) => {\r\n context.commit('SET_FIELD', ['P4', 'Ctrl', ctrl])\r\n },\r\n socket_P4Value: (context, value) => {\r\n context.commit('SET_FIELD', ['P4', 'Value', value])\r\n },\r\n socket_P5Desc: (context, desc) => {\r\n context.commit('SET_FIELD', ['P5', 'Desc', desc])\r\n },\r\n socket_P5Ctrl: (context, ctrl) => {\r\n context.commit('SET_FIELD', ['P5', 'Ctrl', ctrl])\r\n },\r\n socket_P5Value: (context, value) => {\r\n context.commit('SET_FIELD', ['P5', 'Value', value])\r\n },\r\n socket_P6Desc: (context, desc) => {\r\n context.commit('SET_FIELD', ['P6', 'Desc', desc])\r\n },\r\n socket_P6Ctrl: (context, ctrl) => {\r\n context.commit('SET_FIELD', ['P6', 'Ctrl', ctrl])\r\n },\r\n socket_P6Value: (context, value) => {\r\n context.commit('SET_FIELD', ['P6', 'Value', value])\r\n },\r\n socket_P7Desc: (context, desc) => {\r\n context.commit('SET_FIELD', ['P7', 'Desc', desc])\r\n },\r\n socket_P7Ctrl: (context, ctrl) => {\r\n context.commit('SET_FIELD', ['P7', 'Ctrl', ctrl])\r\n },\r\n socket_P7Value: (context, value) => {\r\n context.commit('SET_FIELD', ['P7', 'Value', value])\r\n },\r\n socket_P8Desc: (context, desc) => {\r\n context.commit('SET_FIELD', ['P8', 'Desc', desc])\r\n },\r\n socket_P8Ctrl: (context, ctrl) => {\r\n context.commit('SET_FIELD', ['P8', 'Ctrl', ctrl])\r\n },\r\n socket_P8Value: (context, value) => {\r\n context.commit('SET_FIELD', ['P8', 'Value', value])\r\n }\r\n },\r\n getters: {\r\n wsConnected: state => {\r\n return state.wsConnected\r\n },\r\n oracConnected: state => {\r\n return state.oracConnected\r\n },\r\n page: state => {\r\n return state.page\r\n },\r\n module: state => {\r\n return state.module\r\n },\r\n text: state => {\r\n return [state.T1, state.T2, state.T3, state.T4, state.T5]\r\n },\r\n selectText: state => {\r\n return state.selectText\r\n },\r\n getField: (state) => (param, field) => {\r\n return state[param + field]\r\n }\r\n }\r\n})\r\n\r\nexport default store\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/store/index.js","// The Vue build version to load with the `import` command\r\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\r\nimport Vue from 'vue'\r\nimport App from './App'\r\nimport VueSocketIO from 'vue-socket.io'\r\nimport store from './store/index'\r\n\r\nVue.use(new VueSocketIO({\r\n debug: false,\r\n // config/dev.env.js\r\n connection: (process.env.WS_URL) ? process.env.WS_URL : 'http://' + window.location.host,\r\n vuex: {\r\n store,\r\n actionPrefix: 'socket_',\r\n mutationPrefix: 'SOCKET_'\r\n }\r\n}))\r\n\r\nVue.config.productionTip = true\r\n\r\n/* eslint-disable no-new */\r\nnew Vue({\r\n el: '#app',\r\n store,\r\n render: h => h(App)\r\n})\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js"],"sourceRoot":""}
--------------------------------------------------------------------------------