package com.cellbots.cellserv.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ErrorEvent; import com.google.gwt.event.dom.client.ErrorHandler; import com.google.gwt.gen2.event.dom.client.LoadEvent; import com.google.gwt.gen2.event.dom.client.LoadHandler; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.Response; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.LoadListener; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.widgetideas.client.ProgressBar; import com.google.gwt.widgetideas.graphics.client.Color; import com.google.gwt.widgetideas.graphics.client.GWTCanvas; public class WiimoteEntry implements EntryPoint { static String SENSORSTATE_URL = "/robotState"; static String VIDEO_URL = "/video"; public static String BOT_ID = ""; final static Label messageLabel = new Label("Did you forget ?BOTID=yourbotname"); final static Label cmdLabel = new Label("Type Cmd:"); final GWTCanvas canvas = new GWTCanvas(128, 64); final TextArea debugConsole = new TextArea(); int framePoleInterval = 200; boolean loadingImg = false; public void dbg(String msg) { debugConsole.setText(debugConsole.getText() + "\n" + msg); } @SuppressWarnings("deprecation") public void onModuleLoad() { String path = Window.Location.getPath(); if (path.endsWith("/")) path = path.substring(0, path.length() - 1); SENSORSTATE_URL = path + SENSORSTATE_URL; BOT_ID = Window.Location.getParameter("BOTID"); Window.setTitle(BOT_ID + " Cellserv"); final WiimoteServiceAsync wiiService = GWT.create(WiimoteService.class); final VerticalPanel mainPanel = new VerticalPanel(); final VerticalPanel controlPanel = new VerticalPanel(); final HorizontalPanel horizontalPanel = new HorizontalPanel(); final HorizontalPanel hudPanel = new HorizontalPanel(); final HorizontalPanel cmdPanel = new HorizontalPanel(); final TextBox txtCommand = new TextBox(); // txtCommand.setWidth("30em"); debugConsole.setWidth("95%"); debugConsole.setHeight("95%"); txtCommand.addKeyPressHandler(new AndroidClickHandler(wiiService)); final Timer elapsedTimer; final Timer sensorTimer; final Button fwdButton = new Button("FWD"); fwdButton.addClickHandler(new AndroidClickHandler(wiiService, AndroidKeyCode.KEYCODE_DPAD_UP)); final Button bkwdButton = new Button("BKWD"); bkwdButton.addClickHandler(new AndroidClickHandler(wiiService, AndroidKeyCode.KEYCODE_DPAD_DOWN)); final Button leftButton = new Button("LEFT"); leftButton.addClickHandler(new AndroidClickHandler(wiiService, AndroidKeyCode.KEYCODE_DPAD_LEFT)); final Button rightButton = new Button("RIGHT"); rightButton.addClickHandler(new AndroidClickHandler(wiiService, AndroidKeyCode.KEYCODE_DPAD_RIGHT)); final Button stopButton = new Button("STOP"); stopButton.addClickHandler(new AndroidClickHandler(wiiService, AndroidKeyCode.KEYCODE_DPAD_CENTER)); final Image videoImage = new Image(VIDEO_URL); videoImage.addErrorHandler(new ErrorHandler() { public void onError(ErrorEvent event) { dbg("could not load video frame"); } }); videoImage.setUrl("video"); fwdButton.setWidth("100%"); bkwdButton.setWidth("100%"); horizontalPanel.add(leftButton); horizontalPanel.add(stopButton); horizontalPanel.add(rightButton); controlPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); controlPanel.add(fwdButton); controlPanel.add(horizontalPanel); controlPanel.add(bkwdButton); controlPanel.setHeight("64px"); hudPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); hudPanel.setWidth("100%"); hudPanel.add(controlPanel); hudPanel.add(canvas); hudPanel.add(debugConsole); hudPanel.setCellWidth(debugConsole, "50%"); hudPanel.setCellWidth(controlPanel, "20%"); cmdPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); cmdPanel.setWidth("100%"); cmdPanel.add(cmdLabel); txtCommand.setWidth("32em"); cmdPanel.add(txtCommand); hudPanel.setCellWidth(txtCommand, "60%"); cmdPanel.add(messageLabel); mainPanel.setWidth("600px"); mainPanel.setBorderWidth(2); mainPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); mainPanel.add(videoImage); mainPanel.add(hudPanel); mainPanel.add(cmdPanel); RootPanel.get().add(mainPanel); // Create a new timer elapsedTimer = new Timer() { public void run() { loadingImg = true; videoImage.setUrl("video?BOTID=" + BOT_ID + "&ts=" + System.currentTimeMillis()); } }; /* videoImage.addLoadListener(new LoadListener() { //do a bit of throttleing public void onLoad(Widget sender) { // TODO Auto-generated method stub if (framePoleInterval > 50) framePoleInterval = framePoleInterval - 10; loadingImg = false; elapsedTimer.scheduleRepeating(framePoleInterval); } public void onError(Widget sender) { // TODO Auto-generated method stub loadingImg = false; if (framePoleInterval < 4000) framePoleInterval = framePoleInterval + 10; elapsedTimer.scheduleRepeating(framePoleInterval); } });*/ // Create a new timer sensorTimer = new Timer() { public void run() { RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, SENSORSTATE_URL + "?BOTID=" + BOT_ID); try { builder.setHeader("Content-Type", "application/json"); builder.sendRequest(null, new RequestCallback() { public void onError(Request request, Throwable exception) { dbg("Couldn't retrieve JSON"); } public void onResponseReceived(Request request, Response response) { if (response.getStatusCode() == 200) showPhoneState(PhoneState.parse(response.getText())); else dbg("Couldn't retrieve JSON"); } }); } catch (RequestException e) { dbg("Couldn't retrieve JSON"); } } }; elapsedTimer.scheduleRepeating(framePoleInterval); sensorTimer.scheduleRepeating(framePoleInterval*2); drawCompass(0); drawBattery(50); } void drawCompass(double angle) { double rad = ( Math.PI * 2 * ( ( angle + 180 ) / 360.0 ) ); canvas.saveContext(); canvas.translate(64, 32); canvas.rotate(rad); canvas.setFillStyle(Color.WHITE); canvas.fillRect(-32, -32, 64, 64); canvas.scale(.75, .75); canvas.setLineWidth(3); canvas.setStrokeStyle(Color.BLACK); canvas.beginPath(); canvas.moveTo(0, 28); canvas.lineTo(12, -28); canvas.lineTo(0, -18); canvas.lineTo(-12, -28); canvas.closePath(); canvas.stroke(); canvas.restoreContext(); } void drawBattery(double percent) { canvas.setFillStyle(Color.GREEN); canvas.fillRect(2, 4, 12, 60); canvas.setFillStyle(Color.WHITE); canvas.fillRect(2, 4, 12, ((100-percent)/100.0)*60.0); canvas.setLineWidth(2); canvas.setStrokeStyle(Color.BLACK); canvas.strokeRect(2, 4, 12, 60); } void showPhoneState(PhoneState state) { if (state.hasOrientation()) { // messageLabel.setText("Azimuth="+state.getOrientation().getAzimuth()); drawCompass(state.getOrientation().getAzimuth()); } if (state.hasPhoneBatteryLevel()) { // messageLabel.setText("Azimuth="+state.getOrientation().getAzimuth()); drawBattery(state.getPhoneBatteryLevel()); } if (state.hasBotID()) { BOT_ID = state.getBotID(); Window.setTitle(BOT_ID + " Cellserv"); } } static void displayError(String error) { messageLabel.setText(error); } }