[change]添加乘客屏发送自动驾驶命令转发到司机屏,司机屏发送到工控机

This commit is contained in:
xinfengkun
2022-06-17 17:08:14 +08:00
parent 78637a6a62
commit 88583b71a3
8 changed files with 137 additions and 61 deletions

View File

@@ -84,6 +84,7 @@ import com.zhidao.support.adas.high.OnAdasConnectStatusListener;
import com.zhidao.support.adas.high.OnAdasListener;
import com.zhidao.support.adas.high.OnMultiDeviceListener;
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.ProtocolStatus;
@@ -884,7 +885,7 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
@Override
public void onMessageResponseClient(MogoProtocolMsg msg, String sign, Channel channel) {
Log.i("ddd", "dddd" + sign);
Log.i(TAG, "司机端连接成功=" + sign);
AdasManager.getInstance().decoderRaw(msg.getBody());
}
@@ -892,8 +893,10 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
public void onClientStatusConnectChanged(int statusCode, String sign, Channel channel) {
if (statusCode == ConnectState.STATUS_CONNECT_SUCCESS) {
connectStatus = IPC_CONNECTION_STATUS.CONNECTED;
AdasManager.getInstance().startDispatchHandler();
} else {
connectStatus = IPC_CONNECTION_STATUS.DISCONNECTED;
AdasManager.getInstance().stopDispatchHandler();
}
getHandler().sendEmptyMessage(WHAT_DRIVER_IP);
onUpdateConnectStateView();
@@ -915,6 +918,8 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
NSDNettyManager.getInstance().startNSDNettyServerWithSN(this, new NettyServerListener<MogoProtocolMsg>() {
@Override
public void onMessageResponseServer(MogoProtocolMsg msg, Channel channel) {
AdasManager.getInstance().sendWsMessage(msg.getBody());
}
@Override
@@ -937,32 +942,27 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
Log.i(TAG, "onChannelDisConnect channel=" + channel.id());
}
}, "1234567");
}
AdasManager.getInstance().create(options, this);
AdasManager.getInstance().setOnAdasListener(this);
if (BuildConfig.IS_CLIENT) {
/*—————————————作为乘客端———————————*/
} else {
/*—————————————作为司機端———————————*/
AdasManager.getInstance().setOnMultiDeviceListener(new OnMultiDeviceListener() {
@Override
public void onForwardingIPCMessage(byte[] bytes) {
// 发送数据给乘客端
if (NSDNettyManager.getInstance().isServerStart()) {
NSDNettyManager.getInstance().sendMsgToAllClients(new MogoProtocolMsg(NORMAL_DATA, bytes.length, bytes));
} else {
AdasManager.getInstance().setOnMultiDeviceListener(new OnMultiDeviceListener() {
@Override
public void onForwardingDriverIPCMessage(byte[] bytes) {
// 发送数据给乘客端
if (NSDNettyManager.getInstance().isServerStart()) {
NSDNettyManager.getInstance().sendMsgToAllClients(new MogoProtocolMsg(NORMAL_DATA, bytes.length, bytes));
} else {
// Log.d("dddd", "司机端Server未启动");
}
}
});
}
}
@Override
public void onForwardingPassengerIPCMessage(byte[] bytes) {
NSDNettyManager.getInstance()
.sendMogoProtocolMsgToServer(new MogoProtocolMsg(NORMAL_DATA, bytes.length, bytes), null);
Log.i(TAG, "乘客屏发送数据=" + ByteUtil.byteArrToHex(bytes));
}
});
}
@@ -1059,7 +1059,11 @@ public class MainActivity extends BaseActivity implements OnAdasListener, OnAdas
@Override
public void onItemClick(int position, String data) {
if (connectStatus != IPC_CONNECTION_STATUS.CONNECTED) {
showToastCenter("IPC 未连接");
String msg = "未连接工控机";
if (BuildConfig.IS_CLIENT) {
msg = "未连接司机端";
}
showToastCenter(msg);
return;
}
switch (data) {

View File

@@ -47,6 +47,7 @@ import com.mogo.telematic.server.netty.NettyServerListener
import com.mogo.telematic.server.netty.NettyTcpServer
import com.zhidao.support.adas.high.AdasManager
import com.zhidao.support.adas.high.AdasOptions
import com.zhidao.support.adas.high.OnMultiDeviceListener
import com.zhidao.support.adas.high.common.Constants
import com.zhidao.support.adas.high.common.Constants.IPC_CONNECTION_STATUS
import com.zhidao.support.adas.high.common.CupidLogUtils
@@ -155,9 +156,14 @@ class MoGoAutopilotProvider :
// 监听ADAS-SDK获取到的工控机数据(乘客也需注册)
AdasManager.getInstance().setOnAdasListener(MoGoAdasListenerImpl())
// 司机端监听
if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
AdasManager.getInstance().setOnMultiDeviceListener { bytes ->
// 乘客屏监听工控机基础信息回调
if (!AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) {
CallerAutopilotCarConfigListenerManager.addListener(TAG, this)
}
AdasManager.getInstance().setOnMultiDeviceListener(object : OnMultiDeviceListener {
override fun onForwardingDriverIPCMessage(bytes: ByteArray?) {
if (bytes == null)
return
// 发送数据给乘客端
if (NSDNettyManager.getInstance().isServerStart) {
msgHandler.synWriteTime()
@@ -167,9 +173,19 @@ class MoGoAutopilotProvider :
CallerLogger.d("$M_ADAS_IMPL$TAG", "司机端Server未启动")
}
}
} else {// 乘客屏监听工控机基础信息回调
CallerAutopilotCarConfigListenerManager.addListener(TAG, this)
}
override fun onForwardingPassengerIPCMessage(bytes: ByteArray?) {
if (bytes == null)
return
NSDNettyManager.getInstance()
.sendMogoProtocolMsgToServer(
MogoProtocolMsg(NORMAL_DATA, bytes.size, bytes),
null
)
}
});
CallerLogger.i("$M_ADAS_IMPL$TAG", "initServer……")
// 同步数据给工控机的服务
@@ -230,7 +246,8 @@ class MoGoAutopilotProvider :
override fun startAutoPilot(controlParameters: AutopilotControlParameters) {
if (AdasManager.getInstance().ipcConnectionStatus == IPC_CONNECTION_STATUS.CONNECTED) {
val invokeResult = AdasManager.getInstance().sendAutoPilotModeReq(1, 1, controlParameters.toRouteInfo())
val invokeResult = AdasManager.getInstance()
.sendAutoPilotModeReq(1, 1, controlParameters.toRouteInfo())
invokeAutoPilotResult(if (invokeResult) "自动驾驶调用成功" else "自动驾驶调用失败, socket 或者 rawPack 可能为空")
} else {
invokeAutoPilotResult("车机与工控机链接失败,无法开启自动驾驶")
@@ -364,9 +381,9 @@ class MoGoAutopilotProvider :
* isEnable = false 关闭
*/
override fun setRainMode(isEnable: Boolean) {
if(isEnable){
if (isEnable) {
AdasManager.getInstance().sendRainModeReq(1)
}else{
} else {
AdasManager.getInstance().sendRainModeReq(0)
}
}
@@ -464,7 +481,8 @@ class MoGoAutopilotProvider :
// 乘客屏才监听
AppConfigInfo.plateNumber = carConfigResp.plateNumber
Log.d("liyz", "onAutopilotCarConfig 乘客屏Mac地址为 = ${carConfigResp.macAddress}")
CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn)
CallerBindingcarManager.getBindingcarProvider()
.getBindingcarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn)
invokeNettyConnResult("乘客屏车牌号:${carConfigResp.plateNumber},Mac地址为${carConfigResp.macAddress}")
}

View File

@@ -17,7 +17,6 @@ import com.mogo.telematic.MogoProtocolMsg
import com.mogo.telematic.NSDNettyManager
import com.mogo.telematic.client.status.ConnectState
import com.zhidao.support.adas.high.AdasManager
import com.zhidao.support.adas.high.chain.AdasChain
import com.zhjt.service.chain.ChainLog
import com.zhjt.service.chain.TracingConstants
import io.netty.channel.Channel
@@ -59,9 +58,16 @@ class TeleMsgHandler : IMsgHandler {
val carConfig = MessagePad.CarConfigResp.parseFrom(msg.body)
AppConfigInfo.plateNumber = carConfig.plateNumber
AppConfigInfo.iPCMacAddress = carConfig.macAddress
invokeNettyConnResult("司机屏发送给乘客屏配置信息为:${TextFormat.printer().escapingNonAscii(false).printToString(carConfig)}")
invokeNettyConnResult(
"司机屏发送给乘客屏配置信息为:${
TextFormat.printer().escapingNonAscii(false).printToString(carConfig)
}"
)
Log.d("liyz", "TeleMsgHandler macAddress = " + carConfig.macAddress)
CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(carConfig.macAddress, MoGoAiCloudClientConfig.getInstance().sn)
CallerBindingcarManager.getBindingcarProvider().getBindingcarInfo(
carConfig.macAddress,
MoGoAiCloudClientConfig.getInstance().sn
)
}
else -> {
}
@@ -89,6 +95,10 @@ class TeleMsgHandler : IMsgHandler {
queryCarConfig()
}
}
//乘客端发送过来的工控机数据交给司机端adas转发到工控机
MogoProtocolMsg.NORMAL_DATA -> {
AdasManager.getInstance().sendWsMessage(it.body)
}
else -> {
}
}

