From 5d849dfe6126c0200c11ba9e062b6a1cb5bd190a Mon Sep 17 00:00:00 2001 From: Miguel Angel Astor Romero Date: Sat, 5 Apr 2014 15:04:44 -0430 Subject: [PATCH 1/6] Allowed to run without a connected robot. --- src/ve/ucv/ciens/ccg/nxtcam/MainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ve/ucv/ciens/ccg/nxtcam/MainActivity.java b/src/ve/ucv/ciens/ccg/nxtcam/MainActivity.java index 651062b..2665593 100644 --- a/src/ve/ucv/ciens/ccg/nxtcam/MainActivity.java +++ b/src/ve/ucv/ciens/ccg/nxtcam/MainActivity.java @@ -87,7 +87,7 @@ public class MainActivity extends Activity implements WifiOnDialogListener, Conn // Set up gui components. startButton = (Button)findViewById(R.id.startButton); - startButton.setEnabled(false); + //startButton.setEnabled(false); connectButton = (Button)findViewById(R.id.connectButton); // Set up services. From 500b42a278e2fa1f8e88c8426f4dcb0ee12bf2e4 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 17 Jun 2014 18:22:38 -0430 Subject: [PATCH 2/6] Probably fixed the optimal preview size thing. Not tested yet. --- .../ccg/nxtcam/camera/CameraPreview.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/ve/ucv/ciens/ccg/nxtcam/camera/CameraPreview.java b/src/ve/ucv/ciens/ccg/nxtcam/camera/CameraPreview.java index d90f08a..46ba5c2 100644 --- a/src/ve/ucv/ciens/ccg/nxtcam/camera/CameraPreview.java +++ b/src/ve/ucv/ciens/ccg/nxtcam/camera/CameraPreview.java @@ -54,7 +54,6 @@ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback super(context); parentActivity = (Activity)context; - // surfaceView = new SurfaceView(context); holder = getHolder(); holder.addCallback(this); @@ -107,20 +106,20 @@ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback camParams = camera.getParameters(); camParams.getSupportedPreviewSizes(); List sizes = camParams.getSupportedPreviewSizes(); - + for(Size size: sizes){ Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged() :: Supported preview size (" + size.width + ", " + size.height + ")"); } - - /*Size optimal = getOptimalPreviewSize(sizes, w, h); + + Size optimal = getOptimalPreviewSize(sizes, 352, 288); Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged() :: Preview size set at (" + optimal.width + ", " + optimal.height + ")"); - camParams.setPreviewSize(optimal.width, optimal.height);*/ - camParams.setPreviewSize(352, 288); + camParams.setPreviewSize(optimal.width, optimal.height); + // camParams.setPreviewSize(352, 288); camera.setParameters(camParams); - /*previewWidth = optimal.width; - previewHeight = optimal.height;*/ - previewWidth = 352; - previewHeight = 288; + previewWidth = optimal.width; + previewHeight = optimal.height; + // previewWidth = 352; + // previewHeight = 288; android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(0, info); From 14001b3bf09a8cbc3e6bd7d215d690d899dc71d2 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 18 Jun 2014 12:02:51 -0430 Subject: [PATCH 3/6] Selection of preview size fixed and tested. --- .../ccg/nxtcam/camera/CameraPreview.java | 139 ++++++++++-------- 1 file changed, 79 insertions(+), 60 deletions(-) diff --git a/src/ve/ucv/ciens/ccg/nxtcam/camera/CameraPreview.java b/src/ve/ucv/ciens/ccg/nxtcam/camera/CameraPreview.java index 46ba5c2..fbe4da9 100644 --- a/src/ve/ucv/ciens/ccg/nxtcam/camera/CameraPreview.java +++ b/src/ve/ucv/ciens/ccg/nxtcam/camera/CameraPreview.java @@ -30,6 +30,8 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.hardware.Camera; +import android.hardware.Camera.CameraInfo; +import android.hardware.Camera.Parameters; import android.hardware.Camera.Size; import android.os.Build; import android.view.Surface; @@ -39,15 +41,17 @@ import android.view.SurfaceView; /** A basic Camera preview class */ @SuppressLint("ViewConstructor") public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback { - private final String TAG = "SURFVIEW"; - private final String CLASS_NAME = CameraPreview.class.getSimpleName(); + private static final String TAG = "SURFVIEW"; + private static final String CLASS_NAME = CameraPreview.class.getSimpleName(); + private static final int OPTIMAL_WIDTH = 352; + private static final int OPTIMAL_HEIGHT = 288; private CameraImageMonitor imgMonitor; - private Activity parentActivity; - private SurfaceHolder holder; - private Camera camera; - private int previewWidth; - private int previewHeight; + private Activity parentActivity; + private SurfaceHolder holder; + private Camera camera; + private int previewWidth; + private int previewHeight; @SuppressWarnings("deprecation") public CameraPreview(Context context, Camera camera){ @@ -61,41 +65,52 @@ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } + /** + *

