Version 2.0
3
.gitignore
vendored
|
@ -62,3 +62,6 @@ GUI
|
|||
# Android
|
||||
*.apk
|
||||
|
||||
/software/raspberry/superviseur-robot/superviseur/dist/
|
||||
/software/raspberry/testeur/testeur/build/
|
||||
/software/raspberry/testeur/testeur/dist/
|
16
.vscode/c_cpp_properties.json
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Linux",
|
||||
"includePath": [
|
||||
"${workspaceFolder}/**"
|
||||
],
|
||||
"defines": [],
|
||||
"compilerPath": "/usr/bin/clang",
|
||||
"cStandard": "c11",
|
||||
"cppStandard": "c++17",
|
||||
"intelliSenseMode": "clang-x64"
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
}
|
16
.vscode/tasks.json
vendored
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||
// for the documentation about the tasks.json format
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"taskName": "Compile on raspberry",
|
||||
"command": "rsync -az '${file}' 10.105.1.6:~ && ssh server.example.org 'chmod +x ./${fileBasename}; ./${fileBasename}'",
|
||||
"type": "shell",
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
node_modules
|
|
@ -1,20 +0,0 @@
|
|||
# Installation
|
||||
|
||||
Cette partie contient la partie "backend" et "frontend"
|
||||
la partie backend correspond à server.js alors que le front est le résultat du build de l'interface créer avec webpack.
|
||||
On a donc uniquement le dossier "dist"
|
||||
"src" a été rajouté pour satisfaire les curieux sur le frontend, mais il est impossible de compiler directement avec ces éléments seulements.
|
||||
|
||||
```
|
||||
npm install --save
|
||||
```
|
||||
# Lancement
|
||||
```
|
||||
./server.js
|
||||
```
|
||||
ou
|
||||
```
|
||||
node server.js
|
||||
```
|
||||
En vas d'absence variable d'environnement "port" le serveur écoutera le port 3000.
|
||||
|
|
@ -1,11 +0,0 @@
|
|||
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons" rel=stylesheet><link href=https://unpkg.com/vuetify/dist/vuetify.min.css rel=stylesheet><style>img{
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-o-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
html{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}</style><title>Dumby User Interface</title><link href=/static/css/app.4a7868781302837201d91bdb0ae1e87b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.718132ea847827f5d365.js></script><script type=text/javascript src=/static/js/vendor.b426f2cbabf67eb78c1a.js></script><script type=text/javascript src=/static/js/app.29d7c2a7593408c61110.js></script></body></html>
|
|
@ -1,14 +0,0 @@
|
|||
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="102" width="102" y="-1" x="-1"/>
|
||||
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||
<rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path transform="rotate(90, 50, 50.2548)" id="svg_2" d="m53.448662,50.254662l-20.200256,-17.133644l13.303299,0l20.19989,17.133644l-20.19989,17.133873l-13.303299,0l20.200256,-17.133873z" stroke-width="1.5" stroke="#000" fill="#000000"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 740 B |
|
@ -1,14 +0,0 @@
|
|||
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="102" width="102" y="-1" x="-1"/>
|
||||
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||
<rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path transform="rotate(180, 50, 50.2548)" id="svg_2" d="m53.448662,50.254662l-20.200256,-17.133644l13.303299,0l20.19989,17.133644l-20.19989,17.133873l-13.303299,0l20.200256,-17.133873z" stroke-width="1.5" stroke="#000" fill="#000000"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 741 B |
|
@ -1,14 +0,0 @@
|
|||
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="102" width="102" y="-1" x="-1"/>
|
||||
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||
<rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path id="svg_2" d="m53.448662,49.999886l-20.200256,-17.133644l13.303299,0l20.19989,17.133644l-20.19989,17.133873l-13.303299,0l20.200256,-17.133873z" stroke-width="1.5" stroke="#000" fill="#000000"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 704 B |
|
@ -1,14 +0,0 @@
|
|||
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="102" width="102" y="-1" x="-1"/>
|
||||
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||
<rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path transform="rotate(-90, 50, 50)" id="svg_2" d="m53.448662,49.999886l-20.200256,-17.133644l13.303299,0l20.19989,17.133644l-20.19989,17.133873l-13.303299,0l20.200256,-17.133873z" stroke-width="1.5" stroke="#000" fill="#000000"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 736 B |
|
@ -1,15 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="30" width="90" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect id="svg_1" height="26.315784" width="81.894718" y="0.999998" x="1" fill-opacity="null" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<rect id="svg_2" height="20.210522" width="22.736838" y="3.947366" x="4.578944" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_5" height="20.210522" width="22.736838" y="3.947366" x="30.789471" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_6" height="20.210522" width="22.736838" y="3.947366" x="56.789459" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_7" height="5.263157" width="3.999999" y="12.368417" x="82.894717" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
|
@ -1,16 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect x="-1" y="-1" width="17.714263" height="6.999993" id="canvas_background" fill="none"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect fill="none" stroke="#ffffff" stroke-width="2" fill-opacity="null" x="1" y="0.999998" width="81.894718" height="26.315784" id="svg_1"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="4.578944" y="3.947366" width="22.736838" height="20.210522" id="svg_2"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="30.789471" y="3.947366" width="22.736838" height="20.210522" id="svg_5"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="56.789459" y="3.947366" width="22.736838" height="20.210522" id="svg_6"/>
|
||||
<rect fill="none" stroke="#ffffff" stroke-width="2" x="82.894717" y="12.368417" width="3.999999" height="5.263157" id="svg_7"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 992 B |
|
@ -1,14 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="30" width="90" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect id="svg_1" height="26.315784" width="81.894718" y="0.999998" x="1" fill-opacity="null" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<rect id="svg_2" height="20.210522" width="8.842102" y="3.947366" x="4.578944" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_7" height="5.263157" width="3.999999" y="12.368417" x="82.894717" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<path id="svg_8" d="m54.798424,20.400599l-2.790161,-4.677445c-0.841221,-1.409811 -2.217152,-3.717751 -3.058323,-5.127771l-2.789875,-4.6774c-0.842064,-1.410675 -2.218014,-1.410675 -3.058952,0l-2.789314,4.6774c-0.841179,1.410021 -2.217922,3.718452 -3.05896,5.127771l-2.789524,4.677445c-0.841179,1.411167 -0.152626,2.56464 1.529472,2.56464l17.274529,0c1.683743,0 2.371479,-1.153473 1.531109,-2.56464l0,0zm-9.371113,0.724201l-1.654819,0l0,-1.538128l1.654819,0l0,1.538128zm-0.079727,-2.671261l-1.493965,0l-0.148476,-6.580343l1.777653,0l-0.135212,6.580343z" fill="#666666"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
|
@ -1,14 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="30" width="90" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect id="svg_1" height="26.315784" width="81.894718" y="0.999998" x="1" stroke-width="2" stroke="#ffffff" fill="none"/>
|
||||
<rect id="svg_2" height="20.210522" width="8.842102" y="3.947366" x="4.578944" stroke-width="2" stroke="#ffffff" fill="#ffffff"/>
|
||||
<rect id="svg_7" height="5.263157" width="3.999999" y="12.368417" x="82.894717" stroke-width="2" stroke="#ffffff" fill="none"/>
|
||||
<path id="svg_9" d="m60.694698,20.577425l-3.23653,-4.731917c-0.975735,-1.426157 -2.571877,-3.761006 -3.5476,-5.187507l-3.236504,-4.731595c-0.976608,-1.427078 -2.572712,-1.427078 -3.547989,0l-3.235592,4.731595c-0.976166,1.4265 -2.573158,3.761847 -3.548439,5.187507l-3.236038,4.731917c-0.975723,1.427576 -0.177002,2.594461 1.774445,2.594461l20.038418,0c1.953274,0 2.750664,-1.166885 1.775829,-2.594461l0,0zm-10.870243,0.732548l-1.919575,0l0,-1.555851l1.919575,0l0,1.555851zm-0.092484,-2.702253l-1.73328,0l-0.172131,-6.657048l2.062057,0l-0.156647,6.657048z" stroke="#ffffff" fill="#ffffff"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
|
@ -1,14 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="30" width="90" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect id="svg_1" height="26.315784" width="81.894718" y="0.999998" x="1" fill-opacity="null" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<rect id="svg_2" height="20.210522" width="22.736838" y="3.947366" x="4.578944" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_5" height="20.210522" width="22.736838" y="3.947366" x="30.789471" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_7" height="5.263157" width="3.999999" y="12.368417" x="82.894717" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 932 B |
|
@ -1,15 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect x="-1" y="-1" width="20.526313" height="7.894736" id="canvas_background" fill="none"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect fill="none" stroke="#ffffff" stroke-width="2" fill-opacity="null" x="1" y="0.999998" width="81.894718" height="26.315784" id="svg_1"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="4.578944" y="3.947366" width="22.736838" height="20.210522" id="svg_2"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="30.789471" y="3.947366" width="22.736838" height="20.210522" id="svg_5"/>
|
||||
<rect fill="none" stroke="#ffffff" stroke-width="2" x="82.894717" y="12.368417" width="3.999999" height="5.263157" id="svg_7"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 858 B |
|
@ -1,2 +0,0 @@
|
|||
.notif{margin-left:50%;-webkit-transform:translate(-50%);transform:translate(-50%);position:absolute;z-index:10}.consoleMes{text-align:left;border:solid;border-width:1px;border-color:#d3d3d3;border-radius:5px;padding-left:10px;padding-top:20px;padding-bottom:20px;color:#fff;background-color:#241d1d;font:.8em Andale Mono,Consolas,Courier New;font-weight:700;font-size:1.1em;min-height:100px;overflow-y:scroll}#console-input{max-height:300px}.direction{border:solid;border-color:#d3d3d3;border-width:1px;border-radius:50%}.touched{background-color:#add8e6}.command{text-align:center}.logo-vue{width:30px;margin-left:15px}.logo{margin-left:12px}#logo-robot{width:35px;margin-top:7px;margin-left:16px}#logo-connection{width:16px;margin-top:5px;margin-left:30px}#logo-battery{width:50px;margin-left:30px}#led-connection{width:20px;height:20px;padding-left:10px;margin-left:10px}.led{border-radius:50%;background-color:red;border:solid;border-width:2px}.light{background-color:#0f0}#fps{position:absolute;top:10px;left:20px;color:red}#video{width:100%;-webkit-user-select:none;-moz-user-select:none;-o-user-select:none;-ms-user-select:none;user-select:none}#video:hover{cursor:crosshair}.clikable:hover{cursor:pointer}.position_place{border:solid;border-color:#add8e6;padding:10px;border-width:1px}.loading{padding-top:10%;position:fixed;z-index:10;width:100%;height:100%;background-color:#2e2525;color:hsla(0,0%,100%,.788)}.center{text-align:center;width:100%}
|
||||
/*# sourceMappingURL=app.4a7868781302837201d91bdb0ae1e87b.css.map */
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"sources":["app.4a7868781302837201d91bdb0ae1e87b.css"],"names":[],"mappings":"AACA,OACE,gBAAiB,AACjB,kCAAmC,AAC3B,0BAA2B,AACnC,kBAAmB,AACnB,UAAY,CACb,AAqCD,YACG,gBAAiB,AACjB,aAAa,AACb,iBAAiB,AACjB,qBAAuB,AACvB,kBAAkB,AAClB,kBAAmB,AACnB,iBAAiB,AACjB,oBAAoB,AACpB,WAAY,AACZ,yBAAiC,AACjC,2CAAmD,AACnD,gBAAkB,AAClB,gBAAiB,AACjB,iBAAkB,AAClB,iBAAmB,CACrB,AACD,eACI,gBAAkB,CACrB,AAED,WACI,aAAa,AACb,qBAAuB,AACvB,iBAAkB,AAClB,iBAAmB,CACtB,AACD,SACI,wBAA2B,CAC9B,AACD,SACI,iBAAmB,CACtB,AAED,UACI,WAAY,AACZ,gBAAiB,CACpB,AAED,MACE,gBAAiB,CAClB,AACD,YACE,WAAY,AACZ,eAAe,AACf,gBAAiB,CAClB,AACD,iBACE,WAAY,AACZ,eAAe,AACf,gBAAiB,CAClB,AACD,cACE,WAAW,AACX,gBAAkB,CACnB,AACD,gBACE,WAAW,AACX,YAAa,AACb,kBAAkB,AAClB,gBAAiB,CAClB,AAED,KACI,kBAAmB,AACnB,qBAAsB,AACtB,aAAa,AACb,gBAAkB,CACrB,AACD,OACI,qBAAiC,CACpC,AAED,KACG,kBAAmB,AACnB,SAAS,AACT,UAAU,AACV,SAAU,CACZ,AACD,OACG,WAAY,AACZ,yBAA0B,AAC1B,sBAAuB,AACvB,oBAAqB,AACrB,qBAAsB,AAClB,gBAAkB,CACxB,AACD,aAEG,gBAAiB,CACnB,AACD,gBAEG,cAAe,CACjB,AACD,gBACE,aAAa,AACb,qBAAwB,AACxB,aAAe,AACf,gBAAkB,CACnB,AAED,SACI,gBAAiB,AACjB,eAAe,AACf,WAAY,AACZ,WAAW,AACX,YAAa,AACb,yBAAkC,AAClC,0BAAkC,CACrC,AAED,QACI,kBAAmB,AAEnB,UAAY,CACf","file":"app.4a7868781302837201d91bdb0ae1e87b.css","sourcesContent":["\n.notif{\n margin-left: 50%;\n -webkit-transform: translate(-50%);\n transform: translate(-50%);\n position: absolute;\n z-index: 10;\n}\n.center{\n text-align: center;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.consoleMes{\n text-align: left; \n border:solid;\n border-width:1px;\n border-color:lightgray;\n border-radius:5px;\n padding-left: 10px;\n padding-top:20px;\n padding-bottom:20px;\n color:white;\n background-color:rgb(36, 29, 29);\n font: 0.8em 'Andale Mono', Consolas, 'Courier New';\n font-weight: bold;\n font-size: 1.1em;\n min-height: 100px;\n overflow-y: scroll;\n}\n#console-input{\n max-height: 300px;\n}\n\n.direction{\n border:solid;\n border-color:lightgray;\n border-width: 1px;\n border-radius: 50%;\n}\n.touched{\n background-color:lightblue;\n}\n.command{\n text-align: center;\n}\n\n.logo-vue{\n width: 30px;\n margin-left:15px;\n}\n\n.logo{\n margin-left:12px;\n}\n#logo-robot{\n width: 35px;\n margin-top:7px;\n margin-left:16px;\n}\n#logo-connection{\n width: 16px;\n margin-top:5px;\n margin-left:30px;\n}\n#logo-battery{\n width:50px;\n margin-left: 30px;\n}\n#led-connection{\n width:20px;\n height: 20px;\n padding-left:10px;\n margin-left:10px;\n}\n\n.led{\n border-radius: 50%;\n background-color: red;\n border:solid;\n border-width: 2px;\n}\n.light{\n background-color: rgb(0, 255, 0);\n}\n\n#fps{\n position: absolute;\n top:10px;\n left:20px;\n color:red;\n}\n#video{\n width: 100%;\n -webkit-user-select: none;\n -moz-user-select: none;\n -o-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n#video:hover\n {\n cursor:crosshair;\n}\n.clikable:hover\n {\n cursor:pointer;\n}\n.position_place{\n border:solid;\n border-color: lightblue;\n padding : 10px;\n border-width: 1px;\n}\n\n.loading{\n padding-top: 10%;\n position:fixed;\n z-index: 10;\n width:100%;\n height: 100%;\n background-color: rgb(46, 37, 37);\n color: rgba(255, 255, 255, 0.788);\n} \n\n.center{\n text-align: center;\n\n width: 100%;\n}\n"]}
|
|
@ -1,2 +0,0 @@
|
|||
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var i,u,f,s=0,l=[];s<r.length;s++)u=r[s],t[u]&&l.push(t[u][0]),t[u]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(n&&n(r,c,a);l.length;)l.shift()();if(a)for(s=0;s<a.length;s++)f=o(o.s=a[s]);return f};var r={},t={2:0};function o(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,o){n=t[e]=[r,o]});n[2]=r;var c=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,o.nc&&a.setAttribute("nonce",o.nc),a.src=o.p+"static/js/"+e+"."+{0:"b426f2cbabf67eb78c1a",1:"29d7c2a7593408c61110"}[e]+".js";var i=setTimeout(u,12e4);function u(){a.onerror=a.onload=null,clearTimeout(i);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=u,c.appendChild(a),r},o.m=e,o.c=r,o.d=function(e,n,r){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="/",o.oe=function(e){throw console.error(e),e}}([]);
|
||||
//# sourceMappingURL=manifest.718132ea847827f5d365.js.map
|
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 6.7 KiB |
|
@ -1,14 +0,0 @@
|
|||
<svg width="37" height="45" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect x="-1" y="-1" width="4.998385" height="5.646685" id="canvas_background" fill="none"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="3" x="1.499999" y="12.033397" width="34" height="31.198336" id="svg_1"/>
|
||||
<path fill="#ffffff" stroke="#ffffff" stroke-width="3" d="m1.787369,10.792826l6.707077,-9.292826l20.121235,0l6.706993,9.292826l-6.706993,9.293005l-20.121235,0l-6.707077,-9.293005z" id="svg_3"/>
|
||||
<path fill="#ff007f" stroke="#f50057" stroke-width="0.1" d="m6.012915,23.986172c3.391615,0 6.58049,1.356598 8.976097,3.815023c2.400892,2.460051 3.720869,5.73773 3.720869,9.225225l5.228432,0c0,-10.132326 -8.042473,-18.374136 -17.92646,-18.374136l0,5.333887l0.001063,0l-0.000001,0zm0.006737,-9.457245c12.090816,0 21.925318,10.094976 21.925318,22.503983l5.226238,0c0,-15.349382 -12.180334,-27.8395 -27.152637,-27.8395l0,5.335514l0.001082,0l-0.000001,0.000004zm7.228214,18.774704c0,2.041348 -1.620888,3.698376 -3.619726,3.698376s-3.619571,-1.657028 -3.619571,-3.698376c0,-2.037918 1.620992,-3.694717 3.619571,-3.694717s3.619726,1.653553 3.619726,3.694717z" id="svg_8"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
|
@ -1,13 +0,0 @@
|
|||
<svg width="52" height="42" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="44" width="54" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path id="svg_7" d="m47.913887,6.962914c0,3.845634 -9.750057,6.963047 -21.777805,6.963047m21.777805,-6.963047l0,0c0,3.845634 -9.750057,6.963047 -21.777805,6.963047c-12.027187,0 -21.777691,-3.117413 -21.777691,-6.963047m0,0l0,0c0,-3.845406 9.750504,-6.962914 21.777691,-6.962914c12.027748,0 21.777805,3.117508 21.777805,6.962914l0,27.851788c0,3.845512 -9.750057,6.96302 -21.777805,6.96302c-12.027187,0 -21.777691,-3.117508 -21.777691,-6.96302l0,-27.851788z" stroke-width="NaN" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<line stroke-linecap="null" stroke-linejoin="null" id="svg_8" y2="32.176623" x2="50.555556" y1="9.806282" x1="50.703705" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<line stroke-linecap="null" stroke-linejoin="null" id="svg_9" y2="32.769215" x2="1.296296" y1="10.398873" x1="1.444445" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
|
@ -1,14 +0,0 @@
|
|||
<svg width="72" height="49" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="51" width="74" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path id="svg_7" d="m58.199665,10.123037c0,3.845639 -9.750061,6.963049 -21.777809,6.963049m21.777809,-6.963049l0,0c0,3.845639 -9.750061,6.963049 -21.777809,6.963049c-12.027191,0 -21.777691,-3.11741 -21.777691,-6.963049m0,0l0,0c0,-3.8454 9.7505,-6.96291 21.777691,-6.96291c12.027748,0 21.777809,3.11751 21.777809,6.96291l0,27.851789c0,3.845509 -9.750061,6.96302 -21.777809,6.96302c-12.027191,0 -21.777691,-3.117512 -21.777691,-6.96302l0,-27.851789z" stroke-width="NaN" stroke="#ffffff" fill="#ffffff"/>
|
||||
<line stroke-linecap="null" stroke-linejoin="null" id="svg_8" y2="33.926006" x2="65.660338" y1="11.555665" x1="65.808487" stroke-width="5" stroke="#ffffff" fill="none"/>
|
||||
<line stroke-linecap="null" stroke-linejoin="null" id="svg_9" y2="33.847692" x2="7.819088" y1="11.47735" x1="7.967237" stroke-width="5" stroke="#ffffff" fill="none"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 364 KiB |
|
@ -1,17 +0,0 @@
|
|||
{
|
||||
"name": "dumby_ui",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "server.js",
|
||||
"scripts": {
|
||||
"start": "nodemon server.js"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"express": "^4.16.2",
|
||||
"socket.io": "^2.0.4",
|
||||
"socket.io-client": "^2.0.4"
|
||||
}
|
||||
}
|
|
@ -1,312 +0,0 @@
|
|||
#!/usr/local/bin/node
|
||||
|
||||
const express = require('express');
|
||||
|
||||
const app = express();
|
||||
const http = require('http').Server(app);
|
||||
const net = require('net');
|
||||
const io = require('socket.io')(http);
|
||||
let numMes = 1;
|
||||
|
||||
app.use(express.static(__dirname + '/dist'));
|
||||
|
||||
const socket = new net.Socket();
|
||||
socket.setEncoding('hex');
|
||||
|
||||
const ipSuperviseur = 'localhost';
|
||||
const port = process.env.port || 3000;
|
||||
let dataInReception = '';
|
||||
let lastRequest = '';
|
||||
let dateOrigin;
|
||||
const connections = [];
|
||||
|
||||
/** DECLARATION FONCTIONS */
|
||||
|
||||
/*
|
||||
* Fonction qui retourne le temps à un message passé en paramétre
|
||||
*/
|
||||
function addTime(msg) {
|
||||
const a = Math.abs(new Date() - dateOrigin);
|
||||
const date = new Date(a);
|
||||
const message = `<${date.getMinutes()}:${date.getSeconds()}:${date.getMilliseconds()}>${msg}`;
|
||||
return message;
|
||||
}
|
||||
|
||||
function sendConsole(msg) {
|
||||
io.emit('consoleIn', addTime(msg));
|
||||
}
|
||||
|
||||
/*
|
||||
* Conversion chaine de caractére avec des informations hexa en chaine de caractére
|
||||
* avec les informations ascii.
|
||||
*/
|
||||
|
||||
function sendNotification(typemes, text) {
|
||||
const myObj = {
|
||||
msg: `${numMes} ${text}`,
|
||||
type: typemes,
|
||||
};
|
||||
io.emit('notifications', myObj);
|
||||
numMes++;
|
||||
}
|
||||
|
||||
function hex2a(hexx) {
|
||||
const hex = hexx.toString();
|
||||
let str = '';
|
||||
for (let i = 0; i < hex.length; i += 2) {
|
||||
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
function disconnectTcp() {
|
||||
socket.write('STO: ');
|
||||
lastRequest = 'disconnection';
|
||||
sendConsole('Déconnecté de la cible');
|
||||
}
|
||||
|
||||
function moveForward() {
|
||||
socket.write('DMB:F ');
|
||||
lastRequest = 'GoingForward';
|
||||
sendConsole('Avance');
|
||||
}
|
||||
|
||||
function moveBack() {
|
||||
socket.write('DMB:B ');
|
||||
lastRequest = 'GoingBack';
|
||||
sendConsole('recule');
|
||||
}
|
||||
|
||||
function moveRight() {
|
||||
socket.write('DMB:R ');
|
||||
lastRequest = 'TurnRight';
|
||||
sendConsole('pivot droite');
|
||||
}
|
||||
|
||||
function moveLeft() {
|
||||
socket.write('DMB:L ');
|
||||
lastRequest = 'TurnLeft';
|
||||
sendConsole('pivotGauche');
|
||||
}
|
||||
|
||||
function stopMove() {
|
||||
socket.write('DMB:S ');
|
||||
lastRequest = 'Stop';
|
||||
sendConsole('Stop');
|
||||
}
|
||||
|
||||
function startWithWDDumby() {
|
||||
socket.write('DMB:W ');
|
||||
lastRequest = 'StartDumbyWithWD';
|
||||
}
|
||||
|
||||
function startWithoutWDDumby() {
|
||||
socket.write('DMB:u ');
|
||||
lastRequest = 'StartDumbyWithoutWD';
|
||||
}
|
||||
|
||||
function restartState() {
|
||||
socket.write('DMB:r ');
|
||||
lastRequest = 'idleDumby';
|
||||
}
|
||||
|
||||
function sendPos(position) {
|
||||
socket.write(`POS:${position.x},${position.y} `);
|
||||
lastRequest = 'SendPosition';
|
||||
sendConsole(`Envoi position : ${position.x}, ${position.y}`);
|
||||
}
|
||||
|
||||
function setDisplayPos(data){
|
||||
if(data === true){
|
||||
socket.write('CAM:p ');
|
||||
lastRequest='displayPos';
|
||||
}else{
|
||||
socket.write('CAM:s ');
|
||||
lastRequest='dontDisplayPos';
|
||||
}
|
||||
}
|
||||
|
||||
function eventArena(data) {
|
||||
if(data === 'ask'){
|
||||
socket.write('CAM:y ');
|
||||
lastRequest = 'askArena';
|
||||
} else if(data ==='ok'){
|
||||
socket.write('CAM:x ');
|
||||
lastRequest = 'arenaConfirm';
|
||||
}else if(data ==='nok'){
|
||||
socket.write('CAM:z ');
|
||||
lastRequest = 'arenaInfirm';
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Traite une trame de donnée reçu.
|
||||
*/
|
||||
function traitmentMessage(val) {
|
||||
let payload = val.substring(6);
|
||||
const header = hex2a(val.substring(0, 6));
|
||||
if (header !== 'IMG') {
|
||||
payload = hex2a(payload);
|
||||
sendConsole(`Reçu : ${header}:${payload}`);
|
||||
}
|
||||
if (header === 'LCD') {
|
||||
io.emit('lostSerial', false);
|
||||
sendNotification('error', 'Communication Xbee : Perdu');
|
||||
}
|
||||
if (header === 'ACK') {
|
||||
if (lastRequest === 'IdleDumby') {
|
||||
io.emit('dumberDisconected');
|
||||
}
|
||||
if (lastRequest === 'openSerial') {
|
||||
io.emit('serialOpen', true);
|
||||
sendNotification('success', 'Communication Xbee : OK');
|
||||
}
|
||||
if (lastRequest === 'closeSerial') {
|
||||
io.emit('serialOpen', false);
|
||||
sendNotification('warning', 'Communication Xbee : fermé');
|
||||
}
|
||||
if (lastRequest === 'cameraActive') {
|
||||
io.emit('cameraState', true);
|
||||
sendNotification('info', 'Camera activé');
|
||||
}
|
||||
if (lastRequest === 'cameraInactive') {
|
||||
io.emit('cameraState', false);
|
||||
sendNotification('info', 'Camera désactivé');
|
||||
}
|
||||
if (lastRequest === 'StartDumbyWithWD' || lastRequest === 'StartDumbyWithoutWD') {
|
||||
sendConsole('Dumby is now started');
|
||||
io.emit('dumbyStart', true);
|
||||
}
|
||||
if (lastRequest === 'idleDumby') {
|
||||
sendConsole('Dumby is now stoped');
|
||||
io.emit('dumbyStart', false);
|
||||
}
|
||||
} else if (header === 'NAK') {
|
||||
sendNotification('error', `Error with last request : ${lastRequest}`);
|
||||
if(lastRequest === 'askArena'){
|
||||
io.emit('detectionError');
|
||||
}
|
||||
} else {
|
||||
if(header === 'BAT'){
|
||||
io.emit(header, payload.toString());
|
||||
}else{
|
||||
io.emit(header, payload);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function serial(data) {
|
||||
if (data === true) {
|
||||
socket.write('COM:o ');
|
||||
lastRequest = 'openSerial';
|
||||
} else {
|
||||
socket.write('COM:C ');
|
||||
lastRequest = 'closeSerial';
|
||||
}
|
||||
}
|
||||
|
||||
function specialMes(data) {
|
||||
sendConsole(data);
|
||||
socket.write(`MSG:${data} `);
|
||||
}
|
||||
|
||||
function camera(state) {
|
||||
if (state === true) {
|
||||
lastRequest = 'cameraActive';
|
||||
socket.write('CAM:A ');
|
||||
} else {
|
||||
lastRequest = 'cameraInactive';
|
||||
socket.write('CAM:I ');
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Descriptions des fonctions de call back
|
||||
*/
|
||||
|
||||
function connectTcp() {
|
||||
socket.connect(8080, ipSuperviseur, (err) => {
|
||||
if (!err) {
|
||||
dateOrigin = new Date();
|
||||
io.emit('superViseurConnection', true);
|
||||
sendNotification('success', 'Connecté au superviseur');
|
||||
//sendConsole('Connecté au superviseur');
|
||||
} else {
|
||||
console.log('erreurConnection');
|
||||
sendNotification('danger', 'Erreur lors de la connection');
|
||||
//sendConsole('Erreur survenue lors de la connection au superviseur');
|
||||
}
|
||||
});
|
||||
lastRequest = 'Connection';
|
||||
}
|
||||
|
||||
/*
|
||||
* bind des evenenements aux fonctions de callback
|
||||
* Gestion des clients connecté dans la list client[]
|
||||
*/
|
||||
|
||||
function handleConnection(client) {
|
||||
sendNotification('success', 'Votre interface est connecté au serveur node');
|
||||
connections.push(client);
|
||||
client.on('askConnection', connectTcp);
|
||||
client.on('askDisconnection', disconnectTcp);
|
||||
client.on('startWithWD', startWithWDDumby);
|
||||
client.on('startWitouthWD', startWithoutWDDumby);
|
||||
client.on('idle', restartState);
|
||||
client.on('sendPos', sendPos);
|
||||
client.on('displayPos', setDisplayPos);
|
||||
client.on('arena', eventArena);
|
||||
client.on('MOVEFORWARD', moveForward);
|
||||
client.on('MOVEBACK', moveBack);
|
||||
client.on('MOVERIGHT', moveRight);
|
||||
client.on('MOVELEFT', moveLeft);
|
||||
client.on('MOVESTOP', stopMove);
|
||||
client.on('openSerial', serial);
|
||||
client.on('camera', camera);
|
||||
client.on('console-out', specialMes);
|
||||
|
||||
client.on('disconnect', () => {
|
||||
const index = connections.indexOf(client);
|
||||
connections.splice(index, 1);
|
||||
});
|
||||
}
|
||||
|
||||
/** FIN DECLARATION FONCTION */
|
||||
socket.on('error', (err) => {
|
||||
console.log(`${err}`);
|
||||
sendNotification('error', 'Erreur impossible de se connecter');
|
||||
io.emit('superViseurConnection', false);
|
||||
lastRequest = '';
|
||||
});
|
||||
|
||||
io.on('connection', handleConnection);
|
||||
|
||||
socket.on('end', () => {
|
||||
console.log('superviseur déconnecté');
|
||||
sendNotification('error', ' Connection au superviseur perdu');
|
||||
io.emit('superViseurConnection', false);
|
||||
lastRequest = '';
|
||||
});
|
||||
|
||||
/*
|
||||
* Evenement sur une donnée tcp reçu
|
||||
*/
|
||||
socket.on('data', (data) => {
|
||||
const trame = data.split('5452414d45'); // Trame sera le parser final ici écrit en hexa
|
||||
dataInReception += trame[0];
|
||||
if (trame.length > 1) {
|
||||
traitmentMessage(dataInReception);
|
||||
for (let i = 1; i < trame.length - 1; i++) {
|
||||
traitmentMessage(trame[i]);
|
||||
}
|
||||
dataInReception = trame[trame.length - 1];
|
||||
}
|
||||
});
|
||||
|
||||
/* Gestions des routes
|
||||
* */
|
||||
app.get('/', (req, res) => {
|
||||
res.sendFile('index.html');
|
||||
});
|
||||
|
||||
http.listen(port); // Lancement du serveur web
|
||||
console.log(`server is now running on port ${port}`);
|
|
@ -1,96 +0,0 @@
|
|||
<template>
|
||||
<div id="app">
|
||||
<v-app v-if="wsConnected">
|
||||
<NotesList class="notif"/>
|
||||
<v-container grid-list-md>
|
||||
<Navbar :tcpState="tcpConnected" :serialState="serialOpened"/>
|
||||
<v-layout row wrap>
|
||||
<v-flex d-flex xs12 sm6 md6>
|
||||
<Video :tcpState="tcpConnected"/>
|
||||
</v-flex>
|
||||
<v-flex d-flex xs12 sm6 md6>
|
||||
<v-layout row wrap xs12>
|
||||
<v-flex d-flex>
|
||||
<Dashboard :tcpState="tcpConnected" :serialState="serialOpened"/>
|
||||
</v-flex>
|
||||
</v-layout>
|
||||
</v-flex>
|
||||
<v-flex d-flex xs12 sm12 md12 class="hidden-sm-and-down">
|
||||
<Console :tcpState="tcpConnected" :serialState="serialOpened"/>
|
||||
</v-flex>
|
||||
</v-layout>
|
||||
<FooterBar/>
|
||||
</v-container>
|
||||
</v-app>
|
||||
<v-app v-else>
|
||||
<Loading class="center"/>
|
||||
</v-app>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import NotesList from './components/NotificationList'
|
||||
import Console from './components/Console'
|
||||
import Controller from './components/Controller'
|
||||
import FooterBar from './components/Footerbar'
|
||||
import Navbar from './components/MyNavbar'
|
||||
import Video from './components/Video'
|
||||
import Loading from './components/LoadingScreen'
|
||||
import Dashboard from './components/DashBoard'
|
||||
|
||||
export default {
|
||||
name: 'App',
|
||||
data:()=>{
|
||||
return{
|
||||
wsConnected: false,
|
||||
tcpConnected:false,
|
||||
serialOpened:false,
|
||||
}
|
||||
},
|
||||
components: {
|
||||
NotesList,
|
||||
Console,
|
||||
Controller,
|
||||
Navbar,
|
||||
FooterBar,
|
||||
Video,
|
||||
Loading,
|
||||
Dashboard,
|
||||
},
|
||||
sockets:{
|
||||
connect: function(){
|
||||
return this.wsConnected=true;
|
||||
},
|
||||
disconnect: function(){
|
||||
this.wsConnected=false;
|
||||
this.tcpConnected = false;
|
||||
this.tcpSerial = false;
|
||||
|
||||
},
|
||||
superViseurConnection: function(state){
|
||||
if(typeof(state) === 'boolean')
|
||||
this.tcpConnected = state;
|
||||
if(state === false)
|
||||
this.serialOpened = false;
|
||||
},
|
||||
serialOpen: function(state){
|
||||
if(typeof(state) === 'boolean')
|
||||
this.serialOpened = state;
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.notif{
|
||||
margin-left: 50%;
|
||||
transform: translate(-50%);
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.center{
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 364 KiB |
|
@ -1,66 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<v-layout row wrap>
|
||||
<v-flex d-flex xs12>
|
||||
<div id="console-input" class="ui fluid consoleMes"></div>
|
||||
</v-flex>
|
||||
<v-flex d-flex xs12>
|
||||
<v-text-field :disabled="!tcpState" @keyup.enter="consoleOut" label="Envoi Message Console" v-model="output"> </v-text-field>
|
||||
<v-btn :disabled="!tcpState" icon @click="consoleOut" color="primary" dark><v-icon>send</v-icon></v-btn>
|
||||
</v-flex>
|
||||
</v-layout>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props:['tcpState', 'serialState'],
|
||||
data:()=>{
|
||||
return {
|
||||
output: '',
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
consoleIn(message){
|
||||
if(this.tcpState === true){
|
||||
let balise = document.createElement('div');
|
||||
balise.textContent = message;
|
||||
let console = document.getElementById('console-input').prepend(balise);
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
consoleOut(){
|
||||
if(this.output !==''){
|
||||
this.$socket.emit('console-out',this.output.replace(/\s/g, ""));
|
||||
this.output = '';
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.consoleMes{
|
||||
text-align: left;
|
||||
border:solid;
|
||||
border-width:1px;
|
||||
border-color:lightgray;
|
||||
border-radius:5px;
|
||||
padding-left: 10px;
|
||||
padding-top:20px;
|
||||
padding-bottom:20px;
|
||||
color:white;
|
||||
background-color:rgb(36, 29, 29);
|
||||
font: 0.8em 'Andale Mono', Consolas, 'Courier New';
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
min-height: 100px;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
#console-input{
|
||||
max-height: 300px;
|
||||
}
|
||||
</style>
|
|
@ -1,103 +0,0 @@
|
|||
<template>
|
||||
<div class="command">
|
||||
<img id="up" src="/static/arrow-up.svg" class="direction" v-bind:class="{touched: keyup}">
|
||||
<div>
|
||||
<img id="left" src="/static/arrow-left.svg" class="direction" v-bind:class="{touched: keyleft}">
|
||||
<img id="down" src="/static/arrow-down.svg" class="direction" v-bind:class="{touched: keydown}">
|
||||
<img id="right" src="/static/arrow-right.svg" class="direction" v-bind:class="{touched: keyright}">
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data:()=>{
|
||||
return {
|
||||
keyup: false, //38
|
||||
keydown: false, // 40
|
||||
keyleft:false, // 37
|
||||
keyright:false // 39
|
||||
}
|
||||
},
|
||||
mounted:function(){
|
||||
window.addEventListener('keydown', (event)=> {
|
||||
if (event.keyCode == 37) {
|
||||
this.keyleft= true;
|
||||
}
|
||||
if (event.keyCode == 38) {
|
||||
this.keyup=true;
|
||||
}
|
||||
if (event.keyCode == 39) {
|
||||
this.keyright=true;
|
||||
}
|
||||
if (event.keyCode == 40) {
|
||||
this.keydown=true;
|
||||
}
|
||||
});
|
||||
window.addEventListener('keyup', (event)=> {
|
||||
if (event.keyCode == 37 ) {
|
||||
this.keyleft=false;
|
||||
}
|
||||
if (event.keyCode == 38 ) {
|
||||
this.keyup=false;
|
||||
}
|
||||
if (event.keyCode == 39 ) {
|
||||
this.keyright=false;
|
||||
}
|
||||
if (event.keyCode == 40 ) {
|
||||
this.keydown=false;
|
||||
}
|
||||
});
|
||||
},
|
||||
watch:{
|
||||
keyup:function(){
|
||||
if(this.keyup===true){
|
||||
this.$socket.emit('MOVEFORWARD');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('MOVESTOP');
|
||||
}
|
||||
},
|
||||
keyleft:function(){
|
||||
if(this.keyleft===true){
|
||||
this.$socket.emit('MOVERIGHT');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('MOVESTOP');
|
||||
}
|
||||
},
|
||||
keydown:function(){
|
||||
if(this.keydown===true){
|
||||
this.$socket.emit('MOVEBACK');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('MOVESTOP');
|
||||
}
|
||||
},
|
||||
keyright:function(){
|
||||
if(this.keyright===true){
|
||||
this.$socket.emit('MOVELEFT');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('MOVESTOP');
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.direction{
|
||||
border:solid;
|
||||
border-color:lightgray;
|
||||
border-width: 1px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.touched{
|
||||
background-color:lightblue;
|
||||
}
|
||||
.command{
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
|
@ -1,95 +0,0 @@
|
|||
<template>
|
||||
<v-card color="grey lighten-4" flat>
|
||||
<v-card-title primary class="title hidden-xs">
|
||||
<div class="center">
|
||||
<h3 class="display-1 mb-0">Robot Dashboard</h3>
|
||||
<div class="title">
|
||||
Demande d'ouverture du serial port <v-btn @click="manageSerial" :disabled="!tcpState" color="primary" flat slot="activator"><div v-if="!serialState">Ouverture Serial</div><div v-else>Fermeture Serial</div></v-btn>
|
||||
</div>
|
||||
<div class="title">
|
||||
Faire changer le robot d'état
|
||||
<v-menu :disabled="!serialState" offset-y>
|
||||
<v-btn :disabled="!serialState" color="primary" flat slot="activator">RUN ou IDLE</v-btn>
|
||||
<v-list>
|
||||
<v-list-tile @click="startWithWD">
|
||||
<v-list-tile-title> Demarer avec watchdog </v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile @click="startWithoutWD">
|
||||
<v-list-tile-title> Demarer sans watchdog </v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile @click="stopIdle">
|
||||
<v-list-tile-title> Robot à l'état IDLE </v-list-tile-title>
|
||||
</v-list-tile>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
</div>
|
||||
</div>
|
||||
</v-card-title>
|
||||
<Controller v-if="dumbyStarted"/>
|
||||
</v-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Voyant from './Voyant'
|
||||
import Controller from './Controller'
|
||||
export default {
|
||||
components:{
|
||||
Controller,
|
||||
},
|
||||
data:()=>{
|
||||
return {dumbyStarted:false}
|
||||
},
|
||||
props:['tcpState', 'serialState'],
|
||||
methods:{
|
||||
manageSerial: function(state){
|
||||
if(this.tcpState){
|
||||
this.$socket.emit('openSerial',!this.serialState);
|
||||
}
|
||||
else{
|
||||
this.serialState = false;
|
||||
}
|
||||
|
||||
if(state !== undefined){
|
||||
this.serialState = state;
|
||||
}
|
||||
},
|
||||
startWithWD: function(){
|
||||
this.$socket.emit('startWithWD');
|
||||
},
|
||||
startWithoutWD: function(){
|
||||
this.$socket.emit('startWitouthWD');
|
||||
},
|
||||
stopIdle: function(){
|
||||
this.$socket.emit('idle');
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
dumbyStart:function(state){
|
||||
if(this.serialState === true)
|
||||
this.dumbyStarted=state;
|
||||
else this.dumbyStarted=false;
|
||||
},
|
||||
lostSerial: function(){
|
||||
this.dumbyStarted = false;
|
||||
this.serialState = false;
|
||||
},
|
||||
|
||||
},
|
||||
watch:{
|
||||
serialState: function(){
|
||||
if(this.serialState===false){
|
||||
this.dumbyStarted =false;
|
||||
this.manageSerial(false);
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.center{
|
||||
text-align: center;
|
||||
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
|
@ -1,17 +0,0 @@
|
|||
<template>
|
||||
<v-footer class="pa-3" color="pink darken-3">
|
||||
<div style="color:white;">L.Senaneuch</div>
|
||||
<v-spacer></v-spacer>
|
||||
<img class="logo-vue" src="static/logo.png" alt="logo-vue">
|
||||
<img class="logo-vue" src="static/logo-node.png" alt="logo-node">
|
||||
<v-spacer></v-spacer>
|
||||
<div style="color:white;">© INSA - Toulouse {{ new Date().getFullYear() }}</div>
|
||||
</v-footer>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.logo-vue{
|
||||
width: 30px;
|
||||
margin-left:15px;
|
||||
}
|
||||
</style>
|
|
@ -1,18 +0,0 @@
|
|||
<template>
|
||||
<div class="loading">
|
||||
<v-progress-circular indeterminate v-bind:size="70" v-bind:width="7" color="purple"></v-progress-circular>
|
||||
<h1>Non Connecté ! Veuillez vérifier que le serveur node a bien été lancé. Puis rafraichissez la page !</h1>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.loading{
|
||||
padding-top: 10%;
|
||||
position:fixed;
|
||||
z-index: 10;
|
||||
width:100%;
|
||||
height: 100%;
|
||||
background-color: rgb(46, 37, 37);
|
||||
color: rgba(255, 255, 255, 0.788);
|
||||
}
|
||||
</style>
|
|
@ -1,155 +0,0 @@
|
|||
<template>
|
||||
<v-toolbar dark color="pink darken-3">
|
||||
<v-toolbar-title class="white-text hidden-sm-and-down">Dumby User Interface</v-toolbar-title>
|
||||
<v-menu :nudge-width="100">
|
||||
<img class="logo" id="logo-connection" src="static/logo_connection.svg" slot="activator">
|
||||
<v-list>
|
||||
<v-list-tile @click="tcpManageRq">
|
||||
<v-list-tile-title> <div v-if="!tcpState">Connexion au Superviseur</div> <div v-else>Deconnection au Superviseur</div></v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile :disabled="!tcpState" @click="manageSerial" class="hidden-sm-and-up">
|
||||
<v-list-tile-title> <div v-if="!serialState"> Connexion au Robot</div> <div v-else> Deconnexion au Robot </div></v-list-tile-title>
|
||||
</v-list-tile>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-menu :nudge-width="100" class="hidden-sm-and-up">
|
||||
<img class="logo" id="logo-robot" src="static/logo_dumby_white.svg" slot="activator">
|
||||
<v-list>
|
||||
<v-list-tile :disabled="!serialState" @click="runWithWDRq">
|
||||
<v-list-tile-title>Demarrer avec Watchdog</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile :disabled="!serialState" @click="runWithoutWDRq">
|
||||
<v-list-tile-title> Demarrer Sans Watchdog</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile :disabled="!serialState" @click="idleDumby">
|
||||
<v-list-tile-title> Stoper le robot</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-menu :nudge-width="100" class="hidden-sm-and-up">
|
||||
<v-icon class="logo" slot="activator">camera_alt </v-icon>
|
||||
<v-list>
|
||||
<v-list-tile :disabled="!tcpState" @click="manageCamera">
|
||||
<v-list-tile-title>Activer / Désactiver Camera</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile :disabled="!tcpState" @click="arenaDetectionRq">
|
||||
<v-list-tile-title>Detection Arene</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-spacer></v-spacer>
|
||||
<v-tooltip>
|
||||
<Voyant id="led-connection" slot="activator" :ledOn="tcpState"/>
|
||||
<span>Etat de connection au Superviseur</span>
|
||||
</v-tooltip>
|
||||
<v-tooltip>
|
||||
<img id="logo-battery" :src="batterie_src" slot="activator" alt="">
|
||||
<span>Niveau de batterie</span>
|
||||
</v-tooltip>
|
||||
</v-toolbar>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Voyant from './Voyant'
|
||||
export default {
|
||||
components:{
|
||||
Voyant,
|
||||
},
|
||||
props:['tcpState', 'serialState'],
|
||||
data:()=>{
|
||||
return{
|
||||
robotRun: false,
|
||||
battery: 0,
|
||||
batterie_src : '',
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
BAT: function(data){
|
||||
this.battery = parseInt(data);
|
||||
/* if(data === '2'){
|
||||
this.batterie_src = "static/battery_full_white.svg";
|
||||
}else if (data === '1'){
|
||||
this.batterie_src = "static/battery_medium_white.svg";
|
||||
}else{
|
||||
this.batterie_src = "static/battery_low_white.svg";
|
||||
}*/
|
||||
},
|
||||
robotState:function(data){
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
watch: {
|
||||
battery: function(){
|
||||
switch (this.battery) {
|
||||
case 0:
|
||||
this.batterie_src = "static/battery_low_white.svg";
|
||||
break;
|
||||
case 1:
|
||||
this.batterie_src = "static/battery_medium_white.svg";
|
||||
break;
|
||||
case 2:
|
||||
this.batterie_src = "static/battery_full_white.svg";
|
||||
break;
|
||||
default:
|
||||
this.batterie_src= ""
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
tcpManageRq: function(){
|
||||
if(this.tcpState==false){
|
||||
this.$socket.emit('askConnection');
|
||||
console.log('demande de connection');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('askDisconnection');
|
||||
}
|
||||
|
||||
},
|
||||
manageSerial: function(){
|
||||
if(this.tcpState){
|
||||
this.$socket.emit('openSerial',!this.serialState);
|
||||
}
|
||||
},
|
||||
runWithWDRq: function(){
|
||||
},
|
||||
runWithoutWDRq: function(){
|
||||
},
|
||||
idleDumby: function(){
|
||||
},
|
||||
manageCamera: function(){
|
||||
},
|
||||
arenaDetectionRq: function(){
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<style>
|
||||
.logo{
|
||||
margin-left:12px;
|
||||
}
|
||||
#logo-robot{
|
||||
width: 35px;
|
||||
margin-top:7px;
|
||||
margin-left:16px;
|
||||
}
|
||||
#logo-connection{
|
||||
width: 16px;
|
||||
margin-top:5px;
|
||||
margin-left:30px;
|
||||
}
|
||||
#logo-battery{
|
||||
width:50px;
|
||||
margin-left: 30px;
|
||||
}
|
||||
#led-connection{
|
||||
width:20px;
|
||||
height: 20px;
|
||||
padding-left:10px;
|
||||
margin-left:10px;
|
||||
}
|
||||
</style>
|
|
@ -1,33 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<v-alert icon="info" v-for="(notify, index) in list" :id="index" :key="index"
|
||||
:color="notify.type" value="true" transition="slide-y-transition" @click="deleteNotes">
|
||||
{{notify.msg}}
|
||||
</v-alert>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data:()=>{
|
||||
return {
|
||||
list:[],
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
notifications(data){
|
||||
this.list.push(data);
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
deleteNotes(e){
|
||||
const noteSelected = e.target.parentElement.id;
|
||||
this.list = this.list.filter((info, index) => noteSelected != index);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
|
@ -1,169 +0,0 @@
|
|||
<template>
|
||||
<v-card>
|
||||
<img draggable="false" id="video" @click="sendPos" :src="source" alt="Flux Video">
|
||||
<p id="fps"></p>
|
||||
<v-card-actions>
|
||||
<div v-if="!detectionMode">
|
||||
<v-btn @click="manageCamera" :disabled="!tcpState" flat color="orange"> <div v-if="!cameraActive">Activer Camera</div> <div v-else>Désactiver Camera</div> </v-btn>
|
||||
<v-btn @click="askArena" :disabled="!cameraActive" flat color="orange">Detection Arene</v-btn>
|
||||
<v-btn @click="displayPos" :disabled="!cameraActive" flat color="orange"><div v-if="!positionMode">Afficher la position</div> <div v-else>Ne plus afficher la position</div> </v-btn>
|
||||
</div>
|
||||
<div v-else>
|
||||
<v-btn @click="confirmArena" :disabled="!cameraActive" flat color="orange">L'arene me plait</v-btn>
|
||||
<v-btn @click="infirmArena" :disabled="!cameraActive" flat color="orange">L'arene ne me plait pas</v-btn>
|
||||
</div>
|
||||
<div v-if="positionMode" class="subheadingfont position_place">
|
||||
<span v-if="positionMode"> Position : {{robot.x}}, {{robot.y}}</span>
|
||||
</div>
|
||||
<div v-if="positionMode && this.cursor.x !== null" class="subheadingfont position_place">
|
||||
<span> Ordre : {{cursor.x}}, {{cursor.y}}</span>
|
||||
</div>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props:['tcpState'],
|
||||
data:()=>{
|
||||
return{
|
||||
source:'/static/neige.jpg',
|
||||
fps:1,
|
||||
cameraActive: false,
|
||||
positionState: false,
|
||||
detectionMode: false,
|
||||
positionMode: false,
|
||||
robot:{x: -1,y: -1},
|
||||
cursor:{x: null, y: null},
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
hexToBase64 : function(data){
|
||||
return btoa(String.fromCharCode.apply(null, data.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" ")));
|
||||
},
|
||||
manageCamera: function(){
|
||||
if(this.tcpState === true)
|
||||
this.$socket.emit('camera', !this.cameraActive);
|
||||
},
|
||||
askArena: function(){
|
||||
if(this.cameraActive === true)
|
||||
this.$socket.emit('arena', 'ask');
|
||||
this.detectionMode = true;
|
||||
},
|
||||
displayPos:function(){
|
||||
if(this.cameraActive === true){
|
||||
this.$socket.emit('displayPos', !positionMode);
|
||||
this.positionMode= !this.positionMode;
|
||||
}
|
||||
},
|
||||
confirmArena: function(){
|
||||
if(this.cameraActive === true){
|
||||
this.$socket.emit('arena', 'ok');
|
||||
this.detectionMode = false;
|
||||
}
|
||||
},
|
||||
infirmArena: function(){
|
||||
if(this.cameraActive === true){
|
||||
this.$socket.emit('arena', 'nok');
|
||||
this.detectionMode = false;
|
||||
}
|
||||
},
|
||||
displayPos : function(){
|
||||
if(this.cameraActive === true){
|
||||
this.$socket.emit('displayPos', !this.positionMode);
|
||||
this.positionMode = !this.positionMode;
|
||||
|
||||
}
|
||||
},
|
||||
sendPos: function(e){
|
||||
if(this.positionMode === true){
|
||||
let rect = document.getElementById('video').getBoundingClientRect();
|
||||
let robotX = (e.pageX - rect.x)|0, robotY=e.pageY - rect.y;
|
||||
this.cursor.x = parseInt((480/rect.width)*robotX);
|
||||
this.cursor.y = parseInt((360/rect.height)*robotY);
|
||||
this.$socket.emit('sendPos', this.cursor);
|
||||
}
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
IMG: function(data){
|
||||
if(this.cameraActive){
|
||||
let frame;
|
||||
this.source = "data:image/jpeg;base64,";
|
||||
this.source += this.hexToBase64(data);
|
||||
//frame = document.getElementById("video");
|
||||
//frame.src = this.source;
|
||||
this.fps++;
|
||||
}
|
||||
|
||||
},
|
||||
POS: function(data){
|
||||
let a = data.substr(11);
|
||||
a = a.split(';');
|
||||
let x = Number(a[0]);
|
||||
let y = a[1].split('|');
|
||||
y = Number(y[0]);
|
||||
let robot2 = {
|
||||
x,
|
||||
y
|
||||
}
|
||||
this.robot = robot2;
|
||||
},
|
||||
cameraState: function(data){
|
||||
this.cameraActive = data;
|
||||
},
|
||||
detectionError: function(){
|
||||
this.detectionMode=false;
|
||||
}
|
||||
},
|
||||
mounted: function (){
|
||||
setInterval(function(){
|
||||
document.getElementById('fps').innerText = `${this.fps} fps`;
|
||||
this.fps = 0;
|
||||
}.bind(this), 1000);
|
||||
},
|
||||
watch:{
|
||||
tcpState: function(){
|
||||
if(this.tcpState == false){
|
||||
this.cameraActive = false;
|
||||
this.source ="/static/neige.jpg"
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#fps{
|
||||
position: absolute;
|
||||
top:10px;
|
||||
left:20px;
|
||||
color:red;
|
||||
}
|
||||
|
||||
#video{
|
||||
width: 100%;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-o-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
#video:hover
|
||||
{
|
||||
cursor:crosshair;
|
||||
}
|
||||
|
||||
.clikable:hover
|
||||
{
|
||||
cursor:pointer;
|
||||
}
|
||||
.position_place{
|
||||
border:solid;
|
||||
border-color: lightblue;
|
||||
padding : 10px;
|
||||
border-width: 1px;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
<template>
|
||||
<div class="led" :class="{light:ledOn}"></div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props:['ledOn'],
|
||||
data: ()=>{
|
||||
return{
|
||||
light:false,
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<style>
|
||||
.led{
|
||||
border-radius: 50%;
|
||||
background-color: red;
|
||||
border:solid;
|
||||
border-width: 2px;
|
||||
}
|
||||
|
||||
.light{
|
||||
background-color: rgb(0, 255, 0);
|
||||
}
|
||||
</style>
|
|
@ -1,17 +0,0 @@
|
|||
// The Vue build version to load with the `import` command
|
||||
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
|
||||
import Vue from 'vue';
|
||||
import App from './App';
|
||||
import VueSocketio from 'vue-socket.io';
|
||||
import Vuetify from 'vuetify';
|
||||
|
||||
Vue.config.productionTip = false;
|
||||
Vue.use(Vuetify);
|
||||
Vue.use(VueSocketio, location.toString());
|
||||
//Vue.use(VueSocketio, 'localhost:3000 ');
|
||||
/* eslint-disable no-new */
|
||||
new Vue({
|
||||
el: '#app',
|
||||
components: { App },
|
||||
template: '<App/>',
|
||||
});
|
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"presets": [
|
||||
["env", {
|
||||
"modules": false,
|
||||
"targets": {
|
||||
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
|
||||
}
|
||||
}],
|
||||
"stage-2"
|
||||
],
|
||||
"plugins": ["transform-vue-jsx", "transform-runtime"]
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"extends": "airbnb-base",
|
||||
"rules": {
|
||||
"no-console":"error"
|
||||
}
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
.DS_Store
|
||||
node_modules/
|
||||
/dist/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Editor directories and files
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
// https://github.com/michael-ciniawsky/postcss-load-config
|
||||
|
||||
module.exports = {
|
||||
"plugins": {
|
||||
"postcss-import": {},
|
||||
"postcss-url": {},
|
||||
// to edit target browsers: use "browserslist" field in package.json
|
||||
"autoprefixer": {}
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
# dumby-app
|
||||
|
||||
> Ce fichier contient uniquement l'environement de developpement de la partie front de dumber. Il a été créer avec webpack.
|
||||
Lors de la mise en production, seule la partie "dist" a été partagé.
|
||||
|
||||
## Build Setup
|
||||
|
||||
``` bash
|
||||
# install dependencies
|
||||
npm install
|
||||
|
||||
# serve with hot reload at localhost:8080
|
||||
npm run dev
|
||||
|
||||
# build for production with minification
|
||||
npm run build
|
||||
|
||||
# build for production and view the bundle analyzer report
|
||||
npm run build --report
|
||||
```
|
||||
|
||||
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
|
|
@ -1,41 +0,0 @@
|
|||
'use strict'
|
||||
require('./check-versions')()
|
||||
|
||||
process.env.NODE_ENV = 'production'
|
||||
|
||||
const ora = require('ora')
|
||||
const rm = require('rimraf')
|
||||
const path = require('path')
|
||||
const chalk = require('chalk')
|
||||
const webpack = require('webpack')
|
||||
const config = require('../config')
|
||||
const webpackConfig = require('./webpack.prod.conf')
|
||||
|
||||
const spinner = ora('building for production...')
|
||||
spinner.start()
|
||||
|
||||
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
|
||||
if (err) throw err
|
||||
webpack(webpackConfig, (err, stats) => {
|
||||
spinner.stop()
|
||||
if (err) throw err
|
||||
process.stdout.write(stats.toString({
|
||||
colors: true,
|
||||
modules: false,
|
||||
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
|
||||
chunks: false,
|
||||
chunkModules: false
|
||||
}) + '\n\n')
|
||||
|
||||
if (stats.hasErrors()) {
|
||||
console.log(chalk.red(' Build failed with errors.\n'))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
console.log(chalk.cyan(' Build complete.\n'))
|
||||
console.log(chalk.yellow(
|
||||
' Tip: built files are meant to be served over an HTTP server.\n' +
|
||||
' Opening index.html over file:// won\'t work.\n'
|
||||
))
|
||||
})
|
||||
})
|
|
@ -1,54 +0,0 @@
|
|||
'use strict'
|
||||
const chalk = require('chalk')
|
||||
const semver = require('semver')
|
||||
const packageConfig = require('../package.json')
|
||||
const shell = require('shelljs')
|
||||
|
||||
function exec (cmd) {
|
||||
return require('child_process').execSync(cmd).toString().trim()
|
||||
}
|
||||
|
||||
const versionRequirements = [
|
||||
{
|
||||
name: 'node',
|
||||
currentVersion: semver.clean(process.version),
|
||||
versionRequirement: packageConfig.engines.node
|
||||
}
|
||||
]
|
||||
|
||||
if (shell.which('npm')) {
|
||||
versionRequirements.push({
|
||||
name: 'npm',
|
||||
currentVersion: exec('npm --version'),
|
||||
versionRequirement: packageConfig.engines.npm
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = function () {
|
||||
const warnings = []
|
||||
|
||||
for (let i = 0; i < versionRequirements.length; i++) {
|
||||
const mod = versionRequirements[i]
|
||||
|
||||
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
|
||||
warnings.push(mod.name + ': ' +
|
||||
chalk.red(mod.currentVersion) + ' should be ' +
|
||||
chalk.green(mod.versionRequirement)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if (warnings.length) {
|
||||
console.log('')
|
||||
console.log(chalk.yellow('To use this template, you must update following to modules:'))
|
||||
console.log()
|
||||
|
||||
for (let i = 0; i < warnings.length; i++) {
|
||||
const warning = warnings[i]
|
||||
console.log(' ' + warning)
|
||||
}
|
||||
|
||||
console.log()
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 6.7 KiB |
|
@ -1,101 +0,0 @@
|
|||
'use strict'
|
||||
const path = require('path')
|
||||
const config = require('../config')
|
||||
const ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||
const packageConfig = require('../package.json')
|
||||
|
||||
exports.assetsPath = function (_path) {
|
||||
const assetsSubDirectory = process.env.NODE_ENV === 'production'
|
||||
? config.build.assetsSubDirectory
|
||||
: config.dev.assetsSubDirectory
|
||||
|
||||
return path.posix.join(assetsSubDirectory, _path)
|
||||
}
|
||||
|
||||
exports.cssLoaders = function (options) {
|
||||
options = options || {}
|
||||
|
||||
const cssLoader = {
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
sourceMap: options.sourceMap
|
||||
}
|
||||
}
|
||||
|
||||
const postcssLoader = {
|
||||
loader: 'postcss-loader',
|
||||
options: {
|
||||
sourceMap: options.sourceMap
|
||||
}
|
||||
}
|
||||
|
||||
// generate loader string to be used with extract text plugin
|
||||
function generateLoaders (loader, loaderOptions) {
|
||||
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
|
||||
|
||||
if (loader) {
|
||||
loaders.push({
|
||||
loader: loader + '-loader',
|
||||
options: Object.assign({}, loaderOptions, {
|
||||
sourceMap: options.sourceMap
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// Extract CSS when that option is specified
|
||||
// (which is the case during production build)
|
||||
if (options.extract) {
|
||||
return ExtractTextPlugin.extract({
|
||||
use: loaders,
|
||||
fallback: 'vue-style-loader'
|
||||
})
|
||||
} else {
|
||||
return ['vue-style-loader'].concat(loaders)
|
||||
}
|
||||
}
|
||||
|
||||
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
|
||||
return {
|
||||
css: generateLoaders(),
|
||||
postcss: generateLoaders(),
|
||||
less: generateLoaders('less'),
|
||||
sass: generateLoaders('sass', { indentedSyntax: true }),
|
||||
scss: generateLoaders('sass'),
|
||||
stylus: generateLoaders('stylus'),
|
||||
styl: generateLoaders('stylus')
|
||||
}
|
||||
}
|
||||
|
||||
// Generate loaders for standalone style files (outside of .vue)
|
||||
exports.styleLoaders = function (options) {
|
||||
const output = []
|
||||
const loaders = exports.cssLoaders(options)
|
||||
|
||||
for (const extension in loaders) {
|
||||
const loader = loaders[extension]
|
||||
output.push({
|
||||
test: new RegExp('\\.' + extension + '$'),
|
||||
use: loader
|
||||
})
|
||||
}
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
exports.createNotifierCallback = () => {
|
||||
const notifier = require('node-notifier')
|
||||
|
||||
return (severity, errors) => {
|
||||
if (severity !== 'error') return
|
||||
|
||||
const error = errors[0]
|
||||
const filename = error.file && error.file.split('!').pop()
|
||||
|
||||
notifier.notify({
|
||||
title: packageConfig.name,
|
||||
message: severity + ': ' + error.name,
|
||||
subtitle: filename || '',
|
||||
icon: path.join(__dirname, 'logo.png')
|
||||
})
|
||||
}
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
'use strict'
|
||||
const utils = require('./utils')
|
||||
const config = require('../config')
|
||||
const isProduction = process.env.NODE_ENV === 'production'
|
||||
const sourceMapEnabled = isProduction
|
||||
? config.build.productionSourceMap
|
||||
: config.dev.cssSourceMap
|
||||
|
||||
module.exports = {
|
||||
loaders: utils.cssLoaders({
|
||||
sourceMap: sourceMapEnabled,
|
||||
extract: isProduction
|
||||
}),
|
||||
cssSourceMap: sourceMapEnabled,
|
||||
cacheBusting: config.dev.cacheBusting,
|
||||
transformToRequire: {
|
||||
video: ['src', 'poster'],
|
||||
source: 'src',
|
||||
img: 'src',
|
||||
image: 'xlink:href'
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
'use strict'
|
||||
const path = require('path')
|
||||
const utils = require('./utils')
|
||||
const config = require('../config')
|
||||
const vueLoaderConfig = require('./vue-loader.conf')
|
||||
|
||||
function resolve (dir) {
|
||||
return path.join(__dirname, '..', dir)
|
||||
}
|
||||
|
||||
|
||||
|
||||
module.exports = {
|
||||
context: path.resolve(__dirname, '../'),
|
||||
entry: {
|
||||
app: './src/main.js'
|
||||
},
|
||||
output: {
|
||||
path: config.build.assetsRoot,
|
||||
filename: '[name].js',
|
||||
publicPath: process.env.NODE_ENV === 'production'
|
||||
? config.build.assetsPublicPath
|
||||
: config.dev.assetsPublicPath
|
||||
},
|
||||
resolve: {
|
||||
extensions: ['.js', '.vue', '.json'],
|
||||
alias: {
|
||||
'vue$': 'vue/dist/vue.esm.js',
|
||||
'@': resolve('src'),
|
||||
}
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.vue$/,
|
||||
loader: 'vue-loader',
|
||||
options: vueLoaderConfig
|
||||
},
|
||||
{
|
||||
test: /\.js$/,
|
||||
loader: 'babel-loader',
|
||||
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
|
||||
},
|
||||
{
|
||||
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
|
||||
loader: 'url-loader',
|
||||
options: {
|
||||
limit: 10000,
|
||||
name: utils.assetsPath('img/[name].[hash:7].[ext]')
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
|
||||
loader: 'url-loader',
|
||||
options: {
|
||||
limit: 10000,
|
||||
name: utils.assetsPath('media/[name].[hash:7].[ext]')
|
||||
}
|
||||
},
|
||||
{
|
||||
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
|
||||
loader: 'url-loader',
|
||||
options: {
|
||||
limit: 10000,
|
||||
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
node: {
|
||||
// prevent webpack from injecting useless setImmediate polyfill because Vue
|
||||
// source contains it (although only uses it if it's native).
|
||||
setImmediate: false,
|
||||
// prevent webpack from injecting mocks to Node native modules
|
||||
// that does not make sense for the client
|
||||
dgram: 'empty',
|
||||
fs: 'empty',
|
||||
net: 'empty',
|
||||
tls: 'empty',
|
||||
child_process: 'empty'
|
||||
}
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
'use strict'
|
||||
const utils = require('./utils')
|
||||
const webpack = require('webpack')
|
||||
const config = require('../config')
|
||||
const merge = require('webpack-merge')
|
||||
const path = require('path')
|
||||
const baseWebpackConfig = require('./webpack.base.conf')
|
||||
const CopyWebpackPlugin = require('copy-webpack-plugin')
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
|
||||
const portfinder = require('portfinder')
|
||||
|
||||
const HOST = process.env.HOST
|
||||
const PORT = process.env.PORT && Number(process.env.PORT)
|
||||
|
||||
const devWebpackConfig = merge(baseWebpackConfig, {
|
||||
module: {
|
||||
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
|
||||
},
|
||||
// cheap-module-eval-source-map is faster for development
|
||||
devtool: config.dev.devtool,
|
||||
|
||||
// these devServer options should be customized in /config/index.js
|
||||
devServer: {
|
||||
clientLogLevel: 'warning',
|
||||
historyApiFallback: {
|
||||
rewrites: [
|
||||
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
|
||||
],
|
||||
},
|
||||
hot: true,
|
||||
contentBase: false, // since we use CopyWebpackPlugin.
|
||||
compress: true,
|
||||
host: HOST || config.dev.host,
|
||||
port: PORT || config.dev.port,
|
||||
open: config.dev.autoOpenBrowser,
|
||||
overlay: config.dev.errorOverlay
|
||||
? { warnings: false, errors: true }
|
||||
: false,
|
||||
publicPath: config.dev.assetsPublicPath,
|
||||
proxy: config.dev.proxyTable,
|
||||
quiet: true, // necessary for FriendlyErrorsPlugin
|
||||
watchOptions: {
|
||||
poll: config.dev.poll,
|
||||
}
|
||||
},
|
||||
plugins: [
|
||||
new webpack.DefinePlugin({
|
||||
'process.env': require('../config/dev.env')
|
||||
}),
|
||||
new webpack.HotModuleReplacementPlugin(),
|
||||
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
// https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: 'index.html',
|
||||
inject: true
|
||||
}),
|
||||
// copy custom static assets
|
||||
new CopyWebpackPlugin([
|
||||
{
|
||||
from: path.resolve(__dirname, '../static'),
|
||||
to: config.dev.assetsSubDirectory,
|
||||
ignore: ['.*']
|
||||
}
|
||||
])
|
||||
]
|
||||
})
|
||||
|
||||
module.exports = new Promise((resolve, reject) => {
|
||||
portfinder.basePort = process.env.PORT || config.dev.port
|
||||
portfinder.getPort((err, port) => {
|
||||
if (err) {
|
||||
reject(err)
|
||||
} else {
|
||||
// publish the new Port, necessary for e2e tests
|
||||
process.env.PORT = port
|
||||
// add port to devServer config
|
||||
devWebpackConfig.devServer.port = port
|
||||
|
||||
// Add FriendlyErrorsPlugin
|
||||
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
|
||||
compilationSuccessInfo: {
|
||||
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
|
||||
},
|
||||
onErrors: config.dev.notifyOnErrors
|
||||
? utils.createNotifierCallback()
|
||||
: undefined
|
||||
}))
|
||||
|
||||
resolve(devWebpackConfig)
|
||||
}
|
||||
})
|
||||
})
|
|
@ -1,145 +0,0 @@
|
|||
'use strict'
|
||||
const path = require('path')
|
||||
const utils = require('./utils')
|
||||
const webpack = require('webpack')
|
||||
const config = require('../config')
|
||||
const merge = require('webpack-merge')
|
||||
const baseWebpackConfig = require('./webpack.base.conf')
|
||||
const CopyWebpackPlugin = require('copy-webpack-plugin')
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
const ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
|
||||
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
|
||||
|
||||
const env = require('../config/prod.env')
|
||||
|
||||
const webpackConfig = merge(baseWebpackConfig, {
|
||||
module: {
|
||||
rules: utils.styleLoaders({
|
||||
sourceMap: config.build.productionSourceMap,
|
||||
extract: true,
|
||||
usePostCSS: true
|
||||
})
|
||||
},
|
||||
devtool: config.build.productionSourceMap ? config.build.devtool : false,
|
||||
output: {
|
||||
path: config.build.assetsRoot,
|
||||
filename: utils.assetsPath('js/[name].[chunkhash].js'),
|
||||
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
|
||||
},
|
||||
plugins: [
|
||||
// http://vuejs.github.io/vue-loader/en/workflow/production.html
|
||||
new webpack.DefinePlugin({
|
||||
'process.env': env
|
||||
}),
|
||||
new UglifyJsPlugin({
|
||||
uglifyOptions: {
|
||||
compress: {
|
||||
warnings: false
|
||||
}
|
||||
},
|
||||
sourceMap: config.build.productionSourceMap,
|
||||
parallel: true
|
||||
}),
|
||||
// extract css into its own file
|
||||
new ExtractTextPlugin({
|
||||
filename: utils.assetsPath('css/[name].[contenthash].css'),
|
||||
// Setting the following option to `false` will not extract CSS from codesplit chunks.
|
||||
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
|
||||
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
|
||||
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
|
||||
allChunks: true,
|
||||
}),
|
||||
// Compress extracted CSS. We are using this plugin so that possible
|
||||
// duplicated CSS from different components can be deduped.
|
||||
new OptimizeCSSPlugin({
|
||||
cssProcessorOptions: config.build.productionSourceMap
|
||||
? { safe: true, map: { inline: false } }
|
||||
: { safe: true }
|
||||
}),
|
||||
// generate dist index.html with correct asset hash for caching.
|
||||
// you can customize output by editing /index.html
|
||||
// see https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({
|
||||
filename: config.build.index,
|
||||
template: 'index.html',
|
||||
inject: true,
|
||||
minify: {
|
||||
removeComments: true,
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true
|
||||
// more options:
|
||||
// https://github.com/kangax/html-minifier#options-quick-reference
|
||||
},
|
||||
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
|
||||
chunksSortMode: 'dependency'
|
||||
}),
|
||||
// keep module.id stable when vendor modules does not change
|
||||
new webpack.HashedModuleIdsPlugin(),
|
||||
// enable scope hoisting
|
||||
new webpack.optimize.ModuleConcatenationPlugin(),
|
||||
// split vendor js into its own file
|
||||
new webpack.optimize.CommonsChunkPlugin({
|
||||
name: 'vendor',
|
||||
minChunks (module) {
|
||||
// any required modules inside node_modules are extracted to vendor
|
||||
return (
|
||||
module.resource &&
|
||||
/\.js$/.test(module.resource) &&
|
||||
module.resource.indexOf(
|
||||
path.join(__dirname, '../node_modules')
|
||||
) === 0
|
||||
)
|
||||
}
|
||||
}),
|
||||
// extract webpack runtime and module manifest to its own file in order to
|
||||
// prevent vendor hash from being updated whenever app bundle is updated
|
||||
new webpack.optimize.CommonsChunkPlugin({
|
||||
name: 'manifest',
|
||||
minChunks: Infinity
|
||||
}),
|
||||
// This instance extracts shared chunks from code splitted chunks and bundles them
|
||||
// in a separate chunk, similar to the vendor chunk
|
||||
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
|
||||
new webpack.optimize.CommonsChunkPlugin({
|
||||
name: 'app',
|
||||
async: 'vendor-async',
|
||||
children: true,
|
||||
minChunks: 3
|
||||
}),
|
||||
|
||||
// copy custom static assets
|
||||
new CopyWebpackPlugin([
|
||||
{
|
||||
from: path.resolve(__dirname, '../static'),
|
||||
to: config.build.assetsSubDirectory,
|
||||
ignore: ['.*']
|
||||
}
|
||||
])
|
||||
]
|
||||
})
|
||||
|
||||
if (config.build.productionGzip) {
|
||||
const CompressionWebpackPlugin = require('compression-webpack-plugin')
|
||||
|
||||
webpackConfig.plugins.push(
|
||||
new CompressionWebpackPlugin({
|
||||
asset: '[path].gz[query]',
|
||||
algorithm: 'gzip',
|
||||
test: new RegExp(
|
||||
'\\.(' +
|
||||
config.build.productionGzipExtensions.join('|') +
|
||||
')$'
|
||||
),
|
||||
threshold: 10240,
|
||||
minRatio: 0.8
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
if (config.build.bundleAnalyzerReport) {
|
||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
|
||||
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
|
||||
}
|
||||
|
||||
module.exports = webpackConfig
|
|
@ -1,7 +0,0 @@
|
|||
'use strict'
|
||||
const merge = require('webpack-merge')
|
||||
const prodEnv = require('./prod.env')
|
||||
|
||||
module.exports = merge(prodEnv, {
|
||||
NODE_ENV: '"development"'
|
||||
})
|
|
@ -1,69 +0,0 @@
|
|||
'use strict'
|
||||
// Template version: 1.3.1
|
||||
// see http://vuejs-templates.github.io/webpack for documentation.
|
||||
|
||||
const path = require('path')
|
||||
|
||||
module.exports = {
|
||||
dev: {
|
||||
|
||||
// Paths
|
||||
assetsSubDirectory: 'static',
|
||||
assetsPublicPath: '/',
|
||||
proxyTable: {},
|
||||
|
||||
// Various Dev Server settings
|
||||
host: 'localhost', // can be overwritten by process.env.HOST
|
||||
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
|
||||
autoOpenBrowser: false,
|
||||
errorOverlay: true,
|
||||
notifyOnErrors: true,
|
||||
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
|
||||
|
||||
|
||||
/**
|
||||
* Source Maps
|
||||
*/
|
||||
|
||||
// https://webpack.js.org/configuration/devtool/#development
|
||||
devtool: 'cheap-module-eval-source-map',
|
||||
|
||||
// If you have problems debugging vue-files in devtools,
|
||||
// set this to false - it *may* help
|
||||
// https://vue-loader.vuejs.org/en/options.html#cachebusting
|
||||
cacheBusting: true,
|
||||
|
||||
cssSourceMap: true
|
||||
},
|
||||
|
||||
build: {
|
||||
// Template for index.html
|
||||
index: path.resolve(__dirname, '../dist/index.html'),
|
||||
|
||||
// Paths
|
||||
assetsRoot: path.resolve(__dirname, '../dist'),
|
||||
assetsSubDirectory: 'static',
|
||||
assetsPublicPath: '/',
|
||||
|
||||
/**
|
||||
* Source Maps
|
||||
*/
|
||||
|
||||
productionSourceMap: true,
|
||||
// https://webpack.js.org/configuration/devtool/#production
|
||||
devtool: '#source-map',
|
||||
|
||||
// Gzip off by default as many popular static hosts such as
|
||||
// Surge or Netlify already gzip all static assets for you.
|
||||
// Before setting to `true`, make sure to:
|
||||
// npm install --save-dev compression-webpack-plugin
|
||||
productionGzip: false,
|
||||
productionGzipExtensions: ['js', 'css'],
|
||||
|
||||
// Run the build command with an extra argument to
|
||||
// View the bundle analyzer report after build finishes:
|
||||
// `npm run build --report`
|
||||
// Set to `true` or `false` to always turn it on or off
|
||||
bundleAnalyzerReport: process.env.npm_config_report
|
||||
}
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
'use strict'
|
||||
module.exports = {
|
||||
NODE_ENV: '"production"'
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<!--<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.13/components/icon.min.css">-->
|
||||
<link href='https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons' rel="stylesheet">
|
||||
<link href="https://unpkg.com/vuetify/dist/vuetify.min.css" rel="stylesheet">
|
||||
<style>
|
||||
img{
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-o-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
html{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
<title>Dumby User Interface</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
|
||||
</html>
|
11923
software/UserInterfaceWeb/dumby-app/package-lock.json
generated
|
@ -1,66 +0,0 @@
|
|||
{
|
||||
"name": "dumby-app",
|
||||
"version": "1.0.0",
|
||||
"description": "A Vue.js project",
|
||||
"author": "L.Senaneuch",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
|
||||
"start": "npm run dev",
|
||||
"build": "node build/build.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"eslint": "^4.17.0",
|
||||
"vue": "^2.5.2",
|
||||
"vue-socket.io": "^2.1.1-b",
|
||||
"vuetify": "^0.17.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^7.1.2",
|
||||
"babel-core": "^6.22.1",
|
||||
"babel-helper-vue-jsx-merge-props": "^2.0.3",
|
||||
"babel-loader": "^7.1.1",
|
||||
"babel-plugin-syntax-jsx": "^6.18.0",
|
||||
"babel-plugin-transform-runtime": "^6.22.0",
|
||||
"babel-plugin-transform-vue-jsx": "^3.5.0",
|
||||
"babel-preset-env": "^1.3.2",
|
||||
"babel-preset-stage-2": "^6.22.0",
|
||||
"chalk": "^2.0.1",
|
||||
"copy-webpack-plugin": "^4.0.1",
|
||||
"css-loader": "^0.28.0",
|
||||
"eslint-config-airbnb-base": "^12.1.0",
|
||||
"eslint-plugin-import": "^2.8.0",
|
||||
"extract-text-webpack-plugin": "^3.0.0",
|
||||
"file-loader": "^1.1.4",
|
||||
"friendly-errors-webpack-plugin": "^1.6.1",
|
||||
"html-webpack-plugin": "^2.30.1",
|
||||
"node-notifier": "^5.1.2",
|
||||
"optimize-css-assets-webpack-plugin": "^3.2.0",
|
||||
"ora": "^1.2.0",
|
||||
"portfinder": "^1.0.13",
|
||||
"postcss-import": "^11.0.0",
|
||||
"postcss-loader": "^2.0.8",
|
||||
"postcss-url": "^7.2.1",
|
||||
"rimraf": "^2.6.0",
|
||||
"semver": "^5.3.0",
|
||||
"shelljs": "^0.7.6",
|
||||
"uglifyjs-webpack-plugin": "^1.1.1",
|
||||
"url-loader": "^0.5.8",
|
||||
"vue-loader": "^13.3.0",
|
||||
"vue-style-loader": "^3.0.1",
|
||||
"vue-template-compiler": "^2.5.2",
|
||||
"webpack": "^3.6.0",
|
||||
"webpack-bundle-analyzer": "^2.9.0",
|
||||
"webpack-dev-server": "^2.9.1",
|
||||
"webpack-merge": "^4.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6.0.0",
|
||||
"npm": ">= 3.0.0"
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not ie <= 8"
|
||||
]
|
||||
}
|
|
@ -1,96 +0,0 @@
|
|||
<template>
|
||||
<div id="app">
|
||||
<v-app v-if="wsConnected">
|
||||
<NotesList class="notif"/>
|
||||
<v-container grid-list-md>
|
||||
<Navbar :tcpState="tcpConnected" :serialState="serialOpened"/>
|
||||
<v-layout row wrap>
|
||||
<v-flex d-flex xs12 sm6 md6>
|
||||
<Video :tcpState="tcpConnected"/>
|
||||
</v-flex>
|
||||
<v-flex d-flex xs12 sm6 md6>
|
||||
<v-layout row wrap xs12>
|
||||
<v-flex d-flex>
|
||||
<Dashboard :tcpState="tcpConnected" :serialState="serialOpened"/>
|
||||
</v-flex>
|
||||
</v-layout>
|
||||
</v-flex>
|
||||
<v-flex d-flex xs12 sm12 md12 class="hidden-sm-and-down">
|
||||
<Console :tcpState="tcpConnected" :serialState="serialOpened"/>
|
||||
</v-flex>
|
||||
</v-layout>
|
||||
<FooterBar/>
|
||||
</v-container>
|
||||
</v-app>
|
||||
<v-app v-else>
|
||||
<Loading class="center"/>
|
||||
</v-app>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import NotesList from './components/NotificationList'
|
||||
import Console from './components/Console'
|
||||
import Controller from './components/Controller'
|
||||
import FooterBar from './components/Footerbar'
|
||||
import Navbar from './components/MyNavbar'
|
||||
import Video from './components/Video'
|
||||
import Loading from './components/LoadingScreen'
|
||||
import Dashboard from './components/DashBoard'
|
||||
|
||||
export default {
|
||||
name: 'App',
|
||||
data:()=>{
|
||||
return{
|
||||
wsConnected: false,
|
||||
tcpConnected:false,
|
||||
serialOpened:false,
|
||||
}
|
||||
},
|
||||
components: {
|
||||
NotesList,
|
||||
Console,
|
||||
Controller,
|
||||
Navbar,
|
||||
FooterBar,
|
||||
Video,
|
||||
Loading,
|
||||
Dashboard,
|
||||
},
|
||||
sockets:{
|
||||
connect: function(){
|
||||
return this.wsConnected=true;
|
||||
},
|
||||
disconnect: function(){
|
||||
this.wsConnected=false;
|
||||
this.tcpConnected = false;
|
||||
this.tcpSerial = false;
|
||||
|
||||
},
|
||||
superViseurConnection: function(state){
|
||||
if(typeof(state) === 'boolean')
|
||||
this.tcpConnected = state;
|
||||
if(state === false)
|
||||
this.serialOpened = false;
|
||||
},
|
||||
serialOpen: function(state){
|
||||
if(typeof(state) === 'boolean')
|
||||
this.serialOpened = state;
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.notif{
|
||||
margin-left: 50%;
|
||||
transform: translate(-50%);
|
||||
position: absolute;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.center{
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
Before Width: | Height: | Size: 6.7 KiB |
Before Width: | Height: | Size: 364 KiB |
|
@ -1,66 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<v-layout row wrap>
|
||||
<v-flex d-flex xs12>
|
||||
<div id="console-input" class="ui fluid consoleMes"></div>
|
||||
</v-flex>
|
||||
<v-flex d-flex xs12>
|
||||
<v-text-field :disabled="!tcpState" @keyup.enter="consoleOut" label="Envoi Message Console" v-model="output"> </v-text-field>
|
||||
<v-btn :disabled="!tcpState" icon @click="consoleOut" color="primary" dark><v-icon>send</v-icon></v-btn>
|
||||
</v-flex>
|
||||
</v-layout>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props:['tcpState', 'serialState'],
|
||||
data:()=>{
|
||||
return {
|
||||
output: '',
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
consoleIn(message){
|
||||
if(this.tcpState === true){
|
||||
let balise = document.createElement('div');
|
||||
balise.textContent = message;
|
||||
let console = document.getElementById('console-input').prepend(balise);
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
consoleOut(){
|
||||
if(this.output !==''){
|
||||
this.$socket.emit('console-out',this.output.replace(/\s/g, ""));
|
||||
this.output = '';
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.consoleMes{
|
||||
text-align: left;
|
||||
border:solid;
|
||||
border-width:1px;
|
||||
border-color:lightgray;
|
||||
border-radius:5px;
|
||||
padding-left: 10px;
|
||||
padding-top:20px;
|
||||
padding-bottom:20px;
|
||||
color:white;
|
||||
background-color:rgb(36, 29, 29);
|
||||
font: 0.8em 'Andale Mono', Consolas, 'Courier New';
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
min-height: 100px;
|
||||
overflow-y: scroll;
|
||||
}
|
||||
#console-input{
|
||||
max-height: 300px;
|
||||
}
|
||||
</style>
|
|
@ -1,103 +0,0 @@
|
|||
<template>
|
||||
<div class="command">
|
||||
<img id="up" src="/static/arrow-up.svg" class="direction" v-bind:class="{touched: keyup}">
|
||||
<div>
|
||||
<img id="left" src="/static/arrow-left.svg" class="direction" v-bind:class="{touched: keyleft}">
|
||||
<img id="down" src="/static/arrow-down.svg" class="direction" v-bind:class="{touched: keydown}">
|
||||
<img id="right" src="/static/arrow-right.svg" class="direction" v-bind:class="{touched: keyright}">
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data:()=>{
|
||||
return {
|
||||
keyup: false, //38
|
||||
keydown: false, // 40
|
||||
keyleft:false, // 37
|
||||
keyright:false // 39
|
||||
}
|
||||
},
|
||||
mounted:function(){
|
||||
window.addEventListener('keydown', (event)=> {
|
||||
if (event.keyCode == 37) {
|
||||
this.keyleft= true;
|
||||
}
|
||||
if (event.keyCode == 38) {
|
||||
this.keyup=true;
|
||||
}
|
||||
if (event.keyCode == 39) {
|
||||
this.keyright=true;
|
||||
}
|
||||
if (event.keyCode == 40) {
|
||||
this.keydown=true;
|
||||
}
|
||||
});
|
||||
window.addEventListener('keyup', (event)=> {
|
||||
if (event.keyCode == 37 ) {
|
||||
this.keyleft=false;
|
||||
}
|
||||
if (event.keyCode == 38 ) {
|
||||
this.keyup=false;
|
||||
}
|
||||
if (event.keyCode == 39 ) {
|
||||
this.keyright=false;
|
||||
}
|
||||
if (event.keyCode == 40 ) {
|
||||
this.keydown=false;
|
||||
}
|
||||
});
|
||||
},
|
||||
watch:{
|
||||
keyup:function(){
|
||||
if(this.keyup===true){
|
||||
this.$socket.emit('MOVEFORWARD');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('MOVESTOP');
|
||||
}
|
||||
},
|
||||
keyleft:function(){
|
||||
if(this.keyleft===true){
|
||||
this.$socket.emit('MOVERIGHT');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('MOVESTOP');
|
||||
}
|
||||
},
|
||||
keydown:function(){
|
||||
if(this.keydown===true){
|
||||
this.$socket.emit('MOVEBACK');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('MOVESTOP');
|
||||
}
|
||||
},
|
||||
keyright:function(){
|
||||
if(this.keyright===true){
|
||||
this.$socket.emit('MOVELEFT');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('MOVESTOP');
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.direction{
|
||||
border:solid;
|
||||
border-color:lightgray;
|
||||
border-width: 1px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.touched{
|
||||
background-color:lightblue;
|
||||
}
|
||||
.command{
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
|
@ -1,95 +0,0 @@
|
|||
<template>
|
||||
<v-card color="grey lighten-4" flat>
|
||||
<v-card-title primary class="title hidden-xs">
|
||||
<div class="center">
|
||||
<h3 class="display-1 mb-0">Robot Dashboard</h3>
|
||||
<div class="title">
|
||||
Demande d'ouverture du serial port <v-btn @click="manageSerial" :disabled="!tcpState" color="primary" flat slot="activator"><div v-if="!serialState">Ouverture Serial</div><div v-else>Fermeture Serial</div></v-btn>
|
||||
</div>
|
||||
<div class="title">
|
||||
Faire changer le robot d'état
|
||||
<v-menu :disabled="!serialState" offset-y>
|
||||
<v-btn :disabled="!serialState" color="primary" flat slot="activator">RUN ou IDLE</v-btn>
|
||||
<v-list>
|
||||
<v-list-tile @click="startWithWD">
|
||||
<v-list-tile-title> Demarer avec watchdog </v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile @click="startWithoutWD">
|
||||
<v-list-tile-title> Demarer sans watchdog </v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile @click="stopIdle">
|
||||
<v-list-tile-title> Robot à l'état IDLE </v-list-tile-title>
|
||||
</v-list-tile>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
</div>
|
||||
</div>
|
||||
</v-card-title>
|
||||
<Controller v-if="dumbyStarted"/>
|
||||
</v-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Voyant from './Voyant'
|
||||
import Controller from './Controller'
|
||||
export default {
|
||||
components:{
|
||||
Controller,
|
||||
},
|
||||
data:()=>{
|
||||
return {dumbyStarted:false}
|
||||
},
|
||||
props:['tcpState', 'serialState'],
|
||||
methods:{
|
||||
manageSerial: function(state){
|
||||
if(this.tcpState){
|
||||
this.$socket.emit('openSerial',!this.serialState);
|
||||
}
|
||||
else{
|
||||
this.serialState = false;
|
||||
}
|
||||
|
||||
if(state !== undefined){
|
||||
this.serialState = state;
|
||||
}
|
||||
},
|
||||
startWithWD: function(){
|
||||
this.$socket.emit('startWithWD');
|
||||
},
|
||||
startWithoutWD: function(){
|
||||
this.$socket.emit('startWitouthWD');
|
||||
},
|
||||
stopIdle: function(){
|
||||
this.$socket.emit('idle');
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
dumbyStart:function(state){
|
||||
if(this.serialState === true)
|
||||
this.dumbyStarted=state;
|
||||
else this.dumbyStarted=false;
|
||||
},
|
||||
lostSerial: function(){
|
||||
this.dumbyStarted = false;
|
||||
this.serialState = false;
|
||||
},
|
||||
|
||||
},
|
||||
watch:{
|
||||
serialState: function(){
|
||||
if(this.serialState===false){
|
||||
this.dumbyStarted =false;
|
||||
this.manageSerial(false);
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.center{
|
||||
text-align: center;
|
||||
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
|
@ -1,17 +0,0 @@
|
|||
<template>
|
||||
<v-footer class="pa-3" color="pink darken-3">
|
||||
<div style="color:white;">L.Senaneuch</div>
|
||||
<v-spacer></v-spacer>
|
||||
<img class="logo-vue" src="static/logo.png" alt="logo-vue">
|
||||
<img class="logo-vue" src="static/logo-node.png" alt="logo-node">
|
||||
<v-spacer></v-spacer>
|
||||
<div style="color:white;">© INSA - Toulouse {{ new Date().getFullYear() }}</div>
|
||||
</v-footer>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.logo-vue{
|
||||
width: 30px;
|
||||
margin-left:15px;
|
||||
}
|
||||
</style>
|
|
@ -1,18 +0,0 @@
|
|||
<template>
|
||||
<div class="loading">
|
||||
<v-progress-circular indeterminate v-bind:size="70" v-bind:width="7" color="purple"></v-progress-circular>
|
||||
<h1>Non Connecté ! Veuillez vérifier que le serveur node a bien été lancé. Puis rafraichissez la page !</h1>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style>
|
||||
.loading{
|
||||
padding-top: 10%;
|
||||
position:fixed;
|
||||
z-index: 10;
|
||||
width:100%;
|
||||
height: 100%;
|
||||
background-color: rgb(46, 37, 37);
|
||||
color: rgba(255, 255, 255, 0.788);
|
||||
}
|
||||
</style>
|
|
@ -1,155 +0,0 @@
|
|||
<template>
|
||||
<v-toolbar dark color="pink darken-3">
|
||||
<v-toolbar-title class="white-text hidden-sm-and-down">Dumby User Interface</v-toolbar-title>
|
||||
<v-menu :nudge-width="100">
|
||||
<img class="logo" id="logo-connection" src="static/logo_connection.svg" slot="activator">
|
||||
<v-list>
|
||||
<v-list-tile @click="tcpManageRq">
|
||||
<v-list-tile-title> <div v-if="!tcpState">Connexion au Superviseur</div> <div v-else>Deconnection au Superviseur</div></v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile :disabled="!tcpState" @click="manageSerial" class="hidden-sm-and-up">
|
||||
<v-list-tile-title> <div v-if="!serialState"> Connexion au Robot</div> <div v-else> Deconnexion au Robot </div></v-list-tile-title>
|
||||
</v-list-tile>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-menu :nudge-width="100" class="hidden-sm-and-up">
|
||||
<img class="logo" id="logo-robot" src="static/logo_dumby_white.svg" slot="activator">
|
||||
<v-list>
|
||||
<v-list-tile :disabled="!serialState" @click="runWithWDRq">
|
||||
<v-list-tile-title>Demarrer avec Watchdog</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile :disabled="!serialState" @click="runWithoutWDRq">
|
||||
<v-list-tile-title> Demarrer Sans Watchdog</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile :disabled="!serialState" @click="idleDumby">
|
||||
<v-list-tile-title> Stoper le robot</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-menu :nudge-width="100" class="hidden-sm-and-up">
|
||||
<v-icon class="logo" slot="activator">camera_alt </v-icon>
|
||||
<v-list>
|
||||
<v-list-tile :disabled="!tcpState" @click="manageCamera">
|
||||
<v-list-tile-title>Activer / Désactiver Camera</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
<v-list-tile :disabled="!tcpState" @click="arenaDetectionRq">
|
||||
<v-list-tile-title>Detection Arene</v-list-tile-title>
|
||||
</v-list-tile>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-spacer></v-spacer>
|
||||
<v-tooltip>
|
||||
<Voyant id="led-connection" slot="activator" :ledOn="tcpState"/>
|
||||
<span>Etat de connection au Superviseur</span>
|
||||
</v-tooltip>
|
||||
<v-tooltip>
|
||||
<img id="logo-battery" :src="batterie_src" slot="activator" alt="">
|
||||
<span>Niveau de batterie</span>
|
||||
</v-tooltip>
|
||||
</v-toolbar>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Voyant from './Voyant'
|
||||
export default {
|
||||
components:{
|
||||
Voyant,
|
||||
},
|
||||
props:['tcpState', 'serialState'],
|
||||
data:()=>{
|
||||
return{
|
||||
robotRun: false,
|
||||
battery: 0,
|
||||
batterie_src : '',
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
BAT: function(data){
|
||||
this.battery = parseInt(data);
|
||||
/* if(data === '2'){
|
||||
this.batterie_src = "static/battery_full_white.svg";
|
||||
}else if (data === '1'){
|
||||
this.batterie_src = "static/battery_medium_white.svg";
|
||||
}else{
|
||||
this.batterie_src = "static/battery_low_white.svg";
|
||||
}*/
|
||||
},
|
||||
robotState:function(data){
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
watch: {
|
||||
battery: function(){
|
||||
switch (this.battery) {
|
||||
case 0:
|
||||
this.batterie_src = "static/battery_low_white.svg";
|
||||
break;
|
||||
case 1:
|
||||
this.batterie_src = "static/battery_medium_white.svg";
|
||||
break;
|
||||
case 2:
|
||||
this.batterie_src = "static/battery_full_white.svg";
|
||||
break;
|
||||
default:
|
||||
this.batterie_src= ""
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
tcpManageRq: function(){
|
||||
if(this.tcpState==false){
|
||||
this.$socket.emit('askConnection');
|
||||
console.log('demande de connection');
|
||||
}
|
||||
else{
|
||||
this.$socket.emit('askDisconnection');
|
||||
}
|
||||
|
||||
},
|
||||
manageSerial: function(){
|
||||
if(this.tcpState){
|
||||
this.$socket.emit('openSerial',!this.serialState);
|
||||
}
|
||||
},
|
||||
runWithWDRq: function(){
|
||||
},
|
||||
runWithoutWDRq: function(){
|
||||
},
|
||||
idleDumby: function(){
|
||||
},
|
||||
manageCamera: function(){
|
||||
},
|
||||
arenaDetectionRq: function(){
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<style>
|
||||
.logo{
|
||||
margin-left:12px;
|
||||
}
|
||||
#logo-robot{
|
||||
width: 35px;
|
||||
margin-top:7px;
|
||||
margin-left:16px;
|
||||
}
|
||||
#logo-connection{
|
||||
width: 16px;
|
||||
margin-top:5px;
|
||||
margin-left:30px;
|
||||
}
|
||||
#logo-battery{
|
||||
width:50px;
|
||||
margin-left: 30px;
|
||||
}
|
||||
#led-connection{
|
||||
width:20px;
|
||||
height: 20px;
|
||||
padding-left:10px;
|
||||
margin-left:10px;
|
||||
}
|
||||
</style>
|
|
@ -1,33 +0,0 @@
|
|||
<template>
|
||||
<div>
|
||||
<v-alert icon="info" v-for="(notify, index) in list" :id="index" :key="index"
|
||||
:color="notify.type" value="true" transition="slide-y-transition" @click="deleteNotes">
|
||||
{{notify.msg}}
|
||||
</v-alert>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data:()=>{
|
||||
return {
|
||||
list:[],
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
notifications(data){
|
||||
this.list.push(data);
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
deleteNotes(e){
|
||||
const noteSelected = e.target.parentElement.id;
|
||||
this.list = this.list.filter((info, index) => noteSelected != index);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
|
||||
</style>
|
|
@ -1,169 +0,0 @@
|
|||
<template>
|
||||
<v-card>
|
||||
<img draggable="false" id="video" @click="sendPos" :src="source" alt="Flux Video">
|
||||
<p id="fps"></p>
|
||||
<v-card-actions>
|
||||
<div v-if="!detectionMode">
|
||||
<v-btn @click="manageCamera" :disabled="!tcpState" flat color="orange"> <div v-if="!cameraActive">Activer Camera</div> <div v-else>Désactiver Camera</div> </v-btn>
|
||||
<v-btn @click="askArena" :disabled="!cameraActive" flat color="orange">Detection Arene</v-btn>
|
||||
<v-btn @click="displayPos" :disabled="!cameraActive" flat color="orange"><div v-if="!positionMode">Afficher la position</div> <div v-else>Ne plus afficher la position</div> </v-btn>
|
||||
</div>
|
||||
<div v-else>
|
||||
<v-btn @click="confirmArena" :disabled="!cameraActive" flat color="orange">L'arene me plait</v-btn>
|
||||
<v-btn @click="infirmArena" :disabled="!cameraActive" flat color="orange">L'arene ne me plait pas</v-btn>
|
||||
</div>
|
||||
<div v-if="positionMode" class="subheadingfont position_place">
|
||||
<span v-if="positionMode"> Position : {{robot.x}}, {{robot.y}}</span>
|
||||
</div>
|
||||
<div v-if="positionMode && this.cursor.x !== null" class="subheadingfont position_place">
|
||||
<span> Ordre : {{cursor.x}}, {{cursor.y}}</span>
|
||||
</div>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props:['tcpState'],
|
||||
data:()=>{
|
||||
return{
|
||||
source:'/static/neige.jpg',
|
||||
fps:1,
|
||||
cameraActive: false,
|
||||
positionState: false,
|
||||
detectionMode: false,
|
||||
positionMode: false,
|
||||
robot:{x: -1,y: -1},
|
||||
cursor:{x: null, y: null},
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
hexToBase64 : function(data){
|
||||
return btoa(String.fromCharCode.apply(null, data.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" ")));
|
||||
},
|
||||
manageCamera: function(){
|
||||
if(this.tcpState === true)
|
||||
this.$socket.emit('camera', !this.cameraActive);
|
||||
},
|
||||
askArena: function(){
|
||||
if(this.cameraActive === true)
|
||||
this.$socket.emit('arena', 'ask');
|
||||
this.detectionMode = true;
|
||||
},
|
||||
displayPos:function(){
|
||||
if(this.cameraActive === true){
|
||||
this.$socket.emit('displayPos', !positionMode);
|
||||
this.positionMode= !this.positionMode;
|
||||
}
|
||||
},
|
||||
confirmArena: function(){
|
||||
if(this.cameraActive === true){
|
||||
this.$socket.emit('arena', 'ok');
|
||||
this.detectionMode = false;
|
||||
}
|
||||
},
|
||||
infirmArena: function(){
|
||||
if(this.cameraActive === true){
|
||||
this.$socket.emit('arena', 'nok');
|
||||
this.detectionMode = false;
|
||||
}
|
||||
},
|
||||
displayPos : function(){
|
||||
if(this.cameraActive === true){
|
||||
this.$socket.emit('displayPos', !this.positionMode);
|
||||
this.positionMode = !this.positionMode;
|
||||
|
||||
}
|
||||
},
|
||||
sendPos: function(e){
|
||||
if(this.positionMode === true){
|
||||
let rect = document.getElementById('video').getBoundingClientRect();
|
||||
let robotX = (e.pageX - rect.x)|0, robotY=e.pageY - rect.y;
|
||||
this.cursor.x = parseInt((480/rect.width)*robotX);
|
||||
this.cursor.y = parseInt((360/rect.height)*robotY);
|
||||
this.$socket.emit('sendPos', this.cursor);
|
||||
}
|
||||
}
|
||||
},
|
||||
sockets:{
|
||||
IMG: function(data){
|
||||
if(this.cameraActive){
|
||||
let frame;
|
||||
this.source = "data:image/jpeg;base64,";
|
||||
this.source += this.hexToBase64(data);
|
||||
//frame = document.getElementById("video");
|
||||
//frame.src = this.source;
|
||||
this.fps++;
|
||||
}
|
||||
|
||||
},
|
||||
POS: function(data){
|
||||
let a = data.substr(11);
|
||||
a = a.split(';');
|
||||
let x = Number(a[0]);
|
||||
let y = a[1].split('|');
|
||||
y = Number(y[0]);
|
||||
let robot2 = {
|
||||
x,
|
||||
y
|
||||
}
|
||||
this.robot = robot2;
|
||||
},
|
||||
cameraState: function(data){
|
||||
this.cameraActive = data;
|
||||
},
|
||||
detectionError: function(){
|
||||
this.detectionMode=false;
|
||||
}
|
||||
},
|
||||
mounted: function (){
|
||||
setInterval(function(){
|
||||
document.getElementById('fps').innerText = `${this.fps} fps`;
|
||||
this.fps = 0;
|
||||
}.bind(this), 1000);
|
||||
},
|
||||
watch:{
|
||||
tcpState: function(){
|
||||
if(this.tcpState == false){
|
||||
this.cameraActive = false;
|
||||
this.source ="/static/neige.jpg"
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#fps{
|
||||
position: absolute;
|
||||
top:10px;
|
||||
left:20px;
|
||||
color:red;
|
||||
}
|
||||
|
||||
#video{
|
||||
width: 100%;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-o-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
#video:hover
|
||||
{
|
||||
cursor:crosshair;
|
||||
}
|
||||
|
||||
.clikable:hover
|
||||
{
|
||||
cursor:pointer;
|
||||
}
|
||||
.position_place{
|
||||
border:solid;
|
||||
border-color: lightblue;
|
||||
padding : 10px;
|
||||
border-width: 1px;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
<template>
|
||||
<div class="led" :class="{light:ledOn}"></div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props:['ledOn'],
|
||||
data: ()=>{
|
||||
return{
|
||||
light:false,
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
<style>
|
||||
.led{
|
||||
border-radius: 50%;
|
||||
background-color: red;
|
||||
border:solid;
|
||||
border-width: 2px;
|
||||
}
|
||||
|
||||
.light{
|
||||
background-color: rgb(0, 255, 0);
|
||||
}
|
||||
</style>
|
|
@ -1,17 +0,0 @@
|
|||
// The Vue build version to load with the `import` command
|
||||
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
|
||||
import Vue from 'vue';
|
||||
import App from './App';
|
||||
import VueSocketio from 'vue-socket.io';
|
||||
import Vuetify from 'vuetify';
|
||||
|
||||
Vue.config.productionTip = false;
|
||||
Vue.use(Vuetify);
|
||||
Vue.use(VueSocketio, location.toString());
|
||||
//Vue.use(VueSocketio, 'localhost:3000 ');
|
||||
/* eslint-disable no-new */
|
||||
new Vue({
|
||||
el: '#app',
|
||||
components: { App },
|
||||
template: '<App/>',
|
||||
});
|
|
@ -1,14 +0,0 @@
|
|||
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="102" width="102" y="-1" x="-1"/>
|
||||
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||
<rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path transform="rotate(90, 50, 50.2548)" id="svg_2" d="m53.448662,50.254662l-20.200256,-17.133644l13.303299,0l20.19989,17.133644l-20.19989,17.133873l-13.303299,0l20.200256,-17.133873z" stroke-width="1.5" stroke="#000" fill="#000000"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 740 B |
|
@ -1,14 +0,0 @@
|
|||
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="102" width="102" y="-1" x="-1"/>
|
||||
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||
<rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path transform="rotate(180, 50, 50.2548)" id="svg_2" d="m53.448662,50.254662l-20.200256,-17.133644l13.303299,0l20.19989,17.133644l-20.19989,17.133873l-13.303299,0l20.200256,-17.133873z" stroke-width="1.5" stroke="#000" fill="#000000"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 741 B |
|
@ -1,14 +0,0 @@
|
|||
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="102" width="102" y="-1" x="-1"/>
|
||||
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||
<rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path id="svg_2" d="m53.448662,49.999886l-20.200256,-17.133644l13.303299,0l20.19989,17.133644l-20.19989,17.133873l-13.303299,0l20.200256,-17.133873z" stroke-width="1.5" stroke="#000" fill="#000000"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 704 B |
|
@ -1,14 +0,0 @@
|
|||
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="102" width="102" y="-1" x="-1"/>
|
||||
<g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" id="canvasGrid">
|
||||
<rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" width="100%"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path transform="rotate(-90, 50, 50)" id="svg_2" d="m53.448662,49.999886l-20.200256,-17.133644l13.303299,0l20.19989,17.133644l-20.19989,17.133873l-13.303299,0l20.200256,-17.133873z" stroke-width="1.5" stroke="#000" fill="#000000"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 736 B |
|
@ -1,15 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="30" width="90" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect id="svg_1" height="26.315784" width="81.894718" y="0.999998" x="1" fill-opacity="null" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<rect id="svg_2" height="20.210522" width="22.736838" y="3.947366" x="4.578944" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_5" height="20.210522" width="22.736838" y="3.947366" x="30.789471" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_6" height="20.210522" width="22.736838" y="3.947366" x="56.789459" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_7" height="5.263157" width="3.999999" y="12.368417" x="82.894717" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
|
@ -1,16 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect x="-1" y="-1" width="17.714263" height="6.999993" id="canvas_background" fill="none"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect fill="none" stroke="#ffffff" stroke-width="2" fill-opacity="null" x="1" y="0.999998" width="81.894718" height="26.315784" id="svg_1"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="4.578944" y="3.947366" width="22.736838" height="20.210522" id="svg_2"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="30.789471" y="3.947366" width="22.736838" height="20.210522" id="svg_5"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="56.789459" y="3.947366" width="22.736838" height="20.210522" id="svg_6"/>
|
||||
<rect fill="none" stroke="#ffffff" stroke-width="2" x="82.894717" y="12.368417" width="3.999999" height="5.263157" id="svg_7"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 992 B |
|
@ -1,14 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="30" width="90" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect id="svg_1" height="26.315784" width="81.894718" y="0.999998" x="1" fill-opacity="null" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<rect id="svg_2" height="20.210522" width="8.842102" y="3.947366" x="4.578944" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_7" height="5.263157" width="3.999999" y="12.368417" x="82.894717" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<path id="svg_8" d="m54.798424,20.400599l-2.790161,-4.677445c-0.841221,-1.409811 -2.217152,-3.717751 -3.058323,-5.127771l-2.789875,-4.6774c-0.842064,-1.410675 -2.218014,-1.410675 -3.058952,0l-2.789314,4.6774c-0.841179,1.410021 -2.217922,3.718452 -3.05896,5.127771l-2.789524,4.677445c-0.841179,1.411167 -0.152626,2.56464 1.529472,2.56464l17.274529,0c1.683743,0 2.371479,-1.153473 1.531109,-2.56464l0,0zm-9.371113,0.724201l-1.654819,0l0,-1.538128l1.654819,0l0,1.538128zm-0.079727,-2.671261l-1.493965,0l-0.148476,-6.580343l1.777653,0l-0.135212,6.580343z" fill="#666666"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
|
@ -1,14 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="30" width="90" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect id="svg_1" height="26.315784" width="81.894718" y="0.999998" x="1" stroke-width="2" stroke="#ffffff" fill="none"/>
|
||||
<rect id="svg_2" height="20.210522" width="8.842102" y="3.947366" x="4.578944" stroke-width="2" stroke="#ffffff" fill="#ffffff"/>
|
||||
<rect id="svg_7" height="5.263157" width="3.999999" y="12.368417" x="82.894717" stroke-width="2" stroke="#ffffff" fill="none"/>
|
||||
<path id="svg_9" d="m60.694698,20.577425l-3.23653,-4.731917c-0.975735,-1.426157 -2.571877,-3.761006 -3.5476,-5.187507l-3.236504,-4.731595c-0.976608,-1.427078 -2.572712,-1.427078 -3.547989,0l-3.235592,4.731595c-0.976166,1.4265 -2.573158,3.761847 -3.548439,5.187507l-3.236038,4.731917c-0.975723,1.427576 -0.177002,2.594461 1.774445,2.594461l20.038418,0c1.953274,0 2.750664,-1.166885 1.775829,-2.594461l0,0zm-10.870243,0.732548l-1.919575,0l0,-1.555851l1.919575,0l0,1.555851zm-0.092484,-2.702253l-1.73328,0l-0.172131,-6.657048l2.062057,0l-0.156647,6.657048z" stroke="#ffffff" fill="#ffffff"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
|
@ -1,14 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="30" width="90" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect id="svg_1" height="26.315784" width="81.894718" y="0.999998" x="1" fill-opacity="null" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<rect id="svg_2" height="20.210522" width="22.736838" y="3.947366" x="4.578944" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_5" height="20.210522" width="22.736838" y="3.947366" x="30.789471" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<rect id="svg_7" height="5.263157" width="3.999999" y="12.368417" x="82.894717" stroke-opacity="null" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 932 B |
|
@ -1,15 +0,0 @@
|
|||
<svg width="88" height="28" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect x="-1" y="-1" width="20.526313" height="7.894736" id="canvas_background" fill="none"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect fill="none" stroke="#ffffff" stroke-width="2" fill-opacity="null" x="1" y="0.999998" width="81.894718" height="26.315784" id="svg_1"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="4.578944" y="3.947366" width="22.736838" height="20.210522" id="svg_2"/>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="2" x="30.789471" y="3.947366" width="22.736838" height="20.210522" id="svg_5"/>
|
||||
<rect fill="none" stroke="#ffffff" stroke-width="2" x="82.894717" y="12.368417" width="3.999999" height="5.263157" id="svg_7"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 858 B |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 6.7 KiB |
|
@ -1,14 +0,0 @@
|
|||
<svg width="37" height="45" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect x="-1" y="-1" width="4.998385" height="5.646685" id="canvas_background" fill="none"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<rect fill="#ffffff" stroke="#ffffff" stroke-width="3" x="1.499999" y="12.033397" width="34" height="31.198336" id="svg_1"/>
|
||||
<path fill="#ffffff" stroke="#ffffff" stroke-width="3" d="m1.787369,10.792826l6.707077,-9.292826l20.121235,0l6.706993,9.292826l-6.706993,9.293005l-20.121235,0l-6.707077,-9.293005z" id="svg_3"/>
|
||||
<path fill="#ff007f" stroke="#f50057" stroke-width="0.1" d="m6.012915,23.986172c3.391615,0 6.58049,1.356598 8.976097,3.815023c2.400892,2.460051 3.720869,5.73773 3.720869,9.225225l5.228432,0c0,-10.132326 -8.042473,-18.374136 -17.92646,-18.374136l0,5.333887l0.001063,0l-0.000001,0zm0.006737,-9.457245c12.090816,0 21.925318,10.094976 21.925318,22.503983l5.226238,0c0,-15.349382 -12.180334,-27.8395 -27.152637,-27.8395l0,5.335514l0.001082,0l-0.000001,0.000004zm7.228214,18.774704c0,2.041348 -1.620888,3.698376 -3.619726,3.698376s-3.619571,-1.657028 -3.619571,-3.698376c0,-2.037918 1.620992,-3.694717 3.619571,-3.694717s3.619726,1.653553 3.619726,3.694717z" id="svg_8"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.3 KiB |
|
@ -1,13 +0,0 @@
|
|||
<svg width="52" height="42" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="44" width="54" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path id="svg_7" d="m47.913887,6.962914c0,3.845634 -9.750057,6.963047 -21.777805,6.963047m21.777805,-6.963047l0,0c0,3.845634 -9.750057,6.963047 -21.777805,6.963047c-12.027187,0 -21.777691,-3.117413 -21.777691,-6.963047m0,0l0,0c0,-3.845406 9.750504,-6.962914 21.777691,-6.962914c12.027748,0 21.777805,3.117508 21.777805,6.962914l0,27.851788c0,3.845512 -9.750057,6.96302 -21.777805,6.96302c-12.027187,0 -21.777691,-3.117508 -21.777691,-6.96302l0,-27.851788z" stroke-width="NaN" stroke="#4c4c4c" fill="#4c4c4c"/>
|
||||
<line stroke-linecap="null" stroke-linejoin="null" id="svg_8" y2="32.176623" x2="50.555556" y1="9.806282" x1="50.703705" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
<line stroke-linecap="null" stroke-linejoin="null" id="svg_9" y2="32.769215" x2="1.296296" y1="10.398873" x1="1.444445" stroke-width="2" stroke="#4c4c4c" fill="none"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
|
@ -1,14 +0,0 @@
|
|||
<svg width="72" height="49" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
|
||||
|
||||
<g>
|
||||
<title>background</title>
|
||||
<rect fill="none" id="canvas_background" height="51" width="74" y="-1" x="-1"/>
|
||||
</g>
|
||||
<g>
|
||||
<title>Layer 1</title>
|
||||
<path id="svg_7" d="m58.199665,10.123037c0,3.845639 -9.750061,6.963049 -21.777809,6.963049m21.777809,-6.963049l0,0c0,3.845639 -9.750061,6.963049 -21.777809,6.963049c-12.027191,0 -21.777691,-3.11741 -21.777691,-6.963049m0,0l0,0c0,-3.8454 9.7505,-6.96291 21.777691,-6.96291c12.027748,0 21.777809,3.11751 21.777809,6.96291l0,27.851789c0,3.845509 -9.750061,6.96302 -21.777809,6.96302c-12.027191,0 -21.777691,-3.117512 -21.777691,-6.96302l0,-27.851789z" stroke-width="NaN" stroke="#ffffff" fill="#ffffff"/>
|
||||
<line stroke-linecap="null" stroke-linejoin="null" id="svg_8" y2="33.926006" x2="65.660338" y1="11.555665" x1="65.808487" stroke-width="5" stroke="#ffffff" fill="none"/>
|
||||
<line stroke-linecap="null" stroke-linejoin="null" id="svg_9" y2="33.847692" x2="7.819088" y1="11.47735" x1="7.967237" stroke-width="5" stroke="#ffffff" fill="none"/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 364 KiB |
9
software/android/.gitignore
vendored
|
@ -1,9 +0,0 @@
|
|||
*.iml
|
||||
.gradle
|
||||
/local.properties
|
||||
/.idea/workspace.xml
|
||||
/.idea/libraries
|
||||
.DS_Store
|
||||
/build
|
||||
/captures
|
||||
.externalNativeBuild
|
|
@ -1,18 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="GradleSettings">
|
||||
<option name="linkedExternalProjectsSettings">
|
||||
<GradleProjectSettings>
|
||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||
<option name="modules">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$" />
|
||||
<option value="$PROJECT_DIR$/app" />
|
||||
</set>
|
||||
</option>
|
||||
<option name="resolveModulePerSourceSet" value="false" />
|
||||
</GradleProjectSettings>
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
|
@ -1,33 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="NullableNotNullManager">
|
||||
<option name="myDefaultNullable" value="android.support.annotation.Nullable" />
|
||||
<option name="myDefaultNotNull" value="android.support.annotation.NonNull" />
|
||||
<option name="myNullables">
|
||||
<value>
|
||||
<list size="4">
|
||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
|
||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
|
||||
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
|
||||
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
<option name="myNotNulls">
|
||||
<value>
|
||||
<list size="4">
|
||||
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
|
||||
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
|
||||
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
|
||||
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
|
||||
</list>
|
||||
</value>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||
</component>
|
||||
<component name="ProjectType">
|
||||
<option name="id" value="Android" />
|
||||
</component>
|
||||
</project>
|
|
@ -1,9 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/MyApplication.iml" filepath="$PROJECT_DIR$/MyApplication.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|