| | |
| | | import android.graphics.Paint; |
| | | 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; |
| | |
| | | import androidx.appcompat.widget.Toolbar; |
| | | |
| | | |
| | | import com.anyun.exam.lib.AYSdk; |
| | | import com.anyun.exam.lib.MyLog; |
| | | import com.google.gson.Gson; |
| | | import com.google.gson.reflect.TypeToken; |
| | | |
| | | |
| | | import org.json.JSONException; |
| | | import org.json.JSONObject; |
| | | |
| | | import java.lang.reflect.Type; |
| | | import java.math.BigDecimal; |
| | | import java.text.DecimalFormat; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.concurrent.ExecutorService; |
| | |
| | | import safeluck.drive.evaluation.R; |
| | | import safeluck.drive.evaluation.bean.ExamMap; |
| | | import safeluck.drive.evaluation.bean.ExamPlatformData; |
| | | import safeluck.drive.evaluation.bean.Point; |
| | | import safeluck.drive.evaluation.bean.RealTimeCarPos; |
| | | import safeluck.drive.evaluation.cEventCenter.CEventCenter; |
| | | import safeluck.drive.evaluation.cEventCenter.ICEventListener; |
| | | import safeluck.drive.evaluation.util.CThreadPoolExecutor; |
| | | import safeluck.drive.evaluation.util.FileUtil; |
| | | import safeluck.drive.evaluation.util.Utils; |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | } |
| | | }; |
| | | private ICEventListener debugTxticEventListener = new ICEventListener() { |
| | | @Override |
| | | public void onCEvent(String topic, int msgCode, int resultCode, final Object obj) { |
| | | if (msgCode == Constant.DEBUG_TXT){ |
| | | CThreadPoolExecutor.runOnMainThread(new Runnable() { |
| | | @Override |
| | | public void run() { |
| | | Log.i(TAG, "subtitle="+(String)obj); |
| | | toolbar.setSubtitle((String)obj); |
| | | } |
| | | }); |
| | | |
| | | } |
| | | } |
| | | }; |
| | | private ICEventListener speedListener = new ICEventListener() { |
| | | @Override |
| | | public void onCEvent(String topic, int msgCode, int resultCode, Object obj) { |
| | | if (msgCode == Constant.RTK_INFO){ |
| | | gpsSpeed = (double)obj; |
| | | } |
| | | if (msgCode == Constant.LEFT_RIGHT_DISTANCE){ |
| | | String str = (String)obj; |
| | | |
| | | try { |
| | | JSONObject jsonObject = new JSONObject(str); |
| | | leftDistance = Utils.getdouble(jsonObject.getDouble("left"),3); |
| | | rightDistance = Utils.getdouble(jsonObject.getDouble("right"),3); |
| | | |
| | | } catch (JSONException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | }; |
| | |
| | | |
| | | private int map_id; |
| | | private double gpsSpeed = 0; |
| | | private double leftDistance = 0; |
| | | private double rightDistance = 0; |
| | | |
| | | double allMap[][][]; |
| | | double map[][] = {{-2.4065, 30.7090}, {-3.0759, 30.3599}, { -2.6023, 29.2578}, {-3.3316,28.9383},{-3.8247,30.0293}, |
| | |
| | | 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 (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 (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);//逆时针生成 |
| | | } |
| | | // 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); |
| | |
| | | // _mActivity.runOnUiThread(new Runnable() { |
| | | // @Override |
| | | // public void run() { |
| | | double base_x = 300, base_y = 20; |
| | | float base_x = 300; |
| | | float 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); |
| | |
| | | |
| | | paint.setStyle(Paint.Style.FILL_AND_STROKE); |
| | | |
| | | canvas3.drawColor(Color.RED); |
| | | canvas3.drawColor(Color.YELLOW); |
| | | |
| | | if (osdHeading != null) { |
| | | Path pathText = new Path(); |
| | | pathText.moveTo(10, 170); |
| | | pathText.lineTo(700, 170); |
| | | pathText.moveTo(10, 30); |
| | | pathText.lineTo(700, 30); |
| | | canvas3.drawTextOnPath(osdHeading, pathText, 0, 0, paint);//逆时针生成 |
| | | } |
| | | |
| | | if (osdMoveDirect != null) { |
| | | Path pathText = new Path(); |
| | | pathText.moveTo(10, 30); |
| | | pathText.lineTo(700, 30); |
| | | canvas3.drawTextOnPath(osdMoveDirect, pathText, 0, 0, paint);//逆时针生成 |
| | | } |
| | | |
| | | // if (osdMoveDirect != null) { |
| | | // Path pathText = new Path(); |
| | | // pathText.moveTo(10, 30); |
| | | // pathText.lineTo(700, 30); |
| | | // canvas3.drawTextOnPath(osdMoveDirect, pathText, 0, 0, paint);//逆时针生成 |
| | | // } |
| | | // |
| | | if (osdRtkSpeed != null) { |
| | | Path pathText = new Path(); |
| | | pathText.moveTo(10, 240); |
| | | pathText.lineTo(700, 240); |
| | | canvas3.drawTextOnPath(osdRtkSpeed, pathText, 0, 0, paint);//逆时针生成 |
| | | } |
| | | |
| | | if (osdQf != null) { |
| | | Path pathText = new Path(); |
| | | pathText.moveTo(10, 120); |
| | | pathText.lineTo(700, 120); |
| | | canvas3.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); |
| | | |
| | | canvas3.drawTextOnPath("GPS速度:" + bd, pathText, 0, 0, paint);//逆时针生成 |
| | | canvas3.drawTextOnPath(osdRtkSpeed, pathText, 0, 0, paint);//逆时针生成 |
| | | } |
| | | // |
| | | // if (osdQf != null) { |
| | | // Path pathText = new Path(); |
| | | // pathText.moveTo(10, 120); |
| | | // pathText.lineTo(700, 120); |
| | | // canvas3.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); |
| | | // |
| | | // canvas3.drawTextOnPath("GPS速度:" + bd, pathText, 0, 0, paint);//逆时针生成 |
| | | // } |
| | | |
| | | |
| | | |
| | | base_x = 170; |
| | | base_y = 350; |
| | | |
| | | scale_x=scale_y = 27; |
| | | |
| | | 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 + (mainAnt.get(1) - min_y) * scale_y), 2, paint); |
| | | canvas3.drawCircle((float) base_x, (float) base_y, 2, paint); |
| | | |
| | | paint.setColor(Color.RED); |
| | | |
| | | canvas3.drawCircle((float) (base_x + (car[tire.get(0)][0]) * scale_x), (float) (base_y + (car[tire.get(0)][1]) * scale_y), 2.5f, paint); |
| | | canvas3.drawCircle((float) (base_x + (car[tire.get(1)][0]) * scale_x), (float) (base_y + (car[tire.get(1)][1]) * scale_y), 2.5f, paint); |
| | | canvas3.drawCircle((float) (base_x + (car[tire.get(2)][0]) * scale_x), (float) (base_y + (car[tire.get(2)][1]) * scale_y), 2.5f, paint); |
| | | canvas3.drawCircle((float) (base_x + (car[tire.get(3)][0]) * scale_x), (float) (base_y + (car[tire.get(3)][1]) * scale_y), 2.5f, paint); |
| | | |
| | | |
| | | |
| | | Path pathCanvs3 = new Path(); |
| | | pathCanvs3.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))); |
| | | pathCanvs3.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)); |
| | | } |
| | | paint.setStyle(Paint.Style.STROKE); |
| | | paint.setColor(Color.BLACK); |
| | | pathCanvs3.close(); |
| | | canvas3.drawPath(pathCanvs3,paint); |
| | | |
| | | Paint mPaint = new Paint(); |
| | | mPaint.setTextSize(20); |
| | | mPaint.setStyle(Paint.Style.FILL_AND_STROKE); |
| | | osdMoveDirect="9.4345"; |
| | | if (osdMoveDirect != null) { |
| | | Path pathText = new Path(); |
| | | pathText.moveTo(base_x-110, base_y-35); |
| | | pathText.lineTo(base_x-20, base_y-35); |
| | | canvas3.drawTextOnPath(String.valueOf(leftDistance), pathText, 0, 0, mPaint);//逆时针生成 |
| | | } |
| | | if (osdMoveDirect != null) { |
| | | Path pathText = new Path(); |
| | | pathText.moveTo(base_x+30, base_y-35); |
| | | pathText.lineTo(base_x+110, base_y-35); |
| | | canvas3.drawTextOnPath(String.valueOf(rightDistance), pathText, 0, 0, mPaint);//逆时针生成 |
| | | } |
| | | paint.setColor(Color.RED); |
| | | canvas3.drawLine(base_x-120,base_y-200,base_x-120,base_y+200,paint); |
| | | canvas3.drawLine(base_x+120,base_y-200,base_x+120,base_y+200,paint); |
| | | |
| | | DrawArrows(canvas3,Color.GREEN,15f,base_x-20,base_y-30,base_x-120,base_y-30);//左边箭头(左边距 |
| | | DrawArrows(canvas3,Color.GREEN,15f,base_x+20,base_y-30,base_x+120,base_y-30);//右边箭头(边距 |
| | | |
| | | |
| | | // 提交画布 |
| | |
| | | |
| | | BigDecimal bd = new BigDecimal(timeCarPos.getSpeed()); |
| | | bd = bd.setScale(3, BigDecimal.ROUND_HALF_UP); |
| | | osdRtkSpeed = "计算速度:" + bd; |
| | | osdRtkSpeed = "速度:" + bd; |
| | | |
| | | osdQf = "QF:" + String.valueOf(timeCarPos.getQf()); |
| | | |
| | |
| | | public void onAttach(Context context) { |
| | | super.onAttach(context); |
| | | CEventCenter.onBindEvent(true, icEventListener, Constant.REAL_TIME_POS_CAR_TOPIC); |
| | | CEventCenter.onBindEvent(true, rtcmicEventListener, Constant.BIND_RTCM_TOPIC); |
| | | CEventCenter.onBindEvent(true, debugTxticEventListener, Constant.BIND_DEBUG_TXT); |
| | | CEventCenter.onBindEvent(true, speedListener, Constant.BIND_RTK_SPEED_TOPIC); |
| | | } |
| | | |
| | |
| | | producer.shutdown(); |
| | | consumer.shutdown(); |
| | | CEventCenter.onBindEvent(false, icEventListener, Constant.REAL_TIME_POS_CAR_TOPIC); |
| | | CEventCenter.onBindEvent(false, icEventListener, Constant.BIND_RTCM_TOPIC); |
| | | CEventCenter.onBindEvent(false, icEventListener, Constant.BIND_DEBUG_TXT); |
| | | CEventCenter.onBindEvent(false, speedListener, Constant.BIND_RTK_SPEED_TOPIC); |
| | | } |
| | | |
| | | |
| | | |
| | | void DrawArrows(Canvas canvas, int color, float arrowSize, float x1, |
| | | float y1, float x2, float y2) { |
| | | paint.setAntiAlias(true); |
| | | paint.setStyle(Paint.Style.STROKE); |
| | | paint.setColor(color); |
| | | |
| | | // 画直线 |
| | | canvas.drawLine(x1, y1, x2, y2, paint); |
| | | |
| | | // 箭头中的第一条线的起点 |
| | | int x3 = 0; |
| | | int y3 = 0; |
| | | |
| | | // 箭头中的第二条线的起点 |
| | | int x4 = 0; |
| | | int y4 = 0; |
| | | |
| | | double awrad = Math.atan(3.5 / 8); |
| | | double[] arrXY_1 = rotateVec(x2 - x1, y2 - y1, awrad, arrowSize); |
| | | double[] arrXY_2 = rotateVec(x2 - x1, y2 - y1, -awrad, arrowSize); |
| | | |
| | | // 第一端点 |
| | | Double X3 = Double.valueOf(x2 - arrXY_1[0]); |
| | | x3 = X3.intValue(); |
| | | Double Y3 = Double.valueOf(y2 - arrXY_1[1]); |
| | | y3 = Y3.intValue(); |
| | | |
| | | // 第二端点 |
| | | Double X4 = Double.valueOf(x2 - arrXY_2[0]); |
| | | x4 = X4.intValue(); |
| | | Double Y4 = Double.valueOf(y2 - arrXY_2[1]); |
| | | y4 = Y4.intValue(); |
| | | |
| | | Path arrowsPath = new Path(); |
| | | arrowsPath.moveTo(x2, y2); |
| | | arrowsPath.lineTo(x3, y3); |
| | | arrowsPath.lineTo(x4, y4); |
| | | arrowsPath.close(); |
| | | canvas.drawLine(x3, y3, x2, y2, paint); |
| | | canvas.drawLine(x4, y4, x2, y2, paint); |
| | | } |
| | | |
| | | private double[] rotateVec(float px, float py, double ang, double arrowSize) { |
| | | double mathstr[] = new double[2]; |
| | | double vx = px * Math.cos(ang) - py * Math.sin(ang); |
| | | double vy = px * Math.sin(ang) + py * Math.cos(ang); |
| | | double d = Math.sqrt(vx * vx + vy * vy); |
| | | vx = vx / d * arrowSize; |
| | | vy = vy / d * arrowSize; |
| | | mathstr[0] = vx; |
| | | mathstr[1] = vy; |
| | | return mathstr; |
| | | } |
| | | |
| | | |
| | | } |