mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -05:00 
			
		
		
		
	Check ICAO in sink worker, so CRC can be checked. Fix warnings
This commit is contained in:
		
							parent
							
								
									0830691929
								
							
						
					
					
						commit
						16fd3128b8
					
				@ -1557,7 +1557,7 @@ void ADSBDemodGUI::handleADSB(
 | 
				
			|||||||
        else if (tc == 29)
 | 
					        else if (tc == 29)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            // Target state and status
 | 
					            // Target state and status
 | 
				
			||||||
            bool selAltitudeType = (data[5] >> 7) & 0x1;
 | 
					            //bool selAltitudeType = (data[5] >> 7) & 0x1;
 | 
				
			||||||
            int selAltitudeFix = ((data[5] & 0x7f) << 4) | ((data[6] >> 4) & 0xf);
 | 
					            int selAltitudeFix = ((data[5] & 0x7f) << 4) | ((data[6] >> 4) & 0xf);
 | 
				
			||||||
            if (selAltitudeFix != 0)
 | 
					            if (selAltitudeFix != 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
@ -1665,11 +1665,11 @@ void ADSBDemodGUI::handleADSB(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    else if ((df == 4) || (df == 5))
 | 
					    else if ((df == 4) || (df == 5))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        decodeModeS(data, dateTime, df, aircraft);
 | 
					        decodeModeS(data, df, aircraft);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    else if ((df == 20) || (df == 21))
 | 
					    else if ((df == 20) || (df == 21))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        decodeModeS(data, dateTime, df, aircraft);
 | 
					        decodeModeS(data, df, aircraft);
 | 
				
			||||||
        decodeCommB(data, dateTime, df, aircraft, updatedCallsign);
 | 
					        decodeCommB(data, dateTime, df, aircraft, updatedCallsign);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1682,7 +1682,7 @@ void ADSBDemodGUI::handleADSB(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ADSBDemodGUI::decodeModeS(const QByteArray data, const QDateTime dateTime, int df, Aircraft *aircraft)
 | 
					void ADSBDemodGUI::decodeModeS(const QByteArray data, int df, Aircraft *aircraft)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    bool wasOnSurface = aircraft->m_onSurface;
 | 
					    bool wasOnSurface = aircraft->m_onSurface;
 | 
				
			||||||
    bool takenOff = false;
 | 
					    bool takenOff = false;
 | 
				
			||||||
@ -2060,7 +2060,7 @@ void ADSBDemodGUI::decodeCommB(const QByteArray data, const QDateTime dateTime,
 | 
				
			|||||||
        bool hazardWindShearInconsistent = !hazardWindShearStatus && (hazardWindShear != 0);
 | 
					        bool hazardWindShearInconsistent = !hazardWindShearStatus && (hazardWindShear != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bool hazardMicroburstStatus = (data[4] >> 1) & 0x1;
 | 
					        bool hazardMicroburstStatus = (data[4] >> 1) & 0x1;
 | 
				
			||||||
        int hazardMicroburst = ((data[4] & 0x1) << 1) || ((data[5] >> 7) & 0x1);
 | 
					        int hazardMicroburst = ((data[4] & 0x1) << 1) | ((data[5] >> 7) & 0x1);
 | 
				
			||||||
        bool hazardMicroburstInconsistent = !hazardMicroburstStatus && (hazardMicroburst != 0);
 | 
					        bool hazardMicroburstInconsistent = !hazardMicroburstStatus && (hazardMicroburst != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bool hazardIcingStatus = (data[5] >> 6) & 0x1;
 | 
					        bool hazardIcingStatus = (data[5] >> 6) & 0x1;
 | 
				
			||||||
@ -2201,7 +2201,7 @@ void ADSBDemodGUI::decodeCommB(const QByteArray data, const QDateTime dateTime,
 | 
				
			|||||||
        int arAltitudeRate = arAltitudeRateFix * 64; // Ft/min
 | 
					        int arAltitudeRate = arAltitudeRateFix * 64; // Ft/min
 | 
				
			||||||
        bool arAltitudeRateInconsistent = (abs(arAltitudeRate) > 6000) || (!arAltitudeRateStatus && (arAltitudeRateFix != 0));
 | 
					        bool arAltitudeRateInconsistent = (abs(arAltitudeRate) > 6000) || (!arAltitudeRateStatus && (arAltitudeRateFix != 0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bool bds_5_3 = !arMagHeadingInconsistent && !arIndicatedAirspeedInconsistent && !arMachInconsistent && !arTrueAirspeedInconsistent;
 | 
					        bool bds_5_3 = !arMagHeadingInconsistent && !arIndicatedAirspeedInconsistent && !arMachInconsistent && !arTrueAirspeedInconsistent && !arAltitudeRateInconsistent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // BDS 6,0 - Heading and speed report - EHS
 | 
					        // BDS 6,0 - Heading and speed report - EHS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -969,7 +969,7 @@ private:
 | 
				
			|||||||
        float correlationOnes,
 | 
					        float correlationOnes,
 | 
				
			||||||
        unsigned crc,
 | 
					        unsigned crc,
 | 
				
			||||||
        bool updateModel);
 | 
					        bool updateModel);
 | 
				
			||||||
    void decodeModeS(const QByteArray data, const QDateTime dateTime, int df, Aircraft *aircraft);
 | 
					    void decodeModeS(const QByteArray data, int df, Aircraft *aircraft);
 | 
				
			||||||
    void decodeCommB(const QByteArray data, const QDateTime dateTime, int df, Aircraft *aircraft, bool &updatedCallsign);
 | 
					    void decodeCommB(const QByteArray data, const QDateTime dateTime, int df, Aircraft *aircraft, bool &updatedCallsign);
 | 
				
			||||||
    QList<SWGSDRangel::SWGMapAnimation *> *animate(QDateTime dateTime, Aircraft *aircraft);
 | 
					    QList<SWGSDRangel::SWGMapAnimation *> *animate(QDateTime dateTime, Aircraft *aircraft);
 | 
				
			||||||
    SWGSDRangel::SWGMapAnimation *gearAnimation(QDateTime startDateTime, bool up);
 | 
					    SWGSDRangel::SWGMapAnimation *gearAnimation(QDateTime startDateTime, bool up);
 | 
				
			||||||
 | 
				
			|||||||
@ -195,6 +195,9 @@ void ADSBDemodSinkWorker::run()
 | 
				
			|||||||
                {
 | 
					                {
 | 
				
			||||||
                    // Got a valid frame
 | 
					                    // Got a valid frame
 | 
				
			||||||
                    m_demodStats.m_adsbFrames++;
 | 
					                    m_demodStats.m_adsbFrames++;
 | 
				
			||||||
 | 
					                    // Get 24-bit ICAO and save in hash of ICAOs that have been seen
 | 
				
			||||||
 | 
					                    unsigned icao = ((data[1] & 0xff) << 16) | ((data[2] & 0xff) << 8) | (data[3] & 0xff);
 | 
				
			||||||
 | 
					                    m_icaos.insert(icao, true);
 | 
				
			||||||
                    // Don't try to re-demodulate the same frame
 | 
					                    // Don't try to re-demodulate the same frame
 | 
				
			||||||
                    // We could possibly allow a partial overlap here
 | 
					                    // We could possibly allow a partial overlap here
 | 
				
			||||||
                    readIdx += (ADS_B_ES_BITS+ADS_B_PREAMBLE_BITS)*ADS_B_CHIPS_PER_BIT*samplesPerChip - 1;
 | 
					                    readIdx += (ADS_B_ES_BITS+ADS_B_PREAMBLE_BITS)*ADS_B_CHIPS_PER_BIT*samplesPerChip - 1;
 | 
				
			||||||
@ -228,26 +231,39 @@ void ADSBDemodSinkWorker::run()
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                int bytes;
 | 
					                int bytes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                m_crc.init();
 | 
					                // Determine number of bytes in frame depending on downlink format
 | 
				
			||||||
                if ((df == 0) || (df == 4) || (df == 5) || (df == 11))
 | 
					                if ((df == 0) || (df == 4) || (df == 5) || (df == 11)) {
 | 
				
			||||||
                    bytes = 56/8;
 | 
					                    bytes = 56/8;
 | 
				
			||||||
                else if ((df == 16) || (df == 20) || (df == 21) || (df >= 24))
 | 
					                } else if ((df == 16) || (df == 20) || (df == 21) || (df >= 24)) {
 | 
				
			||||||
                    bytes = 112/8;
 | 
					                    bytes = 112/8;
 | 
				
			||||||
                else
 | 
					                } else {
 | 
				
			||||||
                    bytes = 0;
 | 
					                    bytes = 0;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                if (bytes > 0)
 | 
					                if (bytes > 0)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
					                    // Extract received parity
 | 
				
			||||||
                    int parity = (data[bytes-3] << 16) | (data[bytes-2] << 8) | data[bytes-1];
 | 
					                    int parity = (data[bytes-3] << 16) | (data[bytes-2] << 8) | data[bytes-1];
 | 
				
			||||||
 | 
					                    // Calculate CRC on received frame
 | 
				
			||||||
 | 
					                    m_crc.init();
 | 
				
			||||||
                    m_crc.calculate(data, bytes-3);
 | 
					                    m_crc.calculate(data, bytes-3);
 | 
				
			||||||
                    int crc = m_crc.get();
 | 
					                    int crc = m_crc.get();
 | 
				
			||||||
 | 
					                    // DF4 / DF5 / DF20 / DF21 have ICAO address XORed in to parity.
 | 
				
			||||||
 | 
					                    // Extract ICAO from parity and see if it matches an aircraft we've already
 | 
				
			||||||
 | 
					                    // received an ADS-B frame from
 | 
				
			||||||
 | 
					                    if ((df == 4) || (df == 5) || (df == 20) || (df == 21))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        unsigned icao = (parity ^ crc) & 0xffffff;
 | 
				
			||||||
 | 
					                        if (m_icaos.contains(icao)) {
 | 
				
			||||||
 | 
					                            crc ^= icao;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                    // For DF11, the last 7 bits may have an address/interogration indentifier (II)
 | 
					                    // For DF11, the last 7 bits may have an address/interogration indentifier (II)
 | 
				
			||||||
                    // XORed in, so we ignore those bits
 | 
					                    // XORed in, so we ignore those bits
 | 
				
			||||||
                    // DF4 / DF5 / DF20 / DF21 have full address XORed in to parity. GUI will check if valid
 | 
					                    if ((parity == crc) || ((df == 11) && ((parity & 0xffff80) == (crc & 0xffff80))))
 | 
				
			||||||
                    if ((parity == crc) || ((df == 11) && (parity & 0xffff80) == (crc & 0xffff80)) || (df == 4) || (df == 5) || (df == 20) || (df == 21))
 | 
					 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        m_demodStats.m_modesFrames++;
 | 
					                        m_demodStats.m_modesFrames++;
 | 
				
			||||||
                        // Pass to GUI
 | 
					                        // Pass to GUI (only pass formats it can decode)
 | 
				
			||||||
                        if (m_sink->getMessageQueueToGUI())
 | 
					                        if (m_sink->getMessageQueueToGUI() && ((df == 4) || (df == 5) || (df == 20) || (df == 21)))
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            ADSBDemodReport::MsgReportADSB *msg = ADSBDemodReport::MsgReportADSB::create(
 | 
					                            ADSBDemodReport::MsgReportADSB *msg = ADSBDemodReport::MsgReportADSB::create(
 | 
				
			||||||
                                QByteArray((char*)data, sizeof(data)),
 | 
					                                QByteArray((char*)data, sizeof(data)),
 | 
				
			||||||
@ -258,7 +274,7 @@ void ADSBDemodSinkWorker::run()
 | 
				
			|||||||
                            m_sink->getMessageQueueToGUI()->push(msg);
 | 
					                            m_sink->getMessageQueueToGUI()->push(msg);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        // Pass to worker to feed to other servers
 | 
					                        // Pass to worker to feed to other servers
 | 
				
			||||||
                        if (m_sink->getMessageQueueToWorker() && (parity == crc))
 | 
					                        if (m_sink->getMessageQueueToWorker())
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            ADSBDemodReport::MsgReportADSB *msg = ADSBDemodReport::MsgReportADSB::create(
 | 
					                            ADSBDemodReport::MsgReportADSB *msg = ADSBDemodReport::MsgReportADSB::create(
 | 
				
			||||||
                                QByteArray((char*)data, sizeof(data)),
 | 
					                                QByteArray((char*)data, sizeof(data)),
 | 
				
			||||||
 | 
				
			|||||||
@ -76,6 +76,7 @@ private:
 | 
				
			|||||||
    Real m_correlationThresholdLinear;
 | 
					    Real m_correlationThresholdLinear;
 | 
				
			||||||
    Real m_correlationScale;
 | 
					    Real m_correlationScale;
 | 
				
			||||||
    crcadsb m_crc;                      //!< Have as member to avoid recomputing LUT
 | 
					    crcadsb m_crc;                      //!< Have as member to avoid recomputing LUT
 | 
				
			||||||
 | 
					    QHash<int, bool> m_icaos;           //!< ICAO addresses that have been received
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    QDateTime rxDateTime(int firstIdx, int readBuffer) const;
 | 
					    QDateTime rxDateTime(int firstIdx, int readBuffer) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user