yy1717
2020-01-21 a889e603481b5f3f6cf0074af1f25f94b571db8c
app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java
@@ -6,8 +6,8 @@
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
@@ -15,7 +15,6 @@
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -32,6 +31,9 @@
import java.lang.reflect.Type;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import me.yokeyword.fragmentation.SupportFragment;
import safeluck.drive.evaluation.Constant;
@@ -52,6 +54,36 @@
 */
public class MapFragment extends SupportFragment {
    private boolean isDrawing = false;
    private ICEventListener rtcmicEventListener = new ICEventListener() {
        @Override
        public void onCEvent(String topic, int msgCode, int resultCode, final Object obj) {
            if (msgCode == Constant.DEBUG_RTCM){
                CThreadPoolExecutor.runOnMainThread(new Runnable() {
                    @Override
                    public void run() {
                        Log.i(TAG, "title="+(String)obj);
                        toolbar.setTitle((String)obj);
                    }
                });
                }
        }
    };
    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);
                    }
                });
            }
        }
    };
    public static SupportFragment newInstance() {
        return new MapFragment();
@@ -80,6 +112,9 @@
            , {9.278, -1.5330000000000004}, {9.277999999999999, 1.467000000000001}};
    Gson gson;
    private LinearLayout linearLayout;//surfaceview的父容器,为了移动surfaceview而使用,因为scrollto不能移动view,
    private LinkedBlockingQueue queue = new LinkedBlockingQueue(100);
    private ExecutorService producer = Executors.newSingleThreadExecutor();
    private ExecutorService consumer = Executors.newSingleThreadExecutor();
    @Nullable
@@ -88,6 +123,7 @@
        View view = inflater.inflate(R.layout.layout_mapfragment, container, false);
        gson = new Gson();
        initView(view);
        consumer.execute(new CalRunnable());
        return view;
    }
@@ -282,12 +318,12 @@
                    pathText.lineTo(700, 30);
                    canvas2.drawTextOnPath(osd2, pathText, 0, 0, paint);//逆时针生成
                }
                if (osd3 != null) {
                    Path pathText = new Path();
                    pathText.moveTo(10, 240);
                    pathText.lineTo(700, 130);
                    canvas2.drawTextOnPath(osd2, pathText, 0, 0, paint);//逆时针生成
                }
//                if (osd3 != null) {
//                    Path pathText = new Path();
//                    pathText.moveTo(10, 240);
//                    pathText.lineTo(700, 130);
//                    canvas2.drawTextOnPath(osd2, pathText, 0, 0, paint);//逆时针生成
//                }
                // 提交画布
                Canvas canvas = holder.lockCanvas();
