Files
PhotonVision/Main/src/main/java/com/chameleonvision/web/ServerHandler.java

253 lines
11 KiB
Java
Raw Normal View History

package com.chameleonvision.web;
import com.chameleonvision.settings.GeneralSettings;
2019-10-14 22:36:56 +03:00
import com.chameleonvision.vision.*;
import com.chameleonvision.vision.camera.Camera;
2019-10-04 15:55:45 -04:00
import com.chameleonvision.vision.camera.CameraException;
import com.chameleonvision.settings.SettingsManager;
import com.chameleonvision.vision.camera.CameraManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.wpi.cscore.VideoException;
2019-10-11 02:25:25 +03:00
import io.javalin.websocket.*;
2019-10-11 02:25:25 +03:00
import org.apache.commons.lang3.ArrayUtils;
import org.msgpack.jackson.dataformat.MessagePackFactory;
import org.springframework.beans.BeanUtils;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.nio.ByteBuffer;
2019-10-11 02:25:25 +03:00
import java.util.*;
public class ServerHandler {
private static List<WsContext> users;
private static ObjectMapper objectMapper;
ServerHandler() {
users = new ArrayList<>();
objectMapper = new ObjectMapper(new MessagePackFactory());
}
void onConnect(WsConnectContext context) {
users.add(context);
sendFullSettings();
}
public void onClose(WsCloseContext context) {
users.remove(context);
}
2019-10-14 22:24:37 +03:00
void onBinaryMessage(WsBinaryMessageContext context) throws Exception {
2019-10-20 10:13:07 +03:00
Map<String, Object> deserialized = objectMapper.readValue(ArrayUtils.toPrimitive(context.data()), new TypeReference<Map<String, Object>>() {
});
for (Map.Entry<String, Object> entry : deserialized.entrySet()) {
try {
switch (entry.getKey()) {
case "generalSettings": {
2019-10-20 10:13:07 +03:00
for (HashMap.Entry<String, Object> e : ((HashMap<String, Object>) entry.getValue()).entrySet()) {
setField(SettingsManager.GeneralSettings, e.getKey(), e.getValue());
}
2019-10-21 20:22:39 +03:00
SettingsManager.saveSettings();
break;
}
case "cameraSettings": {
2019-10-20 10:13:07 +03:00
HashMap camSettings = (HashMap) entry.getValue();
CameraManager.getCurrentCamera().setFOV((Number) camSettings.get("fov"));
CameraManager.getCurrentCamera().setStreamDivisor((Integer) camSettings.get("streamDivisor"));
2019-10-20 10:13:07 +03:00
CameraManager.getCurrentCamera().setCamVideoMode((Integer) camSettings.get("resolution"), true);
2019-10-21 20:22:39 +03:00
SettingsManager.saveSettings();
break;
}
2019-10-20 10:13:07 +03:00
case "changeCameraName": {
CameraManager.getCurrentCamera().setNickname((String) entry.getValue());
2019-10-25 14:02:42 +03:00
sendFullSettings();
break;
2019-10-19 17:45:40 +03:00
}
2019-10-20 10:13:07 +03:00
case "changePipelineName": {
CameraManager.getCurrentPipeline().nickname = (String) entry.getValue();
break;
2019-10-19 17:45:40 +03:00
}
2019-10-20 10:13:07 +03:00
case "duplicatePipeline": {
HashMap pipelineVals = (HashMap) entry.getValue();
int pipelineIndex = (int) pipelineVals.get("pipeline");
int cameraIndex = (int) pipelineVals.get("camera");
Pipeline origPipeline = CameraManager.getCurrentCamera().getPipelineByIndex(pipelineIndex);
if (cameraIndex != -1) {
CameraManager.getCameraByIndex(cameraIndex).addPipeline(origPipeline);
} else {
CameraManager.getCurrentCamera().addPipeline(origPipeline);
}
break;
2019-10-19 17:45:40 +03:00
}
case "command": {
var cam = CameraManager.getCurrentCamera();
2019-10-20 10:13:07 +03:00
switch ((String) entry.getValue()) {
case "addNewPipeline":
cam.addPipeline();
2019-10-25 14:05:00 +03:00
sendFullSettings();
break;
case "deleteCurrentPipeline":
int currentIndex = cam.getCurrentPipelineIndex();
int nextIndex = 0;
if (currentIndex == cam.getPipelines().size() - 1){
nextIndex = currentIndex - 1;
} else {
nextIndex = currentIndex;
}
cam.deletePipeline();
cam.setCurrentPipelineIndex(nextIndex);
sendFullSettings();
break;
}
// used to define all incoming commands
break;
}
case "currentCamera": {
CameraManager.setCurrentCamera((String) entry.getValue());
var cam = CameraManager.getCurrentCamera();
2019-10-20 10:13:07 +03:00
HashMap<String, Object> tmp = new HashMap<>();
tmp.put("pipeline", cam.getCurrentPipeline());
tmp.put("pipelineList", cam.getPipelinesNickname());
tmp.put("port", cam.getStreamPort());
tmp.put("resolutionList", cam.getResolutionList());
broadcastMessage(tmp);
break;
}
case "currentPipeline": {
var cam = CameraManager.getCurrentCamera();
cam.setCurrentPipelineIndex((Integer) entry.getValue());
2019-10-20 10:13:07 +03:00
HashMap<String, Object> tmp = new HashMap<>();
tmp.put("pipeline", getOrdinalPipeline());
broadcastMessage(tmp);
try {
cam.setBrightness(cam.getCurrentPipeline().brightness);
cam.setExposure(cam.getCurrentPipeline().exposure);
}catch (Exception e){
continue;
}
break;
}
default: {
2019-10-20 10:13:07 +03:00
setField(CameraManager.getCurrentCamera().getCurrentPipeline(), entry.getKey(), entry.getValue());
switch (entry.getKey()) {
case "exposure": {
try {
CameraManager.getCurrentCamera().setExposure((Integer) entry.getValue());
2019-10-20 10:13:07 +03:00
} catch (Exception e) {
System.err.println("Camera Does not support exposure change");
}
}
2019-10-20 10:13:07 +03:00
case "brightness": {
CameraManager.getCurrentCamera().setBrightness((Integer) entry.getValue());
}
}
break;
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
2019-10-20 10:13:07 +03:00
broadcastMessage(deserialized, context);
}
}
2019-10-20 10:13:07 +03:00
private void setField(Object obj, String fieldName, Object value) {
try {
Field field = obj.getClass().getField(fieldName);
2019-10-20 10:13:07 +03:00
if (BeanUtils.isSimpleValueType(field.getType())) {
if (field.getType().isEnum()) {
field.set(obj, field.getType().getEnumConstants()[(Integer) value]);
} else {
field.set(obj, value);
2019-10-14 22:24:37 +03:00
}
2019-10-20 10:13:07 +03:00
} else if (field.getType() == List.class) {
// if(((ParameterizedType)field.getGenericType()).getActualTypeArguments()[0] == Double.class){
2019-10-20 10:13:07 +03:00
field.set(obj, value);
}
} catch (NoSuchFieldException | IllegalAccessException ex) {
ex.printStackTrace();
}
}
private static void broadcastMessage(Object obj, WsContext userToSkip) {
if (users != null)
for (var user : users) {
if (userToSkip != null && user.getSessionId().equals(userToSkip.getSessionId())) {
continue;
}
2019-10-20 10:13:07 +03:00
try {
ByteBuffer b = ByteBuffer.wrap(objectMapper.writeValueAsBytes(obj));
user.send(b);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
public static void broadcastMessage(Object obj) {
2019-10-11 02:25:25 +03:00
broadcastMessage(obj, null);//Broadcasts the message to every user
}
2019-10-20 10:13:07 +03:00
private static HashMap<String, Object> getOrdinalPipeline() throws CameraException, IllegalAccessException {
HashMap<String, Object> tmp = new HashMap<>();
for (Field f : Pipeline.class.getFields()) {
if (!f.getType().isEnum()) {
tmp.put(f.getName(), f.get(CameraManager.getCurrentCamera().getCurrentPipeline()));
} else {
2019-10-14 22:36:56 +03:00
var i = (Enum) f.get(CameraManager.getCurrentCamera().getCurrentPipeline());
2019-10-20 10:13:07 +03:00
tmp.put(f.getName(), i.ordinal());
2019-10-14 22:36:56 +03:00
}
}
return tmp;
}
2019-10-20 10:13:07 +03:00
private static HashMap<String, Object> getOrdinalSettings() {
HashMap<String, Object> tmp = new HashMap<>();
tmp.put("teamNumber", SettingsManager.GeneralSettings.teamNumber);
tmp.put("connectionType", SettingsManager.GeneralSettings.connectionType.ordinal());
tmp.put("ip", SettingsManager.GeneralSettings.ip);
tmp.put("gateway", SettingsManager.GeneralSettings.gateway);
tmp.put("netmask", SettingsManager.GeneralSettings.netmask);
tmp.put("hostname", SettingsManager.GeneralSettings.hostname);
return tmp;
}
2019-10-20 10:13:07 +03:00
private static HashMap<String, Object> getOrdinalCameraSettings() {
HashMap<String, Object> tmp = new HashMap<>();
try {
var currentCamera = CameraManager.getCurrentCamera();
2019-10-20 10:13:07 +03:00
tmp.put("fov", currentCamera.getFOV());
tmp.put("streamDivisor", currentCamera.getStreamDivisor().ordinal());
tmp.put("resolution", currentCamera.getVideoModeIndex());
} catch (CameraException e) {
e.printStackTrace();
}
return tmp;
}
2019-10-20 10:13:07 +03:00
2019-09-22 02:49:30 -04:00
public static void sendFullSettings() {
//General settings
Map<String, Object> fullSettings = new HashMap<>();
try {
fullSettings.put("settings", getOrdinalSettings());
2019-10-20 10:13:07 +03:00
fullSettings.put("cameraSettings", getOrdinalCameraSettings());
2019-10-25 14:05:00 +03:00
fullSettings.put("cameraList", CameraManager.getAllCameraByNickname());
var currentCamera = CameraManager.getCurrentCamera();
2019-10-14 22:36:56 +03:00
fullSettings.put("pipeline", getOrdinalPipeline());
2019-10-25 14:05:00 +03:00
fullSettings.put("pipelineList", currentCamera.getPipelinesNickname());
fullSettings.put("resolutionList", currentCamera.getResolutionList());
2019-09-22 02:49:30 -04:00
fullSettings.put("port", currentCamera.getStreamPort());
2019-10-14 22:36:56 +03:00
} catch (CameraException | IllegalAccessException e) {
System.err.println("No camera found!");
}
broadcastMessage(fullSettings);
}
}