commit 89a7572fde72d4fbd0b5c082687096b79c36abab Author: Piv <18462828+Piv200@users.noreply.github.com> Date: Mon Feb 3 18:58:42 2020 +1030 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..603b140 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..681f41a --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,116 @@ + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+
+
\ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..d291b3d --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..37a7509 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..49285c3 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,58 @@ +apply plugin: 'com.android.application' +apply plugin: 'com.google.protobuf' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.2" + defaultConfig { + applicationId "com.example.carcontroller" + minSdkVersion 26 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +protobuf { + protoc { artifact = 'com.google.protobuf:protoc:3.10.0' } + plugins { + javalite { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" } + grpc { + artifact = 'io.grpc:protoc-gen-grpc-java:1.25.0' + } + } + generateProtoTasks { + all().each { task -> + task.plugins { + javalite {} + grpc { // Options added to --grpc_out + option 'lite' + } + } + } + } +} + +dependencies { + + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.google.android.material:material:1.0.0' + implementation 'androidx.preference:preference:1.1.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'io.grpc:grpc-okhttp:1.25.0' + implementation 'io.grpc:grpc-protobuf-lite:1.25.0' + implementation 'io.grpc:grpc-stub:1.25.0' + implementation 'javax.annotation:javax.annotation-api:1.2' + implementation 'org.zeromq:jeromq:0.5.2' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/example/carcontroller/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/carcontroller/ExampleInstrumentedTest.java new file mode 100644 index 0000000..39c6e5f --- /dev/null +++ b/app/src/androidTest/java/com/example/carcontroller/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.example.carcontroller; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + + assertEquals("com.example.carcontroller", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2d1be85 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/carcontroller/LidarTrackingController.java b/app/src/main/java/com/example/carcontroller/LidarTrackingController.java new file mode 100644 index 0000000..f50dce8 --- /dev/null +++ b/app/src/main/java/com/example/carcontroller/LidarTrackingController.java @@ -0,0 +1,36 @@ +package com.example.carcontroller; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; + +public class LidarTrackingController extends AppCompatActivity { + + private LidarView lidarMap; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_lidar_tracking_controller); + lidarMap = findViewById(R.id.lidarMap); + } + + + @Override + protected void onResume() { + super.onResume(); + if (lidarMap != null) { + lidarMap.resume(); + } + } + + + @Override + protected void onPause() { + super.onPause(); + if (lidarMap != null) { + lidarMap.pause(); + } + } + +} diff --git a/app/src/main/java/com/example/carcontroller/LidarView.java b/app/src/main/java/com/example/carcontroller/LidarView.java new file mode 100644 index 0000000..bc9889e --- /dev/null +++ b/app/src/main/java/com/example/carcontroller/LidarView.java @@ -0,0 +1,106 @@ +package com.example.carcontroller; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.SurfaceHolder; +import android.view.SurfaceView; + +public class LidarView extends SurfaceView implements Runnable { + + private boolean running; + private Thread lidarThread; + private SurfaceHolder holder; + PersonTrackingGrpc.PersonTrackingBlockingStub stub; + + private int mBitmapX, mBitmapY, mViewWidth, mViewHeight; + private Bitmap mBitmap; + + public LidarView(Context context) { + super(context); + } + + public LidarView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public LidarView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + float x = event.getX(); + float y = event.getY(); + + // Get the group that was selected and select on the grpc controller. + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + break; + } + 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; + try { + lidarThread.join(); + } catch (InterruptedException e) { + + } + + } + + public void resume() { + lidarThread = new Thread(this); + lidarThread.start(); + running = true; + } + + private static class Point { + private double x; + private double y; + + private Point(double x, double y) { + this.x = x; + this.y = y; + } + + static Point fromXY(double x, double y) { + return new Point(x, y); + } + + static Point fromHist(double distance, double angle) { + return fromHist(distance, angle, new Point(0, 0)); + } + + static Point fromHist(double distance, double angle, Point offset) { + return new Point(distance * Math.sin(angle) + offset.x, distance * Math.cos(angle) + offset.y); + } + + } +} diff --git a/app/src/main/java/com/example/carcontroller/MainActivity.java b/app/src/main/java/com/example/carcontroller/MainActivity.java new file mode 100644 index 0000000..e81c079 --- /dev/null +++ b/app/src/main/java/com/example/carcontroller/MainActivity.java @@ -0,0 +1,69 @@ +package com.example.carcontroller; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import android.content.Intent; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.SeekBar; + +import com.example.carcontroller.SLAM.SlamController; + +import java.util.concurrent.CountDownLatch; + +import io.grpc.stub.StreamObserver; + +public class MainActivity extends AppCompatActivity { + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + + if (id == R.id.action_settings) { + Intent intent = new Intent(this, SettingsActivity.class); + startActivity(intent); + + return true; + } + + return super.onOptionsItemSelected(item); + } + + + public void loadSimpleController(View view) { + Intent intent = new Intent(getApplicationContext(), SimpleController.class); + startActivity(intent); + } + + public void loadLidarController(View view) { + Intent intent = new Intent(getApplicationContext(), LidarTrackingController.class); + startActivity(intent); + } + + public void loadCameraController(View view) { + } + + public void loadSlamController(View view) { + Intent intent = new Intent(getApplicationContext(), SlamController.class); + startActivity(intent); + } +} diff --git a/app/src/main/java/com/example/carcontroller/PiLoader.java b/app/src/main/java/com/example/carcontroller/PiLoader.java new file mode 100644 index 0000000..69f4823 --- /dev/null +++ b/app/src/main/java/com/example/carcontroller/PiLoader.java @@ -0,0 +1,71 @@ +package com.example.carcontroller; + + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; + +public class PiLoader implements Runnable { + + Integer steeringValue = 50; + Integer throttleValue = 50; + + private ManagedChannel mChannel; + private CarControlGrpc.CarControlBlockingStub stub; + private AtomicBoolean stop = new AtomicBoolean(false); + Thread piUpdaterThread; + + public PiLoader(String host, Integer port) { + mChannel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build(); + + // Create an async stub. + stub = CarControlGrpc.newBlockingStub(mChannel); + } + + private void createAndStart() { + piUpdaterThread = new Thread(this); + piUpdaterThread.start(); + } + + public void updateSteering(int value) { + steeringValue = value; + } + + public void updateThrottle(int value) { + throttleValue = value; + } + + public void stop() { + stop.lazySet(true); + if (!stop.get()) { + piUpdaterThread.interrupt(); + } + } + + public void start() { + stop.lazySet(false); + createAndStart(); + } + + @Override + public void run() { + while (!stop.get() && !Thread.interrupted()) { + try { + SteeringResponse steeringResponse = stub.setSteering(SteeringRequest.newBuilder().setSteering((float) steeringValue / 50f - 1).build()); + ThrottleResponse throttleResponse = stub.setThrottle(ThrottleRequest.newBuilder().setThrottle((float) throttleValue / 50f - 1).build()); + } catch (Exception e) { + System.out.println("Error"); + stop(); + } + + try { + // Use the same update rate as a typical screen refresh rate. + TimeUnit.MILLISECONDS.sleep(15); + } catch (InterruptedException e) { + // TODO: Handle when interrupted and sleeping. + } + } + } +} diff --git a/app/src/main/java/com/example/carcontroller/SLAM/SlamController.java b/app/src/main/java/com/example/carcontroller/SLAM/SlamController.java new file mode 100644 index 0000000..be927a6 --- /dev/null +++ b/app/src/main/java/com/example/carcontroller/SLAM/SlamController.java @@ -0,0 +1,90 @@ +package com.example.carcontroller.SLAM; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.preference.PreferenceManager; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.widget.SeekBar; + +import com.example.carcontroller.PiLoader; +import com.example.carcontroller.R; + +public class SlamController extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { + + + SeekBar steeringSlider; + SeekBar throttleSlider; + private static PiLoader grpcController; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_slam_controller); + + steeringSlider = findViewById(R.id.steeringBar); + if (steeringSlider != null) { + steeringSlider.setOnSeekBarChangeListener(this); + } + throttleSlider = findViewById(R.id.throttleBar); + if (throttleSlider != null) { + throttleSlider.setOnSeekBarChangeListener(this); + } + } + + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + // Call the gRPC method to change the throttle. + switch (seekBar.getId()) { + case R.id.steeringBar: + if (grpcController != null) { + grpcController.updateSteering(i); + } + break; + case R.id.throttleBar: + if (grpcController != null) { + grpcController.updateThrottle(i); + } + break; + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + // Reset back to the middle, as this is how the controller will normally work. + + // Check if this will actually still call the onProgressChanged listener method. + // Otherwise update the steering/throttle here as well. + steeringSlider.setProgress(50); + throttleSlider.setProgress(50); + } + + @Override + protected void onResume() { + super.onResume(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + + if (grpcController == null) { + grpcController = new PiLoader(prefs.getString("host", "10.0.0.53"), Integer.parseInt(prefs.getString("port", "50051"))); + } + // Should call the equivalent of the load method either here or in the loader. + grpcController.start(); + } + + @Override + protected void onPause() { + super.onPause(); + grpcController.stop(); + } + + @Override + protected void onStop() { + super.onStop(); + grpcController.stop(); + } +} diff --git a/app/src/main/java/com/example/carcontroller/SLAM/SlamView.java b/app/src/main/java/com/example/carcontroller/SLAM/SlamView.java new file mode 100644 index 0000000..e217ca0 --- /dev/null +++ b/app/src/main/java/com/example/carcontroller/SLAM/SlamView.java @@ -0,0 +1,60 @@ +package com.example.carcontroller.SLAM; + +import android.content.Context; +import android.content.SharedPreferences; +import android.util.AttributeSet; +import android.view.SurfaceView; + +import androidx.preference.PreferenceManager; + +import org.zeromq.SocketType; +import org.zeromq.ZContext; +import org.zeromq.ZMQ; + +public class SlamView extends SurfaceView implements Runnable { + + ZContext context; + String host; + String port; + Thread mapThread; + + public SlamView(Context context) { + super(context); + init(); + } + + public SlamView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public SlamView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + context = new ZContext(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); + host = prefs.getString("host", "10.0.0.53"); + port = prefs.getString("port", "50051"); + } + + @Override + public void run() { + // Receive map from zmq and update appropriately. + try (ZMQ.Socket socket = context.createSocket(SocketType.SUB)) { + socket.connect("tcp://" + host + ":" + port); + while (!Thread.currentThread().isInterrupted()) { + byte[] map = socket.recv(); + + } + } + + } + + public void stop(){ + // Use grpc to tell the loader to stop. Interrupt the loader thread as well. + mapThread.interrupt(); + } +} diff --git a/app/src/main/java/com/example/carcontroller/SettingsActivity.java b/app/src/main/java/com/example/carcontroller/SettingsActivity.java new file mode 100644 index 0000000..adaa362 --- /dev/null +++ b/app/src/main/java/com/example/carcontroller/SettingsActivity.java @@ -0,0 +1,34 @@ +package com.example.carcontroller; + +import android.os.Bundle; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.preference.PreferenceFragmentCompat; + +public class SettingsActivity extends AppCompatActivity { + + public final static String HOST = "host"; + public final static String PORT = "port"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.settings_activity); + getSupportFragmentManager() + .beginTransaction() + .replace(R.id.settings, new SettingsFragment()) + .commit(); + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + public static class SettingsFragment extends PreferenceFragmentCompat { + @Override + public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + setPreferencesFromResource(R.xml.root_preferences, rootKey); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/carcontroller/SimpleController.java b/app/src/main/java/com/example/carcontroller/SimpleController.java new file mode 100644 index 0000000..f440518 --- /dev/null +++ b/app/src/main/java/com/example/carcontroller/SimpleController.java @@ -0,0 +1,90 @@ +package com.example.carcontroller; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.preference.PreferenceManager; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.widget.SeekBar; + +import java.util.concurrent.CountDownLatch; + +import io.grpc.stub.StreamObserver; + +public class SimpleController extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener { + + SeekBar steeringSlider; + SeekBar throttleSlider; + private static PiLoader grpcController; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_simple_controller); + + steeringSlider = findViewById(R.id.steeringBar); + if (steeringSlider != null) { + steeringSlider.setOnSeekBarChangeListener(this); + } + throttleSlider = findViewById(R.id.throttleBar); + if (throttleSlider != null) { + throttleSlider.setOnSeekBarChangeListener(this); + } + } + + @Override + protected void onResume() { + super.onResume(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + + if (grpcController == null) { + grpcController = new PiLoader(prefs.getString("host", "10.0.0.53"), Integer.parseInt(prefs.getString("port", "50051"))); + } + // Should call the equivalent of the load method either here or in the loader. + grpcController.start(); + } + + @Override + protected void onPause() { + super.onPause(); + grpcController.stop(); + } + + @Override + protected void onStop() { + super.onStop(); + grpcController.stop(); + } + + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + // Call the gRPC method to change the throttle. + switch (seekBar.getId()) { + case R.id.steeringBar: + if (grpcController != null) { + grpcController.updateSteering(i); + } + break; + case R.id.throttleBar: + if (grpcController != null) { + grpcController.updateThrottle(i); + } + break; + } + + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + // Reset back to the middle, as this is how the controller will normally work. + + // Check if this will actually still call the onProgressChanged listener method. + // Otherwise update the steering/throttle here as well. + steeringSlider.setProgress(50); + throttleSlider.setProgress(50); + } +} diff --git a/app/src/main/proto/SlamController.proto b/app/src/main/proto/SlamController.proto new file mode 100644 index 0000000..4de05d5 --- /dev/null +++ b/app/src/main/proto/SlamController.proto @@ -0,0 +1,31 @@ +syntax = "proto3"; + +message SlamDetails { + int32 map_size_pixels = 1; + int32 map_size_meters = 2; +} + +message SlamRow{ + repeated int32 points = 1; +} + +message SlamLocation{ + int32 x = 1; + int32 y = 2; + int32 theta = 3; +} + +message SlamScan{ + bytes map = 1; + SlamLocation location = 2; +} + +message Empty{ + +} + +service SlamControl { + rpc start_map_streaming(SlamDetails) returns (Empty) {} + + rpc stop_streaming(Empty) returns (Empty) {} +} \ No newline at end of file diff --git a/app/src/main/proto/lidar_tracker.proto b/app/src/main/proto/lidar_tracker.proto new file mode 100644 index 0000000..0567b3e --- /dev/null +++ b/app/src/main/proto/lidar_tracker.proto @@ -0,0 +1,34 @@ +syntax = "proto3"; + +package persontracking; + +option java_multiple_files = true; +option java_package = "com.example.carcontroller"; +option java_outer_classname = "PersonTrackingProto"; + + +message Int32Value{ + int32 value = 1; +} + +message Empty{ + +} + +message Point{ + double angle = 1; + int32 distance = 2; + int32 group_number = 3; +} + +message PointScan{ + repeated Point points = 1; +} + +service PersonTracking{ + rpc set_tracking_group(Int32Value) returns (Empty) {} + + rpc stop_tracking(Empty) returns (Empty) {} + + rpc get_scan_data(Empty) returns (PointScan) {} +} \ No newline at end of file diff --git a/app/src/main/proto/motorService.proto b/app/src/main/proto/motorService.proto new file mode 100644 index 0000000..121d6f5 --- /dev/null +++ b/app/src/main/proto/motorService.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + + +package MotorControl; + +option java_multiple_files = true; +option java_package = "com.example.carcontroller"; +option java_outer_classname = "MotorServiceProto"; + +message ThrottleRequest{ + float throttle = 1; +} + +message ThrottleResponse{ + bool throttleSet = 1; +} + +message SteeringRequest{ + float steering = 1; +} + +message SteeringResponse{ + bool steeringSet = 1; +} + +service CarControl{ + rpc SetThrottle(ThrottleRequest) returns (ThrottleResponse){} + rpc SetSteering(SteeringRequest) returns (SteeringResponse){} +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_car.xml b/app/src/main/res/drawable/ic_car.xml new file mode 100644 index 0000000..eeb810a --- /dev/null +++ b/app/src/main/res/drawable/ic_car.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..0d025f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 0000000..45dbf19 --- /dev/null +++ b/app/src/main/res/layout-land/activity_lidar_tracking_controller.xml @@ -0,0 +1,27 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_simple_controller.xml b/app/src/main/res/layout-land/activity_simple_controller.xml new file mode 100644 index 0000000..7858f7e --- /dev/null +++ b/app/src/main/res/layout-land/activity_simple_controller.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_slam_controller.xml b/app/src/main/res/layout-land/activity_slam_controller.xml new file mode 100644 index 0000000..b84f479 --- /dev/null +++ b/app/src/main/res/layout-land/activity_slam_controller.xml @@ -0,0 +1,31 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_lidar_tracking_controller.xml b/app/src/main/res/layout/activity_lidar_tracking_controller.xml new file mode 100644 index 0000000..de03381 --- /dev/null +++ b/app/src/main/res/layout/activity_lidar_tracking_controller.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..9c96440 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_simple_controller.xml b/app/src/main/res/layout/activity_simple_controller.xml new file mode 100644 index 0000000..bf6196e --- /dev/null +++ b/app/src/main/res/layout/activity_simple_controller.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_slam_controller.xml b/app/src/main/res/layout/activity_slam_controller.xml new file mode 100644 index 0000000..62b00b2 --- /dev/null +++ b/app/src/main/res/layout/activity_slam_controller.xml @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000..3855891 --- /dev/null +++ b/app/src/main/res/layout/content_main.xml @@ -0,0 +1,36 @@ + + + +