Browse Source

1.增加报警记录功能
2.上传进阶参数

Tony 5 years ago
parent
commit
40a997bac3
47 changed files with 1845 additions and 294 deletions
  1. 2 2
      app/build.gradle
  2. 1 0
      app/src/main/AndroidManifest.xml
  3. 17 11
      app/src/main/java/com/sunzee/adapter/AdvanceParameterAdapter.java
  4. 13 12
      app/src/main/java/com/sunzee/adapter/DebugParameterAdapter.java
  5. 107 0
      app/src/main/java/com/sunzee/adapter/DebugParameterXAdapter.java
  6. 105 0
      app/src/main/java/com/sunzee/adapter/DebugParameterYAdapter.java
  7. 0 3
      app/src/main/java/com/sunzee/adapter/GeneralParameterAdapter.java
  8. 41 0
      app/src/main/java/com/sunzee/model/HttpResult2.java
  9. 141 5
      app/src/main/java/com/sunzee/mvp/advertising/AdvertisingPresenter.java
  10. 6 0
      app/src/main/java/com/sunzee/mvp/advertising/AdvertisingView.java
  11. 0 1
      app/src/main/java/com/sunzee/mvp/alarmrecord/AlarmRecordPresenter.java
  12. 101 2
      app/src/main/java/com/sunzee/mvp/debug/DebugPresenter.java
  13. 17 0
      app/src/main/java/com/sunzee/mvp/debug/DebugView.java
  14. 1 5
      app/src/main/java/com/sunzee/receiver/TimedCleaningTaskAlarmReceiver.java
  15. 15 1
      app/src/main/java/com/sunzee/retrofit/ApiStores.java
  16. 20 96
      app/src/main/java/com/sunzee/service/MyIntentService.java
  17. 254 6
      app/src/main/java/com/sunzee/service/MyService.java
  18. 0 2
      app/src/main/java/com/sunzee/thread/advanceparameter/AdvanceParameterTask.java
  19. 13 6
      app/src/main/java/com/sunzee/thread/advanceparameter/ThreadPoolAdvanceParameter.java
  20. 20 0
      app/src/main/java/com/sunzee/thread/debugparameter/DebugParameterTask.java
  21. 3 0
      app/src/main/java/com/sunzee/thread/debugparameter/DebugParameterThreadType.java
  22. 26 2
      app/src/main/java/com/sunzee/thread/debugparameter/ThreadPoolDebugParameter.java
  23. 6 0
      app/src/main/java/com/sunzee/thread/generalparameter/ThreadPoolGeneralParameter.java
  24. 169 0
      app/src/main/java/com/sunzee/thread/myservice/MyserviceTask.java
  25. 11 0
      app/src/main/java/com/sunzee/thread/myservice/MyserviceThreadType.java
  26. 102 0
      app/src/main/java/com/sunzee/thread/myservice/ThreadPoolMyservice.java
  27. 94 3
      app/src/main/java/com/sunzee/ui/activity/AdvertisingActivity.java
  28. 71 1
      app/src/main/java/com/sunzee/ui/activity/HomeActivity.java
  29. 4 20
      app/src/main/java/com/sunzee/ui/dialog/ShutdownDialog.java
  30. 3 42
      app/src/main/java/com/sunzee/ui/dialog/WarringDialog.java
  31. 28 20
      app/src/main/java/com/sunzee/ui/fragment/AdvanceParameterFragment.java
  32. 109 30
      app/src/main/java/com/sunzee/ui/fragment/DebugFragment.java
  33. 33 6
      app/src/main/java/com/sunzee/ui/fragment/GeneralParameterFragment.java
  34. 20 0
      app/src/main/java/com/sunzee/utils/PreventSpeedClickUtil.java
  35. 21 0
      app/src/main/res/drawable-mdpi/shape_circle.xml
  36. 0 0
      app/src/main/res/drawable/ic_launcher_foreground.xml
  37. 21 0
      app/src/main/res/drawable/shape_circle_oragnge.xml
  38. 60 0
      app/src/main/res/layout/dialog_shutdown.xml
  39. 41 2
      app/src/main/res/layout/fragment_debug.xml
  40. 4 6
      app/src/main/res/layout/item_debugparameter.xml
  41. 4 6
      app/src/main/res/layout/item_generalparameter.xml
  42. 44 0
      app/src/main/res/layout/item_xy.xml
  43. 46 0
      app/src/main/res/layout/item_xy_title.xml
  44. 47 1
      app/src/main/res/values/strings.xml
  45. 2 1
      build.gradle
  46. 1 1
      serialport-api/src/main/java/com/hboxs/serialport/SerialPortReadThread.java
  47. 1 1
      serialport-api/src/main/java/com/hboxs/serialport/SerialPortSendQueue.java

+ 2 - 2
app/build.gradle

@@ -10,8 +10,8 @@ android {
         versionCode 1
         manifestPlaceholders = [
                 //个推应用参数,请填写您申请的 GETUI_APP_ID,GETUI_APP_KEY,GETUI_APP_SECRET 值
-                GETUI_APP_ID    : "GKa6qa12heALjEXZlAn1U3",
-                GETUI_APP_KEY   : "89WV8dfjRg6RlxEchgmnS6",
+                GETUI_APP_ID    : "n4vsaIAi0eAbAkfBfqsUL7",
+                GETUI_APP_KEY   : "iUQlj7YC4c5Zb7CSuwQTP4",
                 GETUI_APP_SECRET: "fLvPjR8hni7VFMkgjh8lx2"
         ]
         ndk {

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

@@ -44,6 +44,7 @@
             android:name=".service.MyPushService"
             android:exported="true"
             android:label="PushService"
+            android:permission="android.permission.BIND_JOB_SERVICE"
             android:process=":pushservice" />
         <service
             android:name=".service.MyIntentService"

+ 17 - 11
app/src/main/java/com/sunzee/adapter/AdvanceParameterAdapter.java

@@ -18,6 +18,7 @@ import com.sunzee.utils.ToastUtil;
 import com.wuxiaolong.androidutils.library.LogUtil;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 
 /**
@@ -25,7 +26,12 @@ import java.util.HashMap;
  */
 public class AdvanceParameterAdapter extends RecyclerView.Adapter<AdvanceParameterAdapter.ViewHolder> {
 
-    private final int[] paraName;
+    private final int[] paraName = {
+            R.string.advance_parameter_7, R.string.advance_parameter_8,
+            R.string.advance_parameter_9, R.string.advance_parameter_10,
+            R.string.advance_parameter_11, R.string.advance_parameter_12,
+    };
+
     private ArrayList<ParameterBean> parameterBeans = new ArrayList<>();
 
     public ArrayList<ParameterBean> getParameterBeans() {
@@ -42,9 +48,7 @@ public class AdvanceParameterAdapter extends RecyclerView.Adapter<AdvanceParamet
     //保存editText的值
     public HashMap<Integer, String> contents = new HashMap<>();
 
-    public AdvanceParameterAdapter(int[] paraName) {
-        this.paraName = paraName;
-
+    public AdvanceParameterAdapter() {
     }
 
     public void setItemListener(AdvanceParameterAdapter.ItemParaClickListener listener) {
@@ -64,7 +68,6 @@ public class AdvanceParameterAdapter extends RecyclerView.Adapter<AdvanceParamet
     //地址具体数值
     private String[] values = new String[6];
 
-
     @NonNull
     @Override
     public AdvanceParameterAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
@@ -88,8 +91,10 @@ public class AdvanceParameterAdapter extends RecyclerView.Adapter<AdvanceParamet
                     ToastUtil.showToast("不能输入空值哦!!!");
                     return;
                 }
-                listener.onItemListener(v, i, text);
-                parameterBeans.set(i, new ParameterBean(paraAddress[i], text));
+                listener.onItemListener(v, i, text, paraAddress[i]);
+                if (parameterBeans.size() != 0) {
+                    parameterBeans.set(i, new ParameterBean(paraAddress[i], text));
+                }
             }
         });
         if (values != null && values.length > 0) {
@@ -153,10 +158,11 @@ public class AdvanceParameterAdapter extends RecyclerView.Adapter<AdvanceParamet
      */
     public interface ItemParaClickListener {
         /**
-         * @param view     控件
-         * @param position 位置
-         * @param text
+         * @param view        控件
+         * @param position    位置
+         * @param text        写入的数据
+         * @param paraAddress 要置位的地址
          */
-        void onItemListener(View view, int position, String text);
+        void onItemListener(View view, int position, String text, String paraAddress);
     }
 }

+ 13 - 12
app/src/main/java/com/sunzee/adapter/DebugParameterAdapter.java

@@ -20,13 +20,18 @@ import java.util.HashMap;
  * @Description 通用参数recyclerview 设配器
  */
 public class DebugParameterAdapter extends RecyclerView.Adapter<DebugParameterAdapter.ViewHolder> {
-    private int[] paraName;
+    private int[] paraName = {
+            R.string.debug_1, R.string.debug_2,
+            R.string.debug_3, R.string.debug_4,
+            R.string.debug_5, R.string.debug_6,
+            R.string.debug_7
+    };
+    private final String[] paraAddress = {
+            "M311", "M312", "M313", "M315",
+            "M316", "M317", "M318"};
+
+    public DebugParameterAdapter() {
 
-    //保存editText的值
-    public HashMap<Integer, String> contents = new HashMap<>();
-
-    public DebugParameterAdapter(int[] paraName) {
-        this.paraName = paraName;
     }
 
     public void setItemListener(ItemParaClickListener listener) {
@@ -35,19 +40,15 @@ public class DebugParameterAdapter extends RecyclerView.Adapter<DebugParameterAd
 
     private ItemParaClickListener listener;
 
-    public void setValues(String[] values) {
-        this.values = values;
-    }
 
     //地址具体数值
-    private String[] values;
 
     private static final String TAG = "DebugParameterAdapter";
 
     @NonNull
     @Override
     public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
-        View inflate = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_generalparameter, viewGroup, false);
+        View inflate = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_debugparameter, viewGroup, false);
         return new ViewHolder(inflate);
 
     }
@@ -58,7 +59,7 @@ public class DebugParameterAdapter extends RecyclerView.Adapter<DebugParameterAd
         viewHolder.cbManual.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                listener.onItemListener(view, i, "");
+                listener.onItemListener(view, i, paraAddress[i]);
             }
         });
     }

+ 107 - 0
app/src/main/java/com/sunzee/adapter/DebugParameterXAdapter.java

@@ -0,0 +1,107 @@
+package com.sunzee.adapter;
+
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.sunzee.R;
+
+public class DebugParameterXAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+    private final int TITLE = 0;
+    private final int NORMAL = 1;
+
+    private int[] datas = {
+            R.string.iox2, R.string.iox3, R.string.iox4,
+            R.string.iox5, R.string.iox7, R.string.iox10,
+            R.string.iox11, R.string.iox12, R.string.iox13,
+            R.string.iox14, R.string.iox15, R.string.iox16,
+            R.string.iox17, R.string.iox20, R.string.iox21,
+            R.string.iox22, R.string.iox23, R.string.iox24,
+            R.string.iox25, R.string.iox26, R.string.iox27,
+    };
+    private String[] address = {
+            "02", "03", "04", "05", "07",
+            "10", "11", "12", "13", "14",
+            "15", "16", "17", "20", "21",
+            "22", "23", "24", "25", "26",
+            "27",
+    };
+
+    public void setItemListener(ItemMaintainClickListener listener) {
+        this.listener = listener;
+    }
+
+    private ItemMaintainClickListener listener;
+
+    @NonNull
+    @Override
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        if (viewType == TITLE) {
+            View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_xy_title, parent, false);
+            return new DebugParameterXAdapter.TitleViewHolder(inflate);
+        }
+        View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_xy, parent, false);
+        return new DebugParameterXAdapter.ViewHolder(inflate);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+        if (holder instanceof TitleViewHolder) {
+
+        } else if (holder instanceof ViewHolder) {
+            ViewHolder mViewHolder = (ViewHolder) holder;
+
+            mViewHolder.tvAddress.setText(address[position - 1]);
+            mViewHolder.tvName.setText(datas[position - 1]);
+
+
+        }
+
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        if (position == 0) {
+            return TITLE;
+        }
+        return NORMAL;
+    }
+
+    @Override
+    public int getItemCount() {
+        return datas.length + 1;
+    }
+
+    public interface ItemMaintainClickListener {
+        /**
+         * @param view     控件
+         * @param position 位置
+         */
+        void onItemListener(View view, int position);
+
+    }
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+        TextView tvAddress;
+        TextView tvName;
+        public ImageView ivState;
+
+        public ViewHolder(@NonNull View itemView) {
+            super(itemView);
+            tvAddress = itemView.findViewById(R.id.tv_address);
+            tvName = itemView.findViewById(R.id.tv_name);
+            ivState = itemView.findViewById(R.id.iv_state);
+        }
+    }
+
+    public static class TitleViewHolder extends RecyclerView.ViewHolder {
+        public TitleViewHolder(@NonNull View itemView) {
+            super(itemView);
+        }
+    }
+
+}

+ 105 - 0
app/src/main/java/com/sunzee/adapter/DebugParameterYAdapter.java

@@ -0,0 +1,105 @@
+package com.sunzee.adapter;
+
+import android.support.annotation.NonNull;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.sunzee.R;
+
+public class DebugParameterYAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+    private final int TITLE = 0;
+    private final int NORMAL = 1;
+
+    private int[] datas = {
+            R.string.ioy0,R.string.ioy1,R.string.ioy2,R.string.ioy3, R.string.ioy4,
+            R.string.ioy5,R.string.ioy6, R.string.ioy7,R.string.ioy10, R.string.ioy11,
+            R.string.ioy12,R.string.ioy13,R.string.ioy14,R.string.ioy15,R.string.ioy16,
+            R.string.ioy17, R.string.ioy20,R.string.ioy21,R.string.ioy22,R.string.ioy23,
+            R.string.ioy24,R.string.ioy25,
+
+    };
+    private String[] address = {
+            "00", "01", "02", "03","04",
+            "05","06", "07", "10", "11",
+            "12","13", "14", "15", "16",
+            "17","20", "21", "22", "23",
+            "24","25"
+    };
+
+    public void setItemListener(DebugParameterYAdapter.ItemMaintainClickListener listener) {
+        this.listener = listener;
+    }
+
+    private DebugParameterYAdapter.ItemMaintainClickListener listener;
+
+    @NonNull
+    @Override
+    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        if (viewType == TITLE) {
+            View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_xy_title, parent, false);
+            return new DebugParameterYAdapter.TitleViewHolder(inflate);
+        }
+        View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_xy, parent, false);
+        return new DebugParameterYAdapter.ViewHolder(inflate);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
+        if (holder instanceof DebugParameterYAdapter.TitleViewHolder) {
+
+        } else if (holder instanceof DebugParameterYAdapter.ViewHolder) {
+            DebugParameterYAdapter.ViewHolder mViewHolder = (DebugParameterYAdapter.ViewHolder) holder;
+            mViewHolder.tvAddress.setText(address[position - 1]);
+            mViewHolder.tvName.setText(datas[position - 1]);
+
+
+        }
+
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        if (position == 0) {
+            return TITLE;
+        }
+        return NORMAL;
+    }
+
+    @Override
+    public int getItemCount() {
+        return datas.length + 1;
+    }
+
+    public interface ItemMaintainClickListener {
+        /**
+         * @param view     控件
+         * @param position 位置
+         */
+        void onItemListener(View view, int position);
+
+    }
+
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+        TextView tvAddress;
+        TextView tvName;
+        public ImageView ivState;
+
+        public ViewHolder(@NonNull View itemView) {
+            super(itemView);
+            tvAddress = itemView.findViewById(R.id.tv_address);
+            tvName = itemView.findViewById(R.id.tv_name);
+            ivState = itemView.findViewById(R.id.iv_state);
+        }
+    }
+
+    public static class TitleViewHolder extends RecyclerView.ViewHolder {
+        public TitleViewHolder(@NonNull View itemView) {
+            super(itemView);
+        }
+    }
+
+}

