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
earlywarning
Commits
4e2d0641
Commit
4e2d0641
authored
Jun 26, 2025
by
黄谋临
Browse files
添加DTO对象
parent
a4a03037
Changes
26
Hide whitespace changes
Inline
Side-by-side
src/main/java/com/cusc/adas/v2x/assist/vo/AssistMessageBody.java
View file @
4e2d0641
...
...
@@ -2,6 +2,8 @@ package com.cusc.adas.v2x.assist.vo;
import
java.util.List
;
import
com.cusc.adas.v2x.utils.DependencyDef
;
import
com.cusc.adas.v2x.utils.DynamicsClassDef
;
import
com.cusc.adas.v2x.utils.FieldDef
;
import
com.cusc.adas.v2x.utils.Order
;
...
...
@@ -26,6 +28,8 @@ public class AssistMessageBody<T> {
//命令数据
@Order
(
5
)
private
List
<
T
>
infoData
;
@DynamicsClassDef
(
classtype
=
"assist"
)
@DependencyDef
(
value
=
"astFuncType"
)
private
T
infoData
;
}
src/main/java/com/cusc/adas/v2x/assist/vo/TrafficLight.java
View file @
4e2d0641
...
...
@@ -24,7 +24,7 @@ public class TrafficLight {
//车辆所在车道 对应信号灯相 位数量
@Order
(
4
)
private
in
t
numOfLanePhase
;
private
shor
t
numOfLanePhase
;
//车辆所在车道 对应信号灯相 位 ID 列表
@Order
(
5
)
@RefNumFlag
(
value
=
"numOfLanePhase"
)
...
...
src/main/java/com/cusc/adas/v2x/clouddecision/vo/AutoSpeedLimit.java
View file @
4e2d0641
...
...
@@ -14,6 +14,7 @@ import com.cusc.adas.v2x.utils.RefNumFlag;
import
com.cusc.adas.v2x.vo.Position
;
import
com.cusc.adas.v2x.vo.SpeedLimit
;
public
class
AutoSpeedLimit
{
//事件唯一标识
@Order
(
1
)
...
...
@@ -41,7 +42,7 @@ public class AutoSpeedLimit {
@Order
(
7
)
private
short
laneNum
;
//限速数据
@Order
(
1
)
@Order
(
8
)
@RefNumFlag
(
value
=
"laneNum"
)
private
List
<
SpeedLimit
>
speedLmt
;
...
...
src/main/java/com/cusc/adas/v2x/clouddecision/vo/CloudDecisionMessageBody.java
View file @
4e2d0641
...
...
@@ -2,9 +2,12 @@ package com.cusc.adas.v2x.clouddecision.vo;
import
java.util.List
;
import
com.cusc.adas.v2x.utils.DependencyDef
;
import
com.cusc.adas.v2x.utils.DynamicsClassDef
;
import
com.cusc.adas.v2x.utils.FieldDef
;
import
com.cusc.adas.v2x.utils.OffsetDef
;
import
com.cusc.adas.v2x.utils.Order
;
import
com.cusc.adas.v2x.utils.RefNumFlag
;
/**
* 云端决策建议信息报文体
...
...
@@ -32,12 +35,12 @@ public class CloudDecisionMessageBody<T> {
//车速建议 单位:0.01m/s
@Order
(
5
)
@OffsetDef
(
value
=
36
,
type
=
2
)
@OffsetDef
(
value
=
0.0
36
,
type
=
2
)
private
int
spdExp
;
//加速度建议 单位:0.01 m/s2,数据偏移量 100,表示-100.00m/s2~100.00m/s2
@Order
(
6
)
@OffsetDef
(
value
=
36
,
type
=
2
)
@OffsetDef
(
value
=
0.0
36
,
type
=
2
)
private
int
accExp
;
//控车变道建 议转向状态 0:沿车道行驶;1:第一出口;2:第二出口;
...
...
@@ -50,5 +53,8 @@ public class CloudDecisionMessageBody<T> {
private
int
dataLen
;
//命令数据 长度为 N 个字节,其中 N 为命令长度
@Order
(
9
)
private
List
<
T
>
adviceData
;
@DynamicsClassDef
(
classtype
=
"CloudDecision"
)
@DependencyDef
(
value
=
"adviceType"
)
private
T
adviceData
;
}
src/main/java/com/cusc/adas/v2x/clouddecision/vo/CloundDecisionEnum.java
0 → 100644
View file @
4e2d0641
package
com.cusc.adas.v2x.clouddecision.vo
;
public
enum
CloundDecisionEnum
{
}
src/main/java/com/cusc/adas/v2x/clouddecision/vo/FawWarnning.java
View file @
4e2d0641
...
...
@@ -25,7 +25,7 @@ public class FawWarnning {
//告警类型 固定值为 6518
@Order
(
3
)
private
int
alertType
;
private
int
alertType
=
6518
;
//告警半径 单位:dm
@Order
(
4
)
@OffsetDef
(
value
=
10
)
...
...
src/main/java/com/cusc/adas/v2x/clouddecision/vo/LaneAdviceSpeed.java
View file @
4e2d0641
...
...
@@ -12,19 +12,19 @@ public class LaneAdviceSpeed {
//车速上限 单位:0.01 m/s
@Order
(
1
)
@OffsetDef
(
value
=
36
,
type
=
2
)
@OffsetDef
(
value
=
0.0
36
,
type
=
2
)
private
int
spdMax
;
//车速下限 单位:0.01 m/s
@Order
(
2
)
@OffsetDef
(
value
=
36
,
type
=
2
)
@OffsetDef
(
value
=
0.0
36
,
type
=
2
)
private
int
spdMin
;
//建议车速 单位:0.01 m/s
@Order
(
3
)
@OffsetDef
(
value
=
36
,
type
=
2
)
@OffsetDef
(
value
=
0.0
36
,
type
=
2
)
private
int
spdExp
;
//通行行为 单位:0.01 m/s
@Order
(
4
)
@OffsetDef
(
value
=
36
,
type
=
2
)
@OffsetDef
(
value
=
0.0
36
,
type
=
2
)
private
short
maneuver
;
//绿灯通过前方 路口数量 车辆绿灯通过前方路口数量,其中 0 表示无法绿灯通过前 方路口
@Order
(
5
)
...
...
src/main/java/com/cusc/adas/v2x/clouddecision/vo/RelSetp.java
View file @
4e2d0641
package
com.cusc.adas.v2x.clouddecision.vo
;
import
java.util.List
;
import
com.cusc.adas.v2x.utils.Order
;
import
com.cusc.adas.v2x.utils.RefNumFlag
;
/**
* 关联路段
...
...
@@ -23,6 +26,7 @@ public class RelSetp {
//受影响车道
@Order
(
4
)
private
short
referenceLanes
;
@RefNumFlag
(
value
=
"referenceLanesNum"
)
private
List
<
Short
>
referenceLanes
;
}
src/main/java/com/cusc/adas/v2x/clouddecision/vo/TrafficLightInfo.java
0 → 100644
View file @
4e2d0641
package
com.cusc.adas.v2x.clouddecision.vo
;
import
java.util.List
;
import
com.cusc.adas.v2x.utils.FieldDef
;
import
com.cusc.adas.v2x.utils.Order
;
import
com.cusc.adas.v2x.utils.RefNumFlag
;
/**
* 信号灯路口车速引导
* @author huangml
*
*/
public
class
TrafficLightInfo
{
//事件唯一标识
@Order
(
1
)
@FieldDef
(
type
=
"BYTE"
,
isArray
=
true
,
length
=
36
)
private
String
uuid
;
//事件生成时间 戳
@Order
(
2
)
@FieldDef
(
type
=
"TIMESTAMP"
,
isArray
=
false
,
length
=
8
)
private
long
timestamp
;
//告警类型 固定值为 6523
@Order
(
3
)
private
int
alertType
=
6523
;
//有效标识 0:失效;1:有效
@Order
(
4
)
private
short
valid
;
//命令标识 0:失效;1:引导;2:停车指令;3:启动指令
@Order
(
5
)
private
short
type
;
//车辆所在位置 到停止线距离 单位:0.01m
@Order
(
6
)
private
int
d2StopLine
;
//车道方向建议 速度组数 0 表示无效,不发送车道方向建议车速数据
@Order
(
7
)
private
short
spdExpNum
;
//车道方向建议 速度
@Order
(
8
)
@RefNumFlag
(
value
=
"spdExpNum"
)
private
List
<
LaneAdviceSpeed
>
spdExps
;
//车速上限
@Order
(
9
)
private
int
spdMax
;
//车速下限
@Order
(
10
)
private
int
spdMin
;
//建议车速
@Order
(
11
)
private
int
spdExp
;
//通行行为
private
short
maneuver
;
//绿灯通过前方路口数量
private
short
numIntersection
;
}
src/main/java/com/cusc/adas/v2x/dto/AutomaticDriveInfoDto.java
0 → 100644
View file @
4e2d0641
package
com.cusc.adas.v2x.dto
;
import
java.util.List
;
import
com.cusc.adas.v2x.utils.NumFlag
;
import
com.cusc.adas.v2x.utils.Order
;
import
com.cusc.adas.v2x.utils.RefNumFlag
;
/**
* 车辆自动驾驶信息
* @author huangml
*
*/
public
class
AutomaticDriveInfoDto
{
//执行云端控制命令编号
@Order
(
1
)
private
long
cloudMessageId
;
//自动驾驶需求加速度
@Order
(
2
)
private
int
accelCmd
;
//自动驾驶需求扭矩
@Order
(
3
)
private
long
torqueCmd
;
//自动驾驶需求速度
@Order
(
4
)
private
int
velocityCmd
;
//规划-位置点轨 迹数量
@Order
(
5
)
@NumFlag
private
int
planningLocNum
;
//规划-位置点轨 迹列表
@Order
(
6
)
@RefNumFlag
(
value
=
"planningLocNum"
)
private
List
<
TracePointDto
>
planningLocs
;
//决策-换道
@Order
(
7
)
private
short
decisionLaneChange
;
//加减速
@Order
(
8
)
private
short
decisionAccel
;
//决策-转向
@Order
(
9
)
private
short
decisionTurnSignal
;
//决策-车辆状态
@Order
(
10
)
private
short
decisionVehicleStatus
;
//感知目标个数
@Order
(
11
)
@NumFlag
private
short
detectionLen
;
//感知目标数据
@RefNumFlag
(
value
=
"detectionLen"
)
@Order
(
12
)
private
List
<
TrajectoryInfoDto
>
detectionData
;
//自动驾驶系统故障
@Order
(
13
)
private
int
autoDrivingSysFault
;
//电子手刹状态
@Order
(
14
)
private
short
epbFlag
;
//自定义字段长度
@Order
(
15
)
private
short
userdefinedDataLength
;
//自定义字段内容
@Order
(
16
)
private
byte
[]
userdefinedData
;
}
src/main/java/com/cusc/adas/v2x/dto/TrajectoryInfoDto.java
0 → 100644
View file @
4e2d0641
package
com.cusc.adas.v2x.dto
;
import
com.cusc.adas.v2x.utils.Order
;
/**
*
* @author huangml
*
*/
public
class
TrajectoryInfoDto
{
//位置
@Order
(
1
)
private
Position2DDto
position
;
//位置精度等级
@Order
(
2
)
private
short
posConfidence
;
//速度
@Order
(
3
)
private
int
speed
;
//速度精度等级
@Order
(
4
)
private
short
speedConfidence
;
//航向角
@Order
(
5
)
private
long
heading
;
//航向精度等级
@Order
(
6
)
private
short
headConfidence
;
}
src/main/java/com/cusc/adas/v2x/dto/VehicleBodyDto.java
View file @
4e2d0641
package
com.cusc.adas.v2x.dto
;
import
com.cusc.adas.v2x.vo.AutomaticDriveInfo
;
import
com.cusc.adas.v2x.vo.VehicleStatusInfo
;
public
class
VehicleBodyDto
{
private
VehicleInfoDto
vehicleInfo
;
private
VehicleStatusInfo
vehicleStatusInfo
;
private
AutomaticDriveInfo
automaticDriveInfo
;
public
VehicleInfoDto
getVehicleInfo
()
{
return
vehicleInfo
;
}
}
src/main/java/com/cusc/adas/v2x/dto/VehicleStatusInfoDto.java
0 → 100644
View file @
4e2d0641
package
com.cusc.adas.v2x.dto
;
import
java.util.List
;
import
com.cusc.adas.v2x.utils.FieldDef
;
import
com.cusc.adas.v2x.utils.NumFlag
;
import
com.cusc.adas.v2x.utils.OffsetDef
;
import
com.cusc.adas.v2x.utils.Order
;
import
com.cusc.adas.v2x.utils.RefNumFlag
;
/**
* 车辆辅助驾驶信息及状态信息
* @author huangml
*
*/
public
class
VehicleStatusInfoDto
{
@Order
(
1
)
//ABS 状态
private
short
absFlag
;
//TCS 状态
@Order
(
2
)
private
short
tcsFlag
;
//ESP 状态
@Order
(
3
)
private
short
espFlag
;
//LKA 状态
@Order
(
4
)
private
short
lkaFlag
;
//ACC 工作模式
@Order
(
5
)
private
short
accMode
;
//FCW 状态
@Order
(
6
)
private
short
fcwFlag
;
//LDW 状态
@Order
(
7
)
private
short
ldwFlag
;
//AEB 状态
@Order
(
8
)
private
short
aebFlag
;
//LCA 状态
@Order
(
9
)
private
short
lcaFlag
;
//DMS 状态
@Order
(
10
)
private
short
dmsFlag
;
//里程
@Order
(
11
)
private
long
mileage
;
//sweeping状态
@Order
(
12
)
private
short
sweepingFlag
;
//watering状态
@Order
(
13
)
private
short
wateringFlag
;
// 车辆运行状态数据 2-车辆辅助驾驶系统信息及其他状态信息数据结构(续)
//油量 对应车辆油量表读数,单位:0.1 L,
@Order
(
14
)
private
int
fuelGauge
;
//电池剩余电量 0.01%,
@Order
(
15
)
private
int
soc
;
//电池温度 [0..200],单位:摄氏度(℃),
//数据偏移量 100,表示-100℃~100℃ ,0xFF 表示缺省
@Order
(
16
)
private
short
temperature
;
//预计续航里程 单位:千米(km),
@Order
(
17
)
private
long
endurance
;
//车辆故障状态
@Order
(
18
)
private
int
vehFault
;
//电机转速
@Order
(
19
)
private
int
motorspeed
;
//电机转矩
@Order
(
20
)
private
long
motortorque
;
//运行模式 车辆运行模式,1:纯电驱动模式;2:混合驱动 模式;3:行车充电模式;4:能量回收模式;5:停车充电模式;6: 能量混合回充模式;
@Order
(
21
)
private
short
vehMode
;
//充电状态 1:未充电;2:充电准备;3:正在充电;4:充电故障;5:充电结束; 0xFF 表示缺省
@Order
(
22
)
private
short
chargeState
;
//动力电池实时电压
@Order
(
23
)
private
int
battVol
;
//动力电池实时电流
@Order
(
24
)
private
int
battCur
;
//喇叭状态
@Order
(
25
)
private
short
hornState
;
//车轮数
@Order
(
26
)
@NumFlag
private
short
wheelNum
;
//轮速 表示车轮线速度,单位:0.01 m/s,
//数据偏移量 200,表示-200.00 m/s~200.00 m/s,
@Order
(
27
)
private
List
<
Integer
>
wheelVelocity
;
//胎压
@Order
(
28
)
private
List
<
Integer
>
tirePressure
;
//车灯状态 BIT2 = 左转灯 BIT3 = 右转灯
@Order
(
30
)
private
int
lights
;
//车门状态
@Order
(
31
)
private
int
doors
;
//自定义字段长度
@Order
(
32
)
@NumFlag
private
short
userdefinedDataLength
;
//自定义字段内容
@Order
(
33
)
private
String
userdefinedData
;
}
src/main/java/com/cusc/adas/v2x/selfdefine/dto/SelfDefineDetailDto.java
View file @
4e2d0641
package
com.cusc.adas.v2x.selfdefine.dto
;
import
com.cusc.adas.v2x.vo.Position2D
;
import
com.cusc.adas.v2x.dto.PositionDto
;
import
com.cusc.adas.v2x.utils.FieldDef
;
import
com.cusc.adas.v2x.utils.Order
;
import
com.cusc.adas.v2x.vo.Position
;
/**
*
...
...
@@ -8,18 +11,45 @@ import com.cusc.adas.v2x.vo.Position2D;
*
*/
public
class
SelfDefineDetailDto
{
@Order
(
1
)
@FieldDef
(
type
=
"BYTE"
,
isArray
=
true
,
length
=
8
)
private
String
rvVehicleId
;
//预警类型
@Order
(
2
)
private
short
type
;
//RV经纬度
private
Position2D
rvLocation
;
//GNSS时间戳
@Order
(
3
)
@FieldDef
(
type
=
"TIMESTAMP"
,
isArray
=
false
,
length
=
8
)
private
long
timestampGNSS
;
//主车经纬度
@Order
(
4
)
private
PositionDto
location
;
//主车速度
@Order
(
5
)
private
int
speed
;
//主车航向角
@Order
(
6
)
private
int
heading
;
//RV远车经纬度
@Order
(
7
)
private
PositionDto
rvLocation
;
//RV方向
private
long
rvDirection
;
@Order
(
8
)
private
int
rvHeading
;
//预警级别
private
long
level
;
@Order
(
9
)
private
short
level
;
//预警距离
private
long
distance
;
@Order
(
10
)
private
int
distance
;
}
src/main/java/com/cusc/adas/v2x/selfdefine/vo/SelfDefineDetail.java
View file @
4e2d0641
package
com.cusc.adas.v2x.selfdefine.vo
;
import
com.cusc.adas.v2x.utils.FieldDef
;
import
com.cusc.adas.v2x.utils.Order
;
import
com.cusc.adas.v2x.vo.Position
2D
;
import
com.cusc.adas.v2x.vo.Position
;
/**
*
...
...
@@ -9,23 +10,45 @@ import com.cusc.adas.v2x.vo.Position2D;
*
*/
public
class
SelfDefineDetail
{
//预警类型
@Order
(
1
)
private
short
type
;
@FieldDef
(
type
=
"BYTE"
,
isArray
=
true
,
length
=
8
)
private
String
rvVehicleId
;
//
RV经纬度
//
预警类型
@Order
(
2
)
private
Position2D
rvLocation
;
private
short
type
;
//
RV方向
//
GNSS时间戳
@Order
(
3
)
private
long
rvDirection
;
@FieldDef
(
type
=
"TIMESTAMP"
,
isArray
=
false
,
length
=
8
)
private
long
timestampGNSS
;
//
预警级别
//
主车经纬度
@Order
(
4
)
private
l
on
g
l
evel
;
private
Positi
on
l
ocation
;
//
预警距离
//
主车速度
@Order
(
5
)
private
long
distance
;
private
int
speed
;
//主车航向角
@Order
(
6
)
private
long
heading
;
//RV远车经纬度
@Order
(
7
)
private
Position
rvLocation
;
//RV方向
@Order
(
8
)
private
long
rvHeading
;
//预警级别
@Order
(
9
)
private
short
level
;
//预警距离
@Order
(
10
)
private
int
distance
;
}
src/main/java/com/cusc/adas/v2x/selfdefine/vo/SelfDefineMessageBody.java
View file @
4e2d0641
...
...
@@ -22,7 +22,7 @@ public class SelfDefineMessageBody<T> {
//数据内容
@Order
(
4
)
private
List
<
T
>
data
;
private
SelfDefineDetail
data
;
}
src/main/java/com/cusc/adas/v2x/server/UdpServerHandler.java
View file @
4e2d0641
...
...
@@ -4,9 +4,12 @@ package com.cusc.adas.v2x.server;
import
com.cusc.adas.v2x.assist.vo.AssistMessage
;
import
com.cusc.adas.v2x.clouddecision.vo.CloudDecisionMessage
;
import
com.cusc.adas.v2x.dto.VehicleBodyDto
;
import
com.cusc.adas.v2x.selfdefine.vo.SelfDefineMessage
;
import
com.cusc.adas.v2x.utils.Parse
;
import
com.cusc.adas.v2x.vehiclesubscribe.vo.VehicleSubscribeMessage
;
import
com.cusc.adas.v2x.vo.VehicleMessage
;
import
io.netty.buffer.ByteBuf
;
...
...
@@ -50,15 +53,27 @@ public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket
System
.
out
.
println
(
"Received message: "
+
vehicleBodyDto
);
}
else
if
(
hexString
.
substring
(
10
,
12
).
equals
(
"15"
))
{
}
else
if
(
hexString
.
substring
(
10
,
12
).
equals
(
"36"
))
{
ByteBuf
byteBuf
=
Unpooled
.
wrappedBuffer
(
req
);
VehicleSubscribeMessage
vehicleSubscribeMessage
=
Parse
.
parse
(
byteBuf
,
new
VehicleSubscribeMessage
());
System
.
out
.
println
(
"Received message: "
+
vehicleSubscribeMessage
);
}
else
if
(
hexString
.
substring
(
10
,
12
).
toUpperCase
().
equals
(
"3C"
))
{
ByteBuf
byteBuf
=
Unpooled
.
wrappedBuffer
(
req
);
CloudDecisionMessage
cloudDecisionMessage
=
Parse
.
parse
(
byteBuf
,
new
CloudDecisionMessage
());
System
.
out
.
println
(
"Received message: "
+
cloudDecisionMessage
);
// VehicleBodyDto vehicleBodyDto = new VehicleBodyDto();
// Parse.convoterBean(vehicleMessage.getVehicleMessageBody(), vehicleBodyDto);
// Parse.convoterBean(vehicleMessage.getVehicleMessageBody(), vehicleBodyDto);
// System.out.println("Received message: " + vehicleBodyDto);
}
}
else
if
(
hexString
.
substring
(
10
,
12
).
toUpperCase
().
equals
(
"3E"
))
{
ByteBuf
byteBuf
=
Unpooled
.
wrappedBuffer
(
req
);
AssistMessage
assistMessage
=
Parse
.
parse
(
byteBuf
,
new
AssistMessage
());
System
.
out
.
println
(
"Received message: "
+
assistMessage
);
}
else
if
(
hexString
.
substring
(
10
,
12
).
toUpperCase
().
equals
(
"5E"
))
{
ByteBuf
byteBuf
=
Unpooled
.
wrappedBuffer
(
req
);
SelfDefineMessage
selfDefineMessage
=
Parse
.
parse
(
byteBuf
,
new
SelfDefineMessage
());
System
.
out
.
println
(
"Received message: "
+
selfDefineMessage
);
}
...
...
src/main/java/com/cusc/adas/v2x/utils/DependencyDef.java
0 → 100644
View file @
4e2d0641
package
com.cusc.adas.v2x.utils
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
@Retention
(
RetentionPolicy
.
RUNTIME
)
// 注解在运行时可用
@Target
(
ElementType
.
FIELD
)
// 注解只能用于字段(属性)
public
@interface
DependencyDef
{
String
value
()
;
}
src/main/java/com/cusc/adas/v2x/utils/DynamicsClassDef.java
0 → 100644
View file @
4e2d0641
package
com.cusc.adas.v2x.utils
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
@Retention
(
RetentionPolicy
.
RUNTIME
)
// 注解在运行时可用
@Target
(
ElementType
.
FIELD
)
// 注解只能用于字段(属性)
public
@interface
DynamicsClassDef
{
String
classtype
();
}
src/main/java/com/cusc/adas/v2x/utils/OffsetDef.java
View file @
4e2d0641
...
...
@@ -8,7 +8,7 @@ import java.lang.annotation.Target;
@Retention
(
RetentionPolicy
.
RUNTIME
)
// 注解在运行时可用
@Target
(
ElementType
.
FIELD
)
// 注解只能用于字段(属性)
public
@interface
OffsetDef
{
double
value
()
default
1
;
//偏移量
int
type
()
default
2
;
//1:除法 2:乘法;
int
minValidLength
()
default
0
;
//数据最小位数,不够补0
double
value
()
default
1
;
int
type
()
default
1
;
//1:除法 2:乘法;
int
minValidLength
()
default
0
;
}
Prev
1
2
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