diff --git a/src/calc.cpp b/src/calc.cpp index 94177f9..559b837 100644 --- a/src/calc.cpp +++ b/src/calc.cpp @@ -21,35 +21,35 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include "calc.h" -#include "helper.h" -#include "config.h" +#include "src/calc.h" #include -#include "tempsensor.h" #include +#include "src/helper.h" +#include "src/config.h" +#include "src/tempsensor.h" #define FORMULA_MAX_DEVIATION 1.5 // // Use values to derive a formula // -int createFormula( RawFormulaData& fd, char *formulaBuffer, int order ) { - +int createFormula(RawFormulaData& fd, char *formulaBuffer, int formulaBufferSize, int order) { + int noAngles = 0; // Check how many valid values we have got - if( fd.a[0]>0 && fd.a[1]>0 && fd.a[2]>0 && fd.a[3]>0 && fd.a[4]>0 ) + if ( fd.a[0] > 0 && fd.a[1] > 0 && fd.a[2] > 0 && fd.a[3] > 0 && fd.a[4] > 0 ) noAngles = 5; - else if( fd.a[0]>0 && fd.a[1]>0 && fd.a[2]>0 && fd.a[3]>0 ) + else if ( fd.a[0] > 0 && fd.a[1] > 0 && fd.a[2] > 0 && fd.a[3] > 0 ) noAngles = 4; - else if( fd.a[0]>0 && fd.a[1]>0 && fd.a[2]>0 ) + else if ( fd.a[0] > 0 && fd.a[1] > 0 && fd.a[2] > 0 ) noAngles = 3; -#if LOG_LEVEL==6 +#if LOG_LEVEL == 6 Log.verbose(F("CALC: Trying to create formula using order = %d, found %d angles" CR), order, noAngles); #endif - if( !noAngles ) { + if ( !noAngles ) { Log.error(F("CALC: Not enough values for deriving formula" CR)); return ERR_FORMULA_NOTENOUGHVALUES; } else { @@ -57,75 +57,75 @@ int createFormula( RawFormulaData& fd, char *formulaBuffer, int order ) { double coeffs[order+1]; int ret = fitCurve(order, noAngles, fd.a, fd.g, sizeof(coeffs)/sizeof(double), coeffs); - //Returned value is 0 if no error - if( ret == 0 ) { + // Returned value is 0 if no error + if ( ret == 0 ) { -#if LOG_LEVEL==6 +#if LOG_LEVEL == 6 Log.verbose(F("CALC: Finshied processing data points." CR)); #endif // Print the formula based on 'order' - if( order == 4 ) { - sprintf( formulaBuffer, "%.8f*tilt^4+%.8f*tilt^3+%.8f*tilt^2+%.8f*tilt+%.8f", coeffs[0], coeffs[1], coeffs[2], coeffs[3], coeffs[4] ); - } else if( order == 3 ) { - sprintf( formulaBuffer, "%.8f*tilt^3+%.8f*tilt^2+%.8f*tilt+%.8f", coeffs[0], coeffs[1], coeffs[2], coeffs[3] ); - } else if( order == 2 ) { - sprintf( formulaBuffer, "%.8f*tilt^2+%.8f*tilt+%.8f", coeffs[0], coeffs[1], coeffs[2] ); + if ( order == 4 ) { + snprintf(formulaBuffer, formulaBufferSize, "%.8f*tilt^4+%.8f*tilt^3+%.8f*tilt^2+%.8f*tilt+%.8f", coeffs[0], coeffs[1], coeffs[2], coeffs[3], coeffs[4]); + } else if ( order == 3 ) { + snprintf(formulaBuffer, formulaBufferSize, "%.8f*tilt^3+%.8f*tilt^2+%.8f*tilt+%.8f", coeffs[0], coeffs[1], coeffs[2], coeffs[3]); + } else if ( order == 2 ) { + snprintf(formulaBuffer, formulaBufferSize, "%.8f*tilt^2+%.8f*tilt+%.8f", coeffs[0], coeffs[1], coeffs[2]); } else { // order == 1 - sprintf( formulaBuffer, "%.8f*tilt+%.8f", coeffs[0], coeffs[1] ); + snprintf(formulaBuffer, formulaBufferSize, "%.8f*tilt+%.8f", coeffs[0], coeffs[1]); } -#if LOG_LEVEL==6 +#if LOG_LEVEL == 6 Log.verbose(F("CALC: Formula: %s" CR), formulaBuffer ); #endif bool valid = true; - for( int i = 0; i < 5; i++ ) { - if( fd.a[i]==0 && valid ) - break; + for ( int i = 0; i < 5; i++ ) { + if ( fd.a[i] == 0 && valid ) + break; - double g = calculateGravity( fd.a[i], 0, formulaBuffer ); - double dev = (g-fd.g[i])<0 ? (fd.g[i]-g) : (g-fd.g[i]); + double g = calculateGravity(fd.a[i], 0, formulaBuffer); + double dev = (g-fd.g[i]) < 0 ? (fd.g[i]-g) : (g-fd.g[i]); // If the deviation is more than 2 degress we mark it as failed. - if( dev*1000 > FORMULA_MAX_DEVIATION ) + if ( dev*1000 > FORMULA_MAX_DEVIATION ) valid = false; } - - if( !valid ) { + + if ( !valid ) { Log.error(F("CALC: Deviation to large, formula rejected." CR)); return ERR_FORMULA_UNABLETOFFIND; } - Log.info(F("CALC: Found formula '%s'." CR), formulaBuffer ); + Log.info(F("CALC: Found formula '%s'." CR), formulaBuffer); return 0; - } + } } Log.error(F("CALC: Internal error finding formula." CR)); - return ERR_FORMULA_INTERNAL; + return ERR_FORMULA_INTERNAL; } // -// Calculates gravity according to supplied formula, compatible with iSpindle/Fermentrack formula +// Calculates gravity according to supplied formula, compatible with iSpindle/Fermentrack formula // -double calculateGravity( double angle, double temp, const char *tempFormula ) { +double calculateGravity(double angle, double temp, const char *tempFormula) { const char* formula = myConfig.getGravityFormula(); - if( tempFormula != 0 ) { -#if LOG_LEVEL==6 + if ( tempFormula != 0 ) { +#if LOG_LEVEL == 6 Log.verbose(F("CALC: Using temporary formula." CR)); #endif formula = tempFormula; } -#if LOG_LEVEL==6 +#if LOG_LEVEL == 6 Log.verbose(F("CALC: Calculating gravity for angle %F, temp %F." CR), angle, temp); Log.verbose(F("CALC: Formula %s." CR), formula); #endif - if( strlen(formula) == 0 ) + if ( strlen(formula) == 0 ) return 0.0; // Store variable names and pointers. @@ -135,15 +135,15 @@ double calculateGravity( double angle, double temp, const char *tempFormula ) { // Compile the expression with variables. te_expr *expr = te_compile(formula, vars, 2, &err); - if (expr) { - double g = te_eval(expr); + if ( expr ) { + double g = te_eval(expr); te_free(expr); -#if LOG_LEVEL==6 +#if LOG_LEVEL == 6 Log.verbose(F("CALC: Calculated gravity is %F." CR), g); #endif return g; - } + } Log.error(F("CALC: Failed to parse expression %d." CR), err); return 0; @@ -152,13 +152,13 @@ double calculateGravity( double angle, double temp, const char *tempFormula ) { // // Do a standard gravity temperature correction. This is a simple way to adjust for differnt worth temperatures // -double gravityTemperatureCorrection( double gravity, double temp, char tempFormat, double calTemp) { -#if LOG_LEVEL==6 +double gravityTemperatureCorrection(double gravity, double temp, char tempFormat, double calTemp) { +#if LOG_LEVEL == 6 Log.verbose(F("CALC: Adjusting gravity based on temperature, gravity %F, temp %F, calTemp %F." CR), gravity, temp, calTemp); #endif - if( tempFormat == 'C') - temp = convertCtoF( temp ); + if ( tempFormat == 'C') + temp = convertCtoF(temp); double calTempF = convertCtoF(calTemp); // calTemp is in C const char* formula = "gravity*((1.00130346-0.000134722124*temp+0.00000204052596*temp^2-0.00000000232820948*temp^3)/(1.00130346-0.000134722124*cal+0.00000204052596*cal^2-0.00000000232820948*cal^3))"; @@ -169,18 +169,18 @@ double gravityTemperatureCorrection( double gravity, double temp, char tempForma // Compile the expression with variables. te_expr *expr = te_compile(formula, vars, 3, &err); - if (expr) { - double g = te_eval(expr); + if ( expr ) { + double g = te_eval(expr); te_free(expr); -#if LOG_LEVEL==6 +#if LOG_LEVEL == 6 Log.verbose(F("CALC: Corrected gravity is %F." CR), g); #endif return g; - } + } Log.error(F("CALC: Failed to parse expression %d, no correction has been made." CR), err); return gravity; } -// EOF \ No newline at end of file +// EOF diff --git a/src/calc.h b/src/calc.h index 812721b..cc10378 100644 --- a/src/calc.h +++ b/src/calc.h @@ -21,22 +21,22 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef _CALC_H -#define _CALC_H +#ifndef SRC_CALC_H_ +#define SRC_CALC_H_ // Includes -#include "helper.h" -#include "config.h" +#include "src/helper.h" +#include "src/config.h" -#define ERR_FORMULA_NOTENOUGHVALUES -1 +#define ERR_FORMULA_NOTENOUGHVALUES -1 #define ERR_FORMULA_INTERNAL -2 -#define ERR_FORMULA_UNABLETOFFIND -3 +#define ERR_FORMULA_UNABLETOFFIND -3 // Functions -double calculateGravity( double angle, double temp, const char *tempFormula = 0 ); -double gravityTemperatureCorrection( double gravity, double temp, char tempFormat, double calTemp = 20 ); -int createFormula( RawFormulaData& fd, char *formulaBuffer, int order); +double calculateGravity(double angle, double temp, const char *tempFormula = 0); +double gravityTemperatureCorrection(double gravity, double temp, char tempFormat, double calTemp = 20); +int createFormula(RawFormulaData& fd, char *formulaBuffer, int formulaBufferSize, int order); -#endif // _CALC_H +#endif // SRC_CALC_H_ -// EOF \ No newline at end of file +// EOF