Commit 0a5baef9 authored by p x's avatar p x
Browse files

登录

parent 09291f32
...@@ -2,8 +2,8 @@ package com.sd.cavphmi.repositorys ...@@ -2,8 +2,8 @@ package com.sd.cavphmi.repositorys
import com.google.gson.Gson import com.google.gson.Gson
import com.sd.cavphmi.bean.ParkLinePlan import com.sd.cavphmi.bean.ParkLinePlan
import com.sd.cavphmi.bean.OrderBean
import com.sd.cavphmi.bean.SpaceNoBean import com.sd.cavphmi.bean.SpaceNoBean
import com.sd.cavphmi.bean.VehDetailBean
import com.sd.cavphmi.net.MyResult import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.net.RequestBodyUtil import com.sd.cavphmi.net.RequestBodyUtil
import com.sd.cavphmi.net.httpmothod.ClientRetrofitMethod import com.sd.cavphmi.net.httpmothod.ClientRetrofitMethod
...@@ -13,7 +13,7 @@ import kotlinx.coroutines.withContext ...@@ -13,7 +13,7 @@ import kotlinx.coroutines.withContext
import retrofit2.HttpException import retrofit2.HttpException
import javax.inject.Inject import javax.inject.Inject
class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: ClientRetrofitMethod) { class ParseSocketRepo @Inject constructor(private var clientRetrofitMethod: ClientRetrofitMethod) {
private var gson = Gson() private var gson = Gson()
...@@ -26,16 +26,18 @@ class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: Clie ...@@ -26,16 +26,18 @@ class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: Clie
} }
} }
/***订单信息**/ /***获取车辆详情
suspend fun getOrderData(carPlate: String?): MyResult<OrderBean> { * @param id 车辆id
if (carPlate.isNullOrEmpty()) { * **/
suspend fun getVehDetail(id: String): MyResult<VehDetailBean> {
if (id.isNullOrEmpty()) {
return MyResult.Error(MyContants.HTTP_ERROR, "error") return MyResult.Error(MyContants.HTTP_ERROR, "error")
} }
// if (!orderCalled.getAndSet(true)) { // if (!orderCalled.getAndSet(true)) {
var map = mapOf("vehiclePlate" to carPlate) var map = mapOf("id" to id)
var body = RequestBodyUtil.toRequestBody(map) var body = RequestBodyUtil.toRequestBody(map)
try { try {
var bean = clientRetrofitMethod.getOrderData(body) var bean = clientRetrofitMethod.getVehDetail(body)
return MyResult.Success(bean) return MyResult.Success(bean)
} catch (e: HttpException) { } catch (e: HttpException) {
// println("e.message = ${e.message}") // println("e.message = ${e.message}")
...@@ -47,52 +49,52 @@ class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: Clie ...@@ -47,52 +49,52 @@ class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: Clie
// return MyResult.Error(MyContants.ALREADT_ONCE, "") // return MyResult.Error(MyContants.ALREADT_ONCE, "")
// } // }
} }
//
/**测试网络超时***/ // /**测试网络超时***/
suspend fun getTimeOut(): MyResult<Int> { // suspend fun getTimeOut(): MyResult<Int> {
try { // try {
var star = System.currentTimeMillis() // var star = System.currentTimeMillis()
clientRetrofitMethod.getTimeOut() // clientRetrofitMethod.getTimeOut()
var end = System.currentTimeMillis() // var end = System.currentTimeMillis()
return MyResult.Success(end.minus(star).toInt()) // return MyResult.Success(end.minus(star).toInt())
} catch (e: HttpException) { // } catch (e: HttpException) {
return MyResult.Error(e.code(), e.message() ?: "error") // return MyResult.Error(e.code(), e.message() ?: "error")
} catch (e: Exception) { // } catch (e: Exception) {
return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error") // return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
} // }
} // }
//
/***查询车位信息 // /***查询车位信息
* 苏州hmi用的这个接口判断空闲车位 // * 苏州hmi用的这个接口判断空闲车位
* ***/ // * ***/
suspend fun getSpaceData(): MyResult<SpaceNoBean> { // suspend fun getSpaceData(): MyResult<SpaceNoBean> {
var map = mutableMapOf("pageNo" to 20, "pageSize" to 1000) // var map = mutableMapOf("pageNo" to 20, "pageSize" to 1000)
var body = RequestBodyUtil.toRequestBody(map) // var body = RequestBodyUtil.toRequestBody(map)
try { // try {
var bean = clientRetrofitMethod.getSpaceData(body) // var bean = clientRetrofitMethod.getSpaceData(body)
return MyResult.Success(bean.data) // return MyResult.Success(bean.data)
} catch (e: HttpException) { // } catch (e: HttpException) {
//// println("e.message = ${e.message}")
// return MyResult.Error(e.code(), e.message() ?: "error")
// } catch (e: Exception) {
// return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
// }
// }
//
// /***获取路径规划***/
// suspend fun getLinePlaning(vehiclePlate: String = "吉AC242"): MyResult<ParkLinePlan> {
// var map = mutableMapOf("vehiclePlate" to vehiclePlate)
// var body = RequestBodyUtil.toRequestBody(map)
// try {
// var bean = clientRetrofitMethod.getLinePlaning(body)
// return MyResult.Success(bean)
// } catch (e: HttpException) {
// println("e.message = ${e.message}") // println("e.message = ${e.message}")
return MyResult.Error(e.code(), e.message() ?: "error") // return MyResult.Error(e.code(), e.message() ?: "error")
} catch (e: Exception) { // } catch (e: Exception) {
return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error") // return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
} // }
} // }
/***获取路径规划***/
suspend fun getLinePlaning(vehiclePlate: String = "吉AC242"): MyResult<ParkLinePlan> {
var map = mutableMapOf("vehiclePlate" to vehiclePlate)
var body = RequestBodyUtil.toRequestBody(map)
try {
var bean = clientRetrofitMethod.getLinePlaning(body)
return MyResult.Success(bean)
} catch (e: HttpException) {
println("e.message = ${e.message}")
return MyResult.Error(e.code(), e.message() ?: "error")
} catch (e: Exception) {
return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
}
}
// /**联网车辆状态数据***/ // /**联网车辆状态数据***/
......
package com.sd.cavphmi.ui
import android.os.Bundle
import androidx.activity.viewModels
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.navigateUp
import androidx.navigation.ui.setupActionBarWithNavController
import com.sd.cavphmi.R
import com.sd.cavphmi.databinding.ActivityLoginBinding
import com.sd.cavphmi.utils.SM4CryptoHelper
import com.sd.cavphmi.viewmodels.LoginVm
import com.sd.cavphmi.viewmodels.MainVm
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class LoginActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginBinding
private val loginVm: LoginVm by viewModels()
private val mainVm: MainVm by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.btLogin.setOnClickListener {
var user = binding.etAccount.text.toString()
var pwd = binding.etPwd.text.toString()
// "4CIHV37pDF8sx0ZXYmYah6HSgys7F7ULSMmm39uzppc"
var key = "Cusc@itmp-sm4key".toByteArray()
var pp = SM4CryptoHelper.encryptECB(key, pwd.toByteArray())
loginVm.login(user, pp, 276135)
}
//获取车辆信息
binding.btVehinfo.setOnClickListener {
mainVm.getVehDetail()
}
}
}
\ No newline at end of file
...@@ -6,9 +6,6 @@ import androidx.lifecycle.ViewModelProvider ...@@ -6,9 +6,6 @@ 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.bean.CarVehicle
import com.sd.cavphmi.bean.ParkBean
import com.sd.cavphmi.bean.VehicleStats
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
...@@ -38,7 +35,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() { ...@@ -38,7 +35,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
} }
private val mockVM: MockVM by viewModels() private val mockVM: MockVM by viewModels()
private val avpMapVM: AvpMapVM by viewModels() // private val avpMapVM: AvpMapVM by viewModels()
private lateinit var dialogFragment: ExitAppDialog private lateinit var dialogFragment: ExitAppDialog
...@@ -55,18 +52,11 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() { ...@@ -55,18 +52,11 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
override fun getToData() { override fun getToData() {
viewModel.startWS() viewModel.startWS()
// viewModel.getOrderData()
// viewModel.getSpaceDataLoc()
} }
override fun initListener() { override fun initListener() {
mockBt() mockBt()
mockLis() mockLis()
//订单数据
viewModel.orderBean.observe(this) {
binding.order = it
}
} }
private fun mockLis() { private fun mockLis() {
...@@ -88,71 +78,25 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() { ...@@ -88,71 +78,25 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
binding.btV2x.setOnClickListener { binding.btV2x.setOnClickListener {
viewModel.subStartV2x() viewModel.subStartV2x()
} }
//网联车辆状态 //HTTP获取车辆详情
binding.btStatus.setOnClickListener { binding.btGetveh.setOnClickListener {
viewModel.subVehicleStatus().observe(this) { viewModel.getVehDetail()
// println("time = ${time}")
// topicVehicleStatus(it)
}
}
//感知延时
binding.btPredelay.setOnClickListener {
viewModel.subPreDelay()
} }
//交通感知事件
binding.btTarpre.setOnClickListener {
viewModel.subTrafficPre().observe(this) {
} //网联车辆状态
} // binding.btStatus.setOnClickListener {
//交通信号灯 // viewModel.subVehicleStatus()
binding.btTarlight.setOnClickListener {
viewModel.subTrafficLight()
}
// binding.btJubuline.setOnClickListener {
// viewModel.subPartLine()
// }
// binding.btRsi.setOnClickListener {
// viewModel.subRsiEvent()
// } // }
}
/**车辆姿态**/
private fun topicVehicle(bean: CarVehicle) {
}
/**联网车辆状态数据**/
private fun topicVehicleStatus(bean: VehicleStats) {
// if ((bean.vehicleData.count()) > 0) {
//交通感知事件
// binding.btTarpre.setOnClickListener {
// viewModel.subTrafficPre()
// }
//交通信号灯
// binding.btTarlight.setOnClickListener {
// viewModel.subTrafficLight()
// } // }
}
/**停车位变更**/
private fun topicvPoints(bean: ParkBean) {
var curValue = bean.parkingSpace
//
if (viewModel.spaceCode.isNotEmpty()) {
// // 更新停车位的信息
var parkingSpot = viewModel.getParkingSpot(curValue)
// this.$refs.basisCesium.updateParkingSpace(parkingSpot);
} else {
// // 第一次需要添加停车位的效果
// let carPostion = [baseData.mainLocation.lon, baseData.mainLocation.lat];
// // 开启前进自主泊车效果
// let parkingSpot = this.getParkingSpot(curValue);
// this.$refs.basisCesium.addForwardParkingEffect({
// id: baseData.mainCarID,
// carPostion: carPostion,
// spaceInfo: parkingSpot,
// });
}
//
// // 记录 spaceCode 给倒车入库的时候用
viewModel.spaceCode = curValue
//
// this.highlightSpaceEntity(spaceCode)
} }
......
...@@ -3,12 +3,24 @@ package com.sd.cavphmi.utils ...@@ -3,12 +3,24 @@ package com.sd.cavphmi.utils
object MyContants { object MyContants {
// const val IS_DEBUG = true // const val IS_DEBUG = true
var HOST = "https://faw.cuscavp.cn:8443" // var HOST = "https://itg-dev.cu-sc.com:19443/"
//开发环境切勿动
private val token="111" var HOST = "https://itg-yz.cu-sc.com:13443"
private val reType="51world" // var HOST = "https://itg-yz.cu-sc.com:13443/api/avpweb/"
var WSHOST = "wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=${token}&reType=${reType}&"
// private val token="111"
private val WSTOKEN =
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiI0MTc0NDY3NGNlOGM0MDZmOTVkZTVkYWYyMWVlOWQ0ZiIsImNyZWF0ZVRpbWUiOjE3NTUwNzYxMTgxMjQsInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6ImNoZW5ieTUxIn0.aPYHCxXgQHj4eYGGZnce5MPJCtmMoRcIIHcNXzMMOHE"
//正式环境Token
var HTTP_TOKEN =
"3W6UeYoWsr3Hged3iJDqw5RQrLyTDwDkkX481PIiuYGwPCamTVdGHhmAxaCgHtns4IaNTEynJ8JfY46bvkzoqqDA9YcGUmkMZ31sV7QAVrk91yOPTv9mCvPLUgOeBgRl"
// var HTTP_TOKEN =
// "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiIyM2UzYWU3MGZhMGQ0ZGZjYTIwNGU0NzcwOGNjNDJiNiIsImNyZWF0ZVRpbWUiOjE3NTUyNDA0MjcyNzksInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6InhpYW9wMDAxIn0.uiSdxuI34J_U3IuMywZNs_adaWoV2fqMsnx-vMxVWXo"
// val Authorization =
// "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiIyM2UzYWU3MGZhMGQ0ZGZjYTIwNGU0NzcwOGNjNDJiNiIsImNyZWF0ZVRpbWUiOjE3NTUyNDA0MjcyNzksInVzZXJUeXBlIjoxLCJzb3VyY2UiOjAsInB3ZEV4cGlyZWQiOmZhbHNlLCJ1c2VybmFtZSI6InhpYW9wMDAxIn0.uiSdxuI34J_U3IuMywZNs_adaWoV2fqMsnx-vMxVWXo"
private val reType = "51world"
var WSHOST = "wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=${WSTOKEN}&reType=${reType}&"
// var PORT = if (IS_DEBUG) "123" else "34534" // var PORT = if (IS_DEBUG) "123" else "34534"
/***感知目标物***/ /***感知目标物***/
......
package com.sd.cavphmi.utils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class SM4CryptoHelper {
private static final String ALGORITHM = "SM4";
private static final String TRANSFORMATION_ECB = "SM4/ECB/PKCS7Padding";
private static final String TRANSFORMATION_CBC = "SM4/CBC/PKCS7Padding";
static {
Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME);
Security.addProvider(new BouncyCastleProvider());
}
// ECB模式加密
public static String encryptECB(byte[] key, byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION_ECB, "BC");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, ALGORITHM));
byte[] encrypted = cipher.doFinal(data);
return Base64.getEncoder().encodeToString(encrypted);
}
// CBC模式加密(需IV参数)
public static byte[] encryptCBC(byte[] key, byte[] iv, byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION_CBC, "BC");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, ALGORITHM), new IvParameterSpec(iv));
return cipher.doFinal(data);
}
}
package com.sd.cavphmi.viewmodels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.repositorys.AvpDataRepo
import com.sd.cavphmi.utils.MyContants
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
@HiltViewModel
class LoginVm @Inject constructor(private var avpDataRepo: AvpDataRepo) : ViewModel() {
fun login(
user: String = "xiaop001",
pwd: String = "E@H^@Lxom7v@VY@x",
verifyCode: Int = 276135
) {
viewModelScope.launch {
var result = avpDataRepo.login(user, pwd, verifyCode)
when (result) {
is MyResult.Success<String> -> {
MyContants.HTTP_TOKEN = result.data
}
else -> {
}
}
}
}
}
\ No newline at end of file
...@@ -5,31 +5,23 @@ import androidx.lifecycle.LiveData ...@@ -5,31 +5,23 @@ 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.google.gson.reflect.TypeToken
import com.sd.cavphmi.base.MyBaseViewModel import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.AllLinePlaningBean
import com.sd.cavphmi.bean.CarPanelBean import com.sd.cavphmi.bean.CarPanelBean
import com.sd.cavphmi.bean.CarVehicle import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.OrderBean
import com.sd.cavphmi.bean.ParkBean
import com.sd.cavphmi.bean.ParkLinePlan
import com.sd.cavphmi.bean.PartLineBean
import com.sd.cavphmi.bean.PerTarget import com.sd.cavphmi.bean.PerTarget
import com.sd.cavphmi.bean.PreDelay
import com.sd.cavphmi.bean.RsiEventBean
import com.sd.cavphmi.bean.SpaceDataLocBeanItem
import com.sd.cavphmi.bean.TrafficLightBean import com.sd.cavphmi.bean.TrafficLightBean
import com.sd.cavphmi.bean.TrafficPerBean 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.VehicleStats 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.ParseSocketRepo 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.MyWebSocketClient
import com.sd.cavphmi.websockets.PreDelayWSClient import com.sd.cavphmi.websockets.PreDelayWSClient
import com.sd.cavphmi.websockets.TrafficLightWSClient import com.sd.cavphmi.websockets.TrafficLightWSClient
import com.sd.cavphmi.websockets.TrafficPreWSClient import com.sd.cavphmi.websockets.TrafficPreWSClient
...@@ -38,21 +30,16 @@ import com.sd.cavphmi.websockets.VecLocWSClient ...@@ -38,21 +30,16 @@ import com.sd.cavphmi.websockets.VecLocWSClient
import com.sd.cavphmi.websockets.VehStatuWSClient 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.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import protocol.Response
import java.net.URI import java.net.URI
import java.util.Timer import java.util.Timer
import java.util.TimerTask
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
class MainVm @Inject constructor( class MainVm @Inject constructor(
@ApplicationContext private var context: Context, @ApplicationContext private var context: Context,
private var parseSocketRepo: ParseSocketRepo private var avpDataRepo: AvpDataRepo
// var spaceNoRepo: SpaceNoRepo,
) : MyBaseViewModel() { ) : MyBaseViewModel() {
// private var client: MyWebSocketClient? = null // private var client: MyWebSocketClient? = null
...@@ -67,16 +54,16 @@ class MainVm @Inject constructor( ...@@ -67,16 +54,16 @@ class MainVm @Inject constructor(
private var v2xWSClient: V2xWSClient? = null private var v2xWSClient: V2xWSClient? = null
//网联车辆状态 //网联车辆状态
private var vehStatuWSClient: VehStatuWSClient? = null // private var vehStatuWSClient: VehStatuWSClient? = null
//感知延时 //感知延时
private var preDelayWSClient: PreDelayWSClient? = null // private var preDelayWSClient: PreDelayWSClient? = null
//交通感知事件 //交通感知事件
private var trafficPreWSClient: TrafficPreWSClient? = null // private var trafficPreWSClient: TrafficPreWSClient? = null
//交通信号灯 //交通信号灯
private var trafficLightWSClient: TrafficLightWSClient? = null // private var trafficLightWSClient: TrafficLightWSClient? = null
private var gson = Gson() private var gson = Gson()
...@@ -96,276 +83,20 @@ class MainVm @Inject constructor( ...@@ -96,276 +83,20 @@ class MainVm @Inject constructor(
var v2xStartBean = MutableLiveData<V2xStartBean>() var v2xStartBean = MutableLiveData<V2xStartBean>()
//联网车辆状态数据 //联网车辆状态数据
var vehicleStat = MutableLiveData<VehicleStats>() // var vehicleStat = MutableLiveData<VehicleStats>()
//感知时延
var preDelay = MutableLiveData<PreDelay>()
//交通感知 //交通感知
var trafficPerBean = MutableLiveData<TrafficPerBean>() // var trafficPerBean = MutableLiveData<TrafficPerBean>()
//交通信号灯 //交通信号灯
var trafficLightBean = MutableLiveData<TrafficLightBean>() // var trafficLightBean = MutableLiveData<TrafficLightBean>()
/***车辆仪表***/ /***车辆仪表***/
var carPanelBean = CarPanelBean.instance var carPanelBean = CarPanelBean.instance
// 、、-----------------
//全局路径
// var allLine = MutableLiveData<AllLinePlaningBean>()
//局部路径
// var partLine = MutableLiveData<PartLineBean>()
//停车位变更
// var parkBean = MutableLiveData<ParkBean>()
//停车位编码
var spaceCode = ""
//订单信息
var orderBean = MutableLiveData<OrderBean>()
//老停车状态,用于判断状态切换
// private var oldAvpStatus = -1
// 是否处理路径规划显示的路径
private var needDealPath = false
//网络延时时间差
// var timeOutDiff = ObservableField(-1)
// 信号强度
// private var netSingTimer = Timer()
// 订单详情 // 订单详情
private var orderTimer = Timer() private var orderTimer = Timer()
// 车位信息
// private var carSpaNoTimer = Timer()
/***获取信号强度**/
// fun getMobileNetworkSignal() {
// netSingTimer.schedule(object : TimerTask() {
// override fun run() {
// viewModelScope.launch {
// var result = parseSocketRepo.getTimeOut()
// when (result) {
// is MyResult.Success<Int> -> {
// timeOutDiff.set(result.data)
//// println("-------时间差---- = ${result.data}")
// }
//
// else -> {
//// println("-------Error---- = ${result.msg}")
// }
// }
// }
// }
// }, 5000, 1000 * 60)
// }
/***获取订单信息
* @param vehiclePlate 车牌号
* **/
fun getOrderData() {
orderTimer.schedule(object : TimerTask() {
override fun run() {
// var vehiclePlate = carVehicle.value?.vehicleData?.get(0)?.vehiclePlate ?: ""
// if (TextUtils.isEmpty(vehiclePlate)) {
// return
// }
var vehiclePlate = "吉AC242"
viewModelScope.launch {
var result =
parseSocketRepo.getOrderData(vehiclePlate)
when (result) {
is MyResult.Success<OrderBean> -> {
println("-------订单信息---- = ${result.data}")
FileIoUtils.writeToFile(gson.toJson(result.data), "order.txt")
orderBean.value = result.data
var avpStatus = result.data.avpStatus
// var plateNo = result.data.plateNo
// var plateNo = "吉AC242"
// avpStatus=3
if (avpStatus == 3) {//泊车
startParkingVehicle(vehiclePlate)
} else if (avpStatus == 5) {//招车
startRecruitmentVehicle(vehiclePlate)
} else {
endParkingVehicle() // 结束泊车
endRecruitmentVehicle()//// 由招车转为其他状态
}
}
// if (oldAvpStatus != avpStatus) {
// if (avpStatus != 3 && oldAvpStatus == 3) {
//// endParkingVehicle() // 结束泊车
// } else if (avpStatus == 3) {
// startParkingVehicle(plateNo) // 开始泊车
// }
// if (avpStatus != 5 && oldAvpStatus == 5) {
//
// endRecruitmentVehicle()
// } else if (avpStatus == 5) {
// // 招车需要显示路径
// startRecruitmentVehicle(plateNo)
// }
// oldAvpStatus = avpStatus
// }
is MyResult.Error -> {
println("-------订单信息 ERROR---- = ${result}")
}
}
// FileIoUtils.writeToFile(gson.toJson(bean), "carvehicle.txt")
}
}
}, 3000, 1000 * 50)
}
/**开始泊车*/
private fun startParkingVehicle(plateNo: String) {
// worker中处理路径规划显示的路径
needDealPath = true
// 获取规划好的路径
findPathPlanning(plateNo)
}
/*** 开始招车,显示路径规划路径*/
private fun startRecruitmentVehicle(vehiclePlate: String) {
// worker不处理路径规划显示的路径
this.needDealPath = true
// 获取规划好的路径
findPathPlanning(vehiclePlate, false)
}
/**
* 结束泊车
*/
private fun endParkingVehicle() {
// 移除自主泊车所有效果
// this.$refs.basisCesium.removeParkingEffect();
//
// // 停车位信息重置
// spaceCode = "";
// this.highlightSpaceEntity(spaceCode)
//
// // 是否处理路径规划显示的路径
// this.needDealPath = false;
//
// // 小地图上不显示线
// cesiumMainIns.updateLinePosition2D(polyine2d, {
// before: [],
// after: [],
// left: [],
// right: []
// });
// console.log('window.leftPath', window.leftPath)
}
/** 由招车转为其他状态,移除路径规划路线*/
private fun endRecruitmentVehicle() {
// worker中不处理路径规划显示的路径
this.needDealPath = false
//
// // 移除路面上的路线
// this.$refs.basisCesium.removePathPlanLine();
//
// // 小地图上不显示线
// cesiumMainIns.updateLinePosition2D(polyine2d, {
// before: [],
// after: [],
// left: [],
// right: []
// });
}
/**
* 获取路径规划
*/
fun findPathPlanning(vehiclePlate: String, ifParking: Boolean = true) {
viewModelScope.launch {
val result: MyResult<ParkLinePlan>
if (isMock) {
result = mockVM.getLinePlaningMock(vehiclePlate)
} else {
result = parseSocketRepo.getLinePlaning(vehiclePlate)
FileIoUtils.writeToFile(gson.toJson(result), "http_path.txt")
}
when (result) {
is MyResult.Success -> {
var lins = result.data.line
if (lins.isNotEmpty()) {
// this.$refs.basisCesium.findPathPlanning(res);
// // 泊车需要高亮车位,召车不高亮
if (ifParking) {
spaceCode = result.data?.spaceCode ?: ""
} else {
// spaceCode = ''
}
// this.highlightSpaceEntity(spaceCode)
}
}
else -> {
println("-----获取路径规划失败 = ${result}")
}
}
}
}
/**查询车位信息 判断车位上是否有车**/
// fun getSpaceData() {
// carSpaNoTimer.schedule(object : TimerTask() {
// override fun run() {
// viewModelScope.launch {
// var result = parseSocketRepo.getSpaceData()
// when (result) {
// is MyResult.Success<SpaceNoBean> -> {
// println("-------------查询车位信息= ${result}")
// FileIoUtils.writeToFile(gson.toJson(result.data), "spaceno.txt")
// }
//
// is MyResult.Error -> {
// println("-------------查询车位信息 Error= ${result}")
//// carSpaNoTimer.cancel()
// }
// }
// }
// }
// }, 4000, 1000 * 20)
// }
/**获取本地车位**/
fun getSpaceDataLoc() {
viewModelScope.launch {
var str = FileIoUtils.getAssetContent(context, "SpaceJSON.json")
var ty = object : TypeToken<List<SpaceDataLocBeanItem>>() {
}.type
var carNo = gson.fromJson<List<SpaceDataLocBeanItem>>(str, ty)
}
}
/**
* 根据停车位编号,获取停车位的具体信息
* @param {*} parkingValue
*/
fun getParkingSpot(parkingValue: String) {
viewModelScope.launch {
withContext(Dispatchers.IO) {
// // 查询倒车入库的车位
// const parkingSpot = SpaceData.find(
// (spot) => spot.spaceCode === parkingValue
// );
// return parkingSpot;
}
}
}
fun startWS() { fun startWS() {
// val httpHeaders = mutableMapOf<String, String>() // val httpHeaders = mutableMapOf<String, String>()
...@@ -386,101 +117,18 @@ class MainVm @Inject constructor( ...@@ -386,101 +117,18 @@ class MainVm @Inject constructor(
} }
//获取车辆详情
private var onDataCb = object : MyWebSocketClient.OnDataCb { fun getVehDetail(id: String="1") {
override fun onVehicle(res: Response.SocketResponse) { viewModelScope.launch {
/* viewModelScope.launch { var result = avpDataRepo.getVehDetail(id)
FileIoUtils.writeToFile(res.data, "CarVehicle.txt") when (result) {
val bean = is MyResult.Success<VehDetailBean> -> {
parseSocketRepo.parseDataBean(res.data, CarVehicle::class.java) // println("-------时间差---- = ${result.data}")
println("------车辆位姿数据 = ${res.data}")
if ((bean.vehicleData.count()) > 0) {
carPanelBean.heading.set(bean.vehicleData.get(0).heading.toInt())
carPanelBean.speed.set(bean.vehicleData.get(0).speed.toInt())
// heading.set(bean.vehicleData.get(0).heading.toInt())
// speed.set(bean.vehicleData.get(0).speed)
}
}*/
}
override fun onVehicleStats(res: Response.SocketResponse) {
viewModelScope.launch {
FileIoUtils.writeToFile(res.data, "vehicleS.txt")
val bean =
parseSocketRepo.parseDataBean(res.data, VehicleStats::class.java)
println("------联网车辆状态数据 = ${res.data}")
if (bean.vehicleStatusList.isNotEmpty()) {
val str = when (bean.vehicleStatusList[0].driveMode) {
0 -> "自动驾驶"
1 -> "人工驾驶"
2 -> "远程驾驶"
else -> "—— ——"
}
carPanelBean.driveMode.set(str)
// driveMode.set(str)
} }
vehicleStat.value = bean
}
}
override fun onTarget(res: Response.SocketResponse) {
viewModelScope.launch {
FileIoUtils.writeToFile(res.data, "PerTarget.txt")
var bean = parseSocketRepo.parseDataBean(res.data, PerTarget::class.java)
println("-----感知目标物数据 = ${bean}")
targetPre.value = bean
}
}
override fun onStartV2x(res: Response.SocketResponse) {
viewModelScope.launch {
println("-----V2X预警开始 = ${res.data}")
FileIoUtils.writeToFile(res.data, "onStartV2x.txt")
}
}
override fun onEndV2x(res: Response.SocketResponse) {
println("--------V2X预警结束--${res.data}")
viewModelScope.launch {
FileIoUtils.writeToFile(res.data, "onEndV2x.txt")
}
}
override fun onPoint(res: Response.SocketResponse) { else -> {
viewModelScope.launch { // println("-------Error---- = ${result.msg}")
println("-----停车位变更 = ${res.data}") }
FileIoUtils.writeToFile(res.data, "change_park.txt")
var bean = parseSocketRepo.parseDataBean(res.data, ParkBean::class.java)
// parkBean.value = bean
}
}
override fun onLinePlaning(res: Response.SocketResponse) {
viewModelScope.launch {
println("-----全局路径发生切换 = ${res.data}")
FileIoUtils.writeToFile(res.data, "all_line.txt")
val bean = parseSocketRepo.parseDataBean(res.data, AllLinePlaningBean::class.java)
// allLine.value = bean
}
}
override fun onPartLine(res: Response.SocketResponse) {
viewModelScope.launch {
println("-----局部路径 = ${res.data}")
FileIoUtils.writeToFile(res.data, "part_line.txt")
var bean = parseSocketRepo.parseDataBean(res.data, PartLineBean::class.java)
// partLine.value = bean
}
}
override fun onRsiEvent(res: Response.SocketResponse) {
viewModelScope.launch {
println("-----rsi事件 = ${res.data}")
FileIoUtils.writeToFile(res.data, "rsi_event.txt")
var bean = parseSocketRepo.parseDataBean(res.data, RsiEventBean::class.java)
// parkBean.value = bean
// FileIoUtils.writeToFile(gson.toJson(bean), "rsi_event.txt")
} }
} }
} }
...@@ -513,30 +161,6 @@ class MainVm @Inject constructor( ...@@ -513,30 +161,6 @@ class MainVm @Inject constructor(
return carVehicle return carVehicle
} }
/**
* 网联车辆状态
* */
fun subVehicleStatus(): LiveData<VehicleStats> {
try {
if (vehStatuWSClient == null) {
vehStatuWSClient = VehStatuWSClient(URI(MyContants.WS_VEH_STATU))
vehStatuWSClient?.connect()
vehStatuWSClient?.onDataCb = object : VehStatuWSClient.OnDataCb {
override fun onMsg(str: String) {
viewModelScope.launch {
FileIoUtils.writeToFile(str, "vehicleS.txt")
// var bean = gson.fromJson(str, VehicleStats::class.java)
// vehicleStat.postValue(bean)
}
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return vehicleStat
}
/**感知目标物数据 /**感知目标物数据
* {"objectData":[{"altitude":0.0,"deviceCode":"ALL","id":"rsm","latitude":0.0,"longitude":0.0,"participant":[],"reportTime":1750138879684}],"wsTime":1750138834204} * {"objectData":[{"altitude":0.0,"deviceCode":"ALL","id":"rsm","latitude":0.0,"longitude":0.0,"participant":[],"reportTime":1750138879684}],"wsTime":1750138834204}
...@@ -596,30 +220,37 @@ class MainVm @Inject constructor( ...@@ -596,30 +220,37 @@ class MainVm @Inject constructor(
return v2xStartBean return v2xStartBean
} }
/*** 感知延时**/
fun subPreDelay(): LiveData<PreDelay> {
try {
if (preDelayWSClient == null) {
preDelayWSClient = PreDelayWSClient(URI(MyContants.WS_PRE_DELAY))
preDelayWSClient?.connect()
preDelayWSClient?.onDataCb = object : PreDelayWSClient.OnDataCb { //暂时用不到---------------------------------------------
override fun onMsg(str: String) {
viewModelScope.launch { /**
FileIoUtils.writeToFile(str, "pre_delay.txt") * 网联车辆状态
var bean = gson.fromJson(str, PreDelay::class.java) * */
preDelay.postValue(bean) /* fun subVehicleStatus(): LiveData<VehicleStats> {
} try {
} if (vehStatuWSClient == null) {
} vehStatuWSClient = VehStatuWSClient(URI(MyContants.WS_VEH_STATU))
} vehStatuWSClient?.connect()
} catch (e: Exception) {
e.printStackTrace() vehStatuWSClient?.onDataCb = object : VehStatuWSClient.OnDataCb {
} override fun onMsg(str: String) {
return preDelay viewModelScope.launch {
} FileIoUtils.writeToFile(str, "vehicleS.txt")
// var bean = gson.fromJson(str, VehicleStats::class.java)
// vehicleStat.postValue(bean)
}
}
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return vehicleStat
}
/*** 交通(感知)事件**/ */
/*** 交通(感知)事件**//*
fun subTrafficPre(): LiveData<TrafficPerBean> { fun subTrafficPre(): LiveData<TrafficPerBean> {
try { try {
if (trafficPreWSClient == null) { if (trafficPreWSClient == null) {
...@@ -643,7 +274,8 @@ class MainVm @Inject constructor( ...@@ -643,7 +274,8 @@ class MainVm @Inject constructor(
} }
/*** 交通信号灯**/ */
/*** 交通信号灯**//*
fun subTrafficLight(): LiveData<TrafficLightBean> { fun subTrafficLight(): LiveData<TrafficLightBean> {
try { try {
if (trafficLightWSClient == null) { if (trafficLightWSClient == null) {
...@@ -664,47 +296,10 @@ class MainVm @Inject constructor( ...@@ -664,47 +296,10 @@ class MainVm @Inject constructor(
e.printStackTrace() e.printStackTrace()
} }
return trafficLightBean return trafficLightBean
} }*/
/*** 全局路径发生切换**/
// fun subLinePlaning(): LiveData<AllLinePlaningBean> {
// if (isMock) {
// mockVM.onSubLinePlaningMock(allLine)
// } else {
// val reqStr = getSendData("/topic/linePlaning")
// client?.send(reqStr)
// }
// return allLine
// }
/*** 局部路径**/
// fun subPartLine(): LiveData<PartLineBean> {
// if (isMock) {
// mockVM.onSubPartLineMock(partLine)
// } else {
// val reqStr = getSendData("/topic/partLine")
// client?.send(reqStr)
// }
// return partLine
// }
/*** rsi事件**/
// fun subRsiEvent() {
// val reqStr = getSendData("/topic/rsiEvent")
// client?.send(reqStr)
// }
/**构建发送体**/
// private fun getSendData(key: String): String {
// var data = WebSetBean.subDic.get(key)
// var req = ReqBean()
// req.data = data!!
// var str = gson.toJson(req)
// return str
// }
//显示气泡
fun showVToTip() { fun showVToTip() {
var imgs = VToXImgBean.imgs var imgs = VToXImgBean.imgs
ToastHelper.showCustViewShort(context, imgs.get("2")!!) ToastHelper.showCustViewShort(context, imgs.get("2")!!)
......
...@@ -3,34 +3,26 @@ package com.sd.cavphmi.viewmodels ...@@ -3,34 +3,26 @@ package com.sd.cavphmi.viewmodels
import android.content.Context import android.content.Context
import androidx.databinding.ObservableField import androidx.databinding.ObservableField
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
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.bean.CarVehicle import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.AllLinePlaningBean
import com.sd.cavphmi.bean.ParkBean
import com.sd.cavphmi.bean.ParkLinePlan import com.sd.cavphmi.bean.ParkLinePlan
import com.sd.cavphmi.bean.PartLineBean
import com.sd.cavphmi.bean.PerTarget import com.sd.cavphmi.bean.PerTarget
import com.sd.cavphmi.net.MyResult import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.net.RequestBodyUtil
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 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.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import retrofit2.HttpException
import javax.inject.Inject import javax.inject.Inject
@HiltViewModel @HiltViewModel
class MockVM @Inject constructor( class MockVM @Inject constructor(
@ApplicationContext private var context: Context, @ApplicationContext private var context: Context,
private var parseSocketRepo: ParseSocketRepo ) : ViewModel() {
) : MyBaseViewModel() {
private var gson = Gson() private var gson = Gson()
...@@ -66,55 +58,55 @@ class MockVM @Inject constructor( ...@@ -66,55 +58,55 @@ class MockVM @Inject constructor(
//感知目标物 //感知目标物
fun onSubTargetMock(targetPre: MutableLiveData<PerTarget>) { fun onSubTargetMock(targetPre: MutableLiveData<PerTarget>) {
viewModelScope.launch { // viewModelScope.launch {
val parts = mutableListOf<String>() // val parts = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/PerTarget.txt", parts) // FileIoUtils.getAssetMock(context, "mock/PerTarget.txt", parts)
parts.forEach { str -> // parts.forEach { str ->
delay(1000) // delay(1000)
var bean = parseSocketRepo.parseDataBean(str, PerTarget::class.java) // var bean = parseSocketRepo.parseDataBean(str, PerTarget::class.java)
println("------模拟感知目标物数据 = ${bean}") // println("------模拟感知目标物数据 = ${bean}")
targetPre.value = bean // targetPre.value = bean
} // }
} // }
} }
//全局路径发生切换 //全局路径发生切换
fun onSubLinePlaningMock(allLine: MutableLiveData<AllLinePlaningBean>) { fun onSubLinePlaningMock() {
viewModelScope.launch { // viewModelScope.launch {
val alls = mutableListOf<String>() // val alls = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/all_line.txt", alls) // FileIoUtils.getAssetMock(context, "mock/all_line.txt", alls)
alls.forEach { str -> // alls.forEach { str ->
delay(1000) // delay(1000)
var bean = parseSocketRepo.parseDataBean(str, AllLinePlaningBean::class.java) // var bean = parseSocketRepo.parseDataBean(str, AllLinePlaningBean::class.java)
allLine.value = bean // allLine.value = bean
} // }
} // }
} }
//局部路径 //局部路径
fun onSubPartLineMock(allLine: MutableLiveData<PartLineBean>) { fun onSubPartLineMock() {
viewModelScope.launch { // viewModelScope.launch {
val lines = mutableListOf<String>() // val lines = mutableListOf<String>()
lines.forEach { str -> // lines.forEach { str ->
delay(1000) // delay(1000)
var bean = parseSocketRepo.parseDataBean(str, PartLineBean::class.java) // var bean = parseSocketRepo.parseDataBean(str, PartLineBean::class.java)
allLine.value = bean // allLine.value = bean
} // }
} // }
} }
//更新停车位 //更新停车位
fun onPointsMock(parkBean: MutableLiveData<ParkBean>) { fun onPointsMock() {
viewModelScope.launch { // viewModelScope.launch {
val points = mutableListOf<String>() // val points = mutableListOf<String>()
FileIoUtils.getAssetMock(context, "mock/change_park.txt", points) // FileIoUtils.getAssetMock(context, "mock/change_park.txt", points)
points.forEach { str -> // points.forEach { str ->
delay(1000) // delay(1000)
var bean = parseSocketRepo.parseDataBean(str, ParkBean::class.java) // var bean = parseSocketRepo.parseDataBean(str, ParkBean::class.java)
println("------模拟停车位变更 = ${bean}") // println("------模拟停车位变更 = ${bean}")
parkBean.value = bean // parkBean.value = bean
} // }
} // }
} }
......
package com.sd.cavphmi.websockets package com.sd.cavphmi.websockets
import com.sd.cavphmi.viewmodels.MainVm
import org.java_websocket.client.WebSocketClient import org.java_websocket.client.WebSocketClient
import org.java_websocket.drafts.Draft import org.java_websocket.drafts.Draft
import org.java_websocket.handshake.ServerHandshake import org.java_websocket.handshake.ServerHandshake
import protocol.Response
import java.net.URI import java.net.URI
import java.nio.ByteBuffer import java.nio.ByteBuffer
/*****往来你车辆位姿**/ /*****网联车辆位姿**/
class VecLocWSClient : WebSocketClient { class VecLocWSClient : WebSocketClient {
private val TAG = "-----VecLocWSClient" private val TAG = "-----VecLocWSClient"
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#1B5BDB40"
android:endColor="#FFFFFF"
android:centerColor="#1B5BDB1A"
android:type="linear"
android:angle="45"/>
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="20dp"/>
<solid android:color="@color/white"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/login_bg"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context=".ui.LoginActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/white">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="登录"
android:textColor="#3D3D3D"
android:textSize="16sp" />
</RelativeLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="25dp"
android:background="@drawable/rect_white_20"
android:gravity="center_vertical"
android:paddingHorizontal="10dp"
android:paddingVertical="5dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/smartphone_line" />
<EditText
android:id="@+id/et_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:background="@null"
android:hint="请输入账号"
android:maxLines="1"
android:text="18501971666"
android:textColor="@color/text_black"
android:textSize="10sp" />
</LinearLayout>
<LinearLayout
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="25dp"
android:background="@drawable/rect_white_20"
android:gravity="center_vertical"
android:paddingHorizontal="10dp"
android:paddingVertical="5dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/et_pwd" />
<EditText
android:id="@+id/et_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:background="@null"
android:hint="请输入密码"
android:inputType="textPassword"
android:maxLines="1"
android:text="vUO2dStZDhbd*88FfT84"
android:textColor="@color/text_black"
android:textSize="10sp" />
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/bt_login"
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:text="登录"
android:textColor="@color/white"
android:textSize="15sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/bt_vehinfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="获取车辆信息" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
...@@ -9,10 +9,6 @@ ...@@ -9,10 +9,6 @@
name="vm" name="vm"
type="com.sd.cavphmi.viewmodels.MainVm" /> type="com.sd.cavphmi.viewmodels.MainVm" />
<variable
name="order"
type="com.sd.cavphmi.bean.OrderBean" />
</data> </data>
<RelativeLayout <RelativeLayout
...@@ -70,10 +66,10 @@ ...@@ -70,10 +66,10 @@
android:text="V2X预警开始" /> android:text="V2X预警开始" />
<Button <Button
android:id="@+id/bt_predelay" android:id="@+id/bt_getveh"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="感知延时" /> android:text="HTTP 获取车辆详情" />
<Button <Button
android:id="@+id/bt_tarpre" android:id="@+id/bt_tarpre"
...@@ -88,21 +84,6 @@ ...@@ -88,21 +84,6 @@
android:text="交通信号灯" /> android:text="交通信号灯" />
<Button
android:id="@+id/bt_allline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全局路径发生切换"
android:visibility="gone"/>
<Button
android:id="@+id/bt_jubuline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:text="局部路径" />
</LinearLayout> </LinearLayout>
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.minedata.minemap.map.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<!-- <com.minedata.minemap.map.MapView-->
<!-- android:id="@id/mapView"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- app:minemap_apiBaseUrl="@string/minemap_apiBaseUrl"-->
<!-- app:minemap_apiUrl="@string/minemap_apiUrl"-->
<!-- app:minemap_apiDynamicDataUrl="@string/minemap_apiDynamicDataUrl"-->
<!-- app:minemap_apiVersion="@string/minemap_apiVersion"-->
<!-- app:minemap_uiLogoGravity="center" />-->
</FrameLayout>
\ No newline at end of file
...@@ -6,13 +6,13 @@ ...@@ -6,13 +6,13 @@
<data> <data>
<variable <!-- <variable-->
name="order" <!-- name="order"-->
type="com.sd.cavphmi.bean.OrderBean" /> <!-- type="com.sd.cavphmi.bean.OrderBean" />-->
</data> </data>
<!-- app:showOrderLayout="@{order.avpStatus}"-->
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
android:orientation="vertical" android:orientation="vertical"
android:padding="15dp" android:padding="15dp"
android:visibility="gone" android:visibility="gone"
app:showOrderLayout="@{order.avpStatus}"
> >
<LinearLayout <LinearLayout
...@@ -33,11 +33,12 @@ ...@@ -33,11 +33,12 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/bookmark_24" /> android:src="@drawable/bookmark_24" />
<!-- android:text="@{order.orderNo}"-->
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
android:text="@{order.orderNo}" android:text="@{}"
android:textColor="@color/text_black" android:textColor="@color/text_black"
tools:text="32423427364862386482368462" /> tools:text="32423427364862386482368462" />
...@@ -55,11 +56,12 @@ ...@@ -55,11 +56,12 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/access_alarms_24" /> android:src="@drawable/access_alarms_24" />
<!-- order.durationString-->
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
android:text="@{order.durationString}" android:text="@{}"
android:textColor="@color/text_black" android:textColor="@color/text_black"
tools:text="1小时29分钟" /> tools:text="1小时29分钟" />
...@@ -75,12 +77,12 @@ ...@@ -75,12 +77,12 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/access_time_24" /> android:src="@drawable/access_time_24" />
<!-- {order.enterTime-->
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
android:text="@{order.enterTime}" android:text="@{}"
android:textColor="@color/text_black" android:textColor="@color/text_black"
tools:text="2025-06-18 09:16:51" /> tools:text="2025-06-18 09:16:51" />
...@@ -97,11 +99,11 @@ ...@@ -97,11 +99,11 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/attach_money_24" /> android:src="@drawable/attach_money_24" />
<!-- app:showOrderCost="@{}"-->
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
app:showOrderCost="@{order.actualCost}"
android:textColor="@color/text_black" android:textColor="@color/text_black"
tools:text="2025-06-18 09:16:51" /> tools:text="2025-06-18 09:16:51" />
......
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ 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