swimtracker-firmware/firmware/lib/session/SessionChunk.h

100 lines
2.2 KiB
C
Raw Permalink Normal View History

#pragma once
#include "StreamingMsgPackEncoder.h"
2019-08-22 21:33:36 +02:00
#include <cstdint>
2020-06-28 10:30:01 +02:00
template <typename Measurement_T, uint32_t SIZE>
class SessionChunk
{
public:
SessionChunk()
: nextFree_(0), sessionStartTime(0), startIndex(0)
2020-06-28 10:30:01 +02:00
{
}
void init(uint32_t epochStartTime, uint32_t startIdx)
{
nextFree_ = 0;
sessionStartTime = epochStartTime;
startIndex = startIdx;
}
2020-06-28 10:30:01 +02:00
uint32_t getStartTime() const
{
return sessionStartTime;
}
2020-06-28 10:30:01 +02:00
uint32_t getStartIndex() const
{
return startIndex;
}
2020-06-28 10:30:01 +02:00
uint32_t numMeasurements() const
{
return nextFree_;
}
bool addPoint(Measurement_T measurement)
{
2020-06-28 10:30:01 +02:00
if (nextFree_ >= SIZE)
return false;
values[nextFree_] = measurement;
nextFree_++;
return true;
}
2020-06-28 10:30:01 +02:00
template <typename T>
void serialize(StreamingMsgPackEncoder<T> &encoder) const
{
sendHeader(encoder, sessionStartTime, startIndex);
encoder.sendArray(values, nextFree_);
}
static uint32_t valueOffset()
{
2019-09-08 18:00:09 +02:00
StreamingMsgPackEncoder<DummyWriter> encoder(nullptr);
encoder.setSizeCountMode(true);
sendHeader(encoder, 0, 0);
2019-08-18 19:58:13 +02:00
encoder.template sendArrayHeader<Measurement_T>(0);
return encoder.getContentLength();
}
2020-06-28 10:30:01 +02:00
static uint32_t arrayHeaderOffset()
{
StreamingMsgPackEncoder<DummyWriter> encoder(nullptr);
encoder.setSizeCountMode(true);
sendHeader(encoder, 0, 0);
return encoder.getContentLength();
}
Measurement_T *getDataPointer()
{
return values;
}
2020-06-28 10:30:01 +02:00
const Measurement_T *getDataPointer() const
{
return values;
}
2020-06-28 10:30:01 +02:00
template <typename Encoder_T>
static void sendHeader(Encoder_T &encoder, uint32_t sessionStartTime, uint32_t startIndex)
{
encoder.sendMap16(3);
encoder.sendString255("sessionStartTime");
encoder.sendInt(sessionStartTime);
encoder.sendString255("startIndex");
encoder.sendInt(startIndex);
encoder.sendString255("values");
}
private:
uint32_t nextFree_ = 0;
uint32_t sessionStartTime;
uint32_t startIndex;
Measurement_T values[SIZE];
};