diff --git a/lib/.eseries.c.kate-swp b/lib/.eseries.c.kate-swp deleted file mode 100644 index ca10a58..0000000 Binary files a/lib/.eseries.c.kate-swp and /dev/null differ diff --git a/lib/eseries.c b/lib/eseries.c index bf858da..9504290 100644 --- a/lib/eseries.c +++ b/lib/eseries.c @@ -38,4 +38,54 @@ ESeriesMaxValue get_E_MAX(ESeries E_series) { double round_to_E_series (double continuous_value, ESeries E_series) { + /* + * check for range. An E series is defined within one decade. + * values from 1 to 10 are accepted + */ + if (continuous_value >= 10 || continuous_value < 1) { + printf("eseries:round_to_E_series: Value out of range.\n"); + return E_NIL; + } + + double e_value = 0.0; + + // set the max array index for given e series. + unsigned int e_max_values = get_E_MAX(E_series); + if (e_max_values == E_NIL) { + printf("eseries:round_to_E_series: Unknown E series.\n"); + return E_NIL; + } + + int upper_e_limit = e_max_values; + int lower_e_limit = 0; + + for (int i = 0 ; i < log2((e_max_values/3)); i++) { + + if (continuous_value < E_values[E_series][((upper_e_limit - lower_e_limit + 1) / 2) + lower_e_limit]) { + upper_e_limit = ((upper_e_limit - lower_e_limit + 1) / 2) + lower_e_limit - 1; + } + else { + lower_e_limit = ((upper_e_limit - lower_e_limit + 1) / 2) + lower_e_limit; + } + } + + if (continuous_value < E_values[E_series][lower_e_limit + 1]) + { + if (fabs(continuous_value - E_values[E_series][lower_e_limit]) < fabs(continuous_value - E_values[E_series][lower_e_limit + 1])) { + e_value = E_values[E_series][lower_e_limit]; + } + else { + e_value = E_values[E_series][lower_e_limit + 1]; + } + } + else { + if (fabs(continuous_value - E_values[E_series][upper_e_limit]) < fabs(continuous_value - E_values[E_series][upper_e_limit - 1])) { + e_value = E_values[E_series][upper_e_limit]; + } + else { + e_value = E_values[E_series][upper_e_limit - 1]; + } + } + + return e_value; } diff --git a/lib/eseries.h b/lib/eseries.h index ce8af7c..49e9bdb 100644 --- a/lib/eseries.h +++ b/lib/eseries.h @@ -2,6 +2,10 @@ #ifndef ESERIES_H #define ESERIES_H +#include +#include +#include + double E3_values[3] = { 1.0, 2.2, 4.7 }; double E6_values[6] = { 1.0, 1.5, 2.2, 3.3, 4.7, 6.8 }; @@ -19,7 +23,7 @@ double E192_values[192] = { 1.00, 1.01, 1.02, 1.04, 1.05, 1.06, 1.07, 1.09, 1.10 double *E_values[7] = {E3_values, E6_values, E12_values, E24_values, E48_values, E96_values, E192_values}; typedef enum {E3, E6, E12, E24, E48, E96, E192} ESeries; -typedef enum {E_NIL=0, E3_MAX=3, E6_MAX=6, E12_MAX=12, E24_MAX=24, E48_MAX=48, E96_MAX=96, E192_MAX=192} ESeriesMaxValue; +typedef enum {E_NIL=0, E3_MAX=2, E6_MAX=5, E12_MAX=11, E24_MAX=23, E48_MAX=47, E96_MAX=95, E192_MAX=191} ESeriesMaxValue; extern ESeriesMaxValue get_E_MAX(ESeries E_series); diff --git a/lib/max_functions.c b/lib/max_functions.c index 24c364c..0069284 100644 --- a/lib/max_functions.c +++ b/lib/max_functions.c @@ -43,7 +43,7 @@ int set_output_voltage(double setpoint_voltage, ESeries E_resistors) { R_low_decade_w = i_low; - for (int j_low = 0; j_low < e_max_values; j_low++) { + for (int j_low = 0; j_low <= e_max_values; j_low++) { // in the 6th decate only examine R_low = 1M, then stop if ( i_low == 6 && j_low > 0 )