diff --git a/.idea/misc.xml b/.idea/misc.xml index e4d201d..7bfef59 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 53a42f8..ec8af2d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,8 @@ android { } } compileOptions { - sourceCompatibility = 9.8 - targetCompatibility = 9.8 + sourceCompatibility = 1.8 + targetCompatibility = 1.8 } } diff --git a/app/src/main/java/com/example/carcontroller/LIDAR/LidarView.java b/app/src/main/java/com/example/carcontroller/LIDAR/LidarView.java index 9f28f61..6d221b9 100644 --- a/app/src/main/java/com/example/carcontroller/LIDAR/LidarView.java +++ b/app/src/main/java/com/example/carcontroller/LIDAR/LidarView.java @@ -1,35 +1,95 @@ package com.example.carcontroller.LIDAR; import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; +import androidx.preference.PreferenceManager; + +import com.example.carcontroller.Empty; +import com.example.carcontroller.Int32Value; import com.example.carcontroller.PersonTrackingGrpc; +import com.example.carcontroller.PointScan; +import com.example.carcontroller.Updaters.AbstractUpdater; +import com.example.carcontroller.Updaters.ZmqUpdater; -public class LidarView extends SurfaceView implements Runnable { +import java.util.stream.Collectors; - private boolean running; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import io.grpc.stub.StreamObserver; + +public class LidarView extends SurfaceView implements AbstractUpdater.MapChangedListener { + + private static final String LIDAR_TOPIC = "lidar_map"; + + private AbstractUpdater lidar; private Thread lidarThread; - private SurfaceHolder holder; - PersonTrackingGrpc.PersonTrackingBlockingStub stub; + private String port; + private SurfaceHolder surfaceHolder; + PersonTrackingGrpc.PersonTrackingStub stub; private int mBitmapX, mBitmapY, mViewWidth, mViewHeight; private Bitmap mBitmap; public LidarView(Context context) { super(context); + init(); } public LidarView(Context context, AttributeSet attrs) { super(context, attrs); + init(); } public LidarView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + String host = prefs.getString("host", "10.0.0.53"); + port = prefs.getString("zmqPort", "5050"); + String gRPCPort = prefs.getString("port", "50051"); + lidar = new ZmqUpdater<>(PointScan.getDefaultInstance().getParserForType(), LIDAR_TOPIC, host, port); + lidar.addMapChangedListener(this); + surfaceHolder = getHolder(); + lidarThread = new Thread(lidar); + ManagedChannel channel = ManagedChannelBuilder.forAddress(host, Integer.parseInt(gRPCPort)).usePlaintext().build(); + stub = PersonTrackingGrpc.newStub(channel); + } + + /** + * Called by MainActivity.onResume() to start a thread. + */ + public void resume() { + StreamObserver response = new StreamObserver() { + @Override + public void onNext(Empty value) { + lidarThread.start(); + } + + @Override + public void onError(Throwable t) { + // TODO: close the activity, + System.out.println(t.getMessage()); + } + + @Override + public void onCompleted() { + // Don't care. + } + }; + // use async grpc method, ZMQ doesn't need to connect straight away. + stub.startTracking(Int32Value.newBuilder().setValue(Integer.parseInt(port)).build(), response); } @Override @@ -42,7 +102,7 @@ public class LidarView extends SurfaceView implements Runnable { float x = event.getX(); float y = event.getY(); - // Get the group that was selected and select on the grpc controller. + // TODO: Get the group that was selected and select on the grpc controller. switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; @@ -50,36 +110,31 @@ public class LidarView extends SurfaceView implements Runnable { return true; } - @Override - public void run() { - Canvas canvas; - while (running) { - if (holder.getSurface().isValid()) { - canvas = holder.lockCanvas(); - canvas.save(); - // Get the updated points from the raspberry pi. - - // Iterate through every point (hist point) and draw to the canvas. - - } - } - } - - public void pause() { - running = false; + public void stop() { + // TODO: Use grpc to tell zmq to stop. + lidar.stop(); try { - lidarThread.join(); + lidarThread.join(1000); } catch (InterruptedException e) { - } - } - public void resume() { - lidarThread = new Thread(this); - lidarThread.start(); - running = true; + @Override + public void mapChanged(PointScan points) { + if (surfaceHolder.getSurface().isValid()) { + Canvas canvas = surfaceHolder.lockCanvas(); + canvas.save(); + canvas.drawColor(Color.WHITE); + for (Point point : points.getPointsList().stream().map(Point::fromProtoPoint).collect(Collectors.toList())) { + // Now for each point, draw a circle for the point (so it's big enough) in the correct spot, + // and create a colour for that point to paint it correctly. + // TODO: Dynamically change the colour of the paint object based on the point group number. + canvas.drawCircle((float) point.x, (float) point.y, 5, new Paint()); + } + canvas.restore(); + surfaceHolder.unlockCanvasAndPost(canvas); + } } private static class Point { @@ -91,8 +146,8 @@ public class LidarView extends SurfaceView implements Runnable { this.y = y; } - static Point fromXY(double x, double y) { - return new Point(x, y); + static Point fromProtoPoint(com.example.carcontroller.Point point) { + return fromHist(point.getDistance(), point.getAngle()); } static Point fromHist(double distance, double angle) { diff --git a/app/src/main/java/com/example/carcontroller/SLAM/SlamView.java b/app/src/main/java/com/example/carcontroller/SLAM/SlamView.java index 2485239..5e7d97f 100644 --- a/app/src/main/java/com/example/carcontroller/SLAM/SlamView.java +++ b/app/src/main/java/com/example/carcontroller/SLAM/SlamView.java @@ -31,7 +31,6 @@ public class SlamView extends SurfaceView implements AbstractUpdater.MapChangedL private AbstractUpdater slam; private Thread mapThread; - private Context context; private SurfaceHolder surfaceHolder; private Paint paint; private SlamControlGrpc.SlamControlStub stub; @@ -41,24 +40,21 @@ public class SlamView extends SurfaceView implements AbstractUpdater.MapChangedL public SlamView(Context context) { super(context); - this.context = context; init(); } public SlamView(Context context, AttributeSet attrs) { super(context, attrs); - this.context = context; init(); } public SlamView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - this.context = context; init(); } private void init() { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); String host = prefs.getString("host", "10.0.0.53"); port = prefs.getString("zmqPort", "5050"); String gRPCPort = prefs.getString("port", "50051"); @@ -104,10 +100,10 @@ public class SlamView extends SurfaceView implements AbstractUpdater.MapChangedL } public void stop() { - // Use grpc to tell the loader to stop. Interrupt the loader thread as well. + // TODO: Use grpc to tell zmq to stop. slam.stop(); try { - mapThread.join(); + mapThread.join(1000); } catch (InterruptedException e) { } } diff --git a/app/src/main/proto/lidar_tracker.proto b/app/src/main/proto/lidar_tracker.proto index 1415429..3ef8a6c 100644 --- a/app/src/main/proto/lidar_tracker.proto +++ b/app/src/main/proto/lidar_tracker.proto @@ -27,5 +27,5 @@ service PersonTracking{ rpc stop_tracking(Empty) returns (Empty) {} - rpc get_scan_data(Empty) returns (PointScan) {} + rpc start_tracking(Int32Value) returns (Empty) {} } \ No newline at end of file