+Before proceeding you will need to know the control channel frequency or frequencies for your system and the system NAC code. Also needed is the frequency correction (PPM) value for your SDR.
+
+
Select "Configuration" from the top nav bar
+
Select "sample_trunked" from the list of available configurations; then click "Edit"
+
The various Frequency parameters are used as follows:
+
+
The Channel frequency is the same as the "center frequency". If the entire P25 system being monitored fits within the sampling band (as defined by the device sampling rate), choose a frequency that is halfway between the lowest and highest system frequencies and enter it here. OP25 will use a "software LO" to achieve tuning within this band. If the value is zero or if the desired frequency when retuning is outside the sampling band, OP25 will change the SDR hardware receive frequency each time a frequency change is needed.
+
The Device frequency is ignored in trunked operation, but must be set to a non-zero number. TODO: fix this.
+
Under "Trunking Info" the "CC Freq's" should be set to a list of control channel frequencies. If your system has more than one control channel you should enter them as a comma separated list. Some systems with multiple control channels seem to favor a certain frequency; if so you can speed up acquisition by entering such channel(s) first in the list.
+
+
Enter the frequency correction value of the SDR device in the "PPM" field. If your SDR is GPSDO stabilized, you can enter zero here; all others must contend with setting a proper correction value.
+
Enter the name of your system in the channel "Name" input.
+
Enter the system NAC.
+
Be sure to check the "P2 TDMA" box if your system utilizes P25 Phase 2/TDMA.
+
Choose and enter a name for the new configuration file and click "Save".
+
The displayed list of configurations should update, showing the new configuration.
+
After selecting the configuration from the list, click "Start" to launch the receiver app (rx.py) in the background*
+
+*The "Start" and "Stop" options are only usable when OP25 has been started in the backend as "http.py", not as "rx.py" or "multi_rx.py".
+
NOTES
+
+
Configuration files are saved in the op25/gr-op25_repeater/www/config directory, as JSON.
+
If you aleady have installed OP25 with a TSV configuration file, to import the TSV config files check the box to include TSV files and click "Refresh". TSV files are searched for in the op25/gr-op25_repeater/apps directory.
+
The current version does not allow configurations with more than one channel unless all the channels share the same value for the "Trunked" parameter. That is, the configuration must define either none of the channels as trunked or all of the channels as trunked. The selected backend used in these two cases is multi_rx.py or rx.py, respectively.
+
You can define more than one trunked (P25) system by adding an additional channel for each one. The list of currently-active channels can be managed from the HTTP console "Home" page.
+
Please refer to this page for details about specifying the Device Args parameter values for your SDR device.
+
After creating and verifying a configuration you can arrange for that configuration to be automatically started whenever http.py is (re)started. When starting http.py, use the -c Name parameter to give the name of the configuration to be started. Name should not contain any prefixes or suffixes,
+
+
+
@@ -171,10 +205,10 @@
+ - Open configuration editor (any previous unsaved work will be lost)
- Reload selection list
Include old-style trunking TSV files
- - Open configuration editor (any previous unsaved work will be lost)
- Run flowgraph using selected configuration
- End running flowgraph
@@ -227,7 +261,6 @@
pcm inp device
soundcard IF
tone detect algo
-
voice codec
hamlib model
direct audio inp
startup pause
@@ -286,6 +319,7 @@
Plot Type(s)
Destination
IF Rate
+
α
@@ -311,6 +345,7 @@
+
diff --git a/op25/gr-op25_repeater/www/www-static/main.css b/op25/gr-op25_repeater/www/www-static/main.css
index 70a723b..597d553 100644
--- a/op25/gr-op25_repeater/www/www-static/main.css
+++ b/op25/gr-op25_repeater/www/www-static/main.css
@@ -439,3 +439,8 @@ div#cfg_list_area select {
border-left: none;
text-align: right;
}
+
+.help {
+ max-width: 640px;
+ font-family: Arial, Helvetica, sans-serif;
+}
diff --git a/op25/gr-op25_repeater/www/www-static/main.js b/op25/gr-op25_repeater/www/www-static/main.js
index 08ee375..9bc769c 100644
--- a/op25/gr-op25_repeater/www/www-static/main.js
+++ b/op25/gr-op25_repeater/www/www-static/main.js
@@ -80,7 +80,7 @@ function edit_d(d, to_ui) {
var hexints = {"nac":1};
var ints = {"if_rate":1, "ppm":1, "rate":1, "offset":1, "nac":1, "logfile-workers":1, "decim-amt":1, "seek":1, "hamlib-model":1 };
var bools = {"active":1, "trunked":1, "rate":1, "offset":1, "phase2_tdma": 1, "phase2-tdma":1, "wireshark":1, "udp-player":1, "audio-if":1, "tone-detect":1, "vocoder":1, "audio":1, "pause":1 };
- var floats = {"costas-alpha":1, "gain-mu":1, "calibration":1, "fine-tune":1, "gain":1, "excess-bw":1, "offset":1}
+ var floats = {"costas-alpha":1, "gain-mu":1, "calibration":1, "fine-tune":1, "gain":1, "excess-bw":1, "offset":1, "excess_bw":1}
var lists = {"blacklist":1, "whitelist":1, "cclist":1};
var freqs = {"frequency":1, "cclist":1};
@@ -114,7 +114,10 @@ function edit_d(d, to_ui) {
}
} else {
if (k in hexints) {
- new_d[k] = "0x" + d[k].toString(16);
+ if (d[k] == null)
+ new_d[k] = "0x0";
+ else
+ new_d[k] = "0x" + d[k].toString(16);
} else if (k in ints) {
if (d[k] == null)
new_d[k] = "";
@@ -213,8 +216,8 @@ function amend_d(myrow, mytbl, command) {
}
function nav_update(command) {
- var names = ["b1", "b2", "b3", "b4"];
- var bmap = { "status": "b1", "settings": "b2", "rx": "b3", "about": "b4" };
+ var names = ["b1", "b2", "b3", "b4", "b5"];
+ var bmap = { "status": "b1", "settings": "b2", "rx": "b3", "help": "b4", "about": "b5" };
var id = bmap[command];
for (var id1 in names) {
b = document.getElementById(names[id1]);
@@ -227,7 +230,7 @@ function nav_update(command) {
}
function f_select(command) {
- var div_list = ["status", "settings", "rx", "about"];
+ var div_list = ["status", "settings", "rx", "help", "about"];
var orig_command = command;
if (command == "rx") {
command = "status"; //hack
@@ -307,8 +310,9 @@ function change_freq(d) {
}
var html = "
";
+ var d_sys = ("system" in d) ? d['system'].substring(0,doTruncate) : "Undefined";
html += "