forked from Zeepro/marlin-zeepro
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathMarlin.h
executable file
·293 lines (244 loc) · 8.44 KB
/
Marlin.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
// Tonokip RepRap firmware rewrite based off of Hydra-mmm firmware.
// Licence: GPL
#ifndef MARLIN_H
#define MARLIN_H
#define FORCE_INLINE __attribute__((always_inline)) inline
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include "fastio.h"
#include "Configuration.h"
#include "pins.h"
/*
#ifndef AT90USB
#define HardwareSerial_h // trick to disable the standard HWserial
#endif*/
#if (ARDUINO >= 100)
# include "Arduino.h"
#else
# include "WProgram.h"
//Arduino < 1.0.0 does not define this, so we need to do it ourselfs
# define analogInputToDigitalPin(p) ((p) + A0)
#endif
#include "MarlinSerial.h"
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
#include "WString.h"
#if MOTHERBOARD == 8 // Teensylu
#define MYSERIAL Serial
#else
#ifdef RFIDSUPPORT
// PNI 20140723 Invert Serial port of two RFID readers
//#define MYSERIAL2 RFIDSerial
//#define MYSERIAL3 RFIDSerial2
#define MYSERIAL2 RFIDSerial2
#define MYSERIAL3 RFIDSerial
// PNI End
#endif
#define MYSERIAL MSerial
#endif
//this is a unfinsihed attemp to removes a lot of warning messages, see:
// http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=57011
//typedef char prog_char PROGMEM;
// //#define PSTR (s ) ((const PROGMEM char *)(s))
// //# define MYPGM(s) (__extension__({static prog_char __c[] = (s); &__c[0];}))
// //#define MYPGM(s) ((const prog_char *g PROGMEM=s))
#define MYPGM(s) PSTR(s)
//#define MYPGM(s) (__extension__({static char __c[] __attribute__((__progmem__)) = (s); &__c[0];})) //This is the normal behaviour
//#define MYPGM(s) (__extension__({static prog_char __c[] = (s); &__c[0];})) //this does not work but hides the warnings
// #ifdef RFIDSUPPORT
// #define SERIAL_PROTOCOL(x) { MYSERIAL.print(x); MYSERIAL2.print(x); MYSERIAL3.print(x); };
// #else
#define SERIAL_PROTOCOL(x) MYSERIAL.print(x)
// #endif
// #ifdef RFIDSUPPORT
// #define SERIAL_PROTOCOL_F(x, y) { MYSERIAL.print(x, y); MYSERIAL2.print(x, y); MYSERIAL3.print(x, y); };
// #else
#define SERIAL_PROTOCOL_F(x, y) MYSERIAL.print(x, y)
// #endif
// #ifdef RFIDSUPPORT
// #define SERIAL_PROTOCOLPGM(x) { serialprintPGM(MYPGM(x)); serialprintPGM2(MYPGM(x)); serialprintPGM3(MYPGM(x));};
// #else
#define SERIAL_PROTOCOLPGM(x) serialprintPGM(MYPGM(x))
// #endif
// #ifdef RFIDSUPPORT
// #define SERIAL_PROTOCOLLN(x) { MYSERIAL.print(x); MYSERIAL.write('\n'); MYSERIAL2.print(x); MYSERIAL2.write('\n'); MYSERIAL3.print(x); MYSERIAL3.write('\n');};
// #else
#define SERIAL_PROTOCOLLN(x) { MYSERIAL.print(x); MYSERIAL.write('\n'); }
// #endif
// #ifdef RFIDSUPPORT
// #define SERIAL_PROTOCOLLNPGM(x) { serialprintPGM(MYPGM(x)); serialprintPGM2(MYPGM(x)); serialprintPGM3(MYPGM(x)); MYSERIAL.write('\n'); MYSERIAL2.write('\n'); MYSERIAL3.write('\n');}
// #else
#define SERIAL_PROTOCOLLNPGM(x) { serialprintPGM(MYPGM(x)); MYSERIAL.write('\n'); }
// #endif
const char errormagic[] PROGMEM ="Error:";
const char echomagic[] PROGMEM ="echo:";
// #ifdef RFIDSUPPORT
// #define SERIAL_ERROR_START { serialprintPGM(errormagic); serialprintPGM2(errormagic); serialprintPGM3(errormagic);}
// #else
#define SERIAL_ERROR_START serialprintPGM(errormagic);
// #endif
#define SERIAL_ERROR(x) SERIAL_PROTOCOL(x)
#define SERIAL_ERRORPGM(x) SERIAL_PROTOCOLPGM(x)
#define SERIAL_ERRORLN(x) SERIAL_PROTOCOLLN(x)
#define SERIAL_ERRORLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
// #ifdef RFIDSUPPORT
// #define SERIAL_ECHO_START { serialprintPGM(echomagic); serialprintPGM2(echomagic); serialprintPGM3(echomagic); }
// #else
#define SERIAL_ECHO_START serialprintPGM(echomagic);
// #endif
#define SERIAL_ECHO(x) SERIAL_PROTOCOL(x)
#define SERIAL_ECHOPGM(x) SERIAL_PROTOCOLPGM(x)
#define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x)
#define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
#define SERIAL_ECHOPAIR(name,value) { SERIAL_ECHOPGM(name); SERIAL_ECHO(value); }
//things to write to serial from Programmemory. saves 400 to 2k of RAM.
#define SerialprintPGM(x) serialprintPGM(MYPGM(x))
FORCE_INLINE void serialprintPGM(const char *str)
{
char ch=pgm_read_byte(str);
while(ch)
{
MYSERIAL.write(ch);
ch=pgm_read_byte(++str);
}
}
/*
#ifdef RFIDSUPPORT
// things to write to bluetooth from Programmemory. saves 400 to 2k of RAM???
// actually reproduces serialprintPGM that's all
#define SerialprintPGM2(x) serialprintPGM2(MYPGM(x))
FORCE_INLINE void serialprintPGM2(const char *str)
{
char ch=pgm_read_byte(str);
while(ch)
{
MYSERIAL2.write(ch);
ch=pgm_read_byte(++str);
}
}
// second one
#define SerialprintPGM3(x) serialprintPGM3(MYPGM(x))
FORCE_INLINE void serialprintPGM3(const char *str)
{
char ch=pgm_read_byte(str);
while(ch)
{
MYSERIAL3.write(ch);
ch=pgm_read_byte(++str);
}
}
#endif
*/
void get_command();
void process_commands();
void manage_inactivity();
void Read_Power_Button();
void Fonction_Transport();
void Function_Z_Movement();
void Function_Carre ();
#if X_ENABLE_PIN > -1
#define enable_x() WRITE(X_ENABLE_PIN, X_ENABLE_ON)
#define disable_x() WRITE(X_ENABLE_PIN,!X_ENABLE_ON)
#else
#define enable_x() ;
#define disable_x() ;
#endif
#if Y_ENABLE_PIN > -1
#define enable_y() WRITE(Y_ENABLE_PIN, Y_ENABLE_ON)
#define disable_y() WRITE(Y_ENABLE_PIN,!Y_ENABLE_ON)
#else
#define enable_y() ;
#define disable_y() ;
#endif
#if Z_ENABLE_PIN > -1
#ifdef Z_DUAL_STEPPER_DRIVERS
#define enable_z() { WRITE(Z_ENABLE_PIN, Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN, Z_ENABLE_ON); }
#define disable_z() { WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON); WRITE(Z2_ENABLE_PIN,!Z_ENABLE_ON); }
#else
#define enable_z() WRITE(Z_ENABLE_PIN, Z_ENABLE_ON)
#define disable_z() WRITE(Z_ENABLE_PIN,!Z_ENABLE_ON)
#endif
#else
#define enable_z() ;
#define disable_z() ;
#endif
#if defined(E0_ENABLE_PIN) && (E0_ENABLE_PIN > -1)
#define enable_e0() WRITE(E0_ENABLE_PIN, E_ENABLE_ON)
#define disable_e0() WRITE(E0_ENABLE_PIN,!E_ENABLE_ON)
#else
#define enable_e0() /* nothing */
#define disable_e0() /* nothing */
#endif
#if (EXTRUDERS > 1) && defined(E1_ENABLE_PIN) && (E1_ENABLE_PIN > -1)
#define enable_e1() WRITE(E1_ENABLE_PIN, E_ENABLE_ON)
#define disable_e1() WRITE(E1_ENABLE_PIN,!E_ENABLE_ON)
#else
#define enable_e1() /* nothing */
#define disable_e1() /* nothing */
#endif
#if (EXTRUDERS > 2) && defined(E2_ENABLE_PIN) && (E2_ENABLE_PIN > -1)
#define enable_e2() WRITE(E2_ENABLE_PIN, E_ENABLE_ON)
#define disable_e2() WRITE(E2_ENABLE_PIN,!E_ENABLE_ON)
#else
#define enable_e2() /* nothing */
#define disable_e2() /* nothing */
#endif
enum AxisEnum {X_AXIS=0, Y_AXIS=1, Z_AXIS=2, E_AXIS=3};
enum Stop_Parameters_Enum {X_parm=0, Y_parm=1, Z_parm=2, T0_parm=3, T1_parm=4, Bed_parm=5};
void FlushSerialRequestResend();
void ClearToSend();
void get_coordinates();
void prepare_move();
void kill();
void kill_Zim();
void Stop();
bool IsStopped();
void enquecommand(const char *cmd); //put an ascii command at the end of the current buffer.
void enquecommand_P(const char *cmd); //put an ascii command at the end of the current buffer, read from flash
void prepare_arc_move(char isclockwise);
void clamp_to_software_endstops(float target[3]);
#ifdef FAST_PWM_FAN
void setPwmFrequency(uint8_t pin, int val);
#endif
#ifndef CRITICAL_SECTION_START
#define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli();
#define CRITICAL_SECTION_END SREG = _sreg;
#endif //CRITICAL_SECTION_START
extern float homing_feedrate[];
extern bool axis_relative_modes[];
extern int feedmultiply;
extern int extrudemultiply; // Sets extrude multiply factor (in percent)
extern int extruder_multiply[EXTRUDERS]; // sets extrude multiply factor (in percent) for each extruder individually
extern float current_position[NUM_AXIS] ;
extern float Pause_current_position[NUM_STOP_PARAMETERS] ;
extern float add_homeing[3];
extern float min_pos[3];
extern float max_pos[3];
extern int fanSpeed;
#ifdef FWRETRACT
extern bool autoretract_enabled;
extern bool retracted;
extern float retract_length, retract_feedrate, retract_zlift;
extern float retract_recover_length, retract_recover_feedrate;
#endif
extern unsigned long starttime;
extern unsigned long stoptime;
// Handling multiple extruders pins
extern uint8_t active_extruder;
// extern bool unloading_critical_state;
extern bool unloading_command;
extern byte TAG_RFID_E0[16];
extern byte TAG_RFID_E1[16];
// extern bool Desactiver_interruption;
#endif