2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.miio.internal.robot;
15 import java.awt.Color;
16 import java.io.FileNotFoundException;
17 import java.io.FileReader;
18 import java.io.PrintWriter;
19 import java.lang.reflect.Type;
21 import org.eclipse.jdt.annotation.NonNullByDefault;
22 import org.eclipse.jdt.annotation.Nullable;
23 import org.slf4j.Logger;
25 import com.google.gson.Gson;
26 import com.google.gson.GsonBuilder;
27 import com.google.gson.JsonDeserializationContext;
28 import com.google.gson.JsonDeserializer;
29 import com.google.gson.JsonElement;
30 import com.google.gson.JsonObject;
31 import com.google.gson.JsonParseException;
32 import com.google.gson.JsonSerializationContext;
33 import com.google.gson.JsonSerializer;
34 import com.google.gson.annotations.Expose;
35 import com.google.gson.annotations.SerializedName;
38 * This class provides the configuration for the vacuum map drawing
40 * @author Marcel Verpaalen - Initial contribution
43 public class RRMapDrawOptions {
45 private static final Color COLOR_MAP_INSIDE = new Color(32, 115, 185);
46 private static final Color COLOR_MAP_OUTSIDE = new Color(19, 87, 148);
47 private static final Color COLOR_MAP_WALL = new Color(100, 196, 254);
48 private static final Color COLOR_CARPET = new Color(0xDF, 0xDF, 0xDF, 0xA0);
49 private static final Color COLOR_GREY_WALL = new Color(93, 109, 126);
50 private static final Color COLOR_PATH = new Color(147, 194, 238);
51 private static final Color COLOR_ZONES = new Color(0xAD, 0xD8, 0xFF, 0x8F);
52 private static final Color COLOR_NO_GO_ZONES = new Color(255, 33, 55, 127);
53 private static final Color COLOR_CHARGER_HALO = new Color(0x66, 0xfe, 0xda, 0x7f);
54 private static final Color COLOR_ROBO = new Color(75, 235, 149);
55 private static final Color COLOR_SCAN = new Color(0xDF, 0xDF, 0xDF);
56 private static final Color ROOM1 = new Color(240, 178, 122);
57 private static final Color ROOM2 = new Color(133, 193, 233);
58 private static final Color ROOM3 = new Color(217, 136, 128);
59 private static final Color ROOM4 = new Color(52, 152, 219);
60 private static final Color ROOM5 = new Color(205, 97, 85);
61 private static final Color ROOM6 = new Color(243, 156, 18);
62 private static final Color ROOM7 = new Color(88, 214, 141);
63 private static final Color ROOM8 = new Color(245, 176, 65);
64 private static final Color ROOM9 = new Color(0xFc, 0xD4, 0x51);
65 private static final Color ROOM10 = new Color(72, 201, 176);
66 private static final Color ROOM11 = new Color(84, 153, 199);
67 private static final Color ROOM12 = new Color(255, 213, 209);
68 private static final Color ROOM13 = new Color(228, 228, 215);
69 private static final Color ROOM14 = new Color(82, 190, 128);
70 private static final Color ROOM15 = new Color(72, 201, 176);
71 private static final Color ROOM16 = new Color(165, 105, 189);
72 private static final Color[] ROOM_COLORS = { ROOM1, ROOM2, ROOM3, ROOM4, ROOM5, ROOM6, ROOM7, ROOM8, ROOM9, ROOM10,
73 ROOM11, ROOM12, ROOM13, ROOM14, ROOM15, ROOM16 };
75 private static final Gson GSON = new GsonBuilder().setPrettyPrinting()
76 .registerTypeAdapter(Color.class, new JsonSerializer<Color>() {
78 public JsonElement serialize(Color src, @Nullable Type typeOfSrc,
79 @Nullable JsonSerializationContext context) {
80 JsonObject colorSave = new JsonObject();
81 colorSave.addProperty("red", src.getRed());
82 colorSave.addProperty("green", src.getGreen());
83 colorSave.addProperty("blue", src.getBlue());
84 colorSave.addProperty("alpha", src.getAlpha());
87 }).registerTypeAdapter(Color.class, new JsonDeserializer<Color>() {
90 public Color deserialize(@Nullable JsonElement json, @Nullable Type typeOfT,
91 @Nullable JsonDeserializationContext context) throws JsonParseException {
93 throw new JsonParseException("missing json text");
95 JsonObject colorSave = json.getAsJsonObject();
96 Color color = new Color(colorSave.get("red").getAsInt(), colorSave.get("green").getAsInt(),
97 colorSave.get("blue").getAsInt(), colorSave.get("alpha").getAsInt());
102 @SerializedName("colorMapInside")
104 private Color colorMapInside = COLOR_MAP_INSIDE;
105 @SerializedName("colorMapOutside")
107 private Color colorMapOutside = COLOR_MAP_OUTSIDE;
108 @SerializedName("colorMapWall")
110 private Color colorMapWall = COLOR_MAP_WALL;
111 @SerializedName("colorCarpet")
113 private Color colorCarpet = COLOR_CARPET;
114 @SerializedName("colorGreyWall")
116 private Color colorGreyWall = COLOR_GREY_WALL;
117 @SerializedName("colorPath")
119 private Color colorPath = COLOR_PATH;
120 @SerializedName("colorZones")
122 private Color colorZones = COLOR_ZONES;
123 @SerializedName("colorNoGoZones")
125 private Color colorNoGoZones = COLOR_NO_GO_ZONES;
126 @SerializedName("colorChargerHalo")
128 private Color colorChargerHalo = COLOR_CHARGER_HALO;
129 @SerializedName("colorRobo")
131 private Color colorRobo = COLOR_ROBO;
132 @SerializedName("colorScan")
134 private Color colorScan = COLOR_SCAN;
136 @SerializedName("roomColors")
138 private Color[] roomColors = ROOM_COLORS;
140 @SerializedName("showLogo")
142 private boolean showLogo = true;
143 @SerializedName("text")
145 private String text = "Openhab rocks your Xiaomi vacuum!";
146 @SerializedName("textFontSize")
148 private int textFontSize = 12;
149 @SerializedName("scale")
151 private float scale = 2.0f;
152 @SerializedName("cropBorder")
154 private int cropBorder = 10;
156 public Color getColorMapInside() {
157 return colorMapInside;
160 public void setColorMapInside(Color colorMapInside) {
161 this.colorMapInside = colorMapInside;
164 public Color getColorMapOutside() {
165 return colorMapOutside;
168 public void setColorMapOutside(Color colorMapOutside) {
169 this.colorMapOutside = colorMapOutside;
172 public Color getColorMapWall() {
176 public void setColorMapWall(Color colorMapWall) {
177 this.colorMapWall = colorMapWall;
180 public Color getColorCarpet() {
184 public void setColorCarpet(Color colorCarpet) {
185 this.colorCarpet = colorCarpet;
188 public Color getColorGreyWall() {
189 return colorGreyWall;
192 public void setColorGreyWall(Color colorGreyWall) {
193 this.colorGreyWall = colorGreyWall;
196 public Color getColorPath() {
200 public void setColorPath(Color colorPath) {
201 this.colorPath = colorPath;
204 public Color getColorZones() {
208 public void setColorZones(Color colorZones) {
209 this.colorZones = colorZones;
212 public Color getColorNoGoZones() {
213 return colorNoGoZones;
216 public void setColorNoGoZones(Color colorNoGoZones) {
217 this.colorNoGoZones = colorNoGoZones;
220 public Color getColorChargerHalo() {
221 return colorChargerHalo;
224 public void setColorChargerHalo(Color colorChargerHalo) {
225 this.colorChargerHalo = colorChargerHalo;
228 public Color getColorRobo() {
232 public void setColorRobo(Color colorRobo) {
233 this.colorRobo = colorRobo;
236 public Color getColorScan() {
240 public void setColorScan(Color colorScan) {
241 this.colorScan = colorScan;
244 public Color[] getRoomColors() {
248 public void setRoomColors(Color[] roomColors) {
249 this.roomColors = roomColors;
252 public boolean isShowLogo() {
256 public void setShowLogo(boolean showLogo) {
257 this.showLogo = showLogo;
260 public String getText() {
264 public void setText(String text) {
268 public final int getTextFontSize() {
272 public final void setTextFontSize(int textFontSize) {
273 this.textFontSize = textFontSize;
276 public float getScale() {
280 public void setScale(float scale) {
284 public final int getCropBorder() {
288 public final void setCropBorder(int cropBorder) {
289 this.cropBorder = cropBorder;
292 public static void writeOptionsToFile(RRMapDrawOptions options, String fileName, Logger logger) {
293 String json = GSON.toJson(options, RRMapDrawOptions.class);
294 try (PrintWriter pw = new PrintWriter(fileName)) {
296 logger.debug("Vacuum map draw options file created: {}", fileName);
297 } catch (FileNotFoundException e) {
298 logger.info("Error writing Vacuum map draw options file: {}", e.getMessage());
302 public static RRMapDrawOptions getOptionsFromFile(String fileName, Logger logger) {
304 RRMapDrawOptions options = GSON.fromJson(new FileReader(fileName), RRMapDrawOptions.class);
306 } catch (FileNotFoundException e) {
307 logger.debug("Vacuum map draw options file {} not found. Using defaults", fileName);
308 return new RRMapDrawOptions();
309 } catch (JsonParseException e) {
310 logger.info("Error reading vacuum map draw options file {}: {}", fileName, e.getMessage());
312 logger.info("Write default map draw options to {}", fileName);
313 RRMapDrawOptions options = new RRMapDrawOptions();
314 writeOptionsToFile(options, fileName, logger);
315 return new RRMapDrawOptions();