ESP3D  3.0
Firmware for ESP boards connected to 3D Printer
esp3doutput.cpp
Go to the documentation of this file.
1 /*
2  serial_service.cpp - serial services functions class
3 
4  Copyright (c) 2014 Luc Lebosse. All rights reserved.
5 
6  This library is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Lesser General Public
8  License as published by the Free Software Foundation; either
9  version 2.1 of the License, or (at your option) any later version.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public
17  License along with this library; if not, write to the Free Software
18  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20 
21 #include "../include/esp3d_config.h"
22 #include "esp3doutput.h"
23 #include "../modules/serial/serial_service.h"
24 #include "settings_esp3d.h"
25 #if defined (HTTP_FEATURE) || defined(WS_DATA_FEATURE)
26 #include "../modules/websocket/websocket_server.h"
27 #endif //HTTP_FEATURE || WS_DATA_FEATURE
28 #if defined (BLUETOOTH_FEATURE)
29 #include "../modules/bluetooth/BT_service.h"
30 #endif //BLUETOOTH_FEATURE
31 #if defined (TELNET_FEATURE)
32 #include "../modules/telnet/telnet_server.h"
33 #endif //TELNET_FEATURE
34 uint8_t ESP3DOutput::_outputflags = ESP_ALL_CLIENTS;
35 #if defined (HTTP_FEATURE)
36 #if defined (ARDUINO_ARCH_ESP32)
37 #include <WebServer.h>
38 #endif //ARDUINO_ARCH_ESP32
39 #if defined (ARDUINO_ARCH_ESP8266)
40 #include <ESP8266WebServer.h>
41 #endif //ARDUINO_ARCH_ESP8266
42 #endif //HTTP_FEATURE
43 #if defined (DISPLAY_DEVICE)
44 #include "../modules/display/display.h"
45 #endif //DISPLAY_DEVICE
46 
47 //constructor
48 ESP3DOutput::ESP3DOutput(uint8_t client)
49 {
50  _client = client;
51 
52 #ifdef HTTP_FEATURE
53  _code = 200;
54  _headerSent = false;
55  _footerSent = false;
56  _webserver = nullptr;
57 #endif //HTTP_FEATURE
58 }
59 
60 #ifdef HTTP_FEATURE
61 //constructor
62 ESP3DOutput::ESP3DOutput(WEBSERVER * webserver)
63 {
64  _client = ESP_HTTP_CLIENT;
65  _code = 200;
66  _headerSent = false;
67  _footerSent = false;
68  _webserver = webserver;
69 }
70 #endif //HTTP_FEATURE
71 
72 //destructor
74 {
75  flush();
76 }
77 
78 bool ESP3DOutput::isOutput(uint8_t flag, bool fromsettings)
79 {
80  if(fromsettings) {
82  }
83  return ((_outputflags & flag) == flag);
84 
85 }
86 
87 size_t ESP3DOutput::dispatch (uint8_t * sbuf, size_t len)
88 {
89  log_esp3d("Dispatch %d to %d", len, _client);
90  if (_client != ESP_SERIAL_CLIENT) {
92  serial_service.write(sbuf, len);
93  }
94  }
95 #if defined (HTTP_FEATURE) //no need to block it never
96  if (!((_client == ESP_WEBSOCKET_TERMINAL_CLIENT) || (_client == ESP_HTTP_CLIENT))) {
99  }
100  }
101 #endif //HTTP_FEATURE
102 #if defined (BLUETOOTH_FEATURE)
103  if (_client != ESP_BT_CLIENT) {
105  bt_service.write(sbuf, len);
106  }
107  }
108 #endif //BLUETOOTH_FEATURE
109 #if defined (TELNET_FEATURE)
110  if (_client != ESP_TELNET_CLIENT) {
112  telnet_server.write(sbuf, len);
113  }
114  }
115 #endif //TELNET_FEATURE
116 #if defined (WS_DATA_FEATURE)
117  if (_client != ESP_WEBSOCKET_CLIENT) {
119  log_esp3d("Dispatch to websocket data server");
120  websocket_data_server.write(sbuf, len);
121  }
122  }
123 #endif //WS_DATA_FEATURE
124  return len;
125 }
126 
127 //Flush
129 {
130  if (!isOutput(_client)) {
131  return ;
132  }
133  switch (_client) {
134  case ESP_SERIAL_CLIENT:
136  break;
137 #ifdef HTTP_FEATURE
138  case ESP_HTTP_CLIENT:
139  if (_webserver) {
140  if (_headerSent && !_footerSent) {
141  _webserver->sendContent("");
142  _footerSent = true;
143  }
144  }
145  break;
146 #endif //HTTP_FEATURE
147 #if defined (BLUETOOTH_FEATURE)
148  case ESP_BT_CLIENT:
149  bt_service.flush();
150  break;
151 #endif //BLUETOOTH_FEATURE
152 #if defined (TELNET_FEATURE)
153  case ESP_TELNET_CLIENT:
155  break;
156 #endif //TELNET_FEATURE
157  case ESP_ALL_CLIENTS:
158  //do nothing because there are side effects
159  break;
160  default :
161  break;
162  }
163 }
164 
165 size_t ESP3DOutput::printLN(const char * s)
166 {
167  if (!isOutput(_client)) {
168  return 0;
169  }
170  switch(_client) {
171  case ESP_HTTP_CLIENT:
172  if(strlen(s) > 0) {
173  println(s);
174  return strlen(s) + 1;
175  } else {
176  println(" ");
177  return strlen(s) + 2;
178  }
179  return 0;
180  case ESP_TELNET_CLIENT:
181  print(s);
182  println("\r");
183  return strlen(s)+2;
184  default:
185  break;
186  }
187  return println(s);
188 }
189 
190 size_t ESP3DOutput::printMSG(const char * s, bool withNL)
191 {
192  if (!isOutput(_client)) {
193  return 0;
194  }
195  String display;
196 #ifdef HTTP_FEATURE
197  if (_client == ESP_HTTP_CLIENT) {
198 
199  if (_webserver) {
200  if (!_headerSent && !_footerSent) {
201  _webserver->sendHeader("Cache-Control","no-cache");
202 #ifdef ESP_ACCESS_CONTROL_ALLOW_ORIGIN
203  _webserver->sendHeader("Access-Control-Allow-Origin", "*");
204 #endif //ESP_ACCESS_CONTROL_ALLOw_ORIGIN
205  _webserver->send (_code, "text/plain", s);
206  _headerSent = true;
207  _footerSent = true;
208  return strlen(s);
209  }
210  }
211  return 0;
212  }
213 #endif //HTTP_FEATURE
214  if (_client == ESP_PRINTER_LCD_CLIENT) {
215  display = "M117 ";
216  display+= s;
217  return printLN(display.c_str());
218  }
219  if (_client == ESP_SCREEN_CLIENT) {
220  return print(s);
221  }
223  case GRBL:
224  display = "[MSG:";
225  display += s;
226  display += "]";
227  break;
228  case MARLIN:
229  case MARLINKIMBRA:
230  display = "echo: ";
231  display += s;
232  break;
233  case REPETIER4DV:
234  case SMOOTHIEWARE:
235  case REPETIER:
236  default:
237  display = ";";
238  display += s;
239  }
240  if(withNL) {
241  return printLN(display.c_str());
242  } else {
243  return print(display.c_str());
244  }
245 }
246 
247 size_t ESP3DOutput::printERROR(const char * s, int code_error)
248 {
249  if (!isOutput(_client)) {
250  return 0;
251  }
252  if (_client == ESP_SCREEN_CLIENT) {
253  return print(s);
254  }
255 #ifdef HTTP_FEATURE
256  _code = code_error;
257  if (_client == ESP_HTTP_CLIENT) {
258 
259  if (_webserver) {
260  if (!_headerSent && !_footerSent) {
261  _webserver->sendHeader("Cache-Control","no-cache");
262  _webserver->send (_code, "text/plain", s);
263  _headerSent = true;
264  _footerSent = true;
265  return strlen(s);
266  }
267  }
268  return 0;
269  }
270 #else
271  (void)code_error;
272 #endif //HTTP_FEATURE
273  String display;
275  case GRBL:
276 
277  display = "error: ";
278  display += s;
279  break;
280  case MARLIN:
281  case MARLINKIMBRA:
282  display = "error: ";
283  display += s;
284  break;
285  case REPETIER4DV:
286  case SMOOTHIEWARE:
287  case REPETIER:
288  default:
289  display = ";error: ";
290  display += s;
291  }
292  return printLN(display.c_str());
293 }
294 
296 {
297  switch (_client) {
298  case ESP_SERIAL_CLIENT:
300 #if defined (BLUETOOTH_FEATURE)
301  case ESP_BT_CLIENT:
302  return bt_service.availableForWrite();
303  break;
304 #endif //BLUETOOTH_FEATURE
305 #if defined (TELNET_FEATURE)
306  case ESP_TELNET_CLIENT:
308  break;
309 #endif //TELNET_FEATURE
310 #if defined (WS_DATA_FEATURE)
313  break;
314 #endif //WS_DATA_FEATURE
315  case ESP_ALL_CLIENTS:
317  default :
318  break;
319  }
320  return 0;
321 }
322 size_t ESP3DOutput::write(uint8_t c)
323 {
324  if (!isOutput(_client)) {
325  return 0;
326  }
327  switch (_client) {
328  case ESP_SERIAL_CLIENT:
329  return serial_service.write(c);
330 #if defined (BLUETOOTH_FEATURE)
331  case ESP_BT_CLIENT:
332  if(bt_service.started()) {
333  return bt_service.write(c);
334  }
335 #endif //BLUETOOTH_FEATURE
336 #if defined (TELNET_FEATURE)
337  case ESP_TELNET_CLIENT:
338  return telnet_server.write(c);
339 #endif //TELNET_FEATURE
340 #if defined (WS_DATA_FEATURE)
342  return websocket_data_server.write(c);
343 #endif //WS_DATA_FEATURE
344  case ESP_ALL_CLIENTS:
345 #if defined (BLUETOOTH_FEATURE)
346  if(bt_service.started()) {
347  bt_service.write(c);
348  }
349 #endif //BLUETOOTH_FEATURE
350 #if defined (TELNET_FEATURE)
351  if(telnet_server.started()) {
352  telnet_server.write(c);
353  }
354 #endif //TELNET_FEATURE
355  return serial_service.write(c);
356  default :
357  return 0;
358  }
359 }
360 
361 size_t ESP3DOutput::write(const uint8_t *buffer, size_t size)
362 {
363  if (!isOutput(_client)) {
364  return 0;
365  }
366  switch (_client) {
367 #ifdef HTTP_FEATURE
368  case ESP_HTTP_CLIENT:
369 
370  if (_webserver) {
371  if (!_headerSent && !_footerSent) {
372  _webserver->setContentLength(CONTENT_LENGTH_UNKNOWN);
373  _webserver->sendHeader("Content-Type","text/html");
374  _webserver->sendHeader("Cache-Control","no-cache");
375  _webserver->send(_code);
376  _headerSent = true;
377  }
378  if (_headerSent && !_footerSent) {
379  _webserver->sendContent_P((const char*)buffer,size);
380  }
381  }
382  break;
383 #endif //HTTP_FEATURE
384 #if defined (DISPLAY_DEVICE)
385  case ESP_SCREEN_CLIENT:
386  esp3d_display.SetStatus((const char *)buffer);
387  return size;
388 #endif //DISPLAY_DEVICE
389 #if defined (BLUETOOTH_FEATURE)
390  case ESP_BT_CLIENT:
391  if(bt_service.started()) {
392  return bt_service.write(buffer, size);
393  }
394 #endif //BLUETOOTH_FEATURE
395 #if defined (TELNET_FEATURE)
396  case ESP_TELNET_CLIENT:
397  if(telnet_server.started()) {
398  return telnet_server.write(buffer, size);
399  }
400 #endif //TELNET_FEATURE
401 #if defined (WS_DATA_FEATURE)
404  return websocket_data_server.write(buffer, size);
405  }
406 #endif //WS_DATA_FEATURE
408  case ESP_SERIAL_CLIENT:
409  return serial_service.write(buffer, size);
410  case ESP_ALL_CLIENTS:
411 #if defined (BLUETOOTH_FEATURE)
412  if(bt_service.started()) {
413  bt_service.write(buffer, size);
414  }
415 #endif //BLUETOOTH_FEATURE
416 #if defined (TELNET_FEATURE)
417  if(telnet_server.started()) {
418  telnet_server.write(buffer, size);
419  }
420 #endif //TELNET_FEATURE
421  return serial_service.write(buffer, size);
422  default :
423  break;
424  }
425  return 0;
426 }
427 
428 void ESP3DGlobalOutput::SetStatus(const char * status)
429 {
430 #ifdef DISPLAY_DEVICE
431  esp3d_display.SetStatus(status);
432 #else
433  (void)status;
434 #endif //DISPLAY_DEVICE
435 }
437 {
438 #ifdef DISPLAY_DEVICE
440 #else
441  (void)v;
442 #endif //DISPLAY_DEVICE
443 }
444 
446 {
447 #ifdef DISPLAY_DEVICE
448  esp3d_display.display_IP(force);
449 #else
450  (void)force;
451 #endif //DISPLAY_DEVICE
452 }
453 
ESP3DGlobalOutput::display_IP
static void display_IP(bool force=false)
Definition: esp3doutput.cpp:445
REPETIER4DV
#define REPETIER4DV
Definition: settings_esp3d.h:29
ESP_PRINTER_LCD_CLIENT
#define ESP_PRINTER_LCD_CLIENT
Definition: esp3doutput.h:26
ESP3DOutput::isOutput
static bool isOutput(uint8_t flag, bool fromsettings=false)
Definition: esp3doutput.cpp:78
ESP3DOutput::ESP3DOutput
ESP3DOutput(uint8_t client=0)
Definition: esp3doutput.cpp:48
SerialService::availableForWrite
uint availableForWrite()
Definition: serial_service.cpp:243
ESP3DOutput::availableforwrite
int availableforwrite()
Definition: esp3doutput.cpp:295
ESP3DOutput::printLN
size_t printLN(const char *s)
Definition: esp3doutput.cpp:165
MARLIN
#define MARLIN
Definition: settings_esp3d.h:30
SerialService::write
size_t write(uint8_t c)
Definition: serial_service.cpp:212
WebSocket_Server::write
size_t write(uint8_t c)
Definition: websocket_server.cpp:210
SMOOTHIEWARE
#define SMOOTHIEWARE
Definition: settings_esp3d.h:32
websocket_terminal_server
WebSocket_Server websocket_terminal_server
Definition: websocket_server.cpp:33
websocket_data_server
WebSocket_Server websocket_data_server
Definition: websocket_server.cpp:35
ESP_WEBSOCKET_TERMINAL_CLIENT
#define ESP_WEBSOCKET_TERMINAL_CLIENT
Definition: esp3doutput.h:25
Telnet_Server::flush
void flush()
Definition: telnet_server.cpp:314
WebSocket_Server::started
bool started()
Definition: websocket_server.h:74
ESP3DOutput::dispatch
size_t dispatch(uint8_t *sbuf, size_t len)
Definition: esp3doutput.cpp:87
Display::SetStatus
void SetStatus(const char *status)
settings_esp3d.h
Settings_ESP3D::GetFirmwareTarget
static uint8_t GetFirmwareTarget(bool fromsettings=false)
Definition: settings_esp3d.cpp:183
ESP_WEBSOCKET_CLIENT
#define ESP_WEBSOCKET_CLIENT
Definition: esp3doutput.h:29
BTService::availableForWrite
int availableForWrite()
Telnet_Server::started
bool started()
Definition: telnet_server.cpp:154
BTService::write
size_t write(uint8_t c)
telnet_server
Telnet_Server telnet_server
Definition: telnet_server.cpp:31
WebSocket_Server::availableForWrite
uint availableForWrite()
Definition: websocket_server.cpp:121
Telnet_Server::availableForWrite
uint availableForWrite()
Definition: telnet_server.cpp:272
ESP_OUTPUT_FLAG
#define ESP_OUTPUT_FLAG
Definition: settings_esp3d.h:54
REPETIER
#define REPETIER
Definition: settings_esp3d.h:33
ESP3DOutput::printMSG
size_t printMSG(const char *s, bool withNL=true)
Definition: esp3doutput.cpp:190
serial_service
SerialService serial_service
Definition: serial_service.cpp:42
ESP_SERIAL_CLIENT
#define ESP_SERIAL_CLIENT
Definition: esp3doutput.h:22
BTService::flush
void flush()
ESP3DGlobalOutput::display_progress
static void display_progress(uint8_t v)
Definition: esp3doutput.cpp:436
ESP3DOutput::printERROR
size_t printERROR(const char *s, int code_error=200)
Definition: esp3doutput.cpp:247
log_esp3d
#define log_esp3d(format,...)
Definition: debug_esp3d.h:29
ESP3DOutput::~ESP3DOutput
~ESP3DOutput()
Definition: esp3doutput.cpp:73
ESP3DOutput::client
uint8_t client()
Definition: esp3doutput.h:79
ESP_SCREEN_CLIENT
#define ESP_SCREEN_CLIENT
Definition: esp3doutput.h:28
ESP3DOutput::write
size_t write(uint8_t c)
Definition: esp3doutput.cpp:322
BTService::started
bool started()
Display::progress
void progress(uint8_t v)
Settings_ESP3D::read_byte
static uint8_t read_byte(int pos, bool *haserror=NULL)
Definition: settings_esp3d.cpp:715
ESP_ALL_CLIENTS
#define ESP_ALL_CLIENTS
Definition: esp3doutput.h:30
ESP3DOutput::flush
void flush()
Definition: esp3doutput.cpp:128
esp3d_display
Display esp3d_display
bt_service
BTService bt_service
Display::display_IP
bool display_IP(bool force=false)
Telnet_Server::write
size_t write(uint8_t c)
Definition: telnet_server.cpp:237
SerialService::flush
void flush()
Definition: serial_service.cpp:263
MARLINKIMBRA
#define MARLINKIMBRA
Definition: settings_esp3d.h:31
ESP_BT_CLIENT
#define ESP_BT_CLIENT
Definition: esp3doutput.h:27
esp3doutput.h
ESP_HTTP_CLIENT
#define ESP_HTTP_CLIENT
Definition: esp3doutput.h:24
ESP_TELNET_CLIENT
#define ESP_TELNET_CLIENT
Definition: esp3doutput.h:23
GRBL
#define GRBL
Definition: settings_esp3d.h:34
ESP3DGlobalOutput::SetStatus
static void SetStatus(const char *status)
Definition: esp3doutput.cpp:428