yy1717
2020-03-09 59798b3c20c1b6e7bde1c03cd1caecbaf0860572
Merge branch 'master' of https://gitee.com/endian11/DriveJudge
10个文件已修改
5个文件已添加
854 ■■■■■ 已修改文件
app/src/main/assets/criteria_I.json 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/criteria_III.json 465 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/Constant.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/Constant.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/WorkRoomDataBase.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/criterias/CriteriaForIII.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/criterias/CriteriaForIIIWorker.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/criterias/CriteriaIIIDao.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatus.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/MainActivity.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/app.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/bean/ExamPlatformData.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_net_train_iii_item.xml 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/criteria_I.json
@@ -149,7 +149,7 @@
  {
    "item_id":22,
    "item_content": "侧方停车",
    "deducting_reason": "项目完成时间超过90s",
    "deducting_reason": "项目完成时间超过90秒",
    "score_deducting":100,
    "required_precision":""
  },
@@ -177,7 +177,7 @@
  {
    "item_id":26,
    "item_content": "侧方停车",
    "deducting_reason": "中途停车时间超过2s",
    "deducting_reason": "中途停车时间超过2秒",
    "score_deducting":5,
    "required_precision":""
  },
@@ -191,7 +191,7 @@
  {
    "item_id":28,
    "item_content": "曲线行驶",
    "deducting_reason": "中途停车时间超过2s",
    "deducting_reason": "中途停车时间超过2秒",
    "score_deducting":100,
    "required_precision":""
  },
@@ -212,7 +212,7 @@
  {
    "item_id":31,
    "item_content": "直角转弯",
    "deducting_reason": "中途停车时间超过2s",
    "deducting_reason": "中途停车时间超过2秒",
    "score_deducting":5,
    "required_precision":""
  }
