From 3c832de62199011d6e61ac77f7755d937e65cd32 Mon Sep 17 00:00:00 2001 From: MikkoAyaka <3401286177@qq.com> Date: Tue, 14 Nov 2023 09:06:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/src/main/AndroidManifest.xml | 1 - .../src/main/java/wificar/Configuration.java | 24 +- .../src/main/java/wificar/MySurfaceView.java | 9 +- src/app/src/main/java/wificar/MyVideo.java | 216 +++++++++++++----- src/app/src/main/java/wificar/RockerView.java | 9 +- .../src/main/java/wificar/SocketListener.java | 1 + .../src/main/res/layout/activity_settings.xml | 2 +- src/app/src/main/res/layout/myvideo.xml | 172 ++++++++++---- 8 files changed, 316 insertions(+), 118 deletions(-) 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 @@ - + +