#define ArrLen(x) (sizeof(x)/sizeof(x[0]))
const char* msg = "MOON=phase:81,state:6";
typedef enum : uint8_t {
DATA_DT = 0x10,
DATA_DT_DATE = 0x11,
DATA_DT_TIME = 0x12,
DATA_DT_EPOCH = 0x13,
DATA_DN = 0x20,
DATA_DN_TYPE = 0x21,
DATA_DN_TOTAL = 0x22,
DATA_DN_PCT = 0x23,
DATA_SUN = 0x30,
DATA_SUN_RISE = 0x31,
DATA_SUN_SET = 0x32,
DATA_MOON = 0x40,
DATA_MOON_PHASE = 0x41,
DATA_MOON_STATE = 0x42
} data_enum;
struct data_kv {
uint8_t id;
char key[8];
char val[16];
};
struct data_kv_group {
uint8_t id;
const char* key;
data_kv keyval[4];
}
SysData[4] = {
{DATA_DT, "DT", {
{DATA_DT_DATE, "date", ""},
{DATA_DT_TIME, "time", ""},
{DATA_DT_EPOCH, "epoch", ""},
{0,"",""},
}},
{DATA_DN, "DN", {
{DATA_DN_TYPE, "type", ""},
{DATA_DN_TOTAL, "total", ""},
{DATA_DN_PCT, "pct", ""},
{0,"",""},
}},
{DATA_SUN, "SUN", {
{DATA_SUN_RISE, "rise", ""},
{DATA_SUN_SET, "set", ""},
{0,"",""},
{0,"",""},
}},
{DATA_MOON, "MOON", {
{DATA_MOON_PHASE, "phase", ""},
{DATA_MOON_STATE, "state", ""},
{0,"",""},
{0,"",""},
}},
};
void SysData_storeItem(const char* data, data_kv_group *group) {
char tmp[strlen(data)+1] = {'\0'};
strcpy(tmp, data);
Serial.println(tmp);
char *key = strtok(tmp, ":");
//char* val = strtok(nullptr, ":");
Serial.print("key: "); Serial.println(key);
/*
char *key = strtok(data, ":");
char* val = strtok(nullptr, ":");
for (int i=0; i<ArrLen(group->keyval); i++) {
data_kv *item = &(group->keyval[i]);
if (item->id > 0) {
if (strcmp(item->key, key) == 0) {
memset(item->val, 0, sizeof(item->val));
strcpy(item->val, val);
Serial.print(" MATCH: ");
Serial.print(item->key); Serial.print(" -> "); Serial.println(item->val);
}
}
}
*/
}
void SysData_store(const char* data) {
char *key = strtok(data, "=");
char* val = strtok(nullptr, "=");
String k, v;
data_kv_group *group = nullptr;
data_kv *item = nullptr;
for (int i=0; i<ArrLen(SysData); i++) {
if (strcmp(key, SysData[i].key) == 0) {
group = &(SysData[i]);
break;
}
}
if (group != NULL) {
char *subval = strtok(val, ",");
do {
k = String(subval);
v = k.substring(k.indexOf(':')+1, k.length());
k = k.substring(0, k.indexOf(':'));
for (int i=0; i<ArrLen(group->keyval); i++) {
item = &(group->keyval[i]);
if (item->id > 0) {
if (strcmp(item->key, k.c_str()) == 0) {
memset(item->val, 0, sizeof(item->val));
strcpy(item->val, v.c_str());
Serial.print(item->key); Serial.print("->"); Serial.println(item->val);
}
}
}
//Serial.println(subval);
subval = strtok(nullptr, ",");
} while (subval);
}
}
void SysData_kvPair(char* str, bool first=true) {
char *token = strtok(str, "=");
if (first) {
Serial.println(token);
return;
}
first = true;
do {
if (!first) Serial.println(token);
token = strtok(nullptr, "=");
first = false;
} while (token);
}
void setup() {
Serial.begin(9600);
SysData_store(msg);
/*
SysData_kvPair(msg, false);
SysData_kvPair(msg, true);
*/
/*
char *str;
str = msg;
char *token = strtok(str, "=");
bool first = true;
do {
Serial.print((first)?"key: ":"val: ");
Serial.println(token);
token = strtok(nullptr, "=");
first = false;
} while (token);
*/
}
void loop() {
// put your main code here, to run repeatedly:
}