diff --git a/src/AndroidApp/Tbot/.idea/caches/build_file_checksums.ser b/src/AndroidApp/Tbot/.idea/caches/build_file_checksums.ser index 9c92fcf..b59e73a 100644 Binary files a/src/AndroidApp/Tbot/.idea/caches/build_file_checksums.ser and b/src/AndroidApp/Tbot/.idea/caches/build_file_checksums.ser differ diff --git a/src/AndroidApp/android_remocons/rocon_remocon/src/main/AndroidManifest.xml b/src/AndroidApp/android_remocons/rocon_remocon/src/main/AndroidManifest.xml index ea24fd4..f054738 100644 --- a/src/AndroidApp/android_remocons/rocon_remocon/src/main/AndroidManifest.xml +++ b/src/AndroidApp/android_remocons/rocon_remocon/src/main/AndroidManifest.xml @@ -113,7 +113,22 @@ + + + + + + + + + + + + @@ -169,6 +184,7 @@ + diff --git a/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/fall_dectect/FallDetectedActivity.java b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/fall_dectect/FallDetectedActivity.java index 5067960..5c3446f 100644 --- a/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/fall_dectect/FallDetectedActivity.java +++ b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/fall_dectect/FallDetectedActivity.java @@ -61,8 +61,8 @@ public class FallDetectedActivity extends AppCompatActivity implements ViewAnima drawerLayout.closeDrawers(); } }); - setActionBar(); - createMenuList(); + setActionBar();//设置活动bar + createMenuList();//设置菜单 viewAnimator = new ViewAnimator<>(this, list, contentFragment, drawerLayout, this); Button buttonStartDetect=(Button)findViewById(R.id.StartFallDetect); diff --git a/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/NewListener.java b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/NewListener.java new file mode 100644 index 0000000..f28840f --- /dev/null +++ b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/NewListener.java @@ -0,0 +1,114 @@ +package com.github.rosjava.android_remocons.rocon_remocon.stranger_detect; + +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; + +import com.github.rosjava.android_remocons.common_tools.apps.RosAppActivity; +import com.github.rosjava.android_remocons.rocon_remocon.R; +import com.github.rosjava.android_remocons.rocon_remocon.fall_dectect.FallDialog; +import com.github.rosjava.android_remocons.rocon_remocon.fall_dectect.subscriber; + +import org.ros.node.NodeConfiguration; +import org.ros.node.NodeMainExecutor; + +import java.io.IOException; + +/*本类实现了检测陌生人事件的发生*/ +public class NewListener extends RosAppActivity +{ + private subscriber sc; + boolean alertConfirm; + + public NewListener() + { + super("listener", "listener"); + } + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) + { + setDefaultMasterName(getString(R.string.default_robot)); + setDashboardResource(R.id.top_bar); + setMainWindowResource(R.layout.listener); + super.onCreate(savedInstanceState); + } + + @Override + protected void init(NodeMainExecutor nodeMainExecutor) + { + //super.init(nodeMainExecutor); + try { + //建立socket连接将机器人端与安卓端联系在一起,实现信息的沟通 + Thread.sleep(1000); + java.net.Socket socket = new java.net.Socket(getMasterUri().getHost(), getMasterUri().getPort()); + java.net.InetAddress local_network_address = socket.getLocalAddress(); + socket.close(); + + //声明一个新的subscriber对象 + sc = new subscriber(); + //配置网络 + NodeConfiguration nodeConfiguration = + NodeConfiguration.newPublic(local_network_address.getHostAddress(), getMasterUri()); + //处理sc的内容 + nodeMainExecutor.execute(sc, nodeConfiguration); + Log.i("listener", "I heard msg from ubuntu123456 : \"" + sc.getAlertText() + "\""); + alertConfirm = true; + while(alertConfirm) { + //sc.getAlertText(); + Log.i("listener", "I heard msg from ubuntu : \"" + sc.getAlertText() + "\""); + if (sc.getAlertText() != null) { + Log.e("listener", "收到了"); + Intent intent = new Intent(NewListener.this,FallDialog.class); + startActivity(intent); + alertConfirm = false; + } + } + } catch(InterruptedException e) { + // Thread interruption + } catch (IOException e) { + // Socket problem + } + } + private DialogInterface.OnClickListener click1=new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0,int arg1) + { + android.os.Process.killProcess(android.os.Process.myPid()); + } + }; + private DialogInterface.OnClickListener click2=new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0,int arg1) + { + arg0.cancel(); + } + }; + + //重构父类函数 + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + menu.add(0,0,0,R.string.stop_app); + return super.onCreateOptionsMenu(menu); + } + + //重构父类函数 + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + super.onOptionsItemSelected(item); + switch (item.getItemId()){ + case 0: + finish(); + break; + } + return true; + } +} diff --git a/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/StrangerDialog.java b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/StrangerDialog.java index fec6734..0e747b5 100644 --- a/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/StrangerDialog.java +++ b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/StrangerDialog.java @@ -14,6 +14,8 @@ import android.view.View; import com.github.rosjava.android_remocons.rocon_remocon.R; import com.github.rosjava.android_remocons.rocon_remocon.Remocon; import com.github.rosjava.android_remocons.rocon_remocon.WelcomActivity; +import com.github.rosjava.android_remocons.rocon_remocon.fall_dectect.FallDetectedActivity; +import com.github.rosjava.android_remocons.rocon_remocon.fall_dectect.FallDialog; public class StrangerDialog extends AppCompatActivity { /*本类实现检测到陌生人后弹出提示对话框的功能*/ @@ -29,4 +31,26 @@ public class StrangerDialog extends AppCompatActivity { alertdialog1.show(); //setContentView(R.layout.fall_alert); } + private DialogInterface.OnClickListener click1=new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0,int arg1) + { + //响应点击返回陌生人检测的主界面 + Intent intent = new Intent(StrangerDialog.this, StrangerlDetectedActivity.class); + startActivity(intent); + //android.os.Process.killProcess(android.os.Process.myPid()); + } + }; + private DialogInterface.OnClickListener click2=new DialogInterface.OnClickListener() + { + //响应点击返回继续监视的界面 + @Override + public void onClick(DialogInterface arg0,int arg1) + { + Intent intent = new Intent(StrangerDialog.this, NewListener.class); + startActivity(intent); + arg0.cancel(); + } + }; } \ No newline at end of file diff --git a/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/StrangerlDetectedActivity.java b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/StrangerlDetectedActivity.java new file mode 100644 index 0000000..db676e4 --- /dev/null +++ b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/StrangerlDetectedActivity.java @@ -0,0 +1,245 @@ + package com.github.rosjava.android_remocons.rocon_remocon.stranger_detect; + +/** + * Created by lcp on 2021/4/19. + */ + + import android.content.DialogInterface; + import android.content.Intent; + import android.content.res.Configuration; + import android.graphics.Color; + import android.graphics.drawable.BitmapDrawable; + import android.os.Bundle; + import android.support.v4.widget.DrawerLayout; + import android.support.v7.app.ActionBarDrawerToggle; + import android.support.v7.app.AlertDialog; + import android.support.v7.app.AppCompatActivity; + import android.support.v7.widget.Toolbar; + import android.view.Menu; + import android.view.MenuItem; + import android.view.View; + import android.view.animation.AccelerateInterpolator; + import android.widget.Button; + import android.widget.LinearLayout; + + import com.github.rosjava.android_remocons.rocon_remocon.R; + import com.github.rosjava.android_remocons.rocon_remocon.fall_dectect.fragment.ContentFragment; + + import java.util.ArrayList; + import java.util.List; + + import io.codetail.animation.SupportAnimator; + import io.codetail.animation.ViewAnimationUtils; + import yalantis.com.sidemenu.interfaces.Resourceble; + import yalantis.com.sidemenu.interfaces.ScreenShotable; + import yalantis.com.sidemenu.model.SlideMenuItem; + import yalantis.com.sidemenu.util.ViewAnimator; + + public class StrangerlDetectedActivity extends AppCompatActivity implements ViewAnimator.ViewAnimatorListener { + private DrawerLayout drawerLayout; //抽屉布局 + private ActionBarDrawerToggle drawerToggle; + private List list = new ArrayList<>(); + private ContentFragment contentFragment; + private ViewAnimator viewAnimator; + private int res = R.drawable.fall_pic2;//设置图片 + private LinearLayout linearLayout; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.stranger_detect);//启动摔倒检测的界面 + contentFragment = ContentFragment.newInstance(R.drawable.fall_pic2); + getSupportFragmentManager().beginTransaction() + .replace(R.id.content_frame, contentFragment) + .commit(); + drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + drawerLayout.setScrimColor(Color.TRANSPARENT); + linearLayout = (LinearLayout) findViewById(R.id.left_drawer); + linearLayout.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + drawerLayout.closeDrawers(); + } + }); + setActionBar(); + createMenuList(); + viewAnimator = new ViewAnimator<>(this, list, contentFragment, drawerLayout, this); + + Button buttonStartDetect=(Button)findViewById(R.id.StartFallDetect); + buttonStartDetect.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + AlertDialog.Builder alertdialogbuilder=new AlertDialog.Builder(StrangerlDetectedActivity.this); + alertdialogbuilder.setMessage("您确定开启摔倒检测吗?"); + alertdialogbuilder.setPositiveButton("我确定", click1); + alertdialogbuilder.setNegativeButton("再考虑一下", click2); + AlertDialog alertdialog1=alertdialogbuilder.create(); + alertdialog1.show(); + } + }); + + Button buttonStopDetect=(Button)findViewById(R.id.CloseFallDetect); + buttonStopDetect.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + AlertDialog.Builder alertdialogbuilder=new AlertDialog.Builder(StrangerlDetectedActivity.this); + alertdialogbuilder.setMessage("您确定关闭摔倒检测吗?"); + alertdialogbuilder.setPositiveButton("我确定", click2); + alertdialogbuilder.setNegativeButton("再考虑一下", click2); + AlertDialog alertdialog1=alertdialogbuilder.create(); + alertdialog1.show(); + } + }); + + } + private DialogInterface.OnClickListener click1=new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0,int arg1) + { + Intent intent = new Intent(StrangerlDetectedActivity.this, NewListener.class); + startActivity(intent); + } + }; + private DialogInterface.OnClickListener click2=new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface arg0,int arg1) + { + arg0.cancel(); + } + }; + private void createMenuList() {//设置侧边菜单栏的布局和图片 + SlideMenuItem menuItem0 = new SlideMenuItem(ContentFragment.CLOSE, R.drawable.icn_close); + list.add(menuItem0); + SlideMenuItem menuItem = new SlideMenuItem(ContentFragment.BUILDING, R.drawable.icn_1); + list.add(menuItem); + SlideMenuItem menuItem2 = new SlideMenuItem(ContentFragment.BOOK, R.drawable.icn_2); + list.add(menuItem2); + SlideMenuItem menuItem3 = new SlideMenuItem(ContentFragment.PAINT, R.drawable.icn_3); + list.add(menuItem3); + SlideMenuItem menuItem4 = new SlideMenuItem(ContentFragment.CASE, R.drawable.icn_4); + list.add(menuItem4); + SlideMenuItem menuItem5 = new SlideMenuItem(ContentFragment.SHOP, R.drawable.icn_5); + list.add(menuItem5); + SlideMenuItem menuItem6 = new SlideMenuItem(ContentFragment.PARTY, R.drawable.icn_6); + list.add(menuItem6); + SlideMenuItem menuItem7 = new SlideMenuItem(ContentFragment.MOVIE, R.drawable.icn_7); + list.add(menuItem7); + } + + + private void setActionBar() {//设置活动Bar + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setHomeButtonEnabled(true); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + drawerToggle = new ActionBarDrawerToggle( + this, /* host Activity */ + drawerLayout, /* DrawerLayout object */ + toolbar, /* nav drawer icon to replace 'Up' caret */ + R.string.drawer_open, /* "open drawer" description */ + R.string.drawer_close /* "close drawer" description */ + ) { + + /** Called when a drawer has settled in a completely closed state. */ + public void onDrawerClosed(View view) { + super.onDrawerClosed(view); + linearLayout.removeAllViews(); + linearLayout.invalidate(); + } + + @Override + public void onDrawerSlide(View drawerView, float slideOffset) { + super.onDrawerSlide(drawerView, slideOffset); + if (slideOffset > 0.6 && linearLayout.getChildCount() == 0) + viewAnimator.showMenuContent(); + } + + /** Called when a drawer has settled in a completely open state. */ + public void onDrawerOpened(View drawerView) { + super.onDrawerOpened(drawerView); + } + }; + drawerLayout.setDrawerListener(drawerToggle); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + drawerToggle.syncState(); + } + + //配置改变的响应 + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + drawerToggle.onConfigurationChanged(newConfig); + } + + //选择设置的菜单 + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + //菜单选择操作 + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (drawerToggle.onOptionsItemSelected(item)) { + return true; + } + switch (item.getItemId()) { + case R.id.action_settings: + return true; + // wyj + case android.R.id.home: + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private ScreenShotable replaceFragment(ScreenShotable screenShotable, int topPosition) { + this.res = this.res == R.drawable.fall_pic2 ? R.drawable.fall_pic: R.drawable.fall_pic2; + View view = findViewById(R.id.content_frame); + int finalRadius = Math.max(view.getWidth(), view.getHeight()); + SupportAnimator animator = ViewAnimationUtils.createCircularReveal(view, 0, topPosition, 0, finalRadius); + animator.setInterpolator(new AccelerateInterpolator()); + animator.setDuration(ViewAnimator.CIRCULAR_REVEAL_ANIMATION_DURATION); + + findViewById(R.id.content_overlay).setBackgroundDrawable(new BitmapDrawable(getResources(), screenShotable.getBitmap())); + animator.start(); + ContentFragment contentFragment = ContentFragment.newInstance(this.res); + getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, contentFragment).commit(); + return contentFragment; + } + + @Override + public ScreenShotable onSwitch(Resourceble slideMenuItem, ScreenShotable screenShotable, int position) { + switch (slideMenuItem.getName()) { + case ContentFragment.CLOSE: + return screenShotable; + default: + return replaceFragment(screenShotable, position); + } + } + + @Override + public void disableHomeButton() { + getSupportActionBar().setHomeButtonEnabled(true); + + } + + @Override + public void enableHomeButton() { + getSupportActionBar().setHomeButtonEnabled(false); + drawerLayout.closeDrawers(); + + } + + @Override + public void addViewToContainer(View view) { + linearLayout.addView(view); + } + } diff --git a/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/listener.java b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/listener.java new file mode 100644 index 0000000..ff03a03 --- /dev/null +++ b/src/AndroidApp/android_remocons/rocon_remocon/src/main/java/com/github/rosjava/android_remocons/rocon_remocon/stranger_detect/listener.java @@ -0,0 +1,135 @@ +package com.github.rosjava.android_remocons.rocon_remocon.stranger_detect; + +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.widget.Toast; + +import com.github.rosjava.android_remocons.common_tools.apps.RosAppActivity; +import com.github.rosjava.android_remocons.rocon_remocon.R; + +import org.ros.android.view.RosTextView; +import org.ros.node.ConnectedNode; +import org.ros.node.NodeConfiguration; +import org.ros.node.NodeMainExecutor; + +import java.io.IOException; + +import std_msgs.String; + +public class listener extends RosAppActivity +{ + private Toast lastToast; + private ConnectedNode node; + private RosTextView rosTextView; + //private subscriber sb; + + public listener() + { + super("listener", "listener"); + } + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) + { + setDefaultMasterName(getString(R.string.default_robot)); + setDashboardResource(R.id.top_bar); + setMainWindowResource(R.layout.listener); + super.onCreate(savedInstanceState); + } + + @Override + protected void init(NodeMainExecutor nodeMainExecutor) + { + //String chatterTopic = remaps.get(getString(R.string.chatter_topic)); + super.init(nodeMainExecutor); + + /*rosTextView = (RosTextView) findViewById(R.id.text); + rosTextView.setTopicName(getMasterNameSpace().resolve(chatterTopic).toString()); + rosTextView.setMessageType(std_msgs.String._TYPE); + rosTextView.setMessageToStringCallable(new MessageCallable() { + @Override + public java.lang.String call(std_msgs.String message) { + Log.e("Listener", "received a message [" + message.getData() + "]"); + return message.getData(); + } + });*/ + try { + // Really horrible hack till I work out exactly the root cause and fix for + // https://github.com/rosjava/android_remocons/issues/47 + Thread.sleep(1000); + java.net.Socket socket = new java.net.Socket(getMasterUri().getHost(), getMasterUri().getPort()); + java.net.InetAddress local_network_address = socket.getLocalAddress(); + socket.close(); + Log.i("123", "I heard msg from ubuntu : \" \""); + // sb = new subscriber(); + + NodeConfiguration nodeConfiguration = + NodeConfiguration.newPublic(local_network_address.getHostAddress(), getMasterUri()); + //nodeMainExecutor.execute(sb, nodeConfiguration); + + /*boolean flag = true; + while(flag){ + if(sb.getAlertText()==null) { + /*new AlertDialog.Builder(listener.this) + .setTitle("确认") + .setMessage("确定吗?") + .setPositiveButton("是", null) + .setNegativeButton("否", null) + .show(); + flag = false; + Intent intent = new Intent(listener.this, NewListener.class); + startActivity(intent); + } + }*/ + + + } catch(InterruptedException e) { + // Thread interruption + } catch (IOException e) { + // Socket problem + } + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + menu.add(0,0,0,R.string.stop_app); + return super.onCreateOptionsMenu(menu); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + super.onOptionsItemSelected(item); + switch (item.getItemId()){ + case 0: + finish(); + break; + } + return true; + } + +// /** +// * Call Toast on UI thread. +// * @param message Message to show on toast. +// */ +// private void showToast(final String message) +// { +// runOnUiThread(new Runnable() +// { +// @Override +// public void run() { +// if (lastToast != null) +// lastToast.cancel(); +// +// lastToast = Toast.makeText(getBaseContext(), message, Toast.LENGTH_LONG); +// lastToast.show(); +// } +// }); +// } + +} diff --git a/src/AndroidApp/android_remocons/rocon_remocon/src/main/res/layout/stranger_detect.xml b/src/AndroidApp/android_remocons/rocon_remocon/src/main/res/layout/stranger_detect.xml new file mode 100644 index 0000000..9dc43fe --- /dev/null +++ b/src/AndroidApp/android_remocons/rocon_remocon/src/main/res/layout/stranger_detect.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + +