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

#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();
}