Skip to content

Commit

Permalink
fixed issue with the magnetometer calibration ui.
Browse files Browse the repository at this point in the history
  • Loading branch information
m4gr3d committed Oct 21, 2014
1 parent 720340a commit 744992f
Show file tree
Hide file tree
Showing 7 changed files with 212 additions and 67 deletions.
28 changes: 25 additions & 3 deletions Android/res/layout-land/fragment_setup_mag_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_weight="2">
android:layout_weight="1.75">

<TextView
android:id="@+id/textViewDesc"
Expand All @@ -53,7 +53,7 @@
style="@style/modeControl"
android:text="@string/button_setup_calibrate"/>

<LinearLayout
<RelativeLayout
android:id="@+id/in_progress_calibration_container"
android:orientation="vertical"
android:layout_width="match_parent"
Expand All @@ -67,17 +67,39 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.Holo.ProgressBar.Horizontal"
android:layout_toLeftOf="@+id/calibration_progress"
android:layout_toStartOf="@+id/calibration_progress"
android:layout_above="@+id/buttonCancel"
android:layout_marginBottom="15dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:padding="20dp"/>

<TextView
android:id="@+id/calibration_progress"
android:layout_width="wrap_content"
android:minWidth="50dp"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignTop="@+id/calibration_progress_bar"
android:layout_alignBottom="@+id/calibration_progress_bar"
/>

<Button
android:id="@+id/buttonCancel"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@drawable/button_green_drawable"
style="@style/modeControl"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:text="@string/button_setup_cancel"/>

</LinearLayout>
</RelativeLayout>

</LinearLayout>
</LinearLayout>
28 changes: 25 additions & 3 deletions Android/res/layout/fragment_setup_mag_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:layout_weight="2">
android:layout_weight="1.5">

<Button
android:id="@+id/buttonStep"
Expand All @@ -53,7 +53,7 @@
android:layout_gravity="center"
android:text="@string/button_setup_calibrate"/>

<LinearLayout
<RelativeLayout
android:id="@+id/in_progress_calibration_container"
android:orientation="vertical"
android:layout_width="match_parent"
Expand All @@ -67,17 +67,39 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@android:style/Widget.Holo.ProgressBar.Horizontal"
android:layout_toLeftOf="@+id/calibration_progress"
android:layout_toStartOf="@+id/calibration_progress"
android:layout_above="@+id/buttonCancel"
android:layout_marginBottom="15dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:padding="20dp"/>

<TextView
android:id="@+id/calibration_progress"
android:layout_width="wrap_content"
android:minWidth="50dp"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignTop="@+id/calibration_progress_bar"
android:layout_alignBottom="@+id/calibration_progress_bar"
/>

<Button
android:id="@+id/buttonCancel"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:background="@drawable/button_green_drawable"
style="@style/modeControl"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="20dp"
android:text="@string/button_setup_cancel"/>

</LinearLayout>
</RelativeLayout>

</FrameLayout>
</LinearLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import ellipsoidFit.FitPoints;
import ellipsoidFit.ThreeSpacePoint;

