Simplified ServerHandler, move ApplyFields to set value function

This commit is contained in:
Omer
2019-10-13 22:59:36 +03:00
parent 27dcef96dd
commit 8b61c87733
3 changed files with 72 additions and 200 deletions

View File

@@ -1,73 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_12">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: edu.wpi.first.cameraserver:cameraserver-java:2019.4.1-176-ga5650b9" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-java:2019.4.1-176-ga5650b9" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-jni:osxx86-64:2019.4.1-176-ga5650b9" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-jni:linuxraspbian:2019.4.1-176-ga5650b9" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-jni:linuxx86-64:2019.4.1-176-ga5650b9" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-jni:windowsx86-64:2019.4.1-176-ga5650b9" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.wpiutil:wpiutil-java:2019.4.1-176-ga5650b9" level="project" />
<orderEntry type="library" name="Maven: io.javalin:javalin:3.4.1" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.31" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.3.31" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.3.31" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains:annotations:13.0" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.31" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.26" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-server:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:3.1.0" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-http:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-util:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-io:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-webapp:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-xml:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-servlet:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-security:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-server:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-common:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-api:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-client:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty:jetty-client:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.jetty.websocket:websocket-servlet:9.4.19.v20190610" level="project" />
<orderEntry type="library" name="Maven: org.json:json:20190722" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-simple:1.7.26" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-math3:3.6.1" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.9" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.0.pr1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.0.pr1" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.0.pr1" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.cscore:cscore-java:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.cscore:cscore-jni:linuxaarch64bionic:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.cscore:cscore-jni:linuxraspbian:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.cscore:cscore-jni:linuxx86-64:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.cscore:cscore-jni:osxx86-64:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.cscore:cscore-jni:windowsx86-64:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.cameraserver:cameraserver-java:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-java:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-jni:osxx86-64:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-jni:linuxraspbian:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-jni:linuxx86-64:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.ntcore:ntcore-jni:windowsx86-64:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.wpiutil:wpiutil-java:2019.4.1-200-g2271570" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.thirdparty.frc2020.opencv:opencv-java:3.4.7-1" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.thirdparty.frc2020.opencv:opencv-jni:linuxaarch64bionic:3.4.7-1" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.thirdparty.frc2020.opencv:opencv-jni:linuxraspbian:3.4.7-1" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.thirdparty.frc2020.opencv:opencv-jni:linuxx86-64:3.4.7-1" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.thirdparty.frc2020.opencv:opencv-jni:osxx86-64:3.4.7-1" level="project" />
<orderEntry type="library" name="Maven: edu.wpi.first.thirdparty.frc2020.opencv:opencv-jni:windowsx86-64:3.4.7-1" level="project" />
</component>
</module>

View File

