Hello
Recently I got my hands on NodeMCU esp8266. I am trying to build an alarm system. I have two structs Alarm and AlarmInfo. Here is the code:
struct Alarm {
private:
int alarmHour;// 00 - 23;
int alarmMinute; // 00 - 59;
int duration; //undefined
public:
Alarm(int newAlarmHour, int newAlarmMinute, int newDuration) {
alarmHour = newAlarmHour;
alarmMinute = newAlarmMinute;
duration = newDuration;
}
Alarm() {}
int getAlarmHour() {
return alarmHour;
}
int getAlarmMinute() {
return alarmMinute;
}
int getAlarmDuration() {
return duration;
}
// void setHour(int newHour); // might not use just in case;
// void setMinute(int newMinute);
String toString() { // returns string representation only of the alarm (format: hh:mm)
char buffer[10];
sprintf(buffer, "%02u:%02u", alarmHour, alarmMinute);
return String(buffer);
}
String toStringDuration() { // returns string representation with duration (format: hh:mm/dd)
char buffer[20];
sprintf(buffer, "%02u:%02u:%d", alarmHour, alarmMinute, duration);
return String(buffer);
}
};
struct AlarmInfo {
private:
String name;
Alarm *alarms;
int alarmSize;
int *days;
int daySize;
boolean isActive;
public:
AlarmInfo() {}
AlarmInfo(String newName, Alarm newAlarms[], int newAlarmSize, int newDays[], int newDaySize, boolean newIsActive) {
name = newName;
alarms = newAlarms;
alarmSize = newAlarmSize;
days = newDays;
daySize = newDaySize;
isActive = newIsActive;
}
Alarm* getAlarms() {
return alarms;
};
void readVals() {
Alarm *temp = alarms;
Serial.print("Size: ");
Serial.println(alarmSize);
for (int i = 0; i < alarmSize; i++) {
Serial.println(temp++->toStringDuration());
}
}
};
I call this function which parses the json correctly but when I call
for(int i = 0;i<jsonArray.size();i++){
alarmInfos[i].readVals();
}
I get random values.
Here's the function and output:
void loadAlarms(JsonArray jsonArray) {
//Parsing the Json
AlarmInfo alarmInfos[jsonArray.size()];
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject object = jsonArray[i].as<JsonObject>();
String alarmInfoName = object["Name"].as<String>();
JsonArray alarmsJsonArray = object["Alarms"].as<JsonArray>();
Alarm alarmArray[alarmsJsonArray.size()];
for (int j = 0; j < alarmsJsonArray.size(); j++) {
JsonObject alarmObject = alarmsJsonArray[j].as<JsonObject>();
int alarmHour = alarmObject["hour"];
int alarmMinute = alarmObject["minute"];
int duration = alarmObject["duration"];
alarmArray[j] = Alarm(alarmHour, alarmMinute, duration);
}
JsonArray daysJsonArray = object["Days"].as<JsonArray>();
int daysArray[daysJsonArray.size()];
for (int k = 0; k < daysJsonArray.size(); k++) {
daysArray[k] = daysJsonArray[k].as<int>();
}
bool isActive = object["Active"].as<bool>();
alarmInfos[i] = AlarmInfo(alarmInfoName, alarmArray, alarmsJsonArray.size(),
daysArray, daysJsonArray.size(), isActive);
//This gives correct values
alarmInfos[i].readVals();
}
for(int i = 0;i<jsonArray.size();i++){
alarmInfos[i].readVals();
}
}
Size: 6
12:30:5
13:30:5
14:30:5
15:30:5
16:30:5
17:30:5
Size: 6
17:30:5
17:30:5
18:30:5
19:30:5
20:30:5
21:30:5
Size: 6
17:30:5
17:30:5
18:30:5
19:30:5
20:30:5
21:30:5
Size: 6
17:30:5
17:30:5
18:30:5
19:30:5
20:30:5
21:30:5
Size: 6
17:1073672900:107373
1075862441:825898801
943337780:959984946:
00:1310751:0
20:30:5
1073736416:06:0
Size: 6
17:1073672900:107373
1075862441:825898801
943337780:959984946:
00:1310751:0
20:30:5
1073736416:06:0
Size: 6
17:1073672900:107373
1075862441:825898801
943337780:959984946:
00:1310751:0
20:30:5
1073736416:06:0
Size: 6
17:1073672900:107373
1075862441:825898801
943337780:959984946:
00:1310751:0
20:30:5
1073736416:06:0
I tried the same function in C++ and it worked fine.
EDIT
Here is the whole sketch:
#include <FS.h>
#include <LittleFS.h>
#include "AsyncJson.h"
#include "ArduinoJson.h"
//Alarm Struct
struct Alarm {
private:
int alarmHour;// 00 - 23;
int alarmMinute; // 00 - 59;
int duration; //undefined
public:
Alarm(int newAlarmHour, int newAlarmMinute, int newDuration) {
alarmHour = newAlarmHour;
alarmMinute = newAlarmMinute;
duration = newDuration;
}
Alarm() {}
int getAlarmHour() {
return alarmHour;
}
int getAlarmMinute() {
return alarmMinute;
}
int getAlarmDuration() {
return duration;
}
String toString() { // returns string representation only of the alarm (format: hh:mm)
char buffer[10];
sprintf(buffer, "%02u:%02u", alarmHour, alarmMinute);
return String(buffer);
}
String toStringDuration() { // returns string representation with duration (format: hh:mm/dd)
char buffer[20];
sprintf(buffer, "%02u:%02u:%d", alarmHour, alarmMinute, duration);
return String(buffer);
}
};
struct AlarmInfo {
private:
String name;
Alarm *alarms;
int alarmSize;
int *days;
int daySize;
boolean isActive;
public:
AlarmInfo() {}
AlarmInfo(String newName, Alarm newAlarms[], int newAlarmSize, int newDays[], int newDaySize, boolean newIsActive) {
name = newName;
alarms = newAlarms;
alarmSize = newAlarmSize;
days = newDays;
daySize = newDaySize;
isActive = newIsActive;
}
Alarm* getAlarms() {
return alarms;
};
void readVals() {
Alarm *temp = alarms;
Serial.print("Size: ");
Serial.println(alarmSize);
for (int i = 0; i < alarmSize; i++) {
Serial.println(temp++->toStringDuration());
}
}
};
void setup() {
Serial.begin(115200);
Serial.println("Hello There");
LittleFS.begin();
File file = LittleFS.open("/presetdata.json", "r");
if(!file) {
Serial.println("Cannot read the file");
}
DynamicJsonDocument data(8192);
deserializeJson(data, file);
loadAlarms(data.as<JsonArray>());
}
void loop() {
}
void loadAlarms(JsonArray jsonArray) {
AlarmInfo alarmInfos[jsonArray.size()];
////////////////////////Parsing JSON////////////////////////////////
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject object = jsonArray[i].as<JsonObject>();
String alarmInfoName = object["Name"].as<String>();
JsonArray alarmsJsonArray = object["Alarms"].as<JsonArray>();
Alarm alarmArray[alarmsJsonArray.size()];
for (int j = 0; j < alarmsJsonArray.size(); j++) {
JsonObject alarmObject = alarmsJsonArray[j].as<JsonObject>();
int alarmHour = alarmObject["hour"];
int alarmMinute = alarmObject["minute"];
int duration = alarmObject["duration"];
alarmArray[j] = Alarm(alarmHour, alarmMinute, duration);
}
JsonArray daysJsonArray = object["Days"].as<JsonArray>();
int daysArray[daysJsonArray.size()];
for (int k = 0; k < daysJsonArray.size(); k++) {
daysArray[k] = daysJsonArray[k].as<int>();
}
bool isActive = object["Active"].as<bool>();
//////////////////////////////////////////////////////////////////////
alarmInfos[i] = AlarmInfo(alarmInfoName, alarmArray, alarmsJsonArray.size(),
daysArray, daysJsonArray.size(), isActive);
alarmInfos[i].readVals();
}
for (int i = 0; i < jsonArray.size(); i++) {
alarmInfos[i].readVals();
}
}