Browse Source

1.读取温湿度、氨气
2.单点清洗厕所的优化
3.厕所个数可以自定义
4.串口号可以自定义

Administrator 4 years ago
parent
commit
8eb19620d0
27 changed files with 892 additions and 296 deletions
  1. 1 1
      app/src/main/AndroidManifest.xml
  2. 2 1
      app/src/main/java/com/sunzee/base/BaseApplication.java
  3. 5 0
      app/src/main/java/com/sunzee/model/Global.java
  4. 10 0
      app/src/main/java/com/sunzee/model/domain/Name.java
  5. 2 8
      app/src/main/java/com/sunzee/mvp/homeactivity/HomeactivityPresenter.java
  6. 1 1
      app/src/main/java/com/sunzee/mvp/homeactivity/HomeactivityView.java
  7. 2 3
      app/src/main/java/com/sunzee/receiver/BootBroadcastReceiver.java
  8. 17 8
      app/src/main/java/com/sunzee/service/MyIntentService.java
  9. 72 16
      app/src/main/java/com/sunzee/service/MyService.java
  10. 1 1
      app/src/main/java/com/sunzee/thread/advanceparameter/AdvanceParameterThreadType.java
  11. 2 1
      app/src/main/java/com/sunzee/thread/advanceparameter/ThreadPoolAdvanceParameter.java
  12. 132 0
      app/src/main/java/com/sunzee/thread/homepageA/homepage/HomepageATask.java
  13. 7 0
      app/src/main/java/com/sunzee/thread/homepageA/homepage/HomepageAThreadType.java
  14. 58 0
      app/src/main/java/com/sunzee/thread/homepageA/homepage/ThreadPoolHomepageA.java
  15. 33 8
      app/src/main/java/com/sunzee/ui/activity/HomeActivity.java
  16. 53 30
      app/src/main/java/com/sunzee/ui/activity/HomePageActivity.java
  17. 1 1
      app/src/main/java/com/sunzee/ui/activity/LoginActivity.java
  18. 2 1
      app/src/main/java/com/sunzee/ui/fragment/AdvanceParameterFragment.java
  19. 2 1
      app/src/main/java/com/sunzee/ui/fragment/DebugFragment.java
  20. 2 1
      app/src/main/java/com/sunzee/ui/fragment/GeneralParameterFragment.java
  21. 30 6
      app/src/main/java/com/sunzee/ui/fragment/HomepageFragment.java
  22. 52 18
      app/src/main/java/com/sunzee/ui/fragment/OtherFragment.java
  23. 22 0
      app/src/main/res/drawable-xhdpi/shape_radio_thumb_other.xml
  24. 22 0
      app/src/main/res/drawable/shape_radio_red.xml
  25. 0 1
      app/src/main/res/drawable/shape_radio_thumb.xml
  26. 59 9
      app/src/main/res/layout/activity_homeactivity.xml
  27. 302 180
      app/src/main/res/layout/fragment_other.xml

+ 1 - 1
app/src/main/AndroidManifest.xml

@@ -45,7 +45,7 @@
 
         </activity>
 
-        <activity android:name=".ui.activity.HomePageActivity">
+        <activity android:name=".ui.activity.HomePageAActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
 

+ 2 - 1
app/src/main/java/com/sunzee/base/BaseApplication.java

@@ -16,6 +16,7 @@ import com.hboxs.serialport.SerialPortManager;
 import com.orhanobut.hawk.Hawk;
 import com.sunzee.db.DaoMaster;
 import com.sunzee.db.DaoSession;
+import com.sunzee.model.Global;
 import com.sunzee.model.Heartbeat;
 import com.sunzee.model.domain.Name;
 import com.sunzee.service.MyService;