@@ -11,6 +11,7 @@ import edu.wpi.cscore.VideoException;
import io.javalin.websocket.*;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.msgpack.core.MessagePack;
import org.msgpack.core.MessageUnpacker;
@@ -18,6 +19,7 @@ import org.msgpack.value.ImmutableArrayValue;
import org.msgpack.value.ImmutableValue;
import org.msgpack.value.Value;
import org.springframework.beans.BeanUtils;
import java.lang.reflect.Field;
import java.util.*;
@@ -44,147 +46,100 @@ public class ServerHandler {
int length = unpacker.unpackMapHeader();
for (int mapIndex = 0; mapIndex < length; mapIndex++) {
String key = unpacker.unpackString(); // key
Object value = get(unpacker.unpackValue());
// Object value = get(unpacker.unpackValue());
ImmutableValue value = unpacker.unpackValue();
try {
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);
switch (key) {
case "generalSettings": {
//change general settings using a general settings object
break;
}
case "cameraSettings": {
//change camera settings using a camera settings object
break;
}
case "command": {
// used to define all incoming commands
break;
}
case "currentCamera": {
//camera name by string
break;
}
case "currentPipeline": {
// camera pipeline by index
break;
}
default: {//Change pipeline values
//Two special cases for exposure and brightness changes
if (key.equals("exposure"))
try {
;
CameraManager.getCurrentCamera().setExposure(newExposure);
CameraManager.getCurrentCamera().setExposure(value.asIntegerValue().toInt());
} 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":
CameraManager.getCurrentPipeline().ratio=getFloatList((ImmutableArrayValue) value);
break;
case "area":
CameraManager.getCurrentPipeline().area=getFloatList((ImmutableArrayValue) value);
break;
//Enums
case "targetIntersection":
setField(CameraManager.getCurrentPipeline(), key, TargetIntersection.values()[(int) value]);
break;
case "targetGroup":
setField(CameraManager.getCurrentPipeline(), key, TargetGroup.values()[(int) value]);
break;
case "sortMode":
setField(CameraManager.getCurrentPipeline(), key, SortMode.values()[(int) value]);
break;
case "orientation":
setField(CameraManager.getCurrentPipeline(), key, Orientation.values()[(int) value]);
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":
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":
float newFov = ((Integer) value) * 1F;//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;
else if (key.equals("brightness")) try {
CameraManager.getCurrentCamera().setBrightness(value.asIntegerValue().toInt());
} catch (VideoException e) {
e.printStackTrace();
}
else
setValue(CameraManager.getCurrentPipeline(), key, value);//All of the other assignments fields
System.out.println(ToStringBuilder.reflectionToString(CameraManager.getCurrentPipeline()));//Print all pipeline data for debugging
break;
}
}
} catch (CameraException e) {
System.err.println("Camera error");
e.printStackTrace();
} catch (Exception e) {
unexpectedData(key, value);
}
}
}
private void setField(Object obj, String fieldName, Object value) {
private void setValue(Object obj, String fieldName, ImmutableValue value) {
try {
boolean found = false;
Field[] fields = obj.getClass().getFields();
for (Field f : fields) {
if (f.getName().equals(fieldName)) {
if (BeanUtils.isSimpleValueType(f.getType())) {
f.set(obj, value);
} else if (value instanceof ImmutableArrayValue) {
found = true;
if (f.getType().isEnum())//Field is enum like Orientation
f.set(obj, f.getType().getEnumConstants()[value.asIntegerValue().toInt()]);
else if (value.isBooleanValue()) {//Field is boolean like erode
f.set(obj, value.asBooleanValue().getBoolean());
} else if (value.isIntegerValue()) {//Field is int like M and B
f.set(obj, value.asIntegerValue().toInt());
} else if (f.get(obj) instanceof List<?>) {
List<Value> valLst = ((ImmutableArrayValue) value).list();
List<Object> lst = new ArrayList<>();
for (Value val : valLst) {
lst.add(get((ImmutableValue) val));
if (((List) f.get(obj)).get(0).getClass().equals(Float.class)) {//Field is List of Floats like area in pipeline
List<Float> lst = new ArrayList<>();
for (Value v : valLst) {
lst.add(v.isFloatValue() ? v.asFloatValue().toFloat() : (float) v.asIntegerValue().toInt());//Adds float if value is float, casts value to float from int otherwise
}
f.set(obj, lst);
} else if (((List) f.get(obj)).get(0).getClass().equals(Integer.class)) {//Fields is List of Integers like hue in pipeline
List<Integer> lst = new ArrayList<>();
for (Value v : valLst) {
lst.add(v.asIntegerValue().toInt());
}
f.set(obj, lst);
}
f.set(obj, lst);
}
}
}
if (!found)
unexpectedData(fieldName, value);
} catch (Exception e) {
System.out.println("Exception setting field ");
System.out.println("Exception setting field");
e.printStackTrace();
}
}
private Object get(ImmutableValue v) throws Exception {
//TODO find a smarter way to write this
if (v.isIntegerValue())
return v.asIntegerValue().toInt();
if (v.isFloatValue())
return v.asFloatValue().toFloat();
if (v.isArrayValue()) {
return v.asArrayValue();
}
if (v.isBinaryValue())
return v.asBinaryValue().asByteArray();
if (v.isBooleanValue())
return v.asBooleanValue().getBoolean();
if (v.isMapValue())
return v.asMapValue().map();
if (v.isStringValue())
return v.asStringValue().asString();
throw new Exception("Value not recognized");
}
private List<Float> getFloatList(ImmutableArrayValue arrayValue) {
List<Float> output = new ArrayList<>();
List<Value> values = arrayValue.list();
for (Value v:values) {
if (v.isFloatValue())
output.add(v.asFloatValue().toFloat());
else
output.add((float) v.asIntegerValue().toInt());
}
return output;
public void unexpectedData(String key, ImmutableValue v) {
System.err.println("Unexpected key or value, key=" + key + " Value=" + v.toString());
//TODO send a error message to the user
//TODO in the very far future send a bug report?
}
private static void broadcastMessage(Object obj, WsContext userToSkip) {
@@ -201,16 +156,6 @@ public class ServerHandler {
broadcastMessage(obj, null);//Broadcasts the message to every user
}
private boolean hasField(Object obj, String fieldName) {
Field[] fields = obj.getClass().getFields();
for (Field field : fields) {
if (fieldName.equals(field.getName()))
return true;
}
return false;
}
private static Map<String, Object> allFieldsToMap(Object obj) {
Map map = new HashMap<String, Object>();
try {

View File

@@ -3,7 +3,7 @@
<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.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('targetGroup',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>
</div>