///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2017 Sergey Kostanbaev, Fairwaves Inc.                          //
//                                                                               //
// This program is free software; you can redistribute it and/or modify          //
// it under the terms of the GNU General Public License as published by          //
// the Free Software Foundation as version 3 of the License, or                  //
// (at your option) any later version.                                           //
//                                                                               //
// This program is distributed in the hope that it will be useful,               //
// but WITHOUT ANY WARRANTY; without even the implied warranty of                //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
// GNU General Public License V3 for more details.                               //
//                                                                               //
// You should have received a copy of the GNU General Public License             //
// along with this program. If not, see .          //
///////////////////////////////////////////////////////////////////////////////////
#include 
#include "devicextrxshared.h"
#include "devicextrx.h"
MESSAGE_CLASS_DEFINITION(DeviceXTRXShared::MsgReportBuddyChange, Message)
MESSAGE_CLASS_DEFINITION(DeviceXTRXShared::MsgReportClockSourceChange, Message)
MESSAGE_CLASS_DEFINITION(DeviceXTRXShared::MsgReportDeviceInfo, Message)
const unsigned int DeviceXTRXShared::m_sampleFifoMinRate = 48000;
DeviceXTRXShared::DeviceXTRXShared() :
    m_dev(0),
    m_channel(-1),
    m_source(0),
    m_sink(0),
    m_thread(0),
    m_threadWasRunning(false),
    m_first_1pps_count(true),
    m_last_1pps_count(0),
    m_no_1pps_count_change_counter(0)
{}
DeviceXTRXShared::~DeviceXTRXShared()
{}
double DeviceXTRXShared::get_board_temperature()
{
    uint64_t val = 0;
    int res = xtrx_val_get(m_dev->getDevice(), XTRX_TRX, XTRX_CH_AB, XTRX_BOARD_TEMP, &val);
    if (res) {
        return 0;
    }
    return val;
}
bool DeviceXTRXShared::get_gps_status()
{
    uint64_t val = 0;
    int res = xtrx_val_get(m_dev->getDevice(), (xtrx_direction_t) 0, XTRX_CH_AB, XTRX_OSC_LATCH_1PPS, &val);
    if (res)
    {
        return false;
    }
    else
    {
        if (m_first_1pps_count)
        {
            m_last_1pps_count = val;
            m_first_1pps_count = false;
        }
        else
        {
            if (m_last_1pps_count != val)
            {
                m_no_1pps_count_change_counter = 7;
                m_last_1pps_count = val;
            }
            else if (m_no_1pps_count_change_counter != 0)
            {
                m_no_1pps_count_change_counter--;
            }
        }
        //qDebug("DeviceXTRXShared::get_gps_status: XTRX_OSC_LATCH_1PPS: %lu %u", val, m_no_1pps_count_change_counter);
        return m_no_1pps_count_change_counter != 0;
    }
}