package nbtool.data.calibration; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import nbtool.data.SExpr; import nbtool.data.json.Json; import nbtool.data.json.JsonObject; import nbtool.data.log.Log; import nbtool.util.Debug; import nbtool.util.SharedConstants; import nbtool.util.ToolSettings; import nbtool.util.test.TestBase; import nbtool.util.test.Tests; public class ColorParam { public static final String ORIGINAL_KEY = "OriginalColorParams"; public static final String MODIFIED_KEY = "ModifiedColorParams"; public String name; public enum Part { uAtY0, uAtY255, vAtY0, vAtY255, u_fuzzy_range, v_fuzzy_range; } public double get(Part part) { switch (part) { case uAtY0: return uAtY0; case uAtY255: return uAtY255; case u_fuzzy_range: return u_fuzzy_range; case vAtY0: return vAtY0; case vAtY255: return vAtY255; case v_fuzzy_range: return v_fuzzy_range; default: throw new RuntimeException("no such part"); } } public void set(Part part, double val) { switch (part) { case uAtY0: uAtY0 = val; break; case uAtY255: uAtY255 = val; break; case u_fuzzy_range: u_fuzzy_range = val; break; case vAtY0: vAtY0 = val; break; case vAtY255: vAtY255 = val; break; case v_fuzzy_range: v_fuzzy_range = val; break; default: throw new RuntimeException("no such part"); } } public double uAtY0, uAtY255; public double vAtY0, vAtY255; public double u_fuzzy_range, v_fuzzy_range; public JsonObject serialize() { JsonObject ret = Json.object(); ret.put("uAtY0", uAtY0); ret.put("uAtY255", uAtY255); ret.put("vAtY0", vAtY0); ret.put("vAtY255", vAtY255); ret.put("u_fuzzy_range", u_fuzzy_range); ret.put("v_fuzzy_range", v_fuzzy_range); return ret; } public static ColorParam parse(JsonObject co, String name) { ColorParam ret = new ColorParam(); ret.name = name; ret.uAtY0 = co.get("uAtY0").asNumber().asDouble(); ret.uAtY255 = co.get("uAtY255").asNumber().asDouble(); ret.vAtY0 = co.get("vAtY0").asNumber().asDouble(); ret.vAtY255 = co.get("vAtY255").asNumber().asDouble(); ret.u_fuzzy_range = co.get("u_fuzzy_range").asNumber().asDouble(); ret.v_fuzzy_range = co.get("v_fuzzy_range").asNumber().asDouble(); return ret; } public static class Camera { public enum Which { green, white, black } public ColorParam green; public ColorParam white; public ColorParam black; public ColorParam get(Which whch) { switch (whch) { case black: return black; case green: return green; case white: return white; default: return null; } } public Camera() { super(); this.green = new ColorParam(); this.white = new ColorParam(); this.black = new ColorParam(); } public static Camera parse(JsonObject params) { Camera camera = new Camera(); camera.green = ColorParam.parse(params.get("green").asObject(), "green"); camera.white = ColorParam.parse(params.get("white").asObject(), "white"); camera.black = ColorParam.parse(params.get("black").asObject(), "black"); return camera; } public JsonObject serialize() { JsonObject ret = Json.object(); ret.put("green", green.serialize()); ret.put("white", white.serialize()); ret.put("black", black.serialize()); return ret; } } public static class Set { public Camera[] cameras = new Camera[2]; public Set() { super(); cameras[0] = new Camera(); cameras[1] = new Camera(); } public Camera get(boolean top) { return (top) ? cameras[0] : cameras[1]; } public Camera getTop() { return cameras[0]; } public Camera getBot() { return cameras[1]; } public static Set parse(JsonObject params) { Set ret = new Set(); ret.cameras[0] = Camera.parse(params.get("camera_TOP").asObject()); ret.cameras[1] = Camera.parse(params.get("camera_BOT").asObject()); return ret; } public JsonObject serialize() { JsonObject ret = Json.object(); ret.put("camera_TOP", cameras[0].serialize()); ret.put("camera_BOT", cameras[1].serialize()); return ret; } } public static Path getPath() { return Paths.get(ToolSettings.NBITES_DIR, SharedConstants.OFFLINE_COLOR_PARAMS_SUFFIX()); } public static void applyTo(Log tripoint, Camera camera) { assert(tripoint.logClass.equals("tripoint")); tripoint.topLevelDictionary.put(MODIFIED_KEY, camera.serialize()); } public static void _NBL_ADD_TESTS_() { Tests.add("calibration", new TestBase("ColorParam") { @Override public boolean testBody() throws Exception { Set set = new Set(); ColorParam green = new ColorParam(); green.uAtY0 = 1; green.uAtY255 = 2; green.vAtY0 = 3; green.vAtY255 = 4; green.u_fuzzy_range = 5; green.v_fuzzy_range = 6; ColorParam white = new ColorParam(); white.uAtY0 = 7; white.uAtY255 = 9; white.vAtY0 = 8; white.vAtY255 = 10; white.u_fuzzy_range = 11; white.v_fuzzy_range = 12; ColorParam black = new ColorParam(); black.uAtY0 = 13; black.uAtY255 = 15; black.vAtY0 = 14; black.vAtY255 = 16; black.u_fuzzy_range = 18; black.v_fuzzy_range = 17; set.cameras[0] = new Camera(); set.cameras[0].green = green; set.cameras[0].black = black; set.cameras[0].white = white; set.cameras[1] = new Camera(); set.cameras[1].green = green; set.cameras[1].black = black; set.cameras[1].white = white; assert (set.serialize().congruent(Set.parse(set.serialize().asObject()).serialize())); return true; } }, new TestBase("ColorParamsExists") { @Override public boolean testBody() throws Exception { String cpStr = new String(Files.readAllBytes( Paths.get(ToolSettings.NBITES_DIR, SharedConstants.OFFLINE_COLOR_PARAMS_SUFFIX()))); Set.parse(Json.parse(cpStr).asObject()); return true; } }); } private static ColorParam makeC(SExpr se) { Debug.plain(se.print()); ColorParam param = new ColorParam(); int i = 0; param.uAtY0 = se.get(i++).get(1).valueAsDouble() * 255 + 128; param.vAtY0 = se.get(i++).get(1).valueAsDouble()* 255+ 128; param.uAtY255 = se.get(i++).get(1).valueAsDouble()* 255+ 128; param.vAtY255 = se.get(i++).get(1).valueAsDouble()* 255+ 128; param.u_fuzzy_range = se.get(i++).get(1).valueAsDouble()* 255+ 128; param.v_fuzzy_range = se.get(i++).get(1).valueAsDouble()* 255+ 128; return param; } private static Camera make(SExpr se) { Camera camera = new Camera(); camera.green = makeC(se.find("Green").get(1)); camera.black = makeC(se.find("Orange").get(1)); camera.white = makeC(se.find("White").get(1)); return camera; } public static void main(String[] args) throws IOException { String lisp = new String( Files.readAllBytes(ToolSettings.NBITES_DIR_PATH.resolve("src/man/config/colorParams.txt"))); SExpr se = SExpr.deserializeFrom(lisp); SExpr list = se.get(1); SExpr top = list.get(0).get(1); SExpr bot = list.get(1).get(1); Set set = new Set(); set.cameras[0] = make(top); set.cameras[1] = make(bot); Debug.plain("%s", set.serialize().print()); } }