diff --git a/.idea/misc.xml b/.idea/misc.xml index 7bfef59..e4d201d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index ec8af2d..53a42f8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,8 @@ android { } } compileOptions { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + sourceCompatibility = 9.8 + targetCompatibility = 9.8 } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2d1be85..d2c9992 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ android:supportsRtl="true" android:theme="@style/AppTheme"> - + listeners; - - public SlamUpdater() { - init(); - } - - protected void init() { - listeners = new HashSet<>(); - } - - public void addMapChangedListener(MapChangedListener listener) { - listeners.add(listener); - } - - - protected void fireMapChanged(SlamScan scan) { - listeners.forEach(listener -> listener.mapChanged(scan.getMap(), scan.getLocation())); - } - - public abstract void stop(); - - public interface MapChangedListener { - void mapChanged(ByteString map, SlamLocation location); - } -} 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 13d33cd..2485239 100644 --- a/app/src/main/java/com/example/carcontroller/SLAM/SlamView.java +++ b/app/src/main/java/com/example/carcontroller/SLAM/SlamView.java @@ -16,21 +16,25 @@ import com.example.carcontroller.Empty; import com.example.carcontroller.SlamControlGrpc; import com.example.carcontroller.SlamDetails; import com.example.carcontroller.SlamLocation; +import com.example.carcontroller.SlamScan; +import com.example.carcontroller.Updaters.AbstractUpdater; +import com.example.carcontroller.Updaters.ZmqUpdater; import com.google.protobuf.ByteString; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import io.grpc.stub.StreamObserver; -public class SlamView extends SurfaceView implements SlamUpdater.MapChangedListener { +public class SlamView extends SurfaceView implements AbstractUpdater.MapChangedListener { - private SlamUpdater slam; + private static final String SLAM_TOPIC = "slam_map"; + + private AbstractUpdater slam; private Thread mapThread; private Context context; private SurfaceHolder surfaceHolder; private Paint paint; private SlamControlGrpc.SlamControlStub stub; - private ManagedChannel channel; private int mapSizePixels; private int mapSizeMeters; private String port; @@ -60,15 +64,14 @@ public class SlamView extends SurfaceView implements SlamUpdater.MapChangedListe String gRPCPort = prefs.getString("port", "50051"); mapSizePixels = Integer.parseInt(prefs.getString("MAPSIZEPIXELS", "540")); mapSizeMeters = Integer.parseInt(prefs.getString("MAPSIZEMETRES", "10")); - slam = new ZmqSlamUpdater(host, port); + slam = new ZmqUpdater<>(SlamScan.getDefaultInstance().getParserForType(), SLAM_TOPIC, host, port); slam.addMapChangedListener(this); surfaceHolder = getHolder(); paint = new Paint(); paint.setColor(Color.BLUE); mapThread = new Thread(slam); - channel = ManagedChannelBuilder.forAddress(host, Integer.parseInt(gRPCPort)).usePlaintext().build(); + ManagedChannel channel = ManagedChannelBuilder.forAddress(host, Integer.parseInt(gRPCPort)).usePlaintext().build(); stub = SlamControlGrpc.newStub(channel); - } /** @@ -106,12 +109,15 @@ public class SlamView extends SurfaceView implements SlamUpdater.MapChangedListe try { mapThread.join(); } catch (InterruptedException e) { - } } @Override - public void mapChanged(ByteString map, SlamLocation location) { + public void mapChanged(SlamScan scan) { + updateView(scan.getMap(), scan.getLocation()); + } + + private void updateView(ByteString map, SlamLocation location) { if (surfaceHolder.getSurface().isValid()) { Canvas canvas = surfaceHolder.lockCanvas(); canvas.save(); diff --git a/app/src/main/java/com/example/carcontroller/Updaters/AbstractUpdater.java b/app/src/main/java/com/example/carcontroller/Updaters/AbstractUpdater.java new file mode 100644 index 0000000..01fa249 --- /dev/null +++ b/app/src/main/java/com/example/carcontroller/Updaters/AbstractUpdater.java @@ -0,0 +1,51 @@ +package com.example.carcontroller.Updaters; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.MessageLite; +import com.google.protobuf.Parser; + +import java.util.HashSet; +import java.util.Set; + +/** + * Provides an abstract way to receive updates from a remote host (i.e. the rc car). + * Subclasses of this implement the approriate connection mechanisms to continuously receive + * new updates of messages. + * Specifically, protobuf serialisation support is provided + * + * @param The message type that will continuously be received + */ +public abstract class AbstractUpdater implements Runnable { + + private Set> listeners; + private Parser parser; + + public AbstractUpdater(Parser parser) { + this.parser = parser; + init(); + } + + protected void init() { + listeners = new HashSet<>(); + } + + public void addMapChangedListener(MapChangedListener listener) { + listeners.add(listener); + } + + + protected void fireMapChanged(T scan) { + listeners.forEach(listener -> listener.mapChanged(scan)); + } + + public abstract void stop(); + + public interface MapChangedListener { + void mapChanged(T points); + } + + protected T parseMessage(byte[] messageBytes) throws InvalidProtocolBufferException { + return parser.parseFrom(messageBytes); + } + +} diff --git a/app/src/main/java/com/example/carcontroller/SLAM/ZmqSlamUpdater.java b/app/src/main/java/com/example/carcontroller/Updaters/ZmqUpdater.java similarity index 63% rename from app/src/main/java/com/example/carcontroller/SLAM/ZmqSlamUpdater.java rename to app/src/main/java/com/example/carcontroller/Updaters/ZmqUpdater.java index 0b96001..6d8748f 100644 --- a/app/src/main/java/com/example/carcontroller/SLAM/ZmqSlamUpdater.java +++ b/app/src/main/java/com/example/carcontroller/Updaters/ZmqUpdater.java @@ -1,7 +1,8 @@ -package com.example.carcontroller.SLAM; +package com.example.carcontroller.Updaters; -import com.example.carcontroller.SlamScan; import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.MessageLite; +import com.google.protobuf.Parser; import org.zeromq.SocketType; import org.zeromq.ZContext; @@ -10,20 +11,21 @@ import org.zeromq.ZMQ; import java.util.Arrays; /** - * Connects to Pi and retrieves updates of the SLAM map, - * notifying listeners of changes to the map when they arrive. - * Uses 0MQ for the transport. + * Provides a way to easily deal with zeromq sub sockets that use protobuf + * + * @param */ -public class ZmqSlamUpdater extends SlamUpdater { +public class ZmqUpdater extends AbstractUpdater { private ZContext context; private String host; private String port; private boolean running = false; - private static final byte[] SLAM_SUBSCRIPTION = "slam_map".getBytes(); + private final byte[] SUBSCRIPTION; - public ZmqSlamUpdater(String host, String port) { - super(); + public ZmqUpdater(Parser parser, String topic, String host, String port) { + super(parser); + this.SUBSCRIPTION = topic.getBytes(); this.host = host; this.port = port; init(); @@ -42,12 +44,12 @@ public class ZmqSlamUpdater extends SlamUpdater { // Receive map from zmq and update appropriately. try (ZMQ.Socket socket = context.createSocket(SocketType.SUB)) { socket.connect("tcp://" + host + ":" + port); - socket.subscribe(SLAM_SUBSCRIPTION); + socket.subscribe(SUBSCRIPTION); while (running) { byte[] map = socket.recv(); // Don't want to do the event when we just receive the header. - if (!Arrays.equals(map, SLAM_SUBSCRIPTION)) { - fireMapChanged(SlamScan.parseFrom(map)); + if (!Arrays.equals(map, SUBSCRIPTION)) { + fireMapChanged(parseMessage(map)); } } } catch (InvalidProtocolBufferException e) { diff --git a/app/src/main/res/layout-land/activity_lidar_tracking_controller.xml b/app/src/main/res/layout-land/activity_lidar_tracking_controller.xml index 45dbf19..dedceec 100644 --- a/app/src/main/res/layout-land/activity_lidar_tracking_controller.xml +++ b/app/src/main/res/layout-land/activity_lidar_tracking_controller.xml @@ -4,9 +4,9 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".LidarTrackingController"> + tools:context=".LIDAR.LidarTrackingController"> - diff --git a/app/src/main/res/layout/activity_lidar_tracking_controller.xml b/app/src/main/res/layout/activity_lidar_tracking_controller.xml index de03381..eb8c624 100644 --- a/app/src/main/res/layout/activity_lidar_tracking_controller.xml +++ b/app/src/main/res/layout/activity_lidar_tracking_controller.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".LidarTrackingController"> + tools:context=".LIDAR.LidarTrackingController">