Improving HDRadio mode.

This commit is contained in:
Marat Fayzullin 2024-07-13 13:08:53 -04:00
parent d651afcbc0
commit 4b1efb199b
5 changed files with 85 additions and 72 deletions

View File

@ -32,12 +32,13 @@ class StationLocation(LatLngLocation):
class HdRadioModule(ThreadModule):
def __init__(self, program: int = 0, amMode: bool = False):
self.metaLock = threading.Lock()
self.metaWriter = None
self.meta = {}
self.program = 0
self.frequency = -1
self.frequency = 0
self.radio = NRSC5(lambda evt_type, evt: self.callback(evt_type, evt))
self.setFrequency(0)
self._clearMeta()
# Crashes things?
# self.radio.set_mode(Mode.AM if amMode else Mode.FM)
super().__init__()
@ -54,9 +55,11 @@ class HdRadioModule(ThreadModule):
# Change program
def setProgram(self, program: int) -> None:
if program != self.program:
logger.info("Now playing program #{0}".format(program))
self.program = program
logger.info("Now playing program #{0}".format(self.program))
# Clear program metadata
with self.metaLock:
self.meta["program"] = self.program
if "title" in self.meta:
del self.meta["title"]
if "artist" in self.meta:
@ -65,21 +68,15 @@ class HdRadioModule(ThreadModule):
del self.meta["album"]
if "genre" in self.meta:
del self.meta["genre"]
self.meta["program"] = self.program
self._writeMeta()
# Change frequency
def setFrequency(self, frequency: int) -> None:
if frequency != self.frequency:
logger.info("Now decoding at {0}MHz".format(frequency / 1000000))
self.frequency = frequency
# Clear all metadata
self.meta = {
"mode" : "HDR",
"frequency" : self.frequency,
"program" : self.program
}
self._writeMeta()
self.program = 0
logger.info("Now playing program #{0} at {1}MHz".format(self.program, self.frequency / 1000000))
self._clearMeta()
# Set metadata consumer
def setMetaWriter(self, writer: Writer) -> None:
@ -91,6 +88,16 @@ class HdRadioModule(ThreadModule):
logger.debug("Metadata: {0}".format(self.meta))
self.metaWriter.write(pickle.dumps(self.meta))
# Clear all metadata
def _clearMeta(self) -> None:
with self.metaLock:
self.meta = {
"mode" : "HDR",
"frequency" : self.frequency,
"program" : self.program
}
self._writeMeta()
# Update existing metadata
def _updateMeta(self, data) -> None:
# Update station location on the map
@ -98,6 +105,7 @@ class HdRadioModule(ThreadModule):
loc = StationLocation(data)
Map.getSharedInstance().updateLocation(data["station"], loc, "HDR")
# Update any new or different values
with self.metaLock:
changes = 0
for key in data.keys():
if key not in self.meta or self.meta[key] != data[key]:
@ -223,11 +231,11 @@ class HdRadioModule(ThreadModule):
meta["lon"] = evt.longitude
meta["altitude"] = round(evt.altitude)
for audio_service in evt.audio_services:
logger.info("Audio program %s: %s, type: %s, sound experience %s",
audio_service.program,
"public" if audio_service.access == Access.PUBLIC else "restricted",
self.radio.program_type_name(audio_service.type),
audio_service.sound_exp)
#logger.info("Audio program %s: %s, type: %s, sound experience %s",
# audio_service.program,
# "public" if audio_service.access == Access.PUBLIC else "restricted",
# self.radio.program_type_name(audio_service.type),
# audio_service.sound_exp)
meta["audio_services"] += [{
"id" : audio_service.program,
"type" : audio_service.type.value,
@ -236,10 +244,10 @@ class HdRadioModule(ThreadModule):
"experience" : audio_service.sound_exp
}]
for data_service in evt.data_services:
logger.info("Data service: %s, type: %s, MIME type %03x",
"public" if data_service.access == Access.PUBLIC else "restricted",
self.radio.service_data_type_name(data_service.type),
data_service.mime_type)
#logger.info("Data service: %s, type: %s, MIME type %03x",
# "public" if data_service.access == Access.PUBLIC else "restricted",
# self.radio.service_data_type_name(data_service.type),
# data_service.mime_type)
meta["data_services"] += [{
"mime" : data_service.mime_type,
"type" : data_service.type.value,

View File

@ -1806,7 +1806,8 @@ img.openwebrx-mirror-img
padding: 5px 0 5px 0;
}
.hdr-container .hdr-selector {
.hdr-container .hdr-selector,
.hdr-container .hdr-genre {
float: left;
}

View File

@ -569,10 +569,6 @@ AprsMarker.prototype.getInfoHTML = function(name, receiverMarker = null) {
}
}
// Linkify title based on what it is (vessel or HAM callsign)
var title = this.mode === 'AIS'?
Utils.linkifyVessel(name) : Utils.linkifyCallsign(name);
if (detailsString.length > 0) {
detailsString = '<div>' + Utils.makeListTitle('Details') + detailsString + '</div>';
}
@ -591,9 +587,11 @@ AprsMarker.prototype.getInfoHTML = function(name, receiverMarker = null) {
+ hops.join(', ') + '&nbsp;</i></div>';
}
// Linkify title based on what it is (vessel or HAM callsign)
var title = this.mode === 'AIS'?
Utils.linkifyVessel(name) : Utils.linkifyCallsign(name);
// Linkify title based on what it is (station, vessel, or HAM callsign)
var title =
this.mode === 'HDR'? Utils.linkifyFM(name)
: this.mode === 'AIS'? Utils.linkifyVessel(name)
: Utils.linkifyCallsign(name);
// Combine everything into info box contents
return '<h3>' + title + distance + '</h3>'

View File

@ -565,33 +565,28 @@ function HdrMetaPanel(el) {
var $container = $(
'<div class="hdr-container">' +
'<div class="hdr-top-line">' +
'<span class="hdr-selector"></span>' +
'<span class="hdr-identifier hdr-autoclear"></span>' +
'<select id="hdr-program-id" class="hdr-selector"></select>' +
'<span class="hdr-identifier"></span>' +
'</div>' +
'<div class="hdr-station"></div>' +
'<div class="hdr-message"></div>' +
'<div class="hdr-title"></div>' +
'<div class="hdr-artist"></div>' +
'<div class="hdr-album"></div>' +
'<div class="hdr-bottom-line">' +
'<span class="hdr-genre"></span>' +
'</div>' +
'<div class="hdr-station hdr-autoclear"></div>' +
'<div class="hdr-message hdr-autoclear"></div>' +
'<div class="hdr-title hdr-autoclear"></div>' +
'<div class="hdr-artist hdr-autoclear"></div>' +
'</div>'
);
$(this.el).append($container);
// Create program selector
this.$select = $(
'<select id="hdr-program-id">' +
'<option value="0">P1</option>' +
'<option value="1">P2</option>' +
'<option value="2">P3</option>' +
'<option value="3">P4</option>' +
'</select>'
);
this.$select.on("change", function() {
var $select = $('#hdr-program-id');
$select.hide();
$select.on("change", function() {
var id = parseInt($(this).val());
$('#openwebrx-panel-receiver').demodulatorPanel().getDemodulator().setAudioServiceId(id);
});
$('.hdr-selector').append(this.$select);
}
HdrMetaPanel.prototype = new MetaPanel();
@ -604,7 +599,7 @@ HdrMetaPanel.prototype.update = function(data) {
if ('fcc_id' in data) {
fcc_id = data.fcc_id.toString(16).toUpperCase();
fcc_id = '0x' + ('0000' + fcc_id).slice(-4);
fcc_id = ('country' in data? data.country + '-' : '') + fcc_id;
fcc_id = ('country' in data? data.country + ':' : '') + fcc_id;
}
// Update panel
@ -614,17 +609,22 @@ HdrMetaPanel.prototype.update = function(data) {
$el.find('.hdr-message').text(data.alert || data.message || data.slogan || '');
$el.find('.hdr-title').text(data.title || '');
$el.find('.hdr-artist').text(data.artist || '');
$el.find('.hdr-genre').text(data.genre || '');
$el.find('.hdr-album').text(data.album || '');
// Update program selector
if ('audio_services' in data) {
this.$select.html(data.audio_services.map(function(pgm) {
return '<option value="' + pgm.id + '">P' + (pgm.id + 1) +
' - ' + pgm.name + '</option>';
var $select = $('#hdr-program-id');
if (!data.audio_services) {
$select.hide();
$select.html('');
} else {
$select.html(data.audio_services.map(function(pgm) {
var selected = data.program == pgm.id? ' selected' : '';
return '<option value="' + pgm.id + '"' + selected + '>P' +
(pgm.id + 1) + ' - ' + pgm.name + '</option>';
}).join());
$select.show();
}
// Update program
if ('program' in data) this.$select.val(data.program);
};
HdrMetaPanel.prototype.isSupported = function(data) {

View File

@ -4,6 +4,7 @@
function Utils() {}
Utils.fm_url = 'https://www.google.com/search?q={}+FM';
Utils.callsign_url = null;
Utils.vessel_url = null;
Utils.flight_url = null;
@ -96,6 +97,11 @@ Utils.linkify = function(id, url = null, content = null, tip = null) {
}
};
// Create link to an FM station
Utils.linkifyFM = function(name) {
return this.linkify(name, this.fm_url);
};
// Create link to a callsign, with country tooltip, etc.
Utils.linkifyCallsign = function(callsign) {
// Strip callsign of modifiers