Skip to content

Commit ec30812

Browse files
Kunal Raimariobehling
authored andcommitted
servo controls guide added (#1805)
1 parent 70de53c commit ec30812

File tree

4 files changed

+324
-113
lines changed

4 files changed

+324
-113
lines changed

app/src/main/java/io/pslab/activity/RoboticArmActivity.java

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,31 @@
22

33
import android.content.Context;
44
import android.content.Intent;
5+
import android.content.SharedPreferences;
56
import android.graphics.Point;
67
import android.location.Location;
78
import android.location.LocationManager;
89
import android.os.Build;
910
import android.os.CountDownTimer;
11+
import android.os.Handler;
12+
import android.support.annotation.NonNull;
13+
import android.support.design.widget.BottomSheetBehavior;
1014
import android.support.design.widget.Snackbar;
1115
import android.support.v7.app.AppCompatActivity;
1216
import android.os.Bundle;
1317
import android.view.Display;
1418
import android.view.DragEvent;
19+
import android.view.GestureDetector;
1520
import android.view.KeyEvent;
1621
import android.view.LayoutInflater;
22+
import android.view.MotionEvent;
1723
import android.view.View;
1824
import android.view.WindowManager;
1925
import android.view.inputmethod.EditorInfo;
2026
import android.widget.Button;
2127
import android.widget.EditText;
2228
import android.widget.HorizontalScrollView;
29+
import android.widget.ImageView;
2330
import android.widget.LinearLayout;
2431
import android.widget.RelativeLayout;
2532
import android.widget.TextView;
@@ -30,6 +37,8 @@
3037
import java.util.ArrayList;
3138
import java.util.Date;
3239

40+
import butterknife.BindView;
41+
import butterknife.ButterKnife;
3342
import io.pslab.R;
3443
import io.pslab.communication.ScienceLab;
3544
import io.pslab.models.SensorDataBlock;
@@ -38,13 +47,16 @@
3847
import io.pslab.others.CustomSnackBar;
3948
import io.pslab.others.GPSLogger;
4049
import io.pslab.others.LocalDataLog;
50+
import io.pslab.others.MathUtils;
4151
import io.pslab.others.ScienceLabCommon;
52+
import io.pslab.others.SwipeGestureDetector;
4253
import io.realm.Realm;
4354
import io.realm.RealmObject;
4455
import io.realm.RealmResults;
4556

4657
public class RoboticArmActivity extends AppCompatActivity {
4758

59+
private static final String PREF_NAME = "RoboticArmActivity";
4860
private EditText degreeText1, degreeText2, degreeText3, degreeText4;
4961
private SeekArc seekArc1, seekArc2, seekArc3, seekArc4;
5062
private LinearLayout servo1TimeLine, servo2TimeLine, servo3TimeLine, servo4TimeLine;
@@ -62,11 +74,32 @@ public class RoboticArmActivity extends AppCompatActivity {
6274
private final String DATA_BLOCK = "data_block";
6375
private int timelinePosition = 0;
6476
private ScienceLab scienceLab;
77+
private BottomSheetBehavior bottomSheetBehavior;
78+
private GestureDetector gestureDetector;
79+
@BindView(R.id.sheet_slide_text_robotic_arm)
80+
TextView bottomSheetSlideText;
81+
@BindView(R.id.parent_layout_robotic)
82+
View parentLayout;
83+
@BindView(R.id.bottom_sheet_robotic_arm)
84+
LinearLayout bottomSheet;
85+
@BindView(R.id.img_arrow_robotic_arm)
86+
ImageView arrowUpDown;
6587

6688
@Override
6789
protected void onCreate(Bundle savedInstanceState) {
6890
super.onCreate(savedInstanceState);
6991
setContentView(R.layout.activity_robotic_arm);
92+
ButterKnife.bind(this);
93+
94+
setUpBottomSheet();
95+
parentLayout.setOnClickListener(new View.OnClickListener() {
96+
@Override
97+
public void onClick(View v) {
98+
if (bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED)
99+
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
100+
parentLayout.setVisibility(View.GONE);
101+
}
102+
});
70103

71104
scienceLab = ScienceLabCommon.scienceLab;
72105
if (!scienceLab.isConnected()) {
@@ -484,6 +517,79 @@ public void onClick(View v) {
484517
.getBlockOfServoRecords(getIntent().getExtras().getLong(DATA_BLOCK));
485518
setReceivedData();
486519
}
520+
521+
Button guideButton = findViewById(R.id.timeline_guide_button);
522+
guideButton.setOnClickListener(new View.OnClickListener() {
523+
@Override
524+
public void onClick(View v) {
525+
bottomSheetBehavior.setState(bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_HIDDEN ?
526+
BottomSheetBehavior.STATE_EXPANDED : BottomSheetBehavior.STATE_HIDDEN);
527+
}
528+
});
529+
}
530+
531+
private void setUpBottomSheet() {
532+
bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet);
533+
534+
final SharedPreferences settings = this.getSharedPreferences(PREF_NAME, MODE_PRIVATE);
535+
Boolean isFirstTime = settings.getBoolean("RoboticArmFirstTime", true);
536+
537+
if (isFirstTime) {
538+
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
539+
parentLayout.setVisibility(View.VISIBLE);
540+
parentLayout.setAlpha(0.8f);
541+
arrowUpDown.setRotation(180);
542+
bottomSheetSlideText.setText(R.string.hide_guide_text);
543+
SharedPreferences.Editor editor = settings.edit();
544+
editor.putBoolean("RoboticArmFirstTime", false);
545+
editor.apply();
546+
} else {
547+
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
548+
}
549+
550+
bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
551+
private Handler handler = new Handler();
552+
private Runnable runnable = new Runnable() {
553+
@Override
554+
public void run() {
555+
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
556+
}
557+
};
558+
559+
@Override
560+
public void onStateChanged(@NonNull final View bottomSheet, int newState) {
561+
switch (newState) {
562+
case BottomSheetBehavior.STATE_EXPANDED:
563+
handler.removeCallbacks(runnable);
564+
bottomSheetSlideText.setText(R.string.hide_guide_text);
565+
break;
566+
567+
case BottomSheetBehavior.STATE_COLLAPSED:
568+
handler.postDelayed(runnable, 2000);
569+
break;
570+
571+
default:
572+
handler.removeCallbacks(runnable);
573+
bottomSheetSlideText.setText(R.string.show_guide_text);
574+
break;
575+
}
576+
}
577+
578+
@Override
579+
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
580+
Float value = (float) MathUtils.map((double) slideOffset, 0.0, 1.0, 0.0, 0.8);
581+
parentLayout.setVisibility(View.VISIBLE);
582+
parentLayout.setAlpha(value);
583+
arrowUpDown.setRotation(slideOffset * 180);
584+
}
585+
});
586+
gestureDetector = new GestureDetector(this, new SwipeGestureDetector(bottomSheetBehavior));
587+
}
588+
589+
@Override
590+
public boolean onTouchEvent(MotionEvent event) {
591+
gestureDetector.onTouchEvent(event); //Gesture detector need this to transfer touch event to the gesture detector.
592+
return super.onTouchEvent(event);
487593
}
488594

489595
private void toastInvalidValueMessage() {
@@ -545,7 +651,7 @@ private void saveTimeline() {
545651
}
546652
}
547653
servoCSVLogger.writeCSVFile(data);
548-
CustomSnackBar.showSnackBar(findViewById(R.id.robotic_arm_relative_view),
654+
CustomSnackBar.showSnackBar(findViewById(R.id.robotic_arm_coordinator),
549655
getString(R.string.csv_store_text) + " " + servoCSVLogger.getCurrentFilePath()
550656
, getString(R.string.open), new View.OnClickListener() {
551657
@Override

0 commit comments

Comments
 (0)