diff --git a/webapp/.env b/webapp/.env
new file mode 100644
index 0000000..1551f96
--- /dev/null
+++ b/webapp/.env
@@ -0,0 +1 @@
+WDS_SOCKET_PORT=0
\ No newline at end of file
diff --git a/webapp/package-lock.json b/webapp/package-lock.json
index 7dbc14f..620a6be 100644
--- a/webapp/package-lock.json
+++ b/webapp/package-lock.json
@@ -15,6 +15,7 @@
"react": "^18.2.0",
"react-container-dimensions": "^1.4.1",
"react-dom": "^18.2.0",
+ "react-hook-form": "^7.46.2",
"react-leaflet": "^4.2.1",
"react-scripts": "^5.0.1",
"react-use-websocket": "^4.3.1",
@@ -14321,6 +14322,21 @@
"resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
"integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg=="
},
+ "node_modules/react-hook-form": {
+ "version": "7.46.2",
+ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.46.2.tgz",
+ "integrity": "sha512-x1DWmHQchV7x2Rq9l99M/cQHC8JGchAnw9Z0uTz5KrPa0bTl/Inm1NR7ceOARfIrkNuQNAhuSuZPYa6k7QYn3Q==",
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-hook-form"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17 || ^18"
+ }
+ },
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
diff --git a/webapp/package.json b/webapp/package.json
index 10c49b1..9baa824 100644
--- a/webapp/package.json
+++ b/webapp/package.json
@@ -10,6 +10,7 @@
"react": "^18.2.0",
"react-container-dimensions": "^1.4.1",
"react-dom": "^18.2.0",
+ "react-hook-form": "^7.46.2",
"react-leaflet": "^4.2.1",
"react-scripts": "^5.0.1",
"react-use-websocket": "^4.3.1",
diff --git a/webapp/src/App.jsx b/webapp/src/App.jsx
index c0114cb..1974f8b 100644
--- a/webapp/src/App.jsx
+++ b/webapp/src/App.jsx
@@ -12,13 +12,18 @@ import {w3cwebsocket as W3CWebSocket} from "websocket"
const config = {
// apiUrl: process.env.REACT_APP_WEBAPP_WS_URL,
- apiUrl: "10.110.242.105",
- apiProt: 9999
+ apiUrl: "192.168.3.13",
+ apiProt: 30747
}
-const client = new WebSocket("ws://10.110.242.105:9999/");
+// const config = {
+// // apiUrl: process.env.REACT_APP_WEBAPP_WS_URL,
+// apiUrl: "localhost",
+// apiProt: 9999
+// }
-// const client = new W3CWebSocket("ws://"+config.apiUrl+":"+config.apiProt+"/");
+
+const client = new W3CWebSocket("ws://"+config.apiUrl+":"+config.apiProt+"/");
class App extends Component {
@@ -38,8 +43,9 @@ class App extends Component {
const dataFromServer = JSON.parse(message.data);
console.log('reply: ', dataFromServer);
- if(dataFromServer.Type === "COP")
+ if(dataFromServer.Data === "COP")
{
+
this.setState((state) => ({
Entities: dataFromServer.Entities
})
@@ -49,26 +55,26 @@ class App extends Component {
}
- // connect((msg) => {
- // console.log("New Message")
+ // connect((msg) => {
+ // console.log("New Message")
- // var jsonMSG;
- // try {
- // jsonMSG = JSON.parse(msg.data);
- // } catch (error) {
- // console.log(error);
- // }
+ // var jsonMSG;
+ // try {
+ // jsonMSG = JSON.parse(msg.data);
+ // } catch (error) {
+ // console.log(error);
+ // }
- // if(jsonMSG["Type"] == "COP"){
- // console.log(msg.data)
- // var Entities = Array.from(jsonMSG["Entities"])
- // if(Array.isArray(Entities))
- // {
- // this.setState({
- // Entities:Entities
- // });
- // }
- // }
+ // if(jsonMSG["Type"] == "COP"){
+ // console.log(msg.data)
+ // var Entities = Array.from(jsonMSG["Entities"])
+ // if(Array.isArray(Entities))
+ // {
+ // this.setState({
+ // Entities:Entities
+ // });
+ // }
+ // }
@@ -107,15 +113,10 @@ class App extends Component {
- {/*
*/}
- {/*
- {name}
-
-
*/}
+
- {/* */}
);
diff --git a/webapp/src/components/OpenSeaMap/OpenSeaMap.jsx b/webapp/src/components/OpenSeaMap/OpenSeaMap.jsx
index 344bb1a..95dbca3 100644
--- a/webapp/src/components/OpenSeaMap/OpenSeaMap.jsx
+++ b/webapp/src/components/OpenSeaMap/OpenSeaMap.jsx
@@ -7,15 +7,7 @@ import "./OpenSeaMap.scss";
import {w3cwebsocket as W3CWebSocket} from "websocket";
import ContainerDimensions from 'react-container-dimensions';
-// const config = {
-// // apiUrl: process.env.REACT_APP_WEBAPP_WS_URL,
-// apiUrl: "10.110.242.105",
-// apiProt: 9999
-// }
-// const client = new W3CWebSocket("ws://"+config.apiUrl+":"+config.apiProt+"/");
-
-// import icon from 'leaflet/dist/images/marker-icon.png';
class OpenSeaMap extends Component {
@@ -50,11 +42,11 @@ class OpenSeaMap extends Component {
var icon;
icon = createIcon(entity.Type,entity.Side)
return (
- {
- console.log(e.target.options.data); // will print 'FooBar' in console
+ // console.log(e.target.options.data); // will print 'FooBar' in console
this.props.setEntityOnFocus(e.target.options.data);
},
}} >
@@ -77,7 +69,7 @@ class OpenSeaMap extends Component {
return (
-
+
{ // Update the document title using the browser API document.title = `You clicked ${count} times`;
+
+
+ setEntity(props.Entity);
+ if(CourseInControl === false)
+ {
+ console.log("los")
+ // setSpeed(props.Entity.Speed);
+ setFormData({course:props.Entity.Course,speed:props.Entity.Speed})
+ // setFormData({speed:props.Entity.Speed})
+
+ }
+
+
+
+ },[props.Entity]);
+
+
+
+ // Entity.Entity.Course
+const handleClick = (e) => {
+ if(e.detail === 2)
+ {
+ setCourseInControl(true);
+ e.target.readOnly = false;
+ // e.target.style = "border: 1px solid"
+ }
+ };
+
+ const handleCourseInput= (e) => {
+ console.log(e.target)
+ console.log(isNaN(e.nativeEvent?.data))
+ if(!isNaN(e.nativeEvent?.data))
+ {
+
+ setFormData({...formData,course:e.currentTarget.value});
+ }
+ };
+
+ const handleSpeedInput= (e) => {
+ console.log(e.target)
+ if(!isNaN(e.nativeEvent?.data))
+ {
+ setFormData({...formData,speed:e.currentTarget.value});
+
+ }
+ };
+
+ const emptyForm= (e) =>
+ {
+
+ }
+
+ // const handleChange = (event) => {
+ // const { name, value } = event.target;
+ // setFormData((prevFormData) => ({ ...prevFormData, [name]: value }));
+ // };
+
+ const handleSubmit = (e) => {
+ e.preventDefault();
+ console.log(e.target.data);
+
+ alert(`Course: ${formData.course}`
+ );
+ }
+ // console.log(Entity)
// console.log(EntityOnFocus)
return (
-
-
-
Name
-
{Entity.Entity.Name}
-
-
-
Course
-
{Entity.Entity.Course}
-
+
);
}
diff --git a/webapp/src/components/control/Tracklist/tracklist.jsx b/webapp/src/components/control/Tracklist/tracklist.jsx
index 4201a57..66fc446 100644
--- a/webapp/src/components/control/Tracklist/tracklist.jsx
+++ b/webapp/src/components/control/Tracklist/tracklist.jsx
@@ -13,21 +13,28 @@ class Tracklist extends React.Component
-
- | Name |
- Course |
- Lat |
- Lon |
+
+ | Name |
+ Course |
+ Speed |
+ Lat |
+ Lon |
+ Kind |
+ Side |
+
{ this.props.entities.map((val,index) => {
return (
- | {val.Name} |
- {val.Course} |
- {val.position[0]} |
- {val.position[1]} |
+ {val.Name} |
+ {val.Course} |
+ {val.Speed} |
+ {val.Position[0]} |
+ {val.Position[1]} |
+ {val.Type} |
+ {val.Side} |
)
diff --git a/webapp/src/components/control/Tracklist/tracklist.scss b/webapp/src/components/control/Tracklist/tracklist.scss
index 10bae13..73395cf 100644
--- a/webapp/src/components/control/Tracklist/tracklist.scss
+++ b/webapp/src/components/control/Tracklist/tracklist.scss
@@ -1,8 +1,40 @@
.tracklist
{
display: flex;
+ max-height: 500px;
+ height: 500px;
+ display: block;
}
td
{
-text-align: left;}
\ No newline at end of file
+text-align: left;
+}
+
+.TracklistHeader {
+ border-bottom: 2px solid;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+th{
+ // border: 1px solid;
+ // border-collapse: collapse;
+}
+
+.TracklistCell{
+ border-left: 1px solid;
+ text-align: center;
+}
+
+.TracklistHeaderCell{
+ width: 16%;
+}
+
+
+// table, th, td {
+// border: 1px solid;
+// border-collapse: collapse;
+// }
\ No newline at end of file
diff --git a/webapp/src/components/control/controls.css b/webapp/src/components/control/controls.css
index a8a2a50..a7e0e8d 100644
--- a/webapp/src/components/control/controls.css
+++ b/webapp/src/components/control/controls.css
@@ -6,6 +6,12 @@
.ControlsComponent{
display: grid;
+/* grid-template-columns: auto auto auto; */
+}
+.EntityinputField{
+ border: none;
+ width: 50%;
+ display: block;
}
.ControlHeader{
diff --git a/webapp/src/components/control/controls.jsx b/webapp/src/components/control/controls.jsx
index cefc2b0..d10b3a6 100644
--- a/webapp/src/components/control/controls.jsx
+++ b/webapp/src/components/control/controls.jsx
@@ -3,37 +3,42 @@ import './controls.css'
// import { sendMsg } from '../api';
import Tracklist from './Tracklist'
import EntityControl from './EntityControl';
+
import {w3cwebsocket as W3CWebSocket} from "websocket"
// const config = {
// // apiUrl: process.env.REACT_APP_WEBAPP_WS_URL,
-// apiUrl: "10.110.242.105",
-// apiProt: 9999
+// apiUrl: "192.168.3.13",
+// apiProt: 30747
// }
-// const client = new W3CWebSocket("ws://10.110.242.105:9999/");
-const client = new WebSocket("ws://10.110.242.105:9999/");
+
+// const client = new W3CWebSocket("ws://"+config.apiUrl+":"+config.apiProt+"/");
+
+
class Controls extends React.Component
{
state = {
- EntityOnFocus: this.props.EntityOnFocus
+ EntityOnFocus: undefined,
}
componentDidMount()
{
- client.onopen = () => {
- console.log("Websocket Client Connected");
- };
+ // client.onopen = () => {
+ // console.log(" Control Websocket Client Connected");
+ // };
- client.onmessage = (message) => {
- const dataFromServer = JSON.parse(message.data);
- console.log('reply', dataFromServer);
- }
+ // client.onmessage = (message) => {
+ // const dataFromServer = JSON.parse(message.data);
+ // console.log('reply', dataFromServer);
+ // }
+
}
+
render() {
function getEntityFromID(Entities, SelectedKey)
@@ -49,14 +54,16 @@ state = {
return tmp;
}
- console.log(getEntityFromID(this.props.Entities,this.props.EntityOnFocus));
+
+ // console.log(getEntityFromID(this.props.Entities,this.props.EntityOnFocus));
return (
-
-
+
+
+
);