// (C) 2018-2024 by Folkert van Heusden
// Released under MIT license

#if defined(ESP32)
#include <Arduino.h>
#endif
#include <cstdlib>
#include <cstring>

#include "log.h"
#include "memory.h"

memory::memory(const uint32_t size): size(size)
{
#if defined(ESP32)
	DOLOG(info, false, "Memory size (in bytes, decimal): %d", size);

	if (psramFound()) {
		DOLOG(info, false, "Using PSRAM");

		m = reinterpret_cast<uint8_t *>(ps_malloc(size));

		reset();
	}
	else {
		m = reinterpret_cast<uint8_t *>(calloc(1, size));
	}
#else
	m = reinterpret_cast<uint8_t *>(calloc(1, size));
#endif
}

memory::~memory()
{
	free(m);
}

void memory::reset()
{
	memset(m, 0x00, size);
}

JsonDocument memory::serialize() const
{
	JsonDocument j;

	j["size"] = size;

	JsonDocument ja;
	JsonArray ja_work = ja.to<JsonArray>();
	for(size_t i=0; i<size; i++)
		ja_work.add(m[i]);
	j["contents"] = ja;

	return j;
}

memory *memory::deserialize(const JsonVariantConst j)
{
	size_t  size = j["size"];
	memory *m    = new memory(size);

	JsonArrayConst ja = j["contents"].as<JsonArrayConst>();
	uint32_t  i  = 0;
	for(auto v: ja)
		m->m[i++] = v;

	return m;
}