@@ -329,83 +365,83 @@
    int line = 0;
    int map_line = 0;
    private StringBuffer stringBuffer = new StringBuffer();
    class MessageRemoteService{
        public int msgCode;
        public String json;
        public MessageRemoteService(int msgCode, Object obj) {
            this.json = (String) obj;
            this.msgCode = msgCode;
        }
    }
    private ICEventListener icEventListener = new ICEventListener() {
        @Override
        public void onCEvent(String topic, int msgCode, int resultCode, Object obj) {
        public void onCEvent(String topic, final int msgCode, int resultCode, final Object obj) {
            CThreadPoolExecutor.runInBackground(new CalRunnable(msgCode,(String)obj));
            producer.execute(new Runnable() {
                @Override
                public void run() {
                    queue.offer(new MessageRemoteService(msgCode,obj));
                }
            });
        }
    };
    boolean flag = true;
    class CalRunnable implements Runnable{
        private String json;
        private int cmd;
        public CalRunnable(int cmd,String obj) {
           this.json = obj;
           this.cmd = cmd;
        }
        @Override
        public void run() {
            MyLog.i(TAG, json);
            if (!(cmd == Constant.REAL_TIME_CAR_POS)){
                if (cmd == Constant.DEBUG_RTCM){
                    stringBuffer.append("\tRTCM:");
            while (flag){
                MessageRemoteService messageRemoteService = (MessageRemoteService) queue.peek();
                if (messageRemoteService == null){
                    try {
                        JSONObject jsonObject = new JSONObject(json);
                        int length = jsonObject.getInt("length");
                        stringBuffer.append(length);
                    } catch (JSONException e) {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if (cmd == Constant.DEBUG_TXT){
                    try {
                        JSONObject jsonObject = new JSONObject(json);
                        String info = jsonObject.getString("info");
                        stringBuffer.append("\tinfo:");
                        stringBuffer.append(info);
                    } catch (JSONException e) {
                        e.printStackTrace();
                messageRemoteService = (MessageRemoteService) queue.poll();
                if (messageRemoteService != null){
                    this.cmd = messageRemoteService.msgCode;
                    this.json = messageRemoteService.json;
                    MyLog.i(TAG, json);
                    RealTimeCarPos timeCarPos = gson.fromJson((String) json, RealTimeCarPos.class);
                    List<Double> points = timeCarPos.getPoint();
                    switch (timeCarPos.getMove()){
                        case 0:
                            osd2 = "停车";
                            break;
                        case 1:
                            osd2 = "前进";
                            break;
                        case -1:
                            osd2 = "后退";
                            break;
                    }
                    osd="方向角"+String.valueOf(timeCarPos.getHeading());
                    line = 0;
                    map_line = 0;
                }
            }
            osd3 = stringBuffer.toString();
            if (osd3!=null && osd3.contains("info:")&&osd3.contains("RTCM:")){
                    for (int i = 0; i < points.size(); i++) {
                        if ((i % 2) == 0) {
                            car[line][0] = points.get(i);
                        } else {
                            double value = 0 - points.get(i);
                            Log.i(TAG, "onCEvent: 新值=" + value + " 位置:" + i);
                            car[line][1] = value;
                            line++;
                        }
                stringBuffer.delete(0,stringBuffer.length());
            }
            RealTimeCarPos timeCarPos = gson.fromJson((String) json, RealTimeCarPos.class);
            List<Double> points = timeCarPos.getPoint();
            switch (timeCarPos.getMove()){
                case 0:
                    osd2 = "停车";
                    break;
                case 1:
                    osd2 = "前进";
                    break;
                case -1:
                    osd2 = "后退";
                    break;
            }
            osd="方向角"+String.valueOf(timeCarPos.getHeading());
            line = 0;
            map_line = 0;
            for (int i = 0; i < points.size(); i++) {
                if ((i % 2) == 0) {
                    car[line][0] = points.get(i);
                } else {
                    double value = 0 - points.get(i);
                    Log.i(TAG, "onCEvent: 新值=" + value + " 位置:" + i);
                    car[line][1] = value;
                    line++;
                }
            }
            map_id = timeCarPos.getMap_id();
                    }
                    map_id = timeCarPos.getMap_id();
//            1 - 倒库
//            2 - 坡起
//            3 - 侧方停车
@@ -413,56 +449,67 @@
//            5 - 直角转弯
            StringBuffer buffer = FileUtil.readTxtFileFromSD(_mActivity,Constant.MAP);
            Type type = new TypeToken<List<ExamMap>>(){}.getType();
            if (buffer != null){
                List<ExamMap> examMaps = gson.fromJson(buffer.toString().trim(), type);
                    StringBuffer buffer = FileUtil.readTxtFileFromSD(_mActivity,Constant.MAP);
                    Type type = new TypeToken<List<ExamMap>>(){}.getType();
                    if (buffer != null){
                        List<ExamMap> examMaps = gson.fromJson(buffer.toString().trim(), type);
                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 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(i).getXy();
                            if(j==0){
                                map = new double[xys.size()/2][2];
                            }else{
                                MyLog.i(TAG,"暂时还不支持曲线");
                                for(int j=0; j<pointBeanList.size();j++){
                                    List<Double> xys = pointBeanList.get(i).getXy();
                                    if(j==0){
                                        map = new double[xys.size()/2][2];
                                    }else{
                                        MyLog.i(TAG,"暂时还不支持曲线");
                                        break;
                                    }
                                    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 + " 位置:" + i);
                                            map[map_line][1] = value;
                                            map_line++;
                                        }
                                    }
                                }
                                break;
                            }
                            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 + " 位置:" + i);
                                    map[map_line][1] = value;
                                    map_line++;
                                }
                            }
                        }
                        break;
                    }
                    DrawMap(map,car);
                }
            }
            DrawMap(map,car);
        }
    }
    @Override
    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);
    }
    @Override
    public void onDetach() {
        super.onDetach();
        flag = false;
        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);
    }
}