View File

@@ -227,24 +227,39 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
* @param data 数据
* @return boolean
*/
private boolean sendWsMessage(MessagePad.MessageType msgType, byte[] data) {
if (mSocket != null && rawPack != null) {
ByteString byteString = rawPack.pack(msgType, data);
if (byteString != null) {
return mSocket.sendDataWebSocket(byteString);
private boolean sendPBMessage(MessagePad.MessageType msgType, byte[] data) {
if (rawPack != null) {
byte[] bytes = rawPack.pack(msgType, data);
//司机屏工控机数据转发
if (adasOptions.isClient()) {
if (onMultiDeviceListener != null)
onMultiDeviceListener.onForwardingPassengerIPCMessage(bytes);
return true;
} else {
return sendWsMessage(bytes);
}
}
return false;
}
@Override
public boolean sendWsMessage(byte[] bytes) {
if (mSocket == null || bytes == null || bytes.length <= 0) {
return false;
}
ByteString byteString = ByteString.of(bytes);
return mSocket.sendDataWebSocket(byteString);
}
/**
* 解析工控机发送过来PB的数据
* 乘客屏数据解析
*
* @param bytes 数据
*/
@Override
public void decoderRaw(byte[] bytes) {
if (bytes == null || bytes.length == 0) {
if (bytes == null || bytes.length <= 0) {
return;
}
ByteString byteString = ByteString.of(bytes);
@@ -396,9 +411,9 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
@Override
public void onMessage(ByteString bytes) throws InvalidProtocolBufferException {
decoderRaw(bytes);
//乘客屏数据
//司机屏工控机数据
if (!adasOptions.isClient() && onMultiDeviceListener != null) {
onMultiDeviceListener.onForwardingIPCMessage(bytes.toByteArray());
onMultiDeviceListener.onForwardingDriverIPCMessage(bytes.toByteArray());
}
}
@@ -621,7 +636,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
.setSn(sn)
.setEnvironment(environment)
.build();
return sendWsMessage(MessageType.TYPE_SEND_BASIC_INFO_RESP.typeCode, resp.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_BASIC_INFO_RESP.typeCode, resp.toByteArray());
}
/**
@@ -648,7 +663,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
if (routeInfo != null)
builder.setRouteInfo(routeInfo);
MessagePad.SetAutopilotModeReq req = builder.build();
return sendWsMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_MODE_REQ.typeCode, req.toByteArray());
}
/**
@@ -663,7 +678,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
.newBuilder()
.setEnable(enable)
.build();
return sendWsMessage(MessageType.TYPE_SEND_SET_DEMO_MODE_REQ.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_SET_DEMO_MODE_REQ.typeCode, req.toByteArray());
}
/**
@@ -676,7 +691,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
MessagePad.CarConfigReq req = MessagePad.CarConfigReq
.newBuilder()
.build();
return sendWsMessage(MessageType.TYPE_SEND_CAR_CONFIG_REQ.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_CAR_CONFIG_REQ.typeCode, req.toByteArray());
}
/**
@@ -706,7 +721,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
.setReason(reason)
.setReasonID(reasonID)
.build();
return sendWsMessage(MessageType.TYPE_SEND_RECORD_CAUSE.typeCode, resp.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_RECORD_CAUSE.typeCode, resp.toByteArray());
}
@Override
@@ -752,7 +767,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
.setIsRecord(isRecord)
.setSustain(sustain)
.build();
return sendWsMessage(MessageType.TYPE_SEND_RECORD_DATA.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_RECORD_DATA.typeCode, req.toByteArray());
}
/**
@@ -767,7 +782,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
.newBuilder()
.setSpeedLimit(speedLimit)
.build();
return sendWsMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_SPEED_REQ.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_SET_AUTOPILOT_SPEED_REQ.typeCode, req.toByteArray());
}
/**
@@ -788,7 +803,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
MessagePad.GlobalPathReq req = MessagePad.GlobalPathReq
.newBuilder()
.build();
return sendWsMessage(MessageType.TYPE_SEND_GLOBAL_PATH_REQ.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_GLOBAL_PATH_REQ.typeCode, req.toByteArray());
}
/**
@@ -834,7 +849,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
builder.setLaneDetail(laneDetail);
builder.setTimestamp(timestamp);
MessagePad.TrafficLightData req = builder.build();
return sendWsMessage(MessageType.TYPE_SEND_TRAFFIC_LIGHT_DATA.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_TRAFFIC_LIGHT_DATA.typeCode, req.toByteArray());
}
/**
@@ -858,7 +873,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
MessagePad.SystemCmdReq.Builder builder = MessagePad.SystemCmdReq.newBuilder();
builder.setCmdType(type);
MessagePad.SystemCmdReq req = builder.build();
return sendWsMessage(MessageType.TYPE_SEND_SYSTEM_CMD_REQ.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_SYSTEM_CMD_REQ.typeCode, req.toByteArray());
}
/**
@@ -872,7 +887,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
MessagePad.TrajectoryDownloadReq.Builder builder = MessagePad.TrajectoryDownloadReq.newBuilder();
builder.setLine(line);
MessagePad.TrajectoryDownloadReq req = builder.build();
return sendWsMessage(MessageType.TYPE_SEND_TRAJECTORY_DOWNLOAD_REQ.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_TRAJECTORY_DOWNLOAD_REQ.typeCode, req.toByteArray());
}
/**
@@ -885,7 +900,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
MessagePad.StatusQueryReq req = MessagePad.StatusQueryReq
.newBuilder()
.build();
return sendWsMessage(MessageType.TYPE_SEND_STATUS_QUERY_REQ.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_STATUS_QUERY_REQ.typeCode, req.toByteArray());
}
@@ -901,7 +916,7 @@ public class AdasChannel implements IAdasNetCommApi, FpgaSocket.IWebSocketConnec
.newBuilder()
.setEnable(enable)
.build();
return sendWsMessage(MessageType.TYPE_SEND_SET_RAIN_MODE_REQ.typeCode, req.toByteArray());
return sendPBMessage(MessageType.TYPE_SEND_SET_RAIN_MODE_REQ.typeCode, req.toByteArray());
}
}

View File

@@ -187,6 +187,20 @@ public class AdasManager implements IAdasNetCommApi {
return null;
}
/**
* 向工控机发送数据
*
* @param bytes 数据
* @return boolean
*/
@Override
public boolean sendWsMessage(byte[] bytes) {
if (mChannel != null) {
return mChannel.sendWsMessage(bytes);
}
return false;
}
/**
* 解析工控机发送过来的数据
* 多设备时使用

View File

@@ -206,6 +206,14 @@ public interface IAdasNetCommApi {
// TODO 需求暂停 待讨论
// boolean getRoutes();
/**
* 向工控机发送数据
*
* @param bytes 数据
* @return boolean
*/
boolean sendWsMessage(byte[] bytes);
/**
* 解析工控机发送过来的数据
* 多设备时使用

View File

@@ -3,6 +3,7 @@ package com.zhidao.support.adas.high;
/**
* 多设备监听
* 服务端实现此监听,将工控机发送过来的数据通过其他方式传递出去
* 客户端实现此监听,将乘客屏数据通过其他方式发送到乘客屏
*/
public interface OnMultiDeviceListener {
@@ -12,5 +13,13 @@ public interface OnMultiDeviceListener {
*
* @param bytes 数据
*/
void onForwardingIPCMessage(byte[] bytes);
void onForwardingDriverIPCMessage(byte[] bytes);
/**
* 转发乘客屏
* 如果是服务端此回调不会被调用
*
* @param bytes
*/
void onForwardingPassengerIPCMessage(byte[] bytes);
}

View File

@@ -6,7 +6,6 @@ import com.zhidao.support.adas.high.common.Constants;
import java.util.concurrent.atomic.AtomicLong;
import mogo.telematics.pad.MessagePad;
import okio.ByteString;
/**
* 数据打包
@@ -25,7 +24,7 @@ public class RawPack {
}
public synchronized ByteString pack(MessagePad.MessageType msgType, byte[] data) {
public synchronized byte[] pack(MessagePad.MessageType msgType, byte[] data) {
if (msgType == null) {
return null;
}
@@ -57,8 +56,7 @@ public class RawPack {
if (data != null && data.length > 0) {
System.arraycopy(data, 0, msg, messageProtocol.getOutHeaderLength() + header.length, data.length);
}
return ByteString.of(msg);
return msg;
}
/**