[unmanned]
[车门]
This commit is contained in:
yangyakun
2023-09-13 21:00:20 +08:00
parent 6687b28d9f
commit a031d0441d
19 changed files with 464 additions and 295 deletions

View File

@@ -34,7 +34,7 @@ import com.mogo.och.charter.passenger.ui.overmapview.MakerWithSiteNamewithCheck
import com.mogo.och.common.module.biz.network.OchCommonServiceCallback
import com.mogo.och.common.module.manager.autopilotmanager.OCHAdasAbilityManager
import com.mogo.och.common.module.manager.StopSideStatusManager
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.callback.LightAirconditionDoorCallback
import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil
import com.mogo.och.common.module.voice.VoiceNotice
import com.mogo.och.common.module.wigets.toast.ToastCharterUtils

View File

@@ -6,7 +6,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS_P
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.wigets.toast.ToastCharterUtils
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.callback.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.LightAirconditionDoorStatusManager
import com.mogo.och.common.module.manager.devicemanage.data.AirconditionStatus
import com.mogo.och.common.module.manager.devicemanage.data.HeaterStatue

View File

@@ -3,6 +3,7 @@ package com.mogo.och.common.module.manager.devicemanage
import chassis.VehicleStateOuterClass
import com.mogo.eagle.core.function.api.autopilot.IMoGoRoboBusJinlvM1StatesListener
import com.mogo.eagle.core.function.call.autopilot.CallerRoboBusJinlvM1StatesListenerManager
import com.mogo.och.common.module.manager.devicemanage.callback.LightAirconditionDoorCallback
import com.mogo.och.common.module.manager.devicemanage.data.AirconditionStatus
import com.mogo.och.common.module.manager.devicemanage.data.DoorStatus
import com.mogo.och.common.module.manager.devicemanage.data.HeaterStatue

View File

@@ -0,0 +1,129 @@
package com.mogo.och.common.module.manager.devicemanage
import chassis.Chassis
import chassis.VehicleStateOuterClass
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisDoorStateListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisDoorStateListenerManager
import com.mogo.eagle.core.function.call.base.CallerBase
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.och.common.module.manager.devicemanage.callback.DoorStateCallback
import com.mogo.och.common.module.manager.devicemanage.data.DoorPosition
import com.mogo.och.common.module.manager.devicemanage.data.DoorState
object TaxiDoorStateManager : IMoGoChassisDoorStateListener,
CallerBase<DoorStateCallback>() {
private val TAG = TaxiDoorStateManager::class.java.simpleName
@Volatile
private var haveOpenDoor: Boolean? = null
init {
CallerChassisDoorStateListenerManager.addListener(TAG, this)
}
override fun doSomeAfterAddListener(tag: String, listener: DoorStateCallback) {
val doorList = CallerChassisDoorStateListenerManager.getDoorList()
if(doorList is MutableList<VehicleStateOuterClass.DoorStateV2>){
doSomeAfterAddListenerInner(doorList)
doorList.forEach {
onAutopilotSingleDoorState(it.number,it.status)
}
}else{
doSomeAfterAddListenerInner(mutableListOf())
}
}
private fun doSomeAfterAddListenerInner(doorList: MutableList<VehicleStateOuterClass.DoorStateV2>){
var have = false
doorList.forEach {
if (it.status == 1) {//0关闭 1开着 2未知
have = true
}
}
haveOpenDoor = have
invokeOpenState(have)
}
/**
* 主要用来判断是否有门开着
*/
override fun onAutopilotDoorState(doorList: MutableList<VehicleStateOuterClass.DoorStateV2>) {
var have = false
doorList.forEach {
if (it.status == 1) {//0关闭 1开着 2未知
have = true
}
}
if (have != haveOpenDoor) {
haveOpenDoor = have
invokeOpenState(have)
}
}
/**
* 判断单个车门是否开着
*/
override fun onAutopilotSingleDoorState(num: Chassis.DoorNumber, status: Int) {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "门太变化:${num}--${status}")
when (status) {
0 -> { exchangeEnum(num, DoorState.CLOSE)}
1 -> {exchangeEnum(num, DoorState.OPEN)}
2 -> {exchangeEnum(num, DoorState.UNKNOWN)}
else -> {}
}
}
private fun exchangeEnum(num: Chassis.DoorNumber, state: DoorState) {
when (num) {
Chassis.DoorNumber.FRONT_LEFT -> {
invokeSingleDoorOpenState(DoorPosition.FRONT_LEFT, state)
}
Chassis.DoorNumber.FRONT_RIGHT -> {
invokeSingleDoorOpenState(DoorPosition.FRONT_RIGHT, state)
}
Chassis.DoorNumber.REAR_LEFT -> {
invokeSingleDoorOpenState(DoorPosition.REAR_LEFT, state)
}
Chassis.DoorNumber.REAR_RIGHT -> {
invokeSingleDoorOpenState(DoorPosition.REAR_RIGHT, state)
}
Chassis.DoorNumber.MIDDLE -> {
invokeSingleDoorOpenState(DoorPosition.MIDDLE, state)
}
else -> {}
}
}
/**
* @param have true 有车门开着
* false 没有车门开着(可能开着可能未知)
*/
@Synchronized
private fun invokeOpenState(have: Boolean) {
M_LISTENERS.forEach {
val listener = it.value
listener.hasOpenDoor(have)
}
}
/**
* @param doorPosition 车门位置
* @param doorState 车门状态
*/
@Synchronized
private fun invokeSingleDoorOpenState(doorPosition: DoorPosition,doorState: DoorState) {
M_LISTENERS.forEach {
val listener = it.value
listener.doorStateChangeCallback(doorPosition,doorState)
}
}
}

