mirror of
https://github.com/PhotonVision/photonvision
synced 2026-07-02 02:51:40 +00:00
very early msgpack handler
This commit is contained in:
@@ -23,8 +23,9 @@ public class Server {
|
|||||||
SettingsManager.saveSettings();
|
SettingsManager.saveSettings();
|
||||||
});
|
});
|
||||||
ws.onMessage(ctx -> {
|
ws.onMessage(ctx -> {
|
||||||
handler.onMessage(ctx);
|
// handler.onMessage(ctx);
|
||||||
});
|
});
|
||||||
|
ws.onBinaryMessage(ctx->handler.onMessage(ctx));
|
||||||
});
|
});
|
||||||
app.start(port);
|
app.start(port);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,26 +4,30 @@ import com.chameleonvision.vision.camera.CameraException;
|
|||||||
import com.chameleonvision.settings.SettingsManager;
|
import com.chameleonvision.settings.SettingsManager;
|
||||||
import com.chameleonvision.vision.camera.CameraManager;
|
import com.chameleonvision.vision.camera.CameraManager;
|
||||||
import edu.wpi.cscore.VideoException;
|
import edu.wpi.cscore.VideoException;
|
||||||
import io.javalin.websocket.WsCloseContext;
|
import io.javalin.websocket.*;
|
||||||
import io.javalin.websocket.WsConnectContext;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
import io.javalin.websocket.WsContext;
|
|
||||||
import io.javalin.websocket.WsMessageContext;
|
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
import org.msgpack.MessagePack;
|
||||||
|
import org.msgpack.template.Templates;
|
||||||
|
import org.msgpack.type.ArrayValue;
|
||||||
|
import org.msgpack.type.BooleanValue;
|
||||||
|
import org.msgpack.type.IntegerValue;
|
||||||
|
import org.msgpack.type.MapValue;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class ServerHandler {
|
public class ServerHandler {
|
||||||
|
|
||||||
private static List<WsContext> users;
|
private static List<WsContext> users;
|
||||||
|
private MessagePack msgpack;
|
||||||
|
|
||||||
ServerHandler() {
|
ServerHandler() {
|
||||||
users = new ArrayList<>();
|
users = new ArrayList<>();
|
||||||
|
msgpack = new MessagePack();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onConnect(WsConnectContext context) {
|
void onConnect(WsConnectContext context) {
|
||||||
@@ -35,89 +39,103 @@ public class ServerHandler {
|
|||||||
users.remove(context);
|
users.remove(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void onMessage(WsMessageContext data) throws CameraException {
|
void onMessage(WsBinaryMessageContext data) throws IOException {
|
||||||
broadcastMessage(data.message(), data);
|
byte[] b = ArrayUtils.toPrimitive(data.data());
|
||||||
|
System.out.println(msgpack.read(b).isMapValue());
|
||||||
|
Map entries = msgpack.read(b,Templates.tMap(Templates.TString,Templates.TValue));
|
||||||
|
System.out.println(Arrays.toString(entries.entrySet().toArray()));
|
||||||
|
entries.forEach((k, value) -> {
|
||||||
|
/*
|
||||||
|
To get int from value
|
||||||
|
((IntegerValue)value).getInt();
|
||||||
|
|
||||||
JSONObject jsonObject = new JSONObject(data.message());
|
To get boolean from value
|
||||||
String key = null;
|
((BooleanValue)value).getBoolean();
|
||||||
var jsonKeySetArray = jsonObject.keySet().toArray();
|
|
||||||
try {
|
|
||||||
key = jsonKeySetArray[0].toString();
|
|
||||||
} catch (Exception ex) {
|
|
||||||
System.err.println("WebSocket JSON data was empty!");
|
|
||||||
}
|
|
||||||
if (key == null) return;
|
|
||||||
Object value = jsonObject.get(key);
|
|
||||||
System.out.printf("Got websocket json data: [%s, %s]\n", key, value);
|
|
||||||
if (hasField(CameraManager.getCurrentPipeline(), key)) {
|
|
||||||
//Special cases for exposure and brightness and aspect ratio
|
|
||||||
switch (key) {
|
|
||||||
case "exposure":
|
|
||||||
int newExposure = (int) value;
|
|
||||||
System.out.printf("Changing exposure to %d\n", newExposure);
|
|
||||||
try {
|
|
||||||
CameraManager.getCurrentCamera().setExposure(newExposure);
|
|
||||||
} catch (VideoException e) {
|
|
||||||
System.out.println("Exposure changes is not supported on your webcam/webcam's driver");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "brightness":
|
|
||||||
int newBrightness = (int) value;
|
|
||||||
System.out.printf("Changing brightness to %d\n", newBrightness);
|
|
||||||
CameraManager.getCurrentCamera().setBrightness(newBrightness);
|
|
||||||
break;
|
|
||||||
case "ratio":
|
|
||||||
//If there is any better to convert Integer to Double you're welcome to change it
|
|
||||||
List<Double> doubleRatio = CameraManager.getCurrentPipeline().ratio;
|
|
||||||
List<Object> newRatio = ((JSONArray) value).toList();
|
|
||||||
for (int i = 0; i < newRatio.size(); i++) {
|
|
||||||
doubleRatio.set(i, Double.parseDouble(newRatio.get(i).toString()));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//Any other field in CameraManager that doesn't need anything special
|
|
||||||
setField(CameraManager.getCurrentPipeline(), key, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch (key) {
|
|
||||||
case "change_general_settings_values":
|
|
||||||
JSONObject newSettings = (JSONObject) value;
|
|
||||||
Map<String, Object> map = newSettings.toMap();
|
|
||||||
map.forEach((s, o) -> setField(SettingsManager.GeneralSettings, s, o));
|
|
||||||
SettingsManager.saveSettings();
|
|
||||||
break;
|
|
||||||
case "curr_camera":
|
|
||||||
String newCamera = (String) value;
|
|
||||||
System.out.printf("Changing camera to %s\n", newCamera);
|
|
||||||
CameraManager.setCurrentCamera(newCamera);
|
|
||||||
HashMap<String, Integer> portMap = new HashMap<>();
|
|
||||||
portMap.put("port", CameraManager.getCurrentCamera().getStreamPort());
|
|
||||||
sendFullSettings();
|
|
||||||
break;
|
|
||||||
case "curr_pipeline":
|
|
||||||
int newPipeline = (int) value;
|
|
||||||
System.out.printf("Changing pipeline to %s\n", newPipeline);
|
|
||||||
CameraManager.setCurrentPipeline(newPipeline);
|
|
||||||
CameraManager.getCurrentCameraProcess().ntPipelineEntry.setNumber(newPipeline);
|
|
||||||
broadcastMessage(allFieldsToMap(CameraManager.getCurrentPipeline()));
|
|
||||||
|
|
||||||
break;
|
To get Array from value
|
||||||
case "resolution":
|
((ArrayValue) value).toArray();
|
||||||
int newVideoMode = (int) value;
|
|
||||||
System.out.printf("Changing video mode to %d\n", newVideoMode);
|
*/
|
||||||
CameraManager.getCurrentCamera().setCamVideoMode(newVideoMode, true);
|
String key = k.toString();
|
||||||
break;
|
System.out.printf("Got websocket msgpack data: [%s, %s]\n", key, value);
|
||||||
case "FOV":
|
|
||||||
double newFov = Double.parseDouble(value.toString());
|
|
||||||
System.out.printf("Changing FOV to %f\n", newFov);
|
try{
|
||||||
CameraManager.getCurrentCamera().setFOV(newFov);
|
if (hasField(CameraManager.getCurrentPipeline(), key)) {
|
||||||
break;
|
//Special cases for exposure and brightness and aspect ratio
|
||||||
default:
|
switch (key) {
|
||||||
System.out.printf("Unexpected value from websocket: [%s, %s]\n", key, value);
|
case "exposure":
|
||||||
break;
|
int newExposure = ((IntegerValue)value).getInt();
|
||||||
|
System.out.printf("Changing exposure to %d\n", newExposure);
|
||||||
|
try {
|
||||||
|
CameraManager.getCurrentCamera().setExposure(newExposure);
|
||||||
|
} catch (VideoException e) {
|
||||||
|
System.out.println("Exposure changes is not supported on your webcam/webcam's driver");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "brightness":
|
||||||
|
int newBrightness = (int) value;
|
||||||
|
System.out.printf("Changing brightness to %d\n", newBrightness);
|
||||||
|
CameraManager.getCurrentCamera().setBrightness(newBrightness);
|
||||||
|
break;
|
||||||
|
case "ratio":
|
||||||
|
//If there is any better to convert Integer to Double you're welcome to change it
|
||||||
|
List<Double> doubleRatio = CameraManager.getCurrentPipeline().ratio;
|
||||||
|
List<Object> newRatio = ((JSONArray) value).toList();
|
||||||
|
for (int i = 0; i < newRatio.size(); i++) {
|
||||||
|
doubleRatio.set(i, Double.parseDouble(newRatio.get(i).toString()));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
//Any other field in CameraManager that doesn't need anything special
|
||||||
|
setField(CameraManager.getCurrentPipeline(), key, value);
|
||||||
|
System.out.println("CameraManager.getCurrentPipeline().hue = " + CameraManager.getCurrentPipeline().hue.get(0));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (key) {
|
||||||
|
case "change_general_settings_values":
|
||||||
|
Map<String, Object> map = (Map<String, Object>) value;
|
||||||
|
map.forEach((s, o) -> setField(SettingsManager.GeneralSettings, s, o));
|
||||||
|
SettingsManager.saveSettings();
|
||||||
|
break;
|
||||||
|
case "curr_camera":
|
||||||
|
String newCamera = (String) value;
|
||||||
|
System.out.printf("Changing camera to %s\n", newCamera);
|
||||||
|
CameraManager.setCurrentCamera(newCamera);
|
||||||
|
HashMap<String, Integer> portMap = new HashMap<>();
|
||||||
|
portMap.put("port", CameraManager.getCurrentCamera().getStreamPort());
|
||||||
|
sendFullSettings();
|
||||||
|
break;
|
||||||
|
case "curr_pipeline":
|
||||||
|
int newPipeline = (int) value;
|
||||||
|
System.out.printf("Changing pipeline to %s\n", newPipeline);
|
||||||
|
CameraManager.setCurrentPipeline(newPipeline);
|
||||||
|
CameraManager.getCurrentCameraProcess().ntPipelineEntry.setNumber(newPipeline);
|
||||||
|
broadcastMessage(allFieldsToMap(CameraManager.getCurrentPipeline()));
|
||||||
|
break;
|
||||||
|
case "resolution":
|
||||||
|
int newVideoMode = (int) value;
|
||||||
|
System.out.printf("Changing video mode to %d\n", newVideoMode);
|
||||||
|
CameraManager.getCurrentCamera().setCamVideoMode(newVideoMode, true);
|
||||||
|
break;
|
||||||
|
case "FOV":
|
||||||
|
double newFov = Double.parseDouble(value.toString());//TODO check this
|
||||||
|
System.out.printf("Changing FOV to %f\n", newFov);
|
||||||
|
CameraManager.getCurrentCamera().setFOV(newFov);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
System.out.printf("Unexpected value from websocket: [%s, %s]\n", key, value);
|
||||||
|
break;
|
||||||
|
}}
|
||||||
}
|
}
|
||||||
}
|
catch (CameraException e)
|
||||||
|
{
|
||||||
|
System.err.println("Camera error");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
broadcastMessage(entries, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setField(Object obj, String fieldName, Object value) {
|
private void setField(Object obj, String fieldName, Object value) {
|
||||||
@@ -127,8 +145,8 @@ public class ServerHandler {
|
|||||||
if (f.getName().equals(fieldName)) {
|
if (f.getName().equals(fieldName)) {
|
||||||
if (BeanUtils.isSimpleValueType(value.getClass())) {
|
if (BeanUtils.isSimpleValueType(value.getClass())) {
|
||||||
f.set(obj, value);
|
f.set(obj, value);
|
||||||
} else if (value.getClass() == JSONArray.class) {
|
} else if (value.getClass() == ArrayValue.class) {
|
||||||
f.set(obj, ((JSONArray) value).toList());
|
f.set(obj, ((ArrayValue) value).toArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -144,17 +162,18 @@ public class ServerHandler {
|
|||||||
if (userToSkip != null && user.getSessionId().equals(userToSkip.getSessionId())) {
|
if (userToSkip != null && user.getSessionId().equals(userToSkip.getSessionId())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (obj.getClass() == String.class)
|
user.send(obj);
|
||||||
user.send((String) obj);
|
// if (obj.getClass() == String.class)
|
||||||
else if (obj.getClass() == HashMap.class)
|
// user.send((String) obj);
|
||||||
user.send(new JSONObject((HashMap<String, Object>) obj).toString());
|
// else if (obj.getClass() == HashMap.class)
|
||||||
else
|
// user.send(new JSONObject((HashMap<String, Object>) obj).toString());
|
||||||
user.send(new JSONObject(obj).toString());
|
// else
|
||||||
|
// user.send(new JSONObject(obj).toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void broadcastMessage(Object obj) {
|
public static void broadcastMessage(Object obj) {//TODO fix sending for msgpack
|
||||||
broadcastMessage(obj, null);//Broadcasts the message to ever user
|
broadcastMessage(obj, null);//Broadcasts the message to every user
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<CVrangeSlider v-model="value.Area" name="Area" :min="0" :max="100" :step="0.1" @input="handleInput('Area',value.Area)"></CVrangeSlider>
|
<CVrangeSlider v-model="value.Area" name="Area" :min="0" :max="100" :step="0.1" @input="handleInput('Area',value.Area)"></CVrangeSlider>
|
||||||
<CVrangeSlider v-model="value.Ratio" name="Ratio (W/H)" :min="0" :max="100" :step="0.1" @input="handleInput('Ratio',value.Ratio)"></CVrangeSlider>
|
<CVrangeSlider v-model="value.Ratio" name="Ratio (W/H)" :min="0" :max="100" :step="0.1" @input="handleInput('ratio',value.Ratio)"></CVrangeSlider>
|
||||||
<CVrangeSlider v-model="value.Extent" name="Extent" :min="0" :max="100" @input="handleInput('Extent',value.Extent)"></CVrangeSlider>
|
<CVrangeSlider v-model="value.Extent" name="Extent" :min="0" :max="100" @input="handleInput('Extent',value.Extent)"></CVrangeSlider>
|
||||||
<CVselect name="Target Group" :list="['Single','Dual','Triple','Quadruple','Quintuple']" v-model="value.TargetGrouping" @input="handleInput('TargetGrouping',value.TargetGrouping)"></CVselect>
|
<CVselect name="Target Group" :list="['Single','Dual','Triple','Quadruple','Quintuple']" v-model="value.TargetGrouping" @input="handleInput('TargetGrouping',value.TargetGrouping)"></CVselect>
|
||||||
<CVselect name="Target Intersection" :list="['None','Up','Down','Left','Right']" :disabled="isDisabled" v-model="value.TargetIntersection" @input="handleInput('TargetIntersection',value.TargetIntersection)"></CVselect>
|
<CVselect name="Target Intersection" :list="['None','Up','Down','Left','Right']" :disabled="isDisabled" v-model="value.TargetIntersection" @input="handleInput('TargetIntersection',value.TargetIntersection)"></CVselect>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<CVslider name="Exposure" v-model="value.Exposure" @input="handleInput('Exposure',value.Exposure)" :min="0" :max="100"></CVslider>
|
<CVslider name="Exposure" v-model="value.Exposure" @input="handleInput('exposure',value.Exposure)" :min="0" :max="100"></CVslider>
|
||||||
<CVslider name="Brightness" v-model="value.Brightness" :min="0" :max="100" @input="handleInput('Brightness',value.Brightness)"></CVslider>
|
<CVslider name="Brightness" v-model="value.Brightness" :min="0" :max="100" @input="handleInput('Brightness',value.Brightness)"></CVslider>
|
||||||
<CVselect name="Orientation" v-model="value.Orientation" :list="['Normal','Inverted']" @input="handleInput('Orientation',value.Orientation)"></CVselect>
|
<CVselect name="Orientation" v-model="value.Orientation" :list="['Normal','Inverted']" @input="handleInput('Orientation',value.Orientation)"></CVselect>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<CVrangeSlider v-model="value.Hue" name="Hue" :min="0" :max="180" @input="handleInput('Hue',value.Hue)"></CVrangeSlider>
|
<CVrangeSlider v-model="value.Hue" name="Hue" :min="0" :max="180" @input="handleInput('hue',value.Hue)"></CVrangeSlider>
|
||||||
<CVrangeSlider v-model="value.Saturation" name="Saturation" :min="0" :max="255" @input="handleInput('Saturation',value.Saturation)"></CVrangeSlider>
|
<CVrangeSlider v-model="value.Saturation" name="Saturation" :min="0" :max="255" @input="handleInput('Saturation',value.Saturation)"></CVrangeSlider>
|
||||||
<CVrangeSlider v-model="value.Value" name="Value" :min="0" :max="255" @input="handleInput('Value',value.Value)"></CVrangeSlider>
|
<CVrangeSlider v-model="value.Value" name="Value" :min="0" :max="255" @input="handleInput('Value',value.Value)"></CVrangeSlider>
|
||||||
<CVswitch v-model="value.Erode" name="Erode" @input="handleInput('Erode',value.Erode)"></CVswitch>
|
<CVswitch v-model="value.Erode" name="Erode" @input="handleInput('Erode',value.Erode)"></CVswitch>
|
||||||
|
|||||||
Reference in New Issue
Block a user