app/src/main/assets/criteria_III.json
New file
@@ -0,0 +1,465 @@
[
  {
    "item_id":1,
    "item_content": "通用要求",
    "deducting_reason": "不按规定使用安全带",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":2,
    "item_content": "通用要求",
    "deducting_reason": "遮挡、关闭车内音视频监控设备",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":3,
    "item_content": "通用要求",
    "deducting_reason": "不按考试员指令驾驶",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":4,
    "item_content": "通用要求",
    "deducting_reason": "启动发动机时档位未置于空挡(驻车档)",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":5,
    "item_content": "通用要求",
    "deducting_reason": "起步时车辆后溜距离大于30cm",
    "score_deducting":100,
    "required_precision":"距离检测误差:0mm~50mm"
  },
  {
    "item_id":6,
    "item_content": "通用要求",
    "deducting_reason": "使用挡位与车速长时间不匹配,造成车辆发动机转速过高或过低",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":7,
    "item_content": "通用要求",
    "deducting_reason": "车辆在行驶中连续2次挂挡不进",
    "score_deducting":100,
    "required_precision":"5s内两次挂同一挡位未成功"
  },
  {
    "item_id":8,
    "item_content": "通用要求",
    "deducting_reason": "行驶中空挡滑行",
    "score_deducting":100,
    "required_precision":"时间大于5s"
  },
  {
    "item_id":9,
    "item_content": "通用要求",
    "deducting_reason": "不按交通信号灯、标志、标线信号行驶",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":10,
    "item_content": "通用要求",
    "deducting_reason": "不按规定速度行驶",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":11,
    "item_content": "通用要求",
    "deducting_reason": "车辆行驶中骑轧车道中心实线或者车道边缘实线",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":12,
    "item_content": "通用要求",
    "deducting_reason": "长时间骑轧车道分界线行驶",
    "score_deducting":100,
    "required_precision":"时间大于10s"
  },
  {
    "item_id":13,
    "item_content": "通用要求",
    "deducting_reason": "起步、转向、变更车道、超车、靠边停车前不使用或错误使用转向灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":14,
    "item_content": "通用要求",
    "deducting_reason": "起步、转向、变更车道、超车、靠边停车前,开转 向灯少于3 s即转向",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":15,
    "item_content": "通用要求",
    "deducting_reason": "连续变更两条或两条以上车道",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":16,
    "item_content": "通用要求",
    "deducting_reason": "将车辆停在人行横道、网状线内等禁止停车区域",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":17,
    "item_content": "通用要求",
    "deducting_reason": "因观察、判断或者操作不当出现危险情况",
    "score_deducting":100,
    "required_precision":"副制动踏板踩下后"
  },
  {
    "item_id":18,
    "item_content": "通用要求",
    "deducting_reason": "起步时车辆后溜,但后溜距离小于30cm",
    "score_deducting":10,
    "required_precision":""
  },
  {
    "item_id":19,
    "item_content": "通用要求",
    "deducting_reason": "起步或行驶中挂错挡",
    "score_deducting":10,
    "required_precision":""
  },
  {
    "item_id":20,
    "item_content": "通用要求",
    "deducting_reason": "因操作不当造成发动机熄火一次",
    "score_deducting":10,
    "required_precision":""
  },
  {
    "item_id":21,
    "item_content": "上车准备",
    "deducting_reason": "未逆时针绕车一周检查车辆外观及周围环境",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":22,
    "item_content": "起步",
    "deducting_reason": "制动气压不足起步",
    "score_deducting":100,
    "required_precision":"仅适用于采用气动制动器的车型"
  },
  {
    "item_id":23,
    "item_content": "起步",
    "deducting_reason": "车门未完全关闭起步",
    "score_deducting":100,
    "required_precision":"行驶距离大于 1m 时,车门未完 全关闭"
  },
  {
    "item_id":24,
    "item_content": "起步",
    "deducting_reason": "启动发动机时,挡位未置于空挡(驻车挡)",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":25,
    "item_content": "起步",
    "deducting_reason": "不松驻车制动器起步,未及时纠正",
    "score_deducting":100,
    "required_precision":"行驶距离大于 10 m"
  },
  {
    "item_id":26,
    "item_content": "起步",
    "deducting_reason": "不松驻车制动器起步,但能及时纠正",
    "score_deducting":10,
    "required_precision":"行驶距离为 1 m~10 m"
  },
  {
    "item_id":27,
    "item_content": "起步",
    "deducting_reason": "发动机启动后,不及时松开启动开关",
    "score_deducting":10,
    "required_precision":"距离检测误差:0mm~+50mn"
  },
  {
    "item_id":28,
    "item_content": "起步",
    "deducting_reason": "起步时车辆发生闯动",
    "score_deducting":5,
    "required_precision":""
  },
  {
    "item_id":29,
    "item_content": "起步",
    "deducting_reason": "起步时,加速踏板控制不当,致使发动机转速过高",
    "score_deducting":5,
    "required_precision":"根据考试车型设定(大于 2500rpm)"
  } ,
  {
    "item_id":30,
    "item_content": "直线行驶",
    "deducting_reason": "方向控制不稳,不能保持车辆直线运行",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":31,
    "item_content": "加减挡位操作",
    "deducting_reason": "未按指令平稳加、减挡",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":32,
    "item_content": "加减挡位操作",
    "deducting_reason": "车辆运行速度和挡位不匹配",
    "score_deducting":10,
    "required_precision":""
  },
  {
    "item_id":33,
    "item_content": "靠边停车",
    "deducting_reason": "考试员发出靠边停车指令后,未能在规定的距离内停车",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":34,
    "item_content": "靠边停车",
    "deducting_reason": "停车后,车身超过道路右侧边缘线或者人行道边缘",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":35,
    "item_content": "靠边停车",
    "deducting_reason": "下车后不关闭车门",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":36,
    "item_content": "靠边停车",
    "deducting_reason": "停车后,车身距离道路右侧边缘线或者人行道边缘超出50cm",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":37,
    "item_content": "靠边停车",
    "deducting_reason": "停车后,车身距离道路右侧边缘线或者人行道边缘超出30cm,未超出50cm",
    "score_deducting":10,
    "required_precision":""
  },
  {
    "item_id":38,
    "item_content": "靠边停车",
    "deducting_reason": "停车后,未拉紧驻车制动器",
    "score_deducting":10,
    "required_precision":""
  },
  {
    "item_id":39,
    "item_content": "靠边停车",
    "deducting_reason": "拉紧驻车制动器前放松行车制动踏板",
    "score_deducting":10,
    "required_precision":""
  },
  {
    "item_id":40,
    "item_content": "靠边停车",
    "deducting_reason": "下车前不将发动机熄火",
    "score_deducting":5,
    "required_precision":""
  },
  {
    "item_id":41,
    "item_content": "直行通过路口",
    "deducting_reason": "不按规定减速",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":42,
    "item_content": "直行通过路口",
    "deducting_reason": "不按规定停车瞭望",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":43,
    "item_content": "路口左转弯",
    "deducting_reason": "不按规定减速",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":44,
    "item_content": "路口左转弯",
    "deducting_reason": "不按规定停车瞭望",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":45,
    "item_content": "路口左转弯",
    "deducting_reason": "左转通过路口时,未靠路口中心点左侧转弯",
    "score_deducting":10,
    "required_precision":""
  },
  {
    "item_id":46,
    "item_content": "路口右转弯",
    "deducting_reason": "不按规定减速",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":47,
    "item_content": "路口右转弯",
    "deducting_reason": "不按规定停车瞭望",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":48,
    "item_content": "通过人行道横线",
    "deducting_reason": "不按规定减速慢行",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":49,
    "item_content": "通过学校区域",
    "deducting_reason": "不按规定减速慢行",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":50,
    "item_content": "通过公共汽车站",
    "deducting_reason": "不按规定减速慢行",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":51,
    "item_content": "掉头",
    "deducting_reason": "掉头前未开启左转向灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":52,
    "item_content": "夜间行驶",
    "deducting_reason": "不能正确开启灯光",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":53,
    "item_content": "夜间行驶",
    "deducting_reason": "通过急弯、坡路、拱桥、人行横道或者没有交通信号灯控制的路口时,不交替使用远、近光灯示意",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":54,
    "item_content": "夜间行驶",
    "deducting_reason": "通过路口时使用远光灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":55,
    "item_content": "夜间行驶",
    "deducting_reason": "在有路灯、照明良好的道路上行驶时,使用远光灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":56,
    "item_content": "夜间行驶",
    "deducting_reason": "在路边临时停车不关闭前照灯或不开启示廓灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":57,
    "item_content": "夜间行驶",
    "deducting_reason": "进入无照明道路行驶时不使用远光灯",
    "score_deducting":5,
    "required_precision":""
  },
  {
    "item_id":58,
    "item_content": "模拟夜间灯光使用(语音模拟)",
    "deducting_reason": "不能正确开启灯光",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":59,
    "item_content": "模拟夜间灯光使用(语音模拟)",
    "deducting_reason": "同方向近距离跟车行驶时,使用远光灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":60,
    "item_content": "模拟夜间灯光使用(语音模拟)",
    "deducting_reason": "通过急弯、坡路、拱桥、人行横道或者没有交通信号灯控制的路口时,不交替使用远、近光灯示意",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":61,
    "item_content": "模拟夜间灯光使用(语音模拟)",
    "deducting_reason": "会车时不按规定使用近光灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":62,
    "item_content": "模拟夜间灯光使用(语音模拟)",
    "deducting_reason": "通过路口时使用远光灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":63,
    "item_content": "模拟夜间灯光使用(语音模拟)",
    "deducting_reason": "超车时未交替使用远近光灯提醒被超越车辆",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":64,
    "item_content": "模拟夜间灯光使用(语音模拟)",
    "deducting_reason": "在有路灯、照明良好的道路上行驶时,使用远光灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":65,
    "item_content": "模拟夜间灯光使用(语音模拟)",
    "deducting_reason": "在路边临时停车不关闭前照灯或不开启示廓灯",
    "score_deducting":100,
    "required_precision":""
  },
  {
    "item_id":66,
    "item_content": "模拟夜间灯光使用(语音模拟)",
    "deducting_reason": "进入无照明、照明不良的道路行驶时不使用远光灯",
    "score_deducting":5,
    "required_precision":""
  }
]
app/src/main/java/safeluck/drive/evaluation/Constant.java
@@ -82,5 +82,6 @@
    public static final int READ_PHYSICAL_ID = 0x8011;//4.    读取IC卡
    public static final String BIND_MCUINFO_TOPIC = "bind_mcu_info_topic";
    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";
}
app/src/main/java/safeluck/drive/evaluation/DB/Constant.java
@@ -9,6 +9,7 @@
public class Constant {
    public static final String CRITERIAFOR_I_JSON = "criteria_I.json";
    public static final String CRITERIAFOR_II_JSON = "criteria_II.json";
    public static final String CRITERIAFOR_III_JSON = "criteria_III.json";
    public static final String RTK_CONFIG_UPDATE_JSON = "RTK_CONFIG_UPDATE_JSON";
    public static final String RTK_CONFIG_PHONE = "RTK_CONFIG_PHONE";
    public static final String RTK_CONFIG_IMEI = "RTK_CONFIG_IMEI";
app/src/main/java/safeluck/drive/evaluation/DB/WorkRoomDataBase.java
@@ -20,10 +20,13 @@
import safeluck.drive.evaluation.DB.appstatusdb.AppStatusInitWork;
import safeluck.drive.evaluation.DB.criterias.CriteriaForI;
import safeluck.drive.evaluation.DB.criterias.CriteriaForII;
import safeluck.drive.evaluation.DB.criterias.CriteriaForIII;
import safeluck.drive.evaluation.DB.criterias.CriteriaForIIIWorker;
import safeluck.drive.evaluation.DB.criterias.CriteriaForIIWorker;
import safeluck.drive.evaluation.DB.criterias.CriteriaForIWorker;
import safeluck.drive.evaluation.DB.criterias.CriteriaIDao;
import safeluck.drive.evaluation.DB.criterias.CriteriaIIDao;
import safeluck.drive.evaluation.DB.criterias.CriteriaIIIDao;
import safeluck.drive.evaluation.DB.exam_status.ExamStatus;
import safeluck.drive.evaluation.DB.exam_status.ExamStatusDao;
import safeluck.drive.evaluation.DB.exam_status.ExamStatusInitWorker;
@@ -46,7 +49,7 @@
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
@Database(entities = {Student.class, CriteriaForI.class, FailedProj.class, CriteriaForII.class, RTKConfig.class, GPSInfo.class, AppStatus.class, ExamStatus.class, SingalConfig.class},version = 1,exportSchema = false)
@Database(entities = {Student.class, CriteriaForI.class, FailedProj.class, CriteriaForII.class, CriteriaForIII.class,RTKConfig.class, GPSInfo.class, AppStatus.class, ExamStatus.class, SingalConfig.class},version = 1,exportSchema = false)
public abstract class WorkRoomDataBase extends RoomDatabase {
    private static final String TAG = "WorkRoomDataBase";
    public abstract StudentDao getstudentDao();
@@ -85,6 +88,7 @@
                                    OneTimeWorkRequest oneTimeWorkRequest = OneTimeWorkRequest.from(SeedDatabaseWorker.class);
                                    OneTimeWorkRequest oneTimeWorkRequest1 = OneTimeWorkRequest.from(CriteriaForIWorker.class);
                                    OneTimeWorkRequest oneTimeWorkRequest3 = OneTimeWorkRequest.from(CriteriaForIIWorker.class);
                                    OneTimeWorkRequest  mCriteriaForIIIWorker= OneTimeWorkRequest.from(CriteriaForIIIWorker.class);
                                    OneTimeWorkRequest oneTimeWorkRequest2 = OneTimeWorkRequest.from(FailedProjWorker.class);
                                    OneTimeWorkRequest RTKConfigWorkRequest = OneTimeWorkRequest.from(RTKConfigWork.class);
                                    OneTimeWorkRequest appStatusInitWork = OneTimeWorkRequest.from(AppStatusInitWork.class);
@@ -95,6 +99,7 @@
                                    WorkManager.getInstance(mContext).enqueue(oneTimeWorkRequest1);
                                    WorkManager.getInstance(mContext).enqueue(oneTimeWorkRequest2);
                                    WorkManager.getInstance(mContext).enqueue(oneTimeWorkRequest3);
                                    WorkManager.getInstance(mContext).enqueue(mCriteriaForIIIWorker);
                                    WorkManager.getInstance(mContext).enqueue(RTKConfigWorkRequest);
                                    WorkManager.getInstance(mContext).enqueue(appStatusInitWork);
                                    WorkManager.getInstance(mContext).enqueue(examStatusInitWorker);
@@ -124,4 +129,11 @@
    public abstract ExamStatusDao getExamStatusDao();
    public abstract SignalConfigDao getSignalConfigDao();
    /**
     * 获取科目三评判表的 Dao
     *
     * @return
     */
    public abstract CriteriaIIIDao getCriteriaIIIDao();
}
app/src/main/java/safeluck/drive/evaluation/DB/criterias/CriteriaForIII.java
New file
@@ -0,0 +1,79 @@
package safeluck.drive.evaluation.DB.criterias;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
/**
 * MyApplication2
 * Created by lzw on 2019/11/26. 10:15:55
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 *
 * 科目二 II类考场评判标准表
 */
@Entity(tableName = "criteria_three")
public class CriteriaForIII {
/**************
 *    item_id   item_content                    deducting_reason                     score_deducting                    required _precision
        23                  起步                             车门未完全关闭起步                    不合格                        行驶距离大于1m 时
 **************/
    @PrimaryKey
    @ColumnInfo(name = "item_id")
    @NonNull
    private int item_id;
    @ColumnInfo(name = "item_content")
    private String item_content;
    @ColumnInfo(name = "deducting_reason")
    private String deducting_reason;
    @NonNull @ColumnInfo(name = "score_deducting")
    private int score_deducting;
    @ColumnInfo(name = "required_precision")
    private String required_precision;
    public int getItem_id() {
        return item_id;
    }
    public void setItem_id(int item_id) {
        this.item_id = item_id;
    }
    public String getItem_content() {
        return item_content;
    }
    public void setItem_content(String item_content) {
        this.item_content = item_content;
    }
    public String getDeducting_reason() {
        return deducting_reason;
    }
    public void setDeducting_reason(String deducting_reason) {
        this.deducting_reason = deducting_reason;
    }
    public int getScore_deducting() {
        return score_deducting;
    }
    public void setScore_deducting(int score_deducting) {
        this.score_deducting = score_deducting;
    }
    public String getRequired_precision() {
        return required_precision;
    }
    public void setRequired_precision(String required_precision) {
        this.required_precision = required_precision;
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/criterias/CriteriaForIIIWorker.java
New file
@@ -0,0 +1,59 @@
package safeluck.drive.evaluation.DB.criterias;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
import com.anyun.exam.lib.MyLog;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.util.List;
import safeluck.drive.evaluation.DB.Constant;
import safeluck.drive.evaluation.DB.WorkRoomDataBase;
/**
 * MyApplication2
 * Created by lzw on 2019/11/26. 11:59:25
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
public class CriteriaForIIIWorker extends Worker {
    private static final String TAG = "CriteriaForIWorker";
    public CriteriaForIIIWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }
    @NonNull
    @Override
    public Result doWork() {
        InputStream inputStream = null;
        try {
            inputStream = getApplicationContext().getAssets()
                    .open(Constant.CRITERIAFOR_III_JSON);
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            JsonReader jsonReader = new JsonReader(inputStreamReader);
            Gson gson = new Gson();
            Type type = new TypeToken<List<CriteriaForIII>>(){}.getType();
            List<CriteriaForIII> criteriaForIIS = gson.fromJson(jsonReader,type);
            MyLog.i(TAG,"插入科目三考场评判表");
            WorkRoomDataBase.getWorkRoomDataBase(getApplicationContext()).getCriteriaIIIDao().insertAllCriteriaIII(criteriaForIIS);
            return Result.success();
        } catch (IOException e) {
            e.printStackTrace();
            return Result.failure();
        }
    }
}
app/src/main/java/safeluck/drive/evaluation/DB/criterias/CriteriaIIIDao.java
New file
@@ -0,0 +1,28 @@
package safeluck.drive.evaluation.DB.criterias;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import java.util.List;
/**
 * MyApplication2
 * Created by lzw on 2019/11/26. 11:12:18
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
@Dao
public interface CriteriaIIIDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    void insertCriteriaIII(CriteriaForIII criteriaForIII);
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAllCriteriaIII(List<CriteriaForIII> criteriaForIII);
    @Query( "SELECT * FROM criteria_three WHERE item_id =:item_id")
    LiveData<CriteriaForIII > queryItemForCriteriaIII(int item_id);
}
app/src/main/java/safeluck/drive/evaluation/DB/exam_status/ExamStatus.java
@@ -13,10 +13,14 @@
//5 - 直角转弯
@PrimaryKey
    private int map_id;
/**侧方位停车 type = 3
 技术部 叶怿  15:51:49
 倒车入库 type = 1
 上坡起步  type = 2
 zhijiao  type = 5*/
    private int map_item;
    //0 退出(考试完毕)
    //1 进入(正在进行考试)  2-待考
@@ -31,6 +35,14 @@
        this.enter = enter;
    }
    public int getMap_item() {
        return map_item;
    }
    public void setMap_item(int map_item) {
        this.map_item = map_item;
    }
    public ExamStatus() {
    }
app/src/main/java/safeluck/drive/evaluation/MainActivity.java
@@ -36,6 +36,7 @@
import com.anyun.exam.lib.AYSdk;
import com.anyun.exam.lib.MyLog;
import com.anyun.exam.lib.util.ByteUtil;
import com.anyun.exam.lib.util.Speaker;
import com.anyun.im_lib.listener.IMSConnectStatusCallback;
import com.google.gson.Gson;
import com.safeluck.aykj.utils.BytesUtils;
@@ -161,6 +162,8 @@
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        //初始化tts
        ExamPlatformData.getInstance().initTTS(this);
        // TODO
        //  进行tcp连接
        final String userId = "100002";
app/src/main/java/safeluck/drive/evaluation/app.java
@@ -59,6 +59,7 @@
import safeluck.drive.evaluation.platformMessage.JKMessage0101;
import safeluck.drive.evaluation.platformMessage.JKMessage0203;
import safeluck.drive.evaluation.platformMessage.JKMessage0206;
import safeluck.drive.evaluation.util.CThreadPoolExecutor;
import safeluck.drive.evaluation.util.FileUtil;
import safeluck.drive.evaluation.util.SPUtils;
import safeluck.drive.evaluation.util.SystemUtil;
@@ -245,6 +246,17 @@
                WorkManager.getInstance(getApplicationContext()).enqueue(gpsinfoWorkRequest);
                break;
            case Constant.ENTER_OR_EXIT_ITEM:
                int type = 0;
                int enter_status = -1;
                try {
                    JSONObject rtkConfigUpdtea = new JSONObject(json);
                    type = rtkConfigUpdtea.getInt("type");
                    enter_status = rtkConfigUpdtea.getInt("enter");
                    String itemstr=ExamPlatformData.getInstance().getItemStatusStr(type);
                    ExamPlatformData.getInstance().getTTS().speak(itemstr+(enter_status==Constant.EXIT_CURRENT_ITEM?"结束":"开始"));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                Data exam_enter_exitdata = new Data.Builder().putString(Constant.exam_enter_exitdata,json).build();
                OneTimeWorkRequest examStatusWorker = new OneTimeWorkRequest.Builder(ExamStatusWoker.class).setInputData(exam_enter_exitdata).build();
                WorkManager.getInstance(getApplicationContext()).enqueue(examStatusWorker);
@@ -369,7 +381,7 @@
        new Thread(new Runnable() {
            @Override
            public void run() {
                String mapPath = ExamPlatformData.getInstance().getMapPath();
                final String mapPath = ExamPlatformData.getInstance().getMapPath();
                if (!TextUtils.isEmpty(mapPath)){
                    MyLog.i("调用更新Map路径后的地图"+mapPath);
                    byte[] fileContent = FileUtil.readFile(mapPath);
@@ -379,15 +391,34 @@
                        AYSdk.getInstance().sendCmd(Constant.PUSH_MAP_INFO,str);
                    }else{
                        MyLog.i(String.format("文件:%s不存在",mapPath));
                        CThreadPoolExecutor.runOnMainThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(getAppContext(), "文件:"+mapPath+"不存在", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }else{
                    MyLog.i("读取Assert目录下初始化的地图");
                    CThreadPoolExecutor.runOnMainThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(getAppContext(), "读取Assert目录下初始化的地图", Toast.LENGTH_SHORT).show();
                        }
                    });
                    StringBuffer buffer =FileUtil.readAssetTxtFile(getApplicationContext(),Constant.MAP);
                    if (buffer != null){
                        AYSdk.getInstance().sendCmd(Constant.PUSH_MAP_INFO,buffer.toString());
                    }else{
                        MyLog.d(TAG,String.format("地图模型未拷入[%s]目录下", Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+getApplicationContext().getPackageName()));
                        CThreadPoolExecutor.runOnMainThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(getAppContext(), String.format("地图模型未拷入[%s]目录下", Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+getApplicationContext().getPackageName()), Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }
app/src/main/java/safeluck/drive/evaluation/bean/ExamPlatformData.java
@@ -10,6 +10,7 @@
import androidx.work.WorkManager;
import com.anyun.exam.lib.MyLog;
import com.anyun.exam.lib.util.Speaker;
import java.util.HashMap;
import java.util.Random;
@@ -33,6 +34,7 @@
    public static final int DEV_NOT_LOGIN = 5;
    public static final int DEV_LOGIN = 6;
    private static HashMap<Integer,String> examPlatformStrs = new HashMap<>();
    private static HashMap<Integer,String> enter_exit_item_tts = new HashMap<>();
    static {
        examPlatformStrs.put(TCP_DISCONNECT,"未连接");
        examPlatformStrs.put(TCP_CONNECTED,"已连接");
@@ -40,6 +42,18 @@
        examPlatformStrs.put(DEV_REGISTERED,"已注册");
        examPlatformStrs.put(DEV_NOT_LOGIN,"未登录");
        examPlatformStrs.put(DEV_LOGIN,"已登录");
/*侧方位停车 type = 3
 倒车入库 type = 1
 上坡起步  type = 2
 zhijiao  type = 5*/
        enter_exit_item_tts.put(1,"倒车入库");
        enter_exit_item_tts.put(2,"坡道定点停车和起步");
        enter_exit_item_tts.put(3,"侧方停车");
        enter_exit_item_tts.put(4,"曲线行驶");
        enter_exit_item_tts.put(5,"直角转弯");
    }
    private static final String WORK_PLATFORM_STATUS = " work_platform";
@@ -47,6 +61,8 @@
    private int examplatformStatus =1;//1-未连接(tcp连接不上)   3-未注册(设备没有注册)   5-未登录(鉴权未通过)
    private String id;//身份证
    private Speaker speaker = null;
    private String ip;
    private int port;
@@ -162,4 +178,36 @@
        return examPlatformStrs.get(work_platform);
    }
    /**
     * 进入退出某个场地的文字
     * @param item
     * @return
     */
    public String getItemStatusStr(int item) {
        if (item<1 || item>enter_exit_item_tts.size()){
            return "未知项目";
        }
        return enter_exit_item_tts.get(item);
    }
    public Speaker getTTS(){
        if (speaker == null){
            throw new RuntimeException("请先初始化TTS,先调用initTTS");
        }else
        return speaker;
    }
    /**
     * 初始化tts
     * @param context
     */
    public void initTTS(Context context){
        if (speaker == null){
            speaker = new Speaker(context);
        }
    }
}
app/src/main/java/safeluck/drive/evaluation/fragment/NetWorkTrainFragment.java
@@ -162,6 +162,7 @@
                    currTotalScore -=item_id;
                    if (currTotalScore < Constant.PASSING_SCORE){
                        MyLog.i(TAG,"低于80,不合格");
                        ExamPlatformData.getInstance().getTTS().speak("考试不合格");
                        stopExam();
                    }
                    MyLog.i(TAG,"监测到有失败项目加入,通知UI更新颜色");
@@ -248,6 +249,9 @@
            if (hasSnEqulas(failedProj_selects)){
            }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,发送");
                sns.add(failedProj_selects.get(i).getSn());
                jkMessage0203.timeBCD = failedProj_selects.get(i).getUtc();
@@ -334,7 +338,7 @@
    private void initView(View view) {
        view.findViewById(R.id.profile).setOnClickListener(this);
        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);
@@ -400,10 +404,12 @@
                jkMessage0202.ID = ExamPlatformData.getInstance().getID();
                jkMessage0202.exam_id = ExamPlatformData.getInstance().getExam_id();
                MessageProcessor.getInstance().sendMessage(jkMessage0202);
                ExamPlatformData.getInstance().getTTS().speak("开始考试");
                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);
@@ -416,7 +422,7 @@
            case R.id.btn_return:
                _mActivity.onBackPressed();
                break;
            case R.id.profile:
            case R.id.iv_head:
                MyLog.i(TAG,"签到,获取身份证物理卡号");
                AYSdk.getInstance().sendCmd(Constant.READ_PHYSICAL_ID,"");
                //TODO 获得物理卡号 发送JKMessage0201给平台,获取姓名、身份证、head_url
@@ -445,6 +451,7 @@
        iv_head.getDrawable().setLevel(0);
        OneTimeWorkRequest examStatusInitWork = OneTimeWorkRequest.from(ExamStatusInitWorker.class);
        WorkManager.getInstance(_mActivity).enqueue(examStatusInitWork);
        ExamPlatformData.getInstance().getTTS().speak("结束考试");
        sendExamJson(0);
        //TODO 发送JKMessage0204给平台 结束考试
        JKMessage0204 jkMessage0204 = new JKMessage0204();
app/src/main/res/layout/layout_net_train_iii_item.xml
New file
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp"
    android:gravity="bottom">
    <TableRow android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/simulate_light_night"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/side_by_side"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/over_take"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/school_area"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/bus_area"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/start_vehicle"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/junction_left"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/junction_right"/>
    </TableRow>
    <TableRow android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/crosswalk"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/straight_line"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/pull_over"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/night_driving"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/turn_around"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/add_subtract"/>
        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/by_crossing"/>        <Button android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:text="@string/lane_change"/>
    </TableRow>
</TableLayout>
app/src/main/res/values/strings.xml
@@ -35,4 +35,20 @@
    <string name="chesu">车速:</string>
    <string name="engine">转速:</string>
    <string name="platform_status">考试平台:%1$s</string>
    <string name="simulate_light_night">模拟夜间灯光</string>
    <string name="side_by_side">会车</string>
    <string name="over_take">超车</string>
    <string name="school_area">通过学校区域</string>
    <string name="bus_area">通过公共汽车站</string>
    <string name="start_vehicle">起步</string>
    <string name="junction_left">路口左转弯</string>
    <string name="junction_right">路口右转弯</string>
    <string name="crosswalk">通过人行横道</string>
    <string name="straight_line">直线行驶</string>
    <string name="pull_over">靠边停车</string>
    <string name="night_driving">夜间行驶</string>
    <string name="turn_around">掉头</string>
    <string name="add_subtract">加减档</string>
    <string name="by_crossing">通过路口</string>
    <string name="lane_change">变更车道</string>
</resources>