优化app.java代码,防止RTK配置发两次;MCU协处理器升级以Worker的形势进行,防止多个入口升级,升级之后会删除dfu.bin,加入dfu.bin不存在的话给出提示;
| | |
| | | public static int DaoLu = 4; |
| | | @NotNull |
| | | public static final String TIME_MINUTE = "show_time_minute"; |
| | | @NotNull |
| | | public static final String MCU_UPGRADE_FAIL_RESASON = "mcu_upgrade_fail_reason"; |
| | | } |
| | |
| | | } |
| | | var indexs = WorkRoomDataBase.getWorkRoomDataBase(applicationContext).signalConfigDao.allIndexs |
| | | sendSignalConfigsToRemote(indexs) |
| | | MyLog.i("查到的考试type="+examType) |
| | | MyLog.i(TAG,"查到的考试type="+examType) |
| | | val data = Data.Builder().putInt(Constant.EXAM_STATUS_TYPE,examType).build() |
| | | if (examType != safeluck.drive.evaluation.Constant.NONE_BEEN_START_EXAM) { |
| | | try { |
| | |
| | | private Gson gson = new Gson(); |
| | | String[] PERMISSIONS = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; |
| | | RTKConfigViewModel rtkConfigViewModel; |
| | | private boolean onlySendOnceRTKConfig = true; |
| | | |
| | | |
| | | private ICEventListener icEventListener = new ICEventListener() { |
| | | @Override |
| | | public void onCEvent(String topic, int msgCode, int resultCode, Object obj) { |
| | | if (msgCode == Constant.FETCH_RTK_PLATFORM_INFO) { |
| | | // sendRtkConfigInfo(); |
| | | } |
| | | |
| | | if (msgCode == Constant.RTK_PLATFORM_REGISTER_STATUS) { |
| | | try { |
| | | JSONObject jsonObject = new JSONObject((String) obj); |
| | |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | if (msgCode == Constant.NDK_START){ |
| | | MyLog.i(TAG,"NDK_start"); |
| | | // sendRtkConfigInfo(); |
| | | sendMcuUprgrade(); |
| | | } |
| | | |
| | | } |
| | | }; |
| | | private List<SignalConfigRemote> signalConfiglist = new ArrayList<>(); |
| | |
| | | |
| | | } |
| | | |
| | | // private void sendRtkConfigInfo() { |
| | | // if (mRTKConfig != null) { |
| | | // String rtkjson = gson.toJson(mRTKConfig); |
| | | // |
| | | // //去除id字段 |
| | | // JSONObject jsonObject = null; |
| | | // try { |
| | | // jsonObject = new JSONObject(rtkjson); |
| | | // } catch (JSONException e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // jsonObject.remove("_id"); |
| | | // rtkjson = null; |
| | | // rtkjson = jsonObject.toString(); |
| | | // MyLog.i(TAG, "RTK配置信息:" + rtkjson); |
| | | // AYSdk.getInstance().sendCmd(Constant.PUSH_RTK_PLATFORM_INFO, rtkjson); |
| | | // } else { |
| | | // MyLog.d(TAG, "RTKConfig未取到数据"); |
| | | // onlySendOnceRTKConfig = true; |
| | | // } |
| | | // } |
| | | public ExamPlatformModel examPlatformModel; |
| | | @Override |
| | | protected void onCreate(Bundle savedInstanceState) { |
| | |
| | | loadRootFragment(R.id.fl_container, HomeFragment.newInstance()); |
| | | } |
| | | |
| | | CEventCenter.onBindEvent(true, icEventListener, Constant.BIND_RTKCONFIG_TOPIC);//发送rtk配置消息 |
| | | CEventCenter.onBindEvent(true, icEventListener, Constant.BIND_CONNECT_RTK_TOPIC);//收到rtk连接 登录结果 |
| | | |
| | | } |
| | |
| | | @Override |
| | | protected void onDestroy() { |
| | | super.onDestroy(); |
| | | CEventCenter.onBindEvent(false, icEventListener, Constant.BIND_RTKCONFIG_TOPIC); |
| | | |
| | | CEventCenter.onBindEvent(false, icEventListener, Constant.BIND_CONNECT_RTK_TOPIC); |
| | | Log.i(TAG, "onDestroy: "); |
| | |
| | | import safeluck.drive.evaluation.util.FileUtil; |
| | | import safeluck.drive.evaluation.util.SPUtils; |
| | | import safeluck.drive.evaluation.util.SystemUtil; |
| | | import safeluck.drive.evaluation.worker.MCUUpgradeWorker; |
| | | |
| | | /** |
| | | * MyApplication2 |
| | |
| | | sendVechileInfo(); |
| | | sendMapInfo(); |
| | | OneTimeWorkRequest examStatausOutWorker = OneTimeWorkRequest.from(ExamStatusOutWorker.class); |
| | | WorkManager.getInstance(getApplicationContext()).enqueue(examStatausOutWorker); |
| | | OneTimeWorkRequest mcuUpgradeWorker = OneTimeWorkRequest.from(MCUUpgradeWorker.class); |
| | | WorkManager.getInstance(getApplicationContext()).beginWith(examStatausOutWorker).then(mcuUpgradeWorker).enqueue(); |
| | | |
| | | |
| | | |
| | | CEventCenter.dispatchEvent(Constant.BIND_CONNECT_RTK_TOPIC,cmd,0,json); |
| | | // CEventCenter.dispatchEvent(Constant.BIND_CONNECT_RTK_TOPIC,cmd,0,json); |
| | | break; |
| | | case Constant.RTK_PLATFORM_REGISTER_STATUS: |
| | | CEventCenter.dispatchEvent(Constant.BIND_CONNECT_RTK_TOPIC,cmd,0,json); |
| | |
| | | |
| | | break; |
| | | case Constant.FETCH_RTK_PLATFORM_INFO: |
| | | CEventCenter.dispatchEvent(Constant.BIND_RTKCONFIG_TOPIC,cmd,0,""); |
| | | // CEventCenter.dispatchEvent(Constant.BIND_RTKCONFIG_TOPIC,cmd,0,""); |
| | | break; |
| | | case Constant.JUDGE_INFO: |
| | | |
| | |
| | | if (sn.equalsIgnoreCase(lastSn)){ |
| | | |
| | | }else{ |
| | | if (TextUtils.isEmpty(lastSn)){ |
| | | lastSn =sn; |
| | | return; |
| | | } |
| | | lastSn = sn; |
| | | Data data = new Data.Builder().putString(safeluck.drive.evaluation.DB.Constant.RTK_CONFIG_UPDATE_JSON,sn).build(); |
| | | OneTimeWorkRequest rtkConfigUpdateWorker= new OneTimeWorkRequest.Builder(RTKConfigUpdateWorker.class).setInputData(data).build(); |
| | |
| | | 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)); |
| | |
| | | import androidx.lifecycle.ViewModelProviders; |
| | | import androidx.recyclerview.widget.LinearLayoutManager; |
| | | import androidx.recyclerview.widget.RecyclerView; |
| | | import androidx.work.Data; |
| | | import androidx.work.OneTimeWorkRequest; |
| | | import androidx.work.WorkInfo; |
| | | import androidx.work.WorkManager; |
| | | |
| | | import com.anyun.exam.lib.AYSdk; |
| | |
| | | import safeluck.drive.evaluation.util.CThreadPoolExecutor; |
| | | import safeluck.drive.evaluation.util.FileUtil; |
| | | import safeluck.drive.evaluation.util.SPUtils; |
| | | import safeluck.drive.evaluation.worker.MCUUpgradeWorker; |
| | | |
| | | /** |
| | | * 设置所有参数 |
| | |
| | | case R.id.btn_mcu_upgrade: |
| | | |
| | | |
| | | |
| | | try { |
| | | byte[] datas = FileUtil.readLocalFile(getActivity(),"dfu.bin"); |
| | | if (datas != null){ |
| | | Log.i(TAG, ByteUtil.byte2hex(datas)); |
| | | |
| | | String strs = new String(datas, Charset.forName("ISO-8859-1")); |
| | | Log.i(TAG, "onClick: datas.legnth=="+strs.getBytes("ISO-8859-1").length); |
| | | AYSdk.getInstance().sendCmd(Constant.UPGRADE_MCU_CONTENT_FILE, strs); |
| | | }else{ |
| | | MyLog.i(TAG,"mcu升级文件不存在"); |
| | | } |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | OneTimeWorkRequest mcuUpgradeWorkReq = OneTimeWorkRequest.from(MCUUpgradeWorker.class); |
| | | WorkManager.getInstance(_mActivity.getApplicationContext()).enqueue(mcuUpgradeWorkReq); |
| | | WorkManager.getInstance(_mActivity.getApplicationContext()).getWorkInfoByIdLiveData(mcuUpgradeWorkReq.getId()) |
| | | .observe(this, new Observer<WorkInfo>() { |
| | | @Override |
| | | public void onChanged(WorkInfo workInfo) { |
| | | if (workInfo.getState()== WorkInfo.State.FAILED){ |
| | | Data data = workInfo.getOutputData(); |
| | | String str = data.getString(Constant.MCU_UPGRADE_FAIL_RESASON); |
| | | Toast.makeText(_mActivity, str, Toast.LENGTH_SHORT).show(); |
| | | } |
| | | } |
| | | }); |
| | | break; |
| | | case R.id.btn_save_platform: |
| | | Toast.makeText(_mActivity, "保存成功", Toast.LENGTH_SHORT).show(); |
| | |
| | | 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)); |
| | |
| | | package safeluck.drive.evaluation.viewmodels |
| | | |
| | | import android.util.Log |
| | | import androidx.lifecycle.LiveData |
| | | import androidx.lifecycle.MutableLiveData |
| | | import androidx.lifecycle.ViewModel |
| | | import safeluck.drive.evaluation.util.Utils |
| | | |
| | | class TimeViewModel : ViewModel() { |
| | | val TAG:String = "TimeViewModel" |
| | | private var time:MutableLiveData<String> = MutableLiveData<String>() |
| | | private var flag=true |
| | | fun getLiveDataTime():LiveData<String> { |
| | | loadTime(); |
| | | return time |
| | | } |
| | | |
| | | private fun loadTime() { |
| | | |
| | | Thread(Runnable { |
| | | while (flag){ |
| | | try { |
| | | Thread.sleep(10 * 1000.toLong()) |
| | | } catch (e: InterruptedException) { |
| | | e.printStackTrace() |
| | | } |
| | | Log.i(TAG,"10s时间到") |
| | | time.postValue(Utils.getHHmm()) |
| | | } |
| | | |
| | | |
| | | }).start() |
| | | } |
| | | |
| | | override fun onCleared() { |
| | | Log.i(TAG,"onCleared") |
| | | flag = false; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package safeluck.drive.evaluation.worker |
| | | |
| | | import android.content.Context |
| | | 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 safeluck.drive.evaluation.Constant |
| | | import safeluck.drive.evaluation.util.FileUtil |
| | | import java.io.IOException |
| | | import java.nio.charset.Charset |
| | | |
| | | class MCUUpgradeWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams){ |
| | | override fun doWork(): Result { |
| | | MyLog.i("升级单片机") |
| | | |
| | | try { |
| | | val datas = FileUtil.readLocalFile(applicationContext, "dfu.bin") |
| | | if (datas != null) { |
| | | val strs = String(datas, Charset.forName("ISO-8859-1")) |
| | | AYSdk.getInstance().sendCmd(Constant.UPGRADE_MCU_CONTENT_FILE, strs) |
| | | FileUtil.deleteFile("",Constant.MCU_FILE_NAME); |
| | | } else { |
| | | |
| | | MyLog.i( "mcu升级文件不存在") |
| | | var data = Data.Builder().putString(Constant.MCU_UPGRADE_FAIL_RESASON,"mcu升级文件不存在").build() |
| | | return Result.failure(data); |
| | | } |
| | | } catch (e: IOException) { |
| | | e.printStackTrace() |
| | | } |
| | | return Result.success() |
| | | } |
| | | |
| | | } |
| | |
| | | } |
| | | //动态长度,去掉其他所有字段的长度,剩余的为此字段长度 |
| | | if (fieldDefine.getFieldLen() > 0) { |
| | | System.out.println(fieldDefine.field.getName() + "长度=" + fieldDefine.getFieldLen() * 2); |
| | | // System.out.println(fieldDefine.field.getName() + "长度=" + fieldDefine.getFieldLen() * 2); |
| | | used += (fieldDefine.getFieldLen() * 2); |
| | | } |
| | | |