add setIP and setAPIP

This commit is contained in:
MaBecker 2017-01-23 10:22:52 +01:00 committed by Gordon Williams
parent 939741ba4b
commit eabffa4032
2 changed files with 147 additions and 0 deletions

View File

@ -102,6 +102,9 @@ static bool g_skipDisconnect;
// Global data structure for ping request
static struct ping_option pingOpt;
// Global data structure for setIP and setAPIP
static struct ip_info info;
// Configuration save to flash
typedef struct {
uint16_t length, version;
@ -1743,6 +1746,148 @@ static void pingRecvCB(void *pingOpt, void *pingResponse) {
}
}
// worker for jswrap_ESP8266_wifi_setIP and jswrap_ESP8266_wifi_setAPIP
static void setIP(JsVar *jsSettings, JsVar *jsCallback, int interface) {
DBGV("> setIP\n");
char ipTmp[20];
int len = 0;
bool rc = false;
memset(&info, 0, sizeof(info));
// first check parameter
if (!jsvIsObject(jsSettings)) {
EXPECT_OPT_EXCEPTION(jsSettings);
return;
}
// get,check and store ip
JsVar *jsIP = jsvObjectGetChild(jsSettings, "ip", 0);
if (jsIP != NULL && !jsvIsString(jsIP)) {
EXPECT_OPT_EXCEPTION(jsIP);
jsvUnLock(jsIP);
return;
}
jsvGetString(jsIP, ipTmp, sizeof(ipTmp)-1);
//DBG(">> ip: %s\n",ipTmp);
info.ip.addr = networkParseIPAddress(ipTmp);
if ( info.ip.addr == 0) {
jsExceptionHere(JSET_ERROR, "Not a valid IP address.");
jsvUnLock(jsIP);
return;
}
jsvUnLock(jsIP);
// get, check and store gw
JsVar *jsGW = jsvObjectGetChild(jsSettings, "gw", 0);
if (jsGW != NULL && !jsvIsString(jsGW)) {
EXPECT_OPT_EXCEPTION(jsGW);
jsvUnLock(jsGW);
return ;
}
jsvGetString(jsGW, ipTmp, sizeof(ipTmp)-1);
//DBG(">> gw: %s\n",ipTmp);
info.gw.addr = networkParseIPAddress(ipTmp);
if (info.gw.addr == 0) {
jsExceptionHere(JSET_ERROR, "Not a valid Gateway address.");
jsvUnLock(jsGW);
return;
}
jsvUnLock(jsGW);
// netmask setting
JsVar *jsNM = jsvObjectGetChild(jsSettings, "netmask", 0);
if (jsNM != NULL && !jsvIsString(jsNM)) {
EXPECT_OPT_EXCEPTION(jsNM);
jsvUnLock(jsNM);
return;
}
jsvGetString(jsNM, ipTmp, sizeof(ipTmp)-1);
//DBG(">> netmask: %s\n",ipTmp);
info.netmask.addr = networkParseIPAddress(ipTmp);
if (info.netmask.addr == 0) {
jsExceptionHere(JSET_ERROR, "Not a valid Netmask.");
jsvUnLock(jsNM);
return;
}
jsvUnLock(jsNM);
// set IP for station
if (interface == STATION_IF ) {
wifi_station_dhcpc_stop();
rc = wifi_set_ip_info(STATION_IF, &info);
}
// set IP for access point
else {
wifi_softap_dhcps_stop();
rc = wifi_set_ip_info(SOFTAP_IF, &info);
wifi_softap_dhcps_start();
}
DBG(">> rc: %s\n", rc ? "true" : "false");
// Schedule callback
if (jsvIsFunction(jsCallback)) {
JsVar *jsRC = jsvNewObject();
jsvObjectSetChildAndUnLock(jsRC, "success",jsvNewFromBool(rc));
JsVar *params[1];
params[0] = jsRC;
jsiQueueEvents(NULL, jsCallback, params, 1);
jsvUnLock(params[0]);
jsvUnLock(jsRC);
}
else {
jsExceptionHere(JSET_ERROR, "Callback is not a function.");
}
DBGV("< setIP\n");
return ;
};
//===== Wifi.setIP
/*JSON{
"type" : "staticmethod",
"class" : "Wifi",
"name" : "setIP",
"generate" : "jswrap_ESP8266_wifi_setIP",
"params" : [
["settings", "JsVar", "Configuration settings"],
["callback", "JsVar", "The callback to invoke when ip is set"]
]
}
The `settings` object must contain the following properties.
* `ip` IP address as string (e.g. "192.168.5.100")
* `gw` The network gateway as string (e.g. "192.168.5.1")
* `netmask` The interface netmask as string (e.g. "255.255.255.0")
*/
void jswrap_ESP8266_wifi_setIP(JsVar *jsSettings, JsVar *jsCallback) {
setIP(jsSettings, jsCallback, STATION_IF);
return ;
}
//===== Wifi.setAPIP
/*JSON{
"type" : "staticmethod",
"class" : "Wifi",
"name" : "setAPIP",
"generate" : "jswrap_ESP8266_wifi_setAPIP",
"params" : [
["settings", "JsVar", "Configuration settings"],
["callback", "JsVar", "The callback to invoke when ip is set"]
]
}
The `settings` object must contain the following properties.
* `ip` IP address as string (e.g. "192.168.5.100")
* `gw` The network gateway as string (e.g. "192.168.5.1")
* `netmask` The interface netmask as string (e.g. "255.255.255.0")
*/
void jswrap_ESP8266_wifi_setAPIP(JsVar *jsSettings, JsVar *jsCallback) {
setIP(jsSettings, jsCallback, SOFTAP_IF);
return ;
}
/**
* Callback function that is invoked at the culmination of a scan.

View File

@ -38,5 +38,7 @@ JsVar *jswrap_ESP8266_wifi_getHostname(JsVar *jsCallback);
void jswrap_ESP8266_wifi_setHostname(JsVar *jsHostname);
void jswrap_ESP8266_wifi_getHostByName(JsVar *jsHostname, JsVar *jsCallback);
void jswrap_ESP8266_wifi_setSNTP(JsVar *zone, JsVar *server);
void jswrap_ESP8266_wifi_setIP(JsVar *jsSettings, JsVar *jsCallback);
void jswrap_ESP8266_wifi_setAPIP(JsVar *jsSettings, JsVar *jsCallback);
#endif /* LIBS_NETWORK_ESP8266_JSWRAP_ESP8266_NETWORK_H_ */