25 uint16_t windowSize_ms,
26 uint16_t windowInterval_ms)
27 : accelerationThresholdSq_ms2_(accelerationThreshold_ms2 * accelerationThreshold_ms2),
28 windowInterval_ms_(windowInterval_ms),
30 accelMagnitudeSquaredWindow_(validateAndComputeWindowSize_slots(windowSize_ms, windowInterval_ms)),
33 medianAccelerationSquared_(0)
36 const uint16_t windowSpan_slots =
static_cast<uint16_t
>(accelMagnitudeSquaredWindow_.getMaxSize() - 1U);
37 minWindowSize_ms_ =
static_cast<uint16_t
>(
38 static_cast<uint32_t
>(windowInterval_ms_ - acceptableTimeDifference_ms_) * windowSpan_slots);
39 maxWindowSize_ms_ =
static_cast<uint16_t
>(
40 static_cast<uint32_t
>(windowInterval_ms_ + acceptableTimeDifference_ms_) * windowSpan_slots);
58 Serial.println(
"LaunchDetector: Data point ignored because already launched");
70 if (time_ms < accelMagnitudeSquaredWindow_.getFromHead(0).timestamp_ms)
73 Serial.println(
"LaunchDetector: Data point ignored because of time is earlier than head");
74 Serial.printf(
"Incoming time: %lu\n",
static_cast<unsigned long>(time_ms));
75 Serial.printf(
"Head time: %lu\n",
static_cast<unsigned long>(accelMagnitudeSquaredWindow_.getFromHead(0).timestamp_ms));
81 if (!accelMagnitudeSquaredWindow_.isFull())
86 accelMagnitudeSquaredWindow_.push(
DataPoint(time_ms, aclMagSq));
92 uint32_t timeDiff_ms = time_ms - accelMagnitudeSquaredWindow_.getFromHead(0).timestamp_ms;
93 const uint32_t minAllowedDiff_ms =
static_cast<uint32_t
>(windowInterval_ms_) -
static_cast<uint32_t
>(acceptableTimeDifference_ms_);
94 const uint32_t maxAllowedDiff_ms =
static_cast<uint32_t
>(windowInterval_ms_) +
static_cast<uint32_t
>(acceptableTimeDifference_ms_);
97 if (timeDiff_ms < minAllowedDiff_ms){
99 Serial.println(
"LaunchDetector: DATA TOO EARLY");
100 Serial.printf(
"Time diff: %lu\n",
static_cast<unsigned long>(timeDiff_ms));
101 Serial.printf(
"Window interval: %u\n",
static_cast<unsigned int>(windowInterval_ms_));
102 Serial.printf(
"Incoming time: %lu\n",
static_cast<unsigned long>(time_ms));
103 Serial.printf(
"Head time: %lu\n",
static_cast<unsigned long>(accelMagnitudeSquaredWindow_.getFromHead(0).timestamp_ms));
108 if (timeDiff_ms > maxAllowedDiff_ms)
111 Serial.println(
"LaunchDetector: DATA TOO LATE");
112 Serial.printf(
"Time diff: %lu\n",
static_cast<unsigned long>(timeDiff_ms));
113 Serial.printf(
"Window interval: %u\n",
static_cast<unsigned int>(windowInterval_ms_));
114 Serial.printf(
"Incoming time: %lu\n",
static_cast<unsigned long>(time_ms));
115 Serial.printf(
"Head time: %lu\n",
static_cast<unsigned long>(accelMagnitudeSquaredWindow_.getFromHead(0).timestamp_ms));
116 Serial.println(
"LaunchDetector: Clearing window");
119 accelMagnitudeSquaredWindow_.clear();
125 Serial.print(
"LaunchDetector: Pushing timestamp: ");
126 Serial.println(time_ms);
129 accelMagnitudeSquaredWindow_.push(
DataPoint(time_ms, aclMagSq));
131 const uint32_t headTimestamp_ms = accelMagnitudeSquaredWindow_.getFromHead(0).timestamp_ms;
132 const uint32_t tailTimestamp_ms = accelMagnitudeSquaredWindow_.getFromHead(accelMagnitudeSquaredWindow_.getMaxSize() - 1).timestamp_ms;
133 const uint32_t timeRange_ms = headTimestamp_ms - tailTimestamp_ms;
136 if (timeRange_ms < minWindowSize_ms_)
139 Serial.println(
"LaunchDetector: Time range too small, waiting...");
140 Serial.printf(
"Time range: %lu\n",
static_cast<unsigned long>(timeRange_ms));
141 Serial.printf(
"Min Time Range: %u\n",
static_cast<unsigned int>(minWindowSize_ms_));
142 Serial.printf(
"Incoming time: %lu\n",
static_cast<unsigned long>(time_ms));
143 Serial.printf(
"Head time: %lu\n",
static_cast<unsigned long>(accelMagnitudeSquaredWindow_.getFromHead(0).timestamp_ms));
144 Serial.printf(
"Tail time: %lu\n",
static_cast<unsigned long>(accelMagnitudeSquaredWindow_.getFromHead(accelMagnitudeSquaredWindow_.getMaxSize() - 1).timestamp_ms));
151 if (timeRange_ms > maxWindowSize_ms_)
154 Serial.println(
"LaunchDetector: Time range too large, waiting...");
155 Serial.printf(
"Time range: %lu\n",
static_cast<unsigned long>(timeRange_ms));
156 Serial.printf(
"Max Time Range: %u\n",
static_cast<unsigned int>(maxWindowSize_ms_));
157 Serial.printf(
"Incoming time: %lu\n",
static_cast<unsigned long>(time_ms));
158 Serial.printf(
"Head time: %lu\n",
static_cast<unsigned long>(accelMagnitudeSquaredWindow_.getFromHead(0).timestamp_ms));
159 Serial.printf(
"Tail time: %lu\n",
static_cast<unsigned long>(accelMagnitudeSquaredWindow_.getFromHead(accelMagnitudeSquaredWindow_.getMaxSize() - 1).timestamp_ms));
166 if (!accelMagnitudeSquaredWindow_.isFull())
171 medianAccelerationSquared_ = accelMagnitudeSquaredWindow_.getMedian().data;
174 if (medianAccelerationSquared_ > accelerationThresholdSq_ms2_)
177 launchedTime_ms_ = time_ms;
182 Serial.println(
"LaunchDetector: Median below threshold");
184 Serial.print(
"Median: ");
185 Serial.println(medianAccelerationSquared_);
186 Serial.print(
"Threshold: ");
187 Serial.println(accelerationThresholdSq_ms2_);