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

泊车本地化

parent c0af16dd
This diff is collapsed.
......@@ -15,11 +15,11 @@ data class BindCarBean(
data class BindResult(
val id: Int,
val lastLatitude: Any,
val lastLongitude: Any,
val placeId: Int,
// val lastLatitude: Any,
// val lastLongitude: Any,
// val placeId: Int,
val plateNumber: String,
val vehicleBusinessType: String,
val vehicleCode: String,
val vin: String
// val vehicleBusinessType: String,
// val vehicleCode: String,
// val vin: String
)
\ No newline at end of file
......@@ -4,20 +4,20 @@ package com.sd.cavphmi.bean
* {"id":"39846582477537280","objects":[{"id":"267","name":"Vehicle","longitude":117.3461065,"latitude":38.9985969,"elevation":500.0},{"id":"1600009","name":"Participants","longitude":117.3463289,"latitude":38.9986373,"elevation":500.0}],"type":1,"typeName":"前向碰撞预警","level":1,"startTime":1755582898300,"reportTime":1755582898300}
* ***/
class V2xStartBean {
var id: String = ""
var level: Int = 1
// var id: String = ""
// var level: Int = 1
var objects: List<VObject>? = null
var reportTime: Long = 0L
var startTime: Long = 0L
// var reportTime: Long = 0L
// var startTime: Long = 0L
var type: Int = -1
var typeName: String = ""
}
//第一个是自己的车 第二个是预警
//第一个是自己的车 第二个是预警物体
data class VObject(
var elevation: Double,
// var elevation: Double,
var id: String,
var latitude: Double,
var longitude: Double,
var name: String
// var latitude: Double,
// var longitude: Double,
// var name: String
)
\ No newline at end of file
......@@ -8,6 +8,7 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.jakewharton.rxbinding4.view.clicks
import com.sd.cavphmi.bean.BindResult
import com.sd.cavphmi.databinding.ActivityLoginBinding
import com.sd.cavphmi.ui.dialog.SeleBindCarDialog
import com.sd.cavphmi.utils.MMKVUtil
......@@ -98,35 +99,35 @@ class LoginActivity : AppCompatActivity() {
//获取可绑定车辆
private fun getBinderCars() {
// seleBindCarDialog = SeleBindCarDialog.newInstance()
mainVm.getBindCar().observe(this) { bindCars ->
if (mainVm.isMock) {
//id = 27
var bindCars = listOf(BindResult(27, "皖BDJ1106"))
var plateNumbers = bindCars.map { it.plateNumber }
seleBindCarDialog.setPlates(plateNumbers)
seleBindCarDialog.itemClickListener = object : SeleBindCarDialog.OnItemClickListener {
override fun onItemClick(position: Int) {
MyContants.VEHICLEID = bindCars.get(position).id
startActivity(Intent(this@LoginActivity, MainActivity::class.java))
finish()
seleBindCarDialog.itemClickListener =
object : SeleBindCarDialog.OnItemClickListener {
override fun onItemClick(position: Int) {
MyContants.VEHICLEID = bindCars.get(position).id
startActivity(Intent(this@LoginActivity, MainActivity::class.java))
finish()
}
}
} else {
mainVm.getBindCar().observe(this) { bindCars ->
var plateNumbers = bindCars.map { it.plateNumber }
seleBindCarDialog.itemClickListener =
object : SeleBindCarDialog.OnItemClickListener {
override fun onItemClick(position: Int) {
MyContants.VEHICLEID = bindCars.get(position).id
startActivity(Intent(this@LoginActivity, MainActivity::class.java))
finish()
}
}
seleBindCarDialog.setPlates(plateNumbers)
}
if (!seleBindCarDialog.isAdded) {
seleBindCarDialog.showNow(supportFragmentManager, "seleBindCarDialog")
}
// val dialog = CustomListDialog(this, "选择车辆", plateNumbers)
// dialog.setOnItemClickListener(object : CustomListDialog.OnItemClickListener {
// override fun onItemClick(position: Int, selectedItem: String) {
//// Toast.makeText(
//// this@LoginActivity,
//// "点击了第${position + 1}项: $selectedItem",
//// Toast.LENGTH_SHORT
//// ).show()
// MyContants.VEHICLEID = bindCars.get(position).id
// startActivity(Intent(this@LoginActivity, MainActivity::class.java))
// finish()
// }
// })
// dialog.show()
}
if (!seleBindCarDialog.isAdded) {
seleBindCarDialog.showNow(supportFragmentManager, "seleBindCarDialog")
}
}
......
......@@ -32,6 +32,7 @@ import com.sd.cavphmi.ui.fragment.CarPanelFragment
import com.sd.cavphmi.ui.fragment.ExoPlayFragment
import com.sd.cavphmi.utils.AvpContants
import com.sd.cavphmi.utils.DisplayUtil
import com.sd.cavphmi.utils.ToastHelper
import com.sd.cavphmi.viewmodels.MainVm
import com.sd.cavphmi.viewmodels.MapOpt
import com.sd.cavphmi.viewmodels.MockVM
......@@ -164,13 +165,15 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
override fun getToData() {
if (!mainVm.isMock) {
//开启websocket
getTarget()
getV2x()
//开启2个HTTP sse
getCarVehicle()
//开启AVP状态(HTTP SSE)
getAvpStatus()
}
//开启V2X预警
getV2x()
//开启感知物websocket
getTarget()
//开启车辆位姿
getCarVehicle()
//获取车位占用情况
// getSpaceInfo()
}
......@@ -240,12 +243,42 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
mapOpt.showParkLight(businessType, businessStatus, avpStatu.space)
//判断在泊车状态下的倒挡绘制倒车路线,改变镜头视角,,判断车是否到达停车点
mapOpt.drawReversePark(businessType, businessStatus, gearType, avpStatu.space)
//显示提示
tip(businessType, businessStatus)
//重置变量
resetVariable(businessStatus)
//根据AVP任务状态判停车特效是否关闭
// mapOpt.showEffectAvpStatu(businessType, businessStatus)
}
/***重置变量**/
private fun resetVariable(businessStatus: String) {
if (businessStatus == AvpContants.TRANSPORT_COMPLETED || businessStatus == AvpContants.TRANSPORT_CANCELED) {
mainVm.isGetVehDetail = false
// mapOpt.smallMapLine = false
mapOpt.sliceIndex = 0
// mapOpt.isDrawAreaCount = false
}
}
/***提示业务完成状态**/
private fun tip(businessType: String, businessStatus: String) {
if (businessType == AvpContants.PARK_TYPE) {
when (businessStatus) {
AvpContants.PARK_COMPLETED -> {
ToastHelper.showShort(this, "泊车完成")
}
}
} else if (businessType == AvpContants.CALL_TYPE) {
when (businessStatus) {
AvpContants.TRANSPORT_COMPLETED -> {
ToastHelper.showShort(this, "召车完成")
}
}
}
}
/***是否展示车内视频****/
private fun isCarVideo(businessStatus: String) {
if (businessStatus == AvpContants.TRANSPORT_PROGRESS) {
......@@ -256,15 +289,6 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
}
}
/***重置变量**/
private fun resetVariable(businessStatus: String) {
if (businessStatus == AvpContants.TRANSPORT_COMPLETED || businessStatus == AvpContants.TRANSPORT_CANCELED) {
mainVm.isGetVehDetail = false
// mapOpt.smallMapLine = false
mapOpt.sliceIndex = 0
// mapOpt.isDrawAreaCount = false
}
}
//联网车辆位姿数据
private fun getCarVehicle() {
......@@ -276,9 +300,9 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
}
}
//召车的时候临时开一下
mainVm.targetPre.observe(this) {
/* mainVm.targetPre.observe(this) {
showPre(it)
}
}*/
}
//显示车辆位姿UI
......@@ -291,7 +315,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
mapOpt.drawSmallCar(car)
//刷新右下角小车位置
mapOpt.showNavingCarPosition(car)
//生成车前方矩形
//车四周生成矩形
mapOpt.genFronArea(car)
//刷新右下角小地图路径
mapOpt.upSmallMapLine()
......
......@@ -100,7 +100,7 @@ class DistantTipFragment : Fragment() {
// endPoint.longitude
// ).toInt()
if (businessType == AvpContants.Park_TYPE) {
if (businessType == AvpContants.PARK_TYPE) {
when (businessStatus) {
AvpContants.TRANSPORT_PROGRESS -> {
takeStr(distance, 1)
......
......@@ -15,7 +15,6 @@ import com.unity3d.player.IUnityPlayerLifecycleEvents
import com.unity3d.player.UnityPlayer
class UnityFragment : Fragment() {
// region Lifecycle Management - MUST BE FORWARDED TO UnityPlayer
override fun onResume() {
super.onResume()
mUnityPlayer.onResume()
......@@ -66,21 +65,8 @@ class UnityFragment : Fragment() {
frameLayout.addView(unityPlayer, layoutParams)
}
return frameLayout
// return inflater.inflate(R.layout.fragment_unity, container, false)
}
// override fun onUnityPlayerUnloaded() {
// Log.d("UnityFragment", "-----------------onUnityPlayerUnloaded")
// // Unity 玩家未加载时调用
// activity?.finish()
// }
//
// override fun onUnityPlayerQuitted() {
// Log.d("UnityFragment", "-----------------onUnityPlayerQuitted")
// }
// UnityPlayer 实例
private lateinit var mUnityPlayer: UnityPlayer
......@@ -98,8 +84,6 @@ class UnityFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 视图创建完成后,可以在这里进行最终设置
// mUnityPlayer.windowFocusChanged(true)
// 视图创建完成后,可以在这里进行最终设置
mUnityPlayer.requestFocus()
mUnityPlayer.setFocusableInTouchMode(true)
//使用拼接服务器资源加载地图
......@@ -107,8 +91,6 @@ class UnityFragment : Fragment() {
// mUnityPlayer.postDelayed({
// try {
HighMapApi.setCarBottomCircle(true)
// HighMapApi.setCameraAngle(90f)
// HighMapApi.setCameraDistance(80f)
HighMapApi.setCameraAngle(30f)
HighMapApi.setCameraDistance(8f)
// } catch (e: Exception) {
......
......@@ -5,7 +5,7 @@ object AvpContants {
//业务类型
val NIL_TYPE = "NIL"
val CALL_TYPE = "Call"
val Park_TYPE = "Park"
val PARK_TYPE = "Park"
//档位
val GEAR_REVERSE = "REVERSE"
......
......@@ -102,7 +102,7 @@ class MainVm @Inject constructor(
lateinit var mockVM: MockVM
//是否需要模拟
var isMock = false
var isMock = true
//车辆位姿数据
// var carVehicle = MutableLiveData<CarVehicle>()
......@@ -254,8 +254,13 @@ class MainVm @Inject constructor(
fun subVehicle(): StateFlow<CarVehicle> {
if (isMock) {
// mockVM.subVehicle(carVehicle)
// mockVM.onVehicleMockPark(carVehicle)
mockVM.onVehicleMockCall(carVehicle, targetPre)
viewModelScope.launch {
delay(20000)
//模拟泊车
mockVM.onVehicleMockPark(carVehicle, v2xStartBean)
delay(3000)
}
// mockVM.onVehicleMockCall(carVehicle, targetPre,v2xStartBean)
} else {
var url = "${MyContants.HOST}/api/avpweb/hmi/monitor/v1/monitorDrivenStatus"
carCb.url = url
......@@ -416,6 +421,7 @@ class MainVm @Inject constructor(
//开启预警特效
fun startWarning(ptcId: String) {
viewModelScope.launch {
toggleCircleRadar(2)
var warnPtc = WarnPtc().apply {
ptcid = ptcId
isRed = true
......@@ -426,7 +432,6 @@ class MainVm @Inject constructor(
warnPtc.isRed = false
HighMapApi.setWarnPtc(warns)
}
toggleCircleRadar(2)
}
/**开启预警(光圈和雷达)
......
......@@ -64,11 +64,7 @@ class MapOpt @Inject constructor(
//车四周矩形
private var roundArea: Polygon? = null
//锁
// private var cenAreaLock = CenAreaLock()
// 小地图路径坐标点串 (02坐标系)
// private var coordinateSeries = ArrayList<DoubleArray>()
//小地图线
private var sPolyline: Polyline? = null
//是否进入泊车倒车状态
......@@ -175,8 +171,6 @@ class MapOpt @Inject constructor(
return
}
// if (smallMapLine)
// return
// if (coordinateSeries.count() > 0)
// return
if (drivenDecision.trajectory.points.count() > 0) {
// smallMapLine = true
......@@ -205,7 +199,7 @@ class MapOpt @Inject constructor(
//当前车辆位置
// var latlng = LatLng(carVehicle.vehiclePos!!.get(1), carVehicle.vehiclePos.get(0))
viewModelScope.launch(Dispatchers.Default) {
//算出线段与车辆四周面的相交
//算出线段与车辆四周面的相交的下标
var crossIndex = MyGeoTools.cauLineContainsArea(roundArea, lineString)
//点没有平均分配,前三分一8个点,后三分之一3个点
// println("-----------相交线段下标 crossIndex = ${crossIndex}")
......@@ -246,10 +240,10 @@ class MapOpt @Inject constructor(
val MU = 100000
var minLat = Math.min(lat1, lat2).times(MU).toInt() - 10
var maxLat = Math.max(lat1, lat2).times(MU).toInt() + 10
var minLon = Math.min(lon1, lon2).times(MU).toInt() - 10
var maxLon = Math.max(lon1, lon2).times(MU).toInt() + 10
var minLat = Math.min(lat1, lat2).times(MU).toInt() - 20
var maxLat = Math.max(lat1, lat2).times(MU).toInt() + 20
var minLon = Math.min(lon1, lon2).times(MU).toInt() - 20
var maxLon = Math.max(lon1, lon2).times(MU).toInt() + 20
var rect = Rect(
minLon, minLat, maxLon, maxLat
......@@ -264,12 +258,14 @@ class MapOpt @Inject constructor(
/**画路径起终点***/
fun addEndMarker(endPoint: EndPoint, businessStatus: String) {
if (businessStatus == AvpContants.TRANSPORT_COMPLETED || businessStatus == AvpContants.TRANSPORT_CANCELED) {
if (businessStatus == AvpContants.TRANSPORT_COMPLETED || businessStatus == AvpContants.TRANSPORT_CANCELED ||
businessStatus == AvpContants.PARK_COMPLETED
) {
//删除终点marker
deleteEndMarker()
return
}
if (pEndMarker == null) {
if (pEndMarker == null && endPoint != null) {
var mEndPoint = LatLng(endPoint.latitude, endPoint.longitude)
val end_icon = BitmapFactory.decodeResource(context.resources, R.drawable.plan_end)
pEndMarker = mMineMap?.addMarker(
......@@ -283,7 +279,7 @@ class MapOpt @Inject constructor(
fun drawReversePark(
businessType: String, businessStatus: String, gearType: String, space: Space
) {
if (businessType == AvpContants.Park_TYPE) {
if (businessType == AvpContants.PARK_TYPE) {
if (businessStatus == AvpContants.TRANSPORT_COMPLETED) {//到达停车点
HighMapApi.setCameraDistance(30f)
HighMapApi.setCameraAngle(60f)
......@@ -316,15 +312,17 @@ class MapOpt @Inject constructor(
//是否显示车位流光效果
fun showParkLight(businessType: String, businessStatus: String, space: Space) {
if (businessType == AvpContants.Park_TYPE) {
if (businessType == AvpContants.PARK_TYPE) {
if (businessStatus == AvpContants.PARK_COMPLETED) {
//消除车位流光特效
HighMapApi.parkRoundLight("")
} else if (space == null) {
HighMapApi.parkRoundLight("")
} else {
HighMapApi.parkRoundLight(space.name)
}
} else {
// HighMapApi.parkRoundLight("")
HighMapApi.parkRoundLight("")
}
}
......
......@@ -25,6 +25,7 @@ import com.sd.cavphmi.bean.CarPanelBean
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.PerceptionBean
import com.sd.cavphmi.bean.V2xStartBean
import com.sd.cavphmi.bean.VObject
import com.sd.cavphmi.bean.mock.MRoutes
import com.sd.cavphmi.bean.mock.ParkPath
import com.sd.cavphmi.highmap.AllLine
......@@ -76,7 +77,7 @@ class MockVM @Inject constructor(
* @param binding 里的速度
* **/
fun onVehicleMockPark(
carVehicle: MutableStateFlow<CarVehicle>
carVehicle: MutableStateFlow<CarVehicle>, v2xStartBean: MutableLiveData<V2xStartBean>
) {
// HighMapApi.setCameraAngle(30f)
viewModelScope.launch {
......@@ -121,9 +122,34 @@ class MockVM @Inject constructor(
var bearing = 0f
val random = Random
mRoutes.rs.forEachIndexed { index, it ->
if (index == 8) {//紧急制动预警
var v2x = V2xStartBean().apply {
type = 6
objects =
listOf(VObject(""), VObject("f117fdfa-feff-0100-85dc-35850000acb0"))
}
v2xStartBean.postValue(v2x)
} else if (index == 30) {
//前向碰撞
var v2x = V2xStartBean().apply {
type = 1
objects =
listOf(VObject(""), VObject("f117fdfa-feff-0100-85dc-35850000acb0"))
}
v2xStartBean.postValue(v2x)
} else if (index == 60) {
//弱势交通参与者
var v2x = V2xStartBean().apply {
type = 12
objects =
listOf(VObject(""), VObject("50332456-3030-3030-3530-303334533955"))
}
v2xStartBean.postValue(v2x)
}
//变速
CarPanelBean.instance.speed.set(random.nextInt(10..15))
//一边移动一把你计算航向角
if (index > 0 && index < mRoutes.rs.count()) {
var p1 = mRoutes.rs.get(index - 1)
var pc = mRoutes.rs.get(index)
......@@ -261,7 +287,8 @@ class MockVM @Inject constructor(
//召车 航向角 238.38134765625
fun onVehicleMockCall(
carVehicle: MutableStateFlow<CarVehicle>,
targetPre: MutableLiveData<PerceptionBean>?
targetPre: MutableLiveData<PerceptionBean>,
v2xStartBean: MutableLiveData<V2xStartBean>
) {
viewModelScope.launch {
//初始镜头角度
......@@ -320,7 +347,7 @@ class MockVM @Inject constructor(
if (index <= 139) {
//正在小心翼翼的出库
CarPanelBean.instance.speed.set(random.nextInt(1..5))
}else {
} else {
//开起来了
CarPanelBean.instance.speed.set(random.nextInt(10..16))
}
......@@ -523,6 +550,7 @@ class MockVM @Inject constructor(
//感知目标物
fun onSubTargetMock(targetPre: MutableLiveData<PerceptionBean>) {
viewModelScope.launch {
delay(20000)
val parts = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/PerTarget.txt", parts)
var temp = ""
......
......@@ -153,7 +153,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="直接到首页"
android:visibility="visible"/>
android:visibility="gone"/>
</LinearLayout>
......
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