Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
p x
C-AVP2.0
Commits
e700e552
Commit
e700e552
authored
Jan 23, 2026
by
p x
Browse files
AVP 接后端模拟数据
parent
42aa7c93
Changes
9
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/com/sd/cavphmi/bean/CarVehicle.kt
View file @
e700e552
...
@@ -22,10 +22,10 @@ package com.sd.cavphmi.bean
...
@@ -22,10 +22,10 @@ package com.sd.cavphmi.bean
//)
//)
class
CarVehicle
{
class
CarVehicle
{
va
l
businessStatus
:
String
=
""
va
r
businessStatus
:
String
=
""
// val progress: Any = ""
// val progress: Any = ""
// val routing: List<Any>? = null
// val routing: List<Any>? = null
va
l
spaceName
:
String
=
""
va
r
spaceName
:
String
=
""
//vehiclePos 里面分别是 经度、纬度、航向角
//vehiclePos 里面分别是 经度、纬度、航向角
var
vehiclePos
:
List
<
Double
>?
=
null
var
vehiclePos
:
List
<
Double
>?
=
null
...
...
app/src/main/java/com/sd/cavphmi/bean/CarVehicleBak.kt
0 → 100644
View file @
e700e552
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
app/src/main/java/com/sd/cavphmi/bean/mock/CarVeh.kt
deleted
100644 → 0
View file @
42aa7c93
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
app/src/main/java/com/sd/cavphmi/ui/LoginActivity.kt
View file @
e700e552
...
@@ -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()
}
}
}
}
}
}
...
...
app/src/main/java/com/sd/cavphmi/ui/MainActivity.kt
View file @
e700e552
...
@@ -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
)
}
}
...
...
app/src/main/java/com/sd/cavphmi/utils/MyContants.kt
View file @
e700e552
...
@@ -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
=
"http
s
://1
72.24.124.130:19443
"
const
val
HOST
=
"http://1
92.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:809
0
"
var
BASE_HOST
=
"192.168.60.218:809
1
"
// 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
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MainVm.kt
View file @
e700e552
...
@@ -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
=
fals
e
var
isMock
=
tru
e
//车辆位姿数据
//车辆位姿数据
// 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
app/src/main/java/com/sd/cavphmi/viewmodels/MockVM.kt
View file @
e700e552
...
@@ -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
()
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/SelfMockVm.kt
0 → 100644
View file @
e700e552
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment