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

AVP 接后端模拟数据

parent 42aa7c93
...@@ -22,10 +22,10 @@ package com.sd.cavphmi.bean ...@@ -22,10 +22,10 @@ package com.sd.cavphmi.bean
//) //)
class CarVehicle { class CarVehicle {
val businessStatus: String = "" var businessStatus: String = ""
// val progress: Any = "" // val progress: Any = ""
// val routing: List<Any>? = null // val routing: List<Any>? = null
val spaceName: String = "" var spaceName: String = ""
//vehiclePos 里面分别是 经度、纬度、航向角 //vehiclePos 里面分别是 经度、纬度、航向角
var vehiclePos: List<Double>? = null var vehiclePos: List<Double>? = null
......
package com.sd.cavphmi.bean
/**模拟后台推送***/
class CarVehicleBak {
var businessStatus: String = ""
var spaceName: String = ""
//vehiclePos 里面分别是 经度、纬度、航向角
var vehiclePos: List<Double>? = null
//车辆当前位置
var carPos = 0
}
\ No newline at end of file
package com.sd.cavphmi.bean.mock
/***车辆位姿 自己服务器的*/
class CarVeh {
/**业务状态 park call park_com call_com**/
var status = ""
/***车辆行驶的点位**/
var carPos = 0
/***全局路径**/
var rs: List<List<Double>>? = null
}
\ No newline at end of file
...@@ -65,11 +65,11 @@ class LoginActivity : AppCompatActivity() { ...@@ -65,11 +65,11 @@ class LoginActivity : AppCompatActivity() {
loginVm.login(user, PWD, VERIFYCODE).collect { loginVm.login(user, PWD, VERIFYCODE).collect {
// println("-----------登录回调 = ${it}") // println("-----------登录回调 = ${it}")
//获取可绑定车辆 //获取可绑定车辆
/* if (it == 1) { if (it == 1) {
getBinderCars() getBinderCars()
}*/ }
startActivity(Intent(this@LoginActivity, MainActivity::class.java)) // startActivity(Intent(this@LoginActivity, MainActivity::class.java))
finish() // finish()
} }
} }
} }
......
...@@ -36,6 +36,7 @@ import com.sd.cavphmi.utils.ToastHelper ...@@ -36,6 +36,7 @@ import com.sd.cavphmi.utils.ToastHelper
import com.sd.cavphmi.viewmodels.MainVm import com.sd.cavphmi.viewmodels.MainVm
import com.sd.cavphmi.viewmodels.MapOpt import com.sd.cavphmi.viewmodels.MapOpt
import com.sd.cavphmi.viewmodels.MockVM import com.sd.cavphmi.viewmodels.MockVM
import com.sd.cavphmi.viewmodels.SelfMockVm
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
...@@ -82,6 +83,9 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() { ...@@ -82,6 +83,9 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
//主页操作 //主页操作
private val mainVm: MainVm by viewModels() private val mainVm: MainVm by viewModels()
//模拟车辆类
private val selfMockVm: SelfMockVm by viewModels()
//地图操作类,用于绘制 //地图操作类,用于绘制
private val mapOpt: MapOpt by viewModels() private val mapOpt: MapOpt by viewModels()
...@@ -99,6 +103,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() { ...@@ -99,6 +103,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
private val exoPlayFragment by lazy { ExoPlayFragment.newInstance() } private val exoPlayFragment by lazy { ExoPlayFragment.newInstance() }
override fun initView() { override fun initView() {
mainVm.mockVM = mockVM mainVm.mockVM = mockVM
mainVm.selfMockVm = selfMockVm
adaptWidth() adaptWidth()
//车辆仪表 //车辆仪表
var ft = supportFragmentManager.beginTransaction() var ft = supportFragmentManager.beginTransaction()
...@@ -154,6 +159,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() { ...@@ -154,6 +159,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
// mainVm.mMineMap = mineMap // mainVm.mMineMap = mineMap
mapOpt.mMineMap = mineMap mapOpt.mMineMap = mineMap
mockVM.mMineMap = mineMap mockVM.mMineMap = mineMap
selfMockVm.mMineMap = mineMap
mineMap?.setZoomLevel(14f) mineMap?.setZoomLevel(14f)
//设置中心点 //设置中心点
// val point = Tools.latLngToPoint(LatLng(39.80913878, 116.50166926)) // val point = Tools.latLngToPoint(LatLng(39.80913878, 116.50166926))
...@@ -174,16 +180,36 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() { ...@@ -174,16 +180,36 @@ class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
getTarget() getTarget()
//开启车辆位姿 //开启车辆位姿
// getCarVehicle() // getCarVehicle()
//获取车位占用情况
// getSpaceInfo()
//连接自己的服务车辆位姿 //连接自己的服务车辆位姿
getSelfCar() getSelfCar()
} }
/**连接自己的车辆位姿服务**/ /**连接自己的车辆位姿服务**/
private fun getSelfCar() { private fun getSelfCar() {
mainVm.getSelfCar() lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
mainVm.getSelfCar().collect { car ->
//更新车辆位置
showSelfCar(car)
}
}
}
}
private fun showSelfCar(car: CarVehicle) {
if (car.vehiclePos == null || car.vehiclePos?.getOrNull(2) == null) {
//隐藏小车
return
}
//刷新主车位置
HighMapApi.setCarPosition(
car.vehiclePos!!.get(2),
car.vehiclePos!!.get(1),
car.vehiclePos!!.get(0),
20.80189
// car.elevation
)
} }
......
...@@ -9,7 +9,7 @@ object MyContants { ...@@ -9,7 +9,7 @@ object MyContants {
// var HOST = "https://itg-dev.cu-sc.com:19443/" // var HOST = "https://itg-dev.cu-sc.com:19443/"
//HTTP地址 //测试环境 //HTTP地址 //测试环境
const val HOST = "https://172.24.124.130:19443" const val HOST = "http://192.168.60.218:8090"
//智网生产环境地址用于拼接3dtile.json //智网生产环境地址用于拼接3dtile.json
var HOST_MAP = "https://itg-yz.cu-sc.com:13443" var HOST_MAP = "https://itg-yz.cu-sc.com:13443"
...@@ -26,7 +26,7 @@ object MyContants { ...@@ -26,7 +26,7 @@ object MyContants {
//跟踪车辆的ID 15(模拟) skywell.1ggvlp16.car10 skywell.1ggvlp16.car8 //跟踪车辆的ID 15(模拟) skywell.1ggvlp16.car10 skywell.1ggvlp16.car8
//用来拼接websocket //用来拼接websocket
var BASE_HOST = "192.168.60.218:8090" var BASE_HOST = "192.168.60.218:8091"
// if (IS_DEBUG) "itg-dev.cu-sc.com:19443" else "itg-yz.cu-sc.com:19443" // if (IS_DEBUG) "itg-dev.cu-sc.com:19443" else "itg-yz.cu-sc.com:19443"
// if (IS_DEBUG) "172.24.124.130:19443" else "itg-yz.cu-sc.com:19443" // if (IS_DEBUG) "172.24.124.130:19443" else "itg-yz.cu-sc.com:19443"
// if (IS_DEBUG) "itg-yz.cu-sc.com:13443" else "itg-yz.cu-sc.com:19443" // if (IS_DEBUG) "itg-yz.cu-sc.com:13443" else "itg-yz.cu-sc.com:19443"
...@@ -49,20 +49,6 @@ object MyContants { ...@@ -49,20 +49,6 @@ object MyContants {
/***V2X预警 VEHICLEID 传了就是获取某一辆车的预警 &vehicleId=${VEHICLEID}"=***/ /***V2X预警 VEHICLEID 传了就是获取某一辆车的预警 &vehicleId=${VEHICLEID}"=***/
var WS_V2X = "${WSHOST}type=3" var WS_V2X = "${WSHOST}type=3"
/***网联车辆状态 &VEHICLEID=''***/
var WS_VEH_STATU = "${WSHOST}msgType=6"
/***感知延时 &intersectionCode=''***/
var WS_PRE_DELAY = "${WSHOST}msgType=7"
/***交通(感知)事件 &intersectionCode=''***/
var WS_TRAFFIC_PER = "${WSHOST}msgType=5"
/***交通信号灯 &intersectionCode=''***/
var WS_TRAFFIC_LIGHT = "${WSHOST}msgType=3&"
/***已经**/
const val ALREADT_ONCE = -1
const val HTTP_ERROR = 500 const val HTTP_ERROR = 500
......
...@@ -18,7 +18,6 @@ import com.sd.cavphmi.bean.SpaceInfoBean ...@@ -18,7 +18,6 @@ import com.sd.cavphmi.bean.SpaceInfoBean
import com.sd.cavphmi.bean.V2xStartBean import com.sd.cavphmi.bean.V2xStartBean
import com.sd.cavphmi.bean.VToXImgBean import com.sd.cavphmi.bean.VToXImgBean
import com.sd.cavphmi.bean.VehDetailBean import com.sd.cavphmi.bean.VehDetailBean
import com.sd.cavphmi.bean.VehicleStats
import com.sd.cavphmi.bean.mock.MRoutes import com.sd.cavphmi.bean.mock.MRoutes
import com.sd.cavphmi.bean.mock.MyCLoc import com.sd.cavphmi.bean.mock.MyCLoc
import com.sd.cavphmi.highmap.AllLine import com.sd.cavphmi.highmap.AllLine
...@@ -66,8 +65,6 @@ class MainVm @Inject constructor( ...@@ -66,8 +65,6 @@ class MainVm @Inject constructor(
private val TAG = "MainVm" private val TAG = "MainVm"
// var mMineMap: MineMap? = null
//Windows 焦点 //Windows 焦点
var hasFocus = MutableLiveData<Boolean>() var hasFocus = MutableLiveData<Boolean>()
...@@ -87,22 +84,20 @@ class MainVm @Inject constructor( ...@@ -87,22 +84,20 @@ class MainVm @Inject constructor(
//v2x预警socket //v2x预警socket
private var v2xWSClient = V2xWSClient(URI(MyContants.WS_V2X + WSTOKEN)) private var v2xWSClient = V2xWSClient(URI(MyContants.WS_V2X + WSTOKEN))
//网联车辆状态
// private var vehStatuWSClient = VehStatuWSClient(URI(MyContants.WS_VEH_STATU))
//socket 管理 //socket 管理
private var sockets = listOf(vecLocWSClient,feelTargetWSClient, v2xWSClient) private var sockets = listOf(vecLocWSClient, feelTargetWSClient, v2xWSClient)
//交通信号灯
// private var trafficLightWSClient: TrafficLightWSClient? = null
private var gson = Gson() private var gson = Gson()
//模拟操作 //模拟操作
lateinit var mockVM: MockVM lateinit var mockVM: MockVM
//模拟操作
lateinit var selfMockVm: SelfMockVm
//是否需要模拟 //是否需要模拟
var isMock = false var isMock = true
//车辆位姿数据 //车辆位姿数据
// var carVehicle = MutableLiveData<CarVehicle>() // var carVehicle = MutableLiveData<CarVehicle>()
...@@ -132,9 +127,6 @@ class MainVm @Inject constructor( ...@@ -132,9 +127,6 @@ class MainVm @Inject constructor(
//v2x 预警 //v2x 预警
var v2xStartBean = MutableLiveData<V2xStartBean>() var v2xStartBean = MutableLiveData<V2xStartBean>()
//联网车辆状态数据
var vehicleStat = MutableLiveData<VehicleStats>()
//车位占用情况 //车位占用情况
var spaceInfo = MutableLiveData<SpaceInfoBean>() var spaceInfo = MutableLiveData<SpaceInfoBean>()
...@@ -275,7 +267,7 @@ class MainVm @Inject constructor( ...@@ -275,7 +267,7 @@ class MainVm @Inject constructor(
/** /**
* 联网车辆位姿数据 * 联网车辆位姿数据
*/ */
fun getSelfCar() { fun getSelfCar(): StateFlow<CarVehicle> {
try { try {
vecLocWSClient.onWebSocketCb = object : OnWebSocketCb { vecLocWSClient.onWebSocketCb = object : OnWebSocketCb {
override fun onClose( override fun onClose(
...@@ -289,10 +281,7 @@ class MainVm @Inject constructor( ...@@ -289,10 +281,7 @@ class MainVm @Inject constructor(
viewModelScope.launch { viewModelScope.launch {
if (str.isNotEmpty()) { if (str.isNotEmpty()) {
try { try {
mockVM.selfCar(str,carVehicle) selfMockVm.selfCar(str, carVehicle)
// var carBean = gson.fromJson(str, CarVehicle::class.java)
//更新主车位置
// carVehicle.postValue(carBean)
} catch (e: JsonSyntaxException) { } catch (e: JsonSyntaxException) {
e.printStackTrace() e.printStackTrace()
} }
...@@ -306,6 +295,7 @@ class MainVm @Inject constructor( ...@@ -306,6 +295,7 @@ class MainVm @Inject constructor(
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
return carVehicle
} }
// mockVM.getSelfCar(carVehicle, targetPre, v2xStartBean) // mockVM.getSelfCar(carVehicle, targetPre, v2xStartBean)
...@@ -357,39 +347,35 @@ class MainVm @Inject constructor( ...@@ -357,39 +347,35 @@ class MainVm @Inject constructor(
*传入intersectionCode=17 拼接 代表获取某区域的感知物,目前没有数据 *传入intersectionCode=17 拼接 代表获取某区域的感知物,目前没有数据
*/ */
fun subTarget(): LiveData<PerceptionBean> { fun subTarget(): LiveData<PerceptionBean> {
if (isMock) { try {
mockVM.onSubTargetMock(targetPre) feelTargetWSClient.onWebSocketCb = object : OnWebSocketCb {
} else { override fun onClose(
try { code: Int,
feelTargetWSClient.onWebSocketCb = object : OnWebSocketCb { reason: String?,
override fun onClose( remote: Boolean
code: Int, ) {
reason: String?, }
remote: Boolean
) {
}
override fun onMsg(str: String) { override fun onMsg(str: String) {
viewModelScope.launch { viewModelScope.launch {
//下载到sd卡下面的DownLoad文件夹下面 //下载到sd卡下面的DownLoad文件夹下面
if (str.isNotEmpty()) { if (str.isNotEmpty()) {
// FileSdCardUtils.writeFileToDownload(str, "PerTarget.txt") // FileSdCardUtils.writeFileToDownload(str, "PerTarget.txt")
try { try {
var bean = gson.fromJson(str, PerceptionBean::class.java) var bean = gson.fromJson(str, PerceptionBean::class.java)
targetPre.postValue(bean) targetPre.postValue(bean)
} catch (e: JsonSyntaxException) { } catch (e: JsonSyntaxException) {
e.printStackTrace() e.printStackTrace()
}
} }
} }
} }
} }
if (!feelTargetWSClient!!.isOpen) {
feelTargetWSClient?.connect()
}
} catch (e: Exception) {
e.printStackTrace()
} }
if (!feelTargetWSClient!!.isOpen) {
feelTargetWSClient?.connect()
}
} catch (e: Exception) {
e.printStackTrace()
} }
return targetPre return targetPre
} }
...@@ -400,39 +386,35 @@ class MainVm @Inject constructor( ...@@ -400,39 +386,35 @@ class MainVm @Inject constructor(
* 某个预警id要和感知物的ptcid对上 * 某个预警id要和感知物的ptcid对上
*/ */
fun subStartV2x(): LiveData<V2xStartBean> { fun subStartV2x(): LiveData<V2xStartBean> {
if (isMock) { try {
// mockVM.onV2xMock(v2xStartBean) v2xWSClient.onWebSocketCb = object : OnWebSocketCb {
} else { override fun onClose(
try { code: Int,
v2xWSClient.onWebSocketCb = object : OnWebSocketCb { reason: String?,
override fun onClose( remote: Boolean
code: Int, ) {
reason: String?, }
remote: Boolean
) {
}
override fun onMsg(str: String) { override fun onMsg(str: String) {
viewModelScope.launch { viewModelScope.launch {
if (str.isNotEmpty()) { if (str.isNotEmpty()) {
// FileSdCardUtils.writeFileToDownload(str, "avp_v2x.txt") // FileSdCardUtils.writeFileToDownload(str, "avp_v2x.txt")
try { try {
var bean = gson.fromJson(str, V2xStartBean::class.java) var bean = gson.fromJson(str, V2xStartBean::class.java)
v2xStartBean.postValue(bean) v2xStartBean.postValue(bean)
} catch (e: JsonSyntaxException) { } catch (e: JsonSyntaxException) {
e.printStackTrace() e.printStackTrace()
}
} }
} }
} }
} }
if (v2xWSClient.isOpen == false) {
v2xWSClient.connect()
}
} catch (e: Exception) {
e.printStackTrace()
} }
if (v2xWSClient.isOpen == false) {
v2xWSClient.connect()
}
} catch (e: Exception) {
e.printStackTrace()
} }
return v2xStartBean return v2xStartBean
} }
...@@ -577,95 +559,12 @@ class MainVm @Inject constructor( ...@@ -577,95 +559,12 @@ class MainVm @Inject constructor(
startWarning("50332456-3030-3030-3530-303334533955") startWarning("50332456-3030-3030-3530-303334533955")
} }
/**
* 网联车辆状态
**/
/* fun subVehicleStatus(): LiveData<VehicleStats> {
if (isMock) {
} else {
try {
vehStatuWSClient.onDataCb = object : VehStatuWSClient.OnDataCb {
override fun onMsg(str: String) {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "vehicleS.txt")
var bean = gson.fromJson(str, VehicleStats::class.java)
vehicleStat.postValue(bean)
}
}
}
if (vehStatuWSClient.isOpen == false) {
vehStatuWSClient.connect()
} else {
vehStatuWSClient.reconnect()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
return vehicleStat
}*/
//暂时用不到--------------------------------------------- //暂时用不到---------------------------------------------
/*** 交通(感知)事件**//*
fun subTrafficPre(): LiveData<TrafficPerBean> {
try {
if (trafficPreWSClient == null) {
trafficPreWSClient = TrafficPreWSClient(URI(MyContants.WS_TRAFFIC_PER))
trafficPreWSClient?.connect()
trafficPreWSClient?.onDataCb = object : TrafficPreWSClient.OnDataCb {
override fun onMsg(str: String) {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "pre_traff.txt")
var bean = gson.fromJson(str, TrafficPerBean::class.java)
trafficPerBean.postValue(bean)
}
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return trafficPerBean
}
*/
fun showVToTip() { fun showVToTip() {
var imgs = VToXImgBean.imgs var imgs = VToXImgBean.imgs
ToastHelper.showCustViewShort(context, imgs.get("2")!!) ToastHelper.showCustViewShort(context, imgs.get("2")!!)
} }
/*fun d1() {
try {
vecLocWSClient.onWebSocketCb = object : OnWebSocketCb {
override fun onClose(code: Int, reason: String?, remote: Boolean) {
}
override fun onMsg(str: String) {
viewModelScope.launch {
//下载到sd卡下面的DownLoad文件夹下面
if (str.isNotEmpty()) {
FileIoUtils.writeToFile(str, "CarVehicle.txt")
}
var carBean = gson.fromJson(str, CarVehicle::class.java)
//更新主车位置
carVehicle.postValue(carBean)
}
}
}
if (!vecLocWSClient.isOpen) {
vecLocWSClient.connect()
}
} catch (e: Exception) {
e.printStackTrace()
}
}*/
} }
\ No newline at end of file
...@@ -26,7 +26,6 @@ import com.sd.cavphmi.bean.CarVehicle ...@@ -26,7 +26,6 @@ import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.PerceptionBean import com.sd.cavphmi.bean.PerceptionBean
import com.sd.cavphmi.bean.V2xStartBean import com.sd.cavphmi.bean.V2xStartBean
import com.sd.cavphmi.bean.VObject import com.sd.cavphmi.bean.VObject
import com.sd.cavphmi.bean.mock.CarVeh
import com.sd.cavphmi.bean.mock.MRoutes import com.sd.cavphmi.bean.mock.MRoutes
import com.sd.cavphmi.bean.mock.ParkPath import com.sd.cavphmi.bean.mock.ParkPath
import com.sd.cavphmi.highmap.AllLine import com.sd.cavphmi.highmap.AllLine
...@@ -72,81 +71,6 @@ class MockVM @Inject constructor( ...@@ -72,81 +71,6 @@ class MockVM @Inject constructor(
} }
} }
//泊车首次只进来一次
private var isPark = false
//接受从自己服务器来的数据
suspend fun selfCar(str: String, carVehicle: MutableStateFlow<CarVehicle>) {
withContext(Dispatchers.Main) {
val random = Random
var cCar: CarVehicle? = null
val CarVeh = gson.fromJson(str, CarVeh::class.java)
if (CarVeh.status.equals("park")) {
var mRoutes = MRoutes(CarVeh.rs!!)//转换类型
if (!isPark) {
isPark = true
//画局部图小车
drawNavingCar(
Tools.latLngToPoint(
LatLng(
39.81014469509955,
116.50238005214746
)
)
)
//画局部图路径
smallLineMock(mRoutes)
//画终点
addEndMarker(LatLng(39.809039362307594, 116.50254394816011))
//用矩形框柱
drawEndArea(
39.81014469509955,
116.50238005214746,
39.809039362307594,
116.50254394816011,
)
//画出全局路径
var lines = CarVeh.rs!!.map {
AllLine(it[1], it[0])
}
HighMapApi.setCarNavPath(lines, showdistance = 200)
//开启流光效果
HighMapApi.parkRoundLight("B017")
//2旁车辆占用
var spinfos = listOf(Spinfo().apply {
code = "B016"
state = true
}, Spinfo().apply {
code = "B018"
state = true
})
HighMapApi.setParkStatu(ParkStatu(spinfos))
}
//变速
CarPanelBean.instance.speed.set(random.nextInt(10..15))
//模拟车辆移动
var rs=CarVeh.rs!!.get(CarVeh.carPos)
cCar = CarVehicle().apply {
this.vehiclePos = listOf(rs[0], rs[1], rs[2])
}
//更新主车位置
carVehicle.value = cCar
//更新小地图小车
showNavingCarPosition(
Tools.latLngToNdsPoint(
LatLng(
cCar.vehiclePos!!.get(1),
cCar.vehiclePos!!.get(0)
)
),
cCar.vehiclePos!!.get(2).toFloat()
)
//更新小地图路径
upSmallLine(CarVeh.carPos, mRoutes)
}
}
}
/****** /******
* 模拟车辆位姿 泊车 * 模拟车辆位姿 泊车
...@@ -158,7 +82,7 @@ class MockVM @Inject constructor( ...@@ -158,7 +82,7 @@ class MockVM @Inject constructor(
) { ) {
// HighMapApi.setCameraAngle(30f) // HighMapApi.setCameraAngle(30f)
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
var cCar: CarVehicle? = null var cCar: CarVehicle
val mRoutes = withContext(Dispatchers.IO) { val mRoutes = withContext(Dispatchers.IO) {
var gson = Gson() var gson = Gson()
......
package com.sd.cavphmi.viewmodels
import android.content.Context
import android.graphics.BitmapFactory
import android.graphics.Point
import android.graphics.Rect
import androidx.lifecycle.ViewModel
import com.google.gson.Gson
import com.minedata.minenavi.map.Marker
import com.minedata.minenavi.map.MarkerOptions
import com.minedata.minenavi.map.MineMap
import com.minedata.minenavi.map.MyLocationStyle
import com.minedata.minenavi.map.Overlay
import com.minedata.minenavi.map.Polyline
import com.minedata.minenavi.mapdal.LatLng
import com.minedata.minenavi.mapdal.NativeEnv
import com.minedata.minenavi.mapdal.NdsPoint
import com.minedata.minenavi.util.Tools
import com.sd.cavphmi.R
import com.sd.cavphmi.bean.CarPanelBean
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.CarVehicleBak
import com.sd.cavphmi.bean.mock.MRoutes
import com.sd.cavphmi.highmap.AllLine
import com.sd.cavphmi.highmap.HighMapApi
import com.sd.cavphmi.highmap.ParkStatu
import com.sd.cavphmi.highmap.ReverCar
import com.sd.cavphmi.highmap.Spinfo
import com.sd.cavphmi.utils.FileIoUtils
import com.sd.cavphmi.utils.ToastHelper
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.withContext
import javax.inject.Inject
import kotlin.random.Random
import kotlin.random.nextInt
@HiltViewModel
class SelfMockVm @Inject constructor(
@ApplicationContext private var context: Context,
) : ViewModel() {
var mMineMap: MineMap? = null
private var gson = Gson()
//泊车首次只进来一次
private var isPark = false
//泊车首次只进来一次
private var isParking = false
//召车车首次只进来一次
private var isCall = false
//泊车全路线
private var mRoutesPark: MRoutes? = null
//召车全路径
private var mRoutesCall: MRoutes? = null
//接受从自己服务器来的数据
suspend fun selfCar(str: String, carVehicle: MutableStateFlow<CarVehicle>) {
withContext(Dispatchers.Main) {
//读取本地文件,用于生成全局路径
if (mRoutesPark == null) {
val parkStr =
FileIoUtils.getAsset(context, "mock/Car_fangzhen_park.txt")
mRoutesPark = gson.fromJson<MRoutes>(parkStr, MRoutes::class.java)
}
if (mRoutesCall == null) {
var strCall =
FileIoUtils.getAsset(context, "mock/Car_fangzhen_call.txt")
mRoutesCall = gson.fromJson(strCall, MRoutes::class.java)
}
val random = Random
var cCar: CarVehicle? = null
val carBak = gson.fromJson(str, CarVehicleBak::class.java)//服务器推来的数据
if (carBak.businessStatus.equals("park")) {
if (!isPark) {
isPark = true
//画局部图小车
drawNavingCar(
Tools.latLngToPoint(
LatLng(
39.81014469509955,
116.50238005214746
)
)
)
//画局部图路径
smallLineMock(mRoutesPark!!)
//画终点
addEndMarker(LatLng(39.809039362307594, 116.50254394816011))
//用矩形框柱
drawEndArea(
39.81014469509955,
116.50238005214746,
39.809039362307594,
116.50254394816011,
)
//画出全局路径
val lines = mRoutesPark!!.rs.map {
AllLine(it[1], it[0])
}
HighMapApi.setCarNavPath(lines, showdistance = 200)
//开启流光效果
HighMapApi.parkRoundLight("B017")
//2旁车辆占用
var spinfos = listOf(Spinfo().apply {
code = "B016"
state = true
}, Spinfo().apply {
code = "B018"
state = true
})
HighMapApi.setParkStatu(ParkStatu(spinfos))
}
//变速
CarPanelBean.instance.speed.set(random.nextInt(10..15))
//更新主车位置
cCar = CarVehicle().apply {
this.vehiclePos = carBak.vehiclePos
this.businessStatus = carBak.businessStatus
}
carVehicle.value = cCar
//更新小地图小车
showNavingCarPosition(
Tools.latLngToNdsPoint(
LatLng(
carBak.vehiclePos!!.get(1),
carBak.vehiclePos!!.get(0)
)
),
carBak.vehiclePos!!.get(2).toFloat()
)
//更新小地图路径
// println("-------------carBak = ${carBak.carPos}")
upSmallLine(carBak.carPos, mRoutesPark!!)
} else if (carBak.businessStatus.equals("parking")) {//倒车入库
if (!isParking) {
isParking = true
//消除全局路径
HighMapApi.setCarNavPath(listOf())
//删除终点mark
deleteEndMarker()
//绘制倒车路径
var reverCar = ReverCar().apply {
this.cenLat = 39.80903159
this.cenLng = 116.50246079
this.code = "B017"
}
HighMapApi.setParkRever(reverCar)
//改变镜头角度
HighMapApi.setCameraAngle(90f)
HighMapApi.setCameraDistance(20f)
CarPanelBean.instance.speed.set(5)//减速
//挂倒挡
CarPanelBean.instance.tapPos.set(3)
}
//更新主车位置
cCar = CarVehicle().apply {
this.vehiclePos = carBak.vehiclePos
this.businessStatus = carBak.businessStatus
}
carVehicle.value = cCar
} else if (carBak.businessStatus.equals("park_com")) {
//结束泊车
HighMapApi.setParkComplete(true)
//删除导航小地图小车
deleteNavingCar()
//关闭流光效果
HighMapApi.parkRoundLight("")
//挂P档
CarPanelBean.instance.tapPos.set(1)
CarPanelBean.instance.speed.set(0)
//给个提示
ToastHelper.showShort(context, "泊车完成")
} else if (carBak.businessStatus.equals("call")) {//开始召车
if (!isCall) {
isCall = true
//初始镜头角度
// HighMapApi.setCameraAngle(90f)
// HighMapApi.setCameraDistance(20f)
//2旁车辆占用
var spinfos = listOf(Spinfo().apply {
code = "B016"
state = true
}, Spinfo().apply {
code = "B018"
state = true
})
HighMapApi.setParkStatu(ParkStatu(spinfos))
//画局部图小车
drawNavingCar(Tools.latLngToPoint(LatLng(39.8090317, 116.5024625)))
//画终点
addEndMarker(LatLng(39.809955271, 116.50204936))
//用矩形框柱
drawEndArea(
39.8090317,
116.5024625,
39.809955271625505,
116.50204936866068
)
//挂前进挡
CarPanelBean.instance.tapPos.set(2)
//生成局部图路径
smallLineMock(mRoutesCall!!)
//画出全局路径
var lines = mRoutesCall!!.rs.map {
AllLine(it[1], it[0])
}
HighMapApi.setCarNavPath(lines, showdistance = 200)
//开始跟车
HighMapApi.setCameraAngle(30f)
HighMapApi.setCameraDistance(8f)
}
//更新主车位置
cCar = CarVehicle().apply {
this.vehiclePos = carBak.vehiclePos
this.businessStatus = carBak.businessStatus
}
carVehicle.value = cCar
//更新小地图小车
showNavingCarPosition(
Tools.latLngToNdsPoint(
LatLng(
cCar.vehiclePos!!.get(1),
cCar.vehiclePos!!.get(0)
)
),
cCar.vehiclePos!!.get(2).toFloat()
)
//更新小地图路径
upSmallLine(carBak.carPos, mRoutesCall!!)
if (carBak.carPos <= 139) {
//正在小心翼翼的出库
CarPanelBean.instance.speed.set(random.nextInt(1..5))
} else {
//开起来了
CarPanelBean.instance.speed.set(random.nextInt(10..16))
}
} else if (carBak.businessStatus.equals("call_com")) {
//消除全局路径
HighMapApi.setCarNavPath(listOf())
//删除终点mark
deleteEndMarker()
//挂N档等人
CarPanelBean.instance.tapPos.set(0)
CarPanelBean.instance.speed.set(0)
ToastHelper.showShort(context, "召车完成")
}
}
}
private var mSmallMapCar: MyLocationStyle? = null
//画小地图小车
fun drawNavingCar(point: Point) {
if (mSmallMapCar == null) {
// mSmallMapCar = MyLocationStyle(R.drawable.angle_blue, true)
mSmallMapCar = MyLocationStyle("res/icons/carIconInSmallMap.png", true)
mSmallMapCar?.myLocationType(MyLocationStyle.LOCATION_TYPE_EXTERNAL)
val scaleFactor = -
Math.round(((10 * NativeEnv.getDpi() * 2) * 10 / (160 * 48)).toFloat())
.toFloat() / 10
mSmallMapCar?.scaleFactor(scaleFactor)
mSmallMapCar?.anchor(0.5f, 0.5f)
mSmallMapCar?.setPosition(point)
mMineMap?.setMyLocationStyle(mSmallMapCar)
}
}
var sPolyline: Polyline? = null
//点坐标集合
var sLatLngs: List<LatLng>? = null
//模拟小地图路径
private fun smallLineMock(mRoutes: MRoutes) {
sLatLngs = mRoutes.rs.map {
LatLng(it[1], it[0])
}
}
//路径规划终点
private var pEndMarker: Marker? = null
/**画路径起终点***/
fun addEndMarker(
mEndPoint: LatLng
) {
//删除终点marker
deleteEndMarker()
val end_icon = BitmapFactory.decodeResource(context.resources, R.drawable.plan_end)
// var endlatLng = Tools.pointToLatLng(mEndPoint)
pEndMarker = mMineMap?.addMarker(
MarkerOptions().zLevel(7).position(mEndPoint).bitmap(end_icon)
)
}
private fun deleteEndMarker() {
if (pEndMarker != null) {
mMineMap?.removeMarker(pEndMarker)
pEndMarker = null
}
}
fun drawEndArea(lat1: Double, lon1: Double, lat2: Double, lon2: Double) {
val MU = 100000
var minLat = Math.min(lat1, lat2).times(MU).toInt() - 100
var maxLat = Math.max(lat1, lat2).times(MU).toInt() + 100
var minLon = Math.min(lon1, lon2).times(MU).toInt() - 10
var maxLon = Math.max(lon1, lon2).times(MU).toInt() + 10
var rect = Rect(
minLon, minLat, maxLon, maxLat
)
mMineMap?.fitWorldArea(rect)
}
/**
* 刷新导航中的自车位置
*/
fun showNavingCarPosition(ndsPoint: NdsPoint?, heading: Float) {
synchronized(NativeEnv.SyncObject) {
if (ndsPoint == null) {
return
}
//刷新小地图自车位置
if (mSmallMapCar != null) {
var cHeading = 0f - 180f - heading
mSmallMapCar!!.orientAngle(cHeading)
// mSmallMapCar!!.orientAngle(heading)
mSmallMapCar!!.setPositionNds(Tools.ndsPointToLatLng(ndsPoint))
}
}
}
//更新小地图路径
private fun upSmallLine(index: Int, mRoutes: MRoutes) {
if (sPolyline != null) {
mMineMap?.removeOverlay(sPolyline)
sPolyline?.release()
}
var temps = sLatLngs?.subList(index, sLatLngs!!.count())
var nPoints = temps?.map {
Tools.latLngToNdsPoint(it)
}?.toTypedArray()
synchronized(NativeEnv.SyncObject) {
sPolyline = Polyline(nPoints, false)
sPolyline?.setStrokeStyle(Overlay.StrokeStyle.solidWithButt)
sPolyline?.setWidth(8f)
sPolyline?.setColor(0xFF00B578.toInt())
mMineMap?.addOverlay(sPolyline)
}
}
/**
* 移除导航小车
*/
fun deleteNavingCar() {
if (mMineMap != null && mSmallMapCar != null) {
mMineMap?.removeOverlay(mSmallMapCar)
mSmallMapCar!!.release()
mSmallMapCar = null
}
}
}
\ 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