#2540 HydraSDR tuner uses jHydraSDR library and removes legacy java driver code. (#2541)

- Uses libhydrasdr HIGH_DEFINITION decimation mode by default.
- Tuner controller extends TunerController since libhydrasdr owns the USB device, transfers and real to complex sample conversion.
- Tuners are still discovered by USB bus and port. The controller reads the USB serial string and opens the device by serial number.
- Samples are scaled by 2 to preserve existing levels (-6 dB otherwise).
- Streaming is stopped for sample rate changes because libhydrasdr replaces the sample converter in use by its streaming thread.
- Buffer sample count follows the delivered power-of-2 buffer size and adds the 1.25 MHz sample rate.

Co-authored-by: denny <dennis.sheirer@gmail.com>
This commit is contained in:
Denny Sheirer
2026-10-31 06:15:02 -04:00
committed by GitHub
parent 85bfd21257
commit e65ff5a8dc
21 changed files with 465 additions and 2410 deletions

View File

@@ -1,156 +1,60 @@
package io.github.dsheirer.source.tuner.hydrasdr;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import io.github.dsheirer.hydrasdr.DeviceInfo;
/**
* HydraSDR device information, formatted for display and for identifying the tuner.
*/
public class HydraSdrDeviceInformation
{
private final static Logger mLog =
LoggerFactory.getLogger( HydraSdrDeviceInformation.class );
private HydraSdrTunerController.BoardID mBoardID = HydraSdrTunerController.BoardID.UNKNOWN;
private String mFirmwareVersion = "Unknown";
private String mPartNumber = "Unknown";
private String mSerialNumber = "Unknown";
private final DeviceInfo mDeviceInfo;
/**
* HydraSDR Device Information - provides parsing and access to device
* information components.
* Constructs an instance
* @param deviceInfo from the device
*/
public HydraSdrDeviceInformation()
public HydraSdrDeviceInformation(DeviceInfo deviceInfo)
{
mDeviceInfo = deviceInfo;
}
public void setBoardID( int boardID )
public String getBoardName()
{
mBoardID = HydraSdrTunerController.BoardID.fromValue( boardID );
}
public HydraSdrTunerController.BoardID getBoardID()
{
return mBoardID;
}
public void setVersion( byte[] data )
{
if( data != null && data.length > 0 )
{
/* Truncate the version string if we have a line break - ASCII 10 */
for( int x = 0; x < data.length; x++ )
{
if( data[ x ] == (byte)10 )
{
mFirmwareVersion = new String( Arrays.copyOf( data, x ) );
mFirmwareVersion = mFirmwareVersion.replace( "HydraSDR ", "" );
return;
}
}
mFirmwareVersion = new String( data );
mFirmwareVersion = mFirmwareVersion.replace( "HydraSDR ", "" );
}
else
{
mLog.error( "Error setting HydraSDR version byte data - null:" +
( data == null ? " TRUE" : " FALSE length:" + data.length ) );
}
return mDeviceInfo.boardName();
}
public String getVersion()
{
return mFirmwareVersion;
}
public void setPartAndSerialNumber( byte[] data )
{
if( data != null && data.length == 24 )
{
//Note: values are byte-reversed (big-endian) 32-bit chunks
StringBuilder part = new StringBuilder();
part.append( format( data[ 3 ] ) );
part.append( format( data[ 2 ] ) );
part.append( format( data[ 1 ] ) );
part.append( format( data[ 0 ] ) );
part.append( format( data[ 7 ] ) );
part.append( format( data[ 6 ] ) );
part.append( format( data[ 5 ] ) );
part.append( format( data[ 4 ] ) );
mPartNumber = part.toString();
StringBuilder serial = new StringBuilder();
//Note: current library only exposes 64-bits of serial number
//address space, but appears to have room for 128-bits. We won't
//add the first 64 bits if it's zeros
if( !( data[ 8 ] == 0 && data[ 9 ] == 0 && data[ 10 ] == 0 && data[ 11 ] == 0 ) )
{
serial.append( format( data[ 11 ] ) );
serial.append( format( data[ 10 ] ) );
serial.append( format( data[ 9 ] ) );
serial.append( format( data[ 8 ] ) );
serial.append( "-" );
}
if( !( data[ 12 ] == 0 && data[ 13 ] == 0 && data[ 14 ] == 0 && data[ 15 ] == 0 ) )
{
serial.append( format( data[ 15 ] ) );
serial.append( format( data[ 14 ] ) );
serial.append( format( data[ 13 ] ) );
serial.append( format( data[ 12 ] ) );
serial.append( "-" );
}
serial.append( format( data[ 19 ] ) );
serial.append( format( data[ 18 ] ) );
serial.append( format( data[ 17 ] ) );
serial.append( format( data[ 16 ] ) );
serial.append( "-" );
serial.append( format( data[ 23 ] ) );
serial.append( format( data[ 22 ] ) );
serial.append( format( data[ 21 ] ) );
serial.append( format( data[ 20 ] ) );
mSerialNumber = serial.toString();
}
else
{
mLog.error( "Error setting HydraSDR part and serial byte data - null:" +
( data == null ? " TRUE" : " FALSE length:" + data.length ) );
}
}
private String format( byte value )
{
return String.format( "%02X", value );
return mDeviceInfo.firmwareVersion().replace("HydraSDR ", "");
}
/**
* Serial number, formatted as the identifier that tuner configurations are saved under.
*/
public String getSerialNumber()
{
return mSerialNumber;
long serial = mDeviceInfo.serialNumber();
return String.format("%08X-%08X", serial >>> 32, serial & 0xFFFFFFFFL);
}
public String getPartNumber()
{
return mPartNumber;
return String.format("%016X", mDeviceInfo.partId());
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append( "HydraSDR Device Information\n" );
sb.append( "Board: " );
sb.append( getBoardID().getLabel() );
sb.append( "\nPart Number: " );
sb.append( getPartNumber() );
sb.append( "\nSerial Number: " );
sb.append( getSerialNumber() );
sb.append( "\nFirmware: " );
sb.append( getVersion() );
sb.append("HydraSDR Device Information\n");
sb.append("Board: ");
sb.append(getBoardName());
sb.append("\nPart Number: ");
sb.append(getPartNumber());
sb.append("\nSerial Number: ");
sb.append(getSerialNumber());
sb.append("\nFirmware: ");
sb.append(getVersion());
return sb.toString();
}

View File

@@ -22,7 +22,6 @@ import io.github.dsheirer.preference.source.ChannelizerType;
import io.github.dsheirer.source.tuner.ITunerErrorListener;
import io.github.dsheirer.source.tuner.Tuner;
import io.github.dsheirer.source.tuner.TunerClass;
import io.github.dsheirer.source.tuner.hydrasdr.HydraSdrTunerController.BoardID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -71,7 +70,7 @@ public class HydraSdrTuner extends Tuner
mLog.error("error getting serial number", e);
}
return BoardID.HYDRASDR_RFONE.getLabel();
return "HydraSDR RFOne";
}
@Override

View File

@@ -722,16 +722,15 @@ public class HydraSdrTunerEditor extends TunerEditor<HydraSdrTuner, HydraSdrTune
sb.append("<br>");
sb.append("<b>Firmware: </b>");
String[] firmware = info.getVersion().split(" ");
sb.append(firmware.length > 1 ? firmware[0] : info.getVersion());
sb.append(info.getVersion());
sb.append("<br>");
sb.append("<b>Part: </b>");
sb.append(info.getPartNumber());
sb.append("<br>");
sb.append("<b>Board ID: </b>");
sb.append(info.getBoardID().getLabel());
sb.append("<b>Board: </b>");
sb.append(info.getBoardName());
sb.append("<br>");
return sb.toString();