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
dcb7c2a6
Commit
dcb7c2a6
authored
Aug 07, 2025
by
p x
Browse files
录像socket推数据
parent
86ea637f
Changes
20
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/com/sd/cavphmi/bean/CarPanelBean.kt
View file @
dcb7c2a6
...
@@ -40,11 +40,6 @@ class CarPanelBean {
...
@@ -40,11 +40,6 @@ class CarPanelBean {
//转向灯 1=left 2=right
//转向灯 1=left 2=right
var
lights
=
ObservableField
<
Int
>(-
1
)
var
lights
=
ObservableField
<
Int
>(-
1
)
/*** 枚举类型:[0..9],1:人工接管(人工驾驶);2:单车自控(自动驾
* 驶);3:云端支持下的人工驾驶;4:云端支持下的自动驾驶;5:非
* 主驾位置人工驾驶(不启用);6:脱离(非自动驾驶行程自动结束下
* 的接管);7:远程驾驶(非现场人工驾驶);8:未处于任何驾驶模式;
* 9:其他未定义状态;0xFF 表示缺省*/
var
driveMode
=
ObservableField
(
""
)
var
driveMode
=
ObservableField
(
""
)
//航向角0.。360
//航向角0.。360
...
...
app/src/main/java/com/sd/cavphmi/bean/PreDelay.kt
0 → 100644
View file @
dcb7c2a6
package
com.sd.cavphmi.bean
/***感知延时**/
data class
PreDelay
(
val
id
:
String
,
val
level
:
Int
,
val
objects
:
List
<
PObject
>,
val
reportTime
:
Long
,
val
startTime
:
Long
,
val
type
:
Int
,
val
typeName
:
String
)
data class
PObject
(
val
elevation
:
Double
,
val
id
:
String
,
val
latitude
:
Double
,
val
longitude
:
Double
,
val
name
:
String
)
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/bean/TrafficLightBean.kt
0 → 100644
View file @
dcb7c2a6
package
com.sd.cavphmi.bean
/****交通信号灯****/
class
TrafficLightBean
{
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/bean/TrafficPerBean.kt
0 → 100644
View file @
dcb7c2a6
package
com.sd.cavphmi.bean
/****交通感知****/
class
TrafficPerBean
{
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/bean/V2xStartBean.kt
View file @
dcb7c2a6
package
com.sd.cavphmi.bean
package
com.sd.cavphmi.bean
/**V2x 预警开始***/
/**V2x 预警开始
class
V2xStartBean
{
* {"id":"39709073452974080","objects":[{"id":"269","name":"Vehicle","longitude":117.3470947,"latitude":38.9947742,"elevation":500.0},{"id":"100228","name":"Participants","longitude":117.347007,"latitude":38.994787,"elevation":500.0}],"type":1,"typeName":"前向碰撞预警","level":1,"startTime":1754533787716,"reportTime":1754533797778}
}
* ***/
\ No newline at end of file
data class
V2xStartBean
(
val
id
:
String
,
val
level
:
Int
,
val
objects
:
List
<
VObject
>,
////记录具体是哪两个对象发生了预警
val
reportTime
:
Long
,
val
startTime
:
Long
,
val
type
:
Int
,
val
typeName
:
String
)
data class
VObject
(
val
elevation
:
Double
,
val
id
:
String
,
val
latitude
:
Double
,
val
longitude
:
Double
,
val
name
:
String
)
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/ui/MainActivity.kt
View file @
dcb7c2a6
...
@@ -41,6 +41,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
...
@@ -41,6 +41,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
private
val
avpMapVM
:
AvpMapVM
by
viewModels
()
private
val
avpMapVM
:
AvpMapVM
by
viewModels
()
private
lateinit
var
dialogFragment
:
ExitAppDialog
private
lateinit
var
dialogFragment
:
ExitAppDialog
//汽车仪表
//汽车仪表
private
val
carPanelFragment
by
lazy
{
CarPanelFragment
.
newInstance
()
}
private
val
carPanelFragment
by
lazy
{
CarPanelFragment
.
newInstance
()
}
...
@@ -73,41 +74,47 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
...
@@ -73,41 +74,47 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
}
}
private
fun
mockBt
()
{
private
fun
mockBt
()
{
//联网车辆位姿数据
binding
.
btVehicle
.
setOnClickListener
{
binding
.
btVehicle
.
setOnClickListener
{
viewModel
.
subVehicle
().
observe
(
this
)
{
viewModel
.
subVehicle
().
observe
(
this
)
{
// topicVehicle(it)
// topicVehicle(it)
}
}
}
}
binding
.
btStatus
.
setOnClickListener
{
viewModel
.
subVehicleStatus
().
observe
(
this
)
{
// println("time = ${time}")
topicVehicleStatus
(
it
)
}
}
//感知目标物
//感知目标物
binding
.
btTarget
.
setOnClickListener
{
binding
.
btTarget
.
setOnClickListener
{
viewModel
.
subTarget
()
viewModel
.
subTarget
()
}
}
//v2x 预警
binding
.
btV2x
.
setOnClickListener
{
binding
.
btV2x
.
setOnClickListener
{
viewModel
.
subStartV2x
()
viewModel
.
subStartV2x
()
}
}
binding
.
btV2xend
.
setOnClickListener
{
//网联车辆状态
viewModel
.
subEndV2x
()
binding
.
btStatus
.
setOnClickListener
{
}
viewModel
.
subVehicleStatus
().
observe
(
this
)
{
binding
.
btChewei
.
setOnClickListener
{
// println("time = ${time}")
viewModel
.
subPoints
().
observe
(
this
)
{
// topicVehicleStatus(it)
topicvPoints
(
it
)
}
}
}
}
binding
.
btAllline
.
setOnClickListener
{
//感知延时
viewModel
.
subLinePlaning
()
binding
.
btPredelay
.
setOnClickListener
{
viewModel
.
subPreDelay
()
}
}
binding
.
btJubuline
.
setOnClickListener
{
//交通感知事件
viewModel
.
subPartLine
()
binding
.
btTarpre
.
setOnClickListener
{
viewModel
.
subTrafficPre
().
observe
(
this
)
{
}
}
}
binding
.
btRsi
.
setOnClickListener
{
//交通信号灯
viewModel
.
subRsiEvent
()
binding
.
btTarlight
.
setOnClickListener
{
viewModel
.
subTrafficLight
()
}
}
// binding.btJubuline.setOnClickListener {
// viewModel.subPartLine()
// }
// binding.btRsi.setOnClickListener {
// viewModel.subRsiEvent()
// }
}
}
/**车辆姿态**/
/**车辆姿态**/
...
...
app/src/main/java/com/sd/cavphmi/ui/fragment/MapMainFragment.kt
0 → 100644
View file @
dcb7c2a6
package
com.sd.cavphmi.ui.fragment
import
androidx.lifecycle.ViewModelProvider
import
com.sd.cavphmi.BR
import
com.sd.cavphmi.R
import
com.sd.cavphmi.base.BaseFragment
import
com.sd.cavphmi.base.MyBaseViewModel
import
com.sd.cavphmi.databinding.FragmentMapMainBinding
import
com.sd.cavphmi.viewmodels.AvpMapVM
import
dagger.hilt.android.AndroidEntryPoint
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
//private const val ARG_PARAM1 = "param1"
//private const val ARG_PARAM2 = "param2"
@AndroidEntryPoint
class
MapMainFragment
:
BaseFragment
<
FragmentMapMainBinding
,
AvpMapVM
>()
{
// private var param1: String? = null
// private var param2: String? = null
//
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// arguments?.let {
// param1 = it.getString(ARG_PARAM1)
// param2 = it.getString(ARG_PARAM2)
// }
// }// // T
override
fun
getStatuBarColor
():
Int
{
return
-
1
}
override
fun
isAutoStatusBarDarkModeEnable
():
Boolean
{
return
false
}
override
fun
initContentView
():
Int
{
return
R
.
layout
.
fragment_map_main
}
override
fun
initViewModel
():
AvpMapVM
{
return
ViewModelProvider
(
this
).
get
(
AvpMapVM
::
class
.
java
)
}
override
fun
initVariableId
():
Int
{
return
BR
.
vm
}
override
fun
initView
()
{
}
override
fun
initListener
()
{
}
override
fun
getToData
()
{
}
companion
object
{
@JvmStatic
fun
newInstance
()
=
MapMainFragment
()
// @JvmStatic
// fun newInstance(param1: String, param2: String) =
// MapMainFragment().apply {
// arguments = Bundle().apply {
// putString(ARG_PARAM1, param1)
// putString(ARG_PARAM2, param2)
// }
// }
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/utils/MyContants.kt
View file @
dcb7c2a6
package
com.sd.cavphmi.utils
package
com.sd.cavphmi.utils
object
MyContants
{
object
MyContants
{
const
val
IS_DEBUG
=
true
//
const val IS_DEBUG = true
var
HOST
=
if
(
IS_DEBUG
)
"https://faw.cuscavp.cn:8443"
else
""
var
HOST
=
"https://faw.cuscavp.cn:8443"
var
WSHOST
=
"wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?"
// var PORT = if (IS_DEBUG) "123" else "34534"
// var PORT = if (IS_DEBUG) "123" else "34534"
/***感知目标物***/
var
WS_FEEL_TARGET
=
"${WSHOST}token=111&msgType=1&reType=51world"
/***网联车辆位姿***/
/***网联车辆位姿***/
var
WS_VEH_LOC
=
"wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=111&msgType=2&reType=51world"
var
WS_VEH_LOC
=
"${WSHOST}token=111&msgType=2&reType=51world&vehicleId="
/***V2X预警 vehicleId 传了就是获取某一辆车的预警 ***/
var
WS_V2X
=
"${WSHOST}token=111&msgType=4&reType=51world&vehicleId="
/***网联车辆状态***/
var
WS_VEH_STATU
=
"${WSHOST}token=111&msgType=6&reType=51world&vehicleId="
/***感知延时***/
var
WS_PRE_DELAY
=
"${WSHOST}token=111&msgType=7&intersectionCode="
/***交通(感知)事件***/
var
WS_TRAFFIC_PER
=
"${WSHOST}token=111&msgType=5&intersectionCode=="
/***交通信号灯***/
var
WS_TRAFFIC_LIGHT
=
"${WSHOST}token=111&msgType=3&intersectionCode=="
/***感知目标物***/
var
WS_FEEL_TARGET
=
"wss://itg-dev.cu-sc.com:19443/WSPLUSV5/socket?token=111&msgType=1&reType=51world"
/***已经**/
/***已经**/
const
val
ALREADT_ONCE
=
-
1
const
val
ALREADT_ONCE
=
-
1
...
...
app/src/main/java/com/sd/cavphmi/viewmodels/AvpMapVM.kt
View file @
dcb7c2a6
...
@@ -2,11 +2,12 @@ package com.sd.cavphmi.viewmodels
...
@@ -2,11 +2,12 @@ package com.sd.cavphmi.viewmodels
import
android.content.Context
import
android.content.Context
import
androidx.lifecycle.ViewModel
import
androidx.lifecycle.ViewModel
import
com.sd.cavphmi.base.MyBaseViewModel
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
javax.inject.Inject
import
javax.inject.Inject
@HiltViewModel
@HiltViewModel
class
AvpMapVM
@Inject
constructor
(
@ApplicationContext
private
var
context
:
Context
)
:
class
AvpMapVM
@Inject
constructor
(
@ApplicationContext
private
var
context
:
Context
)
:
ViewModel
()
{
MyBase
ViewModel
()
{
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/viewmodels/MainVm.kt
View file @
dcb7c2a6
package
com.sd.cavphmi.viewmodels
package
com.sd.cavphmi.viewmodels
import
android.content.Context
import
android.content.Context
import
androidx.databinding.ObservableField
import
androidx.lifecycle.LiveData
import
androidx.lifecycle.LiveData
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.MutableLiveData
import
androidx.lifecycle.viewModelScope
import
androidx.lifecycle.viewModelScope
...
@@ -16,13 +15,14 @@ import com.sd.cavphmi.bean.ParkBean
...
@@ -16,13 +15,14 @@ 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.PartLineBean
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.PerTarget
import
com.sd.cavphmi.bean.
ReqBean
import
com.sd.cavphmi.bean.
PreDelay
import
com.sd.cavphmi.bean.RsiEventBean
import
com.sd.cavphmi.bean.RsiEventBean
import
com.sd.cavphmi.bean.SpaceDataLocBeanItem
import
com.sd.cavphmi.bean.SpaceDataLocBeanItem
import
com.sd.cavphmi.bean.SpaceNoBean
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.VToXImgBean
import
com.sd.cavphmi.bean.VehicleStats
import
com.sd.cavphmi.bean.VehicleStats
import
com.sd.cavphmi.bean.WebSetBean
import
com.sd.cavphmi.net.MyResult
import
com.sd.cavphmi.net.MyResult
import
com.sd.cavphmi.repositorys.ParseSocketRepo
import
com.sd.cavphmi.repositorys.ParseSocketRepo
import
com.sd.cavphmi.utils.FileIoUtils
import
com.sd.cavphmi.utils.FileIoUtils
...
@@ -30,13 +30,17 @@ import com.sd.cavphmi.utils.MyContants
...
@@ -30,13 +30,17 @@ 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.MyWebSocketClient
import
com.sd.cavphmi.websockets.PreDelayWSClient
import
com.sd.cavphmi.websockets.TrafficLightWSClient
import
com.sd.cavphmi.websockets.TrafficPreWSClient
import
com.sd.cavphmi.websockets.V2xWSClient
import
com.sd.cavphmi.websockets.VecLocWSClient
import
com.sd.cavphmi.websockets.VecLocWSClient
import
com.sd.cavphmi.websockets.VehStatuWSClient
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.lifecycle.HiltViewModel
import
dagger.hilt.android.qualifiers.ApplicationContext
import
dagger.hilt.android.qualifiers.ApplicationContext
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.Dispatchers
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.launch
import
kotlinx.coroutines.withContext
import
kotlinx.coroutines.withContext
import
org.java_websocket.handshake.ServerHandshake
import
protocol.Response
import
protocol.Response
import
java.net.URI
import
java.net.URI
import
java.util.Timer
import
java.util.Timer
...
@@ -51,13 +55,28 @@ class MainVm @Inject constructor(
...
@@ -51,13 +55,28 @@ class MainVm @Inject constructor(
// var spaceNoRepo: SpaceNoRepo,
// var spaceNoRepo: SpaceNoRepo,
)
:
MyBaseViewModel
()
{
)
:
MyBaseViewModel
()
{
private
var
client
:
MyWebSocketClient
?
=
null
//
private var client: MyWebSocketClient? = null
//w网联车辆socket
//w网联车辆socket
private
var
vecLocWSClient
:
VecLocWSClient
?
=
null
private
var
vecLocWSClient
:
VecLocWSClient
?
=
null
//感知物socket
//感知物socket
private
var
feelTargetWSClient
:
FeelTargetWSClient
?
=
null
private
var
feelTargetWSClient
:
FeelTargetWSClient
?
=
null
//感知物socket
private
var
v2xWSClient
:
V2xWSClient
?
=
null
//网联车辆状态
private
var
vehStatuWSClient
:
VehStatuWSClient
?
=
null
//感知延时
private
var
preDelayWSClient
:
PreDelayWSClient
?
=
null
//交通感知事件
private
var
trafficPreWSClient
:
TrafficPreWSClient
?
=
null
//交通信号灯
private
var
trafficLightWSClient
:
TrafficLightWSClient
?
=
null
private
var
gson
=
Gson
()
private
var
gson
=
Gson
()
...
@@ -70,20 +89,37 @@ class MainVm @Inject constructor(
...
@@ -70,20 +89,37 @@ class MainVm @Inject constructor(
//车辆位姿数据
//车辆位姿数据
var
carVehicle
=
MutableLiveData
<
CarVehicle
>()
var
carVehicle
=
MutableLiveData
<
CarVehicle
>()
//联网车辆状态数据topic
var
vehicleStat
=
MutableLiveData
<
VehicleStats
>()
//感知目标物
//感知目标物
var
targetPre
=
MutableLiveData
<
PerTarget
>()
var
targetPre
=
MutableLiveData
<
PerTarget
>()
//v2x 预警
var
v2xStartBean
=
MutableLiveData
<
V2xStartBean
>()
//联网车辆状态数据
var
vehicleStat
=
MutableLiveData
<
VehicleStats
>()
//感知时延
var
preDelay
=
MutableLiveData
<
PreDelay
>()
//交通感知
var
trafficPerBean
=
MutableLiveData
<
TrafficPerBean
>()
//交通信号灯
var
trafficLightBean
=
MutableLiveData
<
TrafficLightBean
>()
/***车辆仪表***/
var
carPanelBean
=
CarPanelBean
.
instance
// 、、-----------------
//全局路径
//全局路径
var
allLine
=
MutableLiveData
<
AllLinePlaningBean
>()
//
var allLine = MutableLiveData<AllLinePlaningBean>()
//局部路径
//局部路径
var
partLine
=
MutableLiveData
<
PartLineBean
>()
//
var partLine = MutableLiveData<PartLineBean>()
//停车位变更
//停车位变更
var
parkBean
=
MutableLiveData
<
ParkBean
>()
//
var parkBean = MutableLiveData<ParkBean>()
//停车位编码
//停车位编码
var
spaceCode
=
""
var
spaceCode
=
""
...
@@ -97,8 +133,6 @@ class MainVm @Inject constructor(
...
@@ -97,8 +133,6 @@ class MainVm @Inject constructor(
// 是否处理路径规划显示的路径
// 是否处理路径规划显示的路径
private
var
needDealPath
=
false
private
var
needDealPath
=
false
/***车辆仪表***/
var
carPanelBean
=
CarPanelBean
.
instance
//网络延时时间差
//网络延时时间差
// var timeOutDiff = ObservableField(-1)
// var timeOutDiff = ObservableField(-1)
...
@@ -110,7 +144,7 @@ class MainVm @Inject constructor(
...
@@ -110,7 +144,7 @@ class MainVm @Inject constructor(
private
var
orderTimer
=
Timer
()
private
var
orderTimer
=
Timer
()
// 车位信息
// 车位信息
private
var
carSpaNoTimer
=
Timer
()
//
private var carSpaNoTimer = Timer()
/***获取信号强度**/
/***获取信号强度**/
...
@@ -348,30 +382,8 @@ class MainVm @Inject constructor(
...
@@ -348,30 +382,8 @@ class MainVm @Inject constructor(
/***清理资源***/
/***清理资源***/
fun
cleanRes
()
{
fun
cleanRes
()
{
// curTimer.cancel()
// netSingTimer.cancel()
orderTimer
.
cancel
()
carSpaNoTimer
.
cancel
()
closeWS
()
}
private
fun
closeWS
()
{
if
(
client
?.
isOpen
?:
false
)
{
client
?.
close
()
}
}
private
var
onSocketCb
=
object
:
MyWebSocketClient
.
OnSocketCb
{
override
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
{
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
}
override
fun
onError
(
ex
:
Exception
?)
{
}
}
}
...
@@ -440,7 +452,7 @@ class MainVm @Inject constructor(
...
@@ -440,7 +452,7 @@ class MainVm @Inject constructor(
println
(
"-----停车位变更 = ${res.data}"
)
println
(
"-----停车位变更 = ${res.data}"
)
FileIoUtils
.
writeToFile
(
res
.
data
,
"change_park.txt"
)
FileIoUtils
.
writeToFile
(
res
.
data
,
"change_park.txt"
)
var
bean
=
parseSocketRepo
.
parseDataBean
(
res
.
data
,
ParkBean
::
class
.
java
)
var
bean
=
parseSocketRepo
.
parseDataBean
(
res
.
data
,
ParkBean
::
class
.
java
)
parkBean
.
value
=
bean
//
parkBean.value = bean
}
}
}
}
...
@@ -449,7 +461,7 @@ class MainVm @Inject constructor(
...
@@ -449,7 +461,7 @@ class MainVm @Inject constructor(
println
(
"-----全局路径发生切换 = ${res.data}"
)
println
(
"-----全局路径发生切换 = ${res.data}"
)
FileIoUtils
.
writeToFile
(
res
.
data
,
"all_line.txt"
)
FileIoUtils
.
writeToFile
(
res
.
data
,
"all_line.txt"
)
val
bean
=
parseSocketRepo
.
parseDataBean
(
res
.
data
,
AllLinePlaningBean
::
class
.
java
)
val
bean
=
parseSocketRepo
.
parseDataBean
(
res
.
data
,
AllLinePlaningBean
::
class
.
java
)
allLine
.
value
=
bean
//
allLine.value = bean
}
}
}
}
...
@@ -458,7 +470,7 @@ class MainVm @Inject constructor(
...
@@ -458,7 +470,7 @@ class MainVm @Inject constructor(
println
(
"-----局部路径 = ${res.data}"
)
println
(
"-----局部路径 = ${res.data}"
)
FileIoUtils
.
writeToFile
(
res
.
data
,
"part_line.txt"
)
FileIoUtils
.
writeToFile
(
res
.
data
,
"part_line.txt"
)
var
bean
=
parseSocketRepo
.
parseDataBean
(
res
.
data
,
PartLineBean
::
class
.
java
)
var
bean
=
parseSocketRepo
.
parseDataBean
(
res
.
data
,
PartLineBean
::
class
.
java
)
partLine
.
value
=
bean
//
partLine.value = bean
}
}
}
}
...
@@ -486,9 +498,11 @@ class MainVm @Inject constructor(
...
@@ -486,9 +498,11 @@ class MainVm @Inject constructor(
vecLocWSClient
?.
onDataCb
=
object
:
VecLocWSClient
.
OnDataCb
{
vecLocWSClient
?.
onDataCb
=
object
:
VecLocWSClient
.
OnDataCb
{
override
fun
onMsg
(
str
:
String
)
{
override
fun
onMsg
(
str
:
String
)
{
// FileIoUtils.writeToFile(str, "CarVehicle.txt")
viewModelScope
.
launch
{
var
bean
=
gson
.
fromJson
(
str
,
CarVehicle
::
class
.
java
)
FileIoUtils
.
writeToFile
(
str
,
"CarVehicle.txt"
)
carVehicle
.
postValue
(
bean
)
var
bean
=
gson
.
fromJson
(
str
,
CarVehicle
::
class
.
java
)
carVehicle
.
postValue
(
bean
)
}
}
}
}
}
}
}
...
@@ -503,8 +517,24 @@ class MainVm @Inject constructor(
...
@@ -503,8 +517,24 @@ class MainVm @Inject constructor(
* 联网车辆状态数据
* 联网车辆状态数据
* */
* */
fun
subVehicleStatus
():
LiveData
<
VehicleStats
>
{
fun
subVehicleStatus
():
LiveData
<
VehicleStats
>
{
val
reqStr
=
getSendData
(
"/topic/vehicleStatus"
)
try
{
client
?.
send
(
reqStr
)
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
return
vehicleStat
}
}
...
@@ -522,9 +552,11 @@ class MainVm @Inject constructor(
...
@@ -522,9 +552,11 @@ class MainVm @Inject constructor(
feelTargetWSClient
?.
onDataCb
=
object
:
FeelTargetWSClient
.
OnDataCb
{
feelTargetWSClient
?.
onDataCb
=
object
:
FeelTargetWSClient
.
OnDataCb
{
override
fun
onMsg
(
str
:
String
)
{
override
fun
onMsg
(
str
:
String
)
{
// FileIoUtils.writeToFile(str, "PerTarget.txt")
viewModelScope
.
launch
{
var
bean
=
gson
.
fromJson
(
str
,
PerTarget
::
class
.
java
)
FileIoUtils
.
writeToFile
(
str
,
"PerTarget.txt"
)
targetPre
.
postValue
(
bean
)
var
bean
=
gson
.
fromJson
(
str
,
PerTarget
::
class
.
java
)
targetPre
.
postValue
(
bean
)
}
}
}
}
}
}
}
...
@@ -538,63 +570,139 @@ class MainVm @Inject constructor(
...
@@ -538,63 +570,139 @@ class MainVm @Inject constructor(
/**
/**
* V2X预警开始
* V2X预警开始
* **/
* **/
fun
subStartV2x
()
{
fun
subStartV2x
():
LiveData
<
V2xStartBean
>
{
val
reqStr
=
getSendData
(
"/topic/v2xStart"
)
if
(
isMock
)
{
client
?.
send
(
reqStr
)
// mockVM.onSubTargetMock(targetPre)
}
}
else
{
try
{
if
(
v2xWSClient
==
null
)
{
v2xWSClient
=
V2xWSClient
(
URI
(
MyContants
.
WS_V2X
))
v2xWSClient
?.
connect
()
/*** V2X预警结束topic**/
v2xWSClient
?.
onDataCb
=
object
:
V2xWSClient
.
OnDataCb
{
fun
subEndV2x
()
{
override
fun
onMsg
(
str
:
String
)
{
var
reqStr
=
getSendData
(
"/topic/v2xEnd"
)
viewModelScope
.
launch
{
client
?.
send
(
reqStr
)
FileIoUtils
.
writeToFile
(
str
,
"onStartV2x.txt"
)
var
bean
=
gson
.
fromJson
(
str
,
V2xStartBean
::
class
.
java
)
v2xStartBean
.
postValue
(
bean
)
}
}
}
}
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
}
}
return
v2xStartBean
}
}
/*** 更新停车位**/
/*** 感知延时**/
fun
subPoints
():
LiveData
<
ParkBean
>
{
fun
subPreDelay
():
LiveData
<
PreDelay
>
{
if
(
isMock
)
{
try
{
mockVM
.
onPointsMock
(
parkBean
)
if
(
preDelayWSClient
==
null
)
{
}
else
{
preDelayWSClient
=
PreDelayWSClient
(
URI
(
MyContants
.
WS_PRE_DELAY
))
client
?.
send
(
getSendData
(
"/topic/points"
))
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
)
}
}
}
}
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
}
}
return
p
arkBean
return
p
reDelay
}
}
/*** 全局路径发生切换**/
/*** 交通(感知)事件**/
fun
subLinePlaning
():
LiveData
<
AllLinePlaningBean
>
{
fun
subTrafficPre
():
LiveData
<
TrafficPerBean
>
{
if
(
isMock
)
{
try
{
mockVM
.
onSubLinePlaningMock
(
allLine
)
if
(
trafficPreWSClient
==
null
)
{
}
else
{
trafficPreWSClient
=
TrafficPreWSClient
(
URI
(
MyContants
.
WS_TRAFFIC_PER
))
val
reqStr
=
getSendData
(
"/topic/linePlaning"
)
trafficPreWSClient
?.
connect
()
client
?.
send
(
reqStr
)
trafficPreWSClient
?.
onDataCb
=
object
:
TrafficPreWSClient
.
OnDataCb
{
override
fun
onMsg
(
str
:
String
)
{
viewModelScope
.
launch
{
FileIoUtils
.
writeToFile
(
str
,
"pre_traff.txt"
)
var
bean
=
gson
.
fromJson
(
str
,
TrafficPerBean
::
class
.
java
)
trafficPerBean
.
postValue
(
bean
)
}
}
}
}
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
}
}
return
allLine
return
trafficPerBean
}
}
/*** 局部路径**/
fun
subPartLine
():
LiveData
<
PartLineBean
>
{
/*** 交通信号灯**/
if
(
isMock
)
{
fun
subTrafficLight
():
LiveData
<
TrafficLightBean
>
{
mockVM
.
onSubPartLineMock
(
partLine
)
try
{
}
else
{
if
(
trafficLightWSClient
==
null
)
{
val
reqStr
=
getSendData
(
"/topic/partLine"
)
trafficLightWSClient
=
TrafficLightWSClient
(
URI
(
MyContants
.
WS_TRAFFIC_LIGHT
))
client
?.
send
(
reqStr
)
trafficLightWSClient
?.
connect
()
trafficLightWSClient
?.
onDataCb
=
object
:
TrafficLightWSClient
.
OnDataCb
{
override
fun
onMsg
(
str
:
String
)
{
viewModelScope
.
launch
{
FileIoUtils
.
writeToFile
(
str
,
"traff_light.txt"
)
// var bean = gson.fromJson(str, TrafficPerBean::class.java)
// trafficPerBean.postValue(bean)
}
}
}
}
}
catch
(
e
:
Exception
)
{
e
.
printStackTrace
()
}
}
return
partLine
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事件**/
/*** rsi事件**/
fun
subRsiEvent
()
{
//
fun subRsiEvent() {
val
reqStr
=
getSendData
(
"/topic/rsiEvent"
)
//
val reqStr = getSendData("/topic/rsiEvent")
client
?.
send
(
reqStr
)
//
client?.send(reqStr)
}
//
}
/**构建发送体**/
/**构建发送体**/
private
fun
getSendData
(
key
:
String
):
String
{
//
private fun getSendData(key: String): String {
var
data
=
WebSetBean
.
subDic
.
get
(
key
)
//
var data = WebSetBean.subDic.get(key)
var
req
=
ReqBean
()
//
var req = ReqBean()
req
.
data
=
data
!!
//
req.data = data!!
var
str
=
gson
.
toJson
(
req
)
//
var str = gson.toJson(req)
return
str
//
return str
}
//
}
fun
showVToTip
()
{
fun
showVToTip
()
{
...
...
app/src/main/java/com/sd/cavphmi/websockets/FeelTargetWSClient.kt
View file @
dcb7c2a6
...
@@ -26,7 +26,7 @@ class FeelTargetWSClient : WebSocketClient {
...
@@ -26,7 +26,7 @@ class FeelTargetWSClient : WebSocketClient {
}
}
override
fun
onMessage
(
message
:
String
?)
{
override
fun
onMessage
(
message
:
String
?)
{
//
System.out.
println(TAG + "
received message
: " + message)
;
println
(
TAG
+
"
: "
+
message
)
if
(
message
.
isNullOrEmpty
())
if
(
message
.
isNullOrEmpty
())
return
return
onDataCb
?.
onMsg
(
message
)
onDataCb
?.
onMsg
(
message
)
...
...
app/src/main/java/com/sd/cavphmi/websockets/PreDelayWSClient.kt
0 → 100644
View file @
dcb7c2a6
package
com.sd.cavphmi.websockets
import
org.java_websocket.client.WebSocketClient
import
org.java_websocket.drafts.Draft
import
org.java_websocket.handshake.ServerHandshake
import
java.net.URI
import
java.nio.ByteBuffer
/*****感知延时**/
class
PreDelayWSClient
:
WebSocketClient
{
private
val
TAG
=
"-----PreDelayWSClient"
constructor
(
serverUri
:
URI
)
:
super
(
serverUri
)
constructor
(
serverUri
:
URI
?,
protocolDraft
:
Draft
?)
:
super
(
serverUri
,
protocolDraft
)
constructor
(
serverUri
:
URI
?,
httpHeaders
:
MutableMap
<
String
,
String
>?)
:
super
(
serverUri
,
httpHeaders
)
override
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
{
// send("Hello, it is me. Mario :)")
// System.out.println(TAG + "new connection opened")
}
override
fun
onMessage
(
message
:
String
?)
{
println
(
TAG
+
" : "
+
message
)
if
(
message
.
isNullOrEmpty
())
return
onDataCb
?.
onMsg
(
message
)
// onSocketCb?.onMessage(message)
}
override
fun
onMessage
(
bytes
:
ByteBuffer
?)
{
// System.out.println(TAG + " received ByteBuffer")
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
// System.out.println(TAG + " closed with exit code " + code + " additional info: " + reason);
}
override
fun
onError
(
ex
:
Exception
?)
{
// System.err.println(TAG + "an error occurred:" + ex)
}
var
onDataCb
:
OnDataCb
?
=
null
interface
OnDataCb
{
fun
onMsg
(
str
:
String
)
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/websockets/TrafficLightWSClient.kt
0 → 100644
View file @
dcb7c2a6
package
com.sd.cavphmi.websockets
import
org.java_websocket.client.WebSocketClient
import
org.java_websocket.drafts.Draft
import
org.java_websocket.handshake.ServerHandshake
import
java.net.URI
import
java.nio.ByteBuffer
/**
*交通信号灯
* **/
class
TrafficLightWSClient
:
WebSocketClient
{
private
val
TAG
=
"-----TrafficLightWSClient"
constructor
(
serverUri
:
URI
)
:
super
(
serverUri
)
constructor
(
serverUri
:
URI
?,
protocolDraft
:
Draft
?)
:
super
(
serverUri
,
protocolDraft
)
constructor
(
serverUri
:
URI
?,
httpHeaders
:
MutableMap
<
String
,
String
>?)
:
super
(
serverUri
,
httpHeaders
)
override
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
{
// send("Hello, it is me. Mario :)")
System
.
out
.
println
(
TAG
+
" new connection opened"
)
}
override
fun
onMessage
(
message
:
String
?)
{
println
(
TAG
+
" : "
+
message
)
if
(
message
.
isNullOrEmpty
())
return
onDataCb
?.
onMsg
(
message
)
// onSocketCb?.onMessage(message)
}
override
fun
onMessage
(
bytes
:
ByteBuffer
?)
{
// System.out.println(TAG + " received ByteBuffer")
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
// System.out.println(TAG + " closed with exit code " + code + " additional info: " + reason);
}
override
fun
onError
(
ex
:
Exception
?)
{
// System.err.println(TAG + "an error occurred:" + ex)
}
var
onDataCb
:
OnDataCb
?
=
null
interface
OnDataCb
{
fun
onMsg
(
str
:
String
)
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/websockets/TrafficPreWSClient.kt
0 → 100644
View file @
dcb7c2a6
package
com.sd.cavphmi.websockets
import
org.java_websocket.client.WebSocketClient
import
org.java_websocket.drafts.Draft
import
org.java_websocket.handshake.ServerHandshake
import
java.net.URI
import
java.nio.ByteBuffer
/**
*交通(感知)事件
* **/
class
TrafficPreWSClient
:
WebSocketClient
{
private
val
TAG
=
"-----TrafficPreWSClient"
constructor
(
serverUri
:
URI
)
:
super
(
serverUri
)
constructor
(
serverUri
:
URI
?,
protocolDraft
:
Draft
?)
:
super
(
serverUri
,
protocolDraft
)
constructor
(
serverUri
:
URI
?,
httpHeaders
:
MutableMap
<
String
,
String
>?)
:
super
(
serverUri
,
httpHeaders
)
override
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
{
// send("Hello, it is me. Mario :)")
System
.
out
.
println
(
TAG
+
" new connection opened"
)
}
override
fun
onMessage
(
message
:
String
?)
{
println
(
TAG
+
" : "
+
message
)
if
(
message
.
isNullOrEmpty
())
return
onDataCb
?.
onMsg
(
message
)
// onSocketCb?.onMessage(message)
}
override
fun
onMessage
(
bytes
:
ByteBuffer
?)
{
// System.out.println(TAG + " received ByteBuffer")
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
// System.out.println(TAG + " closed with exit code " + code + " additional info: " + reason);
}
override
fun
onError
(
ex
:
Exception
?)
{
// System.err.println(TAG + "an error occurred:" + ex)
}
var
onDataCb
:
OnDataCb
?
=
null
interface
OnDataCb
{
fun
onMsg
(
str
:
String
)
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/websockets/V2xWSClient.kt
0 → 100644
View file @
dcb7c2a6
package
com.sd.cavphmi.websockets
import
org.java_websocket.client.WebSocketClient
import
org.java_websocket.drafts.Draft
import
org.java_websocket.handshake.ServerHandshake
import
java.net.URI
import
java.nio.ByteBuffer
/*****v2x预警**/
class
V2xWSClient
:
WebSocketClient
{
private
val
TAG
=
"-----V2xWSClient"
constructor
(
serverUri
:
URI
)
:
super
(
serverUri
)
constructor
(
serverUri
:
URI
?,
protocolDraft
:
Draft
?)
:
super
(
serverUri
,
protocolDraft
)
constructor
(
serverUri
:
URI
?,
httpHeaders
:
MutableMap
<
String
,
String
>?)
:
super
(
serverUri
,
httpHeaders
)
override
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
{
// send("Hello, it is me. Mario :)")
// System.out.println(TAG + "new connection opened")
}
override
fun
onMessage
(
message
:
String
?)
{
println
(
TAG
+
" : "
+
message
)
if
(
message
.
isNullOrEmpty
())
return
onDataCb
?.
onMsg
(
message
)
// onSocketCb?.onMessage(message)
}
override
fun
onMessage
(
bytes
:
ByteBuffer
?)
{
// System.out.println(TAG + " received ByteBuffer")
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
// System.out.println(TAG + " closed with exit code " + code + " additional info: " + reason);
}
override
fun
onError
(
ex
:
Exception
?)
{
// System.err.println(TAG + "an error occurred:" + ex)
}
var
onDataCb
:
OnDataCb
?
=
null
interface
OnDataCb
{
fun
onMsg
(
str
:
String
)
}
}
\ No newline at end of file
app/src/main/java/com/sd/cavphmi/websockets/VecLocWSClient.kt
View file @
dcb7c2a6
...
@@ -29,7 +29,7 @@ class VecLocWSClient : WebSocketClient {
...
@@ -29,7 +29,7 @@ class VecLocWSClient : WebSocketClient {
}
}
override
fun
onMessage
(
message
:
String
?)
{
override
fun
onMessage
(
message
:
String
?)
{
System
.
out
.
println
(
TAG
+
"
received message
: "
+
message
);
System
.
out
.
println
(
TAG
+
"
: "
+
message
);
if
(
message
.
isNullOrEmpty
())
if
(
message
.
isNullOrEmpty
())
return
return
onDataCb
?.
onMsg
(
message
)
onDataCb
?.
onMsg
(
message
)
...
...
app/src/main/java/com/sd/cavphmi/websockets/VehStatuWSClient.kt
0 → 100644
View file @
dcb7c2a6
package
com.sd.cavphmi.websockets
import
org.java_websocket.client.WebSocketClient
import
org.java_websocket.drafts.Draft
import
org.java_websocket.handshake.ServerHandshake
import
java.net.URI
import
java.nio.ByteBuffer
/*****网联车辆状态
* 只有发生变化的数据才推送
* **/
class
VehStatuWSClient
:
WebSocketClient
{
private
val
TAG
=
"-----VehStatuWSClient"
constructor
(
serverUri
:
URI
)
:
super
(
serverUri
)
constructor
(
serverUri
:
URI
?,
protocolDraft
:
Draft
?)
:
super
(
serverUri
,
protocolDraft
)
constructor
(
serverUri
:
URI
?,
httpHeaders
:
MutableMap
<
String
,
String
>?)
:
super
(
serverUri
,
httpHeaders
)
override
fun
onOpen
(
handshakedata
:
ServerHandshake
?)
{
// send("Hello, it is me. Mario :)")
System
.
out
.
println
(
TAG
+
" new connection opened"
)
}
override
fun
onMessage
(
message
:
String
?)
{
println
(
TAG
+
" : "
+
message
)
if
(
message
.
isNullOrEmpty
())
return
onDataCb
?.
onMsg
(
message
)
// onSocketCb?.onMessage(message)
}
override
fun
onMessage
(
bytes
:
ByteBuffer
?)
{
// System.out.println(TAG + " received ByteBuffer")
}
override
fun
onClose
(
code
:
Int
,
reason
:
String
?,
remote
:
Boolean
)
{
// System.out.println(TAG + " closed with exit code " + code + " additional info: " + reason);
}
override
fun
onError
(
ex
:
Exception
?)
{
// System.err.println(TAG + "an error occurred:" + ex)
}
var
onDataCb
:
OnDataCb
?
=
null
interface
OnDataCb
{
fun
onMsg
(
str
:
String
)
}
}
\ No newline at end of file
app/src/main/res/layout/activity_main.xml
View file @
dcb7c2a6
...
@@ -29,7 +29,12 @@
...
@@ -29,7 +29,12 @@
android:layout_marginLeft=
"@dimen/dp_10"
android:layout_marginLeft=
"@dimen/dp_10"
android:layout_marginTop=
"@dimen/dp_10"
/>
android:layout_marginTop=
"@dimen/dp_10"
/>
<!-- 高精地图放这里-->
<!-- 高精地图放这里-->
<fragment
android:id=
"@+id/map_main"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
class=
"com.sd.cavphmi.ui.fragment.MapMainFragment"
/>
<LinearLayout
<LinearLayout
...
@@ -50,8 +55,7 @@
...
@@ -50,8 +55,7 @@
android:id=
"@+id/bt_status"
android:id=
"@+id/bt_status"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"联网车辆状态"
android:text=
"联网车辆状态"
/>
android:visibility=
"gone"
/>
<Button
<Button
android:id=
"@+id/bt_target"
android:id=
"@+id/bt_target"
...
@@ -66,34 +70,39 @@
...
@@ -66,34 +70,39 @@
android:text=
"V2X预警开始"
/>
android:text=
"V2X预警开始"
/>
<Button
<Button
android:id=
"@+id/bt_
v2xend
"
android:id=
"@+id/bt_
predelay
"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"
V2X预警结束
"
/>
android:text=
"
感知延时
"
/>
<Button
<Button
android:id=
"@+id/bt_
chewei
"
android:id=
"@+id/bt_
tarpre
"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"
停车位变更
"
/>
android:text=
"
交通(感知)事件
"
/>
<Button
<Button
android:id=
"@+id/bt_
allline
"
android:id=
"@+id/bt_
tarlight
"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"全局路径发生切换"
/>
android:text=
"交通信号灯"
/>
<Button
<Button
android:id=
"@+id/bt_
jubu
line"
android:id=
"@+id/bt_
all
line"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"局部路径"
/>
android:text=
"全局路径发生切换"
android:visibility=
"gone"
/>
<Button
<Button
android:id=
"@+id/bt_
rsi
"
android:id=
"@+id/bt_
jubuline
"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"rsi事件"
/>
android:visibility=
"gone"
android:text=
"局部路径"
/>
</LinearLayout>
</LinearLayout>
...
...
app/src/main/res/layout/fragment_map_main.xml
0 → 100644
View file @
dcb7c2a6
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
>
<FrameLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
tools:context=
".ui.fragment.MapMainFragment"
>
<TextView
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:gravity=
"center"
android:text=
"@string/hello_blank_fragment"
/>
</FrameLayout>
</layout>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
dcb7c2a6
<resources>
<resources>
<string
name=
"app_name"
>
C-adas AVP
</string>
<string
name=
"app_name"
>
C-adas AVP
</string>
<!-- TODO: Remove or change this placeholder text -->
<string
name=
"hello_blank_fragment"
>
Hello blank fragment
</string>
</resources>
</resources>
\ No newline at end of file
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