Commit aa341738 authored by p x's avatar p x
Browse files

集成一部分订阅

parent fecf07e4
......@@ -3,4 +3,5 @@
停车场泊车 苏州 约等于(长春) AVP
https://protobuf.dev/getting-started/javatutorial/
protoc --java_out=app\src\main\java\ -I d:\WorkSpace\suzhouavp\app\src\main\proto\ d:\WorkSpace\suzhouavp\app\src\main\proto\response.proto
\ No newline at end of file
protoc --java_out=app\src\main\java\ -I app\src\main\proto\ response.proto
protoc --java_out=app\src\main\java\ -I d:\WorkSpace\suzhouavp\app\src\main\proto\ response.proto
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
export default {
webSocket: {
// url: "ws://127.0.0.1:1884",
// url: "wss://10.166.5.5:10443/socket/ws?clientSource=100",
url: "wss://sip-avp.isungent.cn:8443/socket/ws?clientSource=100",
/* dic: {
// "/topic/vehicle": "/topic/vehicle/1556919708184276993",
"/topic/vehicle": "/topic/vehicle",
"/topic/dataMerge": "/topic/dataMerge",
"/topic/signal": "/topic/signal",
"/topic/v2xStart": "/topic/v2xStart",
"/topic/v2xEnd": "/topic/v2xEnd",
"/topic/vehicleStatus": "/topic/vehicleStatus",
"/topic/timeDelay": "/topic/timeDelay",
}, */
dic: {
/* "/topic/vehicle": "/topic/vehicle/1556919708184276993", */
"/topic/vehicle": "/avp/api/VL961/vehicle/1694264612474306561",
"/topic/dataMerge": "/avp/api/VL961/dataMerge",
"/topic/signal": "/avp/api/VL961/signal",
"/topic/v2xStart": "/avp/api/VL961/v2xStart",
"/topic/v2xEnd": "/avp/api/VL961/v2xEnd",
"/topic/vehicleStatus": "/avp/api/VL961/vehicleStatus",
"/topic/timeDelay": "/avp/api/VL961/timeDelay",
"/topic/points": "/avp/api/VL961/points",
},
},
cesiumSetting: {
defaultAccessToken:
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJiMTgwZWJjMy1iNGVlLTRjYjctOWRlMy0xYmI3NzJmZDA3YzciLCJpZCI6MTAxNTkxLCJpYXQiOjE2NTgxNDAzMzB9.feULjgKOMAUASE9RnhPNkWhg2dvS9NCGupOeJF55I5M",
},
};
package com.sd.cavphmi.bean
/***车辆位资数据**/
data class CarVehicle(
val vehicleData: List<CarVehicleData>,
val wsTime: Long
)
data class CarVehicleData(
val altitude: Double,
val brake: Int,
val gasPedal: Int,
val gear: Int,
val heading: Float,
val latitude: Double,
val longitude: Double,
val obuCode: String,
val reportTime: Long,
val speed: Float,//m/s
val vehicleId: String,
val vehiclePlate: String,
val vehiclePurpose: String,
val vehiclePurposeName: String,
val wheelAngle: Int
)
\ No newline at end of file
package com.sd.cavphmi.bean
/**感知目标物
* {"objectData":[{"altitude":0.0,"deviceCode":"ALL","id":"rsm","latitude":0.0,"longitude":0.0,"participant":[{"gear":0,"heading":59.51892445105614,"latitude":43.836595395579934,"longitude":125.13730164662486,"ptcId":"0","ptcType":"non-motor","size":{"length":1.7816076278686523,"width":0.95207178592681885,"height":1.080740213394165},"speed":0.0030517578125}],"reportTime":1750148176068}],"wsTime":1750148130604}{"objectData":[{"altitude":0.0,"deviceCode":"ALL","id":"rsm","latitude":0.0,"longitude":0.0,"participant":[{"gear":0,"heading":59.51892445105614,"latitude":43.836595395579934,"longitude":125.13730164662486,"ptcId":"0","ptcType":"non-motor","size":{"length":1.7816076278686523,"width":0.95207178592681885,"height":1.080740213394165},"speed":0.0030517578125}],"reportTime":1750148176068}],"wsTime":1750148130604}
*
* ***/
data class PerTarget(
val objectData: List<ObjectData>,
val wsTime: Long
)
data class ObjectData(
val altitude: Double,
val deviceCode: String,
val id: String,
val latitude: Double,
val longitude: Double,
val participant: List<Participant>,
val reportTime: Long
)
data class Participant(
val gear: Int,
val heading: Double,
val latitude: Double,
val longitude: Double,
val ptcId: String,
val ptcType: String,
val size: Size,
val speed: Double
)
data class Size(
val height: Double,
val length: Double,
val width: Double
)
\ No newline at end of file
package com.sd.cavphmi.bean
//联网车辆状态数据
data class VehicleStats(
val vehicleData: List<VehicleData>,
val wsTime: Long
)
data class VehicleData(
val altitude: Double,
val brake: Int,
val gasPedal: Int,
val gear: Int,
val heading: Double,
val latitude: Double,
val longitude: Double,
val obuCode: String,
val reportTime: Long,
val speed: Double,
val vehicleId: String,
val vehiclePlate: String,
val vehiclePurpose: String,
val vehiclePurposeName: String,
val wheelAngle: Int,
val driveMode: Int,
)
\ No newline at end of file
......@@ -2,7 +2,8 @@ package com.sd.cavphmi.bean
object WebSetBean {
/* "/topic/vehicle"to "/topic/vehicle/1556919708184276993", */
var dic = mapOf(
//目前只有车辆和感知
var subDic = mapOf(
"/topic/vehicle" to "/avp/api/VL961/vehicle/1694264612474306561",
"/topic/dataMerge" to "/avp/api/VL961/dataMerge",
"/topic/signal" to "/avp/api/VL961/signal",
......@@ -10,6 +11,27 @@ object WebSetBean {
"/topic/v2xEnd" to "/avp/api/VL961/v2xEnd",
"/topic/vehicleStatus" to "/avp/api/VL961/vehicleStatus",
"/topic/timeDelay" to "/avp/api/VL961/timeDelay",
"/topic/points" to "/avp/api/VL961/points",
"/topic/points" to "/avp/api/VL961/points",//停车位变更
)
var dic = mapOf(
5231 to "/topic/vehicle",
5232 to "/topic/dataMerge",
5233 to "topic/signa",
5234 to "/topic/v2xStart",
5235 to "/topic/v2xEnd",
5236 to "/topic/vehicleStatus",
5237 to "/topic/timeDelay",
1 to "/topic/point",
)
// 5231: { action: setting.webSocket.dic["/topic/vehicle"] },
// 5232: { action: setting.webSocket.dic["/topic/dataMerge"] },
// 5233: { action: setting.webSocket.dic["/topic/signal"] },
// 5234: { action: setting.webSocket.dic["/topic/v2xStart"] },
// 5235: { action: setting.webSocket.dic["/topic/v2xEnd"] },
// 5236: { action: setting.webSocket.dic["/topic/vehicleStatus"] },
// 5237: { action: setting.webSocket.dic["/topic/timeDelay"] },
// 1: { action: setting.webSocket.dic["/topic/points"] },
}
\ No newline at end of file
package com.sd.cavphmi.bindadapters
import android.graphics.Typeface
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.style.RelativeSizeSpan
import android.text.style.StyleSpan
import android.widget.TextView
import androidx.databinding.BindingAdapter
import java.text.DecimalFormat
import kotlin.math.absoluteValue
object ShowCarStatuObject {
@JvmStatic
@BindingAdapter("showSpeed")
fun showSpeed(tv: TextView, speed: Float) {
var sb = SpannableStringBuilder()
var mixSpan = RelativeSizeSpan(1f)
var maxSpan = RelativeSizeSpan(2f)
var bold= StyleSpan(Typeface.BOLD)
if (speed > 0f) {
val df: DecimalFormat = DecimalFormat("#.0")
val s: String = df.format(speed.times(3.6f))
sb.append("${s}km/h")
sb.setSpan(maxSpan, 0, s.count(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
sb.setSpan(bold, 0, s.count(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
sb.setSpan(mixSpan, s.count(), sb.count(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
tv.setText(sb)
} else {
sb = SpannableStringBuilder("0km/h")
sb.setSpan(maxSpan, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
sb.setSpan(bold, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
sb.setSpan(mixSpan, 1, sb.count(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
tv.setText(sb)
}
}
@JvmStatic
@BindingAdapter("showHeading")
fun showHeading(tv: TextView, head: Int) {
var heading = head.absoluteValue
when (heading) {
0 -> {
tv.setText("正北")
}
90 -> {
tv.setText("正东")
}
180 -> {
tv.setText("正南")
}
270 -> {
tv.setText("正北")
}
in 1..45 -> {
tv.setText("北偏东")
}
in 46..89 -> {
tv.setText("东偏北")
}
in 91..135 -> {
tv.setText("东偏南")
}
in 136..179 -> {
tv.setText("南偏东")
}
in 181..225 -> {
tv.setText("南偏西")
}
in 226..269 -> {
tv.setText("西偏南")
}
in 271..315 -> {
tv.setText("西偏北")
}
in 316..359 -> {
tv.setText("北偏西")
}
else -> {
tv.setText(" - -")
}
}
}
}
\ No newline at end of file
package com.sd.cavphmi.repositorys
import com.google.gson.Gson
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.inject.Inject
class ParseSocketRepo @Inject constructor() {
var gson = Gson()
/**联网车辆状态数据***/
suspend fun <T> genDataBean(str: String, clazz: Class<T>): T {
return withContext(Dispatchers.Default) {
gson.fromJson(str, clazz)
}
}
// /**联网车辆状态数据***/
// suspend fun<T> genVehStatus():T {
//
// }
}
\ No newline at end of file
......@@ -7,8 +7,10 @@ import androidx.lifecycle.ViewModelProvider
import com.sd.cavphmi.BR
import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseActivity
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.VehicleStats
import com.sd.cavphmi.databinding.ActivityMainBinding
import com.sd.cavphmi.utils.DateUtils
import com.sd.cavphmi.viewmodels.MainVm
import dagger.hilt.android.AndroidEntryPoint
......@@ -43,23 +45,76 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
}
override fun initListener() {
binding.btVehicle.setOnClickListener {
viewModel.subVehicle().observe(this) {
topicVehicle(it)
}
}
binding.btStatus.setOnClickListener {
viewModel.subVehicleStatus().observe(this) {
// println("time = ${time}")
topicVehicleStatus(it)
}
}
binding.btTarget.setOnClickListener {
viewModel.subTarget()
}
binding.btV2x.setOnClickListener {
viewModel.subStartV2x()
}
binding.btV2xend.setOnClickListener {
viewModel.subEndV2x()
}
binding.btChewei.setOnClickListener {
viewModel.subPoints()
}
}
/**车辆姿态**/
private fun topicVehicle(bean: CarVehicle) {
var time = DateUtils.longToString(bean.wsTime, DateUtils.FORMAT_TIME)
binding.tvTime.setText(time)
if (bean.vehicleData?.isNotEmpty() ?: false) {
viewModel.heading.set(bean.vehicleData.get(0).heading.toInt())
viewModel.speed.set(bean.vehicleData.get(0).speed)
}
}
/**联网车辆状态数据topic**/
private fun topicVehicleStatus(bean: VehicleStats) {
if (bean.vehicleData?.isNotEmpty() ?: false) {
var driveMode = bean.vehicleData.get(0).driveMode
var str = when (driveMode) {
0 -> "自动驾驶"
1 -> "人工驾驶"
2 -> "远程驾驶"
else -> "—— ——"
}
viewModel.driveMode.set(str)
}
}
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) || event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
//如果是导航中,提示清除资源
val dialog = AlertDialog.Builder(this)
val dialog = AlertDialog.Builder(this)
// dialog.setIcon(android.R.drawable.ic_dialog_info)
dialog.setTitle("提示")
dialog.setMessage("确定退出应用")
dialog.setPositiveButton(
"确定",
DialogInterface.OnClickListener { dialog1: DialogInterface?, which: Int ->
viewModel.closeWS()
finish()
})
dialog.setNegativeButton(
"取消",
DialogInterface.OnClickListener { dialog12: DialogInterface?, which: Int -> })
dialog.show()
dialog.setTitle("提示")
dialog.setMessage("确定退出应用")
dialog.setPositiveButton(
"确定",
DialogInterface.OnClickListener { dialog1: DialogInterface?, which: Int ->
dialog1?.dismiss()
viewModel.closeWS()
finish()
})
dialog.setNegativeButton(
"取消",
DialogInterface.OnClickListener { dialog12: DialogInterface?, which: Int ->
dialog12?.dismiss()
})
dialog.show()
return true
} else {
......
......@@ -7,6 +7,7 @@ import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import android.util.Log
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.runBlocking
......@@ -47,12 +48,12 @@ object FileIoUtils {
}
suspend fun getAssetMock(context: Context, fileName: String, dst: MutableList<String>) :Int{
suspend fun getAssetMock(context: Context, fileName: String, dst: MutableList<String>): Int {
val assetManager = context.assets
var bf: BufferedReader? = null
try {
val inputReader = InputStreamReader(assetManager.open(fileName))
bf = BufferedReader(inputReader)
bf = BufferedReader(inputReader)
var line = ""
while (!bf.run {
line = readLine()
......@@ -334,7 +335,25 @@ object FileIoUtils {
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
private var fileWriter: FileWriter? = null
suspend fun writeToFile(message: String, fileName: String) {
withContext(Dispatchers.IO) {
try {
val file = File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
fileName
)
fileWriter = FileWriter(file, true) // true for append mode
fileWriter!!.append("$message\n")
fileWriter!!.flush() // Optional, to ensure immediate writing to file
} catch (e: IOException) {
Log.e("------writeToFile", "Error initializing log file", e)
}
}
}
......
package com.sd.cavphmi.viewmodels
import android.content.Context
import androidx.databinding.ObservableField
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.google.gson.Gson
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.PerTarget
import com.sd.cavphmi.bean.ReqBean
import com.sd.cavphmi.bean.SpaceNoBean
import com.sd.cavphmi.bean.VToXImgBean
import com.sd.cavphmi.bean.VehicleStats
import com.sd.cavphmi.bean.WebSetBean
import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.repositorys.ParseSocketRepo
import com.sd.cavphmi.repositorys.SpaceNoRepo
import com.sd.cavphmi.utils.MyContants
import com.sd.cavphmi.utils.ToastHelper
import com.sd.cavphmi.websockets.MyWebSocketClient
import com.sd.shupathwebview.utils.FileIoUtils
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.java_websocket.handshake.ServerHandshake
import protocol.Response
import java.net.URI
import java.nio.ByteBuffer
import javax.inject.Inject
......@@ -25,13 +36,33 @@ import javax.inject.Inject
@HiltViewModel
class MainVm @Inject constructor(
@ApplicationContext var context: Context,
var spaceNoRepo: SpaceNoRepo
private var parseSocketRepo: ParseSocketRepo
// var spaceNoRepo: SpaceNoRepo
) : MyBaseViewModel() {
private var client: MyWebSocketClient? = null
private var gson = Gson()
//车辆位姿数据
var carVehicle = MutableLiveData<CarVehicle>()
//联网车辆状态数据topic
var vehicleStat = MutableLiveData<VehicleStats>()
//感知目标物
var targetPre = MutableLiveData<PerTarget>()
//驾驶模式
var driveMode = ObservableField("")
//航向角
var heading = ObservableField(550)
//速度
var speed = ObservableField(0f)
fun startWS() {
val httpHeaders = mutableMapOf<String, String>()
httpHeaders.put("Cookie", "username=nemo")
......@@ -39,6 +70,7 @@ class MainVm @Inject constructor(
try {
client = MyWebSocketClient(URI(MyContants.WS_HOST))
client?.onSocketCb = onSocketCb
client?.onDataCb = onDataCb
client?.connect()
} catch (e: Exception) {
......@@ -51,35 +83,112 @@ class MainVm @Inject constructor(
}
}
var onSocketCb = object : MyWebSocketClient.OnSocketCb {
private var onSocketCb = object : MyWebSocketClient.OnSocketCb {
override fun onOpen(handshakedata: ServerHandshake?) {
println("--------Thread.currentThread() = ${Thread.currentThread()}")
subVehicle()
}
override fun onClose(code: Int, reason: String?, remote: Boolean) {
}
override fun onMessage(message: String?) {
override fun onError(ex: Exception?) {
}
}
override fun onMessage(bytes: ByteBuffer?) {
// SocketResponse.parseFrom(bytes)
private var onDataCb = object : MyWebSocketClient.OnDataCb {
override fun onVehicle(res: Response.SocketResponse) {
viewModelScope.launch {
val bean =
parseSocketRepo.genDataBean(res.data, CarVehicle::class.java)
println("---车辆位姿数据 = ${bean}")
carVehicle.value = bean
FileIoUtils.writeToFile(gson.toJson(bean), "carvehicle.txt")
}
}
override fun onClose(code: Int, reason: String?, remote: Boolean) {
override fun onVehicleStats(res: Response.SocketResponse) {
viewModelScope.launch {
val bean =
parseSocketRepo.genDataBean(res.data, VehicleStats::class.java)
println("---联网车辆状态数据 = ${bean}")
vehicleStat.value = bean
FileIoUtils.writeToFile(gson.toJson(bean), "vehicleS.txt")
}
}
override fun onError(ex: Exception?) {
override fun onTarget(res: Response.SocketResponse) {
viewModelScope.launch {
var bean = parseSocketRepo.genDataBean(res.data, PerTarget::class.java)
println("---感知目标物数据 = ${bean}")
targetPre.value = bean
FileIoUtils.writeToFile(gson.toJson(bean), "target.txt")
}
}
override fun onStartV2x(res: Response.SocketResponse) {
println("--------onStartV2x")
}
override fun onEndV2x(res: Response.SocketResponse) {
println("--------onEndV2x")
}
override fun onPoint(res: Response.SocketResponse) {
println("--------onPoint")
}
}
/*** 2.2. 联网车辆位姿数据topic**/
fun subVehicle() {
var reqStr = getSendData("/topic/vehicle")
/*** 联网车辆位姿数据**/
fun subVehicle(): LiveData<CarVehicle> {
val reqStr = getSendData("/topic/vehicle")
client?.send(reqStr)
return carVehicle
}
/** 联网车辆状态数据
*
* {"vehicleStats":{"total":0,"avp":0},"vehicleStatusList":[],"wsTime":1750138623719}
* */
fun subVehicleStatus(): LiveData<VehicleStats> {
val reqStr = getSendData("/topic/vehicleStatus")
client?.send(reqStr)
return vehicleStat
}
/**感知目标物数据
* {"objectData":[{"altitude":0.0,"deviceCode":"ALL","id":"rsm","latitude":0.0,"longitude":0.0,"participant":[],"reportTime":1750138879684}],"wsTime":1750138834204}
* **/
fun subTarget() {
val reqStr = getSendData("/topic/dataMerge")
client?.send(reqStr)
}
/**V2X预警开始
*
* **/
fun subStartV2x() {
val reqStr = getSendData("/topic/v2xStart")
client?.send(reqStr)
}
/*** V2X预警结束topic**/
fun subEndV2x() {
var reqStr = getSendData("/topic/v2xEnd")
client?.send(reqStr)
}
/*** 更新停车位**/
fun subPoints() {
val reqStr = getSendData("/topic/points")
client?.send(reqStr)
}
fun getSendData(key: String): String {
var data = WebSetBean.dic.get(key)
var data = WebSetBean.subDic.get(key)
var req = ReqBean()
req.data = data!!
var str = gson.toJson(req)
......@@ -93,18 +202,18 @@ class MainVm @Inject constructor(
}
fun getSpaceData() {
viewModelScope.launch {
var result = spaceNoRepo.getSpaceData()
when (result) {
is MyResult.Success<SpaceNoBean> -> {
var a = 0
}
else -> {
var b = 0
}
}
}
// viewModelScope.launch {
// var result = spaceNoRepo.getSpaceData()
// when (result) {
// is MyResult.Success<SpaceNoBean> -> {
// var a = 0
// }
//
// else -> {
// var b = 0
// }
// }
// }
}
......
......@@ -4,7 +4,7 @@ package com.sd.cavphmi.websockets
import org.java_websocket.client.WebSocketClient
import org.java_websocket.drafts.Draft
import org.java_websocket.handshake.ServerHandshake
import protocol.Response.SocketResponse
import protocol.Response
import java.net.URI
import java.nio.ByteBuffer
......@@ -29,9 +29,9 @@ class MyWebSocketClient : WebSocketClient {
}
override fun onMessage(message: String?) {
System.out.println(TAG + "received message: " + message);
// System.out.println(TAG + "received message: " + message);
onSocketCb?.onMessage(message)
// onSocketCb?.onMessage(message)
//处理各种推送消息
// let data = {};
// let result = await decodeResponseProtoBuf(msg);
......@@ -50,15 +50,33 @@ class MyWebSocketClient : WebSocketClient {
}
override fun onMessage(bytes: ByteBuffer?) {
System.out.println(TAG + " received ByteBuffer")
var socketResponse=SocketResponse.parseFrom(bytes)
// socketResponse.
onSocketCb?.onMessage(bytes)
// System.out.println(TAG + " received ByteBuffer")
val socketResponse = Response.SocketResponse.parseFrom(bytes)
when (socketResponse.msgType) {
5231 -> {//联网车辆位姿数据
onDataCb?.onVehicle(socketResponse)
}
5232 -> {//感知目标物数据
onDataCb?.onTarget(socketResponse)
}
5234 -> {//V2X预警开始
onDataCb?.onStartV2x(socketResponse)
}
5235 -> {//V2X预警结束
onDataCb?.onEndV2x(socketResponse)
}
5236 -> {//联网车辆状态数据
onDataCb?.onVehicleStats(socketResponse)
}
1 -> {//更新停车场
onDataCb?.onPoint(socketResponse)
}
}
}
override fun onClose(code: Int, reason: String?, remote: Boolean) {
System.out.println(TAG + " closed with exit code " + code + " additional info: " + reason);
onSocketCb?.onClose(code,reason,remote)
onSocketCb?.onClose(code, reason, remote)
}
override fun onError(ex: Exception?) {
......@@ -70,11 +88,23 @@ class MyWebSocketClient : WebSocketClient {
interface OnSocketCb {
fun onOpen(handshakedata: ServerHandshake?)
fun onMessage(message: String?)
fun onMessage(bytes: ByteBuffer?)
// fun onMessage(message: String?)
// fun onMessage(socketResponse: Response.SocketResponse)
fun onClose(code: Int, reason: String?, remote: Boolean)
fun onError(ex: Exception?)
}
var onDataCb: OnDataCb? = null
interface OnDataCb {
fun onVehicle(res: Response.SocketResponse)
fun onVehicleStats(res: Response.SocketResponse)
fun onTarget(res: Response.SocketResponse)
fun onStartV2x(res: Response.SocketResponse)
fun onEndV2x(res: Response.SocketResponse)
fun onPoint(res: Response.SocketResponse)
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="vm"
type="com.sd.cavphmi.viewmodels.MainVm" />
</data>
<RelativeLayout xmlns:tools="http://schemas.android.com/tools"
<RelativeLayout
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
......@@ -40,10 +40,12 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:text="--"
android:textColor="@color/text_black" />
android:layout_height="match_parent"
android:layout_marginLeft="3dp"
android:gravity="center_vertical"
android:textColor="@color/text_black"
app:showHeading="@{vm.heading}"
tools:text="23423" />
</LinearLayout>
......@@ -74,20 +76,21 @@
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:gravity="right | center_vertical"
android:layout_weight="1">
android:layout_weight="1"
android:gravity="right | center_vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/drive_mode"
android:layout_marginRight="3dp"/>
android:layout_marginRight="3dp"
android:src="@drawable/drive_mode" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自动驾驶"
android:textColor="@color/text_black" />
android:text="@{vm.driveMode}"
android:textColor="@color/text_black"
tools:text="自动驾驶" />
</LinearLayout>
......@@ -107,12 +110,50 @@
</LinearLayout>
<ImageView
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/ll_head"
android:src="#907867" />
android:orientation="vertical"
android:src="#907867">
<Button
android:id="@+id/bt_vehicle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="车辆位姿数据" />
<Button
android:id="@+id/bt_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="联网车辆状态数据" />
<Button
android:id="@+id/bt_target"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="感知目标物数据" />
<Button
android:id="@+id/bt_v2x"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="V2X预警开始" />
<Button
android:id="@+id/bt_v2xend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="V2X预警结束" />
<Button
android:id="@+id/bt_chewei"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="更新停车位" />
</LinearLayout>
<RelativeLayout
......@@ -132,19 +173,20 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="3dp"
android:text="9.19Am"
android:textColor="@color/text_black" />
android:layout_marginTop="2dp"
android:textColor="@color/text_black"
tools:text="9:19" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_time"
android:layout_below="@id/tv_time"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:text="0 km/h"
android:layout_marginTop="10dp"
android:textColor="@color/text_black"
android:textSize="20sp" />
android:textSize="12sp"
app:showSpeed="@{vm.speed}"
tools:text="0 km/h" />
</RelativeLayout>
......
......@@ -14,4 +14,15 @@ class ExampleUnitTest {
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
@Test
fun testwhen() {
var driveMode=2
var str = when (driveMode) {
0 -> "自动驾驶"
1 -> "人工驾驶"
2 -> "远程驾驶"
else -> "—— ——"
}
println("str = ${str}")
}
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment