ESP3D Lib  1.0
3D Printer WiFi Library
serial2socket.cpp
Go to the documentation of this file.
1 /*
2  serial2socket.cpp - serial 2 socket 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 
22 #ifdef ARDUINO_ARCH_ESP32
23 
24 #include "esplibconfig.h"
25 
26 #if ENABLED(ESP3D_WIFISUPPORT)
27 #include "serial2socket.h"
28 #include "wificonfig.h"
29 #include <WebSocketsServer.h>
30 #include <WiFi.h>
32 
33 
35  _web_socket = NULL;
36  _TXbufferSize = 0;
37  _RXbufferSize = 0;
38  _RXbufferpos = 0;
39 }
41  if (_web_socket) detachWS();
42  _TXbufferSize = 0;
43  _RXbufferSize = 0;
44  _RXbufferpos = 0;
45 }
46 void Serial_2_Socket::begin(long speed){
47  _TXbufferSize = 0;
48  _RXbufferSize = 0;
49  _RXbufferpos = 0;
50 }
51 
53  _TXbufferSize = 0;
54  _RXbufferSize = 0;
55  _RXbufferpos = 0;
56 }
57 
59  return 0;
60 }
61 
62 bool Serial_2_Socket::attachWS(void * web_socket){
63  if (web_socket) {
64  _web_socket = web_socket;
65  _TXbufferSize=0;
66  return true;
67  }
68  return false;
69 }
70 
72  _web_socket = NULL;
73  return true;
74 }
75 
76 Serial_2_Socket::operator bool() const
77 {
78  return true;
79 }
81  return _RXbufferSize;
82 }
83 
84 
85 size_t Serial_2_Socket::write(uint8_t c)
86 {
87  if(!_web_socket) return 0;
88  write(&c,1);
89  return 1;
90 }
91 
92 size_t Serial_2_Socket::write(const uint8_t *buffer, size_t size)
93 {
94  if((buffer == NULL) ||(!_web_socket)) {
95  if(buffer == NULL)log_i("[SOCKET]No buffer");
96  if(!_web_socket)log_i("[SOCKET]No socket");
97  return 0;
98  }
99 #if defined(ENABLE_SERIAL2SOCKET_OUT)
100  if (_TXbufferSize==0)_lastflush = millis();
101  //send full line
102  if (_TXbufferSize + size > TXBUFFERSIZE) flush();
103  //need periodic check to force to flush in case of no end
104  for (int i = 0; i < size;i++){
105  _TXbuffer[_TXbufferSize] = buffer[i];
106  _TXbufferSize++;
107  }
108  log_i("[SOCKET]buffer size %d",_TXbufferSize);
109  handle_flush();
110 #endif
111  return size;
112 }
113 
114 int Serial_2_Socket::peek(void){
115  if (_RXbufferSize > 0)return _RXbuffer[_RXbufferpos];
116  else return -1;
117 }
118 
119 bool Serial_2_Socket::push (const char * data){
120 #if defined(ENABLE_SERIAL2SOCKET_IN)
121  int data_size = strlen(data);
122  if ((data_size + _RXbufferSize) <= RXBUFFERSIZE){
123  int current = _RXbufferpos + _RXbufferSize;
124  if (current > RXBUFFERSIZE) current = current - RXBUFFERSIZE;
125  for (int i = 0; i < data_size; i++){
126  if (current > (RXBUFFERSIZE-1)) current = 0;
127  _RXbuffer[current] = data[i];
128  current ++;
129  }
130  _RXbufferSize+=strlen(data);
131  return true;
132  }
133  return false;
134 #else
135  return true;
136 #endif
137 }
138 
139 int Serial_2_Socket::read(void){
140  if (_RXbufferSize > 0) {
141  int v = _RXbuffer[_RXbufferpos];
142  _RXbufferpos++;
143  if (_RXbufferpos > (RXBUFFERSIZE-1))_RXbufferpos = 0;
144  _RXbufferSize--;
145  return v;
146  } else return -1;
147 }
148 
150  if (_TXbufferSize > 0) {
151  if ((_TXbufferSize>=TXBUFFERSIZE) || ((millis()- _lastflush) > FLUSHTIMEOUT)) {
152  log_i("[SOCKET]need flush, buffer size %d",_TXbufferSize);
153  flush();
154  }
155  }
156 }
157 void Serial_2_Socket::flush(void){
158  if (_TXbufferSize > 0){
159  log_i("[SOCKET]flush data, buffer size %d",_TXbufferSize);
160  ((WebSocketsServer *)_web_socket)->broadcastBIN(_TXbuffer,_TXbufferSize);
161  //refresh timout
162  _lastflush = millis();
163  //reset buffer
164  _TXbufferSize = 0;
165  }
166 }
167 
168 #endif // ENABLE_WIFI
169 
170 #endif // ARDUINO_ARCH_ESP32
Serial_2_Socket::begin
void begin(long speed)
Serial_2_Socket::attachWS
bool attachWS(void *web_socket)
Serial_2_Socket::read
int read(void)
Serial_2_Socket::handle_flush
void handle_flush()
Serial_2_Socket::end
void end()
Serial_2_Socket::detachWS
bool detachWS()
Serial_2_Socket
Definition: serial2socket.h:29
Serial_2_Socket::push
bool push(const char *data)
Serial_2_Socket::available
int available()
esplibconfig.h
RXBUFFERSIZE
#define RXBUFFERSIZE
Definition: serial2socket.h:27
Serial_2_Socket::flush
void flush(void)
serial2socket.h
wificonfig.h
Serial_2_Socket::~Serial_2_Socket
~Serial_2_Socket()
Serial2Socket
Serial_2_Socket Serial2Socket
TXBUFFERSIZE
#define TXBUFFERSIZE
Definition: serial2socket.h:26
Serial_2_Socket::Serial_2_Socket
Serial_2_Socket()
Serial_2_Socket::write
size_t write(uint8_t c)
Serial_2_Socket::peek
int peek(void)
Serial_2_Socket::baudRate
long baudRate()
FLUSHTIMEOUT
#define FLUSHTIMEOUT
Definition: serial2socket.h:28