diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/BatteryInfoActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/BatteryInfoActivity.java
index 3a99286f60..3f5eef7cd2 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/BatteryInfoActivity.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/BatteryInfoActivity.java
@@ -29,8 +29,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.BatteryConfig;
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
-public class
-BatteryInfoActivity extends AbstractGBActivity {
+public class BatteryInfoActivity extends AbstractGBActivity {
private static final Logger LOG = LoggerFactory.getLogger(BatteryInfoActivity.class);
GBDevice gbDevice;
private int timeFrom;
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/ControlActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/ControlActivity.java
index 6676aab57d..f881b877bb 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/ControlActivity.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/ControlActivity.java
@@ -6,8 +6,10 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.CountDownTimer;
+import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
+import android.widget.ImageButton;
import android.widget.TextView;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
@@ -24,17 +26,21 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView.
private static final Logger LOG = LoggerFactory.getLogger(ControlActivity.class);
LocalBroadcastManager localBroadcastManager;
CountDownTimer periodicDataSenderRunner;
+ boolean periodicDataSenderRunnerIsRunning = false;
private GBDevice device;
TextView batteryPercentage;
boolean lights = false;
boolean blinking = false;
boolean turbo = false;
+ int stepCounter = 0;
SuperCarsConstants.Direction direction = SuperCarsConstants.Direction.CENTER;
SuperCarsConstants.Movement movement = SuperCarsConstants.Movement.IDLE;
SuperCarsConstants.Speed speed = SuperCarsConstants.Speed.NORMAL;
SuperCarsConstants.Light light = SuperCarsConstants.Light.OFF;
+ SuperCarsConstants.Tricks tricks = SuperCarsConstants.Tricks.OFF;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -97,9 +103,46 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView.
}
});
+ ImageButton trick1 = findViewById(R.id.trick1);
+ ImageButton trick2 = findViewById(R.id.trick2);
+ ImageButton trick3 = findViewById(R.id.trick3);
+ ImageButton trick4 = findViewById(R.id.trick4);
+
+ trick1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ tricks = SuperCarsConstants.Tricks.CIRCLE_LEFT;
+ stepCounter = 0;
+ }
+ });
+
+ trick2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ tricks = SuperCarsConstants.Tricks.CIRCLE_RIGHT;
+ stepCounter = 0;
+ }
+ });
+ trick3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ tricks = SuperCarsConstants.Tricks.U_TURN_LEFT;
+ stepCounter = 0;
+ }
+ });
+ trick4.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ tricks = SuperCarsConstants.Tricks.U_TURN_RIGHT;
+ stepCounter = 0;
+ }
+ });
+
//when this activity is open, data is sent continuously every 100ms
- periodicDataSender();
- periodicDataSenderRunner.start();
+
+ if (!periodicDataSenderRunnerIsRunning) {
+ periodicDataSender();
+ }
}
private void setLights() {
@@ -109,6 +152,12 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView.
} else {
light = SuperCarsConstants.Light.OFF;
}
+ } else if (blinking) {
+ if (light.equals(SuperCarsConstants.Light.ON)) {
+ light = SuperCarsConstants.Light.OFF;
+ } else {
+ light = SuperCarsConstants.Light.ON;
+ }
}
}
@@ -125,12 +174,20 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView.
periodicDataSenderRunner = new CountDownTimer(Long.MAX_VALUE, 100) {
public void onTick(long millisUntilFinished) {
+ periodicDataSenderRunnerIsRunning = true;
+ setLights();
- if (blinking) {
- if (light.equals(SuperCarsConstants.Light.ON)) {
- light = SuperCarsConstants.Light.OFF;
+ if (tricks != SuperCarsConstants.Tricks.OFF) {
+ Enum[][] trick_steps = SuperCarsConstants.get_trick(tricks);
+ int steps = trick_steps.length;
+ if (stepCounter < steps) {
+ Enum[] step = trick_steps[stepCounter];
+ movement = (SuperCarsConstants.Movement) step[0];
+ direction = (SuperCarsConstants.Direction) step[1];
+ stepCounter++;
} else {
- light = SuperCarsConstants.Light.ON;
+ tricks = SuperCarsConstants.Tricks.OFF;
+ stepCounter = 0;
}
}
@@ -155,6 +212,9 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView.
@Override
public void onJoystickMoved(float xPercent, float yPercent, int id) {
+ tricks = SuperCarsConstants.Tricks.OFF;
+ stepCounter = 0;
+
if (yPercent < 0.2 && yPercent != 0) {
movement = SuperCarsConstants.Movement.UP;
} else if (yPercent > 0.2) {
@@ -182,19 +242,23 @@ public class ControlActivity extends AbstractGBActivity implements JoystickView.
protected void onDestroy() {
super.onDestroy();
periodicDataSenderRunner.cancel();
+ periodicDataSenderRunnerIsRunning = false;
LocalBroadcastManager.getInstance(this).unregisterReceiver(commandReceiver);
}
@Override
protected void onPostResume() {
super.onPostResume();
- periodicDataSenderRunner.start();
+ if (!periodicDataSenderRunnerIsRunning) {
+ periodicDataSenderRunner.start();
+ }
}
@Override
protected void onPause() {
super.onPause();
periodicDataSenderRunner.cancel();
+ periodicDataSenderRunnerIsRunning = false;
}
BroadcastReceiver commandReceiver = new BroadcastReceiver() {
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/SuperCarsConstants.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/SuperCarsConstants.java
index a15cffdced..c36de6e91d 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/SuperCarsConstants.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/supercars/SuperCarsConstants.java
@@ -32,5 +32,54 @@ public class SuperCarsConstants {
public enum Direction {
LEFT, RIGHT, CENTER
}
+
+ public enum Tricks {
+ OFF, CIRCLE_RIGHT, CIRCLE_LEFT, U_TURN_LEFT, U_TURN_RIGHT
+ }
+
+ static Enum[] fwd_r = {Movement.UP, Direction.RIGHT};
+ static Enum[] fwd_l = {Movement.UP, Direction.LEFT};
+ static Enum[] stop = {Movement.IDLE, Direction.CENTER};
+
+ public static final Enum[][] tricks_circle_right = {
+ fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r,
+ fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r,
+ fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r,
+ stop
+ };
+
+ public static final Enum[][] tricks_circle_left = {
+ fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l,
+ fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l,
+ fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l,
+ stop
+ };
+
+ public static final Enum[][] tricks_u_turn_right = {
+ fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r,
+ fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r, fwd_r,
+ stop
+ };
+
+ public static final Enum[][] tricks_u_turn_left = {
+ fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l,
+ fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l, fwd_l,
+ stop
+ };
+
+
+ public static final Enum[][] get_trick(Tricks trick) {
+ switch (trick) {
+ case CIRCLE_RIGHT:
+ return tricks_circle_right;
+ case CIRCLE_LEFT:
+ return tricks_circle_left;
+ case U_TURN_LEFT:
+ return tricks_u_turn_left;
+ case U_TURN_RIGHT:
+ return tricks_u_turn_right;
+ }
+ return tricks_circle_right;
+ }
}
diff --git a/app/src/main/res/drawable/ic_arrow_circle_left.xml b/app/src/main/res/drawable/ic_arrow_circle_left.xml
new file mode 100644
index 0000000000..50e8c1ba90
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_circle_left.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_arrow_circle_right.xml b/app/src/main/res/drawable/ic_arrow_circle_right.xml
new file mode 100644
index 0000000000..091889a701
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_circle_right.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_u_turn_left.xml b/app/src/main/res/drawable/ic_u_turn_left.xml
new file mode 100644
index 0000000000..abec9ce98e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_u_turn_left.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_u_turn_right.xml b/app/src/main/res/drawable/ic_u_turn_right.xml
new file mode 100644
index 0000000000..a6ee4725cb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_u_turn_right.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_supercars_control.xml b/app/src/main/res/layout/activity_supercars_control.xml
index a948fd0ed1..3b6c066afa 100644
--- a/app/src/main/res/layout/activity_supercars_control.xml
+++ b/app/src/main/res/layout/activity_supercars_control.xml
@@ -1,5 +1,6 @@
@@ -60,6 +61,82 @@
tools:ignore="TouchTargetSizeCheck" />
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file