#include "configuration.hpp"
#include "../can/can-decoder.hpp"

configuration_t::configuration_t()
	:can_bus_manager_{utils::config_parser_t{"/etc/dev-mapping.conf"}}
	, can_message_set_{
		can_message_set_t{0, "example", {
			{std::make_shared<can_message_definition_t>(can_message_definition_t{"can0", 0x620, can_message_format_t::STANDARD, frequency_clock_t(0.00000f), true,
				{
					{std::make_shared<can_signal_t>(
					can_signal_t{
						"doors.coffer.open",
						56,
						1,
						1.00000f,
						0, 
						0,
						0,
						frequency_clock_t(0.00000f),
						false,
						false,
						{},
						false,
						decoder_t::booleanDecoder,
						nullptr,
						false
					})},
				{std::make_shared<can_signal_t> (
				can_signal_t{
					"doors.driver.open",
					46,
					1,
					1.00000f,
					0, 
					0,
					0,
					frequency_clock_t(0.00000f),
					false,
					false,
					{},
					false,
					decoder_t::booleanDecoder,
					nullptr,
					false
				})},
				{std::make_shared<can_signal_t> (
				can_signal_t{
					"doors.passenger.open",
					47,
					1,
					1.00000f,
					0, 
					0,
					0,
					frequency_clock_t(0.00000f),
					false,
					false,
					{},
					false,
					decoder_t::booleanDecoder,
					nullptr,
					false
				})},
				{std::make_shared<can_signal_t> (
				can_signal_t{
					"doors.rearleft.open",
					54,
					1,
					1.00000f, 
					0, 
					0,
					0,
					frequency_clock_t(0.00000f),
					false,
					false,
					{},
					false,
					decoder_t::booleanDecoder,
					nullptr,
					false
				})},
				{std::make_shared<can_signal_t> (
				can_signal_t{
					"doors.rearright.open",
					55,
					4,
					1.00000f, 
					0, 
					0,
					0,
					frequency_clock_t(0.00000f),
					false,
					false,
					{},
					false,
					decoder_t::booleanDecoder,
					nullptr,
					false
				})}
				}
			})}
		}}
	}
	, diagnostic_messages_
	{
		{
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				4,
				"engine.load",
				0,
				0,
				UNIT::INVALID,
				5.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				5,
				"engine.coolant.temperature",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				10,
				"fuel.pressure",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				11,
				"intake.manifold.pressure",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				12,
				"engine.speed",
				0,
				0,
				UNIT::INVALID,
				5.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				13,
				"vehicle.speed",
				0,
				0,
				UNIT::INVALID,
				5.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				15,
				"intake.air.temperature",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				16,
				"mass.airflow",
				0,
				0,
				UNIT::INVALID,
				5.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				17,
				"throttle.position",
				0,
				0,
				UNIT::INVALID,
				5.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				31,
				"running.time",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				45,
				"EGR.error",
				0,
				0,
				UNIT::INVALID,
				0.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				47,
				"fuel.level",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				51,
				"barometric.pressure",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				76,
				"commanded.throttle.position",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				82,
				"ethanol.fuel.percentage",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				90,
				"accelerator.pedal.position",
				0,
				0,
				UNIT::INVALID,
				5.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				91,
				"hybrid.battery-pack.remaining.life",
				0,
				0,
				UNIT::INVALID,
				5.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				92,
				"engine.oil.temperature",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				94,
				"engine.fuel.rate",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})},
			{std::make_shared<diagnostic_message_t>(diagnostic_message_t{
				99,
				"engine.torque",
				0,
				0,
				UNIT::INVALID,
				1.00000f,
				decoder_t::decode_obd2_response,
				nullptr,
				true
			})}
		}
	}
{}

const std::string configuration_t::get_diagnostic_bus() const
{
	return "can0";
}