#include "evsemeter.h"
#include "esp_event.h"
#include "esp_log.h"
#include "ade7758.h"

#define PIN_NUM_CLK  15
#define PIN_NUM_MOSI 2
#define PIN_NUM_MISO 4
#define PIN_NUM_CS   23
#define EEPROM_HOST  HSPI_HOST

#define IRMS_CAL  53416.0f

static const char *TAG = "evsemeter_ade7758";

esp_err_t evsemeter_init(void)
{
    ESP_LOGI(TAG, "Initializing EVSE meter (ADE7758)");

    ESP_ERROR_CHECK(Init(EEPROM_HOST, PIN_NUM_MISO, PIN_NUM_MOSI, PIN_NUM_CLK));
    ESP_ERROR_CHECK(InitSpi(PIN_NUM_CS));

    gainSetup(INTEGRATOR_OFF, FULLSCALESELECT_0_5V, GAIN_1, GAIN_1);
    setupDivs(1, 1, 1);
    setLcycMode(0x00);
    resetStatus();

    return ESP_OK;
}

esp_err_t evsemeter_read_current(float *current)
{
    if (!current) {
        return ESP_ERR_INVALID_ARG;
    }

    *current = airms() / IRMS_CAL;
    esp_event_post(EVSEMETER_EVENT, EVSEMETER_EVENT_UPDATE, current, sizeof(float), portMAX_DELAY);
    return ESP_OK;
}
