Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
128177ac
Commit
128177ac
authored
Mar 01, 2016
by
Terry Ellison
Browse files
Merge pull request #1102 from DiUS/enduser_setup-less_crash
Crash-fixes for enduser_setup module
parents
10d0c644
969e9f2e
Changes
1
Hide whitespace changes
Inline
Side-by-side
app/modules/enduser_setup.c
View file @
128177ac
...
@@ -43,6 +43,7 @@
...
@@ -43,6 +43,7 @@
#include "user_interface.h"
#include "user_interface.h"
#include "espconn.h"
#include "espconn.h"
#include "flash_fs.h"
#include "flash_fs.h"
#include "task/task.h"
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define LITLEN(strliteral) (sizeof (strliteral) -1)
#define LITLEN(strliteral) (sizeof (strliteral) -1)
...
@@ -244,6 +245,7 @@ typedef struct
...
@@ -244,6 +245,7 @@ typedef struct
static
enduser_setup_state_t
*
state
;
static
enduser_setup_state_t
*
state
;
static
bool
manual
=
false
;
static
bool
manual
=
false
;
static
task_handle_t
do_station_cfg_handle
;
static
int
enduser_setup_start
(
lua_State
*
L
);
static
int
enduser_setup_start
(
lua_State
*
L
);
static
int
enduser_setup_stop
(
lua_State
*
L
);
static
int
enduser_setup_stop
(
lua_State
*
L
);
...
@@ -330,7 +332,8 @@ static void enduser_setup_check_station_stop(void)
...
@@ -330,7 +332,8 @@ static void enduser_setup_check_station_stop(void)
{
{
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"enduser_setup_check_station_stop"
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"enduser_setup_check_station_stop"
);
os_timer_disarm
(
&
(
state
->
check_station_timer
));
if
(
state
!=
NULL
)
os_timer_disarm
(
&
(
state
->
check_station_timer
));
}
}
...
@@ -492,6 +495,32 @@ static void enduser_setup_http_urldecode(char *dst, const char *src, int src_len
...
@@ -492,6 +495,32 @@ static void enduser_setup_http_urldecode(char *dst, const char *src, int src_len
}
}
/**
* Task to do the actual station configuration.
* This config *cannot* be done in the network receive callback or serious
* issues like memory corruption occur.
*/
static
void
do_station_cfg
(
task_param_t
param
,
uint8_t
prio
)
{
struct
station_config
*
cnf
=
(
struct
station_config
*
)
param
;
(
void
)
prio
;
/* Best-effort disconnect-reconfig-reconnect. If the device is currently
* connected, the disconnect will work but the connect will report failure
* (though it will actually start connecting). If the devices is not
* connected, the disconnect may fail but the connect will succeed. A
* solid head-in-the-sand approach seems to be the best tradeoff on
* functionality-vs-code-size.
* TODO: maybe use an error callback to at least report if the set config
* call fails.
*/
wifi_station_disconnect
();
wifi_station_set_config
(
cnf
);
wifi_station_connect
();
os_free
(
cnf
);
}
/**
/**
* Handle HTTP Credentials
* Handle HTTP Credentials
*
*
...
@@ -522,30 +551,18 @@ static int enduser_setup_http_handle_credentials(char *data, unsigned short data
...
@@ -522,30 +551,18 @@ static int enduser_setup_http_handle_credentials(char *data, unsigned short data
return
1
;
return
1
;
}
}
struct
station_config
cnf
;
struct
station_config
*
cnf
=
os_zalloc
(
sizeof
(
struct
station_config
));
c_memset
(
&
cnf
,
0
,
sizeof
(
struct
station_config
));
enduser_setup_http_urldecode
(
cnf
->
ssid
,
name_str_start
,
name_str_len
);
enduser_setup_http_urldecode
(
cnf
.
ssid
,
name_str_start
,
name_str_len
);
enduser_setup_http_urldecode
(
cnf
->
password
,
pwd_str_start
,
pwd_str_len
);
enduser_setup_http_urldecode
(
cnf
.
password
,
pwd_str_start
,
pwd_str_len
);
if
(
!
wifi_station_disconnect
())
task_post_medium
(
do_station_cfg_handle
,
(
task_param_t
)
cnf
);
{
ENDUSER_SETUP_ERROR
(
"station_start failed. wifi_station_disconnect failed."
,
ENDUSER_SETUP_ERR_UNKOWN_ERROR
,
ENDUSER_SETUP_ERR_NONFATAL
);
}
if
(
!
wifi_station_set_config
(
&
cnf
))
{
ENDUSER_SETUP_ERROR
(
"station_start failed. wifi_station_set_config failed."
,
ENDUSER_SETUP_ERR_UNKOWN_ERROR
,
ENDUSER_SETUP_ERR_FATAL
);
}
if
(
wifi_station_connect
())
{
ENDUSER_SETUP_ERROR
(
"station_start failed. wifi_station_connect failed.
\n
"
,
ENDUSER_SETUP_ERR_UNKOWN_ERROR
,
ENDUSER_SETUP_ERR_FATAL
);
}
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"WiFi Credentials Stored"
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"WiFi Credentials Stored"
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"-----------------------"
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"-----------------------"
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"name: "
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"name: "
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
cnf
.
ssid
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
cnf
->
ssid
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"pass: "
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"pass: "
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
cnf
.
password
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
cnf
->
password
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"-----------------------"
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"-----------------------"
);
return
0
;
return
0
;
...
@@ -621,15 +638,14 @@ static void serve_status (struct espconn *conn)
...
@@ -621,15 +638,14 @@ static void serve_status (struct espconn *conn)
"Content-type: text/plain
\r\n
"
"Content-type: text/plain
\r\n
"
"Content-length: %d
\r\n
"
"Content-length: %d
\r\n
"
"
\r\n
"
"
\r\n
"
"%s"
;
"%s
%s
"
;
const
char
*
state
[]
=
const
char
*
state
[]
=
{
{
"Idle"
,
"Idle"
,
"Connecting..."
,
"Connecting..."
,
"Failed to connect - wrong password"
,
"Failed to connect - wrong password"
,
"Failed to connect - network not found"
,
"Failed to connect - network not found"
,
"Failed to connect"
,
"Failed to connect"
"WiFi successfully connected!"
/* TODO: include SSID */
};
};
const
size_t
num_states
=
sizeof
(
state
)
/
sizeof
(
state
[
0
]);
const
size_t
num_states
=
sizeof
(
state
)
/
sizeof
(
state
[
0
]);
...
@@ -639,7 +655,17 @@ static void serve_status (struct espconn *conn)
...
@@ -639,7 +655,17 @@ static void serve_status (struct espconn *conn)
const
char
*
s
=
state
[
which
];
const
char
*
s
=
state
[
which
];
int
len
=
c_strlen
(
s
);
int
len
=
c_strlen
(
s
);
char
buf
[
sizeof
(
fmt
)
+
10
+
len
];
/* more than enough for the formatted */
char
buf
[
sizeof
(
fmt
)
+
10
+
len
];
/* more than enough for the formatted */
len
=
c_sprintf
(
buf
,
fmt
,
len
,
s
);
len
=
c_sprintf
(
buf
,
fmt
,
len
,
s
,
""
);
enduser_setup_http_serve_header
(
conn
,
buf
,
len
);
}
else
if
(
which
==
num_states
)
{
struct
station_config
cnf
=
{
0
,
};
wifi_station_get_config
(
&
cnf
);
const
char
successmsg
[]
=
"WiFi successfully connected to "
;
int
len
=
LITLEN
(
successmsg
)
+
c_strlen
(
cnf
.
ssid
);
char
buf
[
sizeof
(
fmt
)
+
sizeof
(
successmsg
)
+
32
];
// max-ssid
len
=
c_sprintf
(
buf
,
fmt
,
len
,
successmsg
,
cnf
.
ssid
);
enduser_setup_http_serve_header
(
conn
,
buf
,
len
);
enduser_setup_http_serve_header
(
conn
,
buf
,
len
);
}
}
else
else
...
@@ -1172,7 +1198,7 @@ static void enduser_setup_dns_stop(void)
...
@@ -1172,7 +1198,7 @@ static void enduser_setup_dns_stop(void)
{
{
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"enduser_setup_dns_stop"
);
ENDUSER_SETUP_DEBUG
(
lua_getstate
(),
"enduser_setup_dns_stop"
);
if
(
state
->
espconn_dns_udp
!=
NULL
)
if
(
state
!=
NULL
&&
state
->
espconn_dns_udp
!=
NULL
)
{
{
espconn_delete
(
state
->
espconn_dns_udp
);
espconn_delete
(
state
->
espconn_dns_udp
);
}
}
...
@@ -1248,6 +1274,9 @@ static int enduser_setup_start(lua_State *L)
...
@@ -1248,6 +1274,9 @@ static int enduser_setup_start(lua_State *L)
{
{
ENDUSER_SETUP_DEBUG
(
L
,
"enduser_setup_start"
);
ENDUSER_SETUP_DEBUG
(
L
,
"enduser_setup_start"
);
if
(
!
do_station_cfg_handle
)
do_station_cfg_handle
=
task_get_id
(
do_station_cfg
);
if
(
enduser_setup_init
(
L
))
if
(
enduser_setup_init
(
L
))
goto
failed
;
goto
failed
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment