Added 3 more points for formula calculation

This commit is contained in:
Magnus Persson 2022-04-10 19:13:50 +02:00
parent a648d54a14
commit 7eddf35b97
8 changed files with 98 additions and 37 deletions

View File

@ -91,38 +91,56 @@
<div class="row">
<label class="col-sm-1 col-form-label">#</label>
<label class="col-sm-4 col-form-label">Angle/Tilt</label>
<label class="col-sm-4 col-form-label" id="gravity-header">Gravity</label>
<label class="col-sm-2 col-form-label">Angle/Tilt</label>
<label class="col-sm-2 col-form-label" id="gravity-header">Gravity</label>
</div>
<div class="row mb-3">
<label for="angle1" class="col-sm-1 col-form-label">1.</label>
<div class="col-sm-4"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a1" id="a1"></div>
<div class="col-sm-4"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g1" id="g1"></div>
<div class="col-sm-2"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a1" id="a1"></div>
<div class="col-sm-2"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g1" id="g1"></div>
</div>
<div class="row mb-3">
<label for="angle2" class="col-sm-1 col-form-label">2.</label>
<div class="col-sm-4"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a2" id="a2"></div>
<div class="col-sm-4"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g2" id="g2"></div>
<div class="col-sm-2"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a2" id="a2"></div>
<div class="col-sm-2"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g2" id="g2"></div>
</div>
<div class="row mb-3">
<label for="angle3" class="col-sm-1 col-form-label">3.</label>
<div class="col-sm-4"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a3" id="a3"></div>
<div class="col-sm-4"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g3" id="g3"></div>
<div class="col-sm-2"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a3" id="a3"></div>
<div class="col-sm-2"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g3" id="g3"></div>
</div>
<div class="row mb-3">
<label for="angle4" class="col-sm-1 col-form-label">4.</label>
<div class="col-sm-4"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a4" id="a4"></div>
<div class="col-sm-4"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g4" id="g4"></div>
<div class="col-sm-2"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a4" id="a4"></div>
<div class="col-sm-2"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g4" id="g4"></div>
</div>
<div class="row mb-3">
<label for="angle5" class="col-sm-1 col-form-label">5.</label>
<div class="col-sm-4"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a5" id="a5"></div>
<div class="col-sm-4"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g5" id="g5"></div>
<div class="col-sm-2"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a5" id="a5"></div>
<div class="col-sm-2"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g5" id="g5"></div>
</div>
<div class="row mb-3">
<label for="angle6" class="col-sm-1 col-form-label">6.</label>
<div class="col-sm-2"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a6" id="a6"></div>
<div class="col-sm-2"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g6" id="g6"></div>
</div>
<div class="row mb-3">
<label for="angle7" class="col-sm-1 col-form-label">7.</label>
<div class="col-sm-2"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a7" id="a7"></div>
<div class="col-sm-2"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g7" id="g7"></div>
</div>
<div class="row mb-3">
<label for="angle8" class="col-sm-1 col-form-label">8.</label>
<div class="col-sm-2"><input type="number" min="0" max="90" step="0.001" class="form-control" name="a8" id="a8"></div>
<div class="col-sm-2"><input type="number" min="0" max="26" step="0.0001" class="form-control" name="g8" id="g8"></div>
</div>
<div class="row mb-3">
@ -220,12 +238,18 @@
g3.onchange = setGravityDecimal
g4.onchange = setGravityDecimal
g5.onchange = setGravityDecimal
g6.onchange = setGravityDecimal
g7.onchange = setGravityDecimal
g8.onchange = setGravityDecimal
a1.onchange = setAngleDecimal
a2.onchange = setAngleDecimal
a3.onchange = setAngleDecimal
a4.onchange = setAngleDecimal
a5.onchange = setAngleDecimal
a6.onchange = setAngleDecimal
a7.onchange = setAngleDecimal
a8.onchange = setAngleDecimal
window.onload = getConfig;
setButtonDisabled( true );
@ -293,6 +317,9 @@
populateChartForm( $("#a3").val(), $("#g3").val() );
populateChartForm( $("#a4").val(), $("#g4").val() );
populateChartForm( $("#a5").val(), $("#g5").val() );
populateChartForm( $("#a6").val(), $("#g6").val() );
populateChartForm( $("#a7").val(), $("#g7").val() );
populateChartForm( $("#a8").val(), $("#g8").val() );
if( myChart )
myChart.destroy();
@ -336,6 +363,9 @@
$("#g3").val( parseFloat(cfg["g3"]).toFixed(4) );
$("#g4").val( parseFloat(cfg["g4"]).toFixed(4) );
$("#g5").val( parseFloat(cfg["g5"]).toFixed(4) );
$("#g6").val( parseFloat(cfg["g6"]).toFixed(4) );
$("#g7").val( parseFloat(cfg["g7"]).toFixed(4) );
$("#g8").val( parseFloat(cfg["g8"]).toFixed(4) );
}
$("#a1").val( parseFloat(cfg["a1"]).toFixed(2) );
@ -343,6 +373,9 @@
$("#a3").val( parseFloat(cfg["a3"]).toFixed(2) );
$("#a4").val( parseFloat(cfg["a4"]).toFixed(2) );
$("#a5").val( parseFloat(cfg["a5"]).toFixed(2) );
$("#a6").val( parseFloat(cfg["a6"]).toFixed(2) );
$("#a7").val( parseFloat(cfg["a7"]).toFixed(2) );
$("#a8").val( parseFloat(cfg["a8"]).toFixed(2) );
if( cfg["error"]!="" ) {
showError(cfg["error"]);

File diff suppressed because one or more lines are too long

View File

@ -106,16 +106,16 @@
<input type="text" name="id" id="id1" hidden>
<div class="row mb-3">
<label for="mdns" class="col-sm-3 col-form-label">Device name:</label>
<label for="mdns" class="col-sm-2 col-form-label">Device name:</label>
<div class="col-sm-3">
<input type="text" maxlength="12" class="form-control" name="mdns" id="mdns">
</div>
</div>
<div class="row mb-3">
<fieldset class="form-group">
<legend class="col-form-label col-sm-3 float-sm-left pt-0">Temperature Format:</legend>
<div class="col-sm-6">
<fieldset class="form-group row">
<legend class="col-form-label col-sm-2 float-sm-left pt-0">Temperature Format:</legend>
<div class="col-sm-4">
<div class="form-check">
<input class="form-check-input" type="radio" name="temp-format" id="temp-format-c" value="C" checked>
<label class="form-check-label" for="temp-format-c">Celsius</label>
@ -129,7 +129,7 @@
</div>
<div class="row mb-3">
<label for="sleep-interval" class="col-sm-3 col-form-label">Interval (seconds):</label>
<label for="sleep-interval" class="col-sm-2 col-form-label">Interval (seconds):</label>
<div class="col-sm-2">
<input type="number" min="10" max="3600" class="form-control" name="sleep-interval" id="sleep-interval">
</div>
@ -137,7 +137,7 @@
</div>
<div class="row mb-3">
<div class="col-sm-8 offset-sm-3">
<div class="col-sm-4 offset-sm-2">
<button type="submit" class="btn btn-primary" id="device-btn">Save</button>
</div>
</div>
@ -146,10 +146,10 @@
<hr class="my-2">
<div class="row mb-3">
<label for="calibrate-btn" class="col-sm-3 col-form-label">Current calibration values:</label>
<label for="calibrate-btn" class="col-sm-3 col-form-label" id="gyro-calibration-data">Loading...</label>
<label for="gyro-calibration-data" class="col-sm-3 col-form-label" id="angle">Loading...</label>
<div class="col-sm-8 offset-sm-3">
<label for="calibrate-btn" class="col-sm-2 col-form-label">Current calibration:</label>
<label for="calibrate-btn" class="col-sm-2 col-form-label" id="gyro-calibration-data">Loading...</label>
<label for="gyro-calibration-data" class="col-sm-2 col-form-label" id="angle">Loading...</label>
<div class="col-sm-8 offset-sm-2">
<button type="button" class="btn btn-warning" id="calibrate-btn">Calibrate device</button>
</div>
</div>

File diff suppressed because one or more lines are too long

View File

@ -33,14 +33,16 @@ SOFTWARE.
int createFormula(RawFormulaData &fd, char *formulaBuffer,
int formulaBufferSize, int order) {
int noAngles = 0;
RawFormulaData fd2;
// 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)
noAngles = 5;
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)
noAngles = 3;
// Check how many valid values we have got and make sure we have a full series.
for (int i = 0; i < FORMULA_DATA_SIZE; i++) {
if (fd.a[i]) {
fd2.a[noAngles] = fd.a[i];
fd2.g[noAngles] = fd.g[i];
noAngles++;
}
}
#if LOG_LEVEL == 6 && !defined(CALC_DISABLE_LOGGING)
Log.verbose(
@ -54,13 +56,13 @@ int createFormula(RawFormulaData &fd, char *formulaBuffer,
return ERR_FORMULA_NOTENOUGHVALUES;
} else {
double coeffs[order + 1];
int ret = fitCurve(order, noAngles, fd.a, fd.g,
int ret = fitCurve(order, noAngles, fd2.a, fd2.g,
sizeof(coeffs) / sizeof(double), coeffs);
// Returned value is 0 if no error
if (ret == 0) {
#if LOG_LEVEL == 6 && !defined(CALC_DISABLE_LOGGING)
Log.verbose(F("CALC: Finshied processing data points." CR));
Log.verbose(F("CALC: Finshied processing data points, order = %d." CR), order);
#endif
// Print the formula based on 'order'

View File

@ -47,9 +47,11 @@ struct RawGyroData {
};
// Used for holding formulaData (used for calculating formula on device)
#define FORMULA_DATA_SIZE 8
struct RawFormulaData {
double a[5];
double g[5];
double a[FORMULA_DATA_SIZE];
double g[FORMULA_DATA_SIZE];
};
class HardwareConfig {

View File

@ -696,7 +696,7 @@ void WebServerHandler::webHandleFormulaRead() {
LOG_PERF_START("webserver-api-formula-read");
Log.notice(F("WEB : webServer callback for /api/formula(get)." CR));
DynamicJsonDocument doc(250);
DynamicJsonDocument doc(512);
const RawFormulaData& fd = myConfig.getFormulaData();
#if LOG_LEVEL == 6 && !defined(WEB_DISABLE_LOGGING)
@ -729,6 +729,9 @@ void WebServerHandler::webHandleFormulaRead() {
doc["a3"] = reduceFloatPrecision(fd.a[2], 2);
doc["a4"] = reduceFloatPrecision(fd.a[3], 2);
doc["a5"] = reduceFloatPrecision(fd.a[4], 2);
doc["a6"] = reduceFloatPrecision(fd.a[5], 2);
doc["a7"] = reduceFloatPrecision(fd.a[6], 2);
doc["a8"] = reduceFloatPrecision(fd.a[7], 2);
if (myConfig.isGravityPlato()) {
doc["g1"] = reduceFloatPrecision(convertToPlato(fd.g[0]), 1);
@ -736,12 +739,18 @@ void WebServerHandler::webHandleFormulaRead() {
doc["g3"] = reduceFloatPrecision(convertToPlato(fd.g[2]), 1);
doc["g4"] = reduceFloatPrecision(convertToPlato(fd.g[3]), 1);
doc["g5"] = reduceFloatPrecision(convertToPlato(fd.g[4]), 1);
doc["g6"] = reduceFloatPrecision(convertToPlato(fd.g[5]), 1);
doc["g7"] = reduceFloatPrecision(convertToPlato(fd.g[6]), 1);
doc["g8"] = reduceFloatPrecision(convertToPlato(fd.g[7]), 1);
} else {
doc["g1"] = reduceFloatPrecision(fd.g[0], 4);
doc["g2"] = reduceFloatPrecision(fd.g[1], 4);
doc["g3"] = reduceFloatPrecision(fd.g[2], 4);
doc["g4"] = reduceFloatPrecision(fd.g[3], 4);
doc["g5"] = reduceFloatPrecision(fd.g[4], 4);
doc["g6"] = reduceFloatPrecision(fd.g[5], 4);
doc["g7"] = reduceFloatPrecision(fd.g[6], 4);
doc["g8"] = reduceFloatPrecision(fd.g[7], 4);
}
#if LOG_LEVEL == 6 && !defined(WEB_DISABLE_LOGGING)
@ -995,6 +1004,9 @@ void WebServerHandler::webHandleFormulaWrite() {
fd.a[2] = _server->arg("a3").toDouble();
fd.a[3] = _server->arg("a4").toDouble();
fd.a[4] = _server->arg("a5").toDouble();
fd.a[5] = _server->arg("a6").toDouble();
fd.a[6] = _server->arg("a7").toDouble();
fd.a[7] = _server->arg("a8").toDouble();
if (myConfig.isGravityPlato()) {
fd.g[0] = convertToSG(_server->arg("g1").toDouble());
@ -1002,12 +1014,18 @@ void WebServerHandler::webHandleFormulaWrite() {
fd.g[2] = convertToSG(_server->arg("g3").toDouble());
fd.g[3] = convertToSG(_server->arg("g4").toDouble());
fd.g[4] = convertToSG(_server->arg("g5").toDouble());
fd.g[5] = convertToSG(_server->arg("g6").toDouble());
fd.g[6] = convertToSG(_server->arg("g7").toDouble());
fd.g[7] = convertToSG(_server->arg("g8").toDouble());
} else {
fd.g[0] = _server->arg("g1").toDouble();
fd.g[1] = _server->arg("g2").toDouble();
fd.g[2] = _server->arg("g3").toDouble();
fd.g[3] = _server->arg("g4").toDouble();
fd.g[4] = _server->arg("g5").toDouble();
fd.g[5] = _server->arg("g6").toDouble();
fd.g[6] = _server->arg("g7").toDouble();
fd.g[7] = _server->arg("g8").toDouble();
}
myConfig.setFormulaData(fd);

View File

@ -6,10 +6,16 @@
"a2": 45,
"a4": 55,
"a5": 30,
"a6": 30,
"a7": 30,
"a8": 30,
"g1": 1.000,
"g3": 1.010,
"g2": 1.025,
"g4": 1.040,
"g5": 1.005,
"g6": 1.005,
"g7": 1.005,
"g8": 1.005,
"error": ""
}