public class FragmentSetupMAG extends Fragment implements MagnetometerCalibration
.OnMagCalibrationListener {
.OnMagCalibrationListener, DroneInterfaces.OnDroneListener {

private static final int CALIBRATION_IDLE = 0;
private static final int CALIBRATION_IN_PROGRESS = 1;
Expand All @@ -38,6 +39,7 @@ public class FragmentSetupMAG extends Fragment implements MagnetometerCalibratio
private View inProgressCalibrationView;
private Button buttonStep;
private Button buttonCancel;
private TextView calibrationProgress;
private ProgressBar calibrationFitness;
private ScatterPlot plot1,plot2;

Expand All @@ -46,6 +48,8 @@ public class FragmentSetupMAG extends Fragment implements MagnetometerCalibratio
private Drone drone;
private MagnetometerCalibration calibration;

private List<? extends ThreeSpacePoint> startPoints;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
Expand All @@ -64,6 +68,8 @@ public void onViewCreated(View view, Bundle savedInstanceState){

inProgressCalibrationView = view.findViewById(R.id.in_progress_calibration_container);

calibrationProgress = (TextView) view.findViewById(R.id.calibration_progress);

buttonStep = (Button) view.findViewById(R.id.buttonStep);
buttonStep.setOnClickListener(new View.OnClickListener() {
@Override
Expand Down Expand Up @@ -111,15 +117,30 @@ public void postDelayed(Runnable thread, long timeout) {
});

if(savedInstanceState != null){
calibrationStatus = savedInstanceState.getInt(EXTRA_CALIBRATION_STATUS,
final int calibrationStatus = savedInstanceState.getInt(EXTRA_CALIBRATION_STATUS,
CALIBRATION_IDLE);
setCalibrationStatus(calibrationStatus);

if(calibrationStatus == CALIBRATION_IN_PROGRESS){
final ArrayList<ParcelableThreeSpacePoint> loadedPoints = savedInstanceState
.getParcelableArrayList(EXTRA_CALIBRATION_POINTS);
if(loadedPoints != null && !loadedPoints.isEmpty()){
calibration.setPoints(loadedPoints);
startPoints = loadedPoints;

for(ParcelableThreeSpacePoint point: loadedPoints){
final double x = point.x;
final double y = point.y;
final double z = point.z;

plot1.addData((float) x);
plot1.addData((float) z);

plot2.addData((float) y);
plot2.addData((float) z);
}

plot1.invalidate();
plot2.invalidate();
}
}
}
Expand Down Expand Up @@ -149,6 +170,15 @@ public void onSaveInstanceState(Bundle outState){
@Override
public void onStart(){
super.onStart();
if(drone.getMavClient().isConnected()){
buttonStep.setEnabled(true);
}
else{
cancelCalibration();
buttonStep.setEnabled(false);
}

drone.addDroneListener(this);
if(calibrationStatus == CALIBRATION_IN_PROGRESS){
startCalibration();
}
Expand All @@ -157,6 +187,7 @@ public void onStart(){
@Override
public void onStop(){
super.onStop();
drone.removeDroneListener(this);
pauseCalibration();
}

Expand Down Expand Up @@ -195,6 +226,7 @@ private void setCalibrationStatus(int status) {
// Show the 'in progress view'
inProgressCalibrationView.setVisibility(View.VISIBLE);
calibrationFitness.setIndeterminate(true);
calibrationProgress.setText("0 / 100");
break;

case CALIBRATION_COMPLETED:
Expand Down Expand Up @@ -223,7 +255,9 @@ private void setCalibrationStatus(int status) {

public void startCalibration() {
if(calibration != null){
calibration.start();
calibration.start(startPoints);
startPoints = null;

setCalibrationStatus(CALIBRATION_IN_PROGRESS);
}
}
Expand All @@ -235,9 +269,18 @@ public void newEstimation(FitPoints ellipsoidFit, List<ThreeSpacePoint> points){
return;
}

calibrationFitness.setIndeterminate(false);
calibrationFitness.setMax(100);
calibrationFitness.setProgress((int)(ellipsoidFit.getFitness() * 100));
if(pointsCount < MagnetometerCalibration.MIN_POINTS_COUNT){
calibrationFitness.setIndeterminate(true);
calibrationProgress.setText("0 / 100");
}
else {
final int progress = (int) (ellipsoidFit.getFitness() * 100);
calibrationFitness.setIndeterminate(false);
calibrationFitness.setMax(100);
calibrationFitness.setProgress(progress);

calibrationProgress.setText(progress + " / 100");
}

//Grab the last point
final ThreeSpacePoint point = points.get(pointsCount - 1);
Expand Down Expand Up @@ -279,4 +322,18 @@ public void finished(FitPoints fit) {
public static CharSequence getTitle(Context context) {
return context.getText(R.string.setup_mag_title);
}

@Override
public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) {
switch(event){
case CONNECTED:
buttonStep.setEnabled(true);
break;

case DISCONNECTED:
cancelCalibration();
buttonStep.setEnabled(false);
break;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class ScatterPlot extends View {
private static final float SCALE_FACTOR = 1 / 1000f;
Expand Down
38 changes: 28 additions & 10 deletions Core/src/org/droidplanner/core/drone/DroneEvents.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,40 @@
package org.droidplanner.core.drone;

import java.util.ArrayList;
import java.util.List;

import org.droidplanner.core.drone.DroneInterfaces.DroneEventsType;
import org.droidplanner.core.drone.DroneInterfaces.OnDroneListener;
import org.droidplanner.core.model.Drone;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;

public class DroneEvents extends DroneVariable {

public DroneEvents(Drone myDrone) {
private final ConcurrentLinkedQueue<DroneEventsType> eventsQueue = new ConcurrentLinkedQueue<DroneEventsType>();

private final DroneInterfaces.Handler handler;

private final Runnable eventsDispatcher = new Runnable() {
@Override
public void run() {
do {
handler.removeCallbacks(this);
final DroneEventsType event = eventsQueue.poll();
if (event != null && !droneListeners.isEmpty()) {
for (OnDroneListener listener : droneListeners) {
listener.onDroneEvent(event, myDrone);
}
}
}while(!eventsQueue.isEmpty());
}
};

public DroneEvents(Drone myDrone, DroneInterfaces.Handler handler) {
super(myDrone);
this.handler = handler;
}

private List<OnDroneListener> droneListeners = new ArrayList<OnDroneListener>();
private final ConcurrentLinkedQueue<OnDroneListener> droneListeners = new ConcurrentLinkedQueue<OnDroneListener>();

public void addDroneListener(OnDroneListener listener) {
if (listener != null & !droneListeners.contains(listener))
Expand All @@ -26,10 +47,7 @@ public void removeDroneListener(OnDroneListener listener) {
}

public void notifyDroneEvent(DroneEventsType event) {
if (droneListeners.size() > 0) {
for (OnDroneListener listener : droneListeners) {
listener.onDroneEvent(event, myDrone);
}
}
eventsQueue.offer(event);
handler.post(eventsDispatcher);
}
}
Loading

0 comments on commit 744992f

Please sign in to comment.