void SkyLinesTracking::Client::SendFix(const NMEAInfo &basic) { assert(key != 0); SendPacket(ToFix(key, basic)); }
inline void SkyLinesTracking::Glue::SendFixes(const NMEAInfo &basic) { assert(client.IsDefined()); if (!basic.time_available) { clock.Reset(); return; } if (!IsConnected()) { if (clock.CheckAdvance(basic.time, fixed(interval))) { /* queue the packet, send it later */ if (queue == nullptr) queue = new Queue(); queue->Push(ToFix(client.GetKey(), basic)); } return; } if (queue != nullptr) { /* send queued fix packets, 8 at a time */ unsigned n = 8; while (n-- > 0) { const auto &packet = queue->Peek(); if (!client.SendPacket(packet)) break; queue->Pop(); if (queue->IsEmpty()) { delete queue; queue = nullptr; break; } } return; } else if (clock.CheckAdvance(basic.time, fixed(interval))) client.SendFix(basic); }
void SkyLinesTracking::Glue::Tick(const NMEAInfo &basic) { if (!client.IsDefined()) return; if (!basic.time_available) { clock.Reset(); #ifdef HAVE_SKYLINES_TRACKING_HANDLER traffic_clock.Reset(); #endif return; } bool connected = false; switch (GetNetState()) { case NetState::UNKNOWN: case NetState::DISCONNECTED: break; case NetState::CONNECTED: connected = true; break; case NetState::ROAMING: connected = roaming; break; } if (!connected) { /* queue the packet, send it later */ if (queue == nullptr) queue = new Queue(); queue->Push(ToFix(client.GetKey(), basic)); return; } if (queue != nullptr) { /* send queued fix packets, 8 at a time */ unsigned n = 8; while (n-- > 0) { const auto &packet = queue->Peek(); if (!client.SendPacket(packet)) break; queue->Pop(); if (queue->IsEmpty()) { delete queue; queue = nullptr; break; } } return; } else if (clock.CheckAdvance(basic.time, fixed(interval))) client.SendFix(basic); #ifdef HAVE_SKYLINES_TRACKING_HANDLER if (traffic_enabled && traffic_clock.CheckAdvance(basic.time, fixed(60))) client.SendTrafficRequest(true, true); #endif }