add scaffolding for pocsag decoding

This commit is contained in:
Jakob Ketterl 2020-01-06 22:08:17 +01:00
parent 4859cb5db8
commit 12e5d2f6f3
6 changed files with 22 additions and 7 deletions

View File

@ -160,7 +160,10 @@
{ {
"name": "70cm", "name": "70cm",
"lower_bound": 430000000, "lower_bound": 430000000,
"upper_bound": 440000000 "upper_bound": 440000000,
"frequencies": {
"pocsag": 439987500
}
}, },
{ {
"name": "23cm", "name": "23cm",

View File

@ -129,11 +129,6 @@
"frequency": 439937500, "frequency": 439937500,
"modulation": "dmr" "modulation": "dmr"
}, },
{
"name": "Pocsag",
"frequency": 439987500,
"modulation": "nfm"
},
{ {
"name": "DB0ULR", "name": "DB0ULR",
"frequency": 145575000, "frequency": 145575000,

View File

@ -244,6 +244,11 @@ class dsp(object):
if self.last_decimation != 1.0: if self.last_decimation != 1.0:
chain += ["csdr fractional_decimator_ff {last_decimation}"] chain += ["csdr fractional_decimator_ff {last_decimation}"]
return chain + ["csdr convert_f_s16", "direwolf -c {direwolf_config} -r {audio_rate} -t 0 -q d -q h - 1>&2"] return chain + ["csdr convert_f_s16", "direwolf -c {direwolf_config} -r {audio_rate} -t 0 -q d -q h - 1>&2"]
elif which == "pocsag":
chain += ["csdr fmdemod_quadri_cf"]
if self.last_decimation != 1.0:
chain += ["csdr fractional_decimator_ff {last_decimation}"]
return chain + ["fsk_demodulator", "pocsag_decoder"]
def set_secondary_demodulator(self, what): def set_secondary_demodulator(self, what):
if self.get_secondary_demodulator() == what: if self.get_secondary_demodulator() == what:
@ -448,6 +453,8 @@ class dsp(object):
return 48000 return 48000
elif self.isWsjtMode(): elif self.isWsjtMode():
return 12000 return 12000
elif self.isPocsag():
return 12000
return self.get_output_rate() return self.get_output_rate()
def isDigitalVoice(self, demodulator=None): def isDigitalVoice(self, demodulator=None):
@ -465,6 +472,11 @@ class dsp(object):
demodulator = self.get_secondary_demodulator() demodulator = self.get_secondary_demodulator()
return demodulator == "packet" return demodulator == "packet"
def isPocsag(self, demodulator=None):
if demodulator is None:
demodulator = self.get_secondary_demodulator()
return demodulator == "pocsag"
def set_output_rate(self, output_rate): def set_output_rate(self, output_rate):
if self.output_rate == output_rate: if self.output_rate == output_rate:
return return
@ -528,7 +540,7 @@ class dsp(object):
def set_squelch_level(self, squelch_level): def set_squelch_level(self, squelch_level):
self.squelch_level = squelch_level self.squelch_level = squelch_level
# no squelch required on digital voice modes # no squelch required on digital voice modes
actual_squelch = -150 if self.isDigitalVoice() or self.isPacket() else self.squelch_level actual_squelch = -150 if self.isDigitalVoice() or self.isPacket() or self.isPocsag() else self.squelch_level
if self.running: if self.running:
self.modification_lock.acquire() self.modification_lock.acquire()
self.squelch_pipe_file.write("%g\n" % (self.convertToLinear(actual_squelch))) self.squelch_pipe_file.write("%g\n" % (self.convertToLinear(actual_squelch)))

View File

@ -187,6 +187,7 @@
<option value="jt9" data-feature="wsjt-x">JT9</option> <option value="jt9" data-feature="wsjt-x">JT9</option>
<option value="ft4" data-feature="wsjt-x">FT4</option> <option value="ft4" data-feature="wsjt-x">FT4</option>
<option value="packet" data-feature="packet">Packet</option> <option value="packet" data-feature="packet">Packet</option>
<option value="pocsag" data-feature="pocsag">Pocsag</option>
</select> </select>
</div> </div>
<div class="openwebrx-panel-line"> <div class="openwebrx-panel-line">

View File

@ -2160,6 +2160,7 @@ function demodulator_digital_replace(subtype) {
demodulators[0].set(); demodulators[0].set();
break; break;
case "packet": case "packet":
case "pocsag":
secondary_demod_start(subtype); secondary_demod_start(subtype);
demodulator_analog_replace('nfm', true); demodulator_analog_replace('nfm', true);
break; break;

View File

@ -32,6 +32,7 @@ class FeatureDetector(object):
"digital_voice_dsd": ["dsd", "sox", "digiham"], "digital_voice_dsd": ["dsd", "sox", "digiham"],
"wsjt-x": ["wsjtx", "sox"], "wsjt-x": ["wsjtx", "sox"],
"packet": ["direwolf", "sox"], "packet": ["direwolf", "sox"],
"pocsag": ["digiham", "sox"],
} }
def feature_availability(self): def feature_availability(self):
@ -181,6 +182,8 @@ class FeatureDetector(object):
"mbe_synthesizer", "mbe_synthesizer",
"gfsk_demodulator", "gfsk_demodulator",
"digitalvoice_filter", "digitalvoice_filter",
"fsk_demodulator",
"pocsag_decoder",
], ],
), ),
True, True,