+ 0 - 3
app/src/main/java/com/sunzee/adapter/GeneralParameterAdapter.java

@@ -28,9 +28,6 @@ import java.util.HashMap;
 public class GeneralParameterAdapter extends RecyclerView.Adapter<GeneralParameterAdapter.ViewHolder> {
     private int[] paraName;
 
-    //保存editText的值
-    public HashMap<Integer, String> contents = new HashMap<>();
-
     public GeneralParameterAdapter(int[] paraName) {
         this.paraName = paraName;
     }

+ 41 - 0
app/src/main/java/com/sunzee/model/HttpResult2.java

@@ -0,0 +1,41 @@
+package com.sunzee.model;
+
+/**
+ * Http响应实体类
+ * Created by MinKin.
+ */
+public class HttpResult2<T> {
+
+
+    /**
+     * overdueDate : 2020-05-28 08:47:34.0
+     * remaining : 10
+     */
+
+    private T overdueDate;
+    private T remaining;
+
+    public T getOverdueDate() {
+        return overdueDate;
+    }
+
+    public void setOverdueDate(T overdueDate) {
+        this.overdueDate = overdueDate;
+    }
+
+    public T getRemaining() {
+        return remaining;
+    }
+
+    public void setRemaining(T remaining) {
+        this.remaining = remaining;
+    }
+
+    @Override
+    public String toString() {
+        return "HttpResult2{" +
+                "overdueDate=" + overdueDate +
+                ", remaining=" + remaining +
+                '}';
+    }
+}

+ 141 - 5
app/src/main/java/com/sunzee/mvp/advertising/AdvertisingPresenter.java

@@ -4,6 +4,7 @@ import android.os.Environment;
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.google.gson.Gson;
 import com.orhanobut.hawk.Hawk;
 import com.sunzee.base.BaseActivity;
 import com.sunzee.base.BaseApplication;
@@ -11,19 +12,29 @@ import com.sunzee.base.BasePresenter;
 import com.sunzee.model.Global;
 import com.sunzee.model.Heartbeat;
 import com.sunzee.model.HttpResult;
+import com.sunzee.model.HttpResult2;
 import com.sunzee.model.domain.GetAdBean;
+import com.sunzee.model.domain.ParameterBean;
 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.sunzee.utils.ToastUtil;
 import com.wuxiaolong.androidutils.library.LogUtil;
 
+import org.w3c.dom.Text;
+
 import java.io.File;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import okhttp3.RequestBody;
+
 /**
  * 广告界面 presenter
  * 需求:
@@ -39,7 +50,6 @@ public class AdvertisingPresenter extends BasePresenter<AdvertisingView> {
 
     //--------------------------------------------------------------------------广告 start----------------------------------------------------------------------------------------------
     public void play() {
-        requstCleanRule();
         //2.读文件的数据
         int leftFileSize = leftVideoImageFile();
         int rightFileSize = rightVideoImageFile();
@@ -230,21 +240,26 @@ public class AdvertisingPresenter extends BasePresenter<AdvertisingView> {
 
     //--------------------------------------------------------------------------广告 end----------------------------------------------------------------------------------------------
 
-    private void requstCleanRule() {
+    //-------------------------------------------------------------------------清洗规则 start--------------------------------------------------------------------------------------------
+    public void requstCleanRule() {
         Map<String, String> params = new HashMap<>();
         params.put("clientId", Heartbeat.deviceId);
         addSubscription(apiStores.cleanRule(params), new ApiCallback<HttpResult<String>>() {
             @Override
             public void onSuccess(HttpResult<String> model) {
-                String times = model.getData();
-                Log.d(TAG, "onSuccess: " + times);
+                String times = model.getData().trim();
+                Log.d(TAG, "onSuccess: "+times);
+                if ("尚未设定清洗规则".equals(times)) {
+                    return;
+                }
+                Log.d(TAG, "onSuccess2: " + times);
                 if (!TextUtils.isEmpty(times)) {
                     String[] Alltime = times.split("\\,");
                     Global.alarmNumber = Alltime.length;
                     for (int i = 0; i < Alltime.length; i++) {
                         String[] data = Alltime[i].split(":");
                         for (String datum : data) {
-                            Log.d(TAG, "onSuccess: "+datum);
+                            Log.d(TAG, "onSuccess1: " + datum);
                         }
                         //设置定时闹钟
                         AlarmManagerUtil.setAlarm(BaseApplication.getContext(), 1, Integer.valueOf(data[0]), Integer.valueOf(data[1]), Integer.valueOf(data[2]), i, 0, "闹钟响了26");
@@ -254,6 +269,127 @@ public class AdvertisingPresenter extends BasePresenter<AdvertisingView> {
 
             @Override
             public void onFailure(String msg) {
+                Log.d(TAG, "onFailure: " + msg);
+            }
+
+            @Override
+            public void onFinish() {
+            }
+        });
+    }
+
+    //-------------------------------------------------------------------------清洗规则 end--------------------------------------------------------------------------------------------
+
+    //------------------------------------------------------------------请求是否已经付费了。或者说过期了。 start-----------------------------------------------
+    public void requestCleanTimeAndRemaining() {
+        Map<String, String> params = new HashMap<>();
+        params.put("clientId", Heartbeat.deviceId);
+        addSubscription(apiStores.getCleanTimeAndRemaining(params), new ApiCallback<HttpResult2<String>>() {
+            @Override
+            public void onSuccess(HttpResult2<String> model) {
+                Log.d(TAG, "onSuccess: " + model);
+                String overdueDate = model.getOverdueDate();
+                String remaining = model.getRemaining();
+                if (TextUtils.isEmpty(overdueDate)) {
+                    //如果为空
+                    Hawk.put("overdueDate", null);
+                } else {
+                    try {
+                        Calendar calendar = Calendar.getInstance();
+                        calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(overdueDate));
+                        Hawk.put("overdueDate", calendar.getTimeInMillis());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        Hawk.put("overdueDate", null);
+                    }
+                }
+                if (TextUtils.isEmpty(remaining)) {
+                    Hawk.put("remaining", null);
+                } else {
+                    Hawk.put("remaining", remaining);
+                }
+
+            }
+
+            @Override
+            public void onFailure(String msg) {
+                Log.d(TAG, "onFailure: " + msg);
+                //失败了。
+            }
+
+            @Override
+            public void onFinish() {
+            }
+        });
+    }
+
+    //---------------------------------------------------------------------请求是否已经付费了。 end---------------------------------------------
+    public void setAdvanced(String name, ArrayList<String> results, ThreadPoolAdvanceParameter threadGetParameter1) {
+        if (name.equals("D426")) {
+            if (!threadGetParameter1.isReceive1()) {
+                threadGetParameter1.setReceive1(true);
+                threadGetParameter1.stopReadD426();
+                threadGetParameter1.getValues()[0] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+        } else if (name.equals("D427")) {
+            if (!threadGetParameter1.isReceive2()) {
+                threadGetParameter1.setReceive2(true);
+                threadGetParameter1.stopReadD427();
+                threadGetParameter1.getValues()[1] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+
+        } else if (name.equals("D428")) {
+            if (!threadGetParameter1.isReceive3()) {
+                threadGetParameter1.setReceive3(true);
+                threadGetParameter1.stopReadD428();
+                threadGetParameter1.getValues()[2] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+
+        } else if (name.equals("D429")) {
+            if (!threadGetParameter1.isReceive4()) {
+                threadGetParameter1.setReceive4(true);
+                //参数23 D278
+                threadGetParameter1.stopReadD429();
+                threadGetParameter1.getValues()[3] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+        } else if (name.equals("D430")) {
+            if (!threadGetParameter1.isReceive5()) {
+                threadGetParameter1.setReceive5(true);
+                threadGetParameter1.stopReadD430();
+                threadGetParameter1.getValues()[4] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+        } else if (name.equals("D431")) {
+            if (!threadGetParameter1.isReceive6()) {
+                threadGetParameter1.setReceive6(true);
+                threadGetParameter1.stopReadD431();
+                threadGetParameter1.getValues()[5] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+        }
+        if (threadGetParameter1.isReceive1() && threadGetParameter1.isReceive2() && threadGetParameter1.isReceive3() && threadGetParameter1.isReceive4() && threadGetParameter1.isReceive5() && threadGetParameter1.isReceive6()) {
+            mvpView.getDataSuccess();
+            threadGetParameter1.setReceive1(false);
+            threadGetParameter1.setReceive2(false);
+            threadGetParameter1.setReceive3(false);
+            threadGetParameter1.setReceive4(false);
+            threadGetParameter1.setReceive5(false);
+            threadGetParameter1.setReceive6(false);
+        }
+    }
+
+    public void updateAdvanced(ArrayList<ParameterBean> parameterBeans) {
+
+        String url = "/api/app_equipment/index/updateParam/1/" + Heartbeat.deviceId + ".htm";
+        Gson gson = new Gson();
+        String json = gson.toJson(parameterBeans);
+        RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
+        addSubscription(apiStores.updateParamApi(url, body), new ApiCallback<HttpResult<String>>() {
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+                Log.d(TAG, "onSuccess: " + model);
+            }
+
+            @Override
+            public void onFailure(String msg) {
             }
 
             @Override

+ 6 - 0
app/src/main/java/com/sunzee/mvp/advertising/AdvertisingView.java

@@ -29,4 +29,10 @@ public interface AdvertisingView extends BaseView {
      * @param sysTimeStr
      */
     void updateTime(CharSequence sysTimeStr);
+
+    /**
+     * 上传进阶参数
+     */
+    void getDataSuccess();
+
 }

+ 0 - 1
app/src/main/java/com/sunzee/mvp/alarmrecord/AlarmRecordPresenter.java

@@ -22,5 +22,4 @@ public class AlarmRecordPresenter extends BasePresenter<AlarmRecordView> {
         Collections.reverse(warringBeans);
         mvpView.showData(warringBeans);
     }
-    //todo 好像没有销毁。attachview
 }

+ 101 - 2
app/src/main/java/com/sunzee/mvp/debug/DebugPresenter.java

@@ -2,12 +2,16 @@ package com.sunzee.mvp.debug;
 
 import android.util.Log;
 
+import com.hboxs.serialport.frame.ResponseFrame;
+import com.hboxs.serialport.message.Message;
 import com.sunzee.base.BasePresenter;
 import com.sunzee.thread.debugparameter.ThreadPoolDebugParameter;
 import com.sunzee.utils.HexadecimalUtil;
 import com.wuxiaolong.androidutils.library.LogUtil;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * 调试页界面 presenter
@@ -18,6 +22,18 @@ public class DebugPresenter extends BasePresenter<DebugView> {
     }
 
     private static final String TAG = "DebugPresenter";
+    private ArrayList<String> listX = new ArrayList<>(Arrays.asList(
+            "0", "0", "0", "0", "0",
+            "0", "0", "0", "0", "0",
+            "0", "0", "0", "0", "0",
+            "0", "0", "0", "0", "0",
+            "0"));
+    private ArrayList<String> listY = new ArrayList<>(Arrays.asList(
+            "0", "0", "0", "0", "0",
+            "0", "0", "0", "0", "0",
+            "0", "0", "0", "0", "0",
+            "0", "0", "0", "0", "0",
+            "0", "0"));
 
     public void setDebugParameter(String name, ArrayList<String> results, ThreadPoolDebugParameter threadGetParameter1) {
         if (name.equals("M311")) {
@@ -32,7 +48,7 @@ public class DebugPresenter extends BasePresenter<DebugView> {
                 threadGetParameter1.getValues().set(4, results.get(12));
                 threadGetParameter1.getValues().set(5, results.get(13));
                 threadGetParameter1.getValues().set(6, results.get(14));
-                LogUtil.d(TAG, "setDebugParameter: "+threadGetParameter1.getValues());
+                LogUtil.d(TAG, "setDebugParameter: " + threadGetParameter1.getValues());
             }
         }
         if (threadGetParameter1.isReceive1()) {
@@ -41,4 +57,87 @@ public class DebugPresenter extends BasePresenter<DebugView> {
             threadGetParameter1.setReceive1(false);
         }
     }
-}
+
+    public void setData(Message messageEvent, ResponseFrame responseFrame, String result, ThreadPoolDebugParameter poolDebugParameter) {
+        //通过校验
+        int id = messageEvent.getId();
+        String name = messageEvent.getName();
+        if (id == 311) {
+            Log.d(TAG, "event: " + name);
+            ArrayList<String> results = HexadecimalUtil.flipString(result);
+            //    转成2进制
+            String s = HexadecimalUtil.hexStringToByte(result);
+            //翻转后的数据
+            String s1 = HexadecimalUtil.flipString(s, 8);
+            List<String> lis = Arrays.asList(s1.split(""));
+            ArrayList<String> list = new ArrayList(lis);
+            list.remove(0);
+            setDebugParameter(name, list, poolDebugParameter);
+
+        } else if (id == 1 || id == 2) {
+            List<String> strList = HexadecimalUtil.getStrList(result, 4);
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0, len = strList.size(); i < len; i++) {
+                String str = strList.get(i);
+                //2进制
+                String s3 = HexadecimalUtil.hexStringToByte(str);
+                //2进制翻转
+                String s2 = HexadecimalUtil.flipString(s3, 8);
+                sb.append(s2);
+            }
+            List<String> list1 = Arrays.asList(sb.toString().split(""));
+            ArrayList<String> list2 = new ArrayList(list1);
+            list2.remove(0);
+            if ("X0".equals(name)) {
+                listX.set(0, list2.get(2));
+                listX.set(1, list2.get(3));
+                listX.set(2, list2.get(4));
+                listX.set(3, list2.get(5));
+                listX.set(4, list2.get(7));
+                listX.set(5, list2.get(8));
+                listX.set(6, list2.get(9));
+                listX.set(7, list2.get(10));
+                listX.set(8, list2.get(11));
+                listX.set(9, list2.get(12));
+                listX.set(10, list2.get(13));
+                listX.set(11, list2.get(14));
+                listX.set(12, list2.get(15));
+                listX.set(13, list2.get(16));
+                listX.set(14, list2.get(17));
+                listX.set(15, list2.get(18));
+                listX.set(16, list2.get(19));
+                listX.set(17, list2.get(20));
+                listX.set(18, list2.get(21));
+                listX.set(19, list2.get(22));
+                listX.set(20, list2.get(23));
+                mvpView.setXStatu(listX);
+            } else if ("Y0".equals(name)) {
+                listY.set(0, list2.get(0));
+                listY.set(1, list2.get(1));
+                listY.set(2, list2.get(2));
+                listY.set(3, list2.get(3));
+                listY.set(4, list2.get(4));
+                listY.set(5, list2.get(5));
+                listY.set(6, list2.get(6));
+                listY.set(7, list2.get(7));
+                listY.set(8, list2.get(8));
+                listY.set(9, list2.get(9));
+                listY.set(10, list2.get(10));
+                listY.set(11, list2.get(11));
+                listY.set(12, list2.get(12));
+                listY.set(13, list2.get(13));
+                listY.set(14, list2.get(14));
+                listY.set(15, list2.get(15));
+                listY.set(16, list2.get(16));
+                listY.set(17, list2.get(17));
+                listY.set(18, list2.get(18));
+                listY.set(19, list2.get(19));
+                listY.set(20, list2.get(20));
+                listY.set(21, list2.get(21));
+                mvpView.setYStatu(listY);
+                Log.d(TAG, list2.size() + "setYStatu: " + list2);
+            }
+            mvpView.hideLoading();
+        }
+    }
+}

