Skip to content

Commit

Permalink
You wouldn't believe this simple trick that freed 10 kB of RAM!
Browse files Browse the repository at this point in the history
  • Loading branch information
MightyPork committed Sep 9, 2017
1 parent 830ec07 commit 8d7419b
Show file tree
Hide file tree
Showing 9 changed files with 136 additions and 132 deletions.
3 changes: 1 addition & 2 deletions CMakeLists.txt
Expand Up @@ -110,8 +110,6 @@ set(SOURCE_FILES
user/serial.h
user/routes.c
user/routes.h
user/uart_asyncdrv.c-
user/uart_asyncdrv.h-
user/cgi_main.c
user/cgi_main.h
user/cgi_sockets.c
Expand Down Expand Up @@ -155,6 +153,7 @@ include_directories(esp_iot_sdk_v1.5.2/include)
add_definitions(
-D__ets__
-DICACHE_FLASH
-DUSE_OPTIMIZE_PRINTF=1
-DHTTPD_MAX_CONNECTIONS=5
-DHTTPD_STACKSIZE=1000
-DICACHE_FLASH_ATTR=
Expand Down
6 changes: 3 additions & 3 deletions esp_iot_sdk_v1.5.2/include/osapi.h
Expand Up @@ -35,9 +35,9 @@
#define os_snprintf ets_snprintf

#ifdef USE_OPTIMIZE_PRINTF
#define os_printf(fmt, ...) do { \
static const char flash_str[] ICACHE_RODATA_ATTR STORE_ATTR = fmt; \
os_printf_plus(flash_str, ##__VA_ARGS__); \
#define os_printf(fmt, ...) do { \
static const char flash_str[] ICACHE_RODATA_ATTR STORE_ATTR = fmt; \
os_printf_plus(flash_str, ##__VA_ARGS__); \
} while(0)
#else
#define os_printf os_printf_plus
Expand Down
4 changes: 3 additions & 1 deletion esphttpdconfig.mk
Expand Up @@ -54,4 +54,6 @@ GLOBAL_CFLAGS = \
-DHTTPD_MAX_POST_LEN=512 \
-DDEBUG_INPUT=0 \
-DDEBUG_HEAP=1 \
-DDEBUG_MALLOC=0
-DDEBUG_MALLOC=0 \
-mforce-l32 \
-DUSE_OPTIMIZE_PRINTF=1
239 changes: 121 additions & 118 deletions html_orig/js/app.js
Expand Up @@ -1609,135 +1609,138 @@ function tr(key) { return _tr[key] || '?'+key+'?'; }
w.startScanning = startScanning;
})(window.WiFi = {});
/** Handle connections */
var Conn = (function() {
var ws;
var heartbeatTout;
var pingIv;
var xoff = false;
var autoXoffTout;

function onOpen(evt) {
console.log("CONNECTED");
}

function onClose(evt) {
console.warn("SOCKET CLOSED, code "+evt.code+". Reconnecting...");
setTimeout(function() {
init();
}, 200);
// this happens when the buffer gets fucked up via invalid unicode.
// we basically use polling instead of socket then
}

function onMessage(evt) {
try {
// . = heartbeat
switch (evt.data.charAt(0)) {
case 'B':
case 'T':
case 'S':
Screen.load(evt.data);
break;

case '-':
//console.log('xoff');
xoff = true;
autoXoffTout = setTimeout(function(){xoff=false;}, 250);
break;

case '+':
//console.log('xon');
xoff = false;
clearTimeout(autoXoffTout);
break;
}
heartbeat();
} catch(e) {
console.error(e);
}
}
var Conn = (function () {
var ws;
var heartbeatTout;
var pingIv;
var xoff = false;
var autoXoffTout;
var reconTout;

var pageShown = false;

function onOpen(evt) {
console.log("CONNECTED");
doSend("i");
}

function canSend() {
return !xoff;
}
function onClose(evt) {
console.warn("SOCKET CLOSED, code " + evt.code + ". Reconnecting...");
clearTimeout(reconTout);
reconTout = setTimeout(function () {
init();
}, 2000);
// this happens when the buffer gets fucked up via invalid unicode.
// we basically use polling instead of socket then
}

function doSend(message) {
if (_demo) {
console.log("TX: ", message);
return true; // Simulate success
}
if (xoff) {
// TODO queue
console.log("Can't send, flood control.");
return false;
}
function onMessage(evt) {
try {
// . = heartbeat
switch (evt.data.charAt(0)) {
case 'B':
case 'T':
case 'S':
Screen.load(evt.data);
if(!pageShown) {
showPage();
pageShown = true;
}
break;

case '-':
//console.log('xoff');
xoff = true;
autoXoffTout = setTimeout(function () {
xoff = false;
}, 250);
break;

case '+':
//console.log('xon');
xoff = false;
clearTimeout(autoXoffTout);
break;
}
heartbeat();
} catch (e) {
console.error(e);
}
}

if (!ws) return false; // for dry testing
if (ws.readyState != 1) {
console.error("Socket not ready");
return false;
}
if (typeof message != "string") {
message = JSON.stringify(message);
}
ws.send(message);
return true;
}
function canSend() {
return !xoff;
}

function init() {
if (_demo) {
console.log("Demo mode!");
Screen.load(_demo_screen);
showPage();
return;
}
heartbeat();
function doSend(message) {
if (_demo) {
console.log("TX: ", message);
return true; // Simulate success
}
if (xoff) {
// TODO queue
console.log("Can't send, flood control.");
return false;
}

ws = new WebSocket("ws://"+_root+"/term/update.ws");
ws.onopen = onOpen;
ws.onclose = onClose;
ws.onmessage = onMessage;
if (!ws) return false; // for dry testing
if (ws.readyState != 1) {
console.error("Socket not ready");
return false;
}
if (typeof message != "string") {
message = JSON.stringify(message);
}
ws.send(message);
return true;
}

console.log("Opening socket.");
function init() {
if (_demo) {
console.log("Demo mode!");
Screen.load(_demo_screen);
showPage();
return;
}

// Ask for initial data
$.get('http://'+_root+'/term/init', function(resp, status) {
if (status !== 200) location.reload(true);
console.log("Data received!");
Screen.load(resp);
heartbeat();
clearTimeout(reconTout);
clearTimeout(heartbeatTout);

showPage();
});
}
ws = new WebSocket("ws://" + _root + "/term/update.ws");
ws.onopen = onOpen;
ws.onclose = onClose;
ws.onmessage = onMessage;
console.log("Opening socket.");
heartbeat();
}

function heartbeat() {
clearTimeout(heartbeatTout);
heartbeatTout = setTimeout(heartbeatFail, 2000);
}
function heartbeat() {
clearTimeout(heartbeatTout);
heartbeatTout = setTimeout(heartbeatFail, 2000);
}

function heartbeatFail() {
console.error("Heartbeat lost, probing server...");
pingIv = setInterval(function() {
console.log("> ping");
$.get('http://'+_root+'/system/ping', function(resp, status) {
if (status == 200) {
clearInterval(pingIv);
console.info("Server ready, reloading page...");
location.reload();
}
}, {
timeout: 100,
});
}, 500);
}
function heartbeatFail() {
console.error("Heartbeat lost, probing server...");
pingIv = setInterval(function () {
console.log("> ping");
$.get('http://' + _root + '/system/ping', function (resp, status) {
if (status == 200) {
clearInterval(pingIv);
console.info("Server ready, reloading page...");
location.reload();
}
}, {
timeout: 100,
});
}, 1000);
}

return {
ws: null,
init: init,
send: doSend,
canSend: canSend, // check flood control
};
return {
ws: null,
init: init,
send: doSend,
canSend: canSend, // check flood control
};
})();
/**
* User input
Expand Down
2 changes: 1 addition & 1 deletion libesphttpd
4 changes: 2 additions & 2 deletions user/apars_csi.c
Expand Up @@ -760,15 +760,15 @@ do_csi_xterm_screen_cmd(CSI_Data *opts)

// data tables for the DECREPTPARM command response
struct DECREPTPARM_parity { int parity; const char * msg; };
static const struct DECREPTPARM_parity DECREPTPARM_parity_arr[] = {
static const struct DECREPTPARM_parity DECREPTPARM_parity_arr[] ESP_CONST_DATA = {
{PARITY_NONE, "1"},
{PARITY_ODD, "4"},
{PARITY_EVEN, "5"},
{-1, 0}
};

struct DECREPTPARM_baud { int baud; const char * msg; };
static const struct DECREPTPARM_baud DECREPTPARM_baud_arr[] = {
static const struct DECREPTPARM_baud DECREPTPARM_baud_arr[] ESP_CONST_DATA = {
{BIT_RATE_300, "48"},
{BIT_RATE_600, "56"},
{BIT_RATE_1200, "64"},
Expand Down
6 changes: 3 additions & 3 deletions user/character_sets.h
Expand Up @@ -12,7 +12,7 @@
#define CODEPAGE_A_BEGIN 35
#define CODEPAGE_A_END 35

static const u16 codepage_A[] =
static const u16 codepage_A[] ESP_CONST_DATA =
{// Unicode ASCII SYM
// %%BEGIN:A%%
0x20a4, // 35 # £
Expand All @@ -26,7 +26,7 @@ static const u16 codepage_A[] =
* translates VT100 ACS escape codes to Unicode values.
* Based on rxvt-unicode screen.C table.
*/
static const u16 codepage_0[] =
static const u16 codepage_0[] ESP_CONST_DATA =
{// Unicode ASCII SYM
// %%BEGIN:0%%
0x2666, // 96 ` ♦
Expand Down Expand Up @@ -66,7 +66,7 @@ static const u16 codepage_0[] =
#define CODEPAGE_1_BEGIN 33
#define CODEPAGE_1_END 126

static const u16 codepage_1[] =
static const u16 codepage_1[] ESP_CONST_DATA =
{// Unicode ASCII SYM DOS
// %%BEGIN:1%%
0x263A, // 33 ! ☺ (1) - low ASCII symbols from DOS, moved to +32
Expand Down
2 changes: 1 addition & 1 deletion user/routes.c
Expand Up @@ -22,7 +22,7 @@ static int wifiPassFn(HttpdConnData *connData, int no, char *user, int userLen,
/**
* Application routes
*/
HttpdBuiltInUrl routes[] = {
const HttpdBuiltInUrl routes[] ESP_CONST_DATA = {
// redirect func for the captive portal
ROUTE_CGI_ARG("*", cgiRedirectApClientToHostname, "esp-terminal.ap"),

Expand Down
2 changes: 1 addition & 1 deletion user/routes.h
Expand Up @@ -4,7 +4,7 @@
#include <esp8266.h>
#include <httpd.h>

extern HttpdBuiltInUrl routes[];
extern const HttpdBuiltInUrl routes[];

/** Broadcast screen state to sockets */
void screen_notifyChange();
Expand Down

0 comments on commit 8d7419b

Please sign in to comment.