diff --git a/src/app/src/main/AndroidManifest.xml b/src/app/src/main/AndroidManifest.xml
index 5bd5f89..1f52d28 100644
--- a/src/app/src/main/AndroidManifest.xml
+++ b/src/app/src/main/AndroidManifest.xml
@@ -15,7 +15,6 @@
-
suggestions = new ArrayList<>();
+
+ public boolean poseCheck = true;
+
public boolean needSaveScreenShot = false;
- private Configuration(){}
+ ThreadLocalRandom random;
+ private Configuration(){
+
+ random = ThreadLocalRandom.current();
+ suggestions.add("优先确认安全: 在搜救任务开始前,请确保救援队员和机器人的安全。评估搜救区域的潜在风险,并采取必要的安全措施。");
+ suggestions.add("建立通讯联系: 与被救援者建立有效的通讯联系,了解他们的状况、位置和任何紧急情况。稳定的通讯有助于更好地协调救援行动。");
+ suggestions.add("分析搜救区域: 对搜救区域进行细致的分析,了解可能的藏匿点和障碍物。这有助于制定更有效的搜救策略。");
+ suggestions.add("协同工作: 救援机器人应与救援队协同工作,相互支持。机器人可以用于进入危险区域,而救援队员则可以提供更多的人工智能无法覆盖的人文关怀。");
+ suggestions.add("紧急医疗救援: 如果搜救现场有伤者,立即调配医疗救援人员,优先进行紧急医疗救援。");
+ suggestions.add("数据采集: 利用机器人的传感器和摄像头收集详细的现场信息,有助于更准确地定位和救援被困者。");
+
+ }
+ public String getRandomSuggestion() {
+ return suggestions.get(random.nextInt(suggestions.size()));
+ }
private static Configuration INSTANCE;
public static Configuration getInstance() {
if(INSTANCE == null) INSTANCE = new Configuration();
diff --git a/src/app/src/main/java/wificar/MySurfaceView.java b/src/app/src/main/java/wificar/MySurfaceView.java
index 77c84d0..5c7acef 100644
--- a/src/app/src/main/java/wificar/MySurfaceView.java
+++ b/src/app/src/main/java/wificar/MySurfaceView.java
@@ -19,6 +19,7 @@ import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.YuvImage;
+import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
@@ -74,7 +75,7 @@ public class MySurfaceView extends SurfaceView implements Callback {
private boolean isThreadRunning = true;
private MyVideo activity;
- private ImageView floatingView;
+ private MySurfaceView floatingView;
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -484,15 +485,15 @@ public class MySurfaceView extends SurfaceView implements Callback {
protected void showResultOnUI() {
if(floatingView == null) {
- floatingView = activity.findViewById(R.id.floatingView);
+ floatingView = activity.findViewById(R.id.mySurfaceViewVideo);
}
activity.runOnUiThread(() -> {
if(mutableBitmap == null)return;
- floatingView.setImageBitmap(mutableBitmap);
+ floatingView.setBackground(new BitmapDrawable(getResources(),mutableBitmap));
});
}
protected Bitmap drawPersonPose(Bitmap mutableBitmap, KeyPoint[] keyPoints) {
- if (keyPoints == null || keyPoints.length <= 0) {
+ if (keyPoints == null || keyPoints.length <= 0 || !Configuration.getInstance().poseCheck) {
return mutableBitmap;
}
int[][] joint_pairs = {{0, 1}, {1, 3}, {0, 2}, {2, 4}, {5, 6}, {5, 7}, {7, 9}, {6, 8}, {8, 10}, {5, 11}, {6, 12}, {11, 12}, {11, 13}, {12, 14}, {13, 15}, {14, 16}};
diff --git a/src/app/src/main/java/wificar/MyVideo.java b/src/app/src/main/java/wificar/MyVideo.java
index da47d75..a3d7348 100644
--- a/src/app/src/main/java/wificar/MyVideo.java
+++ b/src/app/src/main/java/wificar/MyVideo.java
@@ -1,42 +1,32 @@
package wificar;
import android.app.Activity;
-import android.content.Context;
import android.content.Intent;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.VirtualDisplay;
-import android.media.MediaScannerConnection;
-import android.media.projection.MediaProjection;
-import android.media.projection.MediaProjectionManager;
-import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
-import android.os.Environment;
-import android.os.Message;
import android.os.StrictMode;
-import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
-import android.view.Surface;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
-import android.widget.ImageButton;
+import android.widget.Button;
+import android.widget.CheckBox;
import android.widget.LinearLayout;
-import android.widget.RelativeLayout;
import android.widget.SeekBar;
+import android.widget.TextView;
import android.widget.Toast;
-import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
-import java.net.URL;
import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
import my.wificar.R;
@@ -44,52 +34,160 @@ public class MyVideo extends Activity {
public static String CameraIp;
public static String CtrlIp;
public static String CtrlPort;
- URL videoUrl;
MySurfaceView r;
OutputStream socketWriter;
InputStream socketReader;
SocketListener socketListener2001;
SoundSocketListener socketListener2002;
- SeekBar xSeekbar,ySeekbar;
+ SeekBar xSeekbar;
+ Button menuIcon;
+ TextView distanceText,lifeCheckText,poseCheckText,suggestionText,avoidText;
+ CheckBox distanceBtn,lifeCheckBtn,poseCheckBtn,suggestionBtn,avoidBtn;
private Socket socket;
private Socket soundSocket;
private RockerView rockerView;
+ LinearLayout menu;
private long exitTime = 0;
+ Timer timer = new Timer();
+
+
+
+ private boolean btnEnabled = false;
+
+ private List menuContent = new ArrayList<>();
+
+ private void showMenuContent() {
+ for (View view : menuContent) {
+ view.setVisibility(View.VISIBLE);
+ }
+ }
+ private void hideMenuContent() {
+ for (View view : menuContent) {
+ view.setVisibility(View.GONE);
+ }
+ }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐去标题(应用的名字必须要写在setContentView之前,否则会有异常)
+ this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- LinearLayout linearLayout = findViewById(R.id.linearLayout4);
- xSeekbar = linearLayout.findViewById(R.id.xSeekbar);
- ySeekbar = linearLayout.findViewById(R.id.ySeekbar);
-
- xSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+ setContentView(R.layout.myvideo);
+ timer.schedule(new TimerTask() {
@Override
- public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
+ public void run() {
+ while (true) {
+ try {
+ Thread.sleep(6000);
+ runOnUiThread(()->{
+ TextView textView = findViewById(R.id.suggestion);
+ textView.setText(Configuration.getInstance().getRandomSuggestion());
+ });
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ }, 1000L, 1000L);
+ distanceText = findViewById(R.id.distanceText);
+ distanceBtn = findViewById(R.id.distanceBtn);
+ distanceBtn.setChecked(true);
+ distanceBtn.setOnClickListener(view -> {
+ CheckBox checkBox = (CheckBox) view;
+ LinearLayout layout = findViewById(R.id.distanceLayout);
+ if(checkBox.isChecked()) {
+ layout.setVisibility(View.VISIBLE);
+ } else layout.setVisibility(View.GONE);
+ });
+
+ lifeCheckText = findViewById(R.id.lifeCheckText);
+ lifeCheckBtn = findViewById(R.id.lifeCheckBtn);
+ lifeCheckBtn.setChecked(true);
+ lifeCheckBtn.setOnClickListener(view -> {
+ CheckBox checkBox = (CheckBox) view;
+ LinearLayout layout = findViewById(R.id.lifeCheckLayout);
+ if(checkBox.isChecked()) {
+ layout.setVisibility(View.VISIBLE);
+ } else layout.setVisibility(View.GONE);
+ });
+
+ poseCheckText = findViewById(R.id.poseCheckText);
+ poseCheckBtn = findViewById(R.id.poseCheckBtn);
+ poseCheckBtn.setChecked(true);
+ poseCheckBtn.setOnClickListener(view -> {
+ CheckBox checkBox = (CheckBox) view;
+ LinearLayout layout = findViewById(R.id.poseCheckLayout);
+ if(checkBox.isChecked()) {
+ layout.setVisibility(View.VISIBLE);
+ } else layout.setVisibility(View.GONE);
+ Configuration.getInstance().poseCheck = checkBox.isChecked();
+ });
+
+ suggestionText = findViewById(R.id.suggestionText);
+ suggestionBtn = findViewById(R.id.suggestionBtn);
+ suggestionBtn.setChecked(false);
+ suggestionBtn.setOnClickListener(view -> {
+ CheckBox checkBox = (CheckBox) view;
+ TextView textView = findViewById(R.id.suggestion);
+ if(checkBox.isChecked()) {
+ textView.setVisibility(View.VISIBLE);
+ } else textView.setVisibility(View.GONE);
+ });
+
+ avoidBtn = findViewById(R.id.avoidBtn);
+ avoidText = findViewById(R.id.avoidText);
+ avoidBtn.setOnClickListener(view -> {
+ CheckBox checkBox = (CheckBox) view;
+ if(checkBox.isChecked()) {
try {
- socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x01, (byte) 0x07, (byte)((int)(progress * 1.8)), (byte) 0xff});
+ socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x13, (byte) 0x04, (byte)0x00, (byte) 0xff});
+ socketWriter.flush();
+ } catch (IOException e) {
+ runOnUiThread(()-> Toast.makeText(this,"网络异常!",Toast.LENGTH_SHORT).show());
+ throw new RuntimeException(e);
+ }
+ } else {
+ try {
+ socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x13, (byte) 0x00, (byte)0x00, (byte) 0xff});
socketWriter.flush();
-
} catch (IOException e) {
+ runOnUiThread(()-> Toast.makeText(this,"网络异常!",Toast.LENGTH_SHORT).show());
throw new RuntimeException(e);
}
}
- @Override
- public void onStartTrackingTouch(SeekBar seekBar) {
+ });
- }
+ menuContent.add(distanceText);
+ menuContent.add(lifeCheckText);
+ menuContent.add(poseCheckText);
+ menuContent.add(suggestionText);
+ menuContent.add(distanceBtn);
+ menuContent.add(lifeCheckBtn);
+ menuContent.add(poseCheckBtn);
+ menuContent.add(suggestionBtn);
+ menuContent.add(avoidBtn);
+ menuContent.add(avoidText);
- @Override
- public void onStopTrackingTouch(SeekBar seekBar) {
+ hideMenuContent();
- }
+ menu = findViewById(R.id.droppedMenu);
+ xSeekbar = findViewById(R.id.xSeekbar);
+
+ menuIcon = findViewById(R.id.menuIcon);
+ menuIcon.setOnClickListener(view -> {
+ btnEnabled = !btnEnabled;
+ if(btnEnabled) {
+ showMenuContent();
+ } else hideMenuContent();
});
- ySeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+
+ xSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean b) {
try {
- socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x01, (byte) 0x08, (byte)((int)(progress * 1.8)), (byte) 0xff});
+ if(socketWriter == null) return;
+ socketWriter.write(new byte[]{(byte) 0xff, (byte) 0x01, (byte) 0x08, (byte)((int)(progress * 0.9)+45), (byte) 0xff});
socketWriter.flush();
} catch (IOException e) {
@@ -106,10 +204,6 @@ public class MyVideo extends Activity {
}
});
-
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐去标题(应用的名字必须要写在setContentView之前,否则会有异常)
- this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setContentView(R.layout.myvideo);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
@@ -129,28 +223,28 @@ public class MyVideo extends Activity {
public void InitSocket(Activity activity) {
// TODO 测试
-// try {
-// socket = new Socket(InetAddress.getByName(CtrlIp), Integer.parseInt(CtrlPort));
-// soundSocket = new Socket(InetAddress.getByName(CtrlIp), 2002);
-// } catch (UnknownHostException e) {
-// // TODO Auto-generated catch block
-// e.printStackTrace();
-// } catch (Exception e) {
-// // TODO Auto-generated catch block
-// e.printStackTrace();
-// }
-// try {
-// socketWriter = socket.getOutputStream();
-// socketReader = socket.getInputStream();
-// socketListener2001 = new SocketListener(activity,socketReader);
-// socketListener2002 = new SoundSocketListener(activity,soundSocket.getInputStream());
-// } catch (Exception e) {
-// // TODO Auto-generated catch block
-// e.printStackTrace();
-// }
+ try {
+ socket = new Socket(InetAddress.getByName(CtrlIp), Integer.parseInt(CtrlPort));
+ soundSocket = new Socket(InetAddress.getByName(CtrlIp), 2002);
+ } catch (UnknownHostException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ try {
+ socketWriter = socket.getOutputStream();
+ socketReader = socket.getInputStream();
+ socketListener2001 = new SocketListener(activity,socketReader);
+ socketListener2002 = new SoundSocketListener(activity,soundSocket.getInputStream());
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ LinearLayout rockerLayout = findViewById(R.id.rocketLayout);
rockerView = new RockerView(this,socketWriter,this.getApplicationContext(),null);
- RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(1000,1000);
- addContentView(rockerView,params);
+ rockerLayout.addView(rockerView);
//Toast.makeText(this,"初始化网络失败!"+e.getMessage(),Toast.LENGTH_LONG).show();
}
diff --git a/src/app/src/main/java/wificar/RockerView.java b/src/app/src/main/java/wificar/RockerView.java
index f36a4ef..ed48852 100644
--- a/src/app/src/main/java/wificar/RockerView.java
+++ b/src/app/src/main/java/wificar/RockerView.java
@@ -23,14 +23,17 @@ public class RockerView extends View{
Paint backPaint = new Paint(); // 背景画笔
Paint bubblePaint = new Paint(); // 气泡画笔
Paint rectfPaint = new Paint();
- float bubbleX = 300, bubbleY = 700; // 定义气泡的位置
- float backX = 300, backY = 700; // 背景圆的位置
+ float bubbleX = 200, bubbleY = 200; // 定义气泡的位置
+ float backX = 200, backY = 200; // 背景圆的位置
int radiusBack = 200, radiusBubble = 100; // 定义背景圆以及气泡的半径
RectF mRectF = new RectF(backX-radiusBack,backY-radiusBack,backX+radiusBack,backY+radiusBack);
Context mContext;
OutputStream socketWriter;
String status = "STOP";
- private Activity activity;
+ Activity activity;
+ public RockerView(Context context) {
+ super(context);
+ }
public RockerView(Activity activity,OutputStream socketWriter,Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
this.activity = activity;
diff --git a/src/app/src/main/java/wificar/SocketListener.java b/src/app/src/main/java/wificar/SocketListener.java
index 1510865..be56b01 100644
--- a/src/app/src/main/java/wificar/SocketListener.java
+++ b/src/app/src/main/java/wificar/SocketListener.java
@@ -45,6 +45,7 @@ public class SocketListener {
}
}
});
+
AsyncTask.execute(()->{
while(true) {
try {
diff --git a/src/app/src/main/res/layout/activity_settings.xml b/src/app/src/main/res/layout/activity_settings.xml
index b533653..6a639a8 100644
--- a/src/app/src/main/res/layout/activity_settings.xml
+++ b/src/app/src/main/res/layout/activity_settings.xml
@@ -40,7 +40,7 @@
app:layout_constraintTop_toTopOf="@+id/textView" />
@@ -12,7 +13,21 @@
-
+
+
-
-
-
@@ -52,7 +138,7 @@
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:textSize="18dp"
- android:text="鑸垫満X杞" />
+ android:text="鑸垫満鎺у埗" />
-
-
-
-
-
-
-
+
+
+
+
+
@@ -115,12 +181,12 @@
-
+
+
\ No newline at end of file