Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
p x
SuZhouAvp
Commits
0a5baef9
Commit
0a5baef9
authored
Aug 18, 2025
by
p x
Browse files
登录
parent
09291f32
Changes
59
Show whitespace changes
Inline
Side-by-side
app/src/main/java/com/sd/cavphmi/repositorys/ParseSocketRepo.kt
View file @
0a5baef9
...
...
@@ -2,8 +2,8 @@ package com.sd.cavphmi.repositorys
import
com.google.gson.Gson
import
com.sd.cavphmi.bean.ParkLinePlan
import
com.sd.cavphmi.bean.OrderBean
import
com.sd.cavphmi.bean.SpaceNoBean
import
com.sd.cavphmi.bean.VehDetailBean
import
com.sd.cavphmi.net.MyResult
import
com.sd.cavphmi.net.RequestBodyUtil
import
com.sd.cavphmi.net.httpmothod.ClientRetrofitMethod
...
...
@@ -13,7 +13,7 @@ import kotlinx.coroutines.withContext
import
retrofit2.HttpException
import
javax.inject.Inject
class
ParseSocketRepo
@Inject
constructor
(
private
va
l
clientRetrofitMethod
:
ClientRetrofitMethod
)
{
class
ParseSocketRepo
@Inject
constructor
(
private
va
r
clientRetrofitMethod
:
ClientRetrofitMethod
)
{
private
var
gson
=
Gson
()
...
...
@@ -26,16 +26,18 @@ class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: Clie
}
}
/***订单信息**/
suspend
fun
getOrderData
(
carPlate
:
String
?):
MyResult
<
OrderBean
>
{
if
(
carPlate
.
isNullOrEmpty
())
{
/***获取车辆详情
* @param id 车辆id
* **/
suspend
fun
getVehDetail
(
id
:
String
):
MyResult
<
VehDetailBean
>
{
if
(
id
.
isNullOrEmpty
())
{
return
MyResult
.
Error
(
MyContants
.
HTTP_ERROR
,
"error"
)
}
// if (!orderCalled.getAndSet(true)) {
var
map
=
mapOf
(
"
vehiclePlate"
to
carPlate
)
var
map
=
mapOf
(
"
id"
to
id
)
var
body
=
RequestBodyUtil
.
toRequestBody
(
map
)
try
{
var
bean
=
clientRetrofitMethod
.
get
OrderData
(
body
)
var
bean
=
clientRetrofitMethod
.
get
VehDetail
(
body
)
return
MyResult
.
Success
(
bean
)
}
catch
(
e
:
HttpException
)
{
// println("e.message = ${e.message}")
...
...
@@ -47,52 +49,52 @@ class ParseSocketRepo @Inject constructor(private val clientRetrofitMethod: Clie
// return MyResult.Error(MyContants.ALREADT_ONCE, "")
// }
}
/**测试网络超时***/
suspend
fun
getTimeOut
():
MyResult
<
Int
>
{
try
{
var
star
=
System
.
currentTimeMillis
()
clientRetrofitMethod
.
getTimeOut
()
var
end
=
System
.
currentTimeMillis
()
return
MyResult
.
Success
(
end
.
minus
(
star
).
toInt
())
}
catch
(
e
:
HttpException
)
{
return
MyResult
.
Error
(
e
.
code
(),
e
.
message
()
?:
"error"
)
}
catch
(
e
:
Exception
)
{
return
MyResult
.
Error
(
MyContants
.
HTTP_ERROR
,
e
.
message
?:
"error"
)
}
}
/***查询车位信息
* 苏州hmi用的这个接口判断空闲车位
* ***/
suspend
fun
getSpaceData
():
MyResult
<
SpaceNoBean
>
{
var
map
=
mutableMapOf
(
"pageNo"
to
20
,
"pageSize"
to
1000
)
var
body
=
RequestBodyUtil
.
toRequestBody
(
map
)
try
{
var
bean
=
clientRetrofitMethod
.
getSpaceData
(
body
)
return
MyResult
.
Success
(
bean
.
data
)
}
catch
(
e
:
HttpException
)
{
//
// /**测试网络超时***/
// suspend fun getTimeOut(): MyResult<Int> {
// try {
// var star = System.currentTimeMillis()
// clientRetrofitMethod.getTimeOut()
// var end = System.currentTimeMillis()
// return MyResult.Success(end.minus(star).toInt())
// } catch (e: HttpException) {
// return MyResult.Error(e.code(), e.message() ?: "error")
// } catch (e: Exception) {
// return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
// }
// }
//
// /***查询车位信息
// * 苏州hmi用的这个接口判断空闲车位
// * ***/
// suspend fun getSpaceData(): MyResult<SpaceNoBean> {
// var map = mutableMapOf("pageNo" to 20, "pageSize" to 1000)
// var body = RequestBodyUtil.toRequestBody(map)
// try {
// var bean = clientRetrofitMethod.getSpaceData(body)
// return MyResult.Success(bean.data)
// } 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}")
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}"
)
return
MyResult
.
Error
(
e
.
code
(),
e
.
message
()
?:
"error"
)
}
catch
(
e
:
Exception
)
{
return
MyResult
.
Error
(
MyContants
.
HTTP_ERROR
,
e
.
message
?:
"error"
)
}
}
// return MyResult.Error(e.code(), e.message() ?: "error")
// } catch (e: Exception) {
// return MyResult.Error(MyContants.HTTP_ERROR, e.message ?: "error")
// }
// }
// /**联网车辆状态数据***/
...
...
app/src/main/java/com/sd/cavphmi/ui/LoginActivity.kt
0 → 100644
View file @
0a5baef9
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
app/src/main/java/com/sd/cavphmi/ui/MainActivity.kt
View file @
0a5baef9
...
...
@@ -6,9 +6,6 @@ import androidx.lifecycle.ViewModelProvider
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.R
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.intfaces.OnConCan
import
com.sd.cavphmi.ui.fragment.CarPanelFragment
...
...
@@ -38,7 +35,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
}
private
val
mockVM
:
MockVM
by
viewModels
()
private
val
avpMapVM
:
AvpMapVM
by
viewModels
()
//
private val avpMapVM: AvpMapVM by viewModels()
private
lateinit
var
dialogFragment
:
ExitAppDialog
...
...
@@ -55,18 +52,11 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
override
fun
getToData
()
{
viewModel
.
startWS
()
// viewModel.getOrderData()
// viewModel.getSpaceDataLoc()
}
override
fun
initListener
()
{
mockBt
()
mockLis
()
//订单数据
viewModel
.
orderBean
.
observe
(
this
)
{
binding
.
order
=
it
}
}
private
fun
mockLis
()
{
...
...
@@ -88,71 +78,25 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
binding
.
btV2x
.
setOnClickListener
{
viewModel
.
subStartV2x
()
}
//网联车辆状态
binding
.
btStatus
.
setOnClickListener
{
viewModel
.
subVehicleStatus
().
observe
(
this
)
{
// println("time = ${time}")
// topicVehicleStatus(it)
}
}
//感知延时
binding
.
btPredelay
.
setOnClickListener
{
viewModel
.
subPreDelay
()
//HTTP获取车辆详情
binding
.
btGetveh
.
setOnClickListener
{
viewModel
.
getVehDetail
()
}
//交通感知事件
binding
.
btTarpre
.
setOnClickListener
{
viewModel
.
subTrafficPre
().
observe
(
this
)
{
}
}
//交通信号灯
binding
.
btTarlight
.
setOnClickListener
{
viewModel
.
subTrafficLight
()
}
// binding.btJubuline.setOnClickListener {
// viewModel.subPartLine()
// }
// binding.btRsi.setOnClickListener {
// viewModel.subRsiEvent()
//网联车辆状态
// binding.btStatus.setOnClickListener {
// viewModel.subVehicleStatus()
// }
}
/**车辆姿态**/
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)
}
...
...
app/src/main/java/com/sd/cavphmi/utils/MyContants.kt
View file @
0a5baef9
...
...
@@ -3,12 +3,24 @@ package com.sd.cavphmi.utils
object
MyContants
{
// const val IS_DEBUG = true
var
HOST
=
"https://faw.cuscavp.cn:8443"
private
val
token
=
"111"
private
val
reType
=
"51world"
var
WSHOST
=
"wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=${token}&reType=${reType}&"
// var HOST = "https://itg-dev.cu-sc.com:19443/"
//开发环境切勿动
var
HOST
=
"https://itg-yz.cu-sc.com:13443"
// var HOST = "https://itg-yz.cu-sc.com:13443/api/avpweb/"
// 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"
/***感知目标物***/
...
...
app/src/main/java/com/sd/cavphmi/utils/SM4CryptoHelper.java
0 → 100644
View file @
0a5baef9
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
);
}
}
app/src/main/java/com/sd/cavphmi/viewmodels/LoginVm.kt
0 → 100644
View file @
0a5baef9
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
app/src/main/java/com/sd/cavphmi/viewmodels/MainVm.kt
View file @
0a5baef9
...
...
@@ -5,31 +5,23 @@ import androidx.lifecycle.LiveData
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.viewModelScope
import
com.google.gson.Gson
import
com.google.gson.reflect.TypeToken
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.bean.AllLinePlaningBean
import
com.sd.cavphmi.bean.CarPanelBean
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.PreDelay
import
com.sd.cavphmi.bean.RsiEventBean
import
com.sd.cavphmi.bean.SpaceDataLocBeanItem
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.MyWebSocketClient
import
com.sd.cavphmi.websockets.PreDelayWSClient
import
com.sd.cavphmi.websockets.TrafficLightWSClient
import
com.sd.cavphmi.websockets.TrafficPreWSClient
...
...
@@ -38,21 +30,16 @@ 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.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
protocol.Response
import
java.net.URI
import
java.util.Timer
import
java.util.TimerTask
import
javax.inject.Inject
@HiltViewModel
class
MainVm
@Inject
constructor
(
@ApplicationContext
private
var
context
:
Context
,
private
var
parseSocketRepo
:
ParseSocketRepo
// var spaceNoRepo: SpaceNoRepo,
private
var
avpDataRepo
:
AvpDataRepo
)
:
MyBaseViewModel
()
{
// private var client: MyWebSocketClient? = null
...
...
@@ -67,16 +54,16 @@ class MainVm @Inject constructor(
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
()
...
...
@@ -96,276 +83,20 @@ class MainVm @Inject constructor(
var
v2xStartBean
=
MutableLiveData
<
V2xStartBean
>()
//联网车辆状态数据
var
vehicleStat
=
MutableLiveData
<
VehicleStats
>()
//感知时延
var
preDelay
=
MutableLiveData
<
PreDelay
>()
// var vehicleStat = MutableLiveData<VehicleStats>()
//交通感知
var
trafficPerBean
=
MutableLiveData
<
TrafficPerBean
>()
//
var trafficPerBean = MutableLiveData<TrafficPerBean>()
//交通信号灯
var
trafficLightBean
=
MutableLiveData
<
TrafficLightBean
>()
//
var trafficLightBean = MutableLiveData<TrafficLightBean>()
/***车辆仪表***/
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 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
()
{
// val httpHeaders = mutableMapOf<String, String>()
...
...
@@ -386,101 +117,18 @@ class MainVm @Inject constructor(
}
private
var
onDataCb
=
object
:
MyWebSocketClient
.
OnDataCb
{
override
fun
onVehicle
(
res
:
Response
.
SocketResponse
)
{
/* viewModelScope.launch {
FileIoUtils.writeToFile(res.data, "CarVehicle.txt")
val bean =
parseSocketRepo.parseDataBean(res.data, CarVehicle::class.java)
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
)
{
//获取车辆详情
fun
getVehDetail
(
id
:
String
=
"1"
)
{
viewModelScope
.
launch
{
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
}
var
result
=
avpDataRepo
.
getVehDetail
(
id
)
when
(
result
)
{
is
MyResult
.
Success
<
VehDetailBean
>
->
{
// println("-------时间差---- = ${result.data}")
}
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
}
else
->
{
// println("-------Error---- = ${result.msg}")
}
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(
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}
...
...
@@ -596,19 +220,24 @@ class MainVm @Inject constructor(
return
v2xStartBean
}
/*** 感知延时**/
fun
subPreDelay
():
LiveData
<
PreDelay
>
{
//暂时用不到---------------------------------------------
/**
* 网联车辆状态
* */
/* fun subVehicleStatus(): LiveData<VehicleStats> {
try {
if
(
preDelay
WSClient
==
null
)
{
preDelay
WSClient
=
PreDelay
WSClient
(
URI
(
MyContants
.
WS_
PRE_DELAY
))
preDelay
WSClient
?.
connect
()
if (
vehStatu
WSClient == null) {
vehStatu
WSClient =
VehStatu
WSClient(URI(MyContants.WS_
VEH_STATU
))
vehStatu
WSClient?.connect()
preDelay
WSClient
?.
onDataCb
=
object
:
PreDelay
WSClient
.
OnDataCb
{
vehStatu
WSClient?.onDataCb = object :
VehStatu
WSClient.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
)
FileIoUtils.writeToFile(str, "
vehicleS
.txt")
//
var bean = gson.fromJson(str,
VehicleStats
::class.java)
//
vehicleStat
.postValue(bean)
}
}
}
...
...
@@ -616,10 +245,12 @@ class MainVm @Inject constructor(
} catch (e: Exception) {
e.printStackTrace()
}
return
preDelay
return
vehicleStat
}
/*** 交通(感知)事件**/
*/
/*** 交通(感知)事件**//*
fun subTrafficPre(): LiveData<TrafficPerBean> {
try {
if (trafficPreWSClient == null) {
...
...
@@ -643,7 +274,8 @@ class MainVm @Inject constructor(
}
/*** 交通信号灯**/
*/
/*** 交通信号灯**//*
fun subTrafficLight(): LiveData<TrafficLightBean> {
try {
if (trafficLightWSClient == null) {
...
...
@@ -664,47 +296,10 @@ class MainVm @Inject constructor(
e.printStackTrace()
}
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
()
{
var
imgs
=
VToXImgBean
.
imgs
ToastHelper
.
showCustViewShort
(
context
,
imgs
.
get
(
"2"
)
!!
)
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/MockVM.kt
View file @
0a5baef9
...
...
@@ -3,34 +3,26 @@ package com.sd.cavphmi.viewmodels
import
android.content.Context
import
androidx.databinding.ObservableField
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.ViewModel
import
androidx.lifecycle.viewModelScope
import
com.google.gson.Gson
import
com.sd.cavphmi.base.MyBaseViewModel
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.PartLineBean
import
com.sd.cavphmi.bean.PerTarget
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.MyContants
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
retrofit2.HttpException
import
javax.inject.Inject
@HiltViewModel
class
MockVM
@Inject
constructor
(
@ApplicationContext
private
var
context
:
Context
,
private
var
parseSocketRepo
:
ParseSocketRepo
)
:
MyBaseViewModel
()
{
)
:
ViewModel
()
{
private
var
gson
=
Gson
()
...
...
@@ -66,55 +58,55 @@ class MockVM @Inject constructor(
//感知目标物
fun
onSubTargetMock
(
targetPre
:
MutableLiveData
<
PerTarget
>)
{
viewModelScope
.
launch
{
val
parts
=
mutableListOf
<
String
>()
FileIoUtils
.
getAssetMock
(
context
,
"mock/PerTarget.txt"
,
parts
)
parts
.
forEach
{
str
->
delay
(
1000
)
var
bean
=
parseSocketRepo
.
parseDataBean
(
str
,
PerTarget
::
class
.
java
)
println
(
"------模拟感知目标物数据 = ${bean}"
)
targetPre
.
value
=
bean
}
}
//
viewModelScope.launch {
//
val parts = mutableListOf<String>()
//
FileIoUtils.getAssetMock(context, "mock/PerTarget.txt", parts)
//
parts.forEach { str ->
//
delay(1000)
//
var bean = parseSocketRepo.parseDataBean(str, PerTarget::class.java)
//
println("------模拟感知目标物数据 = ${bean}")
//
targetPre.value = bean
//
}
//
}
}
//全局路径发生切换
fun
onSubLinePlaningMock
(
allLine
:
MutableLiveData
<
AllLinePlaningBean
>
)
{
viewModelScope
.
launch
{
val
alls
=
mutableListOf
<
String
>()
FileIoUtils
.
getAssetMock
(
context
,
"mock/all_line.txt"
,
alls
)
alls
.
forEach
{
str
->
delay
(
1000
)
var
bean
=
parseSocketRepo
.
parseDataBean
(
str
,
AllLinePlaningBean
::
class
.
java
)
allLine
.
value
=
bean
}
}
fun
onSubLinePlaningMock
()
{
//
viewModelScope.launch {
//
val alls = mutableListOf<String>()
//
FileIoUtils.getAssetMock(context, "mock/all_line.txt", alls)
//
alls.forEach { str ->
//
delay(1000)
//
var bean = parseSocketRepo.parseDataBean(str, AllLinePlaningBean::class.java)
//
allLine.value = bean
//
}
//
}
}
//局部路径
fun
onSubPartLineMock
(
allLine
:
MutableLiveData
<
PartLineBean
>
)
{
viewModelScope
.
launch
{
val
lines
=
mutableListOf
<
String
>()
lines
.
forEach
{
str
->
delay
(
1000
)
var
bean
=
parseSocketRepo
.
parseDataBean
(
str
,
PartLineBean
::
class
.
java
)
allLine
.
value
=
bean
}
}
fun
onSubPartLineMock
()
{
//
viewModelScope.launch {
//
val lines = mutableListOf<String>()
//
lines.forEach { str ->
//
delay(1000)
//
var bean = parseSocketRepo.parseDataBean(str, PartLineBean::class.java)
//
allLine.value = bean
//
}
//
}
}
//更新停车位
fun
onPointsMock
(
parkBean
:
MutableLiveData
<
ParkBean
>
)
{
viewModelScope
.
launch
{
val
points
=
mutableListOf
<
String
>()
FileIoUtils
.
getAssetMock
(
context
,
"mock/change_park.txt"
,
points
)
points
.
forEach
{
str
->
delay
(
1000
)
var
bean
=
parseSocketRepo
.
parseDataBean
(
str
,
ParkBean
::
class
.
java
)
println
(
"------模拟停车位变更 = ${bean}"
)
parkBean
.
value
=
bean
}
}
fun
onPointsMock
()
{
//
viewModelScope.launch {
//
val points = mutableListOf<String>()
//
FileIoUtils.getAssetMock(context, "mock/change_park.txt", points)
//
points.forEach { str ->
//
delay(1000)
//
var bean = parseSocketRepo.parseDataBean(str, ParkBean::class.java)
//
println("------模拟停车位变更 = ${bean}")
//
parkBean.value = bean
//
}
//
}
}
...
...
app/src/main/java/com/sd/cavphmi/websockets/VecLocWSClient.kt
View file @
0a5baef9
package
com.sd.cavphmi.websockets
import
com.sd.cavphmi.viewmodels.MainVm
import
org.java_websocket.client.WebSocketClient
import
org.java_websocket.drafts.Draft
import
org.java_websocket.handshake.ServerHandshake
import
protocol.Response
import
java.net.URI
import
java.nio.ByteBuffer
/*****
往来你
车辆位姿**/
/*****
网联
车辆位姿**/
class
VecLocWSClient
:
WebSocketClient
{
private
val
TAG
=
"-----VecLocWSClient"
...
...
app/src/main/res/drawable-xhdpi/et_pwd.png
0 → 100644
View file @
0a5baef9
490 Bytes
app/src/main/res/drawable-xhdpi/smartphone_line.png
0 → 100644
View file @
0a5baef9
241 Bytes
app/src/main/res/drawable/login_bg.xml
0 → 100644
View file @
0a5baef9
<?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>
app/src/main/res/drawable/rect_white_20.xml
0 → 100644
View file @
0a5baef9
<?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
app/src/main/res/layout/activity_login.xml
0 → 100644
View file @
0a5baef9
<?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
app/src/main/res/layout/activity_main.xml
View file @
0a5baef9
...
...
@@ -9,10 +9,6 @@
name=
"vm"
type=
"com.sd.cavphmi.viewmodels.MainVm"
/>
<variable
name=
"order"
type=
"com.sd.cavphmi.bean.OrderBean"
/>
</data>
<RelativeLayout
...
...
@@ -70,10 +66,10 @@
android:text=
"V2X预警开始"
/>
<Button
android:id=
"@+id/bt_
predelay
"
android:id=
"@+id/bt_
getveh
"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"
感知延时
"
/>
android:text=
"
HTTP 获取车辆详情
"
/>
<Button
android:id=
"@+id/bt_tarpre"
...
...
@@ -88,21 +84,6 @@
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>
...
...
app/src/main/res/layout/activity_tdtiles.xml
deleted
100644 → 0
View file @
09291f32
<?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
app/src/main/res/layout/order_detail.xml
View file @
0a5baef9
...
...
@@ -6,13 +6,13 @@
<data>
<variable
name=
"order"
type=
"com.sd.cavphmi.bean.OrderBean"
/>
<!--
<variable
-->
<!--
name="order"
-->
<!--
type="com.sd.cavphmi.bean.OrderBean" />
-->
</data>
<!-- app:showOrderLayout="@{order.avpStatus}"-->
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
...
...
@@ -20,7 +20,7 @@
android:orientation=
"vertical"
android:padding=
"15dp"
android:visibility=
"gone"
app:showOrderLayout=
"@{order.avpStatus}"
>
<LinearLayout
...
...
@@ -33,11 +33,12 @@
android:layout_height=
"wrap_content"
android:src=
"@drawable/bookmark_24"
/>
<!-- android:text="@{order.orderNo}"-->
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"5dp"
android:text=
"@{
order.orderNo
}"
android:text=
"@{}"
android:textColor=
"@color/text_black"
tools:text=
"32423427364862386482368462"
/>
...
...
@@ -55,11 +56,12 @@
android:layout_height=
"wrap_content"
android:src=
"@drawable/access_alarms_24"
/>
<!-- order.durationString-->
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"5dp"
android:text=
"@{
order.durationString
}"
android:text=
"@{}"
android:textColor=
"@color/text_black"
tools:text=
"1小时29分钟"
/>
...
...
@@ -75,12 +77,12 @@
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@drawable/access_time_24"
/>
<!-- {order.enterTime-->
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"5dp"
android:text=
"@{
order.enterTime
}"
android:text=
"@{}"
android:textColor=
"@color/text_black"
tools:text=
"2025-06-18 09:16:51"
/>
...
...
@@ -97,11 +99,11 @@
android:layout_height=
"wrap_content"
android:src=
"@drawable/attach_money_24"
/>
<!-- app:showOrderCost="@{}"-->
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginLeft=
"5dp"
app:showOrderCost=
"@{order.actualCost}"
android:textColor=
"@color/text_black"
tools:text=
"2025-06-18 09:16:51"
/>
...
...
app/src/main/res/mipmap-anydpi/ic_launcher.xml
deleted
100644 → 0
View file @
09291f32
<?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
app/src/main/res/mipmap-anydpi/ic_launcher_round.xml
deleted
100644 → 0
View file @
09291f32
<?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
app/src/main/res/mipmap-hdpi/ic_launcher.png
0 → 100644
View file @
0a5baef9
3.44 KB
Prev
1
2
3
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment