diff --git a/bands.json b/bands.json index 776007a..90e4c87 100644 --- a/bands.json +++ b/bands.json @@ -160,7 +160,10 @@ { "name": "70cm", "lower_bound": 430000000, - "upper_bound": 440000000 + "upper_bound": 440000000, + "frequencies": { + "pocsag": 439987500 + } }, { "name": "23cm", diff --git a/bookmarks.json b/bookmarks.json index 6260233..dec818b 100644 --- a/bookmarks.json +++ b/bookmarks.json @@ -129,11 +129,6 @@ "frequency": 439937500, "modulation": "dmr" }, - { - "name": "Pocsag", - "frequency": 439987500, - "modulation": "nfm" - }, { "name": "DB0ULR", "frequency": 145575000, diff --git a/csdr/csdr.py b/csdr/csdr.py index 2bcbac9..b7a1e0e 100644 --- a/csdr/csdr.py +++ b/csdr/csdr.py @@ -244,6 +244,11 @@ class dsp(object): if self.last_decimation != 1.0: 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"] + 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): if self.get_secondary_demodulator() == what: @@ -448,6 +453,8 @@ class dsp(object): return 48000 elif self.isWsjtMode(): return 12000 + elif self.isPocsag(): + return 12000 return self.get_output_rate() def isDigitalVoice(self, demodulator=None): @@ -465,6 +472,11 @@ class dsp(object): demodulator = self.get_secondary_demodulator() 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): if self.output_rate == output_rate: return @@ -528,7 +540,7 @@ class dsp(object): def set_squelch_level(self, squelch_level): self.squelch_level = squelch_level # 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: self.modification_lock.acquire() self.squelch_pipe_file.write("%g\n" % (self.convertToLinear(actual_squelch))) diff --git a/htdocs/index.html b/htdocs/index.html index 8a34fa1..12f1cf1 100644 --- a/htdocs/index.html +++ b/htdocs/index.html @@ -187,6 +187,7 @@ +
diff --git a/htdocs/openwebrx.js b/htdocs/openwebrx.js index 7017fc8..823e48f 100644 --- a/htdocs/openwebrx.js +++ b/htdocs/openwebrx.js @@ -2160,6 +2160,7 @@ function demodulator_digital_replace(subtype) { demodulators[0].set(); break; case "packet": + case "pocsag": secondary_demod_start(subtype); demodulator_analog_replace('nfm', true); break; diff --git a/owrx/feature.py b/owrx/feature.py index 5404ac8..b7bdf5c 100644 --- a/owrx/feature.py +++ b/owrx/feature.py @@ -32,6 +32,7 @@ class FeatureDetector(object): "digital_voice_dsd": ["dsd", "sox", "digiham"], "wsjt-x": ["wsjtx", "sox"], "packet": ["direwolf", "sox"], + "pocsag": ["digiham", "sox"], } def feature_availability(self): @@ -181,6 +182,8 @@ class FeatureDetector(object): "mbe_synthesizer", "gfsk_demodulator", "digitalvoice_filter", + "fsk_demodulator", + "pocsag_decoder", ], ), True,