|
@@ -66,7 +66,7 @@ adc_data_to_particles(const std::vector<adc_sample> &sample)
|
|
|
for (size_t i = 0; i < sample.size() - crit; i++) {
|
|
|
bool ok = true;
|
|
|
for (size_t j = 0; j < crit; j++)
|
|
|
- if (sample[i+j].v > 0)
|
|
|
+ if (sample[i+j].v > 0 || sample[i+j].v < -10)
|
|
|
ok = false;
|
|
|
if (ok) {
|
|
|
ret.push_back({i, sample[i].fl_time, sample[i].fired});
|
|
@@ -102,36 +102,38 @@ static flight_data current = {0, 0, 0};
|
|
|
static std::map<uint32_t, flight_data> FDR;
|
|
|
|
|
|
static void dump_particles_aggr(const std::vector<particle> particles,
|
|
|
- int id, uint32_t ts, size_t win_size)
|
|
|
+ int id, uint32_t ts, uint32_t tw)
|
|
|
{
|
|
|
std::ofstream out(std::string("rm100_aggreated_") + "01"[id] + ".csv");
|
|
|
out << "fl_time,cnt,gps_height,ils_height\n";
|
|
|
- uint32_t t0 = 0;
|
|
|
size_t cnt = 0;
|
|
|
+
|
|
|
+ uint32_t last_time = particles.rbegin()->fl_time;
|
|
|
+ auto cmp = [](particle a, particle b) {
|
|
|
+ return a.fl_time < b.fl_time;
|
|
|
+ };
|
|
|
+
|
|
|
+ auto first = particles.begin();
|
|
|
+ while (first != particles.end() && !first->fired)
|
|
|
+ ++first;
|
|
|
+
|
|
|
std::vector<size_t> sum;
|
|
|
- for (particle p: particles)
|
|
|
- if (p.fired) {
|
|
|
- while (t0 + ts < p.fl_time) {
|
|
|
- sum.push_back(cnt);
|
|
|
- cnt = 0;
|
|
|
- t0 += ts;
|
|
|
- }
|
|
|
- cnt++;
|
|
|
- }
|
|
|
+ for (uint32_t t0 = 0; t0 < last_time; t0 += ts) {
|
|
|
+ auto a = std::lower_bound(first, particles.end(),
|
|
|
+ particle{0, t0, 0}, cmp);
|
|
|
+ auto b = std::lower_bound(first, particles.end(),
|
|
|
+ particle{0, t0+tw, 0}, cmp);
|
|
|
+ sum.push_back(b - a);
|
|
|
+ }
|
|
|
|
|
|
- cnt = 0;
|
|
|
flight_data fd{0, 0, 0};
|
|
|
for (size_t i = 0; i < sum.size(); i++) {
|
|
|
- cnt += sum[i];
|
|
|
- if (win_size < i)
|
|
|
- cnt -= sum[i-win_size-1];
|
|
|
- if (win_size <= i) {
|
|
|
- if (FDR.find(ts*(i-win_size)) != FDR.end())
|
|
|
- fd = FDR[ts*(i-win_size)];
|
|
|
- out << (i-win_size) * ts * 0.0001 <<
|
|
|
- ',' << cnt * 1. <<
|
|
|
- ',' << fd.gps_height << ',' << fd.ils_height << '\n';
|
|
|
- }
|
|
|
+ auto cnt = sum[i];
|
|
|
+ if (FDR.find(ts*i) != FDR.end())
|
|
|
+ fd = FDR[ts*i];
|
|
|
+ out << i * ts * 0.0001 <<
|
|
|
+ ',' << cnt * 1. <<
|
|
|
+ ',' << fd.gps_height << ',' << fd.ils_height << '\n';
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -280,8 +282,8 @@ static int process_telemetry_data(void *ptr, size_t sz)
|
|
|
dump_rm100_raw_data(0);
|
|
|
auto particles = adc_data_to_particles(rm100_data[k]);
|
|
|
dump_particles(particles, k);
|
|
|
- dump_particles_aggr(particles, k, (int)(conf_aggr_ts * 10000 + 0.5),
|
|
|
- (int)(conf_aggr_tav/conf_aggr_ts + 0.5));
|
|
|
+ dump_particles_aggr(particles, k, (int)(conf_aggr_ts * 10000),
|
|
|
+ (int)(conf_aggr_tav * 10000));
|
|
|
}
|
|
|
return 0;
|
|
|
}
|