You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.4 KiB
140 lines
4.4 KiB
#include "../include/nx/software/SystemSettingsApi.h" |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <inttypes.h> |
|
#include "KeyValueParser.h" |
|
#include <string.h> |
|
#include "../include/nx/software/SystemSettings.h" |
|
|
|
#define IPV4_ADDR_SIZE 4 |
|
|
|
/* curl example: |
|
curl -v -X POST http://192.168.4.1/sys -d \ |
|
ssid=myssid&wpass=mypassword&wpwsave=1&wstatic=1&ip=3232237657&gw=3232237569&mask=4294967040 |
|
*/ |
|
|
|
#define API_KEY_SSID "ssid" |
|
#define API_KEY_WPASS "wpass" |
|
#define API_KEY_WPWSAVE "wpwsave" |
|
#define API_KEY_USE_STATIC "wstatic" |
|
#define API_KEY_IPV4ADDR "ip" |
|
#define API_KEY_IPV4GW "gw" |
|
#define API_KEY_IPV4MASK "mask" |
|
#define API_KEY_DNS_ADDR "dns" |
|
#define API_KEY_SNTP_ADDR "sntp" |
|
#define API_KEY_TZ_ENV "tz" |
|
#define API_KEY_RS_SCHEDULE "rsch" |
|
#define API_KEY_DEVNAME "dn" |
|
#define API_KEY_RESTORE "restore_default" |
|
|
|
#define UNUSED(x) (void)(x) |
|
|
|
#define RESP_BUF_SIZE 1024 |
|
|
|
char responseBuffer[RESP_BUF_SIZE]; |
|
|
|
void int2ip(uint8_t array[4], uint32_t addr) |
|
{ |
|
array[0] = (addr & 0xFF000000) >> 24; |
|
array[1] = (addr & 0x00FF0000) >> 16; |
|
array[2] = (addr & 0x0000FF00) >> 8; |
|
array[3] = (addr & 0x000000FF); |
|
} |
|
|
|
void handleKvPair(const char* key, const char* value, const void* userData, bool* done) |
|
{ |
|
printf("System settings update; Key: %s, Value: %s\n", key, value); |
|
|
|
SystemSettings* settings = nxGetSystemSettings(); |
|
if (strcmp(key, API_KEY_RESTORE) == 0) { |
|
nxRestoreSystemDefaultSettings(); |
|
} |
|
else if (strcmp(key, API_KEY_SSID) == 0) { |
|
strcpy(settings->wifiSsid, value); |
|
} |
|
else if (strcmp(key, API_KEY_WPASS) == 0) { |
|
strcpy(settings->wifiPassword, value); |
|
} |
|
else if (strcmp(key, API_KEY_WPWSAVE) == 0) { |
|
settings->wifiPowerSave = atoi(value); |
|
} |
|
else if (strcmp(key, API_KEY_USE_STATIC) == 0) { |
|
settings->useStaticAddr = atoi(value); |
|
} |
|
else if (strcmp(key, API_KEY_IPV4ADDR) == 0) { |
|
uint32_t addr = strtoul(value, NULL, 10); |
|
int2ip(settings->ip4addr, addr); |
|
} |
|
else if (strcmp(key, API_KEY_IPV4GW) == 0) { |
|
uint32_t addr = strtoul(value, NULL, 10); |
|
int2ip(settings->ip4gw, addr); |
|
} |
|
else if (strcmp(key, API_KEY_IPV4MASK) == 0) { |
|
uint32_t addr = strtoul(value, NULL, 10); |
|
int2ip(settings->ip4mask, addr); |
|
} |
|
else if (strcmp(key, API_KEY_DNS_ADDR) == 0) { |
|
uint32_t addr = strtoul(value, NULL, 10); |
|
int2ip(settings->dnsAddr, addr); |
|
} |
|
else if (strcmp(key, API_KEY_SNTP_ADDR) == 0) { |
|
strcpy(settings->sntpAddr, value); |
|
} |
|
else if (strcmp(key, API_KEY_TZ_ENV) == 0) { |
|
strcpy(settings->tzEnv, value); |
|
} |
|
else if (strcmp(key, API_KEY_RS_SCHEDULE) == 0) { |
|
strcpy(settings->rsSchedule, value); |
|
} |
|
else { |
|
fprintf(stderr, "Unknown key: %s\n", key); |
|
} |
|
} |
|
|
|
// --------- Public API --------- // |
|
|
|
void nxApiGetSystemSettings(const uint8_t* msg, size_t msgLen, |
|
const char** response, size_t* respLen) |
|
{ |
|
UNUSED(msg); UNUSED(msgLen); |
|
memset(responseBuffer, 0, RESP_BUF_SIZE); |
|
SystemSettings* settings = nxGetSystemSettings(); |
|
|
|
sprintf(responseBuffer, |
|
"{" |
|
"\"%s\":\"%s\", " // ssid |
|
"\"%s\":%i, " // power save |
|
"\"%s\":%i, " // use static ip |
|
"\"%s\":\"%i.%i.%i.%i\", " // ip |
|
"\"%s\":\"%i.%i.%i.%i\", " // gw |
|
"\"%s\":\"%i.%i.%i.%i\"," // mask |
|
"\"%s\":\"%i.%i.%i.%i\"," // dns |
|
"\"%s\":\"%s\"," // sntp |
|
"\"%s\":\"%s\"," // tz |
|
"\"%s\":\"%s\"," // rsch |
|
"\"%s\":\"%s\"" // dn |
|
"}", |
|
API_KEY_SSID, settings->wifiSsid, |
|
API_KEY_WPWSAVE, settings->wifiPowerSave, |
|
API_KEY_USE_STATIC, settings->useStaticAddr, |
|
API_KEY_IPV4ADDR, settings->ip4addr[0], settings->ip4addr[1], settings->ip4addr[2], settings->ip4addr[3], |
|
API_KEY_IPV4GW, settings->ip4gw[0], settings->ip4gw[1], settings->ip4gw[2], settings->ip4gw[3], |
|
API_KEY_IPV4MASK, settings->ip4mask[0], settings->ip4mask[1], settings->ip4mask[2], settings->ip4mask[3], |
|
API_KEY_DNS_ADDR, settings->dnsAddr[0], settings->dnsAddr[1], settings->dnsAddr[2], settings->dnsAddr[3], |
|
API_KEY_SNTP_ADDR, settings->sntpAddr, |
|
API_KEY_TZ_ENV, settings->tzEnv, |
|
API_KEY_RS_SCHEDULE, settings->rsSchedule, |
|
API_KEY_DEVNAME, settings->deviceName |
|
); |
|
*response = responseBuffer; |
|
*respLen = strlen(responseBuffer); |
|
} |
|
|
|
void nxApiUpdateSystemSettings(const uint8_t* msg, size_t msgLen, |
|
const char** response, size_t* respLen) |
|
{ |
|
nxParseKeyValueString((const char*)msg, handleKvPair, NULL); |
|
nxWriteSystemSettings(); |
|
} |
|
|
|
|