diff --git a/CONFIGURING b/CONFIGURING index 2de0492..a9e4f20 100644 --- a/CONFIGURING +++ b/CONFIGURING @@ -1,6 +1,6 @@ /* * Copyright (C) 2010, 2011, 2012 by Scott Lawson KI4LKF - * addition Copyright (C) 2015 by Thomas A. Early N7TAE + * addition Copyright (C) 2018 by Thomas A. Early N7TAE * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -288,7 +288,7 @@ Note: MAXIMUM dtmf sequence is up to 32 dtmf tones. What dtmf tones are being decoded and processed ----------------------------------------------- -To link to an XRF reflector: Example: #02102 +To link to an XRF reflector: Example: B02102 That says: link to XRF021 module B. So, we use the # dtmf key to mean that we're interested in linking to an XRF reflector. The last two digits are the remote module 01 thru 05 (which is @@ -306,12 +306,12 @@ to mean that we're interested in linking to a REF reflector. The last two digits are the remote module 01 thru 05 (which is translated to A thru E). -To unlink (from any reflector xrf or ref): 73 +To unlink (from any reflector xrf or ref): # -To get the "link status": 99 +To get the "link status": 0 or 00 Note: -You can extend the shell ascript to do more things. like force +You can extend the shell script to do more things. like force your repeater to ID itself. Any YRCALL command that can be executed by g2link_test, can be added to the shell script. Basically, the Linux shell script proc_QnetGateway_dtmfs.sh converts the decoded @@ -341,7 +341,7 @@ change these files, unless you want to have your own personal voice played over RF. These dat files were created using a computer and they are NOT anyone's voice. -The only dat file that you should really change is id.dat. The file +The only dat file most hams will need to change is id.dat. The file id.dat contains the audio "UNLINKED" and nothing else. When the gateway is not linked and the RF user sets YRCALL=_______I to request the status of the link, the file id.dat will be played back over RF. But @@ -353,23 +353,9 @@ the audio: "This is repeater ...". A simple way to create your own recorded "repeater identification file" id.dat is to use your Dstar HT and set YRCALL command: YRCALL=______S0 and key up your repeater. Start talking, and the gateway will record your audio into the file -x_voicemail.dat where x is one of A.B or C. Now copy that file into -id.dat. +x_voicemail.dat where x is one of A.B or C. Now copy that file: +sudo cp -f /tmp/C_voicemail.dat /usr/local/etc/it.dat -Open the file QnetLink.cfg: - You can add as many lines to gwys.txt, if you know of any other - reflectors that you want to be able to connect to. REF reflectors - use port 20001(for USER connections), DCS reflectors use port - 30051 and XRF reflectors use either 30001(for Repeater linking) - or 20001(for USER connections). - - You can have as many ADMIN lines as you want. ADMIN is user - callsign that can connect to your own gateway(QnetLink) using - DVTool, ... - - Only ADMIN users can use the scripts feature of this software. - -Note: You may be thinking why did we put all this source code inside QnetLink instead of putting it all inside the Gateway software QnetGateway (or g2_ccs CCS gateway software). Because it is NOT a good design to burden @@ -378,7 +364,7 @@ NOT part of Dstar and they are not Dstar protocol. The only code that should be in a gateway, is G2 protocol code. This way we keep the gateway (QnetGateway) clean of any unneccesary source -code logic and containing only pure G2/dstar logic. +code logic and containing only pure G2/D-Star logic. QnetDVAP @@ -398,8 +384,8 @@ After editing /usr/local/etc/g2.cfg file you can restart the effected program with "sudo service QnetDVRPTR restart". Or you can alway just reboot with "sudo reboot". -Rig specific parameters are in "QnetDVRPTR.rf_rx_level", "QnetDVRPTR.inverse.rx" and -"QnetDVRPTR.inverse.tx". You need to play with these to work best with your rig. +Rig specific parameters are in "module.x.rf_rx_level", "module.x.inverse.rx" and +"module.x.inverse.tx". You need to play with these to work best with your rig. With my Kenwood TM-V71, I use the default values. You can first start with inverse.rx, trying true or false. Use the echo command @@ -410,5 +396,5 @@ then you can work out the inverse.tx paramter. Once you hear anything with in the echo mode, move rf_rx_level up or down to get the best audio. -Once you have a working system, it's a good idea to back up you g2.cfg +Once you have a working system, it's a good idea to back up you qn.cfg files. diff --git a/DTMF+REMOTE+VOICE.README b/DTMF+REMOTE+VOICE.README index 3b27b49..7e62400 100644 --- a/DTMF+REMOTE+VOICE.README +++ b/DTMF+REMOTE+VOICE.README @@ -20,11 +20,11 @@ how qnremote works. ######## QnetRemote ######### -QnetRemote is a program used to send any arbitrary YourCall to your QnetGateway -system. It is install automatically when you install any of the supported modems: -MMDVMHost, QnetDVAP or QnetDVRPTR. It's a very simple, yet powerful program. -Open a shell to you system and type "qnremote" and it will remind you of the -format it expects: +QnetRemote is a command line program used to send any arbitrary YourCall to your +QnetGateway system. It is install automatically when you install any of the +supported modems: MMDVMHost, QnetDVAP or QnetDVRPTR. It's a very simple, yet +powerful program. Open a shell to you system and type "qnremote" and it will +remind you of the format it expects: pi@raspberrypi:~ $ qnremote Usage: qnremote @@ -40,7 +40,7 @@ YourCall parameters. Here are some more examples: qnremote b w4wwm u # W4WWM is unlinking module B. qnremote c w1bwb i # W1BSB is requesting the status of module C -Modules, callsigns and YourCall can all be in lowercase, qnremote will convert +Modules, callsigns and YourCall can all be in lowercase, qnremote will conver them to uppercase. QnetLink will validate that the specific MyCall is allowed to link or unlink, according to the configuration. (By default, any user can link or unlink a module, unless link_unlink is specified in the configuration @@ -52,3 +52,41 @@ Mountain Time for the D-Star Users Net, don't forget to include an unlink command in your cron-executed script before you link! For instructions on how to do this search the web with "linux cron job". + ######## QnetVoice ######## + +QnetVoice is another command line program to send any DVTool-formatted file +to a moule configured on you gateway. It has a simple interface, like +QnetRemote. To get started, open a shell on your system and type "qnvoice": + +pi@raspberrypi:~ $ qnvoice +Usage: qnvoice +Where... + module is one of your modules + mycall is your personal callsign + dvtoolFile is a dvtool file + +Please note that and are not case sensitive, but + is. + +So what's a DVTool file? All the voice prompts delivered with QnetGateway, +in the QnetGateway/announce directory and DVTool files. And, you can +easily create your own! + +To make your own DVTool file, just put " S0" in your radio's YourCall +and key up and talk. You will be making a "voice mail" DVTool file: +/tmp/X_voicemail.dat, where X is the module on which you are transmitting. +Once you have created it, you can move it out of the /tmp directory and +rename it. Then you can use it in a qnvoice command. You can also replace +all of the standard voice messsages with your own. If you want to do this +put your versions in a directory outside of the build directoy and make +a small script that will copy your messages over the existing, installed +messages: + +#!/bin/bash + +sudo cp ./id.dat /usr/local/etc +... more copy commands + +That way, when you pull down a new release and build and install it, you +can quickly update the voice messages with your own. + diff --git a/Makefile b/Makefile index af4fd31..04ebe27 100644 --- a/Makefile +++ b/Makefile @@ -74,7 +74,7 @@ clean: install : qngateway qnlink qnrelay ######### QnetGateway ######### /bin/cp -f qngateway $(BINDIR) - /bin/cp -f qnremote $(BINDIR) + /bin/cp -f qnremote qnvoice $(BINDIR) /bin/cp -f qn.cfg $(CFGDIR) /bin/cp -f system/qngateway.service $(SYSDIR) systemctl enable qngateway.service @@ -99,7 +99,7 @@ install : qngateway qnlink qnrelay installdvap : qngateway qnlink qndvap ######### QnetGateway ######### /bin/cp -f qngateway $(BINDIR) - /bin/cp -f qnremote $(BINDIR) + /bin/cp -f qnremote qnvoice $(BINDIR) /bin/cp -f qn.cfg $(CFGDIR) /bin/cp -f system/qngateway.service $(SYSDIR) systemctl enable qngateway.service @@ -124,7 +124,7 @@ installdvap : qngateway qnlink qndvap installdvrptr : qngateway qnlink qndvrptr ######### QnetGateway ######### /bin/cp -f qngateway $(BINDIR) - /bin/cp -f qnremote $(BINDIR) + /bin/cp -f qnremote qnvoice $(BINDIR) /bin/cp -f qn.cfg $(CFGDIR) /bin/cp -f system/qngateway.service $(SYSDIR) systemctl enable qngateway.service @@ -178,6 +178,7 @@ uninstall : /bin/rm -f $(SYSDIR)/qngateway.service /bin/rm -f $(BINDIR)/qngateway /bin/rm -f $(BINDIR)/qnremote + /bin/rm -f $(BINDIR)/qnvoice /bin/rm -f $(CFGDIR)/qn.cfg ######### QnetLink ######### systemctl stop qnlink.service @@ -207,6 +208,7 @@ uninstalldvap : /bin/rm -f $(SYSDIR)/qngateway.service /bin/rm -f $(BINDIR)/qngateway /bin/rm -f $(BINDIR)/qnremote + /bin/rm -f $(BINDIR)/qnvoice /bin/rm -f $(CFGDIR)/qn.cfg ######### QnetLink ######### systemctl stop qnlink.service @@ -236,6 +238,7 @@ uninstalldvrptr : /bin/rm -f $(SYSDIR)/qngateway.service /bin/rm -f $(BINDIR)/qngateway /bin/rm -f $(BINDIR)/qnremote + /bin/rm -f $(BINDIR)/qnvoice /bin/rm -f $(CFGDIR)/qn.cfg ######### QnetLink ######### systemctl stop qnlink.service diff --git a/QnetLink.cpp b/QnetLink.cpp index b80f718..690dacf 100644 --- a/QnetLink.cpp +++ b/QnetLink.cpp @@ -3867,18 +3867,7 @@ static void AudioNotifyThread(char *arg) sleep(delay_before); memset(temp_file, '\0', sizeof(temp_file)); - if (0 == memcmp(notify_msg + 2, "id.dat", 6)) { - // check for id.dat - snprintf(temp_file, FILENAME_MAX, "%s/%c%s", announce_dir.c_str(), mod, notify_msg + 2); - struct stat ssbuf; - if (stat(temp_file, &ssbuf)) - // nope, no id.dat file, revert back to id.dat - snprintf(temp_file, FILENAME_MAX, "%s/%s", announce_dir.c_str(), notify_msg + 2); - } else - // not id.dat - snprintf(temp_file, FILENAME_MAX, "%s/%s", announce_dir.c_str(), notify_msg + 2); - - + snprintf(temp_file, FILENAME_MAX, "%s/%s", announce_dir.c_str(), notify_msg + 2); printf("sending File:[%s], mod:[%c], RADIO_ID=[%s]\n", temp_file, mod, RADIO_ID); fp = fopen(temp_file, "rb");