Statistics: Posted by jcmvbkbc — Wed Oct 18, 2017 2:01 pm
Statistics: Posted by smbgaiden — Wed Oct 18, 2017 8:23 am
Code:
//send formatted output to send buffer
sint8 ICACHE_FLASH_ATTR espbuffsentprintf(serverConnData *conn, const char *format, ...) {
uint16 len;
va_list al;
va_start(al, format);
len = ets_vsnprintf(conn->txbuffer + conn->txbufferlen, MAX_TXBUFFER - conn->txbufferlen - 1, format, al);
va_end(al);
if (len <0) {
os_printf("espbuffsentprintf: txbuffer full on conn %p\n", conn);
return len;
}
conn->txbufferlen += len;
if (conn->readytosend)
return sendtxbuffer(conn);
return ESPCONN_OK;
}
Statistics: Posted by Peter — Wed Jan 21, 2015 6:29 am
Code:
#include <stdarg.h>
int ets_vsprintf(char *str, const char *format, va_list argptr);
int ets_vsnprintf(char *buffer, size_t sizeOfBuffer, const char *format, va_list argptr);
Code:
//send formatted output through espbuffsent
sint8 ICACHE_FLASH_ATTR espbuffsentprintf(serverConnData *conn, const char *format, ...) {
#define MaxBuff 1024
char buffer[MaxBuff]; uint16 len;
va_list al;
va_start(al, format);
len = ets_vsnprintf(buffer, MaxBuff-1, format, al);
va_end(al);
if (len >= 0)
return espbuffsent(conn, buffer, len);
else
return len;
}
Code:
static char txbuffer[MAX_CONN][MAX_TXBUFFER];
serverConnData connData[MAX_CONN];
//send all data in conn->txbuffer
//returns result from espconn_sent if data in buffer or ESPCONN_OK (0)
//only internal used by espbuffsent, serverSentCb
static sint8 ICACHE_FLASH_ATTR sendtxbuffer(serverConnData *conn) {
sint8 result = ESPCONN_OK;
if (conn->txbufferlen != 0) {
conn->readytosend = false;
result= espconn_sent(conn->conn, (uint8_t*)conn->txbuffer, conn->txbufferlen);
conn->txbufferlen = 0;
if (result != ESPCONN_OK)
os_printf("sendtxbuffer: espconn_sent error %d on conn %p\n", result, conn);
}
return result;
}
//send string through espbuffsent
sint8 ICACHE_FLASH_ATTR espbuffsentstring(serverConnData *conn, const char *data) {
return espbuffsent(conn, data, strlen(data));
}
//use espbuffsent instead of espconn_sent
//It solve problem: the next espconn_sent must after espconn_sent_callback of the pre-packet.
//Add data to the send buffer and send if previous send was completed it call sendtxbuffer and espconn_sent
//Returns ESPCONN_OK (0) for success, -128 if buffer is full or error from espconn_sent
sint8 ICACHE_FLASH_ATTR espbuffsent(serverConnData *conn, const char *data, uint16 len) {
if (conn->txbufferlen + len > MAX_TXBUFFER) {
os_printf("espbuffsent: txbuffer full on conn %p\n", conn);
return -128;
}
os_memcpy(conn->txbuffer + conn->txbufferlen, data, len);
conn->txbufferlen += len;
if (conn->readytosend)
return sendtxbuffer(conn);
return ESPCONN_OK;
}
//callback after the data are sent
static void ICACHE_FLASH_ATTR serverSentCb(void *arg) {
serverConnData *conn = serverFindConnData(arg);
//os_printf("Sent callback on conn %p\n", conn);
if (conn==NULL) return;
conn->readytosend = true;
sendtxbuffer(conn); // send possible new data in txbuffer
}
void ICACHE_FLASH_ATTR serverInit(int port) {
int i;
for (i = 0; i < MAX_CONN; i++) {
connData[i].conn = NULL;
connData[i].txbuffer = txbuffer[i];
connData[i].txbufferlen = 0;
connData[i].readytosend = true;
}
serverConn.type=ESPCONN_TCP;
serverConn.state=ESPCONN_NONE;
serverTcp.local_port=port;
serverConn.proto.tcp=&serverTcp;
espconn_regist_connectcb(&serverConn, serverConnectCb);
espconn_accept(&serverConn);
espconn_regist_time(&serverConn, SERVER_TIMEOUT, 0);
}
with
#define MAX_TXBUFFER 1024
struct serverConnData {
struct espconn *conn;
char *txbuffer; //the buffer for the data to send
uint16 txbufferlen; //the length of data in txbuffer
bool readytosend; //true, if txbuffer can send by espconn_sent
};
Statistics: Posted by Peter — Wed Jan 21, 2015 5:55 am
Statistics: Posted by jcmvbkbc — Tue Jan 20, 2015 7:53 pm
Code:
typedef char * va_list;
int ets_vsprintf(char *str, const char *format, va_list argptr);
int ets_vsnprintf(char *buffer, size_t sizeOfBuffer, size_t count, const char *format, va_list argptr);
Statistics: Posted by Peter — Tue Jan 20, 2015 4:06 pm
Peter wrote:
I want use it inCode:
sint8 ICACHE_FLASH_ATTR espconn_printf(serverConnData *conn, const char *format, ...) {
#define MaxBuff 256
char buffer[MaxBuff]; uint16 len;
len = ets_vsprintf(buffer, format, (char *) ((&format)+1));
//or
len = ets_vsnprintf(buffer, MaxBuff, MaxBuff-1, format, (char *) ((&format)+1));
...
later: write to buffer and call espconn_sent after serverSentCb.
But both call crashed: Fatal exception (28) with reboot.
How can I use ets_vsprintf , ets_vsnprintf ?
Code:
sint8 ICACHE_FLASH_ATTR espconn_printf(serverConnData *conn, const char *format, ...) {
#define MaxBuff 256
char buffer[MaxBuff]; uint16 len;
va_list al;
va_start(al, format);
len = ets_vsprintf(buffer, format, al);
va_end(al);
Statistics: Posted by jcmvbkbc — Tue Jan 20, 2015 11:27 am
Code:
sint8 ICACHE_FLASH_ATTR espconn_printf(serverConnData *conn, const char *format, ...) {
#define MaxBuff 256
char buffer[MaxBuff]; uint16 len;
len = ets_vsprintf(buffer, format, (char *) ((&format)+1));
//or
len = ets_vsnprintf(buffer, MaxBuff, MaxBuff-1, format, (char *) ((&format)+1));
Statistics: Posted by Peter — Tue Jan 20, 2015 11:04 am