Added SportPreviewActivity and SportPreviewCanvas
This commit is contained in:
@@ -12,9 +12,6 @@ public class SportPreviewActivity extends RobotActivity implements RobotLifecycl
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRobotFocusLost() {
|
public void onRobotFocusLost() {
|
||||||
|
|
||||||
|
@@ -4,19 +4,41 @@ import android.content.Context;
|
|||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
|
import com.example.fitbot.util.processing.GesturePath;
|
||||||
|
import com.example.fitbot.util.processing.MotionProcessor;
|
||||||
|
|
||||||
public class SportPreviewCanvas extends View {
|
public class SportPreviewCanvas extends View {
|
||||||
|
|
||||||
|
private GesturePath path;
|
||||||
|
private double pathTime = 0.0D; // The timestamp at which the path is currently at.
|
||||||
|
private MotionProcessor motionProcessor;
|
||||||
|
|
||||||
private void calculatePath
|
/**
|
||||||
|
* Method that recalculates the path that will be drawn on the
|
||||||
|
* screen.
|
||||||
|
*/
|
||||||
|
private void calculateDrawingPath() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public SportPreviewCanvas(Context context, GesturePath path) {
|
public SportPreviewCanvas(Context context, GesturePath path) {
|
||||||
super(context);
|
super(context);
|
||||||
|
this.path = path;
|
||||||
|
this.motionProcessor = new MotionProcessor();
|
||||||
|
this.motionProcessor.startListening();
|
||||||
|
|
||||||
|
// Add the event handler
|
||||||
|
this.motionProcessor.setMotionDataEventHandler((processed, preprocessed, sampleIndex, sampleRate) -> {
|
||||||
|
calculateDrawingPath();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDraw(Canvas canvas) {
|
public void onDraw(Canvas canvas) {
|
||||||
// Draw the sport preview canvas
|
// Draw the sport preview canvas
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -9,7 +9,6 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class MotionProcessor {
|
public class MotionProcessor {
|
||||||
@@ -20,7 +19,7 @@ public class MotionProcessor {
|
|||||||
private final List<Vector3> relativePath = new ArrayList<>(); // Relative path of the motion data
|
private final List<Vector3> relativePath = new ArrayList<>(); // Relative path of the motion data
|
||||||
private Vector3 ZERO = new Vector3(0, 0, 0);
|
private Vector3 ZERO = new Vector3(0, 0, 0);
|
||||||
private double sampleRate = 1.0D; // samples/second
|
private double sampleRate = 1.0D; // samples/second
|
||||||
private Consumer<Vector3> motionDataConsumer = (data) -> {};
|
private DataConsumer motionDataConsumer = (p1, p2, p3, p4) -> {};
|
||||||
private GesturePath path;
|
private GesturePath path;
|
||||||
private WebSocket socket;
|
private WebSocket socket;
|
||||||
|
|
||||||
@@ -108,7 +107,7 @@ public class MotionProcessor {
|
|||||||
Vector3 previous = this.relativePath.isEmpty() ? ZERO : this.relativePath.get(this.relativePath.size() - 1);
|
Vector3 previous = this.relativePath.isEmpty() ? ZERO : this.relativePath.get(this.relativePath.size() - 1);
|
||||||
Vector3 relativeVector = getRelativeVector(data).add(previous);
|
Vector3 relativeVector = getRelativeVector(data).add(previous);
|
||||||
this.relativePath.add(relativeVector);
|
this.relativePath.add(relativeVector);
|
||||||
motionDataConsumer.accept(relativeVector);
|
motionDataConsumer.accept(relativeVector, data, this.relativePath.size(), this.sampleRate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -125,7 +124,7 @@ public class MotionProcessor {
|
|||||||
* Function for setting the motion data receiver.
|
* Function for setting the motion data receiver.
|
||||||
* @param consumer The consumer to set.
|
* @param consumer The consumer to set.
|
||||||
*/
|
*/
|
||||||
public void setMotionDataEventHandler(Consumer<Vector3> consumer) {
|
public void setMotionDataEventHandler(DataConsumer consumer) {
|
||||||
if ( consumer != null)
|
if ( consumer != null)
|
||||||
this.motionDataConsumer = consumer;
|
this.motionDataConsumer = consumer;
|
||||||
}
|
}
|
||||||
@@ -241,6 +240,20 @@ public class MotionProcessor {
|
|||||||
Log.i("MotionProcessor", "Path length: " + relativePath.size());
|
Log.i("MotionProcessor", "Path length: " + relativePath.size());
|
||||||
Log.i("MotionProcessor", "Sample rate: " + sampleRate);
|
Log.i("MotionProcessor", "Sample rate: " + sampleRate);
|
||||||
Log.i("MotionProcessor", "Calibration point: " + ZERO.toString());
|
Log.i("MotionProcessor", "Calibration point: " + ZERO.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface that accepts motion data and the transformed vector.
|
||||||
|
*/
|
||||||
|
public interface DataConsumer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function for accepting motion data and the transformed vector.
|
||||||
|
* @param transformedVector The transformed vector.
|
||||||
|
* @param motionData The input motion data.
|
||||||
|
* @param sampleIndex The index of the current sample
|
||||||
|
* @param sampleRate The sample rate.
|
||||||
|
*/
|
||||||
|
void accept(Vector3 transformedVector, MotionData motionData, int sampleIndex, double sampleRate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user