yy1717
2020-03-12 c125fc0a5ee47ef32db587899d972491231167ee
Merge remote-tracking branch 'origin/master'
21个文件已修改
1个文件已添加
1305 ■■■■ 已修改文件
app/src/main/assets/map.json 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/Constant.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/Constant.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatus.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusDao.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusInitWorker.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusOutWorker.kt 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusViewModel.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusWoker.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusWorkRepo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigDao.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigViewModel.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/MainActivity.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/app.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/bean/ExamPlatformData.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/customview/MyDialogFragment.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java 372 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java 163 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java 523 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/util/Utils.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/worker/TimeWorker.kt 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_net_train.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/map.json
@@ -2,7 +2,7 @@
  "id": 863,
  "item": 1,
  "point": [{
    "x-y": [-5.3706, 30.3648, -4.9011, 29.4905, -4.1911, 29.8586, -3.7009, 28.7631, -2.5941, 29.2631, -3.0647, 30.3601, -2.3782, 30.7019, -2.9159, 31.6925]
    "x-y": [-9.3806, 37.3791, -8.9130, 36.4974, -8.1991, 36.8640, -7.6962, 35.7786, -6.6023, 36.2578, -7.0759, 37.3599, -6.4065, 37.7090, -6.8984, 38.6962]
  }
  ]
},
@@ -10,7 +10,7 @@
    "id": 864,
    "item": 3,
    "point": [{
      "x-y": [-5.3806, 30.3791, -4.9130, 29.4974, -4.1991, 29.8640, -3.6962, 28.7786, -2.6023, 29.2578, -3.0759, 30.3599, -2.4065, 30.7090, -2.8984, 31.6962]
      "x-y": [-5.3806, 37.3791, -4.9130, 36.4974, -4.1991, 36.8640, -3.6962, 35.7786, -2.6023, 36.2578, -3.0759, 37.3599, -2.4065, 37.7090, -2.8984, 38.6962]
    }
    ]
  },
@@ -18,7 +18,7 @@
    "id": 865,
    "item": 2,
    "point": [{
      "x-y": [-2.4065,30.709,-3.0759,30.3599,-2.6023,29.2578,-2.9669,29.0981,-3.4503,30.1946,-3.8247,30.0293,-3.3316,28.9383,-3.6962,28.7786,-4.1991,29.864]
      "x-y": [-1.9065, 30.7090, -2.5759, 30.3599, -2.1023, 29.2578, -2.4669, 29.0981, -2.9503, 30.1946, -3.3247, 30.0293, -2.8316, 28.9383, -3.1962, 28.7786, -3.6991, 29.8640]
    }
    ]
  },
@@ -26,7 +26,7 @@
    "id": 866,
    "item": 5,
    "point": [{
      "x-y": [-2.8984, 31.6962, -2.4065, 30.7090, -3.0759, 30.3599, -2.6023, 29.2578, -3.6962, 28.7786,-4.6667 ,30.7457]
      "x-y": [1.1016, 31.6962, 1.5935, 30.7090, 0.9241, 30.3599, 1.3977, 29.2578, 0.3038, 28.7786, -0.6667, 30.7457]
    }
    ]
  },
app/src/main/java/safeluck/drive/evaluation/Constant.java
@@ -1,5 +1,7 @@
package safeluck.drive.evaluation;
import org.jetbrains.annotations.NotNull;
/**
 * MyApplication2
 * Created by lzw on 2020/1/7. 18:01:40
@@ -84,4 +86,9 @@
    public static final String BIND_RTK_SPEED_TOPIC = "BIND_RTK_SPEED_TOPIC";
    public static final int EXIT_CURRENT_ITEM = 0;//退出某场地
    public static String exam_enter_exitdata="exam_enter_exitdata";
    public static int Chang_di = 2;
    public static int DaoLu_night = 3;
    public static int DaoLu = 4;
    @NotNull
    public static final String TIME_MINUTE = "show_time_minute";
}
app/src/main/java/safeluck/drive/evaluation/DB/Constant.java
@@ -18,4 +18,11 @@
    public static final String RTK_CONFIG_SN = "sn";
    @NotNull
    public static final String EXAM_STATUS_TYPE = "exam_status_type";
    public static final int EXAM_MAP_TYPE_REVERSE = 1;
    public static final int EXAM_MAP_TYPE_RAMP = 2;
    public static final int EXAM_MAP_TYPE_PARK = 3;
    public static final int EXAM_MAP_TYPE_CURVE = 4;
    public static final int EXAM_MAP_TYPE_ANGLE = 5;
    public static final int FINISH_ITEM = 0;//该项场地考试结束(出场地)
    public static final int BEGIN_ITEM = 1;//该项考试开始进入场地
}
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatus.java
@@ -26,6 +26,16 @@
    //1 进入(正在进行考试)  2-待考
    private int enter;
    public ExamStatus(int map_id) {
        this.map_id = map_id;
    }
    public void setResult(int result) {
        this.result = result;
    }
    private int result=-1;//该项考试结果  默认-1 没有结果;  0-成功 1-失败
    //表示已经点击了开始考试,并且收到了考试应答  0-未考试  2-场地  3-模拟灯光,路考,  4-路考
    private int startExam;
@@ -78,4 +88,8 @@
                ", startExam=" + startExam +
                '}';
    }
    public int getResult() {
        return result;
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusDao.java
@@ -2,6 +2,7 @@
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
@@ -18,6 +19,8 @@
    @Query("update exam_status set enter =:enter where map_id =:mapid")
    void updateEnter(int enter,int mapid);
    @Query("update exam_status set result =:result where map_id =:mapid")
    void updateItemResult(int result,int mapid);
    @Query("update exam_status set startExam =:startexam")
    void updateStartExam(int startexam);
@@ -25,4 +28,7 @@
    LiveData<Integer> getStartExam();
    @Query("select startExam from exam_status where map_id=1")
    int getStartExamInt();
    @Query("delete from exam_status")
    void deleteAll();
}
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusInitWorker.java
@@ -26,11 +26,12 @@
    @NonNull
    @Override
    public Result doWork() {
        MyLog.i(TAG,"exam_status表reset 初始化");
        for (int i = 0; i < 5; i++) {
        MyLog.i("exam_status表reset 初始化");
        WorkRoomDataBase.getWorkRoomDataBase(getApplicationContext()).getExamStatusDao().deleteAll();
        for (int i = 0; i < 1; i++) {
            examStatus.setEnter(2);//默认待考项目
            examStatus.setStartExam(0);//默认没有开始考试
            examStatus.setMap_id(i+1);
            examStatus.setMap_id(1);
            WorkRoomDataBase.getWorkRoomDataBase(getApplicationContext()).getExamStatusDao().insert(examStatus);
        }
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusOutWorker.kt
@@ -2,20 +2,38 @@
import android.content.Context
import android.util.Log
import android.widget.Toast
import androidx.work.Data
import androidx.work.Worker
import androidx.work.WorkerParameters
import com.anyun.exam.lib.AYSdk
import com.anyun.exam.lib.MyLog
import com.google.gson.Gson
import org.json.JSONException
import org.json.JSONObject
import safeluck.drive.evaluation.DB.Constant
import safeluck.drive.evaluation.DB.WorkRoomDataBase
import safeluck.drive.evaluation.DB.signalConfigdb.SingalConfig
import safeluck.drive.evaluation.bean.SignalConfigRemote
class ExamStatusOutWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    val TAG:String = "ExamStatusOutWorker"
    private var signalConfiglist: MutableList<SignalConfigRemote> = ArrayList()
    private val gson = Gson()
    private var singalConfigs :List<SingalConfig> = ArrayList()
    override fun doWork(): Result {
        val examType =WorkRoomDataBase.getWorkRoomDataBase(applicationContext).examStatusDao.startExamInt;
        Log.i(TAG,"查到的考试type="+examType)
        singalConfigs = WorkRoomDataBase.getWorkRoomDataBase(applicationContext).signalConfigDao._getSignalConfigs()
        for (i in singalConfigs.indices) {
            val signalConfigRemote = SignalConfigRemote()
            signalConfigRemote.func_id = i
            signalConfigRemote.gpio_num = singalConfigs.get(i).getIndex()
            signalConfigRemote.level = singalConfigs.get(i).getHighLevel()
            signalConfiglist.add(signalConfigRemote)
        }
        var indexs = WorkRoomDataBase.getWorkRoomDataBase(applicationContext).signalConfigDao.allIndexs
        sendSignalConfigsToRemote(indexs)
        MyLog.i("查到的考试type="+examType)
        val data = Data.Builder().putInt(Constant.EXAM_STATUS_TYPE,examType).build()
        if (examType != safeluck.drive.evaluation.Constant.NONE_BEEN_START_EXAM) {
            try {
@@ -31,4 +49,28 @@
        return Result.success(data)
    }
    private fun sendSignalConfigsToRemote(indexs: List<Int>) {
        if (signalConfiglist.size > 0) {
            if (listContainsSameValue(indexs)) {
                Log.i(TAG, "sendSignalConfigsToRemote: 有相同的index,不能发送" + gson.toJson(signalConfiglist))
            } else {
                AYSdk.getInstance().sendCmd(safeluck.drive.evaluation.Constant.SEND_CONFIG_SIGNAL, gson.toJson(signalConfiglist))
            }
        }
    }
    private fun listContainsSameValue(indexs: List<Int>): Boolean {
        for (i in indexs.indices) { //可以默认是0  0不判断是否有相同的index
            if (indexs[i] == 0) {
                continue
            }
            for (j in i + 1 until indexs.size) {
                if (indexs[i] === indexs[j]) {
                    return true
                }
            }
        }
        return false
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusViewModel.java
@@ -46,4 +46,13 @@
                ", startExam=" + startExam +
                '}';
    }
    /**
     * 更新Exam_status表的result
     * @param i  result 1=成功,0-失败
     * @param map_id
     */
    public void updateItemExamResult(int i, int map_id) {
        examStatusWorkRepo.updateItemResult(i,map_id);
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusWoker.java
@@ -32,10 +32,11 @@
                jsonObject = new JSONObject(str);
                int mapId = jsonObject.getInt("map_id");
                int enter = jsonObject.getInt("enter");
                int type = jsonObject.getInt("type");
                ExamStatus examStatus = new ExamStatus();
                examStatus.setEnter(enter);
                examStatus.setMap_id(mapId);
                examStatus.setMap_item(1);
                examStatus.setMap_item(type);
                WorkRoomDataBase.getWorkRoomDataBase(getApplicationContext()).getExamStatusDao().insert(examStatus);
                return Result.success();
            } catch (JSONException e) {
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatusWorkRepo.java
@@ -40,6 +40,7 @@
        WorkRoomDataBase.dataBaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                examStatusDao.updateStartExam(startex);
            }
        });
