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
SuZhouAvp
Commits
9968f320
Commit
9968f320
authored
Aug 27, 2025
by
p x
Browse files
使用模拟数据调通界面
parent
59b1b616
Changes
26
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/com/sd/cavphmi/bean/CarPanelBean.kt
View file @
9968f320
...
@@ -35,9 +35,8 @@ class CarPanelBean {
...
@@ -35,9 +35,8 @@ class CarPanelBean {
var
tapPos
=
ObservableField
<
Int
>(
GearStatus
.
P
)
var
tapPos
=
ObservableField
<
Int
>(
GearStatus
.
P
)
var
gear
=
0
var
gear
=
0
//剩余
油量或
电量
//剩余电量
var
remainSoc
=
ObservableField
<
Int
>(
0
)
var
remainSoc
=
ObservableField
<
Int
>(
0
)
var
soc
=
0
//转向灯 1=left 2=right
//转向灯 1=left 2=right
var
lights
=
0
var
lights
=
0
...
...
app/src/main/java/com/sd/cavphmi/bean/V2xStartBean.kt
View file @
9968f320
...
@@ -5,14 +5,14 @@ package com.sd.cavphmi.bean
...
@@ -5,14 +5,14 @@ package com.sd.cavphmi.bean
data class
V2xStartBean
(
data class
V2xStartBean
(
val
id
:
String
,
val
id
:
String
,
val
level
:
Int
,
val
level
:
Int
,
val
objects
:
List
<
Object
>,
val
objects
:
List
<
V
Object
>,
val
reportTime
:
Long
,
val
reportTime
:
Long
,
val
startTime
:
Long
,
val
startTime
:
Long
,
val
type
:
Int
,
val
type
:
Int
,
val
typeName
:
String
val
typeName
:
String
)
)
data class
Object
(
data class
V
Object
(
val
elevation
:
Double
,
val
elevation
:
Double
,
val
id
:
String
,
val
id
:
String
,
val
latitude
:
Double
,
val
latitude
:
Double
,
...
...
app/src/main/java/com/sd/cavphmi/bean/VehDetailBean.kt
View file @
9968f320
...
@@ -22,5 +22,5 @@ data class VehicleInfo(
...
@@ -22,5 +22,5 @@ data class VehicleInfo(
val
vehicleImgUrl
:
Any
,
val
vehicleImgUrl
:
Any
,
val
vehicleOwnerName
:
Any
,
val
vehicleOwnerName
:
Any
,
val
vehicleOwnerPhone
:
Any
,
val
vehicleOwnerPhone
:
Any
,
val
vehicleVideoUrl
:
Any
val
vehicleVideoUrl
:
String
)
)
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/bean/WarningBean.kt
0 → 100644
View file @
9968f320
package
com.sd.cavphmi.bean
import
com.sd.cavphmi.R
/**构造预警的文字和图标**/
class
WarningBean
{
// var type = -1
var
img
=
R
.
drawable
.
chao_su
//提示文字
var
tipStr
=
""
companion
object
{
val
instance
:
WarningBean
by
lazy
{
WarningBean
()
}
}
}
app/src/main/java/com/sd/cavphmi/bindadapters/ShowEarTipBase.kt
0 → 100644
View file @
9968f320
package
com.sd.cavphmi.bindadapters
import
android.widget.ImageView
import
androidx.annotation.DrawableRes
import
androidx.databinding.BindingAdapter
object
ShowEarTipBase
{
@JvmStatic
@BindingAdapter
(
"showEarlyTipImg"
)
fun
showEarlyTipImg
(
iv
:
ImageView
,
@DrawableRes
res
:
Int
)
{
iv
.
setImageResource
(
res
)
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/net/HeadParamsInterceptor.kt
View file @
9968f320
...
@@ -21,7 +21,8 @@ class HeadParamsInterceptor @Inject constructor() : Interceptor {
...
@@ -21,7 +21,8 @@ class HeadParamsInterceptor @Inject constructor() : Interceptor {
request
.
header
(
"token"
,
MyContants
.
HTTP_TOKEN
)
request
.
header
(
"token"
,
MyContants
.
HTTP_TOKEN
)
request
.
header
(
"Authorization"
,
MyContants
.
HTTP_TOKEN
)
request
.
header
(
"Authorization"
,
MyContants
.
HTTP_TOKEN
)
}
}
request
.
header
(
"Referer"
,
"${MyContants.HOST}/itdts-portal-v5/intelligence-parking"
)
// request.header("Referer", "${MyContants.HOST}/itdts-portal-v5/intelligence-parking")
request
.
header
(
"Referer"
,
"https://itg-yz.cu-sc.com:13443/itdts-portal-v5/intelligence-parking"
)
return
chain
.
proceed
(
request
.
build
())
return
chain
.
proceed
(
request
.
build
())
}
}
...
...
app/src/main/java/com/sd/cavphmi/ui/LoginActivity.kt
View file @
9968f320
...
@@ -46,8 +46,7 @@ class LoginActivity : AppCompatActivity() {
...
@@ -46,8 +46,7 @@ class LoginActivity : AppCompatActivity() {
startActivity
(
Intent
(
this
,
MainActivity
::
class
.
java
))
startActivity
(
Intent
(
this
,
MainActivity
::
class
.
java
))
}
}
//获取车辆信息
// HTTP获取车辆详情
// HTTP获取车辆详情 还没调通
binding
.
btVehinfo
.
setOnClickListener
{
binding
.
btVehinfo
.
setOnClickListener
{
mainVm
.
getVehDetail
()
mainVm
.
getVehDetail
()
}
}
...
...
app/src/main/java/com/sd/cavphmi/ui/MainActivity.kt
View file @
9968f320
package
com.sd.cavphmi.ui
package
com.sd.cavphmi.ui
import
android.animation.AnimatorSet
import
android.animation.ObjectAnimator
import
android.os.Handler
import
android.os.Looper
import
android.util.Log
import
android.view.KeyEvent
import
android.view.KeyEvent
import
android.widget.
ImageView
import
android.widget.
RelativeLayout
import
androidx.activity.viewModels
import
androidx.activity.viewModels
import
androidx.lifecycle.ViewModelProvider
import
androidx.lifecycle.ViewModelProvider
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.R
import
com.sd.cavphmi.R
import
com.sd.cavphmi.base.BaseActivity
import
com.sd.cavphmi.base.BaseActivity
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.databinding.ActivityMainBinding
import
com.sd.cavphmi.databinding.ActivityMainBinding
import
com.sd.cavphmi.intfaces.OnConCan
import
com.sd.cavphmi.intfaces.OnConCan
import
com.sd.cavphmi.ui.fragment.CarPanelFragment
import
com.sd.cavphmi.ui.fragment.CarPanelFragment
import
com.sd.cavphmi.ui.fragment.ExoPlayFragment
import
com.sd.cavphmi.ui.fragment.ExoPlayFragment
import
com.sd.cavphmi.utils.DisplayUtil
import
com.sd.cavphmi.viewmodels.MainVm
import
com.sd.cavphmi.viewmodels.MainVm
import
com.sd.cavphmi.viewmodels.MockVM
import
com.sd.cavphmi.viewmodels.MockVM
import
dagger.hilt.android.AndroidEntryPoint
import
dagger.hilt.android.AndroidEntryPoint
/**
* Main activity
*
* @constructor Create empty Main activity
*/
@AndroidEntryPoint
@AndroidEntryPoint
class
MainActivity
:
BaseActivity
<
ActivityMainBinding
,
M
ainVm
>()
{
class
MainActivity
:
BaseActivity
<
ActivityMainBinding
,
M
yBaseViewModel
>()
{
override
fun
getStatuBarColor
():
Int
{
override
fun
getStatuBarColor
():
Int
{
return
-
1
return
-
1
...
@@ -32,135 +34,135 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
...
@@ -32,135 +34,135 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
return
R
.
layout
.
activity_main
return
R
.
layout
.
activity_main
}
}
override
fun
initViewModel
():
M
ainVm
{
override
fun
initViewModel
():
M
yBaseViewModel
{
return
ViewModelProvider
(
this
).
get
(
M
ainVm
::
class
.
java
)
return
ViewModelProvider
(
this
).
get
(
M
yBaseViewModel
::
class
.
java
)
}
}
override
fun
initVariableId
():
Int
{
override
fun
initVariableId
():
Int
{
return
BR
.
vm
return
BR
.
vm
}
}
private
var
isPlay
=
false
//用作模拟
private
var
type
=-
11
//预警类型
private
val
mockVM
:
MockVM
by
viewModels
()
private
val
mockVM
:
MockVM
by
viewModels
()
private
val
mainVm
:
MainVm
by
viewModels
()
// private val avpMapVM: AvpMapVM by viewModels()
// private val avpMapVM: AvpMapVM by viewModels()
//退出应用弹窗
private
lateinit
var
dialogFragment
:
ExitAppDialog
private
lateinit
var
dialogFragment
:
ExitAppDialog
//汽车仪表
//汽车仪表
private
val
carPanelFragment
by
lazy
{
CarPanelFragment
.
newInstance
()
}
private
val
carPanelFragment
by
lazy
{
CarPanelFragment
.
newInstance
()
}
//exo播放器
//exo播放器
private
val
exoPlayFragment
by
lazy
{
ExoPlayFragment
.
newInstance
(
""
)
}
private
val
exoPlayFragment
by
lazy
{
ExoPlayFragment
.
newInstance
()
}
override
fun
initView
()
{
override
fun
initView
()
{
viewModel
.
mockVM
=
mockVM
mainVm
.
mockVM
=
mockVM
//车辆仪表
var
ft
=
supportFragmentManager
.
beginTransaction
()
var
ft
=
supportFragmentManager
.
beginTransaction
()
ft
.
add
(
R
.
id
.
map_car_pan
,
carPanelFragment
,
"1"
)
ft
.
add
(
R
.
id
.
map_car_pan
,
carPanelFragment
,
"1"
)
ft
.
commit
()
ft
.
commit
()
//添加视频播放器,以后看需要控制显示隐藏时机
//设置视频播放器长和宽
var
ft2
=
supportFragmentManager
.
beginTransaction
()
var
height
=
DisplayUtil
.
getScreenHeightPx
().
div
(
3
)
-
20
var
width
=
height
.
times
(
2
)
-
30
var
params
=
binding
.
videoFrag
.
layoutParams
as
RelativeLayout
.
LayoutParams
params
.
width
=
width
params
.
height
=
height
binding
.
videoFrag
.
layoutParams
=
params
//添加视频播放器,以后看需要控制显示隐藏时机,默认隐藏
var
ft2
=
supportFragmentManager
.
beginTransaction
()
ft2
.
add
(
R
.
id
.
video_frag
,
exoPlayFragment
,
"player"
)
ft2
.
add
(
R
.
id
.
video_frag
,
exoPlayFragment
,
"player"
)
ft2
.
hide
(
exoPlayFragment
)
ft2
.
commit
()
ft2
.
commit
()
}
}
override
fun
getToData
()
{
override
fun
getToData
()
{
viewModel
.
startWS
()
//开启websocket
// mainVm.startWS()
}
}
override
fun
initListener
()
{
override
fun
initListener
()
{
mockBt
()
mockBt
()
mockLis
()
}
private
fun
mockLis
()
{
}
}
private
fun
mockBt
()
{
private
fun
mockBt
()
{
//联网车辆位姿数据
//联网车辆位姿数据
binding
.
btVehicle
.
setOnClickListener
{
binding
.
btVehicle
.
setOnClickListener
{
viewModel
.
subVehicle
().
observe
(
this
)
{
mainVm
.
subVehicle
().
observe
(
this
)
{
// topicVehicle(it)
}
}
}
}
//感知目标物
//感知目标物
binding
.
btTarget
.
setOnClickListener
{
binding
.
btTarget
.
setOnClickListener
{
viewModel
.
subTarget
()
mainVm
.
subTarget
()
}
}
//v2x 预警
//v2x 预警
binding
.
btV2x
.
setOnClickListener
{
binding
.
btV2x
.
setOnClickListener
{
viewModel
.
subStartV2x
()
mainVm
.
subStartV2x
()
}
viewModel
.
v2xStartBean
.
observe
(
this
){
Log
.
e
(
"V2x"
,
"-------------typeName--"
+
it
.
typeName
)
if
(
isPlay
){
return
@observe
}
else
{
isPlay
=
true
setImage
()
Handler
(
Looper
.
getMainLooper
()).
postDelayed
(
displayRunnable
,
5000
)
}
}
}
//网联车辆状态
// binding.btStatus.setOnClickListener {
// viewModel.subVehicleStatus()
// }
//交通感知事件
// binding.btTarpre.setOnClickListener {
// viewModel.subTrafficPre()
// }
//交通信号灯
// binding.btTarlight.setOnClickListener {
// viewModel.subTrafficLight()
// }
}
}
private
fun
setImage
()
{
if
(
viewModel
.
v2xStartBean
.
value
.
type
==
1
){
//前向碰撞
/**
binding
.
viewPopuler
.
setImageResource
(
R
.
drawable
.
advance
)
* Show video play
startPulseAnimation
(
binding
.
viewPopuler
)
* @param isHide false:隐藏 true:显示
}
else
if
(
viewModel
.
v2xStartBean
.
value
.
type
==
3
){
//左转辅助
*/
binding
.
viewPopuler
.
setImageResource
(
R
.
drawable
.
left_icon
)
private
fun
showVideoPlay
(
isHide
:
Boolean
)
{
startPulseAnimation
(
binding
.
viewPopuler
)
// exoPlayFragment.videoUri=""
}
else
if
(
viewModel
.
v2xStartBean
.
value
.
type
==
4
){
//盲区预警
var
ft
=
supportFragmentManager
.
beginTransaction
()
binding
.
viewPopuler
.
setImageResource
(
R
.
drawable
.
change_lanes
)
if
(
isHide
)
{
startPulseAnimation
(
binding
.
viewPopuler
)
ft
.
hide
(
exoPlayFragment
)
}
else
if
(
viewModel
.
v2xStartBean
.
value
.
type
==
6
){
//紧急制动预警
}
else
{
binding
.
viewPopuler
.
setImageResource
(
R
.
drawable
.
stop_icon
)
ft
.
show
(
exoPlayFragment
)
startPulseAnimation
(
binding
.
viewPopuler
)
}
else
if
(
viewModel
.
v2xStartBean
.
value
.
type
==
12
){
//弱势交通参与者
binding
.
viewPopuler
.
setImageResource
(
R
.
drawable
.
weak
)
startPulseAnimation
(
binding
.
viewPopuler
)
}
else
{
binding
.
viewPopuler
.
setImageResource
(
0
)
}
}
ft
.
commit
()
}
}
fun
startPulseAnimation
(
imageView
:
ImageView
)
{
val
alphaAnim
=
ObjectAnimator
.
ofFloat
(
imageView
,
"alpha"
,
1.0f
,
0.5f
)
val
scaleXAnim
=
ObjectAnimator
.
ofFloat
(
imageView
,
"scaleX"
,
1.0f
,
1.2f
)
val
scaleYAnim
=
ObjectAnimator
.
ofFloat
(
imageView
,
"scaleY"
,
1.0f
,
1.2f
)
val
set
=
AnimatorSet
().
apply
{
/* private fun setImage() {
playTogether
(
alphaAnim
,
scaleXAnim
,
scaleYAnim
)
if(mainVm.v2xStartBean.value.type==1){//前向碰撞
duration
=
300
binding.viewPopuler.setImageResource(R.drawable.advance)
startPulseAnimation(binding.viewPopuler)
}else if(mainVm.v2xStartBean.value.type==3){//左转辅助
binding.viewPopuler.setImageResource(R.drawable.left_icon)
startPulseAnimation(binding.viewPopuler)
}else if(mainVm.v2xStartBean.value.type==4){//盲区预警
binding.viewPopuler.setImageResource(R.drawable.change_lanes)
startPulseAnimation(binding.viewPopuler)
}else if(mainVm.v2xStartBean.value.type==6){//紧急制动预警
binding.viewPopuler.setImageResource(R.drawable.stop_icon)
startPulseAnimation(binding.viewPopuler)
}else if(mainVm.v2xStartBean.value.type==12){//弱势交通参与者
binding.viewPopuler.setImageResource(R.drawable.weak)
startPulseAnimation(binding.viewPopuler)
}else{
binding.viewPopuler.setImageResource(0)
}
}*/
/* fun startPulseAnimation(imageView: ImageView) {
val alphaAnim = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.5f)
val scaleXAnim = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 1.2f)
val scaleYAnim = ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 1.2f)
val set = AnimatorSet().apply {
playTogether(alphaAnim, scaleXAnim, scaleYAnim)
duration = 300
}
set.start()
}
}
set
.
start
()
}
private
val
displayRunnable
=
object
:
Runnable
{
private val displayRunnable = object : Runnable {
override
fun
run
()
{
override fun run() {
isPlay
=
false
isPlay
=
false
}
}
}
}
*/
override
fun
dispatchKeyEvent
(
event
:
KeyEvent
):
Boolean
{
override
fun
dispatchKeyEvent
(
event
:
KeyEvent
):
Boolean
{
if
((
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_BACK
)
||
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_HOME
)
{
if
((
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_BACK
)
||
event
.
getKeyCode
()
==
KeyEvent
.
KEYCODE_HOME
)
{
...
@@ -168,7 +170,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
...
@@ -168,7 +170,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
dialogFragment
=
ExitAppDialog
()
dialogFragment
=
ExitAppDialog
()
dialogFragment
.
onConCan
=
object
:
OnConCan
{
dialogFragment
.
onConCan
=
object
:
OnConCan
{
override
fun
onCon
()
{
override
fun
onCon
()
{
viewModel
.
cleanRes
()
mainVm
.
cleanRes
()
finish
()
finish
()
}
}
...
@@ -196,6 +198,9 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
...
@@ -196,6 +198,9 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
//需求文档里的气泡提醒,数据未必有,已实际数据为准
//需求文档里的气泡提醒,数据未必有,已实际数据为准
//【腾讯文档】AVP-HMI接口需求清单
//https://docs.qq.com/sheet/DVmNmZ3VhVEFxRkpV?tab=BB08J2
...
...
app/src/main/java/com/sd/cavphmi/ui/fragment/CarPanelFragment.kt
View file @
9968f320
package
com.sd.cavphmi.ui.fragment
package
com.sd.cavphmi.ui.fragment
import
android.graphics.Color
import
androidx.activity.viewModels
import
androidx.fragment.app.activityViewModels
import
androidx.fragment.app.activityViewModels
import
androidx.fragment.app.viewModels
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.ViewModelProvider
import
androidx.lifecycle.ViewModelProvider
import
androidx.lifecycle.lifecycleScope
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.R
import
com.sd.cavphmi.R
import
com.sd.cavphmi.base.BaseFragment
import
com.sd.cavphmi.base.BaseFragment
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.CarVehicleItem
import
com.sd.cavphmi.databinding.FragmentCarPanelBinding
import
com.sd.cavphmi.databinding.FragmentCarPanelBinding
import
com.sd.cavphmi.viewmodels.CarPanelVM
import
com.sd.cavphmi.viewmodels.MainVm
import
com.sd.cavphmi.viewmodels.MainVm
import
com.sd.cavphmi.viewmodels.MockVM
import
dagger.hilt.android.AndroidEntryPoint
import
dagger.hilt.android.AndroidEntryPoint
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
...
@@ -29,7 +19,7 @@ import kotlinx.coroutines.launch
...
@@ -29,7 +19,7 @@ import kotlinx.coroutines.launch
* 车仪表
* 车仪表
*/
*/
@AndroidEntryPoint
@AndroidEntryPoint
class
CarPanelFragment
:
BaseFragment
<
FragmentCarPanelBinding
,
MainVm
>()
{
class
CarPanelFragment
:
BaseFragment
<
FragmentCarPanelBinding
,
CarPanelVM
>()
{
//
//
// private var param1: String? = null
// private var param1: String? = null
// private var param2: String? = null
// private var param2: String? = null
...
@@ -42,14 +32,10 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
...
@@ -42,14 +32,10 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
// }
// }
// }
// }
private
val
mockVM
:
MockVM
by
activityViewModels
()
override
fun
getStatuBarColor
():
Int
{
override
fun
getStatuBarColor
():
Int
{
return
-
1
return
-
1
}
}
override
fun
isAutoStatusBarDarkModeEnable
():
Boolean
{
override
fun
isAutoStatusBarDarkModeEnable
():
Boolean
{
return
false
return
false
}
}
...
@@ -58,19 +44,20 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
...
@@ -58,19 +44,20 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
return
R
.
layout
.
fragment_car_panel
return
R
.
layout
.
fragment_car_panel
}
}
override
fun
initViewModel
():
MainVm
{
override
fun
initViewModel
():
CarPanelVM
{
return
ViewModelProvider
(
this
).
get
(
MainVm
::
class
.
java
)
return
ViewModelProvider
(
this
).
get
(
CarPanelVM
::
class
.
java
)
}
}
override
fun
initVariableId
():
Int
{
override
fun
initVariableId
():
Int
{
return
BR
.
vm
return
BR
.
vm
}
}
private
val
mainVm
:
MainVm
by
activityViewModels
()
private
var
currentNumber
=
0
// 初始数字
private
var
currentNumber
=
0
// 初始数字
override
fun
initView
()
{
override
fun
initView
()
{
viewModel
.
mockVM
=
mockVM
binding
.
cpBean
=
viewModel
.
carPanelBean
binding
.
cpBean
=
viewModel
.
carPanelBean
// //驾驶模式
// //驾驶模式
// if(viewModel.carPanelBean.driveMode=="1"){
// if(viewModel.carPanelBean.driveMode=="1"){
// binding.tvDrivemode.text="自动驾驶"
// binding.tvDrivemode.text="自动驾驶"
...
@@ -78,55 +65,59 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
...
@@ -78,55 +65,59 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
// binding.tvDrivemode.text="人工驾驶"
// binding.tvDrivemode.text="人工驾驶"
// }
// }
//车灯
//车灯
if
(
viewModel
.
carPanelBean
.
lights
==
0
){
/*
if
(viewModel.carPanelBean.lights
==
0)
{
binding
.
ivLeftLight
.
setImageResource
(
R
.
drawable
.
trun_left_grey
)
binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey)
binding
.
ivRightLight
.
setImageResource
(
R
.
drawable
.
trun_left_grey
)
binding.ivRightLight.setImageResource(R.drawable.trun_left_grey)
}
else
if
(
viewModel
.
carPanelBean
.
lights
==
1
){
}
else if
(viewModel.carPanelBean.lights
==
1)
{
binding
.
ivLeftLight
.
setImageResource
(
R
.
drawable
.
trun_left_blue
)
binding.ivLeftLight.setImageResource(R.drawable.trun_left_blue)
binding
.
ivRightLight
.
setImageResource
(
R
.
drawable
.
trun_left_grey
)
binding.ivRightLight.setImageResource(R.drawable.trun_left_grey)
}
else
{
}
else
{
binding
.
ivLeftLight
.
setImageResource
(
R
.
drawable
.
trun_left_grey
)
binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey)
binding
.
ivRightLight
.
setImageResource
(
R
.
drawable
.
trun_right_blue
)
binding.ivRightLight.setImageResource(R.drawable.trun_right_blue)
}
}
//档位
//档位
if
(
viewModel
.
carPanelBean
.
gear
==
0
){
if
(viewModel.carPanelBean.gear
==
0)
{
binding
.
tvP
.
setTextColor
(
Color
.
BLUE
)
binding.tvP.setTextColor(Color.BLUE)
binding
.
tvR
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvR.setTextColor(resources.getColor(R.color.text_grey))
binding
.
tvN
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvN.setTextColor(resources.getColor(R.color.text_grey))
binding
.
tvD
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
}
else
if
(
viewModel
.
carPanelBean
.
gear
==
1
){
}
else if
(viewModel.carPanelBean.gear
==
1)
{
binding
.
tvP
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding
.
tvR
.
setTextColor
(
Color
.
BLUE
)
binding.tvR.setTextColor(Color.BLUE)
binding
.
tvN
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvN.setTextColor(resources.getColor(R.color.text_grey))
binding
.
tvD
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
}
else
if
(
viewModel
.
carPanelBean
.
gear
==
2
){
}
else if
(viewModel.carPanelBean.gear
==
2)
{
binding
.
tvP
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding
.
tvR
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvR.setTextColor(resources.getColor(R.color.text_grey))
binding
.
tvN
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvN.setTextColor(resources.getColor(R.color.text_grey))
binding
.
tvD
.
setTextColor
(
Color
.
BLUE
)
binding.tvD.setTextColor(Color.BLUE)
}
else
if
(
viewModel
.
carPanelBean
.
gear
==
3
){
}
else if
(viewModel.carPanelBean.gear
==
3)
{
binding
.
tvP
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding
.
tvR
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvR.setTextColor(resources.getColor(R.color.text_grey))
binding
.
tvN
.
setTextColor
(
Color
.
BLUE
)
binding.tvN.setTextColor(Color.BLUE)
binding
.
tvD
.
setTextColor
(
resources
.
getColor
(
R
.
color
.
text_grey
))
binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
}
}
// 启动协程定时切换
// 启动协程定时切换
lifecycleScope
.
launch
{
lifecycleScope.launch {
while
(
true
)
{
while (true) {
if
(
currentNumber
>
100
){
if
(currentNumber
>
100)
{
return
@launch
return@launch
}
}
binding
.
tvSoc
.
text
=
"${currentNumber}%"
binding.tvSoc.text = "${currentNumber}%"
binding
.
proSoc
.
progress
=
currentNumber
binding.proSoc.progress = currentNumber
delay
(
1000
)
// 等待10秒
delay(1000) // 等待10秒
currentNumber
++
currentNumber++
println
(
"-----"
+
currentNumber
)
println("-----"
+
currentNumber)
}
}
}
}*/
}
}
override
fun
initListener
()
{
override
fun
initListener
()
{
mainVm
.
carVehicle
.
observe
(
this
)
{
//更新车辆仪表,这里模拟只取第一个
viewModel
.
setCarPanelBean
(
it
)
}
}
}
...
...
app/src/main/java/com/sd/cavphmi/ui/fragment/ExoPlayFragment.kt
View file @
9968f320
package
com.sd.cavphmi.ui.fragment
package
com.sd.cavphmi.ui.fragment
import
android.os.Bundle
import
android.os.Bundle
import
androidx.annotation.OptIn
import
androidx.lifecycle.ViewModelProvider
import
androidx.lifecycle.ViewModelProvider
import
androidx.media3.common.AudioAttributes
import
androidx.media3.common.AudioAttributes
import
androidx.media3.common.MediaItem
import
androidx.media3.common.MediaItem
import
androidx.media3.common.PlaybackException
import
androidx.media3.common.PlaybackException
import
androidx.media3.common.Player
import
androidx.media3.common.Player
import
androidx.media3.common.util.UnstableApi
import
androidx.media3.exoplayer.ExoPlayer
import
androidx.media3.exoplayer.ExoPlayer
import
androidx.media3.exoplayer.trackselection.DefaultTrackSelector
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.R
import
com.sd.cavphmi.R
import
com.sd.cavphmi.base.BaseFragment
import
com.sd.cavphmi.base.BaseFragment
...
@@ -78,7 +75,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
...
@@ -78,7 +75,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
binding
.
playerView
.
getAdViewGroup
().
removeAllViews
()
binding
.
playerView
.
getAdViewGroup
().
removeAllViews
()
}
}
private
lateinit
var
player
:
ExoPlayer
private
lateinit
var
player
:
ExoPlayer
//用于测试,实际可以传参进来
//用于测试,实际可以传参进来
...
@@ -88,8 +84,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
...
@@ -88,8 +84,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
initializePlayer
()
initializePlayer
()
}
}
fun
initializePlayer
()
{
fun
initializePlayer
()
{
val
playerBuilder
=
val
playerBuilder
=
ExoPlayer
.
Builder
(
requireContext
())
ExoPlayer
.
Builder
(
requireContext
())
...
@@ -133,6 +127,9 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
...
@@ -133,6 +127,9 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
companion
object
{
companion
object
{
@JvmStatic
fun
newInstance
()
=
ExoPlayFragment
()
/*
@JvmStatic
@JvmStatic
fun newInstance(video: String) =
fun newInstance(video: String) =
ExoPlayFragment().apply {
ExoPlayFragment().apply {
...
@@ -140,13 +137,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
...
@@ -140,13 +137,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
putString(VIDEO_PARAM1, video)
putString(VIDEO_PARAM1, video)
}
}
}
}
// @JvmStatic
*/
// fun newInstance(param1: String, param2: String) =
// ExoPlayFragment().apply {
// arguments = Bundle().apply {
// putString(ARG_PARAM1, param1)
// putString(ARG_PARAM2, param2)
// }
// }
}
}
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/ui/fragment/WarnFragment.kt
0 → 100644
View file @
9968f320
package
com.sd.cavphmi.ui.fragment
import
android.graphics.Color
import
android.os.Handler
import
android.os.Looper
import
android.util.Log
import
androidx.activity.viewModels
import
androidx.fragment.app.activityViewModels
import
androidx.fragment.app.viewModels
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.ViewModelProvider
import
androidx.lifecycle.lifecycleScope
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.R
import
com.sd.cavphmi.base.BaseFragment
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.CarVehicleItem
import
com.sd.cavphmi.bean.V2xStartBean
import
com.sd.cavphmi.bean.WarningBean
import
com.sd.cavphmi.databinding.FragmentCarPanelBinding
import
com.sd.cavphmi.databinding.FragmentWarnBinding
import
com.sd.cavphmi.viewmodels.MainVm
import
com.sd.cavphmi.viewmodels.MockVM
import
dagger.hilt.android.AndroidEntryPoint
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
//private const val ARG_PARAM1 = "param1"
//private const val ARG_PARAM2 = "param2"
/**
* 预警
*/
@AndroidEntryPoint
class
WarnFragment
:
BaseFragment
<
FragmentWarnBinding
,
MyBaseViewModel
>()
{
//
// private var param1: String? = null
// private var param2: String? = null
//
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// arguments?.let {
// param1 = it.getString(ARG_PARAM1)
// param2 = it.getString(ARG_PARAM2)
// }
// }
private
val
mainVm
:
MainVm
by
activityViewModels
()
override
fun
getStatuBarColor
():
Int
{
return
-
1
}
override
fun
isAutoStatusBarDarkModeEnable
():
Boolean
{
return
false
}
override
fun
initContentView
():
Int
{
return
R
.
layout
.
fragment_warn
}
override
fun
initViewModel
():
MyBaseViewModel
{
return
ViewModelProvider
(
this
).
get
(
MyBaseViewModel
::
class
.
java
)
}
override
fun
initVariableId
():
Int
{
return
BR
.
vm
}
override
fun
initView
()
{
}
override
fun
initListener
()
{
mainVm
.
v2xStartBean
.
observe
(
this
)
{
Log
.
e
(
"V2x"
,
"-------------typeName--"
+
it
.
typeName
)
showEarlyDetail
(
it
)
binding
.
roadWarn
.
setWarnBean
(
WarningBean
.
instance
)
}
}
private
fun
showEarlyDetail
(
v2xStartBean
:
V2xStartBean
)
{
var
warningBean
=
WarningBean
.
instance
warningBean
.
img
=
R
.
drawable
.
chao_su
when
(
v2xStartBean
.
type
)
{
1
->
{
//前向碰撞
warningBean
.
img
=
R
.
drawable
.
zhuyi_car
warningBean
.
tipStr
=
"注意前方车辆"
}
4
->
{
//盲区预警
warningBean
.
tipStr
=
"左侧/右侧盲区有车辆,请注意!"
}
3
->
{
//左转辅助
warningBean
.
tipStr
=
"注意对向来车"
}
12
->
{
//弱势交通参与者
warningBean
.
img
=
R
.
drawable
.
zhuyi_xingren
warningBean
.
tipStr
=
"注意行人"
}
6
->
{
//紧急制动预警
warningBean
.
tipStr
=
"前方车辆紧急制动,请减速!"
}
}
}
companion
object
{
@JvmStatic
fun
newInstance
()
=
WarnFragment
()
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/ui/view/RoadWarn.kt
0 → 100644
View file @
9968f320
package
com.sd.cavphmi.ui.view
import
android.animation.Animator
import
android.animation.Animator.AnimatorListener
import
android.animation.AnimatorInflater
import
android.animation.AnimatorSet
import
android.content.Context
import
android.util.AttributeSet
import
android.view.Gravity
import
android.view.LayoutInflater
import
android.view.View
import
android.widget.LinearLayout
import
androidx.core.view.isNotEmpty
import
com.sd.cavphmi.R
import
com.sd.cavphmi.bean.WarningBean
import
com.sd.cavphmi.databinding.EarlyTipBaseBinding
/**预警气泡**/
class
RoadWarn
:
LinearLayout
{
constructor
(
context
:
Context
?)
:
super
(
context
)
constructor
(
context
:
Context
?,
attrs
:
AttributeSet
?)
:
super
(
context
,
attrs
)
{
init
()
}
//重心
private
var
mGravity
=
0
private
var
setAni
:
AnimatorSet
?
=
null
private
fun
init
()
{
setAni
=
AnimatorInflater
.
loadAnimator
(
context
,
R
.
animator
.
early_tip_ani
)
as
AnimatorSet
setAni
?.
addListener
(
object
:
AnimatorListener
{
override
fun
onAnimationStart
(
animation
:
Animator
)
{
}
override
fun
onAnimationEnd
(
animation
:
Animator
)
{
// println("--------------动画结束")
removeAllViews
()
}
override
fun
onAnimationCancel
(
animation
:
Animator
)
{
}
override
fun
onAnimationRepeat
(
animation
:
Animator
)
{
}
})
}
fun
setMyOrientation
(
orientation
:
Int
)
{
this
.
orientation
=
orientation
if
(
orientation
==
HORIZONTAL
)
{
mGravity
=
Gravity
.
CENTER_VERTICAL
}
else
{
mGravity
=
Gravity
.
CENTER_HORIZONTAL
}
}
fun
setWarnBean
(
warningBean
:
WarningBean
)
{
// println("-----${setAni?.isRunning}")
//加载动画的时候什么也不干,或者里面有子View
if
(
setAni
?.
isRunning
==
true
||
isNotEmpty
())
{
return
}
removeAllViews
()
val
params
=
(
layoutParams
as
LayoutParams
).
apply
{
gravity
=
mGravity
}
loadChildView
(
warningBean
,
params
)
setAni
!!
.
apply
{
setTarget
(
this
@RoadWarn
)
start
()
}
}
// private fun loadChildView(type: Int, parentParam: LinearLayout.LayoutParams) {
private
fun
loadChildView
(
bean
:
WarningBean
,
parentParam
:
LayoutParams
)
{
lateinit
var
baseView
:
View
var
binding
=
EarlyTipBaseBinding
.
inflate
(
LayoutInflater
.
from
(
context
))
baseView
=
binding
.
root
addView
(
baseView
,
parentParam
)
// DisplayUtil.forceMeasure(baseView)
binding
.
bean
=
bean
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/utils/DisplayUtil.kt
View file @
9968f320
...
@@ -8,8 +8,8 @@ import android.os.Build
...
@@ -8,8 +8,8 @@ import android.os.Build
import
android.provider.Settings
import
android.provider.Settings
import
android.util.DisplayMetrics
import
android.util.DisplayMetrics
import
android.util.TypedValue
import
android.util.TypedValue
import
android.view.View
import
android.view.View.MeasureSpec
/**
/**
...
@@ -41,6 +41,37 @@ object DisplayUtil {
...
@@ -41,6 +41,37 @@ object DisplayUtil {
return
(
spValue
*
fontScale
+
0.5f
).
toInt
()
return
(
spValue
*
fontScale
+
0.5f
).
toInt
()
}
}
fun
getScreenWidthDp
():
Int
{
val
displayMetrics
=
Resources
.
getSystem
().
displayMetrics
val
widthPixels
=
displayMetrics
.
widthPixels
val
density
=
displayMetrics
.
density
return
Math
.
round
(
widthPixels
/
density
)
}
fun
getScreenWidthPx
():
Int
{
val
displayMetrics
=
Resources
.
getSystem
().
displayMetrics
return
displayMetrics
.
widthPixels
}
fun
getScreenHeightDp
():
Int
{
val
displayMetrics
=
Resources
.
getSystem
().
displayMetrics
val
heightPixels
=
displayMetrics
.
heightPixels
val
density
=
displayMetrics
.
density
return
Math
.
round
(
heightPixels
/
density
)
}
fun
getScreenHeightPx
():
Int
{
val
displayMetrics
=
Resources
.
getSystem
().
displayMetrics
return
displayMetrics
.
heightPixels
}
fun
forceMeasure
(
view
:
View
)
{
val
widthMeasureSpec
=
MeasureSpec
.
makeMeasureSpec
(
0
,
MeasureSpec
.
UNSPECIFIED
)
val
heightMeasureSpec
=
MeasureSpec
.
makeMeasureSpec
(
0
,
MeasureSpec
.
UNSPECIFIED
)
view
.
measure
(
widthMeasureSpec
,
heightMeasureSpec
)
}
private
val
mTmpValue
=
TypedValue
()
private
val
mTmpValue
=
TypedValue
()
fun
getXmlDef
(
context
:
Context
,
id
:
Int
):
Int
{
fun
getXmlDef
(
context
:
Context
,
id
:
Int
):
Int
{
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/CarPanelVM.kt
0 → 100644
View file @
9968f320
package
com.sd.cavphmi.viewmodels
import
android.content.Context
import
androidx.lifecycle.viewModelScope
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.bean.CarPanelBean
import
com.sd.cavphmi.bean.CarVehicle
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.qualifiers.ApplicationContext
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
javax.inject.Inject
import
kotlin.random.Random
@HiltViewModel
class
CarPanelVM
@Inject
constructor
()
:
MyBaseViewModel
()
{
//车辆仪表单例
var
carPanelBean
=
CarPanelBean
.
instance
/**展示车辆仪表*****/
fun
setCarPanelBean
(
carVehicle
:
CarVehicle
)
{
// val vehicleInfo = event.vehicleInfo
if
(
carVehicle
.
count
()
==
0
)
return
// val vehicleStatusInfo = event.vehicleStatusInfo
var
bean
=
carVehicle
.
first
()
//速度
carPanelBean
.
speed
.
set
(
bean
.
speed
.
toInt
())
// //航向角
carPanelBean
.
heading
.
set
(
bean
.
heading
.
toInt
())
//档位
// carPanelBean.tapPos.set(vehicleInfo.tapPos.toInt())
//驾驶模式
// carPanelBean.driveMode.set(vehicleInfo.driveMode.toInt())
//剩余电量
carPanelBean
.
remainSoc
.
set
(
bean
.
soc
.
toInt
())
//车灯状态
// carPanelBean.lights.set(vehicleStatusInfo?.lights)
// var a = 0
}
fun
mock
()
{
changeMockHeading
()
changeMockDriveMode
()
changeMockLight
()
changeMockPro
()
changeMockGear
()
changeMockSpeed
()
}
private
fun
changeMockHeading
()
{
viewModelScope
.
launch
{
var
list
=
mutableListOf
<
Float
>()
var
ramdom
=
Random
(
360
)
for
(
i
in
1
..
360
)
{
list
.
add
(
ramdom
.
nextInt
(
360
).
toFloat
())
}
list
.
forEach
{
withContext
(
Dispatchers
.
IO
)
{
delay
(
1100
)
}
// carPanelBean.heading.set(it)
}
}
}
//模拟驾驶模式
private
fun
changeMockDriveMode
()
{
viewModelScope
.
launch
{
for
(
i
in
1
..
100
)
{
for
(
j
in
1
..
9
)
{
withContext
(
Dispatchers
.
IO
)
{
delay
(
1500
)
}
// carPanelBean.driveMode.set(j)
}
}
}
}
//模拟车灯
private
fun
changeMockLight
()
{
var
list
=
listOf
(
4
,
8
,
0
)
viewModelScope
.
launch
{
for
(
i
in
1
..
100
)
{
withContext
(
Dispatchers
.
IO
)
{
delay
(
2000
)
}
var
p
=
i
%
3
// carPanelBean.lights.set(list[p])
}
}
}
//模拟电量
private
fun
changeMockPro
()
{
viewModelScope
.
launch
{
for
(
i
in
1
..
1000
)
{
withContext
(
Dispatchers
.
IO
)
{
delay
(
300
)
}
var
p
=
i
%
100
carPanelBean
.
remainSoc
.
set
(
p
)
}
}
}
//模拟档位
private
fun
changeMockGear
()
{
var
list
=
listOf
(
31
,
32
,
33
,
34
)
viewModelScope
.
launch
{
for
(
i
in
1
..
100
)
{
withContext
(
Dispatchers
.
IO
)
{
delay
(
1000
)
}
var
p
=
i
%
4
carPanelBean
.
tapPos
.
set
(
list
.
get
(
p
))
}
}
}
//模拟速度和限速
private
fun
changeMockSpeed
()
{
// carPanelBean.spdExp.set(10)
viewModelScope
.
launch
{
for
(
i
in
1
..
100
)
{
for
(
j
in
1
..
100
)
{
withContext
(
Dispatchers
.
IO
)
{
delay
(
200
)
}
carPanelBean
.
speed
.
set
(
j
)
}
}
}
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/viewmodels/MainVm.kt
View file @
9968f320
package
com.sd.cavphmi.viewmodels
package
com.sd.cavphmi.viewmodels
import
android.content.Context
import
android.content.Context
import
android.util.Log
import
androidx.lifecycle.LiveData
import
androidx.lifecycle.LiveData
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.viewModelScope
import
androidx.lifecycle.viewModelScope
import
com.google.gson.Gson
import
com.google.gson.Gson
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.bean.CarPanelBean
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.CarVehicle
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.TrafficLightBean
import
com.sd.cavphmi.bean.TrafficPerBean
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.net.MyResult
import
com.sd.cavphmi.net.MyResult
import
com.sd.cavphmi.repositorys.AvpDataRepo
import
com.sd.cavphmi.repositorys.AvpDataRepo
import
com.sd.cavphmi.repositorys.ParseSocketRepo
import
com.sd.cavphmi.utils.FileIoUtils
import
com.sd.cavphmi.utils.FileIoUtils
import
com.sd.cavphmi.utils.MyContants
import
com.sd.cavphmi.utils.MyContants
import
com.sd.cavphmi.utils.ToastHelper
import
com.sd.cavphmi.utils.ToastHelper
import
com.sd.cavphmi.websockets.FeelTargetWSClient
import
com.sd.cavphmi.websockets.FeelTargetWSClient
import
com.sd.cavphmi.websockets.PreDelayWSClient
import
com.sd.cavphmi.websockets.TrafficLightWSClient
import
com.sd.cavphmi.websockets.TrafficPreWSClient
import
com.sd.cavphmi.websockets.V2xWSClient
import
com.sd.cavphmi.websockets.V2xWSClient
import
com.sd.cavphmi.websockets.VecLocWSClient
import
com.sd.cavphmi.websockets.VecLocWSClient
import
com.sd.cavphmi.websockets.VehStatuWSClient
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.qualifiers.ApplicationContext
import
dagger.hilt.android.qualifiers.ApplicationContext
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
import
java.net.URI
import
java.net.URI
import
java.util.Timer
import
java.util.Timer
import
javax.inject.Inject
import
javax.inject.Inject
import
kotlin.math.truncate
@HiltViewModel
@HiltViewModel
...
@@ -46,16 +35,19 @@ class MainVm @Inject constructor(
...
@@ -46,16 +35,19 @@ class MainVm @Inject constructor(
// private var client: MyWebSocketClient? = null
// private var client: MyWebSocketClient? = null
private
val
TAG
=
"MainVm"
private
val
TAG
=
"MainVm"
//
w
网联车辆socket
//网联车辆
位姿
socket
private
var
vecLocWSClient
:
VecLocWSClient
?
=
null
private
var
vecLocWSClient
=
VecLocWSClient
(
URI
(
MyContants
.
WS_VEH_LOC
))
//感知物socket
//感知物socket
private
var
feelTargetWSClient
:
FeelTargetWSClient
?
=
null
private
var
feelTargetWSClient
=
FeelTargetWSClient
(
URI
(
MyContants
.
WS_FEEL_TARGET
))
//预警socket
//v2x预警socket
private
var
v2xWSClient
:
V2xWSClient
?
=
null
private
var
v2xWSClient
=
V2xWSClient
(
URI
(
MyContants
.
WS_V2X
))
//socket 管理
private
var
sockets
=
listOf
(
vecLocWSClient
,
feelTargetWSClient
,
v2xWSClient
)
//网联车辆状态
//网联车辆状态
// private var vehStatuWSClient: VehStatuWSClient? = null
// private var vehStatuWSClient: VehStatuWSClient? = null
...
@@ -79,6 +71,8 @@ class MainVm @Inject constructor(
...
@@ -79,6 +71,8 @@ class MainVm @Inject constructor(
//车辆位姿数据
//车辆位姿数据
var
carVehicle
=
MutableLiveData
<
CarVehicle
>()
var
carVehicle
=
MutableLiveData
<
CarVehicle
>()
//车辆详情
var
vehDetail
=
MutableLiveData
<
VehDetailBean
>()
//感知目标物
//感知目标物
var
targetPre
=
MutableLiveData
<
PerTarget
>()
var
targetPre
=
MutableLiveData
<
PerTarget
>()
...
@@ -95,14 +89,12 @@ class MainVm @Inject constructor(
...
@@ -95,14 +89,12 @@ class MainVm @Inject constructor(
//交通信号灯
//交通信号灯
// var trafficLightBean = MutableLiveData<TrafficLightBean>()
// var trafficLightBean = MutableLiveData<TrafficLightBean>()
/***车辆仪表***/
var
carPanelBean
=
CarPanelBean
.
instance
// 订单详情
// 订单详情
private
var
orderTimer
=
Timer
()
//
private var orderTimer = Timer()
fun
startWS
()
{
//
fun startWS() {
// val httpHeaders = mutableMapOf<String, String>()
// val httpHeaders = mutableMapOf<String, String>()
// httpHeaders.put("Cookie", "username=nemo")
// httpHeaders.put("Cookie", "username=nemo")
// try {
// try {
...
@@ -113,20 +105,23 @@ class MainVm @Inject constructor(
...
@@ -113,20 +105,23 @@ class MainVm @Inject constructor(
// } catch (e: Exception) {
// } catch (e: Exception) {
//
//
// }
// }
}
//
}
/***清理资源***/
/***清理资源***/
fun
cleanRes
()
{
fun
cleanRes
()
{
sockets
.
forEach
{
it
.
close
()
}
}
}
//获取车辆详情
fun
getVehDetail
(
id
:
String
=
""
)
{
//获取车辆详情 传{}就行,正常应该是传场地ID,但是亦庄这个和太和桥车是一样的
fun
getVehDetail
(
id
:
String
=
""
)
{
viewModelScope
.
launch
{
viewModelScope
.
launch
{
var
result
=
avpDataRepo
.
getVehDetail
(
id
)
var
result
=
avpDataRepo
.
getVehDetail
(
id
)
when
(
result
)
{
when
(
result
)
{
is
MyResult
.
Success
<
VehDetailBean
>
->
{
is
MyResult
.
Success
<
VehDetailBean
>
->
{
vehDetail
.
postValue
(
result
.
data
)
// println("-------时间差---- = ${result.data}")
// println("-------时间差---- = ${result.data}")
}
}
...
@@ -138,31 +133,26 @@ class MainVm @Inject constructor(
...
@@ -138,31 +133,26 @@ class MainVm @Inject constructor(
}
}
/**联网车辆位姿数据
/**
* 联网车辆位姿数据
* 传入vehicleId 和url拼接代表某辆车的预警
* 传入vehicleId 和url拼接代表某辆车的预警
*
**
/
*/
fun
subVehicle
():
LiveData
<
CarVehicle
>
{
fun
subVehicle
():
LiveData
<
CarVehicle
>
{
if
(
isMock
)
{
if
(
isMock
)
{
mockVM
.
onVehicleMock
(
carVehicle
,
carPanelBean
)
mockVM
.
onVehicleMock
(
carVehicle
)
}
else
{
}
else
{
try
{
try
{
if
(
vecLocWSClient
==
null
)
{
vecLocWSClient
.
onDataCb
=
object
:
VecLocWSClient
.
OnDataCb
{
vecLocWSClient
=
VecLocWSClient
(
URI
(
MyContants
.
WS_VEH_LOC
))
override
fun
onMsg
(
str
:
String
)
{
vecLocWSClient
?.
connect
()
viewModelScope
.
launch
{
//下载到sd卡下面的DownLoad文件夹下面
vecLocWSClient
?.
onDataCb
=
object
:
VecLocWSClient
.
OnDataCb
{
FileIoUtils
.
writeToFile
(
str
,
"CarVehicle.txt"
)
override
fun
onMsg
(
str
:
String
)
{
var
bean
=
gson
.
fromJson
(
str
,
CarVehicle
::
class
.
java
)
viewModelScope
.
launch
{
carVehicle
.
postValue
(
bean
)
//下载到sd卡下面的DownLoad文件夹下面
FileIoUtils
.
writeToFile
(
str
,
"CarVehicle.txt"
)
var
bean
=
gson
.
fromJson
(
str
,
CarVehicle
::
class
.
java
)
carVehicle
.
postValue
(
bean
)
}
}
}
}
}
}
else
{
Log
.
e
(
TAG
,
"进来了"
)
}
}
vecLocWSClient
.
connect
()
}
catch
(
e
:
Exception
)
{
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
e
.
printStackTrace
()
}
}
...
@@ -179,20 +169,16 @@ class MainVm @Inject constructor(
...
@@ -179,20 +169,16 @@ class MainVm @Inject constructor(
mockVM
.
onSubTargetMock
(
targetPre
)
mockVM
.
onSubTargetMock
(
targetPre
)
}
else
{
}
else
{
try
{
try
{
if
(
feelTargetWSClient
==
null
)
{
feelTargetWSClient
.
onDataCb
=
object
:
FeelTargetWSClient
.
OnDataCb
{
feelTargetWSClient
=
FeelTargetWSClient
(
URI
(
MyContants
.
WS_FEEL_TARGET
))
override
fun
onMsg
(
str
:
String
)
{
feelTargetWSClient
?.
connect
()
viewModelScope
.
launch
{
FileIoUtils
.
writeToFile
(
str
,
"PerTarget.txt"
)
feelTargetWSClient
?.
onDataCb
=
object
:
FeelTargetWSClient
.
OnDataCb
{
var
bean
=
gson
.
fromJson
(
str
,
PerTarget
::
class
.
java
)
override
fun
onMsg
(
str
:
String
)
{
targetPre
.
postValue
(
bean
)
viewModelScope
.
launch
{
FileIoUtils
.
writeToFile
(
str
,
"PerTarget.txt"
)
var
bean
=
gson
.
fromJson
(
str
,
PerTarget
::
class
.
java
)
targetPre
.
postValue
(
bean
)
}
}
}
}
}
}
}
feelTargetWSClient
.
connect
()
}
catch
(
e
:
Exception
)
{
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
e
.
printStackTrace
()
}
}
...
@@ -209,20 +195,16 @@ class MainVm @Inject constructor(
...
@@ -209,20 +195,16 @@ class MainVm @Inject constructor(
mockVM
.
onV2xMock
(
v2xStartBean
)
mockVM
.
onV2xMock
(
v2xStartBean
)
}
else
{
}
else
{
try
{
try
{
if
(
v2xWSClient
==
null
)
{
v2xWSClient
.
onDataCb
=
object
:
V2xWSClient
.
OnDataCb
{
v2xWSClient
=
V2xWSClient
(
URI
(
MyContants
.
WS_V2X
))
override
fun
onMsg
(
str
:
String
)
{
v2xWSClient
?.
connect
()
viewModelScope
.
launch
{
FileIoUtils
.
writeToFile
(
str
,
"onStartV2x.txt"
)
v2xWSClient
?.
onDataCb
=
object
:
V2xWSClient
.
OnDataCb
{
var
bean
=
gson
.
fromJson
(
str
,
V2xStartBean
::
class
.
java
)
override
fun
onMsg
(
str
:
String
)
{
v2xStartBean
.
postValue
(
bean
)
viewModelScope
.
launch
{
FileIoUtils
.
writeToFile
(
str
,
"onStartV2x.txt"
)
var
bean
=
gson
.
fromJson
(
str
,
V2xStartBean
::
class
.
java
)
v2xStartBean
.
postValue
(
bean
)
}
}
}
}
}
}
}
v2xWSClient
.
connect
()
}
catch
(
e
:
Exception
)
{
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
e
.
printStackTrace
()
}
}
...
@@ -231,7 +213,7 @@ class MainVm @Inject constructor(
...
@@ -231,7 +213,7 @@ class MainVm @Inject constructor(
}
}
//暂时用不到---------------------------------------------
//暂时用不到---------------------------------------------
/**
/**
* 网联车辆状态
* 网联车辆状态
...
@@ -246,8 +228,8 @@ class MainVm @Inject constructor(
...
@@ -246,8 +228,8 @@ class MainVm @Inject constructor(
override fun onMsg(str: String) {
override fun onMsg(str: String) {
viewModelScope.launch {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "vehicleS.txt")
FileIoUtils.writeToFile(str, "vehicleS.txt")
// var bean = gson.fromJson(str, VehicleStats::class.java)
// var bean = gson.fromJson(str, VehicleStats::class.java)
// vehicleStat.postValue(bean)
// vehicleStat.postValue(bean)
}
}
}
}
}
}
...
@@ -309,7 +291,7 @@ class MainVm @Inject constructor(
...
@@ -309,7 +291,7 @@ class MainVm @Inject constructor(
}*/
}*/
//显示气泡
//显示气泡
fun
showVToTip
()
{
fun
showVToTip
()
{
var
imgs
=
VToXImgBean
.
imgs
var
imgs
=
VToXImgBean
.
imgs
ToastHelper
.
showCustViewShort
(
context
,
imgs
.
get
(
"2"
)
!!
)
ToastHelper
.
showCustViewShort
(
context
,
imgs
.
get
(
"2"
)
!!
)
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MockVM.kt
View file @
9968f320
...
@@ -40,8 +40,7 @@ class MockVM @Inject constructor(
...
@@ -40,8 +40,7 @@ class MockVM @Inject constructor(
* @param binding 里的速度
* @param binding 里的速度
* **/
* **/
fun
onVehicleMock
(
fun
onVehicleMock
(
carVehicle
:
MutableLiveData
<
CarVehicle
>,
carVehicle
:
MutableLiveData
<
CarVehicle
>
carPanelBean
:
CarPanelBean
)
{
)
{
viewModelScope
.
launch
{
viewModelScope
.
launch
{
val
dst
=
mutableListOf
<
String
>()
val
dst
=
mutableListOf
<
String
>()
...
@@ -52,8 +51,6 @@ class MockVM @Inject constructor(
...
@@ -52,8 +51,6 @@ class MockVM @Inject constructor(
println
(
"------模拟车辆位姿数据 = ${bean}"
)
println
(
"------模拟车辆位姿数据 = ${bean}"
)
println
(
"------车速 = ${bean.first().speed}"
)
println
(
"------车速 = ${bean.first().speed}"
)
println
(
"------电量 = ${bean.first().soc}"
)
println
(
"------电量 = ${bean.first().soc}"
)
carPanelBean
.
speed
.
set
(
bean
.
first
().
speed
.
toInt
())
carPanelBean
.
heading
.
set
(
bean
.
first
().
heading
.
toInt
())
carVehicle
.
value
=
bean
carVehicle
.
value
=
bean
}
}
}
}
...
...
app/src/main/res/animator/early_tip_ani.xml
0 → 100644
View file @
9968f320
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<objectAnimator
android:duration=
"500"
android:propertyName=
"alpha"
android:valueTo=
"1f"
android:valueFrom=
"0f"
android:repeatMode=
"reverse"
android:repeatCount=
"9"
/>
</set>
\ No newline at end of file
app/src/main/res/drawable-xhdpi/chao_su.png
0 → 100644
View file @
9968f320
11.4 KB
app/src/main/res/drawable-xhdpi/zhuyi_car.png
0 → 100644
View file @
9968f320
4.67 KB
app/src/main/res/drawable-xhdpi/zhuyi_xingren.png
0 → 100644
View file @
9968f320
5.26 KB
Prev
1
2
Next
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