We just discovered a memory leak in our code but have been unable to correct it. We are using a Swan microcontroller. The leak seems to occur whenever we use NoteRequest() in the following function:
void NoteAdd (ModbusData data){
Serial.println("Sending Data to Notecard\n");
J *req = notecard.newRequest("note.add");
JAddStringToObject(req, "file", "batteryCont.qo");
JAddBoolToObject(req, "sync", true);
J *body = JAddObjectToObject(req,"body");
JAddNumberToObject(body, "BatV", data.batteryVoltage/100 );
JAddNumberToObject(body, "BatV2", data.batteryVoltage2/100 );
JAddNumberToObject(body, "BatV3", data.batteryVoltage3/100 );
JAddNumberToObject(body, "BatA", data.batteryCurrent/100 );
JAddNumberToObject(body, "LoadV", data.loadVoltage/100 );
JAddNumberToObject(body, "LoadA", data.loadCurrent/100 );
JAddNumberToObject(body, "SolarV", data.solarVoltage/100 );
JAddNumberToObject(body, "SolarA", data.solarCurrent/100 );
JAddNumberToObject(body, "Temp", data.temperature/100 );
JAddNumberToObject(body, "DCC", data.dailyChargingCapacity/100);
JAddNumberToObject(body, "TCC", data.totalChargingCapacity/100 );
JAddNumberToObject(body, "SoC", data.stateOfCharge);
JAddNumberToObject(body,"SoC_CC", data.stateOfChargeCC);
JAddNumberToObject(body,"Uptime_d",data.uptime_d);
JAddNumberToObject(body,"Uptime_h", data.uptime_h);
JAddNumberToObject(body,"Uptime_m", data.uptime_m);
JAddNumberToObject(body,"Days", data.runningDays);
JAddNumberToObject(body, "Battery Status", data.batteryStatus);
JAddNumberToObject(body, "LVP", data.LowVoltageProtection/10);
JAddNumberToObject(body, "LVR", data.LowVoltageRecovery/10);
JAddNumberToObject(body,"OVP", data.OverchargeVoltage/10);
JAddNumberToObject(body,"OVR", data.OverchargeRecovery/10);
JAddNumberToObject(body,"OTP", data.HighTempCutoff/10);
JAddNumberToObject(body,"LTP", data.LowTempCutoff);
JAddNumberToObject(body, "Boost", data.boostV);
JAddNumberToObject(body, "Boost", data.equalV);
JAddNumberToObject(body, "Float", data.floatV);
JAddStringToObject(body,"Type",data.BatteryType.c_str());
JAddStringToObject(body, "Mode", data.BatteryMode.c_str());
JAddNumberToObject(body,"Discharge Status",data.dischargeStatus);
JAddNumberToObject(body,"Test-H",data.test);
JAddStringToObject(body,"Version", version.c_str());
JAddNumberToObject(body, "Capacity", data.batteryCapacity);
//JAddItemToObject(req, "body", body);
Serial.print("Post Object RAM: ");
Serial.println(freeMemory());
notecard.sendRequest(req);
Serial.print("Post NoteRequest RAM: ");
Serial.println(freeMemory());
//JDelete(body);
Serial.println("-----------------------------------------------------");
}
It looks like the JSON object is created, uses 40 bytes of RAM and is later freed. However, notecard.sendRequest() uses 1950 bytes that are never freed.
Am I misusing sendRequest() / NoteRequest()?