Preapared AIS target list in boatdata
This commit is contained in:
parent
0097a1eb1e
commit
c4406fd009
|
@ -12,6 +12,7 @@ public:
|
||||||
static int getType(const double &x) { return GWTYPE_DOUBLE; }
|
static int getType(const double &x) { return GWTYPE_DOUBLE; }
|
||||||
static int getType(const String &x) { return GWTYPE_STRING; }
|
static int getType(const String &x) { return GWTYPE_STRING; }
|
||||||
static int getType(const GwSatInfoList &x) { return GWTYPE_USER + 1; }
|
static int getType(const GwSatInfoList &x) { return GWTYPE_USER + 1; }
|
||||||
|
static int getType(const GwAisTargetList &x) { return GWTYPE_USER + 1; }
|
||||||
};
|
};
|
||||||
|
|
||||||
bool GwBoatItemBase::isValid(unsigned long now) const
|
bool GwBoatItemBase::isValid(unsigned long now) const
|
||||||
|
@ -289,6 +290,7 @@ template class GwBoatItem<uint32_t>;
|
||||||
template class GwBoatItem<uint16_t>;
|
template class GwBoatItem<uint16_t>;
|
||||||
template class GwBoatItem<int16_t>;
|
template class GwBoatItem<int16_t>;
|
||||||
template class GwBoatItem<String>;
|
template class GwBoatItem<String>;
|
||||||
|
|
||||||
void GwSatInfoList::houseKeeping(unsigned long ts)
|
void GwSatInfoList::houseKeeping(unsigned long ts)
|
||||||
{
|
{
|
||||||
if (ts == 0)
|
if (ts == 0)
|
||||||
|
@ -302,6 +304,7 @@ void GwSatInfoList::houseKeeping(unsigned long ts)
|
||||||
}),
|
}),
|
||||||
sats.end());
|
sats.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GwSatInfoList::update(GwSatInfo entry, unsigned long validTill)
|
void GwSatInfoList::update(GwSatInfo entry, unsigned long validTill)
|
||||||
{
|
{
|
||||||
entry.validTill = validTill;
|
entry.validTill = validTill;
|
||||||
|
@ -344,6 +347,63 @@ void GwBoatDataSatList::toJsonDoc(GwJsonDocument *doc, unsigned long minTime)
|
||||||
GwBoatItem<GwSatInfoList>::toJsonDoc(doc, minTime);
|
GwBoatItem<GwSatInfoList>::toJsonDoc(doc, minTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GwAisTargetList::houseKeeping(unsigned long ts)
|
||||||
|
{
|
||||||
|
if (ts == 0) {
|
||||||
|
ts = millis();
|
||||||
|
}
|
||||||
|
targets.erase(
|
||||||
|
std::remove_if(
|
||||||
|
targets.begin(),
|
||||||
|
targets.end(),
|
||||||
|
[ts, this](const GwAisTarget &target) {
|
||||||
|
return target.validTill < ts;
|
||||||
|
}
|
||||||
|
),
|
||||||
|
targets.end()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GwAisTargetList::update(GwAisTarget target, unsigned long validTill)
|
||||||
|
{
|
||||||
|
target.validTill = validTill;
|
||||||
|
for (auto it = targets.begin(); it != targets.end(); it++) {
|
||||||
|
if (it->mmsi == target.mmsi) {
|
||||||
|
*it = target;
|
||||||
|
houseKeeping();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
houseKeeping();
|
||||||
|
targets.push_back(target);
|
||||||
|
}
|
||||||
|
|
||||||
|
GwBoatDataAisList::GwBoatDataAisList(String name, String formatInfo, GwBoatItemBase::TOType toType, GwBoatItemMap *map) : GwBoatItem<GwAisTargetList>(name, formatInfo, toType, map) {}
|
||||||
|
|
||||||
|
bool GwBoatDataAisList::update(GwAisTarget target, int source)
|
||||||
|
{
|
||||||
|
unsigned long now = millis();
|
||||||
|
if (isValid(now))
|
||||||
|
{
|
||||||
|
//priority handling
|
||||||
|
//sources with lower ids will win
|
||||||
|
//and we will not overwrite their value
|
||||||
|
if (lastUpdateSource < source)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastUpdateSource = source;
|
||||||
|
uls(now);
|
||||||
|
data.update(target, now+invalidTime);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void GwBoatDataAisList::toJsonDoc(GwJsonDocument *doc, unsigned long minTime)
|
||||||
|
{
|
||||||
|
data.houseKeeping();
|
||||||
|
GwBoatItem<GwAisTargetList>::toJsonDoc(doc, minTime);
|
||||||
|
}
|
||||||
|
|
||||||
GwBoatData::GwBoatData(GwLog *logger, GwConfigHandler *cfg)
|
GwBoatData::GwBoatData(GwLog *logger, GwConfigHandler *cfg)
|
||||||
{
|
{
|
||||||
this->logger = logger;
|
this->logger = logger;
|
||||||
|
@ -513,6 +573,11 @@ bool convertToJson(const GwSatInfoList &si, JsonVariant &variant)
|
||||||
return variant.set(si.getNumSats());
|
return variant.set(si.getNumSats());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool convertToJson(const GwAisTargetList &si, JsonVariant &variant)
|
||||||
|
{
|
||||||
|
return variant.set(si.getNumTargets());
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _UNDEF
|
#ifdef _UNDEF
|
||||||
#include <ArduinoJson/Json/TextFormatter.hpp>
|
#include <ArduinoJson/Json/TextFormatter.hpp>
|
||||||
|
|
||||||
|
|
|
@ -196,6 +196,55 @@ public:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GwAisTarget {
|
||||||
|
public:
|
||||||
|
uint32_t mmsi;
|
||||||
|
char callsign[8];
|
||||||
|
char name[21];
|
||||||
|
uint8_t vesseltype;
|
||||||
|
double lat;
|
||||||
|
double lon;
|
||||||
|
float length;
|
||||||
|
float beam;
|
||||||
|
float sog;
|
||||||
|
float cog;
|
||||||
|
unsigned long validTill;
|
||||||
|
};
|
||||||
|
|
||||||
|
class GwAisTargetList {
|
||||||
|
public:
|
||||||
|
static const GwBoatItemBase::TOType toType=GwBoatItemBase::TOType::ais;
|
||||||
|
std::vector<GwAisTarget> targets;
|
||||||
|
void houseKeeping(unsigned long ts=0);
|
||||||
|
void update(GwAisTarget target, unsigned long validTill);
|
||||||
|
int getNumTargets() const {
|
||||||
|
return targets.size();
|
||||||
|
}
|
||||||
|
GwAisTarget *getAt(int idx){
|
||||||
|
if (idx >= 0 && idx < targets.size()) return &targets.at(idx);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
operator double(){ return getNumTargets();}
|
||||||
|
};
|
||||||
|
|
||||||
|
class GwBoatDataAisList : public GwBoatItem<GwAisTargetList> {
|
||||||
|
public:
|
||||||
|
GwBoatDataAisList(String name, String formatInfo, GwBoatItemBase::TOType toType, GwBoatItemMap *map = NULL);
|
||||||
|
bool update(GwAisTarget target, int source);
|
||||||
|
virtual void toJsonDoc(GwJsonDocument *doc, unsigned long minTime);
|
||||||
|
GwAisTarget *getAt(int idx) {
|
||||||
|
if (! isValid()) return NULL;
|
||||||
|
return data.getAt(idx);
|
||||||
|
}
|
||||||
|
int getNumTargets(){
|
||||||
|
if (! isValid()) return 0;
|
||||||
|
return data.getNumTargets();
|
||||||
|
}
|
||||||
|
virtual double getDoubleValue(){
|
||||||
|
return (double)(data.getNumTargets());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class GwBoatItemNameProvider
|
class GwBoatItemNameProvider
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -256,6 +305,7 @@ class GwBoatData{
|
||||||
GWBOATDATA(double,WPLon,formatLongitude) // waypoint longitude
|
GWBOATDATA(double,WPLon,formatLongitude) // waypoint longitude
|
||||||
GWBOATDATA(String,WPName,formatName) // waypoint name
|
GWBOATDATA(String,WPName,formatName) // waypoint name
|
||||||
GWSPECBOATDATA(GwBoatDataSatList,SatInfo,GwSatInfoList::toType,formatFixed0);
|
GWSPECBOATDATA(GwBoatDataSatList,SatInfo,GwSatInfoList::toType,formatFixed0);
|
||||||
|
GWSPECBOATDATA(GwBoatDataAisList,AisTarget,GwAisTargetList::toType,formatFixed0);
|
||||||
public:
|
public:
|
||||||
GwBoatData(GwLog *logger, GwConfigHandler *cfg);
|
GwBoatData(GwLog *logger, GwConfigHandler *cfg);
|
||||||
~GwBoatData();
|
~GwBoatData();
|
||||||
|
|
Loading…
Reference in New Issue