@@ -52,4 +53,13 @@
    public LiveData<Integer> getStartExam() {
        return startExam;
    }
    public void updateItemResult(final int i, final int map_id) {
        WorkRoomDataBase.dataBaseWriteExecutor.execute(new Runnable() {
            @Override
            public void run() {
                examStatusDao.updateItemResult(i,map_id);
            }
        });
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigDao.java
@@ -26,6 +26,8 @@
    List<Integer> getAllIndexs();
    @Query("select * from signal_config")
    List<SingalConfig> _getSignalConfigs();
    @Query("select * from signal_config")
    LiveData<List<SingalConfig>> getSignalConfigs();
    @Insert(onConflict = OnConflictStrategy.REPLACE)
app/src/main/java/safeluck/drive/evaluation/DB/signalConfigdb/SignalConfigViewModel.java
@@ -22,6 +22,8 @@
        workRepo.insertSignalConig(singalConfig);
    }
    public LiveData<List<SingalConfig>> getSignalConfigs(){
        return signalConfigs;
    }
app/src/main/java/safeluck/drive/evaluation/MainActivity.java
@@ -104,7 +104,6 @@
            if (msgCode == Constant.NDK_START){
                MyLog.i(TAG,"NDK_start,发送RTK配置");
                sendRtkConfigInfo();
                sendSignalConfigsToRemote();
                sendMcuUprgrade();
            }
        }
@@ -165,7 +164,7 @@
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        //初始化tts
        ExamPlatformData.getInstance().initTTS(this);
        ExamPlatformData.getInstance().initTTS(getApplicationContext());
        // TODO
        //  进行tcp连接
        final String userId = "100002";
@@ -214,23 +213,23 @@
        });
        signalConfigViewModel = ViewModelProviders.of(this).get(SignalConfigViewModel.class);
        signalConfigViewModel.getSignalConfigs().observe(this, new Observer<List<SingalConfig>>() {
            @Override
            public void onChanged(List<SingalConfig> singalConfigs) {
                signalConfiglist.clear();
                MyLog.i(TAG, "信号配置发生变化");
                for (int i = 0; i < singalConfigs.size(); i++) {
                    SignalConfigRemote signalConfigRemote = new SignalConfigRemote();
                    signalConfigRemote.setFunc_id(i);
                    signalConfigRemote.setGpio_num(singalConfigs.get(i).getIndex());
                    signalConfigRemote.setLevel(singalConfigs.get(i).getHighLevel());
                    signalConfiglist.add(signalConfigRemote);
                }
                sendSignalConfigsToRemote();
            }
        });
//        signalConfigViewModel = ViewModelProviders.of(this).get(SignalConfigViewModel.class);
//        signalConfigViewModel.getSignalConfigs().observe(this, new Observer<List<SingalConfig>>() {
//            @Override
//            public void onChanged(List<SingalConfig> singalConfigs) {
//                signalConfiglist.clear();
//                MyLog.i(TAG, "信号配置发生变化");
//
//                for (int i = 0; i < singalConfigs.size(); i++) {
//                    SignalConfigRemote signalConfigRemote = new SignalConfigRemote();
//                    signalConfigRemote.setFunc_id(i);
//                    signalConfigRemote.setGpio_num(singalConfigs.get(i).getIndex());
//                    signalConfigRemote.setLevel(singalConfigs.get(i).getHighLevel());
//                    signalConfiglist.add(signalConfigRemote);
//                }
//                sendSignalConfigsToRemote();
//            }
//        });
        mPermissionsManager = new PermissionManager(this) {
            @Override
app/src/main/java/safeluck/drive/evaluation/app.java
@@ -329,7 +329,9 @@
                    jkMessage0206.speed = speed;
                    jkMessage0206.fangXiang = (int)track_ture;
                    jkMessage0206.rf = qf;
                    utc =utc.substring(0,15);
                    if (utc.length()>16){
                        utc = utc.substring(0,16);
                    }
                    jkMessage0206.timeBCD = utc;
                    jkMessage0206.json =json;
                    jkMessage0206.length = jkMessage0206.json.length();
app/src/main/java/safeluck/drive/evaluation/bean/ExamPlatformData.java
@@ -42,9 +42,9 @@
    private static List<SimulateNightBean.QuestionBean> simulate_light_tips = new ArrayList<>();
    static {
        examPlatformStrs.put(TCP_DISCONNECT,"未连接");
        examPlatformStrs.put(TCP_CONNECTED,"已连接");
        examPlatformStrs.put(TCP_CONNECTED,"未登录");
        examPlatformStrs.put(DEV_NOT_REGISTERED,"未注册");
        examPlatformStrs.put(DEV_REGISTERED,"已注册");
        examPlatformStrs.put(DEV_REGISTERED,"未登录");
        examPlatformStrs.put(DEV_NOT_LOGIN,"未登录");
        examPlatformStrs.put(DEV_LOGIN,"已登录");
@@ -69,7 +69,8 @@
        simulate_light_tips.add(new SimulateNightBean.QuestionBean(6,"雾天行驶"));
        simulate_light_tips.add(new SimulateNightBean.QuestionBean(7,"拱桥、人行道"));
        simulate_light_tips.add(new SimulateNightBean.QuestionBean(8,"夜间在道路上发生故障,妨碍交通又难以移动"));
        simulate_light_tips.add(new SimulateNightBean.QuestionBean(9," 夜间通过急弯、坡路、拱桥、人行横道、或者没有交通信号灯控制的路口"));
        //、拱桥、人行横道、或者没有交通信号灯控制的路口
        simulate_light_tips.add(new SimulateNightBean.QuestionBean(9," 夜间通过急弯、坡路"));
        simulate_light_tips.add(new SimulateNightBean.QuestionBean(10,"没有交通控制灯之路口"));
        simulate_light_tips.add(new SimulateNightBean.QuestionBean(11,"临时停车"));
        simulate_light_tips.add(new SimulateNightBean.QuestionBean(12,"超车"));
app/src/main/java/safeluck/drive/evaluation/customview/MyDialogFragment.java
@@ -42,6 +42,7 @@
                        }
                    }
                }).create();
        dialog.setCancelable(false);
        return dialog;
    }
    private Callback callback;
app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java
@@ -8,6 +8,7 @@
import android.graphics.Path;
import android.os.Bundle;
import android.os.Handler;
import android.text.LoginFilter;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
@@ -124,7 +125,7 @@
    private int map_id;
    private double gpsSpeed = 0;
