// -*- mode: java; c-basic-offset: 2; -*- // Copyright 2016 MIT, All rights reserved // Released under the Apache License, Version 2.0 // http://www.apache.org/licenses/LICENSE-2.0 package com.google.appinventor.components.runtime; import com.google.appinventor.components.annotations.DesignerComponent; import com.google.appinventor.components.annotations.SimpleFunction; import com.google.appinventor.components.annotations.SimpleObject; import com.google.appinventor.components.annotations.UsesPermissions; import com.google.appinventor.components.common.ComponentCategory; import com.google.appinventor.components.common.YaVersion; import com.google.appinventor.components.runtime.util.ErrorMessages; import com.google.appinventor.components.runtime.util.Ev3BinaryParser; import com.google.appinventor.components.runtime.util.Ev3Constants; /** * A component that provides a high-level interface to a LEGO MINDSTORMS EV3 * robot, which provides graphic functionalities. * * @author jerry73204@gmail.com (jerry73204) * @author spaded06543@gmail.com (Alvin Chang) */ @DesignerComponent(version = YaVersion.EV3_UI_COMPONENT_VERSION, description = "A component that provides a high-level interface to a LEGO MINDSTORMS EV3 " + "robot, with functions to draw graphs on EV3 screen.", category = ComponentCategory.LEGOMINDSTORMS, nonVisible = true, iconName = "images/legoMindstormsEv3.png") @SimpleObject @UsesPermissions(permissionNames = "android.permission.INTERNET," + "android.permission.WRITE_EXTERNAL_STORAGE," + "android.permission.READ_EXTERNAL_STORAGE") public class Ev3UI extends LegoMindstormsEv3Base { /** * Creates a new Ev3UI component. */ public Ev3UI(ComponentContainer container) { super(container, "Ev3UI"); } /** * Draw a point on the screen. */ @SimpleFunction(description = "Draw a point on the screen.") public void DrawPoint(int color, int x, int y) { String functionName = "DrawPoint"; if (color != 0 && color != 1) { form.dispatchErrorOccurredEvent(this, functionName, ErrorMessages.ERROR_EV3_ILLEGAL_ARGUMENT, functionName); return; } byte[] command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "cccc", Ev3Constants.UIDrawSubcode.PIXEL, (byte) color, (short) x, (short) y); sendCommand(functionName, command, false); command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "c", Ev3Constants.UIDrawSubcode.UPDATE); sendCommand(functionName, command, false); } /** * Draw a built-in icon on screen. */ @SimpleFunction(description = "Draw a built-in icon on screen.") public void DrawIcon(int color, int x, int y, int type, int no) { String functionName = "DrawIcon"; if (color != 0 && color != 1) { form.dispatchErrorOccurredEvent(this, functionName, ErrorMessages.ERROR_EV3_ILLEGAL_ARGUMENT, functionName); return; } byte[] command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "cccccc", Ev3Constants.UIDrawSubcode.ICON, (byte) color, (short) x, (short) y, type, no); sendCommand(functionName, command, false); command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "c", Ev3Constants.UIDrawSubcode.UPDATE); sendCommand(functionName, command, false); } /** * Draw a line on the screen. */ @SimpleFunction(description = "Draw a line on the screen.") public void DrawLine(int color, int x1, int y1, int x2, int y2) { String functionName = "DrawLine"; if (color != 0 && color != 1) { form.dispatchErrorOccurredEvent(this, functionName, ErrorMessages.ERROR_EV3_ILLEGAL_ARGUMENT, functionName); return; } byte[] command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "cccccc", Ev3Constants.UIDrawSubcode.LINE, (byte) color, (short) x1, (short) y1, (short) x2, (short) y2); sendCommand(functionName, command, false); command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "c", Ev3Constants.UIDrawSubcode.UPDATE); sendCommand(functionName, command, false); } /** * Draw a rectangle on the screen. */ @SimpleFunction(description = "Draw a rectangle on the screen.") public void DrawRect(int color, int x, int y, int width, int height, boolean fill) { String functionName = "DrawRect"; if (color != 0 && color != 1) { form.dispatchErrorOccurredEvent(this, functionName, ErrorMessages.ERROR_EV3_ILLEGAL_ARGUMENT, functionName); return; } byte[] command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "cccccc", fill ? Ev3Constants.UIDrawSubcode.FILLRECT : Ev3Constants.UIDrawSubcode.RECT, (byte) color, (short) x, (short) y, (short) width, (short) height); sendCommand(functionName, command, false); command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "c", Ev3Constants.UIDrawSubcode.UPDATE); sendCommand(functionName, command, false); } /** * Draw a circle on the screen. */ @SimpleFunction(description = "Draw a circle on the screen.") public void DrawCircle(int color, int x, int y, int radius, boolean fill) { String functionName = "DrawCircle"; if (color != 0 && color != 1 || radius < 0) { form.dispatchErrorOccurredEvent(this, functionName, ErrorMessages.ERROR_EV3_ILLEGAL_ARGUMENT, functionName); return; } byte[] command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "ccccc", fill ? Ev3Constants.UIDrawSubcode.FILLCIRCLE : Ev3Constants.UIDrawSubcode.CIRCLE, (byte) color, (short) x, (short) y, (short) radius); sendCommand(functionName, command, false); command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "c", Ev3Constants.UIDrawSubcode.UPDATE); sendCommand(functionName, command, false); } /** * Fill the screen with a color. */ @SimpleFunction(description = "Fill the screen with a color.") public void FillScreen(int color) { String functionName = "FillScreen"; if (color != 0 && color != 1) { form.dispatchErrorOccurredEvent(this, functionName, ErrorMessages.ERROR_EV3_ILLEGAL_ARGUMENT, functionName); return; } byte[] command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "cccc", Ev3Constants.UIDrawSubcode.FILLWINDOW, (byte) color, (short) 0, (short) 0); sendCommand(functionName, command, false); command = Ev3BinaryParser.encodeDirectCommand(Ev3Constants.Opcode.UI_DRAW, false, 0, 0, "c", Ev3Constants.UIDrawSubcode.UPDATE); sendCommand(functionName, command, false); } }