#include "ina219.hpp"

void ForteINA219 ::setup()
{
	Wire.begin(I2C_SDA, I2C_SCL);
	if (!ina219.init()) {
		// Sensor init went wrong
		ESP_LOGW(sensorInformation.getHardwareName().c_str(), "Initialization failed");
		return;
	}
}

out_data_ina219 ForteINA219 ::readData()
{
	if (!ina219.getOverflow()) {
		data.shuntVoltage_mV = ina219.getShuntVoltage_mV();
		data.busVoltage_V = ina219.getBusVoltage_V();
		data.current_mA = ina219.getCurrent_mA();
		data.power_mW = ina219.getBusPower();
		data.loadVoltage_V = data.busVoltage_V + (data.shuntVoltage_mV / 1000);
		data.ina219_overflow = ina219.getOverflow();

		return data;
	} else
		return data;
}

std::list<Message> ForteINA219::buildMessages()
{
	std::list<Message> messages;
	out_data_ina219 data = readData();
	MeasurementData shuntVoltageData{
		data.shuntVoltage_mV, 0, {}, measurementTypeToString.at(MeasurementType::SHUNT_VOLTAGE)
	};
	MeasurementData busVoltageData{
		data.busVoltage_V, 0, {}, measurementTypeToString.at(MeasurementType::BUS_VOLTAGE)
	};
	MeasurementData currentMilliAmpData{
		data.current_mA, 0, {}, measurementTypeToString.at(MeasurementType::CURRENT_mA)
	};
	MeasurementData powerMilliWattData{
		data.power_mW, 0, {}, measurementTypeToString.at(MeasurementType::POWER_mA)
	};
	MeasurementData loadVoltageData{
		data.loadVoltage_V, 0, {}, measurementTypeToString.at(MeasurementType::LOAD_VOLTAGE_V)
	};
	MeasurementData ina219OverflowData{
		data.ina219_overflow, 0, {}, measurementTypeToString.at(MeasurementType::INA219_OVERFLOW)
	};

	messages.emplace_back(Message(shuntVoltageData, sensorInformation, 0));
	messages.emplace_back(Message(busVoltageData, sensorInformation,0));
	messages.emplace_back(Message(currentMilliAmpData, sensorInformation, 0));
	messages.emplace_back(Message(powerMilliWattData, sensorInformation, 0));
	messages.emplace_back(Message(loadVoltageData, sensorInformation, 0));
	messages.emplace_back(Message(ina219OverflowData, sensorInformation, 0));

	return messages;
}
SensorInformation ForteINA219::getSensorInformation() const
{
	return sensorInformation;
}