View File

@@ -0,0 +1,19 @@
package com.mogo.och.common.module.manager.devicemanage.callback
import com.mogo.och.common.module.manager.devicemanage.data.DoorPosition
import com.mogo.och.common.module.manager.devicemanage.data.DoorState
interface DoorStateCallback {
/**
* @param have true 有车门开着
* false 没有车门开着(可能开着可能未知)
*/
fun hasOpenDoor(have:Boolean){}
/**
* @param position 车门位置
* @param state 当前车门状态
*/
fun doorStateChangeCallback(position: DoorPosition,state: DoorState){}
}

View File

@@ -1,4 +1,4 @@
package com.mogo.och.common.module.manager.devicemanage
package com.mogo.och.common.module.manager.devicemanage.callback
import com.mogo.och.common.module.manager.devicemanage.data.AirconditionStatus
import com.mogo.och.common.module.manager.devicemanage.data.HeaterStatue

View File

@@ -1,3 +1,12 @@
package com.mogo.och.common.module.manager.devicemanage.data
data class DoorStatus(var isOpen: Boolean)
data class DoorStatus(var isOpen: Boolean)
enum class DoorPosition {
FRONT_LEFT, FRONT_RIGHT, REAR_LEFT, REAR_RIGHT, MIDDLE
}
enum class DoorState {
OPEN,CLOSE,UNKNOWN
}

View File

