Merge remote-tracking branch 'upstream/dev' into dev
This commit is contained in:
commit
6f7fa2641c
|
@ -291,11 +291,6 @@ uart_init(UartBautRate uart0_br, UartBautRate uart1_br, os_signal_t sig_input)
|
|||
UartDev.baut_rate = uart1_br;
|
||||
uart_config(UART1);
|
||||
ETS_UART_INTR_ENABLE();
|
||||
|
||||
// install uart1 putc callback
|
||||
#ifndef NODE_DEBUG
|
||||
os_install_putc1((void *)uart1_write_char);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ICACHE_FLASH_ATTR
|
||||
|
|
|
@ -30,10 +30,10 @@
|
|||
// UCG_DISPLAY_TABLE_ENTRY(ili9163_18x128x128_hw_spi, ucg_dev_ili9163_18x128x128, ucg_ext_ili9163_18) \
|
||||
// UCG_DISPLAY_TABLE_ENTRY(ili9341_18x240x320_hw_spi, ucg_dev_ili9341_18x240x320, ucg_ext_ili9341_18) \
|
||||
// UCG_DISPLAY_TABLE_ENTRY(pcf8833_16x132x132_hw_spi, ucg_dev_pcf8833_16x132x132, ucg_ext_pcf8833_16) \
|
||||
// UCG_DISPLAY_TABLE_ENTRY(seps225_16x128x128_univision_hw_spi, ucg_dev_seps225_16x128x128_univision, ucg_ext_seps225_16) \
|
||||
// UCG_DISPLAY_TABLE_ENTRY(seps225_16x128x128_uvis_hw_spi, ucg_dev_seps225_16x128x128_univision, ucg_ext_seps225_16) \
|
||||
// UCG_DISPLAY_TABLE_ENTRY(ssd1351_18x128x128_hw_spi, ucg_dev_ssd1351_18x128x128_ilsoft, ucg_ext_ssd1351_18) \
|
||||
// UCG_DISPLAY_TABLE_ENTRY(ssd1351_18x128x128_ft_hw_spi, ucg_dev_ssd1351_18x128x128_ft, ucg_ext_ssd1351_18) \
|
||||
// UCG_DISPLAY_TABLE_ENTRY(ssd1331_18x96x64_univision_hw_spi, ucg_dev_ssd1331_18x96x64_univision, ucg_ext_ssd1331_18) \
|
||||
// UCG_DISPLAY_TABLE_ENTRY(ssd1331_18x96x64_uvis_hw_spi, ucg_dev_ssd1331_18x96x64_univision, ucg_ext_ssd1331_18) \
|
||||
// UCG_DISPLAY_TABLE_ENTRY(st7735_18x128x160_hw_spi, ucg_dev_st7735_18x128x160, ucg_ext_st7735_18) \
|
||||
|
||||
#define UCG_DISPLAY_TABLE_ENTRY(binding, device, extension)
|
||||
|
|
|
@ -16,7 +16,20 @@
|
|||
#define ESP_INIT_DATA_ENABLE_READVDD33
|
||||
//#define ESP_INIT_DATA_ENABLE_READADC
|
||||
//#define ESP_INIT_DATA_FIXED_VDD33_VALUE 33
|
||||
//
|
||||
|
||||
// This adds the asserts in LUA. It also adds some useful extras to the
|
||||
// node module. This is all silent in normal operation and so can be enabled
|
||||
// without any harm (except for the code size increase and slight slowdown)
|
||||
//#define DEVELOPMENT_TOOLS
|
||||
|
||||
#ifdef DEVELOPMENT_TOOLS
|
||||
extern void luaL_assertfail(const char *file, int line, const char *message);
|
||||
#define lua_assert(x) ((x) ? (void) 0 : luaL_assertfail(__FILE__, __LINE__, #x))
|
||||
#endif
|
||||
|
||||
// This enables lots of debug output and changes the serial bit rate. This
|
||||
// is normally only used by hardcore developers
|
||||
// #define DEVELOP_VERSION
|
||||
#ifdef DEVELOP_VERSION
|
||||
#define NODE_DEBUG
|
||||
|
|
|
@ -806,6 +806,9 @@ static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
|
|||
return nptr;
|
||||
}
|
||||
|
||||
LUALIB_API void luaL_assertfail(const char *file, int line, const char *message) {
|
||||
c_printf("ASSERT@%s(%d): %s\n", file, line, message);
|
||||
}
|
||||
|
||||
static int panic (lua_State *L) {
|
||||
(void)L; /* to avoid warnings */
|
||||
|
|
|
@ -100,7 +100,7 @@ LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p,
|
|||
LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx,
|
||||
const char *fname, int szhint);
|
||||
|
||||
|
||||
LUALIB_API void luaL_assertfail(const char *file, int line, const char *message);
|
||||
|
||||
|
||||
/*
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -62,6 +62,7 @@ typedef struct lmqtt_userdata
|
|||
int cb_disconnect_ref;
|
||||
int cb_message_ref;
|
||||
int cb_suback_ref;
|
||||
int cb_unsuback_ref;
|
||||
int cb_puback_ref;
|
||||
mqtt_state_t mqtt_state;
|
||||
mqtt_connect_info_t connect_info;
|
||||
|
@ -124,10 +125,8 @@ static void mqtt_socket_disconnected(void *arg) // tcp only
|
|||
mud->pesp_conn = NULL;
|
||||
}
|
||||
|
||||
if(mud->self_ref != LUA_NOREF){ // TODO: should we unref the client and delete it?
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->self_ref);
|
||||
mud->self_ref = LUA_NOREF; // unref this, and the mqtt.socket userdata will delete it self
|
||||
}
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->self_ref);
|
||||
mud->self_ref = LUA_NOREF; // unref this, and the mqtt.socket userdata will delete it self
|
||||
}
|
||||
|
||||
if(call_back){
|
||||
|
@ -363,6 +362,14 @@ READPACKET:
|
|||
if(pending_msg && pending_msg->msg_type == MQTT_MSG_TYPE_UNSUBSCRIBE && pending_msg->msg_id == msg_id){
|
||||
NODE_DBG("MQTT: UnSubscribe successful\r\n");
|
||||
msg_destroy(msg_dequeue(&(mud->mqtt_state.pending_msg_q)));
|
||||
|
||||
if (mud->cb_unsuback_ref == LUA_NOREF)
|
||||
break;
|
||||
if (mud->self_ref == LUA_NOREF)
|
||||
break;
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, mud->cb_unsuback_ref);
|
||||
lua_rawgeti(L, LUA_REGISTRYINDEX, mud->self_ref);
|
||||
lua_call(L, 1, 0);
|
||||
}
|
||||
break;
|
||||
case MQTT_MSG_TYPE_PUBLISH:
|
||||
|
@ -823,35 +830,21 @@ static int mqtt_delete( lua_State* L )
|
|||
// -------
|
||||
|
||||
// free (unref) callback ref
|
||||
if(LUA_NOREF!=mud->cb_connect_ref){
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_ref);
|
||||
mud->cb_connect_ref = LUA_NOREF;
|
||||
}
|
||||
if(LUA_NOREF!=mud->cb_connect_fail_ref){
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_fail_ref);
|
||||
mud->cb_connect_fail_ref = LUA_NOREF;
|
||||
}
|
||||
if(LUA_NOREF!=mud->cb_disconnect_ref){
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_disconnect_ref);
|
||||
mud->cb_disconnect_ref = LUA_NOREF;
|
||||
}
|
||||
if(LUA_NOREF!=mud->cb_message_ref){
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_message_ref);
|
||||
mud->cb_message_ref = LUA_NOREF;
|
||||
}
|
||||
if(LUA_NOREF!=mud->cb_suback_ref){
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_suback_ref);
|
||||
mud->cb_suback_ref = LUA_NOREF;
|
||||
}
|
||||
if(LUA_NOREF!=mud->cb_puback_ref){
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_puback_ref);
|
||||
mud->cb_puback_ref = LUA_NOREF;
|
||||
}
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_ref);
|
||||
mud->cb_connect_ref = LUA_NOREF;
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_fail_ref);
|
||||
mud->cb_connect_fail_ref = LUA_NOREF;
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_disconnect_ref);
|
||||
mud->cb_disconnect_ref = LUA_NOREF;
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_message_ref);
|
||||
mud->cb_message_ref = LUA_NOREF;
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_suback_ref);
|
||||
mud->cb_suback_ref = LUA_NOREF;
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_puback_ref);
|
||||
mud->cb_puback_ref = LUA_NOREF;
|
||||
lua_gc(L, LUA_GCSTOP, 0);
|
||||
if(LUA_NOREF!=mud->self_ref){
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->self_ref);
|
||||
mud->self_ref = LUA_NOREF;
|
||||
}
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->self_ref);
|
||||
mud->self_ref = LUA_NOREF;
|
||||
lua_gc(L, LUA_GCRESTART, 0);
|
||||
NODE_DBG("leave mqtt_delete.\n");
|
||||
return 0;
|
||||
|
@ -1060,8 +1053,7 @@ static int mqtt_socket_connect( lua_State* L )
|
|||
// call back function when a connection is obtained, tcp only
|
||||
if ((stack<=top) && (lua_type(L, stack) == LUA_TFUNCTION || lua_type(L, stack) == LUA_TLIGHTFUNCTION)){
|
||||
lua_pushvalue(L, stack); // copy argument (func) to the top of stack
|
||||
if(mud->cb_connect_ref != LUA_NOREF)
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_ref);
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_ref);
|
||||
mud->cb_connect_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
stack++;
|
||||
}
|
||||
|
@ -1069,15 +1061,13 @@ static int mqtt_socket_connect( lua_State* L )
|
|||
// call back function when a connection fails
|
||||
if ((stack<=top) && (lua_type(L, stack) == LUA_TFUNCTION || lua_type(L, stack) == LUA_TLIGHTFUNCTION)){
|
||||
lua_pushvalue(L, stack); // copy argument (func) to the top of stack
|
||||
if(mud->cb_connect_fail_ref != LUA_NOREF)
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_fail_ref);
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_fail_ref);
|
||||
mud->cb_connect_fail_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
stack++;
|
||||
}
|
||||
|
||||
lua_pushvalue(L, 1); // copy userdata to the top of stack
|
||||
if(mud->self_ref != LUA_NOREF)
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->self_ref);
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->self_ref);
|
||||
mud->self_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
|
||||
espconn_status = espconn_regist_connectcb(pesp_conn, mqtt_socket_connected);
|
||||
|
@ -1182,16 +1172,13 @@ static int mqtt_socket_on( lua_State* L )
|
|||
lua_pushvalue(L, 3); // copy argument (func) to the top of stack
|
||||
|
||||
if( sl == 7 && c_strcmp(method, "connect") == 0){
|
||||
if(mud->cb_connect_ref != LUA_NOREF)
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_ref);
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_connect_ref);
|
||||
mud->cb_connect_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
}else if( sl == 7 && c_strcmp(method, "offline") == 0){
|
||||
if(mud->cb_disconnect_ref != LUA_NOREF)
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_disconnect_ref);
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_disconnect_ref);
|
||||
mud->cb_disconnect_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
}else if( sl == 7 && c_strcmp(method, "message") == 0){
|
||||
if(mud->cb_message_ref != LUA_NOREF)
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_message_ref);
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_message_ref);
|
||||
mud->cb_message_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
}else{
|
||||
lua_pop(L, 1);
|
||||
|
@ -1201,6 +1188,118 @@ static int mqtt_socket_on( lua_State* L )
|
|||
return 0;
|
||||
}
|
||||
|
||||
// Lua: bool = mqtt:unsubscribe(topic, function())
|
||||
static int mqtt_socket_unsubscribe( lua_State* L ) {
|
||||
NODE_DBG("enter mqtt_socket_unsubscribe.\n");
|
||||
|
||||
uint8_t stack = 1;
|
||||
uint16_t msg_id = 0;
|
||||
const char *topic;
|
||||
size_t il;
|
||||
lmqtt_userdata *mud;
|
||||
|
||||
mud = (lmqtt_userdata *) luaL_checkudata( L, stack, "mqtt.socket" );
|
||||
luaL_argcheck( L, mud, stack, "mqtt.socket expected" );
|
||||
stack++;
|
||||
|
||||
if(mud==NULL){
|
||||
NODE_DBG("userdata is nil.\n");
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(mud->pesp_conn == NULL){
|
||||
NODE_DBG("mud->pesp_conn is NULL.\n");
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(!mud->connected){
|
||||
luaL_error( L, "not connected" );
|
||||
lua_pushboolean(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8_t temp_buffer[MQTT_BUF_SIZE];
|
||||
mqtt_msg_init(&mud->mqtt_state.mqtt_connection, temp_buffer, MQTT_BUF_SIZE);
|
||||
mqtt_message_t *temp_msg = NULL;
|
||||
|
||||
if( lua_istable( L, stack ) ) {
|
||||
NODE_DBG("unsubscribe table\n");
|
||||
lua_pushnil( L ); /* first key */
|
||||
|
||||
int topic_count = 0;
|
||||
uint8_t overflow = 0;
|
||||
|
||||
while( lua_next( L, stack ) != 0 ) {
|
||||
topic = luaL_checkstring( L, -2 );
|
||||
|
||||
if (topic_count == 0) {
|
||||
temp_msg = mqtt_msg_unsubscribe_init( &mud->mqtt_state.mqtt_connection, &msg_id );
|
||||
}
|
||||
temp_msg = mqtt_msg_unsubscribe_topic( &mud->mqtt_state.mqtt_connection, topic );
|
||||
topic_count++;
|
||||
|
||||
NODE_DBG("topic: %s - length: %d\n", topic, temp_msg->length);
|
||||
|
||||
if (temp_msg->length == 0) {
|
||||
lua_pop(L, 1);
|
||||
overflow = 1;
|
||||
break; // too long message for the outbuffer.
|
||||
}
|
||||
|
||||
lua_pop( L, 1 );
|
||||
}
|
||||
|
||||
if (topic_count == 0){
|
||||
return luaL_error( L, "no topics found" );
|
||||
}
|
||||
if (overflow != 0){
|
||||
return luaL_error( L, "buffer overflow, can't enqueue all unsubscriptions" );
|
||||
}
|
||||
|
||||
temp_msg = mqtt_msg_unsubscribe_fini( &mud->mqtt_state.mqtt_connection );
|
||||
if (temp_msg->length == 0) {
|
||||
return luaL_error( L, "buffer overflow, can't enqueue all unsubscriptions" );
|
||||
}
|
||||
|
||||
stack++;
|
||||
} else {
|
||||
NODE_DBG("unsubscribe string\n");
|
||||
topic = luaL_checklstring( L, stack, &il );
|
||||
stack++;
|
||||
if( topic == NULL ){
|
||||
return luaL_error( L, "need topic name" );
|
||||
}
|
||||
temp_msg = mqtt_msg_unsubscribe( &mud->mqtt_state.mqtt_connection, topic, &msg_id );
|
||||
}
|
||||
|
||||
if( lua_type( L, stack ) == LUA_TFUNCTION || lua_type( L, stack ) == LUA_TLIGHTFUNCTION ) { // TODO: this will overwrite the previous one.
|
||||
lua_pushvalue( L, stack ); // copy argument (func) to the top of stack
|
||||
luaL_unref( L, LUA_REGISTRYINDEX, mud->cb_unsuback_ref );
|
||||
mud->cb_unsuback_ref = luaL_ref( L, LUA_REGISTRYINDEX );
|
||||
}
|
||||
|
||||
msg_queue_t *node = msg_enqueue( &(mud->mqtt_state.pending_msg_q), temp_msg,
|
||||
msg_id, MQTT_MSG_TYPE_UNSUBSCRIBE, (int)mqtt_get_qos(temp_msg->data) );
|
||||
|
||||
NODE_DBG("topic: %s - id: %d - qos: %d, length: %d\n", topic, node->msg_id, node->publish_qos, node->msg.length);
|
||||
NODE_DBG("msg_size: %d, event_timeout: %d\n", msg_size(&(mud->mqtt_state.pending_msg_q)), mud->event_timeout);
|
||||
|
||||
sint8 espconn_status = ESPCONN_IF;
|
||||
|
||||
espconn_status = mqtt_send_if_possible(mud->pesp_conn);
|
||||
|
||||
if(!node || espconn_status != ESPCONN_OK){
|
||||
lua_pushboolean(L, 0);
|
||||
} else {
|
||||
lua_pushboolean(L, 1); // enqueued succeed.
|
||||
}
|
||||
NODE_DBG("unsubscribe, queue size: %d\n", msg_size(&(mud->mqtt_state.pending_msg_q)));
|
||||
NODE_DBG("leave mqtt_socket_unsubscribe.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Lua: bool = mqtt:subscribe(topic, qos, function())
|
||||
static int mqtt_socket_subscribe( lua_State* L ) {
|
||||
NODE_DBG("enter mqtt_socket_subscribe.\n");
|
||||
|
@ -1292,8 +1391,7 @@ static int mqtt_socket_subscribe( lua_State* L ) {
|
|||
|
||||
if( lua_type( L, stack ) == LUA_TFUNCTION || lua_type( L, stack ) == LUA_TLIGHTFUNCTION ) { // TODO: this will overwrite the previous one.
|
||||
lua_pushvalue( L, stack ); // copy argument (func) to the top of stack
|
||||
if( mud->cb_suback_ref != LUA_NOREF )
|
||||
luaL_unref( L, LUA_REGISTRYINDEX, mud->cb_suback_ref );
|
||||
luaL_unref( L, LUA_REGISTRYINDEX, mud->cb_suback_ref );
|
||||
mud->cb_suback_ref = luaL_ref( L, LUA_REGISTRYINDEX );
|
||||
}
|
||||
|
||||
|
@ -1368,8 +1466,7 @@ static int mqtt_socket_publish( lua_State* L )
|
|||
|
||||
if (lua_type(L, stack) == LUA_TFUNCTION || lua_type(L, stack) == LUA_TLIGHTFUNCTION){
|
||||
lua_pushvalue(L, stack); // copy argument (func) to the top of stack
|
||||
if(mud->cb_puback_ref != LUA_NOREF)
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_puback_ref);
|
||||
luaL_unref(L, LUA_REGISTRYINDEX, mud->cb_puback_ref);
|
||||
mud->cb_puback_ref = luaL_ref(L, LUA_REGISTRYINDEX);
|
||||
}
|
||||
|
||||
|
@ -1475,6 +1572,7 @@ static const LUA_REG_TYPE mqtt_socket_map[] = {
|
|||
{ LSTRKEY( "close" ), LFUNCVAL( mqtt_socket_close ) },
|
||||
{ LSTRKEY( "publish" ), LFUNCVAL( mqtt_socket_publish ) },
|
||||
{ LSTRKEY( "subscribe" ), LFUNCVAL( mqtt_socket_subscribe ) },
|
||||
{ LSTRKEY( "unsubscribe" ), LFUNCVAL( mqtt_socket_unsubscribe ) },
|
||||
{ LSTRKEY( "lwt" ), LFUNCVAL( mqtt_socket_lwt ) },
|
||||
{ LSTRKEY( "on" ), LFUNCVAL( mqtt_socket_on ) },
|
||||
{ LSTRKEY( "__gc" ), LFUNCVAL( mqtt_delete ) },
|
||||
|
|
|
@ -604,6 +604,20 @@ static int node_egc_setmode(lua_State* L) {
|
|||
legc_set_mode( L, mode, limit );
|
||||
return 0;
|
||||
}
|
||||
//
|
||||
// Lua: osprint(true/false)
|
||||
// Allows you to turn on the native Espressif SDK printing
|
||||
static int node_osprint( lua_State* L )
|
||||
{
|
||||
if (lua_toboolean(L, 1)) {
|
||||
system_set_os_print(1);
|
||||
} else {
|
||||
system_set_os_print(0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Module function map
|
||||
|
||||
static const LUA_REG_TYPE node_egc_map[] = {
|
||||
|
@ -650,6 +664,9 @@ static const LUA_REG_TYPE node_map[] =
|
|||
#endif
|
||||
{ LSTRKEY( "egc" ), LROVAL( node_egc_map ) },
|
||||
{ LSTRKEY( "task" ), LROVAL( node_task_map ) },
|
||||
#ifdef DEVELOPMENT_TOOLS
|
||||
{ LSTRKEY( "osprint" ), LFUNCVAL( node_osprint ) },
|
||||
#endif
|
||||
|
||||
// Combined to dsleep(us, option)
|
||||
// { LSTRKEY( "dsleepsetoption" ), LFUNCVAL( node_deepsleep_setoption) },
|
||||
|
|
|
@ -447,20 +447,40 @@ mqtt_message_t* mqtt_msg_subscribe(mqtt_connection_t* connection, const char* to
|
|||
return result;
|
||||
}
|
||||
|
||||
mqtt_message_t* mqtt_msg_unsubscribe(mqtt_connection_t* connection, const char* topic, uint16_t* message_id)
|
||||
mqtt_message_t* mqtt_msg_unsubscribe_init(mqtt_connection_t* connection, uint16_t *message_id)
|
||||
{
|
||||
init_message(connection);
|
||||
return mqtt_msg_subscribe_init(connection, message_id);
|
||||
}
|
||||
|
||||
mqtt_message_t* mqtt_msg_unsubscribe_topic(mqtt_connection_t* connection, const char* topic)
|
||||
{
|
||||
if(topic == NULL || topic[0] == '\0')
|
||||
return fail_message(connection);
|
||||
|
||||
if((*message_id = append_message_id(connection, 0)) == 0)
|
||||
return fail_message(connection);
|
||||
|
||||
if(append_string(connection, topic, c_strlen(topic)) < 0)
|
||||
return fail_message(connection);
|
||||
|
||||
return fini_message(connection, MQTT_MSG_TYPE_SUBSCRIBE, 0, 1, 0);
|
||||
return &connection->message;
|
||||
}
|
||||
|
||||
mqtt_message_t* mqtt_msg_unsubscribe_fini(mqtt_connection_t* connection)
|
||||
{
|
||||
return fini_message(connection, MQTT_MSG_TYPE_UNSUBSCRIBE, 0, 1, 0);
|
||||
}
|
||||
|
||||
mqtt_message_t* mqtt_msg_unsubscribe(mqtt_connection_t* connection, const char* topic, uint16_t* message_id)
|
||||
{
|
||||
mqtt_message_t* result;
|
||||
|
||||
result = mqtt_msg_unsubscribe_init(connection, message_id);
|
||||
if (result->length != 0) {
|
||||
result = mqtt_msg_unsubscribe_topic(connection, topic);
|
||||
}
|
||||
if (result->length != 0) {
|
||||
result = mqtt_msg_unsubscribe_fini(connection);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
mqtt_message_t* mqtt_msg_pingreq(mqtt_connection_t* connection)
|
||||
|
|
|
@ -140,6 +140,10 @@ mqtt_message_t* mqtt_msg_subscribe_init(mqtt_connection_t* connection, uint16_t*
|
|||
mqtt_message_t* mqtt_msg_subscribe_topic(mqtt_connection_t* connection, const char* topic, int qos);
|
||||
mqtt_message_t* mqtt_msg_subscribe_fini(mqtt_connection_t* connection);
|
||||
|
||||
mqtt_message_t* mqtt_msg_unsubscribe_init(mqtt_connection_t* connection, uint16_t* message_id);
|
||||
mqtt_message_t* mqtt_msg_unsubscribe_topic(mqtt_connection_t* connection, const char* topic);
|
||||
mqtt_message_t* mqtt_msg_unsubscribe_fini(mqtt_connection_t* connection);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -170,9 +170,9 @@ void user_init(void)
|
|||
input_sig = task_get_id(handle_input);
|
||||
uart_init (br, br, input_sig);
|
||||
|
||||
#ifndef NODE_DEBUG
|
||||
#ifndef NODE_DEBUG
|
||||
system_set_os_print(0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
system_init_done_cb(nodemcu_init);
|
||||
}
|
||||
|
|
|
@ -10,13 +10,14 @@ This module provides a simple way of configuring ESP8266 chips without using a s
|
|||
After running [`enduser_setup.start()`](#enduser_setupstart) a portal like the above can be accessed through a wireless network called SetupGadget_XXXXXX. The portal is used to submit the credentials for the WiFi of the enduser.
|
||||
After an IP address has been successfully obtained this module will stop as if [`enduser_setup.stop()`](#enduser_setupstop) had been called.
|
||||
|
||||
Alternative HTML can be served by placing a file called `index.html` in the filesystem. This file will be kept in RAM, so keep it as small as possible.
|
||||
|
||||
## enduser_setup.manual()
|
||||
|
||||
Controls whether manual AP configuration is used.
|
||||
|
||||
By default the `enduser_setup` module automatically configures an open access point when starting, and stops it when the device has been successfully joined to a WiFi network. If manual mode has been enabled, neither of this is done. The device must be manually configured for `wifi.SOFTAP` mode prior to calling `enduser_setup.start()`. Additionally, the portal is not stopped after the device has successfully joined to a WiFi network.
|
||||
|
||||
Most importantly, *the `onConfigured()` callback is not supported in manual mode*. This limitation may disappear in the future.
|
||||
|
||||
#### Syntax
|
||||
`enduser_setup.manual([on_off])`
|
||||
|
@ -27,15 +28,30 @@ Most importantly, *the `onConfigured()` callback is not supported in manual mode
|
|||
#### Returns
|
||||
The current setting, true if manual mode is enabled, false if it is not.
|
||||
|
||||
#### Example
|
||||
```lua
|
||||
wifi.setmode(wifi.STATIONAP)
|
||||
wifi.ap.config({ssid="MyPersonalSSID",auth=wifi.AUTH_OPEN})
|
||||
enduser_setup.manual(true)
|
||||
enduser_setup.start(
|
||||
function()
|
||||
print("Connected to wifi as:" .. wifi.sta.getip())
|
||||
end,
|
||||
function(err, str)
|
||||
print("enduser_setup: Err #" .. err .. ": " .. str)
|
||||
end
|
||||
);
|
||||
```
|
||||
|
||||
## enduser_setup.start()
|
||||
|
||||
Starts the captive portal.
|
||||
|
||||
#### Syntax
|
||||
`enduser_setup.start([onConfigured()], [onError(err_num, string)], [onDebug(string)])`
|
||||
`enduser_setup.start([onConnected()], [onError(err_num, string)], [onDebug(string)])`
|
||||
|
||||
#### Parameters
|
||||
- `onConfigured()` callback will be fired when an IP-address has been obtained, just before the enduser_setup module will terminate itself
|
||||
- `onConnected()` callback will be fired when an IP-address has been obtained, just before the enduser_setup module will terminate itself
|
||||
- `onError()` callback will be fired if an error is encountered. `err_num` is a number describing the error, and `string` contains a description of the error.
|
||||
- `onDebug()` callback is disabled by default. It is intended to be used to find internal issues in the module. `string` contains a description of what is going on.
|
||||
|
||||
|
|
|
@ -184,3 +184,28 @@ m:subscribe("/topic",0, function(conn) print("subscribe success") end)
|
|||
-- or subscribe multiple topic (topic/0, qos = 0; topic/1, qos = 1; topic2 , qos = 2)
|
||||
m:subscribe({["topic/0"]=0,["topic/1"]=1,topic2=2}, function(conn) print("subscribe success") end)
|
||||
```
|
||||
|
||||
## mqtt.client:unsubscribe()
|
||||
|
||||
Unsubscribes from one or several topics.
|
||||
|
||||
#### Syntax
|
||||
`mqtt:unsubscribe(topic[, function(client)])`
|
||||
`mqtt:unsubscribe(table[, function(client)])`
|
||||
|
||||
#### Parameters
|
||||
- `topic` a [topic string](http://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices)
|
||||
- `table` array of 'topic, anything' pairs to unsubscribe from
|
||||
- `function(client)` optional callback fired when unsubscription(s) succeeded
|
||||
|
||||
#### Returns
|
||||
`true` on success, `false` otherwise
|
||||
|
||||
#### Example
|
||||
```lua
|
||||
-- unsubscribe topic
|
||||
m:unsubscribe("/topic", function(conn) print("unsubscribe success") end)
|
||||
|
||||
-- or unsubscribe multiple topic (topic/0; topic/1; topic2)
|
||||
m:unsubscribe({["topic/0"]=0,["topic/1"]=0,topic2="anything"}, function(conn) print("unsubscribe success") end)
|
||||
```
|
||||
|
|
|
@ -382,6 +382,25 @@ node.compile('bigstuff.lua')
|
|||
#### See also
|
||||
[`node.compile()`](#nodecompile)
|
||||
|
||||
## node.osprint()
|
||||
|
||||
Controls whether the debugging output from the Espressif SDK is printed. Note that this is only available if
|
||||
the firmware is build with DEVELOPMENT_TOOLS defined.
|
||||
|
||||
####Syntax
|
||||
`node.osprint(enabled)`
|
||||
|
||||
#### Parameters
|
||||
- `enabled` This is either `true` to enable printing, or `false` to disable it. The default is `false`.
|
||||
|
||||
#### Returns
|
||||
Nothing
|
||||
|
||||
#### Example
|
||||
```lua
|
||||
node.osprint(true)
|
||||
```
|
||||
|
||||
# node.egc module
|
||||
|
||||
## node.egc.setmode()
|
||||
|
|
|
@ -77,10 +77,10 @@ Initialize a display via Hardware SPI.
|
|||
- `ili9163_18x128x128_hw_spi()`
|
||||
- `ili9341_18x240x320_hw_spi()`
|
||||
- `pcf8833_16x132x132_hw_spi()`
|
||||
- `seps225_16x128x128_univision_hw_spi()`
|
||||
- `seps225_16x128x128_uvis_hw_spi()`
|
||||
- `ssd1351_18x128x128_hw_spi()`
|
||||
- `ssd1351_18x128x128_ft_hw_spi()`
|
||||
- `ssd1331_18x96x64_univision_hw_spi()`
|
||||
- `ssd1331_18x96x64_uvis_hw_spi()`
|
||||
- `st7735_18x128x160_hw_spi()`
|
||||
|
||||
#### Syntax
|
||||
|
|
Loading…
Reference in New Issue