10 uint16_t windowSize_ms,
11 uint16_t windowInterval_ms)
12 : AclMagSqWindow_ms2(windowSize_ms / windowInterval_ms),
13 accelerationThresholdSq_ms2(accelerationThreshold_ms2 * accelerationThreshold_ms2),
14 windowInterval_ms(windowInterval_ms),
18 median_acceleration_squared(0)
21 min_window_size_ms = (windowInterval_ms - acceptableTimeDifference_ms) *
22 (AclMagSqWindow_ms2.getMaxSize() - 1);
23 max_window_size_ms = (windowInterval_ms + acceptableTimeDifference_ms) *
24 (AclMagSqWindow_ms2.getMaxSize() - 1);
42 Serial.println(
"LaunchDetector: Data point ignored because already launched");
54 if (time_ms < AclMagSqWindow_ms2.getFromHead(0).timestamp_ms)
57 Serial.println(
"LaunchDetector: Data point ignored because of time is earlier than head");
58 Serial.printf(
"Incoming time: %d\n", time_ms);
59 Serial.printf(
"Head time: %d\n", AclMagSqWindow_ms2.getFromHead(0).timestamp_ms);
65 if (!AclMagSqWindow_ms2.isFull())
70 AclMagSqWindow_ms2.push(
DataPoint(time_ms, aclMagSq));
76 uint32_t time_diff = time_ms - AclMagSqWindow_ms2.getFromHead(0).timestamp_ms;
79 if (time_diff < windowInterval_ms - acceptableTimeDifference_ms){
81 Serial.println(
"LaunchDetector: DATA TOO EARLY");
82 Serial.printf(
"Time diff: %d\n", time_diff);
83 Serial.printf(
"Window interval: %d\n", windowInterval_ms);
84 Serial.printf(
"Incoming time: %d\n", time_ms);
85 Serial.printf(
"Head time: %d\n", AclMagSqWindow_ms2.getFromHead(0).timestamp_ms);
90 if (time_diff > windowInterval_ms + acceptableTimeDifference_ms)
93 Serial.println(
"LaunchDetector: DATA TOO LATE");
94 Serial.printf(
"Time diff: %d\n", time_diff);
95 Serial.printf(
"Window interval: %d\n", windowInterval_ms);
96 Serial.printf(
"Incoming time: %d\n", time_ms);
97 Serial.printf(
"Head time: %d\n", AclMagSqWindow_ms2.getFromHead(0).timestamp_ms);
98 Serial.println(
"LaunchDetector: Clearing window");
101 AclMagSqWindow_ms2.clear();
107 Serial.print(
"LaunchDetector: Pushing timestamp: ");
111 AclMagSqWindow_ms2.push(
DataPoint(time_ms, aclMagSq));
113 const uint32_t head_timeStamp_ms = AclMagSqWindow_ms2.getFromHead(0).timestamp_ms;
114 const uint32_t tail_timeStamp_ms = AclMagSqWindow_ms2.getFromHead(AclMagSqWindow_ms2.getMaxSize() - 1).timestamp_ms;
115 const uint32_t time_range = head_timeStamp_ms - tail_timeStamp_ms;
118 if (time_range < min_window_size_ms)
121 Serial.println(
"LaunchDetector: Time range too small, waiting...");
122 Serial.printf(
"Time range: %d\n", time_range);
123 Serial.printf(
"Min Time Range: %d\n", min_window_size_ms);
124 Serial.printf(
"Incoming time: %d\n", time_ms);
125 Serial.printf(
"Head time: %d\n", AclMagSqWindow_ms2.getFromHead(0).timestamp_ms);
126 Serial.printf(
"Tail time: %d\n", AclMagSqWindow_ms2.getFromHead(AclMagSqWindow_ms2.getMaxSize() - 1).timestamp_ms);
133 if (time_range > max_window_size_ms)
136 Serial.println(
"LaunchDetector: Time range too large, waiting...");
137 Serial.printf(
"Time range: %d\n", time_range);
138 Serial.printf(
"Max Time Range: %d\n", max_window_size_ms);
139 Serial.printf(
"Incoming time: %d\n", time_ms);
140 Serial.printf(
"Head time: %d\n", AclMagSqWindow_ms2.getFromHead(0).timestamp_ms);
141 Serial.printf(
"Tail time: %d\n", AclMagSqWindow_ms2.getFromHead(AclMagSqWindow_ms2.getMaxSize() - 1).timestamp_ms);
148 if (!AclMagSqWindow_ms2.isFull())
153 this->median_acceleration_squared = AclMagSqWindow_ms2.getMedian().data;
156 if (median_acceleration_squared > accelerationThresholdSq_ms2)
159 launchedTime_ms = time_ms;
164 Serial.println(
"LaunchDetector: Median below threshold");
167 Serial.println(median_acceleration_squared);
168 Serial.print(
"Threshold: ");
169 Serial.println(accelerationThresholdSq_ms2);