Sets the camera for this surface view.

+ * + * @param camera The camera to set. + */ public void setCamera(Camera camera){ this.camera = camera; if(this.camera != null){ - Logger.log_d(TAG, CLASS_NAME + ".setCamera() :: Setting camera."); + Logger.log_d(TAG, CLASS_NAME + ".setCamera(): Setting camera."); imgMonitor = CameraImageMonitor.getInstance(); requestLayout(); - Logger.log_d(TAG, CLASS_NAME + ".setCamera() :: Camera set."); + Logger.log_d(TAG, CLASS_NAME + ".setCamera(): Camera set."); } } + @Override public void surfaceCreated(SurfaceHolder holder){ // The Surface has been created, now tell the camera where to draw the preview. - Logger.log_d(TAG, CLASS_NAME + ".surfaceCreated() :: Creating surface view."); + Logger.log_d(TAG, CLASS_NAME + ".surfaceCreated(): Creating surface view."); try { if(camera != null) camera.setPreviewDisplay(holder); } catch (IOException e) { - Logger.log_e(TAG, CLASS_NAME + ".surfaceCreated() :: Error creating camera: " + e.getMessage()); + Logger.log_e(TAG, CLASS_NAME + ".surfaceCreated(): Error creating camera: " + e.getMessage()); } } + @Override public void surfaceDestroyed(SurfaceHolder holder){ if(camera != null) camera.stopPreview(); } + @Override public void surfaceChanged(SurfaceHolder tmpHolder, int format, int w, int h){ - int result; - int rotation; - int degrees = 0; - Camera.Parameters camParams; + int result; + int rotation; + int degrees = 0; + Size optimal; + CameraInfo info; + List sizes; + Parameters camParams; - Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged() :: Method started."); + Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged(): Method started."); if(this.holder.getSurface() == null || camera == null){ - Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged() :: Holder and/or camera are null."); + Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged(): Holder and/or camera are null."); return; } @@ -104,35 +119,43 @@ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback requestLayout(); camParams = camera.getParameters(); - camParams.getSupportedPreviewSizes(); - List sizes = camParams.getSupportedPreviewSizes(); + sizes = camParams.getSupportedPreviewSizes(); for(Size size: sizes){ - Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged() :: Supported preview size (" + size.width + ", " + size.height + ")"); + Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged(): Supported preview size (" + size.width + ", " + size.height + ")"); } - Size optimal = getOptimalPreviewSize(sizes, 352, 288); - Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged() :: Preview size set at (" + optimal.width + ", " + optimal.height + ")"); + optimal = getOptimalPreviewSize(sizes, camera.new Size(OPTIMAL_WIDTH, OPTIMAL_HEIGHT)); + Logger.log_d(TAG, CLASS_NAME + ".surfaceChanged(): Preview size set at (" + optimal.width + ", " + optimal.height + ")"); camParams.setPreviewSize(optimal.width, optimal.height); - // camParams.setPreviewSize(352, 288); camera.setParameters(camParams); previewWidth = optimal.width; previewHeight = optimal.height; - // previewWidth = 352; - // previewHeight = 288; - android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); - android.hardware.Camera.getCameraInfo(0, info); + info = new CameraInfo(); + Camera.getCameraInfo(0, info); rotation = parentActivity.getWindowManager().getDefaultDisplay().getRotation(); switch (rotation) { - case Surface.ROTATION_0: degrees = 0; break; - case Surface.ROTATION_90: degrees = 90; break; - case Surface.ROTATION_180: degrees = 180; break; - case Surface.ROTATION_270: degrees = 270; break; + default: + case Surface.ROTATION_0: + degrees = 0; + break; + + case Surface.ROTATION_90: + degrees = 90; + break; + + case Surface.ROTATION_180: + degrees = 180; + break; + + case Surface.ROTATION_270: + degrees = 270; + break; } - if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { + if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing @@ -145,7 +168,7 @@ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback camera.setPreviewDisplay(this.holder); camera.startPreview(); }catch (Exception e){ - Logger.log_e(TAG, CLASS_NAME + ".surfaceChanged() :: Error starting camera preview: " + e.getMessage()); + Logger.log_e(TAG, CLASS_NAME + ".surfaceChanged(): Error starting camera preview: " + e.getMessage()); } } @@ -153,51 +176,47 @@ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback public void onPreviewFrame(byte[] data, Camera camera){ if(imgMonitor.hasChanged()) imgMonitor.setImageParameters(previewWidth, previewHeight); - Logger.log_d(TAG, CLASS_NAME + ".onPreviewFrame() :: Preview received"); - Logger.log_d(TAG, CLASS_NAME + ".onPreviewFrame() :: Frame has" + (imgMonitor.hasChanged() ? "" : " not") + " been consumed."); imgMonitor.setImageData(data); } + /** + *

If camera is not null then disable the camera preview.

+ */ public void removePreviewCallback(){ if(camera != null) camera.setPreviewCallback(null); } - private Size getOptimalPreviewSize(List sizes, int w, int h) { - final double ASPECT_TOLERANCE = 0.1; - double targetRatio = (double) w / h; + /** + *

Tries to obtain the preview size that better matches the target size pixel dimensions.

+ * + * @param sizes An initialized list of supported preview sizes. + * @param target The ideal preview size. + * @return The size from the list of sizes that better matches the target. Null if sizes is null or empty. + */ + private final Size getOptimalPreviewSize(List sizes, final Size target) { + final int TARGET_HEIGHT = target.height; + Size optimalSize = null; + double minDiff = Double.MAX_VALUE; - Logger.log_d(TAG, CLASS_NAME + ".getOptimalPreviewSize() :: Method started."); - if (sizes == null) return null; - - Size optimalSize = null; - double minDiff = Double.MAX_VALUE; - - int targetHeight = h; - - // Try to find an size match aspect ratio and size - for (Size size : sizes) { - double ratio = (double) size.width / size.height; - if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; - if (Math.abs(size.height - targetHeight) < minDiff) { - optimalSize = size; - minDiff = Math.abs(size.height - targetHeight); - } - } + if (sizes == null || sizes.size() == 0) return null; // Cannot find the one match the aspect ratio, ignore the requirement if (optimalSize == null) { + Logger.log_d(TAG, CLASS_NAME + ".getOptimalPreviewSize(): Ignoring aspect ratio."); minDiff = Double.MAX_VALUE; for (Size size : sizes) { - if (Math.abs(size.height - targetHeight) < minDiff) { + if (Math.abs(size.height - TARGET_HEIGHT) < minDiff) { optimalSize = size; - minDiff = Math.abs(size.height - targetHeight); + minDiff = Math.abs(size.height - TARGET_HEIGHT); + Logger.log_d(TAG, CLASS_NAME + ".getOptimalPreviewSize(): Size = (" + Integer.toString(size.width) + ", " + Integer.toString(size.width) + ")"); + Logger.log_d(TAG, CLASS_NAME + ".getOptimalPreviewSize(): minDiff = " + Double.toString(minDiff)); } } } - Logger.log_d(TAG, CLASS_NAME + ".getOptimalPreviewSize() :: Method ended."); - Logger.log_d(TAG, CLASS_NAME + ".getOptimalPreviewSize() :: Optimal size is: (" + Integer.toString(optimalSize.width) + - ", " + Integer.toString(optimalSize.height) + ")"); + + Logger.log_d(TAG, CLASS_NAME + ".getOptimalPreviewSize(): Optimal size found is (" + Integer.toString(optimalSize.width) + ", " + Integer.toString(optimalSize.height) + ")"); + return optimalSize; } } From 7afab2de73322c077dfed485d5c96ba6d7757166 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 18 Jun 2014 18:28:48 -0430 Subject: [PATCH 4/6] Updated version number. --- AndroidManifest.xml | 4 ++-- src/ve/ucv/ciens/ccg/nxtcam/MainActivity.java | 2 +- src/ve/ucv/ciens/ccg/nxtcam/camera/CameraPreview.java | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4dadd63..97c5fd8 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -17,8 +17,8 @@ + android:versionCode="140618" + android:versionName="14.06.18" > sizes, final Size target) { + private Size getOptimalPreviewSize(List sizes, final Size target) { final int TARGET_HEIGHT = target.height; Size optimalSize = null; double minDiff = Double.MAX_VALUE; From ea8f09d30c762af246fbd845a9d68b955143c499 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 23 Jun 2014 16:08:37 -0430 Subject: [PATCH 5/6] Added support for automatic actions. --- src/ve/ucv/ciens/ccg/networkdata/MotorEvent.java | 2 +- src/ve/ucv/ciens/ccg/nxtcam/network/NxtBTCommThread.java | 7 ++++++- .../ciens/ccg/nxtcam/network/protocols/MotorMasks.java | 9 +++++---- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ve/ucv/ciens/ccg/networkdata/MotorEvent.java b/src/ve/ucv/ciens/ccg/networkdata/MotorEvent.java index 50f1c60..40761b6 100644 --- a/src/ve/ucv/ciens/ccg/networkdata/MotorEvent.java +++ b/src/ve/ucv/ciens/ccg/networkdata/MotorEvent.java @@ -5,7 +5,7 @@ import java.io.Serializable; public class MotorEvent implements Serializable{ private static final long serialVersionUID = 9989L; - public enum motor_t {NONE, MOTOR_A, MOTOR_B, MOTOR_C, MOTOR_AC, RECENTER}; + public enum motor_t {NONE, MOTOR_A, MOTOR_B, MOTOR_C, MOTOR_AC, RECENTER, ROTATE_90}; private motor_t motor; private byte power; diff --git a/src/ve/ucv/ciens/ccg/nxtcam/network/NxtBTCommThread.java b/src/ve/ucv/ciens/ccg/nxtcam/network/NxtBTCommThread.java index f8f4dff..281f96e 100644 --- a/src/ve/ucv/ciens/ccg/nxtcam/network/NxtBTCommThread.java +++ b/src/ve/ucv/ciens/ccg/nxtcam/network/NxtBTCommThread.java @@ -73,11 +73,16 @@ public class NxtBTCommThread extends Thread{ msg[0] |= (event.getMotor() == motor_t.MOTOR_C) ? MotorMasks.MOTOR_C : 0; // Set the direction bit. if(event.getPower() > 0) msg[0] |= MotorMasks.DIRECTION; - // Set the recenter bits. + // Set the recenter bit. msg[0] |= (event.getMotor() == motor_t.RECENTER) ? MotorMasks.RECENTER : 0; if((msg[0] & MotorMasks.RECENTER) > 0) Logger.log_i(TAG, CLASS_NAME + ".run(): Recenter received."); + // Set the rotate bit. + msg[0] |= (event.getMotor() == motor_t.ROTATE_90) ? MotorMasks.ROTATE_90 : 0; + if((msg[0] & MotorMasks.ROTATE_90) > 0) + Logger.log_i(TAG, CLASS_NAME + ".run(): Rotate 90 received."); + // Set the power byte. msg[1] = (byte)Math.abs(event.getPower()); diff --git a/src/ve/ucv/ciens/ccg/nxtcam/network/protocols/MotorMasks.java b/src/ve/ucv/ciens/ccg/nxtcam/network/protocols/MotorMasks.java index 1c0bd61..af6db72 100644 --- a/src/ve/ucv/ciens/ccg/nxtcam/network/protocols/MotorMasks.java +++ b/src/ve/ucv/ciens/ccg/nxtcam/network/protocols/MotorMasks.java @@ -18,7 +18,8 @@ package ve.ucv.ciens.ccg.nxtcam.network.protocols; /** *

Bit masks used to code/decode the control instructions sent by NxtAR-cam to * NxtAR-bot.

- *

Expansions 1-3 are currently unused.

+ * + *

Expansions 2-3 are currently unused.

*/ public abstract class MotorMasks { public static final byte MOTOR_A = (byte)0x01; @@ -26,7 +27,7 @@ public abstract class MotorMasks { public static final byte MOTOR_C = (byte)0x04; public static final byte DIRECTION = (byte)0x08; public static final byte RECENTER = (byte)0x10; - public static final byte EXPANSION_1 = (byte)0x20; - public static final byte EXPANSION_2 = (byte)0x20; - public static final byte EXPANSION_3 = (byte)0x20; + public static final byte ROTATE_90 = (byte)0x20; + public static final byte EXPANSION_2 = (byte)0x40; + public static final byte EXPANSION_3 = (byte)0x80; } From d1e4da0ed712bf73602e97011e8b16eff77b69ec Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 26 Jun 2014 10:55:46 -0430 Subject: [PATCH 6/6] Updated the version number. --- AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 97c5fd8..9d19f81 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -17,8 +17,8 @@ + android:versionCode="140626" + android:versionName="14.06.26" >