//    double map[][] = {{1, 1}, {10, 1}, {10, 10}, {1, 10}};
    double allMap[][][];
    double map[][] = {{-2.4065, 30.7090}, {-3.0759, 30.3599}, { -2.6023, 29.2578}, {-3.3316,28.9383},{-3.8247,30.0293},
        {-3.4503,30.1946}, {-2.9669,29.0981}, { -3.6962, 28.7786}, {-4.1991, 29.8640}};
    double map_other[][] = {{-2.4065, 30.7090}, {-3.0759, 30.3599}, { -2.6023, 29.2578}, {-3.3316,28.9383},{-3.8247,30.0293},
@@ -208,7 +209,8 @@
        });
    }
    public void DrawMap(List<Double> mainAnt, final double[][] map, final double[][] car, List<Integer>body, List<Integer> tire) {
    public void DrawMap(List<Double> mainAnt, final double[][] map, final double[][] car,
                        List<Integer>body, List<Integer> tire) {
        if (canvas2 == null || bmp == null) {
            return;
        }
@@ -416,10 +418,252 @@
//            }
//        });
    }
    public void DrawMapAll(List<Double> mainAnt, final double[][][] map, final double[][] car,
                        List<Integer>body, List<Integer> tire) {
        if (canvas2 == null || bmp == null) {
            return;
        }
        long scale_x,scale_y;
//        _mActivity.runOnUiThread(new Runnable() {
//            @Override
//            public void run() {
                double base_x = 300, base_y = 20;
                double max_x = 0, min_x = 0, max_y = 0, min_y = 0;
//                Log.d(TAG, "DrawMap map size " + map.length + " car size " + car.length);
        for (int x = 0; x < map.length; x++) {
            for (int j = 0; j < map[x].length; j++) {
                if (x == 0&&j==0) {
                    max_x = map[0][0][0];
                    min_x = map[0][0][0];
                    max_y = map[0][0][1];
                    min_y = map[0][0][1];
                } else {
//                    Log.i(TAG,String.format("map[%d][%d][0]=%f",x,j,map[x][j][0]));
//                    Log.i(TAG,String.format("map[%d][%d][1]=%f",x,j,map[x][j][1]));
//                    Log.i(TAG,String.format("max_x=%f,max_y=%f,min_x=%f,min_y=%f",max_x,max_y,min_x,min_y));
                    if (max_x < map[x][j][0]) {
                        max_x = map[x][j][0];
                    }
                    if (min_x > map[x][j][0]) {
                        min_x = map[x][j][0];
                    }
                    if (max_y < map[x][j][1]) {
                        max_y = map[x][j][1];
                    }
                    if (min_y > map[x][j][1]) {
                        min_y = map[x][j][1];
                    }
                }
            }
        }
//        Log.d(TAG, "all 地图DrawMap max_x " + max_x + " max_y " + max_y + " min_x " + min_x + " min_y " + min_y);
        if (map_other.length>9){
            for (int i = 0; i < map_other.length; i++) {
                if (max_x < map_other[i][0]) {
                    max_x = map_other[i][0];
                }
                if (min_x > map_other[i][0]) {
                    min_x = map_other[i][0];
                }
                if (max_y < map_other[i][1]) {
                    max_y = map_other[i][1];
                }
                if (min_y > map_other[i][1]) {
                    min_y = map_other[i][1];
                }
            }
        }
//        Log.d(TAG, "DrawMap另外一条曲线 max_x " + max_x + " max_y " + max_y + " min_x " + min_x + " min_y " + min_y);
        for (int i = 0; i < car.length; i++) {
            if (max_x < car[i][0]) {
                max_x = car[i][0];
            }
            if (min_x > car[i][0]) {
                min_x = car[i][0];
            }
            if (max_y < car[i][1]) {
                max_y = car[i][1];
            }
            if (min_y > car[i][1]) {
                min_y = car[i][1];
            }
        }
//        Log.d(TAG, "DrawMapAll 和车比max_x " + max_x + " max_y " + max_y + " min_x " + min_x + " min_y " + min_y);
        scale_x = Math.round((screen_width - base_x - 10) / (max_x - min_x));
        scale_y = Math.round((screen_height - base_y - 10) / (max_y - min_y));
        if (scale_x >= scale_y) {
            scale_x = scale_y;
        } else {
            scale_y = scale_x;
        }
//        Log.d(TAG, "DrawMapAll scale_x " + scale_x + " scale_y " + scale_y);
        canvas2.drawColor(Color.WHITE);
        if (paint == null || canvas2==null){
            return;
        }
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setColor(Color.BLUE);
        canvas2.drawCircle((float) (base_x + (mainAnt.get(0) - min_x) * scale_x), (float) (base_y + (0 - mainAnt.get(1) - min_y) * scale_y), 2, paint);
        paint.setColor(Color.RED);
        canvas2.drawCircle((float) (base_x + (car[tire.get(0)][0] - min_x) * scale_x), (float) (base_y + (car[tire.get(0)][1] - min_y) * scale_y), 2.5f, paint);
        canvas2.drawCircle((float) (base_x + (car[tire.get(1)][0] - min_x) * scale_x), (float) (base_y + (car[tire.get(1)][1] - min_y) * scale_y), 2.5f, paint);
        canvas2.drawCircle((float) (base_x + (car[tire.get(2)][0] - min_x) * scale_x), (float) (base_y + (car[tire.get(2)][1] - min_y) * scale_y), 2.5f, paint);
        canvas2.drawCircle((float) (base_x + (car[tire.get(3)][0] - min_x) * scale_x), (float) (base_y + (car[tire.get(3)][1] - min_y) * scale_y), 2.5f, paint);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.BLACK);
        Path path = new Path();
        for (int k = 0; k < map.length; k++) {
            Log.i(TAG, String.format("all DrawMap: map[%d].length=[%d]",k,map[k].length));
            if (map[k].length < 9) {
//                Log.d(TAG, String.format("map[%d][0][0]=%f,X=%f",k,map[k][0][0], (float) (base_x + (map[k][0][0] - min_x) * scale_x)) + String.format("map[%d][0][1]=%f,Y=%f",k,map[k][0][1], (float) (base_y + (map[k][0][1] - min_y) * scale_y)));
                path.moveTo((float) (base_x + (map[k][0][0] - min_x) * scale_x), (float) (base_y + (map[k][0][1] - min_y) * scale_y));
                for (int i = 1; i < map[k].length; i++) {
//                    Log.i(TAG,String.format("map[%d][%d][0]=%f,to X=%f",k,i,map[k][i][0],(float) (base_x + (map[k][i][0] - min_x) * scale_x)));
//                    Log.i(TAG,String.format("map[%d][%d][1]=%f,to Y=%f",k,i,map[k][i][1],(float) (base_y + (map[k][i][1] - min_y) * scale_y)));
                    path.lineTo((float) (base_x + (map[k][i][0] - min_x) * scale_x), (float) (base_y + (map[k][i][1] - min_y) * scale_y));
                }
                path.close();
            } else if (map[k].length == 9) {
                path.moveTo((float) (base_x + (map[k][0][0] - min_x) * scale_x), (float) (base_y + (map[k][0][1] - min_y) * scale_y));
                path.lineTo((float) (base_x + (map[k][8][0] - min_x) * scale_x), (float) (base_y + (map[k][8][1] - min_y) * scale_y));
                path.moveTo((float) (base_x + (map[k][2][0] - min_x) * scale_x), (float) (base_y + (map[k][2][1] - min_y) * scale_y));
                path.lineTo((float) (base_x + (map[k][1][0] - min_x) * scale_x), (float) (base_y + (map[k][1][1] - min_y) * scale_y));
                path.moveTo((float) (base_x + (map[k][3][0] - min_x) * scale_x), (float) (base_y + (map[k][3][1] - min_y) * scale_y));
                path.lineTo((float) (base_x + (map[k][4][0] - min_x) * scale_x), (float) (base_y + (map[k][4][1] - min_y) * scale_y));
                path.moveTo((float) (base_x + (map[k][6][0] - min_x) * scale_x), (float) (base_y + (map[k][6][1] - min_y) * scale_y));
                path.lineTo((float) (base_x + (map[k][5][0] - min_x) * scale_x), (float) (base_y + (map[k][5][1] - min_y) * scale_y));
                path.moveTo((float) (base_x + (map[k][7][0] - min_x) * scale_x), (float) (base_y + (map[k][7][1] - min_y) * scale_y));
                path.lineTo((float) (base_x + (map[k][8][0] - min_x) * scale_x), (float) (base_y + (map[k][8][1] - min_y) * scale_y));
            } else {
                path.moveTo((float) (base_x + (map[k][0][0] - min_x) * scale_x), (float) (base_y + (map[k][0][1] - min_y) * scale_y));
                for (int i = 1; i < map[k].length; i++) {
                    path.lineTo((float) (base_x + (map[k][i][0] - min_x) * scale_x), (float) (base_y + (map[k][i][1] - min_y) * scale_y));
                }
                if (map_other.length>9){
                    path.moveTo((float) (base_x + (map_other[0][0] - min_x) * scale_x), (float) (base_y + (map_other[0][1] - min_y) * scale_y));
                    for (int i = 1; i < map[k].length; i++) {
                        path.lineTo((float) (base_x + (map_other[i][0] - min_x) * scale_x), (float) (base_y + (map_other[i][1] - min_y) * scale_y));
                    }
                }
                for (int i = 0, j = 0; i < map[k].length && j < map_other.length; i++, j++) {
                    path.moveTo((float) (base_x + (map[k][i][0] - min_x) * scale_x), (float) (base_y + (map[k][i][1] - min_y) * scale_y));
                    path.lineTo((float) (base_x + (map_other[j][0] - min_x) * scale_x), (float) (base_y + (map_other[j][1] - min_y) * scale_y));
                }
            }
        }
        canvas2.drawPath(path, paint);
                path.moveTo((float) (base_x + (car[body.get(0)][0] - min_x) * scale_x), (float) (base_y + (car[body.get(0)][1] - min_y) * scale_y));
                for (int i = 1; i < body.size(); i++){
//                    Log.d(TAG, "for 循环 DrawMap to X = " + (float) (base_x + (car[body.get(i)][0] - min_x) * scale_x)+ " Y = " + (float) (base_y + (car[body.get(i)][1] - min_y) * scale_y));
                    Log.i(TAG,String.format("car[%d][0]=%f,to X =%f,car[%d][1]=%f,to Y=%f",i,car[body.get(i)][0],
                            (float) (base_x + (car[body.get(i)][0] - min_x) * scale_x),i,car[body.get(i)][1],(float) (base_y + (car[body.get(i)][1] - min_y) * scale_y)));
                    path.lineTo((float) (base_x + (car[body.get(i)][0] - min_x) * scale_x), (float) (base_y + (car[body.get(i)][1] - min_y) * scale_y));
                }
                path.close();
                canvas2.drawPath(path, paint);
                paint.setStyle(Paint.Style.FILL_AND_STROKE);
                if (osdHeading != null) {
                    Path pathText = new Path();
                    pathText.moveTo(10, 170);
                    pathText.lineTo(700, 170);
                    canvas2.drawTextOnPath(osdHeading, pathText, 0, 0, paint);//逆时针生成
                }
                if (osdMoveDirect != null) {
                    Path pathText = new Path();
                    pathText.moveTo(10, 30);
                    pathText.lineTo(700, 30);
                    canvas2.drawTextOnPath(osdMoveDirect, pathText, 0, 0, paint);//逆时针生成
                }
                if (osdRtkSpeed != null) {
                    Path pathText = new Path();
                    pathText.moveTo(10, 240);
                    pathText.lineTo(700, 240);
                    canvas2.drawTextOnPath(osdRtkSpeed, pathText, 0, 0, paint);//逆时针生成
                }
                if (osdQf != null) {
                    Path pathText = new Path();
                    pathText.moveTo(10, 120);
                    pathText.lineTo(700, 120);
                    canvas2.drawTextOnPath(osdQf, pathText, 0, 0, paint);//逆时针生成
                }
        {
            BigDecimal bd = new BigDecimal(gpsSpeed);
            bd = bd.setScale(3, BigDecimal.ROUND_HALF_UP);
            Path pathText = new Path();
            pathText.moveTo(10, 70);
            pathText.lineTo(700, 70);
            canvas2.drawTextOnPath("GPS速度:" + bd, pathText, 0, 0, paint);//逆时针生成
        }
                // 提交画布
                Canvas canvas = holder.lockCanvas();
                if (canvas != null){
                    canvas.drawBitmap(bmp, 0, 0, paint);
                    holder.unlockCanvasAndPost(canvas);
                }
//            }
//        });
    }
    int line = 0;
    int map_line = 0;
    int map_line_other = 0;
    int sanwei = 0;
    private StringBuffer stringBuffer = new StringBuffer();
    class MessageRemoteService{
        public int msgCode;
@@ -493,6 +737,7 @@
                    line = 0;
                    map_line = 0;
                    map_line_other = 0;
                    sanwei = 0;
                    car = new double[points.size()/2][2];
@@ -553,52 +798,101 @@
                        examMaps = gson.fromJson(newmap.trim(),type);
                    }
                if (map_id == -1){
                    allMap =new double[examMaps.size()][][];
                    for (int i = 0; i < examMaps.size(); i++) {
                        ExamMap examMap = examMaps.get(i);
                        List<ExamMap.PointBean> pointBeanList = examMap.getPoint();
                        for (int i = 0; i < examMaps.size(); i++) {
                            ExamMap examMap = examMaps.get(i);
                            if (map_id == examMap.getId()){
                                List<ExamMap.PointBean> pointBeanList = examMap.getPoint();
                                for(int j=0; j<pointBeanList.size();j++){
                                    List<Double> xys = pointBeanList.get(j).getXy();
                                    if(j==0){
                                        map = new double[xys.size()/2][2];
                                        for (int k=0; k<xys.size();k++){
                                            if ((k % 2) == 0) {
                                                map[map_line][0] = xys.get(k);
                                            } else {
                                                double value = 0 - xys.get(k);
                                                Log.i(TAG, "onCEvent: map新值=" + value + " 位置:" + k);
                                                map[map_line][1] = value;
                                                map_line++;
                                            }
                                        }
                                    }else{
                                        MyLog.i(TAG,"暂时支持曲线");
                                        map_other = new double[xys.size()/2][2];
                                        for (int k=0; k<xys.size();k++){
                                            if ((k % 2) == 0) {
                                                map_other[map_line_other][0] = xys.get(k);
                                            } else {
                                                double value = 0 - xys.get(k);
                                                map_other[map_line_other][1] = value;
                                                map_line_other++;
                                            }
                                        }
                                        break;
                        for(int j=0; j<pointBeanList.size();j++){
                            List<Double> xys = pointBeanList.get(j).getXy();
                            if(j==0){
                                map = new double[xys.size()/2][2];
                                allMap[sanwei] = new double[xys.size()/2][2];
                                map_line = 0;
                                for (int k=0; k<xys.size();k++){
                                    if ((k % 2) == 0) {
                                        map[map_line][0] = xys.get(k);
                                    } else {
                                        double value = 0 - xys.get(k);
                                        map[map_line][1] = value;
                                        map_line++;
                                    }
                                }
                                break;
                                allMap[sanwei] = map.clone();
                                sanwei++;
                            }else{
//                                MyLog.i(TAG,"all支持曲线");
                                map_other = new double[xys.size()/2][2];
                                for (int k=0; k<xys.size();k++){
                                    if ((k % 2) == 0) {
                                        map_other[map_line_other][0] = xys.get(k);
                                    } else {
                                        double value = 0 - xys.get(k);
                                        map_other[map_line_other][1] = value;
                                        map_line_other++;
                                    }
                                }
                            }
                        }
                    }
                    DrawMapAll(mainAnt,allMap,car,body,tire);
                }else{
                    for (int i = 0; i < examMaps.size(); i++) {
                        ExamMap examMap = examMaps.get(i);
                        if (map_id == examMap.getId()){
                            List<ExamMap.PointBean> pointBeanList = examMap.getPoint();
                            for(int j=0; j<pointBeanList.size();j++){
                                List<Double> xys = pointBeanList.get(j).getXy();
                                if(j==0){
                                    map = new double[xys.size()/2][2];
                                    for (int k=0; k<xys.size();k++){
                                        if ((k % 2) == 0) {
                                            map[map_line][0] = xys.get(k);
                                        } else {
                                            double value = 0 - xys.get(k);
                                            Log.i(TAG, "onCEvent: map新值=" + value + " 位置:" + k);
                                            map[map_line][1] = value;
                                            map_line++;
                                        }
                                    }
                                }else{
                                    MyLog.i(TAG,"暂时支持曲线");
                                    map_other = new double[xys.size()/2][2];
                                    for (int k=0; k<xys.size();k++){
                                        if ((k % 2) == 0) {
                                            map_other[map_line_other][0] = xys.get(k);
                                        } else {
                                            double value = 0 - xys.get(k);
                                            map_other[map_line_other][1] = value;
                                            map_line_other++;
                                        }
                                    }
                                    break;
                                }
                            }
                            break;
                        }
                    }
                    DrawMap(mainAnt, map, car, body, tire);
                }
                }
            }
        }
    }
