Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Crocker <dcrocker@eschertech.com>2021-03-19 19:55:37 +0300
committerDavid Crocker <dcrocker@eschertech.com>2021-03-19 19:55:37 +0300
commit7ed5657a579557a3f709feda9ebd30b649773da3 (patch)
treee771e72ba7eda45f6d3c40bd09abd386ad36a91a /src/Accelerometers
parent698d61bffa3a02d01dfef52536eedf3337740291 (diff)
Accelerometer fixes
Diffstat (limited to 'src/Accelerometers')
-rw-r--r--src/Accelerometers/Accelerometers.cpp48
-rw-r--r--src/Accelerometers/Accelerometers.h2
2 files changed, 31 insertions, 19 deletions
diff --git a/src/Accelerometers/Accelerometers.cpp b/src/Accelerometers/Accelerometers.cpp
index b44b08d5..1f44fd52 100644
--- a/src/Accelerometers/Accelerometers.cpp
+++ b/src/Accelerometers/Accelerometers.cpp
@@ -19,7 +19,7 @@ static unsigned int expectedSampleNumber;
static CanAddress currentBoard = CanId::NoAddress;
static uint8_t axes;
-void Accelerometers::ProcessReceivedData(CanAddress src, const CanMessageAccelerometerData& msg) noexcept
+void Accelerometers::ProcessReceivedData(CanAddress src, const CanMessageAccelerometerData& msg, size_t msgLen) noexcept
{
if (msg.firstSampleNumber == 0)
{
@@ -28,6 +28,7 @@ void Accelerometers::ProcessReceivedData(CanAddress src, const CanMessageAcceler
{
f->Write("Data incomplete\n");
f->Close();
+ f = nullptr;
}
Platform& p = reprap.GetPlatform();
@@ -35,50 +36,57 @@ void Accelerometers::ProcessReceivedData(CanAddress src, const CanMessageAcceler
tm timeInfo;
gmtime_r(&time, &timeInfo);
String<StringLength50> temp;
- temp.printf("accelerometer/%u_%04u-%02u-%02u_%02u.%02u.%02u.csv",
+ temp.printf("0:/sys/accelerometer/%u_%04u-%02u-%02u_%02u.%02u.%02u.csv",
(unsigned int)src, timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday, timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec);
- f = p.OpenSysFile(temp.c_str(), OpenMode::write);
-
+ f = MassStorage::OpenFile(temp.c_str(), OpenMode::write, 0);
if (f != nullptr)
{
currentBoard = src;
axes = msg.axes;
expectedSampleNumber = 0;
- temp.printf("Sample,");
- if (axes & 1u) { temp.cat("X,"); }
- if (axes & 2u) { temp.cat("Y,"); }
- if (axes & 4u) { temp.cat("Z,"); }
- temp.cat("Overflowed\n");
+ temp.printf("Sample,Rate,Overflowed");
+ if (axes & 1u) { temp.cat(",X"); }
+ if (axes & 2u) { temp.cat(",Y"); }
+ if (axes & 4u) { temp.cat(",Z"); }
+ temp.cat('\n');
f->Write(temp.c_str());
}
}
if (f != nullptr)
{
- if (msg.axes != axes || msg.firstSampleNumber != expectedSampleNumber || src != currentBoard)
+ if (msgLen < msg.GetActualDataLength())
+ {
+ f->Write("Received bad data\n");
+ f->Close();
+ f = nullptr;
+ }
+ else if (msg.axes != axes || msg.firstSampleNumber != expectedSampleNumber || src != currentBoard)
{
f->Write("Received mismatched data\n");
f->Close();
+ f = nullptr;
}
else
{
unsigned int numSamples = msg.numSamples;
- //TODO check that the message is long enough to hold this number of samples
- unsigned int numAxes = (axes & 1u) + ((axes & 2u) >> 1) + ((axes & 4u) >> 2);
+ const unsigned int numAxes = (axes & 1u) + ((axes >> 1) & 1u) + ((axes >> 2) & 1u);
size_t dataIndex = 0;
uint16_t currentBits = 0;
unsigned int bitsLeft = 0;
- unsigned int resolution = msg.bitsPerSampleMinusOne + 1;
- uint16_t mask = (1u << resolution) - 1;
+ const unsigned int resolution = msg.bitsPerSampleMinusOne + 1;
+ const uint16_t mask = (1u << resolution) - 1;
+ const unsigned int bitsAfterPoint = resolution - 2; // assumes the range is +/- 2g
+ const int decimalPlaces = (bitsAfterPoint >= 11) ? 4 : (bitsAfterPoint >= 8) ? 3 : 2;
while (numSamples != 0)
{
String<StringLength50> temp;
- temp.printf("%u,", expectedSampleNumber);
+ temp.printf("%u,%u,%u", expectedSampleNumber, msg.actualSampleRate, msg.overflowed);
++expectedSampleNumber;
for (unsigned int axis = 0; axis < numAxes; ++axis)
{
- // Extract one value from the message
+ // Extract one value from the message. A value spans at most two words in the buffer.
uint16_t val = currentBits;
if (bitsLeft >= resolution)
{
@@ -100,11 +108,14 @@ void Accelerometers::ProcessReceivedData(CanAddress src, const CanMessageAcceler
val |= ~mask;
}
+ // Convert it to a float number of g
+ const float fVal = (float)(int16_t)val/(float)(1u << bitsAfterPoint);
+
// Append it to the buffer
- temp.catf("%d,", (int16_t)val);
+ temp.catf(",%.*f", decimalPlaces, (double)fVal);
}
- temp.cat((msg.overflowed) ? "1\n" : "0\n");
+ temp.cat('\n');
f->Write(temp.c_str());
--numSamples;
}
@@ -112,6 +123,7 @@ void Accelerometers::ProcessReceivedData(CanAddress src, const CanMessageAcceler
if (msg.lastPacket)
{
f->Close();
+ f = nullptr;
}
}
}
diff --git a/src/Accelerometers/Accelerometers.h b/src/Accelerometers/Accelerometers.h
index 96090952..665a7075 100644
--- a/src/Accelerometers/Accelerometers.h
+++ b/src/Accelerometers/Accelerometers.h
@@ -18,7 +18,7 @@ class CanMessageAccelerometerData;
namespace Accelerometers
{
- void ProcessReceivedData(CanAddress src, const CanMessageAccelerometerData& msg) noexcept;
+ void ProcessReceivedData(CanAddress src, const CanMessageAccelerometerData& msg, size_t msgLen) noexcept;
}
#endif