Topics

MMDVM & UDRC

Jonathan Naylor
 

Hi Folks

 

I’ve been busy working on some new bits of software. Both of them target the UDRC on a Raspberry Pi as a platform, and offer some interesting new avenues for experimentation.

 

Firstly I ported my old AnalogueRepeater over to the UDRC (or any other sound card based system allied to an Arduino controller). I also simplified the software, removing its GUI and the need for wxWidgets and renamed it as the FMRepeater on my GitHub.

 

I removed the potential for a second audio input such as EchoLink and did some other simplifications. Otherwise it is the same as the old AnalogueRepeater but with a more sensible configuration file. It also has a lockout input :-)

 

I had toyed with the idea of incorporating it into the MMDVM code base to run on the same controller as the digital modes, however compared to the MMDVM, the number of tunable options is very great and I thought it would be better to run it on a separate platform. It hasn’t been tested yet, but most of the code is well tested in its previous incarnation so the bugs will be in the porting.

 

I’ve also ported the MMDVM firmware to run on the UDRC! It works on all modes in both simplex and duplex modes. The code has been taken from the latest MMDVM GitHub dstar_correlator branch as that offers the best sensitivity. It will only work with the UDRC as the hardware control is hard coded (the sound device is incorrect in GitHub until I get my UDRC running on Compass Linux). So far it sounds like there is no need for proper MMDVM hardware, and for some applications that is true. In fact you can run all modes in simplex or duplex modes like a real MMDVM with one major exception: you cannot run DMR in duplex mode, and it will never be able to do so. You could use it if you had two DMR radios in DMO mode (or one radio if you’re happy to change channel between TX and RX), but not a single DMR radio in duplex mode.

 

Although almost everything is hard coded. The MMDVM code requires a pseudo-TTY port passed as a command line parameter as that is the way it will communicate with an MMDVMHost process.

 

One of the things I did was move the MMDVM code to use floating point numbers, which will make thinks slightly easier if/when the main MMDVM code goes over to floating point. The pain of recalculating the coefficients has already been gone through.

 

Both of these projects need testing and tweaking by either myself or other people (hint hint), but they’re both on my GitHub as of now. The MMDVM version is named MMDVM-UDRC.

 

I still have one more older project I wish to resurrect and simplify, and I’ll get onto that now.

 

Jonathan  G4KLX



 

Great to see, Jonathan.

Check your Yahoo email for some notes.

On Thu, May 3, 2018, 07:38 Jonathan Naylor via Groups.Io <naylorjs=yahoo.com@groups.io> wrote:

Hi Folks

 

I’ve been busy working on some new bits of software. Both of them target the UDRC on a Raspberry Pi as a platform, and offer some interesting new avenues for experimentation.

 

Firstly I ported my old AnalogueRepeater over to the UDRC (or any other sound card based system allied to an Arduino controller). I also simplified the software, removing its GUI and the need for wxWidgets and renamed it as the FMRepeater on my GitHub.

 

I removed the potential for a second audio input such as EchoLink and did some other simplifications. Otherwise it is the same as the old AnalogueRepeater but with a more sensible configuration file. It also has a lockout input :-)

 

I had toyed with the idea of incorporating it into the MMDVM code base to run on the same controller as the digital modes, however compared to the MMDVM, the number of tunable options is very great and I thought it would be better to run it on a separate platform. It hasn’t been tested yet, but most of the code is well tested in its previous incarnation so the bugs will be in the porting.

 

I’ve also ported the MMDVM firmware to run on the UDRC! It works on all modes in both simplex and duplex modes. The code has been taken from the latest MMDVM GitHub dstar_correlator branch as that offers the best sensitivity. It will only work with the UDRC as the hardware control is hard coded (the sound device is incorrect in GitHub until I get my UDRC running on Compass Linux). So far it sounds like there is no need for proper MMDVM hardware, and for some applications that is true. In fact you can run all modes in simplex or duplex modes like a real MMDVM with one major exception: you cannot run DMR in duplex mode, and it will never be able to do so. You could use it if you had two DMR radios in DMO mode (or one radio if you’re happy to change channel between TX and RX), but not a single DMR radio in duplex mode.

 

Although almost everything is hard coded. The MMDVM code requires a pseudo-TTY port passed as a command line parameter as that is the way it will communicate with an MMDVMHost process.

 

One of the things I did was move the MMDVM code to use floating point numbers, which will make thinks slightly easier if/when the main MMDVM code goes over to floating point. The pain of recalculating the coefficients has already been gone through.

 

Both of these projects need testing and tweaking by either myself or other people (hint hint), but they’re both on my GitHub as of now. The MMDVM version is named MMDVM-UDRC.

 

I still have one more older project I wish to resurrect and simplify, and I’ll get onto that now.

 

Jonathan  G4KLX



Tony
 

Greetings all,

I downloaded the zip file from https://github.com/g4klx/MMDVM-UDRC. The README.md contains no specific build instructions, and "make" encounters an error. First I check for some things:

root@:~/src/MMDVM-UDRC-master# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: udrc [udrc], device 0: Universal Digital Radio Controller tlv320aic32x4-hifi-0 []
  Subdevices: 0/1
  Subdevice #0: subdevice #0

root@:~/src/MMDVM-UDRC-master# dpkg --get-selections | grep wiringpi
wiringpi                                        install

