diff --git a/Main/chameleon-vision.iml b/Main/chameleon-vision.iml
deleted file mode 100644
index f29e8915e..000000000
--- a/Main/chameleon-vision.iml
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java
index 550681f06..5a2d1c3f9 100644
--- a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java
+++ b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java
@@ -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 map = (Map) 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 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 valLst = ((ImmutableArrayValue) value).list();
- List