2020-03-08 02:22:20 +01:00
|
|
|
#include "AircraftList.h"
|
2019-09-09 06:23:38 +02:00
|
|
|
|
2019-09-09 08:17:40 +02:00
|
|
|
static uint64_t mstime(void) {
|
|
|
|
struct timeval tv;
|
|
|
|
uint64_t mst;
|
|
|
|
|
|
|
|
gettimeofday(&tv, NULL);
|
|
|
|
mst = ((uint64_t)tv.tv_sec)*1000;
|
|
|
|
mst += tv.tv_usec/1000;
|
|
|
|
return mst;
|
|
|
|
}
|
|
|
|
|
2020-03-08 02:22:20 +01:00
|
|
|
Aircraft *AircraftList::find(uint32_t addr) {
|
|
|
|
Aircraft *p = head;
|
2019-09-09 06:23:38 +02:00
|
|
|
|
|
|
|
while(p) {
|
|
|
|
if (p->addr == addr) return (p);
|
|
|
|
p = p->next;
|
|
|
|
}
|
|
|
|
return (NULL);
|
|
|
|
}
|
2020-03-08 02:22:20 +01:00
|
|
|
|
|
|
|
//instead of this, net_io should call this class directly to update info
|
2020-03-08 05:28:55 +01:00
|
|
|
void AircraftList::update(Modes *modes) {
|
|
|
|
struct aircraft *a = modes->aircrafts;
|
2019-09-09 06:23:38 +02:00
|
|
|
|
2020-03-08 02:22:20 +01:00
|
|
|
Aircraft *p = head;
|
2019-09-09 06:23:38 +02:00
|
|
|
|
|
|
|
while(p) {
|
|
|
|
p->live = 0;
|
|
|
|
p = p->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
while(a) {
|
|
|
|
|
2020-03-08 02:22:20 +01:00
|
|
|
p = find(a->addr);
|
2019-09-09 06:23:38 +02:00
|
|
|
if (!p) {
|
2020-03-08 02:22:20 +01:00
|
|
|
//p = createPlaneObj(a);
|
2020-03-21 06:12:45 +01:00
|
|
|
p = new Aircraft(a->addr);
|
2020-03-08 02:22:20 +01:00
|
|
|
p->next = head;
|
|
|
|
head = p;
|
2019-09-09 06:52:09 +02:00
|
|
|
} else {
|
|
|
|
p->prev_seen = p->seen;
|
2019-09-09 06:23:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
p->live = 1;
|
|
|
|
|
|
|
|
if(p->seen == a->seen) {
|
|
|
|
a = a->next;
|
|
|
|
continue;
|
|
|
|
}
|
2019-09-09 06:52:09 +02:00
|
|
|
|
|
|
|
p->seen = a->seen;
|
2019-09-09 08:17:40 +02:00
|
|
|
p->msSeen = mstime();
|
2019-09-09 06:52:09 +02:00
|
|
|
|
|
|
|
if((p->seen - p->prev_seen) > 0) {
|
|
|
|
p->messageRate = 1.0 / (double)(p->seen - p->prev_seen);
|
|
|
|
}
|
|
|
|
|
2019-09-09 06:23:38 +02:00
|
|
|
memcpy(p->flight, a->flight, sizeof(p->flight));
|
|
|
|
memcpy(p->signalLevel, a->signalLevel, sizeof(p->signalLevel));
|
|
|
|
|
|
|
|
p->altitude = a->altitude;
|
|
|
|
p->speed = a->speed;
|
|
|
|
p->track = a->track;
|
|
|
|
p->vert_rate = a->vert_rate;
|
2019-09-09 08:17:40 +02:00
|
|
|
p->lon = a->lon;
|
|
|
|
p->lat = a->lat;
|
2019-09-09 06:23:38 +02:00
|
|
|
|
2019-09-09 08:17:40 +02:00
|
|
|
if(p->seenLatLon < a->seenLatLon) {
|
|
|
|
p->msSeenLatLon = mstime();
|
2019-09-16 02:54:06 +02:00
|
|
|
|
2020-03-13 00:56:26 +01:00
|
|
|
// p->oldIdx = (p->oldIdx+1) % 32;
|
2019-09-09 06:23:38 +02:00
|
|
|
|
2020-03-13 00:56:26 +01:00
|
|
|
// p->oldLon[p->oldIdx] = p->lon;
|
|
|
|
// p->oldLat[p->oldIdx] = p->lat;
|
|
|
|
p->lonHistory.push_back(p->lon);
|
|
|
|
p->latHistory.push_back(p->lat);
|
|
|
|
p->headingHistory.push_back(p->track);
|
|
|
|
p->timestampHistory.push_back(p->seenLatLon);
|
2019-09-09 06:23:38 +02:00
|
|
|
|
2020-03-13 00:56:26 +01:00
|
|
|
// p->oldHeading[p->oldIdx] = p->track;
|
2019-09-09 06:23:38 +02:00
|
|
|
|
2020-03-13 00:56:26 +01:00
|
|
|
// p->oldSeen[p->oldIdx] = p->seenLatLon;
|
2019-09-09 06:23:38 +02:00
|
|
|
}
|
2019-09-09 08:17:40 +02:00
|
|
|
|
|
|
|
p->seenLatLon = a->seenLatLon;
|
2019-09-09 06:23:38 +02:00
|
|
|
|
|
|
|
a = a->next;
|
|
|
|
}
|
|
|
|
|
2020-03-08 02:22:20 +01:00
|
|
|
p = head;
|
|
|
|
Aircraft *prev = NULL;
|
2019-09-09 06:23:38 +02:00
|
|
|
|
|
|
|
while(p) {
|
|
|
|
if(!p->live) {
|
|
|
|
if (!prev) {
|
2020-03-08 02:22:20 +01:00
|
|
|
head = p->next;
|
|
|
|
delete(p);
|
|
|
|
p = head;
|
2019-09-09 06:23:38 +02:00
|
|
|
} else {
|
|
|
|
prev->next = p->next;
|
2020-03-08 02:22:20 +01:00
|
|
|
delete(p);
|
2019-09-09 06:23:38 +02:00
|
|
|
p = prev->next;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
prev = p;
|
|
|
|
p = p->next;
|
|
|
|
}
|
|
|
|
}
|
2020-03-08 02:22:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
AircraftList::AircraftList() {
|
|
|
|
head = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
AircraftList::~AircraftList() {
|
|
|
|
while(head != NULL) {
|
|
|
|
Aircraft *temp = head;
|
|
|
|
head = head->next;
|
|
|
|
delete(temp);
|
|
|
|
}
|
2019-09-09 06:23:38 +02:00
|
|
|
}
|