/*
 * ioController.cpp
 *
 *  Created on: 20.11.2018
 *      Author: Hendrik Schutter
 */

#include "openChargeMicro.h"

ioController::ioController() {
	ports_init();
	adc_init();
}

ioController::~ioController() {

}

double ioController::get5VProbe() {
	int tmp = (int) readAdc(2);
	double ret = ((double) tmp) * 0.006242;
	return ret;
}

double ioController::get15VProbe() {
	int tmp = (int) readAdc(1);
	double ret = ((double) tmp) * 0.014968;
	return ret;
}

void ioController::ports_init() {
	DDRD |= 1 << WS2812B;
	DDRB |= 1 << ACTIVELED;
	DDRB |= 1 << BUZZER;
	DDRB |= 1 << POWERON;
	DDRD |= 1 << S2;
	DDRD |= 1 << S1;
	DDRD |= 1 << S0;

	DDRC &= ~(1 << PROBE15V);
	DDRC &= ~(1 << PROBE5V);
	DDRC &= ~(1 << Z);
}

void ioController::activateChargers() {

	PORTB &= ~(1 << POWERON); //OFF
}

void ioController::deactivateChargers() {
	PORTB |= (1 << POWERON); //ON
}

void ioController::setActiveLED(bool pBool) {
	if (pBool) {
		PORTB |= (1 << ACTIVELED); //ON
	} else {
		PORTB &= ~(1 << ACTIVELED); //OFF
	}
}

void ioController::setBuzzer(bool pBool) {
	//TODO needs testing
	if (pBool) {
		PORTB |= (1 << BUZZER); //ON
	} else {
		PORTB &= ~(1 << BUZZER); //OFF
	}
}

void ioController::adc_init(void) {
	ADMUX = (1 << REFS0);     //select AVCC as reference
	ADCSRA = (1 << ADEN) | 7;  //enable and prescale = 128 (16MHz/128 = 125kHz)
}

int ioController::readAdc(char ch) {
	ADMUX = (1 << REFS0) | (ch & 0x0f);  //select input and ref
	ADCSRA |= (1 << ADSC);                 //start the conversion
	while (ADCSRA & (1 << ADSC))
		;          //wait for end of conversion
	return ADCW;
}

void ioController::setMultiplexer(bool pS2, bool pS1, bool pS0) {

	if (pS0) {
		PORTD |= (1 << S0); //ON
	} else {
		PORTD &= ~(1 << S0); //OFF
	}

	if (pS1) {
		PORTD |= (1 << S1); //ON
	} else {
		PORTD &= ~(1 << S1); //OFF
	}

	if (pS2) {
		PORTD |= (1 << S2); //ON
	} else {
		PORTD &= ~(1 << S2); //OFF
	}

}

