Example #1
0
// Update live tracker data, non blocking
void LiveTrackerUpdate(NMEA_INFO *Basic, DERIVED_INFO *Calculated)
{
    livetracker_point_t newpoint;
    static int logtime = 0;

    if (!_inited) return;               // Do nothing if not inited
    if (Basic->NAVWarning) return;      // Do not log if no gps fix
    if (LiveTrackerInterval==0) return; // Disabled

    CCriticalSection::CGuard guard(_t_mutex);

    _t_barodevice = Basic->BaroDevice;

    //Check if sending needed (time interval)
    if (Basic->Time >= logtime) {
        logtime = (int)Basic->Time + LiveTrackerInterval;
        if (logtime>=86400) logtime-=86400;
    } else return;

    // Half hour FIFO must be enough
    if (_t_points.size() > (unsigned int)(1800 / LiveTrackerInterval)) {
        // points in queue are full, drop oldest point
        _t_points.pop_front();
    }

    struct tm t;
    time_t t_of_day;
    t.tm_year = Basic->Year - 1900;
    t.tm_mon = Basic->Month - 1; // Month, 0 - jan
    t.tm_mday = Basic->Day;
    t.tm_hour = Basic->Hour;
    t.tm_min = Basic->Minute;
    t.tm_sec = Basic->Second;
    t.tm_isdst = 0; // Is DST on? 1 = yes, 0 = no, -1 = unknown
    t_of_day = mkgmtime(&t);

    newpoint.unix_timestamp = t_of_day;
    newpoint.flying = Calculated->Flying;
    newpoint.latitude = Basic->Latitude;
    newpoint.longitude = Basic->Longitude;
    newpoint.alt = Calculated->NavAltitude;
    newpoint.ground_speed = Basic->Speed;
    newpoint.course_over_ground = Calculated->Heading;

    _t_points.push_back(newpoint);
    SetEvent(_hNewDataEvent);
}