Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
M
MarlinKimbra
Project
Project
Details
Activity
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
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
machinery
MarlinKimbra
Commits
3acc5a42
Commit
3acc5a42
authored
Jan 02, 2016
by
MagoKimbra
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update V4.2.3
parent
9d05f329
Changes
24
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
329 additions
and
282 deletions
+329
-282
Configuration_Basic.h
MarlinKimbra/Configuration_Basic.h
+2
-1
Configuration_Cartesian.h
MarlinKimbra/Configuration_Cartesian.h
+9
-9
Configuration_Feature.h
MarlinKimbra/Configuration_Feature.h
+207
-198
MarlinKimbra.ino
MarlinKimbra/MarlinKimbra.ino
+2
-13
Marlin_main.cpp
MarlinKimbra/Marlin_main.cpp
+5
-6
cardreader.cpp
MarlinKimbra/cardreader.cpp
+1
-1
conditionals.h
MarlinKimbra/conditionals.h
+12
-0
blinkm.cpp
MarlinKimbra/module/blinkm.cpp
+2
-1
blinkm.h
MarlinKimbra/module/blinkm.h
+0
-0
buzzer.cpp
MarlinKimbra/module/buzzer.cpp
+3
-2
buzzer.h
MarlinKimbra/module/buzzer.h
+0
-0
firmware_test.cpp
MarlinKimbra/module/firmware_test.cpp
+17
-13
firmware_test.h
MarlinKimbra/module/firmware_test.h
+4
-0
nextion_gfx.cpp
MarlinKimbra/module/nextion_gfx.cpp
+0
-0
nextion_gfx.h
MarlinKimbra/module/nextion_gfx.h
+0
-0
nextion_lcd.cpp
MarlinKimbra/module/nextion_lcd.cpp
+46
-27
nextion_lcd.h
MarlinKimbra/module/nextion_lcd.h
+0
-0
servo.cpp
MarlinKimbra/module/servo.cpp
+1
-1
servo.h
MarlinKimbra/module/servo.h
+0
-0
sanitycheck.h
MarlinKimbra/sanitycheck.h
+12
-6
stepper.cpp
MarlinKimbra/stepper.cpp
+1
-1
temperature.cpp
MarlinKimbra/temperature.cpp
+1
-1
ultralcd.cpp
MarlinKimbra/ultralcd.cpp
+1
-1
ultralcd.h
MarlinKimbra/ultralcd.h
+3
-1
No files found.
MarlinKimbra/Configuration_Basic.h
View file @
3acc5a42
...
...
@@ -41,7 +41,8 @@
#define MACHINE_UUID "00000000-0000-0000-0000-000000000000"
// If you want test the firmware uncomment below. Use Serial arduino monitor...
//#define FIRMWARE_TEST // ONLY BAUDRATE 115200
// ONLY BAUDRATE 115200
//#define FIRMWARE_TEST
// Some particular clients re-start sending commands only after receiving a 'wait' when there is a bed serial-connection.
//#define NO_TIMEOUTS 1000 // Milliseconds
...
...
MarlinKimbra/Configuration_Cartesian.h
View file @
3acc5a42
...
...
@@ -253,24 +253,24 @@
// Enable this to sample the bed in a grid (least squares solution)
// Note: this feature generates 10KB extra code size
#define AUTO_BED_LEVELING_GRID
//
#define AUTO_BED_LEVELING_GRID
// yes AUTO_BED_LEVELING_GRID
#define MIN_PROBE_EDGE 10 // The probe square sides can be no smaller than this
//
#define MIN_PROBE_EDGE 10 // The probe square sides can be no smaller than this
// Set the number of grid points per dimension
// You probably don't need more than 3 (squared=9)
#define AUTO_BED_LEVELING_GRID_POINTS 2
//
#define AUTO_BED_LEVELING_GRID_POINTS 2
// yes AUTO_BED_LEVELING_GRID
// no AUTO_BED_LEVELING_GRID
// Arbitrary points to probe. A simple cross-product
// is used to estimate the plane of the bed.
#define ABL_PROBE_PT_1_X 15
#define ABL_PROBE_PT_1_Y 180
#define ABL_PROBE_PT_2_X 15
#define ABL_PROBE_PT_2_Y 20
#define ABL_PROBE_PT_3_X 170
#define ABL_PROBE_PT_3_Y 20
//
#define ABL_PROBE_PT_1_X 15
//
#define ABL_PROBE_PT_1_Y 180
//
#define ABL_PROBE_PT_2_X 15
//
#define ABL_PROBE_PT_2_Y 20
//
#define ABL_PROBE_PT_3_X 170
//
#define ABL_PROBE_PT_3_Y 20
// no AUTO_BED_LEVELING_GRID
// Offsets to the probe relative to the extruder tip (Hotend - Probe)
...
...
MarlinKimbra/Configuration_Feature.h
View file @
3acc5a42
This diff is collapsed.
Click to expand it.
MarlinKimbra/MarlinKimbra.ino
View file @
3acc5a42
/**
* MarlinKimbra Firmware
*
* Based on Sprinter and grbl.
* Based on Marlin, Sprinter and grbl
* Copyright (C) 2013 MagoKimbra
* Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
...
...
@@ -16,20 +17,8 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* About Marlin
*
* This firmware is a mashup between Sprinter and grbl.
* - https://github.com/kliment/Sprinter
* - https://github.com/simen/grbl/tree
*
* It has preliminary support for Matthew Roberts advance algorithm
* - http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
*/
/* All the implementation is done in *.cpp files to get better compatibility with avr-gcc without the Arduino IDE */
/* Use this file to help the Arduino IDE find which Arduino libraries are needed and to keep documentation on GCode */
#include "base.h"
#if ENABLED(DIGIPOT_I2C) || ENABLED(BLINKM)
...
...
MarlinKimbra/Marlin_main.cpp
View file @
3acc5a42
...
...
@@ -31,7 +31,7 @@
#include "Marlin_main.h"
#include "ultralcd.h"
#include "
nextion
/nextion_lcd.h"
#include "
module
/nextion_lcd.h"
#include "base.h"
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
#include "vector_3.h"
...
...
@@ -54,16 +54,15 @@
#endif
#if HAS(BUZZER)
#include "buzzer.h"
#include "
module/
buzzer.h"
#endif
#if ENABLED(BLINKM)
#include "blinkm.h"
#include "Wire.h"
#include "module/blinkm.h"
#endif
#if HAS(SERVOS)
#include "servo.h"
#include "
module/
servo.h"
#endif
#if HAS(DIGIPOTSS)
...
...
@@ -71,7 +70,7 @@
#endif
#if ENABLED(FIRMWARE_TEST)
#include "firmware_test.h"
#include "
module/
firmware_test.h"
#endif
/**
...
...
MarlinKimbra/cardreader.cpp
View file @
3acc5a42
...
...
@@ -11,7 +11,7 @@
#include "stepper.h"
#include "temperature.h"
#include "ultralcd.h"
#include "
nextion
/nextion_lcd.h"
#include "
module
/nextion_lcd.h"
#include "cardreader.h"
CardReader
::
CardReader
()
{
...
...
MarlinKimbra/conditionals.h
View file @
3acc5a42
...
...
@@ -708,6 +708,18 @@
* Servos
*/
#if HAS(SERVOS)
#ifndef X_ENDSTOP_SERVO_NR
#define X_ENDSTOP_SERVO_NR -1
#endif
#ifndef Y_ENDSTOP_SERVO_NR
#define Y_ENDSTOP_SERVO_NR -1
#endif
#ifndef Z_ENDSTOP_SERVO_NR
#define Z_ENDSTOP_SERVO_NR -1
#endif
#ifndef SERVO_DEACTIVATION_DELAY
#define SERVO_DEACTIVATION_DELAY 300
#endif
#if X_ENDSTOP_SERVO_NR >= 0 || Y_ENDSTOP_SERVO_NR >= 0 || Z_ENDSTOP_SERVO_NR >= 0
#define HAS_SERVO_ENDSTOPS true
#define SERVO_ENDSTOP_IDS { X_ENDSTOP_SERVO_NR, Y_ENDSTOP_SERVO_NR, Z_ENDSTOP_SERVO_NR }
...
...
MarlinKimbra/blinkm.cpp
→
MarlinKimbra/
module/
blinkm.cpp
View file @
3acc5a42
...
...
@@ -2,11 +2,12 @@
blinkm.cpp - Library for controlling a BlinkM over i2c
Created by Tim Koster, August 21 2013.
*/
#include "base.h"
#include "
../
base.h"
#if ENABLED(BLINKM)
#include "blinkm.h"
#include <Wire.h>
void
SendColors
(
byte
red
,
byte
grn
,
byte
blu
)
{
Wire
.
begin
();
...
...
MarlinKimbra/blinkm.h
→
MarlinKimbra/
module/
blinkm.h
View file @
3acc5a42
File moved
MarlinKimbra/buzzer.cpp
→
MarlinKimbra/
module/
buzzer.cpp
View file @
3acc5a42
#include "base.h"
#include "../base.h"
#if HAS(BUZZER)
#include "buzzer.h"
#include "ultralcd.h"
#include "
../
ultralcd.h"
void
buzz
(
long
duration
,
uint16_t
freq
)
{
if
(
freq
>
0
)
{
...
...
MarlinKimbra/buzzer.h
→
MarlinKimbra/
module/
buzzer.h
View file @
3acc5a42
File moved
MarlinKimbra/firmware_test.cpp
→
MarlinKimbra/
module/
firmware_test.cpp
View file @
3acc5a42
/*
Test.h
Tools for firmware test
By MagoKimbra
/**
* Tools for firmware test
* By MagoKimbra
*/
#include "base.h"
#include "../base.h"
#if ENABLED(FIRMWARE_TEST)
#include "Marlin_main.h"
#include "firmware_test.h"
#include "../Marlin_main.h"
#include "../planner.h"
#include "../stepper_indirection.h"
#include "../stepper.h"
#include "../temperature.h"
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
#include "vector_3.h"
#include "
../
vector_3.h"
#endif
#include "planner.h"
#include "stepper_indirection.h"
#include "stepper.h"
#include "temperature.h"
#include "firmware_test.h"
static
char
serial_answer
;
void
FirmwareTest
()
{
...
...
MarlinKimbra/firmware_test.h
→
MarlinKimbra/
module/
firmware_test.h
View file @
3acc5a42
#ifndef FIRMWARE_TEST_H
#define FIRMWARE_TEST_H
void
FirmwareTest
();
#endif
\ No newline at end of file
#define FIRMWARE_TEST_H
void
FirmwareTest
();
#endif
MarlinKimbra/
nextion
/nextion_gfx.cpp
→
MarlinKimbra/
module
/nextion_gfx.cpp
View file @
3acc5a42
File moved
MarlinKimbra/
nextion
/nextion_gfx.h
→
MarlinKimbra/
module
/nextion_gfx.h
View file @
3acc5a42
File moved
MarlinKimbra/
nextion
/nextion_lcd.cpp
→
MarlinKimbra/
module
/nextion_lcd.cpp
View file @
3acc5a42
...
...
@@ -17,16 +17,18 @@
#include "nextion_gfx.h"
#include <Nextion.h>
const
float
MaxWave
=
0.2
;
bool
NextionON
=
false
;
bool
PageInfo
=
false
;
bool
gfxON
=
false
;
char
buffer
[
100
]
=
{
0
};
uint32_t
slidermaxval
=
20
;
char
lcd_status_message
[
30
]
=
WELCOME_MSG
;
// worst case is kana with up to 3*LCD_WIDTH+1
char
lcd_status_message
[
30
]
=
WELCOME_MSG
;
uint8_t
lcd_status_message_level
=
0
;
static
millis_t
next_lcd_update_ms
;
#if ENABLED(NEXTION_GFX)
GFX
gfx
=
GFX
(
200
,
190
);
GFX
gfx
=
GFX
(
196
,
194
);
#endif
// Page
...
...
@@ -39,10 +41,10 @@
NexPage
Pmove
=
NexPage
(
6
,
0
,
"move"
);
// Text
NexText
Hotend0
=
NexText
(
1
,
2
,
"t0"
);
NexText
Hotend0
=
NexText
(
1
,
1
,
"t0"
);
NexText
Hotend1
=
NexText
(
1
,
4
,
"t1"
);
NexText
Hotend2
1
=
NexText
(
1
,
5
,
"h
2"
);
NexText
Hotend2
=
NexText
(
1
,
6
,
"t
2"
);
NexText
Hotend2
=
NexText
(
1
,
5
,
"t
2"
);
NexText
Hotend2
1
=
NexText
(
1
,
6
,
"h
2"
);
NexText
LedStatus
=
NexText
(
1
,
7
,
"t4"
);
NexText
LedCoord
=
NexText
(
1
,
8
,
"t5"
);
NexText
set0
=
NexText
(
2
,
2
,
"set0"
);
...
...
@@ -55,15 +57,15 @@
NexText
sdfolder
=
NexText
(
4
,
23
,
"sdfolder"
);
// Picture
NexPicture
Menu
=
NexPicture
(
1
,
9
,
"p0"
);
NexPicture
MSD
=
NexPicture
(
1
,
1
0
,
"p1"
);
NexPicture
MSetup
=
NexPicture
(
1
,
1
1
,
"p2"
);
NexPicture
Hend0
=
NexPicture
(
1
,
1
2
,
"p3"
);
NexPicture
Menu
=
NexPicture
(
1
,
10
,
"p0"
);
NexPicture
MSD
=
NexPicture
(
1
,
1
1
,
"p1"
);
NexPicture
MSetup
=
NexPicture
(
1
,
1
2
,
"p2"
);
NexPicture
Hend0
=
NexPicture
(
1
,
1
3
,
"p3"
);
NexPicture
Hend1
=
NexPicture
(
1
,
14
,
"p4"
);
NexPicture
Hend2
=
NexPicture
(
1
,
1
6
,
"p5"
);
NexPicture
Fanpic
=
NexPicture
(
1
,
1
8
,
"p6"
);
NexPicture
NPlay
=
NexPicture
(
1
,
2
4
,
"p7"
);
NexPicture
NStop
=
NexPicture
(
1
,
2
5
,
"p8"
);
NexPicture
Hend2
=
NexPicture
(
1
,
1
5
,
"p5"
);
NexPicture
Fanpic
=
NexPicture
(
1
,
1
9
,
"p6"
);
NexPicture
NPlay
=
NexPicture
(
1
,
2
7
,
"p7"
);
NexPicture
NStop
=
NexPicture
(
1
,
2
8
,
"p8"
);
NexPicture
Exit1
=
NexPicture
(
3
,
4
,
"p3"
);
NexPicture
Folder0
=
NexPicture
(
4
,
9
,
"p0"
);
NexPicture
Folder1
=
NexPicture
(
4
,
10
,
"p1"
);
...
...
@@ -84,29 +86,32 @@
NexPicture
ZDown
=
NexPicture
(
6
,
12
,
"p11"
);
// Progress Bar
NexProgressBar
sdbar
=
NexProgressBar
(
1
,
2
3
,
"j0"
);
NexProgressBar
sdbar
=
NexProgressBar
(
1
,
2
6
,
"j0"
);
// Slider
NexSlider
sdlist
=
NexSlider
(
4
,
1
,
"h0"
);
// Wafeform
NexWaveform
Graph0
=
NexWaveform
(
1
,
9
,
"s0"
);
NexWaveform
Graph1
=
NexWaveform
(
1
,
24
,
"s1"
);
NexWaveform
Graph2
=
NexWaveform
(
1
,
25
,
"s2"
);
// Touch area
NexHotspot
hot0
=
NexHotspot
(
1
,
1
3
,
"hot0"
);
NexHotspot
hot1
=
NexHotspot
(
1
,
1
5
,
"hot1"
);
NexHotspot
hot2
=
NexHotspot
(
1
,
1
7
,
"hot2"
);
NexHotspot
hot0
=
NexHotspot
(
1
,
1
4
,
"hot0"
);
NexHotspot
hot1
=
NexHotspot
(
1
,
1
6
,
"hot1"
);
NexHotspot
hot2
=
NexHotspot
(
1
,
1
8
,
"hot2"
);
NexHotspot
m11
=
NexHotspot
(
2
,
14
,
"m11"
);
NexHotspot
tup
=
NexHotspot
(
2
,
16
,
"tup"
);
NexHotspot
tdown
=
NexHotspot
(
2
,
17
,
"tdown"
);
// Timer
NexTimer
startimer
=
NexTimer
(
0
,
1
,
"tm0"
);
NexTimer
fantimer
=
NexTimer
(
1
,
2
2
,
"tm0"
);
NexTimer
fantimer
=
NexTimer
(
1
,
2
3
,
"tm0"
);
// Variable
NexVar
Hotend
=
NexVar
(
1
,
19
,
"he"
);
NexVar
Bed
=
NexVar
(
1
,
20
,
"bed"
);
NexVar
Hotend
=
NexVar
(
1
,
20
,
"he"
);
NexVar
set1
=
NexVar
(
2
,
17
,
"set1"
);
NexVar
Bed
=
NexVar
(
1
,
21
,
"bed"
);
NexVar
filename0
=
NexVar
(
4
,
19
,
"va0"
);
NexVar
filename1
=
NexVar
(
4
,
20
,
"va1"
);
NexVar
filename2
=
NexVar
(
4
,
21
,
"va2"
);
...
...
@@ -160,6 +165,14 @@
NULL
};
NexWaveform
*
graph_list
[]
=
{
&
Graph0
,
&
Graph1
,
&
Graph2
,
NULL
};
NexText
*
row_list
[]
=
{
&
sdrow0
,
...
...
@@ -198,10 +211,6 @@
PageInfo
=
true
;
#if ENABLED(NEXTION_GFX)
gfx_clear
(
X_MAX_POS
,
Y_MAX_POS
,
Z_MAX_POS
);
#endif
#if HAS_TEMP_0
Hotend
.
setValue
(
1
);
#endif
...
...
@@ -269,6 +278,7 @@
static
void
setpagesdcard
()
{
PageInfo
=
false
;
gfxON
=
false
;
Psdcard
.
show
();
uint16_t
fileCnt
=
card
.
getnrfilenames
();
...
...
@@ -426,10 +436,12 @@
void
setpagePopCallback
(
void
*
ptr
)
{
if
(
ptr
==
&
Menu
)
{
PageInfo
=
false
;
gfxON
=
false
;
Pmenu
.
show
();
}
else
if
(
ptr
==
&
MSetup
)
{
PageInfo
=
false
;
gfxON
=
false
;
Psetup
.
show
();
}
...
...
@@ -549,6 +561,11 @@
hotend_list
[
h
]
->
setText
(
buffer
);
hotend_list
[
h
]
->
setColor
(
color
);
if
(
!
gfxON
)
{
graph_list
[
h
]
->
addValue
(
0
,
(
int
)(
T1
*
MaxWave
));
graph_list
[
h
]
->
addValue
(
1
,
(
int
)(
T2
*
MaxWave
));
}
}
static
void
coordtoLCD
()
{
...
...
@@ -661,17 +678,19 @@
#if ENABLED(NEXTION_GFX)
void
gfx_clear
(
float
x
,
float
y
,
float
z
)
{
if
(
PageInfo
)
if
(
PageInfo
)
{
gfx
.
clear
(
x
,
y
,
z
);
gfxON
=
true
;
}
}
void
gfx_cursor_to
(
float
x
,
float
y
,
float
z
)
{
if
(
PageInfo
)
if
(
PageInfo
&&
gfxON
)
gfx
.
cursor_to
(
x
,
y
,
z
);
}
void
gfx_line_to
(
float
x
,
float
y
,
float
z
){
if
(
PageInfo
)
if
(
PageInfo
&&
gfxON
)
gfx
.
line_to
(
VC_TOOL
,
x
,
y
,
z
);
}
#endif
...
...
MarlinKimbra/
nextion
/nextion_lcd.h
→
MarlinKimbra/
module
/nextion_lcd.h
View file @
3acc5a42
File moved
MarlinKimbra/servo.cpp
→
MarlinKimbra/
module/
servo.cpp
View file @
3acc5a42
...
...
@@ -44,7 +44,7 @@
*/
#include "base.h"
#include "
../
base.h"
#if HAS(SERVOS)
#include "servo.h"
...
...
MarlinKimbra/servo.h
→
MarlinKimbra/
module/
servo.h
View file @
3acc5a42
File moved
MarlinKimbra/sanitycheck.h
View file @
3acc5a42
...
...
@@ -472,14 +472,20 @@
#if DISABLED(Z_ENDSTOP_SERVO_NR)
#error DEPENDENCY ERROR: Missing setting Z_ENDSTOP_SERVO_NR
#endif
#if DISABLED(X_ENDSTOP_SERVO_ANGLES)
#error DEPENDENCY ERROR: Missing setting X_ENDSTOP_SERVO_ANGLES
#if ENABLED(X_ENDSTOP_SERVO_NR) && X_ENDSTOP_SERVO_NR > -1
#if DISABLED(X_ENDSTOP_SERVO_ANGLES)
#error DEPENDENCY ERROR: Missing setting X_ENDSTOP_SERVO_ANGLES
#endif
#endif
#if DISABLED(Y_ENDSTOP_SERVO_ANGLES)
#error DEPENDENCY ERROR: Missing setting Y_ENDSTOP_SERVO_ANGLES
#if ENABLED(Y_ENDSTOP_SERVO_NR) && Y_ENDSTOP_SERVO_NR > -1
#if DISABLED(Y_ENDSTOP_SERVO_ANGLES)
#error DEPENDENCY ERROR: Missing setting Y_ENDSTOP_SERVO_ANGLES
#endif
#endif
#if DISABLED(Z_ENDSTOP_SERVO_ANGLES)
#error DEPENDENCY ERROR: Missing setting Z_ENDSTOP_SERVO_ANGLES
#if ENABLED(Z_ENDSTOP_SERVO_NR) && Z_ENDSTOP_SERVO_NR > -1
#if DISABLED(Z_ENDSTOP_SERVO_ANGLES)
#error DEPENDENCY ERROR: Missing setting Z_ENDSTOP_SERVO_ANGLES
#endif
#endif
#if DISABLED(SERVO_DEACTIVATION_DELAY)
#error DEPENDENCY ERROR: Missing setting SERVO_DEACTIVATION_DELAY
...
...
MarlinKimbra/stepper.cpp
View file @
3acc5a42
...
...
@@ -36,7 +36,7 @@
#include "stepper.h"
#include "temperature.h"
#include "ultralcd.h"
#include "
nextion
/nextion_lcd.h"
#include "
module
/nextion_lcd.h"
#if ENABLED(SDSUPPORT)
#include "cardreader.h"
...
...
MarlinKimbra/temperature.cpp
View file @
3acc5a42
...
...
@@ -24,7 +24,7 @@
#include "vector_3.h"
#endif
#include "ultralcd.h"
#include "
nextion
/nextion_lcd.h"
#include "
module
/nextion_lcd.h"
#include "planner.h"
#include "stepper_indirection.h"
#if MB(ALLIGATOR)
...
...
MarlinKimbra/ultralcd.cpp
View file @
3acc5a42
...
...
@@ -17,7 +17,7 @@
#include "ultralcd.h"
#if HAS(BUZZER)
#include "buzzer.h"
#include "
module/
buzzer.h"
#endif
int8_t
encoderDiff
;
// updated from interrupt context and added to encoderPosition every LCD update
...
...
MarlinKimbra/ultralcd.h
View file @
3acc5a42
...
...
@@ -3,7 +3,9 @@
#include "Marlin_main.h"
#if ENABLED(ULTRA_LCD)
#include "buzzer.h"
#if HAS(BUZZER)
#include "module/buzzer.h"
#endif
int
lcd_strlen
(
char
*
s
);
int
lcd_strlen_P
(
const
char
*
s
);
...
...
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