root@:~/src/MMDVM-UDRC-master# make
...
g++ Biquad.o CalDMR.o CalDStarRX.o CalDStarTX.o CalNXDN.o CalP25.o CWIdTX.o DMRDMORX.o DMRDMOTX.o DMRSlotType.o DStarRX.o DStarTX.o FIR.o FIRInterpolator.o IO.o IOUDRC.o MMDVM.o NXDNRX.o NXDNTX.o P25RX.o P25TX.o SampleRB.o SerialDataController.o SerialPort.o SerialRB.o SoundCardReaderWriter.o Thread.o Utils.o YSFRX.o YSFTX.o -g -lpthread -lasound -o MMDVM
IOUDRC.o: In function `CIO::initInt()':
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:32: undefined reference to `wiringPiSetup'
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:34: undefined reference to `pinMode'
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:37: undefined reference to `pullUpDnControl'
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:39: undefined reference to `pinMode'
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:40: undefined reference to `pinMode'
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:41: undefined reference to `pinMode'
IOUDRC.o: In function `CIO::startInt()':
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:50: undefined reference to `digitalWrite'
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:51: undefined reference to `digitalWrite'
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:47: undefined reference to `digitalWrite'
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:48: undefined reference to `digitalWrite'
IOUDRC.o: In function `CIO::getCOSInt()':
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:57: undefined reference to `digitalRead'
IOUDRC.o: In function `CIO::setLEDInt(bool)':
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:62: undefined reference to `digitalWrite'
IOUDRC.o: In function `CIO::setPTTInt(bool)':
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:74: undefined reference to `digitalWrite'
/root/src/MMDVM-UDRC-master/IOUDRC.cpp:76: undefined reference to `digitalWrite'
collect2: error: ld returned 1 exit status
Makefile:14: recipe for target 'MMDVM' failed
make: *** [MMDVM] Error 1

Thinking that I might be missing some package(s), I search for the undefined references without result:

root@:~/src/MMDVM-UDRC-master# for i in \
> $(make 2>&1 | grep "^/root" | awk '{print $NF}' | \
> tr -d [:punct:] | sort | uniq)
> do
>   echo $i
>   apt-file search $i
> done
digitalRead
digitalWrite
pinMode
pullUpDnControl
wiringPiSetup

root@:~/src/MMDVM-UDRC-master#


What am I missing please to successfully compile this code?

On 05/03/2018 07:38 AM, Jonathan Naylor via Groups.Io wrote:

Hi Folks

I’ve been busy working on some new bits of software. Both of them target the UDRC on a Raspberry Pi as a platform, and offer some interesting new avenues for experimentation.

Firstly I ported my old AnalogueRepeater over to the UDRC (or any other sound card based system allied to an Arduino controller). I also simplified the software, removing its GUI and the need for wxWidgets and renamed it as the FMRepeater on my GitHub.

I removed the potential for a second audio input such as EchoLink and did some other simplifications. Otherwise it is the same as the old AnalogueRepeater but with a more sensible configuration file. It also has a lockout input :-)

I had toyed with the idea of incorporating it into the MMDVM code base to run on the same controller as the digital modes, however compared to the MMDVM, the number of tunable options is very great and I thought it would be better to run it on a separate platform. It hasn’t been tested yet, but most of the code is well tested in its previous incarnation so the bugs will be in the porting.

I’ve also ported the MMDVM firmware to run on the UDRC! It works on all modes in both simplex and duplex modes. The code has been taken from the latest MMDVM GitHub dstar_correlator branch as that offers the best sensitivity. It will only work with the UDRC as the hardware control is hard coded (the sound device is incorrect in GitHub until I get my UDRC running on Compass Linux). So far it sounds like there is no need for proper MMDVM hardware, and for some applications that is true. In fact you can run all modes in simplex or duplex modes like a real MMDVM with one major exception: you cannot run DMR in duplex mode, and it will never be able to do so. You could use it if you had two DMR radios in DMO mode (or one radio if you’re happy to change channel between TX and RX), but not a single DMR radio in duplex mode.

Although almost everything is hard coded. The MMDVM code requires a pseudo-TTY port passed as a command line parameter as that is the way it will communicate with an MMDVMHost process.

One of the things I did was move the MMDVM code to use floating point numbers, which will make thinks slightly easier if/when the main MMDVM code goes over to floating point. The pain of recalculating the coefficients has already been gone through.

Both of these projects need testing and tweaking by either myself or other people (hint hint), but they’re both on my GitHub as of now. The MMDVM version is named MMDVM-UDRC.

I still have one more older project I wish to resurrect and simplify, and I’ll get onto that now.

Jonathan  G4KLX

 

I ran into the same issue trying to compile on Compass Wilderness from March 2018. 

Rich, KR4PI

Jeremy McDermond <mcdermj@...>
 

I don’t see a -lwiringPi in the link command you have cut/pasted.

— Anna

On May 4, 2018, at 10:32 AM, Rich KR4PI <rich.schnieders@...> wrote:

I ran into the same issue trying to compile on Compass Wilderness from March 2018. 

Rich, KR4PI

Tony
 

Thank you, it compiles successfully with that library addition to the Makefile.

Hopefully we'll soon receive some guidance on how to make the resulting executable MMDVM work with the UDRC-II. Does it replace one of the existing components dstarrepeaterd or ircddbgatewayd, perhaps via symlink? Where is the "more sensible configuration file"? Enquiring minds would like to know, as there's no man page and no "make install", only a usage message.


On 05/04/2018 01:59 PM, Jeremy McDermond wrote:
I don’t see a -lwiringPi in the link command you have cut/pasted.

— Anna

On May 4, 2018, at 10:32 AM, Rich KR4PI <rich.schnieders@...> wrote:

I ran into the same issue trying to compile on Compass Wilderness from March 2018. 

Rich, KR4PI

Jonathan Naylor
 

Hi All

I don’t have a Compass Linux up and running yet so I built it on a standard Linux box with the WiringPi header added.

In MMDVM.cpp you will see two strings, “READ” and “WRITE” or similar. These need to be replaced with the Compass Linux UDRC ALSA sound devices. If someone could do a pull request with that info and the missing library, I’d appreciate it.

To use it, you need to use a pseudo tty to link it to the host, and have one end of the pseudo tty on the command line. It will run as a daemon if you pass -daemon on the command line.

It’s untested, but closely related to the latest MMDVM firmware.

Jonathan G4KLX 




On Saturday, May 5, 2018, 05:49, Tony <w7efs@...> wrote:

Thank you, it compiles successfully with that library addition to the Makefile.

Hopefully we'll soon receive some guidance on how to make the resulting executable MMDVM work with the UDRC-II. Does it replace one of the existing components dstarrepeaterd or ircddbgatewayd, perhaps via symlink? Where is the "more sensible configuration file"? Enquiring minds would like to know, as there's no man page and no "make install", only a usage message.


On 05/04/2018 01:59 PM, Jeremy McDermond wrote:
I don’t see a -lwiringPi in the link command you have cut/pasted.

— Anna

On May 4, 2018, at 10:32 AM, Rich KR4PI <rich.schnieders@...> wrote:

I ran into the same issue trying to compile on Compass Wilderness from March 2018. 

Rich, KR4PI

 

Does anyone have MMDVM running on their UDRC yet? I have tried to compile and run with the latest compass Cedar but still cannot complete the build. Sudo make results in:

g++ -g -O3 -Wall -std=c++0x -pthread -c -o Biquad.o Biquad.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDMR.o CalDMR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarRX.o CalDStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarTX.o CalDStarTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalNXDN.o CalNXDN.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalP25.o CalP25.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CWIdTX.o CWIdTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMORX.o DMRDMORX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMOTX.o DMRDMOTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRSlotType.o DMRSlotType.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarRX.o DStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarTX.o DStarTX.cpp
DStarTX.cpp: In member function ‘void CDStarTX::txHeader(const uint8_t*, uint8_t*) const’:
DStarTX.cpp:382:7: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
       if (d & 0x08U)
       ^~
DStarTX.cpp:384:9: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
         i++;
         ^
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIR.o FIR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIRInterpolator.o FIRInterpolator.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IO.o IO.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IOUDRC.o IOUDRC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o MMDVM.o MMDVM.cpp
In file included from MMDVM.cpp:21:0:
SoundCardReaderWriter.h:51:28: fatal error: alsa/asoundlib.h: No such file or directory
 
                            ^
compilation terminated.
Makefile:17: recipe for target 'MMDVM.o' failed
make: *** [MMDVM.o] Error 1

Thanks in advance for the help.

Rich, KR4PI

 

I haven't had a chance to build yet, but it looks like you haven't installed the dev package for asoundlib. Try:

sudo apt install libasound2-dev

On Fri, Jul 6, 2018 at 11:02 AM, Rich KR4PI <rich.schnieders@...> wrote:
Does anyone have MMDVM running on their UDRC yet? I have tried to compile and run with the latest compass Cedar but still cannot complete the build. Sudo make results in:

g++ -g -O3 -Wall -std=c++0x -pthread -c -o Biquad.o Biquad.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDMR.o CalDMR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarRX.o CalDStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarTX.o CalDStarTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalNXDN.o CalNXDN.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalP25.o CalP25.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CWIdTX.o CWIdTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMORX.o DMRDMORX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMOTX.o DMRDMOTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRSlotType.o DMRSlotType.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarRX.o DStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarTX.o DStarTX.cpp
DStarTX.cpp: In member function ‘void CDStarTX::txHeader(const uint8_t*, uint8_t*) const’:
DStarTX.cpp:382:7: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
       if (d & 0x08U)
       ^~
DStarTX.cpp:384:9: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
         i++;
         ^
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIR.o FIR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIRInterpolator.o FIRInterpolator.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IO.o IO.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IOUDRC.o IOUDRC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o MMDVM.o MMDVM.cpp
In file included from MMDVM.cpp:21:0:
SoundCardReaderWriter.h:51:28: fatal error: alsa/asoundlib.h: No such file or directory
 
                            ^
compilation terminated.
Makefile:17: recipe for target 'MMDVM.o' failed
make: *** [MMDVM.o] Error 1

Thanks in advance for the help.

Rich, KR4PI




--


John D. Hays
Edmonds, WA
K7VE

   

 

Thanks John, that helped but there were still a few errors along the way:

g++ -g -O3 -Wall -std=c++0x -pthread -c -o Biquad.o Biquad.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDMR.o CalDMR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarRX.o CalDStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarTX.o CalDStarTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalNXDN.o CalNXDN.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalP25.o CalP25.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CWIdTX.o CWIdTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMORX.o DMRDMORX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMOTX.o DMRDMOTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRSlotType.o DMRSlotType.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarRX.o DStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarTX.o DStarTX.cpp
DStarTX.cpp: In member function ‘void CDStarTX::txHeader(const uint8_t*, uint8_t*) const’:
DStarTX.cpp:382:7: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
       if (d & 0x08U)
       ^~
DStarTX.cpp:384:9: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
         i++;
         ^
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIR.o FIR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIRInterpolator.o FIRInterpolator.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IO.o IO.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IOUDRC.o IOUDRC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o MMDVM.o MMDVM.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNRX.o NXDNRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNTX.o NXDNTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25RX.o P25RX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25TX.o P25TX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o POCSAGTX.o POCSAGTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SampleRB.o SampleRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialController.o SerialController.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialPort.o SerialPort.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialRB.o SerialRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SoundCardReaderWriter.o SoundCardReaderWriter.cpp
SoundCardReaderWriter.cpp: In member function ‘virtual void CSoundCardWriter::entry()’:
SoundCardReaderWriter.cpp:479:85: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 le ((ret = ::snd_pcm_writei(m_handle, m_samples + offset, nSamples - offset)) != (nSamples - offset)) {
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Thread.o Thread.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Utils.o Utils.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFRX.o YSFRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFTX.o YSFTX.cpp
g++ Biquad.o CalDMR.o CalDStarRX.o CalDStarTX.o CalNXDN.o CalP25.o CWIdTX.o DMRDMORX.o DMRDMOTX.o DMRSlotType.o DStarRX.o DStarTX.o FIR.o FIRInterpolator.o IO.o IOUDRC.o MMDVM.o NXDNRX.o NXDNTX.o P25RX.o P25TX.o POCSAGTX.o SampleRB.o SerialController.o SerialPort.o SerialRB.o SoundCardReaderWriter.o Thread.o Utils.o YSFRX.o YSFTX.o -g -lpthread -lasound -lwiringPi -o MMDVM

it did complete the compile. When I attempt ./MMDVM is receive the following:

Link does not exist: /dev/pts/1 <> ttyMMDVM0
Error creating symlink from /dev/pts/1 to ttyMMDVM0
Unable to open serial port on vpty: ttyMMDVM0

I am assuming this indicates that it is not properly configured for the UDRC.  That is what I will be exploring next.

Thanks for the help
Rich, KR4PI
 
 

Dan Porter (AI2M)
 

Hi Rich,

Did you eventually manage to get it working? 
I was thinking of trying again with my UDRC.

73, Dan - AI2M

On Jul 6, 2018, at 3:05 PM, Rich KR4PI <rich.schnieders@...> wrote:

Thanks John, that helped but there were still a few errors along the way:

g++ -g -O3 -Wall -std=c++0x -pthread -c -o Biquad.o Biquad.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDMR.o CalDMR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarRX.o CalDStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarTX.o CalDStarTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalNXDN.o CalNXDN.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalP25.o CalP25.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CWIdTX.o CWIdTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMORX.o DMRDMORX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMOTX.o DMRDMOTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRSlotType.o DMRSlotType.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarRX.o DStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarTX.o DStarTX.cpp
DStarTX.cpp: In member function ‘void CDStarTX::txHeader(const uint8_t*, uint8_t*) const’:
DStarTX.cpp:382:7: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
       if (d & 0x08U)
       ^~
DStarTX.cpp:384:9: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
         i++;
         ^
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIR.o FIR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIRInterpolator.o FIRInterpolator.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IO.o IO.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IOUDRC.o IOUDRC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o MMDVM.o MMDVM.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNRX.o NXDNRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNTX.o NXDNTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25RX.o P25RX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25TX.o P25TX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o POCSAGTX.o POCSAGTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SampleRB.o SampleRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialController.o SerialController.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialPort.o SerialPort.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialRB.o SerialRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SoundCardReaderWriter.o SoundCardReaderWriter.cpp
SoundCardReaderWriter.cpp: In member function ‘virtual void CSoundCardWriter::entry()’:
SoundCardReaderWriter.cpp:479:85: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 le ((ret = ::snd_pcm_writei(m_handle, m_samples + offset, nSamples - offset)) != (nSamples - offset)) {
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Thread.o Thread.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Utils.o Utils.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFRX.o YSFRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFTX.o YSFTX.cpp
g++ Biquad.o CalDMR.o CalDStarRX.o CalDStarTX.o CalNXDN.o CalP25.o CWIdTX.o DMRDMORX.o DMRDMOTX.o DMRSlotType.o DStarRX.o DStarTX.o FIR.o FIRInterpolator.o IO.o IOUDRC.o MMDVM.o NXDNRX.o NXDNTX.o P25RX.o P25TX.o POCSAGTX.o SampleRB.o SerialController.o SerialPort.o SerialRB.o SoundCardReaderWriter.o Thread.o Utils.o YSFRX.o YSFTX.o -g -lpthread -lasound -lwiringPi -o MMDVM

it did complete the compile. When I attempt ./MMDVM is receive the following:

Link does not exist: /dev/pts/1 <> ttyMMDVM0
Error creating symlink from /dev/pts/1 to ttyMMDVM0
Unable to open serial port on vpty: ttyMMDVM0

I am assuming this indicates that it is not properly configured for the UDRC.  That is what I will be exploring next.

Thanks for the help
Rich, KR4PI
 
 

Geoffrey Merck
 

Hi,

I am waiting for my DRAWS to be delivered as I plan to address this issue.

73
Geoffrey F4FXL / KC3FRA

Le jeu. 6 déc. 2018 à 13:51, Dan Porter (AI2M) <groups@...> a écrit :

Hi Rich,

Did you eventually manage to get it working? 
I was thinking of trying again with my UDRC.

73, Dan - AI2M

On Jul 6, 2018, at 3:05 PM, Rich KR4PI <rich.schnieders@...> wrote:

Thanks John, that helped but there were still a few errors along the way:

g++ -g -O3 -Wall -std=c++0x -pthread -c -o Biquad.o Biquad.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDMR.o CalDMR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarRX.o CalDStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarTX.o CalDStarTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalNXDN.o CalNXDN.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalP25.o CalP25.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CWIdTX.o CWIdTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMORX.o DMRDMORX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMOTX.o DMRDMOTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRSlotType.o DMRSlotType.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarRX.o DStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarTX.o DStarTX.cpp
DStarTX.cpp: In member function ‘void CDStarTX::txHeader(const uint8_t*, uint8_t*) const’:
DStarTX.cpp:382:7: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
       if (d & 0x08U)
       ^~
DStarTX.cpp:384:9: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
         i++;
         ^
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIR.o FIR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIRInterpolator.o FIRInterpolator.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IO.o IO.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IOUDRC.o IOUDRC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o MMDVM.o MMDVM.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNRX.o NXDNRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNTX.o NXDNTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25RX.o P25RX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25TX.o P25TX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o POCSAGTX.o POCSAGTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SampleRB.o SampleRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialController.o SerialController.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialPort.o SerialPort.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialRB.o SerialRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SoundCardReaderWriter.o SoundCardReaderWriter.cpp
SoundCardReaderWriter.cpp: In member function ‘virtual void CSoundCardWriter::entry()’:
SoundCardReaderWriter.cpp:479:85: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 le ((ret = ::snd_pcm_writei(m_handle, m_samples + offset, nSamples - offset)) != (nSamples - offset)) {
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Thread.o Thread.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Utils.o Utils.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFRX.o YSFRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFTX.o YSFTX.cpp
g++ Biquad.o CalDMR.o CalDStarRX.o CalDStarTX.o CalNXDN.o CalP25.o CWIdTX.o DMRDMORX.o DMRDMOTX.o DMRSlotType.o DStarRX.o DStarTX.o FIR.o FIRInterpolator.o IO.o IOUDRC.o MMDVM.o NXDNRX.o NXDNTX.o P25RX.o P25TX.o POCSAGTX.o SampleRB.o SerialController.o SerialPort.o SerialRB.o SoundCardReaderWriter.o Thread.o Utils.o YSFRX.o YSFTX.o -g -lpthread -lasound -lwiringPi -o MMDVM

it did complete the compile. When I attempt ./MMDVM is receive the following:

Link does not exist: /dev/pts/1 <> ttyMMDVM0
Error creating symlink from /dev/pts/1 to ttyMMDVM0
Unable to open serial port on vpty: ttyMMDVM0

I am assuming this indicates that it is not properly configured for the UDRC.  That is what I will be exploring next.

Thanks for the help
Rich, KR4PI
 
 

Annaliese McDermond
 

Dan --

Because I’m trying to get my repeater up and running again, and would like to use MMDVM-UDRC to do so, I’ve been doing some work on getting MMDVM-UDRC to work. My code is in the nwdigitalradio github account at:

https://github.com/nwdigitalradio/MMDVM-UDRC

You’re welcome to play with it with the understanding that it’s development code, may not work at all. I’m getting close to having things possibly working acceptably.


An issue you’ll have to deal with is that mmdvm-udrc expects a 24000 sample rate. The UDRC hardware doesn’t support this and if you try to use hw:CARD=udrc,DEV=0 it will fail complaining on not being able to send sample rate. You might try using plughw:CARD=udrc,DEV=0 instead. I’m using a custom asound.conf to support it.

More as I get things worked out.

--
Annaliese McDermond (NH6Z)
nh6z@...

On Dec 6, 2018, at 4:51 AM, Dan Porter (AI2M) <groups@...> wrote:

Hi Rich,

Did you eventually manage to get it working?
I was thinking of trying again with my UDRC.

73, Dan - AI2M

On Jul 6, 2018, at 3:05 PM, Rich KR4PI <@KR4PI> wrote:

Thanks John, that helped but there were still a few errors along the way:

g++ -g -O3 -Wall -std=c++0x -pthread -c -o Biquad.o Biquad.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDMR.o CalDMR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarRX.o CalDStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarTX.o CalDStarTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalNXDN.o CalNXDN.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalP25.o CalP25.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CWIdTX.o CWIdTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMORX.o DMRDMORX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMOTX.o DMRDMOTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRSlotType.o DMRSlotType.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarRX.o DStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarTX.o DStarTX.cpp
DStarTX.cpp: In member function ‘void CDStarTX::txHeader(const uint8_t*, uint8_t*) const’:
DStarTX.cpp:382:7: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
if (d & 0x08U)
^~
DStarTX.cpp:384:9: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
i++;
^
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIR.o FIR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIRInterpolator.o FIRInterpolator.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IO.o IO.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IOUDRC.o IOUDRC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o MMDVM.o MMDVM.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNRX.o NXDNRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNTX.o NXDNTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25RX.o P25RX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25TX.o P25TX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o POCSAGTX.o POCSAGTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SampleRB.o SampleRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialController.o SerialController.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialPort.o SerialPort.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialRB.o SerialRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SoundCardReaderWriter.o SoundCardReaderWriter.cpp
SoundCardReaderWriter.cpp: In member function ‘virtual void CSoundCardWriter::entry()’:
SoundCardReaderWriter.cpp:479:85: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
le ((ret = ::snd_pcm_writei(m_handle, m_samples + offset, nSamples - offset)) != (nSamples - offset)) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Thread.o Thread.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Utils.o Utils.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFRX.o YSFRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFTX.o YSFTX.cpp
g++ Biquad.o CalDMR.o CalDStarRX.o CalDStarTX.o CalNXDN.o CalP25.o CWIdTX.o DMRDMORX.o DMRDMOTX.o DMRSlotType.o DStarRX.o DStarTX.o FIR.o FIRInterpolator.o IO.o IOUDRC.o MMDVM.o NXDNRX.o NXDNTX.o P25RX.o P25TX.o POCSAGTX.o SampleRB.o SerialController.o SerialPort.o SerialRB.o SoundCardReaderWriter.o Thread.o Utils.o YSFRX.o YSFTX.o -g -lpthread -lasound -lwiringPi -o MMDVM

it did complete the compile. When I attempt ./MMDVM is receive the following:

Link does not exist: /dev/pts/1 <> ttyMMDVM0
Error creating symlink from /dev/pts/1 to ttyMMDVM0
Unable to open serial port on vpty: ttyMMDVM0

I am assuming this indicates that it is not properly configured for the UDRC. That is what I will be exploring next.

Thanks for the help
Rich, KR4PI

Jonathan Naylor
 

Hi Annaliese

There are a set of filter coefficients for 48 kHz sample rate in a branch of the MMDVM firmware. I’ll look into slotting those in and altering the other variables.

Ideally I’d recalculate them in MATLAB as floating point but my license for it ran out. Octave can probably do it though. Even rescaling from Q15 format will probably give enough precision.

It’s bizarre seeing Linux kernel AX25 being mentioned. I wrote that stuff 23 years ago and last looked at it 20 years ago. I’m not sure I could add anything to that discussion these days.

Jonathan G4KLX 




On Friday, December 7, 2018, 06:01, Annaliese McDermond <nh6z@...> wrote:

Dan --

Because I’m trying to get my repeater up and running again, and would like to use MMDVM-UDRC to do so, I’ve been doing some work on getting MMDVM-UDRC to work.  My code is in the nwdigitalradio github account at:

https://github.com/nwdigitalradio/MMDVM-UDRC

You’re welcome to play with it with the understanding that it’s development code, may not work at all.  I’m getting close to having things possibly working acceptably.


An issue you’ll have to deal with is that mmdvm-udrc expects a 24000 sample rate.  The UDRC hardware doesn’t support this and if you try to use hw:CARD=udrc,DEV=0 it will fail complaining on not being able to send sample rate.  You might try using plughw:CARD=udrc,DEV=0 instead.  I’m using a custom asound.conf to support it.

More as I get things worked out.

--
Annaliese McDermond (NH6Z)
nh6z@...



> On Dec 6, 2018, at 4:51 AM, Dan Porter (AI2M) <groups@...> wrote:
>
> Hi Rich,
>
> Did you eventually manage to get it working?
> I was thinking of trying again with my UDRC.
>
> 73, Dan - AI2M
>
>> On Jul 6, 2018, at 3:05 PM, Rich KR4PI <rich.schnieders@...> wrote:
>>
>> Thanks John, that helped but there were still a few errors along the way:
>>
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o Biquad.o Biquad.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDMR.o CalDMR.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarRX.o CalDStarRX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarTX.o CalDStarTX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalNXDN.o CalNXDN.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalP25.o CalP25.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o CWIdTX.o CWIdTX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMORX.o DMRDMORX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMOTX.o DMRDMOTX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRSlotType.o DMRSlotType.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarRX.o DStarRX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarTX.o DStarTX.cpp
>> DStarTX.cpp: In member function ‘void CDStarTX::txHeader(const uint8_t*, uint8_t*) const’:
>> DStarTX.cpp:382:7: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
>>        if (d & 0x08U)
>>        ^~
>> DStarTX.cpp:384:9: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
>>          i++;
>>          ^
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIR.o FIR.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIRInterpolator.o FIRInterpolator.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o IO.o IO.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o IOUDRC.o IOUDRC.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o MMDVM.o MMDVM.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNRX.o NXDNRX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNTX.o NXDNTX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25RX.o P25RX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25TX.o P25TX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o POCSAGTX.o POCSAGTX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o SampleRB.o SampleRB.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialController.o SerialController.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialPort.o SerialPort.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialRB.o SerialRB.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o SoundCardReaderWriter.o SoundCardReaderWriter.cpp
>> SoundCardReaderWriter.cpp: In member function ‘virtual void CSoundCardWriter::entry()’:
>> SoundCardReaderWriter.cpp:479:85: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
>>  le ((ret = ::snd_pcm_writei(m_handle, m_samples + offset, nSamples - offset)) != (nSamples - offset)) {
>>      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o Thread.o Thread.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o Utils.o Utils.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFRX.o YSFRX.cpp
>> g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFTX.o YSFTX.cpp
>> g++ Biquad.o CalDMR.o CalDStarRX.o CalDStarTX.o CalNXDN.o CalP25.o CWIdTX.o DMRDMORX.o DMRDMOTX.o DMRSlotType.o DStarRX.o DStarTX.o FIR.o FIRInterpolator.o IO.o IOUDRC.o MMDVM.o NXDNRX.o NXDNTX.o P25RX.o P25TX.o POCSAGTX.o SampleRB.o SerialController.o SerialPort.o SerialRB.o SoundCardReaderWriter.o Thread.o Utils.o YSFRX.o YSFTX.o -g -lpthread -lasound -lwiringPi -o MMDVM
>>
>> it did complete the compile. When I attempt ./MMDVM is receive the following:
>>
>> Link does not exist: /dev/pts/1 <> ttyMMDVM0
>> Error creating symlink from /dev/pts/1 to ttyMMDVM0
>> Unable to open serial port on vpty: ttyMMDVM0
>>
>> I am assuming this indicates that it is not properly configured for the UDRC.  That is what I will be exploring next.
>>
>> Thanks for the help
>> Rich, KR4PI
>>
>>
>
>






Annaliese McDermond
 

On Dec 7, 2018, at 12:14 AM, Jonathan Naylor via Groups.Io <naylorjs=yahoo.com@groups.io> wrote:

Hi Annaliese

There are a set of filter coefficients for 48 kHz sample rate in a branch of the MMDVM firmware. I’ll look into slotting those in and altering the other variables.

Ideally I’d recalculate them in MATLAB as floating point but my license for it ran out. Octave can probably do it though. Even rescaling from Q15 format will probably give enough precision.
If you have some matlab code, I have a Matlab 2015b license on my Mac that I could spit out the coefficients for you. I’m mildly familiar with the process because I’ve done it for filter coefficients in the OpenHPSDR FPGA code that I was playing with.


It’s bizarre seeing Linux kernel AX25 being mentioned. I wrote that stuff 23 years ago and last looked at it 20 years ago. I’m not sure I could add anything to that discussion these days.

Jonathan G4KLX
--
Annaliese McDermond (NH6Z)
nh6z@...

Dan Porter (AI2M)
 

Hi Anna,

Thanks for the info. I’m definitely interested in following your progress.

Dan - AI2M

On Dec 7, 2018, at 1:01 AM, Annaliese McDermond <nh6z@...> wrote:

Dan --

Because I’m trying to get my repeater up and running again, and would like to use MMDVM-UDRC to do so, I’ve been doing some work on getting MMDVM-UDRC to work.  My code is in the nwdigitalradio github account at:

https://github.com/nwdigitalradio/MMDVM-UDRC

You’re welcome to play with it with the understanding that it’s development code, may not work at all.  I’m getting close to having things possibly working acceptably.


An issue you’ll have to deal with is that mmdvm-udrc expects a 24000 sample rate. The UDRC hardware doesn’t support this and if you try to use hw:CARD=udrc,DEV=0 it will fail complaining on not being able to send sample rate.  You might try using plughw:CARD=udrc,DEV=0 instead.  I’m using a custom asound.conf to support it.

More as I get things worked out.

--
Annaliese McDermond (NH6Z)
nh6z@...



On Dec 6, 2018, at 4:51 AM, Dan Porter (AI2M) <groups@...> wrote:

Hi Rich,

Did you eventually manage to get it working? 
I was thinking of trying again with my UDRC.

73, Dan - AI2M

On Jul 6, 2018, at 3:05 PM, Rich KR4PI <rich.schnieders@...> wrote:

Thanks John, that helped but there were still a few errors along the way:

g++ -g -O3 -Wall -std=c++0x -pthread -c -o Biquad.o Biquad.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDMR.o CalDMR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarRX.o CalDStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalDStarTX.o CalDStarTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalNXDN.o CalNXDN.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CalP25.o CalP25.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o CWIdTX.o CWIdTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMORX.o DMRDMORX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRDMOTX.o DMRDMOTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DMRSlotType.o DMRSlotType.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarRX.o DStarRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o DStarTX.o DStarTX.cpp
DStarTX.cpp: In member function ‘void CDStarTX::txHeader(const uint8_t*, uint8_t*) const’:
DStarTX.cpp:382:7: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
      if (d & 0x08U)
      ^~
DStarTX.cpp:384:9: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
        i++;
        ^
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIR.o FIR.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o FIRInterpolator.o FIRInterpolator.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IO.o IO.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o IOUDRC.o IOUDRC.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o MMDVM.o MMDVM.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNRX.o NXDNRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o NXDNTX.o NXDNTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25RX.o P25RX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o P25TX.o P25TX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o POCSAGTX.o POCSAGTX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SampleRB.o SampleRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialController.o SerialController.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialPort.o SerialPort.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SerialRB.o SerialRB.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o SoundCardReaderWriter.o SoundCardReaderWriter.cpp
SoundCardReaderWriter.cpp: In member function ‘virtual void CSoundCardWriter::entry()’:
SoundCardReaderWriter.cpp:479:85: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
le ((ret = ::snd_pcm_writei(m_handle, m_samples + offset, nSamples - offset)) != (nSamples - offset)) {
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Thread.o Thread.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o Utils.o Utils.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFRX.o YSFRX.cpp
g++ -g -O3 -Wall -std=c++0x -pthread -c -o YSFTX.o YSFTX.cpp
g++ Biquad.o CalDMR.o CalDStarRX.o CalDStarTX.o CalNXDN.o CalP25.o CWIdTX.o DMRDMORX.o DMRDMOTX.o DMRSlotType.o DStarRX.o DStarTX.o FIR.o FIRInterpolator.o IO.o IOUDRC.o MMDVM.o NXDNRX.o NXDNTX.o P25RX.o P25TX.o POCSAGTX.o SampleRB.o SerialController.o SerialPort.o SerialRB.o SoundCardReaderWriter.o Thread.o Utils.o YSFRX.o YSFTX.o -g -lpthread -lasound -lwiringPi -o MMDVM

it did complete the compile. When I attempt ./MMDVM is receive the following:

Link does not exist: /dev/pts/1 <> ttyMMDVM0
Error creating symlink from /dev/pts/1 to ttyMMDVM0
Unable to open serial port on vpty: ttyMMDVM0

I am assuming this indicates that it is not properly configured for the UDRC.  That is what I will be exploring next.

Thanks for the help
Rich, KR4PI









Jonathan Naylor
 

Hi Annaliese

I've done the changes to use a 48 kHz sample rate with the MMDVM-UDRC. I'm making no guarantees but the values are based on the working 48 kHz branch of the main MMDVM firmware. The only area that bothers me is the output level for POCSAG which may be very out compared to the others.

This version should at least allow you to test with the UDRC and iron out any bugs.

I'd be very interested in any problems you find, and of course any pull requests that you may make to fix them. Remember that the DMR in this version is simplex only. Using the UDRC or similar hardware makes it impossible to have the type of synchronisation that duplex DMR repeating requires.

Jonathan  G4KLX


On Friday, 7 December 2018, 10:18:47 GMT, Annaliese McDermond <nh6z@...> wrote:
> On Dec 7, 2018, at 12:14 AM, Jonathan Naylor via Groups.Io <naylorjs=yahoo.com@groups.io> wrote:
>
> Hi Annaliese
>
> There are a set of filter coefficients for 48 kHz sample rate in a branch of the MMDVM firmware. I’ll look into slotting those in and altering the other variables.
>
> Ideally I’d recalculate them in MATLAB as floating point but my license for it ran out. Octave can probably do it though. Even rescaling from Q15 format will probably give enough precision.

If you have some matlab code, I have a Matlab 2015b license on my Mac that I could spit out the coefficients for you.  I’m mildly familiar with the process because I’ve done it for filter coefficients in the OpenHPSDR FPGA code that I was playing with.


> It’s bizarre seeing Linux kernel AX25 being mentioned. I wrote that stuff 23 years ago and last looked at it 20 years ago. I’m not sure I could add anything to that discussion these days.
>
> Jonathan G4KLX

--
Annaliese McDermond (NH6Z)
nh6z@...



Annaliese McDermond
 

Thanks Johnathan. I’ll be working a things a bit today and this evening.

On Dec 8, 2018, at 12:36 PM, Jonathan Naylor via Groups.Io <naylorjs=yahoo.com@groups.io> wrote:

Hi Annaliese

I've done the changes to use a 48 kHz sample rate with the MMDVM-UDRC. I'm making no guarantees but the values are based on the working 48 kHz branch of the main MMDVM firmware. The only area that bothers me is the output level for POCSAG which may be very out compared to the others.
I’ll mainly be concentrating on D-STAR, YSF and DMR since that’s what I have test gear for.

This version should at least allow you to test with the UDRC and iron out any bugs.

I'd be very interested in any problems you find, and of course any pull requests that you may make to fix them.
I have a serial code fix for the read side of things. The transplanted MMDVMHost code has different semantics than the code for MMDVM-UDRC expects. The MMDVMHost code blocks when it receives an initial chunk of data and then waits indefinitely until it reads the entire buffer length requested. This doesn’t work for MMDVM-UDRC because it blocks the main event thread waiting for more serial data that will never come.

I did some significant remodeling of the serial input code so that it reads a little bit more judiciously and uses the length field of the MMDVM frame to figure out how much to ask the OS to read for it. This seems to solve the problem. I’ll PR it soon so you can at least take a look at it.

Remember that the DMR in this version is simplex only. Using the UDRC or similar hardware makes it impossible to have the type of synchronisation that duplex DMR repeating requires.
I understand the synchronization issues surrounding the DMR time slots. I’d like to get the rest of the protocols working correctly and then Bryan and I have had recurring ideas on how we could potentially deal with that issue. I’m curious, though, how tight is the timing issue time-wise. Does the PTT have to cycle in 1ms, 10ms, 100ms? I’m assuming it’s the time from the preamble in that slot to when actual data begins to flow.

Jonathan G4KLX
--
Annaliese McDermond (NH6Z)
Xenotropic Systems
mcdermj@...



On Friday, 7 December 2018, 10:18:47 GMT, Annaliese McDermond <nh6z@...> wrote:
On Dec 7, 2018, at 12:14 AM, Jonathan Naylor via Groups.Io <naylorjs=yahoo.com@groups.io> wrote:

Hi Annaliese

There are a set of filter coefficients for 48 kHz sample rate in a branch of the MMDVM firmware. I’ll look into slotting those in and altering the other variables.

Ideally I’d recalculate them in MATLAB as floating point but my license for it ran out. Octave can probably do it though. Even rescaling from Q15 format will probably give enough precision.
If you have some matlab code, I have a Matlab 2015b license on my Mac that I could spit out the coefficients for you. I’m mildly familiar with the process because I’ve done it for filter coefficients in the OpenHPSDR FPGA code that I was playing with.


It’s bizarre seeing Linux kernel AX25 being mentioned. I wrote that stuff 23 years ago and last looked at it 20 years ago. I’m not sure I could add anything to that discussion these days.

Jonathan G4KLX
--
Annaliese McDermond (NH6Z)
nh6z@...