Commit 9968f320 authored by p x's avatar p x
Browse files

使用模拟数据调通界面

parent 59b1b616
......@@ -35,9 +35,8 @@ class CarPanelBean {
var tapPos = ObservableField<Int>(GearStatus.P)
var gear = 0
//剩余油量或电量
//剩余电量
var remainSoc = ObservableField<Int>(0)
var soc = 0
//转向灯 1=left 2=right
var lights = 0
......
......@@ -5,14 +5,14 @@ package com.sd.cavphmi.bean
data class V2xStartBean(
val id: String,
val level: Int,
val objects: List<Object>,
val objects: List<VObject>,
val reportTime: Long,
val startTime: Long,
val type: Int,
val typeName: String
)
data class Object(
data class VObject(
val elevation: Double,
val id: String,
val latitude: Double,
......
......@@ -22,5 +22,5 @@ data class VehicleInfo(
val vehicleImgUrl: Any,
val vehicleOwnerName: Any,
val vehicleOwnerPhone: Any,
val vehicleVideoUrl: Any
val vehicleVideoUrl: String
)
\ No newline at end of file
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() }
}
}
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
......@@ -21,7 +21,8 @@ class HeadParamsInterceptor @Inject constructor() : Interceptor {
request.header("token", 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())
}
......
......@@ -46,8 +46,7 @@ class LoginActivity : AppCompatActivity() {
startActivity(Intent(this,MainActivity::class.java))
}
//获取车辆信息
// HTTP获取车辆详情 还没调通
// HTTP获取车辆详情
binding.btVehinfo.setOnClickListener {
mainVm.getVehDetail()
}
......
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.widget.ImageView
import android.widget.RelativeLayout
import androidx.activity.viewModels
import androidx.lifecycle.ViewModelProvider
import com.sd.cavphmi.BR
import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseActivity
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.databinding.ActivityMainBinding
import com.sd.cavphmi.intfaces.OnConCan
import com.sd.cavphmi.ui.fragment.CarPanelFragment
import com.sd.cavphmi.ui.fragment.ExoPlayFragment
import com.sd.cavphmi.utils.DisplayUtil
import com.sd.cavphmi.viewmodels.MainVm
import com.sd.cavphmi.viewmodels.MockVM
import dagger.hilt.android.AndroidEntryPoint
/**
* Main activity
*
* @constructor Create empty Main activity
*/
@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
override fun getStatuBarColor(): Int {
return -1
......@@ -32,135 +34,135 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
return R.layout.activity_main
}
override fun initViewModel(): MainVm {
return ViewModelProvider(this).get(MainVm::class.java)
override fun initViewModel(): MyBaseViewModel {
return ViewModelProvider(this).get(MyBaseViewModel::class.java)
}
override fun initVariableId(): Int {
return BR.vm
}
private var isPlay=false
private var type=-11 //预警类型
//用作模拟
private val mockVM: MockVM by viewModels()
private val mainVm: MainVm by viewModels()
// private val avpMapVM: AvpMapVM by viewModels()
//退出应用弹窗
private lateinit var dialogFragment: ExitAppDialog
//汽车仪表
private val carPanelFragment by lazy { CarPanelFragment.newInstance() }
//exo播放器
private val exoPlayFragment by lazy { ExoPlayFragment.newInstance("") }
private val exoPlayFragment by lazy { ExoPlayFragment.newInstance() }
override fun initView() {
viewModel.mockVM = mockVM
mainVm.mockVM = mockVM
//车辆仪表
var ft = supportFragmentManager.beginTransaction()
ft.add(R.id.map_car_pan, carPanelFragment, "1")
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.hide(exoPlayFragment)
ft2.commit()
}
override fun getToData() {
viewModel.startWS()
//开启websocket
// mainVm.startWS()
}
override fun initListener() {
mockBt()
mockLis()
}
private fun mockLis() {
}
private fun mockBt() {
//联网车辆位姿数据
binding.btVehicle.setOnClickListener {
viewModel.subVehicle().observe(this) {
// topicVehicle(it)
mainVm.subVehicle().observe(this) {
}
}
//感知目标物
binding.btTarget.setOnClickListener {
viewModel.subTarget()
mainVm.subTarget()
}
//v2x 预警
binding.btV2x.setOnClickListener {
viewModel.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)
}
mainVm.subStartV2x()
}
//网联车辆状态
// 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)
startPulseAnimation(binding.viewPopuler)
}else if(viewModel.v2xStartBean.value.type==3){//左转辅助
binding.viewPopuler.setImageResource(R.drawable.left_icon)
startPulseAnimation(binding.viewPopuler)
}else if(viewModel.v2xStartBean.value.type==4){//盲区预警
binding.viewPopuler.setImageResource(R.drawable.change_lanes)
startPulseAnimation(binding.viewPopuler)
}else if(viewModel.v2xStartBean.value.type==6){//紧急制动预警
binding.viewPopuler.setImageResource(R.drawable.stop_icon)
startPulseAnimation(binding.viewPopuler)
}else if(viewModel.v2xStartBean.value.type==12){//弱势交通参与者
binding.viewPopuler.setImageResource(R.drawable.weak)
startPulseAnimation(binding.viewPopuler)
}else{
binding.viewPopuler.setImageResource(0)
/**
* Show video play
* @param isHide false:隐藏 true:显示
*/
private fun showVideoPlay(isHide: Boolean) {
// exoPlayFragment.videoUri=""
var ft = supportFragmentManager.beginTransaction()
if (isHide) {
ft.hide(exoPlayFragment)
} else {
ft.show(exoPlayFragment)
}
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 {
playTogether(alphaAnim, scaleXAnim, scaleYAnim)
duration = 300
/* private fun setImage() {
if(mainVm.v2xStartBean.value.type==1){//前向碰撞
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 {
override fun run() {
isPlay=false
}
}
private val displayRunnable = object : Runnable {
override fun run() {
isPlay = false
}
}*/
override fun dispatchKeyEvent(event: KeyEvent): Boolean {
if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) || event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
......@@ -168,7 +170,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
dialogFragment = ExitAppDialog()
dialogFragment.onConCan = object : OnConCan {
override fun onCon() {
viewModel.cleanRes()
mainVm.cleanRes()
finish()
}
......@@ -196,6 +198,9 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
//需求文档里的气泡提醒,数据未必有,已实际数据为准
//【腾讯文档】AVP-HMI接口需求清单
//https://docs.qq.com/sheet/DVmNmZ3VhVEFxRkpV?tab=BB08J2
......
package com.sd.cavphmi.ui.fragment
import android.graphics.Color
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.databinding.FragmentCarPanelBinding
import com.sd.cavphmi.viewmodels.CarPanelVM
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
......@@ -29,7 +19,7 @@ import kotlinx.coroutines.launch
* 车仪表
*/
@AndroidEntryPoint
class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, CarPanelVM>() {
//
// private var param1: String? = null
// private var param2: String? = null
......@@ -42,14 +32,10 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
// }
// }
private val mockVM: MockVM by activityViewModels()
override fun getStatuBarColor(): Int {
return -1
}
override fun isAutoStatusBarDarkModeEnable(): Boolean {
return false
}
......@@ -58,19 +44,20 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
return R.layout.fragment_car_panel
}
override fun initViewModel(): MainVm {
return ViewModelProvider(this).get(MainVm::class.java)
override fun initViewModel(): CarPanelVM {
return ViewModelProvider(this).get(CarPanelVM::class.java)
}
override fun initVariableId(): Int {
return BR.vm
}
private val mainVm: MainVm by activityViewModels()
private var currentNumber = 0 // 初始数字
override fun initView() {
viewModel.mockVM = mockVM
binding.cpBean=viewModel.carPanelBean
binding.cpBean = viewModel.carPanelBean
// //驾驶模式
// if(viewModel.carPanelBean.driveMode=="1"){
// binding.tvDrivemode.text="自动驾驶"
......@@ -78,55 +65,59 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
// binding.tvDrivemode.text="人工驾驶"
// }
//车灯
if(viewModel.carPanelBean.lights==0){
binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey)
binding.ivRightLight.setImageResource(R.drawable.trun_left_grey)
}else if(viewModel.carPanelBean.lights==1){
binding.ivLeftLight.setImageResource(R.drawable.trun_left_blue)
binding.ivRightLight.setImageResource(R.drawable.trun_left_grey)
}else{
binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey)
binding.ivRightLight.setImageResource(R.drawable.trun_right_blue)
}
//档位
if(viewModel.carPanelBean.gear==0){
binding.tvP.setTextColor(Color.BLUE)
binding.tvR.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))
}else if(viewModel.carPanelBean.gear==1){
binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding.tvR.setTextColor(Color.BLUE)
binding.tvN.setTextColor(resources.getColor(R.color.text_grey))
binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
}else if(viewModel.carPanelBean.gear==2){
binding.tvP.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.tvD.setTextColor(Color.BLUE)
}else if(viewModel.carPanelBean.gear==3){
binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding.tvR.setTextColor(resources.getColor(R.color.text_grey))
binding.tvN.setTextColor(Color.BLUE)
binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
}
// 启动协程定时切换
lifecycleScope.launch {
while (true) {
if(currentNumber>100){
return@launch
}
binding.tvSoc.text = "${currentNumber}%"
binding.proSoc.progress = currentNumber
delay(1000) // 等待10秒
currentNumber++
println("-----"+currentNumber)
}
}
/* if (viewModel.carPanelBean.lights == 0) {
binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey)
binding.ivRightLight.setImageResource(R.drawable.trun_left_grey)
} else if (viewModel.carPanelBean.lights == 1) {
binding.ivLeftLight.setImageResource(R.drawable.trun_left_blue)
binding.ivRightLight.setImageResource(R.drawable.trun_left_grey)
} else {
binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey)
binding.ivRightLight.setImageResource(R.drawable.trun_right_blue)
}
//档位
if (viewModel.carPanelBean.gear == 0) {
binding.tvP.setTextColor(Color.BLUE)
binding.tvR.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))
} else if (viewModel.carPanelBean.gear == 1) {
binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding.tvR.setTextColor(Color.BLUE)
binding.tvN.setTextColor(resources.getColor(R.color.text_grey))
binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
} else if (viewModel.carPanelBean.gear == 2) {
binding.tvP.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.tvD.setTextColor(Color.BLUE)
} else if (viewModel.carPanelBean.gear == 3) {
binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding.tvR.setTextColor(resources.getColor(R.color.text_grey))
binding.tvN.setTextColor(Color.BLUE)
binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
}
// 启动协程定时切换
lifecycleScope.launch {
while (true) {
if (currentNumber > 100) {
return@launch
}
binding.tvSoc.text = "${currentNumber}%"
binding.proSoc.progress = currentNumber
delay(1000) // 等待10秒
currentNumber++
println("-----" + currentNumber)
}
}*/
}
override fun initListener() {
mainVm.carVehicle.observe(this) {
//更新车辆仪表,这里模拟只取第一个
viewModel.setCarPanelBean(it)
}
}
......
package com.sd.cavphmi.ui.fragment
import android.os.Bundle
import androidx.annotation.OptIn
import androidx.lifecycle.ViewModelProvider
import androidx.media3.common.AudioAttributes
import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException
import androidx.media3.common.Player
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
import com.sd.cavphmi.BR
import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseFragment
......@@ -78,7 +75,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
binding.playerView.getAdViewGroup().removeAllViews()
}
private lateinit var player: ExoPlayer
//用于测试,实际可以传参进来
......@@ -88,8 +84,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
initializePlayer()
}
fun initializePlayer() {
val playerBuilder =
ExoPlayer.Builder(requireContext())
......@@ -133,6 +127,9 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
companion object {
@JvmStatic
fun newInstance() = ExoPlayFragment()
/*
@JvmStatic
fun newInstance(video: String) =
ExoPlayFragment().apply {
......@@ -140,13 +137,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
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
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
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
......@@ -8,8 +8,8 @@ import android.os.Build
import android.provider.Settings
import android.util.DisplayMetrics
import android.util.TypedValue
import android.view.View
import android.view.View.MeasureSpec
/**
......@@ -41,6 +41,37 @@ object DisplayUtil {
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()
fun getXmlDef(context: Context, id: Int): Int {
......
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
package com.sd.cavphmi.viewmodels
import android.content.Context
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.google.gson.Gson
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.CarPanelBean
import com.sd.cavphmi.bean.CarVehicle
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.VToXImgBean
import com.sd.cavphmi.bean.VehDetailBean
import com.sd.cavphmi.bean.VehicleStats
import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.repositorys.AvpDataRepo
import com.sd.cavphmi.repositorys.ParseSocketRepo
import com.sd.cavphmi.utils.FileIoUtils
import com.sd.cavphmi.utils.MyContants
import com.sd.cavphmi.utils.ToastHelper
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.VecLocWSClient
import com.sd.cavphmi.websockets.VehStatuWSClient
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.launch
import java.net.URI
import java.util.Timer
import javax.inject.Inject
import kotlin.math.truncate
@HiltViewModel
......@@ -46,16 +35,19 @@ class MainVm @Inject constructor(
// private var client: MyWebSocketClient? = null
private val TAG="MainVm"
private val TAG = "MainVm"
//w网联车辆socket
private var vecLocWSClient: VecLocWSClient? = null
//网联车辆位姿socket
private var vecLocWSClient = VecLocWSClient(URI(MyContants.WS_VEH_LOC))
//感知物socket
private var feelTargetWSClient: FeelTargetWSClient? = null
private var feelTargetWSClient = FeelTargetWSClient(URI(MyContants.WS_FEEL_TARGET))
//预警socket
private var v2xWSClient: V2xWSClient? = null
//v2x预警socket
private var v2xWSClient = V2xWSClient(URI(MyContants.WS_V2X))
//socket 管理
private var sockets = listOf(vecLocWSClient, feelTargetWSClient, v2xWSClient)
//网联车辆状态
// private var vehStatuWSClient: VehStatuWSClient? = null
......@@ -79,6 +71,8 @@ class MainVm @Inject constructor(
//车辆位姿数据
var carVehicle = MutableLiveData<CarVehicle>()
//车辆详情
var vehDetail = MutableLiveData<VehDetailBean>()
//感知目标物
var targetPre = MutableLiveData<PerTarget>()
......@@ -95,14 +89,12 @@ class MainVm @Inject constructor(
//交通信号灯
// 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>()
// httpHeaders.put("Cookie", "username=nemo")
// try {
......@@ -113,20 +105,23 @@ class MainVm @Inject constructor(
// } catch (e: Exception) {
//
// }
}
// }
/***清理资源***/
fun cleanRes() {
sockets.forEach {
it.close()
}
}
//获取车辆详情
fun getVehDetail(id: String="") {
//获取车辆详情 传{}就行,正常应该是传场地ID,但是亦庄这个和太和桥车是一样的
fun getVehDetail(id: String = "") {
viewModelScope.launch {
var result = avpDataRepo.getVehDetail(id)
when (result) {
is MyResult.Success<VehDetailBean> -> {
vehDetail.postValue(result.data)
// println("-------时间差---- = ${result.data}")
}
......@@ -138,31 +133,26 @@ class MainVm @Inject constructor(
}
/**联网车辆位姿数据
/**
* 联网车辆位姿数据
* 传入vehicleId 和url拼接代表某辆车的预警
* **/
*/
fun subVehicle(): LiveData<CarVehicle> {
if (isMock) {
mockVM.onVehicleMock(carVehicle, carPanelBean)
mockVM.onVehicleMock(carVehicle)
} else {
try {
if (vecLocWSClient == null) {
vecLocWSClient = VecLocWSClient(URI(MyContants.WS_VEH_LOC))
vecLocWSClient?.connect()
vecLocWSClient?.onDataCb = object : VecLocWSClient.OnDataCb {
override fun onMsg(str: String) {
viewModelScope.launch {
//下载到sd卡下面的DownLoad文件夹下面
FileIoUtils.writeToFile(str, "CarVehicle.txt")
var bean = gson.fromJson(str, CarVehicle::class.java)
carVehicle.postValue(bean)
}
vecLocWSClient.onDataCb = object : VecLocWSClient.OnDataCb {
override fun onMsg(str: String) {
viewModelScope.launch {
//下载到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) {
e.printStackTrace()
}
......@@ -179,20 +169,16 @@ class MainVm @Inject constructor(
mockVM.onSubTargetMock(targetPre)
} else {
try {
if (feelTargetWSClient == null) {
feelTargetWSClient = FeelTargetWSClient(URI(MyContants.WS_FEEL_TARGET))
feelTargetWSClient?.connect()
feelTargetWSClient?.onDataCb = object : FeelTargetWSClient.OnDataCb {
override fun onMsg(str: String) {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "PerTarget.txt")
var bean = gson.fromJson(str, PerTarget::class.java)
targetPre.postValue(bean)
}
feelTargetWSClient.onDataCb = object : FeelTargetWSClient.OnDataCb {
override fun onMsg(str: String) {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "PerTarget.txt")
var bean = gson.fromJson(str, PerTarget::class.java)
targetPre.postValue(bean)
}
}
}
feelTargetWSClient.connect()
} catch (e: Exception) {
e.printStackTrace()
}
......@@ -209,20 +195,16 @@ class MainVm @Inject constructor(
mockVM.onV2xMock(v2xStartBean)
} else {
try {
if (v2xWSClient == null) {
v2xWSClient = V2xWSClient(URI(MyContants.WS_V2X))
v2xWSClient?.connect()
v2xWSClient?.onDataCb = object : V2xWSClient.OnDataCb {
override fun onMsg(str: String) {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "onStartV2x.txt")
var bean = gson.fromJson(str, V2xStartBean::class.java)
v2xStartBean.postValue(bean)
}
v2xWSClient.onDataCb = object : V2xWSClient.OnDataCb {
override fun onMsg(str: String) {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "onStartV2x.txt")
var bean = gson.fromJson(str, V2xStartBean::class.java)
v2xStartBean.postValue(bean)
}
}
}
v2xWSClient.connect()
} catch (e: Exception) {
e.printStackTrace()
}
......@@ -231,7 +213,7 @@ class MainVm @Inject constructor(
}
//暂时用不到---------------------------------------------
//暂时用不到---------------------------------------------
/**
* 网联车辆状态
......@@ -246,8 +228,8 @@ class MainVm @Inject constructor(
override fun onMsg(str: String) {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "vehicleS.txt")
// var bean = gson.fromJson(str, VehicleStats::class.java)
// vehicleStat.postValue(bean)
// var bean = gson.fromJson(str, VehicleStats::class.java)
// vehicleStat.postValue(bean)
}
}
}
......@@ -309,7 +291,7 @@ class MainVm @Inject constructor(
}*/
//显示气泡
//显示气泡
fun showVToTip() {
var imgs = VToXImgBean.imgs
ToastHelper.showCustViewShort(context, imgs.get("2")!!)
......
......@@ -40,8 +40,7 @@ class MockVM @Inject constructor(
* @param binding 里的速度
* **/
fun onVehicleMock(
carVehicle: MutableLiveData<CarVehicle>,
carPanelBean:CarPanelBean
carVehicle: MutableLiveData<CarVehicle>
) {
viewModelScope.launch {
val dst = mutableListOf<String>()
......@@ -52,8 +51,6 @@ class MockVM @Inject constructor(
println("------模拟车辆位姿数据 = ${bean}")
println("------车速 = ${bean.first().speed}")
println("------电量 = ${bean.first().soc}")
carPanelBean.speed.set(bean.first().speed.toInt())
carPanelBean.heading.set(bean.first().heading.toInt())
carVehicle.value = bean
}
}
......
<?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
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