Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mirrorSimulator
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
李远洪
mirrorSimulator
Commits
c3cb585c
Commit
c3cb585c
authored
Jan 15, 2021
by
liyuanhong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完成云镜模拟器告警功能开发
parent
87d867d9
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
270 additions
and
13 deletions
+270
-13
lib/socket/ClientWebSocket.py
lib/socket/ClientWebSocket.py
+1
-1
ui/EventAndOtherArea.py
ui/EventAndOtherArea.py
+264
-12
ui/HomeArea.py
ui/HomeArea.py
+3
-0
ui/MainWindow.py
ui/MainWindow.py
+1
-0
ui/globalParams.py
ui/globalParams.py
+1
-0
No files found.
lib/socket/ClientWebSocket.py
View file @
c3cb585c
...
@@ -11,7 +11,7 @@ class ClientWebSocket():
...
@@ -11,7 +11,7 @@ class ClientWebSocket():
def
__init__
(
self
):
def
__init__
(
self
):
self
.
ws
=
None
# websocket 对象
self
.
ws
=
None
# websocket 对象
self
.
wsUrl
=
"ws://api-test.vandyo.com/mirror/websocket/"
# webosocket 连接地址
self
.
wsUrl
=
"ws://api-test.vandyo.com/mirror/websocket/"
# webosocket 连接地址
self
.
wsCode
=
"868142043390091"
# 连接编号
self
.
wsCode
=
"868142043390091"
# 连接编号
self
.
isEnableTrace
=
0
# 是否显示websocket连接信息 0:否 1:是
self
.
isEnableTrace
=
0
# 是否显示websocket连接信息 0:否 1:是
def
setWsUrl
(
self
,
data
):
def
setWsUrl
(
self
,
data
):
...
...
ui/EventAndOtherArea.py
View file @
c3cb585c
#coding: utf-8
#coding: utf-8
import
json
import
sys
import
time
import
requests
import
wx
import
wx
from
ui
import
globalParams
class
EventAndOtherArea
():
class
EventAndOtherArea
():
def
__init__
(
self
,
frame
):
def
__init__
(
self
,
frame
):
self
.
frame
=
frame
self
.
frame
=
frame
self
.
mainPanel
=
None
self
.
mainPanel
=
None
self
.
sendEvtUrl
=
"http://api-test.vandyo.com/mirror/event"
# 事件发送地址
self
.
sendEvtUrlTextCtr
=
None
# 发送事件消息地址框
self
.
accStatusCombox
=
None
# 点火状态设置框
self
.
acrTextCtr
=
None
# 定位精度设置框
self
.
altTextCtr
=
None
# 海拔设置框
self
.
ctpTextCtr
=
None
# 坐标系类型设置框
self
.
drtTextCtr
=
None
# 方向角设置框
self
.
gacrComboBox
=
None
# 卫星信号强度设置框
self
.
gtmTextCtr
=
None
# 时间设置框
self
.
latTextCtr
=
None
# 维度设置框
self
.
lngTextCtr
=
None
# 经度设置框
self
.
ltpTextCtr
=
None
# 定位结果来源设置框
self
.
satlTextCtr
=
None
# 定位星数设置框
self
.
scnlTextCtr
=
None
# 室内外置信度设置框
self
.
spdlTextCtr
=
None
# 速度设置框
self
.
trsComboBox
=
None
# 定位可信度设置框
self
.
logTextCtr
=
None
# 日志输出框
#################################################
#################################################
# 创建一个顶级pannel
# 创建一个顶级pannel
...
@@ -13,19 +38,246 @@ class EventAndOtherArea():
...
@@ -13,19 +38,246 @@ class EventAndOtherArea():
def
create
(
self
):
def
create
(
self
):
self
.
mainPanel
=
wx
.
Panel
(
self
.
frame
)
self
.
mainPanel
=
wx
.
Panel
(
self
.
frame
)
boxSizer
=
wx
.
BoxSizer
(
wx
.
VERTICAL
)
boxSizer
=
wx
.
BoxSizer
(
wx
.
VERTICAL
)
gpsPannel
=
wx
.
Panel
(
self
.
mainPanel
)
topPanel
=
self
.
getTopPanel
()
gpsPannelSizer
=
wx
.
BoxSizer
(
wx
.
VERTICAL
)
bottomPanel
=
self
.
getBottomPanel
()
gpsPannel
.
SetBackgroundColour
(
"RED"
)
boxSizer
.
Add
(
topPanel
,
5
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
aaa
=
wx
.
StaticBox
(
gpsPannel
,
-
1
,
"gps数据"
)
boxSizer
.
Add
(
bottomPanel
,
1
,
flag
=
wx
.
EXPAND
|
wx
.
TOP
,
border
=
5
)
gpsPannelSizer
.
Add
(
aaa
,
1
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
self
.
mainPanel
.
SetSizer
(
boxSizer
)
wx
.
Button
(
aaa
,
label
=
"设置设备号"
,
pos
=
(
610
,
5
))
return
self
.
mainPanel
#################################################
# 获取顶部pannel的内容
#################################################
def
getTopPanel
(
self
):
topPanel
=
wx
.
Panel
(
self
.
mainPanel
)
topPanel
=
wx
.
Panel
(
self
.
mainPanel
)
topPanel
.
SetBackgroundColour
(
"GREEN"
)
topPanelSizer
=
wx
.
BoxSizer
(
wx
.
VERTICAL
)
basicInfoPanel
=
wx
.
Panel
(
topPanel
,
-
1
,
size
=
(
wx
.
EXPAND
,
40
),
style
=
wx
.
BORDER_SIMPLE
)
wx
.
StaticText
(
basicInfoPanel
,
label
=
'发送地址:'
,
pos
=
(
10
,
10
))
self
.
sendEvtUrlTextCtr
=
wx
.
TextCtrl
(
basicInfoPanel
,
pos
=
(
80
,
5
),
size
=
wx
.
Size
(
350
,
-
1
),
value
=
self
.
sendEvtUrl
)
gpsPannel
=
wx
.
StaticBox
(
topPanel
,
-
1
,
"gps数据:"
,
size
=
(
wx
.
EXPAND
,
120
))
wx
.
StaticText
(
gpsPannel
,
label
=
'点熄火状态:'
,
pos
=
(
10
,
20
))
self
.
accStatusCombox
=
wx
.
ComboBox
(
gpsPannel
,
pos
=
(
90
,
15
),
choices
=
[
'点火'
,
'熄火'
],
value
=
"点火"
,
size
=
wx
.
Size
(
60
,
-
1
))
wx
.
StaticText
(
gpsPannel
,
label
=
'定位精度:'
,
pos
=
(
160
,
20
))
self
.
acrTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
230
,
15
),
size
=
wx
.
Size
(
70
,
-
1
),
value
=
"98.88"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'海拔(米):'
,
pos
=
(
310
,
20
))
self
.
altTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
390
,
15
),
size
=
wx
.
Size
(
70
,
-
1
),
value
=
"100.0"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'坐标系类型:'
,
pos
=
(
470
,
20
))
self
.
ctpTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
550
,
15
),
size
=
wx
.
Size
(
70
,
-
1
),
value
=
"1"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'方向角:'
,
pos
=
(
630
,
20
))
self
.
drtTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
690
,
15
),
size
=
wx
.
Size
(
70
,
-
1
),
value
=
"48.5"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'卫星信号强度:'
,
pos
=
(
770
,
20
))
self
.
gacrComboBox
=
wx
.
ComboBox
(
gpsPannel
,
pos
=
(
860
,
15
),
choices
=
[
'好'
,
'差'
],
value
=
"好"
,
size
=
wx
.
Size
(
60
,
-
1
))
wx
.
StaticText
(
gpsPannel
,
label
=
'时间:'
,
pos
=
(
10
,
55
))
times
=
self
.
getCurTime
()
self
.
gtmTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
60
,
50
),
size
=
wx
.
Size
(
130
,
-
1
),
value
=
times
)
wx
.
StaticText
(
gpsPannel
,
label
=
'纬度:'
,
pos
=
(
200
,
55
))
self
.
latTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
240
,
50
),
size
=
wx
.
Size
(
100
,
-
1
),
value
=
"29.569187"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'经度:'
,
pos
=
(
350
,
55
))
self
.
lngTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
390
,
50
),
size
=
wx
.
Size
(
100
,
-
1
),
value
=
"106.592613"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'定位结果来源:'
,
pos
=
(
500
,
55
))
self
.
ltpTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
590
,
50
),
size
=
wx
.
Size
(
80
,
-
1
),
value
=
"1"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'定位星数:'
,
pos
=
(
680
,
55
))
self
.
satlTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
760
,
50
),
size
=
wx
.
Size
(
80
,
-
1
),
value
=
"2"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'室内外置信度:'
,
pos
=
(
10
,
90
))
self
.
scnlTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
100
,
85
),
size
=
wx
.
Size
(
80
,
-
1
),
value
=
"89"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'速度:'
,
pos
=
(
190
,
90
))
self
.
spdlTextCtr
=
wx
.
TextCtrl
(
gpsPannel
,
pos
=
(
230
,
85
),
size
=
wx
.
Size
(
80
,
-
1
),
value
=
"60.8"
)
wx
.
StaticText
(
gpsPannel
,
label
=
'定位可信度:'
,
pos
=
(
320
,
90
))
self
.
trsComboBox
=
wx
.
ComboBox
(
gpsPannel
,
pos
=
(
400
,
85
),
choices
=
[
'非常可信'
,
'可信度一般'
,
'可信度较低'
,
'非常不可信'
],
value
=
"可信度一般"
,
size
=
wx
.
Size
(
100
,
-
1
))
ctrlPannel
=
wx
.
StaticBox
(
topPanel
,
-
1
,
"控制:"
,
size
=
(
wx
.
EXPAND
,
50
))
disDrivingCrashButton
=
wx
.
Button
(
ctrlPannel
,
label
=
"停车碰撞"
,
pos
=
(
10
,
20
))
self
.
frame
.
Bind
(
wx
.
EVT_BUTTON
,
lambda
evt
:
self
.
sendDisDrivingCrashEvt
(
evt
),
disDrivingCrashButton
)
drivingCrashButton
=
wx
.
Button
(
ctrlPannel
,
label
=
"行车碰撞"
,
pos
=
(
90
,
20
))
self
.
frame
.
Bind
(
wx
.
EVT_BUTTON
,
lambda
evt
:
self
.
sendDrivingCrashEvt
(
evt
),
drivingCrashButton
)
helpButton
=
wx
.
Button
(
ctrlPannel
,
label
=
"一键救援"
,
pos
=
(
170
,
20
))
self
.
frame
.
Bind
(
wx
.
EVT_BUTTON
,
lambda
evt
:
self
.
sendHelpEvt
(
evt
),
helpButton
)
topPanelSizer
.
Add
(
basicInfoPanel
,
0.7
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
topPanelSizer
.
Add
(
gpsPannel
,
2
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
topPanelSizer
.
Add
(
ctrlPannel
,
1
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
otherPannel
=
wx
.
Panel
(
topPanel
,
-
1
,
size
=
(
wx
.
EXPAND
,
50
))
topPanelSizer
.
Add
(
otherPannel
,
4
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
topPanel
.
SetSizer
(
topPanelSizer
)
return
topPanel
#################################################
# 获取底部pannel的内容
#################################################
def
getBottomPanel
(
self
):
bottomPanel
=
wx
.
Panel
(
self
.
mainPanel
)
bottomPanel
=
wx
.
Panel
(
self
.
mainPanel
)
boxSizer
.
Add
(
gpsPannel
,
1
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
boxSizer_bottom
=
wx
.
BoxSizer
(
wx
.
HORIZONTAL
)
boxSizer
.
Add
(
topPanel
,
1
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
logArea
=
wx
.
Panel
(
bottomPanel
)
boxSizer
.
Add
(
bottomPanel
,
2
,
flag
=
wx
.
EXPAND
|
wx
.
TOP
,
border
=
5
)
logStaticText
=
wx
.
StaticText
(
logArea
,
label
=
'日志:'
)
self
.
mainPanel
.
SetSizer
(
boxSizer
)
self
.
logTextCtr
=
wx
.
TextCtrl
(
logArea
,
style
=
wx
.
TE_MULTILINE
)
boxSizer_logArea
=
wx
.
BoxSizer
(
wx
.
VERTICAL
)
boxSizer_logArea
.
Add
(
logStaticText
,
2
,
flag
=
wx
.
EXPAND
|
wx
.
TOP
,
border
=
10
)
boxSizer_logArea
.
Add
(
self
.
logTextCtr
,
100
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
logArea
.
SetSizer
(
boxSizer_logArea
)
ctrArea
=
wx
.
Panel
(
bottomPanel
)
ctrText
=
wx
.
StaticText
(
ctrArea
,
label
=
'控制:'
)
ctrPanel
=
wx
.
Panel
(
ctrArea
,
style
=
wx
.
BORDER_SIMPLE
)
clearLogButton
=
wx
.
Button
(
ctrPanel
,
label
=
"清空日志"
,
pos
=
(
5
,
5
))
self
.
frame
.
Bind
(
wx
.
EVT_BUTTON
,
lambda
evt
:
self
.
clearLog
(
evt
),
clearLogButton
)
boxSizer_ctrArea
=
wx
.
BoxSizer
(
wx
.
VERTICAL
)
boxSizer_ctrArea
.
Add
(
ctrText
,
2
,
flag
=
wx
.
EXPAND
|
wx
.
TOP
,
border
=
10
)
boxSizer_ctrArea
.
Add
(
ctrPanel
,
100
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
ctrArea
.
SetSizer
(
boxSizer_ctrArea
)
boxSizer_bottom
.
Add
(
logArea
,
70
,
flag
=
wx
.
EXPAND
|
wx
.
ALL
)
boxSizer_bottom
.
Add
(
ctrArea
,
30
,
flag
=
wx
.
EXPAND
|
wx
.
LEFT
,
border
=
10
)
bottomPanel
.
SetSizer
(
boxSizer_bottom
)
return
bottomPanel
####################################################
# 发送停车告警碰撞事件
####################################################
def
sendDisDrivingCrashEvt
(
self
,
evt
):
data
=
{}
eventTime
=
int
(
time
.
time
())
eventType
=
1
imei
=
globalParams
.
homeArea
.
getDevCodeText
()
.
GetValue
()
data
[
"eventTime"
]
=
eventTime
data
[
"eventType"
]
=
eventType
data
[
"gpsData"
]
=
self
.
getGpsData
()
data
[
"imei"
]
=
imei
url
=
self
.
sendEvtUrlTextCtr
.
GetValue
()
headers
=
{
'Content-Type'
:
'application/json'
}
res
=
requests
.
post
(
url
,
headers
=
headers
,
data
=
json
.
dumps
(
data
))
curTime
=
self
.
getCurTimeTxt
()
self
.
logTextCtr
.
WriteText
(
curTime
+
res
.
text
+
"
\n
"
)
####################################################
# 发送行车告警碰撞事件
####################################################
def
sendDrivingCrashEvt
(
self
,
evt
):
data
=
{}
eventTime
=
int
(
time
.
time
())
eventType
=
2
imei
=
globalParams
.
homeArea
.
getDevCodeText
()
.
GetValue
()
data
[
"eventTime"
]
=
eventTime
data
[
"eventType"
]
=
eventType
data
[
"gpsData"
]
=
self
.
getGpsData
()
data
[
"imei"
]
=
imei
url
=
self
.
sendEvtUrlTextCtr
.
GetValue
()
headers
=
{
'Content-Type'
:
'application/json'
}
res
=
requests
.
post
(
url
,
headers
=
headers
,
data
=
json
.
dumps
(
data
))
curTime
=
self
.
getCurTimeTxt
()
self
.
logTextCtr
.
WriteText
(
curTime
+
res
.
text
+
"
\n
"
)
####################################################
# 发送一键救援事件事件
####################################################
def
sendHelpEvt
(
self
,
evt
):
data
=
{}
eventTime
=
int
(
time
.
time
())
eventType
=
3
imei
=
globalParams
.
homeArea
.
getDevCodeText
()
.
GetValue
()
data
[
"eventTime"
]
=
eventTime
data
[
"eventType"
]
=
eventType
data
[
"gpsData"
]
=
self
.
getGpsData
()
data
[
"imei"
]
=
imei
url
=
self
.
sendEvtUrlTextCtr
.
GetValue
()
headers
=
{
'Content-Type'
:
'application/json'
}
res
=
requests
.
post
(
url
,
headers
=
headers
,
data
=
json
.
dumps
(
data
))
curTime
=
self
.
getCurTimeTxt
()
self
.
logTextCtr
.
WriteText
(
curTime
+
res
.
text
+
"
\n
"
)
####################################################
# 获取当前时间
####################################################
def
getCurTime
(
self
):
timeCur
=
int
(
time
.
time
()
*
1000
)
timeArray
=
time
.
localtime
(
timeCur
/
1000
)
timeCur
=
time
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
,
timeArray
)
# timeCur = "[" + timeCur + "] "
return
timeCur
def
getCurTimeTxt
(
self
):
timeCur
=
int
(
time
.
time
()
*
1000
)
timeArray
=
time
.
localtime
(
timeCur
/
1000
)
timeCur
=
time
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
,
timeArray
)
timeCur
=
"["
+
timeCur
+
"] "
return
timeCur
#################################################
# 清空日志
#################################################
def
clearLog
(
self
,
evt
):
self
.
setLogRedirect
()
self
.
logTextCtr
.
SetValue
(
""
)
####################################################
# 日志重定向到日志框
####################################################
def
setLogRedirect
(
self
):
if
globalParams
.
isLogRedirect
==
1
:
sys
.
stdout
=
self
.
logTextCtr
sys
.
stderr
=
self
.
logTextCtr
####################################################
# 获取gps数据
####################################################
def
getGpsData
(
self
):
data
=
{}
acc
=
self
.
accStatusCombox
.
GetValue
()
accVal
=
0
if
acc
==
"点火"
:
accVal
=
1
acrVal
=
float
(
self
.
acrTextCtr
.
GetValue
())
altVal
=
float
(
self
.
altTextCtr
.
GetValue
())
ctpVal
=
int
(
self
.
ctpTextCtr
.
GetValue
())
drtVal
=
float
(
self
.
drtTextCtr
.
GetValue
())
gacr
=
self
.
gacrComboBox
.
GetValue
()
gacrVal
=
0
if
gacr
==
"好"
:
gacrVal
=
1
gtm
=
self
.
gtmTextCtr
.
GetValue
()
gtmVal
=
int
(
time
.
mktime
(
time
.
strptime
(
gtm
,
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)))
latVal
=
float
(
self
.
latTextCtr
.
GetValue
())
lngVal
=
float
(
self
.
lngTextCtr
.
GetValue
())
ltpVal
=
int
(
self
.
ltpTextCtr
.
GetValue
())
saltVal
=
int
(
self
.
satlTextCtr
.
GetValue
())
scnVal
=
int
(
self
.
scnlTextCtr
.
GetValue
())
spdVal
=
float
(
self
.
spdlTextCtr
.
GetValue
())
trs
=
self
.
trsComboBox
.
GetValue
()
trsVal
=
0
if
trs
==
"非常可信"
:
trsVal
=
3
elif
trs
==
"可信度一般"
:
trsVal
=
2
elif
trs
==
"可信度较低"
:
trsVal
=
1
data
[
"acc"
]
=
accVal
data
[
"acr"
]
=
acrVal
data
[
"alt"
]
=
altVal
data
[
"ctp"
]
=
ctpVal
data
[
"drt"
]
=
drtVal
data
[
"gacr"
]
=
gacrVal
data
[
"gtm"
]
=
gtmVal
data
[
"lat"
]
=
latVal
data
[
"lng"
]
=
lngVal
data
[
"ltp"
]
=
ltpVal
data
[
"salt"
]
=
saltVal
data
[
"scn"
]
=
scnVal
data
[
"spd"
]
=
spdVal
data
[
"trs"
]
=
trsVal
return
data
return
self
.
mainPanel
\ No newline at end of file
ui/HomeArea.py
View file @
c3cb585c
...
@@ -43,6 +43,9 @@ class HomeArea():
...
@@ -43,6 +43,9 @@ class HomeArea():
def
setDevCode
(
self
,
data
):
def
setDevCode
(
self
,
data
):
self
.
devCode
=
data
self
.
devCode
=
data
def
getDevCodeText
(
self
):
return
self
.
devCodeText
#################################################
#################################################
# 创建一个顶级pannel
# 创建一个顶级pannel
#################################################
#################################################
...
...
ui/MainWindow.py
View file @
c3cb585c
...
@@ -42,6 +42,7 @@ class MainWindow():
...
@@ -42,6 +42,7 @@ class MainWindow():
nodeBook
=
wx
.
Notebook
(
mainPanel
)
nodeBook
=
wx
.
Notebook
(
mainPanel
)
homeArea
=
HomeArea
(
nodeBook
)
homeArea
=
HomeArea
(
nodeBook
)
globalParams
.
homeArea
=
homeArea
page0
=
homeArea
.
create
()
page0
=
homeArea
.
create
()
nodeBook
.
AddPage
(
page0
,
"云镜首页"
)
nodeBook
.
AddPage
(
page0
,
"云镜首页"
)
...
...
ui/globalParams.py
View file @
c3cb585c
# coding:utf-8
# coding:utf-8
homeArea
=
None
# 首页对象
camera_1
=
None
# 相机1
camera_1
=
None
# 相机1
camera_2
=
None
# 相机2
camera_2
=
None
# 相机2
camera_3
=
None
# 相机3
camera_3
=
None
# 相机3
...
...
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