app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java
@@ -23,6 +23,8 @@
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.work.OneTimeWorkRequest;
import androidx.work.PeriodicWorkRequest;
import androidx.work.WorkInfo;
import androidx.work.WorkManager;
import com.anyun.exam.lib.AYSdk;
@@ -37,6 +39,7 @@
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import me.yokeyword.fragmentation.SupportFragment;
import safeluck.drive.evaluation.Constant;
@@ -65,6 +68,9 @@
import safeluck.drive.evaluation.platformMessage.JKMessage0203;
import safeluck.drive.evaluation.platformMessage.JKMessage0204;
import safeluck.drive.evaluation.util.Utils;
import safeluck.drive.evaluation.worker.TimeWorker;
import static androidx.work.PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS;
/**
 * 联网训练UI
@@ -91,7 +97,7 @@
    private int item_id;//扣分分数总和
    private ExamStatusViewModel examStatusViewModel;
    private static final int ADD_DATA = 1;
    private TextView tv_speed,tv_total_score,tv_sat_num,tv_name,tv_id,tv_work_platform;
    private TextView tv_speed,tv_total_score,tv_sat_num,tv_name,tv_id,tv_work_platform,tv_network_time;
    private double speed=0.0;
    private ImageView iv_rtk_status,iv_head;
@@ -112,12 +118,13 @@
        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what == ADD_DATA){
                MyLog.i("handler add_data totalScore="+currTotalScore);
                tv_total_score.setText(getResources().getString(R.string.total_score,currTotalScore));
                houseView.setColor(whatPaintColor(examStatusList.get(0)));
                av_podao.setColor(whatPaintColor(examStatusList.get(1)));
                av_park.setColor(whatPaintColor(examStatusList.get(2)));
                av_curve.setColor(whatPaintColor(examStatusList.get(3)));
                av_zhijiao.setColor(whatPaintColor(examStatusList.get(4)));
                houseView.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_REVERSE));//倒车入库 type =1
                av_podao.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_RAMP));
                av_park.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_PARK));
                av_curve.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_CURVE));
                av_zhijiao.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_ANGLE));
            }
            if (msg.what == SPEED_DATA){
                tv_speed.setText(getResources().getString(R.string.speed,speed));
@@ -130,7 +137,12 @@
                    if (result == 0) {
                        JKMessage0201 jkMessage0201 = new JKMessage0201();
                        jkMessage0201.phone = ExamPlatformData.getInstance().getPhone();
                        jkMessage0201.currentExam = 0;
                        if (exam_type==Constant.Chang_di){
                            jkMessage0201.currentExam = 0;
                        }else{
                            jkMessage0201.currentExam = 1;
                        }
                        jkMessage0201.id = icStr;
                        MessageProcessor.getInstance().sendMessage(jkMessage0201);
                    }
@@ -143,6 +155,87 @@
            return false;
        }
    });
    private int aaa(int type) {
        if (examStatusList!=null &&examStatusList.size()>0){
            for (ExamStatus examStatus:
                 examStatusList) {
                if (type == examStatus.getMap_item()){
                    if (examStatus.getEnter() == safeluck.drive.evaluation.DB.Constant.BEGIN_ITEM){
                        //进入考场
                        if (examStatusList.get(0).getStartExam() == Constant.NONE_BEEN_START_EXAM){
                            //结束考试了
                            MyLog.i("进入考场结束考试,startexam="+examStatus.getStartExam());
                            return getResources().getColor(R.color.colorAccent);
                        }else{
                            MyLog.i("进入考场,type="+type);
                            return getResources().getColor(R.color.pink);
                        }
                    }else if (examStatus.getEnter() == safeluck.drive.evaluation.DB.Constant.FINISH_ITEM){
                        if (examStatusList.get(0).getStartExam()==Constant.NONE_BEEN_START_EXAM){
                            return getResources().getColor(R.color.examing);
                        }
                        switch (type) {
                            case 1://倒库
                                if (item_conents.contains("倒车入库")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    ExamPlatformData.getInstance().getTTS().speak("倒车入库合格");
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                            case 2:
                                if (item_conents.contains("坡道定点停车和起步")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    ExamPlatformData.getInstance().getTTS().speak("坡道定点停车和起步合格");
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                            case 3:
                                if (item_conents.contains("侧方停车")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    ExamPlatformData.getInstance().getTTS().speak("侧方停车合格");
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                            case 4:
                                if (item_conents.contains("曲线行驶")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    ExamPlatformData.getInstance().getTTS().speak("曲线行驶合格");
                                    examStatusViewModel.updateItemExamResult(1,examStatus.getMap_id());
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                            case 5:
                                if (item_conents.contains("直角转弯")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    MyLog.i("该项考试成功,type="+type);
                                    ExamPlatformData.getInstance().getTTS().speak("直角转弯合格");
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                        }
                    }else{
                        return getResources().getColor(R.color.examing);
                    }
                }
            }
        }
        return getResources().getColor(R.color.examing);
    }
    @Nullable
    @Override
@@ -157,6 +250,7 @@
                if (failedProj_selects != null && failedProj_selects.size()>0){
                   
                    item_id = 0;
                    currTotalScore = 100;
                    mArrayList.clear();
                    item_conents.clear();
                    for (FailedProj_select f :
@@ -171,14 +265,15 @@
                    }
                    //TODO 发送JKMessage0203 给平台,这儿有点复杂,看怎么处理
                    sendJKMessage0203(failedProj_selects);
                    MyLog.i("没扣分之前得分:"+currTotalScore);
                    currTotalScore -=item_id;
                    MyLog.i("当前得分:"+currTotalScore);
                    if (currTotalScore < Constant.PASSING_SCORE){
                        MyLog.i(TAG,"低于80,不合格"+currTotalScore);
                        MyLog.i("低于80,不合格"+currTotalScore);
                        ExamPlatformData.getInstance().getTTS().speak("考试不合格");
                        stopExam();
//                        stopExam();
                    }
                    MyLog.i(TAG,"监测到有失败项目加入,通知UI更新颜色");
                    MyLog.i("监测到有失败项目加入,通知UI更新颜色");
                    mHandler.obtainMessage(ADD_DATA).sendToTarget();
                }else{
                    MyLog.i(TAG,"失败项目数据表被清空更新UI");
@@ -267,7 +362,12 @@
                        failedProj_selects.get(i).getScore_deducting()+"分"));
                MyLog.i("没有相同的sn,发送"+failedProj_selects.get(i).getSn());
                sns.add(failedProj_selects.get(i).getSn());
                jkMessage0203.timeBCD = failedProj_selects.get(i).getUtc();
                String utc =   failedProj_selects.get(i).getUtc();
                if (!TextUtils.isEmpty(utc)&&utc.length()>12){
                    utc =utc.substring(0,12);
                }
                jkMessage0203.timeBCD = utc ;
                jkMessage0203.fail_item_id = failedProj_selects.get(i).getEmp_id();
                jkMessage0203.fail_score = failedProj_selects.get(i).getScore_deducting();
                jkMessage0203.fail_reason = failedProj_selects.get(i).getDeducting_reason();
@@ -308,7 +408,7 @@
        switch (status) {
            case 0://考试完成
                switch (map_id) {
                    case 863://倒库
                    case 1://倒库
                        if (item_conents.contains("倒车入库")) {
                            return getResources().getColor(R.color.colorAccent);
                        }else{
@@ -366,6 +466,25 @@
        tv_sat_num = view.findViewById(R.id.tv_sat_num);
        tv_speed = view.findViewById(R.id.tv_speed);
        tv_total_score = view.findViewById(R.id.tv_total_score);
        tv_network_time = view.findViewById(R.id.network_time);
        PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest.Builder(TimeWorker.class,MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MICROSECONDS).build();
        WorkManager.getInstance(getContext().getApplicationContext()).enqueue(periodicWorkRequest);
        WorkManager.getInstance(getContext().getApplicationContext()).getWorkInfoByIdLiveData(periodicWorkRequest.getId())
                .observe(this, new Observer<WorkInfo>() {
                    @Override
                    public void onChanged(WorkInfo workInfo) {
                        if (workInfo!= null&&workInfo.getState().isFinished()){
                            String time = workInfo.getOutputData().getString(Constant.TIME_MINUTE);
                            MyLog.i("Time="+time);
                            tv_network_time.setText(time);
                        }
                    }
                });
        tv_network_time.setText(Utils.getHHmm());
        tv_speed.setText(getResources().getString(R.string.speed,speed));
        view.findViewById(R.id.btn_return).setOnClickListener(this);
@@ -406,6 +525,10 @@
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_start:
                OneTimeWorkRequest examStatusInitWork = OneTimeWorkRequest.from(ExamStatusInitWorker.class);
                WorkManager.getInstance(_mActivity).enqueue(examStatusInitWork);
                item_id = 0;
                currTotalScore = 100;
                //TODO 发送JKMessage0202 给平台,开始考试
                final JKMessage0202 jkMessage0202 = new JKMessage0202();
                jkMessage0202.phone = ExamPlatformData.getInstance().getPhone();
@@ -423,6 +546,7 @@
                    @Override
                    public void changKao() {
                        exam_type = 2;
                        examStatusViewModel.updateStartExam(exam_type);
                        sendExamJson(1,exam_type);
                        ExamPlatformData.getInstance().getTTS().speak("开始考试");
                        jkMessage0202.curr_exam = 0;
@@ -433,6 +557,7 @@
                    @Override
                    public void luKao() {
                        exam_type = 3;
                        examStatusViewModel.updateStartExam(exam_type);
                        sendExamJson(1,exam_type);
                        if (simulateNightBean == null){
                            simulateNightBean = new SimulateNightBean();
@@ -498,7 +623,7 @@
    private void sendExamJson(int i,int type) {
        try {
            examStatusViewModel.updateStartExam(type);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("exam", i);
            jsonObject.put("type", type);
@@ -512,16 +637,14 @@
    private void stopExam() {
        MyLog.i(TAG,"结束考试");
        //清空已经存在的sns
        sns.clear();
        item_id = 0;
        currTotalScore = 100;
        tv_total_score.setText(String.valueOf(currTotalScore));
        iv_head.getDrawable().setLevel(0);
        OneTimeWorkRequest examStatusInitWork = OneTimeWorkRequest.from(ExamStatusInitWorker.class);
        WorkManager.getInstance(_mActivity).enqueue(examStatusInitWork);
        ExamPlatformData.getInstance().getTTS().speak("结束考试");
        sendExamJson(0,exam_type);
        examStatusViewModel.updateStartExam(Constant.NONE_BEEN_START_EXAM);
        sendExamJson(0,0);//结束考试 exstart=0
        //TODO 发送JKMessage0204给平台 结束考试
        JKMessage0204 jkMessage0204 = new JKMessage0204();
        jkMessage0204.phone = ExamPlatformData.getInstance().getPhone();
app/src/main/java/safeluck/drive/evaluation/fragment/TrainFragment.java
@@ -1,10 +1,14 @@
package safeluck.drive.evaluation.fragment;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.AlarmManagerCompat;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.work.OneTimeWorkRequest;
@@ -12,8 +16,11 @@
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
@@ -24,15 +31,21 @@
import com.anyun.exam.lib.AYSdk;
import com.anyun.exam.lib.MyLog;
import com.google.gson.Gson;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Random;
import me.yokeyword.fragmentation.SupportFragment;
import safeluck.drive.evaluation.Constant;
import safeluck.drive.evaluation.DB.Student;
import safeluck.drive.evaluation.DB.WokViewModel;
import safeluck.drive.evaluation.DB.appstatusdb.AppStatus;
import safeluck.drive.evaluation.DB.appstatusdb.AppStatusViewModel;
import safeluck.drive.evaluation.DB.exam_status.ExamStatus;
@@ -42,11 +55,20 @@
import safeluck.drive.evaluation.DB.failitems.FailedProj_select;
import safeluck.drive.evaluation.R;
import safeluck.drive.evaluation.adapter.ScoreAdapter;
import safeluck.drive.evaluation.bean.ExamPlatformData;
import safeluck.drive.evaluation.bean.ScoreBean;
import safeluck.drive.evaluation.bean.SimulateNightBean;
import safeluck.drive.evaluation.cEventCenter.CEventCenter;
import safeluck.drive.evaluation.cEventCenter.ICEventListener;
import safeluck.drive.evaluation.customview.ArrowView;
import safeluck.drive.evaluation.customview.HouseView;
import safeluck.drive.evaluation.customview.MyDialogFragment;
import safeluck.drive.evaluation.im.MessageProcessor;
import safeluck.drive.evaluation.platformMessage.JKMessage0201;
import safeluck.drive.evaluation.platformMessage.JKMessage0202;
import safeluck.drive.evaluation.platformMessage.JKMessage0203;
import safeluck.drive.evaluation.platformMessage.JKMessage0204;
import safeluck.drive.evaluation.util.Utils;
/**单机训练UI
 * MyApplication2
@@ -57,66 +79,178 @@
public class TrainFragment extends SupportFragment implements View.OnClickListener {
    private static final String TAG = TrainFragment.class.getSimpleName();
    private ListView mListView ;
    private Button btn_train;
    private ScoreAdapter mScoreAdapter;
    private static final int REQUEST_CODE = 1000;
    private static final String ALARM_ACTION_CODE = "com.anyun.alermbroadcast";
    private int item_id;//扣分分数总和
    public static SupportFragment newInstance() {
        return new TrainFragment();
    }
    private int exam_type = 2;//2 场地;3 道路,模拟夜考;4 道路,实际夜考;
    private ListView mListView;
    private Button btn_start_exam;
    private TextView tv_stop;//呼叫请求(结束考试)
    private Gson gson = new Gson();
    private ScoreAdapter mScoreAdapter;
    private ArrowView av_zhijiao, av_curve, av_park, av_podao;
    private HouseView houseView;
    private List<ExamStatus> examStatusList = new ArrayList<>();
    private List<String> item_conents = new ArrayList<>();//坡道定点停车和起步
    private int item_id;//扣分分数总和
    private ExamStatusViewModel examStatusViewModel;
    private static final int ADD_DATA = 1;
    private static final int SPEED_DATA = 2;
    private TextView tv_speed,tv_total_score,tv_sat_num,tv_name,tv_id,tv_work_platform;
    private double speed=0.0;
    private ImageView iv_rtk_status,iv_head;
    private List<ScoreBean> mArrayList = new ArrayList<>();
    private View tv_stop;
    private TextView tv_speed,tv_total_score,tv_sat_num;
    private int currTotalScore = 100;
    private double speed=0.0;
    private List<ScoreBean> mArrayList = new ArrayList<>();
    private static final int SPEED_DATA = 2;
    private FailedProjViewModel failedProjViewModel;
    String icson;//返回的ic卡信息 json
    private Random random = new Random();
    private List<SimulateNightBean.QuestionBean> tempQs=  new ArrayList<>();
    private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what == ADD_DATA){
                MyLog.i("handler add_data totalScore="+currTotalScore);
                tv_total_score.setText(getResources().getString(R.string.total_score,currTotalScore));
                houseView.setColor(whatPaintColor(examStatusList.get(0)));
                av_podao.setColor(whatPaintColor(examStatusList.get(1)));
                av_park.setColor(whatPaintColor(examStatusList.get(2)));
                av_curve.setColor(whatPaintColor(examStatusList.get(3)));
                av_zhijiao.setColor(whatPaintColor(examStatusList.get(4)));
                houseView.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_REVERSE));//倒车入库 type =1
                av_podao.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_RAMP));
                av_park.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_PARK));
                av_curve.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_CURVE));
                av_zhijiao.setColor(aaa(safeluck.drive.evaluation.DB.Constant.EXAM_MAP_TYPE_ANGLE));
            }
            if (msg.what == SPEED_DATA){
                tv_speed.setText(getResources().getString(R.string.speed,speed));
            }
            if (msg.what == Constant.IC_ID){
                try {
                    JSONObject jsSpeed = new JSONObject(icson);
                    int result = jsSpeed.getInt("result");
                    String icStr = jsSpeed.getString("serialno");
                    if (result == 0) {
                        JKMessage0201 jkMessage0201 = new JKMessage0201();
                        jkMessage0201.phone = ExamPlatformData.getInstance().getPhone();
                        if (exam_type==Constant.Chang_di){
                            jkMessage0201.currentExam = 0;
                        }else{
                            jkMessage0201.currentExam = 1;
                        }
                        jkMessage0201.id = icStr;
                        MessageProcessor.getInstance().sendMessage(jkMessage0201);
                    }
                }catch (JSONException e){
                }
            }
            return false;
        }
    });
    private int aaa(int type) {
        if (examStatusList!=null &&examStatusList.size()>0){
            for (ExamStatus examStatus:
                    examStatusList) {
                if (type == examStatus.getMap_item()){
                    if (examStatus.getEnter() == safeluck.drive.evaluation.DB.Constant.BEGIN_ITEM){
                        //进入考场
                        if (examStatusList.get(0).getStartExam() == Constant.NONE_BEEN_START_EXAM){
                            //结束考试了
                            MyLog.i("进入考场结束考试,startexam="+examStatus.getStartExam());
                            return getResources().getColor(R.color.colorAccent);
                        }else{
                            MyLog.i("进入考场,type="+type);
                            return getResources().getColor(R.color.pink);
                        }
    public static SupportFragment newInstance(){
        return new TrainFragment();
                    }else if (examStatus.getEnter() == safeluck.drive.evaluation.DB.Constant.FINISH_ITEM){
                        if (examStatusList.get(0).getStartExam()==Constant.NONE_BEEN_START_EXAM){
                            return getResources().getColor(R.color.examing);
                        }
                        switch (type) {
                            case 1://倒库
                                if (item_conents.contains("倒车入库")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    ExamPlatformData.getInstance().getTTS().speak("倒车入库合格");
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                            case 2:
                                if (item_conents.contains("坡道定点停车和起步")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    ExamPlatformData.getInstance().getTTS().speak("坡道定点停车和起步合格");
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                            case 3:
                                if (item_conents.contains("侧方停车")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    ExamPlatformData.getInstance().getTTS().speak("侧方停车合格");
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                            case 4:
                                if (item_conents.contains("曲线行驶")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    ExamPlatformData.getInstance().getTTS().speak("曲线行驶合格");
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                            case 5:
                                if (item_conents.contains("直角转弯")) {
                                    MyLog.i("该项考试失败,type="+type);
                                    return getResources().getColor(R.color.colorAccent);
                                }else{
                                    MyLog.i("该项考试成功,type="+type);
                                    ExamPlatformData.getInstance().getTTS().speak("直角转弯合格");
                                    return getResources().getColor(R.color.train_btn_return);
                                }
                        }
                    }else{
                        return getResources().getColor(R.color.examing);
                    }
                }
            }
        }
        return getResources().getColor(R.color.examing);
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_train_fragment,container,false);
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_train_fragment, container, false);
        initView(view);
        FailedProjViewModel failedProjViewModel =ViewModelProviders.of(this).get(FailedProjViewModel.class);
        failedProjViewModel = ViewModelProviders.of(this).get(FailedProjViewModel.class);
        failedProjViewModel.getFailedProjectsForI(Constant.TEST_STU_ID).observe(this, new Observer<List<FailedProj_select>>() {
            @Override
            public void onChanged(List<FailedProj_select> failedProj_selects) {
                if (failedProj_selects != null && failedProj_selects.size()>0){
                    item_id = 0;
                    currTotalScore = 100;
                    mArrayList.clear();
                    item_conents.clear();
                    for (FailedProj_select f :
@@ -125,22 +259,28 @@
                        Log.i(TAG, "onChanged: " + f.toString());
                        mArrayList.add(new ScoreBean(f.getScore_deducting(), f.getItem_content(), f.getDeducting_reason()));
                        item_conents.add(f.getItem_content());
                        Collections.reverse(mArrayList);
                        mScoreAdapter.addDatas(mArrayList);
                        MyLog.i("item_score="+item_id);
                    }
                    //TODO 发送JKMessage0203 给平台,这儿有点复杂,看怎么处理
                    sendJKMessage0203(failedProj_selects);
                    MyLog.i("没扣分之前得分:"+currTotalScore);
                    currTotalScore -=item_id;
                    MyLog.i("当前得分:"+currTotalScore);
                    if (currTotalScore < Constant.PASSING_SCORE){
                        MyLog.i(TAG,"低于80,不合格");
                        MyLog.i("低于80,不合格"+currTotalScore);
                        ExamPlatformData.getInstance().getTTS().speak("考试不合格");
                        stopExam();
                    }
                    MyLog.i(TAG,"监测到有失败项目加入,通知UI更新颜色");
                    MyLog.i("监测到有失败项目加入,通知UI更新颜色");
                    mHandler.obtainMessage(ADD_DATA).sendToTarget();
                }else{
                    MyLog.i(TAG,"失败项目数据表被清空更新UI");
                    item_id = 0;
                    mArrayList.clear();
                    item_conents.clear();
                    Collections.reverse(mArrayList);
                    mScoreAdapter.addDatas(mArrayList);
                    mHandler.obtainMessage(ADD_DATA).sendToTarget();
                }
@@ -153,26 +293,43 @@
            @Override
            public void onChanged(List<ExamStatus> examStatus) {
                for (ExamStatus e :
                        examStatus) {
                    Log.i(TAG, "onChanged: e="+e.toString());
                Log.i(TAG, "ExamStatus onChanged: ");
                if (examStatus!=null && examStatus.size()>0){
                    MyLog.i(TAG,"考试状态更新");
                    examStatusList.clear();
                    examStatusList.addAll(examStatus);
                    mHandler.obtainMessage(ADD_DATA).sendToTarget();
                    if (examStatus.get(0).getStartExam() != Constant.NONE_BEEN_START_EXAM){
                        btn_start_exam.setEnabled(false);
                        tv_stop.setEnabled(true);
                    }else{
                        btn_start_exam.setEnabled(true);
                        tv_stop.setEnabled(false);
                    }
                    exam_type = examStatus.get(0).getStartExam();
                }
                Log.i(TAG, "onChanged: ");
                examStatusList.clear();
                examStatusList.addAll(examStatus);
                mHandler.obtainMessage(ADD_DATA).sendToTarget();
                if (examStatus.get(0).getStartExam() == Constant.NONE_BEEN_START_EXAM){
                    btn_train.setEnabled(false);
                    tv_stop.setEnabled(true);
                }else{
                    btn_train.setEnabled(true);
                    tv_stop.setEnabled(false);
                }
            }
        });
        WokViewModel wokViewModel = ViewModelProviders.of(this).get(WokViewModel.class);
        wokViewModel.getStudents().observe(this, new Observer<List<Student>>() {
            @Override
            public void onChanged(List<Student> students) {
                for (Student student :
                        students) {
                    MyLog.i(TAG, "onChanged: " + student.toString());
                    if (!TextUtils.isEmpty(student.getName())){
                        tv_name.setText(getString(R.string.name)+student.getName());
                        tv_id.setText(getString(R.string.user_id)+student.getID());
                        ExamPlatformData.getInstance().setId(student.getID());
                    }
                }
            }
        });
        AppStatusViewModel appStatusViewModel = ViewModelProviders.of(this).get(AppStatusViewModel.class);
        appStatusViewModel.getAppStatus().observe(this, new Observer<AppStatus>() {
@@ -181,6 +338,7 @@
                if (appStatus != null){
                    Log.i(TAG, "onChanged: "+appStatus.toString());
                    iv_rtk_status.getDrawable().setLevel(appStatus.getRtk_connect_status());
                    tv_work_platform.setText(getString(R.string.platform_status,ExamPlatformData.getInstance().getExamplatformStatusStr(appStatus.getWork_platform())));
                    tv_sat_num.setText(String.valueOf(appStatus.getDefault_observe1()).length()==1?"0"+appStatus.getDefault_observe1():String.valueOf(appStatus.getDefault_observe1()));
                }
            }
@@ -188,43 +346,65 @@
        return view;
    }
    private void initView(View view) {
    private List<Integer> sns =new ArrayList<>();
    private void sendJKMessage0203(List<FailedProj_select> failedProj_selects) {
        JKMessage0203 jkMessage0203 = new JKMessage0203();
        jkMessage0203.phone =  ExamPlatformData.getInstance().getPhone();
        jkMessage0203.ID = ExamPlatformData.getInstance().getID();
        jkMessage0203.exam_id = ExamPlatformData.getInstance().getExam_id();
        av_curve = view.findViewById(R.id.av3);
        av_park = view.findViewById(R.id.av2);
        av_podao = view.findViewById(R.id.av1);
        av_zhijiao = view.findViewById(R.id.av4);
        houseView = view.findViewById(R.id.hv);
        for (int i = 0; i < failedProj_selects.size(); i++) {
            if (hasSnEqulas(failedProj_selects.get(i).getSn())){
                MyLog.i("sn相同"+failedProj_selects.get(i).getSn());
            }else{
                ExamPlatformData.getInstance().getTTS().speak(failedProj_selects.get(i).getDeducting_reason()+(
                        failedProj_selects.get(i).getScore_deducting()==100?"不合格":"扣"+
                                failedProj_selects.get(i).getScore_deducting()+"分"));
                MyLog.i("没有相同的sn,发送"+failedProj_selects.get(i).getSn());
                sns.add(failedProj_selects.get(i).getSn());
                String utc =   failedProj_selects.get(i).getUtc();
                if (!TextUtils.isEmpty(utc)&&utc.length()>12){
                    utc =utc.substring(0,12);
                }
                jkMessage0203.timeBCD = utc ;
        tv_speed = view.findViewById(R.id.tv_speed);
        iv_rtk_status = view.findViewById(R.id.iv_rtk_connect);
        iv_head = view.findViewById(R.id.iv_head);
        tv_sat_num = view.findViewById(R.id.tv_sat_num);
                jkMessage0203.fail_item_id = failedProj_selects.get(i).getEmp_id();
                jkMessage0203.fail_score = failedProj_selects.get(i).getScore_deducting();
                jkMessage0203.fail_reason = failedProj_selects.get(i).getDeducting_reason();
            }
        tv_total_score = view.findViewById(R.id.tv_total_score);
        tv_speed.setText(getResources().getString(R.string.speed,speed));
        view.findViewById(R.id.btn_return).setOnClickListener(this);
        mListView = view.findViewById(R.id.lv);
        tv_stop = view.findViewById(R.id.tv_stop);
        tv_stop.setOnClickListener(this);
        mListView.setFocusable(false);//listview不获取焦点,不然的话scrollview会顶到底部
        view.findViewById(R.id.view_map).setOnClickListener(this);
        btn_train = view.findViewById(R.id.btn_start);
        btn_train.setOnClickListener(this);
        btn_train.setText("开始训练");
        mScoreAdapter = new ScoreAdapter(_mActivity);
        mListView.setAdapter(mScoreAdapter);
        mListView.addHeaderView(LayoutInflater.from(_mActivity).inflate(R.layout.layout_score_item,null));
        }
        MessageProcessor.getInstance().sendMessage(jkMessage0203);
    }
    private boolean hasSnEqulas(int failedProjSn){
        if (sns.size() > 0){
            for (int j = 0; j < sns.size(); j++) {
                MyLog.i("已存在的sn"+sns.get(j));
                if (sns.get(j) == failedProjSn){
                    MyLog.i("sn相同,不发"+sns.get(j));
                    return true;
                }else{
                    continue;
                }
            }
        }
        return false;
    }
    private int whatPaintColor(ExamStatus examStat) {
        int map_id = examStat.getMap_id();
        int status = examStat.getEnter();
        Log.i(TAG, "whatPaintColor: map_id="+map_id+" status="+status);
        MyLog.i(TAG, "whatPaintColor: map_id="+map_id+" status="+status);
        switch (status) {
            case 0://考试完成
                switch (map_id) {
@@ -261,57 +441,181 @@
                }
            case 1://进入考场项目
                MyLog.i("pink 进入某个考场项目");
                return getResources().getColor(R.color.pink);
            case 2://待考
                return getResources().getColor(R.color.examing);
        }
        return getResources().getColor(R.color.examing);
    }
    private void initView(View view) {
        Intent intent = new Intent(ALARM_ACTION_CODE);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(_mActivity.getApplicationContext(),
                REQUEST_CODE, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager alarmManager = (AlarmManager) _mActivity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(),pendingIntent);
        view.findViewById(R.id.iv_head).setOnClickListener(this);
        av_curve = view.findViewById(R.id.av3);
        av_park = view.findViewById(R.id.av2);
        av_podao = view.findViewById(R.id.av1);
        av_zhijiao = view.findViewById(R.id.av4);
        houseView = view.findViewById(R.id.hv);
        tv_name = view.findViewById(R.id.tv_name);
        tv_id = view.findViewById(R.id.tv_ID);
        tv_work_platform = view.findViewById(R.id.platform);
        iv_rtk_status = view.findViewById(R.id.iv_rtk_connect);
        iv_head = view.findViewById(R.id.iv_head);
        tv_sat_num = view.findViewById(R.id.tv_sat_num);
        tv_speed = view.findViewById(R.id.tv_speed);
        tv_total_score = view.findViewById(R.id.tv_total_score);
        tv_speed.setText(getResources().getString(R.string.speed,speed));
        view.findViewById(R.id.btn_return).setOnClickListener(this);
        mListView = view.findViewById(R.id.lv);
        mListView.setFocusable(false);
        mListView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent ev) {
                switch (ev.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_MOVE:
                        mListView.getParent().requestDisallowInterceptTouchEvent(true);
                        break;
                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_CANCEL:
                        mListView.getParent().requestDisallowInterceptTouchEvent(false);
                        break;
                }
                return false;
            }
        });
        view.findViewById(R.id.view_map).setOnClickListener(this);
        mScoreAdapter = new ScoreAdapter(_mActivity);
        mListView.setAdapter(mScoreAdapter);
        btn_start_exam = view.findViewById(R.id.btn_start);
        btn_start_exam.setOnClickListener(this);
        tv_stop = view.findViewById(R.id.tv_stop);
        tv_stop.setOnClickListener(this);
        mListView.addHeaderView(LayoutInflater.from(_mActivity).inflate(R.layout.layout_score_item, null));
    }
    MyDialogFragment myDialogFragment;
    SimulateNightBean simulateNightBean = null;
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.view_map:
                TcpFragment passwordFragment = findFragment(TcpFragment.class);
                if (passwordFragment == null) {
                    passwordFragment = (TcpFragment) TcpFragment.newInstance();
                    start(passwordFragment);
                } else {
                    start(passwordFragment);
                }
                break;
        switch (v.getId()) {
            case R.id.btn_start:
                examStatusViewModel.updateStartExam(Constant.NONE_BEEN_START_EXAM);
                try {
                    JSONObject jsonObject = new JSONObject();
                    jsonObject.put("exam", 1);
                    String examJson = jsonObject.toString();
                    Log.i(TAG, "onClick: " + examJson);
                    AYSdk.getInstance().sendCmd(Constant.EXAM_STATUS, examJson);
                } catch (JSONException e) {
                    e.printStackTrace();
                OneTimeWorkRequest examStatusInitWork = OneTimeWorkRequest.from(ExamStatusInitWorker.class);
                WorkManager.getInstance(_mActivity).enqueue(examStatusInitWork);
                item_id = 0;
                currTotalScore = 100;
                //TODO 发送JKMessage0202 给平台,开始考试
                final JKMessage0202 jkMessage0202 = new JKMessage0202();
                jkMessage0202.phone = ExamPlatformData.getInstance().getPhone();
                jkMessage0202.timeBCD = new Date();
                jkMessage0202.ID = ExamPlatformData.getInstance().getID();
                jkMessage0202.exam_id = ExamPlatformData.getInstance().getExam_id();
                failedProjViewModel.deleteAll();
                if (myDialogFragment == null){
                    myDialogFragment = new MyDialogFragment();
                }
                myDialogFragment.show(getFragmentManager(),"dialog");
                myDialogFragment.setCallback(new MyDialogFragment.Callback() {
                    @Override
                    public void changKao() {
                        exam_type = 2;
                        examStatusViewModel.updateStartExam(exam_type);
                        sendExamJson(1,exam_type);
                        ExamPlatformData.getInstance().getTTS().speak("开始考试");
                        jkMessage0202.curr_exam = 0;
                        MessageProcessor.getInstance().sendMessage(jkMessage0202);
                    }
                    @Override
                    public void luKao() {
                        exam_type = 3;
                        examStatusViewModel.updateStartExam(exam_type);
                        sendExamJson(1,exam_type);
                        if (simulateNightBean == null){
                            simulateNightBean = new SimulateNightBean();
                        }
                        simulateNightBean.setExam(0);
                        final List<SimulateNightBean.QuestionBean> list = ExamPlatformData.getInstance().getSimulate_light_tips();
                        simulateNightBean.setQuestion(list.subList(list.size()-2,list.size()-1));
                        AYSdk.getInstance().sendCmd(0x8012,gson.toJson(simulateNightBean));
                        jkMessage0202.curr_exam = 1;
                        MessageProcessor.getInstance().sendMessage(jkMessage0202);
                        tempQs.add(list.get(0));
                        int [] a = Utils.getRandomInts(4,12);
                        for (int i = 0; i < a.length; i++) {
                            tempQs.add(list.get(a[i]));
                        }
                        simulateNightBean.setQuestion(tempQs);
                        mHandler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                AYSdk.getInstance().sendCmd(0x8012,gson.toJson(simulateNightBean));
                                tempQs.clear();
                            }
                        },10*1000);
                    }
                });
                iv_head.getDrawable().setLevel(1);
                //清空sns
                sns.clear();
                break;
            case R.id.tv_stop:
                Toast.makeText(_mActivity, "结束考试", Toast.LENGTH_SHORT).show();
                stopExam();
                break;
            case R.id.view_map:
                MapFragment mapFragment = findFragment(MapFragment.class);
                MyLog.i(TAG,"查看地图");
                if (mapFragment == null) {
                    mapFragment = (MapFragment) MapFragment.newInstance();
                }
                start(mapFragment);
                break;
            case R.id.btn_return:
                _mActivity.onBackPressed();
                break;
            case R.id.iv_head:
                MyLog.i(TAG,"签到,获取身份证物理卡号");
                AYSdk.getInstance().sendCmd(Constant.READ_PHYSICAL_ID,"");
                //TODO 获得物理卡号 发送JKMessage0201给平台,获取姓名、身份证、head_url
                break;
        }
    }
    private void stopExam() {
        MyLog.i(TAG,"结束考试");
        item_id = 0;
        currTotalScore = 100;
        tv_total_score.setText(String.valueOf(currTotalScore));
        iv_head.getDrawable().setLevel(0);
        OneTimeWorkRequest examStatusInitWork = OneTimeWorkRequest.from(ExamStatusInitWorker.class);
        WorkManager.getInstance(_mActivity).enqueue(examStatusInitWork);
    private void sendExamJson(int i,int type) {
        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("exam", 0);
            jsonObject.put("exam", i);
            jsonObject.put("type", type);
            String examJson = jsonObject.toString();
            Log.i(TAG, "onClick: " + examJson);
            AYSdk.getInstance().sendCmd(Constant.EXAM_STATUS, examJson);
@@ -320,11 +624,38 @@
        }
    }
    private void stopExam() {
        MyLog.i(TAG,"结束考试");
        tv_total_score.setText(String.valueOf(currTotalScore));
        iv_head.getDrawable().setLevel(0);
        ExamPlatformData.getInstance().getTTS().speak("结束考试");
        examStatusViewModel.updateStartExam(Constant.NONE_BEEN_START_EXAM);
        sendExamJson(0,0);//结束考试 exstart=0
        //TODO 发送JKMessage0204给平台 结束考试
        JKMessage0204 jkMessage0204 = new JKMessage0204();
        jkMessage0204.phone = ExamPlatformData.getInstance().getPhone();
        jkMessage0204.timeBCD = new Date();
        jkMessage0204.score = 10;
        jkMessage0204.stop = JKMessage0204.SUCC_STOP;
        jkMessage0204.ID = ExamPlatformData.getInstance().getID();
        jkMessage0204.exam_id = ExamPlatformData.getInstance().getExam_id();
        MessageProcessor.getInstance().sendMessage(jkMessage0204);
    }
    private ICEventListener icEventListener = new ICEventListener() {
        @Override
        public void onCEvent(String topic, int msgCode, int resultCode, Object obj) {
            speed  = (double)obj;
            mHandler.obtainMessage(SPEED_DATA).sendToTarget();
            if (msgCode == Constant.IC_ID){
                icson = (String)obj;
                mHandler.obtainMessage(msgCode).sendToTarget();
            }else{
                speed  = (double)obj;
                mHandler.obtainMessage(SPEED_DATA).sendToTarget();
            }
        }
    };
    @Override
app/src/main/java/safeluck/drive/evaluation/util/Utils.java
@@ -8,6 +8,7 @@
import com.anyun.exam.lib.util.ByteUtil;
import com.safeluck.aykj.utils.BytesUtils;
import java.util.Calendar;
import java.util.Random;
/**
@@ -158,4 +159,59 @@
        return false;
    }
    public static String getHHmm(){
        String mMonth,mDay,mWay,mHours,mMinute;
        StringBuffer stringBuffer = new StringBuffer();
        Calendar calendar = Calendar.getInstance();
        mMonth = String.valueOf(calendar.get(Calendar.MONTH) + 1);        //获取日期的月
        mDay = String.valueOf(calendar.get(Calendar.DAY_OF_MONTH));      //获取日期的天
        mWay = String.valueOf(calendar.get(Calendar.DAY_OF_WEEK));      //获取日期的星期
        /**
         * 如果小时是个位数
         *
         *则在前面价格“0”
         * */
        if (calendar.get(Calendar.HOUR) < 10) {
            mHours = "0" + calendar.get(Calendar.HOUR);
        } else {
            mHours = String.valueOf(calendar.get(Calendar.HOUR));
        }
        stringBuffer.append(mHours);
        stringBuffer.append(":");
        /**
         * 如果分钟是个位数
         *
         *则在前面价格“0”
         * */
        if (calendar.get(Calendar.MINUTE) < 10) {
            mMinute = "0" + calendar.get(Calendar.MINUTE);
        } else {
            mMinute = String.valueOf(calendar.get(Calendar.MINUTE));
        }
        stringBuffer.append(mMinute);
        /**
         * 获取星期
         * 并设置出来
         * */
        if ("1".equals(mWay)) {
            mWay = "天";
        } else if ("2".equals(mWay)) {
            mWay = "一";
        } else if ("3".equals(mWay)) {
            mWay = "二";
        } else if ("4".equals(mWay)) {
            mWay = "三";
        } else if ("5".equals(mWay)) {
            mWay = "四";
        } else if ("6".equals(mWay)) {
            mWay = "五";
        } else if ("7".equals(mWay)) {
            mWay = "六";
        }
        return stringBuffer.toString();
    }
}
app/src/main/java/safeluck/drive/evaluation/worker/TimeWorker.kt
New file
@@ -0,0 +1,21 @@
package safeluck.drive.evaluation.worker
import android.content.Context
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.work.Data
import androidx.work.Worker
import androidx.work.WorkerParameters
import com.anyun.exam.lib.MyLog
import safeluck.drive.evaluation.Constant
import safeluck.drive.evaluation.util.Utils
class TimeWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {
    override fun doWork(): Result {
        MyLog.i("周期性任务"+TimeWorker::class.java.simpleName)
        var timeStr= Utils.getHHmm()
        val data = Data.Builder().putString(Constant.TIME_MINUTE,timeStr).build()
        return Result.success(data)
    }
}
app/src/main/res/layout/layout_net_train.xml
@@ -44,7 +44,7 @@
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="呼叫请求"
            android:text="结束考试"
            android:id="@+id/tv_stop"
            android:textColor="@android:color/white"
            android:padding="10dp"