[change] pb添加特种车辆,添加清扫车命令发送 以及调试程序特种车辆下发
This commit is contained in:
@@ -5,9 +5,11 @@ import android.app.Application;
|
||||
import com.zhidao.adas.client.utils.CrashHandler;
|
||||
|
||||
public class App extends Application {
|
||||
public static App INSTANCE;
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
INSTANCE = this;
|
||||
CrashHandler.getInstance().init(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,9 +11,9 @@ import com.zhidao.adas.client.bean.ErrorData;
|
||||
import com.zhidao.adas.client.bean.GlobalPathResp;
|
||||
import com.zhidao.adas.client.bean.GnssInfo;
|
||||
import com.zhidao.adas.client.bean.MogoReportMessage;
|
||||
import com.zhidao.adas.client.bean.MyPointCloud;
|
||||
import com.zhidao.adas.client.bean.OriginalPointCloudData;
|
||||
import com.zhidao.adas.client.bean.PerceptionTrafficLight;
|
||||
import com.zhidao.adas.client.bean.PlanningDecisionState;
|
||||
import com.zhidao.adas.client.bean.PlanningObjects;
|
||||
import com.zhidao.adas.client.bean.PredictionObstacleTrajectory;
|
||||
import com.zhidao.adas.client.bean.RecordDataConfig;
|
||||
@@ -114,9 +114,9 @@ public class DataDistribution {
|
||||
public final List<String> listStatusInfo = new ArrayList<>();
|
||||
public final List<String> listRecordDataConfig = new ArrayList<>();
|
||||
public final List<String> listErrorData = new ArrayList<>();
|
||||
public final List<String> listPointCloud = new ArrayList<>();
|
||||
public final List<String> listOriginalPointCloud = new ArrayList<>();
|
||||
public final List<String> listPlanningObjects = new ArrayList<>();
|
||||
public final List<String> listPlanningDecisionState = new ArrayList<>();
|
||||
|
||||
public String cutDown(String str) {
|
||||
if (isCutDown && str.length() > 650) {
|
||||
@@ -144,14 +144,6 @@ public class DataDistribution {
|
||||
if (listener != null && Constants.TITLE.RECEIVE_TRACKED_OBJECTS.equals(listener.first)) {
|
||||
listener.second.onRefresh();
|
||||
}
|
||||
} else if (data instanceof MyPointCloud) {
|
||||
listPointCloud.add(0, time + str);
|
||||
if (listPointCloud.size() > LIST_SIZE) {
|
||||
listPointCloud.remove(listPointCloud.size() - 1);
|
||||
}
|
||||
if (listener != null && Constants.TITLE.RECEIVE_POINT_CLOUD.equals(listener.first)) {
|
||||
listener.second.onRefresh();
|
||||
}
|
||||
} else if (data instanceof OriginalPointCloudData) {
|
||||
listOriginalPointCloud.add(0, time + str);
|
||||
if (listOriginalPointCloud.size() > LIST_SIZE) {
|
||||
@@ -168,6 +160,14 @@ public class DataDistribution {
|
||||
if (listener != null && Constants.TITLE.RECEIVE_PLANNING_OBJECTS.equals(listener.first)) {
|
||||
listener.second.onRefresh();
|
||||
}
|
||||
} else if (data instanceof PlanningDecisionState) {
|
||||
listPlanningDecisionState.add(0, time + str);
|
||||
if (listPlanningDecisionState.size() > LIST_SIZE) {
|
||||
listPlanningDecisionState.remove(listPlanningDecisionState.size() - 1);
|
||||
}
|
||||
if (listener != null && Constants.TITLE.RECEIVE_PLANNING_DECISION_STATE.equals(listener.first)) {
|
||||
listener.second.onRefresh();
|
||||
}
|
||||
} else if (data instanceof GnssInfo) {
|
||||
listGnssInfo.add(0, time + str);
|
||||
if (listGnssInfo.size() > LIST_SIZE) {
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
package com.zhidao.adas.client.adapter;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.zhidao.adas.client.R;
|
||||
import com.zhidao.adas.client.bean.InterfaceModel;
|
||||
import com.zhidao.support.adas.high.common.MessageType;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
|
||||
public class InterfaceAdapter extends RecyclerView.Adapter<InterfaceAdapter.MyViewHolder> {
|
||||
|
||||
private List<InterfaceModel> mDatas;
|
||||
private boolean isEnabled = true;//是否可操作
|
||||
private boolean oldIsEnabled = isEnabled;
|
||||
private int isCheckAll = 2;//0:全选 1:全不选 2:任意选
|
||||
private int checkNum;
|
||||
private boolean oldIsCheckAll = false;
|
||||
|
||||
private OnInterfaceAdapterListener listener;
|
||||
|
||||
public void setListener(OnInterfaceAdapterListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
public interface OnInterfaceAdapterListener {
|
||||
void onCheckAll(boolean isCheckAll);
|
||||
|
||||
void onCheckNum(int checkNum);
|
||||
}
|
||||
|
||||
public int getCheckNum() {
|
||||
return checkNum;
|
||||
}
|
||||
|
||||
//获取已选中的
|
||||
public Set<MessageType> getCheckedModel() {
|
||||
Set<MessageType> messageTypes = new HashSet<>();
|
||||
if (mDatas != null) {
|
||||
for (InterfaceModel model : mDatas) {
|
||||
if (model.isSelected()) {
|
||||
messageTypes.add(model.getMessageType());
|
||||
}
|
||||
}
|
||||
}
|
||||
return messageTypes;
|
||||
}
|
||||
|
||||
private void init() {
|
||||
isEnabled = true;
|
||||
oldIsEnabled = true;
|
||||
isCheckAll = 2;
|
||||
checkNum = 0;
|
||||
}
|
||||
|
||||
public void setData(List<InterfaceModel> mDatas, int checkNum) {
|
||||
init();
|
||||
this.mDatas = mDatas;
|
||||
if (mDatas != null && !mDatas.isEmpty()) {
|
||||
this.checkNum = checkNum;
|
||||
updateCheckAllStatus(true);
|
||||
}
|
||||
}
|
||||
|
||||
//全选 全不选
|
||||
public void setCheckAll(boolean checkAll) {
|
||||
isCheckAll = checkAll ? 0 : 1;
|
||||
checkNum = checkAll ? getItemCount() : 0;
|
||||
notifyDataSetChanged();
|
||||
updateCheckNumStatusCall();
|
||||
updateCheckAllStatus(false);
|
||||
}
|
||||
|
||||
public void setEnabled(boolean isEnabled) {
|
||||
if (oldIsEnabled != isEnabled) {
|
||||
oldIsEnabled = isEnabled;
|
||||
this.isEnabled = isEnabled;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//创建ViewHolder
|
||||
@NonNull
|
||||
@Override
|
||||
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
//实例化得到Item布局文件的View对象
|
||||
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_interface, parent, false);
|
||||
//返回MyViewHolder的对象
|
||||
return new MyViewHolder(v);
|
||||
}
|
||||
|
||||
//绑定数据
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
|
||||
holder.index.setEnabled(isEnabled);
|
||||
holder.name.setEnabled(isEnabled);
|
||||
holder.itemView.setEnabled(isEnabled);
|
||||
holder.itemCheck.setEnabled(isEnabled);
|
||||
InterfaceModel model = mDatas.get(position);
|
||||
holder.name.setText(model.getMessageType().desc);
|
||||
holder.index.setText((position + 1) + ".");
|
||||
if (isCheckAll == 0) {
|
||||
model.setSelected(true);
|
||||
} else if (isCheckAll == 1) {
|
||||
model.setSelected(false);
|
||||
}
|
||||
holder.itemCheck.setChecked(model.isSelected());
|
||||
|
||||
}
|
||||
|
||||
//返回Item的数量
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return mDatas == null ? 0 : mDatas.size();
|
||||
}
|
||||
|
||||
/***
|
||||
* 获取制定 位置的Data
|
||||
* @param position 下标
|
||||
* @return Data
|
||||
*/
|
||||
public InterfaceModel getItem(int position) {
|
||||
return mDatas == null ? null : mDatas.get(position);
|
||||
}
|
||||
|
||||
//继承RecyclerView.ViewHolder抽象类的自定义ViewHolder
|
||||
class MyViewHolder extends RecyclerView.ViewHolder {
|
||||
TextView name;
|
||||
TextView index;
|
||||
CheckBox itemCheck;
|
||||
|
||||
MyViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
index = itemView.findViewById(R.id.index);
|
||||
name = itemView.findViewById(R.id.name);
|
||||
name.setSelected(true);
|
||||
itemCheck = itemView.findViewById(R.id.item_check);
|
||||
init();
|
||||
|
||||
}
|
||||
|
||||
private void init() {
|
||||
itemView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
InterfaceModel model = getItem(getBindingAdapterPosition());
|
||||
model.setSelected(!model.isSelected());
|
||||
updateCheckNum(model.isSelected());
|
||||
itemCheck.setChecked(model.isSelected());
|
||||
}
|
||||
});
|
||||
itemCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (buttonView.isPressed()) {
|
||||
updateCheckNum(isChecked);
|
||||
InterfaceModel model = getItem(getBindingAdapterPosition());
|
||||
model.setSelected(isChecked);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//更新选中个数
|
||||
private void updateCheckNum(boolean isChecked) {
|
||||
if (isChecked) {
|
||||
checkNum++;
|
||||
} else {
|
||||
checkNum--;
|
||||
}
|
||||
updateCheckNumStatusCall();
|
||||
updateCheckAllStatus(true);
|
||||
}
|
||||
|
||||
private void updateCheckNumStatusCall() {
|
||||
if (listener != null)
|
||||
listener.onCheckNum(checkNum);
|
||||
}
|
||||
|
||||
//更新全选状态
|
||||
private void updateCheckAllStatus(boolean isNotice) {
|
||||
if (getItemCount() == checkNum) {
|
||||
isCheckAll = 0;
|
||||
updateCheckAllStatusCall(isNotice, true);
|
||||
} else if (0 == checkNum) {
|
||||
isCheckAll = 1;
|
||||
updateCheckAllStatusCall(isNotice, false);
|
||||
} else {
|
||||
isCheckAll = 2;
|
||||
updateCheckAllStatusCall(isNotice, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void updateCheckAllStatusCall(boolean isNotice, boolean isCheckAll) {
|
||||
if (isNotice)
|
||||
if (oldIsCheckAll != isCheckAll) {
|
||||
oldIsCheckAll = isCheckAll;
|
||||
if (listener != null)
|
||||
listener.onCheckAll(isCheckAll);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.zhidao.adas.client.adapter;
|
||||
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.zhidao.adas.client.R;
|
||||
import com.zhidao.adas.client.base.BaseAdapter;
|
||||
import com.zhidao.adas.client.base.BaseViewHolder;
|
||||
import com.zhidao.adas.client.bean.SpecialVehicleBean;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author song kenan
|
||||
* @des 线路
|
||||
* @date 2021/8/13
|
||||
*/
|
||||
public class SpecialVehicleAdapter extends BaseAdapter<SpecialVehicleBean, SpecialVehicleAdapter.ViewHolder> {
|
||||
|
||||
|
||||
public SpecialVehicleAdapter(List<SpecialVehicleBean> data) {
|
||||
super(data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setData(List<SpecialVehicleBean> mDatas) {
|
||||
super.setData(mDatas);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onBindDataToItem(ViewHolder viewHolder, SpecialVehicleBean data, int position) {
|
||||
viewHolder.title.setText(data.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected View getItemViewResource(ViewGroup viewGroup) {
|
||||
return LayoutInflater.from(mContext).inflate(R.layout.item_info, viewGroup, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ViewHolder getViewHolder(View view) {
|
||||
return new ViewHolder(view, this);
|
||||
}
|
||||
|
||||
class ViewHolder extends BaseViewHolder<SpecialVehicleAdapter> {
|
||||
TextView title;
|
||||
|
||||
public ViewHolder(View itemView, SpecialVehicleAdapter adapter) {
|
||||
super(itemView, adapter);
|
||||
// ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams();
|
||||
// if (layoutParams != null) {
|
||||
// layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
|
||||
//
|
||||
// }
|
||||
title = itemView.findViewById(R.id.tv_info_title);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,6 +27,7 @@ import perception.TrafficLightOuterClass;
|
||||
public abstract class BaseFragment extends Fragment {
|
||||
protected final String TAG = this.getClass().getSimpleName();
|
||||
private static final int WHAT_REFRESH = 0x01;
|
||||
private static final int WHAT_UPDATE_CONNECT_STATUS = 0x02;
|
||||
protected static final int WHAT_REFRESH_TRAFFIC_LIGHTS = 0x02;
|
||||
protected String title;
|
||||
|
||||
@@ -64,6 +65,18 @@ public abstract class BaseFragment extends Fragment {
|
||||
}
|
||||
}
|
||||
|
||||
public void updateConnectStatus(int ipcConnectionStatus) {
|
||||
if (getHandler() != null) {
|
||||
Message msg = Message.obtain();
|
||||
msg.what = WHAT_UPDATE_CONNECT_STATUS;
|
||||
msg.arg1 = ipcConnectionStatus;
|
||||
getHandler().sendMessage(msg);
|
||||
}
|
||||
}
|
||||
|
||||
protected void onConnectionIPCStatus(int ipcConnectionStatus) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
@@ -197,6 +210,11 @@ public abstract class BaseFragment extends Fragment {
|
||||
if (isVisible())
|
||||
onRefreshView();
|
||||
break;
|
||||
|
||||
case WHAT_UPDATE_CONNECT_STATUS:
|
||||
if (isVisible())
|
||||
onConnectionIPCStatus(msg.arg1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.zhidao.adas.client.bean;
|
||||
|
||||
import com.zhidao.support.adas.high.common.MessageType;
|
||||
|
||||
|
||||
public class InterfaceModel {
|
||||
private boolean isSelected = false;//是否选择
|
||||
private final MessageType messageType;
|
||||
|
||||
public InterfaceModel(MessageType messageType) {
|
||||
this.messageType = messageType;
|
||||
}
|
||||
|
||||
public boolean isSelected() {
|
||||
return isSelected;
|
||||
}
|
||||
|
||||
public void setSelected(boolean selected) {
|
||||
isSelected = selected;
|
||||
}
|
||||
|
||||
public MessageType getMessageType() {
|
||||
return messageType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
InterfaceModel that = (InterfaceModel) o;
|
||||
return messageType == that.messageType;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.zhidao.adas.client.bean;
|
||||
|
||||
import com.google.protobuf.TextFormat;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
|
||||
public class PlanningDecisionState extends BaseInfo {
|
||||
public final MessagePad.PlanningActionMsg bean;
|
||||
|
||||
public PlanningDecisionState(MessagePad.Header header, MessagePad.PlanningActionMsg bean, SimpleDateFormat sdf) {
|
||||
super("接收", bean.getSerializedSize(), header, sdf);
|
||||
this.bean = bean;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return super.toString() + TextFormat.printer().escapingNonAscii(false).printToString(bean);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,228 @@
|
||||
package com.zhidao.adas.client.bean;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.protobuf.TextFormat;
|
||||
import com.zhidao.adas.client.ui.special.SpecialVehicleFloatWindowManager;
|
||||
import com.zhidao.adas.client.utils.PreferencesUtils;
|
||||
import com.zhidao.support.adas.high.AdasManager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import chassis.SpecialVehicleTaskCmdOuterClass;
|
||||
|
||||
public class SpecialVehicleBean {
|
||||
private interface TAG {
|
||||
String FTQSC = "ftqsc";//福田清扫车
|
||||
String KWXB = "kwxb";//开沃小巴
|
||||
}
|
||||
|
||||
public interface SEND_TYPE {
|
||||
int ONE = 0;//单次发送
|
||||
int MORE = 1;//多次发送
|
||||
int ALL = 2;//两种方式都支持
|
||||
}
|
||||
|
||||
public final String name;
|
||||
public final String simpleName;//简单名字 两个字
|
||||
public final List<SpecialVehicleOption> options;
|
||||
private final String tag;//用于存储
|
||||
public int sendType = SEND_TYPE.ONE;//发送类型
|
||||
private SpecialVehicleFloatWindowManager manager;
|
||||
|
||||
public static final int SCREEN_MARGIN = 20;
|
||||
|
||||
private final String FLOAT_WINDOW_LOCATION_MIN_X;
|
||||
private final String FLOAT_WINDOW_LOCATION_MIN_Y;
|
||||
private final String FLOAT_WINDOW_LOCATION_MAX_X;
|
||||
private final String FLOAT_WINDOW_LOCATION_MAX_Y;
|
||||
|
||||
private SpecialVehicleBean(@NonNull String name, @NonNull String simpleName, String tag, List<SpecialVehicleOption> options) {
|
||||
this.name = name;
|
||||
this.simpleName = simpleName;
|
||||
this.tag = tag;
|
||||
this.options = options;
|
||||
FLOAT_WINDOW_LOCATION_MIN_X = tag + "_float_window_location_min_x";
|
||||
FLOAT_WINDOW_LOCATION_MIN_Y = tag + "_float_window_location_min_y";
|
||||
FLOAT_WINDOW_LOCATION_MAX_X = tag + "_float_window_location_max_X";
|
||||
FLOAT_WINDOW_LOCATION_MAX_Y = tag + "_float_window_location_max_y";
|
||||
|
||||
}
|
||||
|
||||
public void showFloat(Context context) {
|
||||
if (manager == null)
|
||||
manager = new SpecialVehicleFloatWindowManager(context, this);
|
||||
manager.show();
|
||||
}
|
||||
|
||||
public void dismissFloat() {
|
||||
if (manager != null) {
|
||||
manager.onBack();
|
||||
manager = null;
|
||||
}
|
||||
}
|
||||
|
||||
/************************悬浮窗位置******************/
|
||||
|
||||
|
||||
public void setFloatWindowLocationMinX(Context context, int x) {
|
||||
PreferencesUtils.putInt(context, FLOAT_WINDOW_LOCATION_MIN_X, x);
|
||||
}
|
||||
|
||||
public int getFloatWindowLocationMinX(Context context) {
|
||||
return PreferencesUtils.getInt(context, FLOAT_WINDOW_LOCATION_MIN_X, SCREEN_MARGIN);
|
||||
}
|
||||
|
||||
public void setFloatWindowLocationMinY(Context context, int y) {
|
||||
PreferencesUtils.putInt(context, FLOAT_WINDOW_LOCATION_MIN_Y, y);
|
||||
}
|
||||
|
||||
public int getFloatWindowLocationMinY(Context context) {
|
||||
return PreferencesUtils.getInt(context, FLOAT_WINDOW_LOCATION_MIN_Y, SCREEN_MARGIN);
|
||||
}
|
||||
|
||||
|
||||
/************************悬浮窗位置******************/
|
||||
|
||||
public void setFloatWindowLocationMaxX(Context context, int x) {
|
||||
PreferencesUtils.putInt(context, FLOAT_WINDOW_LOCATION_MAX_X, x);
|
||||
}
|
||||
|
||||
public int getFloatWindowLocationMaxX(Context context) {
|
||||
return PreferencesUtils.getInt(context, FLOAT_WINDOW_LOCATION_MAX_X, SCREEN_MARGIN);
|
||||
}
|
||||
|
||||
public void setFloatWindowLocationMaxY(Context context, int y) {
|
||||
PreferencesUtils.putInt(context, FLOAT_WINDOW_LOCATION_MAX_Y, y);
|
||||
}
|
||||
|
||||
public int getFloatWindowLocationMaxY(Context context) {
|
||||
return PreferencesUtils.getInt(context, FLOAT_WINDOW_LOCATION_MAX_Y, SCREEN_MARGIN);
|
||||
}
|
||||
|
||||
/**
|
||||
* 命令下发
|
||||
*
|
||||
* @param index -1一次性发送所有命令 其他 单个命令发送
|
||||
* @return
|
||||
*/
|
||||
public String sendCmd(int index) {
|
||||
String str = "";
|
||||
if (TextUtils.equals(this.tag, TAG.FTQSC)) { //福田清扫车
|
||||
SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.Builder builder = SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.newBuilder();
|
||||
if (index < 0) {
|
||||
for (index = 0; index < options.size(); index++) {
|
||||
SpecialVehicleOption option = options.get(index);
|
||||
if (option.moreCheckPos != -1) {
|
||||
option.checkPos = option.moreCheckPos;
|
||||
option.moreCheckPos = -1;
|
||||
}
|
||||
setFuTianCleanValue(builder, index, option.checkPos);
|
||||
}
|
||||
} else {
|
||||
int checkPos = options.get(index).checkPos;
|
||||
setFuTianCleanValue(builder, index, checkPos);
|
||||
}
|
||||
|
||||
SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd fuTianCleanCmd = builder.build();
|
||||
SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd fuTianTaskCmd = SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd.newBuilder()
|
||||
.setRoboSweeperFutianCleanCmd(fuTianCleanCmd).build();
|
||||
AdasManager.getInstance().sendRoboSweeperFuTianTaskCmd(fuTianTaskCmd);
|
||||
str = TextFormat.printer().escapingNonAscii(false).printToString(fuTianTaskCmd).replaceAll("\n", "");
|
||||
} else if (TextUtils.equals(this.tag, TAG.KWXB)) { //开沃小巴
|
||||
SpecialVehicleTaskCmdOuterClass.RoboVanSkywellTaskCmd vanSkywellTaskCmd = SpecialVehicleTaskCmdOuterClass.RoboVanSkywellTaskCmd.newBuilder()
|
||||
.build();
|
||||
AdasManager.getInstance().sendRoboVanSkywellTaskCmd(vanSkywellTaskCmd);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
private void setFuTianCleanValue(SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianCleanCmd.Builder builder, int index, int checkPos) {
|
||||
switch (index) {
|
||||
case 0:
|
||||
builder.setCleanOpenRequirement(checkPos);
|
||||
break;
|
||||
case 1:
|
||||
builder.setCleanModeRequirement(checkPos);
|
||||
break;
|
||||
case 2:
|
||||
builder.setCleanDirectionRequirement(checkPos);
|
||||
break;
|
||||
case 3:
|
||||
builder.setCleanIntensityRequirement(checkPos);
|
||||
break;
|
||||
case 4:
|
||||
builder.setDuskCloseRequirement(checkPos);
|
||||
break;
|
||||
case 5:
|
||||
builder.setSuctionNozzlefleOpenRequirement(checkPos);
|
||||
break;
|
||||
case 6:
|
||||
builder.setSprayGunOpenRequirement(checkPos);
|
||||
break;
|
||||
case 7:
|
||||
builder.setSweepdiskSpeedRequirement(checkPos);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static List<SpecialVehicleBean> init() {
|
||||
List<SpecialVehicleBean> list = new ArrayList<>();
|
||||
List<SpecialVehicleOption> optionsF = new ArrayList<>();
|
||||
int tag = 0;
|
||||
String[] value = new String[3];
|
||||
value[0] = "0-No Req";
|
||||
value[1] = "1-Start";
|
||||
value[2] = "2-Stop";
|
||||
optionsF.add(new SpecialVehicleOption("清扫作业", tag++, value, 0));
|
||||
value = new String[5];
|
||||
value[0] = "0-No Req";
|
||||
value[1] = "1-Sweeping";
|
||||
value[2] = "2-Wash Sweeper";
|
||||
value[3] = "3-Pure Wash";
|
||||
value[4] = "4-Pure Draw";
|
||||
optionsF.add(new SpecialVehicleOption("清扫模式", tag++, value, 0));
|
||||
value = new String[4];
|
||||
value[0] = "0-No Req";
|
||||
value[1] = "1-Both";
|
||||
value[2] = "2-Left";
|
||||
value[3] = "3-Right";
|
||||
optionsF.add(new SpecialVehicleOption("清扫方向", tag++, value, 0));
|
||||
value = new String[3];
|
||||
value[0] = "0-No Req";
|
||||
value[1] = "1-Stand";
|
||||
value[2] = "2-Strong";
|
||||
optionsF.add(new SpecialVehicleOption("作业强度", tag++, value, 0));
|
||||
value = new String[3];
|
||||
value[0] = "0-No Req";
|
||||
value[1] = "1-Close";
|
||||
value[2] = "2-Open";
|
||||
optionsF.add(new SpecialVehicleOption("降尘", tag++, value, 0));
|
||||
value = new String[3];
|
||||
value[0] = "0-No Req";
|
||||
value[1] = "1-Open";
|
||||
value[2] = "2-Close";
|
||||
optionsF.add(new SpecialVehicleOption("吸嘴挡板", tag++, value, 0));
|
||||
value = new String[3];
|
||||
value[0] = "0-No Req";
|
||||
value[1] = "1-Open";
|
||||
value[2] = "2-Close";
|
||||
optionsF.add(new SpecialVehicleOption("喷雾枪", tag++, value, 0));
|
||||
value = new String[3];
|
||||
value[0] = "0-No Req";
|
||||
value[1] = "1-Decelerate";
|
||||
value[2] = "2-Accelerate";
|
||||
optionsF.add(new SpecialVehicleOption("扫盘加速", tag, value, 0));
|
||||
SpecialVehicleBean beanF = new SpecialVehicleBean("福田清扫车", "福清", TAG.FTQSC, optionsF);
|
||||
SpecialVehicleBean beanK = new SpecialVehicleBean("开沃小巴", "开巴", TAG.KWXB, null);
|
||||
list.add(beanF);
|
||||
list.add(beanK);
|
||||
return list;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.zhidao.adas.client.bean;
|
||||
|
||||
public class SpecialVehicleOption {
|
||||
public final String name;
|
||||
public final int tag;
|
||||
public final String[] value;
|
||||
public int checkPos = 0;//选中的下标
|
||||
public int moreCheckPos = -1;//发送模式下多条模式时选中的下标
|
||||
|
||||
public SpecialVehicleOption(String name, int tag, String[] value, int checkPos) {
|
||||
this.name = name;
|
||||
this.tag = tag;
|
||||
this.value = value;
|
||||
this.checkPos = checkPos;
|
||||
}
|
||||
}
|
||||
@@ -129,12 +129,12 @@ public class InfoFragment extends BaseFragment {
|
||||
adapter.setData(DataDistribution.getInstance().listPerceptionTrafficLight);
|
||||
} else if (Constants.TITLE.RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY.equals(title)) {
|
||||
adapter.setData(DataDistribution.getInstance().listPredictionObstacleTrajectory);
|
||||
} else if (Constants.TITLE.RECEIVE_POINT_CLOUD.equals(title)) {
|
||||
adapter.setData(DataDistribution.getInstance().listPointCloud);
|
||||
} else if (Constants.TITLE.RECEIVE_POINT_CLOUD_ORIGINAL.equals(title)) {
|
||||
adapter.setData(DataDistribution.getInstance().listOriginalPointCloud);
|
||||
} else if (Constants.TITLE.RECEIVE_PLANNING_OBJECTS.equals(title)) {
|
||||
adapter.setData(DataDistribution.getInstance().listPlanningObjects);
|
||||
} else if (Constants.TITLE.RECEIVE_PLANNING_DECISION_STATE.equals(title)) {
|
||||
adapter.setData(DataDistribution.getInstance().listPlanningDecisionState);
|
||||
} else {
|
||||
adapter.setData(DataDistribution.getInstance().listErrorData);
|
||||
}
|
||||
|
||||
@@ -35,7 +35,6 @@ import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.AppCompatButton;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
@@ -54,6 +53,7 @@ import com.zhidao.adas.client.R;
|
||||
import com.zhidao.adas.client.adapter.InfoTitleAdapter;
|
||||
import com.zhidao.adas.client.base.BaseActivity;
|
||||
import com.zhidao.adas.client.base.BaseAdapter;
|
||||
import com.zhidao.adas.client.base.BaseFragment;
|
||||
import com.zhidao.adas.client.bean.ArrivalNotification;
|
||||
import com.zhidao.adas.client.bean.AutopilotState;
|
||||
import com.zhidao.adas.client.bean.BasicInfoReq;
|
||||
@@ -65,10 +65,12 @@ import com.zhidao.adas.client.bean.IPCConnectState;
|
||||
import com.zhidao.adas.client.bean.MogoReportMessage;
|
||||
import com.zhidao.adas.client.bean.OriginalPointCloudData;
|
||||
import com.zhidao.adas.client.bean.PerceptionTrafficLight;
|
||||
import com.zhidao.adas.client.bean.PlanningDecisionState;
|
||||
import com.zhidao.adas.client.bean.PlanningObjects;
|
||||
import com.zhidao.adas.client.bean.PredictionObstacleTrajectory;
|
||||
import com.zhidao.adas.client.bean.RecordDataConfig;
|
||||
import com.zhidao.adas.client.bean.RecordPanel;
|
||||
import com.zhidao.adas.client.bean.SpecialVehicleBean;
|
||||
import com.zhidao.adas.client.bean.StatusInfo;
|
||||
import com.zhidao.adas.client.bean.TrackedObjects;
|
||||
import com.zhidao.adas.client.bean.Trajectory;
|
||||
@@ -76,6 +78,7 @@ import com.zhidao.adas.client.bean.VehicleState;
|
||||
import com.zhidao.adas.client.bean.Warn;
|
||||
import com.zhidao.adas.client.log.ConnectStatusSave;
|
||||
import com.zhidao.adas.client.log.LogSave;
|
||||
import com.zhidao.adas.client.ui.special.SpecialVehicleDialog;
|
||||
import com.zhidao.adas.client.utils.Constants;
|
||||
import com.zhidao.adas.client.utils.PreferencesUtils;
|
||||
import com.zhidao.support.adas.high.AdasManager;
|
||||
@@ -87,11 +90,13 @@ import com.zhidao.support.adas.high.bean.VersionCompatibility;
|
||||
import com.zhidao.support.adas.high.common.ByteUtil;
|
||||
import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS;
|
||||
import com.zhidao.support.adas.high.common.CupidLogUtils;
|
||||
import com.zhidao.support.adas.high.common.MessageType;
|
||||
import com.zhidao.support.adas.high.common.ProtocolStatus;
|
||||
import com.zhidao.support.adas.high.common.ReceiveTimeoutManager;
|
||||
import com.zhidao.support.adas.high.other.permission.BackgrounderPermission;
|
||||
import com.zhidao.support.adas.high.other.permission.OnAdasPermissionListener;
|
||||
import com.zhidao.support.adas.high.other.router.RouterActivity;
|
||||
import com.zhidao.support.adas.high.subscribe.SubscribeInterfaceOptions;
|
||||
|
||||
import java.net.Inet4Address;
|
||||
import java.net.InetAddress;
|
||||
@@ -101,8 +106,10 @@ import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
|
||||
import chassis.VehicleStateOuterClass;
|
||||
@@ -148,7 +155,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
private final List<String> titleBtnData = new ArrayList<>();
|
||||
private final List<IPCConnectState> connectStatusList = new ArrayList<>();
|
||||
private InfoTitleAdapter fragmentAdapter;
|
||||
private Fragment fromFragment;
|
||||
private BaseFragment fromFragment;
|
||||
private FragmentManager manager;
|
||||
private String ftpTime;
|
||||
private boolean isPad;
|
||||
@@ -156,9 +163,11 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
private String recordFileName;
|
||||
private int connectStatus;
|
||||
private AutoPilotModeDialog autoPilotModeDialog;
|
||||
private SpecialVehicleDialog specialVehicleDialog;
|
||||
private ListPopupWindow listPopupWindow;
|
||||
private FloatWindow floatWindow;
|
||||
private View include_title;
|
||||
private List<SpecialVehicleBean> specialVehicleBeanList;//特种车辆
|
||||
// @Override
|
||||
// protected void onStart() {
|
||||
// super.onStart();
|
||||
@@ -248,6 +257,14 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
wakeLock.release();
|
||||
if (wifiLock != null)
|
||||
wifiLock.release();
|
||||
if (autoPilotModeDialog != null && autoPilotModeDialog.isShowing()) {
|
||||
autoPilotModeDialog.dismiss();
|
||||
autoPilotModeDialog = null;
|
||||
}
|
||||
if (specialVehicleDialog != null && specialVehicleDialog.isShowing()) {
|
||||
specialVehicleDialog.dismiss();
|
||||
specialVehicleDialog = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void canDrawOverlays() {
|
||||
@@ -613,9 +630,9 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_REPORT_MESSAGE);
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_PERCEPTION_TRAFFIC_LIGHT);
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY);
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_POINT_CLOUD);
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_POINT_CLOUD_ORIGINAL);
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_PLANNING_OBJECTS);
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_PLANNING_DECISION_STATE);
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_CAR_CONFIG_RESP);
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_RECORD_DATA_CONFIG_RESP);
|
||||
titleFragmentData.add(Constants.TITLE.RECEIVE_RECORD_RESULT);
|
||||
@@ -628,6 +645,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
|
||||
titleBtnData.add(Constants.TITLE.SEND_SET_AUTOPILOT_MODE_REQ);
|
||||
titleBtnData.add(Constants.TITLE.SEND_GLOBAL_PATH_REQ);
|
||||
titleBtnData.add(Constants.TITLE.SEND_SPECIAL_VEHICLE_TASK_CMD);
|
||||
titleBtnData.add(Constants.TITLE.SEND_STATUS_QUERY_REQ);
|
||||
titleBtnData.add(Constants.TITLE.SEND_BASIC_INFO_RESP);
|
||||
titleBtnData.add(Constants.TITLE.SEND_RECORD_DATA_CONFIG_RESP);
|
||||
@@ -882,7 +900,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
public void onBasicInfoReq(MessagePad.Header header, MessagePad.BasicInfoReq basicInfoReq) {
|
||||
BasicInfoReq info = new BasicInfoReq(header, basicInfoReq, sdf);
|
||||
DataDistribution.getInstance().addData(info);
|
||||
AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 0);
|
||||
AdasManager.getInstance().sendBasicInfoResp("", 0, com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.DEBUG);
|
||||
showToastCenter("收到车机基础信息请求:" + info.toString());
|
||||
}
|
||||
|
||||
@@ -930,6 +948,12 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
DataDistribution.getInstance().addData(base);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlanningActionMsg(MessagePad.Header header, MessagePad.PlanningActionMsg planningActionMsg) {
|
||||
PlanningDecisionState base = new PlanningDecisionState(header, planningActionMsg, sdf);
|
||||
DataDistribution.getInstance().addData(base);
|
||||
}
|
||||
|
||||
|
||||
private void initAdas() {
|
||||
CupidLogUtils.e(TAG, "--->初始化");
|
||||
@@ -961,13 +985,19 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
} else {
|
||||
/*—————————————作为司机端———————————*/
|
||||
int mode = Constants.getIpcConnectionMode(this);
|
||||
Set<MessageType> messageTypes = new HashSet<>();
|
||||
messageTypes.add(MessageType.TYPE_RECEIVE_POINT_CLOUD);
|
||||
SubscribeInterfaceOptions subscribeInterfaceOptions = SubscribeInterfaceOptions.newBuilder()
|
||||
.setRole(com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.DEBUG)
|
||||
.setType(com.zhidao.support.adas.high.common.Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE)
|
||||
.setMessageTypes(messageTypes).build();
|
||||
switch (mode) {
|
||||
default:
|
||||
case AdasOptions.IPC_CONNECTION_MODE.FIXATION:
|
||||
options = new AdasOptions.Builder().setClient(false).setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(this)).setIpcConnectionMode(mode).build();
|
||||
options = new AdasOptions.Builder().setSubscribeInterfaceOptions(subscribeInterfaceOptions).setClient(false).setIpcFixationIP(AdasManager.getInstance().getIPCFixationIPList(this)).setIpcConnectionMode(mode).build();
|
||||
break;
|
||||
case AdasOptions.IPC_CONNECTION_MODE.ASSIGN:
|
||||
options = new AdasOptions.Builder().setClient(false).setIpcAssignIP(Constants.getIPCIp(this)).setIpcConnectionMode(mode).build();
|
||||
options = new AdasOptions.Builder().setSubscribeInterfaceOptions(subscribeInterfaceOptions).setClient(false).setIpcAssignIP(Constants.getIPCIp(this)).setIpcConnectionMode(mode).build();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1024,6 +1054,9 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
|
||||
@Override
|
||||
public void onConnectionIPCStatus(int ipcConnectionStatus, String reason) {
|
||||
if (fromFragment != null) {
|
||||
fromFragment.updateConnectStatus(ipcConnectionStatus);
|
||||
}
|
||||
// Log.i(TAG, "连接状态=" + (reason == null ? "主动断开连接" : reason));
|
||||
String time = sdf.format(new Date());
|
||||
ConnectStatusSave.getInstance().saveLog(time + " ipcConnectionStatus=" + ipcConnectionStatus + " reason=" + reason);
|
||||
@@ -1033,15 +1066,14 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
}
|
||||
connectStatus = ipcConnectionStatus;
|
||||
String status = onUpdateConnectStateView();
|
||||
getHandler().sendEmptyMessage(WHAT_IPC_IP);
|
||||
if (connectStatus == IPC_CONNECTION_STATUS.CONNECTED) {
|
||||
getHandler().sendEmptyMessage(WHAT_IPC_IP);
|
||||
|
||||
String tem = getIPCIP();
|
||||
if (!TextUtils.isEmpty(tem)) {
|
||||
List<String> ips = Constants.getIpcUsedIps(this);
|
||||
Constants.addIpcUsedIps(this, ips, tem);
|
||||
}
|
||||
} else if (connectStatus == IPC_CONNECTION_STATUS.DISCONNECTED) {
|
||||
getHandler().sendEmptyMessage(WHAT_IPC_IP);
|
||||
}
|
||||
// LogSave.getInstance().saveLog("连接状态", status);
|
||||
// CupidLogUtils.i(TAG, "connectStatus=" + status);
|
||||
@@ -1089,7 +1121,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
}
|
||||
|
||||
private void showFragment(String title) {
|
||||
Fragment to = manager.findFragmentByTag(title);
|
||||
BaseFragment to = (BaseFragment) manager.findFragmentByTag(title);
|
||||
if (to == null) {
|
||||
if (Constants.TITLE.RECEIVE_CAR_CONFIG_RESP.equals(title)) {
|
||||
to = new VersionFragment(Constants.TITLE.TITLE_CAR_CONFIG_RESP);
|
||||
@@ -1144,12 +1176,58 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
//自动驾驶路径查询
|
||||
AdasManager.getInstance().sendGlobalPathReq();
|
||||
break;
|
||||
case Constants.TITLE.SEND_SPECIAL_VEHICLE_TASK_CMD:
|
||||
if (specialVehicleBeanList == null) {
|
||||
specialVehicleBeanList = SpecialVehicleBean.init();
|
||||
}
|
||||
if (specialVehicleDialog == null) {
|
||||
specialVehicleDialog = new SpecialVehicleDialog(this, specialVehicleBeanList);
|
||||
}
|
||||
if (!specialVehicleDialog.isShowing()) {
|
||||
specialVehicleDialog.show();
|
||||
}
|
||||
break;
|
||||
case Constants.TITLE.SEND_STATUS_QUERY_REQ:
|
||||
AdasManager.getInstance().sendStatusQueryReq();
|
||||
break;
|
||||
case Constants.TITLE.SEND_BASIC_INFO_RESP:
|
||||
//发送sn
|
||||
AdasManager.getInstance().sendBasicInfoResp("X202021111192N41VY", 0);
|
||||
//速度设置
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle("发送SN");
|
||||
View view = getLayoutInflater().inflate(R.layout.dialog_sn, null);
|
||||
final EditText et = view.findViewById(R.id.et);
|
||||
final EditText ev = view.findViewById(R.id.ev);
|
||||
final EditText role = view.findViewById(R.id.role);
|
||||
builder.setView(view);//
|
||||
builder.setCancelable(false);//
|
||||
builder.setPositiveButton("发送", null);
|
||||
//设置反面按钮,并做事件处理
|
||||
builder.setNegativeButton("取消", null);
|
||||
AlertDialog alertDialog = builder.show();//显示Dialog对话框
|
||||
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Editable editable = et.getText();
|
||||
if (TextUtils.isEmpty(editable)) {
|
||||
// 条件不成立不能关闭 AlertDialog 窗口
|
||||
Toast.makeText(MainActivity.this, "请输入SN", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
int evInt = 0;
|
||||
Editable evEd = ev.getText();
|
||||
if (!TextUtils.isEmpty(evEd)) {
|
||||
evInt = Integer.parseInt(evEd.toString().trim());
|
||||
}
|
||||
int roleInt = com.zhidao.support.adas.high.common.Constants.TERMINAL_ROLE.DEBUG;
|
||||
Editable roleEd = role.getText();
|
||||
if (!TextUtils.isEmpty(roleEd)) {
|
||||
roleInt = Integer.parseInt(roleEd.toString().trim());
|
||||
}
|
||||
AdasManager.getInstance().sendBasicInfoResp(editable.toString().trim(), evInt, roleInt);
|
||||
alertDialog.dismiss();
|
||||
}
|
||||
});
|
||||
break;
|
||||
case Constants.TITLE.SEND_RECORD_DATA_5:
|
||||
//数据采集5秒
|
||||
@@ -1192,30 +1270,31 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
break;
|
||||
case Constants.TITLE.SEND_SET_AUTOPILOT_SPEED_REQ:
|
||||
//速度设置
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setTitle("自动驾驶限速");
|
||||
View view = getLayoutInflater().inflate(R.layout.dialog_speed, null);
|
||||
final EditText et = (EditText) view.findViewById(R.id.et);
|
||||
builder.setView(view);//
|
||||
builder.setCancelable(false);//
|
||||
builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
|
||||
AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
|
||||
builder1.setTitle("自动驾驶限速");
|
||||
View view1 = getLayoutInflater().inflate(R.layout.dialog_speed, null);
|
||||
final EditText et1 = (EditText) view1.findViewById(R.id.et);
|
||||
builder1.setView(view1);//
|
||||
builder1.setCancelable(false);//
|
||||
builder1.setPositiveButton("设置", null);
|
||||
//设置反面按钮,并做事件处理
|
||||
builder1.setNegativeButton("取消", null);
|
||||
AlertDialog alertDialog1 = builder1.show();//显示Dialog对话框
|
||||
alertDialog1.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
Editable editable = et.getText();
|
||||
public void onClick(View v) {
|
||||
Editable editable = et1.getText();
|
||||
if (TextUtils.isEmpty(editable)) {
|
||||
// 条件不成立不能关闭 AlertDialog 窗口
|
||||
Toast.makeText(MainActivity.this, "请输入速度", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
String temp = et.getText().toString().trim();
|
||||
String temp = et1.getText().toString().trim();
|
||||
double speed = Double.parseDouble(temp) / 3.6;
|
||||
AdasManager.getInstance().sendAutopilotSpeedReq(speed);
|
||||
alertDialog1.dismiss();
|
||||
}
|
||||
});
|
||||
//设置反面按钮,并做事件处理
|
||||
builder.setNegativeButton("取消", null);
|
||||
builder.show();//显示Dialog对话框
|
||||
|
||||
break;
|
||||
case Constants.TITLE.SEND_SYSTEM_CMD_REQ_REBOOT:
|
||||
//重启所有节点
|
||||
@@ -1256,6 +1335,12 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
|
||||
switch (msg.what) {
|
||||
case WHAT_IPC_IP:
|
||||
showIPCIP();
|
||||
if (specialVehicleBeanList != null && !specialVehicleBeanList.isEmpty()) {
|
||||
for (SpecialVehicleBean bean : specialVehicleBeanList) {
|
||||
bean.dismissFloat();
|
||||
}
|
||||
specialVehicleBeanList = null;
|
||||
}
|
||||
break;
|
||||
case WHAT_DRIVER_IP:
|
||||
ipcIp.setVisibility(View.VISIBLE);
|
||||
|
||||
@@ -7,8 +7,13 @@ import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.CompoundButton;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
@@ -21,12 +26,15 @@ import androidx.recyclerview.widget.SimpleItemAnimator;
|
||||
import com.zhidao.adas.client.BuildConfig;
|
||||
import com.zhidao.adas.client.R;
|
||||
import com.zhidao.adas.client.adapter.ConfigAdapter;
|
||||
import com.zhidao.adas.client.adapter.InterfaceAdapter;
|
||||
import com.zhidao.adas.client.base.BaseFragment;
|
||||
import com.zhidao.adas.client.bean.Config;
|
||||
import com.zhidao.adas.client.bean.InterfaceModel;
|
||||
import com.zhidao.support.adas.high.AdasManager;
|
||||
import com.zhidao.support.adas.high.bean.VersionCompatibility;
|
||||
import com.zhidao.support.adas.high.common.Constants;
|
||||
import com.zhidao.support.adas.high.common.CupidLogUtils;
|
||||
import com.zhidao.support.adas.high.common.MessageType;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
@@ -34,6 +42,7 @@ import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
|
||||
@@ -42,11 +51,26 @@ import mogo.telematics.pad.MessagePad;
|
||||
*/
|
||||
public class VersionFragment extends BaseFragment {
|
||||
private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ", Locale.getDefault());
|
||||
private TextView ipsView;
|
||||
private EditText ipView;
|
||||
private RecyclerView recyclerView;
|
||||
private RecyclerView rec_registered;
|
||||
private RecyclerView rec_unregistered;
|
||||
private CheckBox registered_check_all;
|
||||
private CheckBox unregistered_check_all;
|
||||
private TextView hint_registered;
|
||||
private TextView hint_unregistered;
|
||||
|
||||
private ConfigAdapter adapter;
|
||||
private InterfaceAdapter unregisteredAdapter;
|
||||
private InterfaceAdapter registeredAdapter;
|
||||
|
||||
|
||||
private int role = Constants.TERMINAL_ROLE.DEBUG;//角色 默认调试屏
|
||||
|
||||
public VersionFragment() {
|
||||
}
|
||||
|
||||
private ConfigAdapter adapter;
|
||||
|
||||
public VersionFragment(String title) {
|
||||
super(title);
|
||||
@@ -87,7 +111,7 @@ public class VersionFragment extends BaseFragment {
|
||||
for (String ip : ips) {
|
||||
i++;
|
||||
builder.append(ip);
|
||||
if (i % 2 == 0) {
|
||||
if (i % 4 == 0) {
|
||||
builder.append("\n");
|
||||
} else {
|
||||
builder.append("\t\t\t\t");
|
||||
@@ -98,9 +122,6 @@ public class VersionFragment extends BaseFragment {
|
||||
|
||||
}
|
||||
|
||||
private TextView ipsView;
|
||||
private EditText ipView;
|
||||
private RecyclerView recyclerView;
|
||||
|
||||
private void initView(View view) {
|
||||
TextView tvTitle = view.findViewById(R.id.tv_title);
|
||||
@@ -113,7 +134,7 @@ public class VersionFragment extends BaseFragment {
|
||||
CupidLogUtils.w("InfoFragment===>" + title);
|
||||
tvTitle.setText(title);
|
||||
tvTitle.setGravity(Gravity.CENTER);
|
||||
|
||||
initRegistrationView(view);
|
||||
btn1.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
@@ -154,6 +175,18 @@ public class VersionFragment extends BaseFragment {
|
||||
|
||||
}
|
||||
|
||||
//根据连接状态更新数据
|
||||
@Override
|
||||
public void onConnectionIPCStatus(int ipcConnectionStatus) {
|
||||
super.onConnectionIPCStatus(ipcConnectionStatus);
|
||||
if (ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.DISCONNECTED || ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.CONNECTED) {
|
||||
showVersion();
|
||||
initRegistrationData();
|
||||
if (ipcConnectionStatus == Constants.IPC_CONNECTION_STATUS.DISCONNECTED) {
|
||||
clearRegistrationViewState();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void showVersion() {
|
||||
List<Config> list = new ArrayList<>();
|
||||
@@ -204,4 +237,197 @@ public class VersionFragment extends BaseFragment {
|
||||
adapter = new ConfigAdapter();
|
||||
recyclerView.setAdapter(adapter);
|
||||
}
|
||||
|
||||
|
||||
private void initRegistrationView(View view) {
|
||||
recyclerView = view.findViewById(R.id.config_list);
|
||||
rec_registered = view.findViewById(R.id.rec_registered);
|
||||
rec_unregistered = view.findViewById(R.id.rec_unregistered);
|
||||
registered_check_all = view.findViewById(R.id.registered_check_all);
|
||||
unregistered_check_all = view.findViewById(R.id.unregistered_check_all);
|
||||
hint_unregistered = view.findViewById(R.id.hint_unregistered);
|
||||
hint_registered = view.findViewById(R.id.hint_registered);
|
||||
Button update = view.findViewById(R.id.update);
|
||||
initFragmentRecyclerView();
|
||||
initRegisteredRecyclerView();
|
||||
initUnregisteredRecyclerView();
|
||||
initSpinner(view);
|
||||
registered_check_all.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (buttonView.isPressed()) {
|
||||
registeredAdapter.setCheckAll(isChecked);
|
||||
unregisteredAdapter.setCheckAll(false);
|
||||
unregisteredAdapter.setEnabled(!isChecked);
|
||||
unregistered_check_all.setEnabled(!isChecked);
|
||||
}
|
||||
}
|
||||
});
|
||||
registeredAdapter.setListener(new InterfaceAdapter.OnInterfaceAdapterListener() {
|
||||
@Override
|
||||
public void onCheckAll(boolean isCheckAll) {
|
||||
registered_check_all.setChecked(isCheckAll);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckNum(int checkNum) {
|
||||
boolean isEnable = checkNum == 0;
|
||||
unregisteredAdapter.setEnabled(isEnable);
|
||||
unregistered_check_all.setEnabled(isEnable);
|
||||
}
|
||||
});
|
||||
unregistered_check_all.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (buttonView.isPressed()) {
|
||||
unregisteredAdapter.setCheckAll(isChecked);
|
||||
registeredAdapter.setCheckAll(false);
|
||||
registeredAdapter.setEnabled(!isChecked);
|
||||
registered_check_all.setEnabled(!isChecked);
|
||||
}
|
||||
}
|
||||
});
|
||||
unregisteredAdapter.setListener(new InterfaceAdapter.OnInterfaceAdapterListener() {
|
||||
@Override
|
||||
public void onCheckAll(boolean isCheckAll) {
|
||||
unregistered_check_all.setChecked(isCheckAll);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCheckNum(int checkNum) {
|
||||
boolean isEnable = checkNum == 0;
|
||||
registeredAdapter.setEnabled(isEnable);
|
||||
registered_check_all.setEnabled(isEnable);
|
||||
}
|
||||
});
|
||||
update.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
update();
|
||||
}
|
||||
});
|
||||
initRegistrationData();
|
||||
}
|
||||
|
||||
|
||||
private void update() {
|
||||
if (registeredAdapter.getCheckNum() == 0 && unregisteredAdapter.getCheckNum() == 0) {
|
||||
Toast.makeText(getContext(), "请选择后在更新", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
Set<MessageType> set;
|
||||
if (registeredAdapter.getCheckNum() == 0) {
|
||||
//注册
|
||||
set = unregisteredAdapter.getCheckedModel();
|
||||
if (set == null || set.isEmpty()) {
|
||||
Toast.makeText(getContext(), "请选择要注册的接口", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
if (set.size() == 1) {
|
||||
AdasManager.getInstance().subscribeInterface(role, Constants.SUBSCRIBE_TYPE.SUBSCRIBE, set.iterator().next());
|
||||
} else {
|
||||
AdasManager.getInstance().subscribeInterface(role, Constants.SUBSCRIBE_TYPE.SUBSCRIBE, set);
|
||||
}
|
||||
} else {
|
||||
//取消注册
|
||||
set = registeredAdapter.getCheckedModel();
|
||||
if (set == null || set.isEmpty()) {
|
||||
Toast.makeText(getContext(), "请选择要取消注册的接口", Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
if (set.size() == 1) {
|
||||
AdasManager.getInstance().subscribeInterface(role, Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE, set.iterator().next());
|
||||
} else {
|
||||
AdasManager.getInstance().subscribeInterface(role, Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE, set);
|
||||
}
|
||||
}
|
||||
clearRegistrationViewState();
|
||||
initRegistrationData();
|
||||
|
||||
}
|
||||
|
||||
private void clearRegistrationViewState() {
|
||||
registered_check_all.setChecked(false);
|
||||
unregistered_check_all.setChecked(false);
|
||||
registered_check_all.setEnabled(true);
|
||||
unregistered_check_all.setEnabled(true);
|
||||
if (registeredAdapter != null)
|
||||
registeredAdapter.notifyDataSetChanged();
|
||||
if (unregisteredAdapter != null)
|
||||
unregisteredAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
private void initRegistrationData() {
|
||||
//初始化数据
|
||||
Set<MessageType> set = AdasManager.getInstance().getSubscribedInterface();
|
||||
List<InterfaceModel> registeredList = new ArrayList<>();
|
||||
List<InterfaceModel> unregisteredList = new ArrayList<>();
|
||||
if (set != null && !set.isEmpty()) {
|
||||
registered_check_all.setVisibility(View.VISIBLE);
|
||||
for (MessageType messageType : set) {
|
||||
registeredList.add(new InterfaceModel(messageType));
|
||||
}
|
||||
} else {
|
||||
registered_check_all.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
set = AdasManager.getInstance().getUnsubscribedInterface();
|
||||
if (set != null && !set.isEmpty()) {
|
||||
unregistered_check_all.setVisibility(View.VISIBLE);
|
||||
for (MessageType messageType : set) {
|
||||
unregisteredList.add(new InterfaceModel(messageType));
|
||||
}
|
||||
} else {
|
||||
unregistered_check_all.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
registeredAdapter.setData(registeredList, 0);
|
||||
unregisteredAdapter.setData(unregisteredList, 0);
|
||||
hint_registered.setText("已注册接口(" + registeredAdapter.getItemCount() + ")");
|
||||
hint_unregistered.setText("未注册接口(" + unregisteredAdapter.getItemCount() + ")");
|
||||
}
|
||||
|
||||
|
||||
private void initRegisteredRecyclerView() {
|
||||
//创建默认的线性LayoutManager 横向的GridLayoutManager
|
||||
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
|
||||
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
|
||||
rec_registered.setLayoutManager(linearLayoutManager);
|
||||
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
|
||||
rec_registered.setHasFixedSize(false);
|
||||
rec_registered.setNestedScrollingEnabled(false);
|
||||
registeredAdapter = new InterfaceAdapter();
|
||||
rec_registered.setAdapter(registeredAdapter);
|
||||
}
|
||||
|
||||
private void initUnregisteredRecyclerView() {
|
||||
//创建默认的线性LayoutManager 横向的GridLayoutManager
|
||||
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
|
||||
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
|
||||
rec_unregistered.setLayoutManager(linearLayoutManager);
|
||||
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
|
||||
rec_unregistered.setHasFixedSize(false);
|
||||
rec_unregistered.setNestedScrollingEnabled(false);
|
||||
unregisteredAdapter = new InterfaceAdapter();
|
||||
rec_unregistered.setAdapter(unregisteredAdapter);
|
||||
}
|
||||
|
||||
|
||||
private void initSpinner(View view) {
|
||||
String[] s = {"司机", "乘客", "调试"};
|
||||
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(getContext(), android.R.layout.simple_spinner_item, s);
|
||||
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
|
||||
Spinner sp = view.findViewById(R.id.spinner);
|
||||
sp.setAdapter(dataAdapter);
|
||||
sp.setSelection(2);
|
||||
sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
|
||||
@Override
|
||||
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
|
||||
role = position;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNothingSelected(AdapterView<?> parent) {
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
package com.zhidao.adas.client.ui.special;
|
||||
|
||||
import android.app.Dialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.recyclerview.widget.SimpleItemAnimator;
|
||||
|
||||
import com.zhidao.adas.client.App;
|
||||
import com.zhidao.adas.client.R;
|
||||
import com.zhidao.adas.client.adapter.SpecialVehicleAdapter;
|
||||
import com.zhidao.adas.client.base.BaseAdapter;
|
||||
import com.zhidao.adas.client.bean.SpecialVehicleBean;
|
||||
import com.zhidao.adas.client.ui.AutopilotConfigActivity;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* 特种车辆
|
||||
*/
|
||||
public class SpecialVehicleDialog extends Dialog {
|
||||
private RecyclerView recyclerView;
|
||||
private List<SpecialVehicleBean> list;
|
||||
|
||||
|
||||
public SpecialVehicleDialog(@NonNull Context context, List<SpecialVehicleBean> list) {
|
||||
super(context, R.style.CustomDialog);
|
||||
this.list = list;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.dialog_autopilot_mode);
|
||||
//初始化界面控件
|
||||
initView();
|
||||
//初始化界面控件的事件
|
||||
initListener();
|
||||
initBtnRecyclerView();
|
||||
setOnDismissListener(new OnDismissListener() {
|
||||
@Override
|
||||
public void onDismiss(DialogInterface dialog) {
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void show() {
|
||||
super.show();
|
||||
}
|
||||
|
||||
|
||||
private void initBtnRecyclerView() {
|
||||
//初始info-recycle
|
||||
LinearLayoutManager nodLinearLayoutManage = new LinearLayoutManager(getContext());
|
||||
nodLinearLayoutManage.setOrientation(LinearLayoutManager.VERTICAL);
|
||||
recyclerView.setLayoutManager(nodLinearLayoutManage);
|
||||
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
|
||||
recyclerView.setHasFixedSize(true);
|
||||
//解决局部刷新闪屏问题
|
||||
SimpleItemAnimator animatorInfo = (SimpleItemAnimator) recyclerView.getItemAnimator();
|
||||
if (animatorInfo != null)
|
||||
animatorInfo.setSupportsChangeAnimations(false);
|
||||
//创建并设置Adapter
|
||||
SpecialVehicleAdapter adapter = new SpecialVehicleAdapter(list);
|
||||
recyclerView.setAdapter(adapter);
|
||||
adapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener<SpecialVehicleBean>() {
|
||||
@Override
|
||||
public void onItemClick(int position, SpecialVehicleBean data) {
|
||||
if (data.options == null) {
|
||||
Toast.makeText(getContext(), "“" + data.name + "”暂未支持", Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
data.showFloat(App.INSTANCE);
|
||||
SpecialVehicleDialog.this.dismiss();
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化界面的确定和取消监听器
|
||||
*/
|
||||
private void initListener() {
|
||||
findViewById(R.id.settings).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
getContext().startActivity(new Intent(getContext(), AutopilotConfigActivity.class));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化界面控件
|
||||
*/
|
||||
private void initView() {
|
||||
recyclerView = findViewById(R.id.recyclerView);
|
||||
findViewById(R.id.settings).setVisibility(View.GONE);
|
||||
TextView textView = findViewById(R.id.title);
|
||||
textView.setText("特种车辆");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,477 @@
|
||||
package com.zhidao.adas.client.ui.special;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.Gravity;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.HorizontalScrollView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RadioButton;
|
||||
import android.widget.RadioGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.widget.AppCompatButton;
|
||||
|
||||
import com.zhidao.adas.client.R;
|
||||
import com.zhidao.adas.client.bean.SpecialVehicleBean;
|
||||
import com.zhidao.adas.client.bean.SpecialVehicleOption;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
|
||||
/**
|
||||
* 2017/1/10.
|
||||
* Description:全局悬浮窗口
|
||||
*/
|
||||
|
||||
public class SpecialVehicleFloatWindow extends LinearLayout {
|
||||
|
||||
/*********************悬浮窗相关***********************/
|
||||
|
||||
private int sW;
|
||||
private int sH;
|
||||
private boolean isMaximize = true;//是否是最大化
|
||||
private WindowManager wm;
|
||||
//此wmParams变量为获取的全局变量,用以保存悬浮窗口的属性
|
||||
private WindowManager.LayoutParams wmParams;
|
||||
private int btnMaximizeW;
|
||||
private int btnMaximizeH;
|
||||
|
||||
/*********************CAN数据配置相关***********************/
|
||||
private final static int WHAT_UPDATE_DATA = 1;
|
||||
private BaseHandler mBaseHandler;
|
||||
private LinearLayout layout_btn;
|
||||
private HorizontalScrollView btn_list;
|
||||
private AppCompatButton btn_send;
|
||||
private RadioGroup rg_send_type;
|
||||
private TextView text;
|
||||
private TextView title;
|
||||
private TextView btn_maximize;
|
||||
private View can_parent;
|
||||
|
||||
private OnFloatWindowListener listener;
|
||||
private final SpecialVehicleBean specialVehicleBean;
|
||||
|
||||
public interface OnFloatWindowListener {
|
||||
void onBack();
|
||||
|
||||
void onMinimality();
|
||||
|
||||
void onMaximize();
|
||||
}
|
||||
|
||||
public boolean isMaximize() {
|
||||
return isMaximize;
|
||||
}
|
||||
|
||||
public void setOnFloatWindowListener(OnFloatWindowListener listener) {
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
public void setWmParams(WindowManager.LayoutParams wmParams) {
|
||||
this.wmParams = wmParams;
|
||||
}
|
||||
|
||||
public SpecialVehicleFloatWindow(@NonNull Context context, @NonNull SpecialVehicleBean specialVehicleBean) {
|
||||
super(context, null, 0);
|
||||
this.specialVehicleBean = specialVehicleBean;
|
||||
wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
|
||||
//加载布局
|
||||
LayoutInflater.from(context).inflate(R.layout.dialog_special_vehicle_config, this, true);
|
||||
initParameter();
|
||||
initCanView();
|
||||
}
|
||||
|
||||
private void initParameter() {
|
||||
DisplayMetrics metrics2 = getResources().getDisplayMetrics();
|
||||
sW = metrics2.widthPixels;
|
||||
sH = metrics2.heightPixels;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean dispatchKeyEvent(KeyEvent event) {
|
||||
if (event.getAction() == KeyEvent.ACTION_UP) {
|
||||
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
|
||||
if (isMaximize) {
|
||||
minimality();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return super.dispatchKeyEvent(event);
|
||||
}
|
||||
|
||||
private float mInViewX;
|
||||
private float mInViewY;
|
||||
private float mDownInScreenX;
|
||||
private float mDownInScreenY;
|
||||
private float mInScreenX;
|
||||
private float mInScreenY;
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event) {
|
||||
switch (event.getAction()) {
|
||||
case MotionEvent.ACTION_DOWN:
|
||||
// 获取相对View的坐标,即以此View左上角为原点
|
||||
mInViewX = event.getX();
|
||||
mInViewY = event.getY();
|
||||
// 获取相对屏幕的坐标,即以屏幕左上角为原点
|
||||
mDownInScreenX = event.getRawX();
|
||||
mDownInScreenY = event.getRawY() - getSysBarHeight(getContext());
|
||||
mInScreenX = event.getRawX();
|
||||
mInScreenY = event.getRawY() - getSysBarHeight(getContext());
|
||||
|
||||
if (!isMaximize) {
|
||||
btn_maximize.setPressed(true);
|
||||
btnMaximizeW = btn_maximize.getWidth();
|
||||
btnMaximizeH = btn_maximize.getHeight();
|
||||
}
|
||||
break;
|
||||
case MotionEvent.ACTION_MOVE:
|
||||
// 更新浮动窗口位置参数
|
||||
mInScreenX = event.getRawX();
|
||||
mInScreenY = event.getRawY() - getSysBarHeight(getContext());
|
||||
wmParams.x = (int) (mInScreenX - mInViewX);
|
||||
wmParams.y = (int) (mInScreenY - mInViewY);
|
||||
updateViewLayout();
|
||||
break;
|
||||
|
||||
case MotionEvent.ACTION_UP:
|
||||
// 如果手指离开屏幕时,xDownInScreen和xInScreen相等,且yDownInScreen和yInScreen相等,则视为触发了单击事件。
|
||||
// if (mDownInScreenX == mInScreenX && mDownInScreenY == mInScreenY) {
|
||||
float temX = Math.abs(mDownInScreenX - mInScreenX);
|
||||
float temY = Math.abs(mDownInScreenY - mInScreenY);
|
||||
if (temX + temY < 10) {
|
||||
maximize();
|
||||
} else {
|
||||
if (isMaximize) {
|
||||
specialVehicleBean.setFloatWindowLocationMaxX(getContext(), wmParams.x);
|
||||
specialVehicleBean.setFloatWindowLocationMaxY(getContext(), wmParams.y);
|
||||
} else {
|
||||
btn_maximize.setPressed(false);
|
||||
// 抬起手指时让floatView屏幕左右边缘 距离20个像素
|
||||
// wmParams.x = wmParams.x <= (sW / 2) ? AmiConstants.SCREEN_MARGIN : sW - btnMaximizeW - AmiConstants.SCREEN_MARGIN;
|
||||
int tem = wmParams.x;
|
||||
if (tem < SpecialVehicleBean.SCREEN_MARGIN)
|
||||
tem = SpecialVehicleBean.SCREEN_MARGIN;
|
||||
else if (sW - (tem + btnMaximizeW) < SpecialVehicleBean.SCREEN_MARGIN) {
|
||||
tem = sW - btnMaximizeW - SpecialVehicleBean.SCREEN_MARGIN;
|
||||
}
|
||||
wmParams.x = tem;
|
||||
tem = wmParams.y;
|
||||
if (tem < SpecialVehicleBean.SCREEN_MARGIN)
|
||||
tem = SpecialVehicleBean.SCREEN_MARGIN;
|
||||
else if (sH - (tem + btnMaximizeH) < SpecialVehicleBean.SCREEN_MARGIN) {
|
||||
tem = sH - btnMaximizeH - SpecialVehicleBean.SCREEN_MARGIN;
|
||||
}
|
||||
wmParams.y = tem;
|
||||
updateViewLayout();
|
||||
specialVehicleBean.setFloatWindowLocationMinX(getContext(), wmParams.x);
|
||||
specialVehicleBean.setFloatWindowLocationMinY(getContext(), wmParams.y);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void updateViewLayout() {
|
||||
wm.updateViewLayout(this, wmParams);
|
||||
}
|
||||
|
||||
// 获取系统状态栏高度
|
||||
private int sbar = -1;
|
||||
|
||||
public int getSysBarHeight(Context contex) {
|
||||
if (sbar == -1) {
|
||||
Class<?> c;
|
||||
Object obj;
|
||||
Field field;
|
||||
int x;
|
||||
try {
|
||||
c = Class.forName("com.android.internal.R$dimen");
|
||||
obj = c.newInstance();
|
||||
field = c.getField("status_bar_height");
|
||||
x = Integer.parseInt(field.get(obj).toString());
|
||||
sbar = contex.getResources().getDimensionPixelSize(x);
|
||||
} catch (Exception e1) {
|
||||
e1.printStackTrace();
|
||||
}
|
||||
}
|
||||
return sbar;
|
||||
}
|
||||
|
||||
/*****************************业务逻辑*******************************************/
|
||||
|
||||
|
||||
private void initCanView() {
|
||||
initHandler();
|
||||
can_parent = findViewById(R.id.can_parent);
|
||||
btn_list = findViewById(R.id.btn_list);
|
||||
btn_send = findViewById(R.id.btn_send);
|
||||
rg_send_type = findViewById(R.id.rg_send_type);
|
||||
text = findViewById(R.id.text);
|
||||
title = findViewById(R.id.title);
|
||||
title.setText(specialVehicleBean.name);
|
||||
btn_maximize = findViewById(R.id.btn_maximize);
|
||||
btn_maximize.setText(specialVehicleBean.simpleName);
|
||||
initListener();
|
||||
initBtnRecyclerView();
|
||||
initSendTypeView();
|
||||
}
|
||||
|
||||
private void initSendTypeView() {
|
||||
int resId;
|
||||
switch (specialVehicleBean.sendType) {
|
||||
default:
|
||||
case SpecialVehicleBean.SEND_TYPE.ONE:
|
||||
resId = R.id.btn_one;
|
||||
break;
|
||||
case SpecialVehicleBean.SEND_TYPE.MORE:
|
||||
resId = R.id.btn_more;
|
||||
break;
|
||||
case SpecialVehicleBean.SEND_TYPE.ALL:
|
||||
resId = R.id.btn_all;
|
||||
break;
|
||||
}
|
||||
rg_send_type.check(resId);
|
||||
btn_send.setVisibility(specialVehicleBean.sendType == SpecialVehicleBean.SEND_TYPE.ONE ? View.GONE : View.VISIBLE);
|
||||
rg_send_type.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(RadioGroup group, int checkedId) {
|
||||
View checkView = group.findViewById(checkedId);
|
||||
if (!checkView.isPressed()) {
|
||||
return;
|
||||
}
|
||||
int type = SpecialVehicleBean.SEND_TYPE.ONE;
|
||||
if (checkedId == R.id.btn_more) {
|
||||
type = SpecialVehicleBean.SEND_TYPE.MORE;
|
||||
} else {
|
||||
if (specialVehicleBean.sendType == SpecialVehicleBean.SEND_TYPE.MORE) {
|
||||
for (int i = 0; i < layout_btn.getChildCount(); i++) {
|
||||
LinearLayout view = (LinearLayout) layout_btn.getChildAt(i);
|
||||
RadioGroup radioGroup = view.findViewById(R.id.item_group);
|
||||
SpecialVehicleOption option = specialVehicleBean.options.get(i);
|
||||
if (option.moreCheckPos != -1) {
|
||||
option.moreCheckPos = -1;
|
||||
radioGroup.check(option.checkPos);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (checkedId == R.id.btn_one) {
|
||||
type = SpecialVehicleBean.SEND_TYPE.ONE;
|
||||
} else if (checkedId == R.id.btn_all) {
|
||||
type = SpecialVehicleBean.SEND_TYPE.ALL;
|
||||
}
|
||||
}
|
||||
specialVehicleBean.sendType = type;
|
||||
btn_send.setVisibility(type == SpecialVehicleBean.SEND_TYPE.ONE ? View.GONE : View.VISIBLE);
|
||||
}
|
||||
});
|
||||
btn_send.setOnClickListener(onClickListener);
|
||||
}
|
||||
|
||||
|
||||
private void initListener() {
|
||||
findViewById(R.id.btn_back).setOnClickListener(onClickListener);
|
||||
findViewById(R.id.btn_minimality).setOnClickListener(onClickListener);
|
||||
}
|
||||
|
||||
public void minimality() {
|
||||
isMaximize = false;
|
||||
btn_maximize.setVisibility(VISIBLE);
|
||||
can_parent.setVisibility(GONE);
|
||||
if (listener != null) {
|
||||
listener.onMinimality();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void maximize() {
|
||||
isMaximize = true;
|
||||
if (listener != null) {
|
||||
listener.onMaximize();
|
||||
}
|
||||
btn_maximize.setVisibility(GONE);
|
||||
can_parent.setVisibility(VISIBLE);
|
||||
|
||||
}
|
||||
|
||||
private final OnClickListener onClickListener = new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
int id = v.getId();
|
||||
if (id == R.id.btn_back) {
|
||||
if (listener != null) {
|
||||
listener.onBack();
|
||||
}
|
||||
} else if (id == R.id.btn_minimality) {
|
||||
minimality();
|
||||
} else if (id == R.id.btn_send) {
|
||||
String cmd = specialVehicleBean.sendCmd(-1);
|
||||
updateText(0, cmd);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private void initBtnRecyclerView() {
|
||||
|
||||
layout_btn = new LinearLayout(getContext());
|
||||
btn_list.addView(layout_btn);
|
||||
layout_btn.setOrientation(LinearLayout.HORIZONTAL);
|
||||
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) layout_btn.getLayoutParams();
|
||||
lp.gravity = Gravity.CENTER_VERTICAL;
|
||||
for (int i = 0; i < specialVehicleBean.options.size(); i++) {
|
||||
SpecialVehicleOption bean = specialVehicleBean.options.get(i);
|
||||
View view = LayoutInflater.from(getContext()).inflate(R.layout.item_special_vehicle, layout_btn, false);
|
||||
TextView name = view.findViewById(R.id.name);
|
||||
RadioGroup radioGroup = view.findViewById(R.id.item_group);
|
||||
|
||||
name.setText(bean.name);
|
||||
String[] value = bean.value;
|
||||
for (int j = 0; j < value.length; j++) {
|
||||
RadioButton button = LayoutInflater.from(getContext()).inflate(R.layout.item_special_vehicle_option_radio_btn, radioGroup, false)
|
||||
.findViewById(R.id.r_btn);
|
||||
button.setText(value[j]);
|
||||
button.setId(j);
|
||||
if (i == 1 || i == 2 || i == 3 || i == 4) {
|
||||
ViewGroup.LayoutParams layoutParams = button.getLayoutParams();
|
||||
layoutParams.width = 202;
|
||||
}
|
||||
radioGroup.addView(button);
|
||||
}
|
||||
radioGroup.setTag(bean.tag);
|
||||
radioGroup.setOnCheckedChangeListener(onCheckedChangeListener);
|
||||
radioGroup.check(bean.checkPos);
|
||||
layout_btn.addView(view);
|
||||
}
|
||||
}
|
||||
|
||||
private final RadioGroup.OnCheckedChangeListener onCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(RadioGroup group, int checkedId) {
|
||||
View checkView = group.findViewById(checkedId);
|
||||
if (checkView == null || !checkView.isPressed()) {
|
||||
return;
|
||||
}
|
||||
int tag = (int) group.getTag();
|
||||
SpecialVehicleOption bean = specialVehicleBean.options.get(tag);
|
||||
if (specialVehicleBean.sendType != SpecialVehicleBean.SEND_TYPE.MORE) {
|
||||
bean.checkPos = checkedId;
|
||||
String cmd = specialVehicleBean.sendCmd(tag);
|
||||
updateText(0, cmd);
|
||||
} else {
|
||||
bean.moreCheckPos = checkedId;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 更新文本
|
||||
*
|
||||
* @param tag 0--发送 1--接收
|
||||
* @param data 数据
|
||||
*/
|
||||
private void updateText(int tag, String data) {
|
||||
Message msg = Message.obtain();
|
||||
msg.what = WHAT_UPDATE_DATA;
|
||||
msg.obj = data;
|
||||
msg.arg1 = tag;
|
||||
getHandler().sendMessage(msg);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化一个Handler,如果需要使用Handler,先调用此方法,
|
||||
* 然后可以使用postRunnable(Runnable runnable),
|
||||
* sendMessage在handleMessage(Message msg)中接收msg
|
||||
*/
|
||||
public void initHandler() {
|
||||
mBaseHandler = new BaseHandler(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 返回Handler,在此之前确定已经调用initHandler()
|
||||
*
|
||||
* @return Handler
|
||||
*/
|
||||
public Handler getHandler() {
|
||||
return mBaseHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
* 同Handler的postRunnable
|
||||
* 在此之前确定已经调用initHandler()
|
||||
*/
|
||||
protected void postRunnable(Runnable runnable) {
|
||||
postRunnableDelayed(runnable, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 同Handler的postRunnableDelayed
|
||||
* 在此之前确定已经调用initHandler()
|
||||
*/
|
||||
protected void postRunnableDelayed(Runnable runnable, long delayMillis) {
|
||||
if (mBaseHandler == null) initHandler();
|
||||
mBaseHandler.postDelayed(runnable, delayMillis);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 同Handler 的 handleMessage,
|
||||
* getHandler.sendMessage,发送的Message在此接收
|
||||
* 在此之前确定已经调用initHandler()
|
||||
*
|
||||
* @param msg
|
||||
*/
|
||||
protected void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case WHAT_UPDATE_DATA:
|
||||
if (msg.arg1 == 0) {
|
||||
text.setTextColor(Color.parseColor("#FFFFFF"));
|
||||
} else {
|
||||
text.setTextColor(Color.parseColor("#FF0000"));
|
||||
}
|
||||
String str = (String) msg.obj;
|
||||
if (str.length() < 100) {
|
||||
text.setTextSize(14);
|
||||
} else {
|
||||
text.setTextSize(10);
|
||||
}
|
||||
text.setText(str);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
protected static class BaseHandler extends Handler {
|
||||
private final WeakReference<SpecialVehicleFloatWindow> mObjects;
|
||||
|
||||
public BaseHandler(SpecialVehicleFloatWindow mPresenter) {
|
||||
mObjects = new WeakReference<SpecialVehicleFloatWindow>(mPresenter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
SpecialVehicleFloatWindow mPresenter = mObjects.get();
|
||||
if (mPresenter != null)
|
||||
mPresenter.handleMessage(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package com.zhidao.adas.client.ui.special;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.view.Gravity;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import com.zhidao.adas.client.bean.SpecialVehicleBean;
|
||||
|
||||
|
||||
public class SpecialVehicleFloatWindowManager implements SpecialVehicleFloatWindow.OnFloatWindowListener {
|
||||
private final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
|
||||
private SpecialVehicleFloatWindow floatWindow = null;
|
||||
private WindowManager wm = null;
|
||||
private final Context context;
|
||||
private final SpecialVehicleBean specialVehicleBean;
|
||||
|
||||
public SpecialVehicleFloatWindowManager(Context context, SpecialVehicleBean specialVehicleBean) {
|
||||
this.context = context;
|
||||
this.specialVehicleBean = specialVehicleBean;
|
||||
}
|
||||
|
||||
public void show() {
|
||||
if (!createFloatWindow()) {
|
||||
if (floatWindow.isMaximize()) {
|
||||
floatWindow.minimality();
|
||||
} else {
|
||||
floatWindow.maximize();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean createFloatWindow() {
|
||||
if (floatWindow == null) {
|
||||
wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
|
||||
layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
|
||||
layoutParams.format = PixelFormat.RGBA_8888;
|
||||
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;//| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|
||||
layoutParams.gravity = Gravity.START | Gravity.TOP;
|
||||
layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
layoutParams.alpha = 0.9f;
|
||||
floatWindow = new SpecialVehicleFloatWindow(context, specialVehicleBean);
|
||||
floatWindow.setWmParams(layoutParams);
|
||||
floatWindow.setOnFloatWindowListener(this);
|
||||
layoutParams.x = specialVehicleBean.getFloatWindowLocationMaxX(context);
|
||||
layoutParams.y = specialVehicleBean.getFloatWindowLocationMaxY(context);
|
||||
wm.addView(floatWindow, layoutParams);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void removeFloatWindow() {
|
||||
if (floatWindow != null) {
|
||||
wm.removeView(floatWindow);
|
||||
floatWindow = null;
|
||||
wm = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBack() {
|
||||
removeFloatWindow();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMinimality() {
|
||||
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
|
||||
layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
layoutParams.x = specialVehicleBean.getFloatWindowLocationMinX(context);
|
||||
layoutParams.y = specialVehicleBean.getFloatWindowLocationMinY(context);
|
||||
layoutParams.alpha = 1f;
|
||||
if (floatWindow != null) {
|
||||
floatWindow.updateViewLayout();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMaximize() {
|
||||
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
|
||||
layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
|
||||
layoutParams.x = specialVehicleBean.getFloatWindowLocationMaxX(context);
|
||||
layoutParams.y = specialVehicleBean.getFloatWindowLocationMaxY(context);
|
||||
layoutParams.alpha = 0.9f;
|
||||
if (floatWindow != null) {
|
||||
floatWindow.updateViewLayout();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -10,10 +10,8 @@ import com.zhidao.support.adas.high.common.JsonUtil;
|
||||
import com.zhidao.support.adas.high.common.MessageType;
|
||||
|
||||
import java.io.File;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* @author song kenan
|
||||
@@ -157,12 +155,12 @@ public class Constants {
|
||||
String RECEIVE_REPORT_MESSAGE = MessageType.TYPE_RECEIVE_REPORT_MESSAGE.desc;
|
||||
String RECEIVE_PERCEPTION_TRAFFIC_LIGHT = MessageType.TYPE_RECEIVE_PERCEPTION_TRAFFIC_LIGHT.desc;
|
||||
String RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY = MessageType.TYPE_RECEIVE_PREDICTION_OBSTACLE_TRAJECTORY.desc;
|
||||
String RECEIVE_POINT_CLOUD = MessageType.TYPE_RECEIVE_POINT_CLOUD.desc;
|
||||
String RECEIVE_POINT_CLOUD_ORIGINAL = "点云原始透传";
|
||||
String RECEIVE_POINT_CLOUD_ORIGINAL = MessageType.TYPE_RECEIVE_POINT_CLOUD.desc;
|
||||
String RECEIVE_PLANNING_OBJECTS = MessageType.TYPE_RECEIVE_PLANNING_OBJECTS.desc;
|
||||
String RECEIVE_PLANNING_DECISION_STATE = MessageType.TYPE_RECEIVE_PLANNING_DECISION_STATE.desc;
|
||||
|
||||
// String RECEIVE_BASIC_INFO_REQ = "自动驾驶设备基础信息请求";
|
||||
String TITLE_CAR_CONFIG_RESP = "工控机版本\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t固定IP配置";
|
||||
String TITLE_CAR_CONFIG_RESP = "工控机版本\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t配置";
|
||||
String RECEIVE_CAR_CONFIG_RESP = "信息与配置";
|
||||
String RECEIVE_RECORD_RESULT = MessageType.TYPE_RECEIVE_RECORD_RESULT.desc;
|
||||
String RECEIVE_RECORD_DATA_CONFIG_RESP = MessageType.TYPE_RECEIVE_RECORD_DATA_CONFIG_RESP.desc;
|
||||
@@ -175,6 +173,7 @@ public class Constants {
|
||||
|
||||
String SEND_SET_AUTOPILOT_MODE_REQ = "自动驾驶模式";
|
||||
String SEND_GLOBAL_PATH_REQ = "自动驾驶路径查询";
|
||||
String SEND_SPECIAL_VEHICLE_TASK_CMD = "特种车辆";
|
||||
String SEND_STATUS_QUERY_REQ = "状态查询";
|
||||
String SEND_BASIC_INFO_RESP = "下发SN";
|
||||
String SEND_RECORD_DATA_5 = "数据采集5秒";
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:color="#7CFC00" android:state_pressed="true" />
|
||||
<item android:color="#7CFC00" android:state_checked="true" />
|
||||
<item android:color="#c9c9c9" android:state_enabled="false" />
|
||||
<item android:color="#000000" />
|
||||
|
||||
</selector>
|
||||
23
app_ipc_monitoring/src/main/res/drawable/bg_radio_button.xml
Normal file
23
app_ipc_monitoring/src/main/res/drawable/bg_radio_button.xml
Normal file
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_checked="true">
|
||||
<shape android:shape="rectangle">
|
||||
<padding android:bottom="4dp" android:left="6dp" android:right="6dp" android:top="4dp" />
|
||||
<!-- 圆角深红色按钮 -->
|
||||
<solid android:color="#990033" />
|
||||
<corners android:radius="8dip" />
|
||||
<stroke android:width=".5dp" android:color="#ffffff" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
<item android:state_checked="false">
|
||||
<shape android:shape="rectangle">
|
||||
<padding android:bottom="4dp" android:left="6dp" android:right="6dp" android:top="4dp" />
|
||||
<!-- 圆角红色按钮 -->
|
||||
<solid android:color="@color/colorPrimary" />
|
||||
<corners android:radius="8dip" />
|
||||
<stroke android:width=".5dp" android:color="#ffffff" android:dashWidth="3dp" android:dashGap="3dp" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
</selector>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<!-- 圆角红色按钮 -->
|
||||
<solid android:color="#E0000000" />
|
||||
<corners android:radius="8dp" />
|
||||
</shape>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:color="#F5F5F5" android:state_pressed="true" />
|
||||
<item android:color="#F5F5F5" android:state_checked="true" />
|
||||
<item android:color="#F5F5F5" android:state_selected="true" />
|
||||
<item android:color="#000000" />
|
||||
</selector>
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="oval"
|
||||
android:useLevel="false">
|
||||
<solid android:color="#90D3D3D3" />
|
||||
<size
|
||||
android:width="100dp"
|
||||
android:height="100dp" />
|
||||
<stroke
|
||||
android:width=".3dp"
|
||||
android:color="#90FF0033" />
|
||||
</shape>
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="30dp"
|
||||
android:height="30dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M823.04,840.32 L524.16,540.16l296.32,-294.4c12.8,-12.8 12.8,-33.28 0,-45.44 -12.8,-12.8 -33.28,-12.8 -46.08,0L478.08,494.08 184.96,200.32c-12.8,-12.8 -33.28,-12.8 -45.44,0s-12.8,33.28 0,45.44l292.48,293.76 -302.72,300.8c-12.8,12.8 -12.8,33.28 0,45.44 12.8,12.8 33.28,12.8 46.08,0l302.72,-300.16 299.52,300.16c12.8,12.8 33.28,12.8 45.44,0C835.2,873.6 835.2,853.12 823.04,840.32z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="30dp"
|
||||
android:height="30dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:fillColor="#99FFFFFF"
|
||||
android:pathData="M823.04,840.32 L524.16,540.16l296.32,-294.4c12.8,-12.8 12.8,-33.28 0,-45.44 -12.8,-12.8 -33.28,-12.8 -46.08,0L478.08,494.08 184.96,200.32c-12.8,-12.8 -33.28,-12.8 -45.44,0s-12.8,33.28 0,45.44l292.48,293.76 -302.72,300.8c-12.8,12.8 -12.8,33.28 0,45.44 12.8,12.8 33.28,12.8 46.08,0l302.72,-300.16 299.52,300.16c12.8,12.8 33.28,12.8 45.44,0C835.2,873.6 835.2,853.12 823.04,840.32z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="30dp"
|
||||
android:height="30dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M449.92,543.36C449.92,520.96 431.36,512 410.24,512L97.92,512c-17.92,0 -32,14.08 -32,32 0,17.92 14.08,32 32,32l242.56,0 -267.52,267.52c-12.16,12.16 -12.16,31.36 0,43.52 12.16,12.16 31.36,12.16 43.52,0l269.44,-269.44 0,246.4c0,17.92 14.08,32 32,32 17.92,0 32,-14.08 32,-32l0,-320M865.92,384 L622.72,384l267.52,-267.52c12.16,-12.16 12.16,-31.36 0,-43.52 -12.16,-12.16 -31.36,-12.16 -43.52,0L577.92,342.4 577.92,96C577.92,78.08 563.2,64 545.92,64c-17.92,0 -32,14.08 -32,32l0,320c0,0.64 0.64,1.28 0.64,1.92 0,8.32 2.56,16.64 8.96,22.4C531.2,448.64 542.72,451.2 552.96,448l312.32,0c17.92,0 32,-14.08 32,-32C897.92,398.08 883.2,384 865.92,384z"/>
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="30dp"
|
||||
android:height="30dp"
|
||||
android:viewportWidth="1024"
|
||||
android:viewportHeight="1024">
|
||||
<path
|
||||
android:fillColor="#99FFFFFF"
|
||||
android:pathData="M449.92,543.36C449.92,520.96 431.36,512 410.24,512L97.92,512c-17.92,0 -32,14.08 -32,32 0,17.92 14.08,32 32,32l242.56,0 -267.52,267.52c-12.16,12.16 -12.16,31.36 0,43.52 12.16,12.16 31.36,12.16 43.52,0l269.44,-269.44 0,246.4c0,17.92 14.08,32 32,32 17.92,0 32,-14.08 32,-32l0,-320M865.92,384 L622.72,384l267.52,-267.52c12.16,-12.16 12.16,-31.36 0,-43.52 -12.16,-12.16 -31.36,-12.16 -43.52,0L577.92,342.4 577.92,96C577.92,78.08 563.2,64 545.92,64c-17.92,0 -32,14.08 -32,32l0,320c0,0.64 0.64,1.28 0.64,1.92 0,8.32 2.56,16.64 8.96,22.4C531.2,448.64 542.72,451.2 552.96,448l312.32,0c17.92,0 32,-14.08 32,-32C897.92,398.08 883.2,384 865.92,384z"/>
|
||||
</vector>
|
||||
20
app_ipc_monitoring/src/main/res/drawable/radio_btn_bg.xml
Normal file
20
app_ipc_monitoring/src/main/res/drawable/radio_btn_bg.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item android:state_checked="true">
|
||||
<shape>
|
||||
<padding android:bottom="3dp" android:left="5dp" android:right="5dp" android:top="3dp" />
|
||||
<solid android:color="#6bb5af" />
|
||||
<corners android:radius="5dp" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
<item android:state_checked="false">
|
||||
<shape>
|
||||
<padding android:bottom="3dp" android:left="5dp" android:right="5dp" android:top="3dp" />
|
||||
<solid android:color="#C0C0C0" />
|
||||
<corners android:radius="5dp" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
</selector>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/ic_special_vehicle_back_true" android:state_pressed="true" />
|
||||
<item android:drawable="@drawable/ic_special_vehicle_back" />
|
||||
</selector>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:drawable="@drawable/ic_special_vehicle_minimality_true" android:state_pressed="true" />
|
||||
<item android:drawable="@drawable/ic_special_vehicle_minimality" />
|
||||
</selector>
|
||||
92
app_ipc_monitoring/src/main/res/layout/dialog_sn.xml
Normal file
92
app_ipc_monitoring/src/main/res/layout/dialog_sn.xml
Normal file
@@ -0,0 +1,92 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0.12"
|
||||
android:gravity="right"
|
||||
android:text="SN:"
|
||||
android:textColor="#000000" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/et"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:hint="输入SN"
|
||||
android:imeOptions="actionNext"
|
||||
android:inputType="text"
|
||||
android:maxLines="1"
|
||||
android:minWidth="100dp"
|
||||
android:textColor="#000"
|
||||
android:textSize="15sp" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0.12"
|
||||
android:gravity="right"
|
||||
android:text="环境:"
|
||||
android:textColor="#000000" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/ev"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:hint="(默认0)1:研发环境,2:测试环境,3:生产环境,4:演示环境"
|
||||
android:imeOptions="actionNext"
|
||||
android:inputType="number"
|
||||
android:maxLines="1"
|
||||
android:minWidth="100dp"
|
||||
android:textColor="#000"
|
||||
android:textSize="15sp" />
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="0.12"
|
||||
android:gravity="right"
|
||||
android:text="角色:"
|
||||
android:textColor="#000000" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/role"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:gravity="center"
|
||||
android:hint="(默认2)0:司机屏,1:乘客屏,2:调试屏"
|
||||
android:imeOptions="actionNext"
|
||||
android:inputType="number"
|
||||
android:maxLines="1"
|
||||
android:minWidth="100dp"
|
||||
android:textColor="#000"
|
||||
android:textSize="15sp" />
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,161 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/bg"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/can_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/bg_special_vehicle_float"
|
||||
android:minWidth="400dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/btn_back"
|
||||
android:layout_width="45dp"
|
||||
android:layout_height="45dp"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginStart="5dp"
|
||||
android:background="@null"
|
||||
android:padding="5dp"
|
||||
android:src="@drawable/selector_special_vehicle_back"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/btn_minimality"
|
||||
android:layout_width="45dp"
|
||||
android:layout_height="45dp"
|
||||
android:layout_gravity="center"
|
||||
android:layout_marginStart="5dp"
|
||||
android:background="@null"
|
||||
android:padding="5dp"
|
||||
android:src="@drawable/selector_special_vehicle_minimality"
|
||||
app:layout_constraintStart_toEndOf="@id/btn_back"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#fff"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintBottom_toBottomOf="@id/btn_minimality"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/btn_minimality" />
|
||||
|
||||
|
||||
<RadioGroup
|
||||
android:id="@+id/rg_send_type"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintBottom_toBottomOf="@id/btn_minimality"
|
||||
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/btn_minimality">
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/btn_one"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@drawable/bg_radio_button"
|
||||
android:button="@null"
|
||||
android:text="单条"
|
||||
android:textColor="#fff" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/btn_more"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:background="@drawable/bg_radio_button"
|
||||
android:button="@null"
|
||||
android:text="多条"
|
||||
android:textColor="#fff" />
|
||||
|
||||
<RadioButton
|
||||
android:id="@+id/btn_all"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:background="@drawable/bg_radio_button"
|
||||
android:button="@null"
|
||||
android:text="同时"
|
||||
android:textColor="#fff" />
|
||||
</RadioGroup>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/hint_send"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="2dp"
|
||||
android:gravity="center"
|
||||
android:text="发送方式:"
|
||||
android:textColor="#fff"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/rg_send_type"
|
||||
app:layout_constraintEnd_toStartOf="@id/rg_send_type"
|
||||
app:layout_constraintTop_toTopOf="@id/rg_send_type" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatButton
|
||||
android:id="@+id/btn_send"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="30dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:background="@drawable/btn_bg"
|
||||
android:gravity="center"
|
||||
android:text="发送"
|
||||
android:textColor="@color/colorWhile"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/btn_back" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:minHeight="30dp"
|
||||
android:textColor="#ffffff"
|
||||
app:layout_constraintEnd_toStartOf="@id/btn_send"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/btn_back" />
|
||||
|
||||
<HorizontalScrollView
|
||||
android:id="@+id/btn_list"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginLeft="15dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:layout_marginRight="15dp"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:scrollbars="none"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/text" />
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
|
||||
<TextView
|
||||
android:id="@+id/btn_maximize"
|
||||
android:layout_width="50dp"
|
||||
android:layout_height="50dp"
|
||||
android:layout_gravity="center"
|
||||
android:background="@drawable/btn_special_vehicle_small_bg"
|
||||
android:gravity="center"
|
||||
android:textColor="@drawable/btn_maximize_text_color"
|
||||
android:textSize="14sp"
|
||||
android:visibility="gone" />
|
||||
</merge>
|
||||
@@ -52,7 +52,16 @@
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical"
|
||||
android:padding="10dp">
|
||||
android:paddingStart="10dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/ip_hint"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="工控机固定IP配置"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<EditText
|
||||
android:id="@+id/ip"
|
||||
@@ -71,13 +80,13 @@
|
||||
android:textSize="16dp"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
app:layout_constraintTop_toBottomOf="@id/ip_hint" />
|
||||
|
||||
|
||||
<Button
|
||||
android:id="@+id/btn1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="36dp"
|
||||
android:layout_margin="5dp"
|
||||
android:background="@drawable/btn_bg"
|
||||
android:text="添加"
|
||||
@@ -89,7 +98,7 @@
|
||||
<Button
|
||||
android:id="@+id/btn2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_height="36dp"
|
||||
android:layout_margin="5dp"
|
||||
android:layout_toEndOf="@id/btn1"
|
||||
android:background="@drawable/btn_bg"
|
||||
@@ -106,10 +115,151 @@
|
||||
android:layout_marginTop="10dp"
|
||||
android:lineSpacingExtra="5dp"
|
||||
android:textIsSelectable="true"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/btn1" />
|
||||
|
||||
<View
|
||||
android:id="@+id/line2"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="@color/colorAccent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/ips_view" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/interface_hint"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="接收接口订阅、取消订阅配置"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/update"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/update" />
|
||||
|
||||
<Spinner
|
||||
android:id="@+id/spinner"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintBottom_toBottomOf="@id/update"
|
||||
app:layout_constraintStart_toEndOf="@id/interface_hint"
|
||||
app:layout_constraintTop_toTopOf="@id/update" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/update"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="36dp"
|
||||
android:layout_marginTop="5dp"
|
||||
android:background="@drawable/btn_bg"
|
||||
android:text="更新"
|
||||
android:textColor="#ffffff"
|
||||
app:layout_constraintStart_toEndOf="@id/spinner"
|
||||
app:layout_constraintTop_toBottomOf="@id/line2" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="4dp"
|
||||
android:text="选中已注册接口点击更新取消注册\n选中未注册接口点击更新进行注册"
|
||||
android:textSize="10sp"
|
||||
app:layout_constraintBottom_toBottomOf="@id/update"
|
||||
app:layout_constraintStart_toEndOf="@id/update"
|
||||
app:layout_constraintTop_toTopOf="@id/update" />
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_list_title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="2dp"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/update">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:paddingStart="5dp"
|
||||
android:paddingEnd="5dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/hint_registered"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:text="已注册接口" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/registered_check_all"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_gravity="end"
|
||||
android:text="全选" />
|
||||
</RelativeLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="bottom"
|
||||
android:background="@color/colorSlateGray" />
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:paddingStart="5dp"
|
||||
android:paddingEnd="5dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/hint_unregistered"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:paddingStart="5dp"
|
||||
android:paddingEnd="5dp"
|
||||
android:text="未注册接口" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/unregistered_check_all"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:text="全选" />
|
||||
</RelativeLayout>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/layout_list_title">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rec_registered"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" />
|
||||
|
||||
<View
|
||||
android:layout_width="1dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="bottom"
|
||||
android:background="@color/colorSlateGray" />
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/rec_unregistered"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1" />
|
||||
</LinearLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
@@ -15,7 +15,7 @@
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
android:gravity="center"
|
||||
android:text="INFO"
|
||||
android:textColor="@drawable/item_text_color"
|
||||
android:textColor="@color/item_text_color"
|
||||
android:textSize="14sp" />
|
||||
|
||||
</LinearLayout>
|
||||
@@ -15,7 +15,7 @@
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
android:gravity="center"
|
||||
android:text="INFO"
|
||||
android:textColor="@drawable/item_text_color"
|
||||
android:textColor="@color/item_text_color"
|
||||
android:textSize="16sp" />
|
||||
|
||||
</LinearLayout>
|
||||
46
app_ipc_monitoring/src/main/res/layout/item_interface.xml
Normal file
46
app_ipc_monitoring/src/main/res/layout/item_interface.xml
Normal file
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/header"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="3dp"
|
||||
android:layout_marginTop="2dp"
|
||||
android:layout_marginEnd="3dp"
|
||||
android:layout_marginBottom="2dp"
|
||||
android:foreground="?android:attr/selectableItemBackground">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/index"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="4dp"
|
||||
android:textColor="@color/item_text_color1"
|
||||
android:textSize="12sp" />
|
||||
|
||||
<CheckBox
|
||||
android:id="@+id/item_check"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="5dp"
|
||||
android:layout_marginEnd="5dp"
|
||||
android:ellipsize="marquee"
|
||||
android:focusable="false"
|
||||
android:marqueeRepeatLimit="marquee_forever"
|
||||
android:singleLine="true"
|
||||
android:text="sssds"
|
||||
android:textColor="@color/item_text_color1"
|
||||
android:textSize="15sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
</androidx.cardview.widget.CardView>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:paddingStart="5dp"
|
||||
android:paddingEnd="5dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/name"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textColor="#fff"
|
||||
android:textSize="14.5sp" />
|
||||
|
||||
<RadioGroup
|
||||
android:id="@+id/item_group"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"/>
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/r_btn"
|
||||
style="@style/RadioBtnStyle"
|
||||
android:text="0-未知" />
|
||||
@@ -31,4 +31,15 @@
|
||||
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
|
||||
|
||||
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
|
||||
|
||||
<style name="RadioBtnStyle">
|
||||
<item name="android:button">@null</item>
|
||||
<item name="android:layout_marginTop">4dp</item>
|
||||
<item name="android:layout_marginBottom">4dp</item>
|
||||
<item name="android:textSize">22sp</item>
|
||||
<item name="android:textColor">#fff</item>
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">35dp</item>
|
||||
<item name="android:background">@drawable/radio_btn_bg</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
||||
@@ -401,6 +401,12 @@ class MoGoAdasListenerImpl : OnAdasListener {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* planning决策状态, 透传
|
||||
*/
|
||||
override fun onPlanningActionMsg(header: MessagePad.Header?, planningActionMsg: MessagePad.PlanningActionMsg?) {
|
||||
}
|
||||
|
||||
|
||||
override fun onError(status: ProtocolStatus, bytes: ByteArray) {
|
||||
|
||||
|
||||
@@ -89,9 +89,9 @@ WEBSOCKET_VERSION=1.1.7
|
||||
## 产品库必备配置,产品库自动对versionCode和versionName版本进行升级
|
||||
applicationId=com.mogo.launcer
|
||||
applicationName=IntelligentPilot
|
||||
# 清扫车版本号
|
||||
versionCode=1000000
|
||||
versionName=1.0.0
|
||||
# RoboBus司机端:2.5.1;RoboTaxi司机端:2.5.1;RoboTaxi乘客端:1.0.0
|
||||
versionCode=2090000
|
||||
versionName=2.9.0
|
||||
|
||||
################# 新架构模块Maven版本管理 #################
|
||||
MOGO_CORE_FUNCTION_AUTOPILOT_VERSION=0.0.58.10
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
syntax = "proto3";
|
||||
package mogo.telematics.pad;
|
||||
|
||||
enum ProtocolVersion{
|
||||
enum ProtocolVersion
|
||||
{
|
||||
Defaultver = 0;
|
||||
CurrentVersion = 4; //每次修改proto文件增加1
|
||||
CurrentVersion = 7; //每次修改proto文件增加1
|
||||
}
|
||||
|
||||
enum MessageType
|
||||
{
|
||||
MsgTypeDefault = 0;
|
||||
|
||||
MsgTypePlanningDecisionState = 0x00001; //planning决策状态, 透传
|
||||
|
||||
MsgTypeTrajectory = 0x10000; //局部轨迹,车前引导线
|
||||
MsgTypeTrackedObjects = 0x10001; //障碍物信息
|
||||
MsgTypeGnssInfo = 0x10002; //惯导信息
|
||||
@@ -44,6 +47,9 @@ enum MessageType
|
||||
MsgTypeSetRainModeReq = 0x10113; //设置雨天模式
|
||||
MsgTypeRecordDataConfigReq = 0x10114; //数据采集配置查询请求
|
||||
MsgTypeRecordDataConfigResp = 0x10115; //数据采集配置查询应答
|
||||
MsgTypeOperatorCmdReq = 0x10116; //操控指令
|
||||
MsgTypeSubscribeDataReq = 0x10117; //数据订阅、取消订阅请求
|
||||
MsgTypeSpecialVehicleTaskCmd = 0x10118; //特种车辆命令
|
||||
}
|
||||
|
||||
message Header
|
||||
@@ -75,6 +81,18 @@ message Trajectory
|
||||
}
|
||||
|
||||
// message definition for MsgTypeTrackedObjects
|
||||
message SubSource
|
||||
{
|
||||
uint32 source = 1; //[default = 0] v2v_bsm = 1 v2i_rsm = 2 v2v_ssm = 3 v2n_rsm = 4
|
||||
string id = 2; //HEX_string
|
||||
}
|
||||
|
||||
message TrackedSource
|
||||
{
|
||||
uint32 source = 1; //lidar:1 camera:2 radar:3 v2x:4 vidar:5 falcon:6
|
||||
repeated SubSource sub_source = 2;
|
||||
}
|
||||
|
||||
message TrackedObject
|
||||
{
|
||||
uint32 type = 1; //物体类型, 0:Background, 1:Person, 2:Bicycle, 3:Car, 4:MotorCycle,
|
||||
@@ -92,6 +110,7 @@ message TrackedObject
|
||||
double speed = 11; //车辆速度
|
||||
uint32 drawLevel = 12; //危险等级 1 绿,2 黄,3 红
|
||||
double driverTime = 13; //驱动感知时间, abandoned
|
||||
repeated TrackedSource tracked_source = 14;
|
||||
}
|
||||
|
||||
message TrackedObjects
|
||||
@@ -156,6 +175,7 @@ message PlanningObjects
|
||||
// message definition for MessageType: MsgTypeOBU
|
||||
// refer to obu.proto
|
||||
|
||||
|
||||
// message definition for MsgTypeTrajectoryDownloadReq
|
||||
message Line
|
||||
{
|
||||
@@ -188,6 +208,7 @@ message BasicInfoResp
|
||||
{
|
||||
string sn = 1;
|
||||
uint32 environment = 2; //1: 研发环境, 2:测试环境, 3:生产环境 4:演示环境
|
||||
uint32 role = 3; //客户端角色:0: 司机屏,1: 乘客屏,2: 调试屏
|
||||
}
|
||||
|
||||
// message definition for MsgTypeSetAutopilotModeReq
|
||||
@@ -199,7 +220,8 @@ message Location
|
||||
double heading = 4;
|
||||
}
|
||||
|
||||
message RouteInfo{
|
||||
message RouteInfo
|
||||
{
|
||||
Location startLocation = 1;
|
||||
string startName = 2;
|
||||
Location endLocation = 3;
|
||||
@@ -333,7 +355,8 @@ message ArrivalNotification
|
||||
}
|
||||
|
||||
// message definition for MsgTypeSystemCmdReq
|
||||
enum SystemCmdType {
|
||||
enum SystemCmdType
|
||||
{
|
||||
SYSTEMCMD_NONE = 0;
|
||||
SYSTEMCMD_REBOOT = 1;
|
||||
}
|
||||
@@ -375,3 +398,69 @@ message RecordDataConfig
|
||||
repeated RecordDataType recordTypes = 1;
|
||||
}
|
||||
|
||||
// message definition for MsgTypeSubscribeDataReq
|
||||
message SubscribeDataReq
|
||||
{
|
||||
uint32 role = 1; //客户端角色:0: 司机屏,1: 乘客屏,2: 调试屏
|
||||
uint32 reqType = 2; //1:订阅, 2:取消订阅
|
||||
repeated uint32 dataTypes = 3; //订阅/取消订阅的消息类型列表, 透传的消息类型参考配置列表,其他消息类型见MsgType
|
||||
}
|
||||
|
||||
// message definition for MsgTypeOperatorCmdReq
|
||||
enum OperatorCmdType
|
||||
{
|
||||
OPERATOR_CMD_NONE = 0;
|
||||
OPERATOR_CMD_CHANGE_LANE = 1;
|
||||
OPERATOR_CMD_SET_ACCELERATED_SPEED = 2;
|
||||
OPERATOR_CMD_SET_HORN = 3;
|
||||
}
|
||||
|
||||
message OperatorCmdReq
|
||||
{
|
||||
OperatorCmdType cmdType = 1;
|
||||
double value = 2; //OPERATOR_CMD_CHANGE_LANE: 1: left 2: right
|
||||
//OPERATOR_CMD_SET_ACCELERATED_SPEED: accelerated speed
|
||||
//OPERATOR_CMD_SET_HORN: 1: honk 2: stop honking
|
||||
}
|
||||
|
||||
//message definition for MsgTypePlanningDecisionState
|
||||
enum DrivingState
|
||||
{
|
||||
NO_AUTODRIVING = 0; //不在自动驾驶状态
|
||||
LANKE_KEEP = 1; //车道保持状态
|
||||
TRAFFIC_LIGHT = 2; //红绿灯通行状态: driving_action:1 表示停止动作;driving_action:2 表示通行动作
|
||||
FOLLOW_LANE_CHANGE_LEFT = 3; //follow全局择机向左变道状态: driving_action:1 表示触发变道;driving_action:2 表示择机保持;driving_action:3 表示变道完成
|
||||
FOLLOW_LANE_CHANGE_RIGHT = 4; //follow全局择机向右变道状态: driving_action:1 表示触发变道;driving_action:2 表示择机保持;driving_action:3 表示变道完成
|
||||
AUTO_LANE_CHANGE_LEFT = 5; //主动向左变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成
|
||||
AUTO_LANE_CHANGE_RIGHT = 6; //主动向左变道状态: driving_action:1 表示触发变道;driving_action:2 表示执行变道;driving_action:3 表示变道取消;driving_action:4 表示变道完成
|
||||
LANE_AVOID_LEFT = 7; //主动向左绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成
|
||||
LANE_AVOID_RIGHT = 8; //主动向右绕行状态: driving_action:1 表示触发绕行;driving_action:2 表示执行绕行;driving_action:3 表示绕行取消;driving_action:4 表示绕行完成
|
||||
START_UP = 9; //起步状态: driving_action:1 表示正常启动;driving_action:2 表示择机起步;
|
||||
PULL_OVER = 10; //靠边停车状态: driving_action:1 表示正常靠边停车;driving_action:2 表示择机靠边停车;
|
||||
UN_PROTECTED_INTERSECTION = 11; //路口预测响应状态: driving_action:1 表示触发了预测响应;
|
||||
}
|
||||
|
||||
enum DrivingAction
|
||||
{
|
||||
DRIVING_Action_STATE_NONE = 0;
|
||||
DRIVING_ACTION_STATE_ONE = 1;
|
||||
DRIVING_ACTION_STATE_TWO = 2;
|
||||
DRIVING_ACTION_STATE_THREE = 3;
|
||||
DRIVING_ACTION_STATE_FOUR = 4;
|
||||
}
|
||||
|
||||
message DrivingActionMsg
|
||||
{
|
||||
DrivingState driving_state = 1;
|
||||
DrivingAction driving_action = 2;
|
||||
}
|
||||
|
||||
message PlanningActionMsg
|
||||
{
|
||||
DrivingActionMsg action_msg = 1;
|
||||
double destination_acc = 2; //驾驶的意图(规划期望的加速或者减速值)
|
||||
}
|
||||
|
||||
//message definition for MsgTypeSpecialVehicleTaskCmd
|
||||
//refer to special_vehicle_task_cmd.proto for details
|
||||
|
||||
|
||||
@@ -12,5 +12,6 @@ message MogoPointCloud
|
||||
optional double self_roll = 5;
|
||||
optional double self_pitch = 6;
|
||||
optional double self_yaw = 7;
|
||||
repeated int32 add_data = 8 [packed=true];
|
||||
}
|
||||
repeated uint32 del_data = 8 [packed=true];
|
||||
repeated double add_data = 9 [packed=true];
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
syntax = "proto2";
|
||||
package chassis;
|
||||
|
||||
message RoboSweeperFuTianCleanCmd {
|
||||
optional uint32 clean_open_requirement = 1 [default = 0]; // 清扫作业开启需求 0--no req 1--Req_clean_work, 2--No_clean_work
|
||||
optional uint32 clean_mode_requirement = 2 [default = 0]; // 清扫作业模式需求 0--no req, 1--Sweeping mode, 2--Wash sweeper mode, 3--Pure wash mode, 4--Pure draw mode
|
||||
optional uint32 clean_direction_requirement = 3 [default = 0]; // 清扫方向需求指 0--no req, 1--both side work, 2--left side work, 3--right side work
|
||||
optional uint32 clean_intensity_requirement = 4 [default = 0]; // 作业强度需求 0--no req, 1--stand clean work, 2--strong clean work
|
||||
optional uint32 dusk_close_requirement = 5 [default = 0]; // 降尘关闭需求 0--no req, 1--close dusk, 2--open dusk
|
||||
optional uint32 suction_nozzlefle_open_requirement = 6 [default = 0]; // 吸嘴挡板需求 0--no req, 1--open, 2--close
|
||||
optional uint32 spray_gun_open_requirement = 7 [default = 0]; // 喷雾枪需求 0--no req, 1--open, 2--close
|
||||
optional uint32 sweepdisk_speed_requirement = 8 [default = 0]; // 扫盘加速需求 0--no req, 1--decelerate req, 2--accelerate req(扫盘加速需求,每点一次为加速一次,每次加速为5%pwm)
|
||||
}
|
||||
|
||||
message RoboSweeperFuTianTaskCmd {
|
||||
optional RoboSweeperFuTianCleanCmd robo_sweeper_futian_clean_cmd = 1; // 福田清扫车清扫作业指令
|
||||
|
||||
}
|
||||
|
||||
message RoboVanSkywellTaskCmd {
|
||||
|
||||
}
|
||||
|
||||
message SpecialVehicleTaskCmd {
|
||||
optional RoboSweeperFuTianTaskCmd robo_sweeper_futian_task_cmd = 1; // 福田清扫车业务指令
|
||||
optional RoboVanSkywellTaskCmd robo_van_skywell_task_cmd = 2; // 开沃小巴业务指令
|
||||
}
|
||||
@@ -36,15 +36,19 @@ import com.zhidao.support.adas.high.protocol.RawUnpack;
|
||||
import com.zhidao.support.adas.high.queue.WSByteQueueManager;
|
||||
import com.zhidao.support.adas.high.queue.WebSocketQueueManager;
|
||||
import com.zhidao.support.adas.high.socket.FpgaSocket;
|
||||
import com.zhidao.support.adas.high.subscribe.SubscribeInterface;
|
||||
import com.zhidao.support.adas.high.subscribe.SubscribeInterfaceOptions;
|
||||
import com.zhidao.support.adas.high.thread.DispatchHandler;
|
||||
import com.zhjt.service.chain.ChainLog;
|
||||
import com.zhjt.service.chain.TracingConstants;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import chassis.SpecialVehicleTaskCmdOuterClass;
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
import okio.ByteString;
|
||||
|
||||
@@ -60,7 +64,7 @@ import okio.ByteString;
|
||||
* @UpdateRemark: 更新说明:
|
||||
* @Version: 1.0
|
||||
*/
|
||||
public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnectListener, IPCFixationIPHelper.IIPCFixationIPListener, DispatchHandler.OnDispatchHandlerListener {
|
||||
public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnectListener, IPCFixationIPHelper.IIPCFixationIPListener, DispatchHandler.OnDispatchHandlerListener, SubscribeInterface.OnSubscribeInterfaceListener {
|
||||
private static final String TAG = AdasChannel.class.getSimpleName();
|
||||
private static final String THREAD_NAME_DISPATCH_EVENT = "IPCEventDispatchHandler";//除点云单独拆分线程以外都是用此名称
|
||||
private static final String THREAD_NAME_DISPATCH_POINT_CLOUD = "IPCPointCloudDispatchHandler";
|
||||
@@ -104,6 +108,11 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
|
||||
* IPC固定IP查询工具类
|
||||
*/
|
||||
private IPCFixationIPHelper ipcFixationIPHelper;
|
||||
/**
|
||||
* 工控机接口注册 连接成功后可以进行操作 乘客屏未null
|
||||
* 乘客屏无法进行注册或取消注册,因为乘客屏无法感知司机屏与工控机连接状态。无法重置已注册或未注册接口列表
|
||||
*/
|
||||
private SubscribeInterface subscribeInterface;
|
||||
|
||||
public void setOnMultiDeviceListener(OnMultiDeviceListener onMultiDeviceListener) {
|
||||
this.onMultiDeviceListener = onMultiDeviceListener;
|
||||
@@ -397,13 +406,22 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
|
||||
sendCarConfigReq();
|
||||
ipcConnectedIp = ipAddress;
|
||||
ipcConnectedPort = port;
|
||||
subscribeInterface = new SubscribeInterface(this);
|
||||
updateConnectStatus(Constants.IPC_CONNECTION_STATUS.CONNECTED, "已连接");
|
||||
//根据连接配置 进行接口订阅或取消订阅配置
|
||||
if (adasOptions != null) {
|
||||
SubscribeInterfaceOptions options = adasOptions.getSubscribeInterfaceOptions();
|
||||
if (options != null && options.getMessageTypes() != null && !options.getMessageTypes().isEmpty()) {
|
||||
subscribeInterface.subscribeInterface(options.getRole(), options.getType(), options.getMessageTypes());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWebSocketConnectFailed(String t) {
|
||||
ipcConnectedIp = null;
|
||||
ipcConnectedPort = Constants.DEFAULT_PORT;
|
||||
subscribeInterface = null;
|
||||
updateConnectStatus(Constants.IPC_CONNECTION_STATUS.DISCONNECTED, t);
|
||||
}
|
||||
|
||||
@@ -487,9 +505,6 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
|
||||
clientPkFileName = "sn")
|
||||
private void updateConnectStatus(@Define.IPCConnectionStatus int status, @Nullable String reason) {
|
||||
ipcConnectionStatus.set(status);
|
||||
if (adasConnectStatusListener != null) {
|
||||
adasConnectStatusListener.onConnectionIPCStatus(ipcConnectionStatus.get(), reason);
|
||||
}
|
||||
if (status == Constants.IPC_CONNECTION_STATUS.CONNECTED) {
|
||||
startDispatchHandler();
|
||||
startCheckCompatibility();
|
||||
@@ -500,6 +515,9 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
|
||||
AdasManager.getInstance().setCarConfig(null);
|
||||
stopDispatchHandler();
|
||||
}
|
||||
if (adasConnectStatusListener != null) {
|
||||
adasConnectStatusListener.onConnectionIPCStatus(ipcConnectionStatus.get(), reason);
|
||||
}
|
||||
CupidLogUtils.i(TAG, "工控机连接状态 status=" + status + " reason=" + reason);
|
||||
}
|
||||
|
||||
@@ -620,11 +638,12 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
|
||||
* 自动驾驶设备基础信息应答
|
||||
*
|
||||
* @param sn SN
|
||||
* @param environment 1: 研发环境, 2:测试环境, 3:生产环境 4:演示环境
|
||||
* @param environment 环境 详情参见{@link Constants.ENVIRONMENT}1: 研发环境, 2:测试环境, 3:生产环境 4:演示环境
|
||||
* @param role 终端角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean sendBasicInfoResp(@NonNull String sn, int environment) {
|
||||
public boolean sendBasicInfoResp(@NonNull String sn, @Define.Environment int environment, @Define.TerminalRole int role) {
|
||||
if (sn == null) {
|
||||
sn = "";
|
||||
}
|
||||
@@ -632,6 +651,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
|
||||
.newBuilder()
|
||||
.setSn(sn)
|
||||
.setEnvironment(environment)
|
||||
.setRole(role)
|
||||
.build();
|
||||
return sendPBMessage(MessageType.TYPE_SEND_BASIC_INFO_RESP.typeCode, resp.toByteArray());
|
||||
}
|
||||
@@ -947,5 +967,118 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
|
||||
.build();
|
||||
return sendPBMessage(MessageType.TYPE_SEND_RECORD_DATA_CONFIG_REQ.typeCode, req.toByteArray());
|
||||
}
|
||||
|
||||
/**************************************注册接口相关*******************************************/
|
||||
@Override
|
||||
public boolean onSendSubscribe(byte[] bytes) {
|
||||
return sendPBMessage(MessageType.TYPE_SEND_SUBSCRIBE_DATA_REQ.typeCode, bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取已注册接口
|
||||
*/
|
||||
@Override
|
||||
public Set<MessageType> getSubscribedInterface() {
|
||||
return subscribeInterface == null ? null : subscribeInterface.getSubscribedInterface();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取未注册接口
|
||||
*/
|
||||
@Override
|
||||
public Set<MessageType> getUnsubscribedInterface() {
|
||||
return subscribeInterface == null ? null : subscribeInterface.getUnsubscribedInterface();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据参数查询是否已订阅
|
||||
*
|
||||
* @param messageType messageType
|
||||
* @return 是否已订阅
|
||||
*/
|
||||
@Override
|
||||
public boolean isSubscribedInterface(@NonNull MessageType messageType) {
|
||||
return subscribeInterface != null && subscribeInterface.isSubscribed(messageType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据参数查询是否未订阅
|
||||
*
|
||||
* @param messageType messageType
|
||||
* @return 是否未订阅
|
||||
*/
|
||||
@Override
|
||||
public boolean iUnsubscribedInterface(@NonNull MessageType messageType) {
|
||||
return subscribeInterface != null && subscribeInterface.isUnsubscribed(messageType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册或取消注册
|
||||
*
|
||||
* @param role 角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @param type 注册类型 详情参见{@link Constants.SUBSCRIBE_TYPE}
|
||||
* @param messageTypes 要操作的接口
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean subscribeInterface(@Define.TerminalRole int role, @Define.SubscribeType int type, @NonNull Set<MessageType> messageTypes) {
|
||||
return subscribeInterface != null && subscribeInterface.subscribeInterface(role, type, messageTypes);
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册或取消注册
|
||||
*
|
||||
* @param role 角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @param type 注册类型 详情参见{@link Constants.SUBSCRIBE_TYPE}
|
||||
* @param messageType 要操作的接口
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean subscribeInterface(@Define.TerminalRole int role, @Define.SubscribeType int type, @NonNull MessageType messageType) {
|
||||
return subscribeInterface != null && subscribeInterface.subscribeInterface(role, type, messageType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 福田清扫车业务指令下发
|
||||
*
|
||||
* @param fuTianTaskCmd 命令
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean sendRoboSweeperFuTianTaskCmd(SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd fuTianTaskCmd) {
|
||||
SpecialVehicleTaskCmdOuterClass.SpecialVehicleTaskCmd cmd = SpecialVehicleTaskCmdOuterClass.SpecialVehicleTaskCmd
|
||||
.newBuilder()
|
||||
.setRoboSweeperFutianTaskCmd(fuTianTaskCmd)
|
||||
.build();
|
||||
return sendSpecialVehicleTaskCmd(cmd);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开沃小巴业务指令下发
|
||||
*
|
||||
* @param vanSkywellTaskCmd 命令
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean sendRoboVanSkywellTaskCmd(SpecialVehicleTaskCmdOuterClass.RoboVanSkywellTaskCmd vanSkywellTaskCmd) {
|
||||
SpecialVehicleTaskCmdOuterClass.SpecialVehicleTaskCmd cmd = SpecialVehicleTaskCmdOuterClass.SpecialVehicleTaskCmd
|
||||
.newBuilder()
|
||||
.setRoboVanSkywellTaskCmd(vanSkywellTaskCmd)
|
||||
.build();
|
||||
return sendSpecialVehicleTaskCmd(cmd);
|
||||
}
|
||||
|
||||
/**
|
||||
* 特种车辆命令下发
|
||||
*
|
||||
* @param cmd 命令
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean sendSpecialVehicleTaskCmd(SpecialVehicleTaskCmdOuterClass.SpecialVehicleTaskCmd cmd) {
|
||||
return sendPBMessage(MessageType.TYPE_SEND_SPECIAL_VEHICLE_TASK_CMD.typeCode, cmd.toByteArray());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -7,10 +7,14 @@ import androidx.annotation.NonNull;
|
||||
import com.zhidao.support.adas.high.bean.VersionCompatibility;
|
||||
import com.zhidao.support.adas.high.common.AppPreferenceHelper;
|
||||
import com.zhidao.support.adas.high.common.Constants;
|
||||
import com.zhidao.support.adas.high.common.Define;
|
||||
import com.zhidao.support.adas.high.common.MessageType;
|
||||
import com.zhidao.support.adas.high.common.ReceiveTimeoutManager;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import chassis.SpecialVehicleTaskCmdOuterClass;
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
|
||||
/**
|
||||
@@ -262,12 +266,13 @@ public class AdasManager implements IAdasNetCommApi {
|
||||
* 自动驾驶设备基础信息应答
|
||||
*
|
||||
* @param sn SN
|
||||
* @param environment 1: 研发环境, 2:测试环境, 3:生产环境 4:演示环境
|
||||
* @return
|
||||
* @param environment 环境 详情参见{@link Constants.ENVIRONMENT}1: 研发环境, 2:测试环境, 3:生产环境 4:演示环境
|
||||
* @param role 终端角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean sendBasicInfoResp(@NonNull String sn, int environment) {
|
||||
return mChannel != null && mChannel.sendBasicInfoResp(sn, environment);
|
||||
public boolean sendBasicInfoResp(@NonNull String sn, @Define.Environment int environment, @Define.TerminalRole int role) {
|
||||
return mChannel != null && mChannel.sendBasicInfoResp(sn, environment, role);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -478,6 +483,103 @@ public class AdasManager implements IAdasNetCommApi {
|
||||
return mChannel != null && mChannel.sendRecordDataConfigReq();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取已注册接口
|
||||
*/
|
||||
@Override
|
||||
public Set<MessageType> getSubscribedInterface() {
|
||||
return mChannel == null ? null : mChannel.getSubscribedInterface();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取未注册接口
|
||||
*/
|
||||
@Override
|
||||
public Set<MessageType> getUnsubscribedInterface() {
|
||||
return mChannel == null ? null : mChannel.getUnsubscribedInterface();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据参数查询是否已订阅
|
||||
*
|
||||
* @param messageType messageType
|
||||
* @return 是否已订阅
|
||||
*/
|
||||
@Override
|
||||
public boolean isSubscribedInterface(@NonNull MessageType messageType) {
|
||||
return mChannel != null && mChannel.isSubscribedInterface(messageType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据参数查询是否未订阅
|
||||
*
|
||||
* @param messageType messageType
|
||||
* @return 是否未订阅
|
||||
*/
|
||||
@Override
|
||||
public boolean iUnsubscribedInterface(@NonNull MessageType messageType) {
|
||||
return mChannel != null && mChannel.iUnsubscribedInterface(messageType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册或取消注册
|
||||
*
|
||||
* @param role 角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @param type 注册类型 详情参见{@link Constants.SUBSCRIBE_TYPE}
|
||||
* @param messageTypes 要操作的接口
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean subscribeInterface(@Define.TerminalRole int role, @Define.SubscribeType int type, @NonNull Set<MessageType> messageTypes) {
|
||||
return mChannel != null && mChannel.subscribeInterface(role, type, messageTypes);
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册或取消注册
|
||||
*
|
||||
* @param role 角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @param type 注册类型 详情参见{@link Constants.SUBSCRIBE_TYPE}
|
||||
* @param messageType 要操作的接口
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean subscribeInterface(@Define.TerminalRole int role, @Define.SubscribeType int type, @NonNull MessageType messageType) {
|
||||
return mChannel != null && mChannel.subscribeInterface(role, type, messageType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 福田清扫车业务指令下发
|
||||
*
|
||||
* @param fuTianTaskCmd 命令
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean sendRoboSweeperFuTianTaskCmd(SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd fuTianTaskCmd) {
|
||||
return mChannel != null && mChannel.sendRoboSweeperFuTianTaskCmd(fuTianTaskCmd);
|
||||
}
|
||||
|
||||
/**
|
||||
* 开沃小巴业务指令下发
|
||||
*
|
||||
* @param vanSkywellTaskCmd 命令
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean sendRoboVanSkywellTaskCmd(SpecialVehicleTaskCmdOuterClass.RoboVanSkywellTaskCmd vanSkywellTaskCmd) {
|
||||
return mChannel != null && mChannel.sendRoboVanSkywellTaskCmd(vanSkywellTaskCmd);
|
||||
}
|
||||
|
||||
/**
|
||||
* 特种车辆命令下发
|
||||
*
|
||||
* @param cmd 命令
|
||||
* @return boolean
|
||||
*/
|
||||
@Override
|
||||
public boolean sendSpecialVehicleTaskCmd(SpecialVehicleTaskCmdOuterClass.SpecialVehicleTaskCmd cmd) {
|
||||
return mChannel != null && mChannel.sendSpecialVehicleTaskCmd(cmd);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取工控机固定IP列表
|
||||
*
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.zhidao.support.adas.high;
|
||||
|
||||
import com.zhidao.support.adas.high.subscribe.SubscribeInterfaceOptions;
|
||||
|
||||
import java.util.HashSet;
|
||||
|
||||
/**
|
||||
@@ -43,6 +45,11 @@ public class AdasOptions {
|
||||
*/
|
||||
private HashSet<String> ipcFixationIP;
|
||||
|
||||
/**
|
||||
* 订阅相关配置
|
||||
*/
|
||||
private SubscribeInterfaceOptions subscribeInterfaceOptions;
|
||||
|
||||
private AdasOptions() {
|
||||
}
|
||||
|
||||
@@ -72,6 +79,17 @@ public class AdasOptions {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置连接方式
|
||||
*
|
||||
* @param ipcConnectionMode
|
||||
* @return
|
||||
*/
|
||||
public Builder setIpcConnectionMode(int ipcConnectionMode) {
|
||||
options.ipcConnectionMode = ipcConnectionMode;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置IPC主机地址
|
||||
*
|
||||
@@ -96,13 +114,13 @@ public class AdasOptions {
|
||||
}
|
||||
|
||||
/**
|
||||
* 配置连接方式
|
||||
* 接口注册参数
|
||||
*
|
||||
* @param ipcConnectionMode
|
||||
* @param subscribeInterfaceOptions
|
||||
* @return
|
||||
*/
|
||||
public Builder setIpcConnectionMode(int ipcConnectionMode) {
|
||||
options.ipcConnectionMode = ipcConnectionMode;
|
||||
public Builder setSubscribeInterfaceOptions(SubscribeInterfaceOptions subscribeInterfaceOptions) {
|
||||
options.subscribeInterfaceOptions = subscribeInterfaceOptions;
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -122,6 +140,7 @@ public class AdasOptions {
|
||||
options.isClient = true;
|
||||
options.ipcAssignIP = null;
|
||||
options.ipcFixationIP = null;
|
||||
options.subscribeInterfaceOptions = null;
|
||||
return options;
|
||||
}
|
||||
|
||||
@@ -141,6 +160,10 @@ public class AdasOptions {
|
||||
return ipcFixationIP;
|
||||
}
|
||||
|
||||
public SubscribeInterfaceOptions getSubscribeInterfaceOptions() {
|
||||
return subscribeInterfaceOptions;
|
||||
}
|
||||
|
||||
public void setIpcAssignIP(String ipcAssignIP) {
|
||||
this.ipcAssignIP = ipcAssignIP;
|
||||
}
|
||||
@@ -156,4 +179,8 @@ public class AdasOptions {
|
||||
public void setIpcFixationIP(HashSet<String> ipcFixationIP) {
|
||||
this.ipcFixationIP = ipcFixationIP;
|
||||
}
|
||||
|
||||
public void setSubscribeInterfaceOptions(SubscribeInterfaceOptions subscribeInterfaceOptions) {
|
||||
this.subscribeInterfaceOptions = subscribeInterfaceOptions;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,12 @@ import androidx.annotation.NonNull;
|
||||
|
||||
import com.zhidao.support.adas.high.bean.VersionCompatibility;
|
||||
import com.zhidao.support.adas.high.common.Constants;
|
||||
import com.zhidao.support.adas.high.common.Define;
|
||||
import com.zhidao.support.adas.high.common.MessageType;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import chassis.SpecialVehicleTaskCmdOuterClass;
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
|
||||
/**
|
||||
@@ -57,10 +62,11 @@ public interface IAdasNetCommApi {
|
||||
* 自动驾驶设备基础信息应答
|
||||
*
|
||||
* @param sn SN
|
||||
* @param environment 1: 研发环境, 2:测试环境, 3:生产环境 4:演示环境
|
||||
* @return boolean
|
||||
* @param environment 环境 详情参见{@link Constants.ENVIRONMENT}1: 研发环境, 2:测试环境, 3:生产环境 4:演示环境
|
||||
* @param role 终端角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendBasicInfoResp(@NonNull String sn, int environment);
|
||||
boolean sendBasicInfoResp(@NonNull String sn, @Define.Environment int environment, @Define.TerminalRole int role);
|
||||
|
||||
/**
|
||||
* 设置自动驾驶模式 启动自动驾驶
|
||||
@@ -68,7 +74,7 @@ public interface IAdasNetCommApi {
|
||||
* @param mode 1: enter autopilot mode, 0: quit autopilot mode
|
||||
* @param source 命令来源: 0: pad模拟(模拟时routeInfo传null), 1: AICloud业务
|
||||
* @param routeInfo 自动驾驶路径信息
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendAutoPilotModeReq(int mode, int source, MessagePad.RouteInfo routeInfo);
|
||||
|
||||
@@ -76,14 +82,14 @@ public interface IAdasNetCommApi {
|
||||
* 设置演示模式
|
||||
*
|
||||
* @param enable 1: enable, 0: disable
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendDemoModeReq(int enable);
|
||||
|
||||
/**
|
||||
* 车机基础信息请求
|
||||
*
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendCarConfigReq();
|
||||
|
||||
@@ -94,7 +100,7 @@ public interface IAdasNetCommApi {
|
||||
* @param filename 文件路径
|
||||
* @param reasonID 接管原因id
|
||||
* @param reason 接管原因
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendRecordCause(long key, @NonNull String filename, @NonNull String reasonID, @NonNull String reason);
|
||||
|
||||
@@ -103,7 +109,7 @@ public interface IAdasNetCommApi {
|
||||
*
|
||||
* @param id
|
||||
* @param type
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean startRecordPackage(int id, int type);
|
||||
|
||||
@@ -112,7 +118,7 @@ public interface IAdasNetCommApi {
|
||||
*
|
||||
* @param id
|
||||
* @param type
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean startRecordPackage(int id, int duration, int type);
|
||||
|
||||
@@ -123,7 +129,7 @@ public interface IAdasNetCommApi {
|
||||
* @param duration
|
||||
* @param type
|
||||
* @param bduration
|
||||
* @return
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean startRecordPackage(int id, int duration, int type, int bduration);
|
||||
|
||||
@@ -132,7 +138,7 @@ public interface IAdasNetCommApi {
|
||||
*
|
||||
* @param id
|
||||
* @param type
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean stopRecordPackage(int id, int type);
|
||||
|
||||
@@ -144,7 +150,7 @@ public interface IAdasNetCommApi {
|
||||
* @param type 采集类型, 1:badcase, 2: map; 3: rests
|
||||
* @param isRecord 采集指令, true: 采集, false: 停止采集
|
||||
* @param bduration 前溯时长
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendRecordData(int id, int duration, int type, boolean isRecord, int bduration);
|
||||
|
||||
@@ -152,7 +158,7 @@ public interface IAdasNetCommApi {
|
||||
* 设置自动驾驶最大速度
|
||||
*
|
||||
* @param speedLimit 最大车辆速度 m/s
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendAutopilotSpeedReq(double speedLimit);
|
||||
|
||||
@@ -170,7 +176,7 @@ public interface IAdasNetCommApi {
|
||||
* @param flashYellow 黄灯总时间
|
||||
* @param laneDetail 灯态具体信息
|
||||
* @param timestamp 当前卫星时间, 单位: ms
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendTrafficLightData(@NonNull String crossID, double latitude, double longitude,
|
||||
@NonNull String heading, @NonNull String direction, int lightId, int laneNo,
|
||||
@@ -179,7 +185,7 @@ public interface IAdasNetCommApi {
|
||||
/**
|
||||
* 自动驾驶路径请求
|
||||
*
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendGlobalPathReq();
|
||||
|
||||
@@ -189,7 +195,7 @@ public interface IAdasNetCommApi {
|
||||
* @param type SystemCmdType。SYSTEMCMD_REBOOT 重启所有节点
|
||||
* SystemCmdType。SYSTEMCMD_EMPLOY_NEW_IMAGE 使用新镜像(推镜像)
|
||||
* SystemCmdType。SYSTEMCMD_SHUT_DOWN 关机
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendSystemCmdReq(@NonNull MessagePad.SystemCmdType type);
|
||||
|
||||
@@ -197,14 +203,14 @@ public interface IAdasNetCommApi {
|
||||
* 发送 轨迹下载请求
|
||||
*
|
||||
* @param line 线路相关参数详情见PB message_pad.proto -> Line
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendTrajectoryDownloadReq(MessagePad.Line line);
|
||||
|
||||
/**
|
||||
* 发送 状态查询请求
|
||||
*
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendStatusQueryReq();
|
||||
|
||||
@@ -212,7 +218,7 @@ public interface IAdasNetCommApi {
|
||||
* 设置雨天模式
|
||||
*
|
||||
* @param enable 1: enable, 0: disable
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendRainModeReq(int enable);
|
||||
|
||||
@@ -220,10 +226,80 @@ public interface IAdasNetCommApi {
|
||||
* 数据采集配置查询
|
||||
* 0: all, 其他保留
|
||||
*
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendRecordDataConfigReq();
|
||||
|
||||
/**
|
||||
* 获取已注册接口
|
||||
*/
|
||||
Set<MessageType> getSubscribedInterface();
|
||||
|
||||
/**
|
||||
* 获取未注册接口
|
||||
*/
|
||||
Set<MessageType> getUnsubscribedInterface();
|
||||
|
||||
/**
|
||||
* 根据参数查询是否已订阅
|
||||
*
|
||||
* @param messageType messageType
|
||||
* @return 是否已订阅
|
||||
*/
|
||||
boolean isSubscribedInterface(@NonNull MessageType messageType);
|
||||
|
||||
/**
|
||||
* 根据参数查询是否未订阅
|
||||
*
|
||||
* @param messageType messageType
|
||||
* @return 是否未订阅
|
||||
*/
|
||||
boolean iUnsubscribedInterface(@NonNull MessageType messageType);
|
||||
|
||||
/**
|
||||
* 注册或取消注册
|
||||
*
|
||||
* @param role 角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @param type 注册类型 详情参见{@link Constants.SUBSCRIBE_TYPE}
|
||||
* @param messageTypes 要操作的接口
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean subscribeInterface(@Define.TerminalRole int role, @Define.SubscribeType int type, @NonNull Set<MessageType> messageTypes);
|
||||
|
||||
/**
|
||||
* 注册或取消注册
|
||||
*
|
||||
* @param role 角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @param type 注册类型 详情参见{@link Constants.SUBSCRIBE_TYPE}
|
||||
* @param messageType 要操作的接口
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean subscribeInterface(@Define.TerminalRole int role, @Define.SubscribeType int type, @NonNull MessageType messageType);
|
||||
|
||||
/**
|
||||
* 福田清扫车业务指令下发
|
||||
*
|
||||
* @param fuTianTaskCmd 命令
|
||||
* @return boolean
|
||||
*/
|
||||
boolean sendRoboSweeperFuTianTaskCmd(SpecialVehicleTaskCmdOuterClass.RoboSweeperFuTianTaskCmd fuTianTaskCmd);
|
||||
|
||||
/**
|
||||
* 开沃小巴业务指令下发
|
||||
*
|
||||
* @param vanSkywellTaskCmd 命令
|
||||
* @return boolean
|
||||
*/
|
||||
boolean sendRoboVanSkywellTaskCmd(SpecialVehicleTaskCmdOuterClass.RoboVanSkywellTaskCmd vanSkywellTaskCmd);
|
||||
|
||||
/**
|
||||
* 特种车辆命令下发
|
||||
*
|
||||
* @param cmd 命令
|
||||
* @return boolean
|
||||
*/
|
||||
boolean sendSpecialVehicleTaskCmd(SpecialVehicleTaskCmdOuterClass.SpecialVehicleTaskCmd cmd);
|
||||
|
||||
// TODO 需求暂停 待讨论
|
||||
// boolean getRoutes();
|
||||
|
||||
@@ -231,7 +307,7 @@ public interface IAdasNetCommApi {
|
||||
* 向工控机发送数据
|
||||
*
|
||||
* @param bytes 数据
|
||||
* @return boolean
|
||||
* @return 加入WS发送消息队列是否成功
|
||||
*/
|
||||
boolean sendWsMessage(byte[] bytes);
|
||||
|
||||
|
||||
@@ -170,6 +170,14 @@ public interface OnAdasListener {
|
||||
*/
|
||||
void onRecordDataConfigResp(MessagePad.Header header, MessagePad.RecordDataConfig config);
|
||||
|
||||
/**
|
||||
* planning决策状态, 透传
|
||||
*
|
||||
* @param header 头
|
||||
* @param planningActionMsg 数据
|
||||
*/
|
||||
void onPlanningActionMsg(MessagePad.Header header, MessagePad.PlanningActionMsg planningActionMsg);
|
||||
|
||||
/**
|
||||
* 数据错误
|
||||
*
|
||||
|
||||
@@ -54,4 +54,60 @@ public class Constants {
|
||||
*/
|
||||
int NOT_FOUND_ADDRESS = 0x04;
|
||||
}
|
||||
|
||||
/**
|
||||
* 终端角色类型
|
||||
*/
|
||||
public interface TERMINAL_ROLE {
|
||||
/**
|
||||
* 司机端
|
||||
*/
|
||||
int DRIVER = 0;
|
||||
/**
|
||||
* 乘客端
|
||||
*/
|
||||
int PASSENGER = 1;
|
||||
/**
|
||||
* 调试端
|
||||
*/
|
||||
int DEBUG = 2;
|
||||
}
|
||||
|
||||
/**
|
||||
* 环境
|
||||
*/
|
||||
public interface ENVIRONMENT {
|
||||
/**
|
||||
* 研发
|
||||
*/
|
||||
int DEVELOP = 1;
|
||||
/**
|
||||
* 测试
|
||||
*/
|
||||
int TEST = 2;
|
||||
/**
|
||||
* 生产
|
||||
*/
|
||||
int PRODUCTION = 3;
|
||||
/**
|
||||
* 演示
|
||||
*/
|
||||
int DEMO = 4;
|
||||
}
|
||||
|
||||
/**
|
||||
* 接口订阅类型
|
||||
*/
|
||||
public interface SUBSCRIBE_TYPE {
|
||||
/**
|
||||
* 订阅
|
||||
*/
|
||||
int SUBSCRIBE = 1;
|
||||
/**
|
||||
* 取消订阅
|
||||
*/
|
||||
int UNSUBSCRIBE = 2;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,4 +25,25 @@ public final class Define {
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface VersionCompatibilityDegree {
|
||||
}
|
||||
|
||||
@IntDef(flag = true, value = {Constants.TERMINAL_ROLE.DRIVER,
|
||||
Constants.TERMINAL_ROLE.PASSENGER,
|
||||
Constants.TERMINAL_ROLE.DEBUG})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface TerminalRole {
|
||||
}
|
||||
|
||||
@IntDef(flag = true, value = {Constants.ENVIRONMENT.DEVELOP,
|
||||
Constants.ENVIRONMENT.TEST,
|
||||
Constants.ENVIRONMENT.PRODUCTION,
|
||||
Constants.ENVIRONMENT.DEMO})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface Environment {
|
||||
}
|
||||
|
||||
@IntDef(flag = true, value = {Constants.SUBSCRIBE_TYPE.SUBSCRIBE,
|
||||
Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface SubscribeType {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import mogo.telematics.pad.MessagePad;
|
||||
|
||||
/**
|
||||
* 工控机发送或接收的类型
|
||||
* 工控机接收接口必须包含TYPE_RECEIVE
|
||||
*
|
||||
* @author nie yunlong
|
||||
* @description 请求值
|
||||
@@ -45,7 +46,12 @@ public enum MessageType {
|
||||
TYPE_RECEIVE_STATUS_QUERY_RESP(MessagePad.MessageType.MsgTypeStatusQueryResp, "状态查询应答"),
|
||||
TYPE_SEND_SET_RAIN_MODE_REQ(MessagePad.MessageType.MsgTypeSetRainModeReq, "设置雨天模式"),
|
||||
TYPE_SEND_RECORD_DATA_CONFIG_REQ(MessagePad.MessageType.MsgTypeRecordDataConfigReq, "数据采集配置查询"),
|
||||
TYPE_RECEIVE_RECORD_DATA_CONFIG_RESP(MessagePad.MessageType.MsgTypeRecordDataConfigResp, "数据采集配置");
|
||||
TYPE_RECEIVE_RECORD_DATA_CONFIG_RESP(MessagePad.MessageType.MsgTypeRecordDataConfigResp, "数据采集配置"),
|
||||
TYPE_SEND_SUBSCRIBE_DATA_REQ(MessagePad.MessageType.MsgTypeSubscribeDataReq, "数据订阅、取消订阅请求"),
|
||||
TYPE_SEND_SPECIAL_VEHICLE_TASK_CMD(MessagePad.MessageType.MsgTypeSpecialVehicleTaskCmd, "特种车辆命令"),
|
||||
//透传 原始pb文件中不存在以下type。由于Java中无法强转所以在ADAS_DATA message_pad.proto中放开注释
|
||||
TYPE_RECEIVE_PLANNING_DECISION_STATE(MessagePad.MessageType.MsgTypePlanningDecisionState, "Planning决策状态");
|
||||
|
||||
|
||||
/**
|
||||
* 消息action code
|
||||
|
||||
@@ -29,6 +29,7 @@ public class MyMessageFactory implements IMyMessageFactory {
|
||||
private IMsg arrivalNotificationMessage;//到站提醒
|
||||
private IMsg statusQueryRespMessage;//状态查询应答
|
||||
private IMsg recordDataConfigRespMessage;//数据采集配置应答
|
||||
private IMsg planningDecisionStateMessage;//planning决策状态
|
||||
|
||||
|
||||
@Override
|
||||
@@ -135,6 +136,12 @@ public class MyMessageFactory implements IMyMessageFactory {
|
||||
recordDataConfigRespMessage = new RecordDataConfigRespMessage();
|
||||
}
|
||||
return recordDataConfigRespMessage;
|
||||
} else if (messageType == MessageType.TYPE_RECEIVE_PLANNING_DECISION_STATE.typeCode) {
|
||||
//planning决策状态
|
||||
if (planningDecisionStateMessage == null) {
|
||||
planningDecisionStateMessage = new PlanningDecisionStateMessage();
|
||||
}
|
||||
return planningDecisionStateMessage;
|
||||
} else {
|
||||
//MessageType.TYPE_DEFAULT.typeCode
|
||||
return null;
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.zhidao.support.adas.high.msg;
|
||||
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import com.zhidao.support.adas.high.AdasManager;
|
||||
import com.zhidao.support.adas.high.OnAdasListener;
|
||||
import com.zhidao.support.adas.high.common.CupidLogUtils;
|
||||
import com.zhidao.support.adas.high.protocol.RawData;
|
||||
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
|
||||
/**
|
||||
* planning决策状态, 透传
|
||||
*/
|
||||
public class PlanningDecisionStateMessage extends MyAbstractMessageHandler {
|
||||
|
||||
@Override
|
||||
public void handlerMsg(RawData raw, OnAdasListener adasListener) throws InvalidProtocolBufferException {
|
||||
MessagePad.PlanningActionMsg planningActionMsg = MessagePad.PlanningActionMsg.parser().parseFrom(raw.originalData.toByteArray(), raw.getOffsetValue(), raw.getPackageLengthValue() - raw.getOffsetValue());
|
||||
if (adasListener != null) {
|
||||
adasListener.onPlanningActionMsg(raw.getHeader(), planningActionMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
package com.zhidao.support.adas.high.subscribe;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.zhidao.support.adas.high.common.Constants;
|
||||
import com.zhidao.support.adas.high.common.Define;
|
||||
import com.zhidao.support.adas.high.common.MessageType;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import mogo.telematics.pad.MessagePad;
|
||||
|
||||
/**
|
||||
* 工控机注册接口
|
||||
* Taxi(红旗、东风) MAP260上线
|
||||
* Bus 预计MAP260上线
|
||||
*/
|
||||
public class SubscribeInterface {
|
||||
|
||||
/**
|
||||
* 已注册接口
|
||||
*/
|
||||
private final Map<MessageType, Integer> subscribedInterface = new HashMap<>();
|
||||
/**
|
||||
* 未注册接口
|
||||
*/
|
||||
private final Map<MessageType, Integer> unsubscribedInterface = new HashMap<>();
|
||||
|
||||
private final OnSubscribeInterfaceListener listener;
|
||||
|
||||
public interface OnSubscribeInterfaceListener {
|
||||
boolean onSendSubscribe(byte[] bytes);
|
||||
}
|
||||
|
||||
public SubscribeInterface(@NonNull OnSubscribeInterfaceListener listener) {
|
||||
this.listener = listener;
|
||||
if (listener == null) throw new RuntimeException();
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取已注册接口
|
||||
*/
|
||||
public Set<MessageType> getSubscribedInterface() {
|
||||
return subscribedInterface.keySet();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取未注册接口
|
||||
*/
|
||||
public Set<MessageType> getUnsubscribedInterface() {
|
||||
return unsubscribedInterface.keySet();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 注册或取消注册
|
||||
*
|
||||
* @param role 角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @param type 注册类型 详情参见{@link Constants.SUBSCRIBE_TYPE}
|
||||
* @param messageTypes 要操作的接口
|
||||
* @return
|
||||
*/
|
||||
public boolean subscribeInterface(@Define.TerminalRole int role, @Define.SubscribeType int type, @NonNull Set<MessageType> messageTypes) {
|
||||
if (messageTypes == null) return false;
|
||||
MessagePad.SubscribeDataReq.Builder builder = MessagePad.SubscribeDataReq.newBuilder();
|
||||
builder.setRole(role).setReqType(type);
|
||||
Map<MessageType, Integer> temp = new HashMap<>();
|
||||
for (MessageType messageType : messageTypes) {
|
||||
temp.put(messageType, messageType.typeCode.getNumber());
|
||||
}
|
||||
builder.addAllDataTypes(temp.values());
|
||||
boolean isSendSucceed = listener.onSendSubscribe(builder.build().toByteArray());
|
||||
if (isSendSucceed) {
|
||||
for (MessageType messageType : messageTypes) {
|
||||
if (type == Constants.SUBSCRIBE_TYPE.SUBSCRIBE) {
|
||||
if (!subscribedInterface.containsKey(messageType)) {
|
||||
subscribedInterface.put(messageType, messageType.typeCode.getNumber());
|
||||
}
|
||||
unsubscribedInterface.remove(messageType);
|
||||
} else if (type == Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE) {
|
||||
if (!unsubscribedInterface.containsKey(messageType)) {
|
||||
unsubscribedInterface.put(messageType, messageType.typeCode.getNumber());
|
||||
}
|
||||
subscribedInterface.remove(messageType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册或取消注册
|
||||
*
|
||||
* @param role 角色 详情参见{@link Constants.TERMINAL_ROLE}
|
||||
* @param type 注册类型 详情参见{@link Constants.SUBSCRIBE_TYPE}
|
||||
* @param messageType 要操作的接口
|
||||
* @return 是否加入ws发送队列
|
||||
*/
|
||||
public boolean subscribeInterface(@Define.TerminalRole int role, @Define.SubscribeType int type, @NonNull MessageType messageType) {
|
||||
if (messageType == null) return false;
|
||||
MessagePad.SubscribeDataReq.Builder builder = MessagePad.SubscribeDataReq.newBuilder();
|
||||
builder.setRole(role).setReqType(type).addDataTypes(messageType.typeCode.getNumber());
|
||||
boolean isSendSucceed = listener.onSendSubscribe(builder.build().toByteArray());
|
||||
if (isSendSucceed) {
|
||||
if (type == Constants.SUBSCRIBE_TYPE.SUBSCRIBE) {
|
||||
if (!subscribedInterface.containsKey(messageType)) {
|
||||
subscribedInterface.put(messageType, messageType.typeCode.getNumber());
|
||||
}
|
||||
unsubscribedInterface.remove(messageType);
|
||||
} else if (type == Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE) {
|
||||
if (!unsubscribedInterface.containsKey(messageType)) {
|
||||
unsubscribedInterface.put(messageType, messageType.typeCode.getNumber());
|
||||
}
|
||||
subscribedInterface.remove(messageType);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//根据参数查询是否已订阅
|
||||
public boolean isSubscribed(@NonNull MessageType messageType) {
|
||||
return subscribedInterface.containsKey(messageType);
|
||||
}
|
||||
|
||||
//根据参数查询是否未订阅
|
||||
public boolean isUnsubscribed(@NonNull MessageType messageType) {
|
||||
return unsubscribedInterface.containsKey(messageType);
|
||||
}
|
||||
|
||||
private void init() {
|
||||
//默认RECEIVE的全部注册
|
||||
MessageType[] types = MessageType.values();
|
||||
if (types.length > 0) {
|
||||
for (MessageType messageType : types) {
|
||||
if (messageType.name().toLowerCase().contains("type_receive")) {
|
||||
subscribedInterface.put(messageType, messageType.typeCode.getNumber());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
package com.zhidao.support.adas.high.subscribe;
|
||||
|
||||
import com.zhidao.support.adas.high.common.Constants;
|
||||
import com.zhidao.support.adas.high.common.Define;
|
||||
import com.zhidao.support.adas.high.common.MessageType;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 订阅参数
|
||||
*/
|
||||
public class SubscribeInterfaceOptions {
|
||||
@Define.TerminalRole
|
||||
private int role = Constants.TERMINAL_ROLE.DRIVER;
|
||||
@Define.SubscribeType
|
||||
private int type = Constants.SUBSCRIBE_TYPE.UNSUBSCRIBE;
|
||||
private Set<MessageType> messageTypes;
|
||||
|
||||
private SubscribeInterfaceOptions() {
|
||||
}
|
||||
|
||||
public int getRole() {
|
||||
return role;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public Set<MessageType> getMessageTypes() {
|
||||
return messageTypes;
|
||||
}
|
||||
|
||||
public static Builder newBuilder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
@Define.TerminalRole
|
||||
private int role;
|
||||
@Define.SubscribeType
|
||||
private int type;
|
||||
private Set<MessageType> messageTypes;
|
||||
|
||||
private Builder() {
|
||||
}
|
||||
|
||||
public Builder setRole(@Define.TerminalRole int role) {
|
||||
this.role = role;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setType(@Define.SubscribeType int type) {
|
||||
this.type = type;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setMessageTypes(Set<MessageType> messageTypes) {
|
||||
this.messageTypes = messageTypes;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SubscribeInterfaceOptions build() {
|
||||
SubscribeInterfaceOptions options = new SubscribeInterfaceOptions();
|
||||
options.role = role;
|
||||
options.type = type;
|
||||
options.messageTypes = messageTypes;
|
||||
return options;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user