#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <math.h>

struct rtt{
	double resistance;
	uint8_t divisor;
};

int main(int argc, char **argv){
	const uint8_t c_wr = 2;
	const uint8_t c_nom = 4;
	const uint8_t c_park = 2;
	const uint8_t c_procodt = 8;
	double max_amps = 0.101;
	double min_amps = 0.084;
	uint8_t ranks = 4;

	struct rtt wr[] = {{80, 3}, {120, 2}};
	struct rtt nom[] = {{34, 7}, {40, 6}, {48, 5}, {60, 4}};
	struct rtt park[] = {{120, 2}, {240, 1}};

	double procodt[] = {32, 34.3, 36.9, 40, 43.6, 48, 53.3, 60};

	double voltage = 1.40;
	double amps_wr, amps_nom, amps_park, amps_procodt;
	uint8_t div_wr, div_nom, div_park;
	double amps_total_read, amps_total_write;

	uint32_t num1 = 0;
	uint32_t num2 = 0;
	uint32_t num3 = 0;
	uint32_t num4 = 0;

	if(argc == 3){
		min_amps = atof(argv[1]);
		max_amps = atof(argv[2]);
	}

	printf("procodt\t\tnom\t\twr\t\tpark\t\ttotal_read\ttotal_write\n");
	//printf("procodt\t\tpark\t\tnom\t\twr\t\ttotal_read\ttotal_write\n");
	for(num1=0; num1<c_procodt; num1++){
		amps_procodt = voltage/procodt[num1];

		for(num2=0; num2<c_park; num2++){
			amps_park = voltage/park[num2].resistance;
			div_park = park[num2].divisor;
			for(num3=0; num3<c_nom; num3++){
				amps_nom = voltage/nom[num3].resistance;
				div_nom = nom[num3].divisor;
				for(num4=0; num4<c_wr; num4++){
					amps_wr = voltage/wr[num4].resistance;
					div_wr = wr[num4].divisor;
					amps_total_read = amps_procodt + amps_park*(ranks-1) + amps_nom;
					amps_total_write = amps_procodt + amps_park*(ranks-1) + amps_wr;
					if(amps_total_read < max_amps && amps_total_write < max_amps){
						if(amps_total_read > min_amps && amps_total_write > min_amps){
							printf("%lf(%.01lf)\t%lf(%u)\t%lf(%u)\t%lf(%u)\t%lf\t%lf\n", amps_procodt, procodt[num1], amps_nom, div_nom, amps_wr, div_wr, amps_park, div_park, amps_total_read, amps_total_write);
							//printf("%lf(%.01lf)\t%lf(%u)\t%lf(%u)\t%lf(%u)\t%lf\t%lf\n", amps_procodt, procodt[num1], amps_park, div_park, amps_nom, div_nom, amps_wr, div_wr, amps_total_read, amps_total_write);
						}
					}
				}
			}
		}

	}

}
