├── 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 | 19 | 20 | 39 | -------------------------------------------------------------------------------- /src/components/Menu.vue: -------------------------------------------------------------------------------- 1 | 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 | ![screenshot](https://raw.githubusercontent.com/dsedleckas/orac-control-web/master/screenshot.png) 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 | 51 | 52 | 83 | 84 | 106 | -------------------------------------------------------------------------------- /src/components/PieControl.vue: -------------------------------------------------------------------------------- 1 | 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\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\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\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\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\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":""} --------------------------------------------------------------------------------