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"