@@ -121,6 +121,10 @@ class FrameAnimatorContainer (resId: Int, fps: Int, imageView: ImageView,initFir
mShouldRun = false
}
fun isPlaying():Boolean{
return mShouldRun
}
/**
* 设置停止播放监听
* @param listener 设置监听

View File

@@ -36,12 +36,11 @@ object RxUtils {
}
}
fun isDisposed(disposable: Disposable?):Boolean{
if(disposable!=null){
return true
fun isNotDisposed(disposable: Disposable?):Boolean{
if(disposable==null){
return false
}
return false
return !disposable.isDisposed
}
// 调用Disposable.dispose() 时候会出现InterruptedException 导致出现崩溃

View File

@@ -5,6 +5,7 @@ import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.core.content.ContextCompat
import androidx.core.content.res.ResourcesCompat
import androidx.lifecycle.ViewModelProvider
import com.elegant.utils.UiThreadHandler
@@ -14,6 +15,8 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.manager.devicemanage.data.DoorPosition
import com.mogo.och.common.module.manager.devicemanage.data.DoorState
import com.mogo.och.common.module.utils.FrameAnimatorContainer
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.widget.WindowRelativeLayout
@@ -33,15 +36,24 @@ import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.cl_car_ty
* @author: wangmingjun
* @date: 2022/6/14
*/
class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAutopilotCallback{
class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAutopilotCallback {
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
context,
attributeSet,
defStyleAttr
)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
constructor(
context: Context,
attributeSet: AttributeSet,
defStyleAttr: Int,
defStyleRes: Int
) : super(context, attributeSet, defStyleAttr, defStyleRes)
companion object {
private val TAG = StartAutopilotView::class.java.simpleName
@@ -50,9 +62,9 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
var isStarting = false
private var taxiPStartAutopilot: FrameAnimatorContainer?=null
private var taxiPStartAutopilotCar: FrameAnimatorContainer?=null
private var taxiPXiaozhiBelt: FrameAnimatorContainer?=null
private var taxiPStartAutopilot: FrameAnimatorContainer? = null
private var taxiPStartAutopilotCar: FrameAnimatorContainer? = null
private var taxiPXiaozhiBelt: FrameAnimatorContainer? = null
init {
@@ -61,27 +73,35 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.taxi_p_start_autopilot_view, this, true)
taxiPStartAutopilotCar = FrameAnimatorContainer(R.array.taxi_p_start_autopilot_car, 20,taxi_p_autopilot_starting)
taxiPStartAutopilotCar?.setOnAnimStopListener(object :FrameAnimatorContainer.OnAnimationStoppedListener{
taxiPStartAutopilotCar = FrameAnimatorContainer(
R.array.taxi_p_start_autopilot_car,
20,
taxi_p_autopilot_starting
)
taxiPStartAutopilotCar?.setOnAnimStopListener(object :
FrameAnimatorContainer.OnAnimationStoppedListener {
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
}
})
taxiPStartAutopilot = FrameAnimatorContainer(R.array.taxi_p_start_autopilot, 15,taxi_p_autopilot_btn_bg)
taxiPStartAutopilot?.setOnAnimStopListener(object :FrameAnimatorContainer.OnAnimationStoppedListener{
taxiPStartAutopilot =
FrameAnimatorContainer(R.array.taxi_p_start_autopilot, 15, taxi_p_autopilot_btn_bg,false)
taxiPStartAutopilot?.setOnAnimStopListener(object :
FrameAnimatorContainer.OnAnimationStoppedListener {
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
}
})
taxiPXiaozhiBelt = FrameAnimatorContainer(R.array.xiaozhi_belt, 15,iv_xiaozhi_belt)
taxiPXiaozhiBelt?.setOnAnimStopListener(object :FrameAnimatorContainer.OnAnimationStoppedListener{
taxiPXiaozhiBelt = FrameAnimatorContainer(R.array.xiaozhi_belt, 15, iv_xiaozhi_belt)
taxiPXiaozhiBelt?.setOnAnimStopListener(object :
FrameAnimatorContainer.OnAnimationStoppedListener {
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
}
})
}
fun startAutopilotBgAnimatorDrawable(isStart: Boolean) {
private fun startAutopilotBgAnimatorDrawable(isStart: Boolean) {
if (isStart) {
taxiPStartAutopilot?.start()
} else {
@@ -104,42 +124,43 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
actv_orderinfo.text = show
}
override fun setDoorStatus(
doorPosition: StartAutopilotViewModel.DoorPosition,
isOpen: Boolean
) {
override fun setDoorStatus(doorPosition: DoorPosition, state: DoorState) {
when (doorPosition) {
StartAutopilotViewModel.DoorPosition.FRONT_LEFT -> {
if(isOpen){
DoorPosition.FRONT_LEFT -> {
if (state == DoorState.OPEN) {
actv_front_left_door.visibility = VISIBLE
}else{
} else {
actv_front_left_door.visibility = GONE
}
}
StartAutopilotViewModel.DoorPosition.FRONT_RIGHT -> {
if(isOpen){
DoorPosition.FRONT_RIGHT -> {
if (state == DoorState.OPEN) {
actv_front_right_door.visibility = VISIBLE
}else{
} else {
actv_front_right_door.visibility = GONE
}
}
StartAutopilotViewModel.DoorPosition.REAR_LEFT -> {
if(isOpen){
DoorPosition.REAR_LEFT -> {
if (state == DoorState.OPEN) {
actv_rear_left_door.visibility = VISIBLE
}else{
} else {
actv_rear_left_door.visibility = GONE
}
}
StartAutopilotViewModel.DoorPosition.REAR_RIGHT -> {
if(isOpen){
DoorPosition.REAR_RIGHT -> {
if (state == DoorState.OPEN) {
actv_rear_right_door.visibility = VISIBLE
}else{
} else {
actv_rear_right_door.visibility = GONE
}
}
else ->{
}
else -> {
}
}
}
@@ -150,15 +171,20 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
OverlayViewUtils.dismissOverlayView(this)
}
fun updateStartAutopilotBtnStatus(isBoarded: Boolean) {
private fun updateStartAutopilotBtnStatus(isBoarded: Boolean) {
taxi_p_start_autopilot?.let {
if (isBoarded) {
it.setTextColor(resources.getColor(R.color.taxi_p_start_autopilot_txt_color))
it.setTextColor(
ContextCompat.getColor(context, R.color.taxi_p_start_autopilot_txt_color)
)
it.background = null
} else {
it.background = ResourcesCompat.getDrawable(resources,R.drawable.taxi_p_start_autopilot_txt_btn_bg,null)
it.background =
ContextCompat.getDrawable(context, R.drawable.taxi_p_start_autopilot_txt_btn_bg)
taxi_p_autopilot_btn_bg!!.background = null
it.setTextColor(resources.getColor(R.color.taxi_p_start_autopilot_txt_un_color))
it.setTextColor(
ContextCompat.getColor(context, R.color.taxi_p_start_autopilot_txt_un_color)
)
}
it.tag = isBoarded
it.text = resources.getString(R.string.taxi_p_start_autopilot_txt)
@@ -166,7 +192,6 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
}
private fun startingCarBgAnimatorDrawable(isStart: Boolean) {
if (isStart) {
taxi_p_autopilot_starting!!.setImageResource(0)
@@ -182,7 +207,9 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
if (start) {
isStarting = true
taxi_p_start_autopilot?.text = resources.getString(R.string.taxi_p_start_autopilot_loading)
taxi_p_start_autopilot?.setTextColor(resources.getColor(R.color.taxi_p_start_autopilot_txt_color))
taxi_p_start_autopilot?.setTextColor(
ContextCompat.getColor(context, R.color.taxi_p_start_autopilot_txt_color)
)
startingAutopilotCountDown()
} else {
clearBgAnimDrawable()
@@ -217,9 +244,9 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
override fun onVisibilityChanged(changedView: View, visibility: Int) {
super.onVisibilityChanged(changedView, visibility)
if(HdMapBuildConfig.currentCarVrIconRes == R.raw.hq_h9){
if (HdMapBuildConfig.currentCarVrIconRes == R.raw.hq_h9) {
cl_car_type.setBackgroundResource(R.drawable.taxi_p_start_panel__hq_bg)
}else{
} else {
cl_car_type.setBackgroundResource(R.drawable.taxi_p_start_panel__df_bg)
}
}

View File

@@ -1,19 +1,19 @@
package com.mogo.och.taxi.passenger.ui.startautopilot
import androidx.lifecycle.ViewModel
import chassis.Chassis
import chassis.Chassis.DoorNumber
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisDoorStateListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisDoorStateListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.common.module.manager.devicemanage.data.DoorPosition
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
import com.mogo.och.taxi.passenger.model.AutopilotManager
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
import com.mogo.och.common.module.manager.devicemanage.TaxiDoorStateManager
import com.mogo.och.common.module.manager.devicemanage.callback.DoorStateCallback
import com.mogo.och.common.module.manager.devicemanage.data.DoorState
class StartAutopilotViewModel : ViewModel(), IOCHTaxiPassengerOrderStatusCallback,
IMoGoChassisDoorStateListener {
DoorStateCallback {
private val TAG = StartAutopilotViewModel::class.java.simpleName
@@ -21,38 +21,28 @@ class StartAutopilotViewModel : ViewModel(), IOCHTaxiPassengerOrderStatusCallbac
init {
TaxiPassengerModel.setOrderStatusCallback(TAG, this)
CallerChassisDoorStateListenerManager.addListener(TAG, this)
TaxiDoorStateManager.addListener(TAG,this)
}
fun setStartAutopilotCallback(viewCallback: StartAutopilotCallback) {
this.viewCallback = viewCallback
TaxiPassengerModel.startOrStopReadyToAutopilotLoop(true)
setOrderInfo()
setDoorInfo()
}
private fun setDoorInfo() {
val doorList = CallerChassisDoorStateListenerManager.getDoorList()
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "门太变化初始化:${doorList}")
doorList?.forEach {
exchangeEnum(it.number,it.status==1)
}
}
private fun setOrderInfo() {
val currentOCHOrder = TaxiPassengerModel.currentOCHOrder
currentOCHOrder?.let {
val phone = it.passengerPhone
var show = ""
if (phone.length > 8) {
val show = if (phone.length > 8) {
//截取电话号码前三位
val phoneNumPre = phone.substring(0, 3);
val phoneNumPre = phone.substring(0, 3)
//截取电话号码后四位
val phoneNumFix = phone.substring(7);
val phoneNumFix = phone.substring(7)
show = "用户:$phoneNumPre****$phoneNumFix 目的地:${it.endSiteAddr}"
"用户:$phoneNumPre****$phoneNumFix 目的地:${it.endSiteAddr}"
} else {
show = "用户:${phone} 目的地:${it.endSiteAddr}"
"用户:${phone} 目的地:${it.endSiteAddr}"
}
viewCallback?.setOrderInfo(show)
}
@@ -62,7 +52,7 @@ class StartAutopilotViewModel : ViewModel(), IOCHTaxiPassengerOrderStatusCallbac
super.onCleared()
this.viewCallback = null
TaxiPassengerModel.setOrderStatusCallback(TAG, null)
CallerChassisDoorStateListenerManager.removeListener(TAG)
TaxiDoorStateManager.removeListener(TAG)
}
override fun onDriverHasCheckedPilotCondition(isBoarded: Boolean) {
@@ -76,41 +66,18 @@ class StartAutopilotViewModel : ViewModel(), IOCHTaxiPassengerOrderStatusCallbac
AutopilotManager.startAutopilot()
}
override fun onAutopilotSingleDoorState(num: Chassis.DoorNumber, state: Int) {
super.onAutopilotSingleDoorState(num, state)
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "门太变化:${num}--${state}")
// exchangeEnum(num,open)
override fun hasOpenDoor(have: Boolean) {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "车门是否开着:${have}")
}
private fun exchangeEnum(num: Chassis.DoorNumber,open: Boolean){
when (num) {
DoorNumber.FRONT_LEFT -> {
runMain(DoorPosition.FRONT_LEFT,open)
}
DoorNumber.FRONT_RIGHT -> {
runMain(DoorPosition.FRONT_RIGHT,open)
}
DoorNumber.REAR_LEFT -> {
runMain(DoorPosition.REAR_LEFT,open)
}
DoorNumber.REAR_RIGHT -> {
runMain(DoorPosition.REAR_RIGHT,open)
}
DoorNumber.MIDDLE -> {
runMain(DoorPosition.MIDDLE,open)
}
else -> {}
}
override fun doorStateChangeCallback(position: DoorPosition, state: DoorState) {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "门太变化:${position}--${state}")
runMain(position,state)
}
private fun runMain(posttion:DoorPosition,isOpen: Boolean){
private fun runMain(posttion:DoorPosition,state: DoorState){
UiThreadHandler.post {
viewCallback?.setDoorStatus(posttion,isOpen)
viewCallback?.setDoorStatus(posttion,state)
}
}
@@ -118,10 +85,6 @@ class StartAutopilotViewModel : ViewModel(), IOCHTaxiPassengerOrderStatusCallbac
interface StartAutopilotCallback {
fun handleStartAutopilotBtnStatus(isBoarded: Boolean)
fun setOrderInfo(show: String)
fun setDoorStatus(doorPosition: DoorPosition,isOpen:Boolean)
}
enum class DoorPosition {
FRONT_LEFT, FRONT_RIGHT, REAR_LEFT, REAR_RIGHT, MIDDLE
fun setDoorStatus(doorPosition: DoorPosition, state: DoorState)
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -34,6 +34,7 @@
android:layout_width="1000dp"
android:layout_height="500dp"
android:clickable="false"
android:src="@drawable/image_00000_0"
android:layout_marginBottom="@dimen/dp_62"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"

View File

@@ -23,6 +23,8 @@ object AutopilotManager : IMoGoAutopilotStatusListener {
private const val TAG = "AutopilotManager"
private var needSpeakByStartAutopilot = false
init {
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
}
@@ -33,14 +35,14 @@ object AutopilotManager : IMoGoAutopilotStatusListener {
}
fun startAutopilot() {
fun startAutopilot():String {
if (!checkCurrentOCHOrder()) {
CallerLogger.e(
SceneConstant.M_TAXI_P + TAG,
"no order or order is empty."
)
ToastUtils.showShort("当前订单不存在或异常!")
return
return "当前订单不存在或异常!"
}
if (TaxiPassengerModel.currentOCHOrder!!.orderStatus == TaxiPassengerOrderStatusEnum.UserArriveAtStart.code) {
startAutoPilotServiceByPassenger()
@@ -63,7 +65,7 @@ object AutopilotManager : IMoGoAutopilotStatusListener {
TaxiPassengerModel.currentOCHOrder!!.orderNo,
OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason
)
return
return OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason + ", 请稍候重试"
}
val parameters = initAutopilotControlParameters()
if (parameters == null) {
@@ -71,7 +73,7 @@ object AutopilotManager : IMoGoAutopilotStatusListener {
SceneConstant.M_TAXI_P + TAG,
"AutopilotControlParameters is empty."
)
return
return "自动化驾驶参数异常"
}
CallerAutoPilotControlManager.startAutoPilot(parameters)
CallerLogger.d(
@@ -89,6 +91,8 @@ object AutopilotManager : IMoGoAutopilotStatusListener {
TaxiPassengerModel.currentOCHOrder!!.orderNo,
TaxiPassengerModel.currentLineId
)
needSpeakByStartAutopilot = true
return ""
}
private fun initAutopilotControlParameters(): AutopilotControlParameters? {
@@ -177,6 +181,9 @@ object AutopilotManager : IMoGoAutopilotStatusListener {
TaxiPassengerModel.currentOCHOrder!!.orderNo,
TaxiPassengerModel.currentLineId
)
if(needSpeakByStartAutopilot) {
VoiceNotice.showNotice("坐稳扶好,我们出发咯!", AIAssist.LEVEL2)
}
//startServicePilotDone()
}
}
@@ -196,7 +203,6 @@ object AutopilotManager : IMoGoAutopilotStatusListener {
TaxiPassengerModel.currentLineId,
object : OchCommonServiceCallback<TaxiPassengerBaseRespBean> {
override fun onSuccess(data: TaxiPassengerBaseRespBean) {
VoiceNotice.showNotice("坐稳扶好,我们出发咯!", AIAssist.LEVEL2)
}
override fun onFail(code: Int, msg: String) {}

View File

@@ -255,7 +255,9 @@ class TaxiPassengerBaseFragment() :
OverlayViewUtils.showOverlayView(activity, it)
}
} else {
mStartAutopilotView?.get()?.closeAllAnimsAndView()
mStartAutopilotView?.get()?.let {
OverlayViewUtils.dismissOverlayView(it)
}
mStartAutopilotView = null
}
}

View File

@@ -15,9 +15,13 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.OverlayViewUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.och.common.module.manager.devicemanage.data.DoorPosition
import com.mogo.och.common.module.manager.devicemanage.data.DoorState
import com.mogo.och.common.module.utils.FrameAnimatorContainer
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.widget.WindowRelativeLayout
import io.reactivex.disposables.Disposable
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_front_left_door
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_front_right_door
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.actv_orderinfo
@@ -31,29 +35,40 @@ import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.taxi_p_st
import kotlinx.android.synthetic.main.taxi_p_start_autopilot_view.view.cl_car_type
/**
* @author: wangmingjun
* @date: 2022/6/14
* @author: yangyakun
* 页面状态:
* ①:不能启动自驾
* ②:可以启动自驾
* ③:启动自驾中
* ④:启动自驾失败
* ⑤:初始状态
*/
class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAutopilotCallback{
class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAutopilotCallback {
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
context,
attributeSet,
defStyleAttr
)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
constructor(
context: Context,
attributeSet: AttributeSet,
defStyleAttr: Int,
defStyleRes: Int
) : super(context, attributeSet, defStyleAttr, defStyleRes)
companion object {
private val TAG = StartAutopilotView::class.java.simpleName
private const val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L
}
var isStarting = false
private var taxiPStartAutopilot: FrameAnimatorContainer?=null
private var taxiPStartAutopilotCar: FrameAnimatorContainer?=null
private var taxiPXiaozhiBelt: FrameAnimatorContainer?=null
private var taxiPStartAutopilot: FrameAnimatorContainer? = null
private var taxiPStartAutopilotCar: FrameAnimatorContainer? = null
private var taxiPXiaozhiBelt: FrameAnimatorContainer? = null
init {
@@ -62,186 +77,177 @@ class StartAutopilotView : WindowRelativeLayout, StartAutopilotViewModel.StartAu
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.taxi_p_start_autopilot_view, this, true)
taxiPStartAutopilotCar = FrameAnimatorContainer(R.array.taxi_p_start_autopilot_car, 20,taxi_p_autopilot_starting)
taxiPStartAutopilotCar?.setOnAnimStopListener(object :FrameAnimatorContainer.OnAnimationStoppedListener{
taxiPStartAutopilotCar = FrameAnimatorContainer(
R.array.taxi_p_start_autopilot_car,
20,
taxi_p_autopilot_starting
)
taxiPStartAutopilotCar?.setOnAnimStopListener(object :
FrameAnimatorContainer.OnAnimationStoppedListener {
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "光圈动画暂停")
}
})
taxiPStartAutopilot = FrameAnimatorContainer(R.array.taxi_p_start_autopilot, 15,taxi_p_autopilot_btn_bg)
taxiPStartAutopilot?.setOnAnimStopListener(object :FrameAnimatorContainer.OnAnimationStoppedListener{
taxiPStartAutopilot = FrameAnimatorContainer(
R.array.taxi_p_start_autopilot,
15,
taxi_p_autopilot_btn_bg,
false
)
taxiPStartAutopilot?.setOnAnimStopListener(object :
FrameAnimatorContainer.OnAnimationStoppedListener {
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "可以启动自驾动画暂停")
}
})
taxiPXiaozhiBelt = FrameAnimatorContainer(R.array.xiaozhi_belt, 15,iv_xiaozhi_belt)
taxiPXiaozhiBelt?.setOnAnimStopListener(object :FrameAnimatorContainer.OnAnimationStoppedListener{
taxiPXiaozhiBelt = FrameAnimatorContainer(R.array.xiaozhi_belt, 15, iv_xiaozhi_belt)
taxiPXiaozhiBelt?.setOnAnimStopListener(object :
FrameAnimatorContainer.OnAnimationStoppedListener {
override fun AnimationStopped() {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "动画暂停")
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "小智动画暂停")
}
})
handleStartAutopilotBtnStatus(true)
}
@SuppressLint("UseCompatLoadingForDrawables")
fun handleStartAutopilotBtnStatus(isBoarded: Boolean) {
updateStartAutopilotBtnStatus(isBoarded)
taxiPStartAutopilot?.start()
}
override fun setOrderInfo(show: String) {
actv_orderinfo.text = show
}
override fun setDoorStatus(
doorPosition: StartAutopilotViewModel.DoorPosition,
isOpen: Boolean
) {
override fun setDoorStatus(doorPosition: DoorPosition, state: DoorState) {
when (doorPosition) {
StartAutopilotViewModel.DoorPosition.FRONT_LEFT -> {
if(isOpen){
DoorPosition.FRONT_LEFT -> {
if (state == DoorState.OPEN) {
actv_front_left_door.visibility = VISIBLE
}else{
} else {
actv_front_left_door.visibility = GONE
}
}
StartAutopilotViewModel.DoorPosition.FRONT_RIGHT -> {
if(isOpen){
DoorPosition.FRONT_RIGHT -> {
if (state == DoorState.OPEN) {
actv_front_right_door.visibility = VISIBLE
}else{
} else {
actv_front_right_door.visibility = GONE
}
}
StartAutopilotViewModel.DoorPosition.REAR_LEFT -> {
if(isOpen){
DoorPosition.REAR_LEFT -> {
if (state == DoorState.OPEN) {
actv_rear_left_door.visibility = VISIBLE
}else{
} else {
actv_rear_left_door.visibility = GONE
}
}
StartAutopilotViewModel.DoorPosition.REAR_RIGHT -> {
if(isOpen){
DoorPosition.REAR_RIGHT -> {
if (state == DoorState.OPEN) {
actv_rear_right_door.visibility = VISIBLE
}else{
} else {
actv_rear_right_door.visibility = GONE
}
}
else ->{
}
}
}
else -> {
fun closeAllAnimsAndView() {
isStarting = false
clearStartingAnimFrame()
clearBgAnimDrawable()
OverlayViewUtils.dismissOverlayView(this)
}
fun updateStartAutopilotBtnStatus(isBoarded: Boolean) {
taxi_p_start_autopilot?.let {
if (isBoarded) {
it.setTextColor(ContextCompat.getColor(context,R.color.taxi_p_start_autopilot_txt_color))
it.background = null
} else {
it.background = ResourcesCompat.getDrawable(resources,R.drawable.taxi_p_start_autopilot_txt_btn_bg,null)
taxi_p_autopilot_btn_bg!!.background = null
it.setTextColor( ContextCompat.getColor(context,R.color.taxi_p_start_autopilot_txt_un_color))
}
it.tag = isBoarded
it.text = resources.getString(R.string.taxi_p_start_autopilot_txt)
}
}
private fun startingCarBgAnimatorDrawable(isStart: Boolean) {
if (isStart) {
taxi_p_autopilot_starting!!.setImageResource(0)
taxiPStartAutopilotCar?.start()
override fun canStartAutopilot(can: Boolean) {
if (can) {
ableStartAutopilot()
} else {
taxiPStartAutopilotCar?.stop()
taxi_p_autopilot_starting!!.setImageResource(R.drawable.light_00003)
unableStartAutopilot()
}
}
private fun startOrStopLoadingAnim(start: Boolean) {
startingCarBgAnimatorDrawable(start)
if (start) {
isStarting = true
taxi_p_start_autopilot?.text = resources.getString(R.string.taxi_p_start_autopilot_loading)
taxi_p_start_autopilot?.setTextColor(ContextCompat.getColor(context,R.color.taxi_p_start_autopilot_txt_color))
startingAutopilotCountDown()
} else {
clearBgAnimDrawable()
isStarting = false
handleStartAutopilotBtnStatus(true)
}
}
private fun clearBgAnimDrawable() {
taxiPStartAutopilot?.stop()
}
fun clearStartingAnimFrame() {
taxiPStartAutopilotCar?.stop()
}
private fun startingAutopilotCountDown() {
UiThreadHandler.postDelayed({
//未启动成功20s后做处理
if (isStarting) { //判断动画是否在进行
ToastUtils.showLong(R.string.taxi_p_start_autopilot_fail_10s_tip)
updateStatusCountDownOver()
}
}, TIMER_START_AUTOPILOT_INTERVAL)
}
private fun updateStatusCountDownOver() {
isStarting = false
startingCarBgAnimatorDrawable(false)
taxi_p_start_autopilot?.text = resources.getString(R.string.taxi_p_start_autopilot_txt)
}
override fun onVisibilityChanged(changedView: View, visibility: Int) {
super.onVisibilityChanged(changedView, visibility)
if(HdMapBuildConfig.currentCarVrIconRes == R.raw.hq_h9){
if (changedView != this) {
return
}
if (HdMapBuildConfig.currentCarVrIconRes == R.raw.hq_h9) {
cl_car_type.setBackgroundResource(R.drawable.taxi_p_start_panel__hq_bg)
}else{
} else {
cl_car_type.setBackgroundResource(R.drawable.taxi_p_start_panel__df_bg)
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "onAttachedToWindow")
val viewModel = ViewModelProvider(this).get(StartAutopilotViewModel::class.java)
viewModel.setStartAutopilotCallback(this)
taxi_p_start_autopilot.onClick {
//开启动画和自动驾驶
if (!(taxi_p_start_autopilot!!.tag as Boolean)) {
ToastUtils.showLong(R.string.taxi_p_start_autopilot_un_click_tip)
return@onClick
}
if (!isStarting) {
startOrStopLoadingAnim(true)
viewModel.startAutopilot()
}
startAutopiloting()
viewModel.startAutopilot()
}
starting_autopilot_view_close.onClick {
closeAllAnimsAndView()
unableStartAutopilot()
OverlayViewUtils.dismissOverlayView(this)
}
taxiPXiaozhiBelt?.start()
}
// ①:不能启动自驾
private fun unableStartAutopilot() {
taxiPStartAutopilot?.stop()
taxiPStartAutopilotCar?.stop()
taxi_p_autopilot_starting.setImageResource(R.drawable.light_00003)
taxi_p_autopilot_btn_bg.setImageResource(R.drawable.image_00000_0)
taxi_p_start_autopilot.background =
ContextCompat.getDrawable(context, R.drawable.taxi_p_start_autopilot_txt_btn_bg)
taxi_p_start_autopilot.text = resources.getString(R.string.taxi_p_start_autopilot_txt)
}
// ②:可以启动自驾
private fun ableStartAutopilot() {
taxiPStartAutopilot?.reStart()
taxiPStartAutopilotCar?.stop()
taxi_p_autopilot_starting.setImageResource(R.drawable.light_00003)
taxi_p_start_autopilot.background = null
taxi_p_start_autopilot.text = resources.getString(R.string.taxi_p_start_autopilot_txt)
}
// ③:启动自驾中
fun startAutopiloting() {
taxiPStartAutopilot?.reStart()
taxiPStartAutopilotCar?.reStart()
taxi_p_start_autopilot.background = null
taxi_p_start_autopilot?.text = resources.getString(R.string.taxi_p_start_autopilot_loading)
taxi_p_start_autopilot?.setTextColor(
ContextCompat.getColor(context, R.color.taxi_p_start_autopilot_txt_color)
)
}
// ④:启动自驾超时
override fun startAutopilotingTimeout() {
ableStartAutopilot()
}
// ⑤:启动自驾失败
override fun startAutopilotingFail() {
ableStartAutopilot()
}
private fun goneAllDoorState(){
actv_front_left_door.visibility = GONE
actv_front_right_door.visibility = GONE
actv_rear_left_door.visibility = GONE
actv_rear_right_door.visibility = GONE
}
override fun onDetachedFromWindow() {
isStarting = false
clearStartingAnimFrame()
clearBgAnimDrawable()
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "onDetachedFromWindow")
unableStartAutopilot()
taxiPXiaozhiBelt?.stop()
goneAllDoorState()
super.onDetachedFromWindow()
}
override fun unableStartAutopilotByDoorState() {
unableStartAutopilot()
}
}

View File

@@ -1,40 +1,39 @@
package com.mogo.och.taxi.passenger.ui.startautopilot
import androidx.lifecycle.ViewModel
import chassis.Chassis.DoorNumber
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisDoorStateListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisDoorStateListenerManager
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import com.mogo.och.taxi.passenger.callback.IOCHTaxiPassengerOrderStatusCallback
import com.mogo.och.common.module.manager.devicemanage.TaxiDoorStateManager
import com.mogo.och.common.module.manager.devicemanage.callback.DoorStateCallback
import com.mogo.och.common.module.manager.devicemanage.data.DoorPosition
import com.mogo.och.common.module.manager.devicemanage.data.DoorState
import com.mogo.och.common.module.utils.RxUtils
import com.mogo.och.common.module.voice.VoiceNotice
import com.mogo.och.taxi.passenger.R
import com.mogo.och.taxi.passenger.model.AutopilotManager
import com.mogo.och.taxi.passenger.model.TaxiPassengerModel
import io.reactivex.disposables.Disposable
class StartAutopilotViewModel : ViewModel(), IOCHTaxiPassengerOrderStatusCallback,
IMoGoChassisDoorStateListener {
class StartAutopilotViewModel : ViewModel(),
DoorStateCallback {
private val TAG = StartAutopilotViewModel::class.java.simpleName
private var viewCallback: StartAutopilotCallback? = null
init {
TaxiPassengerModel.setOrderStatusCallback(TAG, this)
CallerChassisDoorStateListenerManager.addListener(TAG, this)
}
private val TIMER_START_AUTOPILOT_INTERVAL = 20 * 1000L
var startCountDown: Disposable?=null
var doorOpenState = true
fun setStartAutopilotCallback(viewCallback: StartAutopilotCallback) {
TaxiDoorStateManager.addListener(TAG,this)
this.viewCallback = viewCallback
setOrderInfo()
setDoorInfo()
}
private fun setDoorInfo() {
val doorList = CallerChassisDoorStateListenerManager.getDoorList()
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "门太变化初始化:${doorList}")
doorList?.forEach {
exchangeEnum(it.number,it.status==1)
}
}
private fun setOrderInfo() {
@@ -58,62 +57,65 @@ class StartAutopilotViewModel : ViewModel(), IOCHTaxiPassengerOrderStatusCallbac
override fun onCleared() {
super.onCleared()
this.viewCallback = null
TaxiPassengerModel.setOrderStatusCallback(TAG, null)
CallerChassisDoorStateListenerManager.removeListener(TAG)
RxUtils.disposeSubscribe(startCountDown)
TaxiDoorStateManager.removeListener(TAG)
}
/**
* 开启自动驾驶
*/
fun startAutopilot() {
AutopilotManager.startAutopilot()
if(doorOpenState){
VoiceNotice.showNotice("关紧车门后再出发吧!")
viewCallback?.unableStartAutopilotByDoorState()
return
}
if (RxUtils.isNotDisposed(startCountDown)) {
ToastUtils.showLong("启动中……")
return
}
if (AutopilotManager.startAutopilot().isEmpty()) {
startCountDown = RxUtils.createSubscribe(TIMER_START_AUTOPILOT_INTERVAL) {
viewCallback?.startAutopilotingTimeout()
//未启动成功20s后做处理
ToastUtils.showLong(R.string.taxi_p_start_autopilot_fail_10s_tip)
VoiceNotice.showNotice("啊哦!系统繁忙中,稍后再试试吧~", AIAssist.LEVEL2)
}
}else{
VoiceNotice.showNotice("啊哦!系统繁忙中,稍后再试试吧~", AIAssist.LEVEL2)
viewCallback?.startAutopilotingFail()
}
}
override fun onAutopilotSingleDoorState(num: DoorNumber, state: Int) {
super.onAutopilotSingleDoorState(num, state)
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "门太变化:${num}--${state}")
// exchangeEnum(num,open)
}
private fun exchangeEnum(num: DoorNumber,open: Boolean){
when (num) {
DoorNumber.FRONT_LEFT -> {
runMain(DoorPosition.FRONT_LEFT,open)
}
DoorNumber.FRONT_RIGHT -> {
runMain(DoorPosition.FRONT_RIGHT,open)
}
DoorNumber.REAR_LEFT -> {
runMain(DoorPosition.REAR_LEFT,open)
}
DoorNumber.REAR_RIGHT -> {
runMain(DoorPosition.REAR_RIGHT,open)
}
DoorNumber.MIDDLE -> {
runMain(DoorPosition.MIDDLE,open)
}
else -> {}
override fun hasOpenDoor(have: Boolean) {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "车门是否开着:${have}")
doorOpenState = have
UiThreadHandler.post {
viewCallback?.canStartAutopilot(!doorOpenState)
}
}
private fun runMain(posttion:DoorPosition,isOpen: Boolean){
override fun doorStateChangeCallback(position: DoorPosition, state: DoorState) {
CallerLogger.d(SceneConstant.M_TAXI_P + TAG, "门太变化:${position}--${state}")
runMain(position,state)
}
private fun runMain(posttion: DoorPosition, state: DoorState){
UiThreadHandler.post {
viewCallback?.setDoorStatus(posttion,isOpen)
viewCallback?.setDoorStatus(posttion,state)
}
}
interface StartAutopilotCallback {
fun setOrderInfo(show: String)
fun setDoorStatus(doorPosition: DoorPosition,isOpen:Boolean)
}
fun setDoorStatus(doorPosition: DoorPosition,state: DoorState)
enum class DoorPosition {
FRONT_LEFT, FRONT_RIGHT, REAR_LEFT, REAR_RIGHT, MIDDLE
fun canStartAutopilot(can:Boolean)
fun startAutopilotingTimeout()
fun startAutopilotingFail()
fun unableStartAutopilotByDoorState()
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -35,6 +35,7 @@
android:layout_width="1000dp"
android:layout_height="500dp"
android:clickable="false"
android:src="@drawable/image_00000_0"
android:layout_marginBottom="@dimen/dp_62"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"