@@ -50,7 +51,7 @@ public class BaseApplication extends Application {
         Hawk.init(this).build();
         Heartbeat.deviceId = FileUtil.getDeviceId();
         Heartbeat.managerId = (String) SharedPreferencesUtils.getParam(Name.SYSTEM_ID, "");
-        SerialPortDevice device = new SerialPortDevice("/dev/ttyS2", "9600");
+        SerialPortDevice device = new SerialPortDevice(Global.dev, "9600");
         SerialPortManager.getInstance().open(device);
         startMyService();
         firstHeartbeat();

+ 5 - 0
app/src/main/java/com/sunzee/model/Global.java

@@ -1,5 +1,8 @@
 package com.sunzee.model;
 
+import com.orhanobut.hawk.Hawk;
+import com.sunzee.model.domain.Name;
+
 public class Global {
     /**
      * 定时闹钟的个数
@@ -7,4 +10,6 @@ public class Global {
     public static int alarmNumber = 0;
 
     public static final double num = 177.778;
+
+    public static final String dev = "/dev/ttyS"+ Hawk.get(Name.SERIALNUMBER, "4");
 }

+ 10 - 0
app/src/main/java/com/sunzee/model/domain/Name.java

@@ -48,5 +48,15 @@ public interface Name {
      */
     String ALLCLEANING = "allcleaning";
 
+    /**
+     * 串口号
+     */
+    String SERIALNUMBER = "serialnumber";
+
+    /**
+     * 厕所个数
+     */
+    String TOILETSNUMBER= "toiletsnumber";
+
 
 }

+ 2 - 8
app/src/main/java/com/sunzee/mvp/homeactivity/HomeactivityPresenter.java

@@ -1,6 +1,5 @@
 package com.sunzee.mvp.homeactivity;
 
-import android.os.Environment;
 import android.text.TextUtils;
 import android.util.Log;
 
@@ -14,21 +13,16 @@ import com.sunzee.model.Heartbeat;
 import com.sunzee.model.HttpResult;
 import com.sunzee.model.HttpResult2;
 import com.sunzee.model.domain.CleaningBean;
-import com.sunzee.model.domain.GetAdBean;
 import com.sunzee.model.domain.Name;
 import com.sunzee.model.domain.ParameterBean;
-import com.sunzee.mvp.advertising.AdvertisingView;
 import com.sunzee.retrofit.ApiCallback;
 import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
 import com.sunzee.utils.AlarmManagerUtil;
-import com.sunzee.utils.FileUtil;
 import com.sunzee.utils.HexadecimalUtil;
-import com.wuxiaolong.androidutils.library.LogUtil;
 
 import org.greenrobot.greendao.query.QueryBuilder;
 import org.greenrobot.greendao.query.WhereCondition;
 
-import java.io.File;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -44,13 +38,13 @@ import okhttp3.RequestBody;
  * 厕所状态界面 presenter
  * 需求:
  */
-public class HomeactivityPresenter extends BasePresenter<HomeactivityView> {
+public class HomePageAPresenter extends BasePresenter<HomePageAView> {
 
 
     private static final String TAG = "HomeactivityPresenter";
     private CleaningBeanDao cleaningBeanDao;
 
-    public HomeactivityPresenter(HomeactivityView view) {
+    public HomePageAPresenter(HomePageAView view) {
         attachView(view);
         cleaningBeanDao = BaseApplication.getInstances().getDaoSession().getCleaningBeanDao();
     }

+ 1 - 1
app/src/main/java/com/sunzee/mvp/homeactivity/HomeactivityView.java

@@ -8,7 +8,7 @@ import java.util.ArrayList;
 /**
  *  厕所状态 view
  */
-public interface HomeactivityView extends BaseView {
+public interface HomePageAView extends BaseView {
 
     /**
      * 更新日期

+ 2 - 3
app/src/main/java/com/sunzee/receiver/BootBroadcastReceiver.java

@@ -4,8 +4,7 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 
-import com.sunzee.ui.activity.AdvertisingActivity;
-import com.sunzee.ui.activity.HomePageActivity;
+import com.sunzee.ui.activity.HomePageAActivity;
 
 public class BootBroadcastReceiver extends BroadcastReceiver {
     static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@@ -13,7 +12,7 @@ public class BootBroadcastReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
         if (intent.getAction().equals(ACTION)) {
-            Intent mainActivityIntent = new Intent(context, HomePageActivity.class);  // 要启动的Activity
+            Intent mainActivityIntent = new Intent(context, HomePageAActivity.class);  // 要启动的Activity
             mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             context.startActivity(mainActivityIntent);
         }

+ 17 - 8
app/src/main/java/com/sunzee/service/MyIntentService.java

@@ -126,19 +126,28 @@ public class MyIntentService extends GTIntentService {
                 }
                 //全蹲位清洗,需要在开机的状态才能执行。
                 synchronized (MyService.sCleaningLocationList) {//多线程操作需要加上同步锁
-                    MyService.sCleaningLocationList.clear();
+                    if (MyService.sCleaningLocationList.size()>0) {//大于0的时候才需要处理。
+                        Integer integer = MyService.sCleaningLocationList.removeFirst();//如果清洗中,那么我们不能全部移除,否则清洗完毕的时候会漏掉一个厕所没有清洗,所以我们留存下来。在假如。
+                        MyService.sCleaningLocationList.clear();
+                        MyService. sCleaningLocationList.addFirst(integer);
+                    }
                     for (int i = 1; i <=MyService.TOTAL_SUM; i++) {
                         if (i==4) {
                             continue;
                         }
-                        MyService. sCleaningLocationList.addFirst(i);
+                        MyService. sCleaningLocationList.addLast(i);//从尾部添加。如果集合中已经存在呢?
+                    }
+                    if (!MyService.isCleanOK) {//清洗中,那麼我們就什麼都不做,如果不是清洗中,那麼我們需要進行復位。
+                        //开始清洗。
+                        //EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                        //復位成功後,會自己過去清洗的。所以我們不需要管他。
+                        EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                        ToastUtil.showToast("开始复位,准备开始全蹲位清洗,如果有人在里面使用,会等待人出来以后进行清洗。");
+                    }else{
+                        ToastUtil.showToast("已添加入清洗队列,等待本次清洗完成后开始清洗");
                     }
-                    //开始清洗。
-                    EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
-                }
 
-                Log.d(TAG, "onReceiveMessageData:clean ");
-                startClean(gson, geTuiBean, kind);
+                }
                 break;
             case "updateRule":
                 //更新定时清洗的任务
@@ -457,7 +466,7 @@ public class MyIntentService extends GTIntentService {
                 Log.d(TAG, "event: nak");
                 break;
             case disconnected:
-                SerialPortDevice device = new SerialPortDevice("/dev/ttyS2", "9600");
+                SerialPortDevice device = new SerialPortDevice(Global.dev, "9600");
                 SerialPortManager.getInstance().open(device);
                 Log.d(TAG, "event: disconnected");
                 break;

+ 72 - 16
app/src/main/java/com/sunzee/service/MyService.java

@@ -97,7 +97,7 @@ public class MyService extends Service {
     private boolean isRead = true;
     private boolean isRegularCleaning = false;
     private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter();
-    public final static int TOTAL_SUM = 6;
+    public final static int TOTAL_SUM = Hawk.get(Name.TOILETSNUMBER,2);
 
     //存储两个数据:是否上过厕所,一开始上厕所的时间是什么时候
     //CopyOnWriteArrayList并不是完全意义上的线程安全,如果涉及到remove操作,一定要谨慎处理。
@@ -107,7 +107,7 @@ public class MyService extends Service {
     //厕所序号从1开始。
     public static final LinkedList<Integer> sCleaningLocationList = new LinkedList<>();//存储要清洗的位置。
 
-    private static volatile boolean isCleanOK = false;
+    public static volatile boolean isCleanOK = false;
     private static volatile boolean isToiletClean = true;
     private volatile Integer last;
 
@@ -401,7 +401,31 @@ public class MyService extends Service {
                 /**
                  * 1.首先检查是否过期了,是否有次数
                  */
-                isCleaned();
+//                isCleaned();//todo 不需要金额也可以清洗
+                //全蹲位清洗,需要在开机的状态才能执行。
+                synchronized (MyService.sCleaningLocationList) {//多线程操作需要加上同步锁
+                    if (MyService.sCleaningLocationList.size()>0) {//大于0的时候才需要处理。
+                        Integer integer = MyService.sCleaningLocationList.removeFirst();//如果清洗中,那么我们不能全部移除,否则清洗完毕的时候会漏掉一个厕所没有清洗,所以我们留存下来。在假如。
+                        MyService.sCleaningLocationList.clear();
+                        MyService. sCleaningLocationList.addFirst(integer);
+                    }
+                    for (int i = 1; i <=MyService.TOTAL_SUM; i++) {
+                        if (i==4) {
+                            continue;
+                        }
+                        MyService. sCleaningLocationList.addLast(i);//从尾部添加。如果集合中已经存在呢?
+                    }
+                    if (!MyService.isCleanOK) {//清洗中,那麼我們就什麼都不做,如果不是清洗中,那麼我們需要進行復位。
+                        //开始清洗。
+                        //EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                        //復位成功後,會自己過去清洗的。所以我們不需要管他。
+                        EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                        ToastUtil.showToast("开始复位,准备开始全蹲位清洗,如果有人在里面使用,会等待人出来以后进行清洗。");
+                    }else{
+                        ToastUtil.showToast("已添加入清洗队列,等待本次清洗完成后开始清洗");
+                    }
+
+                }
                 break;
             case "updataParamSet":
                 if (!PreventSpeedClickUtil.isFastClick()) {
@@ -439,9 +463,11 @@ public class MyService extends Service {
                 if (!PreventSpeedClickUtil.isFastClick()) {
                     return;
                 }
-                //监听开机按钮的全蹲位清洗
-                cleanPositionNumX20((Integer)messageEvent.getData(),0);
-                cleanPositionNum(messageEvent.getData());
+                if (mThreadPoolMyservice != null) {
+                    //监听开机按钮的全蹲位清洗
+                    mThreadPoolMyservice.stopWriteMM3();
+                    mThreadPoolMyservice.startWriteMM3("M3");
+                }
                 break;
             default:
                 break;
@@ -530,7 +556,31 @@ public class MyService extends Service {
             public void onSuccess(HttpResult<String> model) {
                 Log.d(TAG, "getCleanReportonSuccess: " + model);
                 if ("success".equals(model.getData())) {
-                    startClean();
+                    //startClean();
+                    //全蹲位清洗,需要在开机的状态才能执行。
+                    synchronized (MyService.sCleaningLocationList) {//多线程操作需要加上同步锁
+                        if (MyService.sCleaningLocationList.size()>0) {//大于0的时候才需要处理。
+                            Integer integer = MyService.sCleaningLocationList.removeFirst();//如果清洗中,那么我们不能全部移除,否则清洗完毕的时候会漏掉一个厕所没有清洗,所以我们留存下来。在假如。
+                            MyService.sCleaningLocationList.clear();
+                            MyService. sCleaningLocationList.addFirst(integer);
+                        }
+                        for (int i = 1; i <=MyService.TOTAL_SUM; i++) {
+                            if (i==4) {
+                                continue;
+                            }
+                            MyService. sCleaningLocationList.addLast(i);//从尾部添加。如果集合中已经存在呢?
+                        }
+                        if (!MyService.isCleanOK) {//清洗中,那麼我們就什麼都不做,如果不是清洗中,那麼我們需要進行復位。
+                            //开始清洗。
+                            //EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                            //復位成功後,會自己過去清洗的。所以我們不需要管他。
+                            EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                            ToastUtil.showToast("开始复位,准备开始全蹲位清洗,如果有人在里面使用,会等待人出来以后进行清洗。");
+                        }else{
+                            ToastUtil.showToast("已添加入清洗队列,等待本次清洗完成后开始清洗");
+                        }
+
+                    }
                 } else {
                 }
             }
@@ -1279,6 +1329,7 @@ public class MyService extends Service {
                                                             sCleaningLocationList.removeFirst();
                                                         } else {
                                                             if ((last == 1 || last == 2 || last == 3) && (first == 4 || first == 5 || first == 6)) {
+                                                                cleanCount = 0;
                                                                 mThreadPoolMyservice.stopWriteMM3();
                                                                 mThreadPoolMyservice.startWriteMM3("M3");
                                                                 Log.d(TAG, "isClean: 开始复位4");
@@ -1347,9 +1398,12 @@ public class MyService extends Service {
                         mThreadPoolMyservice.startWriteMM3("M3");
                         return;
                     }
-                    cleanCount++;
-                    addTodayCleanCount(1, 0, 1);
-                    cleanPositionNumX20(position, 3);
+                    if (!isCleanOK) {//还没清洗的时候去处理
+                        cleanCount++;
+                        addTodayCleanCount(1, 0, 1);
+                        cleanPositionNumX20(position, 3);
+                    }
+
                 }
             } else {
                 //只是添加进来
@@ -1456,12 +1510,14 @@ public class MyService extends Service {
                                 return;
                             }
                         }
-                        cleanCount++;
-                        //清洗次数增加
-                        addTodayCleanCount(1, 0, 1);
-                        cleanPositionNumX20(number, 4);
-                        Log.d(TAG, "isClean開始清洗add: " + number);
-                        Log.d(TAG, "addCleanTimeisClean: " + "開始清洗");
+                        if (!isCleanOK) {//不再清洗的时候才去清洗。
+                            cleanCount++;
+                            //清洗次数增加
+                            addTodayCleanCount(1, 0, 1);
+                            cleanPositionNumX20(number, 4);
+                            Log.d(TAG, "isClean開始清洗add: " + number);
+                            Log.d(TAG, "addCleanTimeisClean: " + "開始清洗");
+                        }
                     }
                     holeInformation.setState(2);//改为2或者0都可以。
 

+ 1 - 1
app/src/main/java/com/sunzee/thread/advanceparameter/AdvanceParameterThreadType.java

@@ -1,5 +1,5 @@
 package com.sunzee.thread.advanceparameter;
-
+//进阶参数
 public interface AdvanceParameterThreadType {
     int runD426 = 426;
     int runD427 = 427;

+ 2 - 1
app/src/main/java/com/sunzee/thread/advanceparameter/ThreadPoolAdvanceParameter.java

@@ -68,9 +68,10 @@ public class ThreadPoolAdvanceParameter {
 
         mTaskRunD418 = new AdvanceParameterTask(AdvanceParameterThreadType.runD418);
         mScheduledFutureD418 = scheduled.scheduleAtFixedRate(mTaskRunD418, 10, 1000, TimeUnit.MILLISECONDS);
-
         mTaskRunD426 = new AdvanceParameterTask(AdvanceParameterThreadType.runD426);
         mScheduledFutureD426 = scheduled.scheduleAtFixedRate(mTaskRunD426, 10, 1000, TimeUnit.MILLISECONDS);
+
+
     }
     public void startReadD79() {
         mTaskRunD79 = new AdvanceParameterTask(AdvanceParameterThreadType.runD79);

+ 132 - 0
app/src/main/java/com/sunzee/thread/homepageA/homepage/HomepageATask.java

@@ -0,0 +1,132 @@
+package com.sunzee.thread.homepageA.homepage;
+
+import com.hboxs.serialport.SerialPortManager;
+import com.hboxs.serialport.SerialPortSendQueue;
+import com.hboxs.serialport.frame.ReadCommandFrame;
+import com.hboxs.serialport.frame.RstCommandFrame;
+import com.hboxs.serialport.frame.SetCommandFrame;
+import com.hboxs.serialport.frame.WriteCommandFrame;
+import com.hboxs.serialport.util.HexUtils;
+
+/**
+ * 长时间或者推送要执行的任务
+ */
+public class HomepageATask implements Runnable {
+
+    private int type;
+    private volatile String address;
+
+    public String getAddress() {
+        return address;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    private volatile int id;
+    private volatile boolean isRun;
+    private String name;
+    private String data;
+
+    public HomepageATask(int type) {
+        clearPlcQuee();
+        this.type = type;
+    }
+
+    public HomepageATask(int type, String address) {
+        clearPlcQuee();
+        this.type = type;
+        this.address = address;
+    }
+
+    public HomepageATask(int type, String address, int id) {
+        clearPlcQuee();
+        this.type = type;
+        this.address = address;
+        this.id = id;
+    }
+
+    public HomepageATask(int type, String address, String data) {
+        clearPlcQuee();
+        this.type = type;
+        this.address = address;
+        this.data = data;
+    }
+
+    public HomepageATask(int type, String address, String data, int id, String name) {
+        clearPlcQuee();
+        this.type = type;
+        this.address = address;
+        this.data = data;
+        this.id = id;
+        this.name = name;
+    }
+
+    private void clearPlcQuee() {
+        setIsRun(true);
+        SerialPortSendQueue.clear();
+    }
+
+    public void setIsRun(boolean isRun) {
+        this.isRun = isRun;
+    }
+
+    public boolean getIsRun() {
+        return isRun;
+    }
+
+    @Override
+    public void run() {
+        switch (type) {
+            case HomepageAThreadType.runD169:
+                runRead(2,169,"D169");
+                break;
+            case HomepageAThreadType.runD170:
+                runRead(2,170,"D170");
+                break;
+            case HomepageAThreadType.runD172:
+                runRead(2,172,"D172");
+                break;
+
+        }
+    }
+
+
+    private void runRead(int datLength,int id,String address) {
+        if (getIsRun()) {
+            SerialPortSendQueue.sendCommand(new ReadCommandFrame(address, datLength), id, address);
+        }
+    }
+
+
+
+    public void setAddressAndId(String address, int id) {
+        this.address = address;
+        this.id = id;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+}

+ 7 - 0
app/src/main/java/com/sunzee/thread/homepageA/homepage/HomepageAThreadType.java

@@ -0,0 +1,7 @@
+package com.sunzee.thread.homepageA.homepage;
+
+public interface HomepageAThreadType {
+   int runD169 = 169;
+   int runD170 = 170;
+   int runD172 = 172;
+}

+ 58 - 0
app/src/main/java/com/sunzee/thread/homepageA/homepage/ThreadPoolHomepageA.java

@@ -0,0 +1,58 @@
+package com.sunzee.thread.homepageA.homepage;
+
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 长时间或者推送要执行的线程池
+ */
+public class ThreadPoolHomepageA {
+    private ScheduledThreadPoolExecutor scheduled;
+
+    private ScheduledFuture<?>
+            mScheduledFutureD169,
+            mScheduledFutureD170, mScheduledFutureD172;
+    private HomepageATask
+            mTaskRunD169,
+            mTaskRunD170, mTaskRunD172;
+
+    public ThreadPoolHomepageA() {
+        scheduled = new ScheduledThreadPoolExecutor(3);
+        //设置线程池的策略  抛弃旧的任务
+        scheduled.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
+    }
+
+    public void startAll(){
+        mTaskRunD169 = new HomepageATask(HomepageAThreadType.runD169);
+        mScheduledFutureD169 = scheduled.scheduleAtFixedRate(mTaskRunD169, 0, 1000, TimeUnit.MILLISECONDS);
+
+        mTaskRunD170 = new HomepageATask(HomepageAThreadType.runD170);
+        mScheduledFutureD170 = scheduled.scheduleAtFixedRate(mTaskRunD170, 0, 1000, TimeUnit.MILLISECONDS);
+
+        mTaskRunD172 = new HomepageATask(HomepageAThreadType.runD172);
+        mScheduledFutureD172 = scheduled.scheduleAtFixedRate(mTaskRunD172, 0, 1000, TimeUnit.MILLISECONDS);
+    }
+
+    public static void stopRead(HomepageATask threadTask, ScheduledFuture<?> scheduledFuture1) {
+        if (threadTask != null) {
+            threadTask.setIsRun(false);
+        }
+        if (scheduledFuture1 != null) {
+            scheduledFuture1.cancel(true);
+        }
+    }
+
+    public void stopAll() {
+        stopRead(mTaskRunD169,mScheduledFutureD169);
+        stopRead(mTaskRunD170,mScheduledFutureD170);
+        stopRead(mTaskRunD172,mScheduledFutureD172);
+
+    }
+
+    public void stopALLRead() {
+        stopAll();
+    }
+
+}

+ 33 - 8
app/src/main/java/com/sunzee/ui/activity/HomeActivity.java

@@ -20,8 +20,9 @@ import android.telephony.gsm.GsmCellLocation;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.MenuItem;
+import android.view.MotionEvent;
 import android.view.View;
-import android.widget.Button;
+import android.view.inputmethod.InputMethodManager;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -134,6 +135,18 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
                 return true;
             }
         });
+        mNavigationView.setOnTouchListener(new View.OnTouchListener() {
+            @SuppressLint("ClickableViewAccessibility")
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                Log.d(TAG, "onClick: ");
+                //隐藏键盘
+                @SuppressLint("WrongConstant") InputMethodManager imm = (InputMethodManager)
+                        mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
+                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+                return false;
+            }
+        });
         mTvConnectionSystem.setOnClickListener(this);
         mTvUpdataAPK.setOnClickListener(this);
         mLlBlack.setOnClickListener(this);
@@ -170,7 +183,7 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
     }
 
     private void gotoAdvertisingActivity() {
-        startActivity(new Intent(HomeActivity.this, HomePageActivity.class));
+        startActivity(new Intent(HomeActivity.this, HomePageAActivity.class));
         finish();
     }
 
@@ -454,15 +467,27 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
                         }
                         //全蹲位清洗,需要在开机的状态才能执行。
                         synchronized (MyService.sCleaningLocationList) {//多线程操作需要加上同步锁
-                            MyService.sCleaningLocationList.clear();
-                            for (int i = 1; i <=MyService.TOTAL_SUM; i++) {
-                                if (i==4) {
+                            if (MyService.sCleaningLocationList.size() > 0) {//大于0的时候才需要处理。
+                                Integer integer = MyService.sCleaningLocationList.removeFirst();//如果清洗中,那么我们不能全部移除,否则清洗完毕的时候会漏掉一个厕所没有清洗,所以我们留存下来。在假如。
+                                MyService.sCleaningLocationList.clear();
+                                MyService.sCleaningLocationList.addFirst(integer);
+                            }
+                            for (int i = 1; i <= MyService.TOTAL_SUM+1; i++) {
+                                if (i == 4) {
                                     continue;
                                 }
-                                MyService. sCleaningLocationList.addFirst(i);
+                                MyService.sCleaningLocationList.addLast(i);//从尾部添加。如果集合中已经存在呢?
                             }
-                            //开始清洗。
-                            EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                            if (!MyService.isCleanOK) {//清洗中,那麼我們就什麼都不做,如果不是清洗中,那麼我們需要進行復位。
+                                //开始清洗。
+                                //EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                                //復位成功後,會自己過去清洗的。所以我們不需要管他。
+                                EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING, MyService.sCleaningLocationList.getFirst()));
+                                ToastUtil.showToast("开始复位,准备开始全蹲位清洗,如果有人在里面使用,会等待人出来以后进行清洗。");
+                            } else {
+                                ToastUtil.showToast("已添加入清洗队列,等待本次清洗完成后开始清洗");
+                            }
+
                         }
                         break;
                 }

+ 53 - 30
app/src/main/java/com/sunzee/ui/activity/HomePageActivity.java

@@ -6,14 +6,11 @@ import android.graphics.Color;
 import android.os.Bundle;
 import android.os.Handler;
 import android.support.annotation.Nullable;
-import android.text.format.DateFormat;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.KeyEvent;
-import android.view.SurfaceView;
 import android.view.View;
 import android.view.WindowManager;
-import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
@@ -21,50 +18,39 @@ import com.hboxs.serialport.frame.ResponseFrame;
 import com.hboxs.serialport.message.Message;
 import com.hboxs.serialport.util.AsciiUtils;
 import com.sunzee.R;
-import com.sunzee.base.BaseApplication;
 import com.sunzee.base.MvpActivity;
-import com.sunzee.db.CleaningBeanDao;
+import com.sunzee.model.Global;
 import com.sunzee.model.Heartbeat;
 import com.sunzee.model.HoleInformation;
 import com.sunzee.model.domain.CleaningBean;
 import com.sunzee.model.domain.ParameterBean;
-import com.sunzee.model.message.ApiMessageEvent;
-import com.sunzee.model.message.DownLoadMessageEvent;
-import com.sunzee.mvp.advertising.AdvertisingPresenter;
-import com.sunzee.mvp.advertising.AdvertisingView;
-import com.sunzee.mvp.homeactivity.HomeactivityPresenter;
-import com.sunzee.mvp.homeactivity.HomeactivityView;
+import com.sunzee.mvp.homeactivity.HomePageAPresenter;
+import com.sunzee.mvp.homeactivity.HomePageAView;
 import com.sunzee.service.MyService;
 import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
+import com.sunzee.thread.homepage.ThreadPoolHomepage;
+import com.sunzee.thread.homepageA.homepage.ThreadPoolHomepageA;
+import com.sunzee.utils.AdvacedUtil;
 import com.sunzee.utils.GeTuiUtil;
 import com.sunzee.utils.HexadecimalUtil;
 import com.sunzee.utils.LongClickUtils;
-import com.sunzee.utils.SimplePlayerUtils;
 import com.sunzee.utils.ToastUtil;
 import com.sunzee.utils.UiUtil;
-import com.wuxiaolong.androidutils.library.LogUtil;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
-import org.greenrobot.greendao.query.QueryBuilder;
-import org.greenrobot.greendao.query.WhereCondition;
 
-import java.io.File;
 import java.lang.ref.WeakReference;
-import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
 
 /**
  * 厕所状态 activity
  */
-public class HomePageActivity extends MvpActivity<HomeactivityPresenter> implements HomeactivityView {
+public class HomePageAActivity extends MvpActivity<HomePageAPresenter> implements HomePageAView {
 
     private static final String TAG = "AdvertisingActivity";
     private GeTuiUtil mGeTuiUtil;
@@ -73,6 +59,7 @@ public class HomePageActivity extends MvpActivity<HomeactivityPresenter> impleme
     private MyHandler myHandler;
     private TextView mTvEquipmentNo;
     private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter();
+    private ThreadPoolHomepageA threadPoolHomepageA = new ThreadPoolHomepageA();
     private TextView tvDate;
     private TextView tvWcToilets;
     private TextView tvWcUser;
@@ -85,6 +72,9 @@ public class HomePageActivity extends MvpActivity<HomeactivityPresenter> impleme
     private TextView tvOut;
     private TextView tvToiletdiagram1;
     private TextView tvToiletdiagram2;
+    private TextView tvAmmonia;
+    private TextView tvHumidity;
+    private TextView tvTemperature;
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -107,7 +97,7 @@ public class HomePageActivity extends MvpActivity<HomeactivityPresenter> impleme
         LongClickUtils.setLongClick(new Handler(), tvDate, 3000, new View.OnLongClickListener() {
             @Override
             public boolean onLongClick(View v) {
-                Intent intent = new Intent(HomePageActivity.this, LoginActivity.class);
+                Intent intent = new Intent(HomePageAActivity.this, LoginActivity.class);
                 startActivity(intent);
                 finish();
                 return false;
@@ -129,6 +119,9 @@ public class HomePageActivity extends MvpActivity<HomeactivityPresenter> impleme
         tvOut = findViewById(R.id.tv_out);
         tvToiletdiagram1 = findViewById(R.id.tv_toiletdiagram1);
         tvToiletdiagram2 = findViewById(R.id.tv_toiletdiagram2);
+        tvAmmonia = findViewById(R.id.tv_ammonia);
+        tvHumidity = findViewById(R.id.tv_humidity);
+        tvTemperature = findViewById(R.id.tv_temperature);
         //设备编号只显示6位
         mTvEquipmentNo = findViewById(R.id.tv_equipment_no1);
         if (Heartbeat.deviceId != null && Heartbeat.deviceId.length() > 7) {
@@ -142,6 +135,8 @@ public class HomePageActivity extends MvpActivity<HomeactivityPresenter> impleme
         mPoolAdvanceParameter.startALLRead();
         mPoolAdvanceParameter.stopReadD403();
         mPoolAdvanceParameter.startReadD403();
+        threadPoolHomepageA.stopAll();
+        threadPoolHomepageA.startAll();
      //   mvpPresenter.createBox(6);
     }
 
@@ -173,11 +168,12 @@ public class HomePageActivity extends MvpActivity<HomeactivityPresenter> impleme
     @Override
     protected void onDestroy() {
         super.onDestroy();
+        stopRefreshTime();
         mPoolAdvanceParameter.stopAll();
+        threadPoolHomepageA.stopALLRead();
         EventBus.getDefault().unregister(this);
         myHandler.removeCallbacksAndMessages(null);
         myHandler = null;
-        stopRefreshTime();
     }
 
     private long mPressTime = 0L;
@@ -229,7 +225,17 @@ public class HomePageActivity extends MvpActivity<HomeactivityPresenter> impleme
                         mPoolAdvanceParameter.stopReadD403();
                         Log.d(TAG, "11event: " + (int) HexadecimalUtil.hex2dec(results.get(0)));
                         mvpPresenter.sendPositionNum((int) HexadecimalUtil.hex2dec(results.get(0)));
-                    } else {
+                    }else if ("D169".equals(name)) {
+                        Heartbeat.cabinetTm = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)) / 10);
+                        tvTemperature.setText(Heartbeat.cabinetTm+"°C");
+                    }else if ("D170".equals(name)) {
+                        Heartbeat.cabinetHd= String.valueOf(HexadecimalUtil.hex2dec(results.get(0)) / 10);
+                        tvHumidity.setText(Heartbeat.cabinetHd+"%");
+                    }else if ("D172".equals(name)) {
+                        String cabinetTm = String.valueOf(getRealData(results));
+                        tvAmmonia.setText(cabinetTm);
+
+                    }else {
                         mvpPresenter.setAdvanced(name, results, mPoolAdvanceParameter);
                     }
                 }
@@ -237,9 +243,26 @@ public class HomePageActivity extends MvpActivity<HomeactivityPresenter> impleme
         }
     }
 
+    private String getRealData(ArrayList<String> results) {
+        String realData = "";
+        String s = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+        Integer integer = Integer.valueOf(s);
+        long l = HexadecimalUtil.hex2dec(results.get(0));
+        //2进制
+        String s1 = Integer.toBinaryString(integer);
+        if (s1.length() < 16) {
+            //正数
+            realData = String.valueOf(Math.round((l/ Global.num)*10));
+        } else {
+            //负数
+            realData = AdvacedUtil.getRealData(s1);
+        }
+        return realData;
+    }
+
     @Override
-    protected HomeactivityPresenter createPresenter() {
-        HomeactivityPresenter advertisingPresenter = new HomeactivityPresenter(this);
+    protected HomePageAPresenter createPresenter() {
+        HomePageAPresenter advertisingPresenter = new HomePageAPresenter(this);
         advertisingPresenter.requstCleanRule();
         advertisingPresenter.requestCleanTimeAndRemaining();
         return advertisingPresenter;
@@ -250,16 +273,16 @@ public class HomePageActivity extends MvpActivity<HomeactivityPresenter> impleme
      */
     public static class MyHandler extends Handler {
         //持有弱引用HandlerActivity,GC回收时会被回收掉.
-        private final WeakReference<HomePageActivity> mActivty;
+        private final WeakReference<HomePageAActivity> mActivty;
 
-        public MyHandler(HomePageActivity activity) {
-            mActivty = new WeakReference<HomePageActivity>(activity);
+        public MyHandler(HomePageAActivity activity) {
+            mActivty = new WeakReference<HomePageAActivity>(activity);
         }
 
         @SuppressLint("ResourceAsColor")
         @Override
         public void handleMessage(android.os.Message msg) {
-            HomePageActivity activity = mActivty.get();
+            HomePageAActivity activity = mActivty.get();
             switch (msg.what) {
                 case 1:
                     long sysTime = System.currentTimeMillis();//获取系统时间

+ 1 - 1
app/src/main/java/com/sunzee/ui/activity/LoginActivity.java

@@ -102,7 +102,7 @@ public class LoginActivity extends MvpActivity<LoginPresenter> implements LoginV
     }
 
     private void gotoAdvertisingActivity() {
-        startActivity(new Intent(LoginActivity.this, HomePageActivity.class));
+        startActivity(new Intent(LoginActivity.this, HomePageAActivity.class));
         finish();
     }
 

+ 2 - 1
app/src/main/java/com/sunzee/ui/fragment/AdvanceParameterFragment.java

@@ -27,6 +27,7 @@ import com.sunzee.R;
 import com.sunzee.adapter.AdvanceParameterAdapter;
 import com.sunzee.base.BaseApplication;
 import com.sunzee.base.MvpFragment;
+import com.sunzee.model.Global;
 import com.sunzee.mvp.advanceparameter.AdvanceParameterPresenter;
 import com.sunzee.mvp.advanceparameter.AdvanceParameterView;
 import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
@@ -187,7 +188,7 @@ public class AdvanceParameterFragment extends MvpFragment<AdvanceParameterPresen
             case nak:
                 break;
             case disconnected:
-                SerialPortDevice device = new SerialPortDevice("/dev/ttyS2", "9600");
+                SerialPortDevice device = new SerialPortDevice(Global.dev, "9600");
                 SerialPortManager.getInstance().open(device);
                 break;
             case response:

+ 2 - 1
app/src/main/java/com/sunzee/ui/fragment/DebugFragment.java

@@ -25,6 +25,7 @@ import com.sunzee.adapter.DebugParameterXAdapter;
 import com.sunzee.adapter.DebugParameterYAdapter;
 import com.sunzee.base.BaseApplication;
 import com.sunzee.base.MvpFragment;
+import com.sunzee.model.Global;
 import com.sunzee.mvp.debug.DebugPresenter;
 import com.sunzee.mvp.debug.DebugView;
 import com.sunzee.thread.debugparameter.ThreadPoolDebugParameter;
@@ -142,7 +143,7 @@ public class DebugFragment extends MvpFragment<DebugPresenter> implements DebugV
             case nak:
                 break;
             case disconnected:
-                SerialPortDevice device = new SerialPortDevice("/dev/ttyS2", "9600");
+                SerialPortDevice device = new SerialPortDevice(Global.dev, "9600");
                 SerialPortManager.getInstance().open(device);
                 break;
             case response:

+ 2 - 1
app/src/main/java/com/sunzee/ui/fragment/GeneralParameterFragment.java

@@ -21,6 +21,7 @@ import com.sunzee.R;
 import com.sunzee.adapter.GeneralParameterAdapter;
 import com.sunzee.base.BaseApplication;
 import com.sunzee.base.MvpFragment;
+import com.sunzee.model.Global;
 import com.sunzee.mvp.generalparameter.GeneralParameterPresenter;
 import com.sunzee.mvp.generalparameter.GeneralParameterView;
 import com.sunzee.thread.generalparameter.ThreadPoolGeneralParameter;
@@ -130,7 +131,7 @@ public class GeneralParameterFragment extends MvpFragment<GeneralParameterPresen
             case nak:
                 break;
             case disconnected:
-                SerialPortDevice device = new SerialPortDevice("/dev/ttyS2", "9600");
+                SerialPortDevice device = new SerialPortDevice(Global.dev, "9600");
                 SerialPortManager.getInstance().open(device);
                 break;
             case response:

+ 30 - 6
app/src/main/java/com/sunzee/ui/fragment/HomepageFragment.java

@@ -19,6 +19,9 @@ import com.hboxs.serialport.util.HexUtils;
 import com.orhanobut.hawk.Hawk;
 import com.sunzee.R;
 import com.sunzee.base.MvpFragment;
+import com.sunzee.model.Global;
+import com.sunzee.model.domain.Name;
+import com.sunzee.model.message.ApiMessageEvent;
 import com.sunzee.mvp.homepage.HomePagePresenter;
 import com.sunzee.mvp.homepage.HomePageView;
 import com.sunzee.service.MyService;
@@ -68,18 +71,18 @@ public class HomepageFragment extends MvpFragment<HomePagePresenter> implements
                     return;
                 }
                 Map<String, List<Float>> location = Hawk.get("location", null);
-                Log.d(TAG, "onClick: "+location);
+                Log.d(TAG, "onClick: " + location);
                 if (location != null) {
                     //给控件新位置,替换之前的位置。
                     for (String s : location.keySet()) {
-                        Log.d(TAG, "onClick: "+s );
+                        Log.d(TAG, "onClick: " + s);
                         if (integerMap.containsKey(s)) {
                             location.put(s, integerMap.get(s));
                         }
                     }
                     //没有变化过位置的也加进去。
                     for (String s : integerMap.keySet()) {
-                        Log.d(TAG, "onClick: "+s );
+                        Log.d(TAG, "onClick: " + s);
                         if (!location.containsKey(s)) {
                             location.put(s, integerMap.get(s));
                         }
@@ -126,7 +129,7 @@ public class HomepageFragment extends MvpFragment<HomePagePresenter> implements
                 Log.d(TAG, "event: nak");
                 break;
             case disconnected:
-                SerialPortDevice device = new SerialPortDevice("/dev/ttyS2", "9600");
+                SerialPortDevice device = new SerialPortDevice(Global.dev, "9600");
                 SerialPortManager.getInstance().open(device);
                 Log.d(TAG, "event: disconnected");
                 break;
@@ -144,7 +147,7 @@ public class HomepageFragment extends MvpFragment<HomePagePresenter> implements
         //为控件设置数据
         mCustomViewGrounp = inflate.findViewById(R.id.cv_custom);
         List<String> list = new ArrayList<>();
-        for (int i = 0; i < MyService.TOTAL_SUM; i++) {//厕所个数可控。
+        for (int i = 0; i < MyService.TOTAL_SUM+1; i++) {//厕所个数可控。
             if (i == 6) {
                 list.add("走廊");
                 continue;
@@ -210,7 +213,28 @@ public class HomepageFragment extends MvpFragment<HomePagePresenter> implements
                         }
                         //判断是否过期,或者是否次数以到。
                         showLoading();
-                        mvpPresenter.isCanWrite();
+                        Log.d(TAG, "onClickListener: " + cleaningLocation);
+//                        mvpPresenter.isCanWrite();// todo 判断是否有钱才可以清洗,我们现在使用的是无钱模式。
+                        startClean();
+                        /*//全蹲位清洗,需要在开机的状态才能执行。
+                        synchronized (MyService.sCleaningLocationList) {//多线程操作需要加上同步锁
+                            if (MyService.sCleaningLocationList.size() > 0) {//大于0的时候才需要处理。
+                                Integer integer = MyService.sCleaningLocationList.removeFirst();//如果清洗中,那么我们不能全部移除,否则清洗完毕的时候会漏掉一个厕所没有清洗,所以我们留存下来。在假如。
+                                MyService.sCleaningLocationList.clear();
+                                MyService.sCleaningLocationList.addFirst(integer);
+                            }
+                            MyService.sCleaningLocationList.addLast(cleaningLocation);//从尾部添加。如果集合中已经存在呢?
+                            if (!MyService.isCleanOK) {//清洗中,那麼我們就什麼都不做,如果不是清洗中,那麼我們需要進行復位。
+                                //开始清洗。
+                                //EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING,MyService. sCleaningLocationList.getFirst()));
+                                //復位成功後,會自己過去清洗的。所以我們不需要管他。
+                                EventBus.getDefault().post(new ApiMessageEvent(Name.ALLCLEANING, MyService.sCleaningLocationList.getFirst()));
+                                ToastUtil.showToast("开始复位,准备开始清洗,如果有人在里面使用,会等待人出来以后进行清洗。");
+                            } else {
+                                ToastUtil.showToast("已添加入清洗队列,等待本次清洗完成后开始清洗");
+                            }
+
+                        }*/
                         mStartCleaningDialog.dismiss();
                         break;
                     case R.id.btn_cancel:

+ 52 - 18
app/src/main/java/com/sunzee/ui/fragment/OtherFragment.java

@@ -1,5 +1,6 @@
 package com.sunzee.ui.fragment;
 
+import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.IntentFilter;
 import android.media.AudioManager;
@@ -13,12 +14,16 @@ import android.support.annotation.Nullable;
 import android.telephony.TelephonyManager;
 import android.util.Log;
 import android.view.LayoutInflater;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
 import android.widget.RadioButton;
+import android.widget.RelativeLayout;
 import android.widget.SeekBar;
 
 import com.orhanobut.hawk.Hawk;
@@ -31,15 +36,13 @@ import com.sunzee.mvp.other.OtherPresenter;
 import com.sunzee.mvp.other.OtherView;
 import com.sunzee.receiver.NetworkConnectChangedReceiver;
 import com.sunzee.ui.dialog.WifiDialog;
+import com.sunzee.utils.ToastUtil;
+import com.sunzee.utils.UiUtil;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
 /**
  * 其他页界面 fragment
  * 1.4G和wifi的切换的功能
@@ -58,6 +61,11 @@ public class OtherFragment extends MvpFragment<OtherPresenter> implements OtherV
     private RadioButton mRbMobileNetWork;
     private RadioButton mRbWifi;
     private NetworkConnectChangedReceiver receiver;
+    private RelativeLayout rlOther;
+    private Button btnPlcContentUdate;
+    private Button btnSquattingContentUdate;
+    private EditText etPlcContent;
+    private EditText etSquattingContent;
 
     @Nullable
     @Override
@@ -75,6 +83,20 @@ public class OtherFragment extends MvpFragment<OtherPresenter> implements OtherV
         mSbVoice.setOnSeekBarChangeListener(this);
         mRbMobileNetWork.setOnClickListener(this);
         mRbWifi.setOnClickListener(this);
+        rlOther.setOnTouchListener(new View.OnTouchListener() {
+            @SuppressLint("ClickableViewAccessibility")
+            @Override
+            public boolean onTouch(View v, MotionEvent event) {
+                Log.d(TAG, "onClick: ");
+                //隐藏键盘
+                @SuppressLint("WrongConstant") InputMethodManager imm = (InputMethodManager)
+                        mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
+                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
+                return false;
+            }
+        });
+        btnPlcContentUdate.setOnClickListener(this);
+        btnSquattingContentUdate.setOnClickListener(this);
     }
 
     private void initView(View inflate) {
@@ -82,6 +104,13 @@ public class OtherFragment extends MvpFragment<OtherPresenter> implements OtherV
         mSbVoice = inflate.findViewById(R.id.sb_voice);
         mRbMobileNetWork = inflate.findViewById(R.id.rb_4g);
         mRbWifi = inflate.findViewById(R.id.rb_wifi);
+        rlOther = inflate.findViewById(R.id.rl_other);
+        btnPlcContentUdate = inflate.findViewById(R.id.btn_plc_content_udate);
+        btnSquattingContentUdate = inflate.findViewById(R.id.btn_squatting_content_udate);
+        etPlcContent = inflate.findViewById(R.id.et_plc_content);
+        etSquattingContent = inflate.findViewById(R.id.et_squatting_content);
+        etPlcContent.setText(Hawk.get(Name.SERIALNUMBER, "4"));
+        etSquattingContent.setText(Hawk.get(Name.TOILETSNUMBER,2)+"");
     }
 
     @Override
@@ -294,21 +323,26 @@ public class OtherFragment extends MvpFragment<OtherPresenter> implements OtherV
                 mvpPresenter.toggleWiFi(BaseApplication.getContext(), true);
                 showWifiDialog();
                 break;
+            case R.id.btn_plc_content_udate:
+                String plcContent = etPlcContent.getText().toString().trim();
+                if ("".equals(plcContent)) {
+                    ToastUtil.showToast("请输入串口号");
+                    break;
+                }
+                Hawk.put(Name.SERIALNUMBER,plcContent);
+                ToastUtil.showToast(UiUtil.getStringRes(R.string.update_success));
+                break;
+            case R.id.btn_squatting_content_udate:
+                String squattingContent = etSquattingContent.getText().toString().trim();
+                if ("".equals(squattingContent)) {
+                    ToastUtil.showToast("请输入个数");
+                    break;
+                }
+                Hawk.put(Name.TOILETSNUMBER,Integer.valueOf(squattingContent));
+                ToastUtil.showToast(UiUtil.getStringRes(R.string.update_success));
+                break;
         }
     }
-    /**
-     * 隐藏软键盘
-     */
-    private void hideSoftInput() {
-        View v = getActivity().getCurrentFocus();
-        if (v != null && v.getWindowToken() != null) {
-            InputMethodManager manager = (InputMethodManager) getContext()
-                    .getSystemService(Context.INPUT_METHOD_SERVICE);
-            boolean isOpen = manager.isActive();
-            if (isOpen) {
-                manager.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
-            }
-        }
-    }
+
 
 }

+ 22 - 0
app/src/main/res/drawable-xhdpi/shape_radio_thumb_other.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval"
+    android:useLevel="false"
+    >
+    <solid android:color="#FFA632" />
+
+    <stroke
+        android:width="10dp"
+        android:color="#FFA632" />
+
+    <size android:height="@dimen/dp_16"
+        android:width="@dimen/dp_16"
+        />
+    <corners
+        android:bottomLeftRadius="360dp"
+        android:bottomRightRadius="360dp"
+        android:topLeftRadius="360dp"
+        android:topRightRadius="360dp" />
+
+</shape>

+ 22 - 0
app/src/main/res/drawable/shape_radio_red.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval"
+    android:useLevel="false"
+    >
+    <solid android:color="#011f4b" />
+
+    <stroke
+        android:width="6dp"
+        android:color="@color/color_red" />
+
+    <size android:height="@dimen/dp_16"
+        android:width="@dimen/dp_16"
+        />
+    <corners
+        android:bottomLeftRadius="360dp"
+        android:bottomRightRadius="360dp"
+        android:topLeftRadius="360dp"
+        android:topRightRadius="360dp" />
+
+</shape>

+ 0 - 1
app/src/main/res/drawable/shape_radio_thumb.xml

@@ -5,7 +5,6 @@
     android:useLevel="false"
     >
     <solid android:color="#011f4b" />
-
     <stroke
         android:width="6dp"
         android:color="#FFA632" />

+ 59 - 9
app/src/main/res/layout/activity_homeactivity.xml

@@ -140,40 +140,90 @@
 
     <LinearLayout
         android:id="@+id/ll_ammonia"
-        android:gravity="center"
+        android:gravity="center_vertical"
         android:layout_marginTop="@dimen/dp_42"
-        android:layout_width="@dimen/dp_88"
+        android:layout_width="@dimen/dp_198"
         android:layout_height="@dimen/dp_60"
         android:layout_marginLeft="@dimen/dp_20"
         android:layout_alignTop="@id/tv_date"
         android:layout_toRightOf="@id/ll_wccount"
-        android:orientation="vertical">
+        android:orientation="horizontal">
 
         <LinearLayout
-            android:layout_width="@dimen/dp_60"
-            android:layout_height="@dimen/dp_60"
+            android:layout_width="@dimen/dp_51"
+            android:layout_height="@dimen/dp_51"
             android:background="@drawable/shape_radio_thumb"
             android:gravity="center"
+            android:layout_marginRight="@dimen/dp_22"
             android:orientation="vertical">
 
             <TextView
+                android:id="@+id/tv_ammonia"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="5.6PM"
                 android:textColor="#FFA632"
-                android:textSize="@dimen/sp_14" />
+                android:textSize="@dimen/sp_12" />
 
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="氨气"
                 android:textColor="#FFA632"
-                android:textSize="@dimen/sp_10" />
+                android:textSize="@dimen/sp_8" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="@dimen/dp_51"
+            android:layout_height="@dimen/dp_51"
+            android:background="@drawable/shape_radio_red"
+            android:gravity="center"
+
+            android:layout_marginRight="@dimen/dp_22"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/tv_temperature"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="30°C"
+                android:textColor="@color/color_red"
+                android:textSize="@dimen/sp_12" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="温度"
+                android:textColor="@color/color_red"
+                android:textSize="@dimen/sp_8" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="@dimen/dp_51"
+            android:layout_height="@dimen/dp_51"
+            android:background="@drawable/shape_radio_thumbblue"
+            android:gravity="center"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/tv_humidity"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="39%"
+                android:textColor="#32A8FF"
+                android:textSize="@dimen/sp_12" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="湿度"
+                android:textColor="#32A8FF"
+                android:textSize="@dimen/sp_8" />
         </LinearLayout>
     </LinearLayout>
 
 
-    <LinearLayout
+    <!--<LinearLayout
         android:id="@+id/ll_environment"
         android:gravity="center"
         android:layout_marginTop="@dimen/dp_42"
@@ -206,7 +256,7 @@
                 android:textColor="#32A8FF"
                 android:textSize="@dimen/sp_10" />
         </LinearLayout>
-    </LinearLayout>
+    </LinearLayout>-->
 
 
     <LinearLayout

+ 302 - 180
app/src/main/res/layout/fragment_other.xml

@@ -8,185 +8,307 @@
     android:focusableInTouchMode="true"
     android:gravity="center">
 
-    <TextView
-
-        android:id="@+id/tv_net_choose"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="@dimen/dp_20"
-        android:layout_marginTop="@dimen/dp_40"
-        android:text="@string/network_selection"
-        android:textColor="@color/logo_blue"
-        android:textSize="@dimen/dp_12" />
-
-    <RadioGroup
-        android:id="@+id/rg_other"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="@dimen/dp_20"
-        android:layout_toRightOf="@id/tv_net_choose"
-        android:orientation="horizontal">
-
-        <RadioButton
-            android:id="@+id/rb_4g"
-            android:layout_width="@dimen/dp_94"
-            android:layout_height="@dimen/dp_50"
-            android:layout_marginLeft="@dimen/dp_30"
-            android:background="@drawable/selector_net_bg"
-            android:button="@null"
-            android:checked="true"
-            android:gravity="center"
-            android:text="4G"
-            android:textColor="@color/logo_blue"
-            android:textSize="@dimen/sp_12" />
-
-        <RadioButton
-            android:id="@+id/rb_wifi"
-            android:layout_width="@dimen/dp_94"
-            android:layout_height="@dimen/dp_50"
-            android:layout_marginLeft="@dimen/dp_30"
-            android:background="@drawable/selector_net_bg"
-            android:button="@null"
-            android:gravity="center"
-            android:text="WIFI"
-            android:textColor="@color/logo_blue"
-            android:textSize="@dimen/sp_12" />
-    </RadioGroup>
-
-    <TextView
-        android:id="@+id/tv_screen_light"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@id/tv_net_choose"
-        android:layout_marginLeft="@dimen/dp_20"
-        android:layout_marginTop="@dimen/dp_40"
-        android:text="@string/bright"
-        android:textColor="@color/logo_blue"
-        android:textSize="@dimen/dp_12" />
-
-    <SeekBar
-        android:id="@+id/sb_light"
-        android:layout_width="@dimen/dp_192"
-        android:layout_height="@dimen/dp_16"
-        android:layout_below="@id/tv_net_choose"
-        android:layout_marginLeft="@dimen/dp_20"
-        android:layout_marginTop="@dimen/dp_40"
-        android:layout_toRightOf="@id/tv_screen_light"
-        android:max="100"
-        android:maxHeight="@dimen/dp_8"
-        android:minHeight="@dimen/dp_8"
-        android:progressDrawable="@drawable/seekbar_progress_drawable"
-        android:splitTrack="false"
-        android:thumb="@drawable/shape_radio_thumb" />
-
-    <TextView
-        android:id="@+id/tv_system_voice"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@id/tv_screen_light"
-        android:layout_marginLeft="@dimen/dp_20"
-        android:layout_marginTop="@dimen/dp_40"
-        android:text="@string/volume"
-        android:textColor="@color/logo_blue"
-        android:textSize="@dimen/dp_12" />
-
-    <SeekBar
-        android:id="@+id/sb_voice"
-        android:layout_width="@dimen/dp_192"
-        android:layout_height="@dimen/dp_16"
-        android:layout_below="@id/tv_screen_light"
-        android:layout_marginLeft="@dimen/dp_20"
-        android:layout_marginTop="@dimen/dp_40"
-        android:layout_toRightOf="@id/tv_system_voice"
-        android:max="100"
-        android:maxHeight="@dimen/dp_8"
-        android:minHeight="@dimen/dp_8"
-        android:progressDrawable="@drawable/seekbar_progress_drawable"
-        android:splitTrack="false"
-        android:thumb="@drawable/shape_radio_thumb" />
-
-    <TextView
-        android:id="@+id/tv_robot_contacts"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_below="@id/tv_system_voice"
-        android:layout_marginLeft="@dimen/dp_20"
-        android:layout_marginTop="@dimen/dp_40"
-        android:text="@string/contact"
-        android:textColor="@color/logo_blue"
-        android:textSize="@dimen/dp_12" />
-
-    <TextView
-        android:id="@+id/tv_contacts"
-        android:layout_width="@dimen/dp_52"
-        android:layout_height="@dimen/dp_22"
-        android:layout_below="@id/tv_system_voice"
-        android:layout_marginLeft="@dimen/dp_20"
-        android:layout_marginTop="@dimen/dp_40"
-        android:layout_toRightOf="@id/tv_robot_contacts"
-        android:background="@drawable/shape_lt_lb"
-        android:gravity="center"
-        android:text="@string/contact1"
-        android:textColor="@color/white"
-        android:textSize="@dimen/dp_8" />
-
-    <EditText
-
-        android:id="@+id/et_contract"
-        android:layout_width="@dimen/dp_70"
-        android:layout_height="@dimen/dp_22"
-        android:layout_below="@id/tv_system_voice"
-        android:layout_marginTop="@dimen/dp_40"
-        android:layout_toRightOf="@id/tv_contacts"
-        android:background="@drawable/shape_password_rounded_rectangle"
-        android:hint="请输入联系人"
-        android:paddingLeft="@dimen/dp_2"
-        android:textColor="@color/gray"
-        android:textColorHint="@color/gray"
-        android:textSize="@dimen/dp_7" />
-
-    <TextView
-        android:id="@+id/tv_way_contacts"
-        android:layout_width="@dimen/dp_52"
-        android:layout_height="@dimen/dp_22"
-        android:layout_below="@id/tv_system_voice"
-        android:layout_marginLeft="@dimen/dp_20"
-        android:layout_marginTop="@dimen/dp_40"
-        android:layout_toRightOf="@id/et_contract"
-        android:background="@drawable/shape_lt_lb"
-        android:gravity="center"
-        android:text="@string/contact_phone_number"
-        android:textColor="@color/white"
-        android:textSize="@dimen/dp_8" />
-
-    <EditText
-        android:id="@+id/et_way_contacts"
-        android:layout_width="@dimen/dp_70"
-        android:layout_height="@dimen/dp_22"
-        android:layout_below="@id/tv_system_voice"
-        android:layout_marginTop="@dimen/dp_40"
-        android:layout_toRightOf="@id/tv_way_contacts"
-        android:background="@drawable/shape_password_rounded_rectangle"
-        android:hint="@string/enter_contact_number"
-        android:inputType="number"
-        android:paddingLeft="@dimen/dp_2"
-        android:textColor="@color/gray"
-        android:textColorHint="@color/gray"
-        android:textSize="@dimen/dp_7" />
-
-    <Button
-        android:id="@+id/btn_contract_update"
-        android:layout_width="@dimen/dp_44"
-        android:layout_height="@dimen/dp_22"
-        android:layout_below="@id/tv_system_voice"
-        android:layout_marginLeft="@dimen/dp_15"
-        android:layout_marginTop="@dimen/dp_40"
-        android:layout_toRightOf="@id/et_way_contacts"
-        android:background="@drawable/shape_other_rounded_rectangle"
-        android:text="@string/update"
-        android:textColor="@color/logo_blue"
-        android:textSize="@dimen/dp_8" />
-
-    <!--    </RelativeLayot>-->
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/dp_300"
+        android:layout_marginTop="@dimen/dp_20">
+
+
+        <RelativeLayout
+            android:id="@+id/rl_other"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:paddingBottom="@dimen/dp_10">
+
+            <TextView
+
+                android:id="@+id/tv_net_choose"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_40"
+                android:text="@string/network_selection"
+                android:textColor="@color/logo_blue"
+                android:textSize="@dimen/dp_12" />
+
+            <RadioGroup
+                android:id="@+id/rg_other"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/dp_20"
+                android:layout_toRightOf="@id/tv_net_choose"
+                android:orientation="horizontal">
+
+                <RadioButton
+                    android:id="@+id/rb_4g"
+                    android:layout_width="@dimen/dp_94"
+                    android:layout_height="@dimen/dp_50"
+                    android:layout_marginLeft="@dimen/dp_30"
+                    android:background="@drawable/selector_net_bg"
+                    android:button="@null"
+                    android:checked="true"
+                    android:gravity="center"
+                    android:text="4G"
+                    android:textColor="@color/logo_blue"
+                    android:textSize="@dimen/sp_12" />
+
+                <RadioButton
+                    android:id="@+id/rb_wifi"
+                    android:layout_width="@dimen/dp_94"
+                    android:layout_height="@dimen/dp_50"
+                    android:layout_marginLeft="@dimen/dp_30"
+                    android:background="@drawable/selector_net_bg"
+                    android:button="@null"
+                    android:gravity="center"
+                    android:text="WIFI"
+                    android:textColor="@color/logo_blue"
+                    android:textSize="@dimen/sp_12" />
+            </RadioGroup>
+
+            <TextView
+                android:id="@+id/tv_screen_light"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/tv_net_choose"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_40"
+                android:text="@string/bright"
+                android:textColor="@color/logo_blue"
+                android:textSize="@dimen/dp_12" />
+
+            <SeekBar
+                android:id="@+id/sb_light"
+                android:layout_width="@dimen/dp_192"
+                android:layout_height="@dimen/dp_16"
+                android:layout_below="@id/tv_net_choose"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_40"
+                android:layout_toRightOf="@id/tv_screen_light"
+                android:max="100"
+                android:maxHeight="@dimen/dp_8"
+                android:minHeight="@dimen/dp_8"
+                android:progressDrawable="@drawable/seekbar_progress_drawable"
+                android:splitTrack="false"
+                android:thumb="@drawable/shape_radio_thumb_other" />
+
+            <TextView
+                android:id="@+id/tv_system_voice"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/tv_screen_light"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_40"
+                android:text="@string/volume"
+                android:textColor="@color/logo_blue"
+                android:textSize="@dimen/dp_12" />
+
+            <SeekBar
+                android:id="@+id/sb_voice"
+                android:layout_width="@dimen/dp_192"
+                android:layout_height="@dimen/dp_16"
+                android:layout_below="@id/tv_screen_light"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_40"
+                android:layout_toRightOf="@id/tv_system_voice"
+                android:max="100"
+                android:maxHeight="@dimen/dp_8"
+                android:minHeight="@dimen/dp_8"
+                android:progressDrawable="@drawable/seekbar_progress_drawable"
+                android:splitTrack="false"
+                android:thumb="@drawable/shape_radio_thumb_other" />
+
+            <TextView
+                android:id="@+id/tv_robot_contacts"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/tv_system_voice"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_40"
+                android:text="@string/contact"
+                android:textColor="@color/logo_blue"
+                android:textSize="@dimen/dp_12" />
+
+            <TextView
+                android:id="@+id/tv_contacts"
+                android:layout_width="@dimen/dp_52"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/tv_system_voice"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_40"
+                android:layout_toRightOf="@id/tv_robot_contacts"
+                android:background="@drawable/shape_lt_lb"
+                android:gravity="center"
+                android:text="@string/contact1"
+                android:textColor="@color/white"
+                android:textSize="@dimen/dp_8" />
+
+            <EditText
+
+                android:id="@+id/et_contract"
+                android:layout_width="@dimen/dp_70"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/tv_system_voice"
+                android:layout_marginTop="@dimen/dp_40"
+                android:layout_toRightOf="@id/tv_contacts"
+                android:background="@drawable/shape_rt_rb"
+                android:hint="请输入联系人"
+                android:paddingStart="@dimen/dp_5"
+                android:paddingLeft="@dimen/dp_2"
+                android:textColor="@color/colorHint"
+                android:textColorHint="@color/colorHint"
+                android:textSize="@dimen/dp_7" />
+
+            <TextView
+                android:id="@+id/tv_way_contacts"
+                android:layout_width="@dimen/dp_52"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/tv_system_voice"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_40"
+                android:layout_toRightOf="@id/et_contract"
+                android:background="@drawable/shape_lt_lb"
+                android:gravity="center"
+                android:text="@string/contact_phone_number"
+                android:textColor="@color/white"
+                android:textSize="@dimen/dp_8" />
+
+            <EditText
+                android:id="@+id/et_way_contacts"
+                android:layout_width="@dimen/dp_70"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/tv_system_voice"
+                android:layout_marginTop="@dimen/dp_40"
+                android:layout_toRightOf="@id/tv_way_contacts"
+                android:background="@drawable/shape_rt_rb"
+                android:hint="@string/enter_contact_number"
+                android:paddingStart="@dimen/dp_5"
+                android:inputType="number"
+                android:paddingLeft="@dimen/dp_2"
+                android:textColor="@color/colorHint"
+                android:textColorHint="@color/colorHint"
+                android:textSize="@dimen/dp_7" />
+
+            <Button
+                android:id="@+id/btn_contract_update"
+                android:layout_width="@dimen/dp_44"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/tv_system_voice"
+                android:layout_marginLeft="@dimen/dp_15"
+                android:layout_marginTop="@dimen/dp_40"
+                android:layout_toRightOf="@id/et_way_contacts"
+                android:background="@drawable/shape_other_rounded_rectangle"
+                android:text="@string/update"
+                android:textColor="@color/logo_blue"
+                android:textSize="@dimen/dp_8" />
+
+            <TextView
+                android:id="@+id/tv_plc_serial_port"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/et_way_contacts"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_45"
+                android:text="PLC通信"
+                android:textColor="@color/logo_blue"
+                android:textSize="@dimen/dp_12" />
+
+            <TextView
+                android:id="@+id/tv_plc"
+                android:layout_width="@dimen/dp_52"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/et_way_contacts"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_42"
+                android:layout_toRightOf="@id/tv_plc_serial_port"
+                android:background="@drawable/shape_lt_lb"
+                android:gravity="center"
+                android:text="串口号"
+                android:textColor="@color/white"
+                android:textSize="@dimen/dp_8" />
+
+            <EditText
+                android:id="@+id/et_plc_content"
+                android:layout_width="@dimen/dp_112"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/et_way_contacts"
+                android:layout_marginTop="@dimen/dp_42"
+                android:layout_toRightOf="@id/tv_plc"
+                android:background="@drawable/shape_rt_rb"
+                android:hint="请输入串口号,如4,2"
+                android:paddingLeft="@dimen/dp_2"
+                android:paddingStart="@dimen/dp_5"
+                android:textColor="@color/colorHint"
+                android:textColorHint="@color/colorHint"
+                android:textSize="@dimen/dp_7" />
+
+            <Button
+                android:id="@+id/btn_plc_content_udate"
+                android:layout_width="@dimen/dp_44"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/btn_contract_update"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_42"
+                android:layout_toRightOf="@id/et_plc_content"
+                android:background="@drawable/shape_other_rounded_rectangle"
+                android:text="@string/update"
+                android:textColor="@color/logo_blue"
+                android:textSize="@dimen/dp_8" />
+
+
+            <TextView
+                android:id="@+id/tv_squatting_serial_port"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@id/tv_plc_serial_port"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_45"
+                android:text="厕所蹲位个数"
+                android:textColor="@color/logo_blue"
+                android:textSize="@dimen/dp_12" />
+
+            <TextView
+                android:id="@+id/tv_squatting"
+                android:layout_width="@dimen/dp_52"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/et_plc_content"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_42"
+                android:layout_toRightOf="@id/tv_squatting_serial_port"
+                android:background="@drawable/shape_lt_lb"
+                android:gravity="center"
+                android:text="个数"
+                android:textColor="@color/white"
+                android:textSize="@dimen/dp_8" />
+
+            <EditText
+                android:id="@+id/et_squatting_content"
+                android:layout_width="@dimen/dp_112"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/et_plc_content"
+                android:layout_marginTop="@dimen/dp_42"
+                android:layout_toRightOf="@id/tv_squatting"
+                android:background="@drawable/shape_rt_rb"
+                android:hint="请输入监控厕所个数,如1,2"
+                android:paddingStart="@dimen/dp_10"
+                android:paddingLeft="@dimen/dp_2"
+                android:inputType="number"
+                android:textColor="@color/colorHint"
+                android:textColorHint="@color/colorHint"
+                android:textSize="@dimen/dp_7" />
+
+            <Button
+                android:id="@+id/btn_squatting_content_udate"
+                android:layout_width="@dimen/dp_44"
+                android:layout_height="@dimen/dp_22"
+                android:layout_below="@id/btn_plc_content_udate"
+                android:layout_marginLeft="@dimen/dp_20"
+                android:layout_marginTop="@dimen/dp_42"
+                android:layout_toRightOf="@id/et_squatting_content"
+                android:background="@drawable/shape_other_rounded_rectangle"
+                android:text="@string/update"
+                android:textColor="@color/logo_blue"
+                android:textSize="@dimen/dp_8" />
+        </RelativeLayout>
+    </ScrollView>
 
 </RelativeLayout>