Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jiancetai
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
陈家乐
jiancetai
Commits
aff013f0
Commit
aff013f0
authored
Nov 27, 2024
by
王佳伟
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
✨
feat:291 MOTOR版本
parent
cd38ea54
Changes
6
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
350 additions
and
345 deletions
+350
-345
API_RTC.c
Test_Bench/Api_Sources/API_RTC.c
+1
-1
APP_CAN.c
Test_Bench/Api_Sources/APP_CAN.c
+65
-82
APP_Test.c
Test_Bench/Api_Sources/APP_Test.c
+214
-183
APP_Test.h
Test_Bench/App_Headers/APP_Test.h
+60
-61
Globals_Var.h
Test_Bench/App_Headers/Globals_Var.h
+7
-15
TBDML.ini
Test_Bench/TBDML.ini
+3
-3
No files found.
Test_Bench/Api_Sources/API_RTC.c
View file @
aff013f0
...
...
@@ -371,7 +371,7 @@ INT16U time_3s = 0;
Key
.
PushTime_2
++
;
}
if
(
RT_10ms
>=
10
){
if
(
Key
.
CAN_Step
>
1
1
||
Key
.
CAN_Step
<
1
)
if
(
Key
.
CAN_Step
>
1
2
||
Key
.
CAN_Step
<
1
)
{
Key
.
CAN_Step
=
1
;
}
...
...
Test_Bench/Api_Sources/APP_CAN.c
View file @
aff013f0
...
...
@@ -96,42 +96,28 @@ void Format_CAN_Msg()
{
CanMsg_101
.
ID
=
0x101
;
CanMsg_067
.
ID
=
0x67
;
CanMsg_1023FFA7
.
ID
=
0x1023FFA7
;
CanMsg_1023FFA8
.
ID
=
0x1023FFA8
;
CanMsg_1020FFA7
.
ID
=
0x1020FFA7
;
CanMsg_1020FFA8
.
ID
=
0x1020FFA8
;
CanMsg_1028FFA7
.
ID
=
0x1028FFA7
;
CanMsg_1028FFA8
.
ID
=
0x1028FFA8
;
CanMsg_600
.
ID
=
0x600
;
CanMsg_611
.
ID
=
0x611
;
CanMsg_610
.
ID
=
0x610
;
CanMsg_101
.
Length
=
8
;
CanMsg_067
.
Length
=
8
;
CanMsg_1023FFA7
.
Length
=
8
;
CanMsg_1023FFA8
.
Length
=
8
;
CanMsg_1020FFA7
.
Length
=
8
;
CanMsg_1020FFA8
.
Length
=
8
;
CanMsg_1028FFA7
.
Length
=
8
;
CanMsg_1028FFA8
.
Length
=
8
;
CanMsg_600
.
Length
=
8
;
CanMsg_611
.
Length
=
8
;
CanMsg_610
.
Length
=
8
;
CanMsg_101
.
ID_EN
=
1
;
CanMsg_067
.
ID_EN
=
1
;
CanMsg_1023FFA7
.
ID_EN
=
1
;
CanMsg_1023FFA8
.
ID_EN
=
1
;
CanMsg_1020FFA7
.
ID_EN
=
1
;
CanMsg_1020FFA8
.
ID_EN
=
1
;
CanMsg_1028FFA7
.
ID_EN
=
1
;
CanMsg_1028FFA8
.
ID_EN
=
1
;
CanMsg_600
.
ID_EN
=
1
;
CanMsg_611
.
ID_EN
=
1
;
CanMsg_610
.
ID_EN
=
1
;
}
void
Disable_CAN_Tx
(
void
)
{
CanMsg_101
.
ID_EN
=
0
;
CanMsg_067
.
ID_EN
=
0
;
CanMsg_1023FFA7
.
ID_EN
=
0
;
CanMsg_1023FFA8
.
ID_EN
=
0
;
CanMsg_1020FFA7
.
ID_EN
=
0
;
CanMsg_1020FFA8
.
ID_EN
=
0
;
CanMsg_1028FFA7
.
ID_EN
=
0
;
CanMsg_1028FFA8
.
ID_EN
=
0
;
CanMsg_600
.
ID_EN
=
0
;
CanMsg_611
.
ID_EN
=
0
;
CanMsg_610
.
ID_EN
=
0
;
}
void
Set_Pin
(
INT16U
pin
)
...
...
@@ -169,6 +155,8 @@ void App_Can_Proc(void)
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_101
);
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_067
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_067
);
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_610
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_610
);
}
if
(
GetCtrlTime
(
CANMsgSend_50ms
)
>=
50
){
...
...
@@ -177,10 +165,8 @@ void App_Can_Proc(void)
if
(
GetCtrlTime
(
CANMsgSend_100ms
)
>=
100
){
ClearCtrlTime
(
CANMsgSend_100ms
);
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_1020FFA7
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_1020FFA7
);
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_1020FFA8
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_1020FFA8
);
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_600
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_600
);
}
if
(
GetCtrlTime
(
CANMsgSend_200ms
)
>=
200
){
...
...
@@ -190,15 +176,9 @@ void App_Can_Proc(void)
if
(
GetCtrlTime
(
CANMsgSend_500ms
)
>=
500
){
flash_1Hz_process
();
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_611
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_611
);
ClearCtrlTime
(
CANMsgSend_500ms
);
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_1023FFA7
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_1023FFA7
);
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_1023FFA8
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_1023FFA8
);
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_1028FFA7
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_1028FFA7
);
bReturn
=
Api_CANSendFrame
((
CAN_message
*
)
&
CanMsg_1028FFA8
);
Clear_CAN_Msg
((
CAN_message
*
)
&
CanMsg_1028FFA8
);
}
if
(
GetCtrlTime
(
CANMsgSend_1s
)
>=
1000
){
...
...
@@ -223,37 +203,40 @@ void App_Can_Proc(void)
//CurValueStr[ENUM_VSpeed ].val = 0;
CurValueStr
[
ENUM_VSpeed
].
val
=
0
;
CurValueStr
[
GEAR
].
val
=
0
;
CurValueStr
[
ENUM_EleDial1
].
val
=
0
;
CurValueStr
[
ENUM_EleDial2
].
val
=
0
;
CurValueStr
[
ENUM_Current1
].
val
=
0
;
CurValueStr
[
ENUM_Current2
].
val
=
0
;
CurValueStr
[
Motor_error
].
val
=
0
;
CurValueStr
[
Battery_error
].
val
=
0
;
CurValueStr
[
Charge_status
].
val
=
0
;
CurValueStr
[
Cruise_control
].
val
=
0
;
CurValueStr
[
Ready
].
val
=
0
;
CurValueStr
[
ECM_MotorOverTempFaul
].
val
=
0
;
CurValueStr
[
BMS_ChargeUnderVoltageInd1
].
val
=
0
;
CurValueStr
[
BMS_ChargeUnderVoltageInd2
].
val
=
0
;
CurValueStr
[
BMS_BattryInsulationFault
].
val
=
0
;
CurValueStr
[
ECM_FaultIndicator
].
val
=
0
;
CurValueStr
[
ECM_StautsInvalid
].
val
=
0
;
CurValueStr
[
ECM_MotorOver
].
val
=
0
;
CurValueStr
[
ECM_ReadyIndicator
].
val
=
0
;
CurValueStr
[
ECM_ChargeStatus
].
val
=
0
;
CurValueStr
[
ECM_CruiseStatus
].
val
=
0
;
CurValueStr
[
ECM_GearPositionStatus
].
val
=
0
;
CurValueStr
[
PFC_Relag
].
val
=
0
;
CurValueStr
[
LLC_UnderOutput
].
val
=
0
;
CurValueStr
[
LLC_OverOutput
].
val
=
0
;
CurValueStr
[
LLC_OutPut
].
val
=
0
;
CurValueStr
[
PFC_LLC_Interal_Communication
].
val
=
0
;
CurValueStr
[
LLC_Temp
].
val
=
0
;
CurValueStr
[
Battery_status
].
val
=
0
;
CurValueStr
[
Battery_Current
].
val
=
0
;
CurValueStr
[
Battery_SOC
].
val
=
0
;
CurValueStr
[
ENUM_VSpeed
].
fval
=
Value_Plus
;
CurValueStr
[
GEAR
].
fval
=
Value_Plus
;
CurValueStr
[
ENUM_EleDial1
].
fval
=
Value_Plus
;
CurValueStr
[
ENUM_EleDial2
].
fval
=
Value_Plus
;
CurValueStr
[
ENUM_Current1
].
fval
=
Value_Plus
;
CurValueStr
[
ENUM_Current2
].
fval
=
Value_Plus
;
CurValueStr
[
Motor_error
].
fval
=
Value_Plus
;
CurValueStr
[
Battery_error
].
fval
=
Value_Plus
;
CurValueStr
[
Charge_status
].
fval
=
Value_Plus
;
CurValueStr
[
Cruise_control
].
fval
=
Value_Plus
;
CurValueStr
[
Ready
].
fval
=
Value_Plus
;
CurValueStr
[
ECM_MotorOverTempFaul
].
fval
=
Value_Plus
;
CurValueStr
[
BMS_ChargeUnderVoltageInd1
].
fval
=
Value_Plus
;
CurValueStr
[
BMS_ChargeUnderVoltageInd2
].
fval
=
Value_Plus
;
CurValueStr
[
BMS_BattryInsulationFault
].
fval
=
Value_Plus
;
CurValueStr
[
ECM_FaultIndicator
].
fval
=
Value_Plus
;
CurValueStr
[
ECM_StautsInvalid
].
fval
=
Value_Plus
;
CurValueStr
[
ECM_MotorOver
].
fval
=
Value_Plus
;
CurValueStr
[
ECM_ReadyIndicator
].
fval
=
Value_Plus
;
CurValueStr
[
ECM_ChargeStatus
].
fval
=
Value_Plus
;
CurValueStr
[
ECM_CruiseStatus
].
fval
=
Value_Plus
;
CurValueStr
[
ECM_GearPositionStatus
].
fval
=
Value_Plus
;
CurValueStr
[
PFC_Relag
].
fval
=
Value_Plus
;
CurValueStr
[
LLC_UnderOutput
].
fval
=
Value_Plus
;
CurValueStr
[
LLC_OverOutput
].
fval
=
Value_Plus
;
CurValueStr
[
LLC_OutPut
].
fval
=
Value_Plus
;
CurValueStr
[
PFC_LLC_Interal_Communication
].
fval
=
Value_Plus
;
CurValueStr
[
LLC_Temp
].
fval
=
Value_Plus
;
CurValueStr
[
Battery_status
].
fval
=
Value_Plus
;
CurValueStr
[
Battery_Current
].
fval
=
Value_Plus
;
CurValueStr
[
Battery_SOC
].
fval
=
Value_Plus
;
// CurVehSpeed = 0;
//LDW Open
...
...
Test_Bench/Api_Sources/APP_Test.c
View file @
aff013f0
This diff is collapsed.
Click to expand it.
Test_Bench/App_Headers/APP_Test.h
View file @
aff013f0
#ifdef GLOBALS_APP_TEST
#define
EXTERN_APP_TEST
#define
EXTERN_APP_TEST
#else
#define EXTERN_APP_TEST
extern
#define EXTERN_APP_TEST
extern
#endif
#ifndef APP_TEDT_H_
...
...
@@ -19,41 +19,45 @@
#define Value_Minus 0
#define Value_Plus 1
typedef
struct
{
typedef
struct
{
int
val
;
unsigned
char
fval
;
}
s_CurValue
;
}
s_CurValue
;
typedef
struct
{
typedef
struct
{
CAN_message
*
canMsg
;
unsigned
char
StartByte
;
unsigned
char
StartBit
;
unsigned
char
SignalLen
;
unsigned
int
Offset
;
unsigned
char
fOffset
;
unsigned
int
Factor_1
;
/*Denominator of Resolution*/
/*���ȵķ�ĸ*/
unsigned
int
Factor_2
;
/*Numerator of Resolution*/
/*���ȵķ���*/
unsigned
int
Factor_1
;
/*Denominator of Resolution*/
/*���ȵķ�ĸ*/
unsigned
int
Factor_2
;
/*Numerator of Resolution*/
/*���ȵķ���*/
s_CurValue
*
CurValue
;
unsigned
char
fFormat
;
}
s_CAN_List
;
}
s_CAN_List
;
enum
{
ENUM_VSpeed
=
0
,
//����
GEAR
,
ENUM_EleDial1
,
ENUM_EleDial2
,
ENUM_Current1
,
ENUM_Current2
,
Motor_error
,
Battery_error
,
Charge_status
,
Cruise_control
,
Ready
,
ECM_MotorOverTempFaul
,
//103
BMS_ChargeUnderVoltageInd1
,
//200
BMS_ChargeUnderVoltageInd2
,
//200
BMS_BattryInsulationFault
,
//205
ENUM_VSpeed
=
0
,
// ����
ECM_FaultIndicator
,
ECM_StautsInvalid
,
ECM_MotorOver
,
ECM_ReadyIndicator
,
ECM_ChargeStatus
,
ECM_CruiseStatus
,
ECM_GearPositionStatus
,
PFC_Relag
,
LLC_UnderOutput
,
LLC_OverOutput
,
LLC_OutPut
,
PFC_LLC_Interal_Communication
,
LLC_Temp
,
Battery_status
,
Battery_Current
,
Battery_SOC
,
CAN_List_Num
,
};
...
...
@@ -61,27 +65,24 @@ EXTERN_APP_TEST volatile s_CurValue CurValueStr[CAN_List_Num];
static
const
s_CAN_List
CAN_List
[]
=
{
{
&
CanMsg_101
,
1
,
0
,
16
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ENUM_VSpeed
],
Intel
},
{
&
CanMsg_067
,
5
,
0
,
3
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
GEAR
],
Intel
},
{
&
CanMsg_067
,
1
,
0
,
16
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
Motor_error
],
Intel
},
{
&
CanMsg_067
,
3
,
6
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
Charge_status
],
Intel
},
{
&
CanMsg_067
,
4
,
2
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
Cruise_control
],
Intel
},
{
&
CanMsg_067
,
3
,
4
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
Ready
],
Intel
},
{
&
CanMsg_067
,
3
,
2
,
2
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ECM_MotorOverTempFaul
],
Intel
},
{
&
CanMsg_1023FFA7
,
0
,
0
,
16
,
0
,
Offset_Plus
,
10
,
1
,
&
CurValueStr
[
ENUM_EleDial1
],
Intel
},
{
&
CanMsg_1023FFA8
,
0
,
0
,
16
,
0
,
Offset_Plus
,
10
,
1
,
&
CurValueStr
[
ENUM_EleDial2
],
Intel
},
{
&
CanMsg_1020FFA7
,
2
,
0
,
16
,
500
,
Offset_Minus
,
10
,
1
,
&
CurValueStr
[
ENUM_Current1
],
Intel
},
{
&
CanMsg_1020FFA8
,
2
,
0
,
16
,
500
,
Offset_Minus
,
10
,
1
,
&
CurValueStr
[
ENUM_Current2
],
Intel
},
{
&
CanMsg_1028FFA7
,
0
,
0
,
2
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
Battery_error
],
Intel
},
{
&
CanMsg_1028FFA7
,
3
,
2
,
2
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
BMS_BattryInsulationFault
],
Intel
},
{
&
CanMsg_1028FFA7
,
0
,
6
,
2
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
BMS_ChargeUnderVoltageInd1
],
Intel
},
{
&
CanMsg_1028FFA8
,
0
,
6
,
2
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
BMS_ChargeUnderVoltageInd2
],
Intel
},
{
&
CanMsg_101
,
2
,
0
,
16
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ENUM_VSpeed
],
Motorola
},
{
&
CanMsg_067
,
2
,
0
,
16
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ECM_FaultIndicator
],
Motorola
},
{
&
CanMsg_067
,
3
,
0
,
2
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ECM_StautsInvalid
],
Motorola
},
{
&
CanMsg_067
,
3
,
2
,
2
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ECM_MotorOver
],
Motorola
},
{
&
CanMsg_067
,
3
,
4
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ECM_ReadyIndicator
],
Motorola
},
{
&
CanMsg_067
,
3
,
6
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ECM_ChargeStatus
],
Motorola
},
{
&
CanMsg_067
,
4
,
2
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ECM_CruiseStatus
],
Motorola
},
{
&
CanMsg_067
,
5
,
0
,
3
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
ECM_GearPositionStatus
],
Motorola
},
{
&
CanMsg_600
,
0
,
0
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
PFC_Relag
],
Motorola
},
{
&
CanMsg_600
,
0
,
1
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
LLC_UnderOutput
],
Motorola
},
{
&
CanMsg_600
,
0
,
2
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
LLC_OverOutput
],
Motorola
},
{
&
CanMsg_600
,
0
,
3
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
LLC_OutPut
],
Motorola
},
{
&
CanMsg_600
,
0
,
4
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
PFC_LLC_Interal_Communication
],
Motorola
},
{
&
CanMsg_600
,
0
,
5
,
1
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
LLC_Temp
],
Motorola
},
{
&
CanMsg_610
,
0
,
0
,
8
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
Battery_status
],
Motorola
},
{
&
CanMsg_610
,
2
,
0
,
16
,
255
,
Offset_Minus
,
10
,
1
,
&
CurValueStr
[
Battery_Current
],
Motorola
},
{
&
CanMsg_611
,
0
,
0
,
8
,
0
,
Offset_Plus
,
1
,
1
,
&
CurValueStr
[
Battery_SOC
],
Motorola
},
};
extern
unsigned
int
Key_Dodging_flag
;
extern
unsigned
int
lost_flag
;
extern
unsigned
int
CAN_init_flag
;
...
...
@@ -93,6 +94,4 @@ EXTERN_APP_TEST void Message_Value_Calculate(s_CAN_Li
void
Bits_Operation
(
CAN_message
*
Message
,
unsigned
char
StartByte
,
unsigned
char
StartBit
,
unsigned
char
Length
,
unsigned
char
Value
);
/*Do not span bytes*/
#endif
/* API_CAN_H_ */
Test_Bench/App_Headers/Globals_Var.h
View file @
aff013f0
...
...
@@ -110,23 +110,15 @@
/*CS08 test*/
EXTERN_VAR
CAN_message
CanMsg_101
;
EXTERN_VAR
CAN_message
CanMsg_067
;
EXTERN_VAR
CAN_message
CanMsg_1023FFA7
;
EXTERN_VAR
CAN_message
CanMsg_1023FFA8
;
EXTERN_VAR
CAN_message
CanMsg_1020FFA7
;
EXTERN_VAR
CAN_message
CanMsg_1020FFA8
;
EXTERN_VAR
CAN_message
CanMsg_1028FFA7
;
EXTERN_VAR
CAN_message
CanMsg_1028FFA8
;
EXTERN_VAR
CAN_message
CanMsg_600
;
EXTERN_VAR
CAN_message
CanMsg_611
;
EXTERN_VAR
CAN_message
CanMsg_610
;
extern
CAN_message
CanMsg_101
;
extern
CAN_message
CanMsg_067
;
extern
CAN_message
CanMsg_1023FFA7
;
extern
CAN_message
CanMsg_1023FFA8
;
extern
CAN_message
CanMsg_1020FFA7
;
extern
CAN_message
CanMsg_1020FFA8
;
extern
CAN_message
CanMsg_1028FFA7
;
extern
CAN_message
CanMsg_1028FFA8
;
extern
CAN_message
CanMsg_600
;
extern
CAN_message
CanMsg_611
;
extern
CAN_message
CanMsg_610
;
/**/
/*:zh*/
...
...
Test_Bench/TBDML.ini
View file @
aff013f0
...
...
@@ -10,7 +10,7 @@ Target=TBDML
Layout
=
C_layout.hwl
LoadDialogOptions
=
AUTOERASEANDFLASH RUNANDSTOPAFTERLOAD="main"
CPU
=
HC12
MainFrame
=
0,1,-
1,-1
,-1,-1,412,144,1341,862
MainFrame
=
0,1,-
32000,-32000
,-1,-1,412,144,1341,862
TOOLBAR
=
57600 57601 32795 0 57635 57634 57637 0 57671 57669 0 32777 32776 32782 32780 32781 32778 0 32806
AEFWarningDialog
=
FALSE
Configuration
=
TBDML.hwc
...
...
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