+ 17 - 0
app/src/main/java/com/sunzee/mvp/debug/DebugView.java

@@ -2,9 +2,26 @@ package com.sunzee.mvp.debug;
 
 import com.sunzee.base.BaseView;
 
+import java.util.ArrayList;
+
 /**
  * 调试页界面 view
  */
 public interface DebugView extends BaseView {
+    /**
+     * M300读取成功
+     */
     void getDataSuccess();
+
+    /**
+     * X0读取成功
+     * @param list2
+     */
+    void setXStatu(ArrayList<String> list2);
+
+    /**
+     * Y0读取成功
+     * @param list2
+     */
+    void setYStatu(ArrayList<String> list2);
 }

+ 1 - 5
app/src/main/java/com/sunzee/receiver/TimedCleaningTaskAlarmReceiver.java

@@ -14,18 +14,14 @@ import org.greenrobot.eventbus.EventBus;
  * 监听并启动定时清洗任务广播.
  */
 public class TimedCleaningTaskAlarmReceiver extends BroadcastReceiver {
-    private static final String TAG = "TimedCleaningTaskAlarmR";
     @Override
     public void onReceive(Context context, Intent intent) {
-        // TODO Auto-generated method stub
-        String msg = intent.getStringExtra("msg");
         long intervalMillis = intent.getLongExtra("intervalMillis", 0);
         if (intervalMillis != 0) {
             AlarmManagerUtil.setAlarmTime(context, System.currentTimeMillis() + intervalMillis,
                     intent);
         }
-        // todo 定时清洗的逻辑
-        Log.d(TAG, "onReceive: "+msg);
+        //推送myservice开始清洗
         EventBus.getDefault().post(new ApiMessageEvent("startClean", "闹钟响了26"));
     }
 

+ 15 - 1
app/src/main/java/com/sunzee/retrofit/ApiStores.java

@@ -2,6 +2,7 @@ package com.sunzee.retrofit;
 
 import com.sunzee.model.EmailResult;
 import com.sunzee.model.HttpResult;
+import com.sunzee.model.HttpResult2;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -31,7 +32,7 @@ public interface ApiStores {
     @GET("api/order/getOrderStatus.htm")
     Observable<HashMap> getOrderStatus(@Query("sn") String sn);
 
-
+    //设备初始化
     @FormUrlEncoded
     @POST("/api/app_equipment/index/init.htm")
     Observable<HttpResult<String>> init(@FieldMap Map<String, String> params);
@@ -77,4 +78,17 @@ public interface ApiStores {
     //上传报警记录
     @POST("api/app_alarmRecord/alarmRecodeIndex/addAlarmRecord.htm")
     Observable<HttpResult<String>> addAlarmRecord(@Body RequestBody body);
+
+    //请求是否购买天数和次数
+    @GET("api/app_alarmRecord/clean/getCleanTimeAndRemaining.htm")
+    Observable<HttpResult2<String>> getCleanTimeAndRemaining(@QueryMap Map<String, String> params);
+
+    //获取后台系统时间
+    @GET("api/app_alarmRecord/clean/getTime.htm")
+    Observable<HttpResult<String>> getBackgroundTime();
+
+
+    //机器开始清洗了,向上面报告
+    @GET("api/app_alarmRecord/clean/cleanReport.htm")
+    Observable<HttpResult<String>> getCleanReport(@QueryMap Map<String, String> params);
 }

+ 20 - 96
app/src/main/java/com/sunzee/service/MyIntentService.java

@@ -102,7 +102,6 @@ public class MyIntentService extends GTIntentService {
         byte[] payload = gtTransmitMessage.getPayload();
         String pkg = gtTransmitMessage.getPkgName();
         String cid = gtTransmitMessage.getClientId();
-
         String data = new String(payload);
         Gson gson = new Gson();
         LogUtil.e(TAG, "onReceiveMessageData: " + ";appid" + appid + ";taskid" + taskid + ";messageid" + messageid + ";payload" + payload + ";pkg" + pkg + ";cid" + cid);
@@ -113,8 +112,14 @@ public class MyIntentService extends GTIntentService {
         switch (kind) {
             case "clean":
                 //一间清洗
+                Log.d(TAG, "onReceiveMessageData:clean ");
                 startClean(gson, geTuiBean, kind);
                 break;
+            case "updateRule":
+                //更新定时清洗的任务
+                LogUtil.d(TAG, "onReceiveMessageData: updateRule");
+                updataCleanRule(gson, geTuiBean, kind);
+                break;
             case "statusType":
                 //申请初始化回调
                 statusType(gson, geTuiBean, kind);
@@ -126,37 +131,27 @@ public class MyIntentService extends GTIntentService {
                 break;
             case "Param":
                 //更新参数。
+                LogUtil.d(TAG, "onReceiveMessageData: Param");
                 updataParam(gson, geTuiBean, kind);
                 break;
-            case "updateRule":
-                //更新定时清洗的任务
-                updataCleanRule(gson, geTuiBean, kind);
+            case "paySuccess":
+                // todo
+                Log.d(TAG, "onReceiveMessageData: " + gson + ":" + geTuiBean + ":" + kind);
                 break;
-            //不需要更新广告了,而是更具规则来下载广告。
-//            case "push":
-//                LogUtil.d(TAG, "push: ");
-//                //更新广告
-//                String json = geTuiBean.getKind_data();
-//                if (json.equals("更新广告")) {
-//                    saveAd();
-//                }
-//                break;
-
         }
 
     }
 
     private void updataCleanRule(Gson gson, GeTuiBean geTuiBean, String kind) {
         String times = geTuiBean.getKind_data();
-
         Log.d(TAG, "闹钟响了26onSuccess: " + times);
         if (!TextUtils.isEmpty(times)) {
             String[] Alltime = times.split("\\,");
             //如果之前的数据和现在的数据,数量相同,或者之前的数据小于现在的数据,,那么不清除直接替换。
             //不可能为0。
-            if (Global.alarmNumber>Alltime.length) {
-                for (int i = 0; i <Global.alarmNumber ; i++) {
-                    AlarmManagerUtil.cancelAlarm(BaseApplication.getContext(),AlarmManagerUtil.ALARM_ACTION,i);
+            if (Global.alarmNumber > Alltime.length) {
+                for (int i = 0; i < Global.alarmNumber; i++) {
+                    AlarmManagerUtil.cancelAlarm(BaseApplication.getContext(), AlarmManagerUtil.ALARM_ACTION, i);
                 }
             }
             Global.alarmNumber = Alltime.length;
@@ -186,10 +181,11 @@ public class MyIntentService extends GTIntentService {
                 case "M317":
                 case "M318":
                 case "M17":
+                    Log.d(TAG, "updataParam: "+address);
                     if ("0".equals(data)) {
-                        startSet(address);
+                        EventBus.getDefault().post(new ApiMessageEvent("updataParamSet", address));
                     } else {
-                        startRst(address);
+                        EventBus.getDefault().post(new ApiMessageEvent("updataParamRst", address));
                     }
                     break;
                 //写入,写入后需要上传。
@@ -199,84 +195,17 @@ public class MyIntentService extends GTIntentService {
                 case "D429":
                 case "D430":
                 case "D431":
-                    startWrite(address, data.trim());
+                    EventBus.getDefault().post(new ApiMessageEvent("updataParamWrite", split));
                     break;
             }
         }
     }
 
-    private Timer timerWrite;
-    private TimerTask timerTaskWrite;
 
     private void startWrite(final String address, final String data) {
-        timerWrite = new Timer();
-        timerTaskWrite = new TimerTask() {
-            @Override
-            public void run() {
-                Log.d(TAG, "run: ");
-                String text = ByteUtils.decimal2fitHex(Integer.valueOf(data));
-                SerialPortManager.getInstance().sendCommandFrame(new WriteCommandFrame(address, HexUtils.hexStr2BinStr(text)), address);
-            }
-        };
-        timerWrite.schedule(timerTaskWrite, 0, 1000);
-
-    }
-
-
-    private Timer timerSet;
-    private TimerTask timerTaskSet;
+        String text = ByteUtils.decimal2fitHex(Integer.valueOf(data));
+        SerialPortManager.getInstance().sendCommandFrame(new WriteCommandFrame(address, HexUtils.hexStr2BinStr(text)), address);
 
-    private void startSet(final String address) {
-        timerSet = new Timer();
-        timerTaskSet = new TimerTask() {
-            @Override
-            public void run() {
-                SerialPortSendQueue.sendCommand(new SetCommandFrame(address), 18, address);
-                Log.d(TAG, "run: ");
-            }
-        };
-        timerSet.schedule(timerTaskSet, 0, 1000);
-    }
-
-    private Timer timerRst;
-    private TimerTask timerTaskRst;
-
-    private void startRst(final String address) {
-        timerRst = new Timer();
-        timerTaskRst = new TimerTask() {
-            @Override
-            public void run() {
-                SerialPortSendQueue.sendCommand(new RstCommandFrame(address), 18, address);
-                Log.d(TAG, "run: ");
-            }
-        };
-        timerRst.schedule(timerTaskRst, 0, 1000);
-    }
-
-    private void stopSet(Timer timer, TimerTask timerTask) {
-        Log.d(TAG, "stopSet: ");
-        if (timer != null) {
-            timerTask.cancel();
-            timer.cancel();
-            timer = null;
-        }
-    }
-
-    private void stopWrite(Timer timer, TimerTask timerTask) {
-        Log.d(TAG, "stopWrite: ");
-        if (timer != null) {
-            timerTask.cancel();
-            timer.cancel();
-            timer = null;
-        }
-    }
-
-    private void stopRst(Timer timer, TimerTask timerTask) {
-        if (timer != null) {
-            timerTask.cancel();
-            timer.cancel();
-            timer = null;
-        }
     }
 
 
@@ -356,7 +285,7 @@ public class MyIntentService extends GTIntentService {
 
             @Override
             public void onFailure(String msg) {
-                Log.d(TAG, "onFailure: ");
+                Log.d(TAG, "onFailure: "+msg);
             }
 
             @Override
@@ -446,10 +375,6 @@ public class MyIntentService extends GTIntentService {
                 break;
             case ack:
                 Log.d(TAG, "event: 写入成功");
-                stopRst(timerRst, timerTaskRst);
-                stopSet(timerSet, timerTaskSet);
-                stopWrite(timerWrite, timerTaskWrite);
-                Log.d(TAG, "event: ack");
                 break;
             case nak:
                 Log.d(TAG, "event: nak");
@@ -460,7 +385,6 @@ public class MyIntentService extends GTIntentService {
                 Log.d(TAG, "event: disconnected");
                 break;
             case response:
-                Log.d(TAG, "event: response");
                 break;
         }
     }

+ 254 - 6
app/src/main/java/com/sunzee/service/MyService.java

@@ -21,11 +21,15 @@ import android.view.WindowManager;
 
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
+import com.hboxs.serialport.SerialPortManager;
 import com.hboxs.serialport.SerialPortSendQueue;
 import com.hboxs.serialport.frame.ReadCommandFrame;
 import com.hboxs.serialport.frame.ResponseFrame;
+import com.hboxs.serialport.frame.WriteCommandFrame;
 import com.hboxs.serialport.message.Message;
 import com.hboxs.serialport.util.AsciiUtils;
+import com.hboxs.serialport.util.ByteUtils;
+import com.hboxs.serialport.util.HexUtils;
 import com.orhanobut.hawk.Hawk;
 import com.sunzee.R;
 import com.sunzee.base.BaseApplication;
@@ -37,6 +41,7 @@ import com.sunzee.model.domain.ErrorBean;
 import com.sunzee.model.domain.GetAdBean;
 import com.sunzee.model.domain.HeartbeatBean;
 import com.sunzee.model.domain.Name;
+import com.sunzee.model.domain.ParameterBean;
 import com.sunzee.model.domain.TimeRuleBean;
 import com.sunzee.model.domain.WarringBean;
 import com.sunzee.model.message.ApiMessageEvent;
@@ -45,9 +50,12 @@ import com.sunzee.receiver.Alarmreceiver;
 import com.sunzee.retrofit.ApiCallback;
 import com.sunzee.retrofit.ApiClient;
 import com.sunzee.retrofit.ApiStores;
+import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
+import com.sunzee.thread.myservice.ThreadPoolMyservice;
 import com.sunzee.ui.dialog.WarringDialog;
 import com.sunzee.utils.FileUtil;
 import com.sunzee.utils.HexadecimalUtil;
+import com.sunzee.utils.PreventSpeedClickUtil;
 import com.sunzee.utils.SharedPreferencesUtils;
 import com.sunzee.utils.TimeUtil;
 import com.sunzee.utils.ToastUtil;
@@ -62,6 +70,7 @@ import java.io.File;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -72,12 +81,17 @@ import java.util.TimerTask;
 import io.reactivex.Observable;
 import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.internal.operators.single.SingleJust;
 import io.reactivex.observers.DisposableObserver;
 import io.reactivex.schedulers.Schedulers;
 import okhttp3.RequestBody;
 
 public class MyService extends Service {
     private static final String TAG = "MyService";
+    private ThreadPoolMyservice mThreadPoolMyservice = new ThreadPoolMyservice();
+    private boolean isRead = true;
+    private boolean isRegularCleaning = false;
+    private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter();
 
     @Nullable
     @Override
@@ -90,8 +104,6 @@ public class MyService extends Service {
         super.onCreate();
         Log.d(TAG, "MyServiceonCreate: ");
         EventBus.getDefault().register(this);
-        // setError( UiUtil.getStringRes(R.string.warring_lutoujiare), true);
-
     }
 
     @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@@ -116,6 +128,8 @@ public class MyService extends Service {
             if (first == 4) {
                 //第一次启动心跳
                 checkHeartData();
+                mPoolAdvanceParameter.stopAll();
+                mPoolAdvanceParameter.startALLRead();
             }
         }
         //进程保活相关
@@ -153,7 +167,12 @@ public class MyService extends Service {
         if (warringDialog == null) {
             warringBeanDao = BaseApplication.getInstances().getDaoSession().getWarringBeanDao();
         }
-        startRead();
+        if (isRead) {
+            isRead = !isRead;
+            mThreadPoolMyservice.stopReadM600();
+            mThreadPoolMyservice.startALLRead();
+        }
+        //startRead();
         return super.onStartCommand(intent, flags, startId);
         //进程保活相关
         //return START_STICKY ;
@@ -162,6 +181,7 @@ public class MyService extends Service {
     @Override
     public void onDestroy() {
         super.onDestroy();
+        mThreadPoolMyservice.stopALLRead();
         EventBus.getDefault().unregister(this);
     }
 
@@ -284,13 +304,134 @@ public class MyService extends Service {
             case "startClean":
                 Log.d(TAG, "onReceive:闹钟响了26 " + messageEvent.getData());
                 //开始清洗。全蹲位。
+                /**
+                 * 1.首先检查是否过期了,是否有次数
+                 */
+                isCleaned();
+                break;
+            case "updataParamSet":
+                if (!PreventSpeedClickUtil.isFastClick()) {
+                    return;
+                }
+                isRegularCleaning = false;
+                startSet(messageEvent.getData());
+                break;
+            case "updataParamRst":
+                if (!PreventSpeedClickUtil.isFastClick()) {
+                    return;
+                }
+                isRegularCleaning = false;
+                startRst(messageEvent.getData());
                 break;
+            case "updataParamWrite":
+                if (!PreventSpeedClickUtil.isFastClick()) {
+                    return;
+                }
+                startWrite(messageEvent.getData());
             default:
                 break;
 
         }
     }
 
+    private void startWrite(Object kindData) {
+        String[] split = (String[]) kindData;
+        String address = split[0];
+        String data = split[1].trim();
+        String text = ByteUtils.decimal2fitHex(Integer.valueOf(data));
+        mThreadPoolMyservice.stopWrite();
+        mThreadPoolMyservice.startWrite(address, HexUtils.hexStr2BinStr(text));
+    }
+
+    private void startRst(Object data) {
+        mThreadPoolMyservice.stopRst();
+        mThreadPoolMyservice.startRst((String) data);
+    }
+
+    private void startSet(Object data) {
+        mThreadPoolMyservice.stopSet();
+        mThreadPoolMyservice.startSet((String) data);
+    }
+
+    private void isCleaned() {
+        addSubscription(apiStores.getBackgroundTime(), new ApiCallback<HttpResult<String>>() {
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+                try {
+                    String timedata = model.getData();
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(timedata));
+                    //第一次就会出现报错。
+                    Long overdueDate = (Long) Hawk.get("overdueDate");//购买的到期的时间
+                    Long timeInMillis = calendar.getTimeInMillis();//当前时间
+                    String data = (String) Hawk.get("remaining");
+                    long remaining = Long.valueOf(data);
+                    Log.d(TAG, "onSuccess: 时间过期remaining"+remaining);
+                    //如果时间没过期,那么可以继续制作
+                    if (overdueDate > timeInMillis) {
+                        Log.d(TAG, "onSuccess: 没有过期");
+                        //发送开始清洗的订单。
+                        getCleanReport(0);
+                        //如果还有次那么就开始购买。
+                    } else if (remaining > 0) {
+                        Log.d(TAG, "onSuccess: 时间过期,按次数计算");
+                        Hawk.put("remaining", String.valueOf(remaining - 1));
+                        //发送开始清洗的订单。
+                        getCleanReport(0);
+                    }else{
+                        Log.d(TAG, "onSuccess: 全部过期,全部不能清洗");
+                    }
+                } catch (Exception e) {
+                }
+            }
+
+            @Override
+            public void onFailure(String msg) {
+
+            }
+
+            @Override
+            public void onFinish() {
+
+            }
+        });
+
+    }
+
+    private void getCleanReport(int i) {
+        Map<String, String> params = new HashMap<>();
+        params.put("clientId", Heartbeat.deviceId);
+        params.put("type", i + "");
+        params.put("water", 1 + "");
+        params.put("electricity", 1 + "");
+        addSubscription(apiStores.getCleanReport(params), new ApiCallback<HttpResult<String>>() {
+
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+                Log.d(TAG, "getCleanReportonSuccess: " + model);
+                if ("success".equals(model.getData())) {
+                    startClean();
+                } else {
+                }
+            }
+
+            @Override
+            public void onFailure(String msg) {
+
+            }
+
+            @Override
+            public void onFinish() {
+
+            }
+        });
+    }
+
+    private void startClean() {
+        isRegularCleaning = true;
+        mThreadPoolMyservice.startSetM17();
+    }
+
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void event(DownLoadMessageEvent messageEvent) {
         switch (messageEvent.getType()) {
@@ -779,6 +920,23 @@ public class MyService extends Service {
             case sendError:
                 break;
             case ack:
+                Log.d(TAG, "Mevent: " + messageEvent.getName());
+                mThreadPoolMyservice.stopSet();
+                mThreadPoolMyservice.stopRst();
+                mThreadPoolMyservice.stopWrite();
+                if (messageEvent.getName().equals("M17")) {
+                    mThreadPoolMyservice.stopSetM17();
+                    if (isRegularCleaning) {
+                        isRegularCleaning = false;
+                        mThreadPoolMyservice.stopSetM8();
+                        mThreadPoolMyservice.startSetM8();
+                    }
+                } else if (messageEvent.getName().equals("M8")) {
+                    mThreadPoolMyservice.stopSetM8();
+                    // todo向上面报告开始清洗了。
+                }
+                mPoolAdvanceParameter.stopAll();
+                mPoolAdvanceParameter.startALLRead();
                 break;
             case nak:
                 break;
@@ -787,16 +945,16 @@ public class MyService extends Service {
                 break;
             case response:
                 ResponseFrame responseFrame = (ResponseFrame) messageEvent.getContent();
+                String name = messageEvent.getName();
                 if (responseFrame.isValidSum()) {
                     //通过校验
                     //1 获取本地存储的报警记录
                     //2 将本地的报警记录进行对比
                     //3 若没有的进行添加以及上传 没有的不管他
                     //4 最好走完将他覆盖
-                    if (messageEvent.getName().equals("M600")) {
+                    if (name.equals("M600")) {
                         try {
                             String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
-                            Log.d(TAG, "resultM600=" + result + ";name" + messageEvent.getName());
                             List<String> strList = HexadecimalUtil.getStrList(result, 4);
                             if (result.length() != 16) {
                                 return;
@@ -812,12 +970,18 @@ public class MyService extends Service {
                             List<String> lis = Arrays.asList(s1.split(""));
                             ArrayList<String> list = new ArrayList(lis);
                             list.remove(0);
-                            Log.d(TAG, "listevent: " + list);
                             showErrorDialog(list);
                         } catch (Exception e) {
                             e.printStackTrace();
                         }
+                    }else{
+                        //通过校验
+                        Log.d(TAG, "event: " + name);
+                        String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
+                        ArrayList<String> results = HexadecimalUtil.flipString(result);
+                        setAdvanced(name, results, mPoolAdvanceParameter);
                     }
+
                     break;
                 }
         }
@@ -1012,5 +1176,89 @@ public class MyService extends Service {
         }
     }
     //-----------------------------------------------------------------------报警 end---------------------------------
+    public void setAdvanced(String name, ArrayList<String> results, ThreadPoolAdvanceParameter threadGetParameter1) {
+        if (name.equals("D426")) {
+            if (!threadGetParameter1.isReceive1()) {
+                threadGetParameter1.setReceive1(true);
+                threadGetParameter1.stopReadD426();
+                threadGetParameter1.getValues()[0] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+        } else if (name.equals("D427")) {
+            if (!threadGetParameter1.isReceive2()) {
+                threadGetParameter1.setReceive2(true);
+                threadGetParameter1.stopReadD427();
+                threadGetParameter1.getValues()[1] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
 
+        } else if (name.equals("D428")) {
+            if (!threadGetParameter1.isReceive3()) {
+                threadGetParameter1.setReceive3(true);
+                threadGetParameter1.stopReadD428();
+                threadGetParameter1.getValues()[2] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+
+        } else if (name.equals("D429")) {
+            if (!threadGetParameter1.isReceive4()) {
+                threadGetParameter1.setReceive4(true);
+                //参数23 D278
+                threadGetParameter1.stopReadD429();
+                threadGetParameter1.getValues()[3] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+        } else if (name.equals("D430")) {
+            if (!threadGetParameter1.isReceive5()) {
+                threadGetParameter1.setReceive5(true);
+                threadGetParameter1.stopReadD430();
+                threadGetParameter1.getValues()[4] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+        } else if (name.equals("D431")) {
+            if (!threadGetParameter1.isReceive6()) {
+                threadGetParameter1.setReceive6(true);
+                threadGetParameter1.stopReadD431();
+                threadGetParameter1.getValues()[5] = String.valueOf(HexadecimalUtil.hex2dec(results.get(0)));
+            }
+        }
+        if (threadGetParameter1.isReceive1() && threadGetParameter1.isReceive2() && threadGetParameter1.isReceive3() && threadGetParameter1.isReceive4() && threadGetParameter1.isReceive5() && threadGetParameter1.isReceive6()) {
+            getDataSuccess();
+            threadGetParameter1.setReceive1(false);
+            threadGetParameter1.setReceive2(false);
+            threadGetParameter1.setReceive3(false);
+            threadGetParameter1.setReceive4(false);
+            threadGetParameter1.setReceive5(false);
+            threadGetParameter1.setReceive6(false);
+        }
+    }
+
+    public void getDataSuccess() {
+        String[] values = mPoolAdvanceParameter.getValues();
+        ArrayList<ParameterBean> parameterBeans = new ArrayList<>();
+        String[] paraAddress = {
+                "D426", "D427", "D428", "D429",
+                "D430", "D431"};
+        for (int i = 0; i < values.length; i++) {
+            parameterBeans.add(new ParameterBean(paraAddress[i], values[i]));
+        }
+        updateAdvanced(parameterBeans);
+    }
+
+    public void updateAdvanced(ArrayList<ParameterBean> parameterBeans) {
+
+        String url = "/api/app_equipment/index/updateParam/1/" + Heartbeat.deviceId + ".htm";
+        Gson gson = new Gson();
+        String json = gson.toJson(parameterBeans);
+        RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), json);
+        addSubscription(apiStores.updateParamApi(url, body), new ApiCallback<HttpResult<String>>() {
+            @Override
+            public void onSuccess(HttpResult<String> model) {
+                Log.d(TAG, "onSuccess: " + model);
+            }
+
+            @Override
+            public void onFailure(String msg) {
+            }
+
+            @Override
+            public void onFinish() {
+            }
+        });
+    }
 }

+ 0 - 2
app/src/main/java/com/sunzee/thread/advanceparameter/AdvanceParameterTask.java

@@ -5,8 +5,6 @@ import android.util.Log;
 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;
 
 /**

+ 13 - 6
app/src/main/java/com/sunzee/thread/advanceparameter/ThreadPoolAdvanceParameter.java

@@ -15,13 +15,11 @@ import java.util.concurrent.TimeUnit;
  * 进阶参数线程池
  */
 public class ThreadPoolAdvanceParameter {
-    private final String[] paraAddress;
     private ScheduledThreadPoolExecutor scheduled;
 
     public String[] getValues() {
         return values;
     }
-
     private String[] values = new String[6];
 
     private ScheduledFuture<?>
@@ -33,9 +31,8 @@ public class ThreadPoolAdvanceParameter {
             mTaskRunD426, mTaskRunD427, mTaskRunD428, mTaskRunD429,
             mTaskRunD430, mTaskRunD431, mTaskRunWrite;
 
-    public ThreadPoolAdvanceParameter(String[] paraAddress) {
-        this.paraAddress = paraAddress;
-        scheduled = new ScheduledThreadPoolExecutor(2);
+    public ThreadPoolAdvanceParameter() {
+        scheduled = new ScheduledThreadPoolExecutor(6);
         //设置线程池的策略  抛弃旧的任务
         scheduled.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
     }
@@ -116,6 +113,16 @@ public class ThreadPoolAdvanceParameter {
         mScheduledFutureD431 = scheduled.scheduleAtFixedRate(mTaskRunD431, 10, 1000, TimeUnit.MILLISECONDS);
     }
 
+    public void stopAll() {
+        stopRead(mTaskRunD426, mScheduledFutureD426);
+        stopRead(mTaskRunD427, mScheduledFutureD427);
+        stopRead(mTaskRunD428, mScheduledFutureD428);
+        stopRead(mTaskRunD429, mScheduledFutureD429);
+        stopRead(mTaskRunD430, mScheduledFutureD430);
+        stopRead(mTaskRunD431, mScheduledFutureD431);
+        stopRead(mTaskRunWrite, mScheduledFutureWrite);
+    }
+
     public void stopReadD426() {
         stopRead(mTaskRunD426, mScheduledFutureD426);
     }
@@ -152,7 +159,7 @@ public class ThreadPoolAdvanceParameter {
 
     public void startWrite(String paraAddress, String data) {
         mTaskRunWrite = new AdvanceParameterTask(AdvanceParameterThreadType.runWrite, paraAddress, data);
-        mScheduledFutureWrite = scheduled.scheduleAtFixedRate(mTaskRunWrite, 10, 1000, TimeUnit.MILLISECONDS);
+        mScheduledFutureWrite = scheduled.scheduleAtFixedRate(mTaskRunWrite, 0, 1000, TimeUnit.MILLISECONDS);
     }
 
     public void stopWrite() {

+ 20 - 0
app/src/main/java/com/sunzee/thread/debugparameter/DebugParameterTask.java

@@ -7,6 +7,8 @@ import com.hboxs.serialport.frame.SetCommandFrame;
 
 import static com.sunzee.thread.debugparameter.DebugParameterThreadType.runRst;
 import static com.sunzee.thread.debugparameter.DebugParameterThreadType.runSet;
+import static com.sunzee.thread.debugparameter.DebugParameterThreadType.runX;
+import static com.sunzee.thread.debugparameter.DebugParameterThreadType.runY;
 
 /**
  * 调试页面参数任务
@@ -82,7 +84,25 @@ public class DebugParameterTask implements Runnable {
             case runSet:
                 runSet();
                 break;
+            case runX:
+                runX();
+                break;
+            case runY:
+                runY();
+                break;
+
+        }
+    }
 
+    private void runY() {
+        if (getIsRun()) {
+            SerialPortSendQueue.sendCommand(new ReadCommandFrame("X0", 4), 2,"X0");
+        }
+    }
+
+    private void runX() {
+        if (getIsRun()) {
+            SerialPortSendQueue.sendCommand(new ReadCommandFrame("Y0", 4),1,"Y0");
         }
     }
 

+ 3 - 0
app/src/main/java/com/sunzee/thread/debugparameter/DebugParameterThreadType.java

@@ -6,4 +6,7 @@ public interface DebugParameterThreadType {
 
     int runRst = 0;
     int runSet = 1;
+    int runX = 2;
+    int runY = 3;
+    
 }

+ 26 - 2
app/src/main/java/com/sunzee/thread/debugparameter/ThreadPoolDebugParameter.java

@@ -14,9 +14,11 @@ public class ThreadPoolDebugParameter {
     private ScheduledThreadPoolExecutor scheduled;
 
     private ScheduledFuture<?>
-            mScheduledFutureM311, mScheduledFutureRst, mScheduledFutureSet;
+            mScheduledFutureM311, mScheduledFutureRst, mScheduledFutureSet,
+            mScheduledFutureX, mScheduledFutureY;
     private DebugParameterTask
-            mTaskRunM311, mTaskRunMRst, mTaskRunMSet;
+            mTaskRunM311, mTaskRunMRst, mTaskRunMSet,
+            mTaskRunX, mTaskRunY;
 
     public ArrayList<String> getValues() {
         return values;
@@ -38,6 +40,20 @@ public class ThreadPoolDebugParameter {
     public void startALLRead() {
         mTaskRunM311 = new DebugParameterTask(DebugParameterThreadType.runM311);
         mScheduledFutureM311 = scheduled.scheduleAtFixedRate(mTaskRunM311, 10, 1000, TimeUnit.MILLISECONDS);
+
+        mTaskRunX = new DebugParameterTask(DebugParameterThreadType.runX);
+        mScheduledFutureX = scheduled.scheduleAtFixedRate(mTaskRunX, 30, 1000, TimeUnit.MILLISECONDS);
+
+        mTaskRunY = new DebugParameterTask(DebugParameterThreadType.runY);
+        mScheduledFutureY = scheduled.scheduleAtFixedRate(mTaskRunY, 40, 1000, TimeUnit.MILLISECONDS);
+    }
+
+    public void stopAll() {
+        stopReadM311();
+        stopRst();
+        stopSet();
+        stopReadX();
+        stopReadY();
     }
 
     public void setReceive1(boolean receive1) {
@@ -55,6 +71,14 @@ public class ThreadPoolDebugParameter {
         stopRead(mTaskRunM311, mScheduledFutureM311);
     }
 
+    public void stopReadX() {
+        stopRead(mTaskRunX, mScheduledFutureX);
+    }
+
+    public void stopReadY() {
+        stopRead(mTaskRunY, mScheduledFutureY);
+    }
+
     //-------------------------------------------stop read-----------------------------------------------------
 
     public static void stopRead(DebugParameterTask threadTask, ScheduledFuture<?> scheduledFuture1) {

+ 6 - 0
app/src/main/java/com/sunzee/thread/generalparameter/ThreadPoolGeneralParameter.java

@@ -33,6 +33,12 @@ public class ThreadPoolGeneralParameter {
         Log.d(TAG, "startALLRead: " + mTaskRunM17 + ":" + mScheduledFutureM17);
     }
 
+    public void stopAll() {
+        stopRead(mTaskRunM17, mScheduledFutureM17);
+        stopRead(mTaskRunMRst, mScheduledFutureRst);
+        stopRead(mTaskRunMSet, mScheduledFutureSet);
+    }
+
     public void stopReadM17() {
         stopRead(mTaskRunM17, mScheduledFutureM17);
     }

+ 169 - 0
app/src/main/java/com/sunzee/thread/myservice/MyserviceTask.java

@@ -0,0 +1,169 @@
+package com.sunzee.thread.myservice;
+
+import android.util.Log;
+
+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;
+
+/**
+ * 长时间或者推送要执行的任务
+ */
+public class MyserviceTask 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 MyserviceTask(int type) {
+        clearPlcQuee();
+        this.type = type;
+    }
+
+    public MyserviceTask(int type, String address) {
+        clearPlcQuee();
+        this.type = type;
+        this.address = address;
+    }
+
+    public MyserviceTask(int type, String address, int id) {
+        clearPlcQuee();
+        this.type = type;
+        this.address = address;
+        this.id = id;
+    }
+
+    public MyserviceTask(int type, String address, String data) {
+        clearPlcQuee();
+        this.type = type;
+        this.address = address;
+        this.data = data;
+    }
+
+    public MyserviceTask(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 MyserviceThreadType.runM600:
+                runReadM600();
+                break;
+            case MyserviceThreadType.runM8:
+                runSetM8();
+                break;
+            case MyserviceThreadType.runM17:
+                runSetM17();
+                break;
+            case MyserviceThreadType.runRst:
+                runRst();
+                break;
+            case MyserviceThreadType.runSet:
+                runSet();
+                break;
+            case MyserviceThreadType.runWrite:
+                runWrite();
+                break;
+
+        }
+    }
+
+    private void runWrite() {
+        if (getIsRun()) {
+            SerialPortManager.getInstance().sendCommandFrame(new WriteCommandFrame(address, data), address);
+        }
+    }
+
+    private void runSet() {
+        if (getIsRun()) {
+            SerialPortSendQueue.sendCommand(new SetCommandFrame(address), 18, address);
+        }
+    }
+
+    private void runRst() {
+        if (getIsRun()) {
+            SerialPortSendQueue.sendCommand(new RstCommandFrame(address), 18, address);
+        }
+    }
+
+    private void runSetM17() {
+        if (getIsRun()) {
+            SerialPortSendQueue.sendCommand(new SetCommandFrame("M17"), 17, "M17");
+        }
+    }
+
+    private void runSetM8() {
+        if (getIsRun()) {
+            SerialPortSendQueue.sendCommand(new SetCommandFrame("M8"), 8, "M8");
+        }
+    }
+
+    private void runReadM600() {
+        if (getIsRun()) {
+            SerialPortSendQueue.sendCommand(new ReadCommandFrame("M600", 8), 600, "M600");
+        }
+    }
+
+    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;
+    }
+}

+ 11 - 0
app/src/main/java/com/sunzee/thread/myservice/MyserviceThreadType.java

@@ -0,0 +1,11 @@
+package com.sunzee.thread.myservice;
+
+public interface MyserviceThreadType {
+    int runM600 = 600;
+    int runM8 = 8;
+    int runM17 = 17;
+
+    int runRst = 0;
+    int runSet = 1;
+    int runWrite = 2;
+}

+ 102 - 0
app/src/main/java/com/sunzee/thread/myservice/ThreadPoolMyservice.java

@@ -0,0 +1,102 @@
+package com.sunzee.thread.myservice;
+
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 长时间或者推送要执行的线程池
+ */
+public class ThreadPoolMyservice {
+    private ScheduledThreadPoolExecutor scheduled;
+
+    private ScheduledFuture<?>
+            mScheduledFutureM600, mScheduledFutureM8, mScheduledFutureM17,
+            mScheduledFutureSet, mScheduledFutureRst, mScheduledFutureWrite;
+    private MyserviceTask
+            mTaskRunM600, MTaskRunM8, MTaskRunM17,
+            mTaskRunMRst, mTaskRunMSet, mTaskRunWrite;
+
+    public ThreadPoolMyservice() {
+        scheduled = new ScheduledThreadPoolExecutor(6);
+        //设置线程池的策略  抛弃旧的任务
+        scheduled.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
+    }
+
+    public void startALLRead() {
+        mTaskRunM600 = new MyserviceTask(MyserviceThreadType.runM600);
+        mScheduledFutureM600 = scheduled.scheduleAtFixedRate(mTaskRunM600, 0, 1000, TimeUnit.MILLISECONDS);
+    }
+
+    public void startSetM8() {
+        MTaskRunM8 = new MyserviceTask(MyserviceThreadType.runM8);
+        mScheduledFutureM8 = scheduled.scheduleAtFixedRate(MTaskRunM8, 0, 1000, TimeUnit.MILLISECONDS);
+    }
+
+    public void startSetM17() {
+        MTaskRunM17 = new MyserviceTask(MyserviceThreadType.runM17);
+        mScheduledFutureM17 = scheduled.scheduleAtFixedRate(MTaskRunM17, 0, 1000, TimeUnit.MILLISECONDS);
+    }
+
+    public void startRst(String address) {
+        mTaskRunMRst = new MyserviceTask(MyserviceThreadType.runRst, address);
+        mScheduledFutureRst = scheduled.scheduleAtFixedRate(mTaskRunMRst, 0, 1000, TimeUnit.MILLISECONDS);
+    }
+
+
+    public void startSet(String address) {
+        mTaskRunMSet = new MyserviceTask(MyserviceThreadType.runSet, address);
+        mScheduledFutureSet = scheduled.scheduleAtFixedRate(mTaskRunMSet, 0, 1000, TimeUnit.MILLISECONDS);
+    }
+
+    public void startWrite(String paraAddress, String data) {
+        mTaskRunWrite = new MyserviceTask(MyserviceThreadType.runWrite, paraAddress, data);
+        mScheduledFutureWrite = scheduled.scheduleAtFixedRate(mTaskRunWrite, 0, 1000, TimeUnit.MILLISECONDS);
+    }
+
+    public void stopWrite() {
+        stopRead(mTaskRunWrite, mScheduledFutureWrite);
+    }
+
+    public void stopRst() {
+        stopRead(mTaskRunMRst, mScheduledFutureRst);
+    }
+
+    public void stopSet() {
+        stopRead(mTaskRunMSet, mScheduledFutureSet);
+    }
+
+
+    public void stopReadM600() {
+        stopRead(mTaskRunM600, mScheduledFutureM600);
+    }
+
+
+    public static void stopRead(MyserviceTask threadTask, ScheduledFuture<?> scheduledFuture1) {
+        if (threadTask != null) {
+            threadTask.setIsRun(false);
+        }
+        if (scheduledFuture1 != null) {
+            scheduledFuture1.cancel(true);
+        }
+    }
+
+    public void stopSetM17() {
+        stopRead(MTaskRunM17, mScheduledFutureM17);
+    }
+
+    public void stopSetM8() {
+        stopRead(MTaskRunM8, mScheduledFutureM8);
+    }
+
+    public void stopALLRead(){
+        stopWrite();
+        stopRst();
+        stopSet();
+        stopReadM600();
+        stopSetM8();
+        stopSetM17();
+    }
+
+}

+ 94 - 3
app/src/main/java/com/sunzee/ui/activity/AdvertisingActivity.java

@@ -6,6 +6,7 @@ import android.os.Handler;
 import android.support.annotation.Nullable;
 import android.text.format.DateFormat;
 import android.util.Log;
+import android.view.KeyEvent;
 import android.view.SurfaceView;
 import android.view.View;
 import android.view.WindowManager;
@@ -13,18 +14,26 @@ import android.widget.ImageView;
 import android.widget.RelativeLayout;
 import android.widget.TextView;
 
+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.MvpActivity;
 import com.sunzee.model.Heartbeat;
+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.thread.advanceparameter.ThreadPoolAdvanceParameter;
 import com.sunzee.ui.dialog.WarringDialog;
 import com.sunzee.utils.AlarmManagerUtil;
 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;
@@ -55,7 +64,8 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
     private TextView mTvTime;
     private MyHandler myHandler;
     private TextView mTvEquipmentNo;
-    private WarringDialog warringDialog;
+    private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter();
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -104,6 +114,7 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
         LogUtil.d(TAG, "setup: " + mLeftsimplePlayer);
         play();
         startRefreshime();
+        mPoolAdvanceParameter.startALLRead();
     }
 
     private void play() {
@@ -111,16 +122,25 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
     }
 
 
+    /**
+     * 播放左边视频
+     *
+     * @param playFileList
+     */
     @Override
     public void playLeft(ArrayList<File> playFileList) {
         mLeftsimplePlayer.setFileData(playFileList);
         mLeftsimplePlayer.playVideo();
     }
 
+    /**
+     * 播放右边视频
+     *
+     * @param playFile
+     */
     @Override
     public void playRight(ArrayList<File> playFile) {
         mRightsimplePlayer.setFileData(playFile);
-
         mRightsimplePlayer.playVideo();
     }
 
@@ -130,6 +150,19 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
     }
 
     @Override
+    public void getDataSuccess() {
+        String[] values = mPoolAdvanceParameter.getValues();
+        ArrayList<ParameterBean> parameterBeans = new ArrayList<>();
+       String[] paraAddress = {
+                "D426", "D427", "D428", "D429",
+                "D430", "D431"};
+        for (int i = 0; i < values.length; i++) {
+            parameterBeans.add(new ParameterBean(paraAddress[i], values[i]));
+        }
+        mvpPresenter.updateAdvanced(parameterBeans);
+    }
+
+    @Override
     protected void onStop() {
         super.onStop();
         mLeftsimplePlayer.onDestroy();
@@ -146,6 +179,29 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
         stopRefreshTime();
     }
 
+    private long mPressTime = 0L;
+
+    /**
+     * 两次点击才能退出
+     *
+     * @param keyCode
+     * @param event
+     * @return
+     */
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            if (System.currentTimeMillis() - mPressTime < 1000) {
+                finish();
+            } else {
+                ToastUtil.showToast("再按一次退出");
+                mPressTime = System.currentTimeMillis();
+            }
+            return true;
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+
     //个推相关
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void event(DownLoadMessageEvent messageEvent) {
@@ -171,11 +227,45 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
         }
     }
 
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void event(Message messageEvent) {
+        switch (messageEvent.getType()) {
+            case connected:
+            case sendError:
+            case ack:
+                break;
+            case nak:
+                break;
+            case disconnected:
+                break;
+            case response:
+                ResponseFrame responseFrame = (ResponseFrame) messageEvent.getContent();
+                String name = messageEvent.getName();
+                if ("M600".equals(name)) {
+                    return;
+                }
+                if (responseFrame.isValidSum()) {
+                    //通过校验
+                    Log.d(TAG, "event: " + name);
+                    String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
+                    ArrayList<String> results = HexadecimalUtil.flipString(result);
+                    mvpPresenter.setAdvanced(name, results, mPoolAdvanceParameter);
+                }
+                break;
+        }
+    }
+
     @Override
     protected AdvertisingPresenter createPresenter() {
-        return new AdvertisingPresenter(this);
+        AdvertisingPresenter advertisingPresenter = new AdvertisingPresenter(this);
+        advertisingPresenter.requstCleanRule();
+        advertisingPresenter.requestCleanTimeAndRemaining();
+        return advertisingPresenter;
     }
 
+    /**
+     * 主要用于更新系统时间
+     */
     public static class MyHandler extends Handler {
         //持有弱引用HandlerActivity,GC回收时会被回收掉.
         private final WeakReference<AdvertisingActivity> mActivty;
@@ -200,6 +290,7 @@ public class AdvertisingActivity extends MvpActivity<AdvertisingPresenter> imple
     private Timer timerGetTime;
     private TimerTask timerGetTimerTak;
 
+    //时间日期的更新
     private void startRefreshime() {
         timerGetTime = new Timer();
         timerGetTimerTak = new TimerTask() {

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

@@ -20,6 +20,11 @@ import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import com.hboxs.serialport.SerialPortSendQueue;
+import com.hboxs.serialport.frame.ResponseFrame;
+import com.hboxs.serialport.frame.SetCommandFrame;
+import com.hboxs.serialport.message.Message;
+import com.hboxs.serialport.util.AsciiUtils;
 import com.sunzee.R;
 import com.sunzee.base.BaseFragment;
 import com.sunzee.base.MvpActivity;
@@ -37,6 +42,7 @@ import com.sunzee.ui.dialog.NormalDialog;
 import com.sunzee.ui.dialog.ShutdownDialog;
 import com.sunzee.utils.FileUtil;
 import com.sunzee.utils.HomePagerSimpleFactory;
+import com.sunzee.utils.PreventSpeedClickUtil;
 import com.sunzee.utils.SharedPreferencesUtils;
 import com.sunzee.utils.ToastUtil;
 import com.sunzee.utils.UiUtil;
@@ -46,6 +52,11 @@ import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
 import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
 
 /**
  * 后台首页 activity
@@ -64,6 +75,7 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
     private TextView mTvUpdataAPK;
     private LinearLayout mLlBlack;
     private ImageView mIvShutownLogo;
+    private PreventSpeedClickUtil mPreventSpeedClickUtil;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -96,6 +108,7 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
         }
         DownPresenter downPresenter = DownPresenter.getInstance();
         downPresenter.setProgressUpdate(this);
+        mPreventSpeedClickUtil = new PreventSpeedClickUtil();
     }
 
 
@@ -263,6 +276,7 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
     @Override
     protected void onStop() {
         super.onStop();
+        stopTimerSet();
         EventBus.getDefault().unregister(this);
     }
 
@@ -390,9 +404,65 @@ public class HomeActivity extends MvpActivity<HomePresenter> implements HomeView
         shutdownDialog.setListener(new ShutdownDialog.DialogClickListener() {
             @Override
             public void onClickListener(int type) {
+                switch (type) {
+                    case R.id.btn_confirm:
+                        //开机
+                        //防止快速点击
+                        if (!mPreventSpeedClickUtil.isFastClick()) {
+                            return;
+                        }
+                        stopTimerSet();
+                        startTimerSet("M3");
+                        break;
+                }
             }
         });
-        shutdownDialog.setBtnText(R.string.guang_ji, R.string.guang_ji1, R.string.guan_ji_now, R.string.open_now);
+        shutdownDialog.setBtnText(R.string.guang_ji, R.string.guang_ji1, R.string.open_now);
         shutdownDialog.show();
     }
+
+    private Timer timerSet;
+    private TimerTask timerTaskSet;
+
+    private void startTimerSet(final String address) {
+        timerSet = new Timer();
+        timerTaskSet = new TimerTask() {
+            @Override
+            public void run() {
+                SerialPortSendQueue.sendCommand(new SetCommandFrame(address), 3, address);
+            }
+        };
+        timerSet.schedule(timerTaskSet, 0, 100);
+    }
+
+    private void stopTimerSet() {
+        if (timerSet != null) {
+            timerTaskSet.cancel();
+            timerSet.cancel();
+            timerSet = null;
+        }
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void event(Message messageEvent) {
+        switch (messageEvent.getType()) {
+            case connected:
+            case sendError:
+            case ack:
+                int id = messageEvent.getId();
+                String name = messageEvent.getName();
+                //名字相等,写入成功
+                if (name.equals("M3")) {
+                    stopTimerSet();
+                    ToastUtil.showToast(UiUtil.getStringRes(R.string.gjcg));
+                }
+                break;
+            case nak:
+            case disconnected:
+                ToastUtil.showToast(messageEvent.getContent().toString());
+                break;
+            case response:
+                break;
+        }
+    }
 }

+ 4 - 20
app/src/main/java/com/sunzee/ui/dialog/ShutdownDialog.java

@@ -27,7 +27,6 @@ public class ShutdownDialog extends Dialog implements View.OnClickListener {
     private TextView tvTitle;
     private TextView tvContent;
     private Button btnConfirm;
-    private Button btnCancel;
     private ImageView IvQrCode;
 
     public void setListener(DialogClickListener listener) {
@@ -40,7 +39,7 @@ public class ShutdownDialog extends Dialog implements View.OnClickListener {
     public ShutdownDialog(@NonNull Context context) {
         super(context, R.style.DialogBgD);//加载样式
         mContext = context;
-        setContentView(R.layout.dialog_normal);
+        setContentView(R.layout.dialog_shutdown);
         initView();
     }
 
@@ -48,14 +47,11 @@ public class ShutdownDialog extends Dialog implements View.OnClickListener {
         tvTitle = findViewById(R.id.tv_title);
         tvContent = findViewById(R.id.tv_content);
         btnConfirm = findViewById(R.id.btn_confirm);
-        btnCancel = findViewById(R.id.btn_cancel);
         IvQrCode = findViewById(R.id.iv_qr_code);
         btnConfirm.setOnClickListener(this);
-        btnCancel.setOnClickListener(this);
 
         int param = (int) SharedPreferencesUtils.getParam(Name.LANGUAGE_TYPE, -1);
         if (param != 1) {
-            btnCancel.setLines(1);
             btnConfirm.setLines(1);
         }
     }
@@ -64,16 +60,13 @@ public class ShutdownDialog extends Dialog implements View.OnClickListener {
      * set button text
      *
      * @param strIdTitle title text
-     * @param strId      shutdown text
      * @param strid1     open text
      */
     @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
-    public void setBtnText(int strIdTitle, int content, int strId, int strid1) {
+    public void setBtnText(int strIdTitle, int content,int strid1) {
         tvTitle.setText(strIdTitle);
         tvContent.setText(content);
-        btnConfirm.setText(strId);
-        btnCancel.setText(strid1);
-        btnCancel.setTextColor(UiUtil.getColorRes(R.color.white));
+        btnConfirm.setText(strid1);
     }
 
     /**
@@ -85,15 +78,6 @@ public class ShutdownDialog extends Dialog implements View.OnClickListener {
     }
 
     /**
-     * get the text of buttonCancel
-     */
-    public String getBtnTextCancel() {
-
-        return btnCancel.getText().toString().trim();
-    }
-
-
-    /**
      * 设置文字
      *
      * @param text
@@ -115,11 +99,11 @@ public class ShutdownDialog extends Dialog implements View.OnClickListener {
         long shengyuData = openCloseFacility - System.currentTimeMillis();
         if (openCloseFacility == 0 | data > 30000) {
             listener.onClickListener(v.getId());
-//            new Thread(new CountDownThread()).start();
             SharedPreferencesUtils.setParam("open_close_facility", System.currentTimeMillis());
         } else {
             ToastUtil.showToast(String.format(mContext.getString(R.string.no_continuous_oepn_close_chance), (30 - ((Math.abs(shengyuData) % (1000 * 60)) / 1000))));
         }
+        dismiss();
         return;
 
     }

+ 3 - 42
app/src/main/java/com/sunzee/ui/dialog/WarringDialog.java

@@ -15,7 +15,7 @@ import com.sunzee.utils.UiUtil;
 import com.wuxiaolong.androidutils.library.LogUtil;
 
 /**
- * @Description 警报框
+ * @Description 警报框 dialog
  */
 public class WarringDialog extends Dialog {
     private Context mContext;
@@ -29,6 +29,7 @@ public class WarringDialog extends Dialog {
         super(context, R.style.DialogBgD);//加载样式
         mContext = context;
         setContentView(R.layout.dialog_text);
+        this.setCanceledOnTouchOutside(false);
         initView();
         initEvent();
     }
@@ -61,49 +62,9 @@ public class WarringDialog extends Dialog {
         isTouch = false;
         LogUtil.d("WarringDialog", "show");
     }
+
     public void setTvContent(int strId) {
         tvContent.setText(strId);
-//        switch (strId) {
-//            case R.string.warring_gunhechugun:
-//                mIvImg.setImageResource(R.drawable.warring_gunhequegunbaojing);
-//                break;
-//            case R.string.warring_gunhequegunbaojing:
-//                mIvImg.setImageResource(R.drawable.warring_gunhequegunbaojing);
-//                break;
-//            case R.string.warring_qshqs:
-//                mIvImg.setImageResource(R.drawable.warring_qshqs);
-//                break;
-//            case R.string.warring_fsm:
-//                mIvImg.setImageResource(R.drawable.warring_fsm);
-//                break;
-//            case R.string.warring_qbt:
-//                mIvImg.setImageResource(R.drawable.warring_qbt);
-//                break;
-//            case R.string.warring_qht:
-//                mIvImg.setImageResource(R.drawable.warring_qht);
-//                break;
-//            case R.string.warring_qhuangt:
-//                mIvImg.setImageResource(R.drawable.warring_qhuangt);
-//                break;
-//            case R.string.warring_qlt:
-//                mIvImg.setImageResource(R.drawable.warring_qlt);
-//                break;
-//            case R.string.warring_sbfw:
-//                mIvImg.setImageResource(R.drawable.warring_sbfw);
-//                break;
-//            case R.string.warring_wcqg:
-//                mIvImg.setImageResource(R.drawable.warring_wcqg);
-//                break;
-//            case R.string.warring_gdjc:
-//                mIvImg.setImageResource(R.drawable.warring_gdjc);
-//                break;
-//            case R.string.warring_qbcqjc:
-//                mIvImg.setImageResource(R.drawable.warring_qbcqjc);
-//                break;
-//            default:
-//                mIvImg.setImageResource(R.drawable.bb);
-//                break;
-//        }
 //        String contactsNum = (String) SharedPreferencesUtils.getParam(Name.CONTACTS_NUM, "");
 //        String contactsName = (String) SharedPreferencesUtils.getParam(Name.CONTACTS_NAME, "");
         tvContent1.setText(UiUtil.getStringRes(R.string.warring_content1) /*+ contactsName + "-" + contactsNum*/);

+ 28 - 20
app/src/main/java/com/sunzee/ui/fragment/AdvanceParameterFragment.java

@@ -31,6 +31,8 @@ import com.sunzee.mvp.advanceparameter.AdvanceParameterPresenter;
 import com.sunzee.mvp.advanceparameter.AdvanceParameterView;
 import com.sunzee.thread.advanceparameter.ThreadPoolAdvanceParameter;
 import com.sunzee.utils.HexadecimalUtil;
+import com.sunzee.utils.PreventSpeedClickUtil;
+import com.sunzee.utils.ToastUtil;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
@@ -43,18 +45,11 @@ import java.util.ArrayList;
  */
 public class AdvanceParameterFragment extends MvpFragment<AdvanceParameterPresenter> implements AdvanceParameterView {
 
-    private final int[] paraName = {
-            R.string.advance_parameter_7, R.string.advance_parameter_8,
-            R.string.advance_parameter_9, R.string.advance_parameter_10,
-            R.string.advance_parameter_11, R.string.advance_parameter_12,
-    };
-    private final String[] paraAddress = {
-            "D426", "D427", "D428", "D429",
-            "D430", "D431"};
     private RecyclerView mRvCrrency;
     private AdvanceParameterAdapter mAdvanceParameterAdapter;
     private static final String TAG = "AdvanceParameterFragmen";
-    private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter(paraAddress);
+    private ThreadPoolAdvanceParameter mPoolAdvanceParameter = new ThreadPoolAdvanceParameter();
+    private PreventSpeedClickUtil mPreventSpeedClickUtil;
 
     @Nullable
     @Override
@@ -71,27 +66,36 @@ public class AdvanceParameterFragment extends MvpFragment<AdvanceParameterPresen
         Log.d(TAG, "onStart: ");
         EventBus.getDefault().register(this);
         showLoading();
+        mPoolAdvanceParameter.stopAll();
         mPoolAdvanceParameter.startALLRead();
     }
 
     @Override
     public void onDestroyView() {
         EventBus.getDefault().unregister(this);
+        mPoolAdvanceParameter.stopAll();
+        Log.d(TAG, "onDestroyView: ");
         super.onDestroyView();
     }
 
     private void initEvent() {
         mAdvanceParameterAdapter.setItemListener(new AdvanceParameterAdapter.ItemParaClickListener() {
             @Override
-            public void onItemListener(View view, int position, String text) {
+            public void onItemListener(View view, int position, String text, String paraAddress) {                        //防止快速点击
+                /**
+                 * 为什么每次开启之前都需要关掉呢?因为有可能收不到数据,没有停止,那么我们有必要开启之前就关掉。
+                 */
+                //防止快速点击
+                if (!mPreventSpeedClickUtil.isFastClick()) {
+                    return;
+                }
+                mPoolAdvanceParameter.stopWrite();
+                showLoading();
                 View v = mRvCrrency.getChildAt(position);
                 if (null != mRvCrrency.getChildViewHolder(v)) {
                     String data = ByteUtils.decimal2fitHex(Integer.valueOf(text));
-                    mPoolAdvanceParameter.startWrite(paraAddress[position], HexUtils.hexStr2BinStr(data));
-                    Log.d(TAG, "onItemListener: "+HexUtils.hexStr2BinStr(data));
-
+                    mPoolAdvanceParameter.startWrite(paraAddress, HexUtils.hexStr2BinStr(data));
                 }
-                Log.d(TAG, "onItemListener: " + mAdvanceParameterAdapter.getParameterBeans());
             }
         });
         mRvCrrency.setOnTouchListener(new View.OnTouchListener() {
@@ -110,10 +114,11 @@ public class AdvanceParameterFragment extends MvpFragment<AdvanceParameterPresen
 
     private void initView(View inflate) {
         mRvCrrency = inflate.findViewById(R.id.rv_currency);
-        mAdvanceParameterAdapter = new AdvanceParameterAdapter(paraName);
+        mAdvanceParameterAdapter = new AdvanceParameterAdapter();
         GridLayoutManager layoutManager = new GridLayoutManager(BaseApplication.getContext(), 9, GridLayoutManager.HORIZONTAL, false);
         mRvCrrency.setAdapter(mAdvanceParameterAdapter);
         mRvCrrency.setLayoutManager(layoutManager);
+        mPreventSpeedClickUtil = new PreventSpeedClickUtil();
     }
 
     @Override
@@ -157,6 +162,7 @@ public class AdvanceParameterFragment extends MvpFragment<AdvanceParameterPresen
             case sendError:
                 break;
             case ack:
+                ToastUtil.showToast("更新成功");
                 Log.d(TAG, "event: 写入成功");
                 mPoolAdvanceParameter.stopWrite();
                 //todo 上传
@@ -170,26 +176,28 @@ public class AdvanceParameterFragment extends MvpFragment<AdvanceParameterPresen
                 break;
             case response:
                 ResponseFrame responseFrame = (ResponseFrame) messageEvent.getContent();
+                String name = messageEvent.getName();
+                if ("M600".equals(name)) {
+                    return;
+                }
                 if (responseFrame.isValidSum()) {
                     //通过校验
-                    String name = messageEvent.getName();
                     Log.d(TAG, "event: " + name);
                     String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
                     ArrayList<String> results = HexadecimalUtil.flipString(result);
                     mvpPresenter.setAdvanced(name, results, mPoolAdvanceParameter);
-                    hideLoading();
-                    break;
                 }
+                break;
         }
     }
 
     @Override
     public void getDataSuccess() {
+
         mAdvanceParameterAdapter.setValues(mPoolAdvanceParameter.getValues());
         mAdvanceParameterAdapter.notifyDataSetChanged();
         //todo 上传
         mvpPresenter.updateAdvanced(mAdvanceParameterAdapter.getParameterBeans());
+        hideLoading();
     }
-
-
 }

+ 109 - 30
app/src/main/java/com/sunzee/ui/fragment/DebugFragment.java

@@ -5,6 +5,7 @@ import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -19,39 +20,36 @@ import com.hboxs.serialport.message.Message;
 import com.hboxs.serialport.util.AsciiUtils;
 import com.sunzee.R;
 import com.sunzee.adapter.DebugParameterAdapter;
-import com.sunzee.adapter.GeneralParameterAdapter;
+import com.sunzee.adapter.DebugParameterXAdapter;
+import com.sunzee.adapter.DebugParameterYAdapter;
 import com.sunzee.base.BaseApplication;
 import com.sunzee.base.MvpFragment;
 import com.sunzee.mvp.debug.DebugPresenter;
 import com.sunzee.mvp.debug.DebugView;
 import com.sunzee.thread.debugparameter.ThreadPoolDebugParameter;
-import com.sunzee.utils.HexadecimalUtil;
+import com.sunzee.utils.CustomDecoration;
+import com.sunzee.utils.PreventSpeedClickUtil;
+import com.sunzee.utils.UiUtil;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 /**
  * 调试页界面 fragment
  */
 public class DebugFragment extends MvpFragment<DebugPresenter> implements DebugView {
-    private final int[] paraName = {
-            R.string.debug_1, R.string.debug_2,
-            R.string.debug_3, R.string.debug_4,
-            R.string.debug_5, R.string.debug_6,
-            R.string.debug_7
-    };
-    private final String[] paraAddress = {
-            "M311", "M312", "M313", "M315",
-            "M316", "M317", "M318"};
     private RecyclerView mRvDebugList;
     private DebugParameterAdapter mDebugParameterAdapter;
     private ThreadPoolDebugParameter mPoolDebugParameter = new ThreadPoolDebugParameter();
-
+    private RecyclerView mRvDebugListX;
+    private RecyclerView mRvDebugListY;
+    private DebugParameterXAdapter mDebugParameterXAdapter;
+    private DebugParameterYAdapter mDebugParameterYAdapter;
+    private PreventSpeedClickUtil mPreventSpeedClickUtil;
 
     @Nullable
     @Override
@@ -67,11 +65,16 @@ public class DebugFragment extends MvpFragment<DebugPresenter> implements DebugV
         super.onStart();
         EventBus.getDefault().register(this);
         showLoading();
+        mPoolDebugParameter.stopAll();
         mPoolDebugParameter.startALLRead();
     }
 
     @Override
     public void onDestroyView() {
+        if (mPoolDebugParameter != null) {
+            mPoolDebugParameter.stopAll();
+        }
+        Log.d(TAG, "onDestroyView: ");
         EventBus.getDefault().unregister(this);
         super.onDestroyView();
     }
@@ -81,27 +84,47 @@ public class DebugFragment extends MvpFragment<DebugPresenter> implements DebugV
     private void initEvent() {
         mDebugParameterAdapter.setItemListener(new DebugParameterAdapter.ItemParaClickListener() {
             @Override
-            public void onItemListener(View view, int position, String text) {
+            public void onItemListener(View view, int position, String address) {
+                //防止快速点击
+                if (!mPreventSpeedClickUtil.isFastClick()) {
+                    return;
+                }
+                showLoading();
                 //点击的时候就开始写入
-                final String address = paraAddress[position];
+                //final String address = paraAddress[position];
                 CheckBox checkBox = (CheckBox) view;
                 if (!checkBox.isChecked()) {
+                    mPoolDebugParameter.stopRst();
                     mPoolDebugParameter.startRst(address);
                 } else {
+                    mPoolDebugParameter.stopSet();
                     mPoolDebugParameter.startSet(address);
                 }
-                showLoading();
             }
         });
     }
 
     private void initView(View inflate) {
         mRvDebugList = inflate.findViewById(R.id.rv_degbuglist);
-        mDebugParameterAdapter = new DebugParameterAdapter(paraName);
+        mDebugParameterAdapter = new DebugParameterAdapter();
         GridLayoutManager layoutManager = new GridLayoutManager(BaseApplication.getContext(), 9, GridLayoutManager.HORIZONTAL, false);
         mRvDebugList.setAdapter(mDebugParameterAdapter);
         mRvDebugList.setLayoutManager(layoutManager);
-
+        mRvDebugListX = inflate.findViewById(R.id.rv_x);
+        mRvDebugListY = inflate.findViewById(R.id.rv_y);
+        LinearLayoutManager layoutManagerx = new LinearLayoutManager(BaseApplication.getContext());
+        LinearLayoutManager layoutManagery = new LinearLayoutManager(BaseApplication.getContext());
+        mRvDebugListX.setLayoutManager(layoutManagerx);
+        mRvDebugListX.addItemDecoration(new CustomDecoration(BaseApplication.getContext(), LinearLayoutManager.VERTICAL, 2));
+        mRvDebugListY.setLayoutManager(layoutManagery);
+        mRvDebugListY.addItemDecoration(new CustomDecoration(BaseApplication.getContext(), LinearLayoutManager.VERTICAL, 2));
+        mDebugParameterXAdapter = new DebugParameterXAdapter();
+        mDebugParameterYAdapter = new DebugParameterYAdapter();
+        mRvDebugListX.setItemViewCacheSize(23);
+        mRvDebugListY.setItemViewCacheSize(24);
+        mRvDebugListX.setAdapter(mDebugParameterXAdapter);
+        mRvDebugListY.setAdapter(mDebugParameterYAdapter);
+        mPreventSpeedClickUtil = new PreventSpeedClickUtil();
     }
 
     @Subscribe(threadMode = ThreadMode.MAIN)
@@ -125,20 +148,13 @@ public class DebugFragment extends MvpFragment<DebugPresenter> implements DebugV
                 break;
             case response:
                 ResponseFrame responseFrame = (ResponseFrame) messageEvent.getContent();
+                String name = messageEvent.getName();
+                if ("M600".equals(name)) {
+                    return;
+                }
                 if (responseFrame.isValidSum()) {
-                    //通过校验
-                    String name = messageEvent.getName();
-                    Log.d(TAG, "event: " + name);
                     String result = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
-                    ArrayList<String> results = HexadecimalUtil.flipString(result);
-                    //    转成2进制
-                    String s = HexadecimalUtil.hexStringToByte(result);
-                    //翻转后的数据
-                    String s1 = HexadecimalUtil.flipString(s, 8);
-                    List<String> lis = Arrays.asList(s1.split(""));
-                    ArrayList<String> list = new ArrayList(lis);
-                    list.remove(0);
-                    mvpPresenter.setDebugParameter(name, list, mPoolDebugParameter);
+                    mvpPresenter.setData(messageEvent, responseFrame, result, mPoolDebugParameter);
                     break;
                 }
         }
@@ -148,6 +164,69 @@ public class DebugFragment extends MvpFragment<DebugPresenter> implements DebugV
     public void getDataSuccess() {
         getValue(mPoolDebugParameter.getValues());
     }
+    @Override
+    public void setXStatu(ArrayList<String> list2) {
+        for (int i = 0; i < list2.size(); i++) {
+            getXValue(list2,i,i,mRvDebugListX);
+        }
+    }
+
+    @Override
+    public void setYStatu(ArrayList<String> list2) {
+        Log.d(TAG, "setYStatu: "+list2);
+        for (int i = 0; i < list2.size(); i++) {
+            getYValue(list2,i,i,mRvDebugListY);
+        }
+    }
+
+    /**
+     * 改变对应的状态
+     *
+     * @param lis      读取lpc返回值列表
+     * @param index    lis对应的值
+     * @param position 要改变的图片的位置
+     */
+    private void getXValue(final List<String> lis, final int index, int position, RecyclerView recyclerView) {
+        //通过RecyclerView getChildAt();是不能正确获取item的view的,前几个获取可能还是正常的,往后滑后面的获取就不正常了
+        //View view = recyclerView.getChildAt(position+1);
+        View view = recyclerView.getLayoutManager().findViewByPosition(position+1);
+        if (view == null) {
+            Log.d("空1", "getXYValue: p=" + position + "  index=" + index);
+        } else {
+            DebugParameterXAdapter.ViewHolder viewHolder = (DebugParameterXAdapter.ViewHolder) recyclerView.getChildViewHolder(view);
+            if (lis.get(index).equals("1")) {
+                viewHolder.ivState.setImageDrawable(UiUtil.getDrawableRes(R.drawable.shape_circle_oragnge));
+            } else {
+                viewHolder.ivState.setImageDrawable(UiUtil.getDrawableRes(R.drawable.shape_circle));
+            }
+
+        }
+
+
+    }
+    /**
+     * 改变对应的状态
+     *
+     * @param lis      读取lpc返回值列表
+     * @param index    lis对应的值
+     * @param position 要改变的图片的位置
+     */
+    private void getYValue(final List<String> lis, final int index, int position, RecyclerView recyclerView) {
+        View view = recyclerView.getLayoutManager().findViewByPosition(position+1);
+        if (view == null) {
+            Log.d("空1", "getXYValue: p=" + position + "  index=" + index);
+        } else {
+            DebugParameterYAdapter.ViewHolder viewHolder = (DebugParameterYAdapter.ViewHolder) recyclerView.getChildViewHolder(view);
+            if (lis.get(index).equals("1")) {
+                viewHolder.ivState.setImageDrawable(UiUtil.getDrawableRes(R.drawable.shape_circle_oragnge));
+            } else {
+                viewHolder.ivState.setImageDrawable(UiUtil.getDrawableRes(R.drawable.shape_circle));
+            }
+
+        }
+
+
+    }
 
     /**
      * 改变对应的状态

+ 33 - 6
app/src/main/java/com/sunzee/ui/fragment/GeneralParameterFragment.java

@@ -6,6 +6,7 @@ import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v7.widget.GridLayoutManager;
 import android.support.v7.widget.RecyclerView;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -24,12 +25,15 @@ import com.sunzee.mvp.generalparameter.GeneralParameterPresenter;
 import com.sunzee.mvp.generalparameter.GeneralParameterView;
 import com.sunzee.thread.generalparameter.ThreadPoolGeneralParameter;
 import com.sunzee.utils.HexadecimalUtil;
+import com.sunzee.utils.PreventSpeedClickUtil;
 
 import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * 通用参数界面 fragment
@@ -40,6 +44,7 @@ public class GeneralParameterFragment extends MvpFragment<GeneralParameterPresen
     private RecyclerView mRvCrrency;
     private GeneralParameterAdapter mGeneralParameterAdapter;
     private ThreadPoolGeneralParameter mPoolGeneralParameter = new ThreadPoolGeneralParameter();
+    private PreventSpeedClickUtil mPreventSpeedClickUtil;
 
     @Nullable
     @Override
@@ -55,6 +60,7 @@ public class GeneralParameterFragment extends MvpFragment<GeneralParameterPresen
         super.onStart();
         EventBus.getDefault().register(this);
         showLoading();
+        mPoolGeneralParameter.stopAll();
         mPoolGeneralParameter.startALLRead();
     }
 
@@ -62,6 +68,8 @@ public class GeneralParameterFragment extends MvpFragment<GeneralParameterPresen
     @Override
     public void onDestroyView() {
         EventBus.getDefault().unregister(this);
+        mPoolGeneralParameter.stopAll();
+        Log.d(TAG, "onDestroyView: ");
         super.onDestroyView();
     }
 
@@ -69,12 +77,20 @@ public class GeneralParameterFragment extends MvpFragment<GeneralParameterPresen
         mGeneralParameterAdapter.setItemListener(new GeneralParameterAdapter.ItemParaClickListener() {
             @Override
             public void onItemListener(View view, int position, String text) {
+                //防止快速点击
+                if (!mPreventSpeedClickUtil.isFastClick()) {
+                    return;
+                }
                 //点击的时候就开始写入
                 final String address = paraAddress[position];
                 CheckBox checkBox = (CheckBox) view;
                 if (!checkBox.isChecked()) {
+                    //为什么每次开启之前都需要关掉呢?因为有可能收不到数据,没有停止,那么我们有必要开启之前就关掉。
+                    mPoolGeneralParameter.stopRst();
                     mPoolGeneralParameter.startRst(address);
                 } else {
+                    //为什么每次开启之前都需要关掉呢?因为有可能收不到数据,没有停止,那么我们有必要开启之前就关掉。
+                    mPoolGeneralParameter.stopRst();
                     mPoolGeneralParameter.startSet(address);
                 }
                 showLoading();
@@ -88,6 +104,7 @@ public class GeneralParameterFragment extends MvpFragment<GeneralParameterPresen
         GridLayoutManager layoutManager = new GridLayoutManager(BaseApplication.getContext(), 9, GridLayoutManager.HORIZONTAL, false);
         mRvCrrency.setAdapter(mGeneralParameterAdapter);
         mRvCrrency.setLayoutManager(layoutManager);
+        mPreventSpeedClickUtil = new PreventSpeedClickUtil();
     }
 
     @Override
@@ -118,13 +135,23 @@ public class GeneralParameterFragment extends MvpFragment<GeneralParameterPresen
                 break;
             case response:
                 ResponseFrame responseFrame = (ResponseFrame) messageEvent.getContent();
+                String name = messageEvent.getName();
+                if ("M600".equals(name)) {
+                    return;
+                }
                 String result1 = AsciiUtils.asciiByteArray2HexStr(responseFrame.getData());
                 //通过校验
-                String name = messageEvent.getName();
                 if (name.equals("M17")) {
-                    ArrayList<String> results1 = HexadecimalUtil.flipString(result1);
-                    long data = HexadecimalUtil.hex2dec(results1.get(0));
-                    if (data != 0) {
+//                    ArrayList<String> results = HexadecimalUtil.flipString(result1);
+//                    long data = HexadecimalUtil.hex2dec(results1.get(0));
+                    String s = HexadecimalUtil.hexStringToByte(result1);
+                    String s1 = HexadecimalUtil.flipString(s, 8);
+                    List<String> lis = Arrays.asList(s1.split(""));
+                    ArrayList<String> list = new ArrayList(lis);
+                    list.remove(0);
+                    String data = list.get(1);
+                    Log.d(TAG, "M17event: " + list);
+                    if (!"0".equals(data)) {
                         setStatus(0, data);
                     }
                     mPoolGeneralParameter.stopReadM17();
@@ -135,11 +162,11 @@ public class GeneralParameterFragment extends MvpFragment<GeneralParameterPresen
 
     }
 
-    private void setStatus(int position, long data) {
+    private void setStatus(int position, String data) {
         View view = mRvCrrency.getChildAt(position);
         if (null != mRvCrrency.getChildViewHolder(view)) {
             GeneralParameterAdapter.ViewHolder viewHolder = (GeneralParameterAdapter.ViewHolder) mRvCrrency.getChildViewHolder(view);
-            if (data != 0) {
+            if (!"0".equals(data)) {
                 //当它为选择状态时,无需设置,避免闪硕
                 if (!viewHolder.cbManual.isChecked()) {
                     viewHolder.cbManual.setChecked(true);

+ 20 - 0
app/src/main/java/com/sunzee/utils/PreventSpeedClickUtil.java

@@ -0,0 +1,20 @@
+package com.sunzee.utils;
+
+/**
+ * 防止快速点击
+ */
+public class PreventSpeedClickUtil {
+    // 两次点击按钮之间的点击间隔不能少于1000毫秒
+    private static final int MIN_CLICK_DELAY_TIME = 1000;
+    private static long lastClickTime;
+
+    public static boolean isFastClick() {
+        boolean flag = false;
+        long curClickTime = System.currentTimeMillis();
+        if ((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) {
+            flag = true;
+        }
+        lastClickTime = curClickTime;
+        return flag;
+    }
+}

+ 21 - 0
app/src/main/res/drawable-mdpi/shape_circle.xml

@@ -0,0 +1,21 @@
+<?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="@color/logo_blue" />
+    <padding
+        android:left="2dp"
+        android:top="1dp"
+        android:right="2dp"
+        android:bottom="1dp" />
+    <solid
+        android:color="@color/logo_blue" />
+    <stroke
+        android:width="1dp"
+        android:color="@android:color/white" />
+
+    <!--这里宽高要一样 -->
+    <size android:width="@dimen/dp_8"
+        android:height="@dimen/dp_8" />
+</shape>

app/src/main/res/drawable-v24/ic_launcher_foreground.xml → app/src/main/res/drawable/ic_launcher_foreground.xml


+ 21 - 0
app/src/main/res/drawable/shape_circle_oragnge.xml

@@ -0,0 +1,21 @@
+<?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="@color/colorOrange" />
+    <padding
+        android:left="2dp"
+        android:top="1dp"
+        android:right="2dp"
+        android:bottom="1dp" />
+    <solid
+        android:color="@color/colorOrange" />
+    <stroke
+        android:width="1dp"
+        android:color="@android:color/white" />
+
+    <!--这里宽高要一样 -->
+    <size android:width="@dimen/dp_8"
+        android:height="@dimen/dp_8" />
+</shape>

+ 60 - 0
app/src/main/res/layout/dialog_shutdown.xml

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:layout_width="@dimen/dp_200"
+        android:layout_height="wrap_content"
+        android:layout_centerInParent="true"
+        android:background="@drawable/shape_btn_back"
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/tv_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/dp_20"
+            android:text="@string/confirm_reminder"
+            android:textColor="#014DA1"
+            android:textSize="@dimen/dp_10" />
+
+        <ImageView
+            android:id="@+id/iv_qr_code"
+            android:layout_width="@dimen/dp_86"
+            android:layout_height="@dimen/dp_86"
+            android:layout_gravity="center_horizontal"
+            android:src="@drawable/shape_btn_back"
+            android:visibility="gone" />
+
+        <TextView
+            android:id="@+id/tv_content"
+            android:layout_width="@dimen/dp_160"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="@dimen/dp_20"
+            android:gravity="center_horizontal"
+            android:text="@string/confirm_content"
+            android:textColor="@color/colorGray"
+            android:textSize="@dimen/dp_10" />
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="@dimen/dp_20"
+            android:orientation="horizontal">
+
+            <Button
+                android:id="@+id/btn_confirm"
+                android:layout_width="@dimen/dp_70"
+                android:layout_height="@dimen/dp_22"
+                android:layout_marginRight="@dimen/dp_10"
+                android:background="@drawable/shape_system_btn_rounded_rectangle"
+                android:text="@string/open_now"
+                android:textColor="@color/white"
+                android:textSize="@dimen/dp_10" />
+
+        </LinearLayout>
+    </LinearLayout>
+</RelativeLayout>

+ 41 - 2
app/src/main/res/layout/fragment_debug.xml

@@ -3,11 +3,50 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@color/shallowblue"
-    android:padding="@dimen/dp_5">
+    android:orientation="horizontal"
+    android:padding="@dimen/dp_20">
 
     <android.support.v7.widget.RecyclerView
         android:id="@+id/rv_degbuglist"
+        android:layout_width="@dimen/dp_70"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="@dimen/dp_20" />
+
+    <LinearLayout
+        android:orientation="vertical"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+        <TextView
+            android:text= "X信号"
+            android:layout_marginBottom="@dimen/dp_5"
+            android:textColor="@color/logo_blue"
+            android:textSize="@dimen/dp_6"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/rv_x"
+            android:layout_width="@dimen/dp_144"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="@dimen/dp_20" />
+    </LinearLayout>
+
+
+    <LinearLayout
+        android:orientation="vertical"
         android:layout_width="wrap_content"
-        android:layout_height="wrap_content" />
+        android:layout_height="wrap_content">
+        <TextView
+            android:text= "Y信号"
+            android:layout_marginBottom="@dimen/dp_5"
+            android:textColor="@color/logo_blue"
+            android:textSize="@dimen/dp_6"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/rv_y"
+            android:layout_width="@dimen/dp_144"
+            android:layout_height="wrap_content"
+            android:layout_marginRight="@dimen/dp_20" />
+    </LinearLayout>
 
 </LinearLayout>

+ 4 - 6
app/src/main/res/layout/item_debugparameter.xml

@@ -1,16 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="@dimen/dp_60"
-    android:layout_height="@dimen/dp_20"
-    android:layout_gravity="center"
-    android:layout_marginTop="@dimen/dp_10"
-    android:layout_marginRight="@dimen/dp_6"
+    android:layout_height="wrap_content"
+    android:layout_marginBottom="@dimen/dp_10"
     android:gravity="center">
 
     <CheckBox
         android:id="@+id/cb_manual"
-        android:layout_width="@dimen/dp_80"
-        android:layout_height="match_parent"
+        android:layout_width="@dimen/dp_60"
+        android:layout_height="@dimen/dp_20"
         android:layout_gravity="center"
         android:background="@drawable/selector_orange_bg"
         android:button="@null"

+ 4 - 6
app/src/main/res/layout/item_generalparameter.xml

@@ -1,16 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="@dimen/dp_60"
-    android:layout_height="@dimen/dp_20"
+    android:layout_height="wrap_content"
     android:layout_gravity="center"
-    android:layout_marginTop="@dimen/dp_10"
-    android:layout_marginRight="@dimen/dp_6"
-    android:gravity="center">
+    android:layout_marginBottom="@dimen/dp_10">
 
     <CheckBox
         android:id="@+id/cb_manual"
-        android:layout_width="@dimen/dp_80"
-        android:layout_height="match_parent"
+        android:layout_width="@dimen/dp_60"
+        android:layout_height="@dimen/dp_20"
         android:layout_gravity="center"
         android:background="@drawable/selector_orange_bg"
         android:button="@null"

+ 44 - 0
app/src/main/res/layout/item_xy.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/dp_144"
+    android:layout_height="@dimen/dp_12"
+    android:background="@color/white"
+    android:orientation="horizontal">
+
+
+
+        <TextView
+            android:id="@+id/tv_address"
+            android:layout_width="@dimen/dp_20"
+            android:layout_height="match_parent"
+            android:background="@drawable/shape_line_right"
+            android:paddingLeft="@dimen/dp_4"
+            android:text="00"
+            android:gravity="center_vertical"
+            android:textColor="@color/colorGray"
+            android:textSize="@dimen/sp_6" />
+
+        <TextView
+            android:id="@+id/tv_name"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:gravity="center_vertical"
+            android:paddingLeft="@dimen/dp_4"
+            android:text="@string/confirm_revision"
+            android:textColor="@color/colorGray"
+            android:textSize="@dimen/sp_6" />
+
+        <ImageView
+            android:scaleType="center"
+            android:id="@+id/iv_state"
+            android:gravity="center_vertical"
+            android:layout_width="@dimen/dp_30"
+            android:layout_height="match_parent"
+            android:layout_gravity="center_horizontal"
+            android:background="@drawable/shape_line_left"
+            android:src="@drawable/shape_circle" />
+
+
+
+</LinearLayout>

+ 46 - 0
app/src/main/res/layout/item_xy_title.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="@dimen/dp_144"
+    android:layout_height="@dimen/dp_14"
+    android:background="@color/white"
+    android:orientation="horizontal">
+
+    <TextView
+        android:paddingLeft="@dimen/dp_4"
+        android:background="@drawable/shape_line_right"
+        android:id="@+id/tv_name"
+        android:layout_width="@dimen/dp_20"
+        android:layout_height="match_parent"
+        android:text="@string/address"
+        android:paddingTop="@dimen/dp_2"
+        android:paddingBottom="@dimen/dp_2"
+        android:textColor="@color/logo_blue"
+        android:textSize="@dimen/sp_7" />
+
+    <TextView
+        android:paddingTop="@dimen/dp_2"
+        android:paddingBottom="@dimen/dp_2"
+        android:paddingLeft="@dimen/dp_4"
+        android:id="@+id/tv_content"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/content"
+        android:textColor="@color/logo_blue"
+        android:textSize="@dimen/sp_7" />
+
+    <TextView
+        android:paddingStart="@dimen/dp_10"
+        android:paddingTop="@dimen/dp_2"
+        android:paddingBottom="@dimen/dp_2"
+        android:paddingLeft="@dimen/dp_4"
+        android:background="@drawable/shape_line_left"
+        android:layout_width="@dimen/dp_30"
+        android:layout_height="match_parent"
+        android:src="@drawable/shape_circle"
+        android:text="@string/state"
+        android:textColor="@color/logo_blue"
+        android:textSize="@dimen/sp_7" />
+
+
+</LinearLayout>

+ 47 - 1
app/src/main/res/values/strings.xml

@@ -122,7 +122,7 @@
     <string name="confirm_reminder">确认提醒</string>
     <string name="confirm_content">是否确定申请脱离系统?</string>
     <string name="guang_ji">开/关机提示</string>
-    <string name="guang_ji1">是否立即开/关机?</string>
+    <string name="guang_ji1">是否立即开机?</string>
     <string name="guan_ji_now">立即关机</string>
     <string name="open_now">立即开机</string>
     <string name="confirm">确定</string>
@@ -441,6 +441,52 @@
     <string name="warring_falling_blockM601">No.2 下降有阻碍</string>
     <string name="warring_x_axis_stepM602">No.3 X轴丢步</string>
     <string name="warring_y_axis_stepM603">No.4 Y轴丢步</string>
+    <string name="iox2">Z轴原位传感器</string>
+    <string name="iox3">Y轴原位传感器</string>
+    <string name="iox4">X轴原位传感器</string>
+    <string name="iox5">A轴水平到位</string>
+    <string name="iox7">前进感应(E轴原位传感器)</string>
+    <string name="iox10">下降感应</string>
+    <string name="iox11">紧急停止NC</string>
+    <string name="iox12">留空备用</string>
+    <string name="iox13">留空备用</string>
+    <string name="iox14">留空备用</string>
+    <string name="iox15">留空备用</string>
+    <string name="iox16">留空备用</string>
+    <string name="iox17">留空备用</string>
+    <string name="iox20">蹲位1 人体感应器</string>
+    <string name="iox21">蹲位2 人体感应器</string>
+    <string name="iox22">蹲位3 人体感应器</string>
+    <string name="iox23">蹲位4 人体感应器</string>
+    <string name="iox24">蹲位5 人体感应器</string>
+    <string name="iox25">蹲位6 人体感应器</string>
+    <string name="iox26">留空备用</string>
+    <string name="iox27">留空备用</string>
+
+
+    <string name="ioy0">X轴PLS脉冲</string>
+    <string name="ioy1">Y轴PLS脉冲</string>
+    <string name="ioy2">E轴PLS脉冲</string>
+    <string name="ioy3">A轴PLS脉冲</string>
+    <string name="ioy4">X轴DIR方向</string>
+    <string name="ioy5">Y轴DIR方向</string>
+    <string name="ioy6">E轴DIR方向</string>
+    <string name="ioy7">A轴PLS方向</string>
+    <string name="ioy10">Z轴正转(伸长)</string>
+    <string name="ioy11">Z轴反转(回收)</string>
+    <string name="ioy12">清洁消毒水泵喷水</string>
+    <string name="ioy13">喷水泵启动</string>
+    <string name="ioy14">洁厕灵</string>
+    <string name="ioy15">汽水转换电磁阀</string>
+    <string name="ioy16">消毒液</string>
+    <string name="ioy17">指示灯</string>
+    <string name="ioy20">蹲位1 工作灯</string>
+    <string name="ioy21">蹲位2 工作灯</string>
+    <string name="ioy22">蹲位3 工作灯</string>
+    <string name="ioy23">蹲位4 工作灯</string>
+    <string name="ioy24">蹲位5 工作灯</string>
+    <string name="ioy25">蹲位6 工作灯</string>
+
 
 
     <string name="describe">描述</string>

+ 2 - 1
build.gradle

@@ -7,7 +7,8 @@ buildscript {
     }
     dependencies {
         classpath 'com.android.tools.build:gradle:3.5.2'
-
+// add greendao plugin
+        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'//greenDao生产代码插件
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
     }

+ 1 - 1
serialport-api/src/main/java/com/hboxs/serialport/SerialPortReadThread.java

@@ -46,7 +46,7 @@ public class SerialPortReadThread extends Thread {
         while (running) {
             // 开启读list线程
             SerialPortSendQueue.startReadListThread();
-            Log.d(TAG, "开启读list线程");
+          //  Log.d(TAG, "开启读list线程");
             try {
                 int available = mInputStream.available();
 

+ 1 - 1
serialport-api/src/main/java/com/hboxs/serialport/SerialPortSendQueue.java

@@ -82,7 +82,7 @@ public class SerialPortSendQueue {
      * 开启读list的线程
      */
     public static void startReadListThread() {
-        Log.d(TAG, "SerialPortSendQueue startReadListThread 开启读list线程---------------");
+     //   Log.d(TAG, "SerialPortSendQueue startReadListThread 开启读list线程---------------");
         try {
             if (sMessageListWrite.size() == 0) {
                 if (sMessageListRead.size() != 0) {